今回は、@Controller、@RestController違いについてメモしていこうと思います。
結論から言いますとHTTP Response Bodyが生成される方式です。
@Controller
- Spring MVCのコントローラを指定するときに使用
- @Controllerは主にViewを返却するために使用
以下のような流れでSpring MVC ContainerはクライアントのリクエストからViewを返却します。

- HTTPリクエストを受信した後、DispatcherServletはHandlerMapping を参照して、適切なコントローラーを呼び出します。
- コントローラは、要求を受け取り、使用GETまたはPOSTメソッドに基づいて、適切なサービスメソッドを呼び出します。serviceメソッドは、定義されたビジネスロジックに基づいてモデルデータを設定し、ビュー名をDispatcherServletに返します。
- DispatcherServletはからの助けを取るViewResolverピックアップへの要求のために定義されたビューを。
- ビューが完成すると、DispatcherServletはモデルデータをビューに渡し、ビューは最終的にブラウザにレンダリングされます。
それでは@Controllerアノテーションが付いているコントローラからはJson形式のデータを返却できないのか
答えはNOですね。
@GetMapping(value = "/some")
public @ResponseBody SomeResponseDto retrieveUserInfo(@RequestBody SomeRequestDto requestDto){
return new SomeResponseDto;
}
- @ResponseBodyを指定することでできます。
でも、次に説明しますが、@RestControllerを指定することで@ResponseBodyを付けなくてもOKになります。
@RestController
- Spring MVC Controlleに@ResponseBodyが追加されたアノテーション
- @RestControllerの主な用途はJson形式にデータを返却すること
以下のような流れでクライアントのリクエストからJson形式のデータを返却します。

- クライアントがWeb Serviceにリクエストを送ります。
- MappingのHandlerとそのTypeをサーチするDispatcherServletにリクエストをインターセプトします。
- RestControllerはリクエストの処理を行い、データを返却します。
@RestController
public SomeController {
@GetMapping(value = "/some")
public SomeResponseDto retrieveUserInfo(@RequestBody SomeRequestDto requestDto){
return new SomeResponseDto;
}
}
- @ResponseBodyアノテーションは必要ないです。
参考
https://www.tutorialspoint.com/spring/spring_web_mvc_framework.htm
Spring MVC Framework and REST
