【初心者向け】3層アーキテクチャ in Spring Boot

Webアプリケーション開発でよく使用される3層アーキテクチャについて、Spring Bootでの実装とともに説明してきます。今回は従業員管理システムの実装を例に話を進めていきます。Spring BootでWebアプリ開発を始めたばかりの方の参考になれば幸いです。

## 記事の構成
前半で3層アーキテクチャの基本を図解し、後半でSpring Bootでの3層アーキテクチャの実装を紹介します。


## 1. 3層アーキテクチャ
### 全体像をつかむ

![スクリーンショット 2023-10-16 21.46.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576475/00b663f4-4c40-4e19-cb0a-b02329935fc8.png)

### 3層アーキテクチャの基本
3層アーキテクチャはプレゼンテーション層、ビジネスロジック層、データアクセス層（データ層）の3層からなるアーキテクチャです。

### ① プレゼンテーション層

- クライアントから受け取ったHTTPリクエストを処理し、ビジネスロジック層に渡す
- JSONをDTOに、DTOをJSONに変換 (Jacksonというライブラリを使用)
- HTTPレスポンスをクライアントに返す

### ② ビジネスロジック層
- プレゼンテーション層とデータアクセス層の仲介役として、クライアントにデータが返される前に、またはデータベースにデータが保存される前に、データ処理を行う
- ユーザーが入力したデータがアプリケーションの条件を満たすかどうか確認する。例えば、従業員のメールアドレスが正しいか、ユーザーの年齢が18歳以上か等をチェックする
- プレゼンテーション層に処理結果を返す
- データアクセス層とやりとりしてデータを取得・保存する

### ③ データアクセス層
- データベースに対してCRUD操作を行う

### 一連の流れを図で理解してみる
![スクリーンショット 2023-10-17 18.27.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576475/65315ec9-79bd-74d7-f62b-d713d94035be.png)


![スクリーンショット 2023-10-18 12.37.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576475/9ff5e7d2-fdb9-27d2-22c1-a3c6b50b793a.png)

1. クライアント（今回はPostmanを使用）が、ID:70の従業員のデータを取得するためHTTP GETリクエストを送信
2. プレゼンテーション層でHTTPリクエストを処理し、ビジネスロジック層に渡す
3. 必要に応じて、ビジネスロジック層で上に示したような処理を行う
3. データアクセス層でID:70の従業員のデータをDBから取得する
4. 逆の処理が行われ、クライアントが従業員のデータをJSON形式で取得する


## 2. 実装
このアーキテクチャをSpring Bootで実装する際、通常それぞれの層の役割を担うクラスを該当するパッケージ内でまとめます。
- プレゼンテーション層 - Controllerパッケージ > Controllerクラス
- ビジネスロジック層 - Serviceパッケージ > Serviceクラス
- データアクセス層 - Repositoryパッケージ > Repostitoryクラス

### プレゼンテーション層（Controllerパッケージ）
- Controllerパッケージ内のクラスには<span>@</span>RestController または <span>@</span>Controllerアノテーションを付与する
- 通常、これらのアノテーションが付与されたControllerクラス内でSerivceクラスを呼ぶ

![2023-10-17 15.24のイメージ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576475/93c95f1e-4d1b-de4b-d885-9813f3b77fb0.jpeg)


### ビジネスロジック層(Serviceパッケージ)
- Serviceパッケージ内のクラスには、<span>@</span>Serviceアノテーションを使用する
- Serviceクラス内で、Repositoryクラスを呼ぶことがある

![2023-10-18 12.20のイメージ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576475/c0ee7255-9acf-074b-a454-745787668f45.jpeg)

![2023-10-17 15.30のイメージ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576475/c3ed782c-c3b7-db87-79f9-d4b409be9031.jpeg)

### データアクセス層(Repositoryパッケージ)
- Repositoryパッケージ内のクラスには、<span>@</span>Repositoryアノテーションを付与することがある
- JpaRepositoryインターフェイスを継承した独自のインターフェイスを定義することで、基本的なCRUD操作が可能
- 今回の例では、JpaRepository\<Employee, Long>を継承するEmployeeRepositoryインターフェイスを定義することで、Employeeエンティティに対してCRUD操作を行うことができる。JpaRepository\<Employee, Long>では、Employeeエンティティの主キーのデータ型Longを指定している

![2023-10-18 12.18のイメージ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576475/c4277b56-b831-09f2-1e00-d170e3a348dc.jpeg)




## まとめ
今回のSpring Bootによる3層アーキテクチャの全体像を示します。

![スクリーンショット 2023-10-17 16.36.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576475/8a8dd5f5-6985-539d-c37b-16dd956bff87.png)

 ## 参照
日本語

https://qiita.com/os1ma/items/7a229585ebdd8b7d86c2

英語

https://www.javatpoint.com/spring-boot-architecture

https://www.geeksforgeeks.org/business-logic-layer/

https://www.javaguides.net/2020/07/three-tier-three-layer-architecture-in-spring-mvc-web-application.html

https://codingnconcepts.com/spring-boot/jackson-json-request-response-mapping/

YouTubeで分かりやすいと思ったTeddy Smithさんの動画

https://www.youtube.com/watch?v=0jZvOGnVcJ0