서블릿 예외 처리

JIWOO YUN·2024년 3월 28일
0

SpringMVC2

목록 보기
23/26

예외 처리에 따른 필터와 인터셉터 , 서블릿이 제공하는 DispatchType 이해하기

  • 현재 오류가 발생하게되면 오류페이지를 출력하기 위해서 WAS 내부에서 다시한번 호출이 발생되고 있다.
    • 이미 한번 필터나 인터셉터에서 오류 페이지를 호출한다고 한번 호출 한 것을 또 호출 하는 것은 매우 비효율적인 방법
    • 클라이언트로 부터 발생한 정상 요청인가 아니면 오류 페이지 출력을 위한 내부 요청인지 구분이 필요하다.
      • 이 부분을 해결하기 위해서 DispatcherType이 추가로 제공된다.

DispatcherType 종류

public enum DispatcherType{
    FOWARD,
    INCLUDE,
    REQUEST,
    ASYNC,
    ERROR

}

REQUEST : 클라이언트 요청

ERROR : 오류 요청

FOWARD : MVC에서 배웠던 서블릿에서 다른 서블릿이나 JSP를 호출 할때 했었던

  • RequestDisPatcher.forward(request, response);

INCLUDE : 서블릿에서 다른 서블릿이나 JSP의 결과를 포함할때,

  • RequestDispatcher.include(request,response);

ASYNC : 서블릿 비동기 호출

필터를 만들어두고 webConfig를 통해서 필터를 등록해준다.

  • 필터의 경우 이전에 만들었던 것에서 DispatcherType만 넣어주면된다.
@Slf4j
public class LogFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        log.info("log filter init");
    }

    @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, request.getDispatcherType(),
                    requestURI);
            chain.doFilter(request, response);
        } catch (Exception e) {
            throw e;
        } finally {
            log.info("RESPONSE [{}][{}][{}]", uuid, request.getDispatcherType(),
                    requestURI);
        }
    }

    @Override
    public void destroy() {
        log.info("log filter destroy");
    }
}


// webConfig를 만들고 등록
@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;
    }
}
  • 클라이언트 요청과 오류페이지 요청에서 필터가 요청됨.
    • 기본 값은 DispatcherType.Request 이다 -> 클라이언트의 요청이 있는 경우에만 필터가 적용됨.
    • 만약 오류 페이지 요청 전용 필터에 적용하고 싶다면 DispatcherType.ERROR 만 넣어주면된다.

서블릿 예외처리 - 인터셉터

  • 인터셉터의 경우 서블릿이 아니라 스프링에서 제공하는 기능이기 때문에 DispatcherType 과는 무관하게 항상 호출된다.
    • 대신 인터셉터는 요청 경로에 따라서 추가하거나 제외하기 쉽기 때문에, 이런 설정을 사용해서 오류페이지 경로를 excludePathPatterns 를 사용해서 빼주면 된다.
      • 경로 정보로 중복 호출을 막아주는 방법

WebConfig에 addInterceptors 를 통해서 인터셉터를 추가

  • 여기서 예외 경로에 오류 페이지 경로를 추가해서 막아준다.
@Override
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(new LogInterceptor())
            .order(1)
            .addPathPatterns("/**")
            .excludePathPatterns("/css/**", "/*.ico", "/error", "/error-page/**");
}
profile
열심히하자

0개의 댓글