exception - 예외 처리
메서드에 @ExceptionHandler 어노테이션을 적용하면, 해당 핸들러를 통해 오류가 발생했을 때 처리를 할 수 있다. (try/catch 문을 생략할 수 있다.)
하지만 이 방법은 해당 클래스 내에서의 예외처리만 처리할 수 있다.
이걸 별도의 클래스로 처리하고 싶다면 @ControllerAdvice() 어노테이션을 적용한 클래스를 하나 만들어서, 이 안에 @ExceptionHandler를 정의한다면 글로벌한 예외 처리 클래스가 만들어진다. @ControllerAdvice("package") 처럼 패키지네임을 정의하여 해당 패키지에만 적용되는 예외처리클래스를 만들 수도 있다.
만약 예외처리 클래스를 정의했음에도 같은 예외종류를 로직컨트롤러 내부에 핸들러로 다시 정의한다면, 예외 발생 시 가까운 핸들러인 로직컨트롤러 내부 핸들러가 예외를 처리한다.
@ExceptionHandler를 통해 메시지가 처리되어 별도로 정의해둔 error.jsp로 리다이렉트를 했을 때, http통신은 정상적으로 이루어졌기 때문에 성공코드인 200번대 코드가 나온다. 그래서 이걸 @ResponseStatus 어노테이션을 통해 오류 번호로 정의해줄 수 있다.
jsp파일에 isErrorPage 속성을 true로 설정하면 별도로 Exception객체를 model에 추가하지 않아도 바로 Exception객체를 페이지 내에서 사용할 수 있다.
web.xml 파일에서
<error-page>
<error-code>500</error-code>
<location>/error500.jsp</location>
</error-page>
이런 방식으로 해당 코드를 자동으로 에러처리 뷰에 바인딩할 수 있다.
상태 코드별이 아니라 applicationContext.xml 파일에서 bean 태그의 SimpleMappingExceptionResolver 클래스를 통한다면 오류 종류별로 처리할 수 있다.
그리고 그 오류 종류의 상태 코드를 정의할 수도 있다.
다만 상기했던 isErrorPage 속성을 true로 설정하면 강제로 상태코드를 500으로 출력하기 때문에 상태코드를 임의로 설정하고자 한다면 해당 속성을 false로 설정해야 한다.
예외처리 기본전략
spring-webmvc 메이븐 파일의 \org\springframework\web\servlet\DispatcherServlet.properties 파일을 들어가면 HandlerExceptionResolver 항목으로 예외 처리의 기본 전략 3가지가 정의되어 있는걸 볼 수 있다.