ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring Boot 고급 시리즈 10편 – 멀티 모듈 아키텍처 전략: 실무 서비스 구조 분리 가이드
    언어 및 프레임워크/Spring Boot 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
Designed by Tistory.