스프링에서의 예외 처리
예외 처리를 위한 메서드 작성 후 @ExceptionHandler 를 붙여준다. 이때, @ControllerAdvice를 통해 전역 예외 처리 클래스를 작성(패키지로 지정 가능)하여 모든 컨트롤러에서 발생하는 예외를 처리해줄 수 있다. (예외 처리 메서드가 중복될 경우 컨트롤러 내 예외 처리 메서드가 우선)
ResponseStatus는 통해 응답 메시지의 상태 코드를 변경할 때 사용한다. ① 예외 처리 메서드 : 예를 들어 예외 처리가 되어 error.jsp라는 페이지를 보여주게 되면, 정상적으로 페이지 자체를 보여주었기 때문에 상태 코드가 200번대로 나타난다. 하지만 실질적으로는 예외가 발생한 것이므로 임의로 우리가 상태 코드를 변경해주어야 한다. 이때 사용하는 것이 예외 처리 메서드이다.
② 사용자 정의 예외 클래스 : 기본적으로 디폴트 상태 코드가 500번대이므로 이를 임의로 상태 코드 지정을 해주고 싶을 때 사용한다.
예외 처리하여 뷰 맵핑을 해주는 방식에는 두 가지로 나뉘는데, 한 가지는 상태 코드별로 뷰 맵핑을 해줄 수 있고, 또 다른 한 가지는 예외 종류별로 뷰 맵핑을 해줄 수 있다.
상태 코드별로 뷰 맵핑을 해주고 싶을 때에는 web.xml을 이용하여 <error-page>를 이용한다. <error-code> 내에 상태 코드를 지정해주고, <location>을 통해 뷰에 대한 정보를 지정한다.
ex)<error-page>
<error-code>400</error-code>
<location>/error400.jsp</location>
예외 종류별로 뷰 맵핑을 해주고 싶을 때에는 servlet-context.xml에 등록하여 준다.
ex) <beans:prop key="생략.MyException">error400</beans:prop>
MyException은 예외 종류를 의미하고, error400은 에러 뷰를 의미한다. 또한, 뷰에 대한 상태 코드를 무엇으로 할 것인지에 대해 지정이 가능하다.
ExceptionResolver
클라이언트가 요청한 후 DispatcherServlet에서 이를 요청을 받아 컨트롤러에 전달해주었는데, 컨트롤러에서 예외가 발생하였고 예외 던지기를 하였다고 가정해본다. 그러면 DispatcherServlet에서 예외 처리 기본 전략에 따라 예외 처리를 해주게 되는데, 이 예외 처리 기본 전략은 다음과 같다.
①ExceptionHandlerExceptionResolver - 해당 예외를 처리하는 메서드 즉 @ExceptionHandler가 붙은 메서드를 찾는다.
②ResponseStatusExceptionResolver - ①을 찾지 못하면 @ResponseStatus가 붙은 메서드를 찾고 web.xml에 등록된 상태 코드에 해당하는 뷰가 있는지를 찾는다. 해당 뷰를 찾았다면 클라이언트에 응답해준다.
③DefaultHandlerExceptionResolver - ①과 ② 둘다 찾지 못하면 스프링에 정의된 예외의 상태 코드(디폴트는 500번대)를 400번대나 500번대로 처리해준다.
※ spring-webmvc.jar의 web.servlet 패키지 아래 DispatcherServlet.properties를 통해 기본 전략을 확인해볼 수 있음
예외 처리 방법 총정리
1. 컨트롤러 메서드 내에서 try-catch로 처리
2. 같은 컨트롤러 내에 예외 처리 메서드 작성(@ExceptionHandler)
3. @ControllerAdvice 클래스로 모든 컨트롤러에서 발생하는 예외 처리
4. 예외 종류별로(simpleMappingExceptionResolver) 혹은 응답 상태 코드별(<error-page>)로 에러 뷰 지정
'[패스트캠퍼스] 스프링의정석 정리 > Spring' 카테고리의 다른 글
스프링 DI 이론 - IoC와 DI (0) | 2023.05.18 |
---|---|
스프링 DI 흉내내기 (0) | 2023.05.17 |
데이터의 변환과 검증 핵심 인터페이스 정리 (1) | 2023.05.17 |
DispatcherServlet 정리 (1) | 2023.05.17 |
@RequestParam과 @ModelAttribute (0) | 2023.05.14 |