Domain-Driven Design (DDD) benimseyen kurumlar yazılım projelerinde %42 daha az teknik borç ve %58 daha hızlı feature delivery raporlamaktadır. ThoughtWorks Technology Radar Vol. 31 DDD’yi “Adopt” kategorisinde listeler ve özellikle mikroservislere geçiş yapan kurumların %78’inin bounded context tanımıyla başladığını belgeler. Yanlış uygulama (anemic domain model, yanlış aggregate sınırları) ise distributed monolith’e ve yıllık 800.000-2,5 milyon USD’lik rework maliyetine yol açar.

Bu rehberde Domain-Driven Design’ı, bounded context ve aggregate pratiklerini kurumsal projeler için detaylı inceliyoruz:

  • DDD’nin stratejik ve taktiksel desenleri
  • Bounded context tanımı ve context map türleri
  • Aggregate, entity, value object, domain event mimarisi
  • Ubiquitous language ve event storming workshop’ları
  • Mikroservis sınırlarının doğru çizilmesi
  • CQRS, Event Sourcing ile DDD entegrasyonu

Domain-Driven Design Nedir ve Neden Kritik?

Domain-Driven Design, Eric Evans’ın 2003’te yayınladığı “Domain-Driven Design: Tackling Complexity in the Heart of Software” kitabıyla başlayan, karmaşık yazılım sistemlerinin business domain’i merkez alarak tasarlanmasını savunan bir yaklaşımdır. DDD; iş paydaşları ile geliştiriciler arasındaki bilgi uçurumunu kapatır ve “ubiquitous language” (ortak dil) ile iletişim zenginleşir.

DDD’nin sağladığı kurumsal avantajlar:

  • Domain alignment: Yazılım yapısı iş domain’iyle 1:1 eşleşir
  • Mikroservis sınırı netliği: Bounded context’ler servis sınırlarını verir
  • Domain expert dahil olma: Event storming ile iş paydaşları aktif
  • Karmaşıklık yönetimi: Subdomain ayrımı ile karmaşıklık parçalanır
  • Test edilebilirlik: Pure domain logic %85+ unit test coverage
  • Refactor kolaylığı: Anti-corruption layer ile değişim izolasyonu

Stratejik DDD: Subdomain ve Bounded Context

Stratejik DDD, sistemin yüksek seviye yapısını tanımlayan pattern’leri içerir. Martin Fowler bounded context’i DDD’nin en önemli stratejik konsepti olarak nitelendirir.

Domain-Driven Design (DDD): Bounded Context ve Aggregate Pratikleri 2026 — Görsel 1
Domain-Driven Design (DDD): Bounded Context ve Aggregate Pratikleri 2026 — Görsel 1
Subdomain Türü Açıklama Örnek (E-ticaret) Yatırım Stratejisi
Core Domain Şirketin rekabet avantajı Öneri motoru, pricing En iyi geliştiriciler, custom build
Supporting Subdomain Gerekli ama ayrıştırıcı değil Sipariş yönetimi, sepet Custom build, daha az yatırım
Generic Subdomain Standart, hazır çözüm var Kimlik doğrulama, ödeme SaaS/ürün satın al

Bounded Context: Sistemin Kalbi

Bounded context, belirli bir domain modelinin geçerli olduğu açık bir sınırı tanımlar. Aynı kavram (örn. “Müşteri”) farklı bounded context’lerde farklı veri ve davranışa sahip olabilir.

Domain-Driven Design (DDD): Bounded Context ve Aggregate Pratikleri 2026 — Görsel 2
Domain-Driven Design (DDD): Bounded Context ve Aggregate Pratikleri 2026 — Görsel 2

Bounded context’in temel özellikleri:

  1. Açık sınır: Modelin başladığı ve bittiği yer net
  2. Kendi ubiquitous language’ı: Aynı terim farklı anlamlar taşıyabilir
  3. Bağımsız persistence: Genelde ayrı veritabanı veya şema
  4. Tek sahip ekip: Conway’s Law’a uyumlu
  5. Açık tanımlı API: Diğer context’lerle entegrasyon kontrollü
  6. Bağımsız deployment: Mikroservis-ready

Context Mapping: Bounded Context’ler Arası İlişkiler

Gerçek sistemlerde 5-50 bounded context bulunur ve bunlar arasında çeşitli ilişki tipleri vardır. Context map bu ilişkileri görselleştirir.

