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

  1. Annotation processorsはkaptを利用し、JPAプラグインとLazy Loadingを利用するためにplugin.springをfalseにしておきます。後で必要なプロジェクトにプラグインをapplyします。
  2. Lazy Loadingを利用するためにはEntityはopenである必要がありますが、kotlinはクラスとメンバーがデフォルトでfinalになるため、kotlin-springプラグインを利用します。Spring AOPを利用し、@Transactional、@Configurationなどのアノテーションを利用するためにはopenである必要があるため、全てのプロジェクトにkotlin-springプラグインを適用しました。
  3. コードスタイルチェックのために、kotlin用のLinterであるktlintを設定しました。

jpashop/domain/build.gradle.kts

  1. kotlin-springプラグインが基本的に@Transactional、@Configuration、@RestControllerなどのアノテーションがあるとopenにしてくれますが、javax.persistence中のEntityもopenにするためには個別設定が必要です。
  2. プロジェクトビルド時、javax.persistence.EntityアノテーションがあるEntityクラスの場合は、Qクラス作成のために、Annotation processorsはkaptを利用するように設定しました。

jpashop/api/build.gradle.kts

  1. ApiプロジェクトではDomainプロジェクトを利用するように、プロジェクト依存性を追加しました。

もっと綺麗に書ける方法もあると思いますが、いったんビルドは成功し、APIを正しく動作していることを確認しました。

全てのコードは Github にアップされています。

参照