システム開発を効率よく、かつ長く使えるコードにするには「設計」がとても重要です。
中でも注目されているのが「Clean Architecture(クリーンアーキテクチャ)」です。この記事では、初心者の方にもわかりやすく、Clean Architectureの基本構造やメリット、実際の使い方までを丁寧に解説します。
Clean Architectureとは?
Clean Architecture(クリーンアーキテクチャ) とは、アプリケーションやシステムを長期間安定して運用できるようにするための「設計の考え方(アーキテクチャ)」です。
アメリカの著名なソフトウェアエンジニア Robert C. Martin(ロバート・C・マーチン)、通称“Uncle Bob(アンクル・ボブ)”が提唱しました。
この設計の目的は、アプリのビジネスロジック(本質的な処理)を他の要素(UI、データベース、外部APIなど)から分離して、変更や拡張に強いシステムを作ることです。
ポイントをわかりやすくまとめると…
- 何が起きてもアプリの“本質”は守られるようにする設計
- UIやDBの技術が変わっても、ロジックはそのまま使える
- テストやメンテナンスがしやすくなる
なぜClean Architectureが重要なのか
アプリやシステムの開発では、最初は動いているコードでも、時間が経つにつれて次のような悩みが出てきます。
よくある悩み
- 少しの変更で他の部分が壊れてしまう
- 新しい機能を追加したいのに、どこを触ればいいかわからない
- テストが書きにくく、動作確認に時間がかかる
- 開発メンバーが変わると、誰も中身を理解できなくなる
これらの原因は、「コードの依存関係がバラバラ」、**「ビジネスロジックがUIやDBにべったりくっついている」**ことによるものです。
Clean Architectureの重要性はここにある!
Clean Architectureを取り入れると…
✅ 「ビジネスロジック」と「UI・DB」などの技術要素を分離できる
✅ 変更や追加がしやすくなる(影響範囲が小さい)
✅ テストが簡単になり、不具合の発見も早くなる
✅ 長期間の運用でもコードが崩れにくい
変化しやすい技術から守るための設計
たとえば…
- Webアプリからスマホアプリに変えたい
- データベースをMySQLからPostgreSQLに変更したい
このような「外側の技術の変更」があっても、Clean Architectureなら中のロジックには影響を与えずに済みます。
つまり、アプリの本質を守りながら、柔軟に進化させることができるのです。
基本構造と4つのレイヤー

