티스토리 뷰
요즘 클린 코드와 유튜브 클린 코더스 강의를 보며 테스트 코드 작성을 연습 중이다
테스트 코드 개수가 늘어가면서 뿌듯하기도 하고 사람들이 왜 TDD에 열광하는지 알 것 같다
예전에는 테스트 코드 없이 바로 로직을 작성하고 문제가 생기면 스택 트레이스를 읽고, 디버거를 통해 문제 해결을 했었다
그런데 지금 진행하는 프로젝트는 4개의 백엔드 모듈과 1개의 프런트엔드 모듈로 구성되어 있어 규모가 작지 않다
이런 경우에는 혼자 진행하더라도 의존성이 어디까지 미칠지 완전히 파악할 수 없다
서비스 계층의 로직을 변경했을 뿐인데 여기저기에 영향을 미쳐 전체 로직이 흔들릴 수도 있다
- 백명석 님의 클린 코더스 강의, 최신 강의는 아니지만 굉장히 좋다! 강추 강추
https://www.youtube.com/watch?v=60lLSe1phks&list=PLagTY0ogyVkIl2kTr08w-4MLGYWJz7lNK
테스트 코드가 있다면 이런 경우에 로직 변경의 영향을 쉽게 파악할 수 있다
그저 지금까지 작성했던 테스트를 돌려보기만 하면 될 뿐이다
코드에서 Data Type 변경이 일어났을 때는 컴파일 에러로 잡힐 것이고, 수행하던 로직이 변경되었다면 테스트가 깨질 것이다
빌드 도구로 Gradle을 쓴다면 아래 명령어를 통해 재빠르게 전체 테스트를 돌려볼 수 있다
./gradlew test --parallel
또한. gradle.yml 파일 설정을 통해 캐시 활성화, daemon thread 활성화하여 더 빠른 실행이 가능하다
자세한 사항은 이전에 쓴 글, https://ryumodrn.tistory.com/18 참고하거나
gradle 빌드 속도 & gradle 빌드 최적화 등의 키워드로 검색하면 많은 결과가 나올 것이다
위 사진은 gradle이 실패한 테스트에 대해 친절하게 만들어준 스택 트레이스 페이지다
테스트에 대한 응답으로 200을 기대했으나 400이 나왔다는 건 알겠는데 그 외에는 외계어다
문제의 원인을 뽑아내 준 게 아니라서 이 페이지로 문제 해결을 하진 않았다
아래가 내가 작성한 테스트 코드다
signUpMemberRequest는 회원 가입 요청할 때의 DTO이고, memberService를 통해 회원 가입을 요청한다
이후 로그인 요청 시의 DTO loginRequest에 email & password를 넘겨준다
email -> principal, password -> credential로 만들어 customUserDetailsService로 로그인 검증을 한다
차분히 생각했다면 더 빨리 해결했을 문제인데 괜히 테스트 코드에서 고쳐보느라 삽질을 좀 했다
문제 핵심은 로그인 시 권한 검증이 있는데 전에는 가입 때 권한을 직접 넣어주는 로직이 있었으나
Default로 ROLE_USER를 설정해 중복을 없애려고 했다
Member Entity에서 초기화를 해주면 서비스 단에서는 권한 설정을 할 필요가 없으니 간단하겠거니 싶었다
내 코드에서는 SignUpMemberRequest에서 MapStruct가 Member Entity로 매핑해주고
얘를 memberRepository.save() 하는 방식으로 저장이 된다
초기화하는 생각 자체는 나쁘지 않았지만 mapping 하는 부분을 간과했다
현재 Builder 패턴으로 Member 객체를 생성하는데 초기화된 ROLE_USER를 사용하려면 authority는 인자에서 빼줘야 한다
테스트가 자주 깨지긴 하는데 이번 테스트는 조금 특별했다
두 가지 교훈을 얻었는데, 하나는 테스트가 깨지더라도 넓게 볼 줄 알아야 한다는 점이다
테스트 코드에 손을 하나도 안 댔는데 깨졌다면 로직의 문제지 테스트 코드의 문제가 아니다
나는 빨간 막대 때문인지 너무 테스트 코드에 매몰되었던 것 같다
또 하나는 깃의 중요성이다 테스트 코드를 고치기 위해 매달릴수록 시야는 더욱 좁아지고 초조하게 된다
이런 때엔 테스트가 전부 돌아가는 branch로 옮겨 테스트를 다 돌려보고,
현재의 테스트와 로그가 어떻게 다른지 파악해보는 게 도움된다
나도 잘 안 풀려서 잠시 멍 좀 때리고 다른 브랜치로 옮겨 로그를 비교해보며 문제가 무엇인지 깨달았다
'Spring > Spring Framework' 카테고리의 다른 글
[Test] 기묘한 병렬 테스트 (0) | 2021.12.06 |
---|---|
[Test] JPA DataIntegrityViolationException 발생 테스트 복구 (0) | 2021.11.19 |
[MapStruct] DTO 안의 DTO (0) | 2021.10.07 |
[MapStruct] MapStruct의 update 기능 사용 주의 (0) | 2021.09.20 |
[AOP] 소요 시간 측정 AOP class level에 적용하기 (0) | 2021.09.09 |