Node.js/NestJS

[NestJS] 환경변수 설정(env)

SongMinu 2024. 3. 18. 17:42
728x90

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

 

반응형