【Spring Boot】Controller層の役割をやさしく解説

Java入門・実践
スポンサーリンク
スポンサーリンク

はじめに

Spring Boot の Web アプリや API を作るとき、
最初に触れるのが Controller 層 です。

でも、こんな疑問を持つ方は多いです。

  • Controller って何をする場所?
  • どこまで書いていいの?
  • Service とどう役割分担するの?

この記事では、Controller 層の役割を
やさしく・実務寄り で整理していきます。

まずは全体像から見ていきましょう。


Controller 層とは

一言でいうと、

「リクエストを受け取り、Service に処理を依頼し、レスポンスを返す“受付係”」

です。

三層アーキテクチャでは、

  • Controller → 受付
  • Service → 業務ロジック
  • Repository → データアクセス

という役割分担になっています。

Controller は“入り口”であり、 アプリの外と中をつなぐ層です


Controller 層の役割を具体的に整理する

リクエストを受け取る

HTTP リクエストを受け取り、
どのメソッドを呼ぶかを決めるのが Controller の役割です。

Java
@GetMapping("/users/{id}")
public UserResponse getUser(@PathVariable Long id) { ... }
  • URL
  • HTTP メソッド(GET / POST / PUT / DELETE)
  • パラメータ(Path / Query / Body)

これらを受け取るのが Controller です。

パラメータを受け取り、整形する

Controller は入力値を受け取り、
必要に応じて DTO に変換します。

Java
@PostMapping("/users")
public UserResponse create(@RequestBody UserRequest request) { ... }
  • @RequestBody
  • @RequestParam
  • @PathVariable

などを使って、入力を受け取ります。

Service 層に処理を依頼する

Controller は自分でロジックを書かず、
Service に処理を委ねる のが基本です。

Java
return userService.findUser(id);

Controller は“司令塔”ではなく、
“受付 → 案内係”です。

レスポンスを返す

Service から返ってきた結果を、
レスポンスとして返します。

Java
return ResponseEntity.ok(response);
  • JSON
  • ステータスコード
  • ヘッダー

などを整えるのが Controller の役割です。

入力チェック(形式的なもの)を行う

業務ロジックではなく、
形式的なバリデーション は Controller の役割です。

Java
public UserResponse create(@Valid @RequestBody UserRequest request)
  • 必須チェック
  • 文字数チェック
  • メール形式チェック

などは DTO + Validation で行います。


Controller 層に書かないこと

業務ロジック

NG

Java
if (user.getAge() < 20) { ... }

これは Service の役割です。

DB アクセス

NG

Java
userRepository.findById(id);

Repository の役割です。

複雑な計算やルール

NG

Java
price = base - discount + tax;

Service に書くべき処理です。

トランザクション管理

@Transactional は Service に付けます。


実務でよくあるアンチパターン

Controller が太る(Fat Controller)

  • ロジックを書きすぎる
  • DTO の変換を全部やる
  • 条件分岐だらけになる

→ 保守が難しくなります。

Service が薄くなる(ただの中継)

Java
return repository.findById(id);

→ Controller にロジックが寄ってしまう原因です。

Controller で例外処理をしすぎる

例外は ControllerAdvice に任せるのが基本です。


Controller 層をもっと活かすポイント

DTO を使って入力と出力を明確にする

Java
public UserResponse getUser(Long id)

ResponseEntity でレスポンスを整える

Java
return ResponseEntity.status(201).body(response);

ControllerAdvice と組み合わせる

例外処理を Controller から切り離せます。


まとめ

Controller 層は、
「リクエストを受け取り、Service に処理を依頼し、レスポンスを返す層」
です。

  • 受付係
  • パラメータの受け取り
  • Service の呼び出し
  • レスポンスの返却
  • 形式的なバリデーション

難しく聞こえますが、
「Controller は受付、Service は頭脳、Repository はデータ係」
と理解できれば十分です。


decopon
decopon

Controller の役割を理解すると、
アプリ全体の流れが一気にクリアになります。
役割を分けるだけで、コードが読みやすくなり、
開発も保守もぐっと楽になります。
あなたの開発が、今日より少しだけ楽になりますように。

moco
moco

受付係って、最初に“いらっしゃいませ”って言う人だよね…やさしい役割だね。

コメント

タイトルとURLをコピーしました