Spring 3.1 Cache Abstraction

Spring 3.1부터는 어플리케이션에 캐시 기능을 추가할 수 있는 기능이 제공된다.
현재 Spring Framework 3.1.0.M2 버전에서 제공하는 캐시 저장소는 java.util.concurrent.ConcurrentMap과 EhCache 두가지를 제공한다.

1. 캐시 선언

@Cacheable Annotation을 통해 결과를 캐싱할 메서드를 선별하여 적용한다. 최초로 호출된 이후, 동일한 parameter로 동일한 메서드가 다시 호출되면 Cache Abstraction 계층이 중복 호출 여부를 판단하여 타겟 메서드를 호출할지, 캐싱된 데이터를 반환하고 실제 메서드는 호출시키지 않을지 결정하게 된다.

@Cacheable("testCache")  // testCache라는 이름으로 캐싱
public String parseToText() { ... }

참고로, condition property에 SpEL을 통해 조건적인 캐싱을 적용할 수도 있다.

// 이름이 4자 미만인 사람이 parameter로 넘어온 경우만 testCache라는 이름으로 캐싱
@Cacheable(value = "testCache", condition = "#name.length < 4")
public Person getPerson(String name) { ... }

2. 캐시 제거

@CacheEvict Annotation를 통해 생성된 캐시를 제거할 수 있다.

// testCache에서 Any라는 key를 가진 데이터 삭제
@CacheEvict(value = "testCache", key = "Any")
public void removeCache() { ... }
 
// testCache에서 age가 10 미만인 parameter 호출의 경우에 모든 캐시 삭제
@CacheEvict(value = "testCache", condition = "#age < 10", allEntries = true)
public void removeCache(int age) { ... }

3. 캐시 설정

applicationContext에 cache 설정에 대한 namespace 및 캐싱 annotation 적용을 위한 annotation-driven, 캐시 저장소 관련 설정을 한다.

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:cache="http://www.springframework.org/schema/cache"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd">
 
  <cache:annotation-driven cache-manager="cacheManager" />
  
  
  ~~ cacheManager 관련 설정 ~~
 
  
  ...
  
</beans>

cacheManager 관련 설정

다음은 ConcurrentMap의 구현체로 ConcurrentHashMap을 캐시 저장소로 사용하는 Spring의 SimpleCacheManager와 EhCache를 저장소로 사용하는 EhcacheCacheManager 두가지 예이다.

<!-- 1. ConcurrentMap을 저장소로 사용하는 cacheManager -->
<bean id="cacheManager" class="org.springframework.cache.support.SimpleCacheManager">
  <property name="caches">
    <set>
      <bean class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean">
       // 캐시명
        <property name="name" value="testCache" />
        <!-- <property name="name" value="default" /> -->
      </bean>
    </set>
  </property>
</bean>
 
 
<!-- 2. EhCache를 저장소로 사용하는 cacheManager -->
<bean id="cacheManager" class="org.springframework.cache.ehcache.EhcacheCacheManager">
  <property name="cache-manager" value="ehcache" />
</bean>
<bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
  // ehcache 설정파일 위치
  <property name="config-location" value="classpath:ehcache.xml" />
</bean>

Comments