okuma süresi : 12 minutes

Supabase’in basitliği ve Spring Boot’un gücü arasında bir seçim yapmak yerine, neden ikisini de birleştirmelisiniz? Her iki teknolojinin en iyisini kullanan bir hibrit mimari keşfedin.

Modern mimarlığın yanlış ikilemi

Bir modern uygulama statik bir frontend ile geliştirirken, sık sık ikili bir seçenekle karşılaşırsın:

  • Her şeyi bir Backend-as-a-Service çözümüne yatırmak(Supabase, Firebase) - basit ama sınırlı

  • Tam bir backend oluştur(Spring Boot, Node.js) - güçlü ama karmaşık

Bu seçim yanlış bir ikilem. Hibrit mimari bir üçüncü yol sunar: her teknolojiyi onu en iyi olduğu yerde kullan

Mimari Vizyon

Geleneksel Mimari: Monolitik

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

package "Geleneksel mimari" {
  actor Utilisateur as user
  component "Ön uç" as frontend #LightBlue
  component "Monolitik backend" as backend #LightCoral {
    [Authentification]
    [CRUD]
    [Logique Métier]
    [Jobs]
    [APIs Tierces]
  }
  database "Veritabanı" as db #LightGray

  user --> frontend
  frontend --> backend : Tüm istekler
  backend --> db
}

note right of backend
Her şey backend üzerinden geçer
basit işlemler bile
⚠️ Tek bir tıkanıklık noktası
⚠️ Başlangıç karmaşıklığı
⚠️ Güçlü bağlantı
end note
@enduml

Bu yaklaşımda, hatta en basit işlemler bile (bir makale okuma, bir yorum oluşturma) arka ucundan geçmelidir. İlk gününden beri karmaşıklık maliyetini ödersiniz.

BaaS Mimarisi : Her Temsilci

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

package "Mimari BaaS sade" {
  actor Utilisateur as user
  component "ön uç" as frontend #LightBlue
  cloud "Supabase / Firebase" as baas #LightGreen {
    [Auth]
    [Database]
    [Storage]
    [Edge Functions]
  }

  user --> frontend
  frontend --> baas : Tüm işlemler
}

note right of baas
Hızlı geliştirme
Yönetilecek sunucu yok
⚠️ Karmaşık mantık için sınırlı
⚠️ Satıcı bağımlılığı
⚠️ Edge Functions için kısıtlamalar
end note
@enduml

Aksine, tüm işi bir BaaS’e devretmek başta cazip görünür, ancak iş mantığı karmaşıklaştıkça hızla sınırlarını gösterir.

Hibrit Mimari: Sorumlulukların Ayrımı

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

actor Utilisateur as user #LightBlue

package "Frontend Katmanı" {
  component "Statik Site JBake" as frontend #SkyBlue
}

package "Basit Katman (Supabase)" #LightGreen {
  component "Kimlik Doğrulaması" as auth
  component "CRUD Temel" as crud
  component "Dosya Depolama" as storage
  component "Gerçek Zamanlı" as realtime
}

package "İş Katmanı (Spring Boot)" #Coral {
  component "Karmaşık Mantık" as logic
  component "Orkestreleme" as orchestration
  component "Zamanlanmış İşler" as jobs
  component "Entegrasyonlar" as integrations
}

database "PostgreSQL Paylaşılan" as db #LightGray

user --> frontend

frontend --> auth : OAuth2, JWT
frontend --> crud : Makaleler, Profiller
frontend --> storage : Resimler, Dosyalar
frontend --> realtime : Bildirimler

frontend --> logic : Hesaplamalar, Raporlar
frontend --> orchestration : İş akışları
logic --> integrations : Stripe, APIs
orchestration --> db
jobs --> db

crud --> db
auth --> db

note bottom of db
Tek bir doğruluk kaynağı Supabase ve Spring Boot arasında paylaşılan
end note

note right of auth
50k kullanıcıya kadar ücretsiz
Birkaç tıklama ile yapılandırma
OAuth2 çoklu sağlayıcı
end note

note right of logic
Etkinleştirildi sadece gerektiğinde
Kotlin + Coroutines
Karmaşık işlemler
end note
@enduml

Hibrit mimari, operasyonların karmaşıklığı ve doğasına göre sorumlulukları net bir şekilde ayırır.

Tasarım İlkeleri

İlke 1: Başlangıcı basitleştir, ilerleyişi akıllıca yönet.

@startuml
skinparam backgroundColor #FEFEFE

rectangle "Phase 1 : MVP" #LightGreen {
  component "JBake + Supabase" as mvp
  note right
✓ Gün içinde geliştirme
✓ Maliyet: 0€
✓ Kavram doğrulama
  end note
}

rectangle "**Phase 2 : Büyüme**" #LightYellow {
  component "JBake + Supabase\n+ Spring Boot (opsiyonel)" as growth
  note right
