Kotlin + SpringBoot개발 시 Jpa, Querydsl을 사용하는 경우 Gradle로 멀티 모듈 프로젝트를 설정하는 방법을 정리해 보았습니다. 모든코드는 Github 에 올려두었습니다.

버전

  • Spring Boot 2.6.4
  • Gradle 7.4
  • Java 17
  • Postgres 13

프로젝트 구성

  • Api프로젝트는 Domain프로젝트를 사용합니다.
  • Api프로젝트에는 Service, Controller가 있고, Domain프로젝트에는 엔티티와 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을 사용하기 위해서는 엔티티는 open이어야 하는데 kotlin은 클래스와 멤버의 기본이 final이기 때문에 kotlin-spring플러그인을 사용해서 open으로 변경합니다. 그리고 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안의 엔티티는 개별로 설정해 주어야 합니다.
  2. 프로젝트 빌드 시 javax.persistence.Entity어노테이션이 있는 엔티티 클래스인 경우 Q클래스를 작성하도록 하기 위해서 Annotation processors는 kapt를 이용하도록 설정했습니다.

jpashop/api/build.gradle.kts

  1. Api프로젝트에서 Domain프로젝트를 사용하도록 프로젝트 의존성을 추가했습니다.

좀 더 깔끔하게 하려고 했는데 일단 빌드는 성공했고 API도 잘 동작하는 것을 확인했습니다.

모든코드는 Github 에 올려두었습니다.

참고