BE/Spring & Spring Boot

[Spring Boot] @CacheEvict

baek-dev 2025. 4. 15. 19:00

@CacheEvict 이란 무엇인가

@CacheEvict 는 Spring Framework 에서 캐시(Cache)를 비우는 데 사용하는 어노테이션임.
스프링 캐시 추상화(Cache Abstraction) 기능과 함께 사용되며, 캐시에 저장된 데이터를 명시적으로 삭제할 때 활용함.
주로 데이터 변경이 발생하는 시점에서 사용하여, 캐시에 저장된 오래된 데이터를 제거하고 최신 데이터를 반영하도록 유도함.

캐싱은 시스템 성능을 향상시키지만, 데이터가 변경되었을 때는 반드시 캐시를 갱신하거나 삭제해야 데이터 불일치 문제를 방지할 수 있음. 이를 위해 사용하는 것이 @CacheEvict 임.


1. @CacheEvict의 주요 속성

속성 설명
value 또는 cacheNames 대상 캐시 이름 (캐시 저장소 구분)
key 제거할 캐시의 키 (SpEL 표현식 사용 가능)
allEntries 캐시에 저장된 모든 항목을 제거할지 여부 (기본값 false)
beforeInvocation 메서드 실행 전에 캐시를 비울지 여부 (기본값 false)

2. 기본 사용법

예제 1: 특정 캐시 항목 제거

@CacheEvict(value = "products", key = "#productId")
public void deleteProduct(Long productId) {
    productRepository.deleteById(productId);
}

 

설명:

  • products 캐시에 있는 productId 와 일치하는 캐시 데이터를 삭제함.
  • 주로 삭제/수정 로직과 함께 사용하여 데이터 일관성을 유지할 수 있음.

예제 2: 캐시의 모든 항목 제거

@CacheEvict(value = "products", allEntries = true)
public void clearCache() {
    // 캐시에 저장된 모든 products 캐시 데이터 삭제
}

 

설명:

  • allEntries = true 로 지정하면 지정된 캐시의 모든 데이터를 삭제함.
  • 주로 배치 처리나 대량 수정이 발생했을 때 사용하면 유용함.

예제 3: 메서드 실행 전에 캐시 삭제

@CacheEvict(value = "products", allEntries = true, beforeInvocation = true)
public void clearCacheOnError() {
    throw new RuntimeException("에러 발생");
}

 

설명:

  • beforeInvocation = true 로 지정하면 메서드 실행 전 캐시를 비움.
  • 메서드 실행 중 예외가 발생해도 캐시 삭제가 반드시 수행됨.

3. 실무 사용 시 고려사항

  • 데이터 변경이 일어날 때 반드시 사용해야 함
    • 데이터베이스에서 삭제 또는 수정이 일어날 때 캐시도 반드시 갱신하거나 삭제해야 데이터 불일치 문제를 방지할 수 있음.
  • 캐시 키 정확성 중요
    • 잘못된 키를 사용하면 의도치 않은 캐시 삭제가 일어날 수 있으므로, 키 스펙을 정확히 이해하고 사용할 필요가 있음.
  • allEntries 사용 주의
    • 캐시 전체를 삭제하는 옵션은 성능에 영향을 줄 수 있으므로 신중하게 사용해야 함.
  • 트랜잭션과의 관계
    • 트랜잭션 내부에서 캐시를 비우는 경우, 트랜잭션 롤백 시 캐시 일관성 문제가 발생할 수 있으므로 beforeInvocation 옵션 사용을 고려해야 함.

4. @CacheEvict vs @CachePut vs @Cacheable

어노테이션 역할
@Cacheable 캐시에 데이터가 없을 때 메서드를 실행하고 결과를 캐시에 저장함
@CachePut 메서드를 실행하고, 반환 값을 캐시에 저장하여 갱신함
@CacheEvict 캐시에 저장된 데이터를 삭제함

 

요약하자면,

  • 조회 시에는 @Cacheable
  • 수정 시에는 @CachePut
  • 삭제 시에는 @CacheEvict 을 사용하는 것이 일반적인 패턴임.

5. 실무 활용 사례

  • 상품 정보 캐시 관리
    • 상품 정보를 수정하거나 삭제할 때 @CacheEvict 을 사용하여 관련 캐시를 비워줌.
  • 게시글 캐시 관리
    • 게시글이 수정되거나 삭제될 때 게시글 상세 캐시를 삭제하여 일관성 유지함.
  • 배치 처리 이후 캐시 초기화
    • 대량의 데이터가 변경되는 배치 처리 후 캐시를 비워 데이터 최신성을 유지함.
  • 트랜잭션 내 캐시 삭제
    • 트랜잭션이 시작되기 전에 캐시를 삭제할 때 beforeInvocation = true 옵션을 활용함.

정리

@CacheEvict 은 스프링에서 제공하는 캐시 삭제 어노테이션으로, 데이터베이스와 캐시 간 일관성을 유지하는 데 필수적인 역할을 함.
특히 데이터가 변경될 때 적절하게 캐시를 삭제하여 최신 데이터를 제공하도록 관리할 수 있음.
속성으로는 value, key, allEntries, beforeInvocation 등이 있으며, 상황에 따라 적절히 활용하면 시스템 성능과 데이터 일관성을 함께 확보할 수 있음.

 

 

 

 

 

출처 : ChatGPT

'BE > Spring & Spring Boot' 카테고리의 다른 글

[Spring Boot] Spring JDBC  (0) 2025.04.22
[Spring Boot] 웹소켓  (1) 2025.04.19
[Spring Boot] 소셜로그인  (1) 2025.04.07
[Spring Boot] WebFlux  (0) 2025.04.01
[Spring Boot] DAO와 Repository의 차이?  (1) 2025.03.31