Cache 전략과 정합성
3줄 요약
- Cache는 응답 시간을 낮추고 DB 부하를 줄이지만, 동시에 오래된 값과 무효화 실패라는 새 문제를 만든다.
- 좋은 캐시 설계는 “무엇을 캐시할까?”보다 “얼마나 오래 틀려도 되는가?”, “틀렸을 때 사용자는 무엇을 보는가?”, “원본 데이터 변경을 어떻게 전파할 것인가?”를 먼저 묻는다.
- Java/Spring 백엔드에서는 Redis, local cache, DB, event, API 계약이 함께 움직이므로 성능, 정합성, 장애 격리, 운영 복잡도를 같이 판단해야 한다.
핵심 정리
- Cache Aside는 애플리케이션이 cache miss와 cache fill을 직접 관리한다. 단순하지만 miss 폭주, stale data, 예외 처리 책임도 애플리케이션에 있다.
- Read Through와 Write Through는 캐시 계층이 읽기/쓰기 흐름에 더 깊게 들어온다. 애플리케이션 코드는 단순해질 수 있지만 캐시 인프라 의존성과 write latency가 커질 수 있다.
- TTL은 “언젠가 지워지는 시간”이 아니라 사용자가 오래된 값을 볼 수 있는 최대 시간에 가깝다. 가격, 재고, 권한처럼 피해가 큰 값은 TTL만으로 부족할 수 있다.
- Invalidation은 정합성을 개선하지만 이벤트 유실, 순서 역전, 중복 처리, 배포 중 호환성 같은 운영 문제를 만든다.
- Cache Stampede는 같은 key가 동시에 만료되어 DB로 요청이 몰리는 문제이고, Hot Key는 특정 key 하나가 Redis나 네트워크를 과열시키는 문제다.
- 캐시 정합성 문제는 DB 내부 문제가 아니라 사용자 경험 문제다. 방금 수정한 값이 화면에 안 보이는지, 결제 후 주문 상태가 늦게 바뀌는지, 재고가 잘못 보이는지로 설명해야 한다.
- 개인 프로젝트에서는 cache key, TTL, 캐시 대상, 원본 DB fallback, 장애 시 동작을 문서화하면 충분히 수준이 올라간다.
- 기업 운영에서는 hit ratio, stale read, Redis CPU, memory, eviction, hot key, invalidation 실패, fallback rate를 지표로 본다.
상세본 구성
01. Cache Aside Read Through Write Through 상세.md는 캐시 읽기/쓰기 패턴이 코드 책임과 정합성 책임을 어떻게 바꾸는지 다룬다.
02. TTL Eviction Invalidation 상세.md는 만료, 제거, 무효화가 사용자에게 보이는 오래된 값의 시간을 어떻게 결정하는지 다룬다.
03. Cache Stampede와 Hot Key 상세.md는 캐시가 오히려 DB와 Redis에 순간 부하를 만드는 상황과 방어 전략을 다룬다.
04. 정합성 깨짐과 사용자 경험 상세.md는 stale data를 기술 문제가 아니라 사용자 경험과 API 계약 문제로 다룬다.
05. Redis Cache 실전 설계 상세.md는 key 설계, TTL, serializer, 메모리 추정, 장애 fallback, 운영 지표를 실제 설계 형태로 정리한다.
헷갈리는 지점
- 캐시를 넣으면 항상 더 안정적이라고 생각하기 쉽다. DB 부하가 줄어드는 효과가 먼저 보이기 때문이다.
- 핵심은 캐시가 DB 부하를 낮추는 대신 stale data, invalidation 실패, Redis 장애라는 새 실패 모드를 만든다는 점이다.
- 캐시 도입은 성능 최적화이면서 정합성 모델 변경이다.
- TTL을 짧게 잡으면 정합성 문제가 해결된다고 생각하기 쉽다. 오래된 값이 빨리 사라질 것처럼 보이기 때문이다.
- 핵심은 짧은 TTL이 miss 증가와 stampede를 만들 수 있다는 점이다.
- TTL은 정합성, DB 부하, Redis 부하 사이의 타협값이다.
- Redis를 쓰면 DB 장애를 대부분 막을 수 있다고 오해하기 쉽다. 캐시 hit 동안 DB를 덜 쓰기 때문이다.
- 핵심은 cache miss, cold start, invalidation, Redis 장애 시 결국 DB와 애플리케이션이 버텨야 한다는 점이다.
확인 질문
- 확인 질문: 캐시 도입 전에 가장 먼저 물어야 하는 질문은 무엇인가?
- 답변: 캐시된 값이 얼마나 오래 틀려도 되는지, 틀렸을 때 사용자가 어떤 피해를 보는지, 원본 변경을 어떻게 반영할지다.
- 확인 질문: TTL만으로 부족한 데이터는 어떤 데이터인가?
- 답변: 가격, 재고, 권한, 결제 상태처럼 오래된 값이 사용자 손해나 보안 문제로 이어질 수 있는 데이터다.
- 확인 질문: 캐시 설계에서 운영 지표가 필요한 이유는 무엇인가?
- 답변: hit ratio만으로는 충분하지 않고 Redis CPU, memory, eviction, stale read, fallback, hot key를 봐야 실제 효과와 위험을 알 수 있기 때문이다.
참고 자료 기준