[Cache] EHCache 란?
Spring

[Cache] EHCache 란?

728x90

EHCache(ehcache) 는 Spring에서 간단하게 사용할 수 있는 Java기반 오픈소스 캐시 라이브러리 입니다.

 

보통 캐시 엔진하면 redis, memcached가 떠오르만, 이 둘과 달리 ehcache는 데몬을 가지지 않고 Spring 내부적으로 동작하여 캐싱처리를 합니다. 따라서 ehcache는 Spring Application과 라이프사이클을 함께합니다. (애플리케이션이 죽으면 같이 죽습니다)

 

왜 redis, memcached를 놔두고 ehcache를 사용하죠?

가장 큰 이유는 가볍고 빠르다 입니다. redis, memcached 같은 경우 우선 별도의 데몬으로 실행되야합니다. 벌써 도입시점부터 관리포인트가 늘어난것이죠. 그에비해 ehcache는 spring 내부적으로 동작하며 단순 캐시 저장용도로는 redis에서 제공하는 다양한 자료구조와 pub/sub 시스템이 굳이 필요없으므로 사용하기 간편합니다. 

 

ehcache는 2.x 버전과 3버전의 차이가 큽니다

  • 3버전부터는 JSR-107과의 호환성을 제공합니다. Java Temporary Caching API(JSR 107)은 JCache라고도 불리며 javax.cache API 스펙을 준수하였습니다. 즉 표준을 기반으로 만들어졌습니다.
  • 3버전부터는 offheap이라는 저장공간을 제공합니다. 따라서 Spring 내부에서 실행되지만 heap 메모리를 벗어난 곳에 저장됩니다. 하지만 설정에 따라 heap, offheap, disk 모두에 적재 가능합니다.

사용법

1. mvnrepository(https://mvnrepository.com/artifact/org.ehcache/ehcache)를 참고하여 의존성 설정합니다.

2. ehcache.xml 파일을 작성해줍니다.

 

아래는 샘플 xml 파일입니다.

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://www.ehcache.org/v3"
        xmlns:jsr107="http://www.ehcache.org/v3/jsr107"
        xsi:schemaLocation="
            http://www.ehcache.org/v3 http://www.ehcache.org/schema/ehcache-core-3.0.xsd
            http://www.ehcache.org/v3/jsr107 http://www.ehcache.org/schema/ehcache-107-ext-3.0.xsd">

    <cache alias="squareCache"> 
        <key-type>java.lang.Long</key-type> 
        <value-type>java.math.BigDecimal</value-type>
        <expiry> 
            <ttl unit="seconds">30</ttl>
        </expiry>

        <listeners>
            <listener>
                <class>com.example.ehcache.demo.config.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>
            <offheap unit="MB">10</offheap>
        </resources>
    </cache>

    <cache alias="taskCache">
        <key-type>org.springframework.cache.interceptor.SimpleKey</key-type>
        <value-type>java.util.List</value-type>
        <expiry>
            <ttl unit="seconds">30</ttl>
        </expiry>

        <listeners>
            <listener>
                <class>com.example.ehcache.demo.config.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>
            <offheap unit="MB">10</offheap>
        </resources>
    </cache>

    <cache alias="taskByUserIdCache">
        <key-type>java.lang.Integer</key-type>
        <value-type>java.util.List</value-type>
        <expiry>
            <ttl unit="seconds">30</ttl>
        </expiry>

        <listeners>
            <listener>
                <class>com.example.ehcache.demo.config.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>
            <offheap unit="MB">10</offheap>
        </resources>
    </cache>
</config>
<cache/> CachceManager에 의해 작성되고 관리될 Cache 인스턴스를 나타냅니다. Cache<k,v> 형태로 인스턴스가 생성됩니다. alias 옵션으로 캐시의 이름을 지정합니다.
<key-type/> key-type 요소는 Cache 인스턴스에 저장될 캐시의 키의 FQCN을 지정합니다. 즉, 키의 타입을 명시해주면 됩니다. 기본 값은 java.lang.Object 입니다.
<expiry/> 캐시 만료기간에 대해 설정하는 요소입니다
<ttl/> <expiry/> 내부에 존재하는 요소이며 캐시 만료 시간을 지정할 수 있습니다. unit 옵션으로 단위를 지정할 수 있습니다.
unit은 days, hours, minutes, seconds, millis, micros, nanos 를 세팅할 수 있습니다.
<listeners/> Cache 리스너를 등록하는 요소입니다
<class/> 요소를 통해 캐싱처리에 대한 리스너가 등록된 클래스의 FQCN을 등록합니다.
<resources/> resources는 캐시 데이터의 저장 공간과 용량을 지정합니다.
만약 힙 메모리만 사용한다면 <heap/> 요소만으로 대체할 수 있습니다.
<heap/> heap은 JVM 힙 메모리에 캐시를 저장하도록 세팅하는 요소입니다. 
unit="entries" 옵션에 entries는 항목을 뜻합니다. 2로 설정했으면 총 2개의 항목을 heap에 저장할 수 있다는 뜻입니다. entries 수가 넘어가면 가장 예전에 저장했던 캐시부터 삭제하면서 새로운 캐시를 저장합니다.
<offheap/> offheap은 JVM 힙 메모리 외부의 메모리에 캐시를 저장하도록 세팅하는 요소입니다.

3. 위같이 xml 을 설정했으면 Spring이 해당 파일을 읽을 수 있도록 환경설정 파일에 아래와 같은 설정을 추가합니다

spring:
    cache:
        jcache: 
            config:
                classplath: {경로}/ehcache.xml

4. 메인 클래스 파일에 @EnableCaching 어노테이션을 붙여줍니다.

@EnableCaching
@SpringBootApplication
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

 

5. 캐시하려는 메서드에 @Cachable 어노테이션을 붙여줍니다.

@Slf4j
@Service
public class NumberService {

    @Cacheable(value = "squareCache", key = "#number", condition = "#number > 10")
    public BigDecimal square(Long number) {
        BigDecimal square = BigDecimal.valueOf(number).multiply(BigDecimal.valueOf(number));
        log.info("square of {} is {}", number, square);
        return square;
    }

}
  • value: ehcache.xml에서 등록했던 캐시중 해당 메서드에 적용할 캐시이름 (ehcache.xml의 cache요소에 등록했던 alias값)을 지정해줍니다.
  • key: 캐시를 구분하기 위한 용도로 사용됩니다. 캐시를 구분할 필요가 없다면 key를 등록하지 않아도 됩니다.
  • condition: 캐시처리에 대한 조건을 지정합니다. 위 컨디션에서는 Long number 가 10보다 큰 경우에만 캐시처리를 한다는 뜻이 됩니다.

 

출처:
- Spring 로컬 캐시 라이브러리 ehcache
- [Kotlin] Redis vs Ehcache 무엇을 쓸까?
728x90