haileyjpark

<가상 면접 사례로 배우는 대규모 시스템 설계 기초> 책 읽고 사례 탐구 (1) [캐시 사용] 본문

카테고리 없음

<가상 면접 사례로 배우는 대규모 시스템 설계 기초> 책 읽고 사례 탐구 (1) [캐시 사용]

개발하는 헤일리 2025. 2. 16. 23:21

<가상 면접 사례로 배우는 대규모 시스템 설계 기초> 책에 나오는 키워드로 미국 IT 기업에서 실제로 출제되는 질문 사례를 탐구해보는 스터디를 시작해서, 해당 스터디에서 다룰 내용을 블로그로 작성해보려고 합니다.

 

이번 글에서는 캐시(cache)를 활용한 성능 최적화에 대한 면접 사례를 찾아보았습니다.

 

LRU 캐시 설계

질문

LRU(Least Recently Used) 캐시를 설계하고 구현하는 방법을 설명해 주세요.

 

답변

LRU 캐시는 가장 오래 사용되지 않은 데이터를 제거하는 캐싱 기법입니다.

이를 구현하는 방법으로는 해시맵과 이중 연결 리스트를 조합하는 방식이 일반적입니다.

해시맵을 이용하면 데이터의 조회 속도를 O(1)로 유지할 수 있고, 이중 연결 리스트를 사용하면 데이터의 삽입 및 삭제가 O(1)로 수행됩니다. 

 

예를 들어, 온라인 쇼핑몰에서 고객이 최근 본 상품을 보여주는 기능을 구현한다고 가정해 보겠습니다.

고객이 상품 페이지를 방문할 때마다 해당 상품 ID를 캐시에 저장하고, 일정 개수 이상의 최근 본 상품만 유지하도록 LRU 캐시를 적용할 수 있습니다.

이렇게 하면 사용자가 자주 방문한 상품이 빠르게 로드될 수 있으며, 메모리를 효율적으로 사용할 수 있습니다.

 

코드 예시

class LRUCache {
    constructor(capacity) {
        this.capacity = capacity;
        this.cache = new Map();
    }

    get(key) {
        if (!this.cache.has(key)) return -1;
        const value = this.cache.get(key);
        this.cache.delete(key);
        this.cache.set(key, value);
        return value;
    }

    put(key, value) {
        if (this.cache.has(key)) {
            this.cache.delete(key);
        } else if (this.cache.size >= this.capacity) {
            this.cache.delete(this.cache.keys().next().value);
        }
        this.cache.set(key, value);
    }
}

 

 

트위터 시스템에서 캐시 활용

질문

트위터와 같은 시스템을 설계할 때, 캐시를 어떻게 활용하시겠습니까?

 

답변

트위터와 같은 소셜 미디어 시스템에서는 캐싱이 필수적입니다.

예를 들어, 인기 트윗을 Redis와 같은 메모리 캐시를 사용하여 저장하면, 데이터베이스 조회 부담을 줄이고 성능을 개선할 수 있습니다.

또한 사용자별 타임라인을 생성할 때, 자주 조회되는 트윗을 캐싱하여 빠른 응답 속도를 제공할 수 있습니다.

 

예를 들어, 트위터에서는 사용자의 타임라인을 빠르게 로드하기 위해 여러 단계의 캐싱을 활용합니다.

먼저, 사용자별 타임라인을 생성할 때, Redis에 자주 조회되는 트윗 ID 목록을 저장하여 빠르게 가져올 수 있도록 합니다.

그런 다음, 개별 트윗의 내용을 데이터베이스가 아닌 캐시에서 불러와 응답 속도를 높입니다.

또한, 인기 트윗(예: 좋아요와 리트윗 수가 높은 트윗)은 글로벌 캐시에 저장하여, 여러 사용자가 같은 데이터를 반복해서 요청할 때 성능을 향상시킵니다.

 

캐시 제거 정책

질문

캐시의 용량이 가득 찼을 때, 어떤 캐시 제거 정책을 사용할 것이며, 그 이유는 무엇입니까?

 

답변

일반적으로 많이 사용되는 정책은 LRU(Least Recently Used)입니다.

이는 가장 오래 사용되지 않은 데이터를 제거하는 방식으로, 웹 서비스와 같은 대규모 시스템에서 적절한 성능을 보장합니다.

