테스트 코드는 왜 필수일까?
소프트웨어 개발을 하다 보면 새로운 기능을 추가하거나, 기존 로직을 수정해야 하는 순간이 많아진다.
그때마다 예상치 못한 버그가 생길 가능성도 커지기 때문에 테스트 코드는 바로 그 위험을 미리 방지하는 역할을 한다.
✅ 테스트의 3가지 장점
- 신뢰성 향상
→ 기능 추가/수정 후에도 기존 기능이 정상 동작하는지 빠르게 확인 가능 - 코드 이해도 증가
→ 테스트는 코드의 사용법을 보여주는 살아있는 문서 - 장기적 비용 절감
→ 초반 테스트 작성은 비용이 들지만, 나중에 디버깅·유지보수 비용을 줄여준다
✅ 단위 테스트 vs 통합 테스트
💡 통합 테스트는 실제 HTTP 요청을 보내고, DB 결과까지 확인함으로써, 시스템이 현실처럼 동작하는지 검증할 수 있고,
단위 테스트는 쉽게 말해. 실제 DB없이 UserRepository를 Mock로 대체해 UserService 로직만 독립적으로 검증한다.
단위 테스트 예시
- 의부 의존성은 모두 Mock으로 대체
- 메서드, 클래스 단위로 로직만 검증
@ExtendWith(MockitoExtension.class)
class UserServiceTest {
@Mock
private UserRepository userRepository;
@InjectMocks
private UserService userService;
@Test
void 사용자조회_성공() {
// Given
User mockUser = new User("user1", "user1@email.com");
given(userRepository.findByEmail("user1@email.com")).willReturn(Optional.of(mockUser));
// When
User result = userService.findByEmail("user1@email.com");
// Then
assertEquals("user1", result.getName());
}
}
통합 테스트 예시
- 실제 시스템 흐름(Controller → Service → DB)이 정상 작동하는지 확인
- 실제 DB(H2 등)와 연동. 실행 시간이 비교적 길지만 전체 흐름 검증 가능
✅ 여기서 Mocking이란?
Mocking은 테스트 대상이 아닌 외부 의존 객체를 가짜(Mock) 객체로 대체하는 기술이다.
즉, 외부 시스템에 의존하는 객체를 "진짜처럼 흉내낸 객체"로 바꿔 테스트하는 기법이다.
✅ 왜 Mocking이 필요할까?
예를 들어 UserService가 UserRepository를 사용하는 경우, UserRepository가 실제 DB와 연결되어야지 메서드를 테스트할 수 있다.
하지만 Mocking을 사용하면 진짜 DB 대신 가짜 UserRepository를 만들어서 특정 이메일이 들어오면 이 유저를 주는 것처럼 사용할 수 있다.
✅ 실제 Mocking 코드 예시
@ExtendWith(MockitoExtension.class)
class UserServiceTest {
@Mock
private UserRepository userRepository; // 진짜 대신 가짜
@InjectMocks
private UserService userService;
@Test
void 유저조회_성공() {
// given
given(userRepository.findByEmail("test@email.com"))
.willReturn(Optional.of(new User("홍길동", "test@email.com")));
// when
User result = userService.findByEmail("test@email.com");
// then
assertEquals("홍길동", result.getName());
}
}
- findByEmail(...) 호출 시 → DB에 접근하는 게 아니라
- given(...)으로 설정한 가짜 응답값이 바로 리턴된다.
Mocking은 외부 의존성을 제거하고, 테스트 대상 로직만 정확하게 검증할 수 있게 도와주는 강력한 테스트 기법이다.
✅ 단위 테스트, 통합 테스트 마무리 정리
구분 | 단위 테스트 | 통합 테스트 |
목적 | 비즈니스 로직 검증 | 시스템 전체 흐름 검증 |
실행 속도 | 빠름 | 상대적으로 느림 |
사용 도구 | Mockito, JUnit | MockMvc, 실제 DB |
특징 | 외부 의존성 Mock 처리 | 실제 환경 그대로 검증 |
'Spring' 카테고리의 다른 글
QueryDSL 의존성 설정 및 활용 (1) | 2025.05.13 |
---|---|
DB 동시성 제어(비관적, 낙관적, 분산 락) (1) | 2025.05.02 |
AWS - RDS란? 그리고 RDS를 활용한 팀 프로젝트 (1) | 2025.04.30 |
아웃소싱 프로젝트 - 소프트 딜리트(SoftDelete) 트러블 슈팅 (1) | 2025.04.29 |
Servlet Filter (1) | 2025.04.22 |