본문 바로가기
Programming/TDD Project

Pull Request 005 - 자유게시글 작성 기능 TDD로 구현해보기 - Post DTO를 Entity로 변경.

by JKROH 2023. 10. 25.
반응형

 첫 삽을 떠보려고 한다. 정의해놓은 여러 요구사항 중 가장 테스트하기 쉬워보이는 자유게시글 작성부터 도전해보기로 했다.

 

 생각해놓은 게시글 작성 기능의 로직은 다음과 같다.

  1. 게시글 작성 기능은 BoardServicve#createBoard(BoardDto.Post postDto) 메서드로 정의한다.
  2. post dto를 Board 객체로 변환한다. 
    1. 이 때, 제목과 내용이 작성되어있는지 검증한다.
  3. Board 객체를 데이터베이스에 저장한다.
  4. Board객체를 response dto로 변환한다.
  5. response dto를 controller에 반환한다.

 이 때 response dto를 반환하는 이유는 글을 작성한 시점에서 해당 게시글로 이동해서 자신의 게시글을 확인할 수 있게 하기 위해서이다.

 

 여기서 테스트 해볼 수 있는 구간은 2, 3, 4, 5번 로직에 있다. 

  • 2 : post dto -> entity로 변환하는 과정에서 입력 값과 로그인한 사용자의 정보가 Board Entity에 정확하게 입력되었는가?
  • 3: board entity가 데이터베이스에 저장이 잘 되었는가?
  • 4: entity -> response dto로 변환하는 과정에서 정보의 손실은 없는가?
  • 5: 위의 모든 과정을 거쳐 post dto가 response dto로 변환되었을 때, 사용자가 입력한 값이 그대로 반환되는가?

 

 우선은 테스트 메서드를 먼저 만들었다. 해당 테스트는 5번 로직에 대한 테스트가 주된 목적이다. 2,3,4번 로직은 다른 서비스 객체들에게 나뉘어질 것으로 예상되기 때문이다.

    @Test
    void createBoardTest(){
        
    }

 이제 내용물을 채울 시간이다. 먼저, createBoard(); 에 넘겨줄 post dto와 결과물로 반환할 response dto를 빈깡통으로 만든다.

public class BoardDto {
    public static class Response{

    }

    public static class Post {
    }
}

 이제 BoardService에 createBoard(); 메서드를 만들어준다. 일단은 null을 반환하게 한다. 테스트가 통과하는 형태로 먼저 만들어 놓는 것이다.

public BoardDto.Response createBoard(BoardDto.Post boardPostDto) {
        return null;
    }

 이제 테스트 코드를 좀 채워보자. post dto를 하나 만들고, createBoard();를 통해 response dto를 하나 만들고, 이렇게 만들어진 response dto가 null인지를 체크하면 될 것이다.

    @Test
    void createBoardTest(){
        BoardDto.Post boardPostDto = new BoardDto.Post();
        BoardDto.Response boardResponseDto = boardService.createBoard(boardPostDto);
        assertThat(boardResponseDto).isNull();
    }

 테스트를 수행해보면 야무지게 통과하는 것을 확인할 수 있다. 일단은 createBoard();가 정상적으로 작동함은 확인한 것이다. 이제 2번 로직부터 천천히 테스트를 만들면서 기능 구현을 진행해보자.

 

 entity -> dto / dto -> entity 로직은 BoardConverter객체가 담당한다. 우선 post dto와 entity의 내용을 먼저 채워야 할 것이다. 각자 제목과 내용을 넣어주어야 한다.

public class Board {

    private long boardId;
    
    private String title;
    
    private String content;
}

///////////

public class BoardDto {
    public static class Post {
        private String title;
        private String content;
    }
    
    ...
}

  BoardConverter 클래스를 생성하고, BoardConverter#convertPostDtoToEntity(BoardDto.Post postDto); 메서드를 정의하자.

public class BoardConverter {

    public Board convertPostDtoToEntity(BoardDto.Post boardPostDto) {
        return null;
    }
}

 테스트 코드도 만들어보자.

    @Test
    void convertPostDtoToEntityTest(){
        BoardDto.Post postDto = new BoardDto.Post();
        Board board = boardConverter.convertPostDtoToEntity(postDto);
        assertThat(board).isNull();
    }

언제까지고 null로 만들 수는 없으니, 로직을 조금 수정하자.

    public Board convertPostDtoToEntity(BoardDto.Post boardPostDto) {
        return Board.builder()
                .title(boardPostDto.getTitle())
                .content(boardPostDto.getContent())
                .build();
    }

Board 객체에 빌더 패턴을 적용해 title과 content를 넣은 객체를 만들도록 설정했다. 테스트 코드에도 수정이 필요할 것이다.

    @Test
    void convertPostDtoToEntityTest(){
        BoardDto.Post postDto = new BoardDto.Post();
        String testTitle = "title";
        String testContent = "content";

        postDto.setTitle(testTitle);
        postDto.setContent(testContent);

        Board entity = boardConverter.convertPostDtoToEntity(postDto);

        String dtoTitle = postDto.getTitle();
        String entityTitle = entity.getTitle();
        assertThat(dtoTitle).isEqualTo(entityTitle);

        String dtoContent = postDto.getContent();
        String entityContent = entity.getContent();
        assertThat(dtoContent).isEqualTo(entityContent);
    }

 테스트를 통과하는 모습을 확인할 수 있다. 이로써 테스트 코드 작성이 마무리 되었으며, 테스트하고자 하는 기능이 잘 작동하는 것까지 확인할 수 있다.

 

 이후에도 추가적으로 Board post dto에 추가되는 내용과, 이를 entity로 변환하는 로직이 변경되면 테스트를 함께 수정하면서 구현할 수 있다. 만일, 데이터의 변화 없이 리팩터링만 하고 싶다면 테스트가 받쳐주니 편하게 리팩터링을 진행할 수 있다.

 

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

반응형

댓글