はじめに
ソフトウェア開発において、
「 ちょっとした修正のはずが、システム全体に影響が及んでしまった 」
「 データベースや外部APIの仕様が決まらず、コアとなる機能の実装が進まない 」
といった経験はないでしょうか。
プロジェクトの初期はスムーズに進んでいたはずなのに、いつの間にかコードは複雑に絡み合い、どこに何が書かれているのか分からない「 関心の混在 」が起きてしまう。
これは、多くの現場で直面する深刻な「 痛み 」です。
これらの課題を解決し、ソフトウェアの寿命を延ばすための強力な手段となるのが「 クリーンアーキテクチャ 」です。
なお、「クリーンアーキテクチャ」と聞くと、ドメイン駆動設計(DDD)とセットで語られることが多いため、「 なんだか難しそう 」「 厳密なルールに従わなければならないのでは 」と、ハードルを高く感じてしまう方もいるかもしれません。
しかし、一概にDDDの手法をすべて採用しなければならないというわけではありません。
クリーンアーキテクチャの本質は、あくまで「 関心の分離 」と「 依存性の逆転 」にあります。
本記事では、単なるディレクトリ構成やコードの書き方の話にとどまらず、「 なぜクリーンである必要があるのか 」という根本的な理由から、4つの層の役割、そしてクリーンアーキテクチャがもたらすビジネス上の価値までを分かりやすく解説します。
「 変わりやすい技術 」から「 守るべきビジネスの本質 」をどう切り離すのか、その戦略を一緒に紐解いていきましょう。
なぜ『クリーン』である必要があるのか
密結合による「変更」の連鎖
課題
フレームワークのアップデートやライブラリの変更が、ビジネスロジックにまで悪影響を及ぼす。
痛み
「ちょっとした修正」のはずが、システム全体に影響が波及し、修正コストが肥大化する。
「詳細」への依存による開発の停滞
課題
データベースの選定や外部APIの仕様が決まらないと、コアロジックの実装が進められない。
痛み
外部要因(詳細)が、本来の目的であるビジネス価値(本質)の進行を妨げてしまう。
肥大化した「関心の混在」
課題
1つのクラスや関数の中に、データの保存、画面の表示、ビジネスルールが混ざり合っている。
痛み
どこに何が書いてあるか分からず、コードの可読性とメンテナンス性が著しく低下する。
4つの層の役割と「関心の境界」
1. Domain層:ビジネスの本質
責務
業務上のルール(ロジック)とデータ構造の定義
純粋性
フレームワーク、DB、UIの存在を一切知らない
価値
ソフトウェアの「核」であり、最も変更が少なく、最も保護されるべき場所
2. Application層:業務の進行管理
責務
特定のユースケース(「注文する」「解約する」など)の実行手順の制御
調整役
Domain層のオブジェクトを組み合わせて、1つの機能を完成させる
独立性
「どう表示するか」や「どう保存するか」の具体的な手段は持たない
3. Presentation層:外部とのインターフェース
責務
外部入力(HTTP, CLI)の受け付けと、出力(JSON, HTML)の整形
変換器
外部からのリクエストをApplication層が理解できる形に翻訳して渡す
依存先
Webフレームワーク(コントローラー、ルーティング等)
4. Infrastructure層:技術的な詳細実装
責務
データの永続化(DB)、外部通信(API)、ファイル操作などの具体的処理
プラグイン
アプリケーション本体から見れば、交換可能な「差し込みパーツ」
依存先
データベース、メッセージキュー、クラウドサービスなどの外部ライブラリ
技術スタックの上に構造を築く
技術スタックの上に構造を築くことで、どのような言語、フレームワークであっても同様のクリーンアーキテクチャ構造にすることができます。
言語標準を土台とする「コア」の構築
考え方
Domain層とApplication層は、特定のフレームワークに依存せず「 プログラミング言語の標準機能 」だけで記述する。
メリット
フレームワークをバージョンアップ(あるいは入れ替え)しても、ビジネスロジックは影響を受けない。
フレームワークによる「外殻」の装着
構成
Presentation層(Web)やInfrastructure層(DB)にのみ、フレームワークやライブラリを導入する。
役割
コア(Domain層、Application層)が主役であり、フレームワークはそれを「 動かすための道具 」として外側に配置する。
依存性の逆転(DIP)による結合
仕組み
Application層がInfrastructure層(の実装)を直接呼ぶのではなく、Application層が定義した「 インターフェース 」を介して呼び出す。
必要性
「 具体的な道具(DB等) 」に「 手順書(ロジック) 」を依存させないため。
もし直接依存すると、道具の入れ替え時に手順書まで書き直す必要が出てしまう。
結果
ソースコードの依存方向が常に 「外(詳細)」から「内(本質)」 へ向かい、外部の変化に左右されない 独立したコア が完成する。
クリーンアーキテクチャがもたらす価値
変化に強い「高い保守性」
解決すること
外部(フレームワークやDB)の都合による変更が、コアロジックに波及しない。
メリット
ライブラリのアップデートやDBの移行といった「 技術的な都合 」による修正コストを最小限に抑えられる。
ビジネスを止めない「不確実性への耐性」
解決すること
「 詳細(DBの選定や外部APIの仕様) 」が決まっていなくても、インターフェースさえ決めればコアロジックの実装を進められる。
メリット
不確実な要素を「 後回し 」にできるため、ビジネス価値(ユースケース)の実装を先行させ、開発スピードを維持できる。
信頼性を担保する「高いテスト効率」
解決すること
UIやデータベース、ネットワーク環境に依存せず、Domain/Application層単体でテストを実行できる。
メリット
高速かつ安定した自動テストが可能になり、長期にわたって、バグの混入を防ぎながら安心してリファクタリングができる。
まとめ
「変わりやすいもの」と「大切なもの」の分離
クリーンアーキテクチャの本質は、 性質の異なる2つの領域を切り離す ことにあります。
-
技術(外側):移り変わりが激しい
- フレームワークの流行、DBの選定、外部ライブラリの仕様
- これらは数年で変わる「 詳細 」である
-
ビジネス(内側):守るべき最大の資産
- 顧客に提供する価値、計算ロジック、業務ルール
- これらは技術が変わっても変わらない「 本質 」である
アーキテクチャは「戦略」である
クリーンアーキテクチャを採用することは、単なるコードの整理整頓ではありません。
-
「詳細」を「本質」から引き剥がす
- ビジネスロジックの中に「SQL文」や「HTTPリクエスト」を直接書かない
-
重要な意思決定(DBやUIなど)を、必要になるまで遅らせる
- プロジェクト初期に「どのDBを使うか」「どのWebフレームワークを使うか」を決めるのは、実はリスクが高い
- ソフトウェアの寿命を延ばし、変更コストをコントロールし続ける
- 開発初期と同じような「 修正のしやすさ(低い変更コスト) 」を、数年経っても維持し続ける
おわりに
クリーンアーキテクチャは、決して「 ルールが厳しいだけの複雑な設計手法 」ではありません。
その本質は、移り変わりの激しい「 技術(詳細) 」から、私たちが最も守るべき資産である「 ビジネス(本質) 」を分離し、保護することにあります。
実は、 ドメイン駆動設計(DDD) も、ユースケースを起点に設計を進める「 ユースケース駆動開発(ICONIXプロセス) 」も、目指している本質は同じです。
アプローチの入り口が「 ドメイン(業務のルールや知識) 」であっても、「 ユースケース(ユーザーがシステムで達成したい振る舞い) 」であっても、行き着く先は「 技術的な都合(DBやフレームワークなど)に振り回されず、ビジネスの真の目的をソフトウェアの中心に据える 」というゴールです。
これこそが、不確実性の高い現代のソフトウェア開発において、これらの設計手法が強力な「 戦略 」となる理由です。
もちろん、すべてのプロジェクトに最初から完全なアーキテクチャを適用する必要はないかもしれません。
重要な意思決定を「 必要になるギリギリまで遅らせる 」ことができるのも、この構造の強みです。
しかし、「 詳細と本質を引き剥がす 」「 依存の方向を内側に向ける 」という考え方を知っているだけでも、日々のコーディングや設計の質は大きく変わるはずです。
クラスの責務に迷ったときや、新しいライブラリを導入するときに、本記事で紹介した「 関心の境界 」を少しでも思い出していただければ幸いです。
