Nodejs

 

NestJS 프로젝트 초기 세팅 및 Product 모듈 구현 정리

 

 nest g app 명령어로 애플리케이션을 생성하고, 기본적인 ProductModule을 구축해 나가는 과정을 정리했습니다. 실습에 Docker 및 PostgreSQL 환경을 구성하여, 실무에서 활용 가능한 구조로 설계했습니다. 아래 내용을 기술 블로그에 활용할 수 있도록 디렉터리 구조부터 상세히 설명합니다.

 

 

1. 프로젝트 초기 생성 및 디렉터리 구조

NestJS에서는 다음 명령어로 monorepo 기반 프로젝트를 생성할 수 있습니다.

npx nest g app product

이 명령어는 /apps/product 디렉토리를 생성하며, 독립된 애플리케이션 구조를 갖는 NestJS 프로젝트를 추가합니다.

초기 디렉토리 구조:

apps/
├── product/
│   ├── src/
│   │   ├── app.module.ts
│   │   ├── main.ts
│   │   ├── product.controller.ts
│   │   ├── product.service.ts
libs/
postgres/
├── product/
├── user/
docker-compose.yml
pnpm-lock.yaml
nest-cli.json

 

 

2. AppModule 및 환경 설정

product/src/app.module.ts는 핵심 의존성 모듈을 등록합니다. 여기서는 PostgreSQL 연결과 환경 변수 설정을 진행합니다.

@Module({
  imports: [
    ConfigModule.forRoot({
      isGlobal: true,
      validationSchema: Joi.object({
        DB_URL: Joi.string().required(),
      }),
    }),
    TypeOrmModule.forRootAsync({
      useFactory: (configService: ConfigService) => ({
        type: 'postgres',
        url: configService.getOrThrow('DB_URL'),
        autoLoadEntities: true,
        synchronize: true,
      }),
      inject: [ConfigService],
    }),
  ],
})
export class AppModule {}
  • ConfigModule: .env 파일을 로드하며 DB_URL 환경 변수를 검증합니다.

  • TypeOrmModule: PostgreSQL과의 연결을 설정하며, autoLoadEntities로 엔티티를 자동 인식하게 설정합니다.

 

 

3. 애플리케이션 부트스트랩

main.ts는 애플리케이션을 실행하는 엔트리 포인트입니다.

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  await app.listen(process.env.HTTP_PORT ?? 3000);
}
bootstrap();

환경 변수 HTTP_PORT를 우선으로 사용하고, 없으면 3000 포트를 기본으로 사용합니다.

 

 

 

4. ProductController 및 Service 구현

ProductController

@Controller()
export class ProductController {
  constructor(private readonly productService: ProductService) {}

  @Get()
  getHello(): string {
    return this.productService.getHello();
  }
}

ProductService

@Injectable()
export class ProductService {
  getHello(): string {
    return 'Hello World!';
  }
}

ProductModule 등록

@Module({
  imports: [],
  controllers: [ProductController],
  providers: [ProductService],
})
export class ProductModule {}
  • 간단한 REST API 응답 테스트용으로 구성되어 있으며, / 경로에서 "Hello World!" 문자열을 반환합니다.

 

 

5. Dockerfile (product 애플리케이션)

apps/product/Dockerfile은 개발 모드에서 NestJS 앱을 빌드 및 실행하기 위한 설정입니다.

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/product apps/product
COPY libs libs
COPY . .

RUN pnpm build product
CMD ["pnpm", "start:dev", "product"]

 

 

 

6. docker-compose 설정

docker-compose.yml은 product, user 서비스와 각각의 PostgreSQL 인스턴스를 분리하여 관리합니다.

services:
  product:
    build:
      context: .
      dockerfile: ./apps/product/Dockerfile
      target: development
    command: pnpm run start:dev product
    depends_on:
      postgres_product:
        condition: service_healthy
    env_file:
      - ./apps/product/.env
    ports:
      - '3000:3000'
    volumes:
      - .:/usr/src/app
      - /usr/src/app/node_modules

  postgres_product:
    image: postgres:16
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
      POSTGRES_DB: postgres
    ports:
      - '6002:5432'
    volumes:
      - ./postgres/product:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 5s
      timeout: 5s
      retries: 10
      start_period: 5s
  • product 컨테이너는 NestJS 앱을 dev 모드로 실행합니다.

  • postgres_product는 독립된 데이터베이스를 제공합니다.

 

 

 

 

마무리

이번 과정에서는 NestJS 모노레포 환경에서 앱을 추가하고, 컨트롤러-서비스 구조로 간단한 HTTP API를 만들었습니다.

PostgreSQL 연결과 도커 개발 환경 구성까지 실무에서 자주 쓰이는 요소들을 체험할 수 있었습니다.

 

 

 

 

 

about author

PHRASE

Level 60  라이트

목탁귀가 밝아야 한다 , 귀가 어두우면 먹을 밥도 얻어먹지 못한다는 말.

댓글 ( 0)

댓글 남기기

작성