티스토리 뷰

반응형

웹 개발 실무 기술 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 방어" 🚀

 

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/03   »
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
글 보관함
반응형