Request Body에서 UUID 검증 실패
RequestBody로 전달된 JSON 데이터에서 잘못된 UUID 형식이 포함된 경우, Spring은 이를 자동으로 매핑하지 못하고 HttpMessageNotReadableException 예외를 발생시킵니다. 하지만 Spring의 기본 예외 처리 흐름에서는 이 예외가 구체적인 이유를 명시하지 않고, 단순한 400 에러를 반환하여 사용자에게 "잘못된 요청"으로만 인식되게 만듭니다.
PathVariable에서 UUID 검증 실패
경로 변수로 잘못된 UUID 값이 전달되면 Spring은 자동으로 이를 UUID 타입으로 변환하지 못하고 MethodArgumentTypeMismatchException을 발생시킵니다. 하지만 기본적으로 이 예외도 UUID 형식에 대한 상세한 설명 없이 400 에러로 처리됩니다.
HttpMessageNotReadableException 처리
Request Body에서 발생하는 InvalidFormatException을 잡아 UUID 형식이 맞지 않는 경우 명확하게 처리하도록 수정했습니다.
MethodArgumentTypeMismatchException 처리
경로 변수에서 발생하는 UUID 형식 오류에 대해 MethodArgumentTypeMismatchException을 통해 세밀하게 예외를 처리하도록 하여 잘못된 형식의 UUID가 전달될 때 적절한 메시지를 반환하게 했습니다.
@ExceptionHandler(HttpMessageNotReadableException.class)
public ResponseEntity<ErrorResponse> handleHttpMessageNotReadableException(HttpMessageNotReadableException e) {
Throwable cause = e.getCause();
if (cause instanceof InvalidFormatException invalidFormatException) {
if (invalidFormatException.getTargetType() == UUID.class) {
ErrorResponse response = ErrorResponse.builder()
.errorCode(BaseErrorCode.INVALID_REQUEST)
.message("유효하지 않은 UUID 형식입니다.")
.build();
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(response);
}
}
return handleException(e);
}
@ExceptionHandler(MethodArgumentTypeMismatchException.class)
public ResponseEntity<ErrorResponse> handleUUIDFormatError(MethodArgumentTypeMismatchException e) {
if (e.getRequiredType() == UUID.class) { // 필요한 타입이 UUID일 때만 처리
ErrorResponse response = ErrorResponse.builder()
.errorCode(BaseErrorCode.INVALID_REQUEST)
.message("유효하지 않은 UUID 형식입니다.")
.build();
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(response);
}
return handleException(e); // 다른 타입의 예외는 일반 예외 처리로 전달
}
커스텀 예외 처리를 통해 잘못된 UUID 형식이 전달되었을 때 명확한 오류 메시지를 제공할 수 있게 되었습니다. 이로 인해 API의 신뢰성 및 사용자 경험이 크게 향상되었으며, 개발자들이 더 쉽게 문제를 분석하고 해결할 수 있었습니다.