✓ İş mantığı ortaya çıkıyor
✓ İlk planlanmış işler
✓ Üçüncü taraf entegrasyonları
  end note
}

rectangle "**Phase 3 : Ölçek**" #LightCoral {
  component "Tam Mimari" as scale
  note right
✓ Karmaşık orkestrasyon
✓ İyileştirilmiş performans
✓ Dağıtılmış cache
  end note
}

mvp -down-> growth : Karmaşıklık gerekçelendiğinde
growth -down-> scale : Optimizasyon\ndevam
@enduml

Spring Boot’u oluşturmayın, eğer ihtiyacınız yoksa.Supabase ile başlayın, karmaşıklık gerekli olduğunda Spring Boot ekleyin.

Prensip 2 : İşlemin doğasına göre ayrıştırma

@startmindmap
skinparam backgroundColor #FEFEFE
* Opérations\nApplicatives

left side

** Opérations Simples\n(Supabase)
***_ CRUD Standard
****_ Lecture
****_ Création
****_ Mise à jour
****_ Suppression
***_ Authentification
****_ Login/Logout
****_ OAuth2
****_ Gestion session
***_ Stockage
****_ Upload fichiers
****_ CDN automatique
***_ Temps Réel
****_ WebSocket
****_ Notifications

right side

** Opérations Complexes\n(Spring Boot)
***_ Logique Métier
****_ Calculs complexes
****_ Règles métier
****_ Validations avancées
***_ Orchestration
****_ Multi-services
****_ Transactions distribuées
****_ Saga patterns
***_ Tâches Planifiées
****_ Rapports périodiques
****_ Synchronisations
****_ Nettoyages
***_ Intégrations
****_ Paiements (Stripe)
****_ APIs tierces
****_ Services ML/AI

@endmindmap

Prinsip 3 : Tek Kaynak Gerçeği

@startuml
skinparam backgroundColor #FEFEFE

database "PostgreSQL" as db #LightGray {
  package "Şema: auth (Supabase)" #LightGreen {
    [users]
    [sessions]
    [identities]
  }

  package "public (paylaşılan)" #SkyBlue {
    [articles]
    [comments]
    [profiles]
  }

  package "Şema: iş (Spring Boot)" #Coral {
    [orders]
    [payments]
    [reports]
  }
}

component "Supabase" as supabase #LightGreen
component "Spring Boot" as spring #Coral

supabase -down-> users : Yönetir
supabase -down-> sessions : yönetir
supabase -down-> articles : Eriş
supabase -down-> comments : Eriş
supabase -down-> profiles : Eriş

spring -down-> articles : Eriş
spring -down-> profiles : Erişin
spring -down-> orders : Yönetir
spring -down-> payments : Yönetir
spring -down-> reports : Yönetir

note right of db
**Avantajlar :**
• Karmaşık senkronizasyon yok
• JOINs olası tablolar arasında
• Garantili tutarlılık
• Birleşik göçler
end note
@enduml

Aynı PostgreSQL örneğini paylaştıkları için, Supabase ve Spring Boot, karmaşık senkronizasyondan kaçınarak aynı veriler üzerinde çalışır.

Akış düzenlemesi

Akım 1 : Merkezi Kimlik Doğrulaması

@startuml
skinparam backgroundColor #FEFEFE
autonumber

actor "Kullanıcı" as user
participant "JBake" as jbake
participant "Supabase Yetkilendirme" as auth
participant "Spring Boot" as spring
database "PostgreSQL" as db

== Authentification ==
user -> jbake : Clique "Giriş yap"
jbake -> auth : Yönlendirme OAuth2 (Google/GitHub)
auth -> user : Onay ekranı
user -> auth : Izini verir
auth -> auth : Üret JWT
auth -> jbake : JWT + Refresh Token'i döndürür
jbake -> jbake : Jetoları stokla (sessionStorage)

== Accès aux Ressources ==
group Opération Simple (CRUD)
  user -> jbake : Bir makale oluştur
  jbake -> db : POST ile JWT
  note right: Supabase Row Level Security\nOtomatik olarak JWT'i doğrular
  db -> jbake : Makale oluşturuldu
end

group Opération Complexe (Métier)
  user -> jbake : Bir rapor oluştur
  jbake -> spring : POST /api/reports\nile JWT
  spring -> spring : Doğrula JWT Supabase
  spring -> spring : Çıkarılan talepler (user_id, roller)
  spring -> db : Karmaşık sorgular
  spring -> jbake : Oluşturulan rapor
end

note over auth, spring
**JWT evrensel**
Supabase ET Spring Boot tarafından geçerli
double kimlik doğrulaması yok
end note
@enduml

Anahtar noktaTek bir kimlik doğrulama süreci, tek bir JWT, her yerde kullanılabilir.

Akış 2 : Karmaşık Bir İş Sürecinin Orkestrasyonu

