@Cacheable, @CachePut, @CacheEvict

양성준·2025년 7월 20일

스프링

목록 보기
48/49

Spring Cache는 어노테이션 기반으로 캐시 기능을 손쉽게 구현할 수 있도록 지원한다.

1. @Cacheable

  • 메서드의 실행 결과(리턴값)를 캐시에 저장.
  • 동일한 파라미터로 메서드가 호출될 경우, 실제 메서드를 실행하지 않고 캐시에 저장된 값을 반환한다.
  • 조회에 특화: 캐시에 값이 존재하면 캐시 데이터를 반환, 없을 때만 실제 메서드 실행 후 결과를 캐시에 저장.
  • cacheNames/value, key, condition, unless 등 다양한 속성 사용 가능.
  • 적절한 사용 시점
    • 데이터베이스 혹은 외부 API 등 고비용 처리 결과를 재사용할 때.
    • 변경이 자주 일어나지 않는 읽기 전용 데이터나 조회가 빈번한 데이터에 적합.
      • "상품 상세정보 조회" → 상품 변경이 자주 없어 캐시 활용 효율적일 때.
@Cacheable(cacheNames = "users", key = "#userId")
public User getUser(Long userId) { ... }

2. @CachePut

  • 항상 메서드를 실행하고, 그 결과를 캐시에 저장.
  • @Cacheable과 달리, 캐시를 조회하지 않고 반드시 메서드를 실행한다.
  • 데이터 갱신에 특화: 해당 메서드가 호출될 때마다 캐시 값을 반드시 최신으로 갱신.
  • cacheNames/value, key, condition, unless 등 속성 사용 가능.
  • 적절한 사용 시점
    • 데이터 수정(갱신) 후, 캐시를 최신 데이터로 반드시 반영해야 할 때.
    • 예: 사용자 정보 수정, 상품 정보 업데이트 등에서 DB와 캐시 일관성을 유지 필요.
      • "회원 정보 수정" → DB 업데이트와 동시에 캐시도 최신 정보로 갱신할 때.
@CachePut(value = "users", key = "#user.id")
public User updateUser(User user) { ... }

3. @CacheEvict

  • 메서드가 실행될 때 캐시에서 특정 데이터(또는 전체)를 삭제(무효화).
  • 캐시 제거 전용: 삭제할 캐시의 key, 전체 삭제 여부(allEntries), 삭제 타이밍(beforeInvocation) 등 다양한 옵션 지원.
  • 조건(condition), unless를 통한 동적 삭제 가능.
  • 적절한 사용 시점
    • 데이터가 삭제 또는 구조적으로 변경될 때, 오래된 캐시 데이터의 사용을 방지하고 싶을 때.
    • 생성(Update) 및 삭제(Delete) 후 캐시 데이터 유효성 보장 필요시.
      • "게시글 삭제" → 삭제 작업과 함께 해당 게시글 캐시를 무효화하여 불필요한 로딩 방지할 때.
@CacheEvict(value = "users", key = "#userId")
public void deleteUser(Long userId) { ... }

// 전체 캐시 비우기 예시
@CacheEvict(value = "users", allEntries = true)
public void evictAllUsers() { ... }
profile
백엔드 개발자를 꿈꿉니다.

0개의 댓글