문제 발견
호돌맨님의 강의 중 검증 파트에서 발생한 오류이다.
PostController
PostCreate
PostControllerTest
글 작성 요청 시 제목, 내용 모두 null 인 케이스 테스트이다.
이 테스트에서 실패하며 아래와 같은 로그가 출력된다.
응답 바디에도 아무것도 오지 않는다.
로그를 쫓아서 ErrorResponse 에 브레이크 포인트를 찍어보았다.
ErrorResponse
여기서 validation 이 null로 잡힌다.
PostControllerAdvice
처음 ExceptionHandler 에서 생성자에 validation 을 매개변수로 받지 않았을땐 오류가 발생하지 않았는데
validation 을 매개변수로 받고 나서 오류가 생겼다.
@Builder 를 이용한 생성자가 ErrorResponse 의 validation 초기화를 무시하고 null 값으로 넣어버리는 현상이라고 생각된다.
그래서 따로 빌더 안붙인 validation 을 받지 않는 생성자를 만드니 잘 돌아간다.
문제 해결
강의 따라서 코드 치는 사이에 잠깐 놓쳐서 발생했던 문제였다.
하지만 원인은 예상했던대로 @Builder 를 이용한 생성자가 validation 의 초기화를 무시하고 null 로 넣은것이었다.
기존 코드에서는 아래처럼 validation 을 초기화를 해줘도 빌더 생성 시 validation 이 null 이면 null 값이 들어가게된다.
변경 전
ErrorResponse
public class ErrorResponse {
// ...
private Map<String, String> validation = new HashMap<>();
}
따라서 아래처럼 validation 이 null 인지 확인하는 로직을 작성해야 한다.
변경 후
ErrorResponse
@Getter
public class ErrorResponse {
private final String code;
private final String message;
private final Map<String, String> validation;
@Builder
public ErrorResponse(String code, String message, Map<String, String> validation) {
this.code = code;
this.message = message;
this.validation = validation != null ? validation : new HashMap<>();
}
public void addValidation(String fieldName, String errorMessage) {
this.validation.put(fieldName, errorMessage);
}
}
위처럼 ErrorResponse 를 바꿔주면 정상적으로 동작한다.