Loading...
Spring Framework Reference Documentation 7.0.2의 Declarative XML-based Caching의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
어노테이션을 선택할 수 없는 경우(소스에 접근할 수 없거나 외부 코드가 없는 경우 등)에는 XML을 사용하여 선언적 캐싱을 할 수 있습니다. 따라서 캐싱을 위해 메서드에 어노테이션을 붙이는 대신, 대상 메서드와 캐싱 지시문을 외부에서 지정할 수 있습니다(선언적 트랜잭션 관리 advice와 유사).
이전 섹션의 예제는 다음 예제로 변환될 수 있습니다:
1<!-- the service we want to make cacheable --> 2<bean id="bookService" class="x.y.service.DefaultBookService"/> 3 4<!-- cache definitions --> 5<cache:advice id="cacheAdvice" cache-manager="cacheManager"> 6 <cache:caching cache="books"> 7 <cache:cacheable method="findBook" key="#isbn"/> 8 <cache:cache-evict method="loadBooks" all-entries="true"/> 9 </cache:caching> 10</cache:advice> 11 12<!-- apply the cacheable behavior to all BookService interfaces --> 13<aop:config> 14 <aop:advisor advice-ref="cacheAdvice" pointcut="execution(* x.y.BookService.*(..))"/> 15</aop:config> 16 17<!-- cache manager definition omitted -->
앞의 설정에서 bookService는 캐시 가능하게 만들어집니다. 적용할 캐싱 의미는 cache:advice 정의에 캡슐화되어 있으며, 이는 findBooks 메서드가 캐시에 데이터를 넣는 데 사용되고 loadBooks 메서드가 데이터를 제거하는 데 사용되도록 합니다.
두 정의 모두 books 캐시에 대해 동작합니다.
aop:config 정의는 AspectJ 포인트컷 표현식을 사용하여 프로그램에서 적절한 지점에 캐시 어드바이스를 적용합니다(자세한 내용은 Aspect Oriented Programming with Spring 참고).
앞의 예제에서는 BookService의 모든 메서드가 고려되며, 그들에 대해 캐시 어드바이스가 적용됩니다.
선언적 XML 캐싱은 어노테이션 기반 모델의 모든 것을 지원하므로, 둘 사이를 이동하는 것은 상당히 쉽습니다. 또한 둘 다 동일한 애플리케이션 안에서 사용할 수 있습니다. XML 기반 접근 방식은 대상 코드를 건드리지 않습니다.
그러나 본질적으로 더 장황합니다. 캐싱 대상으로 지정된 오버로드된 메서드를 가진 클래스를 다룰 때, 적절한 메서드를 식별하는 데는 추가적인 노력이 필요합니다. 왜냐하면 method 인수는 좋은 구분자가 아니기 때문입니다.
이러한 경우 AspectJ 포인트컷을 사용하여 대상 메서드를 선별적으로 선택하고 적절한 캐싱 기능을 적용할 수 있습니다. 그러나 XML을 통해 패키지 또는 그룹 또는 인터페이스 전체에 대한 캐싱을 적용하는 것이 더 쉽고(마찬가지로 AspectJ 포인트컷 덕분에), cache:definitions cache 속성을 통해 대상 캐시를 정의함으로써 앞의 예제에서 했던 것처럼 템플릿과 같은 정의를 생성할 수 있습니다.
JCache (JSR-107) Annotations
Configuring the Cache Storage