스프링에서의 5가지 예외처리방법
- ry-catch
- @ExceptionHandler
- @ControllerAdvice의 @ExceptionHandler가 처리
- SimpleMappingExceptionResolver
- 응답 상태 코드별 뷰 매핑< error-page>
@ExceptionHandler
@ExceptionHandler(Exception.class) //()안에는 메서드가 '처리할 예외'를 작성
public String catcher(Exception e, Model m) {
m.addAttribute("ex", e);
return "error";
}
- 클래스 내에서 발생하는 예외를 처리할 메서드에 붙이는 annotion
- controller내의 요청을 처리하는 메서드들과 동일하게 작성하면 된다(ex. model, bindingResult 파라미터 선언 가능)
- 한 메서드가 여러 예외를 처리하려면 ()안에 배열로 작성
- 위의 설정이 있어야 기본 객체 pageContext.exception(el)을 사용할 수 있다
- 단 상태 코드를 강제로 500으로 바꾼다.
@ControllerAdivce
- 전역 예외 처리 클래스 작성(다른 기능도 있음)(@ExceptionHandler 모음)
- @ExceptionHandler, @ControllerAdvice 중복되면 가까운 @ExceptionHandler가 처리
공통적으로 예외처리하는 메서드는 ControllerAdvice에, 개별적으로 처리할 예외는 각 클래스의 ExceptionHandler에서 처리
- 패키지 지정 가능 (default는 모든 패키지)
@ControllerAdvice("com.fastcampus.ch22")
@ResponseStatus
- 응답메시지의 상태코드를 변경한다.
- 예외처리 메서드(@ExceptionHandler)가 예외를 처리할 때 200응답코드를 변경
- 사용자 정의 예외클래스의 응답 코드(default:500)를 변경할 수 있다.
SimpleMappingExceptionResolver
- 예외 종류별 뷰매핑 가능
- servlet-context.xml에 작성
- error view로 응답시 error code = 200이라서 뷰페이지별 error code 지정
- view별 상태코드 지정가능(jsp의 isErrorPage=”true”시 무조건 500으로 변경)
<beans:bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<beans:property name="defaultErrorView" value="error"/>
<beans:property name="exceptionMappings">
<beans:props>
<beans:prop key="com.fastcampus.ch22.MyException">error400</beans:prop>
</beans:props>
</beans:property>
<beans:property name="statusCodes">
<beans:props>
<beans:prop key="error400">400</beans:prop>
</beans:props>
</beans:property>
</beans:bean>
- < error-page>, SimpleMappingExceptionResolver
→ 예외 처리를 안하고 뷰를 user friendly하게 보여줄 때
< error-page> -web.xml
<error-page>
<error-code>400</error-code>
<location>/error400.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/error500.jsp</location>
</error-page>
ExceptionResolver
- DispatcherServlet의 handlerExceptionResolvers (List iv)기본전략 3개
예외 처리를 할 수 있는 객체를 순서대로 돌아봄
- ExceptionHandlerExceptionResolver
1. annotation이 붙은 예외처리 메서드들 돌면서 처리할 수 있는 메서드 찾기
- ResponseStatusExceptionResolver
1. @ResponseStatus 메서드 돌면서 응답코드 변경
2. web.xml에서 응답코드와 매핑된 뷰가 있는지 찾기
- DefaultHandlerExceptionResolver
1. 스프링에 정의된 예외의 상태코드(기본 500)를 상황에 따라 400,500번대로 바꿈(Tomcat의 예외처리 페이지의 에러코드가 다양한 이유)
이 게시글은 남궁성 강사님의 스프링의 정석을 듣고 요약,정리한 내용입니다.