@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
private ResponseEntity<ErrorResponse> handleException(Exception e) {
return ErrorResponse.errorResponseEntity(new CustomException(e));
}
}
@Getter // 반드시 필요!!
@Builder
public class ErrorResponse {
private String status;
private int code;
private String message;
public static ResponseEntity<ErrorResponse> errorResponseEntity(CustomException e) {
ErrorCode errorCode = e.getErrorCode();
return ResponseEntity.status(e.getStatus())
.body(ErrorResponse.builder()
.status(errorCode.getStatus().getReasonPhrase())
.code(errorCode.getStatus().value())
.message(errorCode.getMessage())
.build());
}
}
공통 예외처리를 위해 생성한 ErrorResponse 에 @Getter 어노테이션을 달지 않아 문제가 발생하였다.
코드 상에는 ErrorReponse 객체에서 필드값을 get 해오는 코드가 존재하지 않아 의도적으로 삭제하였는데
클라이언트에 응답할 때, handleException 에서 return 한 ErrorResponse 의 에러가 표시되는게 아니라 filter 의 try-catch 문에서 잡힌 에러로 표시되었다.
원인을 찾아본 결과 @Getter 는 반드시 필요한 어노테이션이다!
📌 getter가 필요하다! (@Getter, @Value, @Data 중 하나를 사용해야 함)
Spring의 ResponseEntity<T>는 기본적으로 JSON 형식으로 응답 본문(Response Body)을 변환한다.
Spring은 Jackson(ObjectMapper)을 사용하여 객체를 JSON으로 직렬화(Serialization)할 때, 필드 값을 가져오기 위해 getter 메서드를 필요로 한다.
따라서 객체의 필드에 대한 getter가 없으면, 응답 본문이 비어 있거나 null로 반환될 수 있다.
💭 코드를 삭제할 때도 의도된 코드인지 의심하며 신중하게 고민하자...