예외 발생 시
WAS <- 필터 <- 서블릿 <- 인터셉터 <- 컨트롤러(예외발생)
WAS까지 왔다가, 다시
WAS -> 필터 -> 서블릿 -> 인터셉터 -> 컨트롤러
이미 필터, 인터셉터 등을 거쳤기 때문에 검증같은 것은 완료를 한 것이다. 근데도 또 다시 거친다는 것은 너무 비효율 적이다.
그래서, 결국 저 예외 처리에 대한 호출이 클라이언트가 요청한 것인지, 아니면 서버 내부의 요청인지 구분해서 처리해야 한다.
그것이 DispatcherType에 나타난다.
request.getDispatcherType() 하면 알 수 있다.
sendError()나 예외를 뿌릴 시는 DispatcherType이 ERROR로 나오고,
고객이 처음 요청했을 시 에는 REQUEST 로 나온다. 중간에 바뀔 수도 있는 거다.
ERROR : 오류
REQUEST : 클라이언트 요청
FORWARD : jsp 등 forward를 호출 하는 것을 썼을 때.
INCLUDE : 서블릿에서 다른 서블릿이나 JSP 결과를 포함할 때.
ASYNC : 서블릿 비동기 호출
@Slf4j
public class LogFilter implements Filter {
public void init(FilterConfig filterConfig) {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
String requestURI = httpRequest.getRequestURI();
String uuid = UUID.randomUUID().toString();
try{
log.info("REQUEST [{}][{}][{}]", uuid, httpRequest.getDispatcherType(),requestURI);
chain.doFilter(request, response);
} catch (Exception e){
throw e;
}finally {
log.info("RESPONSE [{}][{}][{}]", uuid, httpRequest.getDispatcherType(),requestURI);
}
}
@Override
public void destroy() {
}
}
서블릿 필터 기능이다.
그냥 uuid, DispatcherType, URI를 찍게 했다.
그리고 등록도 해줘야 한다.
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Bean
public FilterRegistrationBean logFilter(){
FilterRegistrationBean<Filter> fIlterRegistrationBean = new FilterRegistrationBean<>();
fIlterRegistrationBean.setFilter(new LogFilter());
fIlterRegistrationBean.setOrder(1);
fIlterRegistrationBean.addUrlPatterns("/*");
fIlterRegistrationBean.setDispatcherTypes(DispatcherType.REQUEST, DispatcherType.ERROR);
return fIlterRegistrationBean;
}
}
@Configuration을 붙여 이건 설정, 구성에 관한 빈 임을 알려주고,
FilterRegistrationBean, 필터 등록 빈 이라는 것을 만든 다음에,
우리가 만든 필터를 등록해 주고,
순서를 정해주고,
경로를 정해주고,
DispatcherType을 지정해 준다.
이러면 저 타입만 필터를 거치는 것이다.
REQUEST와 ERROR를 지정해 줬는데, 근데 저거 따로 지정 안하면, 기본 값이 REQUEST이다.
그래서 저거 따로 지정안하고 쓰면 어차피 REQUEST만 필터링에 포함하는거라,
위처럼 예외가 터진 후 다시 WAS에 와서
WAS -> 필터 -> 서블릿 -> 인터셉터 -> 컨트롤러 중
필터 부분은 넘어간다.
그래서 그냥 쓰면 된다.
'스프링 > 4. 스프링 MVC-2' 카테고리의 다른 글
65. 스프링 부트 오류페이지 (0) | 2023.09.10 |
---|---|
64. 서블릿 예외처리 인터셉터 (0) | 2023.09.10 |
62. 오류 화면 커스텀 (0) | 2023.09.10 |
61. 서블릿 예외처리 (0) | 2023.09.10 |
60. ArgumentResolver 활용 (0) | 2023.09.09 |