@ModelAttribute徹底解説!【初心者向け】

こんにちは!今回は、Spring Frameworkでよく使われるアノテーションの一つである @ModelAttribute について、初心者向けにわかりやすく解説します。


@ModelAttributeとは?

@ModelAttribute とは、

「リクエストパラメータをオブジェクトにマッピングし、ビューに渡すためのアノテーション」

です。

よくわからないので具体例を見ていきましょう。

通常のPostMappingの受け渡し

例えば、Webでユーザー情報をフォーム入力して、/submitのURLに送信するとします。
それを受け取る@PostMappingはこうなりますね。
result.htmlというビューを返しています。

@PostMapping("/submit")
public String submitForm(@RequestParam User user, Model model) { 
    model.addAttribute("user", user);
    return "result";
}


ここで送られてきたUser型のデータをビュー(result.html)で使うときには、Modelという箱を用意して、その箱に送られてきたデータを載せなくてはいけません。

それでは、@ModelAttributeをつかうとどうなるか見ていきましょう。

@ModelAttributeを使った場合

同じくWebでユーザー情報をフォーム入力して、/submitのURLに送信すると、たったこれだけで同じ動作になります。

@PostMapping("/submit")
public String submitForm(@ModelAttribute User user) {  
    return "result";
}

自動的に送られてきたUser型のデータを箱に格納し、ビューに渡す機能まで兼ね備えているということです。
まとめてみましょう。

まとめると、、

  1. リクエストデータをオブジェクトにバインドする
    フォームから送られてくるデータ(リクエストパラメータ)をオブジェクトに変換し、コントローラーで処理できるようにします。
  2. モデルにデータを追加する
    コントローラーメソッドの引数に @ModelAttribute を付けることで、オブジェクトをビューに渡すことができ、テンプレートエンジン(例:Thymeleaf, JSPなど)で利用可能になります。

@ModelAttributeの引数

@ModelAttribute にも引数があります。

value属性

@ModelAttributevalue 属性で、モデルに追加するオブジェクトの名前を指定できます。

@PostMapping("/register")
public String registerUser(@ModelAttribute("newUser") User user, Model model) {
    model.addAttribute("user", user);  // テンプレートでは "newUser" ではなく "user" として参照
    return "userProfile";
}

この場合、テンプレートで参照するときは "newUser" ではなく、model.addAttribute("user", user); で追加された "user" としてアクセスします。

@ModelAttributeの応用編

次に、@ModelAttribute の少し高度な使い方を紹介します。

1. モデルにデフォルトデータを追加する

@ModelAttribute は、メソッドの引数だけでなく、メソッドそのものにも使うことができます。これにより、テンプレートに渡すデータを事前に設定することが可能です。

@Controller
public class ProductController {

    // 全てのリクエストに対して、カテゴリリストをモデルに追加
    @ModelAttribute("categories")
    public List<String> addCategories() {
        return Arrays.asList("Electronics", "Books", "Clothing");
    }

    // 商品を表示するメソッド
    @GetMapping("/products")
    public String getProduct() {
        return "productDetail";
    }
}

この例では、@ModelAttribute("categories") というメソッドを使って、productDetail.htmlというビューでカテゴリのリストを使うことができます。

2. バリデーションとの併用

@ModelAttribute と併せてバリデーションを行うことも可能です。Springの @Valid アノテーションを使用すれば、入力されたデータが正しいかどうかを自動的にチェックしてくれます。

@Controller
public class UserController {

    // ユーザー登録フォームから送信されたデータをバリデート
    @PostMapping("/register")
    public String registerUser(@Valid @ModelAttribute User user, BindingResult result, Model model) {
        if (result.hasErrors()) {
            return "registrationForm";  // バリデーションエラーがあればフォームに戻す
        }
        userService.save(user);  // エラーがなければ保存
        model.addAttribute("user", user);
        return "userProfile";
    }
}

この場合、@Valid アノテーションを付けることで、User オブジェクトに対してバリデーションが行われます。もしバリデーションエラーが発生した場合、BindingResult オブジェクトにそのエラーが格納され、処理を分岐させることができます。


おわりに

@ModelAttribute を使うことで、リクエストデータを簡単にオブジェクトにマッピングでき、またテンプレートに渡すデータをコントローラーレベルで管理できます。今回は、基本的な使い方から応用例まで紹介しましたので、実際にコードを書いて試してみてください!

もっと詳しく知りたい方は、Spring公式ドキュメントを見てみてくださいね。

他の記事が見たい方はこちら!↓↓↓

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