
클라이언트가 요청을 하면 Controller까지 접근하기 위해서는 중간중간 거치는 과정들이 있다. 그래서 이번 포스팅의 주제는 Spring Filter에 대해 알아보려고 한다.
Spring Filter
위 그림에서 볼 수 있듯이 클라이언트의 요청을 가장 먼저 마주하는 것이 바로 Filter이다. Dispatcher Servlet에 도달 전/후에 모든 요청에 부가 작업을 처리할 수 있는 기능을 한다. 또한 Filter는 FilterChain에 의해 여러 필드가 연쇄적으로 동작할 수 있다.
Filter는 스프링 컨테이너가 아닌 톰캣같은 웹 컨텍스트에 의해 관리된다. 즉, 스프링 범위 밖에서 처리되는 것이다.
Filter는 어떤 경우에 쓰이는 걸까?
→ Filter는 요청에 대한 인증, 권한 체크 등을 하는 데 쓰인다. 즉, 클라이언트의 요청이 Dispatcher Servlet에 도달하기 전에 요청 헤더에 인증 토큰이 있는지 없는지, 올바른 토큰인지 아닌지 확인하는 것이다.
Filter는 어떻게 사용해야하는 거지?
→ Filter를 사용하기 위해서는 Filter 인터페이스를 상속받아야 한다.
public class FilterEx1 implements Filter
Filter를 상속받으면 구현할 수 있는 메소드가 3개가 있다.
@Override
public void init(FilterConfig filterConfig) throws ServletException {
Filter.super.init(filterConfig);
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
}
@Override
public void destroy() {
Filter.super.destroy();
}
○ init() : 필터가 생성될 때 사용되는 메소드
○ doFilter() : request, response가 거칠 때 사용되는 메소드
○ destroy() : 필터가 소멸될 때 사용되는 메소드
Filter를 제작하기 앞서 설계 의도를 말하자면
1. 서버를 올리면 Filter를 생성했다는 말이 출력된다.
2. 요청을 하면 해당 Filter의 번호가 출력된다.
3. 서버를 내리면 Filter가 소멸했다는 말이 출력된다.
Filter를 만들고 의도한 대로 결과가 찍히는지 확인해보자 !
Filter1.java
public class FilterEx1 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("Filter1 생성");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("========== Filter1 ============");
chain.doFilter(request, response);
}
@Override
public void destroy() {
System.out.println("Filter1 소멸");
}
}
Filter2.java
public class FilterEx2 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("Filter2 생성");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("========== Filter2 ============");
chain.doFilter(request, response);
}
@Override
public void destroy() {
System.out.println("Filter2 소멸");
}
}
Filter3.java
public class FilterEx3 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("Filter3 생성");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("========== Filter3 ============");
chain.doFilter(request, response);
}
@Override
public void destroy() {
System.out.println("Filter3 소멸");
}
}
ConfigFilter.java
@Configuration
public class ConfigFilter {
@Bean
public FilterRegistrationBean filter1(){
FilterRegistrationBean bean = new FilterRegistrationBean(new FilterEx1());
return bean;
}
@Bean
public FilterRegistrationBean filter2(){
FilterRegistrationBean bean = new FilterRegistrationBean(new FilterEx2());
return bean;
}
@Bean
public FilterRegistrationBean filter3(){
FilterRegistrationBean bean = new FilterRegistrationBean(new FilterEx3());
return bean;
}
}
FilterController.java
@RestController
public class FilterController {
@GetMapping("/")
public String Test(){
System.out.println("Test ~");
return "Test Complete ! ";
}
}
서버를 올리고 "/" 요청을 하면 콘솔 화면에 어떤 결과가 나오는지 확인해보자.

결과를 보면 알 수 있듯이 의도한 대로 출력된 것을 알 수 있다.
또한, Filter를 거치고 Controller로 들어온다는 것도 눈으로 확인할 수 있다.
만약에 Filter의 순서를 변경하고 싶다면 .setOrder() 메소드를 사용하면 Filter 적용 순서를 바꿀 수 있다.
ConfigFilter.java (순서 변경)
@Configuration
public class ConfigFilter {
@Bean
public FilterRegistrationBean filter1(){
FilterRegistrationBean bean = new FilterRegistrationBean(new FilterEx1());
bean.setOrder(3);
return bean;
}
@Bean
public FilterRegistrationBean filter2(){
FilterRegistrationBean bean = new FilterRegistrationBean(new FilterEx2());
bean.setOrder(1);
return bean;
}
@Bean
public FilterRegistrationBean filter3(){
FilterRegistrationBean bean = new FilterRegistrationBean(new FilterEx3());
bean.setOrder(2);
return bean;
}
}

이번 포스팅에서 Filter는 무엇이고 어떻게 생성해야하는지 알아보았고, 순서를 변경할 수 있다는 것도 알았다.
다음은 Interceptor에 대해 알아볼 예정이다.
▽ 도움을 주신 분들
[Spring] 스프링에서의 필터 개념및 예제
Filter란? 필터는 스프링의 독자적인 기능이 아닌 자바 서블릿에서 제공하는 기능이다. 스프링 프레임워크에서 필터로 인증등 다양한 작업을 하는데 최근 xss 공격방어를 하며 필터를 사용해봣기
popo015.tistory.com
spring - 스프링에서의 필터 개념 및 예제
블로그에서 사용한 소스코드는 https://github.com/97e57e/BLOG 에서 보실 수 있습니다. Filter 란? 사실 필터는 스프링의 독자적인 기능이 아닌 자바 서블릿에서 제공하는 기능입니다. 스프링 프레임워크
gardeny.tistory.com
[Spring] 필터(Filter)와 인터셉터(Interceptor)의 개념 및 차이
개발을 하다 보면 공통적으로 처리해야 할 업무들이 많다. 공통 업무에 관련된 코드를 페이지마다 작성한다면 중복 코드가 많아지게 되고, 프로젝트 단위가 커질수록 서버에 부하를 줄 수도 있
dev-coco.tistory.com
'Spring > Spring' 카테고리의 다른 글
[Spring] Spring Triangle? 그게 뭔데 - AOP (0) | 2022.06.29 |
---|---|
[Spring] 인터셉터(Interceptor)에 대해 알아보자! (0) | 2022.06.28 |
[spring] Spring MVC 구조 (0) | 2022.06.02 |
[spring] 컴포넌트 스캔 (0) | 2022.04.25 |
[spring] 싱글톤 레지스트리 (0) | 2022.04.22 |