캐시는 컴퓨터 과학에서 데이터나 값을 미리 복사해 놓는 임시 장소로, 이를 통해 계산이나 접근 시간 없이 더 빠른 속도로 데이터에 접근할 수 있다. 이러한 캐시를 통해 성능을 향상하고 부하를 감소할 수 있지만 캐시를 사용하는 방식에 따라 서비스에 다른 영향을 미칠 수도 있다.
Cache Aside(Lazy Loading)
Cache Aside(Lazy Loading) 방식은 캐시 히트, 즉 캐시에 데이터가 존재하면 캐시에서 데이터를 불러오고 그렇지 않으면(캐시 미스) 원본 데이터베이스에서 조회하여 반환하는 방식으로 이때 조회한 데이터를 캐시에 적재한다.
해당 방식은 실제 요청된 데이터만 캐시에 저장하므로 불필요한 캐싱을 줄일 수 있지만, 초기에 대량의 캐시 미스로 인해 데이터베이스에 부하가 발생할 수 있다는 단점이 존재한다.
또한 캐시에 문제가 발생해도 원본 데이터베이스에 직접 접근이 가능하기 때문에 서비스가 계속 작동할 수 있다. 하지만 캐시 미스가 발생하는 경우에만 캐시에 적재하고, 이때 적재된 데이터가 원본 데이터베이스와 달라질 수도 있다. 이를 캐시 불일치라 하고 이를 해결하기 위한 여러 쓰기 전략이 존재한다.
캐시 불일치 해결을 위한 쓰기 전략
캐시 불일치란 캐시에 적재된 데이터가 원본 데이터베이스와 서로 다른 상황을 말하고, Write Through, Cache Invalidation, Write Behind 방식으로 이러한 캐시 불일치를 해결할 수 있다.
Write Through
Write Through 방식은 데이터 변경 시 캐시와 원본 데이터 저장소에 데이터를 동시에 갱신하여 일관성을 유지하는 전략이다. 이로써 항상 최신 데이터를 보장하지만 쓰기 작업 시 2번의 쓰기가 발생하여 성능 저하가 있을 수 있다. 이때 캐시에 만료시간을 설정함으로써 불필요한 데이터가 캐시에 오래 머무르는 것을 방지하고 리소스 낭비를 줄일 수 있다.
Cache Invalidation
Cache Invalidation 방식은 원본 데이터가 만료되었을 때 캐시 데이터를 만료시키는 방식으로, Write Through 방식의 단점(2번 발생하는 쓰기 작업으로 인한 성능 저하)을 보완한 방식이다. 또한 데이터 변경 시 캐시에 데이터가 삭제되니 캐시 불일치에 대한 걱정을 하지 않아도 된다.
Write Behind(Write Back)
Write Behind(Write Back) 방식은 캐시를 먼저 업데이트하고 추후에 비동기 디스크 쓰기 작업 등으로 원본 데이터를 변경하는 방식으로 성능 향상을 가져올 수 있다. 하지만 원본 데이터와 캐시가 일시적으로 일치하지 않을 수 있기 때문에 쓰기 작업이 빈번하며 일시적인 캐시 불일치를 허용하는 서비스에서 사용될 수 있다.
뭔가 JPA의 영속성 컨텍스트의 쓰기 지연 방식과 비슷한 전략인 것 같다.
|
Write Behind(Write Back) |
JPA 쓰기 지연 (Flush) |
주요 목적 |
캐시 성능 최적화 |
트랜잭션 단위로 DB I/O 최적화 |
데이터 반영 시점 |
비동기적으로 나중에 갱신 |
트랜잭션 commit() 또는 flush() 시점 |
일시적인 데이터 불일치 |
발생 가능 |
발생 가능 |
적용 대상 |
캐시 -> 원본 데이터(DB) |
JPA 영속성 컨텍스트 -> DB |
역시 비슷하구만...