― フロントエンドからバックエンド、DBまでつながる流れとController/Service/Repositoryの役割分担
Webやアプリサービスで、ユーザーがリクエストを送り、その結果を受け取るプロセスは
実際のレストランでお客様が注文し、料理を受け取る流れと非常によく似ています。
今回は「フロントエンドからバックエンド、DB」までの全体的な流れと、
なぜController / Service / Repositoryの構造を分けるのかについて説明します。
1️⃣ お客様がレストランへ入店 → フロントエンド
お客様がレストランに入り、席に座ってメニューを見ます。
どの料理を注文するか決めて、オーダーの準備をします。
- 開発でのたとえ:
- お客様 = ユーザー
- レストランホール・メニューボード(*ウェブサーバーからのデータ) = フロントエンド(UI/UX)
- ユーザーがボタンをクリックしたりフォームを入力したりする行為=リクエスト(Request)の準備
フロントエンドはユーザーに画面(UI)を表示し、操作を可能にします。
2️⃣ 注文の伝達 → API / Controller
お客様がメニューを選んで「注文」ボタンを押すと、
スタッフ(API)が注文票をキッチンに渡します。
- 開発でのたとえ:
- スタッフ = API
- 注文票の受け渡し = HTTPリクエスト(Request)
ここでControllerが登場します。
Controllerの役割は、「どのリクエストかを判別し、次の工程に渡す中継地点」です。
🍽 たとえ:
「スタッフがシェフに『テーブル3番、リゾット注文です!』と伝える瞬間」
なぜ分けるのか?
注文伝達だけ担当させることで、Controllerが単純な窓口(入口)だけを担い、
ロジックが混在しなくなるため保守性が向上し、流用や再利用もしやすくなります。
3️⃣ 料理の計画 → Service
シェフが注文内容を見て調理手順を決めます。
どの食材を使い、どうやって調理するかを判断します。
- 開発でのたとえ:
- Service = 実際のビジネスロジックを実行する層
- Controllerからの指示を受けて、「何をどう処理するか」決定
なぜServiceを分けるのか?
Serviceがないと、Controllerにすべてのロジックが集中してしまい、
コードが複雑化し修正も難しくなります。
シェフの「調理計画」を独立して管理することで、
メンテナンス性や拡張性が格段に上がります。
4️⃣ 食材の準備 → Repository / DB
調理を始めるには、まず食材を取り出す必要があります。
シェフは冷蔵庫から材料を取り出します。
- 開発でのたとえ:
- 冷蔵庫 = データベース(DB)
- Repository / DAO = 食材を取り出すアシスタントシェフ
- データの参照、保存、更新などDB操作を担当
なぜRepositoryを分離するのか?
DBとのやり取りをServiceから分離することで、
DB構成が変わってもServiceやControllerを修正せずに済みます。
「関心の分離(Separation of Concerns)」によってコード管理が容易になります。
5️⃣ 料理の完成 → Service → Controller → API
食材が揃ったら、シェフはレシピ通りに料理を仕上げます。
完成した料理をスタッフ(API)へ渡します。
- 開発でのたとえ:
- Serviceでロジックを実行し結果を生成
- Controllerがそれをラッピングし、API(Response)で返却
- 動的に作られたデータ(注文履歴、オススメメニュー、決済結果など)がフロントエンドに渡されます
6️⃣ お客様への提供 → フロントエンド
スタッフ(API)が完成した料理をお客様に届け、
ユーザー(お客様)は注文品を受け取り食事を始めます。
- 開発でのたとえ:
- フロントエンドはAPIから受け取ったデータを画面に表示
- ユーザーは結果を確認し、必要なら追加アクションも可能
7️⃣ 全体の流れ(レストランたとえまとめ)
| 段階 | 開発 | レストラン | 分離理由 |
|---|---|---|---|
| 1 | Frontend | お客様がメニューを見て注文準備 | UI/UX提供、入力処理 |
| 2 | Controller | 注文票の伝達 | 入力受付・中継、保守性向上 |
| 3 | Service | 料理計画・調理実施 | ビジネスロジック分離 |
| 4 | Repository/DB | 食材の準備 | DB操作ロジック分離 |
| 5 | Service→Controller→API | 料理の完成→ラッピング→提供 | 結果生成・伝達の明確化 |
| 6 | Frontend | お客様へのサービング / 画面表示 | 結果を正しくユーザーに伝達 |
✅ ポイントまとめ
フロントエンド、Controller、Service、Repository、DB、それぞれの役割を明確に分けることで効率的な開発が実現します。
Controller / Service / Repository構造を採用することで、保守性・再利用性・拡張性を高めることができます。
🧭 次回予告
次回は、レストランが大盛況になり、お客様が行列を作って待っているけれど、
すべての注文を受けきれず、一部のお客様が諦めて帰ってしまう――
そんなときどう対応すればいいのか?をテーマに解説します!