diff --git a/src/main/java/com/sofa/linkiving/global/error/handler/GlobalExceptionHandler.java b/src/main/java/com/sofa/linkiving/global/error/handler/GlobalExceptionHandler.java index a1aadb2c..ebcb1ad6 100644 --- a/src/main/java/com/sofa/linkiving/global/error/handler/GlobalExceptionHandler.java +++ b/src/main/java/com/sofa/linkiving/global/error/handler/GlobalExceptionHandler.java @@ -2,6 +2,7 @@ import org.springframework.http.ResponseEntity; import org.springframework.http.converter.HttpMessageNotReadableException; +import org.springframework.validation.FieldError; import org.springframework.web.HttpMediaTypeNotSupportedException; import org.springframework.web.HttpRequestMethodNotSupportedException; import org.springframework.web.bind.MethodArgumentNotValidException; @@ -25,7 +26,7 @@ public class GlobalExceptionHandler { @ExceptionHandler(NoResourceFoundException.class) public ResponseEntity handleNoResourceFound(NoResourceFoundException exception) { - log.debug("No static resource: {}", exception.getResourcePath()); + log.warn("No static resource: {}", exception.getResourcePath()); return ResponseEntity.notFound().build(); } @@ -34,64 +35,71 @@ public ResponseEntity handleNoResourceFound(NoResourceFoundException excep ========================= */ @ExceptionHandler(BusinessException.class) public ResponseEntity> handleBusinessException(BusinessException ex) { - log.error(ex.getMessage(), ex); + if (ex.getErrorCode().getStatus().is5xxServerError()) { + log.error("BusinessException [{}]", ex.getErrorCode().getCode(), ex); + } else { + log.warn("BusinessException [{}]: {}", ex.getErrorCode().getCode(), ex.getMessage()); + } return ErrorResponse.build(ex.getErrorCode()); } /* ========================= - 검증/바인딩 예외 + 검증/바인딩 예외 (모두 4xx) ========================= */ @ExceptionHandler(MethodArgumentNotValidException.class) public ResponseEntity> handleMethodArgumentNotValid(MethodArgumentNotValidException ex) { - log.error(ex.getMessage(), ex); + log.warn("Validation failed: {} field error(s) - fields={}", + ex.getBindingResult().getErrorCount(), + ex.getBindingResult().getFieldErrors().stream() + .map(FieldError::getField).distinct().toList()); return ErrorResponse.build(CommonErrorCode.INVALID_INPUT_VALUE); } @ExceptionHandler(ConstraintViolationException.class) public ResponseEntity> handleConstraintViolation(ConstraintViolationException ex) { - log.error(ex.getMessage(), ex); + log.warn("Constraint violation: {}", ex.getMessage()); return ErrorResponse.build(CommonErrorCode.INVALID_INPUT_VALUE); } @ExceptionHandler(MethodArgumentTypeMismatchException.class) public ResponseEntity> handleTypeMismatch(MethodArgumentTypeMismatchException ex) { - log.error(ex.getMessage(), ex); + log.warn("Type mismatch: parameter '{}'", ex.getName()); return ErrorResponse.build(CommonErrorCode.TYPE_MISMATCH); } @ExceptionHandler(MissingServletRequestParameterException.class) public ResponseEntity> handleMissingParam(MissingServletRequestParameterException ex) { - log.error(ex.getMessage(), ex); + log.warn("Missing request parameter: {}", ex.getParameterName()); return ErrorResponse.build(CommonErrorCode.MISSING_REQUEST_PARAMS); } @ExceptionHandler(HttpMessageNotReadableException.class) public ResponseEntity> handleNotReadable(HttpMessageNotReadableException ex) { - log.error(ex.getMessage(), ex); + log.warn("Malformed request body"); return ErrorResponse.build(CommonErrorCode.BAD_REQUEST); } /* ========================= - HTTP 관련 예외 + HTTP 관련 예외 (모두 4xx) ========================= */ @ExceptionHandler(HttpRequestMethodNotSupportedException.class) public ResponseEntity> handleMethodNotSupported(HttpRequestMethodNotSupportedException ex) { - log.error(ex.getMessage(), ex); + log.warn("Method not supported: {}", ex.getMethod()); return ErrorResponse.build(CommonErrorCode.METHOD_NOT_ALLOWED); } @ExceptionHandler(HttpMediaTypeNotSupportedException.class) public ResponseEntity> handleMediaTypeNotSupported(HttpMediaTypeNotSupportedException ex) { - log.error(ex.getMessage(), ex); + log.warn("Media type not supported: {}", ex.getContentType()); return ErrorResponse.build(CommonErrorCode.HTTP_MEDIA_NOT_SUPPORT); } /* ========================= - 그 외 모든 예외 + 그 외 모든 예외 (예상 못 한 5xx) ========================= */ @ExceptionHandler(Exception.class) public ResponseEntity> handleException(Exception ex) { - log.error(ex.getMessage(), ex); + log.error("Unhandled exception", ex); return ErrorResponse.build(CommonErrorCode.INTERNAL_SERVER_ERROR); }