Hexagonal Architecture (Ports & Adapters) benimseyen kurumlar test edilebilirlik oranını %85+ coverage seviyesine taşıyarak production’a giden defect sayısını %62 azaltmaktadır. Alistair Cockburn’ün 2005’te tanıttığı bu mimari, application logic’i framework ve infrastructure detaylarından izole ederek değişim maliyetini düşürür. ThoughtWorks Technology Radar Vol. 31 Hexagonal Architecture’ı modern mikroservis tasarımının “Adopt” pattern’i olarak listeler. Yanlış implementasyon ise anemic domain model ve sızıntılı abstraction’larla yıllık 350.000-1 milyon USD rework maliyetine yol açabilir.

Bu rehberde Hexagonal Architecture’ı kurumsal projeler için detaylı inceliyoruz:

  • Ports & Adapters tanımı ve onion/clean architecture ile ilişkisi
  • Inbound ve outbound port’lar, primary ve secondary adapter’lar
  • Domain layer izolasyonu ve dependency inversion
  • Test edilebilirlik stratejileri (unit, integration, contract)
  • DDD ile entegrasyon ve mikroservis sınırları
  • Spring Boot, .NET, Node.js implementasyon örnekleri

Hexagonal Architecture Nedir ve Neden Önemli?

Hexagonal Architecture (alternatif isimleriyle Ports & Adapters veya Onion Architecture), uygulama logic’inin merkezi olarak konumlandırıldığı ve dış dünya (UI, database, mesaj kuyruğu) ile etkileşimin sadece açık tanımlı port’lar üzerinden gerçekleştiği bir yazılım mimarisidir. Alistair Cockburn 2005’te yayınladığı orijinal makalede “altıgen” sembolizmiyle birden fazla input/output kanalının eşit önemde olduğunu vurgulamıştır.

Hexagonal Architecture (Ports & Adapters): Temiz Mimari Pratikleri 2026 — Görsel 1
Hexagonal Architecture (Ports & Adapters): Temiz Mimari Pratikleri 2026 — Görsel 1

Hexagonal Architecture’ın sağladığı kurumsal değerler:

  • Test edilebilirlik: Domain layer mock’suz %85+ unit test coverage
  • Framework bağımsızlığı: Spring, .NET veya Express değiştirme maliyeti %70 azalır
  • Database bağımsızlığı: PostgreSQL → MongoDB geçişi domain’i etkilemez
  • Long-lived codebase: 10+ yıl bakım için optimum
  • Çoklu UI: REST, GraphQL, CLI, batch job aynı core’u kullanır
  • Domain-driven uyum: DDD’nin tactical pattern’leriyle natural uyum

Hexagonal Architecture’ın Temel Bileşenleri

Mimari 4 ana katmandan oluşur. Her katman belirli bir sorumluluk üstlenir ve sıkı sınırlar tanımlıdır.

Katman Sorumluluk Bağımlılıklar
Domain (Application Core) Business logic, entity, value object Sıfır external bağımlılık
Application (Use Cases) Use case orchestration, transaction Sadece domain
Ports Interface tanımları (inbound + outbound) Application katmanı içinde
Adapters Concrete implementation (DB, HTTP, queue) Framework, library bağımlı

Inbound vs Outbound Ports

Hexagonal Architecture’da iki tip port vardır: inbound (primary, driving) ve outbound (secondary, driven).

Hexagonal Architecture (Ports & Adapters): Temiz Mimari Pratikleri 2026 — Görsel 2
Hexagonal Architecture (Ports & Adapters): Temiz Mimari Pratikleri 2026 — Görsel 2
Port Tipi Yön Örnek Implementing Adapter
Inbound Port (Use Case) Dış dünya → core CreateOrderUseCase, GetCustomerQuery REST controller, CLI, scheduler
Outbound Port (Repository) Core → dış dünya OrderRepository, EmailSender JPA, MongoDB, SendGrid client
Inbound Adapter (Primary) Driving adapter SpringMVC controller, KafkaListener Use case’i çağırır
Outbound Adapter (Secondary) Driven adapter PostgresOrderRepository Port interface’ini implement eder

Hexagonal Architecture vs Diğer Mimariler

Hexagonal Architecture, Clean Architecture (Robert C. Martin) ve Onion Architecture (Jeffrey Palermo) ile yakın akrabadır. Üçünün ortak hedefi domain’i izole etmektir.

