Spring Boot Model編

# Spring Bootのモデルクラスについて
本記事は，Spring Bootのモデルについて，主な役割や基本的な記述方法について説明する．
「Spring Boot」とは何かについては，以下の記事にまとめたのでそちらを参照してください．

https://qiita.com/thirai67/items/0944561dd46da84abdfa

# 主な役割
データベースから取得したデータやユーザーからの入力データを保持し，<ins>ビジネスロジックの実行やデータの取得・保存・更新・削除などの操作</ins>を行う．

# 基本的な記述方法
モデルクラスを作成するためには，**フィールド**，**コンストラクタ**，**ゲッターとセッター**，**ビジネスロジック**の４つを記述するのが基本である必．以下は，この４つを記述した例である．
```Java
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+"様";        
    }
}
```
**・フィールド**
フィールドはクラスの中で，データの値を値を保管するために使用する変数．最初にフィールドに格納するデータのデータ型を記述したあと，フィールド名を指定する．

**・コンストラクタ**
コンストラクとはオブジェクトの生成とともに自動的に呼び出される特殊なメソッドでオブジェクトの初期化を行うために使われる．<font color="Green">Spring Framework</font>では引数を渡さないデフォルトコンストラクタが必要になる場面があるため記述する．

**・ゲッター/セッター**
``getName``や``setName``のように``get/set``で始め， 参照したいフィールド名の先頭文字を大文字にして繋げるように定義する．
ゲッター(getter)：オブジェクトに設定されたフィールドの値を**取得**するためのメソッド
セッター(setter)：引数で渡された値をフィールドに**設定**するためのメソッド


**・ビジネスロジック**
データの計算や変換などのシステム固有の処理を行うビジネスロジックの実装を行う．データベースの処理などもビジネスロジックに含まれる．


# モデルの操作
モデルとして作成したクラスを利用するのは，基本的にコントローラークラスである．ここではコントローラークラスがモデルクラスをどのように操作するかを説明する．

```java
@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``は<font color="Green">Spring Framework</font>の**データバインディング**のアノテーションである．このアノテーションを使うことによって，HTTPリクエストのパラメータや属性をコントローラーメソッドの引数や戻り値に自動的に代入(バインディング)することができる．

↓モデルクラス
```Java
public class User{
    private String name;
    private Integer age;
    //setter&getter
    ...
}
```

↓コントローラクラス
```Java
@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``を使用した場合は，特定のリクエストパラメータの値を直接受け取ることができる．
↓コントローラクラス
```Java
@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``|直接利用できる|セッターによってオブジェクトに割当てなければいけない|