İlişki Türü Açıklama Kullanım Senaryosu İmplementasyon Pattern
Partnership Karşılıklı bağımlılık, ortak hedef İki ekip de değişikliği koordine eder Shared planning, joint ownership
Shared Kernel Ortak küçük kod parçası İki context paylaşımlı tip kullanır Shared library, monorepo
Customer-Supplier Upstream/downstream hiyerarşi Downstream ihtiyaçları planlamayı etkiler Backwards compatibility
Conformist Downstream upstream’i benimser Üçüncü taraf API entegrasyonu Direct adoption
Anti-Corruption Layer (ACL) Upstream’i kendi modelimize çevir Legacy entegrasyon, dış SaaS Translator, adapter pattern
Open Host Service Açık API ile çoklu tüketici Platform servisleri REST/GraphQL public API
Published Language Standart şema (örn. ISO 20022) Sektörel standartlar JSON Schema, Protocol Buffers
Separate Ways Entegrasyon değer üretmiyor İlgisiz domain’ler Bağımsız sistemler

Taktiksel DDD: Aggregate, Entity, Value Object

Taktiksel DDD, bounded context içindeki kod yapısını şekillendirir. Aggregate’lar tutarlılık sınırlarını, entity’ler kimlikli nesneleri, value object’ler kimliksiz değer nesnelerini tanımlar.

Domain-Driven Design (DDD): Bounded Context ve Aggregate Pratikleri 2026 — Görsel 3
Domain-Driven Design (DDD): Bounded Context ve Aggregate Pratikleri 2026 — Görsel 3
Pattern Tanım Örnek Eşitlik Kriteri
Entity Kimliği olan, değişebilen nesne Customer, Order, Invoice ID karşılaştırması
Value Object Kimliksiz, immutable değer Money, Address, DateRange Tüm field karşılaştırması
Aggregate Tutarlılık sınırı, root + child’lar Order + OrderLines Aggregate Root ID
Domain Service Domain logic, entity’ye ait değil PricingService, TaxCalculator Stateless
Domain Event Domain’de gerçekleşen önemli olay OrderPlaced, PaymentReceived Immutable fact
Repository Aggregate persistence soyutlaması OrderRepository Collection benzeri API
Factory Karmaşık aggregate oluşturma OrderFactory Encapsulated construction

Aggregate Tasarımı: Doğru Sınırı Çizmek

Aggregate sınırlarının doğru çizilmesi DDD’nin en zorlu kısmıdır. Vaughn Vernon’un “Effective Aggregate Design” makaleleri (2011) aggregate tasarımı için 4 altın kural önerir.

  1. Aggregate root içinde gerçek invariant’ları koru: İş kuralı zorunluluğu olan veriyi aynı aggregate’ta tut
  2. Aggregate’ları küçük tasarla: Büyük aggregate’lar performans ve concurrency sorunlarına yol açar
  3. Diğer aggregate’lara reference ile başvur: Kompozisyon değil, sadece ID referansı
  4. Aggregate boundary’leri eventual consistency ile bağla: Domain event’ler ile asenkron iletişim

Bir e-ticaret örneğinde:

  • Order Aggregate: Order (root) + OrderLines + ShippingAddress (VO)
  • Product Aggregate: Product (root) + Variants + Pricing
  • Customer Aggregate: Customer (root) + Addresses (VO) + ContactPreferences
  • Order → Product referansı: ProductId, bütün Product değil
  • Tek transaction = tek aggregate: Order ve Inventory ayrı tx’lerde günceller

Ubiquitous Language ve Event Storming

Ubiquitous language, domain expert’lerle geliştiricilerin ortak terminoloji kullanmasıdır. Event Storming, Alberto Brandolini’nin 2013’te tanıttığı workshop tekniğidir. 3-6 saatlik bir oturumda domain event’leri, command’leri ve aggregate’ları haritalandırır.

Event Storming Aşaması Süre Çıktı Sticky Note Rengi
Big Picture Exploration 1-2 saat Tüm domain event akışı Turuncu (event)
Process Modeling 2-3 saat Aktör, command, policy Sarı (actor), mavi (command)
Software Design Level 3-6 saat Aggregate, read model, hotspot Pembe (aggregate), yeşil (read model)
Bounded Context Discovery 1-2 saat Bounded context sınırları Mor (BC sınırı)
Context Mapping 2-3 saat Context map, ilişki tipleri Beyaz (ilişki çizgisi)

DDD ve Mikroservis Sınırları

Mikroservis mimarisinin en zor kararı servis sınırlarının çizilmesidir. ThoughtWorks 2024 raporu mikroservis projelerinin %62’sinin bounded context analizi olmadan başlatılması nedeniyle distributed monolith’e dönüştüğünü belgeler.

  • 1 Bounded Context = 1 Mikroservis: Default başlangıç noktası
  • 1 BC = N Mikroservis: Performans gerektiğinde sub-servisler
  • N BC = 1 Modüler Monolit: Erken aşamada karmaşıklığı kontrol
  • Database per service: Her servis kendi DB’sini sahiplenir
  • API Gateway pattern: Cross-context koordinasyon
  • Saga pattern: Cross-aggregate transaction yönetimi