Hexagonal Architecture (Ports & Adapters): Temiz Mimari Pratikleri 2026 — Görsel 3
Hexagonal Architecture (Ports & Adapters): Temiz Mimari Pratikleri 2026 — Görsel 3
Karakteristik Hexagonal Clean Architecture Onion Architecture Layered (N-tier)
İlk tanım yılı 2005 (Cockburn) 2012 (Martin) 2008 (Palermo) 1990’lar
Katman sayısı 3 (Domain, App, Adapter) 4 (Entity, UC, Adapter, FW) 4 (Domain, Service, App, Infra) 3-4 (UI, BL, Data)
Dependency rule İçeri akış İçeri akış İçeri akış Aşağıya akış
Dependency inversion Ports üzerinden Boundary üzerinden Interface üzerinden Yok (yaygın olarak)
Test edilebilirlik Çok yüksek Çok yüksek Yüksek Orta
Karmaşıklık Orta Yüksek Orta Düşük
Öğrenme eğrisi 3-5 hafta 5-8 hafta 3-5 hafta 1-2 hafta

Domain Layer Tasarım Pratikleri

Domain layer, hexagonal architecture’ın kalbidir. Pure business logic içermeli, framework veya database referansı barındırmamalıdır.

  1. Pure POJOs/POCOs: Annotation’lar (@Entity, @Repository) domain entity’lerde yok
  2. Rich domain model: Behavior + data birlikte, anemic değil
  3. Value object’ler: Immutable, equality value-based
  4. Domain events: Pub/sub için event tanımları
  5. Specification pattern: Karmaşık query criteria encapsulation
  6. Domain exceptions: Framework exception’lar yerine business exception
  7. No I/O: File, network, DB operasyonu kesinlikle yok
  8. No mutable global state: Static var değişkenler kullanılmaz

Application Layer ve Use Cases

Application layer use case’leri orchestrate eder ve transaction sınırlarını çizer. Domain entity’lerini ve outbound port’ları kullanır.

Application Layer Bileşeni Sorumluluk Örnek
Use Case (Command) State değiştiren operasyon CreateOrderUseCase, UpdateCustomerUseCase
Use Case (Query) State okuyan operasyon GetOrderByIdQuery, ListProductsQuery
Application Service Use case dispatcher OrderApplicationService
DTO (Data Transfer Object) Layer arası veri taşıma CreateOrderRequest, OrderResponse
Mapper DTO ↔ Domain dönüşüm OrderMapper
Event Publisher Domain event yayınlama DomainEventPublisher
Transaction Manager TX sınırı yönetimi @Transactional veya manuel

Outbound Adapter Pattern’leri

Outbound adapter’lar port interface’lerini implement eder. En yaygın 5 outbound adapter tipi:

  • Persistence Adapter: JPA/Hibernate, Spring Data, Entity Framework, Mongoose
  • HTTP Client Adapter: RestTemplate, Feign, axios, HttpClient
  • Message Producer Adapter: Kafka Producer, RabbitMQ Publisher, SNS
  • Cache Adapter: Redis, Memcached, in-memory
  • External Service Adapter: SendGrid, Stripe, Twilio API wrapper’ları
  • File Storage Adapter: S3, Azure Blob, GCS
  • Search Engine Adapter: Elasticsearch, OpenSearch, Algolia

Test Stratejileri

Hexagonal Architecture’ın en büyük kazancı test stratejilerindedir. Her katman için farklı test yaklaşımı uygulanır.

Test Tipi Hedef Layer Test Boyutu Süre Coverage Hedefi
Domain Unit Test Domain entity, value object 1-10 ms Çok hızlı %95+
Use Case Unit Test (with mocks) Application use case 10-50 ms Hızlı %85+
Port Contract Test Adapter implementations 50-500 ms Orta %80+
Adapter Integration Test Database, message broker 500ms-5s Yavaş %70+
End-to-End Test Full stack 5-30s Çok yavaş %30 (kritik akışlar)
Architecture Test (ArchUnit) Bağımlılık kuralları 1-5s Orta %100

Spring Boot ile Hexagonal Architecture Implementation

Java/Spring Boot için tipik bir hexagonal architecture klasör yapısı:

  • com.example.order.domain: Order, OrderLine, Money (entity ve value object’ler)
  • com.example.order.application.port.in: CreateOrderUseCase, GetOrderQuery (inbound ports)
  • com.example.order.application.port.out: OrderRepository, PaymentGateway (outbound ports)
  • com.example.order.application.service: OrderService (use case implementation)
  • com.example.order.adapter.in.web: OrderController (REST adapter)
  • com.example.order.adapter.in.message: OrderKafkaListener (message adapter)
  • com.example.order.adapter.out.persistence: OrderJpaRepository, OrderPersistenceAdapter
  • com.example.order.adapter.out.client: StripePaymentAdapter

Hexagonal Architecture ve DDD Entegrasyonu

