Spring

@ControllerAdvice, @ExceptionHandler를 이용한 예외처리

@ExceptionHandler

@ExceptionHandler는 @Controller, @RestController가 적용된 빈 내에서 발생하는 예외를 잡아서 하나의 메서드에서 처리해준다. 예를 들자면 다음과 같다.

@Controller
public class MyController {
    @ExceptionHandler(IllegalArgumentException.class)
    public Object catch(Exception e){
        System.err.println(e.getMessage());
        return "myService";
    }
}

@ExceptionHandler라는 어노테이션을 쓰고 인자로 캐치하고 싶은 예외 클래스를 등록하면 된다. {}를 이용해서 두 개 이상의 예외 클래스도 한 번에 처리가 가능하다. (ex. @ExceptionHandler({Exception1.class, Exception2.class}))

하지만 이렇게 하는 경우, Controller, RestController 에만 적용이 가능하며, @ExceptionHandler를 등록한 컨트롤러에서만 적용된다. 이 말은 다른 컨트롤러에서 예외가 발생하더라도 그 예외를 처리할 수 없다.

@ControllerAdvice

@ExceptionHandler가 하나의 클래스에 대한 것이라면, @ControllerAdvice는 모든 @Controller 즉, 전역에서 발생할 수 있는 예외를 잡아 처리해주는 어노테이션이다.

클래스 위에 @ControllerAdvice 어노테이션을 달고, 메서드 위 @ExceptionHandler를 달아 위와 같이 사용한다면 모든 컨트롤러에서 발생하는 해당 예외를 잡아 처리해준다. @ControllerAdvice 말고 @RestControllerAdvice도 있는데, 이는 @ControllerAdvice와 동일한 역할을 수행하면서 @ResponseBody를 통해 객체를 리턴할 수도 있다. ViewResolver를 통해서 예외 처리 페이지로 리다이렉트 시키기 위함이라면 @ControllerAdvice를, 객체를 응답해야한다면 @RestControllerAdvice를 사용할 수 있다.