@Controller と @RestController の違いを完全解説!初心者向けSpring MVC入門
新人
「Springの@Controllerと@RestControllerって何が違うんですか?」
先輩
「Spring MVCでは、Webアプリケーションを作るときにコントローラを定義するんだけど、そのときに使うのが@Controllerと@RestControllerだよ。」
新人
「じゃあ、この2つのアノテーションは同じものなんですか?」
先輩
「いや、似ているけど用途が違うんだ。まずはそれぞれの役割を説明するね!」
1. @Controller, @RestController とは?
Spring Frameworkでは、Webアプリケーションを開発するときに、リクエストを処理するためのクラスを「コントローラ」と呼びます。このコントローラを作成する際に使用するアノテーションが@Controllerと@RestControllerです。
それぞれのアノテーションの基本的な役割を説明すると、以下のようになります。
- @Controller:HTMLページ(Thymeleafなど)を返すコントローラ
- @RestController:JSONやXMLデータを返すREST API用のコントローラ
簡単にいうと、@Controllerは主にWebページを表示するためのコントローラであり、@RestControllerはAPIを作るためのコントローラです。
2. それぞれの役割と用途
次に、@Controllerと@RestControllerの具体的な役割と使い方を見てみましょう。
@Controllerの役割
@Controllerは、Webアプリケーションの画面を表示するために使われます。例えば、Thymeleafなどのテンプレートエンジンと組み合わせて、ユーザーにHTMLを返す場合に使用します。
以下の例は、@Controllerを使ってThymeleafテンプレートを表示する例です。
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HomeController {
@GetMapping("/home")
public String home(Model model) {
model.addAttribute("message", "こんにちは、Spring MVC!");
return "home"; // home.html というテンプレートを表示
}
}
このコードでは、@Controllerを使用し、/homeにアクセスしたときにhome.htmlというテンプレートを表示します。
@RestControllerの役割
@RestControllerは、Webページを表示するのではなく、JSONやXMLといったデータを返すために使用します。REST APIを作成するときによく使われます。
以下の例は、@RestControllerを使ってJSONデータを返す例です。
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api")
public class ApiController {
@GetMapping("/message")
public String getMessage() {
return "こんにちは、REST API!";
}
}
このコードでは、@RestControllerを使用し、/api/messageにアクセスすると「こんにちは、REST API!」という文字列をJSON形式で返します。
3. @Controller の具体的な使い方(Thymeleafを使った例)
@Controller を使用すると、HTMLテンプレートを返すことができます。Spring MVCでは、Thymeleafなどのテンプレートエンジンと組み合わせてWebページを表示することが一般的です。
以下の例では、Thymeleafを使用して簡単なWebページを表示する@Controllerのコードを示します。
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class GreetingController {
@GetMapping("/greeting")
public String greeting(Model model) {
model.addAttribute("message", "こんにちは、Spring MVC!");
return "greeting"; // greeting.html を表示
}
}
このコードでは、/greeting にアクセスすると、greeting.html が表示され、"こんにちは、Spring MVC!" というメッセージが画面に表示されます。
Thymeleafテンプレートの例
次に、Thymeleafのテンプレート(greeting.html)の例を示します。
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>挨拶ページ</title>
</head>
<body>
<h1 th:text="${message}">デフォルトのメッセージ</h1>
</body>
</html>
このように、@Controller は HTML ページを返す役割を担い、Thymeleaf などのテンプレートエンジンと組み合わせて使用します。
4. @RestController の具体的な使い方(REST APIを提供する例)
@RestController を使用すると、HTMLではなく JSON 形式のデータを返すことができます。これは、WebAPI(REST API)を作成する際に使用されます。
以下の例では、JSON 形式のメッセージを返す @RestController のコードを示します。
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api")
public class ApiGreetingController {
@GetMapping("/greeting")
public String getGreeting() {
return "こんにちは、REST API!";
}
}
このコードでは、/api/greeting にアクセスすると、"こんにちは、REST API!" というテキストを JSON 形式で返します。
実行結果
ブラウザやAPIツール(Postmanなど)で http://localhost:8080/api/greeting にアクセスすると、次のようなレスポンスが返されます。
"こんにちは、REST API!"
@RestController を使うと、JSON や XML のデータを簡単に返すことができ、フロントエンドや他のサービスと連携しやすくなります。
5. それぞれのデータの返却方法の違い
@Controller と @RestController では、データの返し方が大きく異なります。以下のポイントを理解しましょう。
@Controller の返却方法(HTMLを返す)
- Thymeleaf などのテンプレートエンジンを使用する
- 返却値はテンプレートのファイル名
- ユーザーがブラウザでアクセスすると HTML ページが表示される
例:
@Controller
public class PageController {
@GetMapping("/page")
public String showPage() {
return "mypage"; // mypage.html を表示
}
}
@RestController の返却方法(JSONを返す)
- JSON や XML 形式のデータを直接返す
- API クライアント(フロントエンド、モバイルアプリなど)と連携しやすい
- ブラウザで直接アクセスすると JSON のレスポンスが表示される
例:
@RestController
public class JsonController {
@GetMapping("/json")
public String getJson() {
return "{\"message\":\"JSON データです\"}";
}
}
実際の使い分け
以下のように考えると、@Controller と @RestController を適切に使い分けられます。
- @Controller を使う場合: Webアプリケーションで HTML ページを表示したいとき
- @RestController を使う場合: フロントエンド(React, Vue.js など)やモバイルアプリにデータを提供する API を作成したいとき
この違いを理解し、適切に使い分けることで、Spring MVC の開発がスムーズになります。
6. @Controller と @RestController の使い分けのポイント
@Controller と @RestController の違いが分かったところで、実際にどのように使い分けるべきかを見ていきましょう。
1. HTMLページを表示する場合は @Controller
ユーザーに HTML ページを表示したい場合は、@Controller を使います。Spring Boot では、Thymeleaf などのテンプレートエンジンと組み合わせて使用します。
2. JSON や XML のデータを返す場合は @RestController
フロントエンド(React, Vue.js など)やモバイルアプリ向けにデータを提供する場合は、@RestController を使って REST API を作成します。
3. @Controller に @ResponseBody をつければ JSON も返せる
@Controller を使いながら、@ResponseBody をメソッドに付けることで JSON を返すこともできます。ただし、@RestController を使う方がシンプルで直感的です。
例えば、@Controller で JSON を返す場合は次のようになります。
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.stereotype.Controller;
@Controller
public class JsonExampleController {
@GetMapping("/json-example")
@ResponseBody
public String getJsonData() {
return "{\"message\": \"これは JSON データです\"}";
}
}
しかし、@RestController を使えば @ResponseBody を付ける必要はなく、より簡潔に記述できます。
7. 実際の開発でどちらを選ぶべきか?
実際のプロジェクトでは、以下の基準で @Controller と @RestController を選ぶことが重要です。
@Controller を選ぶケース
- Thymeleaf や JSP などを使って HTML をレンダリングしたい場合
- サーバーサイドレンダリング(SSR)を行う Web アプリケーションを開発する場合
- 画面遷移がある一般的な Web アプリケーションを作る場合
@RestController を選ぶケース
- フロントエンド(React, Vue.js)と連携する REST API を作る場合
- モバイルアプリ向けの API を開発する場合
- 他のマイクロサービスとデータをやり取りする API を作る場合
以下の表にまとめました。
| 用途 | @Controller | @RestController |
|---|---|---|
| HTML ページを表示 | 〇 | × |
| JSON / XML を返す | △(@ResponseBody が必要) | 〇 |
| フロントエンドと連携 | △(HTML のみ) | 〇 |
| API サーバーとして使用 | × | 〇 |
このように、どのようなアプリケーションを作るのかによって適切なアノテーションを選ぶことが重要です。
8. Spring Bootの学習を深めるためのおすすめの方法
Spring Boot の学習をさらに深めるために、以下の方法を試してみてください。
1. Spring Boot の公式ドキュメントを読む
Spring の公式ドキュメントには、最新の情報が整理されており、詳細な解説が掲載されています。
2. ハンズオン形式のチュートリアルを試す
実際に手を動かしてコードを書いてみるのが一番の学習方法です。Spring Boot のサンプルプロジェクトを作りながら学習しましょう。
3. Spring Boot に関する書籍を読む
入門書を読むことで、基礎から体系的に学ぶことができます。特に初心者向けの書籍がおすすめです。
4. GitHub のオープンソースプロジェクトを読む
実際のプロジェクトで Spring Boot がどのように使われているのかを知るには、オープンソースプロジェクトを読むのが有効です。
5. コミュニティに参加して質問する
分からないことがあれば、Qiita や Stack Overflow で質問してみましょう。
Stack Overflow - Spring Boot タグ
以上の方法を活用しながら、Spring Boot の知識を深めていきましょう!
まとめ
Spring MVC における @Controller と @RestController の違いを振り返ると、どちらも「リクエストを受け取って処理する」という役割は共通しているものの、返すものが大きく異なる点が分かります。画面表示を目的とする場合には @Controller を使い、サーバー側で生成したデータをそのまま返す API では @RestController を使います。この明確な役割の違いを押さえることで、Spring Boot を使った Web 開発がぐっと理解しやすくなり、HTML レンダリング、REST API 設計、データ連携など、さまざまな場面に応じた適切な実装ができるようになります。
特に、テンプレートエンジンである Thymeleaf と組み合わせた @Controller の活用は、画面を持つ一般的な Web アプリケーションで非常に重要です。一方、React や Vue.js などのフロントエンドフレームワークと連携する場合には、@RestController を利用して JSON データを返すことが基本となります。開発の場面に応じて柔軟に使い分けることができれば、Spring MVC の構造がより自然に理解できるようになります。
また、今回の記事を通して、@Controller に @ResponseBody を付けることで JSON を返せること、逆に HTML を返したい場合は @RestController を使うと逆に扱いにくくなることなど、細かい仕様の違いも整理してきました。実際の開発では、画面遷移や API の役割を考えながらアノテーションを選択することが大切です。特に API と画面表示が混在するようなアプリケーションでは、それぞれの役割に応じたコントローラクラスを分けることで、構成がとても分かりやすくなります。
最後に、下記に @Controller と @RestController を組み合わせたサンプルコードを示します。画面表示と API 返却を同じプロジェクト内で共存させる場合、このように役割を分けて整理すると構造が理解しやすくなります。
@Controller
public class SamplePageController {
@GetMapping("/info")
public String showInfoPage(Model model) {
model.addAttribute("title", "Spring MVC 情報ページ");
model.addAttribute("detail", "これは @Controller を使った HTML ページです。");
return "info";
}
}
@RestController
@RequestMapping("/api")
public class SampleApiController {
@GetMapping("/info")
public Map<String, String> getInfoJson() {
Map<String, String> map = new HashMap<>();
map.put("title", "Spring MVC API 情報");
map.put("detail", "これは @RestController を使った JSON データです。");
return map;
}
}
このように、同じ「情報」を扱っていても、目的が画面表示なら @Controller、データ提供なら @RestController を選びます。この区別が理解できれば、Spring MVC の基本構造がしっかり身につき、今後の開発に大きく役立つはずです。初学者のうちは混乱しやすい部分ですが、今回のまとめを参考にすると、自然と整理されていくでしょう。
今後のステップとしては、実際に簡単な画面と API を作り、URL ごとにどのように動作が変わるのかを体験することで、理解がさらに深まります。Spring Framework の基盤となる考え方を押さえておけば、認証、データベース連携、REST 構成など応用的な内容にもスムーズに進むことができます。ぜひ手を動かしながら、今回の知識を実践へつなげてみてください。
生徒:「今日の内容で、@Controller と @RestController の使い分けがすごくよく分かりました!返す内容が HTML か JSON かで大きく役割が変わるんですね。」
先生:「そのとおり。どちらも同じ“コントローラ”ではあるけれど、用途が違うから適材適所で使うことが大切なんだ。」
生徒:「特に、HTML を返すときはテンプレート名を返すっていう仕組みが新鮮でした。REST API のほうは返り値がそのままレスポンスになるんですよね。」
先生:「そうそう。@RestController はデータを返すためのコントローラだから、画面表示を伴う処理とは役割が違うんだよ。」
生徒:「実務でもプロジェクトによって画面中心だったり API 中心だったりしますし、こういう知識があると作り分けがスムーズになりそうです。」
先生:「まさにその通り。Spring Boot では両方のパターンを同時に扱うことも多いから、今回の内容はとても重要なんだ。次の学習では、実際に画面と API を併用したミニアプリを作ってみるとさらに理解が深まるよ。」
生徒:「はい!今回のまとめを参考にしながら、次のステップに挑戦してみます。」