[java] Guice를 이용한 서블릿 설정과 바인딩(Binding)

Guice는 자바에서 의존성 주입(Dependency Injection)을 구현하기 위한 프레임워크입니다. 이 글에서는 Guice를 이용하여 서블릿의 설정과 바인딩(Binding)을 어떻게 처리하는지 알아보겠습니다.

Guice 의존성 추가

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

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

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

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

서블릿 설정

서블릿 설정은 Guice의 ServletContextListener를 구현하여 처리할 수 있습니다. ServletContextListener는 웹 애플리케이션의 생명 주기 이벤트에 따라 동작하는 리스너입니다.

public class MyAppServletContextListener implements ServletContextListener {
    
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        ServletContext servletContext = sce.getServletContext();
        Injector injector = Guice.createInjector(new MyServletModule());
        servletContext.setAttribute(Injector.class.getName(), injector);
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {}
}

위의 코드에서는 MyServletModule을 Guice의 Injector에 등록하고, ServletContextInjector를 저장하는 작업을 수행합니다.

바인딩(Binding)

Guice에서 바인딩은 객체를 특정 인터페이스나 클래스에 연결하는 작업을 말합니다. 다음은 바인딩을 처리하는 MyServletModule 클래스의 예시입니다:

public class MyServletModule extends ServletModule {

    @Override
    protected void configureServlets() {
        
        bind(MyService.class).to(MyServiceImpl.class);
        bind(MyServlet.class);
        
        serve("/myservlet").with(MyServlet.class);
    }
}

위의 예제에서는 MyService 인터페이스를 MyServiceImpl 클래스에 바인딩하고, MyServlet 클래스를 바인딩합니다. serve 메소드를 사용하여 /myservlet URL 패턴에 MyServlet을 매핑합니다.

Guice와 함께 서블릿 사용하기

서블릿을 Guice와 함께 사용하려면 GuiceServletContextListener를 활용할 수 있습니다. 이는 Guice의 ServletContextListener를 상속받아 Guice를 활성화하는 역할을 합니다.

public class MyServletConfig extends GuiceServletContextListener {

    @Override
    protected Injector getInjector() {
        return (Injector) getServletContext().getAttribute(Injector.class.getName());
    }
}

위의 예제에서는 getInjector 메소드에서 ServletContext에서 등록한 Injector를 반환하도록 처리합니다.

웹 애플리케이션의 web.xml 파일에 다음 설정을 추가하여 MyServletConfig를 등록합니다:

<listener>
    <listener-class>com.example.MyServletConfig</listener-class>
</listener>

이제 Guice와 함께 서블릿을 사용할 준비가 되었습니다. 서블릿 클래스에서 @Inject 어노테이션을 이용하여 Guice로부터 의존성을 주입받을 수 있습니다.

결론

이제 Guice를 이용하여 서블릿의 설정과 바인딩을 처리하는 방법을 알아보았습니다. Guice를 활용하면 의존성 주입을 통해 유연하고 재사용 가능한 애플리케이션을 구축할 수 있습니다.

참고 자료