Nodejs

 

 

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. 전체적인 흐름

  1. 클라이언트 → Gateway : 클라이언트 요청을 Gateway에서 수신.

  2. Gateway → 마이크로서비스 : Gateway는 Order, User, Product 서비스와 통신.

  3. 마이크로서비스 처리 후 응답 반환.

즉, Gateway는 API Gateway 역할을 하며, 내부 마이크로서비스의 복잡성을 클라이언트로부터 숨겨줍니다.

 

 

 

 

 

 

 

 

 

about author

PHRASE

Level 60  라이트

도리를 잃은 자는 자기의 뜻대로 일을 처리해 버리기 때문에 현자(賢者)에게 의논하려고 하지 않는다. -순자

댓글 ( 0)

댓글 남기기

작성