기술과 산업/언어 및 프레임워크
Spring Boot 고급 시리즈 10편 – 멀티 모듈 아키텍처 전략: 실무 서비스 구조 분리 가이드
B컷개발자
2025. 4. 23. 08:30
728x90
Spring Boot에서 멀티 모듈 구조를 설계하는 방법을 소개합니다. 도메인 분리, 공통 모듈 구성, 계층화 전략, 의존성 관리 등 실무 적용 사례 중심으로 설명합니다.
Spring Boot 고급 시리즈 10편 – 멀티 모듈 아키텍처 전략: 실무 서비스 구조 분리 가이드
Spring Boot 기반 프로젝트가 커지고 도메인이 복잡해질수록,
하나의 src/main 폴더에 모든 기능을 넣는 방식은 유지보수와 협업의 한계를 드러냅니다.
이번 편에서는 멀티 모듈(Multi-Module) 구조를 통해 프로젝트를 수평/수직으로 나누고,
도메인 중심 개발과 팀 간 협업에 적합한 구조를 만드는 방법을 실제 운영 사례를 바탕으로 설명합니다.
🧱 1. 멀티 모듈 구조가 필요한 이유
상황 멀티 모듈의 효과
| 서비스가 커지며 도메인이 많아짐 | 도메인 단위로 모듈 분리 가능 |
| 팀원이 늘어나며 충돌 빈도 ↑ | 모듈 단위 협업 구조화 가능 |
| 공통 코드 중복 | core 또는 common 모듈로 재사용 가능 |
| 테스트 시간 증가 | 모듈 단위 테스트/빌드로 효율 ↑ |
| 운영 환경 최적화 필요 | API, Admin, Batch 등 환경별 분리 가능 |
🧩 2. 기본적인 멀티 모듈 구성 예시
myapp-backend/
├── build.gradle (root)
├── settings.gradle
├── modules/
│ ├── core/ # 공통 유틸리티, 상수, 공통 응답 등
│ ├── domain-user/ # 사용자 도메인 (Entity + Service)
│ ├── domain-order/ # 주문 도메인
│ ├── api/ # API Layer (Controller + UseCase)
│ ├── batch/ # 배치 전용 모듈
│ └── infra/ # 외부 연동, JPA 구현체, Redis 등
- 핵심은 기능별, 계층별로 책임이 명확하게 분리되는 구조입니다.
- core는 모든 모듈이 의존 가능하지만, 다른 모듈은 교차 의존하지 않도록 관리해야 합니다.
✅ 3. settings.gradle 구성
rootProject.name = 'myapp'
include 'modules:core'
include 'modules:domain-user'
include 'modules:domain-order'
include 'modules:api'
include 'modules:batch'
include 'modules:infra'
⚙️ 4. 의존성 관리 전략 (Gradle 기준)
🔸 예시: api/build.gradle.kts
dependencies {
implementation(project(":modules:core"))
implementation(project(":modules:domain-user"))
implementation(project(":modules:domain-order"))
implementation(project(":modules:infra"))
implementation("org.springframework.boot:spring-boot-starter-web")
}
🔸 모듈 간 의존 방향 원칙
모듈 의존 대상
| core | 없음 (기본 모듈) |
| domain-* | core만 의존 |
| infra | core, domain-* |
| api | 모든 도메인 및 인프라에 의존 |
| batch | core, domain-*, infra (필요 시) |
❗ 도메인 간 직접 참조 금지 → 반드시 API 또는 공용 인터페이스를 통해 연결
🧠 실무 설계 팁
항목 전략
| 모듈 최소화 | 모듈은 도메인 또는 기술 단위로 명확히 정의 |
| 순환 참조 방지 | A → B, B → A 불가. 필요시 이벤트 발행 또는 Port-Adapter 패턴 적용 |
| 공통 코드 관리 | core 모듈에 Response DTO, Exception, Security 설정 등 공용화 |
| 모듈별 테스트 | api 모듈에서 통합 테스트, domain-* 모듈은 단위 테스트 중심 |
| 빌드 속도 최적화 | Gradle 병렬 빌드 + 테스트 분리로 CI 시간 단축 가능 |
📦 확장 구조 예시: MSA 전환 대비 구조
modules/
├── shared-common/ # 모든 서비스 공통 유틸
├── user-service/ # 독립적 user 마이크로서비스
│ ├── user-api/
│ ├── user-domain/
│ └── user-infra/
├── order-service/
│ ├── order-api/
│ ├── order-domain/
│ └── order-infra/
- 각 서비스는 도메인 독립성을 갖춘 독자적인 구조
- 향후 MSA 또는 모듈형 모노리스로 전환 가능
✅ 마무리 요약
항목 요약
| 도입 이유 | 협업 구조화, 빌드 분리, 책임 분리, 테스트 단위화 |
| 핵심 전략 | 도메인 중심 분리, 공통 모듈 분리, 계층화 |
| 의존 관계 | core ← domain ← infra ← api |
| 권장 구조 | 최소한 core/domain/api, 필요시 infra, batch 확장 |
| 실전 효과 | 유지보수 효율 ↑, 운영 안정성 ↑, CI/CD 속도 개선 ↑ |
📌 다음 시리즈 예고
🎯 Spring Boot 고급 실전 리팩토링 시리즈로 이어집니다:
- Controller Fat → UseCase 중심 구조 전환
- Service 정리 및 응집도 향상
- 레거시 코드 기반 도메인 재구성 전략
728x90