1. test 1
  2. test 2
  3. test 3
  4. test 4
  5. test 5
  6. test 6
  7. test 7
  8. test 8
  9. test 9
  10. test 10
  11. test 11
コース一覧
Spring Boot入門
ステータスコードの選び方

Spring Boot入門

Java で Web API サーバーを作るための Spring Boot の入門コースです。DI コンテナ、REST コントローラ、リクエスト検証、レイヤ分割、Spring Data JPA、例外ハンドリング、テストまでを扱います。毎レッスン、Spring が裏側でやっている判断そのものを pure Java の関数として自分で書き、フレームワークが何を肩代わりしてくれているのかを手触りで理解できる構成にしました。約 12 時間 (1 日 30 分 × 24 日) で 48 レッスンを修了できます。

1
Spring Bootとは何か
01. Spring Bootで何が作れるのか10分
02. サーブレットからフレームワークへ15分
03. ルーティング表という発想15分
04. プロジェクトの構成10分
05. 起動のしくみと自動設定15分
06. パスのマッチング15分
2
DIコンテナ
01. newで書くと何が困るのか15分
02. コンストラクタインジェクション15分
03. インターフェースへの依存15分
04. @Componentと@Bean15分
05. 自作のDIコンテナ20分
06. Beanのスコープとライフサイクル15分
3
RESTコントローラ
01. RESTという設計方針15分
02. @RestControllerの役割15分
03. @GetMappingとパス変数15分
04. クエリパラメータの受け取り15分
05. @PostMappingとリクエストボディ15分
06. ステータスコードの選び方15分
07. ResponseEntityで組み立てる15分
4
リクエストとレスポンスの変換
01. JSONとオブジェクトの往復15分
02. DTOとエンティティを分ける15分
03. recordでDTOを書く15分
04. 入力検証の基本15分
05. 検証エラーをまとめて返す15分
06. アノテーションによる検証15分
5
レイヤ構成とビジネスロジック
01. 3層アーキテクチャ10分
02. @Serviceに置くもの15分
03. 状態遷移をルールにする15分
04. 料金計算のような業務ロジック15分
05. @Transactionalとは何か15分
06. トランザクションの巻き戻し15分
6
データアクセス
01. @Entityとテーブルの対応15分
02. リポジトリという抽象15分
03. メソッド名からクエリを作る20分
04. 検索条件の組み立て15分
05. ページングと並び替え15分
06. N+1問題15分
7
例外処理と横断的関心事
01. 例外をHTTPに変換する15分
02. @ExceptionHandlerと@ControllerAdvice15分
03. エラーレスポンスの形を決める15分
04. フィルタとインターセプタ15分
05. ログとリクエストの追跡15分
06. 設定値の外部化15分
8
テストと仕上げ
01. テストの種類と使い分け15分
02. Serviceの単体テスト15分
03. モックで依存を差し替える15分
04. MockMvcでエンドポイントを試す15分
05. 本番へ出すための次の一歩10分

ステータスコードの選び方

このレッスンでは、操作の種類と結果の状況から、返すべき HTTP ステータスコードを決められるようになります。

まず 3 つの階層で考える

ステータスコードは 3 桁の数字ですが、意味を決めているのは先頭の 1 桁です。

先頭意味誰の話か
2xx成功依頼どおりに処理できた
4xxクライアント側の問題リクエストの内容がおかしい
5xxサーバー側の問題リクエストは正しいがこちらが失敗した

この分類を間違えないだけで、API の使い勝手はかなり良くなります。クライアントが直せる問題なのか、直せない問題なのかを数字で伝えるのが本質です。

よく使う 9 つ

コード名前使いどころ
200OK取得・更新が成功した
201Created新しいリソースを作成した
204No Content成功したが返す本文が無い。削除の後など
400Bad Request入力の形式や内容がおかしい
401Unauthorized認証されていない。誰なのか分からない
403Forbidden認証済みだが権限が足りない
404Not Found対象が存在しない
409Conflict現在の状態と矛盾する。重複登録など
500Internal Server Errorサーバー側の想定外の失敗

混同しやすい組み合わせ

200 と 201 — 作成が成功したときは 201 を返します。200 でも動きますが、201 には「新しいリソースができた」という追加の情報があります。あわせて Location ヘッダで場所を伝えるのが定石です。

