開発支援・コーディング

クリーンアーキテクチャ入門|DBがないとテストできないコードは、設計が間違っている

クリーンアーキテクチャは何を解決する理論なのか「依存関係のルール」とは具体的に何をすることなのか個人開発でどこまで層を分けるべきか

ビジネスロジックのテストを書こうとして、テストDBの起動・マイグレーション・テストデータ投入から始める羽目になる——その時点で設計は詰まっています。値引き計算や在庫判定のようなただの計算ロジックが、なぜデータベースなしでは動かないのでしょうか。

クリーンアーキテクチャは、この痛みへの処方箋です。Robert C. Martin(Uncle Bob)が2012年に提唱したこの理論の核は1つのルールに集約されます。この記事は理論の説明だけでなく、実際にDBなしでビジネスロジックをテストするコードを実行し、その効果を示します。

この記事の要点

  • 核となる原則は「依存の向きは常に内側へ」。ビジネスロジックは技術的な詳細を知らない
  • 効果は「DB・UI・Webサーバーなしでビジネスルールをテストできる」こと
  • DB・フレームワークは「詳細」として扱う。中心を守れば周辺は差し替え可能になる
  • 個人開発では全レイヤーを厳密に分ける必要はない。「ビジネスロジックだけは技術に依存させない」の1点から始めれば十分

1つのルールに集約される——「依存は内側へ」

覚えることは1つ。ビジネスロジックは技術的な詳細(DB・HTTP・フレームワーク)を知らない、逆は許さない。この1文が全ての図と実装の根拠になる。

クリーンアーキテクチャの提唱者Robert C. Martinが示す原則は、驚くほど短い一文に集約されます。“Source code dependencies can only point inwards.”——ソースコードの依存関係は、内側にしか向かってはいけない。

「内側」とは何か

同心円の中心にあるのがビジネスロジック(業務ルール)で、外側にDB・Web・フレームワークといった技術的な詳細が配置されます。矢印は常に外から内へ——DBの都合でビジネスロジックの書き方を変えることは許されますが、逆(ビジネスロジックの都合でDBの選択が縛られること)は起きないという一方通行の規律です。

フレームワークは「詳細」

原典はさらに踏み込みます。“does not depend on the existence of some library of feature laden software”。このアーキテクチャは、機能満載のライブラリの存在に依存しない、という主張です。フレームワークは中心ではなく周辺の「詳細」として扱われ、後から差し替え可能な部品という位置づけになります。

Source code dependencies can only point inwards.
出典Robert C. Martin「The Clean Architecture」(blog.cleancoder.com) 一次情報を確認2026-08-14 この内容の有効期限2027-02-14

実際にDBなしでテストしてみる

「依存は内側へ」の効果は抽象論ではなく実測できる。ビジネスロジックをインターフェース越しに書けば、DBなしで即座にテストが走る。

クリーンアーキテクチャの原典は、テスト容易性についてこう約束しています。“can be tested without the UI, Database, Web Server, or any other external element”。ビジネスルールは、UI・DB・Webサーバー等の外部要素なしにテストできる、という主張です。実際にやってみます。

実際に動かして確かめる

以下は編集部が実際にNode.jsで実行したコードと出力です。「割引計算」というビジネスロジックを、リポジトリ(データ取得)のインターフェース越しに書き、テストではDBの代わりにメモリ上の簡易実装を差し込みます。

discount-usecase.mjs(実行済み。編集部環境で検証)javascript
// ビジネスロジック: DBの存在を一切知らない。渡されたリポジトリのインターフェースだけを使う
function calculateDiscount(customerRepo, customerId) {
  const customer = customerRepo.findById(customerId);
  if (!customer) throw new Error("customer not found");
  if (customer.totalPurchase >= 100000) return 0.1; // 10万円以上で10%引き
  if (customer.totalPurchase >= 50000) return 0.05;
  return 0;
}

// テスト時: 本物のDBの代わりに、メモリ上の簡易リポジトリを差し込む
const fakeRepo = {
  findById: (id) =>
    ({ "C1": { totalPurchase: 120000 }, "C2": { totalPurchase: 30000 } })[id] ?? null,
};

