Kotlin Spring으로 다중 모듈 구성 방법

Yeomso(BE)·2023년 7월 13일
0
post-thumbnail

패키지 구성

현재 나의 blog package 구성은 이와같다.

근데 예시 자료를 하나의 프로젝트에서 관리하는게 눈에 잘 안들어와서 예시 자료를 모듈화를 시키려고 한다.

settings.gradle.kts 구성

우선 settings.gradle.kts 파일에 들어가면 현재 아래처럼 구성되어 있다.

rootProject.name = "demo"

단일 프로젝트 모듈화 시키기

blog 프로젝트에서 blog 하위에 modules 폴더에 모듈 프로젝트를 생성 시킨다.

여러개 모듈을 생성하기 위해 exam-module도 만들어 보았다.

그러면 총 2개의 모듈이 생성 된 것이 확인이 된다.

src를 제외하고 모두 새롭게 셋팅하도록 하겠습니다. src를 남기고 모두 삭제해 주세요.

공통 build.gradle.kts 설정

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

plugins {
    kotlin("jvm") version Versions.kotlin
    kotlin("kapt") version Versions.kotlin
    id("io.spring.dependency-management") version Versions.springDependencyManagement
    id("org.jetbrains.kotlin.plugin.spring") version Versions.kotlin
}

allprojects {
    group = "com.example"
    repositories {
        mavenCentral()
    }
}

subprojects {
    apply {
        plugin("kotlin")
        plugin("kotlin-kapt")
        plugin("io.spring.dependency-management")
        plugin("kotlin-spring")
    }
    dependencies {
        implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
        implementation("org.jetbrains.kotlin:kotlin-reflect")

        // junit
        testImplementation("org.junit.jupiter:junit-jupiter")
    }

    tasks {
        withType<KotlinCompile> {
            kotlinOptions {
                freeCompilerArgs = listOf("-Xjsr305=strict")
                jvmTarget = "1.8"
            }
        }

        withType<JavaCompile> {
            sourceCompatibility = "1.8"
            targetCompatibility = "1.8"
        }

        withType<Test> {
            useJUnitPlatform()
        }

    }
}

주어진 코드는 Kotlin과 Spring 프레임워크를 사용하는 Gradle 프로젝트의 빌드 스크립트입니다. 이 빌드 스크립트는 여러 하위 프로젝트(subprojects)에 공통적으로 적용되며, Kotlin 및 Spring 관련 플러그인을 설정하고 종속성을 관리합니다.

플러그인 설정:

  • kotlin("jvm") 플러그인: Kotlin JVM 플러그인을 사용하여 Kotlin 코드를 컴파일합니다.
  • kotlin("kapt") 플러그인: Kotlin Annotation Processing 플러그인을 사용하여 컴파일 시간에 애노테이션을 처리합니다.
  • id("io.spring.dependency-management") 플러그인: Spring 프로젝트에서 종속성 관리를 쉽게 하기 위한 스크립트를 제공합니다.
  • id("org.jetbrains.kotlin.plugin.spring") 플러그인: Kotlin과 Spring을 함께 사용할 때 필요한 추가 기능을 제공합니다.

모든 프로젝트에 대한 공통 설정:

  • group = "com.example": 프로젝트 그룹을 "com.example"로 설정합니다.
  • repositories { mavenCentral() }: Maven 중앙 저장소를 사용하여 종속성을 해결합니다.

하위 프로젝트(subprojects)에 대한 설정:

  • apply { } 블록 내에서 필요한 플러그인을 적용합니다.
  • dependencies { } 블록 내에서 필요한 종속성을 설정합니다. Jackson 모듈, Kotlin Reflection 등의 종속성이 선언되어 있습니다.
  • tasks { } 블록 내에서 태스크를 구성합니다.
  • withType { } 블록 내에서 Kotlin 컴파일러 옵션을 설정합니다. 여기서는 freeCompilerArgs에 "-Xjsr305=strict"을 추가하여 JSR-305 어노테이션에 대한 엄격한 검사를 활성화하고, jvmTarget을 "1.8"로 설정하여 JVM 대상을 Java 8로 지정합니다.
  • withType { } 블록 내에서 Java 컴파일러 옵션을 설정합니다. 여기서는 sourceCompatibility와 targetCompatibility를 "1.8"로 설정하여 소스 및 대상 호환성을 Java 8로 지정합니다.
  • withType { } 블록 내에서 테스트 태스크를 구성합니다. 여기서는 JUnit 5의 Jupiter 엔진을 사용하도록 설정합니다.

Settings.gradle.kts 설정하기

settings.gradle.kts는 module 인식할 수 있도록 셋팅할 수 있는 설정 파일이다.

rootProject.name = "blog"

listOf(
  "exam-retry",
  "exam-module",
).forEach {
  include(it)
  project(":$it").projectDir = File("$rootDir/modules/$it")
}

이 코드는 listOf에 나열된 하위 프로젝트를 루트 프로젝트의 하위 프로젝트로 설정하고, 각 하위 프로젝트의 디렉토리를 지정하여 구조적으로 프로젝트를 구성합니다. 이렇게 설정하면 Gradle은 루트 프로젝트와 하위 프로젝트 간의 의존성을 적절히 처리할 수 있게 됩니다.

  • include(it): 현재 하위 프로젝트를 포함시킵니다. it은 listOf에 나열된 각 하위 프로젝트 이름입니다. 예를 들어, "exam-retry"와 "exam-module"을 포함합니다.

  • project(":$it").projectDir = File("$rootDir/modules/$it"): 하위 프로젝트의 프로젝트 디렉토리를 설정합니다.

  • project(":$it")는 지정된 이름(it)을 가진 하위 프로젝트에 대한 Project 객체를 가져옵니다. projectDir은 해당 하위 프로젝트의 디렉토리를 나타냅니다.

  • File("$rootDir/modules/$it")는 루트 디렉토리(rootDir) 아래의 "modules" 디렉토리에 해당 하위 프로젝트의 이름으로 된 하위 디렉토리를 지정합니다. 따라서 각 하위 프로젝트는 "modules" 디렉토리 안에 위치하게 됩니다.

각 모듈별 build.gradle.kts 설정하기.

exam-retry 모듈 build.gradle.kts

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

plugins {
  id("org.springframework.boot") version Versions.springBoot
  kotlin("plugin.jpa") version Versions.kotlin
}

dependencies {
  implementation("org.springframework.boot:spring-boot-starter-data-jpa")
  implementation("org.springframework.boot:spring-boot-starter-web")

  // retry
  implementation("org.springframework.retry:spring-retry")

  runtimeOnly("com.h2database:h2")
  testImplementation("org.springframework.boot:spring-boot-starter-test")
}

각 프로젝트별로 build.gradle.kts를 셋팅했으면 기본적으로 작성해야 하는 부분이 많아서 불편 했지만, 이와같이 공통으로 사용하는 부분은 하나로 작성하고, 하위 모듈별로 필요한 디펜던시만 붙이면 되서 깔끔하게 작성할 수 있다.

모든 셋팅이 완료되면 Gradle Build

build 이후 모듈이 정상적으로 인식이 되는지 확인하고 실행해보면 끝~

profile
나 혼자만 개발중

0개의 댓글