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

  • 상태 표시별 뷰 맵핑
  • <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"%>
      • 상태코드를 500으로 강제로 바꾼다.

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 (전체적인 예외 처리 과정)

  1. 클라이언트의 요청
  2. DispatcherServlet이 해당 요청에 맞는 Controller 매핑
  3. Controller에 예외 발생
  4. 다시 DispatcherServlet에게 예외 전달
  5. DispatcherServlet이 예외를 처리하기 위해 등록된 handlerExceptionResolvers 탐색
    1. ExceptionHandlerExceptionResolver
    2. ResponseStatusExceptionResolver
    3. DefaultHandlerExceptionResolver
  6. 찾은 경우 @ExceptionHandler 에 해당되는 error view를 DispatcherServlet에게 전달 (ExceptionHandlerExceptionResolver)
    1. 전달 된 view를 응답
  7. 찾지 못 한 경우 @ResponseStatus (ResponseStatusExceptionResolver) 탐색
    1. web.xml에 가서 해당 상태코드에 해당하는 뷰 탐색
    2. 탐색 된 view를 전달 하고 응답
  8. 위 과정에서 탐색 실패한 경우 Spring에 정의된 예외처리에 따라 상태 코드 500을 400이나 500으로 적절히 바꾸어서 줌 (DefaultHandlerExceptionResolver)

스프링에서의 예외 처리 (총 정리)

  • 컨트롤러 메서드 내에서 try-catch로 처리
  • 같은 컨트롤러 내부의 @ExceptionHandler 메서드가 처리
  • @ControllerAdvice(”패키지 지정”) 클래스의 @ExceptionHandler메서드가 처리
  • 예외 종류별로 뷰 지정 - SimpleMappingExceptionResolver
  • 응답 상태 코드별로 뷰 지정 - <error-page>

+ Recent posts