SpringBoot/심화 주제

멀티모듈 프로젝트 구성

DEVLIB 2025. 4. 16. 11:48
728x90

멀티모듈 프로젝트란?

하나의 루트 프로젝트(Parent) 아래에 여러 개의 서브 모듈을 구성하여 각 모듈이 독립된 책임을 갖도록 분리하는 구조입니다.


프로젝트 구조 예시

my-project/
├── build.gradle            ← 루트 빌드 설정
├── settings.gradle         ← 모듈 등록
├── common/                 ← 공통 유틸/Config 모듈
│   └── build.gradle
├── domain-member/          ← 회원 도메인
│   └── build.gradle
├── domain-order/           ← 주문 도메인
│   └── build.gradle
├── api/                    ← 외부 API를 받는 모듈 (Controller 포함)
│   └── build.gradle
└── core/                   ← DB 설정, 공통 설정 등
    └── build.gradle

1. settings.gradle

rootProject.name = 'my-project'

include 'common', 'domain-member', 'domain-order', 'api', 'core'

2. 루트 build.gradle

plugins {
    id 'java'
}

subprojects {
    group = 'com.example'
    version = '1.0.0'

    repositories {
        mavenCentral()
    }

    apply plugin: 'java'
}

공통 의존성, 설정 등을 subprojects 안에서 일괄 처리


3. 서브 모듈 build.gradle 예시

domain-member/build.gradle

dependencies {
    implementation project(':common')
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
}
 

api/build.gradle

dependencies {
    implementation project(':domain-member')
    implementation project(':domain-order')
    implementation project(':common')
    implementation 'org.springframework.boot:spring-boot-starter-web'
}

모듈 간 의존 구조 설계

원칙: 하위 모듈은 상위 모듈을 참조하면 안 됩니다.

예시 구조 (위 → 아래로 참조)

common
↑
domain-member, domain-order
↑
api (컨트롤러)

모듈 책임 분리 예시

모듈
역할
common DTO, 공통 유틸, 예외 클래스
domain-* 비즈니스 로직 (Service, Repository, Entity 등)
api Controller + 외부 요청 처리
core/config 환경 설정, Security, DB 등

테스트와 실행

  • api 모듈에 @SpringBootApplication 있는 main class 정의
  • 실행: ./gradlew :api:bootRun
  • 테스트: 모듈별로 ./gradlew :domain-member:test 등 실행 가능

실무 팁

항목
Git 관리 모듈별 .gitignore 가능
빌드 속도 --parallel 옵션 사용
팀 개발 모듈별 담당자 지정하면 협업에 최적화
API 경량화 불필요한 의존성 최소화 (ex. domain 모듈에서 web 제외)

마무리 요약

항목 설명
구조 루트 + 여러 서브 모듈
목적 책임 분리, 확장성 확보, 유지보수 용이
설정 settings.gradle, 모듈별 build.gradle
실무 활용 대규모 백엔드, 모놀리식 구조 최적화
LIST