@startuml
skinparam backgroundColor #FEFEFE
autonumber

actor "Müşteri" as user
participant "JBake" as jbake
participant "Spring Boot" as spring
participant "Supabase Veritabanı" as supadb
participant "Stripe API" as stripe
participant "Envanter Servisi" as inventory
participant "E-posta Servisi" as email
database "PostgreSQL" as db

user -> jbake : Sipariş ver
jbake -> spring : POST /api/orders/create

== Orchestration Spring Boot ==
spring -> db : BEGIN TRANSACTION

par Vérifications Parallèles
  spring -> inventory : Stok Kontrolü
  inventory -> spring : Stok OK
else
  spring -> db : Müşteri profilini kontrol et
  db -> spring : Doğrulanmış müşteri
end

spring -> stripe : Payment Intent Oluştur
stripe -> spring : Oluşturulan intent (ID: pi_xxx)

spring -> db : Oluştur Order (durum: PENDING)
db -> spring : Sipariş oluşturuldu

spring -> stripe : Ödemeyi onayla
stripe -> spring : Ödeme onaylandı

spring -> db : Siparişi Güncelle (durum: PAID)
spring -> inventory : Stok azalt
spring -> db : COMMIT TRANSACTION

par Notifications Asynchrones
  spring -> email : E-posta Onayı
else
  spring -> supadb : Bildirim ekle
  note right: Gerçek zamanlı bildirim\nvia Supabase Realtime
end

spring -> jbake : Sipariş onaylanmış
jbake -> user : Onay göster

note over spring
Spring Boot Sorumlulukları:
• İşlem ACID
• Çok hizmetli orkestrasyon
• Otomatik rollback hatada
• Sınır durumu yönetimi
end note
@enduml

Spring Boot’un getirdiğiBirden fazla sistemdeki karmaşık süreçlerin güvenilir orkestrasyonu ve işlem garantisi.

Akış 3: Zamanlanmış İşler ve Senkronizasyonlar

@startuml
skinparam backgroundColor #FEFEFE

participant "Zamanlayıcı\n(Spring Boot)" as scheduler
participant "Rapor Hizmeti" as report
participant "PostgreSQL" as db
participant "Harici API" as api
participant "E-posta Hizmeti" as email
participant "Supabase Depolama" as storage

== Job Quotidien : 2 saat 00 ==
activate scheduler
scheduler -> report : Rapor üretimini tetikler

activate report
report -> db : Son 24 saatlik veriyi getir
db -> report : Veri seti

report -> report : Hesaplamalar & Toplamlar
report -> report : Üretim PDF

report -> storage : Yükle PDF
storage -> report : URL publique

report -> email : Yöneticilere gönder\nPDF linkiyle
deactivate report

== Job Hebdomadaire : Pazar 3:00 ==
scheduler -> report : dış senkronizasyon

activate report
report -> api : Harici verileri çek
api -> report : Yeni veriler

report -> db : Tablolar güncelleme
report -> db : Eski veri temizliği
deactivate report

== Job Mensuel : Ayın ilk günü ==
scheduler -> report : Fatura

activate report
report -> db : Aktif müşteri listesi
report -> report : Miktar hesaplama
report -> api : Fatura oluşturma (Stripe)
report -> email : Faturaların gönderimi
deactivate report

deactivate scheduler

note right of scheduler
Supabase ile yalnızca yapılamaz.
Edge Functions uygunsuz
Uzun ve yinelenen işler için
end note
@enduml

Spring Boot’un sunduğu: Güvenilir zamanlanmış işler, durum yönetimiyle, otomatik yeniden denemeyle ve garantili yürütme.

Karar Matrisi

Supabase ne zaman kullanılır?

@startuml
skinparam backgroundColor #FEFEFE

start

:Uygulanacak yeni özellik;

if (CRUD simple ?) then (oui)
  :✅ **Supabase**;
  stop
else (non)
  if (Authentification ?) then (oui)
    :✅ **Supabase Kimlik Doğrulama;
    stop
  else (non)
    if (Upload fichiers ?) then (oui)
      :✅ **Supabase Depolama;
      stop
    else (non)
      if (Temps réel ?) then (oui)
        :✅ **Supabase Gerçek zamanlı;
        stop
      else (non)
        if (Row Level Security\nsuffisante ?) then (oui)
          :✅ **Supabase + Policies**;
          stop
        else (non)
          :⚠️ **Spring Boot'u düşünün**;
          #Coral:Passer à l'arbre\nde décision Spring Boot;
          stop
        endif
      endif
    endif
  endif
endif

@enduml

Spring Boot’u Kullanmak İçin Ne Zaman ?

@startuml
skinparam backgroundColor #FEFEFE

start

:Yeni karmaşık özellik;

if (Orchestration\nmulti-services ?) then (oui)
  :✅ **Spring Boot**;
  stop
