노트

읽기 캐시 전략

Cache-Aside and Read-Through Caching

백엔드#performance · 연결된 개념 10개

쉽게 말하면

읽기 캐시는 자주 찾는 서류를 멀리 있는 창고(DB) 대신 책상 위에 꺼내 두는 거예요. 책상에 있으면 바로 쓰고, 없을 때만 창고에 다녀와서 책상에도 올려 두니 빠르고 창고도 덜 붐비죠.

비유가 깨지는 곳 책상 위 사본은 창고 원본이 바뀌어도 저절로 바뀌지 않아요. 그래서 TTL로 유효기간을 두고, DB를 고친 뒤 캐시를 지우는 순서를 정해 둬요. 재시작하면 캐시가 사라진다는 점도 감안해요.

값비싼 연산 결과나 자주 읽는 데이터를 DB보다 빠른 메모리 저장소에 두고, 읽을 때 캐시를 먼저 보는 전략. 응답 속도를 높이고 DB 부하를 줄이며, 캐시 계층만 따로 확장할 수도 있다.

읽기 흐름

  1. 요청이 오면 캐시에 값이 있는지 본다
  2. 있으면 바로 돌려준다(캐시 히트, Cache Hit)
  3. 없으면 DB에서 읽어 캐시에 넣고 돌려준다(캐시 미스, Cache Miss)

애플리케이션이 이 흐름을 직접 짜면 cache-aside(지연 로딩), 캐시 라이브러리나 계층이 DB 조회까지 대신해 주면 read-through라고 구분한다. 흐름은 같고 책임이 누구에게 있느냐가 다르다.

설계할 때 정할 것

  • 만료(Time To Live, TTL): 너무 짧으면 DB를 자주 치고, 너무 길면 옛 데이터를 보여 준다
  • 일관성: DB를 고친 뒤 캐시를 지우거나 갱신하는 순서를 정한다. 완벽한 동기화는 어렵다
  • 휘발성: 캐시는 재시작하면 사라진다. 중요한 데이터는 영속 저장소에 둔다
  • 방출 정책(Eviction Policy): 공간이 차면 무엇을 버릴지. 가장 오래 안 쓴 것(Least Recently Used, LRU), 가장 적게 쓴 것(Least Frequently Used, LFU) 등(LRU 캐시와 캐시 계층 비교)
  • 크기와 SPOF(Single Point of Failure): 너무 작으면 자주 밀려나고 너무 크면 낭비다. 캐시 서버 하나에 의존하지 않게 분산한다

캐시 서버로는 Redis (인메모리 저장소)가 대표적이다. 같은 원리가 계층마다 반복된다. JPA의 1차 캐시, 브라우저의 HTTP 캐시, 프런트엔드의 TanStack Query·Next.js 캐시 계층. 전체 흐름은 사용자 수에 따른 규모 확장.

출처: 『가상 면접 사례로 배우는 대규모 시스템 설계 기초』 알렉스 쉬 (원서 System Design Interview – An Insider's Guide) 1장

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • DB 인덱스와 트레이드오프

    DB 인덱스는 특정 컬럼 값으로 행을 빨리 찾도록 테이블 옆에 따로 유지하는 보조 자료구조(auxiliary data structure)다. 관계형 DB의 기본 인덱스는 정렬된 균형 트리(B-tree 계열)라서, 전체를 훑지 않고 트리를 따라 내려가 원하는 행에 닿는다.

  • React.cache

    cache(fn)은 서버 컴포넌트(Server Component)용 React API(Application Programming Interface)로, 함수 결과를 한 번의 서버 요청(렌더) 동안만 기억한다. 같은 요청 안에서 같은 인자로 여러 번 불러도 실제 실행은 한 번이다. React 19 정식 API이며 서버 컴포넌트에서만 쓴다.

  • 최종 일관성

    최종 일관성(eventual consistency)은 "지금 당장은 저장소마다 값이 다를 수 있지만, 새 변경이 멈추면 결국 같아진다"는 보장이다. 원본 DB와 검색 색인·캐시·다른 서비스처럼 물리적으로 분리된 저장소를 한 트랜잭션으로 묶을 수 없을 때 받아들이는 일관성 모델(consistency model)이다.

  • 데이터베이스 다중화

    같은 데이터를 여러 DB 서버에 복제해 두는 것. 가장 흔한 형태는 원본을 가진 주(Primary) 서버가 쓰기를 받고, 사본을 받는 부(Replica) 서버들이 읽기를 나눠 맡는 구조다.

  • 읽기 전용 복제본

    읽기 전용 복제본은 주 DB(primary, writer)의 데이터를 복제해 읽기 요청만 받는 DB 인스턴스다. 쓰기는 writer 한 곳에서 처리하고, 읽기를 여러 복제본으로 나눠 부하를 분산한다.

보기 옵션