Kotlin+Spring開発時、JpaとQuerydslも利用したい場合、Gradleを利用して、マルチモジュールプロジェクトを設定する方法をまとめてみました。 全てのコードは Github にアップされています。
バージョン
- Spring Boot 2.6.4
- Gradle 7.4
- Java 17
- Postgres 13
プロジェクト構成
- ApiプロジェクトはDomainプロジェクトを利用します。
- ApiプロジェクトにはServiceとControllerなどが入っていて、DomainプロジェクトにはEntityとRepositoryが入っています。
C:.
│ .gitignore
│ build.gradle.kts
│ docker-compose.yml
│ gradle.properties
│ gradlew
│ gradlew.bat
│ README.md
│ settings.gradle.kts
│
├───api ## Service, Controller
│ │ build.gradle.kts
│ │
│ └───src
│ ├───main
│ │ ├───java
│ │ ├───kotlin
│ │ │ └───com
│ │ │ └───study
│ │ │ └───jpashop
│ │ │ └───api
│ │ │
│ │ └───resources
│ │ application.yml
│ │ messages.properties
│ │
│ └───test
│ ├───java
│ ├───kotlin
│ │ └───com
│ │ └───study
│ │ └───jpashop
│ │ └───api
│ │
│ └───resources
│ application.yml
│
├───domain ## Entity, Repository
│ │ build.gradle.kts
│ │
│ └───src
│ ├───main
│ │ ├───java
│ │ ├───kotlin
│ │ │ └───com
│ │ │ └───study
│ │ │ └───jpashop
│ │ │ └───domain
│ │ │
│ │ └───resources
│ └───test
│ ├───java
│ ├───kotlin
│ │ └───com
│ │ └───study
│ │ └───jpashop
│ │ └───domain
│ │
│ └───resources
│ application.yml
│
├───gradle
│ └───wrapper
│ gradle-wrapper.jar
│ gradle-wrapper.properties
│
└───postgres
└───initdb
1_init.sql
Gradle設定
jpashop/build.gradle.kts
- Annotation processorsは
kapt
を利用し、JPAプラグインとLazy Loadingを利用するためにplugin.spring
をfalseにしておきます。後で必要なプロジェクトにプラグインをapplyします。 - Lazy Loadingを利用するためにはEntityは
open
である必要がありますが、kotlinはクラスとメンバーがデフォルトでfinal
になるため、kotlin-spring
プラグインを利用します。Spring AOPを利用し、@Transactional、@Configurationなどのアノテーションを利用するためにはopen
である必要があるため、全てのプロジェクトにkotlin-spring
プラグインを適用しました。 - コードスタイルチェックのために、kotlin用のLinterであるktlintを設定しました。
jpashop/domain/build.gradle.kts
kotlin-spring
プラグインが基本的に@Transactional、@Configuration、@RestControllerなどのアノテーションがあるとopen
にしてくれますが、javax.persistence
中のEntityもopen
にするためには個別設定が必要です。- プロジェクトビルド時、
javax.persistence.Entity
アノテーションがあるEntityクラスの場合は、Qクラス作成のために、Annotation processorsはkapt
を利用するように設定しました。
jpashop/api/build.gradle.kts
- ApiプロジェクトではDomainプロジェクトを利用するように、プロジェクト依存性を追加しました。
もっと綺麗に書ける方法もあると思いますが、いったんビルドは成功し、APIを正しく動作していることを確認しました。
全てのコードは Github にアップされています。