IT Developer/Node.js

Node.js 기초 <17. API 게이트웨이(API Gateway)와 서비스 관리>

TEMA_ 2025. 3. 19. 16:11
반응형

노드 Node.js

17. API 게이트웨이(API Gateway)와 서비스 관리 

 

안녕하세요! 태마입니다.

Node.js 기초 강좌입니다.

 

강좌의 경우 

1. 주제 간단 정리

2. 상세 주제 정리

으로 이루어져 있습니다.

 

노드 Node.js

포스팅 시작하겠습니다 :)

 


 

1. 주제 간단 정리

 

1. API 게이트웨이(API Gateway)란?

API 게이트웨이는 마이크로서비스 아키텍처(MSA)에서 클라이언트 요청을 각 서비스로 라우팅하는 중앙 관리 지점입니다.
즉, 클라이언트는 개별 서비스에 직접 요청하는 대신 API 게이트웨이를 통해 모든 요청을 처리하게 됩니다.

📌 API 게이트웨이의 역할
단일 진입점 역할 → 클라이언트가 여러 개의 서비스를 개별적으로 호출할 필요 없음
라우팅 및 로드 밸런싱 → 특정 서비스로 요청을 전달하고 부하를 분산
인증 및 보안 강화 → JWT, OAuth 등의 인증 방식 적용 가능
요청/응답 캐싱 및 최적화 → 동일한 요청을 여러 번 처리하지 않도록 캐싱

API Gateway와 클라이언트-서비스 통신 방식 비교

구분클라이언트 직접 요청API 게이트웨이 방식

요청 방식 클라이언트가 여러 개의 서비스에 직접 요청 API 게이트웨이를 통해 한 번만 요청
보안 개별 서비스에서 직접 인증 필요 API 게이트웨이에서 인증 관리 가능
성능 최적화 클라이언트가 여러 API 호출 게이트웨이가 API 병합 및 캐싱 가능
유지보수 클라이언트에서 서비스 주소를 직접 관리 API 게이트웨이에서 서비스 변경 가능

📌 API 게이트웨이를 사용하면 보안, 성능, 유지보수 측면에서 더욱 효율적인 서비스 관리가 가능!

✅ 여기까지 API 게이트웨이의 개념과 필요성을 배웠습니다!
👉 "그렇다면, 실제로 API 게이트웨이를 어떻게 구현할까?"
2부에서 Express 기반의 API 게이트웨이 구현 방법을 배워봅시다!

반응형

 

2. 상세 주제 정리

 

1. API 게이트웨이 구축을 위한 패키지 설치

1) Express 기반 API 게이트웨이 서버 생성

$ mkdir api-gateway && cd api-gateway
$ npm init -y
$ npm install express http-proxy-middleware dotenv

📌 http-proxy-middleware를 사용하여 서비스 요청을 프록시 처리 가능!

2) .env 파일 설정 (서비스 주소 관리)

PORT=3000
USER_SERVICE_URL=http://localhost:4000
ORDER_SERVICE_URL=http://localhost:5000

📌 API 게이트웨이에서 각 서비스의 주소를 환경 변수로 관리!


 

2. API 게이트웨이 구현 (요청 프록시 설정)

1) Express를 활용한 기본 API 게이트웨이 코드

const express = require("express");
const { createProxyMiddleware } = require("http-proxy-middleware");
require("dotenv").config();

const app = express();

// 사용자 서비스 프록시 설정
app.use("/users", createProxyMiddleware({ target: process.env.USER_SERVICE_URL, changeOrigin: true }));

// 주문 서비스 프록시 설정
app.use("/orders", createProxyMiddleware({ target: process.env.ORDER_SERVICE_URL, changeOrigin: true }));

app.listen(process.env.PORT, () => {
  console.log(`API Gateway 실행 중 (포트 ${process.env.PORT})`);
});

