본문 바로가기
Language/Javascript

[NestJS] MongoDB와 연결하기

by SooooooooS 2023. 7. 12.
728x90

※ 기록용 ※

폴더 구조

1. mongoose 설치

npm install --save @nestjs/mongoose mongoose

2. app.module.ts : nestjs 애플리케이션에서 MongoDB와의 연결을 설정

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { MongooseModule } from '@nestjs/mongoose'; //mongoDB 연결
import { VideoModule } from './video/video.module';

@Module({
  imports: [MongooseModule.forRoot('mongodb://localhost:27017/test'), VideoModule],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

3. video.schema.ts : 데이터 모델을 정의

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

export type VideoDocument = Video & Document;

@Schema()
export class Video extends Document {
    @Prop({ required: true })
    @IsString()
    @IsNotEmpty()
    name: string;

    @Prop()
    @IsString()
    @IsNotEmpty()
    url: string;
}

export const VideoSchema = SchemaFactory.createForClass(Video);

4. video.service.ts : MongoDB와 상호 작용을 위한 서비스를 생성

import { Injectable } from '@nestjs/common';
import { Video, VideoDocument } from './schemas/video.schema';
import { Model } from 'mongoose';
import { InjectModel } from '@nestjs/mongoose';

@Injectable()
export class VideoService {
    constructor(@InjectModel(Video.name) private videoModel: Model<VideoDocument>) { }
    
    async findAll(): Promise<Video[]> {
        return this.videoModel.find().exec();
    }
    
    async create(video: Video): Promise<Video> {
        const createVideo = new this.videoModel(video);
        return createVideo.save();
    }
}

5. video.controller.ts : MongoDB 서비스를 사용

import { Controller, Get, Post, Body } from '@nestjs/common';
import { VideoService } from './video.service';
import { Video } from './schemas/video.schema';

@Controller('video')
export class VideoController {
    constructor(private readonly videoService: VideoService) { }
    
    @Get()
    findAll(): Promise<Video[]> {
        return this.videoService.findAll();
    }

    @Post()
    create(@Body() video: Video): Promise<Video> {
        return this.videoService.create(video);
    }
}

6. video.module.ts : 현재 범위에 등록할 모델을 정의

import { Module } from '@nestjs/common';
import { VideoService } from './video.service';
import { VideoController } from './video.controller';
import { MongooseModule } from '@nestjs/mongoose';
import { Video, VideoSchema } from './schemas/video.schema';

@Module({
  imports: [MongooseModule.forFeature([{name: Video.name, schema: VideoSchema}])],
  providers: [VideoService],
  controllers: [VideoController]
})
export class VideoModule {}

+ 환경변수 사용하기

1. Config 설치

npm i @nestjs/config

2. app.module.ts : CofigModule 삽입

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

@Module({
  imports: [
    ConfigModule.forRoot({isGlobal:true}), //git에 중요정보를 올리지 않기 위해 .env 사용 - 다른 모듈에서도 사용가능
    MongooseModule.forRoot(process.env.MONGODB_URI), //경로 보이지 않게 설정
    UserModule],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

3. .env 파일 생성 : 최상위 폴더에 존재해야한다. → .gitignore에 추가해주기

MONGODB_URI = "MongoDB 클러스터 주소"
728x90