1. @ExceptionHandler와 @ControllerAdvice
- 예외 처리를 위한 메서드를 작성하고 @ExceptionHandler를 붙인다.
- @ControllerAdvice로 전역 예외 처리 클래스 작성 가능(패키지 지정 가능) 예외 처리 메서드가 중복된 경우, 컨트롤러 내의 예외 처리 메서드가 우선
2. @ResponseStatus
- 응답 메시지의 상태 코드를 변경할 때 사용
- 사용자 정의 예외처리 메서드 위에 작성
<%@ page contentType="text/html;charset=utf-8" isErrorPage="true"%>
발생한 예외 : ${pageContext.exception}<br>
예외 메시지 : ${pageContext.exception.message}<br>
@ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) // 200 -> 500
public String catcher(Exception ex, Model m) {
System.out.println("catcher() in ExceptionController");
//m.addAttribute("ex",ex);
return "error";
}
3. <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>
- error400.jsp, error500.jsp
- <%@ page contentType="text/html;charset=utf-8" isErrorPage="true"%>
4. SimpleMappingExceptionResolver
- 예외 종류별 뷰 맵핑
- servlet-context.xml에 등록
<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.ch2.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>
<beans:bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<beans:property name="basenames">
<beans:list>
<beans:value>error_message</beans:value> <!-- /src/main/resources/error_message.properties -->
</beans:list>
</beans:property>
<beans:property name="defaultEncoding" value="UTF-8"/>
</beans:bean>
+ ExceptionResolver (전체적인 예외 처리 과정)
- 클라이언트의 요청
- DispatcherServlet이 해당 요청에 맞는 Controller 매핑
- Controller에 예외 발생
- 다시 DispatcherServlet에게 예외 전달
- DispatcherServlet이 예외를 처리하기 위해 등록된 handlerExceptionResolvers 탐색
- ExceptionHandlerExceptionResolver
- ResponseStatusExceptionResolver
- DefaultHandlerExceptionResolver
- 찾은 경우 @ExceptionHandler 에 해당되는 error view를 DispatcherServlet에게 전달 (ExceptionHandlerExceptionResolver)
- 전달 된 view를 응답
- 찾지 못 한 경우 @ResponseStatus (ResponseStatusExceptionResolver) 탐색
- web.xml에 가서 해당 상태코드에 해당하는 뷰 탐색
- 탐색 된 view를 전달 하고 응답
- 위 과정에서 탐색 실패한 경우 Spring에 정의된 예외처리에 따라 상태 코드 500을 400이나 500으로 적절히 바꾸어서 줌 (DefaultHandlerExceptionResolver)
스프링에서의 예외 처리 (총 정리)
- 컨트롤러 메서드 내에서 try-catch로 처리
- 같은 컨트롤러 내부의 @ExceptionHandler 메서드가 처리
- @ControllerAdvice(”패키지 지정”) 클래스의 @ExceptionHandler메서드가 처리
- 예외 종류별로 뷰 지정 - SimpleMappingExceptionResolver
- 응답 상태 코드별로 뷰 지정 - <error-page>