0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Spring BootはMVCモデルなの?レイヤードアーキテクチャなの?

0
Posted at

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

というリクエストが来たら、

  1. Modelへ処理を依頼
  2. 結果を取得
  3. 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) → データを表現する

という役割を意識すると理解しやすいでしょう。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?