보다 더 나은 내일의 나를 위해

[Spring Boot] Interceptor와 Filter는 어떤 게 다를까? 본문

spring

[Spring Boot] Interceptor와 Filter는 어떤 게 다를까?

H-SC 2022. 6. 27. 19:54

개요

예전에 했던 프로젝트를 조금 리펙터링 하던 중 인터셉터를 사용할 일이 있었습니다. 그러다 문득 '예전에 인터셉터와 필터가 무엇이 다른지 봤었는데'라는 생각이 났지만, 기억이 나지 않았습니다. 그래서 이 기회에 정리해 보려고 합니다.

 

 

 

실행 시점

우선 필터와 인터셉터는 스프링 플로우 중 실행 시점이 다릅니다.

위 그림에서 알 수 있듯, 필터는 DispatcherServlet보다 먼저 실행됩니다. 따라서 필터는 웹 애플리케이션의 Context 기능이라 Spring의 Context에 접근하기 힘듭니다.

반대로 인터셉터는 Spring Context 안에서 실행됩니다. Controller가 동작하기 전에 실행되죠. 따라서 다른 빈을 사용하는 등 다른 Spring Context에 접근하기 편리합니다.

 

 

 

uri 패턴

인터셉터는 Configuration에서 addInterceptors() 함수를 이용해 인터셉터에 특정 uri 패턴을 지정해 줄 수 있습니다.

@Configuration
public class MyInterceptorConfig implements WebMvcConfigurer {
    private final MyInterceptor myInterceptor;
    
    public MyInterceptorConfig(MyInterceptor myInterceptor) {
        this.myInterceptor = myInterceptor;
    }
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(myInterceptor)
            .addPathPatterns("/user")
            .addPathPatterns("/m/**");
    }
}

이를 사용해 어떤 요청에 대해서 어떤 인터셉터를 사용할지 정할 수 있습니다.

 

그렇다면 필터는 어떻게 지정할까요? 필터는 스프링부트에서 제공하는 @WebFilter를 사용해 uri 패턴을 지정해 줄 수 있습니다.

@WebFilter(urlPatterns = "/m/*")
public class MyFilter implements Filter {
    // ...
}

만약 @Component로 등록한다면 모든 uri에 대해서 작동하게 됩니다.

 

 

 

Comments