@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 |