ヘキサゴナルアーキテクチャ
ポートとアダプターでビジネスロジックを外部依存から分離する設計パターン
ヘキサゴナルアーキテクチャとは
ヘキサゴナルアーキテクチャ (Ports and Adapters) は、Alistair Cockburn が提唱した設計パターンで、ポート (インターフェース) とアダプター (実装) でビジネスロジックを外部依存から分離する。
構造
ヘキサゴナルアーキテクチャはコア (ビジネスロジック) を中心に、Input Port (外部からコアへの入口) と Output Port (コアから外部への出口) を配置する。外部の技術的詳細 (HTTP、DB、キュー) はポートを介してコアに接続するため、コアは外部に依存しない。テスト時はポートの実装をインメモリに差し替えるだけで済む。
[外部] [ポート] [コア] [ポート] [外部]
HTTP Request → Input Port → ビジネスロジック → Output Port → DynamoDB
CLI → Input Port → → Output Port → SQS
Test → Input Port → → Output Port → InMemory
| 層 | 説明 | 例 |
|---|---|---|
| コア (ドメイン) | ビジネスロジック | 注文処理、バリデーション |
| Input Port | コアへの入口 | OrderService インターフェース |
| Output Port | コアからの出口 | OrderRepository インターフェース |
| Input Adapter | 外部 → コア | Lambda ハンドラ、CLI |
| Output Adapter | コア → 外部 | DynamoDB 実装、InMemory 実装 |
TypeScript での実装
TypeScript での実装のコード例を示す。
// Output Port (インターフェース)
interface OrderRepository {
save(order: Order): Promise<void>;
findById(id: string): Promise<Order | null>;
}
// コア (ビジネスロジック、外部依存なし)
class OrderService {
constructor(private repo: OrderRepository) {}
async create(input: CreateOrderInput): Promise<Order> {
const order = Order.create(input);
await this.repo.save(order);
return order;
}
}
// Output Adapter: DynamoDB 実装、InMemory 実装など差し替え可能
// Input Adapter: Lambda ハンドラ、CLI など
ヘキサゴナル vs レイヤード vs クリーン
ヘキサゴナルとレイヤード vs クリーンの違いを以下にまとめる。
| 観点 | ヘキサゴナル | レイヤード | クリーン |
|---|---|---|---|
| 依存の方向 | 外 → 内 | 上 → 下 | 外 → 内 |
| テスト容易性 | 高い | 中 | 高い |
| 複雑さ | 中 | 低い | 高い |
メリット
最大の利点はテスト容易性だ。Output Adapter を InMemory 実装に差し替えるだけで、DB やメッセージキューなしにビジネスロジックをテストできる。また、コアがフレームワーク (Express、Lambda など) に依存しないため、実行環境の変更がコアに波及しない。DB を DynamoDB から Aurora に移行する場合も、Output Adapter を差し替えるだけでコアは無変更で済む。
ヘキサゴナルアーキテクチャについては関連書籍でも詳しく扱われている。
この記事は役に立ちましたか?
関連用語
オニオンアーキテクチャ
ドメインロジックを中心に据え、外側の層が内側に依存する同心円状のアーキテクチャ
アダプターパターン
互換性のないインターフェースを変換し、既存のコードを変更せずに連携させるデザインパターン
依存関係
モジュールやサービスが他のモジュールやサービスに依存する関係で、結合度と変更の影響範囲を決定する
クリーンアーキテクチャ
ビジネスロジックを外部の技術的詳細から分離し、依存関係を内側に向けることで変更に強い設計を実現するアーキテクチャ原則
ポートとアダプター
アプリケーションのコアロジックを外部技術から分離し、ポート (インターフェース) とアダプター (実装) で接続するアーキテクチャ
C4 Model
ソフトウェアアーキテクチャを 4 つの抽象レベルで図示するモデル
関連する記事
1 万行のコードより 1 冊の設計書が勝つ場面
大量のコードを書く力と、適切な設計を選ぶ力は別物です。コード量では解決できない問題に直面したとき、設計の知識がどう効くのかを具体例で解説します。
あの有名 OSS のコードは、この本の影響を受けている
広く使われているオープンソースソフトウェアの設計には、特定の技術書の影響が色濃く反映されています。OSS のコードと技術書の関係を知ると、両方の理解が深まります。
本棚を見ればエンジニアのレベルがわかる
エンジニアの本棚に並ぶ本の構成は、その人のスキルレベルとキャリアの方向性を映し出します。本棚の変遷パターンから、自分の現在地と次のステップを読み解く方法を紹介します。