diff --git a/layer-api/src/main/java/org/layer/global/exception/GlobalExceptionHandler.java b/layer-api/src/main/java/org/layer/global/exception/GlobalExceptionHandler.java index d426c978..7a95346f 100644 --- a/layer-api/src/main/java/org/layer/global/exception/GlobalExceptionHandler.java +++ b/layer-api/src/main/java/org/layer/global/exception/GlobalExceptionHandler.java @@ -20,6 +20,7 @@ import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException; import org.springframework.web.servlet.resource.NoResourceFoundException; +import jakarta.validation.ConstraintViolationException; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -102,4 +103,18 @@ public ResponseEntity handleConversionFailedException(Convers .body(ExceptionResponse.of(HttpStatus.BAD_REQUEST.name(), "요청 파라미터의 형식이 잘못되었습니다.")); } + @ExceptionHandler(ConstraintViolationException.class) + public ResponseEntity handleConstraintViolationException(ConstraintViolationException e) { + log.warn(String.format(LOG_FORMAT, e.getMessage()), e); + + String message = e.getConstraintViolations() + .stream() + .map(v -> v.getPropertyPath() + " " + v.getMessage()) // 예: "title must not be null" + .reduce((m1, m2) -> m1 + ", " + m2) + .orElse("유효하지 않은 값입니다."); + + return ResponseEntity.status(HttpStatus.BAD_REQUEST) + .body(ExceptionResponse.of(HttpStatus.BAD_REQUEST.name(), message)); + } + }