ストーリー
主要なアーキテクチャパターン
1. ヘキサゴナルアーキテクチャ(Ports & Adapters)
提唱者: Alistair Cockburn(2005年)
核心: アプリケーションを「Port(インターフェース)」と「Adapter(実装)」で外部と接続する。
┌─────────────┐
HTTP ──→ │ Port (in) │
│ │
│ ドメイン │
│ │
│ Port (out) │ ──→ DB
└─────────────┘
2. オニオンアーキテクチャ
提唱者: Jeffrey Palermo(2008年)
核心: 同心円状の層構造。内側のドメインモデルを中心に、外側に向かって依存が広がる。
┌────────────────────────────┐
│ Infrastructure │
│ ┌──────────────────────┐ │
│ │ Application Services │ │
│ │ ┌────────────────┐ │ │
│ │ │ Domain Services│ │ │
│ │ │ ┌──────────┐ │ │ │
│ │ │ │ Domain │ │ │ │
│ │ │ │ Model │ │ │ │
│ │ │ └──────────┘ │ │ │
│ │ └────────────────┘ │ │
│ └──────────────────────┘ │
└────────────────────────────┘
3. クリーンアーキテクチャ
提唱者: Robert C. Martin(Uncle Bob, 2012年)
核心: 4つの同心円。依存性ルール(Dependency Rule)を明確に定義。
┌──────────────────────────────────┐
│ Frameworks & Drivers │
│ ┌────────────────────────────┐ │
│ │ Interface Adapters │ │
│ │ ┌──────────────────────┐ │ │
│ │ │ Application Business │ │ │
│ │ │ ┌────────────────┐ │ │ │
│ │ │ │ Enterprise │ │ │ │
│ │ │ │ Business │ │ │ │
│ │ │ └────────────────┘ │ │ │
│ │ └──────────────────────┘ │ │
│ └────────────────────────────┘ │
└──────────────────────────────────┘
3つのパターンの共通点
| 共通原則 | 説明 |
|---|---|
| ドメイン中心 | ビジネスロジックが最も内側にある |
| 依存の方向 | 外側から内側に向かう |
| インターフェースによる分離 | 境界をインターフェースで定義する |
| 技術の交換可能性 | インフラ層の差し替えが容易 |
// どのパターンでも、この構造は共通
// 1. ドメインにインターフェースを定義
interface OrderRepository {
findById(id: string): Promise<Order>;
save(order: Order): Promise<void>;
}
// 2. ユースケースはインターフェースに依存
class CreateOrderUseCase {
constructor(private repo: OrderRepository) {}
}
// 3. インフラがインターフェースを実装
class PrismaOrderRepository implements OrderRepository {
// ...
}
パターンの違い
| 観点 | ヘキサゴナル | オニオン | クリーン |
|---|---|---|---|
| メタファー | 六角形(ポート) | 玉ねぎ(層) | 同心円(4層) |
| 強調点 | 外部との接続方法 | ドメインモデルの保護 | 依存性ルールの厳密さ |
| 層の数 | 明示的に定めない | 4層 | 4層 |
| 命名 | Port / Adapter | Domain / Service / Infra | Entity / UseCase / Adapter / FW |
| 実用面 | 外部連携が多いシステム向き | ドメインが複雑なシステム向き | 汎用的 |
今月学ぶパターンの関係
ヘキサゴナル ───── 外部との接続方法にフォーカス
│ ↓
│ 「Portを通じてAdapterと繋がる」
│
クリーン ─────── 内部の層構造にフォーカス
│ ↓
│ 「4つの同心円と依存性ルール」
│
DDD ──────────── ドメインモデリングにフォーカス
↓
「Bounded ContextとAggregateで
複雑なドメインを整理する」
これらは対立するものではなく、組み合わせて使うものです。
// 実際のプロジェクトでは3つを組み合わせる
src/
├── domain/ // DDD + クリーンのEntity層
│ ├── order/ // Bounded Context
│ │ ├── Order.ts // Aggregate Root
│ │ ├── OrderItem.ts // Entity
│ │ └── Money.ts // Value Object
│ └── ports/ // ヘキサゴナルのPort
│ ├── in/OrderUseCase.ts
│ └── out/OrderRepository.ts
├── application/ // クリーンのUseCase層
│ └── CreateOrderUseCase.ts
└── adapters/ // ヘキサゴナルのAdapter
├── in/OrderController.ts
└── out/PrismaOrderRepository.ts
どのパターンを選ぶべきか
| 状況 | 推奨 |
|---|---|
| 小規模・シンプル | レイヤードアーキテクチャで十分 |
| 外部連携が多い | ヘキサゴナルアーキテクチャ |
| テスタビリティ重視 | クリーンアーキテクチャ |
| 複雑なビジネスドメイン | DDD + ヘキサゴナル or クリーン |
| マイクロサービス | DDD(Bounded Context)で分割 |
まとめ
| ポイント | 内容 |
|---|---|
| 3つのパターン | ヘキサゴナル、オニオン、クリーン |
| 共通点 | ドメイン中心、依存は内向き、インターフェースで分離 |
| 違い | メタファーと強調点が異なる |
| 実践 | 3つを組み合わせて使うのが一般的 |
チェックリスト
- 3つのアーキテクチャパターンの特徴を説明できる
- 共通する4つの原則を理解した
- パターンの違いを把握した
- 状況に応じたパターン選択の指針を理解した
次のステップへ
次は「アーキテクチャ判断の記録(ADR)」を学びます。なぜそのアーキテクチャを選んだのか、判断の根拠を記録する方法を身につけましょう。
推定読了時間: 25分