Javaの開発フレームワーク「Spring Framework」におけるControllerとRestControllerの違い、Restful API開発時にRestControllerを使用するメリットを紹介する。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
SpringのControllerとRestControllerの主な違いは、Controllerアノテーションを付けたクラスがクライアントにレスポンスを返す前にデータをフォーマットするレンダリングフェーズを別途呼び出すのに対し、RestControllerアノテーションを付けたクラスはレンダリングフェーズをスキップしてHTTPレスポンスのボディーにJSON、テキストまたはXMLを直接埋め込む点にある。
Springの@RestControllerが付与されたクラスは、HTTPリクエストを処理する全メソッドに暗黙的に@ResponseBodyアノテーションを追加する。
Spring Web ControllerクラスでHTTPリクエストを処理する際、全てのメソッドで、次の3つのタスクが実行される。
リッチWebクライアントからのリクエストの場合、Controllerはカスタムレンダリング機能を呼び出して、JavaBeansのデータを視覚的に魅力のある方法でフォーマットする。Spring BootおよびSpring MVCでは、一般的に以下のテンプレートエンジンとレンダリングテクノロジーが使用される。
開発者は、これらのテクノロジーを使用して、Controllerが生成したデータをWebブラウザで簡単に表示できるHTMLなどのマークアップに変換する。RESTfulクライアントはマークアップデータを必要とせず、データがJSON、XML、またはプレーンテキストの形式で返されることだけを求める。そこにControllerとRestControllerの主な違いがある。
約10年前にリリースされたSpring Frameworkバージョン4以前では、レンダリング手順をスキップしたい開発者は、メソッドに@ResponseBodyアノテーションを追加していた。これにより、ControllerのHTTP要求処理メソッドから返されるデータがSpringによってJSONまたはXMLに自動的に変換され、HTTPレスポンスのボディーに埋め込まれた(そのためこのアノテーションは@ResponseBodyと名付けられている)。
当然、その結果として、Spring Boot REST APIの全てのメソッドに@ResponseBodyアノテーションを追加する必要が生じた。SpringのRestControllerの唯一の目的は、RESTful APIの全てのメソッドにこのアノテーションを追加する手間をなくすことにある。
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.