1. RestControllerとは?
従来の@Controllerは、主にHTML画面(View)を返却するために使用されていました。
それに対し、@RestControllerはHTMLではなくデータ(主にJSON)を直接返却するのが特徴です。
従来の@Controllerの例
@Controller
public class MemberController {
@GetMapping("/home")
public String home() {
return "home"; // home.html という画面がブラウザに出力される
}
}
実行結果: home.html の画面が表示される。
@Controller と @RestController の違い**
1. @Controller(従来のコントローラー)主に HTML画面(View)をブラウザに表示させるため に使用されます。
- 動作の特徴: メソッドが String 型で文字列(例: "home")を返却すると、Springはそれを画面のファイル名(例: home.html)として認識します 。そして、その該当するHTML画面をブラウザにレンダリングして出力します。
- 例外的な使い方: もし @Controller を使いながらデータ(JSONなど)を直接返却したい場合は、メソッドの前に個別に @ResponseBody というアノテーションを付与する必要があります。
2. @RestController(データ専用のコントローラー)
HTML画面ではなく、純粋な「データ(主にJSONや文字列)」をクライアントに返却するため に使用されます。
- 動作の特徴: メソッドが文字列やJavaのオブジェクト(DTOなど)を返却すると、画面に遷移するのではなく、そのデータ自体がそのままクライアント(ブラウザやモバイルアプリなど)に送信されます。
- 仕組み: 実は、
@RestControllerは内部的に@Controllerと@ResponseBodyが合体したもの です。そのため、メソッドごとにいちいち @ResponseBody を書かなくても、すべてのメソッドが自動的にデータを返却するようになります。
実は、@RestControllerは内部的に@Controller と @ResponseBody が合体したものです 。そのため、すべてのメソッドでJSONデータを返却することができます。
💡 @ResponseBody とは?
JavaのオブジェクトをJSONデータに変換して返却してくれる機能のことです。
3. JSON(JavaScript Object Notation)とは?サーバーとクライアントの間でデータをやり取りする際に使用される、標準的なデータ形式です。
特徴: Key: Value の形式で構成されている。
- 人間が見ても読みやすい。
- ほとんどのAPI(REST API)で標準的に採用されている。
JSONの例
{
"memberId": 1,
"name": "ホン・ギルドン",
"age": 20
}
4. データの返却と「JSON直列化(Serialization)」
@RestControllerを使うと、文字列だけでなくJavaのオブジェクト(DTOなど)もそのまま返却できます。
オブジェクト返却の例
@GetMapping("/object")
public MemberDTO object() {
MemberDTO dto = new MemberDTO();
dto.setMemberId(1L);
dto.setName("test");
dto.setAge(20);
return dto;
}
アクセスURL: GET /object
返却される結果 (JSON):
{
"memberId": 1,
"name": "test",
"age": 20
}
Spring Bootは、Javaオブジェクトを自動的にJSONへと変換してくれます。これをJSON直列化(Serialization)と呼びます。
5. クライアントからJSONを受け取る:@RequestBodyクライアントから送られてきたJSONデータをJavaのオブジェクトに変換したいときは、@RequestBodyアノテーションを使用します。
@RequestBody の使用例
@PostMapping("/json")
public String json(@RequestBody MemberDTO memberDTO) {
System.out.println(memberDTO);
return "JSONデータ送信成功";
}
実行の流れとデータバインディング(Data Binding)
1.クライアントからの要請: JSONデータを送信。
2.Springによる自動処理: 送られてきたJSONデータを自動的にオブジェクト(MemberDTO)に保存。これをデータバインディング(Data Binding)と呼びます。
3.Controllerへの伝達: データが格納されたオブジェクトがメソッドの引数に渡される。
⚠️ 注意点!
データバインディングを成功させるためには、JSONのKey名とDTOのフィールド名(変数名)が完全に一致している必要があります。 ⭕ マッピング可能: DTOの name ↔ JSONの "name"
❌ 自動マッピング不可: DTOの name ↔ JSONの "username"
6. REST API の全体的な流れ
REST APIとは、HTMLではなく「データ」をやり取りする方式のことです。全体の流れは以下のようになります。
【Client】 ーー (JSONリクエスト) ーー> 【Server (@RequestBodyでJavaオブジェクトに変換)】
↓ (ビジネスロジック処理)
【Client】 <ーー (JSONに自動変換) ーーー 【Server (Javaオブジェクトを返却)】
まとめ
@RestController : HTMLではなく、データを返却するコントローラー。
JSON : サーバー・クライアント間でデータをやり取りする形式(Key-Value型)。
@RequestBody : 受信したJSONデータをJavaオブジェクトに変換(バインディング)。
@ResponseBody : JavaオブジェクトをJSONデータに変換して返却。
Data Binding : 要請されたデータをオブジェクトに自動で格納する機能。必ずKey名とフィールド名を一致させること 。