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
- Annotation processors는
kapt
를 사용하고, JPA플러그인과 Lazy Loading을 사용하기 위한plugin.spring
을 false로 설정해두고 나중에 필요한 프로젝트에 플러그인을 apply 합니다. - Lazy Loading을 사용하기 위해서는 엔티티는
open
이어야 하는데 kotlin은 클래스와 멤버의 기본이final
이기 때문에kotlin-spring
플러그인을 사용해서open
으로 변경합니다. 그리고 Spring AOP를 이용해서 @Transactional, @Configuration등의 어노테이션을 사용하려면open
일 필요가 있기때문에 모든프로젝트에kotlin-spring
플러그인을 적용했습니다. - 코딩 스타일 체크를 위해서 kotlin용 Linter인 ktlint를 설정했습니다.
jpashop/domain/build.gradle.kts
kotlin-spring
플러그인이 기본적으로 @Transactional, @Configuration, @RestController등의 어노테이션이 있으면open
으로 변경해 주지만,javax.persistence
안의 엔티티는 개별로 설정해 주어야 합니다.- 프로젝트 빌드 시
javax.persistence.Entity
어노테이션이 있는 엔티티 클래스인 경우 Q클래스를 작성하도록 하기 위해서 Annotation processors는kapt
를 이용하도록 설정했습니다.
jpashop/api/build.gradle.kts
- Api프로젝트에서 Domain프로젝트를 사용하도록 프로젝트 의존성을 추가했습니다.
좀 더 깔끔하게 하려고 했는데 일단 빌드는 성공했고 API도 잘 동작하는 것을 확인했습니다.
모든코드는 Github 에 올려두었습니다.