検索
ニュース

Springにおける「RestController」と「Controller」の違いとはどう使い分けるとよいのか

Javaの開発フレームワーク「Spring Framework」におけるControllerとRestControllerの違い、Restful API開発時にRestControllerを使用するメリットを紹介する。

Share
Tweet
LINE
Hatena

 SpringのControllerとRestControllerの主な違いは、Controllerアノテーションを付けたクラスがクライアントにレスポンスを返す前にデータをフォーマットするレンダリングフェーズを別途呼び出すのに対し、RestControllerアノテーションを付けたクラスはレンダリングフェーズをスキップしてHTTPレスポンスのボディーにJSON、テキストまたはXMLを直接埋め込む点にある。

 Springの@RestControllerが付与されたクラスは、HTTPリクエストを処理する全メソッドに暗黙的に@ResponseBodyアノテーションを追加する。

Controllerはどう動くのか

 Spring Web ControllerクラスでHTTPリクエストを処理する際、全てのメソッドで、次の3つのタスクが実行される。

  1. 受信したリクエストを調査し、関連データを抽出する
  2. リクエストを処理し、必要なバックエンドシステムとやりとりする
  3. クライアントに返すレスポンスのために必要なデータをJavaBeansに格納する

 リッチWebクライアントからのリクエストの場合、Controllerはカスタムレンダリング機能を呼び出して、JavaBeansのデータを視覚的に魅力のある方法でフォーマットする。Spring BootおよびSpring MVCでは、一般的に以下のテンプレートエンジンとレンダリングテクノロジーが使用される。

  1. JSP
  2. Thymeleaf
  3. FreeMarker
  4. Mustache

 開発者は、これらのテクノロジーを使用して、Controllerが生成したデータをWebブラウザで簡単に表示できるHTMLなどのマークアップに変換する。RESTfulクライアントはマークアップデータを必要とせず、データがJSON、XML、またはプレーンテキストの形式で返されることだけを求める。そこにControllerとRestControllerの主な違いがある。

RestControllerと従来のSpring MVCの違い

 約10年前にリリースされたSpring Frameworkバージョン4以前では、レンダリング手順をスキップしたい開発者は、メソッドに@ResponseBodyアノテーションを追加していた。これにより、ControllerのHTTP要求処理メソッドから返されるデータがSpringによってJSONまたはXMLに自動的に変換され、HTTPレスポンスのボディーに埋め込まれた(そのためこのアノテーションは@ResponseBodyと名付けられている)。

 当然、その結果として、Spring Boot REST APIの全てのメソッドに@ResponseBodyアノテーションを追加する必要が生じた。SpringのRestControllerの唯一の目的は、RESTful APIの全てのメソッドにこのアノテーションを追加する手間をなくすことにある。

RestControlleとControllerの使い分け

 SpringのRestControllerは、Controllerと同じことを全て行うが、HTTPリクエストを処理する全てのメソッドに@ResponseBodyアノテーションを暗黙のうちに追加する。それだけが、SpringのRestControllerとControllerの唯一の技術的違いになる。

 Spring Bootを使ってRESTful APIを作成する場合は、クラスにRestControllerアノテーションを追加し、SpringによってJavaBeansがJSONまたはXMLに自動変換されるようにする。データを意味のある方法でマークアップしたい場合は、これまで通りControllerアノテーションを使って、Spring MVCフレームワークのレンダリングフェーズに処理させる。

Copyright © ITmedia, Inc. All Rights Reserved.

ページトップに戻る