컴퓨터 과학/시스템 설계
💻 [시스템 설계] 시스템 트래픽 대응 전략 - 실무 기준 계층별 정복
프로그래민구찌
2025. 5. 16. 18:53
🎯 개요
서비스가 커지고 사용자 수가 증가하면 예상치 못한 트래픽 폭발에 직면하게 됩니다.
예를 들어 쇼핑몰에서는 "세일 시작 1분 전",
예약 시스템에서는 "오픈 시간 정각"에 집중 트래픽이 몰립니다.
이럴 때 대비하지 않으면?
- 서버 다운
- 데이터 유실
- 사용자 대거 이탈
➡ 따라서 시스템을 설계할 때는 트래픽을 제어하고, 분산하고, 흡수하는 전략이 필수입니다.
1️⃣ 클라이언트 레벨 - 요청 최소화
전략 | 설명 |
Debounce / Throttle | 버튼 클릭, 검색 입력 등 과도한 요청 제한 |
Lazy Loading | 스크롤 시 필요한 데이터만 로드 |
Cache-Control | JS/CSS/이미지에 캐시 적용하여 재요청 방지 |
검색창 자동완성 기능에 debounce 적용하면, 300ms 내 중복 요청 방지 가능
→ 백엔드 부하 70% 감소 효과
2️⃣ 네트워크 레벨 - CDN & GZIP
전략 | 설명 |
CDN (CloudFront, Cloudflare) | 정적 리소스(이미지, JS 등) 전 세계에 분산 배포 |
GZIP 압축 | 응답 바이트 수를 줄여 전송 속도 개선 |
CDN만 적용해도 이미지 트래픽 부하 80% 이상 감소 가능
→ 사용자 체감 속도 대폭 개선
3️⃣ 서버 레벨 - 로드밸런싱 & 확장성
전략 | 설명 |
L4/L7 Load Balancer | 네트워크 계층/애플리케이션 계층 부하 분산 |
Auto Scaling | 트래픽 급증 시 인스턴스를 자동으로 추가 |
Health Check | 장애 서버 자동 제외로 안정성 확보 |
AWS EC2 + Auto Scaling Group + ALB로 유입 트래픽 탄력 대응
→ 비용 효율 + 가용성 확보
4️⃣ 애플리케이션 레벨 - 캐시 & Queue
전략 | 설명 |
Redis/Memcached | 자주 조회되는 데이터 캐실 |
Kafka, RabbitMQ | 비동기 처리로 요청 병목 해소 |
Circuit Breaker | 특정 서비스 실패 시, 빠른 우회처리 (예: Resilience4j) |
대시보드 통계 캐싱 적용 → Redis로 캐싱해 20초 걸리던 통계 → 0.2초로 단축
Kafka로 이미지 처리 비동기 분산 → 서버 부하 감소 + 응답 속도 ↑
5️⃣ 데이터베이스 레벨 - 샤딩 & 복제
전략 | 설명 |
Read/Write 분리 | Master → Write / Slave → Read 분산 |
DB Replication | 데이터 복제본을 만들어 읽기 트래픽 분산 |
Partitioning/ Sharding | 데이터 수평 분할 (ex. 회원 ID 기준) |
사용자 수천만 명인 서비스는 MySQL 파티셔닝이나 MongoDB 샤딩 구조로 스케일 아웃
→ DB 한계 극복 필수 전략
6️⃣ API 레벨 - 요청 제어 & 속도 제한
전략 | 설명 |
Rate Limiting | 특정 사용자/아이피 당 초당 요청 수 제한 |
API Gateway Throttle | 인증/비인증 사용자 차등 제어 |
Retry/Timeout 정책 | 무한 요청 방지 및 장애 구간 빠르게 끊기 |
📈 트래픽 대응 구조 예시
[Client]
↓
[CDN/Gateway] - RateLimit, GZIP
↓
[LoadBalancer] - L7 분산
↓
[Spring App] - Redis 캐시 / Kafka Queue
↓
[DB Read Replica] ← Read / Write → [DB Primary]
📝 회고
이번 학습을 통해 트래픽 대응 전략이 단순히 서버 스펙을 키우는 것이 아니라,
전 계층에서 요청을 분산하고 병목을 줄이기 위한 설계라는 것을 다시금 체감했습니다.
실무에서는 Redis 하나만 잘 붙여도 체감 성능이 확 달라지고,
Kafka나 RateLimiter를 붙이면 대규모 트래픽에서도 시스템이 견고하게 버틸 수 있습니다.
이제는 트래픽 대응이 "문제 생기면 나중에 고치자"가 아니라
초기 설계 단계에서 꼭 고려되어야 하는 필수 요소라는 인식을 가지게 되었습니다.