Hexagonal Architecture ve Domain-Driven Design birbirini tamamlar. DDD’nin tactical pattern’leri (aggregate, entity, value object) hexagonal’in domain layer’ında natural olarak yer alır.

  1. Bounded Context = Hexagon: Her bounded context kendi hexagonu
  2. Aggregate Root = Entity: Domain layer içinde
  3. Repository = Outbound Port: Persistence soyutlaması
  4. Domain Service = Application Service: Pure logic ise domain’de
  5. Domain Event: Outbound port ile publish edilir
  6. Anti-Corruption Layer: Outbound adapter olarak implement
  7. Ubiquitous Language: Domain layer’da net şekilde reflect

Domain-Driven Design rehberimizde detayları bulabilirsiniz. Mikroservis mimari yazımız hexagonal’in mikroservis bağlamında uygulanışını tamamlar.

Anti-Pattern’ler ve Yaygın Hatalar

Hexagonal Architecture’ın yanlış uygulanması beklenen değeri üretmez. Martin Fowler blog yazılarında en yaygın anti-pattern’leri tartışmıştır.

Anti-Pattern Açıklama Tespit Yöntemi
Anemic Domain Model Entity’lerde sadece getter/setter, mantık service’lerde Domain entity’lerin metod sayısı < 3
Leaky Abstraction Domain’de JPA annotation, framework ref’ı ArchUnit ile bağımlılık kontrolü
Anaemic Ports Port interface sadece tek metod (basic CRUD) Use case granularity eksik
God Use Case Tek use case 10+ outbound port çağırıyor Single Responsibility ihlali
Premature Hexagonal Basit CRUD app’e hexagonal uygulamak Overengineering, 3 katman ekstra dosya
Adapter as Domain Adapter’a business logic sızması Adapter dosyasında if-then-else business kuralları
Mapper hell Her layer arasında ayrı DTO + mapper 4+ farklı tip aynı veri için

Adoption Strategy ve Migration

Mevcut bir codebase’i hexagonal’a geçirmek aşamalı bir süreçtir. Big-bang refactor yerine boundary-by-boundary yaklaşım önerilir.

  1. Domain identification: Hangi sınıfların pure business logic içerdiği (1 hafta)
  2. Anti-corruption layer: Mevcut kodla yeni hexagonal arasında köprü (1-2 hafta)
  3. Use case extraction: Controller’lardan business logic’in use case’e taşınması (4-8 hafta)
  4. Port definition: Repository interface’lerinin tanımlanması (1-2 hafta)
  5. Adapter refactoring: Persistence ve external API’lerin adapter’a dönüşümü (3-6 hafta)
  6. Test coverage artırımı: Domain ve use case unit test’leri (sürekli)
  7. Architecture tests: ArchUnit ile bağımlılık kuralları enforce (1 hafta)
  8. Documentation: Architectural Decision Records (ADR), context map (1-2 hafta)

Maliyet, ROI ve Olgunluk Modeli

Hexagonal Architecture’ın yatırım maliyeti orta-uzun vadede ciddi ROI üretir. Gartner 2024 raporu kurumsal yazılım projelerinin %62’sinin teknik borç sebebiyle planlanan süreden %40 daha uzun sürdüğünü belgeler.

Aşama Initial Yatırım Yıllık Bakım Tasarrufu Geri Ödeme Süresi
Greenfield project %15-25 extra design effort %30-40 maintenance 12-18 ay
Migration (legacy) %40-60 refactor effort %35-50 maintenance 18-30 ay
Test coverage iyileştirmesi %20-30 test yazma efforu %55 defect azalması 9-15 ay
Framework değişikliği %5-15 ek effort %70 framework değiştirme tasarrufu İlk değişiklikte
Database vendor değişimi %5-10 ek effort %80 migration tasarrufu İlk değişiklikte

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

Hexagonal Architecture adopsiyonunda teknik öğrenme kadar kültürel ve süreç değişimi kritiktir. Danışmanlık projelerinde gözlemlenen örüntüler, hexagonal geçişlerinin %33’ünün ilk yıl içinde overengineering algısı ile rafa kaldırıldığını göstermektedir. Tipik sorunlar:

  • Premature application: Basit CRUD uygulamasına hexagonal, gereksiz katman ve dosya patlaması
  • Anemic domain model: Domain entity’leri sadece getter/setter, mantık service’lerde sızıntılı
  • Adapter leak: JPA annotation domain entity’lerde, framework bağımsızlık iddiası geçersiz
  • Mapper hell: Aynı veri için 4 farklı tip (Entity, Domain, DTO, ViewModel), maintenance kabusu
  • Test coverage artışı yok: Hexagonal yapılı ama eski test pattern’i devam ediyor
  • Onboarding belge eksik: Yeni geliştirici 6-8 hafta öğrenme süresi, productivity düşük

Sık Sorulan Sorular

Hexagonal Architecture her proje için uygun mu?

