본문 바로가기
Programming/TDD Project

Pull Request 006 - 자유게시글 작성 기능 TDD로 구현해보기 - 게시글 저장

by JKROH 2023. 11. 1.
반응형

 이전 글에서 dto -> entity 변환 로직의 테스트를 작성하고 기능을 구현해보았다. 이번에는 데이터베이스에 저장이 잘 되는지를 테스트해보고자 한다.

 

 시작에 앞서 Board객체를 전부 FreeBoard로 수정했음을 미리 알린다. 자유 게시판이라는 형식에 맞춰 이름을 바꿔줬다. 게시판은 자유 게시판 이외에도 리뷰 게시판과 구인구직 게시판이 있는데, 해당 게시판들마다 조금씩 다른 차이를 두고 있기에 크게 게시판으로 추상화하고 서로 다른 이름을 붙여 사용하고자 한다.

  • 구인구직 게시판은 '글머리'가 붙는다. 구인 또는 구직을 나눠야 하기 때문이다.
  • 리뷰 게시판은 게시글 내용에 '해당 샵의 정보'가 들어간다. 어느 샵을 리뷰하는지를 게시글을 보는 순간 쉽게 파악하기 위해서다.

 이번에 테스트 해 볼 기능은 '게시글을 저장하는 기능'이다. 게시글을 저장하기 위해서는 Repository가 필요하다. 일단은 Repository를 먼저 만들어보자.

 

public interface FreeBoardRepository extends JpaRepository<FreeBoard, Long> {

}

 

 Repository는 JpaRepository를 상속받는다. 기본적인 기능들이 JpaRepository에 구현되어 있기 때문에 사용하기로 결정했다.

 

 FreeBoardRepository에서 제공하는 save(); 메서드는 FreeBoardCommandService에서 호출해서 사용한다. 다시 말해, Repository를 사용하는 서비스 계층의 클래스는 FreeBoardService가 아니라, FreeBoardCommandService이다. 앞선 변환 로직의 경우도, FreeBoardService에서 직접 처리하는 것이 아니라 FreeBoardConverter에서 처리했다. 이렇게 기능을 분리하고 작은 구현 클래스들을 만드는 것이 하나하나의 기능 단위의 테스트가 용이하게 만들 수 있으며, 테스트하기 어려운 기능을 제한할 수 있다.

  • 예를 들어, createFreeBoard 메서드 하나에 변환, 저장 로직이 모두 포함되어있다고 생각해보자.
  • 사실 변환 로직에 대한 테스트는 외부(Repository)에 의존하지 않고도 가능하다. 내부적으로 객체만 바꿔주면 되기 때문이다.
  • 그러나, 저장 기능의 경우는 반드시 Repository에 의존해야한다. 이 때, 두 기능이 한 메서드 내에 있다면 변환 기능 역시 테스트하기 어려워진다.
  • 그러나 각 기능을 세부 객체들에게 맡긴다면, 변환 로직은 쉽게 테스트가 가능하다. 따라서 여러 객체가 세부 기능을 담당하게 만들었다.

 이제 저장 기능을 테스트할 테스트 코드를 먼저 작성해보자.

    @Test
    void saveTest(){
        FreeBoard savedEntity = freeBoardCommandService.save();

        assertThat(savedEntity).isNull();
    }

 어느 정도 save(); 메서드의 생김새가 예측이 될 것이다.

    public FreeBoard save() {
        return null;
    }

 테스트를 수행하면 통과하는 것을 확인할 수 있다. 이제 기능을 좀 구현해보자. save(); 메서드에는 일단 인자로 entity가 하나 들어가야 할 것이다. 인자로 받아온 entity를 저장하고, 이렇게 저장한 entity를 다시 반환하는 것이 save(); 의 최종적인 기능이다.

    public FreeBoard save(FreeBoard entity) {
        return freeBoardRepository.save(entity);
    }

 테스트 코드도 조금 수정되어야 할 것이다. 먼저 save()에 넣어줄 인자를 만들어야 하며, 이제는 해당 테스트를 작성한 목적을 달성할 수 있도록 테스트 코드도 채워주어야 한다.

  • 저장하기 위해 제공된 entity와 저장된 entity에 데이터 간 괴리가 없는지 확인한다.
  • 저장된 entity는 id값을 가지고 있는지 확인한다.
    @Test
    void saveTest(){
        FreeBoard testEntity = FreeBoard.builder()
                .title("test")
                .content("content")
                .build();
        FreeBoard savedEntity = freeBoardCommandService.save(testEntity);
        
        assertThat(savedEntity.getId()).isEqualTo(1L);
        assertThat(savedEntity.getTitle()).isEqualTo(testEntity.getTitle());
        assertThat(savedEntity.getContent()).isEqualTo(testEntity.getContent());
    }

 테스트를 수행하면 잘 통과함을 확인할 수 있다. 이로써 게시글 저장 기능의 테스트와 구현까지 마쳤다. 마지막 단계인 entity -> dto 기능의 테스트 작성과 기능 구현 과정은 생략하고자 한다. 이전 글과 같은 방향으로 진행될 것이기 때문이다.

 

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

 

반응형

댓글