Loading
  • LIGHT

  • DARK

ROUTE

ルートゼロの
アクティビティ

Spring Bootのフォームバリデーションとは?@Validで安全な入力チェックを実現しよう

2

その入力、本当に大丈夫?Spring Bootのバリデーションが必要な理由

Webアプリケーションを開発していると、こんな経験はありませんか?

  • 入力フォームに不正な値が送られてエラーになった

  • 数値が必要な項目に文字列が入ってしまった

  • 入力チェックをコントローラで毎回手書きしている

このような「入力値の検証(バリデーション)」は、セキュリティ・信頼性の観点から非常に重要です。特に、Spring Bootのようなフレームワークを使って開発を効率化している場合でも、入力の検証を甘く見ると脆弱性の原因になります。

この記事では、Spring Bootにおけるフォームバリデーションの仕組みと、@Validアノテーションを中心に、実務ですぐに活用できる方法を解説していきます。


Spring Bootにおけるフォームバリデーションの基本

フォームバリデーションとは?

フォームバリデーションとは、ユーザーが入力した値をサーバー側でチェックし、意図しないデータや不正な入力をブロックする処理です。

Spring Bootでは、javax.validation(現在はjakarta.validation)によるBean Validation(Java標準のバリデーションAPI)を使って、オブジェクト単位でバリデーションを行うことができます。


基本の流れを見てみよう

フォームバリデーションの典型的な流れは以下の通りです。

[フォーム入力][DTOにデータバインド][@Validでバリデーション][BindingResultでチェック][エラー表示 or 正常処理]
  • DTO(Data Transfer Object):画面とサーバー間のデータ受け渡し専用オブジェクト。

  • バインド(バインディング):フォームから送られた値をJavaオブジェクト(DTOなど)に自動的に割り当てる処理。

  • BindingResult:バリデーション結果(エラーの有無や詳細)を格納するオブジェクト。


具体的なコード例で解説

入力フォームのDTOクラス

import jakarta.validation.constraints.*;

public class UserForm {

    @NotBlank(message = "名前は必須項目です")
    private String name;

    @Email(message = "メールアドレスの形式が正しくありません")
    private String email;

    @Min(value = 18, message = "年齢は18歳以上である必要があります")
    private int age;

    // Getter / Setter
}

コントローラクラス

import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;

@Controller
public class UserController {

    @PostMapping("/submit")
    public String submitForm(@Valid @ModelAttribute UserForm form, BindingResult result) {
        if (result.hasErrors()) {
            return "form"; // バリデーションエラー時の画面に戻す
        }
        // 正常処理
        return "success";
    }
}
  • @Valid:引数のオブジェクトに対して、バリデーションを自動的に実行するアノテーション。

  • @ModelAttribute:リクエストパラメータをモデル属性としてバインドするためのアノテーション。

  • @PostMapping:HTTP POSTリクエストに対応するメソッドを定義するアノテーション。


よく使われるアノテーション一覧(抜粋)

  • @NotBlank:空文字やnullを禁止(文字列に対する非空チェック)

  • @Email:メールアドレス形式の検証

  • @Size:文字列やコレクションの長さ制限

  • @Min, @Max:数値の範囲指定

バリデーションアノテーションは、DTOの各フィールドに適用するだけで有効になります。


つまずきやすいポイントと正しい使い方

よくある間違い:BindingResultの使い方

Before:エラーになる例

public String submitForm(@Valid UserForm form) {
    // BindingResult がないため、バリデーションエラーを検出できない
}

After:正しい書き方

public String submitForm(@Valid UserForm form, BindingResult result) {
    if (result.hasErrors()) {
        return "form";
    }
    return "success";
}

BindingResultは、必ず@Valid直後の引数に配置する必要があります。


独自エラーメッセージを使いたいときは?

アノテーションにmessage属性を指定することで、独自のエラーメッセージが設定できます。また、messages.propertiesで多言語対応も可能です。


DTOにロジックを入れすぎない

バリデーションのロジックはDTOに集約しますが、ビジネスロジックとの分離が重要です。責務を明確にし、再利用性・保守性を高めましょう。


まとめと次のステップ

要点整理

  • Spring Bootでは@ValidとDTOクラスで簡潔にバリデーションを実装できる

  • BindingResultと組み合わせることで柔軟なエラー処理が可能

  • よく使うアノテーションを理解して正しく使うことが成功のカギ

次に学ぶべきこと

  • バリデーショングループの使い分け:登録・更新などシーンに応じた制御(グループごとに異なるバリデーションルールを適用)

  • カスタムバリデーション:独自の検証ロジックをAnnotation化して再利用性を高める

  • フロントエンドとの連携:JSと連動したUX向上(リアルタイム入力チェックなど)

これらを併せて学ぶことで、より堅牢でユーザーフレンドリーなアプリケーションを作る力が身につきます。

【外部リンク】

Spring Boot公式サイト

Spring Framework公式ガイド – Spring MVC

【内部リンク】

Spring Boot バリデーション入門|MVC統合とカスタム
JavaScriptでCORSエラーが出たときの原因と対処法を徹底解説
JavaScriptのAjax完全入門|fetchの使い方・CORSエラーの対処・非同期通信の基本を解説
JavaScriptでよく発生するエラー「ReferenceError」「SyntaxError」などの原因と対策を具体例付きで解説

RANKINGranking-icon

LATEST POSTS

もっとルートゼロを知りたいなら

DISCOVER MORE