일기장
Published 2023. 5. 26. 18:33
자바 스프링 예외처리 웹개발

@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
profile

일기장

@공군급양

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!