[java] Guice를 사용하여 Java 서블릿에서 세션 공간 관리하기

Guice는 Java에서 의존성 주입(Dependency Injection)을 구현하는 도구로, 코드의 유연성과 재사용성을 향상시킬 수 있습니다. 이번 글에서는 Guice를 사용하여 Java 서블릿에서 세션 공간을 관리하는 방법에 대해 알아보도록 하겠습니다.

세션 공간이란?

세션 공간은 클라이언트와 서버 간의 상태를 유지하기 위한 공간입니다. 클라이언트가 서버에 접속한 후 세션을 열면, 서버는 클라이언트에 대한 고유한 세션 ID를 생성하고 해당 ID에 대응하는 세션 공간을 생성합니다. 이후 클라이언트가 요청을 보낼 때마다 해당 세션 ID를 서버에 전달하여, 클라이언트의 상태를 유지합니다.

Guice를 사용한 세션 공간 관리

  1. Guice 설정 파일 작성

    Guice를 사용하기 위해, 먼저 Guice 설정 파일을 작성해야 합니다. ServletModule 클래스를 상속받은 모듈 클래스를 생성하고, configure() 메소드를 오버라이딩하여 세션 관련 설정을 추가합니다.

    import com.google.inject.servlet.ServletModule;
    
    public class ExampleModule extends ServletModule {
        @Override
        protected void configureServlets() {
            // 세션 관리 필터 설정
            filter("/*").through(SessionFilter.class);
    
            // 세션 관리 서블릿 설정
            serve("/session/*").with(SessionServlet.class);
        }
    }
    
  2. 세션 필터 생성

    Guice에서는 Filter를 사용하여 요청 전후에 특정 작업을 수행할 수 있습니다. 세션 관리를 위해 SessionFilter라는 필터 클래스를 생성하고, doFilter() 메소드에서 세션 공간을 관리합니다.

    import com.google.inject.Inject;
    import javax.servlet.*;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    import java.io.IOException;
    
    public class SessionFilter implements Filter {
    
        @Inject
        private SessionManager sessionManager;
    
        public void init(FilterConfig filterConfig) throws ServletException {
            // 필요한 초기화 작업 수행
        }
    
        public void destroy() {
            // 필터 종료 시 수행할 작업
        }
    
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
                throws IOException, ServletException {
            HttpServletRequest httpRequest = (HttpServletRequest) request;
            HttpServletResponse httpResponse = (HttpServletResponse) response;
    
            HttpSession session = httpRequest.getSession();
            sessionManager.setCurrentSession(session);
    
            // 다음 필터 또는 서블릿으로 요청 전달
            chain.doFilter(httpRequest, httpResponse);
    
            // 요청 처리 후 세션 정리
            sessionManager.clearCurrentSession();
        }
    }
    
  3. 세션 서블릿 생성

    Guice에서는 HttpServlet을 상속받은 서블릿 클래스를 생성하여 세션과 관련된 작업을 수행할 수 있습니다. SessionServlet라는 서블릿 클래스를 생성하고, doGet() 메소드에서 세션 데이터에 접근하는 예제를 보겠습니다.

    import com.google.inject.Inject;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    import java.io.IOException;
    
    public class SessionServlet extends HttpServlet {
    
        @Inject
        private SessionManager sessionManager;
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response)
                throws IOException {
            String sessionId = sessionManager.getCurrentSession().getId();
    
            response.getWriter().println("현재 세션 ID: " + sessionId);
        }
    }
    
  4. 세션 매니저 생성

    마지막으로, SessionManager라는 클래스를 생성하여 세션 공간을 관리합니다. 이 클래스는 Guice로 DI 되어 필요한 곳에서 세션에 접근할 수 있게 해줍니다.

    import javax.servlet.http.HttpSession;
    
    public class SessionManager {
    
        private ThreadLocal<HttpSession> currentSession = new ThreadLocal<>();
    
        public void setCurrentSession(HttpSession session) {
            currentSession.set(session);
        }
    
        public HttpSession getCurrentSession() {
            return currentSession.get();
        }
    
        public void clearCurrentSession() {
            currentSession.remove();
        }
    }
    

결론

이렇게 Guice를 사용하여 Java 서블릿에서 세션 공간을 관리하는 방법에 대해 알아보았습니다. Guice는 의존성 주입을 통해 코드의 가독성과 유지보수성을 향상시킬 수 있는 강력한 도구입니다. 세션 공간을 효율적으로 관리하고 다양한 기능을 추가하여 웹 애플리케이션을 개발할 수 있습니다.

참고 자료