Programming/TDD Project

Pull Request 011 - 자유게시글 삭제 기능 TDD로 구현해보기

JKROH 2023. 11. 11. 22:31
반응형

 CRUD의 마지막 삭제 기능을 구현하고자 한다. 이후로는 Service Layer의 상위 계층, Controller Layer, Data Access Layer 순서대로 진행할 예정이다.

 

 게시글 삭제 기능의 순서는 다음과 같다.

  1. FreeBoardService#deleteFreeBoard(long id) 를 통해 삭제 명령을 받는다.
  2. FreeBoardCommandService#delete(FreeBoard entity) 메서드를 통해 레포지토리에 FreeBoard 엔티티 삭제 쿼리를 날린다.

 마찬가지로 오늘은 2번 메서드에 대한 테스트를 진행하고 이를 기반으로 기능 구현을 마칠 것이다. 그런데, 앞서 삽입, 수정, 조회 기능을 구현할 때와 이번 삭제 기능에는 차이가 있다. 바로 무언가 테스트해 볼 결과가 없다는 것이다.

 

 삽입의 경우 postDTO -> Entity의 변환 로직에서 변환되기 전과 후의 객체가 담고 있는 정보가 같은지, 저장을 수행하고 반환하는 객체가 저장에 투입한 객체와 같은지를 테스트 할 수 있었다. 조회의 경우 조회한 엔티티가 원하는 엔티티와 같은지, 조회가 불가능한 경우에는 예외를 발생시키는지를 테스트할 수 있었다. 수정의 경우 pustDTO의 정보가 잘 전달되어 수정에 반영되었는지 확인할 수 있었다. 그러나 삭제의 경우, 이러한 결과를 테스트할 수가 없다.

 

 이 경우, 우리는 상태가 아닌 행위를 테스트해본다. 다시 말해, 결과가 아니라 과정을 테스트하는 것이다. FreeBoardCommandService#delete() 메서드는 레포지토리의 delete메서드를 호출한다. 이 과정에서 호출이 실제로 발생했는지를 테스트해보는 것이다.

    @Test
    void deleteTest(){
        FreeBoard testEntity = FreeBoard.builder()
                .title("test")
                .content("content")
                .build();
        testEntity.setId(1L);

        freeBoardCommandService.delete(testEntity);
    }

 

 여기까지는 다른 기능들과 같다. 그런데, delete메서드는 반환값도 없고, 별도로 수정되는 결과도 없다. 이 때 우리가 사용할 수 있는 방법은 '그럼 FreeBoardCommandService#delete()가 실제로 FreeBoardRepository#delete() 메서드를 호출하는가?'를 테스트하는 것이다.

 

    @Test
    void deleteTest(){
        //given
        FreeBoard testEntity = FreeBoard.builder()
                .title("test")
                .content("content")
                .build();
        testEntity.setId(1L);

        //when
        freeBoardCommandService.delete(testEntity);

        //then
        verify(freeBoardRepository).delete(testEntity);
    }

 

 위의 verify()메서드를 통해 어떤 객체가 어떤 메서드를 어떤 인자로 수행했는지를 테스트해볼 수 있다. 위의 테스트를 기반으로 기능 구현을 해보면 다음과 같이 구현할 수 있다.

    @Transactional
    public void delete(FreeBoard entity) {
        freeBoardRepository.delete(entity);
    }

 

 이렇게 간단하게 Repository와 통신하는 Service 계층의 객체들, 그리고 자체적으로 변환 로직을 수행하는 Service 계층의 객체들에 대한 테스트를 마쳤다. 다음에는 앞서 언급한대로 Controller 계층으로부터 호출되어 내부 로직을 수행하는 역할을 담당하는 Service 상위 계층 객체의 테스트와 기능 구현을 마쳐볼 것이다.

 

전체 코드는 링크에서 확인할 수 있다.

 

반응형