Mongodb를 nestjs에서 사용하는방법이
공식문서에는 두가지정도 소개하고있습니다.
저는 이 문서를 따르겠습니다
다른 문서는 여기있습니다.
이 문서는 약간 express에서 Mongoose를 다루듯이
mongoose만 사용하는데 여기선
nestjs 답게 관리해줍니다.
큰 차이는 nestjs/mongoose를 사용한다 안한다? 정도가있겠습니다.
app.modules.ts
import { Module } from '@nestjs/common';
import { MongooseModule } from '@nestjs/mongoose';
@Module({
imports: [MongooseModule.forRoot('mongodb://localhost/nest')],
})
export class AppModule {}
forRoot는 mongoose.connection객체와 같습니다
그렇기에 이렇게 사용할수도있어요
@Module({
imports: [MongooseModule.forRoot('mongodb://localhost/nest',{dbName : "dbname"})],
})
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도 만들어주고
정상적으로 잘 작동합니다.
nestjs에서 mongoose를 처음다뤄봤습니다.(express에서도 사용해보지않음)
nestjs에서 mongoose를 사용하는 문서가 적었지만
express에서 사용하는 문서를 nest js에 적용하는게 그다지 어려운편도아니고
mongoose를 그대로 사용하는방법도있어서 뭔가 모르겠다 싶으면
자료가 엄청나게많은 express에서 사용하는방법을 검색해보시길바랍니다.