[java] Tomcat에서의 캐싱과 세션 관리 방법

Tomcat은 인기있는 Java 웹 애플리케이션 서버이며, 많은 웹 애플리케이션에서 사용되고 있습니다. Tomcat은 캐싱과 세션 관리를 효과적으로 처리할 수 있는 다양한 기능을 제공합니다. 이 글에서는 Tomcat에서의 캐싱과 세션 관리 방법에 대해 알아보겠습니다.

1. 캐싱

1.1 정적 콘텐츠 캐싱

Tomcat은 정적 콘텐츠를 캐시하여 성능을 개선할 수 있습니다. 정적 콘텐츠는 웹 애플리케이션에서 자주 변경되지 않는 리소스입니다. 이러한 정적 콘텐츠를 캐싱하여 클라이언트가 요청할 때마다 서버에서 리소스를 가져오는 대신 캐시된 리소스를 제공할 수 있습니다.

Tomcat의 Context 엘리먼트 내에 Resources 엘리먼트를 추가하여 캐싱을 구성할 수 있습니다. 다음은 Context 엘리먼트의 예시입니다.

<Context>
    <Resources cachingAllowed="true" cacheMaxSize="100000" cacheObjectMaxSize="10000" />
</Context>

위의 예시에서는 cachingAllowed 속성을 true로 설정하여 캐싱을 활성화하고, cacheMaxSize 속성을 통해 캐시의 최대 크기를 설정합니다. 또한, cacheObjectMaxSize를 통해 캐시될 개별 리소스의 최대 크기를 설정할 수 있습니다.

1.2 동적 콘텐츠 캐싱

Tomcat은 동적 콘텐츠에 대해서도 캐싱을 제공합니다. 동적 콘텐츠는 웹 애플리케이션에서 동적으로 생성되는 리소스로, 매번 새로운 응답을 생성하는 것은 비효율적입니다. Tomcat은 Cache-Control 헤더를 사용하여 동적 콘텐츠를 캐싱할 수 있습니다.

다음 예시는 Cache-Control 헤더를 설정하는 Servlet 필터의 코드입니다.

public class CachingFilter implements Filter {
    
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletResponse httpResponse = (HttpServletResponse) response;
        httpResponse.setHeader("Cache-Control", "public, max-age=3600");
        chain.doFilter(request, response);
    }
    
    // ...
}

위의 예시에서는 Cache-Control 헤더에 public, max-age=3600 값을 설정하여 응답을 클라이언트에서 1시간 동안 캐시하도록 지시합니다.

2. 세션 관리

2.1 세션 저장소 변경

Tomcat은 세션 데이터를 서버의 메모리에 저장하는 기본 세션 저장소를 제공합니다. 그러나 많은 세션 데이터로 인해 메모리 부담이 커지는 경우, 외부 세션 저장소로 변경할 수 있습니다.

예를 들어, Redis를 사용하여 세션 데이터를 저장하고자 하는 경우, Tomcat의 context.xml 파일에 다음과 같이 설정할 수 있습니다.

<Context>
    <Valve className="org.apache.catalina.valves.RedisSessionHandlerValve" />
    <Manager className="org.apache.catalina.session.RedisSessionManager" host="localhost" port="6379" timeout="2000" maxInactiveInterval="60" />
</Context>

위의 예시에서는 RedisSessionHandlerValveRedisSessionManager 클래스를 사용하여 Redis를 세션 저장소로 설정합니다. host, port, timeout, maxInactiveInterval 등 필요한 설정을 추가로 지정할 수 있습니다.

2.2 세션 복제

Tomcat은 클러스터링 환경에서 세션을 복제하여 고가용성을 제공합니다. 클러스터링된 Tomcat 서버 간에 세션 정보를 공유하여, 어느 서버에서 요청을 처리하더라도 같은 세션 데이터를 사용할 수 있습니다.

클러스터링된 Tomcat 서버를 구성할 때는 server.xml 파일에서 Cluster 엘리먼트를 추가하고, BackupManager, SimpleTcpCluster 등의 관련 클래스와 필요한 설정을 지정합니다. 자세한 내용은 공식 Tomcat 문서를 참조하시기 바랍니다.

참고 자료