221114 TIL 원칙을 위배해서는 안된다.

인수 테스트를 통해 검증하자

4주 차 스프린트 회고가 있었던 날이다.

노아님이 하나의 기능이 완성될 때마다 작성한 인수 테스트를 실행(codeceptJs)시켜 통과가 돼야 완성된 거라고 말씀을 하셨다. 그 말을 듣고 아차! 싶었다. 왜냐 나는 인수 테스트를 기획 문서에만 작성하고 작성한 인수 테스트를 코드로 옮기지 않았기 때문에 기능들을 구현해도 실행시킬 인수 테스트가 없었기 때문이다. 이는 완전히 잘못된 행동이었음을 깨닫게 되었다.

 

우선 노아님이 알려주신 올바른 프로젝트의 작업 순서는 아래와 같다.

 

1. 구현할 기능에 대해서 작성해 놓은 사용자 스토리를 바탕으로 기획 문서에 인수 테스트를 작성한다

2. 문서에 작성한 인수 테스트를 코드로 옮긴다.

3. 단위 테스트 코드를 작성하며 기능을 구현한다.

4. 인수 테스트를 실행시켜 기능을 검증한다.

 

인수 테스트까지 모두 통과가 돼야 해당 기능을 구현했다고 할 수가 있다는 것을 알게 되었다. 결국 지금까지 내가 구현한 기능들은 인수 테스트가 통과되지 못한 검증이 되지 않은 기능들이었다.

 

그리고 기획 문서에 작성해 놓은 인수 테스트도 사용자 스토리가 잘못되었다는 소리도 들었기 때문에 사용자 스토리를 As - 사용자 (페르소나), I - 기능, So - 가치 (Why, Reason) 구조를 바탕으로  다시 작성할 필요가 있다. 사용자 스토리는 가치 중심으로(무슨 가치를 위해) 즉 해당 기능을 사용하는 사용자가 누구인지 구체적이어야 하고 "왜?" 사용하는지 가치를 생각하고 작성해야 한다. 

 

사용자 스토리를 다시 작성해야 함에 따라 인수 테스트도 다시 작성해야 하는 문제가 발생했다. 결국엔 초반에 빠르게 개발을 하기 위해 설계를 제대로 하지 않았던 행동들에 대한 결과물인 것 같다. 

 

검증되지 않은 기능

그리고 4주 차 때 구현한 기능인 게시글 삭제 기능을 노아님께 보여주는데 게시글이 삭제가 되지 않는 문제가 발생했다. 결국엔 이 문제 또한 인수 테스트로 제대로 검증하지 않아 발생한 문제라고 생각했다.

 

혼자 게시글 삭제가 제대로 되는지 안되는지 테스트할 때는 제대로 되었는데 오늘 갑자기 안됐었던 이유는 삭제하려는 게시글에 댓글이 여러 개 존재하거나 대댓글이 여러 개 있었기 때문에 삭제되지 않았던 것이었다. 

왜냐하면 코드를 아래와 같이 작성했기 때문에 복수의 댓글이 존재하면 문제가 발생하는 것이었다.

if(commentRepository.existsByPostId(postId)) {
    Comment comment = commentRepository.getReferenceByPostId(postId);
    
    commentRepository.deleteAllById(like.id());
}

삭제하려는 게시글의 아이디를 이용해 댓글 레파지토리에서 댓글을 가져오는데 댓글이 복수 개일 때를 고려해 findAllById를 이용해 List타입으로 가져와야 했는데 딱 하나만 가져오게 했기 때문에 가져오려는 댓글이 2개 이상이면 어떤 댓글을 가져와야 할지 모르기 때문에 에러가 발생했던 것이었다.

게시글 삭제 기능을 직접 사용하면서 테스트할 때는 게시글에 댓글 2개를 달고 삭제할 생각을 못했다. 삭제 버튼을 누르면 게시글이 삭제가 되었기 때문에 기능이 구현된 줄 알았는데 명백한 착각이었던 것이었다. 사실 이런 문제를 방지하고자 초반에 인수 테스트를 꼼꼼히 작성하고 작성한 인수 테스트를 바탕으로 기능을 검증해야 하는 건데 그런 과정이 없었으니 지금까지 기능이 구현된 것도 의심해볼 필요가 있다. 그리고 오늘 같은 문제는 결국엔 언젠가 발생할 문제였던 것이었다. 차라리 오늘 같은 문제가 프로젝트 마지막쯤에 발생한 게 아니라 오늘 발생한 게 천만다행이라고 생각이 된다. 해당 문제를 고치기 위해 수정해야 할게 별로 없었기 때문에 쉽게 리팩터링이 가능했기 때문이다.

 

오늘 깨달은 건 프로젝트의 진행 속도가 늦어질 수는 있어도 인수 테스트 같은 무조건 해야 하는 것들을 무시하고 무지성으로 개발을 하는 행동들은 해서는 안된다는 것과 꼼꼼하게 작성된 테스트를 통과하지 못한 기능은 검증되지 못한 기능이라는 것이다.

결국은 원칙을 위배하고 개발을 진행해서는 절대 절대 안 된다!!