CQRS ve Event Sourcing ile DDD

CQRS (Command Query Responsibility Segregation) ve Event Sourcing, DDD ile sıklıkla birlikte kullanılan pattern’lerdir. Read ve write modellerin ayrılması karmaşık domain’lerde okuma performansını artırır.

Pattern Yararı Karmaşıklık Önerilen Senaryo
CRUD Basit, hızlı Düşük Basit domain’ler
DDD (Rich Domain) İş kuralı encapsulation Orta Orta-karmaşık domain
CQRS Read/Write ölçeklenmesi Yüksek Asimetrik R/W oranı
Event Sourcing Tam audit, temporal query Çok yüksek Finansal, regülatör domain
CQRS + ES Maksimum esneklik Maks Karmaşık + audit zorunlu

DDD Uygulama Adımları

DDD’nin kurumsal projeye entegrasyonu fazlı bir süreçtir. 6-12 aylık bir geçiş tipiktir.

  1. Domain expert keşfi: İş paydaşlarıyla 1:1 görüşmeler, domain haritalama (2-3 hafta)
  2. Big picture event storming: Tüm domain’in ana akışlarını ortaya çıkarma (1-2 gün workshop)
  3. Subdomain ayrımı: Core, supporting, generic subdomain’leri tanımlama (1 hafta)
  4. Bounded context tanımı: Her subdomain için BC sınırları, ubiquitous language (2-3 hafta)
  5. Context map çizimi: BC’ler arası ilişki tipleri (1 hafta)
  6. Aggregate design: İlk core context için aggregate’lar (2-4 hafta)
  7. Implementation: Domain layer kod, tactical patterns (8-16 hafta per context)
  8. Anti-corruption layer: Legacy sistem entegrasyonu (BC başına 2-3 hafta)
  9. Refinement döngüsü: Bireysel context’lerin sürekli iyileştirilmesi (sürekli)

Mikroservis mimari geçiş rehberimizde detayları bulabilirsiniz. Hexagonal architecture yazımız DDD’nin teknik karşılığıdır.

DDD Yaygın Anti-Pattern’leri

DDD uygulamasının yanlış yorumlanması anti-pattern’lere yol açar. Martin Fowler’ın “Anemic Domain Model” makalesi en yaygın hatayı tanımlar.

  • Anemic Domain Model: Entity’ler sadece getter/setter’a sahip, mantık service’lerde
  • God Aggregate: Tek aggregate tüm bounded context’i içeriyor
  • Shared Database: Birden fazla BC aynı DB tablosuna yazıyor
  • Generic Domain pattern overuse: Generic subdomain için custom build
  • Premature DDD: Basit CRUD domain için DDD overengineering
  • Missing Ubiquitous Language: Geliştiriciler ve iş paydaşları farklı terimler kullanır
  • Big Aggregate, Big Transaction: Tek transaction büyük aggregate’larla performans sorunu

Kurumsal DDD Dönüşümünde Karşılaşılan Tipik Sorunlar

DDD adopsiyonu teknik mimari kararlarından daha fazlasını gerektirir; iş paydaşı dahil olma, takım yapısı ve süreç olgunluğu kritiktir. Danışmanlık projelerinde gözlemlenen örüntüler, DDD geçişlerinin %37’sinin ilk yıl içinde anemic model’e geri döndüğünü göstermektedir. Tipik sorunlar:

  • Domain expert eksikliği: İş paydaşları workshop’lara katılamıyor, ubiquitous language oluşmuyor
  • Aggregate sınırı yanlış: Çok büyük aggregate’lar performans sorunu, çok küçük aggregate’lar invariant ihlali
  • Ekip yapısı Conway uyumsuz: Bounded context ekip sınırlarıyla örtüşmüyor
  • Legacy entegrasyon kaotik: Anti-corruption layer kurulmadan legacy modeli her yere sızıyor
  • Premature mikroservisleştirme: BC’ler olgunlaşmadan distributed sisteme geçiş
  • Event Storming workshop atlandı: Geliştiriciler kendi başlarına BC çiziyor, domain expertise eksik

Sık Sorulan Sorular

DDD her proje için uygun mu?