else (non)
  if (Transaction ACID\ncritique ?) then (oui)
    :✅ **Spring Boot**;
    stop
  else (non)
    if (Job planifié ?) then (oui)
      :Spring Boot Zamanlayıcı;
      stop
    else (non)
      if (Intégration API\ntierce complexe ?) then (oui)
        :✅ **Spring Boot**;
        stop
      else (non)
        if (Calculs lourds\n> 10 secondes ?) then (oui)
          :✅ Spring Boot;
          stop
        else (non)
          if (Cache distribué\nnécessaire ?) then (oui)
            :✅ **Spring Boot + Redis**;
            stop
          else (non)
            :Muhtemelen Supabase;
            #LightGreen:Revenir à l'arbre\nde décision Supabase;
            stop
          endif
        endif
      endif
    endif
  endif
endif

@enduml

Proje Tipine Göre Mimari Örnekleri

Blog / Portföy

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

package "Kişisel Blog - 95% Supabase" {
  component "JBake" as jbake #SkyBlue

  package "Supabase (Ücretsiz)" #LightGreen {
    [Auth: OAuth2 Google]
    [Articles (CRUD)]
    [Commentaires]
    [Images (Storage)]
    [Notifications Realtime]
  }

  package "Spring Boot (Opsiyonel)" #LightCoral {
    [Newsletter Mensuelle]
    note bottom: Sadece zamanlanmış iş
  }

  database "PostgreSQL" as db

  jbake --> [Auth: OAuth2 Google]
  jbake --> [Articles (CRUD)]
  jbake --> [Commentaires]
  jbake --> [Images (Storage)]
  jbake --> [Notifications Realtime]

  [Articles (CRUD)] --> db
  [Commentaires] --> db
  [Newsletter Mensuelle] --> db
}

note bottom of "Spring Boot (Opsiyonel)"
Spring Boot zorunlu değil
Bülten yönetilebilir
bir üçüncü taraf hizmet tarafından (Mailchimp)
end note
@enduml

Karar: 100% Supabase yeterli.

SaaS Uygulaması

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

package "Uygulama SaaS - Mimari Hibrit" {
  component "JBake / React" as frontend #SkyBlue

  package "Supabase" #LightGreen {
    [Auth Multi-tenant]
    [Profils Utilisateurs]
    [Données Simples]
    [Storage Documents]
  }

  package "Spring Boot" #Coral {
    [Facturation (Stripe)]
    [Analytics Avancées]
    [Rapports Mensuels]
    [Quotas & Limites]
    [Webhooks Stripe]
  }

  cloud "Servisler Harici" {
    [Stripe API]
    [SendGrid Email]
  }

  database "PostgreSQL Paylaşılmış" as db

  frontend --> [Auth Multi-tenant]
  frontend --> [Profils Utilisateurs]
  frontend --> [Données Simples]
  frontend --> [Facturation (Stripe)]
  frontend --> [Analytics Avancées]

  [Auth Multi-tenant] --> db
  [Profils Utilisateurs] --> db
  [Données Simples] --> db

  [Facturation (Stripe)] --> db
  [Facturation (Stripe)] --> [Stripe API]
  [Analytics Avancées] --> db
  [Rapports Mensuels] --> db
  [Rapports Mensuels] --> [SendGrid Email]
  [Webhooks Stripe] ..> [Stripe API] : Écoute
}

note right of "Spring Boot"
Gerekenler:
• Abonelik yönetimi
• Yinelenen faturalama
• Dinamik kotalar
• Karmaşık analizler
• Güvenilir webhook'lar
end note
@enduml

Karar: Hibrit mimari gereklidir. Supabase temel kısım için, Spring Boot kritik kısım (ödemeler, faturalandırma) için.

E-ticaret

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

package "Elektronik Ticaret - %70 Spring Boot" {
  component "Mağaza önü (JBake/React)" as frontend #SkyBlue

  package "Supabase" #LightGreen {
    [Auth Clients]
    [Catalogue Produits\n(lecture seule)]
    [Images Produits]
  }

  package "Spring Boot (İşletme Çekirdeği)" #Coral {
    [Gestion Commandes]
    [Paiements Stripe]
    [Gestion Stock]
    [Calcul Frais Port]
    [Génération Factures]
    [Synchronisation ERP]
    [Emails Transactionnels]
  }

  cloud "Entegrasyonlar" {
    [Stripe]
    [Transporteur API]
    [ERP Externe]
  }

  database "PostgreSQL" as db

  frontend --> [Auth Clients]
  frontend --> [Catalogue Produits\n(lecture seule)]
  frontend --> [Gestion Commandes]

  [Auth Clients] --> db
  [Catalogue Produits\n(lecture seule)] --> db

  [Gestion Commandes] --> db
  [Paiements Stripe] --> [Stripe]
  [Gestion Stock] --> db
  [Calcul Frais Port] --> [Transporteur API]
  [Génération Factures] --> db
  [Synchronisation ERP] --> [ERP Externe]
  [Synchronisation ERP] --> db
}

