Nest JS 환경 변수 

NestJS에서 환경 변수 설정은 ConfigModule을 통해서 한다. 설정된 환경 변수를 다른 모듈에서 사용하려면 ConfigService를 주입받아 사용한다.

ConfigModule 초기화 순서

  1. ConfigModule.forRoot() 함수로 초기화한다. 보통 app.module.ts에서 해당 코드를 실행한다.
  2. ConfigModule을 초기화할 때 envFilePath 설정에서 환경 변수를 읽은 뒤 process.env에 설정되어 있는 환경 변수와 합친다.
  3. 커스텀 환경 변수를 설정한 load 옵션의 설정과 병합한 뒤 ConfigService를 초기화한다.

ConfigService는 다른 모듈에 의존성 주입을 해서 추가적인 설정 없이 사용한다.

 

@nestjs/config 설치

npm i @nestjs/config

해당 명령어를 통해 @nestjs/config 를 설치한다.

@nestjs/config는 내부적으로 dotenv를 사용한다. dotenv는. env 파일에 환경 변수를 설정하고 불러오는 자바스크립트로 만들어진 라이브러리다.

 

ConfigModule 초기화

//app.module.ts
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { ConfigModule } from '@nestjs/config'; //ConfigModule 불러오기

@Module({
  imports: [ConfigModule.forRoot()], //ConfigModule.forRoot() 로 초기화
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

ConfigModule.forRoot() 함수에는 여러 옵션이 있다.

cache 메모리 환경 변수를 캐시할지 여부 (앱 성능 향상)
encoding 환경 변수 파일 인코딩
envFilePath 환경 변수 파일 경로
ignoreEnvFile true 면 .env 파일이 무시 됨
ignoreEnvVars true 면 환경 변수가 무효화 됨
isGlobal true 면 global module로 등록 됨. 다른 모듈에서 import  불필요.
load 커스텀 환경 설정 파일을 로딩 시에 사용
validate 환경 변수 유효성 검증 함수

 

envFilePath

env 파일에 경로를 지정한다.

local, dev, prod 등 실행 환경에 따라 사용하는 env 파일이 바뀌기 때문에 설정을 해주면 편하다.

//package.json

"scripts": {
    "start": "set NODE_ENV=local && nest start --watch",
    "start:dev": "set NODE_ENV=dev && nest start --watch",
    "start:prod": "set NODE_ENV=prod && nest start --watch"
  },

package.json 파일의 스크립트를 수정해준다.

 

//app.module.ts
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { ConfigModule } from '@nestjs/config'; 

@Module({
  imports: [   
  ConfigModule.forRoot({
      envFilePath: `${process.cwd()}/envs/.env.${process.env.NODE_ENV}`
    })], 
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

위와 같이 작성 후 .env.local 파일을 작성한다.

// .env.local
TEST = local

이제 환경 변수를 사용 가능하다.

import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';
import { ConfigService } from '@nestjs/config';

@Controller()
export class AppController {
  constructor(
    private readonly appService: AppService,
    private readonly configService: ConfigService,
  ) {}

  @Get()
  getHello(): string {
    console.log(111, this.configService.get('TEST')); // local 이 출력된다.
    return this.appService.getHello();
  }
}

 

 

isGlobal

//app.module.ts
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { ConfigModule } from '@nestjs/config'; 

@Module({
  imports: [ ConfigModule.forRoot({
      isGlobal: true, //글로벌 설정
      envFilePath: `${process.cwd()}/envs/${process.env.NODE_ENV}`,
    })], 
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

isGlobal 을 true 로 설정하면 다른 모듈에서 ConfigModule 을 import 할 필요가 없어진다. 굳이 안 할 필요가 없다.

 

cache

//app.module.ts
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { ConfigModule } from '@nestjs/config'; 

@Module({
  imports: [ ConfigModule.forRoot({
      isGlobal: true,
      envFilePath: `${process.cwd()}/envs/${process.env.NODE_ENV}`,
      cache : true //캐시 설정
    })], 
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

env 파일은 앱이 최초 실행될 때 가져오고 변동되지 않는다. 캐시를 사용하면 성능적으로 향상된다. 굳이 안 할 필요가 없다

 

개인 기록용입니다. 만약 잘못된 부분이 있다면 댓글로 알려주신다면 감사하겠습니다!

'프레임워크\라이브러리 > Nest.js' 카테고리의 다른 글

[NestJS] 커스텀 파이프  (0) 2024.02.20
[NestJS] 파이프  (1) 2024.02.18
[NestJS] DTO  (1) 2024.02.12
[NestJS] 컨트롤러  (0) 2024.02.08
[NestJS] 설치  (1) 2024.02.06