NestJS - 동적 모듈과 환경변수

바그다드·2023년 11월 30일
0

동적 모듈이란?
참조를 하는 모듈이 타겟 모듈을 생성할 때 동적으로 값을 설정하는 방식
대표적으로 Config라고 하는 모듈이 있다. Config 모듈은 실행환경에 따라 설정되는 환경 변수를 관리하는 모듈을 말한다.

예를 들어 db의 호스트가

로컬 : localhost
스테이지 : stage.nest.com
프로덕션 : production.nest.com

과 같이 환경에 따라 변하는 값에 대해 환경변수를 통해 서버의 환경을 구분할 수 있다.

dotenv

Nodejs에서 자주 사용하는 라이브러리
.env파일에 환경변수를 저장해두고 사용하는 방식이다.
기본적으로 dotenv는 루트 디렉토리에 있는 .env파일을 읽는다.

라이브러리 설치

npm i --save dotenv
// js기반의 라이브러리를 ts에서 타입 추론을 위해 사용하는 라이브러리
npm i --save-dev @types/dotenv

.env 생성

NODE_ENV 설정

기본적으로 os에서 설정해야 하지만 package.json을 통해 설정하는 방법도 있다.

"script": {
	"prebuild": "rimraf dist",
    // 생략
	"start:dev": "npm run prebuild && NODE_ENV=development nest start --watch", // Node_ENV를 development로 설정함
    // 생략
}

Nest의 Config

nestjs에서는 dotenv를 내부적으로 사용하는 @nestjs/config 패키지를 제공한다.

npm i --save @nestjs/config

ConfigModule 등록

@Module({
  imports: [ConfigModule.forRoot({ // DynamicModule반환
    // forRoot에 들어가는 ConfigModuleOption
    envFilePath: (process.env.NODE_ENV === 'production')? '.productions.env'
    : (process.env.NODE_ENV === 'stage') ? '.stage.env' : '.development.env'
  })],

동적 ConfigModule 등록

  1. 관련 라이브러리 설치
npm install @nestjs/config // config패키지
npm install joi // 환경변수 유효성 검사를 지원하는 라이브러리
  1. .env 파일 빌드
    nest는 기본적으로 ts파일이 아닌 에셋은 빌드에서 제외한다.
    따라서 .env파일을 out디렉토리(dist디렉토리)로 복사할 수 있도록 nest-cli.json에 설정해줘야한다.
  "compilerOptions": {
    "assets": [
      {
        "include": "./config/env/*.env",
        "outDir": "./dist"
      }
    ]
  }
  1. 동적 모듈 등록
    ConfigModule.forRoot({
    	// env 파일 경로
      envFilePath: [`${__dirname}/config/env/.${process.env.NODE_ENV}.env`],
      // ConfigFactory(환경변수값) 등록
      load: [emailConfig],
      isGlobal: true,
      // joi 등록
      validationSchema,
    })
  ],
  1. joi 생성
    환경변수 유효성 검사를 수행하는 객체 생성
import * as Joi from "joi";

export const validationSchema = Joi.object({
    EMAIL_SERVICE: Joi.string().required(),
    EMAIL_AUTH_USER: Joi.string().required(),
    EMAIL_AUTH_PASSWORD: Joi.string().required(),
    EMAIL_BASE_URL: Joi.string().required().uri()
})
profile
꾸준히 하자!

0개의 댓글