⬡
六角形アーキテクチャ(ポートとアダプター)
ドメインを中心に置き、外部の技術詳細をアダプターで差し替え可能にするアーキテクチャスタイル
解決する課題
従来の層状アーキテクチャ(UI → ビジネス層 → DB層)では、ドメインロジックがインフラ(フレームワーク・DB・外部API)に依存してしまいやすい。ドメインに UI やフレームワークの概念が混入すると、テストが困難になり、技術の差し替えが難しくなる。
概念
Alistair Cockburn が提唱したアーキテクチャスタイル。ドメインを中心(内側) に置き、外部のすべてのアクター(UI、DB、メッセージキュー、外部API)をアダプター(外側) で接続する。
[HTTP] [CLI] [テスト]
↓ ↓ ↓
┌─────────────────────┐
│ ポート(インターフェース)│
│ ┌─────────────────┐ │
│ │ ドメインモデル │ │
│ │ (純粋なロジック) │ │
│ └─────────────────┘ │
│ ポート(インターフェース)│
└─────────────────────┘
↓ ↓ ↓
[DB] [メッセージキュー] [外部API]
- ポート: ドメインが外部に公開するインターフェース(抽象)
- アダプター: ポートの具体的な実装(HTTP コントローラ、DB リポジトリ、メッセージプロデューサー)
なぜ重要か
- ドメインが フレームワーク・DBに依存しない → テストが容易
- アダプターを差し替えるだけで別の技術に移行できる(DB を MySQL → PostgreSQL へ)
- ドメインロジックを理解するために UI の知識が不要になる
IDDD における位置づけ
Vernon は六角形アーキテクチャを DDD の「デフォルトアーキテクチャ」として推薦している。ドメインモデルをインフラから守ることが、長期的なモデルの純粋性を保証する。
他の選択肢(CQRS、イベント駆動)と組み合わせることも多い。
依存の方向
重要な原則:外側が内側に依存する。内側は外側を知らない。
✅ DBアダプター → リポジトリインターフェース(ドメイン)
❌ ドメイン → DB(Hibernate等)の具体クラス
依存性逆転の原則(DIP)をアーキテクチャレベルで実現したもの。
適用例
| アクター | ポート(インターフェース) | アダプター(実装) |
|---|---|---|
| HTTPリクエスト | ApplicationService | REST コントローラ |
| ユニットテスト | Repository | In-Memory リポジトリ |
| 本番DB | Repository | JPA / SQLAlchemy |
| メッセージ配信 | DomainEventPublisher | RabbitMQ / Kafka |
関連概念
- → アプリケーションサービス(外部からドメインへの入り口)
- → リポジトリ(ポートとアダプターの典型例)
- → CQRS(六角形との組み合わせパターン)
- 1. 🗺️サブドメイン(コア・サポート・汎用)
- 2. 🗾コンテキストマップ
- 3. ⬡六角形アーキテクチャ(ポートとアダプター)
- 4. 🪪エンティティ(Entity)
- 5. ⚙️ドメインサービス(Domain Service)
- 6. 📣ドメインイベント(Domain Event)
- 7. 🫧集約(Aggregate)
- 8. 📐集約の設計原則(Vernon の4ルール)
- 9. 🗄️リポジトリ(Repository)
- 10. 🏭ファクトリ(Factory)
- 11. 📦モジュール(Module)
- 12. 🎛️アプリケーションサービス(Application Service)
- 13. 🔌境界づけられたコンテキストの統合
- 14. ⚡CQRS(コマンドクエリ責任分離)
- 15. 📜イベントソーシング(Event Sourcing)
出典: 実践ドメイン駆動設計(Vaughn Vernon)第4章