[TIL] 2025-03-04

Yuri·2025년 3월 4일

TIL

목록 보기
56/59
post-thumbnail

🚩 오늘의 이슈

@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 는 반드시 필요한 어노테이션이다!

✏️ ResponseEntity에서 ResponseBody 값을 클라이언트에 출력할 때 getter가 필요한가?

📌 getter가 필요하다! (@Getter, @Value, @Data 중 하나를 사용해야 함)

  • Spring의 ResponseEntity<T>는 기본적으로 JSON 형식으로 응답 본문(Response Body)을 변환한다.

  • Spring은 Jackson(ObjectMapper)을 사용하여 객체를 JSON으로 직렬화(Serialization)할 때, 필드 값을 가져오기 위해 getter 메서드를 필요로 한다.

따라서 객체의 필드에 대한 getter가 없으면, 응답 본문이 비어 있거나 null로 반환될 수 있다.


💭 코드를 삭제할 때도 의도된 코드인지 의심하며 신중하게 고민하자...

profile
안녕하세요 :)

0개의 댓글