note right of "Spring Boot (İşletme Çekirdeği)"
Spring Boot gereklidir:
• Kritik işlemler
• Karmaşık orkestrasyon
• Çoklu entegrasyonlar
• Yasal uyumluluk
• Senkronizasyon işleri
end note
@enduml

KararSpring Boot zorunludur. Supabase sadece kimlik doğrulama ve katalog için.

Aşamalı Göç Stratejisi

@startuml
skinparam backgroundColor #FEFEFE

|Semaine 1-2|
start
:Oluştur proje Supabase;
:Yapılandır Auth (Google, GitHub);
:İlk PostgreSQL şemasını tanımlayın;
:CRUD'ni JBake üzerindeki temel olarak implement et;
:Dağıtmak MVP üzerinde GitHub Sayfalar;
note right
**Teslimat :** Fonksiyonel uygulama
**Maliyet :** 0€
**Süre :** 1-2 hafta
end note

|Semaine 3-4|
:Gerçek kullanımı gözlemleyin;
:Tanımlayıcı sınırlamaları;

|Décision|
if (Logique complexe\némerge ?) then (non)
  |Supabase|
  :Supabase ile sadece devam et;
  :Gerekirse Edge Functions ekleyin;
  stop
else (oui)
  |Spring Boot|
  :Spring Boot projesi oluştur;
  :Doğrulama yapılandır JWT Supabase;
  :Karmaşık mantığı Spring Boot'a taşı;
  note right
Seçici Göç
Sadece karmaşık olanlar
  end note
endif

|Semaines suivantes|
:Spring Boot'u dağıtın (Cloud Run, EC2);
:PostgreSQL Supabase'ye bağlan;
:İlk planlanmış işleri uygulama;
:APIs üçüncü tarafları entegre et;

stop

note right
**Final Hibrit Mimari**
Supabase + Spring Boot
mükemmel uyumda
end note
@enduml

Maliyetler ve Operasyonel Dikkat Edilmesi Gereken Hususlar

Maliyet yapısı

@startuml
skinparam backgroundColor #FEFEFE

package "Tahmini Aylık Maliyetler" {

  rectangle "Aşama MVP\n(0-1000 users)" #LightGreen {
    [JBake (GitHub Pages): 0€]
    [Supabase: 0€]
    [Spring Boot: N/A]
    note bottom: **Toplam: 0€/mois**
  }

  rectangle "Aşama Büyüme\n(1k-10k users)" #LightYellow {
    [JBake (GitHub Pages): 0€]
    [Supabase: 0€]
    [Spring Boot (Cloud Run): 20-50€]
    [PostgreSQL (si séparé): 0-30€]
    note bottom: Toplam: 20-80€/mois
  }

  rectangle "Aşama Ölçek\n(10k-100k users)" #LightCoral {
    [JBake (Netlify Pro): 19€]
    [Supabase Pro: 25€]
    [Spring Boot (instances multiples): 100-300€]
    [Redis Cache: 20-50€]
    [Monitoring: 20€]
    note bottom: **Toplam: 184-414€/mois**
  }
}

note right of "Aşama Ölçek\n(10k-100k users)"
Bu aşamada, gelirler maliyetleri geniş ölçüde haklı çıkarır
end note
@enduml

Operasyonel Sorumluluklar

@startuml
skinparam backgroundColor #FEFEFE

package "Kim Ne Yönetiyor?" {

  rectangle "Supabase tarafından yönetiliyor (0 çaba)" #LightGreen {
    [Authentification]
    [Base de données]
    [Backups automatiques]
    [Scaling automatique]
    [Monitoring DB]
    [Sécurité DB]
  }

  rectangle "GitHub tarafından yönetiliyor (0 çaba)" #SkyBlue {
    [Hébergement site statique]
    [HTTPS/SSL]
    [CDN global]
    [Déploiement automatique]
  }

  rectangle "(Spring Boot) yönetimi" #LightCoral {
    [Déploiement application]
    [Monitoring APM]
    [Logs centralisés]
    [Scaling horizontal]
    [Mises à jour sécurité]
  }
}

note bottom of "(Spring Boot) yönetimi"
Minimize edilebilir:
• Cloud Run (sunucusuz)
• Kubernetes (gerekirse)
• Yönetilen hizmetler (RDS, vb.)
end note
@enduml

Sonuç: Mükemmel denge

Hibrit mimari Supabase + Spring Boot bir kompromis değil, birsinergi.

Aklında bulundurmanız gereken ilkeler

@startmindmap
skinparam backgroundColor #FEFEFE
* Architecture\nHybride

** Commencer Simple
***_ MVP avec Supabase
***_ 0€ de coût initial
***_ Validation rapide

