Spring Bootの学習を始めると、
- MVCモデル
- Controller
- Service
- Repository
といった言葉が頻繁に登場します。
私自身も学習中に、
「ControllerはMVCのControllerなのは分かるけど、ServiceやRepositoryは何なんだろう?」
「Spring BootってMVCモデルなの?それとも違う設計なの?」
という疑問を持ちました。
この記事では、Spring Bootでよく使われる構成とMVCモデルの関係について、解説します。
MVCモデルとは?
MVCとは、アプリケーションの役割を3つに分けて開発する考え方です。
MVCは以下の略称です。
| 名称 | 役割 |
|---|---|
| Model | データや業務ロジック |
| View | 画面表示 |
| Controller | リクエストの制御 |
図にすると以下のようになります。
ユーザー
↓
Controller
↓
Model
↓
View
それぞれの役割を見てみましょう。
Model
Modelはアプリケーションの中心となる部分です。
例えば、
- ユーザー情報
- 商品情報
- 注文情報
などのデータを扱います。
また、
- ログイン判定
- 在庫チェック
- 合計金額計算
といった業務ロジックも担当します。
View
Viewは画面表示を担当します。
例えば、
- HTML
- JSP
- Thymeleaf
などです。
ユーザーが見る画面を生成します。
Controller
Controllerはユーザーからのリクエストを受け取ります。
例えば、
GET /users/1
というリクエストが来たら、
- Modelへ処理を依頼
- 結果を取得
- Viewへ渡す
という役割を持っています。
Spring Bootの構成を見てみよう
Spring Bootでは以下のような構成をよく見かけます。
controller/
service/
repository/
domain/
初心者の頃は、
MVCならModel、View、Controllerの3つじゃないの?
と思うかもしれません。
実はSpring Bootでは、Modelの役割をさらに細かく分割しています。
Spring Bootの各クラスの役割
Controller
@RestController
@RequestMapping("/users")
public class UserController {
@GetMapping("/{id}")
public User getUser(@PathVariable Long id) {
return userService.findById(id);
}
}
役割
- HTTPリクエストを受け取る
- Serviceを呼び出す
- レスポンスを返す
MVCでいうControllerそのものです。
Service
@Service
public class UserService {
public User findById(Long id) {
return repository.findById(id)
.orElseThrow();
}
}
役割
- 業務ロジックを実装する
- Repositoryを呼び出す
- トランザクションを管理する
例えば、
- 会員登録
- ログイン処理
- 注文処理
などを実装します。
Repository
@Repository
public interface UserRepository
extends JpaRepository<User, Long> {
}
役割
- データベースアクセス
- CRUD処理
- SQL実行
データの保存や取得を担当します。
Domain(Entity)
@Entity
public class User {
private Long id;
private String name;
// getter / setter
}
役割
- 業務データを表現する
- アプリケーション内で扱うデータを保持する
例えば、
- User
- Product
- Order
などがあります。
MVCに当てはめるとどうなる?
Spring Bootの構成をMVCに当てはめると次のようになります。
| Spring Boot | MVC |
|---|---|
| Controller | Controller |
| Service | Model |
| Repository | Model |
| Domain(Entity) | Model |
つまり、
Controller → Controller
Service → Model
Repository → Model
Domain → Model
となります。
Spring Bootでは、Modelの役割を
- Service
- Repository
- Domain
に分割しているだけなのです。
Spring BootはMVCではないの?
結論としては、
Spring BootはMVCを採用しています。
ただし、実際の開発ではMVCだけではなく、
レイヤードアーキテクチャ(Layered Architecture)
という考え方も取り入れています。
レイヤードアーキテクチャとは?
レイヤードアーキテクチャは責務ごとに層を分ける設計方法です。
Spring Bootではよく次のような構成になります。
Controller
↓
Service
↓
Repository
↓
Database
それぞれの役割を分離することで、
- コードが読みやすい
- 保守しやすい
- テストしやすい
というメリットがあります。
MVCとレイヤードアーキテクチャの関係
Spring Bootを一言で表すと、
Spring MVC
+
レイヤードアーキテクチャ
です。
Web部分はMVCで動いています。
Client
↓
Controller
↓
Model
↓
View
しかし実際のModelはさらに細かく分割され、
Controller
↓
Service
↓
Repository
↓
Database
という構成になっています。
REST APIの場合はViewが見えにくい
最近のSpring Boot開発ではREST APIを作ることが多いです。
例えば、
@RestController
public class UserController {
@GetMapping("/users")
public List<User> getUsers() {
return service.findAll();
}
}
この場合はHTML画面を返すのではなく、
[
{
"id": 1,
"name": "Taro"
}
]
のようなJSONを返します。
そのため、
「Viewが存在しないように見える」
ことがあります。
実際には、
SpringがJSONへ変換する処理がViewの役割を担っています。
まとめ
Spring BootはMVCモデルを採用しています。
しかし実際の開発では、Modelの責務を細かく分割したレイヤードアーキテクチャで実装することが一般的です。
対応関係をまとめると、
| Spring Boot | MVC |
|---|---|
| Controller | Controller |
| Service | Model |
| Repository | Model |
| Domain(Entity) | Model |
| Thymeleaf / JSON | View |
つまり、
Spring Boot = MVC + レイヤードアーキテクチャ
と理解しておくと、ControllerやService、Repositoryの役割が整理しやすくなります。
Spring Bootを学び始めたばかりの方は、
まずは
- Controller → リクエストを受け取る
- Service → 業務ロジックを書く
- Repository → DBアクセスする
- Domain(Entity) → データを表現する
という役割を意識すると理解しやすいでしょう。