Spring MVC - 필터, 인터셉터

박근수·2024년 2월 25일
0

Spring

목록 보기
8/11
post-custom-banner

필터와 인터셉터의 차이

필터

  • 스프링 외부의 서블릿에서 제공하는 공통처리 기능
  • 스프링 내로 요청이 들어오기 전과 스프링의 요청이 나갈 때 처리 가능
  • 조금 더 low level 처리가 가능

인터셉터

  • 스프링에서 제공하는 공통처리 기능
  • 실제매핑된 Handler 정보 확인 가능(어떤 것이 실제 내 요청을 처리하는 지도 확인 가능
  • 조금 더 상세한 조건식과, 세부적인 스펙(pre, post, after)를 통해 구체적인 시점에 구체적인 동작 가능
  • AOP와 비교한다면 AOP는 인터셉터보다 더 구체적인 조건(어노테이션, 파라미터, 주소 등)과 동작 위치를 갖음
@Slf4j
@Component
public class LogFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
                         FilterChain chain) throws IOException, ServletException {
        log.info("Hello LogFilter : " + Thread.currentThread());
        chain.doFilter(request,response);
        log.info("Bye LogFilter : " + Thread.currentThread());
    }
}
  • 필터 실습 코드(요청/응답 로깅)
    • 인증(로그인) 등 웹과 관련된 공통 관심사를 처리할 때는 HTTP 헤더나 URL 정보들이 필요하기 때문에 웹과 관련된 기술들이 필요함
@Slf4j
public class LogInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
                             Object handler) throws Exception {
        log.info("preHandle LogInterceptor : " + Thread.currentThread());
        log.info("preHandle handler : " + handler);
        return true;
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
                           ModelAndView modelAndView) throws Exception {
        log.info("postHandle LogInterceptor : " + Thread.currentThread());
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
                                Object handler, Exception ex) throws Exception {
        log.info("afterCompletion LogInterceptor : " + Thread.currentThread());
        if (ex != null){
            log.error("afterCompletion exception : " + ex.getMessage());
        }
    }
}
  • 인터셉트 실습
    • 로깅 샘플 코드 작성
    • 필터와 동일한 기능을 하는 코드를 작성할 수 있음
    • 다만 더 세밀한 조건식(include, execlude 등) 과 preHandle, postHandle, afterComplete를 통한 다양한 처리 가능

WebConfig

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Bean
    public FilterRegistrationBean loggingFilter(){
        FilterRegistrationBean<Filter> filterFilterRegistrationBean = new FilterRegistrationBean<>();
        filterFilterRegistrationBean.setFilter(new LogFilter());
        filterFilterRegistrationBean.setOrder(1);
        filterFilterRegistrationBean.addUrlPatterns("/*");

        return filterFilterRegistrationBean;
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LogInterceptor())
                .order(1)
                .addPathPatterns("/**")
                .excludePathPatterns("/css/*", "/images/*");
    }
}
profile
개발블로그
post-custom-banner

0개의 댓글