개발 환경
- Spring Boot 3.5.8
- JDK 21
- Gradle 8.14.3
1. 모듈 생성
- 루트 프로젝트 src 삭제
- 서브 모듈 생성
- settings.gradle 업데이트
- gradle 동기화

루트 프로젝트 - 새로 만들기 - 모듈로 모듈을 생성한다. 나는 core-api, core-enum, db-core 이렇게 3개를 생성했다.

다음은 settings.gradle을 업데이트 한다. 나는 core, storage 디렉토리에 모듈을 넣었기에 위와 같이 설정했다.

다음은 gradle 동기화다. 처음에는 생성된 모듈이 루트 디렉토리 외부에 생기는데, 그걸 연결 해제하고 내부에 생성되는지 확인한다.
2. build.gradle 설정
루트는 빌드를 안하므로 build.gradle에서 bootJar(실행용), jar(라이브러리용) 모두 false로 설정했다.
그리고 subprojects의 기본값은 라이브러리용 = true, 실행용 = false로 설정했다.
plugins {
id 'java'
id 'java-library'
id 'org.springframework.boot' version '3.5.8'
id 'io.spring.dependency-management' version '1.1.7'
}
bootJar.enabled = false
jar.enabled = false
allprojects {
group = 'com.commerce'
version = '0.0.1-SNAPSHOT'
repositories {
mavenCentral()
}
}
subprojects {
apply plugin: 'java'
apply plugin: 'java-library'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
bootJar.enabled = false
jar.enabled = true
java {
toolchain {
languageVersion = JavaLanguageVersion.of(21)
}
}
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
dependencies {
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}
// tasks.named('test') {
// useJUnitPlatform()
// }
}
다음은 core-api와 db-core다. core-enum은 공통으로 사용되는 상수 값을 저장하기에 build.gradle이 없고 jar만 필요하다.
나머지 모듈은 각각 필요한 의존성을 추가했다. core-api 같은 경우는 실행해야 하기에 bootJar을 true로 설정했다.
db-core 설정에서 jpa를 추가할 때, core-api 모듈이 사용해야 하므로 의존성이 전이되는 api 옵션을 사용했다.
// core-api
bootJar.enabled = true
jar.enabled = false
dependencies {
implementation project(':core:core-enum')
implementation project(':storage:db-core')
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-validation'
}
// db-core
dependencies {
implementation project(':core:core-enum')
api 'org.springframework.boot:spring-boot-starter-data-jpa'
runtimeOnly 'com.h2database:h2'
runtimeOnly 'com.mysql:mysql-connector-j'
}
이렇게 설정하고 루트를 build하면 성공한다. 👍