오늘의하루

Servlet의 예외 처리하는 방법 본문

Spring

Servlet의 예외 처리하는 방법

오늘의하루_master 2023. 8. 30. 01:15

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에 저장되있는 경로를 추가하면 된다.
Comments