Hybride architectuur : Het beste van twee werelden met Supabase en Spring Boot
Gepubliceerd op 14 January 2026
Kies niet voor de eenvoud van Supabase of de kracht van Spring Boot, waarom combineert u niet beide? Ontdek een hybride architectuur die het beste van elke technologie benut.
- Het valse dilemma van de moderne architectuur
- Architecturale visie
- Ontwerpprincipes
- Orchestratie van de Flux
- Beslissingsmatrix
- Voorbeelden van architectuur per projecttype
- Strategie voor progressieve migratie
- Kosten en operationele overwegingen
- Conclusie: Het perfecte evenwicht
- Om verder te gaan
- Ontwikkelingsperspectieven
- Architectonische getuigenissen
- Synthese : Een modern architecturaal paradigma
- Eindconclusie
Het valse dilemma van de moderne architectuur
Wanneer men een moderne toepassing bouwt met een statische frontend, komt men vaak voor een binaire keuze te staan :
-
Alles inzetten op een Backend-as-a-Service-oplossing(Supabase, Firebase) - eenvoudig maar beperkt
-
Bouw een compleet backend(Spring Boot, Node.js) - krachtig maar complex
Deze keuze is een valse dilemma. De hybride architectuur biedt een derde weg: elke technologie gebruiken waar ze uitblinkt.
Architecturale visie
De traditionele architectuur: monolithisch
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
package "Traditionele architectuur" {
actor Utilisateur as user
component "Frontend" as frontend #LightBlue
component "Monolithische backend" as backend #LightCoral {
[Authentification]
[CRUD]
[Logique Métier]
[Jobs]
[APIs Tierces]
}
database "Database" as db #LightGray
user --> frontend
frontend --> backend : Alle aanvragen
backend --> db
}
note right of backend
Alles gaat via de backend
Zelfs de eenvoudige operaties
⚠️ Uniek congestiepunt
⚠️ Complexiteit vanaf het begin
⚠️ Sterke koppeling
end note
@enduml
In deze aanpak moeten zelfs de eenvoudigste bewerkingen (het lezen van een artikel, het maken van een reactie) via uw backend verlopen. U betaalt de kosten van de complexiteit vanaf de eerste dag.
De BaaS-architectuur: Iedere gedelegeerde
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
package "Architectuur BaaS Puur" {
actor Utilisateur as user
component "Frontend" as frontend #LightBlue
cloud "Supabase / Firebase" as baas #LightGreen {
[Auth]
[Database]
[Storage]
[Edge Functions]
}
user --> frontend
frontend --> baas : Alle operaties
}
note right of baas
Snelle ontwikkeling
Geen server om te beheren
⚠️ Beperkt voor complexe logica
⚠️ Leveranciersbinding
⚠️ Edge Functions beperkingen
end note
@enduml
Aan de andere kant is het alles delegeren naar een BaaS in het begin verleidelijk, maar het toont al snel zijn grenzen zodra de bedrijfslogica complexer wordt.
De Hybride Architectuur: Scheiding van Verantwoordelijkheden
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
actor Utilisateur as user #LightBlue
package "Frontend-laag" {
component "Statische site JBake" as frontend #SkyBlue
}
package "Eenvoudige laag (Supabase)" #LightGreen {
component "Authenticatie" as auth
component "CRUD Basis" as crud
component "Bestandsopslag" as storage
component "Realtijd" as realtime
}
package "Bedrijfslaag (Spring Boot)" #Coral {
component "Gecompliceerde logica" as logic
component "Orchestratie" as orchestration
component "Geplande taken" as jobs
component "Integraties" as integrations
}
database "PostgreSQL gedeeld" as db #LightGray
user --> frontend
frontend --> auth : OAuth2, JWT
frontend --> crud : Artikelen, Profielen
frontend --> storage : Afbeeldingen, Bestanden
frontend --> realtime : Meldingen
frontend --> logic : Berekeningen, Rapporten
frontend --> orchestration : Werkstromen
logic --> integrations : Stripe, APIs
orchestration --> db
jobs --> db
crud --> db
auth --> db
note bottom of db
**Één enkele bron van waarheid**
Gedeeld tussen Supabase en Spring Boot
end note
note right of auth
Gratis tot 50k gebruikers
Configuratie in een paar klikken
OAuth2 meerdere providers
end note
note right of logic
Ingeschakeld alleen wanneer nodig
Kotlin + Coroutines
Complexe transacties
end note
@enduml
De hybride architectuur scheidt duidelijk de verantwoordelijkheden op basis van de complexiteit en de aard van de operaties.
Ontwerpprincipes
Princip 1: Begin simpel, ontwikkel intelligent
@startuml
skinparam backgroundColor #FEFEFE
rectangle "**Fase 1 : MVP**" #LightGreen {
component "JBake + Supabase" as mvp
note right
✓ Ontwikkeling in dagen
✓ Kost : 0€
✓ Conceptvalidatie
end note
}
rectangle "**Fase 2 : Groei**" #LightYellow {
component "JBake + Supabase\n+ Spring Boot (optioneel)" as growth
note right
✓ Zakelijke logica ontstaat
✓ Eerste geplande taken
✓ Externe integraties
end note
}
rectangle "**Fase 3 : Schaal**" #LightCoral {
component "Volledige architectuur" as scale
note right
✓ Complexe orkestratie
✓ Geoptimaliseerde prestaties
✓ Gedistribueerde cache
end note
}
mvp -down-> growth : Wanneer de complexité\nle rechtvaardigt
growth -down-> scale : Optimalisatie\nvervolg
@enduml
Bouw Spring Boot niet als je het niet nodig hebt.Begin met Supabase, voeg Spring Boot toe wanneer de complexiteit dat rechtvaardigt.
Beginsel 2: Scheiding op basis van aard van de bewerking
@startmindmap skinparam backgroundColor #FEFEFE * Bewerkingen\nApplicatieve left side ** eenvoudige operaties\n(Supabase) ***_ CRUD Standaard ****_ lezing ****_ Creatie ****_ Update ****_Onderdrukking_ ***_ Authenticatie ****_ Inloggen/Logout ****_ OAuth2 ****_Sessiebeheer ***_Opslag ****_ Upload bestanden ****_ CDN automatisch ***_ Realtime ****_ WebSocket ****_ Meldingen right side ** Complexe operaties\n(Spring Boot) ***_ Bedrijfslogica ****Complexe berekeningen ****_ Vakregels ****_ Geavanceerde validaties ***_ Orkestratie ****Meervoudige diensten ****_Gedistribueerde transacties ****_ Saga-patronen ***_ Geplande taken ****_ Periodieke rapporten ****_ Synchronisaties ****_ Reinigingen ***_ Integraties ****Betalingen (Stripe) ****_ APIs derden ****_ Diensten ML/AI @endmindmap
Principe 3: Een enkele bron van waarheid
@startuml
skinparam backgroundColor #FEFEFE
database "PostgreSQL" as db #LightGray {
package "Schema: auth (Supabase)" #LightGreen {
[users]
[sessions]
[identities]
}
package "Schema: public (Gedeeld)" #SkyBlue {
[articles]
[comments]
[profiles]
}
package "Schema: 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
**Voordelen:**
• Geen complexe synchronisatie
• JOINs mogelijk tussen tabellen
• Consistentie gegarandeerd
• Geünificeerde migraties
end note
@enduml
Door dezelfde PostgreSQL-instantie te delen, werken Supabase en Spring Boot aan dezelfde gegevens zonder complexe synchronisatie.
Orchestratie van de Flux
Flux 1 : Gecentraliseerde authenticatie
@startuml skinparam backgroundColor #FEFEFE autonumber actor "Gebruiker" as user participant "JBake" as jbake participant "Supabase Auth" as auth participant "Spring Boot" as spring database "PostgreSQL" as db == Authentification == user -> jbake : Clique "Inloggen" jbake -> auth : Verwijzen OAuth2 (Google/GitHub) auth -> user : Toestemmingscherm user -> auth : Toestaan auth -> auth : Genereer JWT auth -> jbake : Geeft JWT + Refresh Token jbake -> jbake : Bewaar tokens (sessionStorage) == Accès aux Ressources == group Opération Simple (CRUD) user -> jbake : Maak een artikel jbake -> db : POST met JWT note right: Supabase Beveiliging op rijniveau\n controleert het JWT automatisch db -> jbake : Artikel aangemaakt end group Opération Complexe (Métier) user -> jbake : Genereer een rapport jbake -> spring : POST /api/reports\nmet JWT spring -> spring : Valideer JWT Supabase spring -> spring : Uittreksel eisen (user_id, rollen) spring -> db : complexe queries spring -> jbake : Gegenereerd rapport end note over auth, spring De JWT is universeel Geldig door Supabase EN Spring Boot Geen double authenticatie end note @enduml
Belangrijk punt: énkel authenticatieproces, énkel JWT, bruikbaar overal.
Flux 2 : Orchestration van een complex bedrijfsproces
@startuml skinparam backgroundColor #FEFEFE autonumber actor "Klant" as user participant "JBake" as jbake participant "Spring Boot" as spring participant "Supabase DB" as supadb participant "Stripe API" as stripe participant "Voorraadservice" as inventory participant "E‑maildienst" as email database "PostgreSQL" as db user -> jbake : Plaats een bestelling jbake -> spring : POST /api/orders/create == Orchestration Spring Boot == spring -> db : BEGIN TRANSACTION par Vérifications Parallèles spring -> inventory : Controleer voorraad inventory -> spring : Voorraad OK else spring -> db : Controleer klantprofiel db -> spring : Geverifieerde klant end spring -> stripe : Betaalintentie maken stripe -> spring : Intentie aangemaakt (ID: pi_xxx) spring -> db : Maak Order (status: PENDING) db -> spring : Bestelling aangemaakt spring -> stripe : Betaling bevestigen stripe -> spring : Betaling bevestigd spring -> db : Bestelling bijwerken (status: PAID) spring -> inventory : Voorraad verminderen spring -> db : COMMIT TRANSACTION par Notifications Asynchrones spring -> email : E‑mailbevestiging else spring -> supadb : Notificatie Invoegen note right: Notificatie realtime\nvia Supabase Realtime end spring -> jbake : Bestelling bevestigd jbake -> user : Toon bevestiging note over spring **Verantwoordelijkheden Spring Boot :** • Transactie ACID • Multiservice-orchestratie • Automatische rollback bij fout • Beheer van randgevallen end note @enduml
Wat Spring Boot brengtBetrouwbare orchestration van complexe processen die meerdere systemen betreffen met transactiegarantie
Flux 3 : Geplande taken en synchronisaties
@startuml skinparam backgroundColor #FEFEFE participant "Scheduler\n(Spring Boot)" as scheduler participant "Rapport service" as report participant "PostgreSQL" as db participant "extern API" as api participant "E-mail service" as email participant "Supabase Opslag" as storage == Job Quotidien : 2u00 activate scheduler scheduler -> report : Rapportgeneratie starten activate report report -> db : Haal de gegevens\nop van de laatste 24 uur db -> report : Dataset report -> report : Berekeningen & Aggregaties report -> report : Generatie PDF report -> storage : Uploaden PDF storage -> report : URL publique report -> email : Stuur naar de admins\n met link PDF deactivate report == Job Hebdomadaire : Zondag 3h00 == scheduler -> report : Externe synchronisatie activate report report -> api : Fetch externe gegevens api -> report : Nieuwe gegevens report -> db : Tabellen bijwerken report -> db : Opschonen verouderde gegevens deactivate report == Job Mensuel : 1ste van de maand == scheduler -> report : Facturatie activate report report -> db : Lijst actieve klanten report -> report : Berekening bedragen report -> api : Factuurgeneratie (Stripe) report -> email : Facturen verzenden deactivate report deactivate scheduler note right of scheduler Onmogelijk met alleen Supabase Edge-functies niet geschikt voor lange en terugkerende taken end note @enduml
Wat Spring Boot brengtBetrouwbare geplande taken met staatbeheer, automatische herprobe, en gegarandeerde uitvoering.
Beslissingsmatrix
Wanneer Gebruiken Supabase ?
@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
Wanneer Spring Boot gebruiken?
@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
Voorbeelden van architectuur per projecttype
Blog / Portfolio
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
package "Persoonlijke Blog - 95% Supabase" {
component "JBake" as jbake #SkyBlue
package "Supabase (Gratis)" #LightGreen {
[Auth: OAuth2 Google]
[Articles (CRUD)]
[Commentaires]
[Images (Storage)]
[Notifications Realtime]
}
package "Spring Boot (Optioneel)" #LightCoral {
[Newsletter Mensuelle]
note bottom: Alleen geplande taak
}
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 (Optioneel)"
**Spring Boot niet verplicht**
Nieuwsbrief kan worden beheerd
door een externe dienst (Mailchimp)
end note
@enduml
vonnis: 100% Supabase is ruimschoots voldoende.
SaaS‑toepassing
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
package "SaaS-applicatie - Hybride Architectuur" {
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 "Externe Diensten" {
[Stripe API]
[SendGrid Email]
}
database "Gedeelde 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"
**Nodig voor:**
• Abonnementbeheer
• Recurrente facturatie
• Dynamische quota's
• Complexe analytics
• Betrouwbare webhooks
end note
@enduml
vonnisHybride architectuur vereist. Supabase voor het belangrijkste deel, Spring Boot voor het kritieke deel (betalingen, facturatie).
E-commerce
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
package "E-commerce - 70% Spring Boot" {
component "Storefront (JBake/React)" as frontend #SkyBlue
package "Supabase" #LightGreen {
[Auth Clients]
[Catalogue Produits\n(lecture seule)]
[Images Produits]
}
package "Spring Boot (Business Logica)" #Coral {
[Gestion Commandes]
[Paiements Stripe]
[Gestion Stock]
[Calcul Frais Port]
[Génération Factures]
[Synchronisation ERP]
[Emails Transactionnels]
}
cloud "Integraties" {
[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 (Business Logica)"
**Spring Boot onmisbaar:**
• Kritieke transacties
• Complexe orchestratie
• Meerdere integraties
• Wettelijke naleving
• Synchronisatiejobs
end note
@enduml
Uitspraak: Spring Boot onmisbaar. Supabase alleen voor auth en catalogus.
Strategie voor progressieve migratie
@startuml skinparam backgroundColor #FEFEFE |Semaine 1-2| start :Nieuw project Supabase; :Configureren Auth (Google, GitHub); :Definieer het initiële schema PostgreSQL; :Implementeer de basis van CRUD op JBake; :Uitrollen MVP op GitHub pagina's; note right **Leverbaar :** Functionele applicatie **Kosten :** 0€ **Tijd :** 1-2 weken end note |Semaine 3-4| :Werkelijk gebruik observeren; :Identificatiebeperkingen; |Décision| if (Logique complexe\némerge ?) then (non) |Supabase| :Doorgaan met alleen Supabase; :Voeg Edge Functions toe indien nodig; stop else (oui) |Spring Boot| :Spring Boot-project maken; :Validatie configureren JWT Supabase; :Complexe logica migreren naar Spring Boot; note right Selectieve migratie Alleen wat complex is end note endif |Semaines suivantes| :Implementeer Spring Boot (Cloud Run, EC2); :Verbind met PostgreSQL Supabase; :Eerste geplande taken implementeren; :Integreer APIs derden; stop note right Definitieve hybride architectuur Supabase + Spring Boot in perfecte harmonie end note @enduml
Kosten en operationele overwegingen
Kostenstructuur
@startuml
skinparam backgroundColor #FEFEFE
package "Geschatte maandelijkse kosten" {
rectangle "Fase MVP\n(0-1000 users)" #LightGreen {
[JBake (GitHub Pages): 0€]
[Supabase: 0€]
[Spring Boot: N/A]
note bottom: **Totaal: 0€/mois**
}
rectangle "Fase Groei\n(1k-10k gebruikers)" #LightYellow {
[JBake (GitHub Pages): 0€]
[Supabase: 0€]
[Spring Boot (Cloud Run): 20-50€]
[PostgreSQL (si séparé): 0-30€]
note bottom: Totaal: 20-80€/mois
}
rectangle "Fase Scale\n(10k-100k gebruikers)" #LightCoral {
[JBake (Netlify Pro): 19€]
[Supabase Pro: 25€]
[Spring Boot (instances multiples): 100-300€]
[Redis Cache: 20-50€]
[Monitoring: 20€]
note bottom: Totaal: 184-414€/mois
}
}
note right of "Fase Scale\n(10k-100k gebruikers)"
Op dit moment, de inkomsten
rechtvaardigen de kosten ruimschoots
end note
@enduml
Operationele verantwoordelijkheden
@startuml
skinparam backgroundColor #FEFEFE
package "Wie beheert wat?" {
rectangle "Beheerd door Supabase (0 inspanning)" #LightGreen {
[Authentification]
[Base de données]
[Backups automatiques]
[Scaling automatique]
[Monitoring DB]
[Sécurité DB]
}
rectangle "Beheerd door GitHub (0 inspanning)" #SkyBlue {
[Hébergement site statique]
[HTTPS/SSL]
[CDN global]
[Déploiement automatique]
}
rectangle "Te beheren (Spring Boot)" #LightCoral {
[Déploiement application]
[Monitoring APM]
[Logs centralisés]
[Scaling horizontal]
[Mises à jour sécurité]
}
}
note bottom of "Te beheren (Spring Boot)"
**Minimaliseerbaar met:**
• Cloud Run (serverless)
• Kubernetes (indien nodig)
• Managed services (RDS, etc.)
end note
@enduml
Conclusie: Het perfecte evenwicht
De hybride architectuur Supabase + Spring Boot is geen compromis, het is eensynergie.
De principes om te onthouden
@startmindmap skinparam backgroundColor #FEFEFE * Architectuur\nHybride ** Begin simpel ***_ MVP met Supabase ***_ 0€ van initiële kosten ***_ Snelle validatie ** Slim Ontwikkelen ***_ Voeg Spring Boot\nindien nodig ***_progressieve migratie ***_ Geen volledige herziening ** Krachten benutten ***_ Supabase: Eenvoud ***_ Spring Boot: Kracht ***_ PostgreSQL: Unieke bron ** Complexiteit minimaliseren ***_ Geen synchronisatie ***_ Geen duplicatie ***_ Duidelijke architectuur ** Kosten optimaliseren ***_Gratis bij de start ***_ Schaalbaar progressief ***_ ROI duidelijk @endmindmap
Wanneer kiezen voor deze architectuur ?
✅ Deze architectuur is ideaal als :
-
Je wilt snel starten (MVP in dagen, niet in maanden)
-
U anticipeert een groei van de bedrijfscomplexiteit
-
U wilt de initiële kosten minimaliseren
-
Je houdt van PostgreSQL en wilt een unieke bron van waarheid
-
U waardeert Kotlin en de Coroutines voor de zakelijke code
-
U wilt het totale vendor lock-in vermijden
❌ Deze architectuur is NIET geschikt als:
-
Uw project is eenvoudig en blijft dat (persoonlijk blog → 100% Supabase volstaat)
-
Je hebt al een gevestigde backend-stack die je beheerst
-
Je prefereert een traditioneel monoliet
-
U heeft .NET, Python of een andere backendtaal nodig
eindoverzicht
@startuml
skinparam backgroundColor #FEFEFE
package "Volledige Hybride Architectuur" {
actor "Gebruikers" as users
rectangle "Frontend (Statisch)" #SkyBlue {
[JBake / GitHub Pages]
note right: Gratis, globaal CDN
}
rectangle "Eenvoudige Backend (Supabase)" #LightGreen {
[Auth OAuth2]
[CRUD APIs]
[Storage]
[Realtime]
note right
Gratis tot 50k users
Nul serverconfiguratie
end note
}
rectangle "Business Backend (Spring Boot)" #Coral {
[Orchestration]
[Jobs Planifiés]
[Intégrations]
[Transactions]
note right
Alleen ingeschakeld
indien nodig
end note
}
database "PostgreSQL\nUnique Source of Truth" 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
**Eén enkele basis, twee consumenten**
• Supabase voor het eenvoudige
• Spring Boot voor het complexe
• Geen synchronisatie vereist
end note
@enduml
Het beste van twee werelden
Deze architectuur geeft u:
🚀 De snelheid van Supabase
-
Opstart in uren, niet in weken
-
OAuth2-authenticatie in een paar klikken
-
Automatisch gegenereerde REST-API’s
-
Zero-configuratie
💪 De kracht van Spring Boot
-
Kotlin en coroutines voor elegante asynchrone code
-
Orchestration van complexe bedrijfsprocessen
-
Betrouwbare geplande taken
-
ACID-transactiegaranties
-
Volledig Spring-ecosysteem
💰 De progressieve economie
-
0€ om te starten en te valideren
-
Kosten die de groei volgen
-
Geen vroegtijdig over-engineering
🎯 Architecturale flexibiliteit
-
Progressieve migratie zonder herontwerp
-
Toevoegen van Spring Boot alleen indien nodig
-
Geen totale vendor lock-in
-
Evolutieve architectuur
Om verder te gaan
Technische middelen
Supabase-documentatie :
Documentatie Spring Boot :
Aanvullende artikelen :
-
Beveiliging van API’s met JWT
-
Optimalisatie van PostgreSQL-prestaties
-
progressieve migratiepatronen
-
Foutafhandeling in gedistribueerde architectuur
Werkelijke gebruiksscenario’s
Deze hybride architectuur wordt succesvol gebruikt in :
-
SaaS B2B: Supabase-authenticatie, Spring Boot-facturering
-
marktplaatsen: Catalogus Supabase, transacties Spring Boot
-
Contentplatformen: Artikelen Supabase, analyse Spring Boot
-
interne gereedschappen: CRUD Supabase, werkstromen Spring Boot
Opstart checklist
Phase 1 - Fundamenten (Week 1)
-
Maak Supabase-account aan - [ ] Configureer PostgreSQL-project - [ ] Activeer Auth (Google, GitHub) - [ ] Definieer initieel schema - [ ] Configureren Row Level Security - [ ] API’s testen sinds JBake
Fase 2 - MVP (Week 2-3)
-
Hoofdpagina’s implementeren - [ ] OAuth2-authenticatie integreren - [ ] CRUD-formulieren maken - [ ] Configureren Storage voor bestanden - [ ] Deployen op GitHub Pages - [ ] Testen onder reële omstandigheden
Fase 3 - Evolutie (Volgens behoeften)
-
Identificeer behoeften aan complexe logica - [ ] Een Spring Boot-project aanmaken indien nodig - [ ] Configureren JWT-validatie Supabase - [ ] Verbinding maken met PostgreSQL Supabase - [ ] Migreren complexe functionaliteiten - [ ] Geplande taken implementeren - [ ] Spring Boot implementeren (Cloud Run, enz.)
Anti-Patronen om te vermijden
❌ Niet doen :
-
Gegevens kopiëren tussen Supabase en Spring Boot
-
Creëer twee afzonderlijke PostgreSQL-databases
-
Codeer de authenticatie zelf
-
Gebruik Spring Boot voor eenvoudig CRUD
-
over-architectureren vanaf het begin
-
Negeer Row Level Security van Supabase
✅ Liever doen :
-
Deel één PostgreSQL-database
-
Laten Supabase de authenticatie beheren
-
Gebruik Spring Boot alleen voor de complexiteit
-
Begin eenvoudig, evolueer geleidelijk
-
De krachten van elke technologie benutten
-
Beveiligen met RLS op databaseniveau
Ontwikkelingsperspectieven
Toevoeging van nieuwe capaciteiten
@startuml
skinparam backgroundColor #FEFEFE
rectangle "Huidige Architectuur" #SkyBlue {
[JBake]
[Supabase]
[Spring Boot]
}
rectangle "Mogelijke Evoluties" #LightYellow {
package "Performance" {
[Redis Cache]
[CDN pour Assets]
[PostgreSQL Replicas]
}
package "Monitoring" {
[Grafana]
[Prometheus]
[Sentry]
}
package "CI/CD" {
[GitHub Actions]
[Tests Automatisés]
[Déploiement Continu]
}
package "Functionaliteiten" {
[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
**Uitbreidbare architectuur**
Elke toevoeging is onafhankelijk
Geen globale herziening nodig
end note
@enduml
horizontaal schalen
Wanneer je applicatie groeit, schaalt de hybride architectuur vanzelf :
Supabase :
-
schaalt automatisch tot miljoenen bewerkingen
-
Read replicas voor leesprestaties
-
punt-in-tijd herstel voor veiligheid
Spring Boot:
-
Meerdere instanties achter load balancer
-
Stateless design vergemakkelijkt het horizontaal scaling
-
Kubernetes voor orchestratie indien nodig
PostgreSQL :
-
Partitioning voor grote tabellen
-
verbindingenpool (PgBouncer)
-
Sharding, indien werkelijk nodig (zeldzaam)
Architectonische getuigenissen
Startup SaaS (50k gebruikers)
_ We zijn begonnen met 100% Supabase. Bij 5k gebruikers hebben we Spring Boot toegevoegd, alleen voor Stripe-facturatie en maandelijkse rapporten. Een jaar later gaat nog steeds 80% van onze operaties via Supabase. Spring Boot beheert alleen het kritieke deel. Deze scheiding heeft ons in staat gesteld om te schalen zonder herontwerp. _
E‑learningplatform (10k gebruikers)
_ De OAuth2-authenticatie van Supabase heeft ons 3 weken ontwikkelingstijd bespaard. De auto-gegenereerde APIs beheren ons volledige cursuscatalogus. Spring Boot wordt alleen gebruikt voor PDF-certificaten en voortgangs-e-mails. Eenvoudige, onderhoudbare, schaalbare architectuur. _
Marketplace B2B (3k gebruikers)
__ Spring Boot beheert transacties tussen kopers en verkopers (kritiek). Supabase beheert alles andere: profielen, realtime berichten, documenten. Het feit dat ze dezelfde PostgreSQL-database delen, bespaart ons complexe synchronisatie. De beste architecturale keuze die we hebben gemaakt. </think>
Synthese : Een modern architecturaal paradigma
De hybride architectuur van Supabase + Spring Boot vertegenwoordigt een nieuw paradigma:de architectonische specialisatie.
@startuml
skinparam backgroundColor #FEFEFE
rectangle "Oud Paradigma" #LightCoral {
card "Alles in de Backend" {
[Auth]
[CRUD]
[Logique Métier]
[Jobs]
[Storage]
[Realtime]
}
note bottom
Maximale complexiteit
vanaf dag 1
end note
}
rectangle "Nieuw Paradigma" #LightGreen {
card "Supabase\n(Gemak)" {
[Auth]
[CRUD Simple]
[Storage]
[Realtime]
}
card "Spring Boot\n(Differentiatie)" {
[Logique Métier]
[Jobs]
[Intégrations]
}
note bottom
Progressieve complexiteit
alleen toegevoegd indien nodig
end note
}
[Ancien Paradigme] -right-> [Nouveau Paradigme] : Évolution
@enduml
Het fundamentele principe:Bouw niet iets wat er al bestaat als een dienst. Concentreer je op wat jouw toepassing onderscheidt.
De 80/20-regel
In de meeste toepassingen :
-
80% van de operatieszijn standaard CRUD → Supabase
-
20% van de operatiesvereisen de zakelijke logica → Spring Boot
Deze natuurlijke regel rechtvaardigt de hybride architectuur.
@startuml
skinparam backgroundColor #FEFEFE
package "Distributie van Operaties" {
rectangle "80% - Standaard Operaties" #LightGreen {
[Lecture de données]
[Création d'entités]
[Mise à jour simple]
[Suppression]
[Upload fichiers]
[Authentification]
note bottom: **Beheerd door Supabase**
}
rectangle "20% - Business Logica" #Coral {
[Calculs complexes]
[Workflows multi-étapes]
[Transactions critiques]
[Intégrations tierces]
[Jobs planifiés]
note bottom: **Beheerd door Spring Boot**
}
}
note right
**Optimale focus :**
Uw ontwikkeltijd
geconcentreerd op de 20% die
uw product onderscheidt
end note
@enduml
Eindconclusie
De hybride architectuur is geen technisch compromis, het is eenstrategische beslissing.
Het stelt u in staat om :
-
✅ Start snel met een functioneel MVP
-
✅ Valideer uw markt zonder zware investering
-
✅ Stapsgewijs evolueren wanneer de complexiteit dat vereist
-
✅ Beheers uw kosten bij elke stap
-
✅ Haal het beste uit elke technologie
-
✅ Vermijd voortijdige over-engineering
-
✅ Flexibiliteit behouden voor de toekomst
Ze vertegenwoordigt:
-
🎯Pragmatisme: Elke technologie waarin ze uitblinkt
-
🚀Snelheid: minimale time-to-market
-
💰economie: Kosten afgestemd op de waarde
-
🔮schaalbaarheid: Architectuur die met je meegroeit
-
🛡️Robuustheid: Bewezen en betrouwbare diensten
Uw volgende stap
Als deze architectuur spreekt je aan, hier is waar je moet beginnen :
-
Maak een Supabase-account aan(gratis)
-
Definieer uw minimale gegevensschema
-
Configureer de OAuth2-authenticatie
-
Maak uw eerste JBake-pagina die de API verbruikt
-
Deploy op GitHub Pages
U zult een functioneel MVP hebben inenkele dagen.
Spring Boot komt vanzelf wanneer je het nodig hebt. Niet eerder.
Hybride architectuur is de kunst om precies te bouwen wat nodig is, wanneer het nodig is.
Goede ontwikkeling ! 🚀
Deel dit artikel als je denkt dat het andere ontwikkelaars kan helpen de goede architecturale keuzes te maken.