유효성 검증에 실패한 경우, 이 실패를 하나의 예외로 간주하고 예외를 던져(Throw) 예외 처리를 유도한다.
: 메서드 레벨에 추가한다.
@ExceptionHandler
을 추가한 예외 처리 핸들러 메서드를 생성한다.ErrorResponse
클래스를 만들어 필요한 정보만 담은 후, 클라이언트 쪽으로 전달한다.💡 @ExceptionHandler의 단점
1. Controller 클래스에 위치하기 때문에 각 Controller 클래스마다 작성해 코드의 중복이 발생한다.
2. Controller 클래스에 에러 처리 핸들러 메서드가 늘어나 로직이 복잡해진다.
: 클래스 레벨에 추가한다.
@RestControllerAdvice
를 추가해 예외 처리 메서드를 여러 Controller 클래스와 공유해 사용할 수 있다.ClassNotFoundException
RuntimeException
을 상속한 예외들NullPointerException
, ArrayIndexOutOfBoundsException
등예외는 메서드를 호출한 지점으로 던져진다. 즉, 서비스 계층의 메서드는 API계층인 Controller의 핸들러 메서드를 이용하므로 서비스 계층에서 던져진 예외는 Controller의 핸들러 메서드가 잡아 처리할 수 있다.
💡 예외 처리를 공통화 한 클래스가 있을 경우에는 서비스 계층에서 던져진 예외를 예외 처리 클래스가 잡아 처리한다.
추상적인 예외가 아닌 경우, 구체적으로 표현할 수 있도록 사용자 정의 예외를 만들어 예외를 던질 수 있다.
public enum ExceptionCode {
MEMBER_NOT_FOUND(404, "Member Not Found"),
METHOD_NOT_ALLOWED(405, "Method Not Allowed"),
INTERNAL_SERVER_ERROR(500, "Internal Server Error");
@Getter
private int status;
@Getter
private String message;
ExceptionCode(int status, String message) {
this.status = status;
this.message = message;
}
}