[java] Guice를 활용한 서블릿 세션 타임아웃(Timeout) 설정

서블릿 기반의 웹 애플리케이션을 개발할 때, 세션 타임아웃(Timeout) 설정은 중요한 요소 중 하나입니다. 세션 타임아웃이란 일정 시간 동안 사용자가 액션을 취하지 않으면 세션을 만료시키는 것을 말합니다.

이 글에서는 Guice를 사용하여 서블릿 세션 타임아웃을 설정하는 방법을 알아보겠습니다.

Guice란?

Guice는 자바 기반의 의존성 주입(Dependency Injection) 프레임워크입니다. Guice를 사용하면 개발자가 직접 객체 간의 의존성을 관리할 필요 없이, Guice가 자동으로 의존성을 주입해줍니다. Guice는 간단하고 가볍기 때문에 많은 개발자들이 선호하는 프레임워크입니다.

Guice를 활용한 서블릿 세션 타임아웃 설정 방법

  1. 의존성 주입 설정
  public class MyAppModule extends AbstractModule {
      @Override
      protected void configure() {
          bind(SessionListener.class).asEagerSingleton();
          bind(SessionTimeoutFilter.class).asEagerSingleton();
      }
  }

Guice를 사용하기 위해 MyAppModule 클래스를 생성하고 AbstractModule을 상속받습니다. configure() 메소드에서 세션 리스너와 세션 타임아웃 필터를 바인딩합니다. asEagerSingleton() 메소드를 사용하여 eager singleton으로 등록하면, 애플리케이션의 시작 시점에 객체가 생성되어 주입됩니다.

  1. 세션 리스너 생성
  public class SessionListener implements HttpSessionListener {
      private static final int SESSION_TIMEOUT_MINUTES = 30;

      @Override
      public void sessionCreated(HttpSessionEvent se) {
          se.getSession().setMaxInactiveInterval(SESSION_TIMEOUT_MINUTES * 60);
      }

      @Override
      public void sessionDestroyed(HttpSessionEvent se) {
          // 세션 종료 시 처리할 로직 작성
      }
  }

HttpSessionListener를 구현한 SessionListener 클래스를 생성합니다. sessionCreated() 메소드에서 세션의 만료 시간을 설정합니다. 이 예제에서는 30분을 세션 타임아웃으로 설정했습니다. sessionDestroyed() 메소드에서는 세션이 종료될 때 추가적인 로직을 처리할 수 있습니다.

  1. 세션 타임아웃 필터 생성
  public class SessionTimeoutFilter implements Filter {
      @Override
      public void init(FilterConfig filterConfig) throws ServletException {
      }

      @Override
      public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
              throws IOException, ServletException {
          HttpServletRequest httpServletRequest = (HttpServletRequest) request;
          HttpSession httpSession = httpServletRequest.getSession();

          if (httpSession != null) {
              httpSession.setMaxInactiveInterval(SESSION_TIMEOUT_MINUTES * 60);
          }

          chain.doFilter(request, response);
      }

      @Override
      public void destroy() {
      }
  }

Filter 인터페이스를 구현한 SessionTimeoutFilter 클래스를 생성합니다. doFilter() 메소드에서 현재 요청의 세션을 가져와 세션의 만료 시간을 설정합니다. 해당 필터를 사용하면 모든 요청에서 세션 타임아웃이 적용됩니다.

  1. Guice를 통한 세션 타임아웃 설정
  public class MyServletModule extends ServletModule {
      @Override
      protected void configureServlets() {
          serve("/*").with(MyServlet.class);

          filter("/*").through(SessionTimeoutFilter.class);
      }
  }

MyServletModule 클래스를 생성하고 ServletModule을 상속받습니다. configureServlets() 메소드에서 서블릿과 필터를 설정합니다. serve() 메소드를 사용하여 특정 URL 패턴에 MyServlet을 매핑하고, filter() 메소드를 사용하여 모든 요청에 SessionTimeoutFilter를 적용합니다.

  1. 사용 예시
  public class MyServlet extends HttpServlet {
      @Override
      protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
          HttpSession session = req.getSession();
          // 세션 사용 예시
      }
  }

마지막으로, MyServlet 클래스를 생성합니다. 여기서는 간단한 doGet() 메소드만 작성했지만, 여기에 세션을 사용하는 로직을 추가할 수 있습니다.

결론

이번 글에서는 Guice를 사용하여 서블릿 세션 타임아웃 설정하는 방법을 알아보았습니다. Guice는 의존성 주입 프레임워크로서 가볍고 간편한 사용법을 제공합니다. 세션 타임아웃은 보안과 리소스 관리를 위해 중요한 요소이므로, 개발 시 적절한 타임아웃 값을 설정해야 합니다.

참고자료