목차
- 필터의 정의
- 필터 구현하기
- 필터를 사용하는 이유

Spring에서의 필터는 말 그대로 들어온것(요청, 응답)을 걸러주는 거름망을 하는 역할이다.
Postman을 사용한다 가정했을때, 필터의 동작순서를 간단하게 나타내면 다음과 같다.
Postman(user) -> Filter -> Controller -> Filter -> Postman
필터를 구현하는 방법은 많지만 보통 OncePerRequestFilter를 제일 많이 사용한다.
스프링에서는 이러한 필터 내부 코드를 직접 구현할 필요 없이 라이브러리를 통해 사용하면 된다.
@Component
public class Filter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
// 요청이 들어갈 때 실행되는 부분
System.out.println("필터가 시작");
// 필터 계속 진행
filterChain.doFilter(request, response);
// 요청이 나갈 때 실행되는 부분
System.out.println("필터가 끝남");
}
}
필터를 스프링 빈으로 등록하기 위해 일반적으로 @Component 어노테이션을 사용한다.
filterChain.doFilter(request, response)를 기준으로 그 위에 있는 코드는 요청이 들어왔을때 필터가 시작되면서 동작하는 부분이고, 아래에 있는 코드는 필터가 종료 된 후 실행되는 부분이다.
소제목과 같이 필터가 여러개가 있을때, 필터의 묶음을 FilterChain라고 부른다.
더 자세히 말하면, 여러 개의 필터를 순서대로 실행하는 구조를 FilterChain이라고 한다.
필터를 여러개 사용하는 이유는 인증/인가에 대한 필터처리, 데이터 유효성 검증에 대한 필터처리 등 여러 필터링이 필요하기 때문이다.
필터가 여러 개일 경우 @Order 어노테이션을 사용하여 순서를 지정해줄 수 있다.
@Component
@Order(1)
public class Filter1 extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
// 요청이 들어갈 때 실행되는 부분
System.out.println("필터가 시작");
// 필터 계속 진행
filterChain.doFilter(request, response);
// 요청이 나갈 때 실행되는 부분
System.out.println("필터가 끝남");
}
}
@Component
@Order(2)
public class Filter2 extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
// 요청이 들어갈 때 실행되는 부분
System.out.println("2번째 필터가 시작");
// 필터 계속 진행
filterChain.doFilter(request, response);
// 요청이 나갈 때 실행되는 부분
System.out.println("2번째 필터가 끝남");
}
}
이런 2개의 필터를 작성하고 코드를 실행하게 되면, 필터의 동작순서는 이렇게 된다.
필터가 시작
2번째 필터가 시작
2번째 필터가 끝남
필터가 끝남
필터가 이렇게 동작하는 이유는 코드가 실행될때,
Postman -> Filter1(요청) -> Filter2(요청) -> Controller -> Filter2(응답) -> Filter1(응답) -> Postman
과 같은 구조로 동작하기 때문이다.
필터는 Controller에 도달하기 전 공통적으로 수행해야 하는 작업을 처리하기 위해 사용된다.
대표적인 사용 사례는 다음과 같다.
2.공통 인증/권한 체크