200 と 204 — 削除が成功したときに返すものがないなら 204 が適切です。空の JSON を本文にして 200 を返すより意図がはっきりします。

401 と 403 — この 2 つは「誰か分からない」と「誰かは分かるが許されていない」の違いです。トークンが無い、または期限切れなら 401、ログイン済みの一般利用者が管理者専用の操作を叩いたなら 403 です。401 を返すということは、認証をやり直せば通るかもしれないという意味になります。

404 と 403 — 存在するリソースへの権限が無いとき、403 ではなくあえて 404 を返す設計もあります。403 だと「そこに何かはある」ことが漏れてしまうためです。どちらが正しいという話ではなく、情報を隠したいかどうかで選びます。

400 と 409 — 形式がおかしいのは 400 です。形式は正しいが今の状態と衝突するのが 409 です。メールアドレスの形が壊れているなら 400、形は正しいが既に登録済みなら 409 になります。

500 を返してはいけない場面 — 入力が悪くて落ちたのに 500 を返してしまうと、クライアントは自分に直せるものだと気づけません。想定できる失敗はすべて 4xx として明示し、500 は本当に想定外のものだけに残します。

Spring での書き方

Java

@PostMapping @ResponseStatus(HttpStatus.CREATED) public UserResponse create(@Valid @RequestBody CreateUserRequest req) { ... }

@ResponseStatus で固定のコードを宣言できます。状況によってコードを変えたい場合は、次のレッスンで扱う ResponseEntity を使います。

演習で確かめます

Spring では @ResponseStatus や ResponseEntity が「決めたコードを実際に返す」部分を引き受けてくれますが、どのコードを返すかを決めるのは常に自分の仕事です。ここではその判断そのものを関数にします。操作の種類と結果の状況を受け取り、返すべきステータスコードを決めてください。

要件

  1. outcome が ok 以外のときは action を見ずに、invalid は 400、unauthenticated は 401、forbidden は 403、missing は 404、conflict は 409、error は 500 を返すこと
  2. outcome が ok のときだけ action を見て、create は 201、delete は 204、それ以外は 200 を返すこと
  3. 未知の outcome は 500 を返すこと

入出力例

decideStatus("create", "ok") → "201" decideStatus("delete", "ok") → "204" decideStatus("get", "ok") → "200" decideStatus("update", "ok") → "200" decideStatus("create", "invalid") → "400" decideStatus("get", "unauthenticated") → "401" decideStatus("delete", "forbidden") → "403" decideStatus("get", "missing") → "404" decideStatus("create", "conflict") → "409" decideStatus("get", "error") → "500" decideStatus("get", "unknown") → "500"

ヒント

先に outcome で分岐し、ok のときだけ内側で action を見る二段構えにすると読みやすくなります

戻り値は int ではなく "404" のような String です。数値で計算する必要はありません

switch 文の既定の枝で 500 を返しておけば、未知の outcome の扱いが自然に決まります

生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/08/09

関連レッスン

  • ResponseEntityで組み立てる

    本文とステータスとヘッダを一体で返す形を実装します。

  • JSONとオブジェクトの往復

    キーと値の対応づけを自分で実装し、変換の中身を掴みます。

  • 3層アーキテクチャ

    層を分ける理由と、それぞれの責務を説明できるようになります。

  • @Entityとテーブルの対応

    エンティティのマッピングと主キーの指定を確認します。

このレッスンに出てくる用語

意味があいまいなまま進んだ語は、ここから読み直せます。

  • HTTPWeb の通信プロトコル、HTTPS は TLS で暗号化したもの
  • ステータスコード200/201/404 など結果を示す3桁の数値
  • 階層ネットワークを役割ごとに積み重ねた構造
  • 処理計算や代入を表す長方形
  • リクエストWeb 通信の基本単位、ブラウザの問い合わせとサーバーの返答
  • サーバークライアント(ブラウザなど)がリクエストを送り、サーバーがレスポンスを返す。
  • 分類カテゴリを当てる教師ありタスク
  • エンドポイント「この URL を叩くとこの機能が動く」入口の住所
main.java
学習モード
エディタを読み込んでいます

メモ

ステータスコードの選び方

⌘S で保存