Spring Bootの@Validと@Validatedの違いを解説する記事のアイキャッチ。若手エンジニアがJava道場風の学習空間で入力チェックを学ぶイラスト。

Spring

Spring Bootの@Validと@Validatedの違いは?入力チェックの使い分け

AIによる要約

@ValidはBean Validation標準の入力チェック、@ValidatedはSpringが提供する検証用アノテーションです。初学者はまずFormやRequest DTOに@Validを使い、グループバリデーションやメソッド引数の検証が必要なときに@Validatedを検討すると整理しやすいです。

書籍「リーダブルコード」の表紙
書影:O'Reilly Japanより引用
PR 新人・若手エンジニア向け

リーダブルコード

著 / 角 征典 訳

コードレビューの「読みづらい」を減らす、最初の一冊。

命名、コメント、条件分岐、変数、メソッド分割を短い実例から学べます。Java専用書ではありませんが、現場で使える読みやすさの判断基準が身につきます。

  • レビュー指摘の理由と直し方を整理したい
  • 動くだけでなく、読みやすいコードを書きたい

当サイトはAmazonアソシエイト・プログラムの参加者です。価格・在庫・配送条件はAmazonでご確認ください。

新人SE
新人SE
@Validと@Validatedは、どちらを使えばいいんですか?
ポンコツSE
ポンコツSE
普段の画面フォームやJSON入力なら、まず@Validで十分なことが多いです。@Validatedは、登録と更新でチェックを分けるなど、少し踏み込んだ場面で出てきます。

Spring Bootで入力チェックを調べると、@Valid@Validatedの両方が出てきます。

どちらも入力チェックに関係するため、初学者は違いが分からず、プロジェクト内で何となく使われている方を真似しがちです。現場では、その真似がレビューで止まることがあります。

この記事のポイント

  • @Validは標準的なBean Validationの入口として使う
  • @ValidatedはSpringの検証機能で、グループ指定などに使える
  • 普通のForm入力ならまず@Validで考える
  • 既存プロジェクトの方針に合わせることも重要

@Validは標準的な入力チェックとして使う

@Validは、Bean Validationの仕組みを使って、FormクラスやRequest DTOに付けた制約を検証します。

public class UserRegisterForm {
    @NotBlank
    private String name;

    @NotBlank
    @Email
    private String email;
}

@PostMapping("/users")
public String register(@Valid UserRegisterForm form,
                       BindingResult bindingResult) {
    if (bindingResult.hasErrors()) {
        return "users/new";
    }
    userService.register(form);
    return "redirect:/users";
}

通常の登録フォームやJSON入力では、まずこの形を理解すれば十分です。必須、桁数、メール形式などの基本的なチェックは@Validで扱えます。

@ValidatedはSpringの検証アノテーション

@ValidatedはSpringが提供する検証用アノテーションです。代表的な使い道は、グループバリデーションです。

public interface CreateGroup {}
public interface UpdateGroup {}

public class UserForm {
    @Null(groups = CreateGroup.class)
    @NotNull(groups = UpdateGroup.class)
    private Long id;

    @NotBlank
    private String name;
}

登録時はID不要、更新時はID必須、というように同じFormでも処理ごとにチェックを変えたい場合に使われます。

@PostMapping("/users")
public String create(@Validated(CreateGroup.class) UserForm form,
                     BindingResult bindingResult) {
    // 登録用のチェック
    return "users/new";
}

@PostMapping("/users/{id}")
public String update(@Validated(UpdateGroup.class) UserForm form,
                     BindingResult bindingResult) {
    // 更新用のチェック
    return "users/edit";
}

初学者はまず@Validで考える

新人のうちは、いきなり@Validatedやグループバリデーションを使いこなそうとしなくて大丈夫です。普通の入力チェックなら@Validで始める方が読みやすいです。

迷ったら、まず@Valid登録と更新でチェックを分けたい、メソッド引数を検証したいなど、理由が出てきたら@Validatedを検討します。

importの違いにも注意する

Spring Boot 3系では、@Validjakarta.validation.Validを使います。古い記事や古いプロジェクトではjavax.validation.Validが出てくることもあります。

import jakarta.validation.Valid;
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;

import org.springframework.validation.annotation.Validated;

プロジェクトのSpring Bootバージョンによってimportが違うため、サンプルをコピペして赤くなったときは、まずimportを確認しましょう。

現場での使い分け

  • 単純な画面入力: @Valid
  • JSON APIのRequest DTO: @Valid
  • 登録と更新でチェックを切り替える: @Validatedを検討
  • Serviceメソッドの引数検証: プロジェクト方針を確認して@Validatedを検討

使い分けで大事なのは、難しい方を使うことではありません。チームのコードを読んだ人が、なぜそのアノテーションなのか理解できることです。

レビュー前のセルフチェック

確認リスト

  • 普通の入力チェックなのに、理由なく@Validatedを使っていないか
  • 登録と更新でチェックを分ける必要が本当にあるか
  • importがプロジェクトのSpring Bootバージョンに合っているか
  • 既存コードの入力チェック方針から外れていないか

この記事とあわせて読みたい

まとめ

@Valid@Validatedは、どちらも入力チェックに関係します。初学者は、まず@Validを標準的な入口として理解しましょう。

@Validatedは、グループバリデーションなど明確な理由があるときに使うと考えると、現場コードでも迷いにくくなります。

-Spring
-, , , , ,