【Spring Boot】Lombokの基礎について学んだことをまとめた

# はじめに
初めまして。java初心者、エンジニア歴浅めの夜桜です。

転職して、java＋spring bootを使った開発案件に参画させていただくことになりました。
そこでの研修で、lombokという便利機能があることを知り、学んだことがたくさんあるのでこちらに残しておきたいと思います。

ちなみにqiitaの記事を書くのは初めてなのと、時間の合間合間に書いたので、もしかすると間違えていることおあるかと思うので、いろいろと内容や技術コメント等ご意見をいただければ幸いです。



# 前提知識
突如研修出てきたDAO、DTOという言葉。
これがデザインパターン（ソフトウェア開発でのよく使用される設計パターンのこと）という言葉だということを露知らず、、「今までなにやっとったんかいな」といわれるかと思ったら丁寧にやさしく研修担当の方に教えていただきました。
Lombokでどの部分が便利なのかを知るには、このあたりの知識が必要になるので不必要と感じられる方はスキップしてください。

# DAO/DTOデザインパターン
### DAO：データベース関連の処理をまとめたクラスのこと。
DAOクラスを使えば他のクラスでデータベース処理のやり取り処理ごとにデータベース処理（クエリ）を書く必要がなくなる。
DBへのinsert、update処理などを管理する。

### DTO：必要なデータを集めて、詰め込んで受け渡しやすい形にしたオブジェクトのこと。
必要なデータの受け渡し（サーバーサイドの処理で使うデータや、画面に表示するデータなど）に利用する。

イメージを下部に示す
※イメージは[こちら](https://kanda-it-school-kensyu.com/java-jdbc-contents/jj_ch04/jj_0402/)のサイトを参考にさせていただきました。
![DAO＆DTO.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3907998/42859b90-f31d-d487-c333-c00b1c44b108.png)


# Lombokとは
短刀直入に言うとこれがないとspring bootの開発効率は悪くなる。
Javaでの決まった定型コード（ボイラープレートコード）をソースコード上から排除するために使用されるライブラリを指す。
ボイラープレートコードには下記のものなどがあり、これらを機能ごとのDTOそれぞれでいちいちすべて実装するのは手間がかかる。
- フィールドの数に応じたGetter/Setterメソッド（数が多くなればなるほど、その分用意する必要があり、本質的でない）
- equals/hashCodeメソッド
- toStringメソッド
- コンストラクタ


Lombokはそれらを排除する代わりにアノテーションを付与することでこのような定型コードをコンパイル時に生成する仕組みを提供している。

# アノテーション
提供している代表的なアノテーションは下記となる。
|アノテーション|内容|
|---|---|
|@Getter| Getterメソッドの生成 |
|@Setter|Setterメソッドの生成  |
|@ToString| クラス内でtoStringメソッドをオーバーライドする場合のtoStringメソッド生成 | 
|@EqualsAndHashCode|クラス内でequals,hashCodeメソッドをオーバーライドする場合のequals,hashCodeメソッド生成 |
|@RequiredArgsCostructor| finalなど初期化が必要なフィールドに対してコンストラクタを生成 |
|@AllArgsConstructor|すべてのフィールドに対してコンストラクタを生成  |
|@NoArgsConstructor|デフォルトコンストラクタを生成  |
|@Data|@Getter, @Setter, @Totring, @EqualsAndHashCode, @RequiredArgsConstructorを指定したのと同じ意味  |

## JavaBeanで作った場合とLombokを使った場合の比較


```java:Food.java
public class Food {
    private int id;
    private String name;
    private int price;

    public Food() {
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return "Food{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", price=" + price +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Food food = (Food) o;
        return id == food.id &&
                price == food.price &&
                Objects.equals(name, food.name)
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, name, price);
    }
}
```
これがLombokだとたった数行でよくなる。

```java:Food.java
import lombok.Data;

@Data
public class Food {
    private int id;
    private String name;
    private int price;
}
```
# 終わりに
今回はLombokの代表的の機能についてまとめました。とは言っても手を動かしてJavaを触っていないとどこが便利なのかはイメージできないかもしれません。
まずは手を動かすところから取り組むのが大切だなと感じます。

実は他にもロガーインスタンスの生成として@Slf4j でクラスをアノテーションすることでlogという名前でロガーが使えたりもします。
このあたりはログ設計などでも有効に使えると思うので、継続して勉強したいと思います。


# 参考サイト
https://qiita.com/opengl-8080/items/671ffd4bf84fe5e32557

https://terasolunaorg.github.io/guideline/5.0.0.RELEASE/ja/Appendix/Lombok.html