본문 바로가기
Spring Framework

필터와 밸브

by xogns93 2024. 10. 8.

필터(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 &quot;%r&quot; %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 필터링, 프록시 설정 등의 기능을 수행합니다.

'Spring Framework' 카테고리의 다른 글

프록시와 어댑터  (0) 2024.10.08
스프링 웹 MVC  (0) 2024.10.08
AJP 커넥터  (1) 2024.10.08
아파치 톰캣 서버  (1) 2024.10.07
Apache Tomcat Server  (0) 2024.10.07