Mongoose 사용하기 [Nest.js]

2023. 12. 3. 09:00프레임워크/Nest.js

MongoDB Atlas 세팅

https://muyeon95.tistory.com/286

 


 

프로젝트 생성

nest new mongo-connect-poc

환경변수 세팅

아래 링크를 활용해 환경변수를 먼저 세팅해준다.

 

https://muyeon95.tistory.com/287


mongoose 설치

 

npm install --save @nestjs/mongoose mongoose

MongooseModule 매핑

 

// src/app.module.ts

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { ConfigModule } from '@nestjs/config';
import { MongooseModule } from '@nestjs/mongoose'; // 추가

@Module({
  imports: [
    ConfigModule.forRoot(),
    MongooseModule.forRoot(process.env.MONGODB_URI), // 추가
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

 


Mongoose 로그 세팅

 

// src/app.module.ts

// ... 중략

export class AppModule implements NestModule {
  private readonly isDev: boolean = process.env.MODE === 'dev' ? true : false;
  configure(consumer: MiddlewareConsumer) {
    consumer.apply(LoggerMiddleware).forRoutes('*');
    mongoose.set('debug', this.isDev);
}

 


스키마 생성

 

우선 class-transformer 와 class-validator 를 install 한다.

 

npm i --save class-validator class-transformer

 

DB 에 저장될 형식을 검증하기 위해서 사용한다.

 

다음으로 user.schema.ts 파일을 만든다.

 

import { Schema, SchemaFactory } from '@nestjs/mongoose';
import { Document, SchemaOptions } from 'mongoose';

const options: SchemaOptions = {
  timestamps: true, // DB 에서 만들어질 때 timestamp 를 찍어준다.
};

@Schema(options) // 스키마 정의
export class User extends Document {} // mongoose의 Document를 상속

export const UserSchema = SchemaFactory.createForClass(User); // User 클래스를 스키마로 만듦

 

export class User extends Document {
  @Prop({
    required: true,
    unique: true,
  })
  @IsEmail()
  @IsNotEmpty()
  email: string;

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

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

 


생성해보기

 

dto 생성

import { IsEmail, IsString } from 'class-validator';

export class userCreateDto {
  @IsEmail()
  email: string;

  @IsString()
  name: string;

  @IsString()
  password: string;
}

 

모듈 등록

 

imports: [
    ConfigModule.forRoot(),
    MongooseModule.forRoot(process.env.MONGODB_URI),
    MongooseModule.forFeature([{ name: User.name, schema: UserSchema }]), // 등록
  ],

 

컨트롤러

  @Post()
  async signUp(@Body() body: userCreateDto) {
    return await this.appService.signUp(body);
  }

 

서비스

  constructor(
    @InjectModel(User.name) private readonly userModel: Model<User>,
  ) {}  

  async signUp(body: userCreateDto) {
    const { email, name, password } = body;

    const user = await this.userModel.create({ email, name, password });

    return user;
  }