초기 세팅

gradle.properties (root)

프로젝트의 전역 속성을 설정한다. 프로젝트 버전, 그룹 ID 및 사용되는 주요 라이브러리의 버전을 작성하여 관리를 수월하게 한다.

applicationVersion = 0.0.1
projectGroup = me.hajoo

springBootVersion = 3.2.5
springDependencyManagementVersion = 1.1.4

kotlinVersion = 1.9.23

build.gradle.kts (root)

프로젝트의 빌드 과정을 구성한다. Kotlin과 Spring Boot 플러그인을 포함하여 필요한 플러그인을 적용하고, 모든 프로젝트와 하위 프로젝트의 공통 설정을 정의한다.

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
    id("org.springframework.boot") apply false
    id("io.spring.dependency-management") apply false
    kotlin("jvm")
    kotlin("plugin.spring") apply false
}

val projectGroup: String by project
val applicationVersion: String by project

allprojects {
    group = projectGroup
    version = applicationVersion

    repositories {
        mavenCentral()
    }
}

subprojects {
    apply(plugin = "org.springframework.boot")
    apply(plugin = "io.spring.dependency-management")
    apply(plugin = "org.jetbrains.kotlin.plugin.spring")
    apply(plugin = "kotlin")
    apply(plugin = "kotlin-kapt")

    dependencies {
        implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
        implementation("org.jetbrains.kotlin:kotlin-reflect")
        testImplementation("org.springframework.boot:spring-boot-starter-test")
    }

    tasks.withType<KotlinCompile> {
        kotlinOptions {
            freeCompilerArgs += "-Xjsr305=strict"
            jvmTarget = "21"
        }
    }

    tasks.withType<Test> {
        useJUnitPlatform()
    }
}

settings.gradle.kts (root)

프로젝트 플러그인 버전 관리를 통합적으로 적용한다.

rootProject.name = "multi-module"

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

필요한 모듈을 포함시켜 Gradle이 프로젝트 구조를 인식할 수 있도록 한다.

rootProject.name = "multi-module"

...

include(
    "hj-app-api"
)

include(
    "hj-common",
    "hj-core"
)

build.gradle.kts

실행 가능한 애플리케이션의 경우 bootJar를 true로 하고 그렇지 않은 경우 jar를 true로 한다.

애플리케이션 (api)
tasks.bootJar { enabled = true }
tasks.jar { enabled = false }

dependencies {
    // 필요한 의존성 설정
    implementation(project(":hj-common"))
    implementation(project(":hj-core"))

    implementation("org.springframework.boot:spring-boot-starter-web")
}
라이브러리 (common, core, client)
tasks.bootJar { enabled = false }
tasks.jar { enabled = true }

dependencies {
  // ...
}