Spring @ControllerAdvice를 이용한 예외처리

@ControllerAdvice 어노테이션을 사용해서

모든 @Controller에서 발생한 예외를 잡아 처리해보겠습니다.

 

@ControllerAdvice 생성하기

1. 새로운 클래스를 만들어서 어노테이션을 붙입니다.

2. @ExceptionHandler로 처리하고 싶은 예외 별로 처리하면 됩니다.

@ControllerAdvice
public class ExceptionAdvice {
    
    @ExceptionHandler(NullPointerException.class)
    public ModelAndView nullPointerException() {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("error/null_error");
        modelAndView.addObject("exception", ex);
        
        return modelAndView;
    }
    
    @ExceptionHanlder(Exception.class)
    public String Exception() {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("error/common_error");
        modelAndView.addObject("exception", ex);
        
        return modelAndView;
    }
}

ExceptionAdvice라는 클래스를 만들어서 Exception 별로 뷰를 리턴하도록 처리했습니다.

NullPointerException이 발생한 경우에는 /WEB-INF/views/error/null_error.jsp로 연결됩니다.

그 외 Exception이 발생한 경우에는 /WEB-INF/views/error/common_error.jsp로 연결됩니다.

 

원하는 Exception 별로 처리를 구분하여 진행할 수 있습니다.

예제 코드는 뷰를 연결하는 것으로 끝냈지만, ExceptionHandler 내에서 로그를 쌓는다던지

원하는 작업을 하시면 되겠습니다.

 

정상 작동하지 않는다면?

정상 작동하지 않는 경우 다음과 같은 내용을 살펴봐야 합니다.

1. @ControllerAdvice 어노테이션이 import 되지 않는다면?

 --> 해당 어노테이션은 Spring 3.2 버전 이상에 추가된 기능입니다. 버전을 확인해주세요

 

2. Exception이 발생해도 해당 @ControllerAdvice > ExceptionHandelr로 연결되지 않아요

 --> DispatcherServlet에서 Component-scan의 base-package 설정을 확인해주세요

새로 만드신 Class가 해당 Package에 포함되지 않는 경우 어노테이션 적용되지 않습니다.

(제가 겪은 내용입니다, 놓치기 쉬운 내용이고 놓치면 찾기 쉽지 않습니다...)

*DispatcherSerlvet 설정 XML 파일에 아래 코드 확인

<context:component-scan base-package="com.springweb.*" />