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
コース一覧
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分

入力検証の基本

このレッスンでは、Bean Validation が何をしているのかを理解し、必須・長さ・範囲・形式という基本的な検証を自分で実装できるようになります。

検証をコントローラに書くとどうなるでしょうか

検証を素直に手で書くと、次のようになります。

Java

@PostMapping("/users") public String create(@RequestBody UserRequest req) { if (req.getName() == null || req.getName().isBlank()) { return "name is required"; } if (req.getName().length() > 20) { return "name is too long"; } if (req.getAge() < 0 || req.getAge() > 150) { return "age is out of range"; } // 本題はここから }

やりたいことは「利用者を1人作る」ことなのに、その前に if が並びます。同じ検証を別のエンドポイントでも書けば、当然そこでも重複します。

Bean Validation は制約を型の側に書きます

Jakarta Bean Validation は、検証のルールをクラスのフィールドにアノテーションとして書く仕組みです。Spring Boot 3.x では jakarta.validation パッケージにあり、spring-boot-starter-validation を依存に追加すると使えるようになります。

Java

public class UserRequest { @NotBlank @Size(max = 20) private String name; @Min(0) @Max(150) private int age; @NotBlank @Email private String email; }

こう書いておくと、ルールがフィールドの隣に置かれます。「name は必須で20文字以内」という仕様が、コードを読むだけで分かります。

@Valid が実行の合図です

制約を書いただけでは検証は走りません。コントローラの引数に @Valid を付けて、はじめて Spring が検証を実行します。

Java

@PostMapping("/users") public UserResponse create(@Valid @RequestBody UserRequest req) { // ここに来た時点で、制約はすべて満たされている }

Spring は本文を UserRequest に変換したあと、@Valid が付いているのを見て Validator を呼び出します。違反があればメソッドを呼ばず、既定では MethodArgumentNotValidException を投げ、400 Bad Request として応答します。つまりメソッドの中に入れた時点で、制約はすべて通っていると考えてよいわけです。この「前提を型で保証する」性質が、if の羅列を消してくれます。

目的主なアノテーション
必須@NotNull、@NotEmpty、@NotBlank
長さ@Size(min, max)
数の範囲@Min、@Max
形式@Email、@Pattern

演習で書くもの

演習では、その Validator の中身にあたる判断を自分で書きます。名前・年齢・メールを受け取り、必須、長さ、範囲、形式の順に確かめ、最初に見つかったエラーの名前を返します。すべて通れば ok を返します。Spring では @Valid を1つ付けるだけで自動的に行われる処理を、ここでは順序と判定条件を含めて自分の手で組み立てます。次のレッスンでは、これを「最初の1件」ではなく「全部まとめて」返す形に発展させます。

要件

  1. 検証の順序は name の必須、name の長さ、age の範囲、email の必須、email の形式とし、最初に違反したものだけを返すこと
  2. エラー名は name_required、name_too_long、age_out_of_range、email_required、email_invalid のいずれかとすること
  3. 違反がなければ ok を返すこと

入出力例

validate("taro", 20, "taro@example.com") → "ok" validate(" ", 20, "taro@example.com") → "name_required" validate("abcdefghijklmnopqrstu", 20, "taro@example.com") → "name_too_long" validate("taro", 200, "taro@example.com") → "age_out_of_range" validate("taro", -1, "taro@example.com") → "age_out_of_range" validate("taro", 20, "") → "email_required" validate("taro", 20, "taro.example.com") → "email_invalid" validate("taro", 20, "@example.com") → "email_invalid" validate("taro", 0, "a@b") → "ok"

ヒント

空白だけかどうかは trim() してから isEmpty() で判定できます。null チェックを先に書くのを忘れないでください

name の長さは trim せずそのままの length() で判定します。21文字以上が長すぎ、つまり 20 より大きいときです

アットマークがちょうど1つかどうかは indexOf('@') と lastIndexOf('@') が一致するかで確かめられます。位置が 0 なら前が空、末尾なら後ろが空です

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

関連レッスン

  • 検証エラーをまとめて返す

    複数のエラーを集約したレスポンスを組み立てます。

  • アノテーションによる検証

    @NotNull と @NotBlank の違いなどを確認します。

  • 3層アーキテクチャ

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

  • @Entityとテーブルの対応

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

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

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

  • エンドポイント「この URL を叩くとこの機能が動く」入口の住所
  • クラスデータと振る舞いを束ねる単位
  • フィールドクラスが持つデータ
  • 引数位置引数=順番で渡す。
  • メソッドクラスに属する関数
  • 判断YES/NO 分岐を表す菱形
  • 処理計算や代入を表す長方形
main.java
学習モード
エディタを読み込んでいます

メモ

入力検証の基本

⌘S で保存