스프링 예외 처리
0. 컨트롤러 메서드 내에서 try-catch 로 처리
- 자바에서의 try-catch와 동일하다.
1. @ControllerAdvice 와 @ExceptionHandler
- 아래 글의 6. Controller의 Exception 처리 참고
https://seojoo21.tistory.com/41?category=995432
스프링 MVC의 Controller
*출처: Chapter06 스프링 MVC의 Controller, 코드로 배우는 스프링 웹 프로젝트 개정판, 구멍가게 코딩단, 남가람북스 스프링 MVC를 이용하는 경우 작성되는 Controller는 다음과 같은 특징이 있다. - HttpServl
seojoo21.tistory.com
2. @ResponseStatus
- 응답 메세지의 상태 코드를 변경할 때 사용
* 예외의 디폴트 상태 코드는 500번 Internal Server Error임.
1) 예외 처리 메서드 앞에 붙인다.
@ResponseStatus(HttpStatus.METHOD_NOT_ALLOWED) // 상태코드 200을 400번대로 바꾼다. 여기서는 "405 Method Not Allowed."로 바꿈
@ExceptionHandler({NullPointerException.class, FileNotFoundException.class})
public String catcher2(Exception ex, Model m) {
m.addAttribute("ex", ex);
return "error"; // view 폴더 내 error.jsp 가 실행. 상태코드는 200 (요청 처리 성공)
}
2)사용자 정의 예외 클래스 앞에 붙인다.
@ResponseStatus(HttpStatus.BAD_REQUEST) // 400 Bad Request.
class MyException extends RuntimeException {
MyException(String msg){
super(msg);
}
MyException() {
this("");
}
}
3. web.xml에 <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>
- 위와 같이 코드를 추가한 다음에는 view 폴더 내에 error400.jsp, error500.jsp 파일을 만들어야 한다.
//error400.jsp
<%@ page contentType="text/html;charset=utf-8" isErrorPage="true"%>
//isErrorPage="true"는 이 jsp 파일이 ErrorPage라는 것을 의미하며 디폴트값으로 상태코드 500을 가진다.
//"true" 대신 "false"로 하면 상태코드가 500으로 바뀌지 않는다.
[400] 잘못된 오류입니다. 확인 후 다시 한번 요청해주세요.
4. servelet-context.xml에 SimpleMappingExceptionResolver 추가 (예외 종류별 뷰 맵핑에 사용)
- servlet-context.xml에 아래와 같이 코드를 등록하여 에러 처리를 할 수도 있다.
- 예외 처리 메서드가 특별히 할 일이 없을 때는 뷰만 리턴하면 되므로 굳이 예외 처리 메서드를 만들 필요가 없을때 사용한다.
(<view-controller>와 비슷)
<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.xxx.xxx.MyException">error400</beans:prop>
//패키지명.예외 종류를 적는다. 에러뷰를 적는다.
</beans:props>
</beans:property>
<beans:property name="statusCodes">
<beans:props>
<beans:prop key="error400">404</beans:prop>
//뷰에 대한 상태코드를 무엇을 할 것인지 정한다. 여기서는 200이 나오지 않고 404가 나온다.
</beans:props>
<beans:property>
</beans:bean>