導入
「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 に近い作りをしているはずです。