Loading...
Spring Framework Reference Documentation 7.0.2의 Understanding the Cache Abstraction의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
“buffer”와 “cache”라는 용어는 서로 바꿔 사용되는 경향이 있습니다. 그러나 이들이 서로 다른 것을 나타낸다는 점에 유의해야 합니다. 전통적으로, buffer는 빠른 엔티티와 느린 엔티티 사이에서 데이터에 대한 중간 임시 저장소로 사용됩니다. 한 쪽이 다른 쪽을 기다려야 하므로(이는 성능에 영향을 줍니다), buffer는 작은 청크 단위가 아니라 전체 데이터 블록을 한 번에 이동할 수 있도록 함으로써 이를 완화합니다.
데이터는 buffer에서 한 번만 쓰이고 읽힙니다. 또한, buffer는 적어도 그것을 인지하고 있는 한 쪽 당사자에게는 보입니다.
반면에 cache는, 정의상, 숨겨져 있으며, 어느 쪽 당사자도 캐싱이 발생한다는 사실을 인지하지 못합니다. cache 또한 성능을 향상시키지만, 동일한 데이터를 빠른 방식으로 여러 번 읽을 수 있도록 함으로써 이를 달성합니다.
buffer와 cache의 차이에 대한 추가 설명은 여기에서 찾을 수 있습니다.
핵심적으로, 캐시 추상화는 캐시에 있는 정보를 기반으로 Java 메서드에 캐싱을 적용하여 실행 횟수를 줄입니다. 즉, 대상 메서드가 호출될 때마다 추상화는 캐싱 동작을 적용하여 해당 인자에 대해 메서드가 이미 호출된 적이 있는지 확인합니다. 이미 호출된 적이 있다면, 실제 메서드를 호출할 필요 없이 캐시된 결과가 반환됩니다.
메서드가 호출된 적이 없다면, 메서드가 호출되고 그 결과가 캐시에 저장된 후 사용자에게 반환되며, 그 다음 번에 메서드가 호출될 때는 캐시된 결과가 반환됩니다. 이런 방식으로, 비싼 메서드(CPU 또는 IO bound 여부와 상관없이)는 주어진 매개변수 집합에 대해 한 번만 호출되고, 실제로 메서드를 다시 호출하지 않고도 그 결과를 재사용할 수 있습니다. 캐싱 로직은 호출자에게 어떠한 간섭도 없이 투명하게 적용됩니다.
이 접근 방식은, 호출 횟수와 상관없이 주어진 입력(또는 인자)에 대해 동일한 출력(결과)을 반환하는 것이 보장되는 메서드에만 동작합니다.
캐싱 추상화는 캐시의 내용을 갱신하거나 하나 또는 모든 엔트리를 제거하는 능력과 같은, 캐시와 관련된 다른 연산도 제공합니다. 이는 캐시가 애플리케이션의 진행 과정에서 변경될 수 있는 데이터를 다루는 경우에 유용합니다.
Spring Framework의 다른 서비스와 마찬가지로, 캐싱 서비스는 추상화 (캐시 구현이 아님)이며 캐시 데이터를 저장하기 위해 실제 스토리지의 사용을 필요로 합니다. 즉, 추상화는 캐싱 로직을 작성할 필요성을 없애 주지만 실제 데이터 저장소를 제공하지는 않습니다. 이 추상화는 org.springframework.cache.Cache 및 org.springframework.cache.CacheManager 인터페이스에 의해 구체화됩니다.
Spring은 해당 추상화의 몇 가지 구현체를 제공합니다: JDK java.util.concurrent.ConcurrentMap 기반 캐시, Gemfire 캐시, Caffeine, 그리고 JSR-107을 준수하는 캐시(Ehcache 3.x와 같은). 다른 캐시 저장소 및 프로바이더를 연동하는 방법에 대한 자세한 내용은 Plugging-in Different Back-end Caches를 참조하세요.
캐싱 추상화는 멀티 스레드 및 멀티 프로세스 환경에 대해 특별한 처리를 하지 않으며, 이러한 기능은 캐시 구현체에서 처리됩니다.
멀티 프로세스 환경(즉, 여러 노드에 배포된 애플리케이션)이 있는 경우, 해당하는 방식으로 캐시 프로바이더를 구성해야 합니다. 사용 사례에 따라, 여러 노드에 동일한 데이터의 복사본을 두는 것만으로 충분할 수 있습니다. 그러나 애플리케이션의 진행 과정에서 데이터를 변경하는 경우, 다른 전파 메커니즘을 활성화해야 할 수도 있습니다.
특정 항목을 캐싱하는 것은 전형적인 get-if-not-found-then-proceed-and-put-eventually 코드 블록과 직접적으로 동일합니다(이는 프로그래밍 방식 캐시 상호작용에서 발견됩니다). 어떤 락도 적용되지 않으며, 여러 스레드가 동시에 동일한 항목을 로드하려고 시도할 수 있습니다. 제거에도 동일하게 적용됩니다.
여러 스레드가 동시에 데이터를 갱신하거나 제거하려고 시도하는 경우, 오래된 데이터를 사용할 수도 있습니다. 특정 캐시 프로바이더는 이 영역에서 고급 기능을 제공합니다. 자세한 내용은 사용하는 캐시 프로바이더의 문서를 참조하세요.
캐시 추상화를 사용하려면, 두 가지 측면을 처리해야 합니다:
Cache Abstraction
Declarative Annotation-based Caching