예를 들어, 넷플릭스(Netflix)에서는 사용자들이 자주 시청하는 동영상 데이터를 빠르게 로드하기 위해 CDN(Content Delivery Network) 및 캐시를 적극적으로 활용합니다.

사용자가 특정 동영상을 시청하면, 해당 데이터가 캐시에 저장되는데, 캐시 공간이 한정되어 있기 때문에 LRU 정책을 적용하여 가장 오래 사용되지 않은 동영상 데이터를 삭제합니다.

이렇게 하면 최근 인기 있는 콘텐츠를 캐시에 유지하면서, 불필요한 데이터를 제거하여 성능을 최적화할 수 있습니다.

 

또한, 웹 브라우저에서도 LRU 정책을 활용하여 성능을 개선할 수 있습니다.

예를 들어, 크롬(Chrome) 브라우저는 사용자가 방문한 웹사이트의 정적 리소스(이미지, CSS, JavaScript 파일 등)를 캐시에 저장합니다.

그러나 캐시 용량이 제한적이므로, LRU 정책을 적용하여 가장 오래 방문하지 않은 웹사이트의 데이터를 삭제합니다.

이를 통해, 자주 방문하는 웹사이트는 빠르게 로드될 수 있으며, 필요 없는 캐시 공간을 효율적으로 관리할 수 있습니다.

 

분산 캐시 시스템 설계

질문

대규모 분산 시스템에서 캐시 일관성을 어떻게 유지하시겠습니까?

 

답변

분산 시스템에서는 캐시 일관성을 유지하기 어려울 수 있습니다. 이를 해결하기 위해 여러 전략이 사용됩니다.

  1. Write-through: 데이터가 캐시에 기록될 때 동시에 데이터베이스에도 저장하는 방식
  2. Write-back: 데이터가 캐시에 먼저 저장된 후 일정 시간이 지나거나 특정 조건에서 데이터베이스에 저장
  3. Cache Invalidation: 데이터베이스가 변경될 때 해당 데이터를 포함하는 캐시를 무효화하는 방식
  4. Consistent Hashing: 분산 캐시 시스템에서 데이터를 균등하게 배분하여 특정 캐시 서버의 부하를 줄이는 기법"

 

예를 들어, Amazon과 같은 글로벌 전자상거래 플랫폼에서는 수백만 명의 사용자가 동시 접속하여 상품 정보를 검색하고 장바구니에 담습니다. 이때, 분산 캐시 시스템을 활용하여 사용자 경험을 최적화해야 합니다.

그러나 상품 정보는 지속적으로 업데이트되며, 이를 반영하지 않으면 오래된 데이터가 사용자에게 노출될 위험이 있습니다.

 

1. Write-through 적용 사례: Amazon에서는 상품 재고 정보를 항상 최신 상태로 유지해야 합니다. 따라서 사용자가 상품을 장바구니에 추가하면, 데이터는 먼저 Redis 캐시에 저장되고, 동시에 관계형 데이터베이스(RDS)에도 기록됩니다. 이를 통해 일관성을 유지하면서도 빠른 조회가 가능합니다.

 

2. Write-back 적용 사례: Netflix와 같은 스트리밍 서비스에서는 사용자 시청 기록을 관리할 때 Write-back 전략을 적용합니다. 사용자가 영상을 시청할 때마다 Redis 캐시에 기록한 후, 일정 주기로 배치 프로세스를 통해 데이터베이스에 저장합니다. 이는 데이터베이스 부하를 줄이는 동시에 실시간 사용자 경험을 최적화하는 데 기여합니다.

 

3. Cache Invalidation 적용 사례: Twitter에서는 트윗 및 리트윗 수가 실시간으로 변동합니다. 특정 사용자가 트윗을 작성하거나 리트윗을 할 때마다 캐시에 저장된 트윗 정보를 무효화하고, 새 데이터를 캐싱하는 방식으로 최신 정보를 반영합니다. 이를 통해 캐시에 오래된 데이터가 남아 있지 않도록 보장합니다.

 

4. Consistent Hashing 적용 사례: Facebook에서는 프로필 사진과 같은 미디어 데이터를 여러 캐시 서버에 균등하게 배분하기 위해 Consistent Hashing을 사용합니다. 사용자가 프로필 사진을 변경하면, 기존의 특정 서버가 아닌, 변경된 데이터를 새로운 해시 기반 노드에 저장하여 부하를 균등하게 분산합니다. 이를 통해 특정 캐시 서버가 과부하되지 않고 안정적인 응답 시간을 유지할 수 있습니다.