** Évoluer Intelligemment
***_ Ajouter Spring Boot\nsi nécessaire
***_ Migration progressive
***_ Pas de refonte totale

** Exploiter les Forces
***_ Supabase: Simplicité
***_ Spring Boot: Puissance
***_ PostgreSQL: Source unique

** Minimiser la Complexité
***_ Pas de synchronisation
***_ Pas de duplication
***_ Architecture claire

** Optimiser les Coûts
***_ Gratuit au départ
***_ Scaling progressif
***_ ROI évident

@endmindmap

Bu mimari ne zaman seçilmelidir?

✅ Bu mimari ideal ise :

  • Hızlıca başlatmak istersiniz (MVP günlerde, ayda değil)

  • İş karmaşıklığındaki büyümeyi tahmin ediyorsunuz.

  • Başlangıç maliyetlerini en aza indirmek istersiniz.

  • PostgreSQL’i seversiniz ve tek doğru kaynak istersiniz.

  • Kotlin ve korutunları iş kodu için seversiniz

  • Tam olarak vendor lock‑in’den kaçınmak istersiniz.

BU MİMARI UYGUN DEĞİLSE :

  • Projeniz basit ve öyle kalacak (kişisel blog → %100 Supabase yeterli)

  • Zaten kurulmuş bir back‑end stack’iniz var ve bunu hakim oluyorsunuz.

  • Geleneksel bir monoliti tercih edersiniz

  • .NET, Python veya başka bir dil backend tarafında gereklidir.

Nihai Genel Vizyon

@startuml
skinparam backgroundColor #FEFEFE

package "Tam Hibrit Mimari" {

  actor "Kullanıcılar" as users

  rectangle "Frontend (Statik)" #SkyBlue {
    [JBake / GitHub Pages]
    note right: Ücretsiz, CDN global
  }

  rectangle "Basit Backend (Supabase)" #LightGreen {
    [Auth OAuth2]
    [CRUD APIs]
    [Storage]
    [Realtime]
    note right
50k kullanıcıya kadar ücretsiz
Ayarlama gerekmeyen sunucu
    end note
  }

  rectangle "İş Backend (Spring Boot)" #Coral {
    [Orchestration]
    [Jobs Planifiés]
    [Intégrations]
    [Transactions]
    note right
Sadece gerekirse aktif edilir
    end note
  }

  database "PostgreSQL\nSource Tek Kaynak Gerçeği" as db #LightGray

  users --> [JBake / GitHub Pages]

  [JBake / GitHub Pages] --> [Auth OAuth2]
  [JBake / GitHub Pages] --> [CRUD APIs]
  [JBake / GitHub Pages] --> [Storage]
  [JBake / GitHub Pages] --> [Realtime]
  [JBake / GitHub Pages] --> [Orchestration]

  [Auth OAuth2] --> db
  [CRUD APIs] --> db
  [Orchestration] --> db
  [Jobs Planifiés] --> db
  [Intégrations] --> db
}

note bottom of db
**Tek bir veri tabanı, iki tüketici**
• Supabase için basit
• Spring Boot için karmaşık
• Senkronizasyon gerekmez
end note

@enduml

İki Dünya’nın En İyisi

Bu mimari size verir :

🚀 Supabase hızı

  • Saatlerde başlatma, hafta cinsinden değil

  • OAuth2 kimlik doğrulaması birkaç tıklamayla

  • Otomatik olarak üretilen REST API’ler

  • Sıfır sunucu yapılandırması

💪 Spring Boot’un Gücü

  • Şık eşzamansız kod için Kotlin ve Coroutine’lar

  • Karmaşık iş süreçlerinin orkestrası

  • Güvenilir zamanlanmış işler

  • ACID garantili işlemleri

  • Tam Spring ekosistemi

💰 Progresif Ekonomi

  • 0€ ile başlatmak ve onaylamak

  • Büyümeyi takip eden maliyetler

  • Aşırı mühendisliği önceden yapmayın.

🎯 Mimari esneklik

  • Yeniden yapılandırmadan kademeli migrasyon

  • Spring Boot, sadece gerekli olduğunda eklenir

  • Toplam satıcı bağımlılığı yok

  • Gelişebilen mimari

Daha İleri

Teknik Kaynaklar

Supabase Dokümantasyonu :

Dökümantasyon Spring Boot :

Ek Makaleler :

  • JWT ile API’lerin Güvenliği

  • PostgreSQL Performans Optimizasyonu

  • Aşamalı göç desenleri

  • Dağıtık mimaride hata yönetimi

Gerçek Kullanım Örnekleri

Bu hibrit mimari başarıyla kullanılır :

  • SaaS B2BSupabase Kimlik Doğrulama, Spring Boot Faturalandırma

  • Pazar yeriSupabase Kataloğu, Spring Boot İşlemleri

  • İçerik platformlarıSupabase makaleleri, Spring Boot analitiği

  • Dahili araçlar: CRUD Supabase, iş akışları Spring Boot

