반응형
들어가며..
최근 사이드 프로젝트를 진행하면서
테스트 코드에 대해 공부할 겸 TDD로 프로젝트를 진행하고 있다.
지금까지 다양한 백엔드 프로젝트를 진행해보았지만
테스트 코드를 작성해본 경험이 없었기에
이번 프로젝트를 진행하면서 TDD로 개발하며 무조건! 테스트 코드를 작성하며 개발을 하고자 했다.
그렇게 시작
시작은 User API를 개발하며 TDD를 진행하였다.
생성, 조회 API 까지는 나름 TDD가 할만했다.
컨트롤러, 서비스 모듈 별로 테스트를 작성하며 진행했다.
@Test
public void 일반회원_회원가입() throws Exception{
String id = "username";
String password = "password";
String nickname = "nickname";
when(userService.customerSignUp(any(CustomerSignUpRequest.class))).thenReturn(mock(
UserResponse.class));
mockMvc.perform(post("/api/customers")
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsBytes(new CustomerSignUpRequest(id, password,nickname)))
.with(csrf())
).andDo(print())
.andExpect(status().isOk());
}
@Test
void 일반회원_회원가입이_정상적으로_동작하는경우() {
String id = "id";
String password = "password";
String nickname = "nickname";
when(userRepository.findById(id)).thenReturn(Optional.empty());
when(userRepository.save(any())).thenReturn(CustomerUserFixture.get(id, password));
when(passwordEncoder.encode(password)).thenReturn("encodedPassword");
Assertions.assertDoesNotThrow(() -> userService.customerSignUp(new CustomerSignUpRequest(id,password,nickname)));
}
하지만 수정 부터 굉장히 복잡해졌다..
@Test
void 고객_회원_수정이_성공적으로_동작하는_경우() {
// given
User existingUser = User.ofCustomer("loginId", "oldPass", "oldNick");
// anyLong() 사용
given(userRepository.findById(anyLong()))
.willReturn(Optional.of(existingUser));
given(userRepository.save(any(User.class)))
.willAnswer(invocation -> invocation.getArgument(0));
given(passwordEncoder.encode("newPass")).willReturn("newPass");
UpdateUserRequest req = new UpdateUserRequest("newPass", "newNick");
// when
UserResponse resp = userService.updateUser(999L, req);
// then
assertThat(existingUser.getPassword()).isEqualTo("newPass");
assertThat(existingUser.getNickname()).isEqualTo("newNick");
assertThat(resp.getNickname()).isEqualTo("newNick");
}
장단점
그래도 스스로 TDD를 하며 느낀 장점을 적어보자면
1. 익셉션 처리가 제대로 되는 지 확인할 수 있다.
2. 비즈니스 로직이 제대로 작동하는 지 확인할 수 있다.
3. 리팩토링 진행 후 추가적인 파급 효과를 확인할 수 있다.
4. 심리적 안정감
하지만 단점도 존재한다.
1. 개발속도가 상당히 느려진다.
2. 비즈니스 로직 구현보다 테스트 코드 작성하는데 시간이 더 걸린다.
뭐 어떻게 보면 단점 1,2는 같은 말이기도 하다..
더 나아가야할 점
TDD의 시작은 강의를 보며 따라하는 방식으로 진행했다.
해당 강의와 프로젝트의 로직이 완전히 똑같지는 않지만 나름 비슷한 부분은 참고하며 진행하고 있다.
하지만 진행하는 프로젝트의 로직이 점점 복잡해지면서 강의를 참고하기가 어려워지고 있다...
AI들의 도움을 받으며 겨우 겨우 작성하고 있지만
그래도 스스로 더욱 더 학습해나아가야 할 것 같다..
강의의 강사분처럼.. 혼자서 쓱쓱 테스트 코드 작성하는 개발자가 되기를 바라며..
반응형
'Spring' 카테고리의 다른 글
Audit Log 조회 API 성능 개선기 - 2 (8) | 2025.08.08 |
---|---|
Audit Log 조회 API 성능 개선기 - 1 (4) | 2025.07.19 |
Github Action 환경에서 모든 테스트코드가 실패한다. (0) | 2025.07.19 |
DB에 인덱싱을 적용하면 왜 빨라질까? (0) | 2025.06.09 |
Grafana + k6 로 부하 테스트 드가자~ (0) | 2025.05.08 |