<aside>
💡 주문 API
가 호출하는 주문 생성 함수
는 복잡한 로직을 가지고 있었습니다. 돌아가기는 하는데 리팩토링하기에는 꺼림직
한 상태였기에, 일단 테스트 코드
를 짜보고자 했습니다.
만만치 않았습니다. 주문 API 테스트 코드를 작성하면서
여러가지 고민
들이 생겨났습니다. 이러한 고민들 때문에 테스트 코드를 작성하는데 더 많은 시간과 비용
을 사용하고 있었습니다.
이런 고민과 불편함은 저희의 발걸음을 다시 리팩토링으로 향하게 했습니다
. 리팩토링하기 위해 테스트 코드를 짜고자 했지만, 테스트 코드를 쉽게 짜고자 다시 리팩토링하는 방향으로 돌아간 것이었습니다.
이 글에서는 저희 팀에서 테스트 코드를 작성하는 방법 보다는, 테스트 코드를 작성하며 어떤 노동을 했고
, 어떤 고민을 했고
, 또 어떤 해결책을 떠올렸는지
에 대해 이야기합니다.
</aside>
FE쪽 개발 페이스를 맞추기 위해 허겁지겁 API를 짜다보니 개선의 여지들이 많이 남아있는 코드들이 쌓이게 됐습니다.
그 중 주문 API
에 의해 호출되는 service 레이어의 주문 생성 함수
가 가장 문제였습니다.
// 요런 느낌의 함수
async create(userId, createOrderDto: CreateOrderDto) {
const { menus, cafeId } = createOrderDto;
// 주문한 메뉴들에 대한 정보(가능한 옵션, 가격 등등)를 가져오는 부분
// 가져온 정보를 쓰기 좋게 가공하는 과정
// 모든 메뉴가 유효한 메뉴였는지 확인하는 과정
// (유효하지 않은걸 db에 넣으면 알아서 걸러지기는 하지만, 애초에 아래
// 유효성들을 검사할 때 메뉴가 없으면 어차피 진행이 안된다.)
// 각 메뉴마다 옵션이 모두 유효한 옵션들인지 확인하는 과정
// 사이즈, 필수 옵션, 선택 옵션 등등..
// 가격 비교
// 주문 저장을 위한 과정
await this.orderRepository.save(...);
return;
}
저희 서비스에서 가장 핵심적인 부분이다보니 더 철저하게 유효성 검증
을 할 필요가 있었고, 그렇다보니 조금 보기 힘든 코드가 나왔습니다.
실제로 처음 코드를 구현했을 때 실수를 해, 유효성 검증을 추가하기 위해 코드를 조금 고쳐야했고, 애초에 코드를 짜놓은 저희도 다시 볼 때 꽤 헷갈려 고생했었습니다.
리팩토링은 필수였습니다.
일단 정상적으로 돌아가는 함수이다보니 리팩토링 전에 테스트 코드 작성부터 시작했습니다. 잘 못 건드렸다가 또 삽질하는건 너무 싫었거든요 :’)
막상 짜려고 하니 어떻게 짜야할지 감이 안잡히더라구요. 일단 해당 함수가 현재 수행하는 동작만큼은 제대로 수행하도록 강제하고자 하는게 목표였으니, 이 친구가 수행해야할 동작들에 대해 생각해봤습니다.
주문 생성 함수
는