ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 코틀린 멀티모듈 프로젝트 구성하기
    프로젝트/선착순 쿠폰 발급 시스템 2023. 2. 23. 00:01
    728x90

    목표

    Kotlin DSL Gradle을 사용하여 멀티 모듈을 구성하는 프로젝트를 만들어보고자 합니다.

     

    멀티 모듈이란?

    멀티모듈에 대해서는 다음글에서 다룹니다.

    - 우아한 멀티모듈 by 권용근님

    - 실전! 멀티 모듈 프로젝트 구조와 설계 - 김대성님

     

    멀티모듈을 가지는 프로젝트 구조 예시

    간단하게 하나의 Spring 프로젝트에서 여러 디렉터리 구조를 가지고 서버를 실행시킬 수 있도록 구성할 수 있습니다.

    개인적인 공부용으로 사용하는 프로젝트이며 envers, executor등은 각각 실행될 수 있는 하나의 SpringApplication으로 구성되어 있고, core같은 모듈은 공통적으로 사용합니다.

     

    Spring Initializr를 통해 프로젝트 만들기

    1. 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

     

    GitHub - Junuu/spring-study: spring에 대해 공부해보기

    spring에 대해 공부해보기. Contribute to Junuu/spring-study development by creating an account on GitHub.

    github.com

     

    댓글

Designed by Tistory.