티스토리 뷰
웹 개발 실무 기술 A to Z # 3 - API 성능 최적화: 캐싱, 압축, 레이트 리미팅 활용
octo54 2025. 2. 24. 10:03웹 개발 실무 기술 A to Z
API를 설계할 때 보안만큼 중요한 요소는 성능 최적화입니다.
API 요청이 많아지면 서버의 부하가 증가하고, 응답 속도가 느려질 수 있습니다.
이번 글에서는 API의 성능을 높이는 핵심 전략인 캐싱, 압축, 레이트 리미팅을 활용하는 방법을 설명하겠습니다.
1. API 성능 최적화가 중요한 이유
1-1. API 응답 속도가 느려지는 원인
✔️ 과도한 DB 조회 → 요청마다 DB 쿼리를 실행하면 서버 부담 증가
✔️ 대량의 데이터 전송 → 불필요한 데이터를 포함하면 응답 속도가 느려짐
✔️ 과도한 요청 처리 → 여러 사용자가 동시에 요청하면 서버가 과부하 상태
✔️ 네트워크 지연 → 서버와 클라이언트 간의 거리, 인터넷 속도 등이 성능에 영향
1-2. API 성능 최적화의 핵심 전략
전략 설명
캐싱 (Caching) | 자주 사용하는 데이터를 미리 저장하여 빠르게 제공 |
압축 (Compression) | 응답 데이터를 압축하여 전송 속도를 최적화 |
레이트 리미팅 (Rate Limiting) | 과도한 요청을 제한하여 서버 부하 방지 |
이제 각각의 기법을 상세히 살펴보고, Node.js + Express 환경에서 구현하는 방법을 알아보겠습니다.
2. 캐싱 (Caching)
2-1. 캐싱이란?
캐싱(Cache)은 자주 사용되는 데이터를 미리 저장하여 응답 속도를 높이는 기술입니다.
✔️ DB 부하 감소 → 동일한 데이터를 여러 번 요청해도 빠르게 응답 가능
✔️ API 응답 속도 향상 → 캐시에서 데이터를 가져오면 DB 조회보다 빠름
2-2. 캐싱 종류
캐싱 방식 설명 예시
클라이언트 캐싱 | 브라우저나 앱이 데이터를 저장 | HTML, CSS, JS, API 응답 캐싱 |
서버 캐싱 | API 응답을 서버에서 저장 | Redis, Memcached |
CDN 캐싱 | 정적 파일을 전 세계 서버에 분산 | Cloudflare, AWS CloudFront |
2-3. Redis를 이용한 서버 캐싱
Redis는 인메모리 데이터베이스로 API 응답을 캐싱하는 데 많이 사용됩니다.
(1) Redis 설치 및 설정
npm install redis
(2) 캐싱 미들웨어 구현
const redis = require("redis");
const client = redis.createClient();
client.on("error", (err) => console.log("Redis Error:", err));
const cacheMiddleware = (req, res, next) => {
const key = req.originalUrl;
client.get(key, (err, data) => {
if (err) throw err;
if (data) {
return res.json(JSON.parse(data)); // 캐시 데이터 반환
}
next(); // 캐시에 데이터 없으면 다음 미들웨어 실행
});
};
(3) API 응답을 캐싱
app.get("/api/products", cacheMiddleware, async (req, res) => {
const products = await Product.find(); // DB 조회
client.setex(req.originalUrl, 3600, JSON.stringify(products)); // 1시간 캐싱
res.json(products);
});
✔️ client.setex(key, ttl, value) → 특정 시간 동안 데이터 저장
✅ Redis를 이용하면 동일한 API 요청 시 DB를 조회하지 않고 빠르게 응답 가능!
3. 압축 (Compression)
3-1. Gzip 압축을 활용한 API 응답 최적화
Gzip은 서버 응답 데이터를 압축하여 전송 속도를 향상시키는 방법입니다.
✔️ 네트워크 트래픽 절감 → 데이터 크기를 줄여 전송 속도를 높임
✔️ 성능 향상 → 클라이언트가 빠르게 데이터를 수신
3-2. Express에서 Gzip 적용
(1) 압축 패키지 설치
npm install compression
(2) Gzip 미들웨어 적용
const compression = require("compression");
app.use(compression()); // 모든 응답 데이터 압축
✅ API 응답이 자동으로 압축되어 성능 최적화 가능!
✅ Gzip을 지원하는 브라우저에서 자동으로 해제하여 원본 데이터로 표시됨
4. 레이트 리미팅 (Rate Limiting)
4-1. 레이트 리미팅이란?
✔️ API 요청을 일정 시간 동안 제한하는 방법
✔️ DDoS 공격 방어 및 서버 과부하 방지
✔️ 트래픽을 제어하여 API 남용 방지
4-2. 레이트 리미팅 전략
방식 설명
IP 기반 제한 | 특정 IP당 요청 횟수 제한 |
토큰 버킷(Token Bucket) | 일정 속도로 요청을 처리 |
슬라이딩 윈도우 | 연속된 시간 범위 내 요청 횟수 제한 |
4-3. Express에서 레이트 리미팅 적용
(1) rate-limit 패키지 설치
npm install express-rate-limit
(2) API 요청 수 제한 설정
const rateLimit = require("express-rate-limit");
const limiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15분 동안
max: 100, // 최대 100개 요청 허용
message: "Too many requests, please try again later.",
});
app.use("/api/", limiter); // API 요청에만 적용
✅ DDoS 공격 및 과도한 요청 방어 가능!
✅ 과도한 트래픽이 발생해도 API 서버를 보호할 수 있음
5. 성능 최적화 적용 전후 비교
5-1. 성능 최적화 적용 전
- 요청이 많아질수록 서버 부하 증가
- 동일한 데이터를 요청할 때마다 DB를 조회하여 응답 속도 저하
- 과도한 API 호출로 서버가 다운될 위험 존재
5-2. 성능 최적화 적용 후
✔️ Redis 캐싱 → 동일한 요청 시 캐시에서 빠르게 데이터 제공
✔️ Gzip 압축 → 네트워크 트래픽 감소로 응답 속도 향상
✔️ Rate Limiting 적용 → DDoS 및 불필요한 요청 방어
✅ API 응답 속도가 최대 10배 이상 향상될 수 있음!
6. 마무리 및 다음 글 예고
이번 글에서는 API 성능 최적화를 위한 캐싱, 압축, 레이트 리미팅 기법을 살펴보았습니다.
다음 글에서는 **웹 애플리케이션 보안을 강화하는 방법 (CORS, HTTPS, SQL Injection 방어)**을 다루겠습니다.
다음 글 예고: "웹 애플리케이션 보안 강화 – CORS, HTTPS, SQL Injection 방어" 🚀
'project > 웹 개발 실무 기술 A to Z' 카테고리의 다른 글
웹 개발 실무 기술 A to Z # 5 - 데이터베이스 성능 최적화: 인덱싱, 샤딩, 캐싱 전략 (0) | 2025.02.24 |
---|---|
웹 개발 실무 기술 A to Z # 4 - 웹 애플리케이션 보안 강화: CORS, HTTPS, SQL Injection 방어 (0) | 2025.02.24 |
웹 개발 실무 기술 A to Z # 2 - API 인증 및 보안: JWT와 OAuth 2.0 활용법 (0) | 2025.02.23 |
웹 개발 실무 기술 A to Z #1 - A – API 설계 원칙: RESTful API와 GraphQL 비교 (0) | 2025.02.23 |
웹 개발 실무 기술 A to Z #0 (0) | 2025.02.22 |
- Total
- Today
- Yesterday
- nextJS
- Next.js
- LangChain
- 웹개발
- Webpack
- Project
- 프론트엔드
- 챗봇개발
- fastapi
- 관리자
- kotlin
- 백엔드개발
- Docker
- REACT
- llm
- 리액트
- babel
- 페이지
- til
- PostgreSQL
- 백엔드
- 개발블로그
- 로컬LLM
- rag
- Ktor
- Page
- Python
- nodejs
- AI챗봇
- github
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |