[java] Guice를 사용한 Java 서블릿 구현 방법

이번 포스트에서는 Google Guice를 사용하여 Java 서블릿을 구현하는 방법에 대해 알아보겠습니다.

Guice는 경량의 의존성 주입(Dependency Injection) 프레임워크로써, 객체 간의 의존성 관리를 간편하게 할 수 있게 도와줍니다. 서블릿에서도 Guice를 사용하여 의존성 주입을 통해 코드의 유연성과 테스트 용이성을 높일 수 있습니다.

Guice 설정

먼저, Maven 또는 Gradle과 같은 빌드 도구를 사용하여 Guice를 프로젝트에 추가합니다. 다음은 Maven을 사용하는 경우의 예시입니다.

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

다음으로, Guice의 ServletContextListener를 구현하여 Guice를 설정합니다. 다음은 MyGuiceServletContextListener라는 클래스를 만드는 예시입니다.

import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.servlet.GuiceServletContextListener;

public class MyGuiceServletContextListener extends GuiceServletContextListener {

    @Override
    protected Injector getInjector() {
        return Guice.createInjector(new MyModule());
    }
}

위 코드에서 MyModule은 Guice가 사용할 모듈을 정의한 클래스입니다. 이 클래스에서 필요한 의존성 바인딩과 구성 정보를 제공합니다. 예를 들어, MyModule 클래스에서 bind(Foo.class).to(FooImpl.class)와 같이 바인딩을 정의할 수 있습니다.

서블릿 구현

서블릿을 구현할 때는 @WebServlet 애너테이션을 사용하여 Guice가 서블릿을 관리하도록 설정합니다. @Inject 애너테이션을 사용하여 필요한 의존성을 주입받을 수 있습니다.

다음은 MyServlet이라는 Guice로 관리되는 서블릿 클래스의 예시입니다.

import javax.inject.Inject;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/my-servlet")
public class MyServlet extends HttpServlet {

    @Inject
    private Foo foo;

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // ...
    }
}

위 코드에서 FooMyModule에서 바인딩한 클래스를 의존성으로 주입받는 예시입니다.

서블릿 등록

마지막으로, web.xml 파일에 MyGuiceServletContextListenerMyServlet을 등록합니다.

<web-app>
    <listener>
        <listener-class>com.example.MyGuiceServletContextListener</listener-class>
    </listener>
  
    <servlet>
        <servlet-name>MyServlet</servlet-name>
        <servlet-class>com.example.MyServlet</servlet-class>
    </servlet>
  
    <servlet-mapping>
        <servlet-name>MyServlet</servlet-name>
        <url-pattern>/my-servlet</url-pattern>
    </servlet-mapping>
</web-app>

위와 같이 설정하면 Guice가 MyGuiceServletContextListener를 시작할 때 Guice의 주입기(Injector)가 생성되며, MyServlet은 Guice가 관리하는 서블릿으로 등록됩니다.

이제 Guice를 사용하여 Java 서블릿을 구현하는 방법을 알게 되었습니다. Guice를 사용하면 의존성 주입을 통한 유연성과 테스트 용이성을 얻을 수 있으며, 코드를 더욱 깔끔하게 유지할 수 있습니다.

참고 자료