REST API CRUD 実践 — 最初から最後まで
REST API CRUD 実践 — 最初から最後まで
🎯 このレッスンを読み終えたら
このレッスンを読み終えると、以下の3つを自信を持って実践できるようになります。
- ▸✅ @RestController + @RequestMapping を使って REST API 4種 (GET/POST/PUT/DELETE) を実装する
- ▸✅ @RequestBody / @PathVariable / @RequestParam の違いと使い方を理解する
- ▸✅ @RestControllerAdvice でグローバル例外処理パターンを適用する
学習目標をチェックリストとして手元に置き、すべてに答えられるようになったらレッスンを閉じてください。
CRUD の4つの HTTP メソッド
REST の基本的な約束
URL は名詞(リソース)、操作は HTTP メソッド — これが REST の本質です。
1. User ドメイン + DTO
Entity と DTO を分離するのが標準的なアプローチです。DTO は API の入出力専用、Entity は データベースマッピング専用 です。
2. 仮のストレージ(データベースの代わりにインメモリ)
3. サービスレイヤー
Controller が Repository を直接操作することはありません — ビジネスロジックは Service レイヤーが担います。
Controller — @RequestBody · @PathVariable · ResponseEntity
4つのアノテーションの役割
- ▸
@RequestBody— HTTP ボディの JSON をオブジェクトへデシリアライズする - ▸
@PathVariable— URL パスの{id}のような値を取り出す - ▸
@RequestParam—?page=1のようなクエリ文字列の値を取り出す - ▸
ResponseEntity— ステータスコード + ヘッダー + ボディを直接制御する
コントローラーの全コード
レスポンスボディがオブジェクトの場合 — Jackson が自動でシリアライズ
@RestController が付いていると、すべての戻り値が自動的に JSON へ変換されます。Map・List・DTO をそのまま返すだけで、追加設定は不要です。
ステータスコードを明示したい場合
GET はオブジェクトをそのまま返す、POST は 201、DELETE は 204 — これを明示するために ResponseEntity を使います。
実務では、すべてのレスポンスを ResponseEntity で統一するチームと、シンプルな GET はオブジェクトだけ返すチームに分かれます。どちらも正解です。
グローバル例外処理 — @ControllerAdvice
いたるところに try-catch は地獄
数十のメソッドに try-catch → ボイラープレートが爆発。
@ControllerAdvice — 例外処理専用 Bean
すべてのコントローラーの例外を一か所で処理します。 コントローラーのコードはビジネスロジックだけに集中できるようになります。
カスタム例外クラス
RuntimeException を継承することで、throws 宣言が不要になります。ドメインごと (UserNotFoundException・OrderNotFoundException) に作るとコードの意図が明確になります。
curl テスト
Postman ユーザーは4つのリクエストを Collection として保存しておけば、ワンクリックでテストできます。
🤖 AI にはこう依頼してみてください
このレッスンの概念を理解すれば、AI に具体的かつ的確な指示が出せるようになります。漠然とした「直して」ではなく、語彙を持ったリクエスト — それがトークン節約の出発点です。
- ▸「このコントローラーに @ControllerAdvice ベースのグローバル例外処理を追加して」
- ▸「User CRUD API 4種 (GET/POST/PUT/DELETE) のコントローラーを作って」
- ▸「このレスポンスを ResponseEntity でラップして、201 / 204 ステータスコードを正確に返すようにして」
なぜこれがトークンを減らすのか
概念を知らないと、AI の回答を受け取っても「それって何ですか?」と再度聞き直す羽目になります。その「聞き直し」がトークンを消費します。概念を一度しっかり覚えれば、会話が一度で完結します。