【Spring Boot入門】#0 事前準備

## はじめに
自身の知識のアウトプットも兼ねて、新人研修用に作成した記事となります。Spring Bootを学び始めた方を対象とした内容になっています。

## 環境要件
```none:環境要件
OS：Windows 10 Pro
Java：17.0.2
Spring Boot：3.3.4
DB：XAMPP(MySQL 10.4.21-MariaDB)
IDE：Spring Tool Suite 4(STS)
```

## 依存関係
新規プロジェクト作成時に、依存関係(機能)を追加します。
今回追加した依存関係は以下の通りです。

#### Lombok
Javaプログラミングにおける便利なライブラリで、コードの冗長性を減らし、開発効率を向上させます。アノテーションを用いることで、getterやsetter、toStringメソッドなどのボイラープレートコードを自動生成し、手動での記述を不要にします。

#### MySQL Driver
Spring BootアプリケーションがMySQLデータベースへ接続するために使用されるJDBCドライバです。MySQL Connector/Jが一般的に使用されます。

#### Spring-Boot Devtools
Spring Bootアプリケーションの開発を効率化するための追加ツールセットです。このモジュールは、開発中のアプリケーションに対して自動再起動やキャッシュの無効化などを提供し、コード変更に対する迅速なフィードバックループを実現します。

#### Spring-Data-JPA
Springフレームワークの一部であり、Java Persistence API（JPA）を使用してデータベースアクセスを簡素化するためのライブラリです。

#### Spring Web
Webアプリケーションの構築を効率化するための多くの機能を提供します。

#### Thymeleaf
Javaで書かれたテンプレートエンジンであり、特にSpring Bootアプリケーションで広く使用されています。Thymeleafは、HTMLやXMLをテンプレートとして使用し、動的なコンテンツを生成するための機能を提供します。

#### Validation
ユーザーからの入力データが正しいかどうかを検証するための機能です。

```xml:pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>3.3.4</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.example</groupId>
	<artifactId>crud_sample</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>crud_sample</name>
	<description>Demo project for Spring Boot</description>
	<url/>
	<licenses>
		<license/>
	</licenses>
	<developers>
		<developer/>
	</developers>
	<scm>
		<connection/>
		<developerConnection/>
		<tag/>
		<url/>
	</scm>
	<properties>
		<java.version>17</java.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-jpa</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-thymeleaf</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-validation</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-devtools</artifactId>
			<scope>runtime</scope>
			<optional>true</optional>
		</dependency>
		<dependency>
			<groupId>com.mysql</groupId>
			<artifactId>mysql-connector-j</artifactId>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<optional>true</optional>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<configuration>
					<excludes>
						<exclude>
							<groupId>org.projectlombok</groupId>
							<artifactId>lombok</artifactId>
						</exclude>
					</excludes>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>
```

## データベースを作成する
phpMyAdminなどのGUIやXAMPPコントロールパネルにあるshellを利用してデータベースを作成してください。
XAMPPのshellから実行する場合のコマンドは下記の通りです。
```shell:shell
# MySQLに接続
$ mysql -u root -p

# MySQLに接続後、DB作成
CREATE DATABASE sample;

# DB作成後、MySQLから抜ける
exit
```

## DB接続情報
```properties:application.properties
# MySQLの接続設定
spring.datasource.url=jdbc:mysql://localhost:3306/sample
spring.datasource.username=root
spring.datasource.password=

# Spring-JPA: DBのテーブルを自動作成してくれる機能
spring.jpa.hibernate.ddl-auto=update
```
#### spring.datasource.url
データベースへの接続URLです。ここではlocalhost:3306でMySQLに接続しています。データベース名は`sample`としています。

#### spring.datasource.username
MySQLのユーザー名です。ここではrootを設定しています。

#### spring.datasource.password
MySQLのパスワードです。今回は特に設定していません。