Başlangıç Kontrol Listesi

Faz 1 - Temeller (Hafta 1)

  • Supabase hesabı oluşturun - [ ] PostgreSQL projesini yapılandırma - [ ] Auth’yi Etkinleştir (Google, GitHub) Başlangıç şemasını tanımlamak - [ ] Row Level Security’i yapılandır - [ ] API’leri JBake’den test edin

Faz 2 - MVP (Hafta 2-3)

  • Ana sayfaları uygulamak - [ ] OAuth2 kimlik doğrulamasını entegre edin - [ ] CRUD formlarını oluştur - [ ] Dosyalar için depolamayı yapılandır - [ ] GitHub Pages’e dağıtmak - [ ] Gerçek koşullarda test et

Faz 3 - Gelişme (İhtiyaçlara göre)

  • Karmaşık mantık ihtiyaçlarını belirle - [ ] Gerekirse Spring Boot projesi oluştur - [ ] Supabase’de JWT doğrulamasını yapılandırma - [ ] PostgreSQL Supabase’e Bağlan - [ ] Karmaşık özellikleri göçürmek Zamanlanmış işleri uygulama - [ ] Spring Boot’u dağıt (Cloud Run, vb.)

Kaçınılması Gereken Anti-Patternler

❌ Ne pas faire :

  • Verileri Supabase ile Spring Boot arasında kopyala

  • İki ayrı PostgreSQL veritabanı oluştur

  • Kimlik doğrulamanızı kendiniz kodlayın

  • Spring Boot’u basit CRUD işlemleri için kullanın

  • Aşırı mimarileştirmeyi ilk etapta yapmak

  • Supabase Row Level Security’ini yoksay

Daha iyisi:

  • Tek bir PostgreSQL veritabanını paylaşmak

  • Kimlik doğrulamasını Supabase’e bırakın

  • Sadece karmaşıklık için Spring Boot kullanmak

  • Basit başla, yavaşça ilerle

  • Her teknolojinin gücünden yararlanmak

  • Veritabanı seviyesinde RLS ile güvenlik sağlamak

Gelişim Perspektifleri

Yeni Yetkinlikler Eklendi

@startuml
skinparam backgroundColor #FEFEFE

rectangle "Güncel Mimari" #SkyBlue {
  [JBake]
  [Supabase]
  [Spring Boot]
}

rectangle "Olası Gelişmeler" #LightYellow {

  package "Performans" {
    [Redis Cache]
    [CDN pour Assets]
    [PostgreSQL Replicas]
  }

  package "İzleme" {
    [Grafana]
    [Prometheus]
    [Sentry]
  }

  package "CI/CD" {
    [GitHub Actions]
    [Tests Automatisés]
    [Déploiement Continu]
  }

  package "Özellikler" {
    [Search (ElasticSearch)]
    [Queue (RabbitMQ)]
    [Event Sourcing]
  }
}

[Spring Boot] .down.> [Redis Cache] : Peut ajouter
[Spring Boot] .down.> [Queue (RabbitMQ)] : Peut ajouter
[Spring Boot] .down.> [Search (ElasticSearch)] : Peut ajouter

[Supabase] .down.> [PostgreSQL Replicas] : Peut ajouter

note bottom
Extensible mimari
Her ekleme bağımsızdır
Genel yeniden tasarım gerekmez
end note
@enduml

Yatay ölçekleme

Uygulamanız büyüdükçe, hibrit mimari doğal olarak ölçeklenir:

Supabase :

  • Otomatik olarak milyonlarca işleme kadar ölçeklenir

  • Okuma replikaları okuma performansı için

  • Güvenlik için zaman içi kurtarma

Spring Boot:

  • Birden fazla örnek, load balancer’ın arkasında

  • Stateless tasarımı yatay ölçeklendirmeyi kolaylaştırır.

  • Gerekirse orkestrasyon için Kubernetes

PostgreSQL :

  • Büyük tablolar için partitioning

  • Bağlantı havuzu (PgBouncer)

  • Sharding gerçekten gerekiyorsa (nadir)

Mimari Tanıklıklar

Startup SaaS (50k kullanıcı)

(No content) Supabase ile %100 başladık. 5k kullanıcıda yalnızca Stripe faturalandırma ve aylık raporlar için Spring Boot ekledik. Bir yıl sonra, operasyonlarımızın %80’i hâlâ Supabase üzerinden geçiyor. Spring Boot sadece kritik kısmı yönetiyor. Bu ayrım, yeniden tasarım yapmadan ölçeklememizi mümkün kıldı. __

E-öğrenme platformu (10k kullanıcılar)

