티스토리 뷰

반응형

✅ 압박면접 대응 시리즈 29편: 캐싱(Cache) 전략 설계 — Redis, CDN, Memory Cache 실무 적용 사례

압박면접에서 “캐싱은 어디에 적용하시나요?”라는 질문은 단순히 Redis 사용 경험을 확인하는 게 아닙니다.
면접관은 이렇게 생각합니다.

“이 지원자는 캐시를 아키텍처 레벨에서 이해하는가?”
“데이터 일관성과 성능 사이에서 타협점을 설정할 줄 아는가?”

이번 글에서는 캐시의 원리, 다층 캐싱 구조 설계, Redis와 CDN 활용 사례,
그리고 실제 장애 대응 사례 기반 답변 전략을 정리했습니다.


📌 1. 캐시(Cache)란 무엇인가

자주 사용되는 데이터를 임시 저장해 접근 속도를 높이고 시스템 부하를 줄이는 기술

즉, “다시 계산하거나 다시 요청하지 않기 위해 기억하는 것”이 캐시입니다.

계층 예시 목적

브라우저 캐시 HTML, JS, CSS 클라이언트 렌더링 속도 향상
CDN 캐시 이미지, 정적 자산 글로벌 응답 지연 최소화
서버 캐시 (Redis) DB 조회 결과 DB 부하 감소
애플리케이션 메모리 캐시 LRU Cache, In-Memory Map 초단기 저장으로 속도 향상

📌 핵심 포인트:

“캐시는 빠르지만, 결국 ‘진실의 원본(Source of Truth)’은 아니다.”


📌 2. 캐시 전략의 기본 구조

graph LR
A[Client] --> B[CDN Cache]
B --> C[Server Cache (Redis)]
C --> D[DB]

요청은 CDN → Redis → DB 순으로 내려가며,
가장 가까운 계층에서 응답을 반환합니다.


📌 3. 캐시 키 설계 전략

반응형
const key = `user:${userId}:posts`;
const cached = await redis.get(key);
if (cached) return JSON.parse(cached);

const posts = await db.post.findMany({ where: { userId } });
await redis.set(key, JSON.stringify(posts), "EX", 60 * 5);
return posts;

설계 원칙 설명

네임스페이스 분리 user:, order: 등 prefix 관리
만료시간 설정(TTL) 데이터의 신선도 유지
캐시 무효화 전략 데이터 변경 시 키 삭제/갱신

📌 면접 포인트:

“캐시 무효화는 ‘언제 지워야 하는가’가 가장 중요한 설계 포인트입니다.”


📌 4. 캐시 무효화 전략 (Cache Invalidation)

방식 설명 예시

Time-based (TTL) 일정 시간이 지나면 자동 만료 뉴스, 실시간 랭킹
Event-based 데이터 변경 시 수동 삭제 상품 정보, 재고
Write-through DB에 쓰기 시 캐시도 갱신 실시간 거래
Lazy Invalidation 요청 시 검증 후 삭제 사용자 상태

📌 핵심 문장:

“모든 캐시는 언젠가 부패한다. 캐시는 ‘정확성’보다 ‘적시성’을 추구해야 한다.”


📌 5. Redis 캐시 구조 설계

✅ ① 단일 레벨 캐시

  • API → Redis → DB
  • TTL: 5~10분 설정
  • JSON 직렬화 후 저장

✅ ② 다중 레벨 캐시

  • Memory Cache (1초 이하 재호출)
  • Redis Cache (수 초~수 분)
  • DB Access (수십 초 이상 갱신)
import LRU from "lru-cache";

const memoryCache = new LRU({ max: 100, ttl: 1000 });

export async function getUser(id) {
  const mem = memoryCache.get(id);
  if (mem) return mem;

  const cached = await redis.get(`user:${id}`);
  if (cached) {
    memoryCache.set(id, JSON.parse(cached));
    return JSON.parse(cached);
  }

  const user = await db.user.findUnique({ where: { id } });
  await redis.set(`user:${id}`, JSON.stringify(user), "EX", 300);
  memoryCache.set(id, user);
  return user;
}

📌 면접 포인트:

“Redis 캐시 외에도 메모리 캐시(LRU)를 추가해 2중 구조로 성능을 극대화했습니다.”


📌 6. CDN 캐싱 전략

  • Cloudflare, AWS CloudFront, Fastly 등 활용
  • 정적 자원(JS, CSS, 이미지) 캐싱으로 전송 시간 최소화
Cache-Control: public, max-age=86400
ETag: "abc123"

📌 면접 포인트:

“CDN 캐싱으로 글로벌 사용자 응답 속도를 40% 단축했습니다.”


📌 7. 실무 적용 사례

상황:
트래픽 급증 이벤트 중 DB 부하로 전체 서비스 응답 지연 발생

해결:

  1. Redis + MemoryCache 2단 구조 도입
  2. TTL 5분 설정 + 게시물 수정 시 캐시 무효화 이벤트 처리
  3. Cloudflare CDN 적용으로 정적 자산 캐싱

📈 결과:

  • 평균 API 응답속도: 1.1s → 180ms
  • DB 부하 70% 감소
  • 서버 비용 35% 절감

📌 8. 압박면접 예상 질문 & 답변 포인트

  • Q. 캐시를 언제 쓰면 안 되나요?
    → “실시간성이 중요한 데이터(결제, 재고 등)는 캐싱보다 DB 접근이 안전합니다.”
  • Q. 캐시 데이터가 오래되면 어떻게 처리하나요?
    → “TTL 설정 + 데이터 변경 이벤트로 캐시를 무효화합니다.”
  • Q. Redis 장애 시 어떻게 대처했나요?
    → “Fallback 로직으로 DB 조회 후 캐시 재생성했습니다.”

📌 9. 면접에서 활용할 한 줄 정리

“Redis + Memory 캐시 구조를 통해 API 응답 속도를 1초대에서 200ms 이하로 단축했습니다.
TTL 기반 자동 만료와 이벤트 기반 캐시 무효화를 적용해 데이터 일관성을 유지했습니다.”



압박면접,캐시전략,Redis,CDN,MemoryCache,LRU,TTL,Cloudflare,DB최적화,성능튜닝


 

※ 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/04   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
글 보관함
반응형