Springアノテーションまとめ

# はじめに
自己学習として、springbootを学んでいます。「アノテーションって、すごい便利！」と感動しましした。と共に、たくさん種類があって、きちんと覚えないといけないという思いから備忘録として書くことにしました。100％完全理解ではなく、学習していく中で自分なりに重要だと思うものをピックアップして簡単な説明となっています。初心者なので、間違いがあればご指摘ください！
※随時更新予定

# Controller,Serviceに主に記述するアノテーション
# @Autowired
springが自動的に依存関係を解決し、対応するインタンスを注入する。ServiceやHttpSessionなど以下のように記述することでそのクラスのインタンスを使えるようになる。
```
@Autowired
SampleService sampleService;
@Autowired
HttpSession session; 
```

# 主にControllerに記述するアノテーション
# @Controller 
クラスに対してそのクラスをControllerとして認識する。

# @RequestParam
ブラウザからリクエストパラメータを取得することができる。
指定可能な属性は、
name・value→値を取得するパラメータ名を指定。下の例でいうと、sampleDateがパラメータ名。
required→パラメータが必須かどうかを指定。省略した場合は、必須(true)が適用される。下記の例はfalseなので、必須ではない。
defaultValue→パラメータが存在しない場合に適用するデフォルト値を指定。
```
public ModelAndView top(@RequestParam(name="sampleDate", required=false) String sampleDate){
//処理                  
```
# @GetMapping
HTTPリクエストのGETメソッドを受け付ける。画面表示などに使われる。
```
@GetMapping
public ModelAndView top(@RequestParam(name="sampleDate", required=false) String sampleDate){
//処理                  
```

# @PostMapping
HTTPリクエストのPOSTメソッドを受け付ける。値をテーブルに格納する処理などに使われる。
```
@PostMapping("/sample")
    public ModelAndView addSample(@ModelAttribute("sampleModel") @Validated SampleForm sampleForm,
                                   BindingResult result, Model model){
```

# @PutMapping
HTTPリクエストのPutメソッドを受け付ける。データの更新、編集処理のなどに使われる。
```
@PutMapping("/update/{id}")
    public ModelAndView updateSample (@PathVariable Integer id,
                                       @ModelAttribute("formModel") @Validated
                                       SampleForm sample, BindingResult result ) {
```

# @DeleteMapping
HTTPリクエストのメソッドを受け付ける。データの更新、編集処理のなどに使われる。
```
@DeleteMapping("/delete/sample/{id}")
    public ModelAndView deleteSample(@PathVariable Integer id) {
```

# @PathVariable
URL内でのパス変数値を取得する。メソッドの引数に指定する。下記の例でいうと、idがという名前のパス変数を指定。
URL：localhost:8080/edit/1→これを取得する。
```
@GetMapping("/sample/{id}")
    public ModelAndView editSample(@PathVariable Integer id) {
```
# @ModelAttribute
・引数として使う場合
Modelに格納されているオブジェクトを引数として受け取ることができる。
sampleFormから送られてくる値"formModel"オブジェクトにバインドされる。
```
@PostMapping("/sample")
    public ModelAndView addContent( @Validated@ModelAttribute("formModel")  SampleForm sampleForm,
                                    BindingResult result){
```
・メソッドのアノテーションとして使う場合
Modelに格納されているオブジェクトを返却する。

# @Validated
画面から送られてきたFormの送信された値をバリデーションチェックするために使う。
下記で言うと、sapleFormがバリデーションチェックの対象となる。
```
@PostMapping("/sample")
    public ModelAndView addContent( @Validated@ModelAttribute("formModel")  SampleForm sampleForm,
                                    BindingResult result){
```

# Formに主に記述するアノテーション
# @NotNull
送信された値（フィールド）がNullかどうかをチェックする。

# @NotBlank
送信された値が空白であるかどうかをチェックする。空文字も不可にしてくれる。

# @Size
送信された値の文字の長さをチェックする
```
@Size(max =30, min =5)
//最大３０、最小５文字までにしてくれる
```

# @Min
送信された値そのものの最小値を設定する。
# @Max
送信された値そのものの最大値を設定する。
```
商品登録フォーム(GoodsForm)があったとして、
@Getter
@Setter
public class GoodsForm {
    private int id;
    @NotBlank(message ="商品名を入力してください")
    @Size(max = 30, message="商品名は30文字以下で入力してください")
    private String name;
    @NotNull(message ="価格を入力してください")
    @Min(value = 10, message ="10円以上で入力してくだい")
    @Max(value =9999,message ="9999円以下で入力してください")

```
# Entityに主に記述するアノテーション
# @Entity
Entityクラスに記述する。Entityクラスであることを明示的にする。


# @Table
エンティティに対応するテーブル名を指定する。
# @Id
Entityクラス内で定義した主キーに付与し、プライマリキーのプロパティまたはフィールドであることを示す。

# @Column
データベースのテーブルの行に対応させるEntityクラス内で定義したテーブルのカラム名に相当するメンバ変数に付与

```
@Table(name = "sample")//sampleテーブルと接続
@Getter
@Setter
public class Sample {
    @Id
    @Column
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
```
# @GeneratedValue(strategy = GenerationType.IDENTITY)
一意の主キーを自動的に生成してくれる。データベース上でカラムのidが0になっている時など使えばエラーが解決することがある。
```
@Table(name = "sample")
@Getter
@Setter
public class Sample {
    @Id
    @Column
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
```

# @Temporal
日付や時間の属性に対して使用する。パラメータに日付・時間を格納できる。投稿やコメントの投稿時間や更新時間を設定したい時に使う。

```
public class Sample {
 @Temporal(TemporalType.TIMESTAMP)
    private Date updatedDate;
```
# @ManyToOne @JoinColumn
データベース間の多対１の関係を実現する。下記の例でいうと、@JoinColumn(name ="customer_id", referenceColumName ="id")が外部キーを指定する。複数のテーブルを結合して値を取得したい時に、Entityに記述する。
```
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name ="customer_id", referenceColumName ="id")
private Custoemr customer;
```
# Filter系のファイルに記述するアノテーション
# @Configuration
コンテキストへのBeanの追加登録や、構成クラスを追加でインポートできるようにする。フィルター機能を実装する時などに使用。
```
@Configuration
public class FilterConfig {
    @Bean
    public FilterRegistrationBean myFilter() {

```