本文へスキップ
BecomeCoder

Spring / Spring Bootコース · 第4章 Web ― REST APIを作る · レッスン12

@RestController と @Controller の違い

ローカル実施

導入

「Webアプリ」と一口に言っても、HTML画面を返すアプリと、JSONだけを返すAPIサーバーでは役割が異なります。Springはこの2つを、似て非なる2つのアノテーションで区別します。

説明

@Controller は、伝統的な「画面を返す」ためのアノテーションです。メソッドが文字列を返すと、それは表示すべき画面(テンプレート)の名前として扱われます。

@Controller
class PageController {

    @GetMapping("/hello")
    public String hello() {
        return "hello"; // "hello.html" というテンプレートを探して表示する
    }
}

一方、REST APIを作るときに使うのが @RestController です。

@RestController
class UserApiController {

    @GetMapping("/api/users/1")
    public User getUser() {
        return new User(1L, "山田太郎"); // このオブジェクトがそのままJSONに変換されて返る
    }
}

@RestController は、@Controller@ResponseBody を組み合わせたものと同じ意味を持ちます。@ResponseBody が付くと、メソッドの戻り値は「画面の名前」ではなく「レスポンスの中身そのもの」として扱われます。

graph TD
  RC["@RestController"] --> Ctrl["@Controller<br/>(HTTPリクエストの受け口にする)"]
  RC --> RB["@ResponseBody<br/>(戻り値をレスポンスの中身として扱う)"]
アノテーションメソッドの戻り値の意味主な用途
@Controller表示する画面(テンプレート)の名前画面を返すWebアプリ(Thymeleafなど)
@RestControllerレスポンスの中身そのもの(JSON等)REST API

このコースで扱うのは主に @RestController です。「戻り値がそのままレスポンスの中身になる」——この感覚を持っておくと、次のレッスン以降がすっと理解できます。

やってみよう

自分がよく使うスマホアプリやWebサービスを思い浮かべ、「画面そのものをサーバーが作って送っている」のか、「JSONだけを受け取ってスマホ側/ブラウザ側の画面が描画している」のか考えてみましょう。後者であれば、そのサーバーは @RestController に近い作りをしているはずです。