[java] Guice를 사용하여 Java 서블릿에서 외부 서비스에 연결하기

Guice는 Google에서 개발한 자바 의존성 주입(Dependency Injection) 프레임워크입니다. 이를 사용하면 객체 간의 의존성을 느슨하게 결합하여 더 유연하고 테스트 가능한 코드를 작성할 수 있습니다. 이번 블로그 포스트에서는 Guice를 사용하여 Java 서블릿에서 외부 서비스에 연결하는 방법에 대해 알아보겠습니다.

1. Guice 설정하기

먼저, Guice를 프로젝트에 추가해야 합니다. Maven을 사용하는 경우, pom.xml 파일에 다음 의존성을 추가합니다:

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

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

dependencies {
    implementation 'com.google.inject:guice:4.2.3'
}

2. 외부 서비스 인터페이스 정의하기

서블릿에서 사용할 외부 서비스에 대한 인터페이스를 정의해야 합니다. 예를 들어, 외부 서비스로 데이터를 가져오는 DataService 인터페이스를 만들어 보겠습니다:

public interface DataService {
    String getData();
}

3. Guice 모듈 생성하기

다음으로, Guice 모듈을 생성하고 DataService 인터페이스와 구현 클래스를 연결합니다. 이를 위해 AbstractModule 클래스를 상속하는 DataModule 클래스를 만들어 보겠습니다:

public class DataModule extends AbstractModule {
    @Override
    protected void configure() {
        bind(DataService.class).to(DataServiceImpl.class);
    }
}

4. Guice 필터 생성하기

서블릿에서 Guice를 사용하기 위해 Guice Servlet 모듈을 설정해야 합니다. 이를 위해 GuiceFilter를 사용하여 필터를 생성합니다. GuiceFilter는 모든 요청을 Guice Servlet 모듈로 라우팅합니다. ServletContextListener 인터페이스를 구현하여 웹 애플리케이션 시작 시 필터를 등록합니다:

public class MyServletContextListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        Injector injector = Guice.createInjector(new DataModule());
        ServletContext servletContext = servletContextEvent.getServletContext();
        servletContext.setAttribute(Injector.class.getName(), injector);
        
        Filter guiceFilter = injector.getInstance(GuiceFilter.class);
        servletContext.addFilter("GuiceFilter", guiceFilter).addMappingForUrlPatterns(null, false, "/*");
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        // Clean up resources if needed
    }
}

5. 서블릿에서 외부 서비스 사용하기

이제 외부 서비스를 사용하는 서블릿에서 Guice를 통해 DataService 인스턴스를 주입받아 사용할 수 있습니다. Guice에서 생성된 객체는 외부 서비스 인스턴스를 자동으로 관리하므로 코드 중복 및 의존성 주입에 대한 고민을 줄일 수 있습니다:

public class MyServlet extends HttpServlet {
    @Inject
    private DataService dataService;

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String data = dataService.getData();
        // 외부 서비스로부터 받아온 데이터를 처리하는 로직 작성
    }
}

결론

이번 튜토리얼에서는 Guice를 사용하여 Java 서블릿에서 외부 서비스에 연결하는 방법에 대해 알아보았습니다. Guice를 사용하면 의존성 주입을 통해 코드의 유연성과 테스트 가능성을 향상시킬 수 있습니다. Guice를 사용하여 프로젝트를 개발하고 유지 관리하는 동안 외부 서비스와의 통합을 용이하게 할 수 있습니다.

더 많은 Guice 기능에 대해 알아보려면 Guice 공식 문서를 참조하시기 바랍니다.