이직 후 소스 분석 중 Ehcache 라이브러리를 사용한다는 것을 알게 되었습니다.
추후 다른 프로젝트에서도 자주 사용하게 될 것으로 판단 되어
공식홈페이지를 보다 매력을 느끼게 되어 정리 해보려고 합니다.
( 해당 글은 1.4.0 버전 기준으로 작성 되었습니다.
글 작성 기준 Ehcache 2.10.9.2 / Ehcache 3.10 릴리즈 되었으니
하기 Reference 블럭에 공식 문서를 참고하시기 바랍니다.)
* cache는 거의 변경될 여지가 없는 DB 조회 결과값을 메모리 혹은 디스크에 보관하고 있다가 다시 호출되었을때는 DB 조회를 하지 않고 메모리에 있는 결과값을 그대로 사용하고자 할 때 사용 됩니다.
0. ehcache 란?
Ehcache는 성능을 높이고 데이터베이스를 오프로드하며 확장성을 단순화하는 오픈 소스 표준 기반 캐시입니다.
강력하고 입증되었으며 모든 기능을 갖추고 있으며 다른 인기 있는 라이브러리 및 프레임워크와 통합되기 때문에 가장 널리 사용되는 Java 기반 캐시입니다.
Ehcache는 프로세스 내 캐싱에서 테라바이트 크기의 캐시가 있는 혼합 프로세스 내/외부 프로세스 배포까지 확장됩니다
* 라이센스 : 아파치 2.0
1. ehcache 환경 설정
pom.xml
<!-- https://mvnrepository.com/artifact/net.sf.ehcache/ehcache -->
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>1.4.0</version>
</dependency>
CacheManager 기본생성자 또는 팩토리메서드가 호출되면 ehcache는 클래스 경로의 최상위 수준에서 ehcache.xml이라는 파일을 찾습니다.
ehcache.xml
<ehcache>
<!-- 참고1 -->
<diskStore path="c:/test/" />
<!-- 참고2 -->
<cacheManagerEventListenerFactory class="" properties=""/>
<cacheManagerPeerProviderFactory
class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
properties="peerDiscovery=automatic,
multicastGroupAddress=230.0.0.1,
multicastGroupPort=4446,
timeToLive=1"
propertySeparator=","
/>
<!-- 참고3 -->
<cache
name="testCache"
maxElementsInMemory="0"
overflowToDisk="true"
eternal="false"
memoryStoreEvictionPolicy="LRU"
timeToIdleSeconds="10"
timeToLiveSeconds="15"
diskPersistent="false"
/>
</ehcache>
[참고1]
<diskStore path="c:/test/" />
캐시 파일이 생성되는 디렉토리 경로를 설정합니다.
경로가 Java 시스템 속성인 경우 실행중인 VM에서 해당 값으로 대체됩니다.
다음 속성이 변환됩니다. *user.home ‑ 사용자의 홈 디렉토리 *user.dir‑
사용자의 현재 작업 디렉토리 *java.io.tmpdir ‑ 기본 임시 파일 경로
속성 아래에 하위 디렉토리를 지정할 수 있습니다(예: java.io.tmpdir/one).
<diskStore Path="java.io.tmpdir"/>
[참고2]
CacheManager에서 캐시가 추가되거나 제거될 때 알림을 받는 CacheManagerPeerProvider를 만드는 데 사용되는 CacheManagerEventListenerFactory를 지정합니다.
CacheManagerEventListenerFactory의 속성은 다음과 같습니다.
* class ‑ 완전한 팩토리 클래스 이름
* properties ‑ 팩토리에만 의미가 있는 쉼표로 구분된 속성.
CacheManager 이벤트 리스너로 등록할 정규화된 클래스 이름을 설정합니다.
이벤트에는 다음이 포함됩니다. * 캐시추가 *캐시제거
리스너 메서드에 대한 콜백은 동기식이며 동기화되지 않습니다. 청취자가 수행하는 작업에 따라 잠재적인 성능 및 스레드 안전 문제를 안전하게 처리하는 것은 구현자의 책임입니다.
클래스를 지정하지 않으면 수신기가 생성되지 않습니다. 기본값은 없습니다.
클러스터에서 다른 CacheManager를 검색하는 CacheManagerPeerProvider를 만드는 데 사용할 CacheManagerPeerProviderFactory를 지정합니다.
cacheManagerPeerProviderFactory의 속성은 다음과 같습니다.
* class ‑ 완전한 팩토리 클래스 이름
* properties ‑ 팩토리에만 의미가 있는 쉼표로 구분된 속성.
Ehcache는 클러스터에 참여하는 CacheManager 피어를 검색하는 두 가지 방법이 있는 내장 RMI 기반 배포 시스템과 함께 제공됩니다. * 자동, 멀티캐스트 그룹 사용. 이것은 피어를 자동으로 발견 하고 감지합니다.
(동료가 그룹에 들어오고 나가는 것과 같은 변화)
* 수동, 수동 rmiURL 구성 사용. 피어의 하드코딩된 목록은 구성 시 제공됩니다.
자동 검색 구성:
자동 검색은 다음 예에 따라 구성됩니다.
<cacheManagerPeerProviderFactory
class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory" 속성="peerDiscovery=자동, multicastGroupAddress=230.0.0.1,
multicastGroupPort=4446, timeToLive=32"/>
유효한 속성은 다음과 같습니다.
- * peerDiscovery(필수) ‑ "자동" 지정
- * multicastGroupAddress(필수) ‑ 유효한 멀티캐스트 그룹 주소 지정
- * multicastGroupPort(필수) ‑ 멀티캐스트 하트비트용 전용 포트 지정 트래픽
- * timeToLive ‑ 패킷이 전송될 거리를 결정하는 0에서 255 사이의 값을 지정합니다.
규칙에 따라 제한 사항은 다음과 같습니다.
0 ‑ 같은 호스트
1 ‑ 같은 서브넷
32 ‑ 같은 사이트
64 ‑ 같은 지역
128 ‑ 같은 대륙
255 ‑ 무제한
수동 검색 구성:
수동 검색은 다음 예에 따라 구성됩니다.
<cacheManagerPeerProviderFactory class=
"net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
properties="peerDiscovery=manual,
rmiUrls=//server1:40000/sampleCache1|//server2:40000/sampleCache1
| //server1:40000/sampleCache2|//server2:40000/sampleCache2"
propertySeparator="," />
유효한 속성은 다음과 같습니다.
- * peerDiscovery(필수) ‑ "manual" 지정
- * rmiUrls(필수) ‑ 파이프로 구분된 rmiUrls 목록 을 //hostname:port 형식으로 지정합니다.
호스트 이름은 원격 CacheManager 피어의 호스트 이름입니다. 포트는 원격 CacheManager 피어의 RMICacheManagerPeerListener의 청취 포트입니다.
[참고3]
name : 캐시의 이름을 설정합니다. 캐시를 식별하는데 사용됩니다. 고유해야 합니다.
maxElementsInMemory : 메모리에 생성될 최대 개체 수를 설정합니다.
maxElementsOnDisk : DiskStore에서 유지 관리할 최대 개체 수를 설정합니다. 기본값은 0이며 무제한을 의미합니다.
eternal : 요소가 영원한지 여부를 설정합니다. 영원한 경우 제한 시간이 무시되고 요소가 만료되지 않습니다.
overflowToDisk : 메모리 저장소가 maxInMemory 제한에 도달했을 때 요소가 디스크로 오버플로될 수 있는지 여부를 설정합니다. 다음 특성 및 요소는 선택 사항입니다.
timeToIdleSeconds : 요소가 만료되기 전에 유휴 시간을 설정합니다. 즉, 요소가 만료되기 전에 액세스 사 이의 최대 시간은 요소가 영원하지 않은 경우에만 사용됩니다. 선택적 속성입니다. 값 0은 요소가 무한대로 유휴 상태일 수 있음을 의미합니다. 기본값은 0입니다.
timeToLiveSeconds : 만료되기 전에 요소의 수명을 설정합니다. 즉 생성 시간과 요소가 만료되는 시간 사이의 최대 시간입니다. 요소가 영원하지 않은 경우에만 사용됩니다. 선택적 속성입니다. 0값은 요소가 무한대로 살 수 있음을 의미합니다. 기본값은 0입니다.
diskPersistent : 가상 머신을 다시 시작하는 사이에 디스크 저장소가 지속되는지 여부. 기본값은 거짓입니다.
diskExpiryThreadIntervalSeconds : 디스크 만료 스레드 실행사이의 시간(초)입니다. 기본값은 120초입니다.
diskSpoolBufferSizeMB : 스풀 버퍼에 DiskStore를 할당하기 위한 크기입니다. 이 영역에 쓴 다음 비동기적으로 디스크에 씁니다. 기본 크기는 30MB입니다. 각 스풀 버퍼는 해당 캐시에서만 사용됩니다. OutOfMemory 오류가 발생하면 이 값을 낮추는 것이 좋습니다. DiskStore 성능을 개선하려면 성능을 높이는 것이 좋 습니다. DiskStore의 추적 수준 로깅은 백업이 발생하는지 여부를 표시합니다.
memoryStoreEvictionPolicy : maxElementsInMemory 제한에 도달하면 정책이 적용됩니다. 기본 정책은 최근 가장 적게 사용됨(LRU로 지정됨)입니다. 사용 가능한 기타 정책 ‑ 선입 선출(FIFO로 지정) 및 덜 자주 사용(LFU로 지정) 캐시 요소에는 동일한 형식의 팩토리 클래스 및 속성을 사용하는 하위 요소도 포함될 수 있습니다. 정의된 하위 요소는 다음과 같습니다.
2. 메소드 캐시저장 & 캐시조회 호출
아래 Reference 중 Java Doc에서 해당하는 버전을 참고하여 이용하시면 됩니다.
사용 클래스
import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Element;
예)
private Cache cache;
캐시 저장
cache.put(element);
캐시 조회
cache.get(key);
* Reference
https://github.com/ehcache github
https://www.ehcache.org 공식홈페이지
https://javadoc.io/doc/net.sf.ehcache/ehcache/latest/index.html Java Doc
본문 중 틀린 내용이 있으면 언제든지 말씀해주시면 수정하도록 하겠습니다.