본문 바로가기

Study/Java & Spring

필터(Filter), 인터셉터(Interceptor)

 

Spring은 공통 관심사를 처리해 중복 코드를 줄이는 여러 기능을 제공한다. 그중 필터, 인터셉터에 대해서 알아보려고 한다.

 

1. 필터(Filter)

필터는 클라이언트의 요청이 서블릿에 도달하기 전, 그리고 서블릿에서 응답이 클라이언트에게 돌아가기 전에 실행되며 미리 정의한 url 패턴에 맞는 모든 요청에 대한 부가작업을 처리하는 기능을 제공한다. 스프링이 아닌 서블릿에서 제공하는 기술이다.

https://www.baeldung.com/spring-mvc-handlerinterceptor-vs-filter

public interface Filter {

    public default void init(FilterConfig filterConfig) throws ServletException {}

    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException;

    public default void destroy() {}
}
  • init() : default 메소드 / 필터 초기화, 서블릿 컨테이너가 생성될 때 호출
  • doFilter() : 필터의 로직, 정해진 url 요청이 올 때마다 실행
  • destroy() : default 메소드 / 필터 종료, 서블릿 컨테이너가 종료될 때 호출

1.1 필터 사용 예시

import javax.servlet.Filter 인터페이스를 구현해 오버라이딩 해서 사용하면 된다.

public class TestFilter implements Filter {

   @Override
   public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
      // 요청에 따라 필요 로직 구현
   }
}

그다음 구현한 필터를 스프링 컨테이너에서 관리를 할 수 있게 @Bean으로 등록을 해줘야 한다. 

@Configuration
public class WebConfig {

	@Bean
	public FilterRegistrationBean testFilter() {
		FilterRegistrationBean<Filter> filterFilterRegistrationBean = new FilterRegistrationBean<>();
		// 구현한 필터를 설정한다.
		filterFilterRegistrationBean.setFilter(new TestFilter());
		// 필터의 실행 순서를 정의한다.
		filterFilterRegistrationBean.setOrder(1);
		// 필터가 적용될 URL패턴을 정의한다.
		filterFilterRegistrationBean.addUrlPatterns("/*");

		return filterFilterRegistrationBean;
	}
}

 

FilterRegistrationBean를 사용해 필터의 순서, URL 패턴을 정의해서 사용이 가능하다.

 

 

2. 인터셉터(Interceptor)

스프링 MVC의 일부로, 디스패처 서블릿(Dispatcher Servlet)이 컨트롤러를 호출하기 전과 후 부가작업을 처리하는 기능을 제공한다.

https://www.baeldung.com/spring-mvc-handlerinterceptor-vs-filter

 

2.1 인터셉터 사용 예시

import org.springframework.web.servlet.HandlerInterceptor 인터페이스를 구현해 사용하면 된다.

public interface HandlerInterceptor {

    default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
        throws Exception {
        
        return true;
    }

    default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
        @Nullable ModelAndView modelAndView) throws Exception {
    }

    default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
        @Nullable Exception ex) throws Exception {
    }
}

 

  • preHandle() : 컨트롤러 호출 전 호출
    • boolean 반환 true : 다음단계 진행 / false : 작업 종료
  • postHandle() : 컨트롤러 호출 후 호출
    • 컨트롤러에 예외 발생 시 호출 X
  • afterCompletion() : 뷰가 렌더링 된 이후 호출
    • 컨트롤러에 예외 발생시 호출 O

Filter와 마찬가지로 인터페이스를 구현받아 원하는 기능을 오버라이딩해서 사용하면 된다. 그다음 설정정보를 등록해줘야 한다.

@Configuration
public class WebConfig implements WebMvcConfigurer {

	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		registry.addInterceptor(new LogInterceptor())
			.order(1) // 실행 순서
			.addPathPatterns("/**") // 적용할 URL
			.excludePathPatterns("/css/**", "/*.icon", "/error"); // 제외할 URL
	}
}

 

3. 필터, 인터페이스 차이

필터와 인터셉터는 둘 다 웹 요청과 응답에 대해 사전, 사후 작업을 수행하는 데 사용되지만, 몇 가지의 차이점이 있다.

  필터(Filter) 인터셉터(Interceptor)
관리되는 컨테이너 서블릿 컨테이너 스프링 컨테이너
스프링 예외 처리 여부 X O
Request / Response 객체 조작 여부 O X

 

3.1 필터(Filter)

필터에서는 스프링 MVC 외부에서 작동하기 때문에 스프링과 무관하게 처리해야 하는 작업들을 처리할 수 있다.

  • 보안 관련 처리(인증, 인가)
  • 요청과 응답에 대한 로깅
  • 인코딩, CORS 설정
  • 스프링의 컨텍스트와 무관하게 처리해야 하는 사전, 사후 작업

 

3.2 인터셉터(Interceptor)

인터셉터는 필터와 다르게 Request / Response 객체를 조작할 수 없다. 하지만 해당 객체가 내부적으로 갖는 값은 조작할 수 있어서 컨트롤러로 넘겨주기 위한 정보를 가공기에 좋다.

  • 세부적인 보안 관련 처리
  • API 호출 로깅

 

📕참고 자료

'Study > Java & Spring' 카테고리의 다른 글

해시(Hash)란?  (0) 2024.04.04
체크 예외 & 언체크(런타임 예외)  (1) 2024.03.26