[java] Guice를 사용하여 서블릿에서 클라이언트 IP 주소 추출하기

웹 애플리케이션 개발 시, 종종 클라이언트의 IP 주소를 추출해야 할 때가 있습니다. 이번 포스트에서는 Guice를 사용하여 서블릿에서 클라이언트 IP 주소를 추출하는 방법을 알아보겠습니다.

Guice란?

Guice는 자바 애플리케이션의 의존성 주입(Dependency Injection)을 단순하게 처리하기 위해 구글에서 개발한 프레임워크입니다. Guice를 사용하면 객체 간의 의존성을 설정하고 주입하는 작업을 간단하고 효율적으로 처리할 수 있습니다.

Guice를 프로젝트에 추가하기

Maven을 사용하는 경우, pom.xml 파일에 다음 의존성을 추가합니다:

<dependency>
    <groupId>com.google.inject</groupId>
    <artifactId>guice</artifactId>
    <version>4.2.3</version>
</dependency>

Gradle을 사용하는 경우, build.gradle 파일에 다음 의존성을 추가합니다:

implementation 'com.google.inject:guice:4.2.3'

서블릿에서 클라이언트 IP 추출하기

Guice를 사용하여 서블릿에서 클라이언트 IP를 추출하려면 다음과 같이 작업해야 합니다:

  1. GuiceServletContextListener를 상속받는 MyServletContextListener 클래스를 작성합니다. 이 클래스는 Guice를 초기화하는 역할을 합니다.
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.servlet.GuiceServletContextListener;

public class MyServletContextListener extends GuiceServletContextListener {

    @Override
    protected Injector getInjector() {
        return Guice.createInjector(new MyModule());
    }
}
  1. MyModule 클래스를 작성하여 Guice 모듈을 설정합니다. 클라이언트 IP를 추출하는 IpExtractor 클래스를 바인딩합니다.
import com.google.inject.AbstractModule;

public class MyModule extends AbstractModule {

    @Override
    protected void configure() {
        bind(IpExtractor.class).to(IpExtractorImpl.class);
    }
}
  1. 클라이언트 IP를 추출하는 IpExtractor 인터페이스와 해당 인터페이스를 구현한 IpExtractorImpl 클래스를 작성합니다.
public interface IpExtractor {
    String extractIp(HttpServletRequest request);
}

public class IpExtractorImpl implements IpExtractor {
    @Override
    public String extractIp(HttpServletRequest request) {
        String ip = request.getHeader("X-Forwarded-For");

        if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("Proxy-Client-IP");
        }

        if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("WL-Proxy-Client-IP");
        }

        if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("HTTP_CLIENT_IP");
        }

        if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("HTTP_X_FORWARDED_FOR");
        }

        if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr();
        }

        return ip;
    }
}
  1. 서블릿에서 IpExtractor의 주입을 받아 클라이언트 IP를 추출합니다.
import com.google.inject.Inject;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyServlet extends HttpServlet {
    private final IpExtractor ipExtractor;

    @Inject
    public MyServlet(IpExtractor ipExtractor) {
        this.ipExtractor = ipExtractor;
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
        String clientIp = ipExtractor.extractIp(req);
        // 클라이언트 IP를 활용하는 로직 작성
    }
}

결론

Guice를 사용하여 서블릿에서 클라이언트 IP를 추출하는 방법을 알아보았습니다. Guice를 사용하면 의존성 주입을 편리하고 유연하게 처리할 수 있으므로, 웹 애플리케이션 개발 시 유용하게 사용할 수 있습니다.

더 알아보려면 Guice 공식 문서를 참고하세요.