동적 모듈이란?
참조를 하는 모듈이 타겟 모듈을 생성할 때 동적으로 값을 설정하는 방식
대표적으로 Config라고 하는 모듈이 있다. Config 모듈은 실행환경에 따라 설정되는 환경 변수를 관리하는 모듈을 말한다.
예를 들어 db의 호스트가
로컬 : localhost
스테이지 : stage.nest.com
프로덕션 : production.nest.com
과 같이 환경에 따라 변하는 값에 대해 환경변수를 통해 서버의 환경을 구분할 수 있다.
Nodejs에서 자주 사용하는 라이브러리
.env파일에 환경변수를 저장해두고 사용하는 방식이다.
기본적으로 dotenv는 루트 디렉토리에 있는 .env파일을 읽는다.
npm i --save dotenv
// js기반의 라이브러리를 ts에서 타입 추론을 위해 사용하는 라이브러리
npm i --save-dev @types/dotenv
기본적으로 os에서 설정해야 하지만 package.json을 통해 설정하는 방법도 있다.
"script": {
"prebuild": "rimraf dist",
// 생략
"start:dev": "npm run prebuild && NODE_ENV=development nest start --watch", // Node_ENV를 development로 설정함
// 생략
}
nestjs에서는 dotenv를 내부적으로 사용하는 @nestjs/config 패키지를 제공한다.
npm i --save @nestjs/config
@Module({
imports: [ConfigModule.forRoot({ // DynamicModule반환
// forRoot에 들어가는 ConfigModuleOption
envFilePath: (process.env.NODE_ENV === 'production')? '.productions.env'
: (process.env.NODE_ENV === 'stage') ? '.stage.env' : '.development.env'
})],
npm install @nestjs/config // config패키지
npm install joi // 환경변수 유효성 검사를 지원하는 라이브러리
"compilerOptions": {
"assets": [
{
"include": "./config/env/*.env",
"outDir": "./dist"
}
]
}
ConfigModule.forRoot({
// env 파일 경로
envFilePath: [`${__dirname}/config/env/.${process.env.NODE_ENV}.env`],
// ConfigFactory(환경변수값) 등록
load: [emailConfig],
isGlobal: true,
// joi 등록
validationSchema,
})
],
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()
})