📌 API 게이트웨이가 /users 요청을 USER_SERVICE_URL로, /orders 요청을 ORDER_SERVICE_URL로 전달!

2) 실행 및 테스트

node index.js

📌 http://localhost:3000/users 요청 시 http://localhost:4000으로 프록시됨!
📌 http://localhost:3000/orders 요청 시 http://localhost:5000으로 프록시됨!


 

3. API 게이트웨이에서 JWT 인증 적용

1) JWT 검증 미들웨어 추가

const jwt = require("jsonwebtoken");

const authenticateToken = (req, res, next) => {
  const token = req.headers.authorization;
  if (!token) return res.status(403).send("토큰이 필요합니다.");

  jwt.verify(token.split(" ")[1], process.env.JWT_SECRET, (err, user) => {
    if (err) return res.status(403).send("유효하지 않은 토큰입니다.");
    req.user = user;
    next();
  });
};

// 모든 요청에 JWT 인증 적용
app.use(authenticateToken);

📌 API 게이트웨이에서 인증을 처리하고, 유효한 요청만 개별 서비스로 전달!

2) JWT가 적용된 API 호출 예시

GET /users HTTP/1.1
Authorization: Bearer <JWT_ACCESS_TOKEN>

📌 API 게이트웨이가 요청을 검증한 후, 해당 서비스를 호출하도록 설정!


 

4. API 응답 캐싱(Cache) 적용

1) apicache 패키지 설치

$ npm install apicache

2) API 게이트웨이에 캐싱 적용

const apicache = require("apicache");
const cache = apicache.middleware;

app.use("/users", cache("5 minutes"), createProxyMiddleware({ target: process.env.USER_SERVICE_URL, changeOrigin: true }));

📌 API 응답을 5분 동안 캐싱하여 성능 최적화!


 

5. API 게이트웨이에서 로드 밸런싱 적용

1) 여러 개의 서비스 인스턴스를 활용하여 로드 밸런싱 구현

const userServiceTargets = ["http://localhost:4000", "http://localhost:4001"];
let currentTarget = 0;

app.use("/users", (req, res, next) => {
  req.target = userServiceTargets[currentTarget];
  currentTarget = (currentTarget + 1) % userServiceTargets.length;
  next();
}, createProxyMiddleware({ target: (req) => req.target, changeOrigin: true }));

📌 순차적으로 요청을 다른 서버로 전달하여 로드 밸런싱 적용 가능!


 

6. API 게이트웨이 성능 모니터링 (express-status-monitor 활용)

1) express-status-monitor 패키지 설치

$ npm install express-status-monitor

2) API 게이트웨이에 성능 모니터링 대시보드 추가

const statusMonitor = require("express-status-monitor");
app.use(statusMonitor());

app.get("/status", (req, res) => {
  res.redirect("/status-dashboard");
});

📌 http://localhost:3000/status에서 API 상태를 실시간으로 모니터링 가능!


 

7. API 게이트웨이 활용 시 고려할 점

1) 서비스 장애 대비 (Circuit Breaker)
✔ 특정 서비스가 응답하지 않으면 요청을 차단하는 회로 차단기(Circuit Breaker) 패턴 적용 가능

2) 요청 제한 (Rate Limiting)
✔ express-rate-limit 패키지를 활용하여 과도한 요청을 제한하여 DDoS 방어 가능

const rateLimit = require("express-rate-limit");

const limiter = rateLimit({
  windowMs: 1 * 60 * 1000, // 1분 단위
  max: 100, // 1분에 최대 100번 요청 가능
});

app.use(limiter);

📌 API 게이트웨이를 통해 보안 및 성능을 향상할 수 있음!


✅ 여기까지 API 게이트웨이와 서비스 관리 방법을 배웠습니다!
👉 "그렇다면, 로그 관리와 모니터링은 어떻게 할까?"
다음 회차에서 중앙 집중형 로그 관리와 APM 모니터링을 배워봅시다!

반응형