프로그래밍 PROGRAMMING/자바 JAVA AND FRAMEWORKS

[JAVA/SPRING] Java 캐시 전략 총정리: Caffeine부터 Redis 이중 캐시까지

매운할라피뇨 2026. 3. 4. 12:45
반응형

개요

캐시(Cache)는 반복적인 데이터 조회 비용을 줄이는 가장 효과적인 수단입니다. 그러나 "Redis 넣으면 빨라지겠지"라는 단순한 접근은 오히려 장애를 유발할 수 있습니다. 캐시 만료 시 수천 건의 동시 요청이 DB로 몰리는 캐시 스탬피드, 로컬 캐시와 분산 캐시 간의 정합성 불일치, 캐시 키 설계 실수로 인한 적중률(hit rate) 저하 등 — 캐시를 제대로 운영하려면 알아야 할 것이 적지 않습니다.
이 허브 글에서는 Java 애플리케이션의 캐시 전략을 로컬 캐시 → 분산 캐시 → 이중 캐시 → JPA 캐시 순서로 정리하고, 각 주제의 상세 글로 안내합니다.


로컬 캐시: Caffeine으로 시작하기

가장 먼저 고려할 캐시는 애플리케이션 프로세스 내부의 로컬 캐시(In-Process Cache)입니다. 네트워크 비용이 없어 응답 속도가 가장 빠르고, 외부 인프라 의존성도 없습니다. Java 생태계에서 현재 가장 성능이 좋은 로컬 캐시 라이브러리는 Caffeine입니다.

👉 Caffeine 캐시 성능 최적화: 히트율 90% 달성하기 — Caffeine의 Window TinyLfu 퇴거 알고리즘 원리와, maximumSize, expireAfterWrite, refreshAfterWrite 설정으로 적중률을 끌어올리는 방법을 다룹니다.


분산 캐시: Redis 활용 전략

서버가 2대 이상이면 로컬 캐시만으로는 노드 간 데이터 불일치가 발생합니다. 이때 Redis를 분산 캐시로 도입하게 됩니다. Java에서 Redis를 다루는 클라이언트 중 Redisson은 분산 락, 캐시 로더, TTL 관리 등 고급 기능을 제공합니다.

👉 Redisson을 활용한 Redis 캐시 전략 — Redisson의 RMapCache, RBucket 등 자료구조별 캐시 패턴과, Spring Cache Abstraction과의 통합 방법을 설명합니다.

Redis는 캐시 외에도 멱등성 보장(중복 요청 방지) 용도로도 활용됩니다.

👉 Redis를 이용해서 중복요청 방지하는 방법SETNX 기반 멱등성 키와 TTL 설정으로 결제·주문 같은 중복 처리를 방지하는 패턴을 다룹니다.


캐시 장애 대응: 스탬피드 방어

캐시를 운영하다 보면 반드시 마주치는 문제가 캐시 스탬피드(Cache Stampede)입니다. 인기 데이터의 캐시가 만료되는 순간, 대량의 요청이 동시에 DB로 몰려 시스템이 멈추는 현상입니다.
👉 캐시 스탬피드: 만료된 순간 시스템이 멈추는 이유와 해결책 — Mutex Lock, Probabilistic Early Expiration, 백그라운드 갱신 등 스탬피드를 방어하는 3가지 패턴을 비교합니다.


이중 캐시: 로컬 + 분산의 조합

로컬 캐시의 속도와 분산 캐시의 일관성, 두 가지를 모두 얻으려면 이중 캐시(Two-Level Cache) 전략이 필요합니다. L1(로컬)에서 먼저 조회하고, 미스 시 L2(Redis)를 확인하는 구조입니다.
👉 이중 캐시 전략: 성능과 정합성 모두 만족하기 — L1/L2 캐시의 TTL 설계, 무효화(invalidation) 전파 방식, 그리고 정합성과 성능 사이의 트레이드오프를 분석합니다.


JPA 2차 캐시: 영속성 컨텍스트 너머

JPA에는 이미 1차 캐시(영속성 컨텍스트)가 내장되어 있지만, 이는 트랜잭션 범위로 제한됩니다. 여러 트랜잭션과 세션에 걸쳐 엔티티를 캐싱하려면 2차 캐시(Second-Level Cache)를 설정해야 합니다.

👉 JPA 2차 캐시: 영속성 컨텍스트와 성능 최적화 — Hibernate 2차 캐시의 동작 원리, @Cacheable 엔티티 설정, 그리고 쿼리 캐시와의 조합 전략을 설명합니다.


맺음말

캐시 전략은 "어디에 캐시를 둘 것인가"와 "언제 무효화할 것인가"라는 두 가지 질문으로 귀결됩니다.
추천 학습 순서:

  1. Caffeine — 로컬 캐시의 기본 원리와 설정을 익히기
  2. Redisson + Redis — 분산 환경으로 확장하기
  3. 캐시 스탬피드 — 장애 시나리오와 방어 패턴 이해하기
  4. 이중 캐시 — 로컬 + 분산을 조합하는 아키텍처 설계
  5. JPA 2차 캐시 — ORM 레벨의 캐시 통합

작은 프로젝트라면 Caffeine 하나로 충분하고, 트래픽이 늘어나면 Redis → 이중 캐시 순으로 확장하는 것이 일반적인 경로입니다. 각 글의 코드 예제를 따라 하면서 자신의 프로젝트에 맞는 캐시 계층을 설계해 보시기 바랍니다.

반응형