-
Servlet의 예외 처리하는 방법Spring 2023. 8. 30. 01:15728x90반응형
Exception
요청 > WAS > 필터 > 서블릿 > 인터셉터 > 컨트롤러(예외발생) > 인터셉터 > 서블릿 > 필터 > WAS
- 서버 내부에서 처리할 수 없는 오류가 발생했다고 생각하여 Http 상태코드 500 반환
response.sendError(Http 상태코드, 오류메시지)
요청 > WAS > 필터 > 서블릿 > 인터셉터 > 컨트롤러(sendError()) > 인터셉터 > 서블릿 > 필터 > WAS(sendError 호출 기록 확인 / 지정된 URL로 다시 요청) > (필터) > 서블릿 > 인터셉터 > 컨트롤러 > 뷰
- sendError를 호출하면 response내부에는 오류가 발생했다는 상태를 저장한다.
- 서블릿 컨테이너는 응답하기 전에 response에 sendError가 호출되었는지 확인한다.
- sendError가 호출되었다면 오류코드에 맞추어 기본 오류 페이지를 보여준다.
- 이때 WAS는 다시 요청하는거 뿐만 아니라 오류 정보를 request의 attribute에 추가해서 요청하게 된다.
- 첫 요청에서는 DispatcherType이 REQUEST이지만 sendError()후 재 요청할 경우 DispatcherType은 ERROR이다.
정리
필터는 DispatcherType에 따라 sendError()후 호출되게 할 수 도 있고 막을 수 도 있다.
- setDispatcherType(DispatcherType.REQUEST, DispatcherType.ERROR) 이런식으로 추가한다.
- 아무것도 추가하지 않으면 기본값은 REQUEST다.
인터셉터는 기본적으로 DispatcherType에 영향이 없고 항상 호출된다.
- 막으려고 excludePathPatterns에 sendError 호출 후 response에 저장되있는 경로를 추가하면 된다.
728x90반응형'Spring' 카테고리의 다른 글
Spring 서비스 추상화와 단일 책임 원칙 (0) 2023.10.16 Spring boot 오류 페이지 (0) 2023.08.30 [Spring] 필터와 인터셉터 (0) 2023.08.29 [Spring 검증] @ModelAttribute와 @RequestBody의 차이 (0) 2023.08.28 Spring HandlerMapping & Adapter, ViewResolver (1) 2023.08.23