====== 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''도 생성해 두어야 한다.