아래의 방식들은 예외가 발생했을 시, 예외를 처리하지 않고 예외가 발생한 메서드를 호출한 곳에서 에러 처리를 할 수 있게 전가하는 상황일때 주로 사용한다.
(혹은 에러를 한 곳으로 모을때)

예외 상황을 파악해서 문제를 해결하는 방식은 try/catch가 효율적이다.

스프링 부트의 예외 처리 방식


스프링 부트의 예외 처리 방식은 크게 2가지가 존재

  • @ControllerAdvice와 @ExceptionHandler를 통한 모든 Controller에서 발생할 수 있는 예외 처리
  • @ExceptionHandler를 통한 특정 Controller의 예외 처리

    @ControllerAdvice 대신 @RestControllerAdvice를 사용하면 결과값을 JSON 형태로 반환할 수 있습니다.


@ControllerAdvice, @RestControllerAdvice


  • @Controller나 @RestController에서 발생하는 예외를 한 곳에서 관리하고 처리할 수 있게 하는 어노테이션
    아래와 같이 설정을 통해 범위 지정이 가능하며, Default값으로 모든 Controller에 대해 예외 처리를 관리한다.
@RestControllerAdvice(basePackages = "com.package.Project")

@ExceptionHandler


  • 예외 처리 상황이 발생하면 해당 Handler로 처리하겠다고 명시하는 어노테이션
  • 어노테이션 뒤에 괄호를 붙여 어떤 ExceptionClass를 처리할지 설정할 수 있음
@ExceptionHandler(00Exception.class)
  • Exception.class는 최상위 클래스로 하위 세부 예외 처리 클래스로 설정한 핸들러가 존재하면, 그 핸들러가 우선처리하게 되며, 처리 되지 못하는 예외 처리에 대해 ExceptionClass에서 핸들링함
  • @ControllerAdvice로 설정된 클래스 내에서 메소드로 정의할 수 있지만, 각 Controller 안에 설정도 가능
  • 전역 설정(@ControllerAdvice)보다 지역 설정(Controller)으로 정의한 Handler가 우선순위를 가짐

우선순서 도식화



자식클래스(NullPointerException)가 부모클래스(Exception)보다 높은 우선순위를 가진다.

전역 설정(@ControllerAdvice)보다 지역 설정(Controller)으로 정의한 Handler가 우선순위를 가짐


HttpStatus


HttpStatus(int value, Series series, String reasonPharse){	//Enum Class
	this.value = value;										//error code
    this.series = series;									
    this.reasonPhrase = reasonPhrase;						//error code
}

Custom Exception


0개의 댓글