Backend/꾸준히 TIL

[NestJS + MongoDB ] NestJS 프레임워크에 MongoDB 연결해보자

개발하는 후딘 2022. 11. 12. 16:29
728x90
반응형

패키지 설치

$ npm i @nestjs/config

$ npm i @nestjs/mongoose mongoose

$ npm i dotenv @types/dotenv

- 필자는 몽고디비 altas를 사용한다. 그러므로 .env에서 mongodb uri를 불러와야하는데

이때 꼭 필요한 모듈이 @nestjs/config 이다. 

process.env.MONGODB_URI 보다는 configService.get<string>('MONGODB_URI') 를 쓰는게 좋다

 

configs 디렉토리에 module 과 service 생성

- mongodb-config.service.ts

// path: /src/config/mongodb-config.service.ts

import { Injectable } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
import {
  MongooseModuleOptions,
  MongooseOptionsFactory,
} from '@nestjs/mongoose';

@Injectable()
export class MongoDBConfigService implements MongooseOptionsFactory {
  constructor(private readonly configService: ConfigService) {}
  createMongooseOptions(): MongooseModuleOptions {
    return {
      uri: this.configService.get<string>('MONGODB_URI'),
    };
  }
}

 

- mongodb-config.module.ts

// path: /src/config/mongodb-config.module.ts

import { Module } from '@nestjs/common';
import { MongoDBConfigService } from './mongodb-config.service';

@Module({
  providers: [MongoDBConfigService],
})
export class MongoDBConfigModule {}

 

app.module.ts 에 MongooseModule 넣기

import { MongoDBConfigModule } from './config/mongodb-config.module';
import { MongoDBConfigService } from './config/mongodb-config.service';

@Module({
  imports: [
    ConfigModule.forRoot({ isGlobal: true }),
    MongooseModule.forRootAsync({
      useFactory: () => ({uri: process.env.MONGODB_URI})
    }),
    UsersModule,
    ...
    ConfigModule,
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    consumer.apply(LoggerMiddleware).forRoutes();
  }
}

스키마 정의 와 주입

- 스키마는 각 엔티티(i.e. produes) 안에 넣는걸로 한다.

src
|
|-products
          |_ schemas
          |          |_ product.schema.ts
          |_ products.module.ts
          |_ products.service.ts

 

- product.schema.ts

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

export type ProductDocument = mongoose.HydratedDocument<Product>;

@Schema()
export class Product {
  @Prop()
  name: string; //상풍명

  @Prop()
  price: number; // 가격

  @Prop()
  description: string; //설명글

  @Prop([String])
  category: string[]; //카테고리

  @Prop()
  endOrderDate: Date; //주문마감일

  @Prop()
  buyCountry: string; //구매지역

  @Prop()
  createdAt: Date;

  @Prop()
  deletedAt: Date;
}

export const ProductSchema = SchemaFactory.createForClass(Product);

 

- 서비스에서 스키마 주입

// path: /src/products/products.service.ts

import { Injectable } from '@nestjs/common';
import { InjectModel } from '@nestjs/mongoose';
import { Model } from 'mongoose';
import { Product, ProductDocument } from './schemas/product.schema';

@Injectable()
export class ProductsService {
  constructor(
    @InjectModel(Product.name) private productModel: Model<ProductDocument>,
  ) {}
  
  ...
}

 

MongooseModule 주입

// path: /src/products/products.module.ts

import { MongooseModule } from '@nestjs/mongoose';
import { Product, ProductSchema } from './schemas/product.schema';

@Module({
  imports: [
    // forFeature() : 환경설정역할 -> 모델을 정의
    MongooseModule.forFeature([{ name: Product.name, schema: ProductSchema }]),
    // MongooseModule.forFeature(....) // Products외 다른 콜렉션을 사용할 때 추가하면된다.
  ],
  controllers: [ProductsController],
  providers: [ProductsService],
})
export class ProductsModule {}

 


Repository 단 분리시키기

 

 


[참고]

몽고디비와 몽구스 연결

 

[NestJS] NestJS에서 MongoDB 연결하기

2020.12.12 - [Language/Javascript] - [Node.js] MongoDB Mac에서 brew로 다운받고 Node.js로 연결하기 [Node.js] MongoDB Mac에서 brew로 다운받고 Node.js로 연결하기 Node.js + Mongodb 조합을 많이 사용한다고 하지만 python 만

cocook.tistory.com

 

몽고디비 아틀라스 연결

 

nest js Mongodb Atlas 연결 문제 (환경변수 읽기 문제)

DB를 연결하기 위해 .env 파일에 db 유저와 비밀번호 db name을 작성하고 읽어오려 하였으나 실패1\. 공식 문서에 따라 @Module내의 imports에서 forRoot로 mongodb atlas에 연결 시도 > 실패2\. 문법의 문제일 가

velog.io

 

래포지토리단 추가하여 구조변경

 

Nestjs: MongoDB and Mongoose

MongoDB를 사용하는 방법은 크게 두 가지인데 nest에 내장된 TypeORM을 사용하는 방법과 @nestjs/mongoose 패키지를 통해 Mongoose를 사용하는 방법으로 나뉜다. Express에서부터 Mongoose를 사용했기 때문에 이

velog.io

 

 

[ 공식다큐먼트] 공식다큐를 읽었는데도... 연결이되지 않아서 구글링 을 했다 ㅠㅠ

 

Documentation | NestJS - A progressive Node.js framework

Nest is a framework for building efficient, scalable Node.js server-side applications. It uses progressive JavaScript, is built with TypeScript and combines elements of OOP (Object Oriented Progamming), FP (Functional Programming), and FRP (Functional Reac

docs.nestjs.com

 

Documentation | NestJS - A progressive Node.js framework

Nest is a framework for building efficient, scalable Node.js server-side applications. It uses progressive JavaScript, is built with TypeScript and combines elements of OOP (Object Oriented Progamming), FP (Functional Programming), and FRP (Functional Reac

docs.nestjs.com

728x90
반응형