서블릿 예외처리
오류 화면 커스텀 해서 제공
1.
WebServerFactoryCustomizer 구현해서, ConfigurableWebServerFactory에 addErrorPages 등록해놓으면
오류 발생했을때 was는 오류 인식한뒤, ErrorPage에 있는 Controller경로를 다시 호출함
( WAS는 오류 페이지를 단순히 다시 요청만 하는 것이 아니라, 오류 정보를 request 의 attribute 에 추가해서 넘 겨준다. 필요하면 오류 페이지에서 이렇게 전달된 오류 정보를 사용할 수 있다. )
2.
서버 내부에서 오류 페이지를 호출한다고 해서 해당 필터나 인터셉트가 한번 더 호출되는 것은 매 우 비효율적이다
결국 클라이언트로 부터 발생한 정상 요청인지, 아니면 오류 페이지를 출력하기 위한 내부 요청인지 구분할 수 있어야한다
서블릿은 이런 문제를 해결하기 위해 DispatcherType 이라는 추가 정보를 제공
필터 등록하는 Config쪽에
filterRegistrationBean.setDispatcherTypes(DispatcherType.REQUEST, DispatcherType.ERROR);
이런식으로 필터가 동작할 요청의 타입을 지정할수 있음
기본 값은 DispatcherType.REQUEST. 즉 클라이언트의 요청의 경우에만 필터가 적용
오류 페이지 요청 전용 필터를 적용하고 싶으면 DispatcherType.ERROR 만 지정하면 된다.
인터셉터는 서블릿이 제공하는 기능이 아니라 스프링이 제공하는 기능이다.
따라서 DispatcherType 과 무관하게 항상 호출된다.
대신에 오류 페이지 경로를 excludePathPatterns 를 사용해서 빼주면 된다.
registry.excludePathPatterns( ... ,"/error-page/**" );
/error-ex 오류 요청
필터는 DispatchType 으로 중복 호출 제거 ( dispatchType=REQUEST )
인터셉터는 경로 정보로 중복 호출 제거( excludePathPatterns("/error-page/**") )
1. WAS(/error-ex, dispatchType=REQUEST) -> 필터 -> 서블릿 -> 인터셉터 -> 컨트롤러
2. WAS(여기까지 전파) <- 필터 <- 서블릿 <- 인터셉터 <- 컨트롤러(예외발생)
3. WAS 오류 페이지 확인
4. WAS(/error-page/500, dispatchType=ERROR) -> 필터(x) -> 서블릿 -> 인터셉터(x) -> 컨트
롤러(/error-page/500) -> View