노드 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 모니터링을 배워봅시다!
'IT Developer > Node.js' 카테고리의 다른 글
Node.js 기초 <20. 서버리스(Serverless) 환경에서 CI/CD 구축> (0) | 2025.03.22 |
---|---|
Node.js 기초 <19. CI/CD (Continuous Integration & Deployment) 구축> (0) | 2025.03.21 |
Node.js 기초 <18. 중앙 집중형 로그 관리와 APM(Application Performance Monitoring)> (0) | 2025.03.20 |
Node.js 기초 <16. 마이크로서비스 아키텍처(MSA)와 RabbitMQ 활용> (0) | 2025.03.18 |
Node.js 기초 <15. 작업 큐(Queue)와 백그라운드 작업 처리 (Bull 활용)> (1) | 2025.03.17 |
Node.js 기초 <14. 클라우드 스토리지(AWS S3, Firebase)와 파일 업로드> (0) | 2025.03.16 |
Node.js 기초 <13. 파일 업로드와 이미지 처리 (multer 활용)> (0) | 2025.03.15 |
Node.js 기초 <12. Express의 미들웨어와 요청 처리 흐름> (0) | 2025.03.14 |