Skip to main content
캐시를 효과적으로 관리하려면 적절한 시점에 무효화(Invalidation)해야 합니다. Sonamu는 다양한 무효화 방법을 제공합니다.

무효화가 필요한 이유

캐시는 성능을 향상시키지만, **오래된 데이터(Stale Data)**를 반환할 수 있습니다.
해결책: 데이터 변경 시 관련 캐시를 무효화

무효화 방법

1. 특정 키 삭제

가장 기본적인 방법입니다.
문제점: 키를 정확히 알아야 하고, 관련된 모든 캐시를 일일이 삭제해야 함

2. Tag 기반 무효화 (권장)

태그를 사용하면 관련 캐시를 그룹으로 삭제할 수 있습니다.
결과: findById()findAll() 캐시가 모두 삭제됨

3. 여러 키 삭제

4. 전체 캐시 삭제

주의: 프로덕션에서는 신중하게 사용

Tag 전략

계층적 태그 설계

선택적 무효화

동적 태그

특정 엔티티에만 영향을 주는 태그를 동적으로 생성합니다.
주의: BentoCache의 @cache 데코레이터는 정적 태그만 지원합니다. 동적 태그가 필요하면 직접 캐시를 조작해야 합니다:

실전 예제

1. 게시글 + 댓글 무효화

2. 사용자 + 권한 무효화

3. 카테고리 계층 구조

4. 집계 데이터 무효화

Namespace를 활용한 격리

Namespace를 사용하면 사용자별, 테넌트별로 캐시를 격리할 수 있습니다.

사용자별 캐시

멀티 테넌트

무효화 전략

1. Eager Invalidation (즉시 무효화)

데이터 변경 즉시 캐시를 삭제합니다.
장점:
  • 간단하고 명확
  • 오래된 데이터 없음
단점:
  • 캐시가 자주 삭제되어 히트율 감소

2. Lazy Invalidation (지연 무효화)

TTL에 의존하여 자동 만료를 기다립니다.
장점:
  • 높은 캐시 히트율
  • 간단한 코드
단점:
  • 최대 5분간 오래된 데이터 가능

3. Hybrid (하이브리드)

중요한 변경은 즉시 무효화, 사소한 변경은 TTL 의존:

4. Write-Through (쓰기 시 갱신)

캐시를 삭제하지 않고 갱신합니다.
장점:
  • 캐시가 항상 최신 상태
  • 높은 히트율
단점:
  • 복잡한 캐시 키 관리
  • 쓰기 성능 저하

분산 환경에서의 무효화

Bus를 사용한 동기화

여러 서버가 있을 때, Bus를 사용하면 무효화가 모든 서버에 전파됩니다.
작동 방식:

Bus 없이 사용하는 경우

Bus가 없으면 각 서버의 L1은 독립적입니다:
문제:
해결책:
  1. Bus 추가 (권장)
  2. L1 없이 L2만 사용 (느림)
  3. 짧은 TTL 사용 (오래된 데이터 허용)

모니터링

캐시 키 확인

태그로 무효화 전 확인

무효화 전에 영향받는 키를 확인할 수는 없지만, 태그를 일관되게 사용하면 예측 가능합니다.

주의사항

캐시 무효화 시 주의사항:
  1. 과도한 무효화 지양: 너무 자주 무효화하면 캐시 효과가 감소
  2. 태그 일관성 유지: 태그를 일관되게 사용해야 무효화가 정확함
  3. 순환 무효화 방지: A가 B를 무효화하고 B가 A를 무효화하면 무한 루프
  4. 분산 환경에서는 Bus 필수: Bus 없이 여러 서버를 운영하면 불일치 발생

다음 단계

캐시 설정

Stores와 Drivers 설정하기

@cache 데코레이터

메서드에 캐시 적용하기

캐시 전략

TTL, Grace, Namespace 활용