Post

04 캐싱전략

04 캐싱전략

1. Note

  • 결론은 다 동일한데, 이걸 어떻게 해석하고 어떤 타이밍에 하는가에 대한 문제
  • 이론을 탄탄하게 복습하고 학습!
  • 체력도 길러야해..!

2. 캐싱

1. 캐싱

  • 자주 접근하는 데이터를 임시 저장소(메모리나 디스크)에 저장하여, 동일한 데이터 요청 시 더 빠르게 제공하는 기술
  • 캐싱은 속도와 성능을 향상시키기 위해 자주 사용하는 데이터의 중복 작업을 줄임
  • 저장소 유형
    • 인메모리 저장소: RAM에 데이터를 저장하여 빠르게 접근.
    • 디스크 기반 저장소: SSD/HDD에 캐싱 데이터를 저장(일반적으로 속도는 RAM보다 느림).

2. 캐싱의 장점

1. 속도 향상 (Performance)

  • 캐시는 메모리 기반으로 동작하여 DB 쿼리나 API 호출보다 훨씬 빠른 응답 제공
  • 동일 요청에 대해 반복적인 연산 없이 즉시 결과 반환
  • 예시: 검색 기능 캐싱
    • 사용자가 동일한 검색어를 반복 조회하는 경우 캐시에서 즉시 응답
    • 흐름
      1
      2
      
      요청 1 → DB 조회 → 결과 캐시 저장  
      요청 2 → 캐시 조회 → 즉시 응답
      
  • 효과
    • 응답 속도 대폭 개선
    • 사용자 체감 성능 향상

2. 부하 감소 (Load Reduction)

  • 반복 요청을 캐시가 처리하여 DB 및 API 서버의 부하 감소
  • 트래픽 증가 상황에서도 시스템 안정성 유지
  • 예시: 인기 게시글 조회
    • 조회수가 높은 게시글을 캐싱하여 DB 접근 최소화
    • 비교
      1
      2
      3
      4
      5
      
       [캐싱 전]
       1000명 요청 → DB 1000번 조회
        
       [캐싱 후]
       1000명 요청 → DB 1번 + 캐시 999번
      
  • 효과
    • DB 커넥션 및 CPU 사용량 감소
    • 트래픽 급증 상황에서도 안정적인 서비스 제공

3. 3. 비용 절감 (Cost Efficiency)

  • DB 호출 및 외부 API 요청 횟수를 줄여 인프라 비용 절감
  • 시스템 확장(Scale-up/Scale-out) 필요성 감소
  • 예시: 외부 API 호출 캐싱
    • 환율, 날씨 등 자주 조회되지만 자주 변하지 않는 데이터를 캐싱
    • 흐름
      1
      2
      
      요청 1 → 외부 API 호출 → 캐시 저장 (TTL: 24시간)  
      요청 2~N → 캐시 데이터 재사용
      
  • 효과
    • API 호출 횟수 감소
    • 과금 비용 절감 및 Rate Limit 대응

3. 캐싱 고려할점

1. 데이터 일관성 문제 (Consistency)

  • 캐시는 원본 데이터(DB 등)의 복사본이기 때문에
  • 데이터 변경 시 캐시와 실제 데이터 간 불일치(Stale Data) 발생 가능
  • 예시
    • 상품 가격이 변경되었지만 캐시에는 이전 가격이 남아있는 경우
    • 해결 방법
      • TTL(Time To Live) 설정으로 일정 시간 후 자동 갱신
      • 데이터 변경 시 캐시 직접 삭제 (Evict)

2. 메모리 용량 한계 (Memory Limit)

  • Redis, Local Cache 등은 메모리(RAM)를 사용하므로 저장 공간이 제한됨
  • 데이터가 많아질수록 메모리 부족 문제 발생 가능
  • 해결 방법
    • Eviction 정책 적용

      정책설명
      LRU가장 오래 사용되지 않은 데이터 제거
      LFU가장 적게 사용된 데이터 제거

3. 캐시 무효화 문제 (Cache Invalidation)

  • 데이터 변경 시 캐시를 언제/어떻게 갱신할지 결정하는 것이 어려움
  • 잘못 처리하면 오래된 데이터 제공
  • 예시
    • 게시글 수정 후에도 이전 내용이 계속 조회되는 문제
    • 해결 방법
      • Write 시 캐시 삭제 (Cache Evict)
      • 또는 캐시 갱신 (Write Through)

3. 캐싱 전략

1. 캐싱 조회 전략

  • 조회의 패턴은 거의 동일함.
  • 단지 캐싱 타이밍에 따라서 데이터가 있고 없음의 차이가 커서 전략이 구분됨
  • 조회패턴
    • 클라이언트가 데이터를 요청하면, 애플리케이션은 먼저 Redis 캐시에서 해당 데이터를 조회
    • 캐시에 데이터가 존재하면 Cache Hit
      • 즉시 캐시에서 데이터를 반환하여 매우 빠른 응답 속도를 제공
      • 추가적인 작업 없이 응답 완료
    • 캐시에 데이터가 없으면 Cache Miss
      • 애플리케이션은 DB와 같은 원본 데이터 소스에서 데이터를 조회
      • 조회된 데이터를 사용자에게 반환
      • 동시에 Redis 캐시에 저장하여 다음 요청에 대비

2. Cache-aside (캐시-어사이드) 패턴

1. Cache-aside

  • “쓰기 전략”이라기보다 “조회 중심 캐싱 전략”, 쓰기 시 처리 규칙도 같이 포함된 패턴이기는 함.

