스프링 전환 계획 수립 (iss-cb35afc33813)
This commit is contained in:
parent
3ae50f0a51
commit
6a81dae90b
1 changed files with 95 additions and 0 deletions
|
|
@ -0,0 +1,95 @@
|
|||
package com.runtime.core.exception;
|
||||
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.validation.FieldError;
|
||||
import org.springframework.web.bind.MethodArgumentNotValidException;
|
||||
import org.springframework.web.bind.annotation.ExceptionHandler;
|
||||
import org.springframework.web.bind.annotation.RestControllerAdvice;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* 전역 예외 처리 핸들러
|
||||
*/
|
||||
@RestControllerAdvice
|
||||
public class GlobalExceptionHandler {
|
||||
|
||||
@ExceptionHandler(BusinessException.class)
|
||||
public ResponseEntity<ErrorResponse> handleBusinessException(BusinessException ex) {
|
||||
ErrorResponse error = ErrorResponse.builder()
|
||||
.timestamp(LocalDateTime.now())
|
||||
.status(ex.getStatus().value())
|
||||
.error(ex.getErrorCode())
|
||||
.message(ex.getMessage())
|
||||
.build();
|
||||
return ResponseEntity.status(ex.getStatus()).body(error);
|
||||
}
|
||||
|
||||
@ExceptionHandler(MethodArgumentNotValidException.class)
|
||||
public ResponseEntity<ErrorResponse> handleValidationException(MethodArgumentNotValidException ex) {
|
||||
Map<String, String> errors = new HashMap<>();
|
||||
ex.getBindingResult().getAllErrors().forEach(error -> {
|
||||
String fieldName = ((FieldError) error).getField();
|
||||
String errorMessage = error.getDefaultMessage();
|
||||
errors.put(fieldName, errorMessage);
|
||||
});
|
||||
ErrorResponse error = ErrorResponse.builder()
|
||||
.timestamp(LocalDateTime.now())
|
||||
.status(HttpStatus.BAD_REQUEST.value())
|
||||
.error("VALIDATION_ERROR")
|
||||
.message("입력 검증에 실패했습니다")
|
||||
.validationErrors(errors)
|
||||
.build();
|
||||
return ResponseEntity.badRequest().body(error);
|
||||
}
|
||||
|
||||
@ExceptionHandler(Exception.class)
|
||||
public ResponseEntity<ErrorResponse> handleGenericException(Exception ex) {
|
||||
ErrorResponse error = ErrorResponse.builder()
|
||||
.timestamp(LocalDateTime.now())
|
||||
.status(HttpStatus.INTERNAL_SERVER_ERROR.value())
|
||||
.error("INTERNAL_ERROR")
|
||||
.message("예상치 못한 오류가 발생했습니다")
|
||||
.build();
|
||||
return ResponseEntity.internalServerError().body(error);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 비즈니스 예외 기본 클래스
|
||||
*/
|
||||
class BusinessException extends RuntimeException {
|
||||
private final HttpStatus status;
|
||||
private final String errorCode;
|
||||
|
||||
public BusinessException(String message, HttpStatus status, String errorCode) {
|
||||
super(message);
|
||||
this.status = status;
|
||||
this.errorCode = errorCode;
|
||||
}
|
||||
|
||||
public BusinessException(String message, HttpStatus status) {
|
||||
this(message, status, "BUSINESS_ERROR");
|
||||
}
|
||||
|
||||
public HttpStatus getStatus() { return status; }
|
||||
public String getErrorCode() { return errorCode; }
|
||||
}
|
||||
|
||||
/**
|
||||
* 표준 에러 응답 DTO
|
||||
*/
|
||||
@lombok.Data
|
||||
@lombok.Builder
|
||||
@lombok.AllArgsConstructor
|
||||
@lombok.NoArgsConstructor
|
||||
class ErrorResponse {
|
||||
private LocalDateTime timestamp;
|
||||
private int status;
|
||||
private String error;
|
||||
private String message;
|
||||
private Map<String, String> validationErrors;
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue