1. 문제 (과제, 프로젝트를 진행하면서 부딪혔던 기술적인 문제)
포인트 추가와 히스토리 추가 단위테스트 진행중 한 테스트 로직에서 여러 의존성이 생겼음
2. 시도
포인트 추가 기능의 내부를 간략하게 살펴보면 아래처럼 구현되어있음.
Point charge(id, amount){
pointRepository.getPoint(id);
pointRepository.insert(id,amount);
pointHistoryRepository.insert(id, amount, "CHARGE");
}
포인트 추가/삭제 로그가 잘 쌓였는지 테스트하는 단위테스트를 작성하는데 문제가 발생했음.
- 포인트가 잘 쌓였는지 확인하려면 charge, use 함수를 사용해야 함. 포인트 히스토리 자체와 charge, use가 관계있다고 보기 힘듦.
- 포인트 히스토리 레포지토리를 자체를 mock으로 만들어 input, output을 정의했음. charge함수를 사용해 히스토리가 쌓이는지 확인해야하는데, mock으로 만들어 버렸으니 charge의 동작 성공 여부와 관계없이 특정 값이 리턴됨. 결국, 테스트가 불가함.
3. 해결
히스토리 서비스를 분리하고, 히스토리 함수는 호출 되었음만 테스트하는 방식으로 변경했다.
charge 내에서 insertHistory가 호출됨을 증명하기만 하면 되었다.
void testCharge(id, amount){
pointService.charge();
verify(pointHistory).insertHistory(id, amount "CHARGE");
}
4. 알게된 것
"간단한 구조에서 굳이 서비스를 분리하는 필요가 있을까?"
불필요하다는 생각이 있었는데, 테스트를 진행하다보면 서비스를 분리해야했다.
서비스를 분리하니 일단은 테스트가 편하긴 했는데 그 외의 장점은 아직 모르겠다.
이번에 한 행동은 '테스트를 하기 위해 서비스를 분리한 것'이므로 서비스를 분리해야 하는 필요성을 직접 느껴볼 일이 있어보길 바란다.
Keep : 현재 만족하고 계속 유지할 부분
생각보다 열심히 했다. 워크샵 다녀와서 밤새서 코딩함.
Problem : 개선이 필요하다고 생각하는 문제점
꼬리에 꼬리를 무는 질문으로 개발이 늦어지는것.
Try : 문제점을 해결하기 위해 시도해야 할 것
일단 만들고 그다음 고친다.
사용 태그 #항해플러스 #항해99