[Spring] Filter 이해하기

Woo Yong·2024년 1월 22일
1

Spring

목록 보기
11/15
post-thumbnail

이전 글에서 Filter는 요청에 의해서 실행될 Servlet 실행 전/후로 특별한 처리가 필요한 경우 실행되는 클래스라고 했다.
즉, 클라이언트의 HTTP 요청이 Servlet에 도달하기 전이나 후에 요청/응답 데이터를 가로채어 변경하거나 처리하는 클래스인 것이다.

그렇다면, Filter 등록하는 방법에 대해 알아보자.

web.xml을 이용하여 등록하는 방법

web.xml파일을 이용하여 Filter를 등록할 수 있다.

1. Filter 클래스 작성

웹 애플리케이션에서 사용할 Filter 클래스를 작성합니다.

public class LoggingFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // 필터 초기화 코드
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        // 필터 동작 코드 (전처리)
        System.out.println("Request received at " + System.currentTimeMillis());

        // 다음 필터로 체인 전달 또는 실제 서블릿 호출
        chain.doFilter(request, response);

        // 필터 동작 코드 (후처리)
        System.out.println("Response sent at " + System.currentTimeMillis());
    }

    @Override
    public void destroy() {
        // 필터 소멸 코드
    }
}

2. web.xml에 필터 등록하기

<!-- web.xml -->
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <!-- 필터 등록 -->
    <filter>
        <filter-name>LoggingFilter</filter-name>
        <filter-class>com.example.LoggingFilter</filter-class>
    </filter>

    <!-- 필터 매핑 -->
    <filter-mapping>
        <filter-name>LoggingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

</web-app>

<filter> 태그는 필터를 등록하는 부분이며, <filter-name>태그는 필터의 이름을 지정한다. 이때, 고유한 이름으로 등록해야한다.
그리고<filter-class>태그는 등록하기 위해 작성한 필터 클래스의 패키지 전체 경로를 정확하게 작성해야한다.

하지만 listener와 동일하게 지금까지 설명한 코드는 사용하기 위해 filter를 등록하기만 한 것으로 웹 애플리케이션 서버가 언제 실행해야할지 매핑정보를 입력해주어야한다.

따라서, <filter-mapping>태그 내 <filter-name>태그는 필터 등록 시 작성한 <filter-name>과 동일한 값으로 작성해주고, <url-pattern>태그를 이용하여 필터와 URL을 매핑할 경로를 작성해주어야한다.

Annotation을 이용하여 등록하는 방법

어노테이션을 이용하여 Filter를 등록하기 위해서는 @WebFilter어노테이션을 이용할 수 있다.
해당 어노테이션을 통해서 URL 패턴을 지정하여 사용할 수 있다.
그리고 어노테이션을 이용하여 등록하는 방법은 Servlet3.0 스펙 이후부터 사용할 수 있다.

1. Filter 클래스 작성

@WebFilter("/*")
public class LoggingFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // 필터 초기화 코드
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        // 필터 동작 코드 (전처리)
        System.out.println("Request received at " + System.currentTimeMillis());

        // 다음 필터로 체인 전달 또는 실제 서블릿 호출
        chain.doFilter(request, response);

        // 필터 동작 코드 (후처리)
        System.out.println("Response sent at " + System.currentTimeMillis());
    }

    @Override
    public void destroy() {
        // 필터 소멸 코드
    }
}

doFilter()

doFilter()메서드는 Java Servlet API의 Filter 인터페이스를 구현할 때 반드시 구현해야하는 필수 메서드이다.

해당 메서드는 Filter가 클라이언트의 요청과 Servlet의 응답을 가로채어(Servlet에 도달하기전) 처리하는 로직을 구현하는 곳입니다.

아래와 같이 doFilter를 선언 방법할 수 있다.

void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
    throws IOException, ServletException;
  • ServletRequest request : 클라이언트의 HTTP 요청과 관련된 정보 및 작업을처리하기 위해 객체
  • ServletResponse response : Servlet이 생성한 응답을 조작하거나새로 생성하기 위한 객체
  • FilterChain chain : Filter는 동시에 실행되는 것이 아니라, Chain형태의 구조를 나타내고 있다고 했다.
    즉, 다음 Filter가 있을 경우에는 전달하고, 없을 때는 Servlet에게 요청을 전달하는 것이다.

따라서, doFilter가 수행하는 주요 역할을 정리해보자.

  • 전 처리 작업 수행
  • 다음 필터로 요청 전달 또는 실제 서블릿 호출
  • 후처리 작업 수행

이처럼 Filter 인터페이스를 구현하는 클래스는 doFilter 메서드를 반드시 구현해야하며, 필터의 주요 로직은 doFilter메서드 내에서 작성되는 것이다.

profile
Back-End Developer

0개의 댓글