【SpringBoot 学習記録】SpringBootを学習して理解するのにつまづいたこと

## はじめに
知人の紹介のもと、開発案件（女性同士のマッチングアプリ）に参画して半年ほどがたった。プロジェクトにおいてSpringBootを使うことになりはじめて触ることとなった。
プロジェクト自体はまだ続いているものの開発するにあたり理解するのに苦しんだことを記述したい。


## 開発する上で参考にした教材
自分が、SpringBootを理解するまで学んだ教材をあげる。基本はUdemyで紹介されている内容を参考に学んで行くのがとてもいいなと思った。

<b>Udemyおすすめ</b>

https://www.udemy.com/course/poco-tech-spring-boot-web-api/?utm_source=aff-campaign&LSNPUBID=QKiPp5ieN1I&utm_medium=udemyads&ranMID=47984&ranSiteID=QKiPp5ieN1I-MTECIqvC1P3WS4bBaMOKCg

これを視聴してできること
- Spring BootでWeb APIを実装できるようになる
- IntelliJを活用して、コードを記述する開発スタイルがわかるようになる
- Open API Schemaを活用しWeb APIのエンドポイントを設計できるようになる

<b>Kindle Unlimited 本 おすすめ</b>

https://www.amazon.co.jp/%E5%BE%8C%E6%82%94%E3%81%97%E3%81%AA%E3%81%84%E3%81%9F%E3%82%81%E3%81%AESpring-Boot-%E5%85%A5%E9%96%80%E6%9B%B8%EF%BC%9ASpring-%E8%A7%A3%E4%BD%93%E6%96%B0%E6%9B%B8%EF%BC%88%E7%AC%AC2%E7%89%88%EF%BC%89-Boot%E3%81%8C%E4%B8%B8%E5%88%86%E3%81%8B%E3%82%8A-ebook/dp/B08XPBPH9C?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=spring+boot&qid=1623468088&sr=8-1&linkCode=sl1&tag=techparrotcom-22&linkId=48a7e647e47b9f176332e694abad2aa8&language=ja_JP&ref_=as_li_ss_tl

https://www.amazon.co.jp/Spring%E5%BE%B9%E5%BA%95%E5%85%A5%E9%96%80-Spring-Framework%E3%81%AB%E3%82%88%E3%82%8BJava%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E9%96%8B%E7%99%BA-%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BENTT%E3%83%87%E3%83%BC%E3%82%BF/dp/4798142476?_encoding=UTF8&qid=1623468088&sr=8-9&linkCode=sl1&tag=techparrotcom-22&linkId=66cfe2071f1d163d40efb1a22bd45ed2&language=ja_JP&ref_=as_li_ss_tl

これを読んでできること
- Spring Bootを使ってMVCモデルの仕組みがわかる
- データベースを活用した事例の体験
- <b>Dependency Injection</b>や<b>AOP</b>といった少し難しい概念の理解

基本的なことを満遍なく学習できようになるのではないか。

## IntelliJでの開発の難しさ

これまでは、Vscodeを使い開発を進めてきたが、今回のプロジェクトでは`IntelliJ IDEA`を活用することになった。

IntelliJで開発をすると、どんなメリットがあるのか？使い慣れたVscodeでSpringBootを動かせないのかをずっと検証していた。

使いこなせるようになってきたら、IntelliJも悪くないなと思った。

- 自動でコードを補完してくれる
- リファクタリング機能
- デバック・ビルドなどをスムーズに実行してくれる

他にも色々なことが実行できて拡張性が高い。ただ自分の場合は理解して使用するのに6ヶ月くらいかかった。

## Spring Bootに関する難しさ
整理したいのはSpring BootとSpringは別物であるということである。同じJava言語を用いたものでアプリケーション開発に利用されるフレームワークという点では等しい。

Spring Bootはすぐに開発に着手できたり、自動で依存関係の管理がされたりなどできる。一方で、Springは設定が複雑で手間がかかり、大規模なシステムの開発には適しているということがわかった。

Spring BootもSpringも同じものだろうと決めつけずに学習できたのがポイントかもしれない。

### DTOという概念
DTOはデザインパターンの1種。Data Transfer Object（データ転送オブジェクト）の略である。レイヤーとの間で、データをやりとりするためのオブジェクトのことを指す。

要するに、データ専用の入れ物。データを送ったり受け取ったりする。

### DTOをなぜ使用するのか？
以下のようにエンティティまるまるレスポンスしてしまうために、問題が発生してしまう。

- passwordの情報をそのまんま返却してしまう恐れがある
- 無駄なデータを送り重くなる
- 仕様の変更に弱い

```.java
@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String username;
    private String email;
    private String password;
}

@RestController
@RequestMapping("/users")
public class UserController {
    
    private final UserRepository userRepository;

    @GetMapping("/{id}")
    public User getUser(@PathVariable Long id) {
        return userRepository.findById(id).orElseThrow();
    }
}
```

```.json
{
    "id": 1,
    "username": "testuser",
    "email": "test@example.com",
    "password": "hashed_password123"
}
```
値をすべて返却してしまうのは、よろしくない。そのためにDTOが必要であるのだなあと感じた。

### 3層アーキテクチャ
3つの関心ごとにコードをまとめる発想のことを指している。

|  | 層の名前 | アノテーション | 役割 |
| ---- | ---- | ---- | ---- |
| 1 | プレゼンテーション | `@Controller` | 画面からの入出力 |
| 2 | ビジネスロジック層 | `@Service` | 業務ロジック |
| 3 | データアクセス層 | `@Repository` | データの保存や取得 |

Laravelを学んでいた自分にとっては、このService層が標準ではなく、新鮮な気持ちで学んだ。

### アノテーション

アノテーションとは、コードに特別な指示を与える「ラベル」のようなものです。`@`マークで始まり、クラスやメソッドの前に記述する。

役割として

1. コードの簡略化：複雑な設定を簡単に実施できる
1. 自動化：SpringBootが自動的に必要な設定を実施できる
1. 意図を明確化する：コードの目的をはっきりさせる

このようなものとして扱われるのである。

代表的なもの
| アノテーション名 | 説明 | 
| ---- | ---- | 
| `@RestController` | RESTfulなWebサービスを提供するコントローラーを示す。`@Controller`と`@ResponseBody`を組み合わせたもの | 
| `@GetMapping` | GETリクエストを処理するためのショートカット |
| `@Autowired` | Springの依存性注入を行うために使用される。自動的にBeanを注入する |

初見でアノテーションをみたときは何をさしているのかまったくわからなかったが、意図をつかんできたら一気に理解が進んでいった。

## おわりに
Spring Bootを学んでつまずいたことをまとめた。DIやMapperなどのまだ理解し尽くせていないことがあるが、引き続き学習を継続していきたいと思う。