console.log("C1(12万円購入)の割引率:", calculateDiscount(fakeRepo, "C1"));
console.log("C2(3万円購入)の割引率:", calculateDiscount(fakeRepo, "C2"));
実行結果(そのまま。DB接続は一度も発生していない)text
C1(12万円購入)の割引率: 0.1
C2(3万円購入)の割引率: 0

何が起きたか

DBサーバーは一度も起動していません。calculateDiscountcustomerRepoというインターフェースの形にしか依存しておらず、本番ではPrismaを使う実装、テストではメモリ上の実装を差し込めます。これが「依存は内側へ」を実装した姿です。

The business rules can be tested without the UI, Database, Web Server, or any other external element.
出典Robert C. Martin「The Clean Architecture」(テスト容易性についての言及) 一次情報を確認2026-08-14 この内容の有効期限2027-02-14

個人開発では「2層」から始めれば十分

原典の同心円を全部厳密にやる必要はない。ビジネスロジックと技術的詳細を分けるという1点だけを守れば、効果の大半は得られる。

クリーンアーキテクチャの解説記事はしばしば4層・5層の同心円図を示しますが、これは大規模システム向けの参考図です。個人開発で必要なのは、多くの場合2層の分離だけです。

最小構成: ビジネスロジック層と詳細層

中身依存してよいもの
ビジネスロジック層計算・判定・業務ルール純粋な関数・型。DBやHTTPのライブラリは知らない
詳細層DB・HTTP・外部API・フレームワークビジネスロジック層のインターフェースを実装する側
表1 ── 個人開発向けの最小2層構成

導入の目安

全ての個人開発アプリに必要ではありません。「テストを書こうとしたらDBが要って面倒」「仕様変更のたびに動作確認が手作業になる」と感じ始めたときが導入のタイミングです。痛みが出る前に厳密にやりすぎると、小さなアプリでは過剰な抽象化がむしろ開発速度を落とします。ソフトウェア設計の記事で触れた通り、重い理論は痛みが出てから読むのが最短です。

この節は一次情報での裏取りが未了です。 編集部の整理(個人開発への適用範囲)(2026-08-14 記載)

よくある質問

レイヤーを4つも5つも作る必要がありますか?
原典の同心円モデルは規模の大きいシステム向けの参考図です。個人開発では「ビジネスロジック」と「技術的な詳細(DB・HTTP・外部API)」の2層を分けるだけでも、テストのしやすさは大きく改善します。
フレームワークを使うこと自体がアンチパターンですか?
違います。原典が言っているのは「ビジネスロジックがフレームワークに依存しないようにする」ことで、フレームワークの使用自体を禁じてはいません。フレームワークは周辺(詳細)に押し出して使えばよいという考え方です。
小さな個人開発アプリでもやる価値がありますか?
画面数が少なく変更もほぼないアプリなら効果は小さいです。逆に「仕様変更のたびにテストが壊れる」「動作確認のたびに手動でDBやAPIを叩く」と感じ始めたら、導入の効果が出るタイミングです。
TypeScriptでどう実現しますか?
ビジネスロジックを純粋な関数・クラスとして書き、DBアクセスやHTTP呼び出しはインターフェース(型)越しに呼ぶ形にします。テスト時はそのインターフェースの実装をメモリ上の簡易版に差し替えます。

まとめ

  • 核心は「依存は内側へ」。ビジネスロジックは外側の技術を知らない
  • 効果は実測できる。DBなしでビジネスロジックのテストが書けるようになる
  • フレームワーク・DBは「詳細」。後から差し替え可能な周辺として扱う
  • 個人開発は2層分離から始めれば十分。全部を厳密にレイヤー化する必要はない

今日から始められること

  1. 自分のビジネスロジック(計算・判定処理)がDBやHTTPリクエストに直接依存していないか確認する
  2. 1つの計算ロジックを関数として切り出し、DBなしでテストを書いてみる
  3. 外部サービス呼び出しをインターフェース越しにし、テスト時は差し替え可能にする
  4. 「テストのために本物のDBが要る」箇所をリストアップし、優先度の高いものから分離する

実務で組んだクリーンアーキテクチャのワークフローには、値段が付きます

同じ課題を持つ会社にとって、動いている設定は「作る時間」を買えるということです。ServiceDockは自作のワークフローやテンプレートを出品できるマーケットプレイスです。手数料や出品の流れは出品者向けページにまとまっています。

出品の仕組みを見る