はじめに
「MVCって、なんとなく教材の通りに書いてるけど、自信を持って説明できない…」
を解決するための、学習記録です。
1. そもそも「MVC」はなぜ必要なのか
「役割分担をして、コードをごちゃごちゃにしないため」 です。
もし、1つのファイルに「画面のデザイン(HTML)」「データの処理(Java)」「データベースへのアクセス」を全部書いてしまうと、コードが絡まり、修正したいときにどこを触ればいいか分からなくなってしまいます。
そこで、処理の役割ごとにキレイに部屋を分けたのが MVC です。
2. レストランで例える「MVC」
MVCは、それぞれ以下の略称です。
これをレストランの登場人物に例えると、一気にイメージが湧きます!
- C:Controller(コントローラー) = 「ウェイター(接客係)」
- M:Model(モデル) = 「キッチン(料理人 & 食材)」
- V:View(ビュー) = 「お皿(盛り付けられた料理)」
| 役割 | レストランでの例え | Spring Bootでの主な仕事 |
|---|---|---|
| C (Controller) | ウェイター | ユーザーからのリクエスト(注文)を最初に受け取り、適切な処理をModelに指示する。 |
| M (Model) | キッチン(料理人&食材) | データの計算、ビジネスロジック(処理ルール)、データベースからのデータ取得を行う。 |
| V (View) | お皿(盛り付け) | ユーザーが見る画面(HTML/CSS)。Controllerから渡されたデータを画面に表示する。 |
3. 実際の流れを追ってみる
ユーザーがWebブラウザでページを開いてから、画面が表示されるまでの「裏側の会話」を考えてみます。
【ユーザー】
「メニュー(URL)をポチッ!このページが見たいな(注文)」
↓
【Controller(ウェイター)】
「ご注文ですね!かしこまりました」
「厨房(Model)さん、このデータを作ってください!(調理依頼)」
↓
【Model(キッチン)】
「OK、データベースからデータを取ってきて、きれいに加工したよ(調理完了)」
↓
【Controller(ウェイター)】
「お待たせしました!できたデータ(料理)を持って、お皿(View)に盛り付けます!」
↓
【View(お皿)】
データを盛り付けて、ユーザーに「はい、どうぞ!」と画面を表示する。
このように、「Controller」が全体の司令塔(仲介役) として動いているのがポイントです!
ViewとModelが直接会話することはありません。
4. Spring Bootの超シンプルなコードで見る
「概念はわかったけど、コードだとどう書くの?」という方のために、一番シンプルな例を用意しました。
① Controller(ウェイターの動き)
ユーザーが /hello にアクセスしたときに動く、司令塔のコードです。
package com.example.demo;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
@Controller // ① これがコントローラー(司令塔)だよ!と宣言
public class HelloController {
@GetMapping("/hello") // ② 「/hello」という注文が入ったら…
public String greeting(Model model) {
// ③ Model(データ)を用意する(これがキッチンの仕事に相当)
String message = "今日もプログラミング学習、お疲れ様です!";
// ④ ウェイターがお皿(View)にデータを載せる
model.addAttribute("msg", message);
// ⑤ 「hello(.html)」というお皿(View)を使って盛り付けを指定
return "hello";
}
}
② View(お皿・画面の見た目)
Spring Bootでよく使われる「Thymeleaf(タイムリーフ)」というお皿を使ったHTMLです。
<!DOCTYPE html>
<html xmlns:th="[http://www.thymeleaf.org](http://www.thymeleaf.org)">
<head>
<meta charset="UTF-8">
<title>Hello Page</title>
</head>
<body>
<!-- Controllerが「msg」という名前で載せてくれたデータを取り出して表示する -->
<h1 th:text="${msg}">ここにメッセージが表示されます</h1>
</body>
</html>
何が起きている?
- ユーザーがブラウザで
/helloにアクセス(注文) -
HelloControllerが注文をキャッチ -
"今日もプログラミング学習、お疲れ様です!"というメッセージ(食材・データ)を用意して、modelというお盆に載せる -
return "hello"で、hello.htmlというお皿(View)を呼ぶ -
hello.htmlが、お盆からデータを取り出して画面に表示する。
5. まとめ:これだけ覚えたい
- Controller(C):リクエストの窓口。処理を振り分けるリーダー。
- Model(M):データの処理屋さん。裏方で一番頭を使う場所。
- View(V):画面の見た目。データをはめ込んでユーザーに見せるお皿。
まずは「Controllerが真ん中にいて、Modelにお願いしてデータを作ってもらい、それをViewというお皿に流し込んでるんだな」ということだけ頭に入れて、今後の開発のコードから流れを追ってみて下さい。
【追加】DIやIoCとの関係は?(気になったこと)
「MVCはわかった。でも、Spring Bootの基本である DI や IoC とはどう繋がっているの?」
こういった追加質問を受けても、答えられるようになっておきたいですよね、
結論から言うと、「レストラン(アプリ)の経営をめちゃくちゃ効率化するための、画期的な仕組み」 です。
1. 「DI(依存性の注入)」= キッチンやウェイターの「派遣サービス」
もしDIがないと、Controller(ウェイター)やModel(キッチン)は、自分で自分を準備しなければいけません。
-
DIがない世界:
「ウェイターをやるために、自分で制服とトレイを自腹で買って用意しなきゃ…」
「料理を作るために、自分で調理器具を買い出しに行かなきゃ…」 -
DIがある世界(Spring Boot):
「席についたら、Spring(店長)が必要な道具を全部『はい、これ使いな!』って手渡してくれる」
コードで書く @Autowired やコンストラクタインジェクションは、まさに**「店長(Spring)が必要な道具(Modelなどのインスタンス)をウェイター(Controller)に手渡している(注入している)状態」**です。
これにより、自分で new して道具を作る必要がなくなります!
2. 「IoC(制御の逆転)」= 「すべてを仕切る敏腕マネージャー(店長)」
普通のプログラムは、自分で「あれを動かして、次にこれを動かして…」と命令(制御)します。
しかしSpring Bootでは、プログラムの主導権をSpringフレームワーク側が握っています。これが「制御の逆転(IoC)」です。
-
IoCがない世界(個人経営):
自分が店長。注文が入ったら「おい、A君動け!次はB君だ!」と全部指示する。 -
IoCがある世界(Spring Boot):
Springが敏腕マネージャー(店長)として常駐。
「注文の受付、キッチンの配置、お皿の準備、全部シフト通りに私が自動で回しておくから、みんなは自分の仕事(コードを書くこと)だけに集中して!」という状態。
まとめると…
- MVC は、レストランの 「役割分担(接客・調理・盛り付け)」 。
- DI・IoC は、そのレストランを動かす 「最強のサポートシステム(店長が自動で人を配置し、必要な道具を配ってくれる)」。
この2つが組み合わさることで、私たちは「画面の見た目」や「データ処理のコード」を書くことだけに集中できます。