Write-Through는 데이터를 저장할 때 캐시와 DB에 동시에(Simultaneously) 업데이트를 진행하는 방식이다.
캐시를 단순히 임시 저장소가 아닌 메인 저장소의 거울처럼 취급한다.
Spring에서는 @CachePut어노테이션을 사용하여 이 전략을 구현한다. @Cacheable이 캐시에 데이터가 있으면 메서드를 실행하지 않는 것과 달리, @CachePut은 항상 메서드를 실행하고 그 결과를 캐시에 업데이트한다.
@Service
public class ProductService {
@Autowired
private ProductRepository productRepository;
/**
* Write-Through 스타일: DB 저장과 동시에 캐시도 갱신함
*/
@CachePut(value = "products", key = "#product.id")
public Product updateProduct(Product product) {
// 1. DB 업데이트 (메서드 본문 실행)
Product updatedProduct = productRepository.save(product);
// 2. 반환된 값이 설정된 key(#product.id)로 Redis에 자동 저장됨
return updatedProduct;
}
}
| 장점 (Pros) | 단점 (Cons) |
|---|---|
| 강력한 데이터 정합성: 캐시가 항상 최신 데이터를 가지고 있어 '데이터 불일치' 걱정이 거의 없습니다. | 쓰기 지연(Latency): 매번 두 번의 쓰기 작업(Redis + DB)이 발생하므로 전체적인 서비스 속도가 느려질 수 있습니다. |
| 읽기 성능 최적화: 데이터가 생성/수정될 때 이미 캐시에 들어있으므로, 첫 읽기 시 Cache Miss가 발생하지 않습니다. | 리소스 낭비: 한 번 쓰고 다시는 읽지 않는 데이터까지 모두 캐시에 저장되어 메모리 공간을 차지합니다. |
Write-Through는 모든 곳에 쓰기에는 비용이 크다. 따라서 다음과 같은 상황에서 잘 쓰인다.
만약 DB에는 저장했는데 Redis 저장에 실패한다면? 혹은 그 반대라면? 이처럼 분산 시스템에서의 트랜잭션 관리가 Write-Through의 가장 까다로운 문제이다. 보통은 DB 트랜잭션 내에 캐시 갱신 로직을 포함시켜 정합성을 맞춘다.