はじめに
ソフトウェア設計の世界では「レイヤードアーキテクチャ」という言葉が広く使われていますが、実はその中には複数の思想・バリエーションが存在します。
本記事では、代表的な 3 つのアーキテクチャを比較し、実用的な観点から選び方まで整理します。
クリーンアーキテクチャ
概要
ロバート・C・マーティン(Uncle Bob)が提唱したアーキテクチャで、
依存方向を内側(ビジネスルール)に向けることが最大の特徴です。
レイヤー構造
+---------------------------+
| Frameworks & Drivers |
+---------------------------+
| Interface Adapters |
+---------------------------+
| Use Cases |
+---------------------------+
| Entities (Domain Model) |
+---------------------------+
特徴
- ビジネスルール(Entities)が最も重要な層
- 外側の技術(DB、Web フレームワーク)は交換可能
- 依存方向が明確でテストしやすい
メリット
- 長期運用に強い
- 技術的負債が溜まりにくい
- ユースケースが明確になる
デメリット
- 初期設計コストが高い
- 小規模プロジェクトでは過剰になりがち
ヘキサゴナルアーキテクチャ(Hexagonal Architecture)
概要
別名 Ports and Adapters。
アプリケーションの中心(ドメイン)を守り、外部との接続を「ポート」と「アダプタ」で抽象化します。
構造イメージ
+-------------------+
| UI Adapter |
+-------------------+
| Port
+---------------------------------------+
| Application |
| (Domain + UseCase + Ports) |
+---------------------------------------+
| Port
+-------------------+
| DB Adapter |
+-------------------+
特徴
- 入出力を「ポート」で抽象化
- 外部システム(DB、API、UI)を「アダプタ」で接続
- テスト用アダプタを簡単に作れる
メリット
- 外部依存を完全に隔離できる
- テストが非常に容易
- DDD と相性が良い
デメリット
- ポート・アダプタの概念に慣れる必要がある
- 設計が抽象的になりやすい
オニオンアーキテクチャ(Onion Architecture)
概要
玉ねぎのように内側へ向かって層が重なる構造。
中心に ドメインモデル を置き、外側にインフラ層が配置されます。
レイヤー構造
+---------------------------+
| Infrastructure |
+---------------------------+
| Application Services |
+---------------------------+
| Domain Services |
+---------------------------+
| Domain Model (Core) |
+---------------------------+
特徴
- ドメインモデルが最重要
- 依存方向は常に内側へ
- クリーンアーキテクチャと思想が近い
メリット
- ドメイン中心の設計がしやすい
- 外部技術の変更に強い
- DDD の戦術的パターンと親和性が高い
デメリット
- 設計の自由度が高く、チームで統一しにくい
- 小規模ではオーバーエンジニアリングになりやすい
どれを選ぶべきか?
| 観点 | クリーン | ヘキサゴナル | オニオン |
|---|---|---|---|
| 学習コスト | 中 | 高 | 中 |
| DDD との相性 | ◎ | ◎ | ◎ |
| テスト容易性 | ◎ | ◎ | ○ |
| 小規模向き | △ | △ | △ |
| 大規模向き | ◎ | ◎ | ◎ |
| 外部依存の隔離 | ○ | ◎ | ○ |
結論(実務的な視点)
- DDD を採用するなら → クリーン or ヘキサゴナル
- 外部依存を強く隔離したい → ヘキサゴナル
- シンプルにドメイン中心にしたい → オニオン
- チームの経験が浅い → クリーンアーキテクチャが無難
実際には、
3 つは思想が近く、ハイブリッドで使われることも多いです。
まとめ
- レイヤードアーキテクチャには複数の種類があり、どれも「ドメインを中心に据える」方向に進化している
- クリーンアーキテクチャは依存方向を厳密に管理
- ヘキサゴナルはポートとアダプタで外部を抽象化
- オニオンはドメインモデルを中心に据える構造
- 実務では、チームの経験・プロジェクト規模・変更頻度に応じて選ぶのが最適