-
코틀린 멀티모듈 프로젝트 구성하기프로젝트/선착순 쿠폰 발급 시스템 2023. 2. 23. 00:01728x90
목표
Kotlin DSL Gradle을 사용하여 멀티 모듈을 구성하는 프로젝트를 만들어보고자 합니다.
멀티 모듈이란?
멀티모듈에 대해서는 다음글에서 다룹니다.
- 실전! 멀티 모듈 프로젝트 구조와 설계 - 김대성님
간단하게 하나의 Spring 프로젝트에서 여러 디렉터리 구조를 가지고 서버를 실행시킬 수 있도록 구성할 수 있습니다.
개인적인 공부용으로 사용하는 프로젝트이며 envers, executor등은 각각 실행될 수 있는 하나의 SpringApplication으로 구성되어 있고, core같은 모듈은 공통적으로 사용합니다.
Spring Initializr를 통해 프로젝트 만들기
2. 프로젝트 세팅
- Gradle Project
- Kotlin
- Spring Boot 2.7.5
- Jar
- Java 11
- Dependencies : Spring Web
3. Generate 버튼 클릭
4. 압축해제
5. 적절한 경로로 파일 이동
6. Intellij Open Project -> build.gralde.kts 선택 후 OK -> Open as Project -> Trust Project
싱글 모듈 멀티 모듈로 변환하기
다음은 root에 존재하는 build.gradle.kts입니다
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { id("org.springframework.boot") version "2.7.6" id("io.spring.dependency-management") version "1.0.15.RELEASE" kotlin("jvm") version "1.6.21" kotlin("plugin.spring") version "1.6.21" } group = "com.kidsworld" version = "0.0.1-SNAPSHOT" java.sourceCompatibility = JavaVersion.VERSION_11 tasks.withType<KotlinCompile> { kotlinOptions { freeCompilerArgs = listOf("-Xjsr305=strict") jvmTarget = "11" } } tasks.withType<Test> { useJUnitPlatform() } repositories { mavenCentral() } dependencies { implementation("org.springframework.boot:spring-boot-starter-web") implementation("com.fasterxml.jackson.module:jackson-module-kotlin") implementation("org.jetbrains.kotlin:kotlin-reflect") implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8") testImplementation("org.springframework.boot:spring-boot-starter-test") }
1단계 : seetings.gradle.kts 수정
include("core") include("envers") include("executor") include("coupon-event-with-mysql") include("x-forwarded-for-header")
core, envers, executor등의 모듈등으로 구성할 수 있습니다.
2단계 : api-external 디렉터리 추가
예를 들어 api-external이라는 이름을 가진 모듈을 추가할 수 있습니다.
3단계 : src, build.gradle.kts 그대로 옮기기
이때 build.gradle.kts는 root에도 필요하기 때문에 복사해서 api-external에 둡니다.
위의 그림처럼 root도 build.gradle.kts를 가지고 x-forwarded-for-header 모듈도 build.gradle.kts를 가집니다.
하지만 root에서는 src 폴더는 필요없습니다.
4단계 root 프로젝트의 plugins들은 apply fasle 적용
plugins { id("org.springframework.boot") version "2.7.6" apply false id("io.spring.dependency-management") version "1.0.15.RELEASE" apply false kotlin("jvm") version "1.6.21" kotlin("plugin.spring") version "1.6.21" apply false }
이때 jvm에는 apply false를 적용하면 안 됩니다.
5단계 : 모든 프로젝트에 적용되어야 하는 부분 allprojects {}로 빼기
allprojects{ group = "com.kidsworld" version = "0.0.1-SNAPSHOT" tasks.withType<JavaCompile>{ sourceCompatibility = "11" targetCompatibility = "11" } tasks.withType<KotlinCompile> { kotlinOptions { freeCompilerArgs = listOf("-Xjsr305=strict") jvmTarget = "11" } } tasks.withType<Test> { useJUnitPlatform() } repositories { mavenCentral() } }
컴파일하는 부분만 조금 변경해주면 됩니다.
6단계: 서브 프로젝트들에 적용할 의존성들 추가
subprojects{ apply(plugin = "org.springframework.boot") apply(plugin = "io.spring.dependency-management") apply(plugin = "org.jetbrains.kotlin.plugin.spring") apply(plugin = "org.jetbrains.kotlin.plugin.jpa") apply(plugin = "kotlin") apply(plugin = "kotlin-kapt") dependencies { //공통사용 implementation("com.fasterxml.jackson.module:jackson-module-kotlin") implementation("org.jetbrains.kotlin:kotlin-reflect") implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8") testImplementation("org.springframework.boot:spring-boot-starter-test") } }
web 계층의 경우에는 공통으로 적용하지 않을 예정으로 제거합니다.
7단계: core 모듈에서 로깅사용하도록 build.gradle.kts 적용
val jar: Jar by tasks val bootJar: BootJar by tasks bootJar.enabled = false jar.enabled = true dependencies { //로그 의존성 api("io.github.microutils:kotlin-logging-jvm:2.0.11") }
SpringBootApplication을 실행하지 않는 core 모듈로써 사용합니다.
bootJar.enabled = false로 설정해 줍니다.
해당 옵션은 Spring Boot Application의 jar파일을 비활성화하는 데 사용됩니다.
빌드 시간을 줄이고 프로젝트에 불필요한 아티팩트가 생성되는 것을 방지할 수 있습니다.
8단계: api-external 내부 build.gradle.kts 변경
dependencies { //core 모듈 의존성 추가 implementation(project(":core")) //Web 계층 의존성 implementation("org.springframework.boot:spring-boot-starter-web") }
웹 관련 의존성을 제외하고 모두 지워주어도 됩니다.
최종 프로젝트 구조
최종적으로 다음과 같은 프로젝트 구성도가 만들어지며 springboot 실행 시 localhost:8080으로도 잘 접속됩니다.
Git Repository 참고용
Spring 공부용으로 멀티 모듈을 실제로 구현하고 있는 Git Repository입니다.
위의 글을 봐도 잘 모르겠다면 해당 Repository를 참고하세요!
https://github.com/Junuu/spring-study
'프로젝트 > 선착순 쿠폰 발급 시스템' 카테고리의 다른 글
kafka 모듈 구성하기 (0) 2023.04.20 Eventual Consistency란? (0) 2023.04.19 서킷 브레이커 구성하기 (0) 2023.02.28 Client 모듈 구성하기 (0) 2023.02.27 선착순 쿠폰 발급 프로젝트 개요 (0) 2023.01.16