gradle 환경에서 EhCache를 이용한 캐시 적용

smlee·2023년 5월 5일
0

SpringBoot - JPA

목록 보기
8/8
post-thumbnail

외주 프로젝트를 하며 ehCache를 처음 적용하여 몇몇 api들에 대해 TPS를 늘렸다. 따라서 ehCache 적용에 대해 정리해보려고 한다.

💻 EhCache란

EhCache는 현재 버전 2와 3이 있다. 버전 3의 경우, JSR-107과의 호환성이 좋아졌고, javax.cache 지원 등으로 ehcache 2보다 좀 더 발전했다.

ehcache에서는 기본적으로 serialize를 제공해 별도의 serialize를 구현하지 않아도 된다. 하지만, ehcache 3에서는 기본 serialize를 제공하는 타입이 그렇게 많지 않다. 따라서 사용하려면 저장할 데이터에 대해 serialize를 구현해야 한다는 단점이 있다.

1. build.gradle 설정

implementation 'net.sf.ehcache:ehcache'

를 dependencies에 추가하여 EhCache를 사용할 수 있도록 한다.
위 버전은 serialize를 구현하지 않아도 되는 EhCache 버전2이다.

2. ehcache.xml 파일 설정

src/main/resources 디렉터리에 ehcache.xml 파일을 설정하여 EhCache의 설정 값을 지정한다.

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
         updateCheck="false">
    <diskStore path="java.io.tmpdir"/>
    <defaultCache
            maxElementsInMemory="10000"
            eternal="false"
            timeToIdleSeconds="120"
            timeToLiveSeconds="120"
            overflowToDisk="true"
            maxElementsOnDisk="10000000"
            diskPersistent="false"
            diskExpiryThreadIntervalSeconds="120"
            memoryStoreEvictionPolicy="LRU"/>
    <cache name="findByBestCategoryCache"
           maxEntriesLocalHeap="10000"
           maxEntriesLocalDisk="1000"
           eternal="false"
           diskSpoolBufferSizeMB="20"
           timeToIdleSeconds="300" timeToLiveSeconds="600"
           memoryStoreEvictionPolicy="LFU"
           transactionalMode="off">
        <persistence strategy="localTempSwap"/>
    </cache>
</ehcache>

이거는 필자가 적용한 ehCache이지만, 밑의 표를 참고하여 프로젝트에 맞게 설정하면 된다.

3. application.yml에 ecache.xml 등록

spring:
  cache:
    ehcache:
      config:
        classpath: ehcache.xml

spring 블록 단에서 위의 config를 등록한다.

4. config 파일 작성하여 bean으로 등록

@Configuration
@EnableCaching
public class EhCacheConfig{

    @Bean
	public EhCacheManagerFactoryBean ehCacheManagerFactoryBean() {
        EhCacheManagerFactoryBean ehCacheManagerFactoryBean = new EhCacheManagerFactoryBean();
        ehCacheManagerFactoryBean.setConfigLocation(new ClassPathResource("ehcache.xml"));
        ehCacheManagerFactoryBean.setShared(true);
        return ehCacheManagerFactoryBean;
    }

    @Bean
	public EhCacheCacheManager ehCacheCacheManager(EhCacheManagerFactoryBean ehCacheManagerFactoryBean) {
        EhCacheCacheManager ehCacheCacheManager = new EhCacheCacheManager();
        ehCacheCacheManager.setCacheManager(ehCacheManagerFactoryBean.getObject());
        return ehCacheCacheManager;
    }
}

EhCache를 사용할 수 있도록 EhCacheManagerFactoryBean과 EhCacheCacheManger를 Bean으로 등록하는 작업을 거친다.

위의 5가지 설정이 완료되었다면, @Cachable@CacheEvict를 사용하여 EhCache를 이용하면 된다.

0개의 댓글