@ExceptionHandler
public ResponseEntity handleException(MethodArgumentNotValidException e) {
// 메소드 파라미터데이터 유효성 검증실패 -> 아래 메서드를 통해 발생한 에러정보 확인
final List<FieldError> fieldErrors = e.getBindingResult().getFieldErrors();
return new ResponseEntity<>(fieldErrors, HttpStatus.BAD_REQUEST);
}
Error Response
클래스를 만들어서 필요한 정보만 담은 후에 클라이언트 쪽에 전달@Getter
@AllArgsConstructor
public class ErrorResponse {
//한 개 이상의 유효성 검증에 실패한 필드의 에러 정보를 담기 위한 List 객체
private List<FieldError> fieldErrors;
@Getter
@AllArgsConstructor
public static class FieldError {
private String field;
private Object rejectedValue;
private String reason;
}
}
@ExceptionHandler
를 추가한 에러 처리 핸들러 메서드가 늘어남(예외 종류가 하나만 있는것이 아니므로)@RestControllerAdvice
애너테이션을 추가하면 여러개의 Controller 클래스에서 @ExceptionHandler
, @InitBinder
또는 @ModelAttribute
가 추가된 메서드를 공유해서 사용가능@RestControllerAdvice
애너테이션을 추가한 클래스를 이용하면 예외 처리를 공통화 할 수 있다@RestControllerAdvice
= @ControllerAdvice
+ @ResponseBody
of()
메서드
네이밍 컨벤션(Naming Convention) , 주로 객체 생성시 어떤 값들의(of~)
객체를 생성한다는 의미에서of()
메서드를 사용한다
@ResponseStatus
애너테이션을 이용해서 HTTP Status를 HTTP Response에 포함가능
개발자가 코드를 잘못 작성해서 발생하는 이런 오류들은 모두
RuntimeException
을 상속한 예외이며, 언체크예외다
RuntimeException
을 상속해서 개발자가 직접 사용자 정의 예외(Custom Exception)를 만들 수 있다.ExceptionCode
를 enum
으로 정의하면 비즈니스 로직에서 발생하는 다양한 유형의 예외를 enum에 추가하여 간편하게 사용가능RuntimeException
을 상속한 CustomException
정의 ,ExceptionCode
를 멤버 변수로 지정하여 생성자를 통해서 조금 더 구체적인 예외 정보들을 제공RuntimeException
의 생성자(super)로 예외 메시지를 전달ExceptionCode
정보만 바꿔가며 던질 수 있다.public enum ExceptionCode {
MEMBER_NOT_FOUND(404, "Member Not Found");
@Getter
private int status;
@Getter
private String message;
ExceptionCode(int status, String message) {
this.status = status;
this.message = message;
}
}
public class CustomException extends RuntimeException {
@Getter
private ExceptionCode exceptionCode;
public CustomException(ExceptionCode exceptionCode) {
super(exceptionCode.getMessage());
this.exceptionCode = exceptionCode;
}
}
고정된 예외를 처리할 경우에는
@ResponseStatus
로 HttpStatus를 지정해서 사용
BusinessLogicException
처럼 다양한 유형의 Custom Exception을 처리하고자 할 경우에는 ResponseEntity
를 사용