Spring
Basic
멀티 모듈

Multi Module

멀티모듈이란?

스프링에서 프로젝트가 커지면서 멀티 모듈로 프로젝트를 구성하게 된다.
멀티 모듈이란 각각의 기능을 담당하는 모듈을 나누어서 개발하는 것을 말한다. 배달 앱을 예로 들면, 배달앱은 사용자가 주문하는 Backend Service가 있고 가게 점포 주인이 매장을 관리하는 Backend Service가 있다. 둘 다 같은 DB를 연결해서 사용할 것이고 사용자 👈👉 점포 주인이 통신하는 과정에서 사용하는 공통된 모델이 있을 수 있다.
그렇다면 이를 모듈로 나눌 때 user, store, db, common 모듈로 나누어서 개발할 수 있는데, db와 common 모듈은 서로 공통되는 모듈이기 때문에 user와 store 모듈에서 implements해서 사용하게 된다.

:api or :store-admin/build.gradle
    implementation project(":db")
    implementation project(":common")

Fastcampus Lab

아래에 기술되는 내용은 Fastcampus 시그니처 백엔드 강의를 참고하여서 작성된 내용입니다.

참조 프로젝트 : https://github.com/azjaehyun/fc-study/tree/main/chapter-1/backend (opens in a new tab)

DDD + MSA 기반으로 구성된 프로젝트이며 위와 같이 다양한 도메인을

batch, core, api 등의 멀티모듈로 구성해서 개발된 프로젝트이다.

setting.gradle

멀티 모듈을 구성하기 위해서는 setting.gradle 파일을 생성해야 하는데,

rootProject.name = 'todolist'
include 'todolist-core'
include 'todolist-api-server'
include 'todolist-batch-server'

이는 다음과 같은 구성으로 rootProject가 뭔지, 하위 프로젝트가 뭔지를 정의하는 파일이다.

build.gradle

build.gradle 파일을 root 폴더에서 관리할 수 있는데

subprojects

아래와 같이 subprojects를 정의하면 하위 모듈에서 공통으로 사용하는 세팅을 정의할 수 있다.

build.gradle
// 하위 모든 프로젝트 공통 세팅
subprojects {
    apply plugin: 'java'
    apply plugin: 'idea'
    apply plugin: 'org.springframework.boot'
    apply plugin: 'io.spring.dependency-management'

    group 'com.todolist'
    version '1.0-SNAPSHOT'

    sourceCompatibility = '11'
    targetCompatibility = '11'
    compileJava.options.encoding = 'UTF-8'

    repositories {
        mavenCentral()
    }

    // 하위 모듈에서 공통으로 사용하는 세팅 추가
    dependencies {
        compileOnly 'org.projectlombok:lombok'

        annotationProcessor 'org.projectlombok:lombok'
        annotationProcessor "org.springframework.boot:spring-boot-configuration-processor"

        testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0'
        testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.0'
    }

    test {
        useJUnitPlatform()
    }
}
project(:프로젝트명)

아래와 같이 root project에서 각 project 별로 세팅을 정의할 수 있다.
하지만 Dependency가 많고 복잡하다면, 하위 프로젝트의 각 build.gradle 파일에서 정의해도 된다.

build.gradle
project(':todolist-core') {
    // 공통 코드

    bootJar { enabled = false } // core 은 bootJar 로 패키징 할 필요 없음
    jar { enabled = true }

    dependencies {
    }
}

project(':todolist-api-server') {
    bootJar { enabled = true }
    jar { enabled = false }

    dependencies {
        // compileOnly project(':todolist-core') // 개발시 사용!! 컴파일 시 todolist-core project 로딩
        implementation project(':todolist-core') // docker로 사용시 사용
        implementation 'org.springframework.boot:spring-boot-starter-web'
    }
}