1. 프로젝트 구조 준비
NestJS에서 마이크로서비스 아키텍처를 구성하려면 여러 개의 애플리케이션과 공용 라이브러리를 관리할 수 있어야 합니다. 이때 Gateway는 클라이언트의 요청을 받아 내부 마이크로서비스와 통신하는 API Gateway 역할을 합니다.
명령어
nest g app gateway nest g app order nest g app product nest g app user
위 명령어를 실행하면 각각의 애플리케이션이 apps/ 디렉토리 내부에 생성됩니다.
gateway: 클라이언트의 요청을 수신하고 적절한 서비스로 전달
order: 주문 서비스
product: 상품 서비스
user: 사용자 서비스
2. Gateway Dockerfile 설정
멀티스테이지 빌드를 활용하여 개발용 컨테이너를 구성합니다.
FROM node:alpine AS development WORKDIR /usr/src/app # package.json 등 필요한 파일 복사 COPY package*.json ./ COPY pnpm-lock.yaml ./ COPY tsconfig.json tsconfig.json COPY nest-cli.json nest-cli.json # pnpm 설치 RUN npm i -g pnpm # 의존성 설치 RUN pnpm i # 소스코드 복사 COPY apps/gateway apps/gateway COPY libs ./libs # devDependencies 포함 설치 RUN pnpm install --frozen-lockfile --production=false # gateway 빌드 RUN pnpm build gateway # 실행 CMD ["pnpm", "start:dev", "gateway"]
이 설정은 개발환경 전용입니다. 운영 환경에서는 --production=true 옵션으로 의존성을 최소화하는 것이 좋습니다.
3. 환경 변수 설정
게이트웨이의 포트를 .env 파일에서 지정합니다.
HTTP_PORT=3000
4. Gateway 메인 모듈 구성
게이트웨이는 클라이언트 요청을 받아 Order, User, Product 모듈과 연결됩니다.
import { Module } from '@nestjs/common';
import { OrderModule } from './order/order.module';
import { UserModule } from './user/user.module';
import { ProductModule } from './product/product.module';
@Module({
imports: [OrderModule, UserModule, ProductModule],
})
export class AppModule {}
5. 메인 실행 파일 (main.ts)
NestFactory를 사용하여 Gateway 애플리케이션을 실행합니다.
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
await app.listen(process.env.HTTP_PORT ?? 3000);
}
bootstrap();
6. 리소스 생성
각각의 서비스는 NestJS CLI를 통해 리소스를 생성합니다.
nest g resource order nest g resource product nest g resource user
각 리소스는 Controller, Service, Module 파일을 포함하며, Gateway를 통해 클라이언트 요청과 연결됩니다.
7. 마이크로서비스 통신 방식
Gateway는 단순히 라우팅 역할만 하는 것이 아니라 마이크로서비스 간 통신을 중개합니다. NestJS에서는 다양한 방식의 통신을 지원합니다.
1) TCP 기반 통신
기본적으로 NestJS 마이크로서비스는 TCP 소켓을 통한 통신을 지원합니다.
간단히 설정할 수 있고, 내부 네트워크에서 사용하기 적합합니다.
2) gRPC
고성능 원격 프로시저 호출(RPC) 방식.
명확한 스키마(proto 파일)를 기반으로 통신하며, 언어 간 호환성이 뛰어납니다.
3) 메시지 브로커 (Kafka, RabbitMQ, NATS 등)
비동기 이벤트 기반 아키텍처에 적합.
메시지 브로커를 통해 서비스 간 결합도를 낮추고, 확장성과 안정성을 확보할 수 있습니다.
8. 전체적인 흐름
클라이언트 → Gateway : 클라이언트 요청을 Gateway에서 수신.
Gateway → 마이크로서비스 : Gateway는 Order, User, Product 서비스와 통신.
마이크로서비스 처리 후 응답 반환.
즉, Gateway는 API Gateway 역할을 하며, 내부 마이크로서비스의 복잡성을 클라이언트로부터 숨겨줍니다.













댓글 ( 0)
댓글 남기기