Architecture Hybride : Le Meilleur des Deux Mondes avec Supabase et Spring Boot
Yayınlandı: 14 January 2026
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
- Mimari Vizyon
- Tasarım İlkeleri
- Akış düzenlemesi
- Karar Matrisi
- Proje Tipine Göre Mimari Örnekleri
- Aşamalı Göç Stratejisi
- Maliyetler ve Operasyonel Dikkat Edilmesi Gereken Hususlar
- Sonuç: Mükemmel denge
- Daha İleri
- Gelişim Perspektifleri
- Mimari Tanıklıklar
- Özet: Modern Bir Mimari Paradigma
- Nihai Sonuç
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:
-
Supabase hesabı oluşturun(ücretsiz)
-
Minimum veri şemanızı tanımlayın
-
OAuth2 kimlik doğrulamasını yapılandırın
-
API’yi kullanan ilk JBake sayfanızı oluşturun.
-
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