Hayır. Hexagonal Architecture karmaşık business logic, uzun ömürlü codebase, çoklu UI/integration ve yüksek test coverage gereken projeler için optimal seçimdir. Basit CRUD uygulamaları, prototype’lar, kısa ömürlü scriptler ve sadece bir UI olan projelerde overengineering’tir. Tipik olarak 3+ ay süreli, 5+ kişilik ekipler ve 3+ yıl ömür beklentisi olan projelerde net değer üretir. Finansal, sağlık, lojistik ve B2B SaaS gibi karmaşık domain projeleri ideal kullanım alanlarıdır.

Hexagonal ve Clean Architecture arasındaki fark nedir?

İkisi de aynı temel prensiplere (dependency inversion, domain izolasyonu) dayanır. Hexagonal Cockburn 2005, Clean Architecture Robert C. Martin 2012 yayınıdır. Pratik farklar: Clean Architecture 4 dairesel katman (Entities, Use Cases, Interface Adapters, Frameworks) önerir; Hexagonal 3 katman (Domain, Application, Adapters) ve ports/adapters terminolojisini kullanır. Clean Architecture daha yapılandırılmış ama daha karmaşık; Hexagonal daha esnek ve uygulamada daha hızlı kavraması kolay. Çoğu modern proje ikisinin pragmatik bir karışımını uygular.

Performance açısından hexagonal architecture sorun yaratır mı?

İyi tasarlanmış bir hexagonal architecture’ın direct call’lara göre runtime overhead’i %1-3 seviyesindedir; modern JVM/CLR ve V8 inline cache optimizasyonları interface call’ları neredeyse sıfır cost’a indirir. Bazı durumlarda DTO mapping (Entity ↔ Domain ↔ Response) ek hafıza ve CPU kullanır; bu MapStruct, AutoMapper gibi compile-time mapper’larla optimize edilebilir. Hot-path performans-kritik servisler (HFT, real-time bidding) için thin hexagonal veya alternatif mimari (data-oriented design) tercih edilebilir.

ArchUnit ile bağımlılık kuralları nasıl enforce edilir?

ArchUnit Java için (NetArchTest .NET için, ts-arch-unit TypeScript için) test framework’ü olarak çalışır ve unit test gibi her build’de çalışır. Tipik kurallar: (1) “Domain layer’da framework import’u olmamalı” (no import javax.persistence in domain.*), (2) “Adapter layer use case’i directly call edemez”, (3) “Aggregate root’lar package-private constructor’a sahip olmalı”, (4) “Repository interface’leri domain’de olmalı, implementation adapter’da”. Bu testler her PR’da çalışır ve mimari ihlalleri build fail yapar.

Hexagonal Architecture mikroservislerle nasıl uyumlu?

Hexagonal Architecture mikroservis ile native uyumludur; her mikroservis kendi hexagon’unu oluşturur. Bounded context = mikroservis = hexagon eşleştirmesi yaygındır. Inter-service iletişim outbound adapter’lar üzerinden yapılır (REST client, gRPC, message publisher). Anti-corruption layer ile dış servisin modeli izole edilir. Modüler monolit içinde de aynı pattern her modül için uygulanabilir; modül = hexagon. Mikroservise geçişte hexagon zaten net bir API tanımladığı için extraction kolaylaşır, network call’a dönüşüm minimum riskle yapılır.

Sonuç

Hexagonal Architecture (Ports & Adapters) 2026 itibarıyla karmaşık kurumsal yazılım projelerinde kanıtlanmış bir tasarım pattern’idir; %85+ test coverage, %62 defect azalması ve framework/database bağımsızlığı sayesinde uzun ömürlü codebase’ler için optimal mimaridir. Domain layer’ın framework-bağımsız tutulması, inbound/outbound port’larla net sınırlar çizilmesi ve adapter pattern ile concrete implementation’ların izole edilmesi temel prensiplerdir. DDD ile native uyumu, mikroservis mimari için sağlam bir altyapı ve kompleks business logic’in evrimini destekleyen bir yapı sunar. Doğru uygulama için domain’in rich model olması, leak’lerin ArchUnit benzeri araçlarla engellenmesi, anti-pattern’lerden (anemic model, mapper hell) kaçınılması kritiktir. Yanlış implementasyon ise yıllık 350.000-1 milyon USD rework maliyetine yol açabilir; doğru yapılandırma ise %30-50 maintenance maliyet tasarrufu ve framework değişikliklerinde %70 efor avantajı sağlar. Kurumsal Java/Spring, .NET ve Node.js projelerinde 12-18 aylık geri ödeme süresiyle kanıtlanmış bir yatırımdır.

Ö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

    Hexagonal architecture’ın faydası küçük projelerde overhead olarak görülebiliyor, ama “test edilebilir core + replaceable adapters” yaklaşımı 3+ yıllık codebase’lerde gerçek ROI veriyor. Erken adoption ile sonradan retrofit arasındaki maliyet farkı 4-5x.

Yorum Yap

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