Blog

クリーンアーキテクチャを簡単に理解してみよう

アイキャッチ

はじめに


こんにちは!👋 2025年新卒で、もうすぐ2年目の先輩になるエンジニアのパクパクです 🔥

みなさん、「クリーンアーキテクチャ(Clean Architecture)」という言葉を聞いたことはありますか?

OJTの最後にメール開発チームに配属されて、私もこのアーキテクチャにこれから触れていくことになりました。

この記事では、クリーンアーキテクチャを初めて触った新人エンジニアの視点で、概念を理解しつつ、実際のディレクトリにどう落とし込むかを順番に整理してみます。

 

1. 全部一つのディレクトリにまとめちゃダメですか?


クリーンアーキテクチャがなぜ必要なのか、おもちゃ作りにたとえて見てみます。

 

🔨 Before:ひとり工房

皆さんが「ひとりでおもちゃを作る工房」を運営していると想像してください。設計図を描いて、部品を作って、組み立てて、梱包して… 全部ひとりでやります。

最初はそれでも回ります。でも注文が増えると、だんだん問題が出てきます。

問題1:1か所直すと全部が揺らぐ

問題2:部品だけを単体で検査できない

問題3:材料の仕入れ先を変えにくい

 

コードにすると、だいたいこんな感じです。

 

たとえば mysql.connect を PostgreSQL に変えたら?

db.query の戻り値 parts の型が変わり、本来 DB と無関係なはずの create_instructions(parts) まで修正が必要になります。

 

🏭 After:役割が分かれたおもちゃ工場

次は工場にアップグレードして、役割ごとにチームを分けてみましょう!

Nano Banana生成画像

工場のチーム役割
設計チーム「車輪は4つ、色は赤」みたいなコアのルールを決める
製造チーム設計チームのルールに沿って、作る手順を指揮する
材料調達チーム外部の業者から部品を仕入れる
注文受付窓口お客さまの注文を受けて、製造チームへ渡す

こうやって分けると、さっきの3つの問題がきれいに解決します!

✅ 車輪の形を変えても → 設計チームだけ直せばいい

✅ 車輪だけ単体検査できる → 設計ルールを独立してテストできる

✅ 木材業者を変えても → 材料調達チームだけ直せばいい(設計はそのまま)

 

これをプロジェクトのフォルダ構成に当てはめると、こうなります。

工場のチーム業務のフォルダ役割
設計チームentitiesビジネスルール
製造チームusecases処理の流れを指揮する
材料調達チームgatewaysDB、S3、メールなど外部接続
注文受付窓口apisbatchesユーザー操作や実行要求の受付

 

2. おもちゃ工場で見るクリーンアーキテクチャ


上のアーキテクチャを基にして、おもちゃ工場についての内容で画像を生成してみました。

Nano Banana生成画像

 

いちばん内側:きらきらコア(Entities)

工場の核となる設計ルールです。

「車輪は4つで、色は赤」みたいに、誰が作ってもどこで作っても 絶対に変わらないルールです。

コードでは entities フォルダがこの役割を担当します。

 

2つ目の円:おもちゃをつくる手順(Use Cases)

工場の作業手順書です。

「1. 車輪を付ける → 2. 色を塗る → 3. 梱包する」みたいに、具体的な手順の流れを決めます。

コードでは usecases フォルダがこの役割です。

「部品を集めて → 組み立てて → 出荷する」みたいに、処理の流れを指揮します。

 

3つ目の円:つなぐための道具(Interface Adapters)

工場の接続アダプタです。大きく2種類あります。

どちらも「内側の世界」と「外側の世界」をつなぐ役割です。

  • 入口(注文受付窓口):ユーザーの要求を受けて工場の中へ渡す → apisbatches
  • 出口(材料調達ポータル):外から材料を持ってきて工場へ渡す → gateways

 

いちばん外側:外の世界の便利なもの(Frameworks & Drivers)

自分たちで作ったものではなく、持ってきて使う便利な道具です。

  • FastAPI(Webフレームワーク)
  • SQLAlchemy(DB ORM)

 

依存は内側に向けてだけ!

クリーンアーキテクチャでいちばん大事なルールは、これひとつです。

内側の円は、外側の円の存在を絶対に知らないこと!

おもちゃ工場で言うと:

  • 材料調達チーム(外側)が設計ルール(内側)を参照する → OK!
  • 設計ルール(内側)が「A社の木材で作れ」と特定の業者(外側)を指名する → NO!

設計チームは「木材が必要」とだけ書いて、どの業者から持ってくるかは気にしません。

こうしておくと、業者をAからBに変えても、設計を変えずに済むからです!

コードでも同じです。

  • entities(内側)は gateways(外側)を import しない
  • usecases(内側)は「どんな倉庫に保存して」のような具体的な保存方法は知りません。ただ「倉庫に保存して」と依頼するだけです。

 

3. プロジェクトのフォルダ = 工場の区画図


では実際に、プロジェクトの app/ フォルダを見てみましょう。

ここで紹介するフォルダ名(entitiesusecases など)はあくまで一例です。プロジェクトやチームによって命名は異なります。

 

ポイント

1. gateways/ の下にサブフォルダがたくさんある!

gateways は接続先が複数あるので、接続先ごとにサブフォルダを切っています。

 

2. usecases/ の中も、業務ごとにフォルダがある!

手順書(Use Case)も種類ごとに分かれます。「ギフトセット梱包用」「おもちゃの車組み立て用」「注文キャンセル用」みたいな感じです。

 

動作の流れ

おもちゃ工場には pack-gift-set という指示書があります。ギフトセットを組み立てて出荷する機能です。

実行すると、だいたいこんな順番で動きます。

 

  1. 担当者がCLIでコマンドを実行 → batches/ が注文を受付
  2. usecases/ の手順書が「部品確認 → 組み立て → 出荷」の流れを指揮
  3. gateways/ が実際にDBから部品を確認して、ギフトセットを組み立て、配送通知を送ります

 

おわりに


今回はクリーンアーキテクチャを おもちゃ工場 にたとえて整理してみました。みなさん、イメージできましたか?

私は難しい概念に出会うたびに、こうやって身近なものに置き換えて勉強しています。「これが工場だったら?」「これがレストランだったら?」みたいに考えると、急に難しかったものが少しずつ馴染んでくる気がするんです。

実はソフトウェアアーキテクチャには、クリーンアーキテクチャ以外にもいろいろあります。

  • レイヤードアーキテクチャ(Layered Architecture):層を上から下に積み重ねる構造
  • ヘキサゴナルアーキテクチャ(Hexagonal Architecture):ポートとアダプタで外部をつなぐ構造
  • オニオンアーキテクチャ(Onion Architecture):クリーンアーキテクチャに近い玉ねぎ構造

この記事でクリーンアーキテクチャに一度触れておくと、別のアーキテクチャに出会っても「これも役割分担の方法のひとつなんだな」と、少し自信が持てると思います。

読んでいただき、ありがとうございました 🌻

 

参考資料


 

ニフティでは、
さまざまなプロダクトへ挑戦する
エンジニアを絶賛募集中です!
ご興味のある方は以下の採用サイトより
お気軽にご連絡ください!

ニフティに興味をお持ちの方は
キャリア登録をぜひお願いいたします!

connpassでニフティグループに
参加いただくと
イベントの
お知らせが届きます!