Hyunebee

필터와 인터셉터 본문

zerebase/Spring

필터와 인터셉터

Hyunebee 2022. 6. 16. 20:14

필터

 스프링 외부에 존재 서블릿에서 제공하는 공통처리 기능

 스프링 내로 요청이 들어오기 전과 스프링의 요청이 나갈 때 처리 기능을 함

 조금더 low level의 처리가 가능하다.

 

인터셉터

 스프링에서 제공하는 공통처리 기능

 실제 매핑된 Handler 확인 가능

 조금 더 상세한 조건식과 세부적인 스펙을 통해 구체적인 시점에 구체적인 동작이 가능하다.

 AOP와 비교한다면 AOP는 인터셉터보다 더 구체적인 조건과 동작을 가진다. 

 

실습 

아래는 @Component를 통해 자동으로 스프링 컨테이너 부착

@Component
@Slf4j

public class LogFilter implements Filter{
    @Override
    public void doFilter(
            ServletRequest request, ServletResponse response, FilterChain chain //외부 -> filter -> 처리 -> filter -> 외부
    ) throws ServletException, IOException {
        log.info("Hello filter : " + Thread.currentThread());
        chain.doFilter(request, response);
        log.info("Bye filter : " + Thread.currentThread());
    }
}

간단한 get요청에 따른 filter장착

 

필터는 자동으로 컨테이너에 부착되지 않음으로 RegistrationBean을 해줘야함

@Configuration
public class WebConfig {
    //필터는 자동으로 컨테어너에 부착되지 않음 등록시켜줘야함
    @Bean
    public FilterRegistrationBean loggingFilter(){
        FilterRegistrationBean<Filter> filterFilterRegistrationBean = new FilterRegistrationBean<>();
        filterFilterRegistrationBean.setFilter(new LogFilter());
        filterFilterRegistrationBean.setOrder(1);
        filterFilterRegistrationBean.addUrlPatterns("/*");


        return filterFilterRegistrationBean;
    }
}

 

인터셉터 등록

 인터셉터 또한 이 상태로 둔다면 클래스와 다름없음 등록을 해줘야함 

@Slf4j
public class LogInterceptor implements HandlerInterceptor {
    @Override
    //요청시 try와 같은 느낌
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        log.info("preHandle Interceptor : " + 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 Interceptor : " + Thread.currentThread());
    }

    @Override// 요청이 성공하든 실패하던
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        log.info("afterCompletion Interceptor : " + Thread.currentThread());

        if (ex != null) {
            log.error("afterCompletion exception : " + ex.getMessage());
        }
    }
}

 

해당 @Configuration에 WebMvcConfigurer를 구현 addInterceptors를 추가해줘야 한다. 

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LogInterceptor())
                .order(1).addPathPatterns("/*")
                .excludePathPatterns("/css/*", "/image/*");
    }

    //필터는 자동으로 컨테어너에 부착되지 않음 등록시켜줘야함
    @Bean
    public FilterRegistrationBean loggingFilter(){
        FilterRegistrationBean<Filter> filterFilterRegistrationBean = new FilterRegistrationBean<>();
        filterFilterRegistrationBean.setFilter(new LogFilter());
        filterFilterRegistrationBean.setOrder(1);
        filterFilterRegistrationBean.addUrlPatterns("/*");



        return filterFilterRegistrationBean;
    }
}

해당 로그들을 보면 filer -> 인터셉터 -> 처리 -> 인터셉터 -> filter순인것을 확인가능

'zerebase > Spring' 카테고리의 다른 글

Lombok  (0) 2022.06.23
스프링 MVC의 기본 HTTP요청 매핑  (0) 2022.06.16
Valudation, Data Binding, SpEL  (0) 2022.06.16
OOP와 스프링  (0) 2022.06.10