First Chapter

JSR-107 규격

멀티 스레드, 멀티 프로세스 환경에서는 Local Cache는 동작하지 않습니다. 이를 위하여 "Sync = true" 로 설정해야합니다.

@Cacheable(value = "book", sync = true)

java.util.concurrent.ConcurrentMap 기반의 Key-Value 형식으로 Cache가 저장됩니다.

캐쉬 Annotations

@Target({ElementType.METHOD, ElementType.TYPE})
메소드나, Class, Interface에서 선언이 가능합니다. 

@Cacheable 캐쉬를 지정합니다.
@CacheEvict 캐쉬를 제거합니다.
@CachePut 메소드 실행은 보장하고 캐쉬에 저장합니다. (무조건 메소드를 호출합니다.) Cache 저장 용도에 사용
@Caching regroups multiple cache operations to be applied on a method
@CacheConfig shares some common cache-related settings at class-level

@Cacheable은 다중으로 선언이 가능합니다.

@Cacheable({"books", "isbns"})

@Cacheable key에 해당되는 것은 Parameter를 지정합니다.

@Cacheable(cacheNames="books", key="#isbn")
public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed)

하지만, Parameter를 지정하는 것은 명확하지 않습니다. Parameter의 변동성 때문입니다.

그래서 우리는 KeyGenerator를 사용하는 것을 권장합니다.

@Cacheable(cacheNames="books", keyGenerator="myKeyGenerator")
public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed)

condition 이라는 조건으로 Cache를 제어할 수 있습니다.

name의 길이가 32자 이상인 경우는 Cache하지 않습니다.

@Cacheable(cacheNames="book", condition="#name.length < 32")
public Book findBook(String name)

unless 를 통하여 Return 값의 조건을 설정할 수 있습니다.

@Cacheable(cacheNames="book", condition="#name.length < 32", unless="#result.hardback")
public Book findBook(String name)

@CacheEvict 는 캐쉬를 제거하는 내용입니다. "allentires"는 전체 캐쉬을 제거합니다.

@CacheEvict(cacheNames="books", allEntries=true)
public void loadBooks(InputStream batch)

@Caching은 여러개의 캐쉬 어노테이션을 사용할 수 있습니다.

@Caching(evict = { @CacheEvict("primary"), @CacheEvict(cacheNames="secondary", key="#p0") })
public Book importBooks(String deposit, Date date)

Class 전체에 Cache 옵션을 적용 할 수 있습니다.

@CacheConfig("books")
public class BookRepositoryImpl implements BookRepository {
@Cacheable public Book findBook(ISBN isbn) {...}
}

스프링은 해당 클래스, 메소드에 @Cache* 어노테이션을 사용하는 것을 권장하고 Interface에서의 사용은 권장하지 않습니다.

클래스 기반 프록시 (proxy-target-class = "true") 또는 위빙 기반 aspect (mode = "aspectj")를 사용하는 경우 프록시 및 위빙 인프라에서 캐싱 설정을 인식하지 못하고 객체 캐싱 프록시에 랩핑되지 않을 것이기 때문이다.

Interface에서 사용해야 하는 경우는 Custome Cache 어노테이션으로 사용하길 권장한다.

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
@Cacheable(cacheNames="books", key="#isbn")
public @interface SlowService {}

results matching ""

    No results matching ""