문제 발생

  1. Request Body로 UUID값이 유효하지 않은 형식임에도 불구하고 적절히 검증되지 않고 400에러가 발생하였습니다.
  2. PathVariable로 UUID값이 유효하지 않은 형식임에도 불구하고 적절히 검증되지 않고 400에러가 발생하였습니다.

원인

  1. Request Body에서 UUID 검증 실패

    RequestBody로 전달된 JSON 데이터에서 잘못된 UUID 형식이 포함된 경우, Spring은 이를 자동으로 매핑하지 못하고 HttpMessageNotReadableException 예외를 발생시킵니다. 하지만 Spring의 기본 예외 처리 흐름에서는 이 예외가 구체적인 이유를 명시하지 않고, 단순한 400 에러를 반환하여 사용자에게 "잘못된 요청"으로만 인식되게 만듭니다.

  2. PathVariable에서 UUID 검증 실패

    경로 변수로 잘못된 UUID 값이 전달되면 Spring은 자동으로 이를 UUID 타입으로 변환하지 못하고 MethodArgumentTypeMismatchException을 발생시킵니다. 하지만 기본적으로 이 예외도 UUID 형식에 대한 상세한 설명 없이 400 에러로 처리됩니다.

해결 과정

  1. HttpMessageNotReadableException 처리

    Request Body에서 발생하는 InvalidFormatException을 잡아 UUID 형식이 맞지 않는 경우 명확하게 처리하도록 수정했습니다.

  2. 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의 신뢰성 및 사용자 경험이 크게 향상되었으며, 개발자들이 더 쉽게 문제를 분석하고 해결할 수 있었습니다.

스크린샷 2024-10-22 오전 8.59.40.png