티스토리 뷰
✅ 압박면접 대응 시리즈 29편: 캐싱(Cache) 전략 설계 — Redis, CDN, Memory Cache 실무 적용 사례
octo54 2025. 11. 6. 16:45✅ 압박면접 대응 시리즈 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 부하로 전체 서비스 응답 지연 발생
해결:
- Redis + MemoryCache 2단 구조 도입
- TTL 5분 설정 + 게시물 수정 시 캐시 무효화 이벤트 처리
- 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최적화,성능튜닝
'AI + Career' 카테고리의 다른 글
- Total
- Today
- Yesterday
- llm
- Redis
- DevOps
- flax
- nextJS
- kotlin
- Prisma
- seo 최적화 10개
- 웹개발
- CI/CD
- SEO최적화
- 개발블로그
- node.js
- Python
- Docker
- fastapi
- ai철학
- 생성형AI
- 딥러닝
- PostgreSQL
- Express
- REACT
- 쿠버네티스
- Next.js
- NestJS
- JAX
- JWT
- LangChain
- 백엔드개발
- rag
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |

