Tunko Development Diary

[NestJS] Configuration 환경변수 설정 [@nestjs/config, cross-env, joi] 본문

Development/Nest.js

[NestJS] Configuration 환경변수 설정 [@nestjs/config, cross-env, joi]

Tunko 2021. 4. 10. 19:07

설치

터미널에서 Nestjs 에서 제공하는 config 패키지 설치

npm i --save @nestjs/config

환경 변수 파일을 조건에 따라 읽기 위한 패키지 설치

npm i cross-env

환경변수 유효성 검사를 위한 패키지 설치

npm i joi

프로젝트 최상단에 파일 생성

.env.dev
.env.test

package.json 파일 해당라인 수정

  • cross-env 패키지를 이용해 환경변수를 할당한뒤 nest start 명령을 실행한다.
    // 수정전 
    "start:dev": "nest start --watch",
    "start:prod": "node dist/main",


    // 수정후  
    "start:dev": "cross-env NODE\_ENV=dev nest start --watch",  
    "start:prod": "cross-env NODE\_ENV=prod node dist/main",
  • ignoreEnvFile : 설정은 프로젝트 배포시엔 환경파일 .env 을 넘기지 않도록 하는 설정이다.
  • validationSchema : Joi 를 이용해 package.json 에서 설정한 NODE_ENV 에 설정한 환경변수가 유효한지 검사한다. (‘dev’ or ‘prod’) 검사
  • Joi 옵션중 하나인 required는 필수요소이다. 누락되면 안됨을 의미함.
  • NOED_ENV 는 package.json 에서 명령어로 설정
  • DB_HOST, DB_PORT, DB_USERNAME, DB_PASSWORD, DB_NAME 은 .env 파일에 설정되어있다.
    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',
              validationSchema: Joi.object({
                  NOED_ENV: Joi.string().valid('dev', 'prod').required(),
                  DB_HOST: Joi.string().required(),
                  DB_PORT: Joi.string().required(),
                  DB_USERNAME: Joi.string().required(),
                  DB_PASSWORD: Joi.string().required(),
                  DB_NAME: Joi.string().required(),
              }), 
      ]
    ...

.gitignore 에 추가

.env.dev
.env.test 

.env 파일 내용 설정

DB_HOST=localhost
DB_PORT=0000
DB_USERNAME=xxxxx
DB_PASSWORD=xxxxx
DB_NAME=xxxxx

app.module.ts 설정

import * as Joi from 'joi'

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,
    entities: [],
}),
반응형
Comments