[NestJS] @nestjs/config ConfigService 로 MongDB 설정하기

@nestjs/config package 설치

npm i @nestjs/config

또는

yarn add @nestjs/config

.env , .env.production 파일 만들기

프로젝트 루트에 .env(개발용), .env.production(운영용) 파일을 만들어서 필요한 환경변수를 작성한다. 굳이 루트에 만들지 않고 따로 config 같은 폴더를 만들어서 그 안에 파일을 생성해도 아래 AppModule 설정 중 envFilePath 를 살짝 바꿔서 할 수 있다.

DB_URL=mongodb+srv://아이디:암호@도메인/디비명

디폴트는 .env 를 사용하고 운영서버에는 NODE_ENV 환경변수에 production 으로 설정해 둔다.

# 윈도우 PowerSehll 에서 환경변수 설정하기
$env:NODE_ENV="production"

# 윈도우 커맨드창에서 환경변수 설정하기
set NODE_ENV=production

# 리눅스에서 환경변수 설정하기
export NODE_ENV=production

app.moudle.ts 파일 설정하기

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

@Module({
    imports: [
        ConfigModule.forRoot({
            // 다른 모듈에서 imports 에 등록 안해도 constructor(config: ConfigService){} 이렇게 가져다 쓸 수 있도록 한다.
            isGlobal: true,
            // NODE_ENV 값이 production 일때 .env.production 파일을 읽도록 설정
            envFilePath: `.env${process.env.NODE_ENV ? `.${process.env.NODE_ENV}` : ''}`,
        }),
        // ConfigService 를 사용하기 위해 일반적으로 사용하는 MongooseModule.forRoot 대신 MongooseModule.forRootAsync 로 모듈을 가져온다.
        MongooseModule.forRootAsync({
            imports: [ConfigModule],
            useFactory: async (config: ConfigService) => ({
                uri: config.get('DB_URL'),
                useNewUrlParser: true,
                useUnifiedTopology: true,
            }),
            inject: [ConfigService],
        }),
    ],
    controllers: [AppController],
    providers: [AppService],
})
export class AppModule {}