1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【SpringBoot】Spring RestControllerの理解

1
Posted at

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名とフィールド名を一致させること 。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?