【Spring Boot】@RestController と @Controller の違いをやさしく解説

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

はじめに

Spring Boot で Web アプリや API を作っていると、
@RestController@Controller の 2 つをよく目にします。

「どっちを使えばいいの?」
「違いはなんとなく知ってるけど、説明できない…」
「API と画面でどう使い分けるの?」

そんな疑問を持つ方も多いと思います。

この記事では、@RestController と @Controller の違いを
やさしく・実務で役立つ形 で整理していきます。

まずはコードを見て、そこから少しずつ理解していきましょう。

まずはコードを確認

@RestController の例(API 用)

Java
@RestController
public class HelloApiController {

    @GetMapping("/hello")
    public String hello() {
        return "Hello World";
    }
}

@Controller の例(画面表示用)

Java
@Controller
public class HelloPageController {

    @GetMapping("/hello")
    public String hello() {
        return "hello"; // hello.html を返す
    }
}

同じように見えますが、
返しているものがまったく違う
というのがポイントです。

@RestController と @Controller の違いを一言でいうと…

  • @RestController → 戻り値がそのままレスポンス(JSON / 文字列)になる
  • @Controller → 戻り値は View(HTML テンプレート)として扱われる

このイメージが一番わかりやすいです。

もう少し深く理解する

@RestController は @ResponseBody のセット

Java
@RestController

これは内部的に
@Controller + @ResponseBody のセットになっています。

つまり、

  • @Controller → Web の入り口
  • @ResponseBody → 戻り値をそのままレスポンスにする

この 2 つをまとめたものが @RestController です。

@Controller は画面(View)を返すためのもの

Java
return "hello";

と書くと、
templates/hello.html を探して返します。

Thymeleaf や Freemarker などのテンプレートエンジンと組み合わせて使います。

実務での使い分け

API を作るなら @RestController

  • JSON を返す
  • モバイルアプリやフロントエンド(React/Vue)向け
  • 外部システムとの連携

画面を返すなら @Controller

  • HTML を返す
  • 管理画面
  • サーバーサイドレンダリングの Web アプリ

用途がまったく違うので、
どちらを使うかは「何を返したいか」で決まる
というのが実務的な考え方です。

よくある疑問をやさしく整理

Q. @Controller で JSON を返したいときは?

A. メソッドに @ResponseBody を付ければ OK です。

Java
@Controller
public class SampleController {

    @ResponseBody
    @GetMapping("/json")
    public String json() {
        return "hello";
    }
}

Q. @RestController で View を返せる?

A. 基本的には返せません。
戻り値はすべてレスポンスボディとして扱われます。

Q. どちらを使うか迷ったら?

A. API → @RestController、画面 → @Controller
このルールでほぼ迷いません。

あわせて知っておきたいポイント

@RestController は JSON 変換が自動

オブジェクトを返すと自動で JSON に変換されます。

Java
return new User("taro", 20);

@Controller は Model と組み合わせる

Java
model.addAttribute("name", "taro");
return "hello";

画面に値を渡すときに使います。

Spring MVC の流れの中で役割が違う

  • @Controller → ViewResolver が動く
  • @RestController → HttpMessageConverter が動く

裏側の仕組みも異なります。

使うときに気をつけたいこと

API と画面を混在させない

同じ Controller に両方書くと混乱のもとになります。

@RestController に View 名を返さない

文字列がそのままレスポンスとして返ってしまいます。

役割を明確にする

  • api パッケージ → @RestController
  • web パッケージ → @Controller

のように分けると保守性が上がります。

まとめ

@RestController と @Controller は、
「何を返すか」で役割がはっきり分かれています。

  • @RestController → JSON / 文字列を返す(API 用)
  • @Controller → HTML を返す(画面用)
  • @RestController は @ResponseBody のセット
  • 迷ったら「返したいもの」で選ぶ

難しく聞こえますが、
「API なら RestController、画面なら Controller」
と理解できれば十分です。


decopon
decopon

@RestController と @Controller の違いを理解すると、
Spring MVC の世界が一気にクリアになります。
API と画面の役割を分けるだけで、設計がとてもきれいになります。
あなたの開発が、今日より少しだけ楽になりますように。

moco
moco

返すものが違うだけで、こんなに役割が変わるんだね…かわいい違いだね。

コメント

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