Spring Bootのモデルクラスについて
本記事は,Spring Bootのモデルについて,主な役割や基本的な記述方法について説明する.
「Spring Boot」とは何かについては,以下の記事にまとめたのでそちらを参照してください.
主な役割
データベースから取得したデータやユーザーからの入力データを保持し,ビジネスロジックの実行やデータの取得・保存・更新・削除などの操作を行う.
基本的な記述方法
モデルクラスを作成するためには,フィールド,コンストラクタ,ゲッターとセッター,ビジネスロジックの4つを記述するのが基本である必.以下は,この4つを記述した例である.
public class HelloModel{
//フィールド
private String name;
//コンストラクタ
public ModelClass(){
}
//ゲッター
public String getName(){
return name;
}
//セッター
public void setName(String name){
this.name = name;
}
//ビジネスロジック
public String helloText(){
return "こんにちは"+name+"様";
}
}
・フィールド
フィールドはクラスの中で,データの値を値を保管するために使用する変数.最初にフィールドに格納するデータのデータ型を記述したあと,フィールド名を指定する.
・コンストラクタ
コンストラクとはオブジェクトの生成とともに自動的に呼び出される特殊なメソッドでオブジェクトの初期化を行うために使われる.Spring Frameworkでは引数を渡さないデフォルトコンストラクタが必要になる場面があるため記述する.
・ゲッター/セッター
getName
やsetName
のようにget/set
で始め, 参照したいフィールド名の先頭文字を大文字にして繋げるように定義する.
ゲッター(getter):オブジェクトに設定されたフィールドの値を取得するためのメソッド
セッター(setter):引数で渡された値をフィールドに設定するためのメソッド
・ビジネスロジック
データの計算や変換などのシステム固有の処理を行うビジネスロジックの実装を行う.データベースの処理などもビジネスロジックに含まれる.
モデルの操作
モデルとして作成したクラスを利用するのは,基本的にコントローラークラスである.ここではコントローラークラスがモデルクラスをどのように操作するかを説明する.
@Controller
public class HelloController {
@GetMapping("/hello")//↓リクエストパラーメータからデータを取得
public String hello(@RequestParam(name = "name") String name, Model model){
//↓モデルクラスのインスタンスを作成
HelloModel hm = new HelloModel();
//モデルクラスのフィールドに取得データを設定
hm.setName(name);
String text;
//ビジネスロックの実行
text = helloText();
//ビューへの受け渡し
model.attribute("result", text);
return "hello";
}
}
1. モデルのインスタンスの作成
モデルとして作成したクラスを利用するためにインスタンスを作成する.このクラスには,ビジネスロジックやデータベース操作を行うために必要なフィールドやメソッドを保持するクラスで,それを利用するために最初にクラスのインスタンスを生成する.
2. リクエストパラメータやフォームデータなどから必要なデータを取得
リクエストやパラメータからデータを受け取る.例では,@RequestParam
アノテーションを利用することで,ビューから送られてきたフォームからデータを受け取っている.
3. インスタンスのフィールドに設定
リクエストパラメータなどで取得したデータをインスタンスのフィールドに設定する.モデルクラスで記述したセッターメソッドset○○()
を利用する.
4. ビジネスロジックを実行やデータベースへの操作
モデルクラスが持つビジネスロジックやデータベースの操作するメソッドを呼ぶ.メソッド内で処理するフィールドにはセッターで設定された値が含まれている.
例のModel model
は,ビューにデータを受け渡すために使う.これに関しては,Spring BootのView編で扱う.
ModelAttributeとは
@ModelAttibute
はSpring Frameworkのデータバインディングのアノテーションである.このアノテーションを使うことによって,HTTPリクエストのパラメータや属性をコントローラーメソッドの引数や戻り値に自動的に代入(バインディング)することができる.
↓モデルクラス
public class User{
private String name;
private Integer age;
//setter&getter
...
}
↓コントローラクラス
@GetMapping("/hello")
public String hello(@ModelAttribute User user){//Userオブジェクト
//userインスタンスにバインディングされたnameを取得
System.out.prinln("Hello" +user.getName() + "!");
return "hello";
}
ビューからのリクエストパラメータの属性とオブジェクトのフィールド名(name
とage
)が一致していれば,コントローラメソッド(hello
)の処理が実行される前に,リクエストパラメータの値をオブジェクトの変数に割り当ててくれる.
RequestParamとの違い
@RequestParam
もHTTPリクエストのパラメータをコントローラメソッドの引数としてバインディングするアノテーションです.@RequestParam
を使用した場合は,特定のリクエストパラメータの値を直接受け取ることができる.
↓コントローラクラス
@GetMapping("/hello")
public String hello(@RequestParam(name = "name")String name, @RequestParam(value = "age") int age){
System.out.prinln("Hello" +name + "!");
return "hello";
}
@RequestParam
を利用する場合は,(name = "name")
や(value = "age")
のようにリクエストパラメータのname
属性またはvalue
属性で指定したものを取得する.特定のものを直接取得できるが,オブジェクトのフィールドに自動で割り当てるわけではないので,セッターを利用してバインディングする必要がある.
両方のメリットデメリットをまとめると以下になる.
メリット | デメリット | |
---|---|---|
@ModelAttribute |
自動でオブジェクトに割当て | ゲッターによって利用 |
@RequestParam |
直接利用できる | セッターによってオブジェクトに割当てなければいけない |