2. 데이터의 흐름

  • 데이터 변경 요청이 발생하면 애플리케이션은 먼저 DB를 업데이트
  • DB 업데이트가 완료된 후, 해당 데이터에 대한 캐시를 삭제(Evict)
  • 이후 동일 데이터 요청이 들어오면 Cache Miss가 발생하고, 최신 데이터가 다시 캐시에 저장됨

3. 장단점

  • 장점
    • 구조가 단순하고 구현이 쉬워 빠르게 도입 가능
    • 필요한 데이터만 캐싱하는 Lazy Loading 방식으로 메모리 효율이 좋음
    • 반복 요청을 캐시가 처리하여 DB 부하를 크게 줄이고 성능 향상
    • 캐시 또는 DB 장애 상황에서도 유연하게 fallback 처리 가능
    • Redis, 로컬 캐시 등으로 확장 및 변경이 쉬움
  • 단점
    • DB와 캐시가 분리되어 있어 데이터 일관성 문제가 발생할 수 있음
    • Cache Miss 시 결국 DB를 조회해야 하므로 첫 요청이 느릴 수 있음
    • 캐시 만료 시 다수 요청이 동시에 DB로 몰리는 Stampede 위험 존재
    • 데이터 변경 시 캐시 무효화(Evict) 로직을 직접 관리해야 함

3. Write-through (라이트-스루) 패턴

1. Write-through

  • 조회는 일반적인 Cache-First 패턴을 따르고
  • 쓰기 시 캐시와 DB를 동시에 업데이트해서 항상 캐시에 최신 데이터를 유지하는 방식

1. 데이터 흐름

  • 데이터 변경 요청이 발생하면 애플리케이션은 먼저 캐시에 데이터를 저장
  • 캐시에 저장된 데이터는 동시에 DB에도 함께 반영됨 (동기 처리)
  • 캐시와 DB가 항상 동일한 상태를 유지하도록 보장

3. 장단점

  • 장점
    • 데이터 변경 시 캐시와 DB가 동시에 업데이트되어 일관성이 높음
    • 읽기 시 항상 캐시에서 최신 데이터 조회 가능 (Cache Hit율 높음)
    • 캐시 무효화(Evict) 로직이 거의 필요 없어 관리가 단순함
    • 데이터 조회 시 DB 접근이 거의 없어 안정적인 성능 유지 가능
  • 단점
    • 쓰기 작업 시 DB와 캐시를 동시에 처리해야 하므로 성능 저하 가능
    • 사용되지 않는 데이터까지 캐시에 저장되어 메모리 낭비 발생 가능
    • 캐시 장애 발생 시 쓰기 작업 자체가 실패할 수 있음

4. Write-back (라이트-백) 패턴

1. Write-back

  • 캐시에 먼저 반영하고, DB에는 나중에 비동기적으로 반영하는 방식

2. 데이터 쓰기 흐름

  • 데이터 변경 요청이 발생하면 애플리케이션은 DB를 거치지 않고 먼저 캐시에 데이터를 저장
  • 캐시에 반영된 데이터는 사용자에게 즉시 응답으로 반환됨
  • 동시에 변경 내역은 큐나 버퍼에 저장되고, 이후 일정 시점에 DB에 비동기적으로 반영됨
  • 여러 번의 변경이 모여 한 번에 DB에 반영될 수 있음 (Batch 처리)

3. 장단점

  • 장점
    • 쓰기 작업을 캐시에만 먼저 반영하므로 매우 빠른 응답 속도 제공
    • DB 쓰기 횟수를 줄여 전체적인 시스템 부하 감소
    • 여러 번의 쓰기를 모아서 처리(batch) 가능해 효율적인 DB 사용 가능
    • 트래픽이 많은 쓰기 작업에서 높은 성능을 발휘
  • 단점
    • 캐시와 DB 간 데이터 불일치 가능성 (일관성 낮음)
    • 캐시 장애 시 아직 DB에 반영되지 않은 데이터 유실 위험 존재
    • 구현이 복잡하고, 동기화 및 장애 복구 로직 필요
    • 데이터 반영이 지연되므로 실시간성이 중요한 서비스에는 부적합

5. Write-around (라이트-어라운드) 패턴

1. Write-around (라이트-어라운드)

  • 쓰기 시 캐시를 거치지 않고 바로 DB(RDB)에 저장하는 방식
  • 갱신 주기 전까지는 데이터가 계속 처음과 같음.

2. 데이터 쓰기 흐름

  • 데이터 변경 요청이 발생하면 애플리케이션은 캐시를 거치지 않고 바로 DB에 데이터를 저장
  • 캐시는 이 과정에서 아무 작업도 수행하지 않음
  • 이후 해당 데이터에 대한 조회 요청이 들어올 때 Cache Miss가 발생하고, 그때 캐시에 데이터가 저장됨

3. 장단점

  • 장점
    • 쓰기 시 캐시를 거치지 않고 바로 DB에 저장하여 쓰기 성능이 안정적
    • 불필요한 데이터가 캐시에 쌓이지 않아 메모리 효율이 좋음
    • Write-heavy 환경에서 캐시 오염을 줄일 수 있음
    • 캐시에는 실제로 조회된 데이터만 남아 효율적인 활용 가능
  • 단점
    • 데이터 저장 직후에는 캐시에 없어서 첫 조회 시 Cache Miss 발생
    • 반복 조회되는 데이터라도 초기에는 DB를 거쳐야 하므로 성능 저하 가능
    • 캐시 적중률(hit rate)이 낮아질 수 있음
    • 읽기 성능 개선 효과가 Cache-Aside보다 떨어질 수 있음
This post is licensed under CC BY 4.0 by the author.