이처럼, 대규모 시스템에서 캐시 일관성을 유지하는 것은 단순한 캐싱 정책을 넘어, 비즈니스 로직에 최적화된 전략을 적용해야 합니다. 이를 통해 성능을 극대화하면서도 데이터 일관성을 유지할 수 있습니다.

 

캐시의 장단점

질문

시스템 설계에서 캐시를 사용할 때의 장단점은 무엇입니까?

 

답변

 

1. 장점

  • 응답 속도 향상: 데이터를 메모리에서 바로 가져올 수 있어 성능이 개선됩니다.
    • 유튜브(YouTube)와 같은 플랫폼이라면 사용자들이 자주 보는 동영상을 캐시에 저장해야 합니다. 이를 통해 사용자가 같은 영상을 반복해서 조회할 때 서버가 원본 데이터를 다시 가져오지 않고 빠르게 응답할 수 있습니다. 특히, 썸네일 이미지나 메타데이터 같은 정보도 캐싱되어 사용자 경험을 향상시킬 수 있습니다.
  • 데이터베이스 부하 감소: 데이터베이스에 대한 읽기 요청이 줄어들어 서버 부담이 감소합니다.
    • 아마존(Amazon)같은 커머스 플랫폼의 상품 페이지는 수많은 사용자들이 동시에 조회합니다. 상품 상세 정보(예: 가격, 재고 상태, 리뷰)를 Redis 같은 캐시 시스템에 저장함으로써 데이터베이스 부하를 줄이고 페이지 로딩 속도를 개선할 수 있습니다. 이렇게 하면 실시간으로 변경되지 않는 데이터에 대해 빠른 응답을 제공할 수 있습니다.
  • 트래픽 비용 절감: 네트워크 호출 횟수를 줄여 비용을 절약할 수 있습니다.
    • 넷플릭스(Netflix) 서비스라면 전 세계적으로 분산된 CDN(Content Delivery Network)을 사용하여 영화와 TV 쇼 데이터를 캐싱할 것 같습니다. 이를 통해 사용자가 같은 콘텐츠를 시청할 때 네트워크 트래픽을 절감하고 스트리밍 속도를 높일 수 있습니다. CDN을 활용한 캐싱은 사용자 경험을 개선하고 운영 비용을 절감하는 핵심 기술입니다.

2. 단점 및 해결 방안

  • 데이터 일관성 문제: 캐시 데이터가 데이터베이스와 다를 수 있음 → 캐시 무효화 정책을 도입
    • 트위터(Twitter)를 예로 들면, 사용자가 새로운 트윗을 작성할 때, 기존 캐시 데이터가 오래된 상태일 수 있습니다. 이를 방지하기 위해 Write-through 캐싱을 적용하여 데이터베이스와 캐시를 동기화하거나, 변경된 트윗만 캐시를 무효화(invalidate)하여 최신 상태를 유지할 수 있습니다.
  • 메모리 비용 증가: 메모리 사용량이 늘어나 비용 부담이 증가할 수 있음 → LRU, LFU 같은 정책 적용
    • 인스타그램(Instagram)은 해시태그 검색 기능에서 인기 있는 태그를 캐싱하여 검색 속도를 높일 수 있습니다. 하지만 모든 데이터를 캐시에 유지하면 메모리 비용이 과도하게 증가할 수 있기 때문에 LRU(Least Recently Used) 정책을 적용하여 오랫동안 사용되지 않은 태그 데이터를 자동으로 제거합니다.
  • 복잡성 증가: 캐시 관리가 추가되면서 시스템 설계가 복잡해질 수 있음 → 캐시 계층 설계를 명확히 정의
    • 페이스북(Facebook)에서는 사용자 프로필 데이터를 캐싱할 때 다중 계층 캐시를 활용할 수 있습니다. 예를 들어, Memcached를 사용하여 자주 조회되는 프로필 정보를 저장하고, 데이터가 변경될 경우만 데이터베이스에서 최신 정보를 가져오도록 설계합니다. 이를 통해 복잡한 캐시 관리 문제를 해결하면서도 성능을 최적화할 수 있습니다.

 

 

질문 출처

1. Amazon System Design Interview Questions
2. Designing Twitter - A System Design Interview Question
3. Cache Eviction Policies | System Design

4. Design Distributed Cache | System Design

5. Caching - System Design Concept

반응형