Nodejs

 

 

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();

 

 

 

 

 

about author

PHRASE

Level 60  라이트

혹 떼러 갔다가 혹 붙였다 , 좋은 일을 바라고 갔다가 불리한 일을 당했다는 말.

댓글 ( 0)

댓글 남기기

작성