Clean Architectureは、アプリケーションを4つの同心円のレイヤーに分けて設計します。
特徴は「依存関係は内側に向かう」というルールです。つまり、外側のコードが内側のコードに依存することはOKですが、内側のコードが外側に依存してはいけません。
この図はClean Architectureを視覚的に表現したものです。中心から外側に向かって、次のような4つのレイヤーに分かれています。
① Entities(エンティティ)
- 役割: 企業全体で使える「ビジネスルール(ドメインモデル)」
- 内容: アプリケーションの核となるデータ構造とロジック(例:ユーザー、注文、商品など)
- 特徴: 他のレイヤーに依存しない・最も安定している
✅ 例:
User
クラス、calculateTotal()
のようなルールロジック
② Use Cases(ユースケース)
- 役割: アプリケーションの振る舞いを定義する「アプリケーションルール」
- 内容: エンティティを使って、どのような処理を行うか(例:注文処理、登録処理など)
- 特徴: UIやDBの実装に依存せず、ビジネスの流れに集中
✅ 例:ユーザー登録処理、購入フローの手続きなど
③ Interface Adapters(インターフェースアダプター)
- 役割: 外部と内部の橋渡しをする部分
- 内容: コントローラー、プレゼンター、データアクセス(ゲートウェイ)など
- 特徴: ユースケースを呼び出したり、結果をUI用に整形したりする
✅ 例:WebのリクエストをユースケースへつなぐController、結果を整えるPresenter
④ Frameworks & Drivers(フレームワーク&ドライバー)
- 役割: 外部の技術的な要素(インフラ)
- 内容: Webフレームワーク、データベース、UI、外部APIなど
- 特徴: 最も外側のレイヤー。中身に直接関与しない
✅ 例:React/VueなどのUI、PostgreSQLなどのDB、外部API連携など
依存関係のルール
図のように、矢印は内側を向いています。
つまり、外側のコードが内側のコードを使う(依存する)のはOKですが、内側は外側に依存してはいけないのがルールです。
これにより、UIやDBを変えても、中核のビジネスロジックに影響が出ません。
まとめ
- アーキテクチャは4層構造(エンティティ → ユースケース → アダプター → フレームワーク)
- 依存関係は「内向きのみ」=中のロジックは外に影響されない
- 各レイヤーに役割を分けることで、保守性・再利用性が高くなる
- 最小限で導入するなら「エンティティ」と「ユースケース」をまず分離するのがおすすめ
境界を超える仕組み:依存関係逆転の法則(DIP)
Clean Architectureでは、内側のレイヤー(ユースケース)が外側のレイヤー(インターフェースアダプターなど)を利用する必要がある場合、直接呼び出すことはできません。なぜなら、「依存は内向き」がルールだからです。
このとき活躍するのが、依存関係逆転の法則(Dependency Inversion Principle)です。
どうやって境界を越えるの?
- ユースケース側が「インターフェース」を定義する(例:
IUserRepository
) - 外側のレイヤー(例えばDBアクセスクラス)がそのインターフェースを実装する
- ユースケースは、そのインターフェースだけを通じて外側の処理を利用する
図の中でいうと…
- ユースケース → 出力ポート(
Output Port
)を定義 - プレゼンター → そのインターフェースを実装
- 制御の流れはピンク色の矢印「Flow of control」のように進む
これにより、「ユースケースが外側に依存していない状態」が守られ、Clean Architectureの原則に従った設計が可能になります。
Clean Architectureのメリット
Clean Architectureを取り入れることで得られるメリットはたくさんあります。特に、長期的な開発・保守において大きな効果を発揮します。
✅ 1. 変更に強くなる
アプリ開発では、UIの変更、フレームワークのアップデート、データベースの切り替えなどがよくあります。
Clean Architectureでは、中心のビジネスロジック(エンティティ・ユースケース)を外側の変更から守る構造になっているため、外の変更に影響されにくいのが特徴です。
例:ReactからVueにUIを変更しても、ユースケースやロジックはそのまま使える。
✅ 2. テストがしやすい
ビジネスロジックとUIが分離されているため、ユースケースだけを単独でテストできます。モック(仮のデータ)を使えば、外部の依存なしに動作確認が可能です。
結果:自動テストが書きやすくなり、バグの早期発見・品質向上に繋がる。
✅ 3. 再利用性が高まる
一度作ったユースケースやエンティティは、他のアプリやシステムでも再利用可能です。
共通の処理(例:認証、計算処理、データ変換など)を、UIや環境に縛られず使い回せます。
✅ 4. 見通しがよくなり、チーム開発に強い
コードの役割がはっきり分かれているため、
「どこに何を書くべきか」が明確です。
そのため、複数人での開発や、後から参加したメンバーでも構造を理解しやすく、保守・引き継ぎがスムーズになります。
✅ 5. アプリの寿命を伸ばせる
Clean Architectureは「作って終わり」ではなく、「長く使い続けられる設計」を実現するものです。
機能追加や修正を積み重ねても崩れにくく、将来のメンテナンスコストを大幅に削減できます。
まとめ
- UIやDBの変更に強く、ロジックが影響を受けにくい
- 自動テストが書きやすく、品質向上に貢献
- 再利用性が高く、他のアプリにも応用できる
- チーム開発に向いており、構造が分かりやすい
- メンテナンス性が高く、長期的に安定する設計が可能
実際にどう使う?導入のポイント
Clean Architectureの考え方はとても優れていますが、すべてをいきなり完璧に導入する必要はありません。
まずは「分離」と「責務を分ける」という基本方針を意識することが大切です。
✅ ステップ①:ユースケースと画面ロジックを分ける
多くの初学者は、画面のコードにそのまま処理を書いてしまいがちです。
Clean Architectureでは、ビジネス処理(ユースケース)とUI(コントローラーやビュー)を分離します。
例:
UserController
(入力受付)
→RegisterUserUseCase
(ユーザー登録処理)
→User
(ビジネスルール)
✅ ステップ②:インターフェースを使って依存を逆転
ユースケースがDBアクセスや外部APIを必要とするときは、インターフェース(抽象)を使って接続します。
これにより、内側のコードが外側に依存せずに処理できるようになります。
例:
IUserRepository
インターフェースをユースケースが使用し、
実際のUserRepository
(DB処理)は外側で実装する。
✅ ステップ③:小さなアプリで練習してみる
いきなり大規模なプロジェクトに適用するのは難しいので、
小規模なTodoアプリや認証機能のようなミニアプリで設計の練習をしてみると、理解が深まります。
✅ ステップ④:フレームワークに頼りすぎない
Webフレームワークは便利ですが、Clean Architectureではフレームワークは外側(最終層)に位置します。
ビジネスロジックを中心に考え、「フレームワークに合わせるのではなく、使いこなす」設計を意識しましょう。
✅ ステップ⑤:段階的に導入する
全部を一度にやろうとせず、以下の順で進めるのがおすすめです:
- ユースケースとUIの分離
- エンティティクラスの整理
- インターフェースによる依存逆転の導入
- テストの追加
- プレゼンターやDBアクセス層の分離
まとめ
- 最初は「Controller → UseCase → Entity」の流れを意識するだけでもOK
- フレームワークに依存しない設計を意識するだけで、アプリの寿命が伸びる
- 「境界を意識してコードを書く」ことがClean Architectureの第一歩
全体のまとめ
- Clean Architectureは、アプリを長く使えるように設計するための考え方
- 設計は4つのレイヤー(エンティティ、ユースケース、インターフェースアダプター、フレームワーク)に分けられる
- 依存関係は**常に内側へ向かう(DIPの原則)**ことで、外の変更に強くなる
- UIやDBを変更しても、ビジネスロジックは影響を受けない構造になる
- テストがしやすく、コードの再利用や保守も簡単
- 導入は段階的に。まずはユースケースとロジックの分離から始めるのがおすすめ
Clean Architectureは、初めて聞くと少し難しそうに感じるかもしれません。
ですが本質はとてもシンプルで、「大事なロジックを守るために、設計を整える」という考え方です。
最初からすべてを完璧に取り入れる必要はありません。
小さなプロジェクトで試してみたり、ユースケースとUIを分けるところから始めてみるだけでも、設計の良さを実感できるはずです。
「動くもの」から「長く使えるもの」へ。
Clean Architectureは、その第一歩をサポートしてくれる強力な設計手法です。ぜひ一度、取り入れてみてください。