#### spring.jpa.hibernate.ddl-auto=update
`ddl-auto`を`update`にすることで、1回作成したテーブルは再作成せず、存在しないテーブルだけEntityの定義に基づいて新規作成してくれます。

## ディレクトリ構成と各レイヤーの役割
おおまかなディレクトリ構成は以下の通りです。
ここではWeb三層構造(アーキテクチャ)を意識した構成で実装したいと思います。
各レイヤーは独立した役割を持ち、**下位レイヤーにのみ依存**します。

```configuration:ディレクトリ構成
com/example/demo
├── CrudSampleApplication.java   // メインアプリケーションクラス
├── controller                   // コントローラー層
│   ├── form
│   │   └── CompanyForm.java     // ユーザー入力用フォームオブジェクト
│   └── CompanyController.java   // HTTP リクエストを処理
├── entity                       // モデル層 (エンティティ)
│   └── Company.java             // 会社データを表すエンティティ
├── repository                   // リポジトリ層
│   └── CompanyRepository.java   // データアクセスインターフェイス
└── service                      // サービス層
    └── CompanyService.java      // ビジネスロジック
```

#### メインアプリケーション（Main Application）
`CrudSampleApplication.java`：
Spring Bootアプリケーションのエントリーポイントです。このクラスが実行されることで、アプリケーションが起動します。

#### コントローラー層 (プレゼンテーション層)
このレイヤーはユーザーやクライアントからのリクエストを受け取り、適切なサービスメソッドを呼び出してデータを取得します。ユーザーインターフェイスとサービス層の仲介役を果たします。

`CompanyController.java`：
HTTPリクエストを処理し、対応するサービスメソッドを呼び出します。

`CompanyForm.java`：
フォームデータを受け取るためのオブジェクトです。ユーザーから入力されたデータをバインドし、コントローラで扱いやすい形にします。

#### サービス層 (ビジネスロジック層)
 ビジネスロジックを実装するレイヤーです。コントローラから呼び出され、リポジトリに対する適切なメソッドの呼び出しを行います。

`CompanyService.java`：
データの作成や更新、削除などの操作を行います。リポジトリレイヤーと連携して実行します。

#### リポジトリ層 (データアクセス層)
データの永続化（データベースとのやり取り）を行います。このレイヤーがデータベースと通信し、データの取得や保存、更新、削除を担当します。このレイヤーは、ビジネスロジックを直接のデータベースアクセスから分離します。

`CompanyRepository.java`：
Spring Data JPAを使って、データベースに対する操作を簡単に実施できるインターフェースです。

#### モデル層 (ドメイン層)
アプリケーションのデータ構造を表します。これらのクラスがデータベースのテーブルにマッピングされます。

`Company.java`：
`Company`テーブルを表すエンティティクラスです。テーブルの列に対応するフィールドを持ち、JPA (Java Persistence API) アノテーションでマッピングを定義しています。

#### 視覚的なフロー
```
[ユーザー] <---> [コントローラー層] <---> [サービス層] <---> [リポジトリ層] <---> [データベース]
```

#### まとめると...
**コントローラー層：** HTTP リクエストとユーザーの操作を処理します。
**サービス層：** ビジネスロジックを含み、データを処理します。
**リポジトリ層：** データアクセスとデータベースとの対話を管理します。
**モデル層：** データの構造 (エンティティ) を定義します。

このようなレイヤード・アーキテクチャを採用することの利点は、各レイヤーが異なる責務を持つため、コードの再利用性が高まり、テストがしやすくなり、アプリケーションのメンテナンス性が向上することです。

例えば、ビジネスロジックの変更があった場合でも、サービス層のみを変更すれば済み、他のレイヤーには影響を及ぼさないことが期待できます。

## さいごに
今回は事前準備と題し、環境要件から依存関係、ディレクトリ構成などCRUDアプリケーションを作成するために必要な作業や知識についてまとめました。
次回は新規登録画面の表示機能から作成していきます。

https://qiita.com/ioaio/items/b60055f5b334e8e313de