[SpringBoot] 멀티모듈 생성

Yoona Di·2024년 9월 1일

Spring Boot

목록 보기
3/4

새로운 프로젝트를 하면서 스프링으로도 멀티 모듈이 가능하다는 사실을 알게되었다.

1. 모듈 생성

일단 내가 만들고자 하는 모듈구조는 아래 표와 같다.

|- app
|   |-- core
|   |
|	|__ api
|
|
|_ common

1) common - Kotlin

프로젝트 어디서든 사용할 수 있는 공통 유틸 기능

2) app

스프링에 대한 의존성을 가지고 있고, 해당 의존성을 하위 모듈들에 전파합니다.

3) app/core

Entity를 선언하는 모듈

4) app/api

비지니스 로직을 담당하는 모듈

2. 모듈 생성

프로젝트는 아래 링크에서 생성해줬다.

spring.io
스프링 프로젝트를 쉽고 빠르게 생성할 수 있다.

  • project: Gradle - kotlin
  • language: kotlin
  • Spring Boot: 3.3.3
  • Group: peep
  • Artifact: todo
  • java: 17

1) common 모듈 생성

이렇게 생성해주었더니 src 폴더 안에 생성되어서 src를 빼고

~\Document\pj\peep-todo-backend\todo

로 설정해서 다시 만들어주었다.

이렇게 생성하게 되면 common 모듈이 생성이 되는데 여기서 common은 독립적으로 빌드 될 일이 없고, 하위 패키지를 둘 일도 없으므로, src와 build.gradle.kts를 제외한 나머지는 모두 삭제해주었다.

(1) setting.gradle.kts

settings.gradle.kts는 모듈 간 관계를 설정해줄 수 있는 파일이다. 현재로서는 루트 모튤 하위에 common 모듈만 존재하므로 다음과 같이 설정해준다.

rootProject.name = "todo"

include(":common")

(2) build.gradle.kts

build.gradle.kts에서는 모듈의 의존성을 설정할 수 있다. 또한 하위 모듈에 전파할 의존성에 대한 설정도 진행할 수 있다.

plugins {
	kotlin("jvm") version "1.9.25"
}

group = "peep"
version = "0.0.1-SNAPSHOT"

allprojects {
	group = "peep"
	version = "1.0-SNAPSHOT"

	repositories {
		mavenCentral()
	}
}

subprojects {
	apply {
		plugin("org.jetbrains.kotlin.jvm")
	}

	java.sourceCompatibility = JavaVersion.VERSION_17
	java.targetCompatibility = JavaVersion.VERSION_17

	dependencies {
		implementation("org.jetbrains.kotlin:kotlin-reflect")
		testImplementation(kotlin("test"))
	}

	tasks.test {
		useJUnitPlatform()
	}
}

allprojects에서는 현재 모듈과 하위모듈 모두에 적용되는 사항
subprojects에서는 현재 모듈에는 적용되지 않고 하위 모듈에만 적용되는 사항

(3) common/build.gradle.kts

common 모듈에 필요한 의존성은 루트 모듈에서 선언해주었으므로 여기서는 아무 의존성도 선언하지 않아도된다.

dependencies {
}

(4) 실행

정상적으로 실행이 완료되엇다면, todo 하위에 common이 생성된 것을 확인할 수 있다. 이후 루트 모듈과 병렬적으로 존재하는 common은 삭제해준다.

common모듈 하위의 스프링 관련 파일을 모두 삭제해준다.
main과 test에 스프링 어플리케이션 클래스와 resource 패키지를 모두 삭제해준다.

루트모듈의 src 패키지도 필요 없으므로 삭제한다.

그럼 다음과 같은 프로젝트 구조를 확인할 수 있다.

2) app 모듈 생성

app 모듈도 common과 동일하게 모듈을 생성해준다.

(1) settings.gradle.kts

rootProject.name = "todo"

include(":common")
include(":app")

(2) app/build.gradle.kts

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

plugins {
    kotlin("plugin.spring") version "1.9.25"
    id("org.springframework.boot") version "3.3.3"
    id("io.spring.dependency-management") version "1.1.6"
}

subprojects {
    dependencies {
        implementation("org.springframework.boot:spring-boot-starter")
        testImplementation("org.springframework.boot:spring-boot-starter-test")
    }

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

혹시 gradle을 새로고침해줬을 때 아래와 같은 오류가 난다면 우측 gradle창에서 루트모듈과 병렬적으로 생성된 모듈을 삭제 해주면된다.

app 모듈에서는 직접 코드를 작성할 일이 없으므로, build.gradle.kts를 제외한 모든 파일을 삭제한다.

core module과 app module도 똑같이 생성해준다.

  • app/api/build.gradle.kts
subprojects{
    dependencies {
    }
}
  • app/core/build.gradle.kts
subprojects {
    dependencies {
        //common
        implementation(project(":common"))
        //DB, FLYWAY
        runtimeOnly("com.h2database:h2")
    }
}

이렇게 common module을 추가하면 순탄하게 common module의 enum을 이용할 수 있을줄 알았다..

하지만 import가 되지 않았다...😥


이 글을 쓰며 참고했던 블로그
[Spring] 멀티 모듈의 구현(1) - 모듈 생성 및 관계 설정(1)

profile
개발자가 되고싶은 초보

0개의 댓글