REST API のレスポンス設計を“やさしく深く”理解する:エラー処理・例外ハンドリングのベストプラクティス【Spring Boot対応】

🧠【初心者向け】REST API のレスポンス設計と例外処理をやさしく解説(図解あり)

REST API を実務で書くときに
初心者が最もつまずくのが レスポンス設計と例外処理 です。

  • エラー時は何を返せばよい?
  • 200 と 400 と 500 の違い?
  • 例外が起きたとき、どこでキャッチすればいい?
  • @ExceptionHandler の役割は?
  • バリデーションエラーはどう返す?
  • 共通レスポンス形式ってどう作る?

これらはシステム全体の品質に直結する重要ポイントです。

この記事では
初心者向けのやさしい解説 × 実務に使える設計指針 × Spring Boot の深掘り
を交えて、“REST API の土台” を作れるように解説します。


✨ 結論

✔ 成功レスポンスとエラーレスポンスは形式を統一する

✔ HTTPステータスコードは “意味” を理解して正しく使う

✔ 例外は Controller でキャッチしない(ControllerAdvice が担当)

✔ バリデーションは @Valid + BindingResult + グローバルハンドラ

✔ Spring Boot では例外ハンドリングを “層” で整理するのが正解


REST API の基本:成功レスポンスは「統一形式」にする

REST API で最も重要なのは

「成功・失敗どちらも同じ形式で返すこと」

統一された形式なら、呼び出す側もパースが簡単です。


成功レスポンスの例(共通フォーマット)

{
  "status": "success",
  "data": {
    "id": 123,
    "name": "Alice"
  }
}

エラーレスポンスの例

{
  "status": "error",
  "message": "Invalid user ID",
  "code": "USER_001"
}

HTTPステータスコードを正しく使う(初心者がつまずくポイント)

代表的なステータスコードと用途👇

ステータス用途
200正常系
201作成成功(POST)
400バリデーションエラー
401認証エラー
403権限不足
404リソース未発見
409競合(重複など)
500サーバー内部エラー

🔹 図解(短線版)

200 = 正常
400 = リクエスト不備
500 = サーバーの問題

覚えるのはこれだけでも十分。


Spring での例外処理の原則(重要)

Spring では、例外は Controller で直接キャッチしない のが原則。

代わりに👇を使う。

  • @ControllerAdvice
  • @ExceptionHandler

@ControllerAdvice の役割

全コントローラ共通で
例外をハンドリングする仕組み。

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(NotFoundException.class)
    public ResponseEntity<?> handleNotFound(NotFoundException e) {
        return ResponseEntity.status(404)
            .body(new ErrorResponse("USER_001", e.getMessage()));
    }
}

例外ハンドリングは「層」で整理するとスッキリする

🔹 図解(短線版)

Controller
   ↑ 例外は上がってくる
Service
   ↑ ここでは必要に応じて例外をラップ
Repository
   ↑ DB例外はここから

✔ Controller → 例外を受け取る(返却の責務)

✔ Service → 業務例外を定義

✔ Repository → DB例外を投げる


バリデーションエラー(@Valid)の扱い

よくある例👇

@PostMapping("/users")
public Response create(@Valid @RequestBody UserForm form) {
    ...
}

エラー時は BindingResult で取得可能。


Spring Boot の内部構造(深掘り)

更に理解を深めるために
「内部で何が起きているか」も図解します。


① DispatcherServlet が例外をキャッチ

Spring MVC 全体の中心。


② HandlerExceptionResolver が適切な ExceptionHandler を探す

複数の Resolver が存在。


③ @ControllerAdvice がマッチしたらそこで処理

例外 → 適切な処理 → HTTPレスポンスへ変換。


④ 最終的には HttpMessageConverter が JSON にシリアライズ

Jackson が担当。


実務で役立つ REST API 例外設計のベストプラクティス

✔ “クライアントが扱いやすい” エラー形式に統一

✔ エラーコード(USER_001 など)を必ずつける

✔ API の返却値は成功・失敗どちらも共通形式

✔ スタックトレースはログにだけ出す

✔ 例外は ControllerAdvice でまとめる


ここまでのまとめ(初心者向け)

  • REST API は成功・失敗の形式を統一する
  • HTTPステータスコードの意味を理解する
  • @ControllerAdvice で例外処理を一元化
  • バリデーションは @Valid とハンドラー
  • 内部構造は DispatcherServlet → Resolver → Handler

Deep Friendly Tech の一言(後書き)

REST API の例外設計は
“コード品質の差が一番出るポイント” です。

この設計が整っているだけで
使いやすい API / 事故が少ない API / 保守しやすい API
の3つが一気に実現します。

ぜひ今日からあなたの API でも活用してみてください。

コメント

タイトルとURLをコピーしました