NestJS Order Microservice - Docker & MongoDB 연동
이번 글에서는 NestJS 기반의 Order Microservice를 구축하는 과정을 다룹니다.
특히 MongoDB와 연동하여 마이크로서비스를 실행하고 Docker 환경에서 개발하는 전체 세팅을 소개합니다.
디렉터리 구조
Order 마이크로서비스는 NestJS의 기본 구조를 기반으로 아래와 같은 형태로 구성됩니다:
project-root/ ├── apps/ │ └── order/ │ ├── src/ │ │ ├── order/ │ │ │ ├── order.module.ts │ │ │ ├── order.service.ts │ │ │ └── ... │ │ ├── app.module.ts │ │ └── main.ts │ ├── .env │ └── Dockerfile ├── docker-compose-order.yml ├── package.json ├── pnpm-lock.yaml ├── tsconfig.json └── nest-cli.json
apps/order: Order 마이크로서비스 애플리케이션
apps/order/src/order: 실제 도메인 로직 (모듈, 서비스 등)
.env: 서비스별 환경 설정
Dockerfile: Order 서비스 컨테이너 빌드 정의
1. MongoDB 연동을 위한 패키지 설치
Order 서비스에서는 PostgreSQL이 아닌 MongoDB를 사용합니다. MongoDB를 NestJS에서 사용하기 위해 다음 패키지들이 필요합니다.
pnpm add @nestjs/mongoose mongoose pnpm add -D @types/mongoose
@nestjs/mongoose: NestJS에서 Mongoose ODM(Object Data Modeling)을 사용할 수 있도록 도와주는 공식 모듈입니다.
mongoose: MongoDB를 Node.js에서 다루기 위한 ODM 라이브러리입니다.
@types/mongoose: TypeScript를 위한 타입 정의입니다. (개발 의존성)
2. Docker 환경 구성
아래는 docker-compose-order.yml 파일로, Order 서비스와 MongoDB를 함께 구성합니다.
# docker-compose -f docker-compose-order.yml up -d # 실시간 로그: docker-compose -f docker-compose-order.yml logs -f order services: order: build: context: . dockerfile: ./apps/order/Dockerfile target: development command: pnpm run start:dev order depends_on: mongo_order: condition: service_healthy env_file: - ./apps/order/.env ports: - '3003:3003' volumes: - .:/usr/src/app - /usr/src/app/node_modules mongo_order: image: mongo:8 environment: MONGO_INITDB_ROOT_USERNAME: mongo MONGO_INITDB_ROOT_PASSWORD: mongo ports: - '6003:27017' volumes: - ./mongo/order:/data/lib command: mongod --quiet --logpath /dev/null healthcheck: test: echo 'db.runCommand("ping").ok' | mongosh localhost:27017/test --quiet interval: 5s timeout: 5s retries: 10 start_period: 5s
order: NestJS 앱 컨테이너
mongo_order: MongoDB 컨테이너 (버전 8 사용)
depends_on: DB가 정상적으로 실행되었는지 health check 후 앱이 실행됨
.env를 통해 환경 변수 전달
3. Order 서비스 Dockerfile 작성
apps/order/Dockerfile은 다음과 같이 작성됩니다.
FROM node:alpine AS development WORKDIR /usr/src/app COPY package*.json ./ COPY pnpm-lock.yaml ./ COPY tsconfig.json tsconfig.json COPY nest-cli.json nest-cli.json RUN npm i -g pnpm RUN pnpm i COPY apps/order apps/order RUN pnpm build order CMD ["pnpm", "start:dev", "order"]
node:alpine: 가볍고 빠른 Node.js 이미지
pnpm install: 프로젝트 의존성 설치
pnpm build order: 앱 빌드 (Nest CLI 기준)
pnpm start:dev order: 개발 서버 실행
4. 환경변수 설정 (.env)
.env 파일은 apps/order/.env에 위치하며 다음과 같이 설정합니다.
COMPOSE_PROJECT_NAME=nestjs-delivery-product HTTP_PORT=3003 DB_URL=mongodb://mongo:mongo@mongo_order:27017/order?authSource=admin&retryWrites=true&w=majority JWT_SECRET=your-secret-key ACCESS_TOKEN_SECRET=your_access_token_secret REFRESH_TOKEN_SECRET=your_refresh_token_secret
DB_URL: MongoDB 접속 주소 (도커 컨테이너 기준)
로컬 접속 시 (컴포즈 외부에서 접속 시):
# DB_URL=mongodb://mongo:mongo@localhost:6003/order?authSource=admin
5. AppModule 구성
MongoDB 연동을 위한 설정은 MongooseModule.forRootAsync()로 설정합니다. 환경 변수에서 Mongo URI를 읽어와 MongoDB에 연결합니다.
import { Module } from '@nestjs/common'; import { ConfigModule, ConfigService } from '@nestjs/config'; import * as Joi from 'joi'; import { OrderModule } from './order/order.module'; import { MongooseModule } from '@nestjs/mongoose'; @Module({ imports: [ ConfigModule.forRoot({ isGlobal: true, validationSchema: Joi.object({ HTTP_PORT: Joi.number().required(), DB_URL: Joi.string().required(), }), }), MongooseModule.forRootAsync({ useFactory: (configService: ConfigService) => ({ uri: configService.getOrThrow('DB_URL'), }), inject: [ConfigService], }), OrderModule, ], }) export class AppModule {}
6. main.ts 진입점
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 ?? 3003); } bootstrap();
댓글 ( 0)
댓글 남기기