Gradle 멀티모듈 설정 및 버전 관리

임동혁 Ldhbenecia·2025년 4월 28일

SpringBoot

목록 보기
15/28
post-thumbnail

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 파일에서 공통 변수를 관리한다.

build.gradle.kts 설정 규칙

루트 빌드 파일 설정

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 설정

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()
    }
}

settings.gradle.kts 설정 요약

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)
            }
        }
    }
}
  • Kotlin, Spring Boot 등의 플러그인 버전settings.gradle.ktspluginManagement 블록 안에서 관리한다.
    • resolutionStrategy에서 build.gradle.kts에서의 plugin의 버전을 설정한다.

정리

구분설명
의존성(dependencies) 버전 관리gradle.properties 에서 관리
플러그인(plugins) 버전 관리settings.gradle.ktspluginManagement에서 관리
plugins 블록에서 버전 명시 필요 여부❌ (settings에서 버전 자동 매칭)

모놀리식 vs 멀티모듈 모놀리식 차이

항목전통적 모놀리식 (src/main/java 안에 다 때려박음)멀티모듈
코드 구조파일/패키지 레벨로만 구분모듈(프로젝트) 단위로 물리적 분리
빌드 관리프로젝트 전체를 매번 빌드필요한 모듈만 빌드 가능 (캐시 가능)
팀 협업충돌 많음 (같은 폴더 작업)모듈별 책임이 명확, 충돌 감소
의존성 관리모든 코드가 서로 참조 가능 (엉킴)명시적으로 project(":module") 선언해야 함
테스트통합 테스트만 많아짐모듈 단위로 테스트 가능
유지보수점점 엉켜감 (Big Ball of Mud)모듈별 독립성 덕분에 깔끔 유지
성능 최적화빌드/테스트 느려짐Gradle Incremental Build, Caching 이점 가능
확장성나중에 MSA 전환할 때 갈아엎어야 함모듈 하나하나 서비스화 가능

1. 코드 독립성과 책임 분리

  • accountbook, todo, note 이런 모듈이 각각 역할을 가지게 됨
  • 서로 쓸 때도 dependencies { implementation(project(":common")) } 처럼 명시해야 함 ➔ 무분별한 참조 방지

2. 빌드 최적화

  • Gradle이 변경된 모듈만 다시 빌드해서 전체 빌드 속도가 훨씬 빨라진다
  • 모듈이 많아져도 빌드 시간은 상대적으로 잘 유지할 수 있음

3. 테스트 독립성

  • todo 모듈만 따로 테스트할 수 있음
  • 통합테스트를 작은 단위로 쪼갤 수 있어서, Fail Fast 전략 가능

4. 확장성 확보

  • accountbook 모듈만 따로 떼서 별도 서비스화(MSA)할 수 있음
  • ➔ "코드만 쪼개서 빼면 바로 서비스화 가능" 준비가 되어있음

5. 협업 최적화

  • 여러 명이 개발할 때
    • A는 todo
    • B는 accountbook
    • C는 note
  • 이런 식으로 모듈 단위 분업 가능
  • 코드 충돌 줄어들고, Git conflict도 적어짐

출처 및 문서 정리:
chatGPT,
https://www.youtube.com/watch?v=rE89ppAmf_Y&t=495s

0개의 댓글