코딩/자바

[Spring] filter, servlet filter

yoney 2025. 2. 5. 15:38

[ 목차 ]


    공통 관심사

    로그인 여부를 확인하는 로직을 모든 메서드마다 작성해놓아야 하는 경우, 로그인 여부를 확인하는 로직을 공통 관심사라고 한다.

    공통 관심사는 Servlet Filter, Spring Intercepter를 사용한다.


    Servlet Filter

    1. 공통 관심사 로직 처리
      • 공통된 로직을 중앙 집중적으로 구현하여 재사용성이 높고 유지보수가 쉽다.
      • 모든 요청이 하나의 입구를 통해 처리되어 일관성을 유지한다.
      • filter는 개발자가 순서를 지정하여 자유롭게 추가할 수 있다.
    2. HTTP 요청 및 응답 필터링
    3. Filter Chain
      • 여러 개의 필터가 순차적으로 적용될 수 있다.
      • filterChain.doFilter(request, response); 다음 필터로 제어를 전달한다.
      •  
    4. doFilter()
      • 실제 필터링 작업을 수행하는 주요 메소드로 필터가 처리할 작업을 정의한다.
      • 다음 필터로 제어를 넘길지 여부를 결정한다.

     

    • Filter를 적용하면 Servlet이 호출되기 이전에 Filter를 항상 거치게된다.
    • 공통 관심사를 필터에만 적용하면 모든 요청 or 응답에 적용된다 .
    • Filter는 특정 URL Pattern에 적용할 수 있다.
    • Spring을 사용하는 경우 Servlet은 **Dispatcher Servlet**이다.

    filter interface

    Java Servlet에서 HTTP 요청과 응답을 가로채고, 이를 기반으로 다양한 처리 작업을 수행하는 데 사용되는 Interface이다.

     

    • 주요 메서드
      1. init()
        • Filter를 초기화하는 메서드이다.
        • Servlet Container가 생성될 때 호출된다.
        • default ****method이기 때문에 implements 후 구현하지 않아도 된다.
      2. doFilter()
        • Client에서 요청이 올 때 마다 doFilter() 메서드가 호출된다.
          • doFilter() 내부에 필터 로직(공통 관심사 로직)을 구현하면 된다.
        • WAS에서 doFilter() 를 호출해주고 하나의 필터의 doFilter()가 통과된다면
        • Filter Chain에 따라서 순서대로 doFilter() 를 호출한다.
        • 더이상 doFilter() 를 호출할 Filter가 없으면 Servlet이 호출된다.
      3. destroy()
        • 필터를 종료하는 메서드이다.
        • Servlet Container가 종료될 때 호출된다.
        • default method이기 때문에 implements 후 구현하지 않아도 된다.
      4. setFilter()
        1. 등록할 필터를 파라미터로 전달하면 된다
      5. setOrder()
        1. Filter는 Chain 형태로 동작한다.
        2. 즉, 실행될 Filter들의 순서가 필요하다.
        3. 파라미터로 전달될 숫자에 따라 우선순위가 정해진다.
        4. 숫자가 낮을수록 우선순위가 높다.
      6. addUrlPatterns()
        1. 필터를 적용할 URL 패턴을 지정한다
        2. 여러개 URL 패턴을 한번에 지정할 수 있다.
        3. 규칙은 Servlet URL Pattern과 같다.
      7. filterRegistrationBean.addUrlPatterns("/*")
        1. 모든 Request는 Custom Filter를 항상 지나간다.
    @Slf4j
    public class CustomFilter implements Filter {
        @Override
        public void doFilter(
                ServletRequest request,
                ServletResponse response,
                FilterChain chain
        ) throws IOException, ServletException {
    
            // Filter에서 수행할 Logic
            HttpServletRequest httpRequest = (HttpServletRequest) request;
            String requestURI = httpRequest.getRequestURI();
    
            log.info("request URI={}", requestURI);
            // chain 이 없으면 Servlet을 바로 호출
            chain.doFilter(request, response);
        }
    }

    Servlet Filter 요약 정리

    1. Filter를 사용하려면 Filter Interface를 Implements 하여 구현한다.
    2. 구현한 Filter를 Bean으로 등록 한다.
    3. HTTP 요청이 오면 doFilter() 메서드가 호출된다.
      • ServletRequest는 기능이 별로 없어서 HttpServletRequest로 다운 캐스팅 해야한다.
    4. chain.doFilter(request, response)
      • (순서를 설정해둔)다음 필터가 있으면 Filter를 호출한다.
      • 다음 실행할 필터가 없으면 Servlet을 호출한다.
      • 해당 메서드를 호출하지 않으면 다음 단계로 진행되지 않는다.
        • 다음 필터나 Servlet을 호출하지 않는다.
    5. Filter를 등록하는 방법은 여러가지가 있다.
      • SpringBoot의 경우 FilterRegistrationBean 을 사용한다.

    '코딩 > 자바' 카테고리의 다른 글

    [Spring] Spring Data JPA  (0) 2025.02.05
    [Spring] JPA  (0) 2025.02.05
    [Spring] Token, JWT  (0) 2025.02.05
    [Spring] Session  (0) 2025.02.05
    [Spring] Cookie  (0) 2025.02.05