리팩토링
처음부터 완벽할 순 없다. 앞으로도 코드를 작성하고 리팩토링하는 과정을 꾸준히 해야할 것이다.
지금까지 해온 코드들을 돌아보면 구현을 위주로 하여 지저분한 코드가 많이 보인다.
우선 테스트에 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 패턴을 기본으로 이용할 것이다.
'API 만들어 보기 > 게시판 API' 카테고리의 다른 글
[게시글 조회] 리팩토링 2 (0) | 2023.09.23 |
---|---|
[게시글 조회] 단건 조회 (0) | 2023.09.23 |
[작성글 저장] 게시글 저장 구현 (1) | 2023.09.22 |
[데이터 검증] @ControllerAdvice (0) | 2023.09.22 |
[데이터 검증] BeanValidation (0) | 2023.09.21 |