Cache Write-Through와 Cache-Aside 전략 비교
Cache Write-Through와 Cache-Aside 방법 모두 다 궁극적으로는 읽기 성능을 향상시키기 위함이다.
캐싱을 사용하는 가장 주된 목적 자체가 디스크(DB)와 같은 느린 저장소의 I/O 부하를 줄이고 데이터를 읽어오는 시간을 줄이는 것이기 때문이다.
캐싱 전략들은 읽기 성능 향상이라는 공통된 목표를 가지고 있지만, 데이터를 쓰는(Write) 방식에 따라 캐시와 DB 간의 데이터 일관성을 어떻게 관리하고 언제 보장할지가 달라진다.
이러한 일관성 관리 방식의 차이가 결과적으로 쓰기 성능, 캐시 구현의 복잡도, 특정 상황에서의 읽기 성능에 영향을 미치게 된다.
Cache Write-Through와 Cache-Aside는 언뜻 비슷해 보이지만, 동작 방식에 차이가 있어서 이를 명확히 하고자한다.
결과적으로 두 방식은 "읽기 시점의 동작 방식"은 비슷해 보일 수 있지만, 데이터를 쓰는 시점과 일관성을 보장하는 방식에서 결정적인 차이가 있다.
1. Write Through (쓰기 동시성 강조)
쓰기 시점
쓰기(Write) 시 애플리케이션이 데이터를 쓸 때, 캐시와 DB에 동시에 데이터를 기록한다.
쓰기 작업은 캐시와 DB 모두 쓰기가 성공적으로 기록되어야 완료된 것으로 간주된다.
목표: 쓰기 작업이 완료되는 순간, 캐시와 DB의 데이터가 항상 일관되도록 보장한다.
장점:
캐시와 DB 간의 데이터 불일치 가능성이 매우 낮다.
읽기 시 항상 최신 데이터를 캐시에서 얻을 확률이 높다.
단점:
쓰기 작업이 캐시와 DB 모두에 기록되어야 하므로, 쓰기 성능이 Cache Aside보다 느릴 수 있다.
동작 방식:
사용자 쓰기 요청 -> 캐시 & DB에 동시 쓰기 -> 쓰기 완료
읽기 시점
캐시에 데이터가 있는지 확인 (Cache Hit) -> 캐시에서 읽기
캐시에 데이터가 없으면 (Cache Miss) -> DB에서 읽어와 캐시에 저장 후 반환
2. Cache Aside (읽기 최적화)
쓰기 시점
서버에서 쓰기 작업을 진행할 때, 먼저 DB에 데이터를 기록한다.
그 후, 캐시에 있는 데이터를 무효화(Invalidate)하거나 갱신(Update)한다.
목표: 읽기 시점에 캐시 미스가 발생했을 때 최신 데이터를 먼저 DB에서 읽고 캐시에 최신 데이터를 유지한다.
장점:
DB 쓰기 작업이 캐시와 분리된다. 즉, 종속되지 않는다.
쓰기 성능이 Write Through보다 빠를 수 있다.
캐시 장애가 DB 쓰기에 영향을 주지 않는다.
단점:
DB 쓰기와 캐시 무효화/갱신 사이에 짧은 시간 동안 데이터가 동기화되지 않을 수 있다.
처음 캐시 조회 시 Cold Cache 문제로 첫 읽기 성능 저하가 발생할 수 있다.
동작 방식:
사용자 쓰기 요청 -> DB에 쓰기 -> 캐시 무효화/갱신 -> 쓰기 완료
읽기 시점
캐시에 데이터가 있는지 확인 (Cache Hit) -> 캐시에서 읽기
캐시에 데이터가 없으면 (Cache Miss) -> DB에서 읽어와 캐시에 저장 후 반환
핵심 차이 요약
결론적으로, "언제 어떻게 데이터 일관성을 보장하느냐"의 차이가 핵심이다.
Write Through는 쓰는 시점에 캐시와 DB의 완전한 동기화를 강제하여
즉각적인 일관성을 추구한다.Cache Aside는 DB 쓰기 자체를 우선시하고, 캐시 갱신은 별도의 작업으로 처리하며, 읽기 시점에 최종적인 일관성을 맞춘다.
Write Through는 쓰기 시점의 강력한 동시성과 일관성을 보장한다.
캐시와 DB 쓰기가 모두 성공해야 쓰기 작업이 완료되었다고 간주한다.
쓰기 작업이 성공하면, 캐시와 DB는 동일한 최신 데이터를 보장하기 때문에 일관성을 의미한다.
캐시와 DB 모두 쓰기 작업이 진행되므로, 응답 시간이 길어질 수 있다.
Cache Aside는 쓰기 시점의 분리된 작업과 읽기 시 일관성을 보장한다.
DB에 먼저 쓰기 작업을 성공한 후, 별도의 작업으로 캐시를 무효화하거나 갱신한다.
두 작업 사이에 데이터 불일치 발생할 가능성이 있다.
DB 쓰기는 성공했지만 캐시 무효화 혹은 갱신이 실패하거나 지연될 수 있다.
이 전략의 핵심 일관성 보장은
"읽기"시점에 발생한다.캐시에 데이터가 없으면 DB에서 조회해서 캐시를 갱신하는 방식으로 최종적인 일관성을 맞춘다.
쓰기 시 갱신을 하더라도, 만약 캐시 갱신이 실패하면 다음 읽기 시 캐시 미스가 발생하여 DB에서 먼저 최신 데이터를 조회해서 가져오는 메커니즘이 동작한다.
따라서 두 전략 모두 읽을 때는 캐시를 먼저 확인하고 없으면 DB에서 가져오는 것은 동일하지만,
데이터를 쓸 때 캐시와 DB를 어떻게 동기화하고 일관성을 언제 보장하느냐에서 큰 차이가 있다.
만약 빈번한 쓰기 상황에서 Write Through와 Cache Aside를 선택해야 한다면 동시 쓰기 오버헤드가 더 적은 Cache Aside 전략이 좀 더 유리할 수 있다.
Last updated