서블릿 필터(Servlet Filter)란?

서블릿 필터는 클라이언트 요청(Request) 또는 서버 응답(Response)이 서블릿이나 JSP와 같은 자원에 도달하기 전에 중간에서 요청과 응답을 가로채어 처리하는 기능을 제공합니다. 필터는 웹 애플리케이션의 동작을 확장하거나 수정하는 데 사용됩니다.

필터의 주요 특징

  1. 요청(Request)와 응답(Response) 처리
    • 요청을 사전 처리하거나, 응답을 후처리
  2. 재사용 가능:
    • 필터는 여러 서블릿 또는 JSP에서 공유되고 재사용
  3. 체인 형태로 연결 가능:
    • 여러 필터를 순차적으로 연결하여 체인을 구성

필터의 주요 사용 사례

  1. 인증 및 권한 검사:
    • 사용자가 특정 자원에 접근할 자격이 있는지 확인.
  2. 로깅 및 감사:
    • 요청, 응답, 클라이언트 정보를 기록.
  3. 데이터 압축:
    • 응답 데이터를 GZIP으로 압축하여 전송.
  4. 글로벌 설정:
    • 모든 요청에 대한 인코딩 설정(UTF-8 등).
  5. CORS 처리:
    • 교차 출처 리소스 공유(Cross-Origin Resource Sharing) 정책 설정.

필터의 작동 흐름

  1. 클라이언트 요청 → 필터 실행 → 서블릿 실행 → 필터 후처리 → 클라이언트 응답
    • 필터는 요청(Request) 전에 실행되고 응답(Response) 후에도 처리할 수 있습니다.

필터 구현 방법

1. 필터 인터페이스 구현

javax.servlet.Filter 인터페이스를 구현합니다. 주요 메서드는 다음과 같습니다:

  • init(FilterConfig filterConfig):
    • 필터 초기화 메서드. 필터가 최초로 로드될 때 호출됩니다.
  • doFilter(ServletRequest request, ServletResponse response, FilterChain chain):
    • 요청과 응답을 처리하는 핵심 메서드.
    • FilterChain을 사용하여 다음 필터 또는 서블릿으로 요청을 전달합니다.
  • destroy():
    • 필터가 제거될 때 호출되는 메서드. 자원 정리에 사용됩니다.

2. 필터 클래스 작성

import javax.servlet.*;
import java.io.IOException;

public class MyFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("필터 초기화");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        // 요청 전 처리
        System.out.println("요청 전 처리");

        // 다음 필터 또는 서블릿으로 요청 전달
        chain.doFilter(request, response);

        // 응답 후 처리
        System.out.println("응답 후 처리");
    }

    @Override
    public void destroy() {
        System.out.println("필터 제거");
    }
}

3. 필터 설정 (web.xml)

필터를 특정 URL 패턴에 적용합니다

<filter>
    <filter-name>MyFilter</filter-name>
    <filter-class>com.example.MyFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>MyFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

4. 필터 설정 (어노테이션, Java Config)

Java EE 6 이상에서는 어노테이션으로 필터를 설정할 수 있습니다:

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

@WebFilter("/*") // 모든 URL 패턴에 적용
public class MyFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("필터 초기화");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        System.out.println("요청 전 처리");

        chain.doFilter(request, response);

        System.out.println("응답 후 처리");
    }

    @Override
    public void destroy() {
        System.out.println("필터 제거");
    }
}

 

필터 체인(Filter Chain)

  • 여러 개의 필터가 등록된 경우, 등록된 순서대로 실행됩니다.
  • 각 필터는 FilterChain 객체를 통해 다음 필터 또는 서블릿으로 요청을 전달합니다.

필터 체인 동작 예시:

  1. 필터 A → 요청 전 처리
  2. 필터 B → 요청 전 처리
  3. 서블릿 실행
  4. 필터 B → 응답 후 처리
  5. 필터 A → 응답 후 처리

필터와 인터셉터의 차이

항목필터(Filter)인터셉터(Interceptor)

기술 스택 서블릿(Java EE) 기반 스프링(Spring) 기반
적용 범위 요청/응답 전체 스프링 MVC 컨트롤러
주요 목적 요청 및 응답 전후 공통 처리 컨트롤러 로직 전후 처리
구현 방식 javax.servlet.Filter HandlerInterceptor 구현

필터는 스프링과 관계없이 서블릿 환경에서 작동하며, 인터셉터는 스프링 MVC에 특화된 기능입니다.

결론

필터는 서블릿 기반 웹 애플리케이션에서 공통 로직을 중앙에서 관리하는 강력한 도구입니다. 인증, 로깅, 응답 데이터 압축 등 다양한 사용 사례에 활용할 수 있습니다. 필요에 따라 어노테이션 또는 XML 설정을 사용해 URL 패턴에 적용할 수 있습니다.

'WEB' 카테고리의 다른 글

SQL Session Factory  (0) 2024.12.02
이미지 파일저장  (0) 2024.11.21
JSP INCLUDE  (0) 2024.11.21
Scope  (0) 2024.11.20
서블릿 리스너  (0) 2024.11.20

+ Recent posts