[java] Guice를 활용한 서블릿 요청 로깅(Request Logging)

웹 애플리케이션에서는 요청에 대한 로깅이 중요합니다. 이를 통해 어떤 유형의 요청이 도착했는지, 어떤 응답이 반환되었는지, 그리고 어떤 예외가 발생했는지를 추적할 수 있습니다. 이번 기술 블로그에서는 Guice를 사용하여 서블릿 요청 로깅을 구현하는 방법에 대해 알아보겠습니다.

Guice란?

Guice는 Java 애플리케이션의 의존성 주입(Dependency Injection)을 쉽게 구현할 수 있도록 도와주는 프레임워크입니다. Guice를 사용하면 코드의 유연성과 재사용성을 향상시킬 수 있습니다.

Guice를 사용하여 요청 로깅 구현하기

  1. Maven 또는 Gradle을 사용하여 프로젝트에 Guice를 추가합니다.

  2. 로깅을 위한 Logback 또는 Log4j와 같은 로깅 프레임워크를 프로젝트에 추가합니다.

  3. Guice의 ServletModule을 상속하는 새로운 모듈을 생성합니다.

import com.google.inject.servlet.ServletModule;

public class MyAppModule extends ServletModule {
    
    @Override
    protected void configureServlets() {
        filter("/*").through(RequestLoggingFilter.class);
        serve("/*").with(MyServlet.class);
    }
}
  1. RequestLoggingFilter를 생성하여 요청 및 응답을 로깅합니다.
import javax.servlet.*;
import java.io.IOException;

public class RequestLoggingFilter implements Filter {

    private final Logger logger = LoggerFactory.getLogger(RequestLoggingFilter.class);
    
    @Override
    public void init(FilterConfig filterConfig) {}

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        HttpServletResponse httpResponse = (HttpServletResponse) response;
        
        logger.info("Request: {}", httpRequest.getRequestURI());
        
        chain.doFilter(request, response);

        logger.info("Response: {}", httpResponse.getStatus());
    }

    @Override
    public void destroy() {}
}
  1. 위의 모듈과 필터를 Guice에 등록하고 애플리케이션을 시작합니다.
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.servlet.GuiceServletContextListener;

public class MyAppServletContextListener extends GuiceServletContextListener {

    @Override
    protected Injector getInjector() {
        return Guice.createInjector(new MyAppModule());
    }
}
  1. MyServlet을 생성하여 요청에 대한 처리를 구현합니다.
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
        // 요청 처리 로직 구현
    }
}

요약

이렇게 Guice를 활용하여 서블릿 요청 로깅을 구현할 수 있습니다. Guice를 사용하면 코드의 가독성과 유연성을 향상시킬 수 있으며, 요청에 대한 로깅을 통해 문제를 더 쉽게 파악할 수 있습니다.

더 자세한 내용과 예제 코드는 Guice의 공식 문서를 참조하시기 바랍니다.

참고 자료