필터(Filter)와 밸브(Valve)는 웹 애플리케이션 또는 서버 환경에서 요청(Request) 및 응답(Response)을 처리하는 데 사용되는 구성 요소입니다. 둘 다 클라이언트 요청과 서버 응답을 가로채어 추가적인 작업을 수행할 수 있지만, 적용되는 레벨과 사용 범위에서 차이가 있습니다.
💡 필터(Filter)
필터는 서블릿 컨테이너에서 요청(Request) 또는 응답(Response)을 전처리 또는 후처리하기 위해 사용되는 자바 웹 기술입니다. 필터는 주로 애플리케이션 레벨에서 동작하며, 서블릿이나 JSP 실행 전후에 실행되어 요청이나 응답을 변환하거나 처리할 수 있습니다.
주요 기능:
- 요청과 응답 변환: 필터는 클라이언트로부터 들어온 요청을 처리하거나, 서버가 클라이언트로 반환할 응답을 수정할 수 있습니다.
- 인증 및 인가: 사용자 인증 및 권한 확인에 자주 사용되며, 필터에서 사용자의 로그인 상태나 권한을 확인할 수 있습니다.
- 로깅: 서버로 들어오는 요청을 기록하거나, 서버에서 반환하는 응답 정보를 로깅하는 데 사용됩니다.
- 데이터 압축: 응답을 클라이언트에 전달하기 전에 압축하여 전송 속도를 향상시킬 수 있습니다.
필터의 특징:
- 애플리케이션 내에서 동작: 특정 서블릿이나 URL 패턴에 대해 동작하도록 설정할 수 있습니다.
- 순서대로 실행: 여러 필터를 설정할 수 있으며, 각 필터는 설정된 순서에 따라 차례로 실행됩니다.
- 요청 또는 응답을 차단 가능: 특정 조건에 따라 요청을 중단하거나 다른 페이지로 리다이렉트할 수 있습니다.
필터 설정 예시 (web.xml
):
<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>
필터 클래스 예시:
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
public class MyFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
// 초기화 코드
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// 요청 전 처리
System.out.println("Before request processing");
chain.doFilter(request, response); // 다음 필터 또는 서블릿으로 요청 전달
// 응답 후 처리
System.out.println("After request processing");
}
public void destroy() {
// 필터 종료 시 처리 코드
}
}
💡 밸브(Valve)
밸브(Valve)는 Tomcat 서버에서 제공하는 요청 처리 구성 요소로, 서버 또는 컨테이너 레벨에서 요청 및 응답을 처리할 수 있는 기능을 제공합니다. 밸브는 Tomcat 서버의 파이프라인(pipeline)에서 동작하며, 필터와 비슷한 방식으로 요청과 응답을 가로채어 추가적인 작업을 수행할 수 있지만, 주로 서버 설정 파일(server.xml
)에서 설정되고, 서버 전반에 적용되는 경우가 많습니다.
주요 기능:
- 로깅: 서버에 들어오는 모든 요청을 기록하거나, 서버에서 반환하는 응답 정보를 로깅하는 데 자주 사용됩니다.
- IP 필터링: 특정 IP 주소 또는 IP 범위에서의 접근을 제한하거나 허용하는 작업을 처리할 수 있습니다.
- 리버스 프록시 처리: 클라이언트의 원래 IP 주소를 기록하고 프록시 서버 뒤에서 클라이언트 요청을 처리할 때 유용합니다.
밸브의 특징:
- 서버 전역에서 동작: Tomcat의 엔진(Engine), 호스트(Host), 또는 컨텍스트(Context)에 설정하여 서버 전체 또는 특정 애플리케이션에 대해 동작할 수 있습니다.
- 설정은
server.xml
에서 관리:web.xml
에서 설정하는 필터와는 달리, 밸브는server.xml
에 설정되어 서버나 호스트 전체에 적용됩니다. - 서버 수준에서 처리: 필터는 애플리케이션 레벨에서 동작하는 반면, 밸브는 Tomcat 컨테이너에서 요청 파이프라인의 구성 요소로서 서버 전역에서 요청을 처리합니다.
밸브 설정 예시 (server.xml
):
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
<!-- AccessLogValve 설정: 모든 요청을 로그로 기록 -->
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs"
prefix="localhost_access_log"
suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
밸브 클래스 예시:
import org.apache.catalina.valves.ValveBase;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
public class MyValve extends ValveBase {
public void invoke(Request request, Response response) throws IOException, ServletException {
// 요청 처리 전 작업
System.out.println("Request received by Valve");
// 다음 Valve 또는 컨테이너로 요청 전달
getNext().invoke(request, response);
// 응답 처리 후 작업
System.out.println("Response sent by Valve");
}
}
💡 필터와 밸브의 차이점
특징 | 필터(Filter) | 밸브(Valve) |
---|---|---|
적용 레벨 | 애플리케이션 레벨 (서블릿 또는 JSP에 적용) | 서버 또는 컨테이너 레벨 (Tomcat 전체에 적용) |
설정 파일 | web.xml 또는 @WebFilter 어노테이션 |
server.xml |
처리 범위 | 특정 URL 패턴 또는 서블릿에 대해 동작 | 서버 전체 또는 특정 호스트, 컨텍스트에 대해 동작 |
주요 사용 용도 | 요청과 응답 전후에 로깅, 인증, 데이터 변환 등 | 서버 로그, IP 필터링, 리버스 프록시 설정 등 |
순서 제어 | 여러 필터 설정 가능, 순서에 따라 처리 | 서버 설정 순서에 따라 처리 |
설정 및 관리 | 애플리케이션 내에서 쉽게 설정 가능 | 서버 관리자나 운영자가 설정 |
결론
필터(Filter)와 밸브(Valve)는 모두 클라이언트의 요청과 서버의 응답을 가로채어 처리할 수 있는 도구입니다. 필터는 서블릿과 JSP 수준에서 동작하며, 애플리케이션 레벨에서 인증, 인가, 로깅, 데이터 변환 등을 수행하는 데 적합합니다. 반면, 밸브는 Tomcat 서버의 컨테이너 레벨에서 동작하며, 서버 전체에 걸쳐 로깅, IP 필터링, 프록시 설정 등의 기능을 수행합니다.