@Controller、@RestController違い

今回は、@Controller、@RestController違いについてメモしていこうと思います。

結論から言いますとHTTP Response Bodyが生成される方式です。

@Controller

  • Spring MVCのコントローラを指定するときに使用
  • @Controllerは主にViewを返却するために使用

以下のような流れでSpring MVC ContainerはクライアントのリクエストからViewを返却します。

  • HTTPリクエストを受信した後、DispatcherServletHandlerMapping を参照して、適切なコントローラーを呼び出します
  • コントローラは、要求を受け取り、使用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

コメントを残す