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 연결과 도커 개발 환경 구성까지 실무에서 자주 쓰이는 요소들을 체험할 수 있었습니다.
댓글 ( 0)
댓글 남기기