스프링/4. 스프링 MVC-2

63. 서블릿 예외처리 필터

sdafdq 2023. 9. 10. 19:20

예외 발생 시

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