티스토리 뷰
웹 개발 실무 기술 A to Z # 6 - 마이크로서비스 아키텍처(MSA): API Gateway와 서비스 분리 전략
octo54 2025. 2. 24. 16:16웹 개발 실무 기술 A to Z
**마이크로서비스 아키텍처(MSA)**는 대규모 웹 애플리케이션에서 각 기능을 독립적인 서비스로 나누어 운영하는 방식입니다.
단일 시스템(모놀리식 아키텍처)에서는 모든 기능이 하나의 애플리케이션에 포함되지만,
MSA에서는 각 기능을 개별 서비스로 관리하여 확장성, 유지보수성, 장애 대응이 더욱 용이해집니다.
이번 글에서는 마이크로서비스 아키텍처의 개념과 API Gateway 활용법을 설명하겠습니다.
1. 마이크로서비스 아키텍처(MSA)란?
1-1. MSA 개념
✔️ 애플리케이션을 여러 개의 독립적인 서비스로 나누어 운영하는 구조
✔️ 각 서비스는 개별적으로 배포 및 유지보수 가능
✔️ API Gateway를 활용하여 서비스 간 통합 및 라우팅 수행
1-2. MSA vs. 모놀리식 아키텍처
비교 항목 모놀리식 아키텍처 마이크로서비스 아키텍처 (MSA)
구조 | 하나의 큰 애플리케이션 | 여러 개의 독립된 서비스 |
배포 | 전체 애플리케이션 재배포 | 개별 서비스만 수정 가능 |
확장성 | 단일 서버 확장 (Scale-up) | 개별 서비스 확장 (Scale-out) |
유지보수 | 코드 변경 시 전체 영향 | 서비스 단위 유지보수 가능 |
장애 영향 | 한 부분 장애 시 전체 장애 | 일부 서비스만 장애 발생 |
✅ MSA를 사용하면 기능별로 독립적인 개발이 가능하여 확장성이 뛰어남!
✅ 모놀리식 구조는 초기 개발이 쉽지만, 규모가 커질수록 유지보수 어려움!
2. API Gateway란?
2-1. API Gateway 개념
API Gateway는 각 마이크로서비스로 들어오는 요청을 중앙에서 관리하는 서비스입니다.
✔️ 서비스 라우팅 → 클라이언트 요청을 올바른 마이크로서비스로 전달
✔️ 보안 & 인증 → API Key, JWT, OAuth 2.0 인증 적용
✔️ 로드 밸런싱 → 다수의 서비스 간 부하 분산
✔️ 캐싱 & 응답 최적화 → 불필요한 데이터 요청 방지
3. API Gateway 구현하기 (Node.js + Express)
3-1. API Gateway의 역할
✔️ 클라이언트 요청을 분석하여 적절한 마이크로서비스로 전달
✔️ JWT 인증 및 요청 검증
✔️ 서비스 장애 감지 및 서킷 브레이커 기능 적용
3-2. Express 기반 API Gateway 구축
(1) 프로젝트 설정
mkdir api-gateway
cd api-gateway
npm init -y
npm install express http-proxy-middleware dotenv
(2) API Gateway 서버 구현
const express = require("express");
const { createProxyMiddleware } = require("http-proxy-middleware");
require("dotenv").config();
const app = express();
// 사용자 서비스 프록시
app.use("/api/users", createProxyMiddleware({ target: "http://localhost:5001", changeOrigin: true }));
// 주문 서비스 프록시
app.use("/api/orders", createProxyMiddleware({ target: "http://localhost:5002", changeOrigin: true }));
app.listen(3000, () => {
console.log("API Gateway running on port 3000");
});
✅ API Gateway를 통해 /api/users, /api/orders 요청을 각각의 서비스로 라우팅 가능!
4. 마이크로서비스 분리 전략
4-1. 마이크로서비스 설계 원칙
✔️ 각 서비스는 독립적으로 실행 가능해야 함
✔️ 각 서비스는 데이터베이스를 독립적으로 관리해야 함
✔️ 서비스 간 API를 통해 통신 (REST 또는 gRPC 사용)
✔️ 서버 부하를 고려한 로드 밸런싱 적용
4-2. 서비스 분리 예제
✔️ 사용자 서비스 (user-service) → 사용자 등록, 로그인, JWT 인증
✔️ 주문 서비스 (order-service) → 주문 생성, 결제, 주문 내역 조회
✔️ 상품 서비스 (product-service) → 상품 목록 제공, 재고 관리
5. 마이크로서비스 간 통신 방법
✔️ REST API → HTTP 요청을 통해 서비스 간 데이터 교환
✔️ gRPC → 바이너리 프로토콜을 사용하여 고속 통신 지원
✔️ 메시지 큐 (RabbitMQ, Kafka) → 비동기 메시지 처리
5-1. REST API 방식
✔️ 각 마이크로서비스가 독립적인 API 엔드포인트 제공
app.get("/users/:id", async (req, res) => {
const user = await User.findById(req.params.id);
res.json(user);
});
5-2. gRPC 기반 통신
✔️ 바이너리 프로토콜을 사용하여 높은 성능 제공 ✔️ Node.js에서 gRPC 사용 예제
const grpc = require("@grpc/grpc-js");
const protoLoader = require("@grpc/proto-loader");
const packageDefinition = protoLoader.loadSync("user.proto");
const userProto = grpc.loadPackageDefinition(packageDefinition).user;
const server = new grpc.Server();
server.addService(userProto.UserService.service, {
GetUser: (call, callback) => {
callback(null, { id: call.request.id, name: "Alice" });
}
});
server.bindAsync("0.0.0.0:50051", grpc.ServerCredentials.createInsecure(), () => {
server.start();
});
✅ gRPC를 사용하면 서비스 간 통신 속도를 대폭 향상 가능!
6. 장애 대응 및 성능 최적화
✔️ 서킷 브레이커 (Circuit Breaker) 적용 → 장애가 발생한 서비스로 요청을 제한
✔️ 로깅 & 모니터링 시스템 구축 → 서비스 상태 및 오류 감지
✔️ 로드 밸런싱 적용 → 특정 서비스에 과부하 발생 방지
7. 마이크로서비스 아키텍처의 장점과 단점
7-1. 장점
✔️ 독립적인 개발 & 배포 가능 → 각 서비스 개별적으로 업데이트 가능
✔️ 확장성 향상 → 트래픽 증가 시 특정 서비스만 확장 가능
✔️ 장애 격리 → 특정 서비스에 장애가 발생해도 전체 시스템에 영향 없음
7-2. 단점
❌ 서비스 간 통신 비용 증가 → API 호출이 많아질수록 지연 발생 가능
❌ 운영 및 모니터링 복잡 → 여러 개의 서비스 상태를 모니터링해야 함
❌ 데이터 일관성 관리 어려움 → 분산 데이터 저장 시 동기화 필요
✅ 적절한 서비스 분리 전략과 API Gateway를 활용하면 MSA의 장점을 극대화 가능!
8. 마무리 및 다음 글 예고
이번 글에서는 마이크로서비스 아키텍처(MSA)와 API Gateway 활용법을 살펴보았습니다.
다음 글에서는 **클라우드 환경에서 웹 애플리케이션을 배포하는 방법 (Docker, Kubernetes, AWS Lambda)**을 소개하겠습니다.
다음 글 예고: "클라우드 네이티브 웹 애플리케이션 – Docker, Kubernetes, AWS Lambda 활용" 🚀
'project > 웹 개발 실무 기술 A to Z' 카테고리의 다른 글
- Total
- Today
- Yesterday
- AI챗봇
- 페이지
- babel
- LangChain
- Python
- 개발블로그
- fastapi
- PostgreSQL
- 관리자
- Webpack
- nodejs
- til
- Page
- 웹개발
- 백엔드
- Next.js
- 챗봇개발
- nextJS
- Project
- 로컬LLM
- 리액트
- REACT
- rag
- Ktor
- llm
- 백엔드개발
- kotlin
- Docker
- 프론트엔드
- 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 |