리팩토링

처음부터 완벽할 순 없다. 앞으로도 코드를 작성하고 리팩토링하는 과정을 꾸준히 해야할 것이다.

지금까지 해온 코드들을 돌아보면 구현을 위주로 하여 지저분한 코드가 많이 보인다.

우선 테스트에 content 입력 시 기존처럼 문자열로 집어넣으면 지저분하고 실수할 여지가 많다.

PostCreate 에 Builder 패턴으로 생성자를 만들고 Jackson 라이브러리의 ObjectMapper 사용해서 리팩토링 해보자.

 

기존 테스트

PostControllerTest

@DisplayName("/posts 요청 시 저장한 Post 를 출력한다.")
@Test
void post1() throws Exception {
    mockMvc.perform(
            post("/posts/request")
                .contentType(APPLICATION_JSON)
                .content("{\"title\" : \"글 제목입니다\", \"content\" : \"글 내용입니다 하하\"}")
        )
        .andExpect(status().isOk())
        .andExpect(jsonPath("$.title").value("글 제목입니다"))
        .andExpect(jsonPath("$.content").value("글 내용입니다 하하"))
        .andDo(print());
}

 

리팩토링 후

PostCreate

@Getter
@ToString
@NoArgsConstructor
public class PostCreate {

    @NotBlank(message = "제목을 입력해주세요.")
    private String title;

    @NotBlank(message = "내용을 입력해주세요.")
    private String content;

    @Builder
    public PostCreate(String title, String content) {
        this.title = title;
        this.content = content;
    }
}

 

ㄴ @Builder

Lombok 이 제공하는 빌더 애노테이션이다. 빌더패턴과 관련된 내용은 여기에 정리해두었다.

빌더 패턴 없이 title, content 를 매개변수로 받는 생성자 사용 시 이 둘의 타입이 같으므로

잠재적인 문제가 발생할 수 있으므로 빌더 패턴을 사용하기로 했다.

 

PostControllerTest

@Autowired
private ObjectMapper objectMapper;

@DisplayName("/posts 요청 시 저장한 Post 를 출력한다.")
@Test
void post1() throws Exception {
    PostCreate request = PostCreate.builder()
            .title("글 제목입니다")
            .content("글 내용입니다 하하")
            .build();

    ObjectMapper objectMapper = new ObjectMapper();
    String json = objectMapper.writeValueAsString(request);

    mockMvc.perform(
            post("/posts/request")
                .contentType(APPLICATION_JSON)
                .content(json)
        )
        .andExpect(status().isOk())
        .andExpect(content().string("{}"))
        .andDo(print());
}

 

ㄴ ObjectMapper

Jackson 에서 제공해주는 객체를 직렬화 및 역직렬화 해주는 라이브러리이다.

ObjectMapper 는 스프링부트에서 빈을 제공해주므로 의존성 주입을 받아 이용한다.

ObjectMapper 를 이용해서 Post 객체를 직렬화 하여 json 형식으로 변경한 문자열을 입력해

더 깔끔한 테스트코드로 리팩토링하였다.

 

 

마찬가지로 ErrorResponse, PostControllerAdvice, Post 등 다른 클래스들도

Builder 패턴을 사용해 리팩토링을 진행하였고 앞으로는 이 Builder 패턴을 기본으로 이용할 것이다.

+ Recent posts