외주 프로젝트를 하며 ehCache를 처음 적용하여 몇몇 api들에 대해 TPS를 늘렸다. 따라서 ehCache 적용에 대해 정리해보려고 한다.
EhCache는 현재 버전 2와 3이 있다. 버전 3의 경우, JSR-107과의 호환성이 좋아졌고, javax.cache 지원 등으로 ehcache 2보다 좀 더 발전했다.
ehcache에서는 기본적으로 serialize를 제공해 별도의 serialize를 구현하지 않아도 된다. 하지만, ehcache 3에서는 기본 serialize를 제공하는 타입이 그렇게 많지 않다. 따라서 사용하려면 저장할 데이터에 대해 serialize를 구현해야 한다는 단점이 있다.
implementation 'net.sf.ehcache:ehcache'
를 dependencies에 추가하여 EhCache를 사용할 수 있도록 한다.
위 버전은 serialize를 구현하지 않아도 되는 EhCache 버전2이다.
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이지만, 밑의 표를 참고하여 프로젝트에 맞게 설정하면 된다.
spring:
cache:
ehcache:
config:
classpath: ehcache.xml
spring 블록 단에서 위의 config를 등록한다.
@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를 이용하면 된다.