Spring Boot 멀티 모듈 프로젝트 구성 방법
Spring Boot 멀티 모듈 프로젝트를 Gradle과 Maven 기반으로 설계하고 설정하는 방법을 초보자도 이해하기 쉽게 정리한 참고자료
목차
왜 멀티 모듈로 구성해야 할까?
프로젝트가 커지면 코드 관리, 빌드 시간, 재사용성이 문제가 된다. 멀티 모듈 구조는 관심사 분리와 빌드 최적화를 돕는다. 또한 공통 모듈을 통해 중복을 줄이고, 각 모듈을 독립적으로 테스트하고 배포할 수 있다. 여기서는 spring boot multi module 프로젝트를 gradle multi module spring boot와 maven multi module spring boot 관점으로 설명한다.
기본 개념과 구조
멀티 모듈은 부모 프로젝트(루트)와 하위 모듈로 구성된다. 일반적인 구조는 다음과 같다.
- 루트: 공통 설정과 의존성 관리
- common/core: 유틸, 도메인, 공통 라이브러리
- service: 비즈니스 로직
- api/web: 컨트롤러와 외부 노출 계층
- integration-test: 모듈 통합 테스트
Gradle 멀티 모듈 예시
settings.gradle
rootProject.name = 'my-app'
include 'common-core', 'service', 'web'
루트 build.gradle
plugins {
id 'java'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
}
allprojects {
group = 'com.example'
version = '0.0.1-SNAPSHOT'
repositories {
mavenCentral()
}
}
subprojects {
apply plugin: 'java'
sourceCompatibility = '11'
dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0'
}
}
module(web) build.gradle
plugins {
id 'org.springframework.boot' version '2.5.4'
id 'io.spring.dependency-management'
}
dependencies {
implementation project(':common-core')
implementation 'org.springframework.boot:spring-boot-starter-web'
}
Gradle의 장점은 부분 빌드가 쉽고 설정이 유연하다는 점이다. 의존성 연결을 project(':module')로 쉽게 표현할 수 있어 모듈 간 참조가 명확하다.
Maven 멀티 모듈 예시
루트 pom.xml
<project xmlns='http://maven.apache.org/POM/4.0.0'>
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>my-app-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>common-core</module>
<module>service</module>
<module>web</module>
</modules>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.5.4</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
module(web) pom.xml
<project>
<parent>
<groupId>com.example</groupId>
<artifactId>my-app-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>web</artifactId>
<dependencies>
<dependency>
<groupId>com.example</groupId>
<artifactId>common-core</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>
Maven은 의존성 관리와 플러그인 구성이 명확하다. 부모 POM에서 버전과 공통 설정을 관리하면 하위 모듈이 일관성을 유지한다.
테스트와 빌드 전략
- 단위 테스트는 각 모듈에서 실행
- 통합 테스트는 루트 또는 전용 모듈에서 실행
- CI 파이프라인에서 변경된 모듈만 빌드하도록 설정
배포와 버전 관리
모듈별로 배포 단위를 정한다. 예를 들어 웹 모듈은 실행 가능한 jar로, common-core는 라이브러리로 배포한다. 버전 전략은 세만틱 버전을 사용하면 충돌을 줄일 수 있다.
주요 고려사항
- 모듈 경계는 명확하게 설계한다. 도메인과 인프라를 섞지 않는다.
- 순환 의존성을 주의한다. 한 방향 의존성으로 설계한다.
- 공통 설정은 루트에 두고, 특이한 설정은 모듈 내로 한정한다.
마무리
초기 설계에 시간을 투자하면 유지보수가 쉬워진다. gradle multi module spring boot와 maven multi module spring boot 각각의 장단점을 이해하고 팀과 프로젝트에 맞는 방식을 선택하면 생산성이 높아진다.