NestJS 공식홈페이지를 보면 환경변수 설정에 대해서 다양한 방법들을 확인할 수 있다.
그중 난 Joi를 이용한 방법이 가장 좋은 방법 같아서 이 방법을 사용하고 있다.
패키지 설치
npm i @nestjs/config joi
적용
공식 문서에선 app.module.ts의 imports 안에 선언에서 작성하는 예시를 보여준다.
난 app.module.ts에는 만들어진 모듈이나 프로바이더를 가져와서 딱 넣기만 하는 방식으로 만들고 싶어서 좀 수정했다.
먼저 src 밑에 config 디렉터리를 생성 후 config.module.ts 생성 후 아래와 같이 작성한다.
import { Module } from '@nestjs/common';
import { ConfigModule as NestConfigModule } from '@nestjs/config';
import common from './conf/common.config';
import { validationSchema } from './validation.schema';
const developmentEnv = '.env.development';
const productionEnv = '.env';
@Module({
imports: [
NestConfigModule.forRoot({
envFilePath:
process.env.NODE_ENV === 'development' ? developmentEnv : productionEnv,
load: [common],
isGlobal: true,
validationSchema,
}),
],
})
export class ConfigModule {}
NODE_ENV 값에 따라 읽을 env 파일명을 지정해 줬다.
config디렉터리 안에 conf 디렉터리 생성 후 common.config.ts 파일 생성 후 아래와 같이 작성
import { registerAs } from '@nestjs/config';
export default registerAs('common', () => ({
NODE_ENV: process.env.NODE_ENV,
projectName: process.env.PROJECT_NAME,
appPort: process.env.APP_PORT,
}));
작성이 완료되면 config.module.ts안에 load 속성에다가 추가하면 된다.
나중에 추가적으로 기능이나 용도별로 파일을 구분해서 만든 후 만든 걸 load 쪽에 추가해 주면 된다.
그리고 환경 변수의 validation체크를 위한 파일을 만든다.
src/config 안에 validation.schema.ts를 생성 후 아래와 같이 작성한다.
import * as Joi from 'joi';
export const validationSchema = Joi.object({
NODE_ENV: Joi.string()
.valid('development', 'production')
.default('development'),
PROJECT_NAME: Joi.string().required(),
APP_PORT: Joi.number().default(3000),
});
설명하면 이렇다.
NODE_ENV 값은 string이어야 하고 development, production만 입력이 가능하고, 기본 값은 development
PROJECT_NAME 값은 string 이어야 하고 필수값
APP_PORT는 number이고 기본 값은 3000
이런 식으로 환경변수에 대한 정합성체크를 미리 할 수 있어서 사용하는 게 좋다고 느꼈다.
이렇게 env파일에서 APP_PORT의 값에 문자열을 넣고 실행하면
이런 에러를 확인할 수 있다.
package.json의 실행 스크립트 명령어에서도 NODE_ENV=development를 오타를 내거나 다른 값을 넣어도 에러를 확인할 수 있다.
사용
import { Inject, Injectable } from '@nestjs/common';
import { ConfigType } from '@nestjs/config';
import commonConfig from './config/conf/common.config';
@Injectable()
export class AppService {
constructor(
@Inject(commonConfig.KEY) private config: ConfigType<typeof commonConfig>,
) {}
getHello(): string {
const projectName = this.config.projectName;
return 'Hello World!';
}
}
https://docs.nestjs.com/techniques/configuration
'Node.js > NestJS' 카테고리의 다른 글
[NestJS] winston을 이용한 커스텀로거 (0) | 2024.03.19 |
---|---|
[NestJS] 설치 및 Prisma, GraphQL 적용하기(+MySQL) (0) | 2023.12.02 |