はじめに
Spring Boot で Web アプリや API を作っていると、
@RestController と @Controller の 2 つをよく目にします。
「どっちを使えばいいの?」
「違いはなんとなく知ってるけど、説明できない…」
「API と画面でどう使い分けるの?」
そんな疑問を持つ方も多いと思います。
この記事では、@RestController と @Controller の違いを
やさしく・実務で役立つ形 で整理していきます。
まずはコードを見て、そこから少しずつ理解していきましょう。
まずはコードを確認
@RestController の例(API 用)
@RestController
public class HelloApiController {
@GetMapping("/hello")
public String hello() {
return "Hello World";
}
}@Controller の例(画面表示用)
@Controller
public class HelloPageController {
@GetMapping("/hello")
public String hello() {
return "hello"; // hello.html を返す
}
}同じように見えますが、
返しているものがまったく違う
というのがポイントです。
@RestController と @Controller の違いを一言でいうと…
- @RestController → 戻り値がそのままレスポンス(JSON / 文字列)になる
- @Controller → 戻り値は View(HTML テンプレート)として扱われる
このイメージが一番わかりやすいです。
もう少し深く理解する
@RestController は @ResponseBody のセット
@RestControllerこれは内部的に
@Controller + @ResponseBody のセットになっています。
つまり、
- @Controller → Web の入り口
- @ResponseBody → 戻り値をそのままレスポンスにする
この 2 つをまとめたものが @RestController です。
@Controller は画面(View)を返すためのもの
return "hello";と書くと、 templates/hello.html を探して返します。
Thymeleaf や Freemarker などのテンプレートエンジンと組み合わせて使います。
実務での使い分け
API を作るなら @RestController
- JSON を返す
- モバイルアプリやフロントエンド(React/Vue)向け
- 外部システムとの連携
画面を返すなら @Controller
- HTML を返す
- 管理画面
- サーバーサイドレンダリングの Web アプリ
用途がまったく違うので、
どちらを使うかは「何を返したいか」で決まる
というのが実務的な考え方です。
よくある疑問をやさしく整理
Q. @Controller で JSON を返したいときは?
A. メソッドに @ResponseBody を付ければ OK です。
@Controller
public class SampleController {
@ResponseBody
@GetMapping("/json")
public String json() {
return "hello";
}
}Q. @RestController で View を返せる?
A. 基本的には返せません。
戻り値はすべてレスポンスボディとして扱われます。
Q. どちらを使うか迷ったら?
A. API → @RestController、画面 → @Controller
このルールでほぼ迷いません。
あわせて知っておきたいポイント
@RestController は JSON 変換が自動
オブジェクトを返すと自動で JSON に変換されます。
return new User("taro", 20);@Controller は Model と組み合わせる
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」
と理解できれば十分です。

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

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

コメント