Spring boot에 간단하게 EhCache적용
카테고리: Spring
태그: @Cacheable
자주 바뀌는 값이 아닌 데이터는 서버단에서 캐시로 들고 있을 수 있다.
바뀌지 않는 데이터를 시간이 투자해 가지고 온다면 정작 중요한 데이터가 필요로 할때 시간지연을 겪을 수 있다.
EhCache 필요성
- 실시간으로 데이터를 반드시 반영해줘야 하는 경우가 아닐때
- 복잡한 쿼리를 실행 후 추출까지 빠르지 않을 때
- 위 두가지 상황에 해당된다면 스프링의 캐시라이브러리 어노테이션을 이용해서 쉽게 캐싱처리를 할 수 있다.
EHcache
- 자바 기반 캐시 오픈소스 기본 JVM메모리에 저장된다.
- 별도의 서버 설치 없이 사용할 수 있기에, 가볍게 사용하기 좋다.
- EHcache는 로컬캐시로서 특정 서버에 종속된다. → 따라서 멀티 서버 환경에서는 데이터 싱크가 필요하다. 장점 : 데이터 접근이 빠르다. 단점 : 동기화가 속도에 영향을 줄 수 있고, 데이터 유실 가능성이 있다.
초기설정
dependency추가
implementation "org.springframework.boot:spring-boot-starter-cache"
implementation "org.ehcache:ehcache:3.8.0"
implementation "javax.cache:cache-api:1.0.0"
Application에 어노테이션 추가
<img width="496" alt="image" src="https://user-images.githubusercontent.com/99777315/194708692-e4140abf-cdaf-4f2b-82d1-e717fbf4bb74.png">
ehcache.xml 설정
https://www.ehcache.org/documentation/3.3/getting-started.html
- 캐시를 하나를 사용할 때마다
를 구현해야 한다.
<cache alias="optionLists"> <!-- 캐시의 이름을 지정 -->
<key-type>java.lang.Object</key-type> <!-- Cache 인스턴스에 저장될 캐시의 키의 FQCN을 지정. 기본 값은 java.lang.Object -->
<value-type>java.lang.Object</value-type> <!-- value-type 요소는 Cache 인스턴스에 저장된 값의 FQCN을 지정. 기본 값은 java.lang.Object -->
<expiry> <!-- 캐시 만료기간 -->
<ttl unit="hours">12</ttl> <!-- 12시간이 지나면 만료되도록 설정함 -->
<!-- unit : days, hours, minutes, seconds, millis, micros, nanos -->
</expiry>
<!-- 캐시가 생성되고 삭제되는 이벤트를 모니터링 하고 싶을 때의 설정 -->
<listeners>
<listener>
<class>com.kakaopay.cube.common.CacheEventLogger</class>
<event-firing-mode>ASYNCHRONOUS</event-firing-mode>
<event-ordering-mode>UNORDERED</event-ordering-mode>
<events-to-fire-on>CREATED</events-to-fire-on>
<events-to-fire-on>EXPIRED</events-to-fire-on>
</listener>
</listeners>
<resources> <!-- 캐시 데이터의 저장 공간과 용량을 지정 -->
<heap unit="entries">2</heap> <!-- 2개의 캐시를 사용하도록 설정 -->
</resources>
</cache>
- resources는 캐시 데이터의 저장 공간과 용량을 지정한다.
-
: JVM 힙 메모리에 캐시 저장하도록 세팅 -
: JVM 힙 메모리 외부의 메모리에 캐시를 저장하도록 세팅 - 옵션
- unit=”entries” : 개수 지정
- unit=”MB” : 용량 지정
캐시의 개수나 용량을 늘리면
- 파라미터가 없으면 그냥 하나의 캐시에 하나만 저장하면 된다. → entries = 1
- 파라미터가 있으면 캐시 하나로 부족
- 캐시 개수나 용량을 늘리면 그거에 맞게 여러개의 파라미터에 대한 결과값이 저장된다.
이벤트 모니터링
- ehcache.xml에서 모니터링 설정을 했다면 아래 처럼 CacheEventLogger를 선언해서 사용할 수 있다 .
- 이때 CacheEventLogger는
내부 로 설정된 위치에 있어야 한다.
캐싱 처리
- 캐싱 처리를 하고 싶은 메소드 위에 @Cacheable만 설정해주면 된다.
- 이때, @Cacheable(cacheNames=캐시이름)에서 캐시이름은 ehcache.xml에서 alias로 설정한 이름
- @Cacheable는 캐시 저장 및 조회를 위한 어노테이션으로 처음 호출 됐을 때는 메소드 내부를 실행하고, 두 번째 부터는 메소드 내부를 실행하지 않고 캐시에서 값을 가져온다.
@Cacheable(cacheNames = "optionLists") public String getOptionLists() { }
캐시 저장 및 제거 스케줄링
- @Scheduled 어노테이션을 이용해서 캐시를 저장하고 제거하는 메소드를 스케줄링 할 수 있다
@Scheduled(cron = "0 50 7 * * *") public void deleteAllCache() { for (String cacheName : cacheManager.getCacheNames()) { Objects.requireNonNull(Objects.requireNonNull(cacheManager.getCache(cacheName))).clear(); } } @Scheduled(cron = "0 0 8 * * *") public void saveUserCountCache() { impalaAuProfileRepository.getTotalAu(format.format(new Date())); impalaAuProfileRepository.getTotalUser(format.format(new Date())); }
댓글남기기