-
Spring Boot 시리즈 18편 – 멀티 모듈 프로젝트의 테스트 전략: 독립성, 속도, 신뢰성 확보 방법개발/Spring Boot 2025. 4. 28. 18:30728x90SMALL
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까지
728x90LIST'개발 > Spring Boot' 카테고리의 다른 글