spring initializr の Dependencies に何入れる？


# はじめに
この記事は、webアプリ開発のバックエンドを構築するときに、
spring initializr の Dependencies に何を入れて始めればよいかわからない
私の悩みを解決するものです。


# 前提条件
やりたいこと
  - TDDをしながら、webアプリ開発を行う
  - spring initializr を使ってバックエンドを構築する
<br>

技術スタック
  - Kotlin
  - Spring Boot
  - PostgreSQL


# spring initializr の Dependencies に何を入れる？
色んなプロダクトの build.gradle.kts の dependencies を眺めてみて、だいたいここら辺かなと・・・。

#### Spring Web
Build web, including RESTful, applications using Spring MVC.
Uses Apache Tomcat as the default embedded container.
(google翻訳)
Spring MVC を使用して、RESTful を含む Web アプリケーションを構築します。
Apache Tomcat をデフォルトの組み込みコンテナとして使用します。

#### Spring Data JPA
Persist data in SQL stores with Java Persistence API using Spring Data and Hibernate.
(google翻訳)
Spring Data と Hibernate を使用した Java Persistence API で SQL ストアにデータを永続化します。

#### PostgreSQL Driver
A JDBC and R2DBC driver that allows Java programs to connect to a PostgreSQL database using standard, database independent Java code.
(google翻訳)
Java プログラムが標準のデータベースに依存しない Java コードを使用して PostgreSQL データベースに接続できるようにする JDBC および R2DBC ドライバー。

#### H2 Database
Provides a fast in-memory database that supports JDBC API and R2DBC access, with a small (2mb) footprint.
Supports embedded and server modes as well as a browser based console application.
(google翻訳)
JDBC API と R2DBC アクセスをサポートする高速なインメモリ データベースを、小さい (2MB) フットプリントで提供します。
埋め込みモードとサーバー モード、およびブラウザ ベースのコンソール アプリケーションをサポートします。

#### Spring Boot DevTools
Provides fast application restarts, LiveReload, and configurations for enhanced development experience.
(google翻訳)
アプリケーションの高速な再起動、LiveReload、および開発エクスペリエンスを強化するための構成を提供します。




# dependencies に何が入るのか？
build.gradle.kts の dependencies に何が入るのか検証してみたいと思います。<br>

#### spring initializr の Dependencies 以外の設定
- Project: Gradle - Kotlin
- Language: Kotlin
- Spring Boot: 3.2.2
- Project Metadata
  - Packaging: Jar
  - Java: 17


#### a. 何も入れないとき
```kotlin
dependencies {
  implementation("org.springframework.boot:spring-boot-starter")
  implementation("org.jetbrains.kotlin:kotlin-reflect")
  testImplementation("org.springframework.boot:spring-boot-starter-test")
}
```
<br>

#### b. Spring Web のみを入れたとき(a.と比較)
```diff_kotlin
dependencies {
- implementation("org.springframework.boot:spring-boot-starter")
+ implementation("org.springframework.boot:spring-boot-starter-web")
+ implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
  implementation("org.jetbrains.kotlin:kotlin-reflect")
  testImplementation("org.springframework.boot:spring-boot-starter-test")
}
```
<br>


#### c. Spring Data JPA のみを入れたとき(a.と比較)
```diff_kotlin
dependencies {
- implementation("org.springframework.boot:spring-boot-starter")
+ implementation("org.springframework.boot:spring-boot-starter-data-jpa")
  implementation("org.jetbrains.kotlin:kotlin-reflect")
  testImplementation("org.springframework.boot:spring-boot-starter-test")
}
```
<br>


#### d. PostgreSQL Driver のみを入れたとき(a.と比較)
```diff_kotlin
dependencies {
  implementation("org.springframework.boot:spring-boot-starter")
  implementation("org.jetbrains.kotlin:kotlin-reflect")
+ runtimeOnly("org.postgresql:postgresql")
  testImplementation("org.springframework.boot:spring-boot-starter-test")
}
```
<br>


#### e. H2 Database のみを入れたとき(a.と比較)
```diff_kotlin
dependencies {
  implementation("org.springframework.boot:spring-boot-starter")
  implementation("org.jetbrains.kotlin:kotlin-reflect")
+ runtimeOnly("com.h2database:h2")
  testImplementation("org.springframework.boot:spring-boot-starter-test")
}
```
<br>


#### f. Spring Boot DevTools(a.と比較)
```diff_kotlin
dependencies {
  implementation("org.springframework.boot:spring-boot-starter")
  implementation("org.jetbrains.kotlin:kotlin-reflect")
+ developmentOnly("org.springframework.boot:spring-boot-devtools")
  testImplementation("org.springframework.boot:spring-boot-starter-test")
}
```
<br>

#### 上記の検証でわかったこと
1\. spring initializr の Dependencies に何も選択していなくても、
`spring-boot-starter`、`kotlin-reflect`、`spring-boot-starter-test` が入っている

2\. `Spring Web` と `Spring Data JPA` を入れたときに、
`spring-boot-starter` は入らない
[理由]
`spring-boot-starter-web` と `spring-boot-starter-data-jpa` には、`spring-boot-starter`の機能を含んでいるから

ふ〜ん。。。

# たぶんあとから追加でほしくなる
色んなプロダクトを眺めていたときに、よく使われていそうだなと感じたもの

#### MockK
Kotlin用のモックライブラリ

#### Flyway
DBのスキーマやデータのバージョン管理を行うツール


# 結論
spring initializr の Dependencies には
  - Spring Web
  - Spring Data JPA
  - PostgreSQL Driver
  - H2 Database
  - Spring Boot DevTools

を入れる！

テストを書いててモックが必要になったら `MockK` を、
DBのバージョン管理がしたくなったら `Flyway ` を入れて開発を進めたいと思います〜！


# さいごに
ここまでやる必要あったのか？？と思いつつも、ずっと気になっていたことが検証できてスッキリしました🥳