서블릿 필터(Servlet Filter)란?
서블릿 필터는 클라이언트 요청(Request) 또는 서버 응답(Response)이 서블릿이나 JSP와 같은 자원에 도달하기 전에 중간에서 요청과 응답을 가로채어 처리하는 기능을 제공합니다. 필터는 웹 애플리케이션의 동작을 확장하거나 수정하는 데 사용됩니다.
필터의 주요 특징
- 요청(Request)와 응답(Response) 처리
- 요청을 사전 처리하거나, 응답을 후처리
- 재사용 가능:
- 필터는 여러 서블릿 또는 JSP에서 공유되고 재사용
- 체인 형태로 연결 가능:
- 여러 필터를 순차적으로 연결하여 체인을 구성
필터의 주요 사용 사례
- 인증 및 권한 검사:
- 사용자가 특정 자원에 접근할 자격이 있는지 확인.
- 로깅 및 감사:
- 요청, 응답, 클라이언트 정보를 기록.
- 데이터 압축:
- 응답 데이터를 GZIP으로 압축하여 전송.
- 글로벌 설정:
- 모든 요청에 대한 인코딩 설정(UTF-8 등).
- CORS 처리:
- 교차 출처 리소스 공유(Cross-Origin Resource Sharing) 정책 설정.
필터의 작동 흐름
- 클라이언트 요청 → 필터 실행 → 서블릿 실행 → 필터 후처리 → 클라이언트 응답
- 필터는 요청(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 객체를 통해 다음 필터 또는 서블릿으로 요청을 전달합니다.
필터 체인 동작 예시:
- 필터 A → 요청 전 처리
- 필터 B → 요청 전 처리
- 서블릿 실행
- 필터 B → 응답 후 처리
- 필터 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 |