[java] Guice를 사용한 쿠키 처리

Guice는 자바의 의존성 주입(Dependency Injection) 프레임워크로, 객체 간의 의존성을 관리하고 객체 생성을 자동화하는데 도움을 줍니다. 이번 글에서는 Guice를 사용하여 쿠키를 처리하는 방법을 알아보겠습니다.

의존성 주입(Dependency Injection)

의존성 주입은 객체가 다른 객체에 의존할 때, 해당 객체를 직접 생성하거나 관리하지 않고 외부에서 주입받는 방식입니다. 이를 통해 객체 간의 결합도를 낮출 수 있으며 유연하고 테스트하기 좋은 코드를 작성할 수 있습니다. Guice는 이러한 의존성 주입을 지원해줍니다.

Guice 설정하기

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

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

쿠키 클래스 생성하기

쿠키를 처리하기 위해 CookieHandler 클래스를 작성해보겠습니다. 이 클래스는 Guice의 ServletModule을 확장하여 구현됩니다.

import com.google.inject.servlet.ServletModule;
import javax.servlet.http.Cookie;

public class CookieHandler extends ServletModule {

    @Override
    protected void configureServlets() {
        serve("/set-cookie").with(SetCookieServlet.class);
        serve("/get-cookie").with(GetCookieServlet.class);
    }

    @Provides
    @Singleton
    public Cookie provideCookie() {
        return new Cookie("myCookie", "example-value");
    }
}

위의 코드에서 configureServlets 메소드에서 /set-cookie URL에는 SetCookieServlet, /get-cookie URL에는 GetCookieServlet을 매핑하고 있습니다. provideCookie 메소드는 Cookie 객체를 제공하며, @Singleton 어노테이션으로 싱글턴 객체임을 명시합니다.

서블릿 생성하기

SetCookieServletGetCookieServlet은 각각 HttpServlet을 상속받은 서블릿 클래스입니다. SetCookieServlet은 쿠키를 설정하는 역할을 하고, GetCookieServlet은 설정된 쿠키의 값을 가져오는 역할을 하게 됩니다. 이러한 서블릿들을 구현해보겠습니다.

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class SetCookieServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        Cookie cookie = new Cookie("myCookie", "example-value");
        resp.addCookie(cookie);
        resp.getWriter().println("Cookie set successfully!");
    }
}

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class GetCookieServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        Cookie[] cookies = req.getCookies();
        if (cookies != null) {
            for (Cookie cookie : cookies) {
                if (cookie.getName().equals("myCookie")) {
                    resp.getWriter().println("Cookie value: " + cookie.getValue());
                    return;
                }
            }
        }
        resp.getWriter().println("No cookie found!");
    }
}

Guice 모듈 등록하기

마지막으로 GuiceInitializer 클래스를 작성해 Guice 모듈을 등록하고 서블릿 컨텍스트에 Guice를 초기화합니다.

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

public class GuiceInitializer extends GuiceServletContextListener {

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

위의 코드에서 CookieHandler를 Guice의 createInjector 메소드에 전달하여 Guice 모듈을 등록합니다.

실행하기

이제 프로젝트를 빌드하고 애플리케이션을 실행해보세요. /set-cookie URL에 접속하면 쿠키가 설정되고, /get-cookie URL에 접속하면 설정된 쿠키의 값을 확인할 수 있습니다.

결론

이번 글에서는 Guice를 사용하여 쿠키를 처리하는 방법을 알아보았습니다. Guice를 사용하면 객체 간의 의존성을 관리하고 객체 생성을 자동화하는데 편리함을 제공합니다. 쿠키 처리뿐만 아니라 다양한 기능을 Guice를 활용하여 개발할 수 있습니다.