
Kotlin을 사용하여 SpringBoot를 연습합니다.
멀티 모듈 환경을 구축하면서 학습한 내용을 정리합니다.
### Application version
applicationVersion=0.0.1
### Project configs
projectGroup="com.benecia"
### Project dependency versions
kotlinVersion=1.9.25
### Spring dependency versions
springBootVersion=3.4.5
springDependencyManagementVersion=1.1.7
gradle.properties 파일에서 공통 변수를 관리한다.plugins {
kotlin("jvm")
kotlin("plugin.spring") apply false
id("org.springframework.boot") apply false
id("io.spring.dependency-management")
}
java {
toolchain {
languageVersion = JavaLanguageVersion.of(21)
}
}
val projectGroup: String by project
val applicationVersion: String by project
allprojects {
group = projectGroup
version = applicationVersion
repositories {
mavenCentral()
}
}
val projectGroup: String by project
val applicationVersion: String by project
applicationVersion, projectGroup은 root 경로의 build.gradle.kts에서 불러와서 사용한다.플러그인 버전을 plugins 블록에서 명시하지 않아도 된다. (version 생략 가능)
subprojects {
apply(plugin = "org.jetbrains.kotlin.jvm")
apply(plugin = "org.jetbrains.kotlin.plugin.spring")
apply(plugin = "io.spring.dependency-management")
dependencies {
implementation("com.fasterxml.jackson.module:jackson-module-kotlin:2.17.0")
implementation("org.jetbrains.kotlin:kotlin-reflect")
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
testImplementation("org.springframework.boot:spring-boot-starter-test:3.4.5")
}
tasks.withType<Test> {
useJUnitPlatform()
}
}
rootProject.name = "life-tracker"
include(
"app",
"todo",
"accountbook",
"note",
"common"
)
pluginManagement {
val kotlinVersion: String by settings
val springBootVersion: String by settings
val springDependencyManagementVersion: String by settings
resolutionStrategy {
eachPlugin {
when (requested.id.id) {
"org.jetbrains.kotlin.jvm" -> useVersion(kotlinVersion)
"org.jetbrains.kotlin.plugin.spring" -> useVersion(kotlinVersion)
"org.springframework.boot" -> useVersion(springBootVersion)
"io.spring.dependency-management" -> useVersion(springDependencyManagementVersion)
}
}
}
}
settings.gradle.kts의 pluginManagement 블록 안에서 관리한다.build.gradle.kts에서의 plugin의 버전을 설정한다.| 구분 | 설명 |
|---|---|
| 의존성(dependencies) 버전 관리 | gradle.properties 에서 관리 |
| 플러그인(plugins) 버전 관리 | settings.gradle.kts 의 pluginManagement에서 관리 |
| plugins 블록에서 버전 명시 필요 여부 | ❌ (settings에서 버전 자동 매칭) |
| 항목 | 전통적 모놀리식 (src/main/java 안에 다 때려박음) | 멀티모듈 |
|---|---|---|
| 코드 구조 | 파일/패키지 레벨로만 구분 | 모듈(프로젝트) 단위로 물리적 분리 |
| 빌드 관리 | 프로젝트 전체를 매번 빌드 | 필요한 모듈만 빌드 가능 (캐시 가능) |
| 팀 협업 | 충돌 많음 (같은 폴더 작업) | 모듈별 책임이 명확, 충돌 감소 |
| 의존성 관리 | 모든 코드가 서로 참조 가능 (엉킴) | 명시적으로 project(":module") 선언해야 함 |
| 테스트 | 통합 테스트만 많아짐 | 모듈 단위로 테스트 가능 |
| 유지보수 | 점점 엉켜감 (Big Ball of Mud) | 모듈별 독립성 덕분에 깔끔 유지 |
| 성능 최적화 | 빌드/테스트 느려짐 | Gradle Incremental Build, Caching 이점 가능 |
| 확장성 | 나중에 MSA 전환할 때 갈아엎어야 함 | 모듈 하나하나 서비스화 가능 |
accountbook, todo, note 이런 모듈이 각각 역할을 가지게 됨dependencies { implementation(project(":common")) } 처럼 명시해야 함 ➔ 무분별한 참조 방지todo 모듈만 따로 테스트할 수 있음accountbook 모듈만 따로 떼서 별도 서비스화(MSA)할 수 있음todoaccountbooknote출처 및 문서 정리:
chatGPT,
https://www.youtube.com/watch?v=rE89ppAmf_Y&t=495s