ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring Boot 시리즈 18편 – 멀티 모듈 프로젝트의 테스트 전략: 독립성, 속도, 신뢰성 확보 방법
    개발/Spring Boot 2025. 4. 28. 18:30
    728x90
    SMALL

    Spring Boot 멀티 모듈 프로젝트에서 테스트를 효율적으로 수행하는 방법을 소개합니다. 모듈별 독립성, 통합 테스트, 빌드 최적화 전략까지 실전 사례로 정리했습니다.


    Spring Boot 시리즈 18편 – 멀티 모듈 프로젝트의 테스트 전략: 독립성, 속도, 신뢰성 확보 방법

    Spring Boot 애플리케이션이 커지면 단일 프로젝트 구조를 넘어,
    Core / Domain / API / Batch / Infra멀티 모듈로 나누어 관리하는 것이 일반적입니다.

    하지만 멀티 모듈 환경에서는 테스트가 복잡해지고,
    잘못 설계하면 모듈 간 의존성 꼬임이나 전체 빌드 속도 저하 문제가 발생할 수 있습니다.

    이번 편에서는 멀티 모듈 구조에 최적화된 테스트 전략을 체계적으로 정리합니다.


    📌 1. 멀티 모듈 테스트 전략이 필요한 이유

    이슈 문제점

    모듈 간 의존성 모듈 독립성 깨짐, 예기치 않은 테스트 실패
    빌드 속도 모든 모듈을 매번 전체 테스트 → 빌드 시간 급증
    통합 테스트 관리 전체 서비스 흐름 검증 누락 가능성

    ✅ 2. 기본 구조 예시 (멀티 모듈)

    myapp-backend/
    ├── build.gradle (Root)
    ├── modules/
    │   ├── core/          (공통 Util, Response 구조 등)
    │   ├── domain-user/   (User Entity, Repository)
    │   ├── domain-order/  (Order Entity, Repository)
    │   ├── api/           (Controller, Service)
    │   ├── batch/         (배치 전용 스케줄링 모듈)
    │   └── infra/         (외부 연동, Redis, Kafka 등)
    
    • 각 모듈은 별도 테스트 코드를 보유
    • API 모듈은 전체 통합 테스트를 담당

    🛠️ 3. 모듈별 테스트 독립성 전략

    모듈 테스트 포커스

    core 순수 Java 단위 테스트 (Util, DTO)
    domain-* JPA Repository 테스트, Entity 상태 검증
    api 통합 API 테스트 (MockMvc, RestAssured)
    infra 외부 시스템 연동 Mock 테스트 (Redis, Kafka 등)
    batch 스케줄링, Job Step 단위 테스트

    1️⃣ 예시: domain-user 모듈 테스트

    @DataJpaTest
    class UserRepositoryTest {
    
        @Autowired
        private UserRepository userRepository;
    
        @Test
        void 사용자_저장_및_조회() {
            User user = new User("test@example.com", "홍길동");
            userRepository.save(user);
    
            User found = userRepository.findByEmail("test@example.com").orElseThrow();
            assertEquals("홍길동", found.getName());
        }
    }
    
    • @DataJpaTest는 Repository만 테스트하는 데 최적화
    • API 모듈이나 다른 모듈 의존 불필요

    2️⃣ 예시: api 모듈 통합 테스트

    @SpringBootTest
    @AutoConfigureMockMvc
    class UserApiTest {
    
        @Autowired
        private MockMvc mockMvc;
    
        @Test
        void 회원가입_API_성공() throws Exception {
            mockMvc.perform(post("/api/users")
                    .contentType(MediaType.APPLICATION_JSON)
                    .content("""
                        {
                          "email": "api@test.com",
                          "password": "1234",
                          "name": "테스트"
                        }
                    """))
                .andExpect(status().isOk())
                .andExpect(jsonPath("$.success").value(true));
        }
    }
    
    • API 모듈은 실제 HTTP 흐름 전체를 테스트

    ⚡ 4. 테스트 속도 최적화 방법

    방법 설명

    Gradle 빌드 최적화 ./gradlew build --parallel로 모듈 병렬 빌드
    모듈 단위 테스트 실행 필요한 모듈만 테스트 (:modules:domain-user:test)
    테스트 클래스 분리 단위/통합/환경 테스트를 별도 클래스로 분리
    경량화 테스트 사용 @DataJpaTest, @WebMvcTest로 불필요한 Bean 로딩 최소화

    1️⃣ Gradle 설정 최적화 (Root build.gradle)

    subprojects {
        tasks.withType(Test).configureEach {
            useJUnitPlatform()
            maxParallelForks = Runtime.runtime.availableProcessors().intdiv(2) ?: 1
        }
    }
    
    • CPU 코어 수의 절반을 병렬 테스트에 활용
    • 대규모 테스트도 빠르게 완료 가능

    🔥 5. 통합 테스트 신뢰성 확보

    전략 설명

    TestContainers 활용 DB, Redis, Kafka 컨테이너 띄워 실제 환경과 유사하게 검증
    데이터 초기화 각 테스트 케이스 시작 전에 DB 상태 클린업 (@Transactional, @Rollback)
    헬스 체크 API /health 엔드포인트 테스트로 운영 배포 전 상태 확인
    알람 연동 테스트 실패 시 Slack 등으로 알림 설정

    ✅ 마무리 요약

    항목 정리

    모듈별 독립 테스트 core/domain/infra/api 별로 책임 분리
    속도 최적화 병렬 빌드 + 경량화 테스트 적용
    신뢰성 강화 TestContainers, 데이터 초기화 적용
    통합 흐름 점검 API 단위 시나리오 테스트 필수
    CI 연동 PR마다 모듈별 테스트 자동 실행

    📌 다음 편 예고

    Spring Boot 시리즈 19편: 대규모 트래픽 대응 전략 – Connection Pool, Cache, Scale-out까지

     

    728x90
    LIST
Designed by Tistory.