[java] Guice를 활용한 서블릿 요청 압축(Compression) 처리 방법

이 포스트에서는 Guice와 서블릿을 함께 사용하여 HTTP 요청을 압축하는 방법을 알아보겠습니다. 압축은 클라이언트와 서버 간의 데이터 전송을 최적화하는데 도움이 되며, 대부분의 모던 웹 브라우저들은 압축을 지원합니다.

1. 서블릿 컨텍스트에 Filter 등록하기

먼저, Guice를 사용하여 압축 필터를 서블릿 컨텍스트에 등록해야 합니다. 아래와 같이 CompressionFilter 클래스를 구현해보겠습니다.

import javax.inject.Singleton;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.zip.GZIPOutputStream;

@Singleton
public class CompressionFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        HttpServletResponse httpResponse = (HttpServletResponse) response;

        String acceptEncoding = httpRequest.getHeader("accept-encoding");

        if (acceptEncoding != null && acceptEncoding.contains("gzip")) {
            GzipServletResponseWrapper gzipResponse = new GzipServletResponseWrapper(httpResponse);

            chain.doFilter(request, gzipResponse);

            gzipResponse.close();
        } else {
            chain.doFilter(request, response);
        }
    }

    @Override
    public void destroy() {

    }
}

위 코드에서는 CompressionFilter 클래스를 생성하고 doFilter 메서드에서 요청 헤더의 “accept-encoding” 값을 확인하여 GZIP 압축이 가능한 경우 응답을 압축하고, 그렇지 않은 경우 그대로 전달합니다.

2. Guice 모듈에 Filter 바인딩하기

다음으로, Guice 모듈에 압축 필터를 바인딩합니다. Guice 모듈을 구현한 예시 코드는 아래와 같습니다.

import com.google.inject.servlet.ServletModule;

public class MyModule extends ServletModule {

    @Override
    protected void configureServlets() {
        filter("/*").through(CompressionFilter.class);
    }
}

위 코드에서는 MyModule 클래스가 ServletModule을 상속받고, configureServlets 메서드에서 CompressionFilter/* 경로의 모든 요청에 적용하도록 지정합니다.

3. Guice ServletListener 등록하기

마지막으로, Guice ServletListener를 웹 애플리케이션에 등록해야 합니다. 이는 web.xml 파일에 아래와 같이 추가하면 됩니다.

<listener>
    <listener-class>com.google.inject.servlet.GuiceServletContextListener</listener-class>
</listener>

위 코드에서는 GuiceServletContextListener가 Guice 모듈을 로드하고, Guice의 Servlet 관련 설정을 초기화합니다.

결론

이제 Guice와 서블릿을 함께 사용하여 서블릿 요청을 압축하는 방법을 알아보았습니다. 압축은 네트워크 대역폭을 절약하고 HTTP 요청 및 응답의 성능을 향상시키는데 큰 도움이 됩니다. Guice를 사용하면 서블릿 필터를 쉽게 등록하고 관리할 수 있으므로, 압축 기능을 추가하는 데 활용해보시기 바랍니다.

참고 자료