Layered Architecture vs Monolith
En çok karıştırılan iki kavram:
- Monolith → Deployment modeli (nasıl dağıtılıyor?)
- Layered Architecture → Kod organizasyonu (nasıl yazılıyor?)
Birlikte kullanılabilirler ama aynı şey değildirler.
1. Layered Architecture
Layered Architecture, kodu teknik katmanlara ayırır.
Controller (API / UI)
↓
Service (Business Logic)
↓
Repository (Data Access)
↓
Database
Bu bir mantıksal ayrımdır, deployment ile ilgisi yoktur.
Katmanlar
1. Presentation Layer
- Controller
- Routes
- API endpoints
- UI ile konuşur
2. Application Layer
- İş akışını koordine eder
- Servisleri organize eder
- Transaction başlatır
3. Business Logic Layer (Domain)
- Hesaplamalar
- Kurallar
- Validasyonlar
- Sistem davranışı
4. Data Access Layer
- SQL sorguları
- ORM işlemleri
- DB bağlantısı
Layered Architecture Kuralları
✔ Üst katman alt katmanı çağırabilir ❌ Alt katman üst katmanı çağıramaz
Örnek:
- Controller → Service çağırır
- Service → Repository çağırır
- Repository → DB çağırır
- Repository → Controller çağırmaz
Layered Mimari Sorunu
Aşırı bağımlılık oluşabilir.
Örneğin:
class OrderService {
constructor(
private userRepo: UserRepository,
private productRepo: ProductRepository,
private paymentService: PaymentService
) {}
}
Service her şeyi biliyorsa:
- God service oluşur
- Test zorlaşır
- Bağımlılık artar
Layered teknik ayrım yapar ama domain izolasyonu garanti etmez.
2. Monolith Nedir?
Monolith bir deployment modelidir.
- Tek process
- Tek deploy
- Tek kod tabanı
- Genelde tek DB
Uygulama tek .jar, .exe, .war ya da tek Node.js app olarak çalışır.
Monolith Özellikleri
✔ Geliştirmesi kolay ✔ Test etmesi kolay ✔ Deployment basit ✔ Debug etmek kolay
- Tek hata tüm sistemi etkileyebilir
- Tek özelliği ölçeklemek için tüm sistemi scale etmek gerekir
Modular Monolith
Monolith’in gelişmiş hâlidir.
Burada teknik katman değil, domain bazlı modüller vardır.
/modules
/order
order.controller.ts
order.service.ts
order.repository.ts
order.entity.ts
/user
/payment
Her modül:
- Kendi controller’ına sahip
- Kendi service’ine sahip
- Kendi repository’sine sahip
- İçini dışarı açmaz
- Public API üzerinden iletişim kurar
Layered vs Modular Monolith
| Özellik | Layered | Modular Monolith |
|---|---|---|
| Ayrım | Teknik | Domain |
| Bağımlılık | Katman bazlı | Modül bazlı |
| Karmaşıklık kontrolü | Orta | Yüksek |
| Microservice’e geçiş | Zor | Kolay |
Microservice’e Geçmeden Önce
Direkt microservice’e geçmek risklidir.
Önce:
✔ Modular Monolith ✔ Domain sınırları net ✔ Public interface’ler belirli ✔ Bağımlılıklar kontrol altında
Sonra modül koparıp microservice yaparsın.
Monolith vs Layered
| Özellik | Monolith | Layered |
|---|---|---|
| Deployment | Tek uygulama | Deployment ile ilgisi yok |
| Ayrım | Fiziksel | Mantıksal |
| Ölçeklenebilirlik | Tüm sistem | Katman ayrı ölçeklenemez |
| Hata Etkisi | Tüm sistem | Katman izole edilebilir |
Büyük Resim
Monolith = Nasıl deploy ettiğin Layered = Nasıl organize ettiğin Modular Monolith = Domain bazlı organize edilmiş Monolith
Hangi Yapıyı Ne Zaman Kullanmalı?
Küçük Proje
→ Basit Monolith + Layered yeterli
Orta Ölçekli Proje
→ Modular Monolith
Büyük / Yüksek Trafik
→ Modular Monolith → Microservice evrimi
Mimari Evrim
Layered Monolith
↓
Modular Monolith
↓
Microservices
Bu doğal bir evrimdir.