AOP 관점에서의 캐시

메서드 호출 결과를 캐시에 저장해 재사용할 수 있게 해주는 프레임워크.

캐시 저장소 종류(EnCache, Caffeine, Redis)상관없이 일관된 방식으로 캐시 기능 사용할 수 있도록 인터페이스 제공하는게 핵심임.

다음의 핵심 구성 요소로 이루어져있음.

  1. Cache
    1. 캐시 저장소 자체를 가리킴.
  2. CacheManager
    1. 캐시 저장소를 관리하는 관리자 인터페이스
    2. 캐시 구현체에 따라 여러 관리자가 있음.
      • RedisCacheManager
      • CaffeineCacheManager
      • ConcurrentMapCacheManager
      • EhCacheCacheManager 등…
  3. 주요 캐시 애너테이션

스프링 캐시는 AOP 프록시 기반으로 동작함. 애너테이션 등으로 캐시가 적용된 메서드를 호출하면 프록시 객체가 요청을 가로채서 캐시를 적용하는 방식.

이 프록시가 key 생성 → 캐시매니저에게 캐시에서 key 조회 → 값이 있으면 바로 반환 → 없으면 메서드 본문 실행. 이런식으로 동작함.

주의할 점

  1. 캐시 불일치(Cache Inconsistency) 문제

Spring Cache는 “읽기 중심”으로 설계되었음.

따라서 데이터 변경이 일어날 때는 반드시 @CachePut or @CacheEvict가 필요함.

  1. 동시성 문제 (Cache Stampede)

Spring Cache는 기본적으로 동기적 캐싱이라 다음 문제가 발생 가능함.