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() { ... }