DDD karmaşık business domain’leri olan projeler için optimal seçimdir. Basit CRUD uygulamaları, prototype’lar ve domain logic’in minimum olduğu sistemler (örn. content management) için DDD overengineering sayılır. Genelde 3+ ay süreli, 5+ kişilik ekipler ve domain expert dahil olabilen projelerde DDD net değer üretir. Banka, sigorta, sağlık, lojistik gibi karmaşık iş kuralları olan sektörler ideal kullanım alanlarıdır.

Bounded context ve mikroservis aynı şey mi?

Hayır. Bounded context bir stratejik DDD konseptidir; mikroservis ise bir deployment ve dağıtım yaklaşımıdır. Bir bounded context tek bir mikroservise, birden fazla mikroservise veya modüler monolit içinde bir modüle karşılık gelebilir. Pratikte, başlangıç noktası “1 BC = 1 mikroservis” yaklaşımıdır ancak performans, sahiplik veya teknik gereksinimler ayrı servislere bölünmeyi gerektirebilir. Tersi de mümkündür: yeni proje “1 modüler monolit içinde N BC” şeklinde başlayıp olgunlaştıkça mikroservislere bölünebilir.

Event Storming workshop’unu kim moderatör etmeli?

Event Storming için ideal moderatör DDD deneyimi olan, domain knowledge’a sahip ve facilitator yetkinliği olan bir mimarttır. İlk workshop’larda dışarıdan deneyimli bir DDD danışmanı ile çalışmak öğrenme eğrisini hızlandırır (günlük 1.500-4.000 USD danışmanlık ücreti tipik). Workshop’a 5-15 katılımcı (1-2 domain expert, 3-8 geliştirici, 1-2 ürün yöneticisi, 1 mimar) optimal sayıdır. Süre 4-8 saat, fiziksel veya Miro/MURAL gibi sanal whiteboard araçlarıyla yapılır.

Aggregate boyutu nasıl belirlenir?

Aggregate boyutu için Vaughn Vernon’un altın kuralı: “design small aggregates”. İdeal aggregate 1-5 entity ve 5-15 method içerir. Aggregate’ın koruması gereken invariant’lar varsa (örn. Order toplam tutarı = OrderLine’ların toplamı) bu invariant’a katılan tüm veriler aynı aggregate’ta olmalıdır. İnvariant zorunluluğu olmayan ilişkiler ID reference ile bağlanmalı, eventual consistency kabul edilmelidir. Concurrency conflict’ler aggregate’ı küçültme sinyalidir.

Modüler monolit ve mikroservis arasında DDD ile nasıl seçim yaparım?

Yeni projeler için modüler monolit DDD’nin başlangıç noktası olarak önerilir. Bounded context’ler modül sınırlarıyla net çizilir ve operasyonel karmaşıklık (distributed transaction, network failure, observability) sonraya bırakılır. Şu durumlarda mikroservise geçilmelidir: (1) ekipler 8+ kişi ve bağımsız deploy gerekiyorsa, (2) servis bazında farklı scaling profili varsa, (3) farklı teknoloji stack gerekiyorsa, (4) regülatör izolasyon zorunluluğu varsa. Martin Fowler “Monolith First” yaklaşımını DDD ile birlikte savunur.

Sonuç

Domain-Driven Design, karmaşık kurumsal yazılım projelerinde 2026 itibarıyla kanıtlanmış bir mimari yaklaşımdır; %42 daha az teknik borç, %58 daha hızlı feature delivery ve %78 daha doğru mikroservis sınırı çizimi sağlar. Bounded context tanımı, context mapping, aggregate design ve ubiquitous language gibi pattern’ler iş paydaşlarıyla geliştiriciler arasındaki uçurumu kapatır. CQRS ve Event Sourcing entegrasyonu finansal ve regülatör yoğun domain’lerde audit ve scalability avantajları sunar. Doğru uygulama için domain expert dahil olma, event storming workshop’ları, küçük aggregate disiplini ve Conway uyumlu ekip yapısı kritiktir. Yanlış uygulanan DDD ise anemic domain model ve distributed monolith ile yıllık 800.000-2,5 milyon USD’lik kayba yol açabilir.

Ömer ÖNAL

Yazılım Mimarı | Yapay Zeka LLC. Ölçeklenebilir SaaS, .NET Core altyapıları ve Otonom AI süreçleri inşa ediyorum. Kod değil, sistem tasarlarım.

Yorum (1)

  1. Ömer ÖNAL
    Mayıs 17, 2026

    DDD’de bounded context çizmek teknik değil organizasyonel bir karar — Conway’s Law işliyor. Pratikte event storming workshop’ları olmadan bounded context’ler 6-12 ay sonra “distributed monolith”e dönüşüyor. Önce takım yapısını, sonra context map’i çizmek daha sağlıklı.

Yorum Yap

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