[nest.js] Mongoose사용해보기

개발정리·2022년 6월 2일
0
post-thumbnail
post-custom-banner

introduction

Mongodb를 nestjs에서 사용하는방법이

공식문서에는 두가지정도 소개하고있습니다.

저는 이 문서를 따르겠습니다

다른 문서는 여기있습니다.

문서는 약간 express에서 Mongoose를 다루듯이

mongoose만 사용하는데 여기선

nestjs 답게 관리해줍니다.
큰 차이는 nestjs/mongoose를 사용한다 안한다? 정도가있겠습니다.

db 연결하기

app.modules.ts

import { Module } from '@nestjs/common';
import { MongooseModule } from '@nestjs/mongoose';

@Module({
  imports: [MongooseModule.forRoot('mongodb://localhost/nest')],
})
export class AppModule {}

Untitled

forRoot는 mongoose.connection객체와 같습니다

그렇기에 이렇게 사용할수도있어요

@Module({
  imports: [MongooseModule.forRoot('mongodb://localhost/nest',{dbName : "dbname"})],
})

스키마 생성하기

Untitled

Mongoose의 모든것은 스키마에서 파생된다고 하고있습니다

스키마가 하는 역할

  • 어떤 collection이 사용될지 명시하고
  • 그 collection에 어떠한 값이 들어가고 어떤 type이 들어가야하는지
  • 그 Collection을 다루는 method들도 sheama에서 파생됩니다.

스키마 생성

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

export type CatDocument = Cat & Document;

@Schema()
export class Cat {
  @Prop()
  name: string;

  @Prop()
  age: number;

  @Prop()
  breed: string;
}

export const CatSchema = SchemaFactory.createForClass(Cat);

스키마를 생성할땐 @Schema decorator 사용해야합니다.

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

Prop Decroator는 Only mongoose를 사용할때

password: { type: String, required: true, trim: true }

이런식으로 명시하잖아요 똑같이 사용가능합니다.

사용해보기

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

export type postDocument = Post & Document;

@Schema({versionKey : false})
export class Post {
  @Prop()
  title: string;

  @Prop()
  desc: string;

  @Prop()
  password: string;
}

export const postSchema = SchemaFactory.createForClass(Post);

단순한 스키마 만들어주고

@Module({
  imports: [
    MongooseModule.forFeature([{ name: Post.name, schema: postSchema }]),
  ],

모듈에 등록해주고

import { IsString } from 'class-validator';

export class PostCreateDTO {
  @IsString()
  title: string;

  @IsString()
  desc: string;

  @IsString()
  password: string;
}

DTO도 만들어줬고

import { Injectable } from '@nestjs/common';
import { InjectModel } from '@nestjs/mongoose';
import { Types, Model, ObjectId } from 'mongoose';
import { PostCreateDTO } from './dto/post.DTO';
import { Post, postDocument } from './schemas/post.schema';

@Injectable()
export class PostRepository {
  constructor(@InjectModel(Post.name) private postModel: Model<postDocument>) {}

  async findOne(ID : ObjectId): Promise<Post> {
    return this.postModel.findById(ID)
  }

  async findAll(){
    return this.postModel.find().exec()
  }

  async Create(PostCreateDTO : PostCreateDTO){
    const createdCat = new this.postModel(PostCreateDTO);
    return createdCat.save();
  }

}

repository도 만들어주고

Untitled

정상적으로 잘 작동합니다.

마무리

nestjs에서 mongoose를 처음다뤄봤습니다.(express에서도 사용해보지않음)

nestjs에서 mongoose를 사용하는 문서가 적었지만

express에서 사용하는 문서를 nest js에 적용하는게 그다지 어려운편도아니고

mongoose를 그대로 사용하는방법도있어서 뭔가 모르겠다 싶으면

자료가 엄청나게많은 express에서 사용하는방법을 검색해보시길바랍니다.

profile
배운거 정리해요
post-custom-banner

0개의 댓글