본문 바로가기
프로그래밍이야기/Spring

[Spring ehcache] 로컬 캐시 라이브러리를 알아보자

by 사랑꾼이야 2021. 11. 10.
반응형

 

 

캐시(cache}

Cache는 나중에 요청올 결과를 미리 저장해두었다가 빠르게 서비스를 해주는 것을 의미한다.
자주 사용되는 기능을 cache를 이용해서 제공하면 향상된 성능 효과를 볼 수 있다.

Memory Hierarchy

  • Capacity(공간 사용) : core -> L1 cache -> L2 cache -> L3 cache -> Memory -> Disk
  • Latency(지연 시간) : Disk -> Memory -> L3 cache -> L2 cache -> L1 cache -> core

Cache 사용하는 곳

  • 사용빈도가 높은 단순 반복 작업
  • 결과가 자주 변경되지 않는 데이터

ehcache 설정

build.gradle

// ehcache
implementation 'org.springframework.boot:spring-boot-starter-cache'
implementation 'net.sf.ehcache:ehcache:2.10.6'
  • spring-boot-starter-cache
    • 캐시관련 설정을 편리하게 지원해주는 패키지, CacheManager, EhCacheManagerFactoryBean 지원
    • 기본 CacheManager로 ConcurrentHashMap 사용
  • ehcache
    • 기본 CacheManager로 ConcurrentHashMap에서 Ehcache 교체하기 위해 의존성 추가

ehcache.xml 설정

<ehcache>
   <diskStore path="java.io.tmpdir"/>

   <defaultCache
           maxEntriesLocalHeap="10000"
           maxEntriesLocalDisk="10000"
           eternal="false"
           timeToIdleSeconds="120"
           timeToLiveSeconds="120"
           diskExpiryThreadIntervalSeconds="120"
           memoryStoreEvictionPolicy="LRU"/>

   <cache name="promotionCache"
           maxEntriesLocalHeap="100000"
           maxEntriesLocalDisk="100000"
           eternal="false"
           timeToIdleSeconds="0"
           timeToLiveSeconds="3600"
           overflowToDisk="false"
           diskPersistent="false"
           diskExpiryThreadIntervalSeconds="3600"
           memoryStoreEvictionPolicy="LRU"/>

</ehcache>
  • <defaultCache> 태그
    • 소스안의 모든 캐시에 대한 정보를 저장하면 필수적으로 필요
    • 각 캐시별로 저장한다면 필요 없음
  • <cache> 태그
    • 각 캐시마다 필요한 태그로 분류해서 관리하는 목적
  • 설정 옵션
옵션 설명 기본값
maxEntriesLocalHeap 메모리에 생성될 최대 객체 갯수 0
maxEntriesLocalDisk 디스크에 생성될 최대 객체 갯수 0
eternal 저장될 캐시 삭제 설정 true로 설정 시 timeToIdleSeconds, timeToLiveSeconds 설정 무시됨 false
timeToIdleSeconds 해당 초가 지나면 캐시 삭제 0
timeToLiveSeconds 해당 초 동안 캐시가 사용되지 않으면 캐시 삭제 0
overflowToDisk 오버플로우된 항목에 대해 disk에 저장할 지 여부 false
diskPersistent 캐시를 disk에 저장하여, 서버 로드 시 캐시를 false
diskExpiryThreadIntervalSeconds Disk Expiry 스레드의 작업 수행 간격 0
memoryStoreEvictionPolicy 객체 갯수가 maxEntriesLocalHeap에 도달하면 객체를 제거하고 새로 추가하는 정책 LRU
memoryStoreEvictionPolicy
  • LRU(Least Recently Used) : 가장 오랫동안 호출되지 않은 캐시를 삭제
  • LFU(Least Frequently Used) : 호출 빈도가 가장 적은 캐시를 삭제
  • FIFO(First In First Out) : 캐시가 생성된 순서대로 가장 오래된 캐시를 삭제

configuration

@Configuration
public class CacheConfiguration {

    @Bean
    public EhCacheManagerFactoryBean ehCacheManagerFactory() {
        EhCacheManagerFactoryBean cacheManagerFactoryBean = new EhCacheManagerFactoryBean();
        cacheManagerFactoryBean.setConfigLocation(new ClassPathResource("ehcache.xml"));
        cacheManagerFactoryBean.setShared(true);

        return cacheManagerFactoryBean;
   }

    @Bean
    public EhCacheCacheManager ehCacheCacheManager() {
        EhCacheCacheManager cacheManager = new EhCacheCacheManager();
        cacheManager.setCacheManager(ehCacheManagerFactory().getObject());
        cacheManager.setTransactionAware(true);

        return cacheManager;
   }
}

사용할 service의 추가

@Cacheable(cacheNames = "promotionCache", key = "#request.itmeId")
public Response getItem(Request request)
  • @Cacheable(cacheNames = "promotionCache", key = "#request.accountNum")
    • ehcache.xml에서 지정한 promotionCache 캐시를 사용하겠다는 의미이다.
    • 여기서 key는 메소드 argument인 request.itemId 사용하겠다는 의미이다.
    • request.itemId에 따라 별도로 캐시한다는 의미이다.
    • promotionCache 메소드의 argument에 따라 캐시되기 때문에 request.itemId의 캐시 여부를 체크한다.
    • 캐시 안되어 있을 경우 캐시를 하고, 있으면 캐시 내용을 전달한다.
반응형

댓글