MongoDB debug 모드


app.module.ts

import { MiddlewareConsumer, Module, NestModule } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { CatsModule } from './cats/cats.module';
import { LoggerMiddleware } from './common/middlewares/logger.middleware';
import { MongooseModule } from '@nestjs/mongoose';
import { ConfigModule } from '@nestjs/config'; // .env 사용
import mongoose from 'mongoose';

@Module({
  imports: [
    // 모듈 사용
    ConfigModule.forRoot(),
    MongooseModule.forRoot(process.env.MONGODB_URI), // db 연결
    CatsModule,
  ],
  controllers: [AppController],
  providers: [AppService], // 제거하면 공급자가 없음 그래서 controller(소비자)는 제품(공급자, Service)을 사용할 수 없음
})
export class AppModule implements NestModule {
  private readonly isDev: boolean = process.env.MODE === 'dev' ? true : false;
  configure(consumer: MiddlewareConsumer) {
    consumer.apply(LoggerMiddleware).forRoutes('cats'); // cats router에 binding
    mongoose.set('debug', this.isDev); // mongoose query가 찍혀지게 됨, 배포할 땐 false로 해놔야한다.
  }
}

export class AppModule implements NestModule {
  private readonly isDev: boolean = process.env.MODE === 'dev' ? true : false;
  configure(consumer: MiddlewareConsumer) {
    consumer.apply(LoggerMiddleware).forRoutes('cats'); // cats router에 binding
    mongoose.set('debug', this.isDev); // mongoose query가 찍혀지게 됨, 배포할 땐 false로 해놔야한다.
  }
}

AppModule에 위 코드를 작성해서 mongoose query가 찍혀지게 한다.

private readonly isDev: boolean = process.env.MODE === 'dev' ? true : false;

위 코드를 통해 배포할 때는 isDev값이 false가 되게 한 후로 배포한다.

DB 스키마


cats/cats.schema.ts

import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose';
import { IsEmail, IsNotEmpty, IsString } from 'class-validator';
import { Document, SchemaOptions } from 'mongoose';

const options: SchemaOptions = {
  timestamps: true,
};
@Schema(options) // schema 데코레이션으로 스키마 정의
export class Cat extends Document {
  @Prop({
    required: true, // 꼭 필요, default는 false
    unique: true, // 유니크 해야함
  })
  @IsEmail() //  class-validator
  @IsNotEmpty() //  class-validator
  email: string;

  @Prop({ required: true })
  @IsString()
  @IsNotEmpty()
  name: string;

  @Prop({ required: true })
  @IsString()
  @IsNotEmpty()
  password: string;

  @Prop()
  @IsString()
  imgUrl: string;
}

export const CatSchema = SchemaFactory.createForClass(Cat);

Schema 데코레이션으로 DB의 스키마를 정의하고 class-validator를 통해 해당 속성의 type을 정의한다.

class-validator는 CLI에서 아래 명령어를 통해 설치한다.

npm i --save class-validator class-transformer

그리고 main.ts에서 등록한다.