カテゴリ: SpringのWeb開発(Spring MVC) 更新日: 2025/12/22

@Controller と @RestController の違いを完全解説!初心者向けSpring MVC入門

@Controller, @RestController の違い
@Controller, @RestController の違い

新人と先輩の会話形式で理解しよう

新人

「Springの@Controllerと@RestControllerって何が違うんですか?」

先輩

「Spring MVCでは、Webアプリケーションを作るときにコントローラを定義するんだけど、そのときに使うのが@Controllerと@RestControllerだよ。」

新人

「じゃあ、この2つのアノテーションは同じものなんですか?」

先輩

「いや、似ているけど用途が違うんだ。まずはそれぞれの役割を説明するね!」

1. @Controller, @RestController とは?

1. @Controller, @RestController とは?
1. @Controller, @RestController とは?

Spring Frameworkでは、Webアプリケーションを開発するときに、リクエストを処理するためのクラスを「コントローラ」と呼びます。このコントローラを作成する際に使用するアノテーションが@Controller@RestControllerです。

それぞれのアノテーションの基本的な役割を説明すると、以下のようになります。

  • @Controller:HTMLページ(Thymeleafなど)を返すコントローラ
  • @RestController:JSONやXMLデータを返すREST API用のコントローラ

簡単にいうと、@Controllerは主にWebページを表示するためのコントローラであり、@RestControllerはAPIを作るためのコントローラです。

2. それぞれの役割と用途

2. それぞれの役割と用途
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を使った例)

3. @Controller の具体的な使い方(Thymeleafを使った例)
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を提供する例)

4. @RestController の具体的な使い方(REST APIを提供する例)
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. それぞれのデータの返却方法の違い

5. それぞれのデータの返却方法の違い
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 の使い分けのポイント

6. @Controller と @RestController の使い分けのポイント
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. 実際の開発でどちらを選ぶべきか?

7. 実際の開発でどちらを選ぶべきか?
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の学習を深めるためのおすすめの方法

8. Spring Bootの学習を深めるためのおすすめの方法
8. Spring Bootの学習を深めるためのおすすめの方法

Spring Boot の学習をさらに深めるために、以下の方法を試してみてください。

1. Spring Boot の公式ドキュメントを読む

Spring の公式ドキュメントには、最新の情報が整理されており、詳細な解説が掲載されています。

Spring Boot 公式ドキュメント

2. ハンズオン形式のチュートリアルを試す

実際に手を動かしてコードを書いてみるのが一番の学習方法です。Spring Boot のサンプルプロジェクトを作りながら学習しましょう。

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 を併用したミニアプリを作ってみるとさらに理解が深まるよ。」

生徒:「はい!今回のまとめを参考にしながら、次のステップに挑戦してみます。」

この記事を読んだ人からの質問

この記事を読んだ人からの質問
この記事を読んだ人からの質問

プログラミング初心者からのよくある疑問/質問を解決します

Springの@Controllerアノテーションとは何ですか?

@ControllerはSpring MVCでWebアプリケーションを開発する際に、HTMLページを返すためのコントローラクラスを定義するアノテーションです。Thymeleafなどのテンプレートエンジンと組み合わせて使用します。
コメント
コメント投稿は、ログインしてください

まだ口コミはありません。

カテゴリの一覧へ
新着記事
New1
Spring認証(Spring Security)
ブラウザからのフォーム送信とは?HTTPリクエストの基礎を初心者向けに解説!
New2
Thymeleaf
ThymeleafでJavaScriptコメントを正しく書こう!初心者向け徹底解説
New3
SpringのDB操作
Spring Boot + MySQLでCRUDアプリを作ろう!初心者向けにデータベース操作を完全解説
New4
Springの基本
@SpringBootApplicationの仕組みと役割を徹底解説!初心者でもわかるSpring Bootの基本
人気記事
No.1
Java&Spring記事人気No1
SpringのWeb開発(Spring MVC)
ルーティングとは?基本概念(Spring MVCのURL制御を理解)
No.2
Java&Spring記事人気No2
Thymeleaf
Thymeleaf とは?初心者向けにThymeleafの基本を徹底解説
No.3
Java&Spring記事人気No3
Springの基本
application.properties と YAML の基本をやさしく解説!初心者向けSpring Boot設定ファイル入門
No.4
Java&Spring記事人気No4
Springの基本
Spring Bootの環境変数の設定方法をやさしく解説!初心者向けapplication.propertiesの使い方
No.5
Java&Spring記事人気No5
Springの基本
Spring Bootのデフォルトログ設定を徹底解説(Logback / SLF4J)
No.6
Java&Spring記事人気No6
SpringのDB操作
JPAの標準クエリメソッド(findById, findAll)を完全解説!初心者でもわかるデータ取得の基本
No.7
Java&Spring記事人気No7
Spring認証(Spring Security)
セッション管理の基本(@SessionAttributes)を完全解説!初心者でもわかるセッションの仕組み
No.8
Java&Spring記事人気No8
SpringのWeb開発(Spring MVC)
ループ処理(th:each)の基本を完全ガイド!Thymeafの繰り返し処理の使い方