1. Google의 Spring Cache Annotation과 혼동하면 안됨. 중복 사용으로 인해서 꼬이지 않도록 해야 함

http://code.google.com/p/ehcache-spring-annotations

 

2. Spring Cache를 쓰기로 결정했다면 잘 유의할 내용

(1) pom dependency 추가

// Spring 3 은 기본 추가. .

 

<dependency>
    <groupId>net.sf.ehcache</groupId>
    <artifactId>ehcache-core</artifactId>
    <version>2.5.0</version>
</dependency>

 

(2) Spring 문서를 정독

http://static.springsource.org/spring/docs/3.1.0.M1/spring-framework-reference/html/cache.html

 

(3) 괜찮은 Tutorial

http://sonegy.wordpress.com/2011/12/29/spring-3-1과-ehcache/

여기에 오타가 있어서 bean 정의시 xml schem location에 문제가 있음. 아래와 같이 사용.

<?xml version="1.0" encoding="UTF-8"?>
<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"
    xmlns:p="http://www.springframework.org/schema/p"
    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" >

 

(3) Cachable 적용이 안 된다고 있다면,다음을 확인

   1) 그냥 클래스의 method에 추가해서 쓰면 적용이 안됨. Proxy를 이용하기 때문에 interface를 상속하는 클래스의 public method에서만 사용 가능

   2) self-invocation 는 안됨

 

(4) SPEL을 이용해서 key를 정의할 수 있음. 

   1) 특정 파라미터만 이용해서 key 정의 가능

http://stackoverflow.com/questions/11889428/spring-cacheable-with-complex-keys-still-executed

@Cacheable(value="cahceName", key="#p0.concat('-').concat(#p1)")

   자세한 내용은  이곳(http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/cache.html#cache-spel-context) 을 참조

 

   2) 설정 + 클래스 이용

http://stackoverflow.com/questions/6730641/how-can-i-set-a-custom-keygenerator-for-spring-cache

<cache:annotation-driven key-generator="myKeyGenerator"/>
<bean id="myKeyGenerator" class="com.abc.MyKeyGenerator" />

import org.springframework.cache.interceptor.KeyGenerator;
public class MyKeyGenerator implements KeyGenerator {

    public Object generate(Object target, Method method, Object... params) {
}}

 

   3) 복잡한 경우라면. AOP를 사용할 수 있다.

Old

http://springtips.blogspot.kr/2007/06/caching-methods-result-using-spring-and_23.html

new : cache:advice 이용

http://blog.skcc.com/531

 

   4) Default Key Generator 구현 정보

http://www.jarvana.com/jarvana/view/org/springframework/spring-context/3.1.0.RELEASE/spring-context-3.1.0.RELEASE-sources.jar!/org/springframework/cache/interceptor/DefaultKeyGenerator.java?format=ok

public class DefaultKeyGenerator implements KeyGenerator {

	public static final int NO_PARAM_KEY = 0;
	public static final int NULL_PARAM_KEY = 53;

	public Object generate(Object target, Method method, Object... params) {
		if (params.length == 1) {
			return (params[0] == null ? NULL_PARAM_KEY : params[0]);
		}
		if (params.length == 0) {
			return NO_PARAM_KEY;
		}
		int hashCode = 17;
		for (Object object : params) {
			hashCode = 31 * hashCode + 
(object == null ? NULL_PARAM_KEY : object.hashCode()); } return Integer.valueOf(hashCode); } }

 

 

(5) Ehcache 설정 중 중요한 부분

overflowToDisk 는 정말 필요할 경우에만.

LRU는 캐쉬의 기본 정책. 안쓰는 녀석은 퇴출(eviction)

maxElementsInMemory 는 얼마나 가지고 있을지(size)

timeToLiveSeconds 는 cache expire 정책.

Posted by '김용환'
,