ConfigModule 로 환경변수 설정하기


The @nestjs/config package internally uses dotenv.

config 모듈은 내부에서 dotenv를 사용하고, nestjs 방식으로 돌아간다.

  1. 설치

    npm i @nest/config cross-env

  2. .env 파일 생성

    .env.dev

    .env.test

    .env.prod

  3. package.json 수정

    "start:dev": "cross-env ENV=dev nest start --watch",
    "start": "cross-env ENV=prod nest start",
    
  4. .env.dev 에 변수 추가

    DB_HOST=
    DB_PORT=
    DB_USERNAME=
    DB_PASSWORD=
    DB_NAME=
    
  5. 앱모듈에 설정 적용 (ConfigModule)

    // app.module.ts
    
    import { Module } from '@nestjs/common';
    import { GraphQLModule } from '@nestjs/graphql';
    import { ApolloDriver } from '@nestjs/apollo';
    import { RestaurantsModule } from './restaurants/restaurants.module';
    import { TypeOrmModule } from '@nestjs/typeorm';
    import { ConfigModule } from '@nestjs/config';
    
    @Module({
      imports: [
        ConfigModule.forRoot({
          isGlobal: true,
          envFilePath: process.env.NODE_ENV === 'dev' ? '.env.dev' : '.env.test',
          ignoreEnvFile: process.env.NODE_ENV === 'prod',
        }),
        TypeOrmModule.forRoot({
          type: 'postgres',
          host: process.env.DB_HOST,
          port: +process.env.DB_PORT,
          username: process.env.DB_USERNAME,
          password: process.env.DB_PASSWORD,
          database: process.env.DB_NAME,
          synchronize: true,
          logging: true,
        }),
        GraphQLModule.forRoot({
          driver: ApolloDriver,
          autoSchemaFile: true,
        }),
        RestaurantsModule,
      ],
      controllers: [],
      providers: [],
    })
    export class AppModule {}
    
  6. validationSchema 옵션

    원하는 모든 환경 변수의 유효성 검사

    환경 변수의 유효성 검사를 통해 환경변수가 준비되지 않았을 경우 앱이 실행되지 않도록 하기!

    joi 설치

    npm i joi
    

    joi 는 100% javascript로 이루어져 있다. 이럴 경우 import 방법이 다르다 ! !

    typescript나 NestJS로 되어 있지 않은 패키지 import 방법

    app.module.ts

    import * as Joi from 'joi';
    
    imports: [
        ConfigModule.forRoot({
          isGlobal: true,
          envFilePath: process.env.NODE_ENV === 'dev' ? '.env.dev' : '.env.test',
          ignoreEnvFile: process.env.NODE_ENV === 'prod',
          validationSchema: Joi.object({
            NODE_ENV: Joi.string().valid('dev', 'prod'),
          }),
        }),
    

    NODE_ENV 는 string 이어야 하고, valid() 안의 요소들 중 하나여야 한다.

    만약 이렇게 적으면?

    ConfigModule.forRoot({
          isGlobal: true,
          envFilePath: process.env.NODE_ENV === 'dev' ? '.env.dev' : '.env.test',
          ignoreEnvFile: process.env.NODE_ENV === 'prod',
          validationSchema: Joi.object({
            NODE_ENV: Joi.string().valid('cookie'),
          }),
    

    Untitled

    에러 발생!