캐싱·CDN·성능 설계: "빠르게 보이게" 만드는 법
캐시와 CDN을 통해 체감 지연을 줄이고 일관성 트레이드오프를 다루는 성능 설계 가이드
Posted Updated
By okorion
캐싱·CDN·성능 설계: "빠르게 보이게" 만드는 법
성능 설계의 관점 전환
결론: 성능 최적화는 ‘더 빠른 기술’을 붙이는 게 아니라, ‘느려 보이는 증상’을 구조적으로 제거하는 일이다.
- 왜(문제): 사용자는 절대적인 처리 시간이 아니라 체감 지연에 반응한다.
- 무엇(개념): 캐시·CDN은 연산을 줄이거나 물리적 거리를 줄여 대기 구간을 숨기는 도구다.
- 어떻게(설계/선택): 증상→원인 가설→측정→개선의 순서로 접근한다.
- 트레이드오프: 일관성·무효화 복잡성·운영 리스크를 감수한다.
- 인터뷰 문장: “이 문제는 처리 속도보다 대기 구간이 길어서 발생합니다.”
캐싱이 유효한 조건
결론: 캐시는 ‘읽기 우세 + 완화 가능한 일관성’에서만 이득이다.
| 조건 | 유효 기준 |
|---|---|
| 읽기/쓰기 비율 | 읽기 ≥ 5~10배 |
| 일관성 요구 | 강한 즉시 일관성 아님 |
| TTL 허용 | 초~분 단위 허용 |
| 데이터 크기 | 핫셋이 메모리에 적합 |
- 함정: 쓰기 비중이 큰데 캐시부터 도입
체크리스트:
- 캐시 미스 시 DB가 버틸 수 있는가?
- stale 데이터 허용 범위는?
- 인터뷰 문장: “읽기 비중이 높고, 수 초의 지연 일관성을 허용합니다.”
캐시 패턴 비교
결론: 패턴 선택은 ‘일관성 vs 쓰기 비용’의 선택이다.
| 패턴 | 읽기 | 쓰기 | 장점 | 단점 |
|---|---|---|---|---|
| Cache-Aside | 캐시→DB | DB만 | 단순 | 무효화 책임 |
| Write-Through | 캐시 | 캐시+DB | 일관성 | 쓰기 지연 |
| Write-Back | 캐시 | 캐시만 | 빠른 쓰기 | 유실 위험 |
- 인터뷰 문장: “운영 단순성을 위해 Cache-Aside를 선택합니다.”
무효화 전략 3종
결론: 캐시는 무효화 설계가 없으면 기술 부채다.
1) TTL
- 장점: 단순
- 실패 모드: TTL 만료 동시 → 스탬피드
- 문장: “정확성보다 단순성을 택했습니다.”
2) 이벤트 기반
- 장점: 정확
- 실패 모드: 이벤트 유실
- 문장: “정확한 무효화를 위해 이벤트를 사용합니다.”
3) 버전닝
- 장점: 충돌 최소화
- 실패 모드: 키 폭증
- 문장: “버전 키로 점진적 갱신을 합니다.”
축출 정책
결론: 정책은 데이터 접근 패턴을 반영해야 한다.
| 정책 | 적합 상황 |
|---|---|
| LRU | 최근성 중요 |
| LFU | 인기 고정 |
| FIFO | 단순성 |
- 실무 선택: 대부분 LRU, 랭킹/히트 기반은 LFU 혼합
- 문장: “최근 접근성이 중요해 LRU를 사용합니다.”
CDN 설계
결론: CDN은 ‘정적 캐시’가 아니라 ‘경계 분리’ 전략이다.
- 정적: 이미지/CSS/JS
- 동적: API 응답 일부 캐시
- 캐시 키: URL + 헤더 + 쿼리 최소화
- 퍼지 전략: 경로 단위 퍼지, 전체 퍼지 금지
- 문장: “정적은 CDN, 동적은 서버 캐시로 분리합니다.”
캐시가 장애를 키우는 패턴
결론: 캐시는 실패 시 증폭기 역할을 한다.
- 스탬피드(동시 만료)
- 핫키 집중
- 캐시 미스 폭풍
- 무효화 누락
- 대응: request coalescing, soft TTL, 샤딩 키 분산
- 문장: “동시 만료를 막기 위해 soft TTL을 둡니다.”
예시 1: 탑 셀러 랭킹 (토이)
결론: 정확성보다 응답 속도를 택한다.
- 증상: 랭킹 조회 느림
- 원인: 집계 쿼리
- 개선: LFU 캐시 + TTL 30초
- 버린 것: 실시간 정확성
- 문장: “30초 지연 랭킹을 허용합니다.”
예시 2: 피드/타임라인 (실무형)
결론: 사용자 체감 속도를 최우선한다.
- 증상: 첫 로딩 지연
- 원인: 다수 소스 조합
- 개선: 사용자별 캐시 + CDN
- 버린 것: 전역 일관성
- 문장: “개인화 피드는 eventual consistency입니다.”
면접 답변 흐름 템플릿
결론: 성능 답변은 문제 해결 서사여야 한다.
- 증상 설명
- 원인 가설
- 측정 지표
- 개선 선택
- 버린 선택
흔한 실수 5개 + 교정
- 캐시부터 언급 → 증상부터 말하기
- 무효화 없음 → 전략 명시
- 모든 데이터 캐시 → 핫셋만
- TTL 남발 → 이벤트 병행
- CDN 만능론 → 경계 분리
면접에서 바로 쓰는 답변 문장 템플릿 8개
- “지연은 대기 구간에서 발생합니다.”
- “읽기 비중이 높아 캐시가 유효합니다.”
- “일관성은 이 수준으로 제한합니다.”
- “무효화는 이벤트로 처리합니다.”
- “동시 만료 리스크가 있습니다.”
- “CDN으로 물리적 거리를 줄입니다.”
- “핫키는 분산 키로 완화합니다.”
- “정확성보다 체감 속도를 택했습니다.”
핵심 체크리스트 12개
- 증상 정의
- 원인 가설
- 측정 지표
- 읽기/쓰기 비율
- TTL 허용치
- 캐시 패턴
- 무효화 전략
- 축출 정책
- CDN 경계
- 핫키 대응
- 실패 시나리오
- 버린 선택
성능 튜닝 우선순위 체크리스트
결론: 순서를 바꾸면 최적화가 실패한다.
- 측정
- 병목
- 캐시
- 샤딩
30분 복기 플랜(타이머 기준)
- 0–5분: 캐시 유효 조건 암기
- 5–10분: 캐시 패턴 표
- 10–15분: 무효화 3종
- 15–20분: 장애 패턴 4개
- 20–25분: CDN 경계 설명
- 25–30분: 피드 사례 말로 설명
한 줄 요약
성능 설계는 캐시를 넣는 기술이 아니라, 느려 보이는 원인을 제거하는 판단이다.
This post is licensed under CC BY 4.0 by the author.
