Architecture Hybride : Le Meilleur des Deux Mondes avec Supabase et Spring Boot
Yayınlandı: 14 January 2026
Supabase’in basitliği ile Spring Boot’un gücü arasında bir seçim yapmak yerine, neden ikisini birleştirmiyorsunuz? Her iki teknolojinin de en iyi yanlarını kullanan hibrit bir mimariyi keşfedin.
- Modern Mimarlığın Sahte Dilemması
- Mimari Vizyon
- Tasarım İlkeleri
- Akış Orkestrasyonu
- Karar Matrisi
- Proje Tipine Göre Mimari Örnekleri
- Kademeli Geçiş Stratejisi
- Maliyetler ve Operasyonel Hususlar
- Sonuç: Mükemmel Denge
- Daha Fazla Bilgi İçin
- Gelişim Perspektifleri
- Mimari Tanıklıklar
- Sentez: Modern Bir Mimari Paradigma
- Final Sonuç
Modern Mimarlığın Sahte Dilemması
Statik bir frontend ile modern bir uygulama oluştururken, genellikle ikili bir seçimle karşı karşıya kalırız:
-
Her şeyi bir Backend-as-a-Service çözümüne bağlamak(Supabase, Firebase) - basit ama sınırlı
-
Kapsamlı bir backend oluşturmak(Spring Boot, Node.js) - güçlü ancak karmaşık
Bu seçim yanlış bir ikilemdir. Hibrit mimari üçüncü bir yol sunar: her teknolojiyi en başarılı olduğu yerde kullanmak.
Mimari Vizyon
Geleneksel Mimari: Monolitik
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
package "Architecture Traditionnelle" {
actor Utilisateur as user
component "Frontend" as frontend #LightBlue
component "Backend Monolithique" as backend #LightCoral {
[Authentification]
[CRUD]
[Logique Métier]
[Jobs]
[APIs Tierces]
}
database "Base de Données" as db #LightGray
user --> frontend
frontend --> backend : Toutes les requêtes
backend --> db
}
note right of backend
Tout passe par le backend
même les opérations simples
⚠️ Point de congestion unique
⚠️ Complexité dès le départ
⚠️ Couplage fort
end note
@enduml
Bu yaklaşımda, en basit işlemler bile (bir makaleyi okuma, bir yorum oluşturma) backend’iniz üzerinden geçmek zorundadır. Karmaşıklığın bedelini ilk günden ödersiniz.
BaaS Mimarisi: Her Şey Devredilmiş
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
package "Architecture BaaS Pure" {
actor Utilisateur as user
component "Frontend" as frontend #LightBlue
cloud "Supabase / Firebase" as baas #LightGreen {
[Auth]
[Database]
[Storage]
[Edge Functions]
}
user --> frontend
frontend --> baas : Toutes les opérations
}
note right of baas
Développement rapide
Pas de serveur à gérer
⚠️ Limité pour logique complexe
⚠️ Vendor lock-in
⚠️ Edge Functions contraintes
end note
@enduml
Buna karşılık, her şeyi bir BaaS’e devretmek başlangıçta cazip gelse de, iş mantığı karmaşıklaştığı anda hızla sınırlarını göstermektedir.
Hibrit Mimari: Sorumlulukların Ayrılması
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
actor Utilisateur as user #LightBlue
package "Couche Frontend" {
component "Site Statique JBake" as frontend #SkyBlue
}
package "Couche Simple (Supabase)" #LightGreen {
component "Authentification" as auth
component "CRUD Basique" as crud
component "Stockage Fichiers" as storage
component "Temps Réel" as realtime
}
package "Couche Métier (Spring Boot)" #Coral {
component "Logique Complexe" as logic
component "Orchestration" as orchestration
component "Jobs Planifiés" as jobs
component "Intégrations" as integrations
}
database "PostgreSQL Partagé" as db #LightGray
user --> frontend
frontend --> auth : OAuth2, JWT
frontend --> crud : Articles, Profils
frontend --> storage : Images, Fichiers
frontend --> realtime : Notifications
frontend --> logic : Calculs, Rapports
frontend --> orchestration : Workflows
logic --> integrations : Stripe, APIs
orchestration --> db
jobs --> db
crud --> db
auth --> db
note bottom of db
**Une seule source de vérité**
Partagée entre Supabase et Spring Boot
end note
note right of auth
**Gratuit jusqu'à 50k users**
Configuration en quelques clics
OAuth2 multi-providers
end note
note right of logic
**Activé seulement si nécessaire**
Kotlin + Coroutines
Transactions complexes
end note
@enduml
Hibrit mimari, sorumlulukları operasyonların karmaşıklığına ve doğasına göre net bir şekilde ayırır.
Tasarım İlkeleri
İlke 1: Basit Başlayın, Akıllıca Geliştirin
@startuml
skinparam backgroundColor #FEFEFE
rectangle "**Phase 1 : MVP**" #LightGreen {
component "JBake + Supabase" as mvp
note right
✓ Développement en jours
✓ Coût : 0€
✓ Validation concept
end note
}
rectangle "**Phase 2 : Croissance**" #LightYellow {
component "JBake + Supabase\n+ Spring Boot (optionnel)" as growth
note right
✓ Logique métier émerge
✓ Premiers jobs planifiés
✓ Intégrations tierces
end note
}
rectangle "**Phase 3 : Scale**" #LightCoral {
component "Architecture Complète" as scale
note right
✓ Orchestration complexe
✓ Performances optimisées
✓ Cache distribué
end note
}
mvp -down-> growth : Quand la complexité\nle justifie
growth -down-> scale : Optimisation\ncontinue
@enduml
İhtiyacınız yoksa Spring Boot oluşturmayın.Supabase ile başlayın, karmaşıklık haklı çıkardığında Spring Boot ekleyin.
İlke 2: İşlem Türüne Göre Ayrım
@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
İlke 3: Tek Gerçek Kaynağı
@startuml
skinparam backgroundColor #FEFEFE
database "PostgreSQL" as db #LightGray {
package "Şema: auth (Supabase)" #LightGreen {
[users]
[sessions]
[identities]
}
package "Şema: public (Paylaşılan)" #SkyBlue {
[articles]
[comments]
[profiles]
}
package "Şema: business (Spring Boot)" #Coral {
[orders]
[payments]
[reports]
}
}
component "Supabase" as supabase #LightGreen
component "Spring Boot" as spring #Coral
supabase -down-> users : Gère
supabase -down-> sessions : Gère
supabase -down-> articles : Accède
supabase -down-> comments : Accède
supabase -down-> profiles : Accède
spring -down-> articles : Accède
spring -down-> profiles : Accède
spring -down-> orders : Gère
spring -down-> payments : Gère
spring -down-> reports : Gère
note right of db
**Avantajlar:**
• Karmaşık senkronizasyon yok
• Tablolar arası JOIN işlemleri mümkün
• Garanti edilen tutarlılık
• Birleştirilmiş migrasyonlar
end note
@enduml
Aynı PostgreSQL örneğini paylaşarak, Supabase ve Spring Boot karmaşık bir senkronizasyon olmaksızın aynı veriler üzerinde çalışır.
Akış Orkestrasyonu
Akış 1 : Merkezi Kimlik Doğrulama
@startuml skinparam backgroundColor #FEFEFE autonumber actor "Utilisateur" as user participant "JBake" as jbake participant "Supabase Auth" as auth participant "Spring Boot" as spring database "PostgreSQL" as db == Authentification == user -> jbake : Clique "Se connecter" jbake -> auth : Redirect OAuth2 (Google/GitHub) auth -> user : Consent screen user -> auth : Autorise auth -> auth : Génère JWT auth -> jbake : Retourne JWT + Refresh Token jbake -> jbake : Stocke tokens (sessionStorage) == Accès aux Ressources == group Opération Simple (CRUD) user -> jbake : Crée un article jbake -> db : POST avec JWT note right: Supabase Row Level Security\nvérifie le JWT automatiquement db -> jbake : Article créé end group Opération Complexe (Métier) user -> jbake : Génère un rapport jbake -> spring : POST /api/reports\navec JWT spring -> spring : Valide JWT Supabase spring -> spring : Extrait claims (user_id, roles) spring -> db : Requêtes complexes spring -> jbake : Rapport généré end note over auth, spring **Le JWT est universel** Valide par Supabase ET Spring Boot Pas de double authentification end note @enduml
Anahtar nokta: Tek bir kimlik doğrulama süreci, her yerde kullanılabilir tek bir JWT.
Flux 2: Karmaşık Bir İş Sürecinin Orkestrasyonu
@startuml skinparam backgroundColor #FEFEFE autonumber actor "Client" as user participant "JBake" as jbake participant "Spring Boot" as spring participant "Supabase DB" as supadb participant "Stripe API" as stripe participant "Inventory Service" as inventory participant "Email Service" as email database "PostgreSQL" as db user -> jbake : Passe commande jbake -> spring : POST /api/orders/create == Orchestration Spring Boot == spring -> db : BEGIN TRANSACTION par Vérifications Parallèles spring -> inventory : Vérifier stock inventory -> spring : Stock OK else spring -> db : Vérifier profil client db -> spring : Client vérifié end spring -> stripe : Créer Payment Intent stripe -> spring : Intent créé (ID: pi_xxx) spring -> db : Créer Order (status: PENDING) db -> spring : Order créé spring -> stripe : Confirmer paiement stripe -> spring : Paiement confirmé spring -> db : Update Order (status: PAID) spring -> inventory : Décrémenter stock spring -> db : COMMIT TRANSACTION par Notifications Asynchrones spring -> email : Email confirmation else spring -> supadb : Insert notification note right: Notification temps réel\nvia Supabase Realtime end spring -> jbake : Order confirmé jbake -> user : Affiche confirmation note over spring **Responsabilités Spring Boot :** • Transaction ACID • Orchestration multi-services • Rollback automatique si erreur • Gestion des cas limites end note @enduml
Spring Boot’un getirdikleri: İşlem garantisiyle birlikte birden fazla sistemi içeren karmaşık süreçlerin güvenilir orkestrasyonu.
Flux 3 : Planlanmış İşler ve Senkronizasyonlar
@startuml skinparam backgroundColor #FEFEFE participant "Scheduler\n(Spring Boot)" as scheduler participant "Report Service" as report participant "PostgreSQL" as db participant "External API" as api participant "Email Service" as email participant "Supabase Storage" as storage == Job Quotidien : 2h00 == activate scheduler scheduler -> report : Déclenche génération rapport activate report report -> db : Récupère données\ndes dernières 24h db -> report : Dataset report -> report : Calculs & Agrégations report -> report : Génération PDF report -> storage : Upload PDF storage -> report : URL publique report -> email : Envoie aux admins\navec lien PDF deactivate report == Job Hebdomadaire : Dimanche 3h00 == scheduler -> report : Synchronisation externe activate report report -> api : Fetch données externes api -> report : Nouvelles données report -> db : Mise à jour tables report -> db : Nettoyage données obsolètes deactivate report == Job Mensuel : 1er du mois == scheduler -> report : Facturation activate report report -> db : Liste clients actifs report -> report : Calcul montants report -> api : Génération factures (Stripe) report -> email : Envoi factures deactivate report deactivate scheduler note right of scheduler **Impossible avec Supabase seul** Edge Functions non adaptées pour jobs longs et récurrents end note @enduml
Spring Boot’un getirdikleri: Durum yönetimi, otomatik yeniden deneme ve garanti edilen yürütme ile güvenilir planlanmış işler.
Karar Matrisi
Supabase Ne Zaman Kullanılır?
@startuml
skinparam backgroundColor #FEFEFE
start
:Nouvelle fonctionnalité à implémenter;
if (CRUD simple ?) then (oui)
:✅ **Supabase**;
stop
else (non)
if (Authentification ?) then (oui)
:✅ **Supabase Auth**;
stop
else (non)
if (Upload fichiers ?) then (oui)
:✅ **Supabase Storage**;
stop
else (non)
if (Temps réel ?) then (oui)
:✅ **Supabase Realtime**;
stop
else (non)
if (Row Level Security\nsuffisante ?) then (oui)
:✅ **Supabase + Policies**;
stop
else (non)
:⚠️ **Considérer Spring Boot**;
#Coral:Passer à l'arbre\nde décision Spring Boot;
stop
endif
endif
endif
endif
endif
@enduml
Spring Boot Ne Zaman Kullanılır?
@startuml
skinparam backgroundColor #FEFEFE
start
:Nouvelle fonctionnalité complexe;
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 Scheduler**;
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)
:⚠️ **Probablement Supabase**;
#LightGreen:Revenir à l'arbre\nde décision Supabase;
stop
endif
endif
endif
endif
endif
endif
@enduml
Proje Tipine Göre Mimari Örnekleri
Blog / Portfolyo
@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: Yalnızca planlanmış 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 üçüncü taraf bir servis (Mailchimp)
tarafından yönetilebilir
end note
@enduml
Hüküm: %100 Supabase fazlasıyla yeterli.
SaaS Uygulaması
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
package "SaaS Uygulaması - Hibrit Mimari" {
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 "Harici Servisler" {
[Stripe API]
[SendGrid Email]
}
database "Paylaşımlı PostgreSQL" 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"
**Şunlar için gereklidir:**
• Abonelik yönetimi
• Yinelenen faturalandırma
• Dinamik kotalar
• Karmaşık analizler
• Güvenilir Webhook'lar
end note
@enduml
Hüküm: Hibrit mimari gerekli. Temel işlemler için Supabase, kritik kısımlar (ödemeler, faturalandırma) için Spring Boot.
E-ticaret
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
package "E-ticaret - %70 Spring Boot" {
component "Mağaza Ön Yüzü (JBake/React)" as frontend #SkyBlue
package "Supabase" #LightGreen {
[Auth Clients]
[Catalogue Produits\n(lecture seule)]
[Images Produits]
}
package "Spring Boot (İş Mantığı Ç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 (İş Mantığı Çekirdeği)"
**Spring Boot vazgeçilmezdir:**
• Kritik işlemler
• Karmaşık orkestrasyon
• Çoklu entegrasyonlar
• Yasal uyumluluk
• Senkronizasyon işleri
end note
@enduml
Hüküm: Spring Boot vazgeçilmez. Supabase sadece auth ve katalog için.
Kademeli Geçiş Stratejisi
@startuml
skinparam backgroundColor #FEFEFE
|Semaine 1-2|
start
:Créer projet Supabase;
:Configurer Auth (Google, GitHub);
:Définir schéma PostgreSQL initial;
:Implémenter CRUD de base sur JBake;
:Déployer MVP sur GitHub Pages;
note right
**Livrable :** Application fonctionnelle
**Coût :** 0€
**Temps :** 1-2 semaines
end note
|Semaine 3-4|
:Observer utilisation réelle;
:Identifier limitations;
|Décision|
if (Logique complexe\némerge ?) then (non)
|Supabase|
:Continuer avec Supabase seul;
:Ajouter Edge Functions si besoin;
stop
else (oui)
|Spring Boot|
:Créer projet Spring Boot;
:Configurer validation JWT Supabase;
:Migrer logique complexe vers Spring Boot;
note right
**Migration sélective**
Seulement ce qui est complexe
end note
endif
|Semaines suivantes|
:Déployer Spring Boot (Cloud Run, EC2);
:Connecter à PostgreSQL Supabase;
:Implémenter premiers jobs planifiés;
:Intégrer APIs tierces;
stop
note right
**Architecture finale hybride**
Supabase + Spring Boot
en parfaite harmonie
end note
@enduml
Maliyetler ve Operasyonel Hususlar
Maliyet Yapısı
@startuml
skinparam backgroundColor #FEFEFE
package "Tahmini Aylık Maliyetler" {
rectangle "MVP Aşaması\n(0-1000 kullanıcı)" #LightGreen {
[JBake (GitHub Pages): 0€]
[Supabase: 0€]
[Spring Boot: N/A]
note bottom: **Toplam: 0€/ay**
}
rectangle "Büyüme Aşaması\n(1k-10k kullanıcı)" #LightYellow {
[JBake (GitHub Pages): 0€]
[Supabase: 0€]
[Spring Boot (Cloud Run): 20-50€]
[PostgreSQL (si séparé): 0-30€]
note bottom: **Toplam: 20-80€/ay**
}
rectangle "Ölçekleme Aşaması\n(10k-100k kullanıcı)" #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€/ay**
}
}
note right of "Ölçekleme Aşaması\n(10k-100k kullanıcı)"
Bu aşamada gelirler, maliyetleri fazlasıyla karşılamaktadır
end note
@enduml
Operasyonel Sorumluluklar
@startuml
skinparam backgroundColor #FEFEFE
package "Kimin Yönetimi?" {
rectangle "Supabase tarafından yönetilir (0 çaba)" #LightGreen {
[Authentification]
[Base de données]
[Backups automatiques]
[Scaling automatique]
[Monitoring DB]
[Sécurité DB]
}
rectangle "GitHub tarafından yönetilir (0 çaba)" #SkyBlue {
[Hébergement site statique]
[HTTPS/SSL]
[CDN global]
[Déploiement automatique]
}
rectangle "Yönetilmesi Gereken (Spring Boot)" #LightCoral {
[Déploiement application]
[Monitoring APM]
[Logs centralisés]
[Scaling horizontal]
[Mises à jour sécurité]
}
}
note bottom of "Yönetilmesi Gereken (Spring Boot)"
**Şunlarla minimize edilebilir:**
• Cloud Run (serverless)
• Kubernetes (gerekirse)
• Yönetilen servisler (RDS, vb.)
end note
@enduml
Sonuç: Mükemmel Denge
Supabase + Spring Boot hibrit mimarisi bir ödünleşim değil, birsinerjiLütfen çevrilecek metni sağlayın.
Unutulmaması Gereken İlkeler
@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çilmeli?
✅ Bu mimari şu durumlar için idealdir:
-
Hızlıca başlamak istiyorsunuz (aylar değil, günler içinde MVP)
-
İş karmaşıklığının artmasını öngörüyorsunuz
-
Başlangıç maliyetlerini minimize etmek istiyorsunuz
-
PostgreSQL’i seviyorsunuz ve tek bir doğruluk kaynağı istiyorsunuz
-
İş mantığı kodu için Kotlin ve Coroutines’i tercih ediyorsunuz
-
Tamamen tedarikçiye bağımlı kalmaktan (vendor lock-in) kaçınmak istiyorsunuz
❌ Bu mimari şu durumlarda UYGUN DEĞİLDİR:
-
Projeniz basit ve öyle kalacak (kişisel blog → %100 Supabase yeterlidir)
-
Hâkim olduğunuz, halihazırda kurulu bir backend stack’iniz var
-
Geleneksel bir monolit tercih edersiniz
-
Backend tarafında .NET, Python veya başka bir dile ihtiyacınız var
Final Genel Bakış
@startuml
skinparam backgroundColor #FEFEFE
package "Tam Hibrit Mimari" {
actor "Kullanıcılar" as users
rectangle "Frontend (Statik)" #SkyBlue {
[JBake / GitHub Pages]
note right: Ücretsiz, küresel CDN
}
rectangle "Basit Backend (Supabase)" #LightGreen {
[Auth OAuth2]
[CRUD APIs]
[Storage]
[Realtime]
note right
50k kullanıcıya kadar ücretsiz
Sıfır sunucu yapılandırması
end note
}
rectangle "İş Mantığı Backend (Spring Boot)" #Coral {
[Orchestration]
[Jobs Planifiés]
[Intégrations]
[Transactions]
note right
Yalnızca gerekliyse
etkinleştirilir
end note
}
database "PostgreSQL\nTek Doğruluk Kaynağı" 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 taban, iki tüketici**
• Basit olanlar için Supabase
• Karmaşık olanlar için Spring Boot
• Senkronizasyona gerek yok
end note
@enduml
İki Dünyanın En İyisi
Bu mimari size şunları sağlar:
🚀 Supabase Hızı
-
Haftalarla değil, saatlerle başlatma
-
Birkaç tıklamayla OAuth2 kimlik doğrulaması
-
Otomatik olarak oluşturulan REST API’ler
-
Sıfır sunucu yapılandırması
💪 Spring Boot’un Gücü
-
Zarif asenkron kod için Kotlin ve Coroutines
-
Karmaşık iş süreçlerinin orkestrasyonu
-
Güvenilir planlanmış işler
-
Garanti edilen ACID işlemleri
-
Kapsamlı Spring ekosistemi
💰 Kademeli Ekonomi
-
Başlamak ve onaylamak için 0€
-
Büyümeyi takip eden maliyetler
-
Erken aşamada aşırı mühendislik (over-engineering) yapmayın
🎯 Mimari Esneklik
-
Yeniden yapılandırma olmadan kademeli geçiş
-
Yalnızca gerektiğinde Spring Boot ekleme
-
Tam bir satıcı kilitlemesi (vendor lock-in) yok
-
Ölçeklenebilir mimari
Daha Fazla Bilgi İçin
Teknik Kaynaklar
Supabase Dokümantasyonu :
Spring Boot Dokümantasyonu :
Ek Makaleler:
-
JWT ile API’lerin Güvenli Hale Getirilmesi
-
PostgreSQL performans optimizasyonu
-
Kademeli migrasyon desenleri
-
Dağıtık mimaride hata yönetimi
Gerçek Kullanım Durumları
Bu hibrit mimari şuralarda başarıyla kullanılmaktadır:
-
B2B SaaS: Supabase Kimlik Doğrulaması, Spring Boot faturalandırma
-
Pazaryerleri: Supabase Kataloğu, Spring Boot işlemleri
-
İçerik platformları: Supabase Makaleleri, Spring Boot analizleri
-
Dahili araçlar: CRUD Supabase, Spring Boot iş akışları
Başlangıç Kontrol Listesi
Aşama 1 - Temeller (1. Hafta)
-
Supabase hesabı oluştur - [ ] PostgreSQL projesini yapılandır - [ ] Kimlik Doğrulamayı Etkinleştir (Google, GitHub) - [ ] Başlangıç şemasını tanımla - [ ] Satır Düzeyinde Güvenlik (Row Level Security) Yapılandır - [ ] JBake üzerinden API’leri test et
Faz 2 - MVP (2-3. Hafta)
-
Ana sayfaları uygula - [ ] OAuth2 kimlik doğrulamasını entegre et - [ ] CRUD formları oluştur - [ ] Dosyalar için Storage yapılandırın - [ ] GitHub Pages üzerinde yayına al - [ ] Gerçek koşullarda test et
Faz 3 - Evrim (İhtiyaçlara göre)
-
Karmaşık mantık ihtiyaçlarını belirleyin - [ ] Gerekirse Spring Boot projesi oluşturun - [ ] Supabase JWT doğrulamasını yapılandır - [ ] Supabase PostgreSQL’e bağlan - [ ] Karmaşık özellikleri taşı - [ ] Zamanlanmış işleri uygula - [ ] Spring Boot’u Dağıt (Cloud Run, vb.)
Kaçınılması Gereken Anti-Patternlar
❌ Yapılmaması gerekenler:
-
Supabase ve Spring Boot arasında verileri kopyalamak
-
İki ayrı PostgreSQL veri tabanı oluşturun
-
Kimlik doğrulamayı kendiniz kodlayın
-
Basit CRUD için Spring Boot kullanmak
-
En başından aşırı mimari yapılandırmak
-
Supabase Satır Düzeyinde Güvenliği’ni (Row Level Security) Yoksay
✅ Bunun yerine şunu yapın:
-
Tek bir PostgreSQL veri tabanını paylaşmak
-
Kimlik doğrulama yönetimini Supabase’e bırakın
-
Spring Boot’u yalnızca karmaşıklık için kullanın
-
Basit başlayın, kademeli olarak geliştirin
-
Her teknolojinin güçlü yönlerinden yararlanmak
-
Veritabanı düzeyinde RLS ile güvenli hale getirme
Gelişim Perspektifleri
Yeni Yeteneklerin Eklenmesi
@startuml
skinparam backgroundColor #FEFEFE
rectangle "Güncel Mimari" #SkyBlue {
[JBake]
[Supabase]
[Spring Boot]
}
rectangle "Olası Geliştirmeler" #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
**Genişletilebilir mimari**
Her ekleme bağımsızdır
Genel bir yeniden tasarıma gerek yoktur
end note
@enduml
Yatay Ölçeklendirme
Uygulamanız büyüdükçe, hibrit mimari doğal olarak ölçeklenir:
Supabase :
-
Milyonlarca işleme kadar otomatik olarak ölçeklenir
-
Okuma performansı için read replica’lar
-
Güvenlik için anlık geri yükleme (Point-in-time recovery)
Spring Boot :
-
Load balancer arkasında birden fazla örnek
-
Stateless tasarım yatay ölçeklendirmeyi kolaylaştırır
-
Gerekirse orkestrasyon için Kubernetes
PostgreSQL :
-
Büyük tablolar için bölümlendirme
-
Bağlantı havuzlama (PgBouncer)
-
Sharding gerçekten gerekliyse (nadir)
Mimari Tanıklıklar
SaaS Girişimi (50k kullanıcı)
Lütfen çevrilecek metni sağlayın. %100 Supabase ile başladık. 5 bin kullanıcıya ulaştığımızda, yalnızca Stripe faturalandırması ve aylık raporlar için Spring Boot ekledik. Bir yıl sonra, operasyonlarımızın %80’i hâlâ Supabase üzerinden yürüyor. Spring Boot sadece kritik kısmı yönetiyor. Bu ayrım, yeniden yapılandırmaya gerek kalmadan ölçeklenmemizi sağladı. Lütfen çevrilecek metni sağlayın.
E-öğrenme Platformu (10 bin kullanıcı)
Lütfen çevirmek istediğiniz metni sağlayın. Supabase’in OAuth2 kimlik doğrulaması bize 3 haftalık geliştirme süresi kazandırdı. Otomatik oluşturulan API’ler tüm kurs kataloğumuzu yönetiyor. Spring Boot yalnızca PDF sertifikaları ve ilerleme e-postaları için kullanılıyor. Basit, bakımı kolay ve ölçeklenebilir bir mimari. Lütfen çevrilmesini istediğiniz Fransızca metni sağlayın.
B2B Pazaryeri (3 bin kullanıcı)
Lütfen çevrilecek metni sağlayın. Spring Boot, alıcılar ve satıcılar arasındaki işlemleri (kritik) yönetiyor. Supabase ise geri kalan her şeyi yönetiyor: profiller, gerçek zamanlı mesajlaşma, belgeler. Aynı PostgreSQL veritabanını paylaşmaları, bizi karmaşık senkronizasyon işlemlerinden kurtarıyor. Yaptığımız en iyi mimari seçim. Lütfen çevirmek istediğiniz Fransızca metni sağlayın.
Sentez: Modern Bir Mimari Paradigma
Supabase + Spring Boot hibrit mimarisi yeni bir paradigma temsil ediyor:mimari uzmanlaşmaLütfen çevrilecek metni sağlayın.
@startuml
skinparam backgroundColor #FEFEFE
rectangle "Eski Paradigma" #LightCoral {
card "Her Şey Backend'de" {
[Auth]
[CRUD]
[Logique Métier]
[Jobs]
[Storage]
[Realtime]
}
note bottom
Maksimum karmaşıklık
1. günden itibaren
end note
}
rectangle "Yeni Paradigma" #LightGreen {
card "Supabase\n(Kolaylık)" {
[Auth]
[CRUD Simple]
[Storage]
[Realtime]
}
card "Spring Boot\n(Farklılaşma)" {
[Logique Métier]
[Jobs]
[Intégrations]
}
note bottom
Kademeli karmaşıklık
yalnızca gerektiğinde eklenir
end note
}
[Ancien Paradigme] -right-> [Nouveau Paradigme] : Évolution
@enduml
Temel ilke:Halihazırda bir servis olarak mevcut olan şeyleri inşa etmeyin. Uygulamanızı farklı kılan şeye odaklanın.
80/20 Kuralı
Çoğu uygulamada:
-
işlemlerin %80’istandart CRUD’dur → Supabase
-
işlemlerin %20’siiş mantığı gerektirir → Spring Boot
Bu doğal kural, hibrit mimariyi haklı çıkarmaktadır.
@startuml
skinparam backgroundColor #FEFEFE
package "İşlemlerin 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: **Supabase tarafından yönetiliyor**
}
rectangle "%20 - İş Mantığı" #Coral {
[Calculs complexes]
[Workflows multi-étapes]
[Transactions critiques]
[Intégrations tierces]
[Jobs planifiés]
note bottom: **Spring Boot tarafından yönetilir**
}
}
note right
**Optimal odak:**
Geliştirme sürenizi, ürününüzü farklı kılan %20'lik kısma odaklayın
end note
@enduml
Final Sonuç
Hibrit mimari teknik bir ödün değil, birstratejik kararLütfen çevrilmesini istediğiniz metni sağlayın.
Şunları yapmanıza olanak tanır:
-
✅ İşlevsel bir MVP ile hızlıca başlayın
-
✅ Ağır yatırım yapmadan pazarınızı doğrulayın
-
✅ Karmaşıklık gerektirdiğinde kademeli olarak gelişmek
-
✅ Her adımda maliyetlerinizi kontrol altına alın
-
✅ Her teknolojinin en iyi yanlarından yararlanmak
-
✅ Erken aşamada aşırı mühendislikten (
sur-engineering) kaçının -
✅ Gelecek için esnekliği korumak
Şunu temsil eder:
-
🎯Pragmatizm: Uzmanlaştığı her teknoloji
-
🚀Hız: Pazara sunma süresi minimal
-
💰Ekonomi: Değere dayalı maliyetler
-
🔮Ölçeklenebilirlik: Sizinle birlikte büyüyen mimari
-
🛡️Dayanıklılık: Kanıtlanmış ve güvenilir hizmetler
Bir Sonraki Adımınız
Eğer bu mimari size hitap ediyorsa, işte nereden başlayacağınız:
-
Bir Supabase hesabı oluşturun(ücretsiz)
-
Minimum veri şemanızı tanımlayın
-
OAuth2 kimlik doğrulamasını yapılandırın
-
API’yi tüketen ilk JBake sayfanızı oluşturun
-
GitHub Pages üzerinde yayınlayın
Şu sürede işlevsel bir MVP’niz olacak:birkaç günLütfen çevrilecek metni sağlayın.
Spring Boot, ona ihtiyacınız olduğunda doğal olarak gelecektir. Daha önce değil.
Hibrit mimari, tam olarak gerekeni, gereken zamanda inşa etme sanatıdır.
İyi geliştirmeler! 🚀
Bu makalenin diğer geliştiricilerin doğru mimari seçimler yapmalarına yardımcı olabileceğini düşünüyorsanız lütfen paylaşın.