Modular Monolith’te Data Ownership ve Database Tasarımı Nasıl Olmalı?

Data ownership, Modular Monolith mimarisinin en kritik ama en çok ihmal edilen konusudur. Çoğu sistemin “modüler” başlayıp zamanla klasik monolith’e dönüşmesinin sebebi yanlış database kullanımıdır.

Çünkü gerçek şu: boundary’ler kodda değil, datada kırılır.

Bu yazıda Modular Monolith içinde data ownership nasıl tasarlanmalı, hangi hatalar sistemi geri dönülmez hale getirir ve doğru yaklaşım nedir, bunları teknik olarak ele alacağız.

Core Problem: Shared Database Yanılgısı

Modular Monolith’te genellikle tek bir database kullanılır. Bu durum çoğu geliştiricide şu yanlış algıyı oluşturur:

“Aynı database ise istediğim tabloya erişebilirim.”

Bu düşünce, modülerliği en hızlı yok eden anti-pattern’dir.

  • Her modül her tabloya erişmeye başlar
  • Bağımlılıklar görünmez hale gelir (hidden coupling)
  • Refactor etmek neredeyse imkansız hale gelir

Sonuç: sistem teknik olarak modüler görünür, ama davranış olarak tamamen monolith’tir.

Data Ownership Nedir?

Data ownership, her modülün kendi verisinin tek sahibi olması anlamına gelir.

Yani:

  • Bir modül kendi datasını yönetir
  • Başka modüller bu dataya doğrudan erişemez
  • Erişim sadece tanımlı API/contract üzerinden yapılır

Bu kural ihlal edildiği anda boundary anlamını kaybeder.

Physical vs Logical Separation

Microservices dünyasında data ownership genellikle fiziksel olarak çözülür (ayrı database).

Modular Monolith’te ise bu ayrım genellikle logical seviyededir.

Physical Separation

  • Ayrı database
  • Güçlü izolasyon
  • Operasyonel maliyet yüksek

Logical Separation

  • Aynı database
  • Schema veya naming ile ayrım
  • Disiplin gerektirir

Modular Monolith’te doğru yaklaşım çoğu zaman logical separation’dır.

Ancak kritik nokta:

Logical separation, kuralla enforce edilmezse yoktur.

Schema Isolation: Minimum Gereksinim

En basit ve etkili tekniklerden biri schema bazlı ayrımdır.

  • order schema
  • inventory schema
  • billing schema

Bu yaklaşım:

  • Data ownership’i görünür hale getirir
  • Yanlış erişimleri azaltır
  • Boundary farkındalığını artırır

Ancak tek başına yeterli değildir.

Gerçek Problem: Direct Table Access

En tehlikeli anti-pattern:

Bir modülün başka bir modülün tablosuna doğrudan erişmesi

Örnek:

  • Order modülü → Inventory tablosuna query atıyor

Bu durum şu problemlere yol açar:

  • Hidden coupling
  • Değişikliklerin zincirleme etkisi
  • Refactor maliyetinin artması

Bu noktadan sonra modüller bağımsız değildir.

Doğru Yaklaşım: API Üzerinden Data Erişimi

Bir modül başka bir modülün datasına ihtiyaç duyuyorsa:

Doğrudan DB yerine, o modülün application service’i üzerinden erişmelidir.

Bu yaklaşım:

  • Boundary’yi korur
  • Değişiklikleri izole eder
  • Gelecekte Microservices’e geçişi kolaylaştırır

Read Model Problemi

En zor konulardan biri şudur:

“Ben sadece okumak istiyorum, yine de API mi kullanmalıyım?”

Kısa cevap: evet.

Uzun cevap:

  • Read access bile coupling oluşturur
  • Schema değişiklikleri kırılmaya sebep olur

Alternatif yaklaşım:

  • Read model oluşturmak
  • Projection kullanmak
  • Cache layer ile çözmek

Bu noktada CQRS yaklaşımı devreye girebilir.

Transaction Boundary: Gizli Tuzak

Modular Monolith’in avantajlarından biri transaction kolaylığıdır.

Ancak yanlış data erişimi bu avantajı bozar.

Örnek problem:

  • Birden fazla modül aynı transaction içinde update ediliyor

Bu durum:

  • Modül bağımsızlığını bozar
  • Gelecekte parçalamayı zorlaştırır

Doğru yaklaşım:

Her modül kendi transaction boundary’sine sahip olmalı

Kırılma Noktası: Sistem Ne Zaman Geri Dönülemez Hale Gelir?

Şu noktada sistem artık kurtarılamaz hale gelir:

  • Her modül her tabloya erişiyorsa
  • Data ownership yoksa
  • Transaction boundary’ler karışmışsa

Bu noktadan sonra:

Microservices’e geçiş bile problemi çözmez

Çünkü problem mimari değil, veri modelidir.

Insight

Code bağımlılıklarını refactor edebilirsin. Ama data bağımlılıkları kalıcıdır.

Sonuç

Modular Monolith’te başarının anahtarı kod organizasyonu değil, data disiplinidir.

Eğer data ownership doğru kurulmamışsa, sistem ne kadar modüler görünürse görünsün, gerçekte tek parça bir monolith’tir.

Ve bu noktadan sonra sistemi düzeltmek, sıfırdan yazmaktan daha zor hale gelir.

By tanju.bozok

Software Architect, Developer, and Entrepreneur

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir