ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Servlet의 예외 처리하는 방법
    Spring 2023. 8. 30. 01:15
    728x90
    반응형

    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
    반응형
Designed by Tistory.