티스토리 뷰

반응형

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

 

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
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
글 보관함
반응형