backend-interview-guide

캐싱 (Caching)

목차

캐싱

캐시는 데이터를 더 빠르게 접근할 수 있는 위치에 저장하여 시스템의 성능을 향상시키는 기술입니다. 일반적으로 메모리와 같은 고속 스토리지에 자주 사용되는 데이터를 저장함으로써, 데이터베이스나 원격 서버에서 데이터를 가져오는 시간을 줄입니다. 캐시는 주로 다음과 같은 이유로 데이터베이스 시스템에서 중요합니다:

캐시는 주로 자주 접근되는 데이터(예: 인기 있는 상품 목록, 사용자의 세션 정보 등)에 대해 사용되며, 이러한 데이터는 데이터베이스보다 훨씬 빠르게 접근 가능합니다. 따라서 캐시를 올바르게 설정하면 애플리케이션의 전체적인 성능이 크게 향상됩니다.

캐시의 유형

캐시는 시스템의 아키텍처와 필요에 따라 다양한 유형으로 구현될 수 있습니다. 주요 캐시 유형은 다음과 같습니다:

클라이언트 측 캐시(Client-side Cache)

서버 측 캐시(Server-side Cache)

역방향 프록시 캐시(Reverse Proxy Cache)

CDN 캐시(Content Delivery Network Cache)

캐시 적중률(Cache Hit Ratio)

캐시 적중률(Cache Hit Ratio)은 캐시에 대한 전체 요청 중 캐시에서 데이터를 성공적으로 제공한 비율을 의미합니다. 이는 캐시의 효율성을 측정하는 중요한 지표로, 높은 적중률은 캐시가 효과적으로 작동하고 있음을 나타냅니다.

캐시 적중률 계산

캐시 적중률 = (캐시 히트 수 / 캐시 요청 수) × 100%

캐시 적중률을 높이기 위한 전략

캐시 무효화(Cache Invalidation)

캐시 무효화(Cache Invalidation)는 캐시에 저장된 데이터가 더 이상 유효하지 않을 때, 이를 제거하거나 갱신하는 과정입니다. 이는 일관성 문제를 방지하기 위해 중요합니다. 캐시에 저장된 데이터가 오래된 상태로 남아 있으면, 사용자가 잘못된 정보를 얻을 수 있기 때문에, 적절한 무효화 전략이 필요합니다.

캐시 무효화 전략

캐시 갱신 전략

캐시 갱신은 데이터 일관성을 유지하기 위해 매우 중요한 부분입니다. 캐시에서 데이터를 갱신하는 방식에는 여러 가지가 있으며, 각각의 방식은 시스템 요구사항에 따라 적합성이 달라집니다. 여기서는 Write-Through, Write-Behind, Write-Around 등 주요 캐시 갱신 전략을 자세히 설명하겠습니다.

Write-Through 캐시

설명

Write-Through 캐시 전략에서는 데이터가 캐시에 기록될 때, 동시에 데이터베이스(또는 원본 스토리지)에도 즉시 기록됩니다. 이 방법은 데이터 일관성을 보장하는 가장 간단하고 직관적인 방법 중 하나입니다.

동작 방식

장점

단점

사용 사례

Write-Behind (Write-Back) 캐시

설명

Write-Behind 또는 Write-Back 캐시 전략에서는 데이터가 캐시에 기록되지만, 데이터베이스에 즉시 반영되지 않고 일정 시간 후에 비동기적으로 기록됩니다. 이 방식은 캐시의 쓰기 성능을 높이는 데 중점을 둡니다.

동작 방식

장점

단점

사용 사례

Write-Around 캐시

설명

Write-Around 캐시 전략에서는 쓰기 작업이 캐시에 직접 기록되지 않고, 데이터베이스에만 기록됩니다. 이후에 데이터가 필요할 때, 그때 캐시에서 데이터를 가져오게 됩니다. 이는 읽기 성능을 중시하는 시스템에서 주로 사용됩니다.

동작 방식

장점

단점

사용 사례

캐시의 문제점

캐시는 성능 최적화에 큰 도움이 되지만, 잘못 설정하거나 관리하지 않으면 여러 문제가 발생할 수 있습니다. 주요 문제점과 해결 방법은 다음과 같습니다:

캐시 일관성 문제(Cache Inconsistency)

문제

데이터베이스와 캐시 사이에 데이터 불일치가 발생할 수 있으며, 이는 잘못된 정보를 제공하게 만듭니다.

해결 방법

캐시 무효화 전략을 적절히 설계하고, TTL 설정, 쓰기-스루, 쓰기-비하인드 캐시와 같은 일관성 유지 기법을 사용하여 문제를 최소화합니다.

캐시 스탬피드(Cache Stampede)

문제

캐시가 만료되거나 비워진 경우, 다수의 클라이언트가 동시에 데이터베이스에 접근하려고 할 때, 데이터베이스에 과부하가 발생하는 현상입니다.

해결 방법

랜덤하게 TTL을 설정하여 캐시 만료 시간을 분산시키거나, 잠금 메커니즘을 도입하여 한 번에 하나의 요청만이 데이터를 갱신하도록 합니다.

캐시 과부하(Cache Overload)

문제

캐시가 너무 많은 데이터를 저장하려고 하거나, 캐시에 대한 요청이 너무 많을 때 발생합니다. 이는 캐시 자체의 성능 저하를 초래할 수 있습니다.

해결 방법

캐시의 크기를 적절히 설정하고, LRU와 같은 효율적인 캐시 교체 알고리즘을 사용하여 자주 사용되지 않는 데이터를 제거합니다.

캐시 독립성(Cache Dependency)

문제

애플리케이션이 캐시에 지나치게 의존하게 되어, 캐시 장애 시 전체 시스템의 성능이 크게 저하될 수 있습니다.

해결 방법

캐시 장애를 대비한 적절한 폴백(Fallback) 메커니즘을 설계하고, 캐시가 사용 불가능할 때에도 시스템이 기능할 수 있도록 해야 합니다.

네트워크 지연(Network Latency)

문제

분산 캐시 시스템에서 네트워크 지연이 발생하여 캐시 접근 속도가 느려질 수 있습니다.

해결 방법

캐시 서버를 클라이언트에 가깝게 배치하거나, 데이터 센터 내에서 로컬 캐시를 사용하는 방법으로 네트워크 지연을 줄입니다.