====== Simple Spring Memcached ======
* [[http://code.google.com/p/simple-spring-memcached/|Simple Spring Memcached]]
* [[springframework:aop|Spring AOP]] Annotation을 통해 Cache를 관리한다.
* [[:memcached|memcached]]의 Multi Get 기능을 Annotation으로 지원해준다.
* Spring Cache Abstraction도 함께 지원해준다.
===== 설정 =====
* ''@EnableAspectJAutoProxy'' 혹은 XML의 경우 ''''가 필수적으로 돼 있어야 한다.
===== Cache Name을 key Prefix로 사용하기 =====
* SSM은 하나의 Memcached 서버군에서 여러 Cache Name을 사용할 경우에도 기본적으로 CacheName을 Key의 prefix로 붙이지 않아서, 여러 CacheName에서 동일한 Cache Key를 사용할 경우 키 충돌이 발생할 수 있다.
* 해당 문제는 특히 [[springframework:cacheabstraction|Spring Cacheh Abstraction]]과 함께 사용할 경우 심각한 키 충돌을 일으키게 된다.
* [[https://code.google.com/p/simple-spring-memcached/issues/detail?id=21&can=1&colspec=Stars%20ID%20Type%20Status%20Priority%20Milestone%20Owner%20Summary|3.3.0 패치]]에 따라 이 이후부터 ''CacheConfiguration.useNameAsKeyPrefix'' 프라퍼티를 ''true''로 설정하여 해결 가능해졌다.
@Bean
public CacheConfiguration coupangCacheConfiguration() {
CacheConfiguration cacheConfiguration = new CacheConfiguration();
cacheConfiguration.setConsistentHashing(true);
cacheConfiguration.setUseBinaryProtocol(true);
cacheConfiguration.setOperationTimeout(operationTimeout);
// Cache Name Key Prefix 부분
cacheConfiguration.setUseNameAsKeyPrefix(true);
cacheConfiguration.setKeyPrefixSeparator(":");
return cacheConfiguration;
}
* Memcached 버전에 따라 Key 문자열에 ''#''이 오는 것을 허용하지 않는 듯 하다.
===== 임시 Cache 무력화 =====
* ''ssm.cache.disable=true'' System Property 지정을 통해 캐시를 임시로 무력화할 수 있다.
-Dssm.cache.disable=true
===== 주의 =====
* Annotation은 Class 레벨에 붙이도록 한다. Interface에 어노테이션 하는 것은 작동하지 않는다.
* ''com.google.code.ssm.CacheFactory'' 객체 로딩이 '''' 보다 먼저 이뤄져야 한다.
* 최소한 한 개의 ''default''라는 이름의 캐시가 존재해야 한다. 그렇지 않으면 매번 **@CacheName** 어노테이션으로 캐시 이름을 지정해줘야 한다.
* ''@CacheKeyMethod'' 사용시 ''@CacheKey''뿐만 아니라 ''equals/hashCode'' 등을 통한 값 비교도 행해진다. 따라서 올바른 ''equals/hashCode''도 생성해 두어야 한다.