@ExceptionHandler
- @ExceptionHandler( { [처리할 예외1].class, [처리할 예외2].class ... } ) 어노테이션을 이용하여 예외처리 메서드를 작성해준다.
@ExceptionHandler( { [처리할 예외1].class, [처리할 예외2].class ... } ) // 여러개는 {}로 묶어줌
public String catcher( Exception ex, Model m ) {
m.addAttribute("ex", ex);
return "error";
}
- 이때 이 예외에 대한 정보를 모델에 저장해주어야 하는 번거로움이 있는데 JSP의 페이지 속성에 isErrorPage 속성을 부여하여 모델 저장코드를 생략시킬 수 있다.
<@ page contentType="text/html;charset=utf-8" isErrorPage="true">
${ex.message} // Before : ex는 모델로 저장된 예외객체
${pageContext.exception.message} // After : 기본 객체를 사용할 수 있다.
- 이때 이 예외 처리 메서드들은 해당 클래스에서만 작동한다. 만약 예외처리가 중복되는 경우 컨트롤러마다 동일한 예외처리를 해주어야 하는 번거러움이 발생하는데 @ControllerAdvice를 이용하여 전역예외처리를 할 수 있다.
// @ControllerAdvice("[ 패키지지정 가능 ]")
@ControllerAdvice // 모든 컨트롤러에서 발생한 예외를 처리함. 물론 전역보다는 컨트롤러내 예외처리가 우선처리된다.
public class GlobalCatcher {
@ExceptionHandler( [처리할 예외].class )
public String catcher1(Exception ex){
return "error";
}
@ExceptionHandler( [처리할 예외].class )
public String catcher2(Exception ex){
return "error";
}
}
@ExceptionHandler 어노테이션을 이용하여 예외처리 메서드를 작성할 수 있다.
응답메시지의 상태코드를 변경하는 법
- 원래라면 예외처리 메서드의 응답은 무사히 예외를 처리하여 에러페이지를 정상적으로 보였으므로 처리 성공을 의미하는 200의 상태코드를 갖는다. 따라서 이 어노테이션과 함께 사용되어 상태코드를 변경해주어야 한다.
@ResponseStatus(HttpStatus.METHOD_NOT_ALLOWED)
HTTP 상태코드 | 의미 |
100 Continue | 요청이 완료되기 전에 클라이언트가 계속 보내도록 요청합니다. |
101 Switching Protocols | 클라이언트와 서버 간의 프로토콜을 전환합니다. |
200 OK | 요청이 성공적으로 완료되었습니다. |
201 Created | 요청이 성공적으로 완료되었으며 새 리소스가 생성되었습니다. |
202 Accepted | 요청이 수락되었으며 처리가 진행 중입니다. |
203 Non-Authoritative Information | 요청이 성공적으로 완료되었지만 요청한 정보는 캐시된 것입니다. |
204 No Content | 요청이 성공적으로 완료되었지만 응답 본문에는 콘텐츠가 없습니다. |
205 Reset Content | 요청이 성공적으로 완료되었으며 클라이언트는 응답 본문을 무시하고 다시 시작해야 합니다. |
206 Partial Content | 요청이 성공적으로 완료되었으며 응답 본문에는 요청한 리소스의 일부만 포함됩니다. |
300 Multiple Choices | 요청한 리소스에 대한 여러 개의 가능한 응답이 있습니다. |
301 Moved Permanently | 요청한 리소스가 다른 위치로 이동되었습니다. |
302 Found | 요청한 리소스가 다른 위치로 임시로 이동되었습니다. |
303 See Other | 클라이언트는 요청한 리소스를 다른 URL로 요청해야 합니다. |
304 Not Modified | 요청한 리소스는 변경되지 않았습니다. |
307 Temporary Redirect | 클라이언트는 요청한 리소스를 다른 URL로 요청해야 합니다. |
400 Bad Request | 클라이언트가 잘못된 요청을 보냈습니다. |
401 Unauthorized | 클라이언트가 요청을 인증해야 합니다. |
402 Payment Required | 요청을 완료하려면 지불이 필요합니다. |
403 Forbidden | 클라이언트가 요청을 허용받지 못했습니다. |
404 Not Found | 요청한 리소스가 없습니다. |
405 Method Not Allowed | 요청된 HTTP 메서드는 허용되지 않습니다. |
406 Not Acceptable | 클라이언트가 요청한 응답 형식을 지원하지 않습니다. |
407 Proxy Authentication Required | 클라이언트는 프록시를 인증해야 합니다. |
408 Request Timeout | 클라이언트가 요청을 완료하기 전에 타임아웃되었습니다. |
409 Conflict | 요청을 완료할 수 없습니다. |
410 Gone | 요청한 리소스가 더 이상 존재하지 않습니다. |
411 Length Required | 요청은 Content-Length 헤더가 필요합니다. |
412 Precondition Failed | 요청은 조건을 충족하지 않습니다. |
413 Payload Too Large | 요청 본문이 너무 큽니다. |
414 URI Too Long | 요청 URI가 너무 깁니다. |
415 Unsupported Media Type | 요청 본문 형식은 지원되지 않습니다. |
416 Requested Range Not Satisfiable | 요청한 범위는 사용할 수 없습니다. |
417 Expectation Failed | 요청은 기대를 충족하지 않습니다. |
500 Internal Server Error | 서버 오류가 발생했습니다. |
501 Not Implemented | 서버가 요청을 지원하지 않습니다. |
502 Bad Gateway | 프록시 또는 게이트웨이 오류가 발생했습니다. |
503 Service Unavailable | 서비스가 사용할 수 없습니다. |
504 Gateway Timeout | 프록시 또는 게이트웨이 타임아웃이 발생했습니다. |
505 HTTP Version Not Supported | HTTP 버전이 지원되지 않습니다. |
- 또한 web.xml에 코드를 추가해 상태코드에 따라 에러페이지가 나타나도록 설정할 수 있다.
<error-page>
<error-code>[ 상태코드 ]</error-code>
<location>[ 보여줄 에러페이지 ]</location>
</error-page>
// web.xml과 상태코드변경을 이용하여 예외처리를 할 수 있다.
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=[ 예외 객체 ]>[ 에러페이지 ]</beans:prop>
</beans:props>
</beans:property>
<beans:property name="statusCodes">
<beans:props>
<beans:prop key=[ 에러페이지 ]>[ 뷰에 대한 상태코드 ]</beans:prop>
</beans:props>
</beans:property>
</beans:bean>
단, 해당 JSP의 iserrorPage가 true일 경우에 뷰에 대한 상태코드를 자동으로 500으로 변환한다.
'웹개발' 카테고리의 다른 글
스프링부트 프로젝트의 구조 (0) | 2023.06.18 |
---|---|
데이터의 변환 (0) | 2023.05.27 |
JSP 자세히 알아보기 (0) | 2023.05.25 |
세션(Session) (0) | 2023.05.24 |
쿠키(Cookie) (0) | 2023.05.24 |