_ Supabaseteki OAuth2 kimlik doğrulaması, bizim için üç hafta geliştirme süresi kazandırdı. Otomatik olarak üretilen API’ler, tüm ders kataloğumuzu yönetir. Spring Boot sadece PDF sertifikaları ve ilerleme e-postaları için kullanılır. Basit, sürdürülebilir ve ölçeklenebilir mimari. _

Marketplace B2B (3k kullanıcı)

(empty) Spring Boot, alıcılar ve satıcılar arasındaki işlemleri yönetir (kritik). Supabase, kalan her şeyi yönetir: profiller, gerçek zamanlı mesajlaşma, belgeler. Aynı PostgreSQL veritabanını paylaştıkları için karmaşık senkronizasyondan kaçınırız. Yapımdaki en iyi mimari seçim budur. (blank)

Özet: Modern Bir Mimari Paradigma

Supabase ve Spring Boot hibrit mimarisi yeni bir paradigmadır:mimari uzmanlık.

@startuml
skinparam backgroundColor #FEFEFE

rectangle "Eski Paradigma" #LightCoral {
  card "Backend'te her şey" {
    [Auth]
    [CRUD]
    [Logique Métier]
    [Jobs]
    [Storage]
    [Realtime]
  }
  note bottom
Maksimum karmaşıklık
İlk günden
  end note
}

rectangle "Yeni Paradigma" #LightGreen {
  card "Supabase\n(Commodité)" {
    [Auth]
    [CRUD Simple]
    [Storage]
    [Realtime]
  }

  card "Spring Boot\n(Différenciation)" {
    [Logique Métier]
    [Jobs]
    [Intégrations]
  }

  note bottom
Progresif karmaşıklık
Gerekli olduğunda eklenir
  end note
}

[Ancien Paradigme] -right-> [Nouveau Paradigme] : Évolution

@enduml

Temel ilke:Zaten hizmet olarak mevcut olan şeyleri yapmayın; uygulamayı ayırt eden şeylere odaklanın.

80/20 Kuralı

Çoğu uygulamada :

  • 80% operasyonStandart CRUD’tur → Supabase

  • %20 operasyonlariş mantığı gerektirir → Spring Boot

Bu doğal kural, hibrit mimariyi gerekçendirir.

@startuml
skinparam backgroundColor #FEFEFE

package "Operasyon Dağılımı" {

  rectangle "80% - Standart İşlemler" #LightGreen {
    [Lecture de données]
    [Création d'entités]
    [Mise à jour simple]
    [Suppression]
    [Upload fichiers]
    [Authentification]

    note bottom: Yönetilen Supabase
  }

  rectangle "20% - İş Mantığı" #Coral {
    [Calculs complexes]
    [Workflows multi-étapes]
    [Transactions critiques]
    [Intégrations tierces]
    [Jobs planifiés]

    note bottom: Spring Boot tarafından yönetiliyor
  }
}

note right
Optimal fokus:
Geliştirme zamanınız
%20'yi odaklayan
Ürününüzü ayıran
end note
@enduml

Nihai Sonuç

Hibrit mimari teknik bir kompromis değildir, birstratejik karar.

Size … yapmanıza izin verir:

  • ✅ İşlevsel bir MVP ile hızlıca başlayın

  • ✅ Pazarınızı ağır bir yatırım yapmadan doğrulayın

  • Karmaşıklık gerektirdiğinde adım adım gelişmek

  • Her aşamada maliyetlerinizi kontrol edin

  • Her bir teknolojiden en iyisini kullanın

  • Erken aşırı mühendislik yapmaktan kaçının.

  • ✅ Gelecek için esnekliği koruyun

O temsil eder :

  • 🎯 pragmatizm: Her teknolojiyi, ona iyi olduğu yer

  • 🚀HızPazarlamaya giriş süresi az

  • 💰EkonomiDeğere uygun maliyetler

  • 🔮ÖlçeklenebilirlikSizinle birlikte büyüyen mimari

  • 🛡️DayanıklılıkKanıtlanmış ve güvenilir hizmetler

Sonraki Adımınız

Bu mimari size hitap ediyorsa, başlamanız gereken yer budur:

  1. Supabase hesabı oluşturun(ücretsiz)

  2. Minimum veri şemanızı tanımlayın

  3. OAuth2 kimlik doğrulamasını yapılandırın

  4. API’yi kullanan ilk JBake sayfanızı oluşturun.

  5. GitHub Pages’e deploy edin

Çalışan bir MVP’niz olacakbirkaç gün.

Spring Boot, ihtiyacınız olduğunda doğal olarak gelecek. Daha önce değil.


Hibrit mimari, ihtiyaç duyulan şeyi tam olarak ve gerektiğinde inşaat etme sanatıdır.

İyi geliştirme ! 🚀


Bu makaleyi paylaşın; eğer diğer geliştiricilerin doğru mimari seçimleri yapmalarına yardımcı olabileceğini düşünüyorsanız

İlgili Makaleler