> For the complete documentation index, see [llms.txt](https://leehyokyun.gitbook.io/openbook/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://leehyokyun.gitbook.io/openbook/4-1.-cache.md).

# 4-1. 캐싱 전략 (Cache)

캐싱 전략에 대하여

### 1. 캐시(Cache)의 개념과 도입 목적

캐시(Cache)는 애플리케이션의 성능을 저하시키는 핵심 요인인 데이터 처리 병목 현상을 획기적으로 줄이기 위한 시스템 체계이자 최적화 방안이다.

* 트래픽 병목 분산: 원본 데이터 소스(Datasource)에 대규모 트래픽이 한꺼번에 몰릴 경우, 인프라가 감당해야 하는 부하가 급격히 상승한다. 캐시는 이러한 트래픽 병목을 분산하고 흡수하는 1차적인 방어선 역할을 수행한다.
* 데이터 액세스 고속화: 반복적으로 요청되거나 연산 비용이 무거운 데이터를 상대적으로 빠르고 접근 비용이 저렴한 저장소에 미리 적재해 둠으로써, 시스템 전체의 응답 속도(Latency)를 단축하고 안정성을 확보한다.

### 2. 캐시 구현 도구로서의 Redis 효용성

과거의 MemCached와 더불어, 현대적인 고성능 아키텍처에서 Redis(Remote Dictionary Server)는 대표적인 캐시 구현 도구로 널리 채택되어 운용된다. Redis는 단순한 Key-Value 저장소의 기능을 넘어 다음과 같은 명확한 아키텍처적 이점과 효용성을 제공한다.

* 다양한 자료구조 지원: String 구조뿐만 아니라 List, Set, Hash, Sorted Set 등 풍부하고 정교한 내장 자료구조를 제공하여 비즈니스 요구사항에 맞는 데이터 추상화가 가능하다.
* 발행/구독(Pub/Sub) 아키텍처: 실시간 메시징 및 이벤트 기반 아키텍처를 손쉽게 연동할 수 있는 Pub/Sub 기능을 기본으로 지원한다.
* 데이터 영속화(Persistence): 인메모리(In-Memory) 데이터의 유실을 방지하기 위해 RDB(Snapshotting)나 AOF(Append Only File) 같은 영속화 메커니즘을 선택적으로 결합할 수 있다.
* 고가용성(HA, High Availability): 복제(Replication), Sentinel, Cluster 구조를 통해 노드 장애 상황에서도 중단 없는 고가용성 서비스를 보장한다.

### 3. 상황별 핵심 캐시 전략 (Cache Strategy)

애플리케이션의 데이터 라이프 사이클과 동기화 요구사항에 맞춰 적용할 수 있는 핵심적인 캐시 제어 전략은 크게 3가지 체계로 구동된다. Spring 프레임워크 환경에서는 보통 Spring AOP(Aspect-Oriented Programming) 기법을 활용하여 비즈니스 로직을 오염시키지 않고 선언적으로 접목하여 운용한다.

* Cacheable (Look Aside / Lazy Loading 전략):
  * 가장 보편적으로 사용되는 전략으로, 주로 Spring AOP 등을 적용하여 타깃 메서드가 실행되기 전에 캐시 저장소를 먼저 인터셉트하여 탐색한다.
  * 캐시 히트(Cache Hit): 호출한 데이터가 캐시에 이미 존재하면, 원본 메서드를 실행하지 않고 캐싱된 값을 즉시 반환하여 I/O 비용을 제로화한다.
  * 캐시 미스(Cache Miss): 캐시에 데이터가 존재하지 않을 경우에만 비로소 원본 데이터 소스(Datasource)에 접근하여 데이터를 새로 생성하고 가져온다. 이후 가져온 결과 값을 다음 요청을 위해 캐시에 다시 적재하는 절차를 밟는다.
* Cache Put (Write Through 유형의 갱신 전략):
  * 캐시 히트 여부와 상관없이 항상 타깃 메서드를 무조건 실행하는 구조를 취한다.
  * 메서드의 비즈니스 로직이 완수되고 최종 반환 값을 전달하기 직전에, 데이터 변경 사항이나 최신 컨텍스트가 존재할 경우 캐시 저장소의 기존 값을 최신 가치 값으로 즉각 덮어써서 동기화(업데이트)한다. 항상 최신 데이터를 캐시에 유지해야 하는 컨텍스트에 적합하다.
* CacheEvict (캐시 데이터 무효화 전략):
  * 캐시 내부에서 데이터 정합성을 해치거나 더 이상 유효하지 않게 된 불필요한 데이터 값을 명시적으로 삭제하는 전략이다.
  * 원본 데이터가 삭제(DELETE)되거나 수정(UPDATE)되는 시점에 이 연산을 연쇄적으로 호출하여 캐시 스냅샷을 깨끗이 비워줌으로써, 애플리케이션이 과거의 잘못된 데이터(Stale Data)를 읽어가지 않도록 정합성의 일관성을 엄격히 유지한다.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://leehyokyun.gitbook.io/openbook/4-1.-cache.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
