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
에 등록하고, ServletContext
에 Injector
를 저장하는 작업을 수행합니다.
바인딩(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를 활용하면 의존성 주입을 통해 유연하고 재사용 가능한 애플리케이션을 구축할 수 있습니다.
참고 자료
- Guice 공식 문서: https://github.com/google/guice
- ServletContextListener JavaDoc: https://docs.oracle.com/javaee/7/api/javax/servlet/ServletContextListener.html
- ServletModule JavaDoc: https://google.github.io/guice/api-docs/latest/javadoc/com/google/inject/servlet/ServletModule.html