NestJS - 데이터베이스(MongoDB) 연결

올랜도·2022년 1월 24일
1

본 포스팅은 인프런에서 수강 가능한 탄탄한 백엔드 NestJS, 기초부터 심화까지를 바탕으로 작성되었습니다.
참고로 내가 까먹을까봐 쓰는겁니다.

ps.조만간 순서에 맞춰 수정 예정입니다.

NestJS와 DB 연결


MongoDB atlas에 데이터베이스 클러스터를 생성하였다는 가정 하에 다음과 같은 순서로 진행한다.

1. Install mongoose

데이터 베이스 적용을 위해서는 우선 프로젝트 폴더에
설치한다.

$ npm install --save @nestjs/mongoose mongoose

2. Import to app.module.ts


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

@Module({
  imports: [    
    MongooseModule.forRoot("mongodb://localhost/nest"),
    CatsModule,
  ],
  controllers: [AppController],
  // 프로바이더 클래스에 대한 의존성을 등록한다
  providers: [AppService],
})
export class AppModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    consumer.apply(LoggerMiddleware).forRoutes('*');
  }
}

일단은 테스트 프로젝트를 만들고 있으므로 다른코드가 같이 있는 app.module.ts에 추가를 한 모습,

mongodb://localhost/nest 해당 부분에는 mongodb 에서 데이터베이스 생성 시 제공하는 아이디 비밀번호가 들어간 주소를 넣어주면 된다.
하지만 개발 시 해당 부분이 노출 될 경우 문제가 될수 있기 때문에 이부분을 분리하여 줄 필요가 있다. 따라서 별도의 환경변수 .env을 생성하여 관리해 주는 것이 좋다. 이를 위해서 config에 관련된 패키지를 설치한다.

$ npm i --save @nestjs/config

설치후 프로젝트 디렉토리에 .env파일을 생성하여 내부에 민감한 정보에 대한 코드를 작성한다.
본인의 경우 포트번호와 개발모드에 대한 정보도 기입하였다.

MONGODB_URI = "mongodb+srv://test:testtest@nestcluster.8rxoa.mongodb.net/myFirstDatabase?retryWrites=true&w=majority"

PORT = 8000

MODE = 'dev'

다시 app.module.ts로 돌아와 config에 대한 라이브러리를 import 시키고 해당 정보를 다시 적용시킨다.

@Module({
  imports: [
    ConfigModule.forRoot(),
    MongooseModule.forRoot(process.env.MONGODB_URI, {
      useNewUrlParser: true,
      useUnifiedTopology: true,
    }),
    CatsModule,
  ],
  controllers: [AppController],
  // 프로바이더 클래스에 대한 의존성을 등록한다
  providers: [AppService],
})
export class AppModule implements NestModule {
  private readonly isDev: boolean = process.env.MODE === 'dev' ? true : false;

  configure(consumer: MiddlewareConsumer) {
    consumer.apply(LoggerMiddleware).forRoutes('*');
    // production 배포 시 false 지정해줄 것!
    mongoose.set('debug', this.isDev);
  }
}

코드를 보면 {useNewUrlParser: true, userUnifiedTopology: true,}코드가 추가로 보일텐데 이부분은 작성하지 않으면 해당 부분에 대해 deprecatedError가 발생한다. 그리고 해당 연결 부분은 개발 과정에서는 노출되는 것이 편하기 때문에 그대로 두지만, 배포 이후에는 감추는것이 더 유용하다.
따라서 삼항 연산자를 통해 현재 상태가 개발상태인지 배포상태인지 검사하는 코드

private readonly isDev: boolean = process.env.MODE === 'dev' ? true : false;

를 기입하여

mongoose.set('debug', this.isDev);

다음과 같은 상태를 만들어 주었다.
개발 상태에서는 db작업에 대한 로그가 출력된다.

접속이 안될 경우에는

이렇게 오류가 발생하지만 접속이 잘 될 때는

요로코롬 나온다더라

profile
☂️생존주의 개발자

0개의 댓글