EHCache

may_yun·2023년 8월 6일
0

[WORK] 학습내용

목록 보기
13/24

EHCache

spring에서 간단하게 사용할 수 있는 Java기반 오픈 소스 캐시 라이브러리
spring 내부적으로 동작하여 캐싱 처리를 한다
따라서 redis같이 별도의 서버를 사용하여 생길 수 있는 네트워크 지연 혹은 단절 같은 이슈에서 자유롭고 서버 어플리케이션과 라이프 사이클을 같이 사용한다.

ehcache 2.x 버전과 3 버전의 차이

  • 2.x :
  • 3
    • 3버전 부터는 javax.cache API (JSR-107)와의 호환성을 제공
    • offheap 이라는 저장 공간을 제공: 힙 메모리를 벗어난 메모리로 java GC에 의해 데이터가 정리되지 않는 공간이다.

사용법

  1. 버전에 따른 dependency 설정
  2. spring이 알게하기 위해서 properties에 추가
spring.cache.jcache.config=classpath:ehcache.xml
  1. Config 파일에 CacheManager를 Bean으로 등록
  • CacheManager
    : 캐시를 관리하는 인터페이스로 CacheManager는 캐시를 생성하고, 캐시를 초기화하고, 캐시를 삭제하고, 캐시를 조회하는 기능을 제공한다.
    • addCache(String cacheName): 지정된 이름의 캐시를 생성합니다.
    • getCache(String cacheName): 지정된 이름의 캐시를 가져옵니다.
    • getCacheNames(): 모든 캐시의 이름을 가져옵니다.
    • removeCache(String cacheName): 지정된 이름의 캐시를 삭제합니다.
    • clearAll(): 모든 캐시를 삭제합니다.
    • getStatistics(String cacheName): 지정된 이름의 캐시의 통계를 가져옵니다.
    • getStatistics(): 모든 캐시의 통계를 가져옵니다.

  • ConcurrentMapCacheManager: Java의 ConcurrentHashMap을 사용해 구현한 캐시를 사용하는 캐시매니저
  • SimpleCacheManager: 기본적으로 제공하는 캐시가 없어 사용할 캐시를 직접 등록하여 사용하기 위한 캐시매니저
  • EhCacheCacheManager: 자바에서 유명한 캐시 프레임워크 중 하나인 EhCache를 지원하는 캐시 매니저
  • CompositeCacheManager: 1개 이상의 캐시 매니저를 사용하도록 지원해주는 혼합 캐시 매니저
  • CaffeineCacheManager: Java 8로 Guava 캐시를 재작성한 Caffeine 캐시를 사용하는 캐시 매니저
  • JCacheCacheManager: JSR-107 기반의 캐시를 사용하는 캐시 매니저

@EnableCaching 어노테이션을 스프링부트 어플리케이션 부분에 붙이지 않고 따로 설정파일 역할을 하는 클래스에 생성해서 사용하거나, XML 파일에 별도로 캐싱기능을 사용할 부분에 대해 CacheManager 빈을 만들어 좀 더 세부적으로 설정할 수 있다.

3-2. 메인 클래스에 @EnableCaching 어노테이션 사용

  • @EnableCache // 캐시 기능을 사용하겠다.
  • @Cacheable // 해당 케시를 사용하겠다.
    • 어노테이션에 텍스트 값을 넣어 사용하는데 그게 캐시 데이터 저장 공간의 이름이 된다.
    • value, key 파라미터로 명시를 해줄 수 있다. value는 캐시 데이터의 이름이 되고 key는 캐시 데이터의 키 값이 된다.
  • @CacheEvict // 헤당 캐시를 갱신하겠다

주의사항
public method 에만 사용가능
같은 객체 내의 method끼리 호출 시에는 @Cacheable이 설정되어있어도 캐싱되지 않는다.

동작 방식

  1. 캐싱 처리에 대래서 모니터링을 위해서 CacheEventListener 구현 받는다.
@Slf4j
public class CacheEventLogger implements CacheEventListener<Object, Object> {
    public void onEvent(CacheEvent<? extends Object, ? extends Object> cacheEvent) {
        log.info("cache event logger message. getKey: {} / getOldValue: {} / getNewValue:{}", cacheEvent.getKey(), cacheEvent.getOldValue(), cacheEvent.getNewValue());
    }
}

캐싱 처리가 되면 해당 클래스 내부의 onEvent() 메서드가 호출되면서 로그가 찍힐 것이다.

참고
ehcache3 는 캐싱할 데이터를 외부 메모리(offheap 혹은 disk)에 저장하기 위해서는 저장할 데이터(객체 혹은 인스턴스)가 Serializable이 구현 되어 있어야 한다.
즉, 캐싱할 데이터는 Serializable을 상속받은 클래스여야 한다.
왜냐하면, ehcache가 JVM의 힙 메모리가 아닌 곳(offheap 혹은 disk)에 캐시를 저장하기 위해서는 JVM 메모리에 인스턴스화 되어있는 객체의 데이터를 외부에서 사용할 수 있게 하기 위해 Serialize(직렬화)가 필요하기 때문이다.


참고

profile
개발 일지

0개의 댓글