기술과 산업/언어 및 프레임워크
Spring Boot 시리즈 18편 – 멀티 모듈 프로젝트의 테스트 전략: 독립성, 속도, 신뢰성 확보 방법
B컷개발자
2025. 4. 28. 18:30
728x90
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