はじめに
Spring Boot の Web アプリや API を作るとき、
最初に触れるのが Controller 層 です。
でも、こんな疑問を持つ方は多いです。
- Controller って何をする場所?
- どこまで書いていいの?
- Service とどう役割分担するの?
この記事では、Controller 層の役割を
やさしく・実務寄り で整理していきます。
まずは全体像から見ていきましょう。
Controller 層とは
一言でいうと、
「リクエストを受け取り、Service に処理を依頼し、レスポンスを返す“受付係”」
です。
三層アーキテクチャでは、
- Controller → 受付
- Service → 業務ロジック
- Repository → データアクセス
という役割分担になっています。
Controller は“入り口”であり、 アプリの外と中をつなぐ層です
Controller 層の役割を具体的に整理する
リクエストを受け取る
HTTP リクエストを受け取り、
どのメソッドを呼ぶかを決めるのが Controller の役割です。
@GetMapping("/users/{id}")
public UserResponse getUser(@PathVariable Long id) { ... }- URL
- HTTP メソッド(GET / POST / PUT / DELETE)
- パラメータ(Path / Query / Body)
これらを受け取るのが Controller です。
パラメータを受け取り、整形する
Controller は入力値を受け取り、
必要に応じて DTO に変換します。
@PostMapping("/users")
public UserResponse create(@RequestBody UserRequest request) { ... }- @RequestBody
- @RequestParam
- @PathVariable
などを使って、入力を受け取ります。
Service 層に処理を依頼する
Controller は自分でロジックを書かず、
Service に処理を委ねる のが基本です。
return userService.findUser(id);Controller は“司令塔”ではなく、
“受付 → 案内係”です。
レスポンスを返す
Service から返ってきた結果を、
レスポンスとして返します。
return ResponseEntity.ok(response);- JSON
- ステータスコード
- ヘッダー
などを整えるのが Controller の役割です。
入力チェック(形式的なもの)を行う
業務ロジックではなく、
形式的なバリデーション は Controller の役割です。
public UserResponse create(@Valid @RequestBody UserRequest request)- 必須チェック
- 文字数チェック
- メール形式チェック
などは DTO + Validation で行います。
Controller 層に書かないこと
業務ロジック
NG
if (user.getAge() < 20) { ... }これは Service の役割です。
DB アクセス
NG
userRepository.findById(id);Repository の役割です。
複雑な計算やルール
NG
price = base - discount + tax;Service に書くべき処理です。
トランザクション管理
@Transactional は Service に付けます。
実務でよくあるアンチパターン
Controller が太る(Fat Controller)
- ロジックを書きすぎる
- DTO の変換を全部やる
- 条件分岐だらけになる
→ 保守が難しくなります。
Service が薄くなる(ただの中継)
return repository.findById(id);→ Controller にロジックが寄ってしまう原因です。
Controller で例外処理をしすぎる
例外は ControllerAdvice に任せるのが基本です。
Controller 層をもっと活かすポイント
DTO を使って入力と出力を明確にする
public UserResponse getUser(Long id)ResponseEntity でレスポンスを整える
return ResponseEntity.status(201).body(response);ControllerAdvice と組み合わせる
例外処理を Controller から切り離せます。
まとめ
Controller 層は、
「リクエストを受け取り、Service に処理を依頼し、レスポンスを返す層」
です。
- 受付係
- パラメータの受け取り
- Service の呼び出し
- レスポンスの返却
- 形式的なバリデーション
難しく聞こえますが、
「Controller は受付、Service は頭脳、Repository はデータ係」
と理解できれば十分です。

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

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

コメント