Filter(필터)는 클라이언트에서 들어오는 요청과 응답을 가로채어 처리하는 Servlet 기술입니다.
Spring에서 필터는 주로 요청 전후에 공통적으로 처리해야 할 작업(로깅, 인증, 인코딩 등)을 구현할 때 사용됩니다.
javax.servlet.Filter 인터페이스를 구현하여 사용. import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;
public class CustomFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 초기화 작업
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("Request received at Filter");
chain.doFilter(request, response); // 다음 필터 또는 서블릿 호출
System.out.println("Response sent from Filter");
}
@Override
public void destroy() {
// 정리 작업
}
}
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class FilterConfig {
@Bean
public FilterRegistrationBean<CustomFilter> loggingFilter() {
FilterRegistrationBean<CustomFilter> registrationBean = new FilterRegistrationBean<>();
registrationBean.setFilter(new CustomFilter());
registrationBean.addUrlPatterns("/*"); // 모든 URL에 적용
return registrationBean;
}
}
Interceptor(인터셉터)는 Spring MVC의 요청 처리 과정에서 핸들러 호출 전후에 개입할 수 있는 기능입니다.
주로 Spring Context 안에서 동작하며, 컨트롤러 레벨에서 요청을 처리할 때 사용됩니다.
HandlerInterceptor 인터페이스를 구현하여 사용. import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Component
public class CustomInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("PreHandle: Before controller");
return true; // true이면 요청 계속 진행, false이면 요청 중단
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("PostHandle: After controller");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
Object handler, Exception ex) throws Exception {
System.out.println("AfterCompletion: After view rendering");
}
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Autowired
private CustomInterceptor customInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(customInterceptor)
.addPathPatterns("/api/**") // 특정 URL 패턴에만 적용
.excludePathPatterns("/api/public/**"); // 제외할 URL 패턴
}
}
| 항목 | Filter | Interceptor |
|---|---|---|
| 동작 위치 | 서블릿 컨테이너 레벨 | Spring MVC 컨텍스트 레벨 |
| 주요 용도 | 인코딩, 인증, 로깅 등 | 컨트롤러 전후 작업, 데이터 검증 등 |
| 적용 대상 | 모든 요청 | 컨트롤러로 라우팅되는 요청 |
| 라이프사이클 관리 | 서블릿 스펙에 의해 관리 | Spring IoC 컨테이너에 의해 관리 |
| 처리 가능 시점 | 요청 및 응답 전후 | 핸들러 호출 전후, 뷰 렌더링 후 |