doriver 2024. 8. 7. 15:59

오류 화면 커스텀 해서 제공

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