본문 바로가기

framework/NestJs

[NestJs] Mongoose - 스키마, Insert

npm 설치

npm i @nestjs/mongoose mongoose
app.module.ts에 import
imports: [
    MongooseModule.forRoot(MONGODB_URI),
  ],

Validation

npm i --save class-validator class-transformer

 

Cat 스키마 생성

몽구스에서는 모든 것이 스키마에서 파생된다. 

스키마는 모델을 정의하고, 모델을 통해 데이터베이스에 접근하여 스키마(테이블, 문서) 생성, 데이터 편집을 진행한다.

위에서 설치한 class-validator를 통해 컬럼을 정의한다.

@Schema() 를 사용하여 클래스를 스키마 정의로 표기한다.

스키마 옵션의 timestamps를 true로 설정하면 스키마에 생성일시, 업데이터일시가 자동적으로 입력되고 수정된다.

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

const options: SchemaOptions = {
  timestamps: true,
};

@Schema(options)
export class Cat {
  @IsNotEmpty()
  @IsString()
  @Prop({
    unique: true,
    required: true,
  })
  name: string;
}

export const CatSchema = SchemaFactory.createForClass(Cat);

cat 모듈

import { Module } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';
import { MongooseModule } from '@nestjs/mongoose';
import { Cat, CatSchema } from './cats.schema';

@Module({
  imports: [MongooseModule.forFeature([{ name: Cat.name, schema: CatSchema }])],
  controllers: [CatsController],
  providers: [CatsService],
})
export class CatsModule {}

 

cat 컨트롤러

주의할 점으로 모델을 활용해 몽고DB에 접근하는데 시간이 걸리므로 await를 넣어야한다.

import { Body, Controller, Post, UnauthorizedException } from '@nestjs/common';
import { CatsRequestDto } from './dto/cats.request.dto';
import { Cat } from './cats.schema';
import { Model } from 'mongoose';
import { InjectModel } from '@nestjs/mongoose';

@Controller('cats')
export class CatsController {
  constructor(@InjectModel(Cat.name) private readonly catModel: Model<Cat>) {}

  @Post()
  async signIn(@Body() cat: CatsRequestDto) {
    const isExists = await this.catModel.exists({ name: cat.name }); // { name: 'a' }

    if (isExists) {
      throw new UnauthorizedException('is Exist');
    }

    this.catModel.create(cat).then(() => {
      console.log('create success');
    });
    return 'sign in';
  }
}

Debug 확인

App 모듈에서 NestModule을 상속받고, mongoose.set('debug', true)를 하면 디버그를 할 수 있다.

import { MiddlewareConsumer, Module, NestModule } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { CatsModule } from './cats/cats.module';
import { ConfigModule } from '@nestjs/config';
import { MongooseModule } from '@nestjs/mongoose';
import mongoose from 'mongoose';

@Module({
  imports: [
    CatsModule,
    ConfigModule.forRoot(),
    MongooseModule.forRoot(process.env.MONGODB_URI),
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    mongoose.set('debug', true);
  }
}

'framework > NestJs' 카테고리의 다른 글

[NestJs] JWT 사용  (0) 2023.04.05
[NestJs] 디자인 패턴 적용  (0) 2023.03.30
[NestJs] swagger 예시  (0) 2023.03.30
[NestJs] npm 명령어  (0) 2023.03.29