Search
Duplicate

[JAVA] Ehcache 사용방법 (1)

순서
4
날짜
2022/11/17
사람
상태
Done
오늘은 카테고리 작업을 하면서 요청사항으로, 캐시 업데이트 시간을 빠르게 단축해달라는 요청사항을 받았다. 캐싱 관련돼서 세팅을 해본 적이 따로 없어서 어디서부터 어디까지 작업을 해야 될지 몰랐는데, 배우게 돼서 작성하게 되었다.
Spring에서 캐싱 작업은 보통 Echache를 사용한다.
사용하는 이유로는 거의 변경되지 않는 DB의 값을 메모리 혹은 디스크에 보관하다가 호출되었을 때 DB를 조회하지 않고 메모리 혹은 디스크에서 조회해서 값을 노출한다. 이렇게 사용하게 될 시 DB의 부하는 줄일 수 있으며, 조회속도는 올릴 수 있는 장점이 있다. 하지만 실시간으로 변경이 안된다는 단점이 있다.
<?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"> <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd" updateCheck="false"> <diskStore path="java.io.tmpdir" /> <cache name="getCategoryCache" maxEntriesLocalHeap="1000" maxEntriesLocalDisk="10000" eternal="false" diskSpoolBufferSizeMB="20" timeToIdleSeconds="1800" timeToLiveSeconds="1800" memoryStoreEvictionPolicy="LFU" transactionalMode="off"> <persistence strategy="localTempSwap" /> </cache> </ehcache>
Java
복사
property
desc
maxEntriesLocalHeap
힙 메모리 양
maxEntriesLocalDisk
로컬디스크에 유지될 최대 객체수
eternal
시간정에 대한 무시 설정
diskSpoolBufferSizeMB
디스크 캐시에 쓰기 모드로 들어갈때, 사용될 비동기 모드 스풀 버퍼 크기 설정 , OutOfMemory 에러가 발생 시 수치를 낮추도록 한다.
timeToIdleSeconds
다음 시간 동안 유휴상태(Idle) 후 갱신 할 지 설정
timeToLiveSeconds
다음 갱신 하기 까지 캐쉬가 유지 되는 시간 (0이면 만료시간을 지정하지 않는다고 보고 유지 되지 않음, default: 0)
memoryStoreEvictionPolicy
객체의 갯수가 설정된 maxElementsInMemory에 도달 했을 경우 메모리에서 객체들을 어떤게 제거 할지 에 대한 제거 알고리즘
FIFO:First In First Out LFU Least Frequently Used. LRU Least Recently Used.
transactionalMode
copyOnRead , copyOnWrite 시 트렉젝션 모드를 설정
사용방법
Spring Boot에서 Ehcache를 사용하기 위해서는 @EnableCaching을 @Configuration에 추가한다.
@Configuration @EnableCaching public class CacheConfiguration { @Bean public CacheManager cacheManager() { EhCacheManagerFactoryBean cacheManagerFactoryBean = new EhCacheManagerFactoryBean(); // ehcache 설정 정보를 담은 xml 위치 cacheManagerFactoryBean.setConfigLocation(new ClassPathResource("ehcache.xml")); // cachemanager의 싱글톤 여부를 지정하는 값으로 true로 설정시 만약 기존 cachemanager가 존재하지 않을 경우 새로 생성 cacheManagerFactoryBean.setShared(true); return cacheManagerFactoryBean; } @Bean EhCacheCacheManager ehCacheCacheManager(EhCacheManagerFactoryBean ehCacheManagerFactoryBean) { EhCacheCacheManager ehCacheCacheManager = new EhCacheCacheManager(); ehCacheCacheManager.setCacheManager(ehCacheManagerFactoryBean.getObject()); return ehCacheCacheManager; } }
Java
복사
cacheManger를 커스터마이징 하고 싶다면 아래와 같이 CacheManagerCustomizer의 인터페이스를 상속해서 구현한다음 Bean 으로 등록한다.
@Component public class CustomCacheManger implements CacheManagerCustomizer<ConcurrentMapCacheManager> { @Override public void customize(ConcurrentMapCacheManager cacheManager) { cacheManager.setAllowNullValues(false); } }
Java
복사
사용할 Service에 @Cacheable 추가.
@Cacheable(value="getCategoryCache", key="#using") public List<Category> getCategories(Using using) { ... return; }
Java
복사
@Cacheable(cacheNames = "getCategoryCache", key = "#using")
ehcache.xml에서 지정한 getCategoryCache 캐시를 사용
key는 메소드 argument인 using사용하겠다는 의미
using에 따라 별도로 캐시
getCategoryCache 메소드의 argument에 따라 캐시되기 때문에 using의 캐시 여부를 체크한다.
캐시가 있으면 내용을 전달하고, 없으면 캐시를 진행한다.