[260722]Filter

이상민·2026년 7월 22일

Spring

목록 보기
44/59

목차

  • 필터의 정의
  • 필터 구현하기
  • 필터를 사용하는 이유

필터란

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에 도달하기 전 공통적으로 수행해야 하는 작업을 처리하기 위해 사용된다.

대표적인 사용 사례는 다음과 같다.

  1. 로깅(요청/응답)
  • 모든 컨트롤러 호출 전후에 공통 적용가능하다
  • 오류 발생시 어느 API에서 발생하였는지 확인이 용이하다
  • 성능 분석(코드 실행 시간 측정)에 활용이 가능하다

2.공통 인증/권한 체크

  • 컨트롤러에게 요청을 보내기 전, 유효성을 검증하기 좋다
  • 인증/인가 로직의 중복을 제거하여 가독성 및 효율이 향상된다
  • 요청이 넘어가기전 필터링해주기 때문에 보안상 안전하다
profile
백앤드 개발 브이로그

0개의 댓글