BackEnd/Nest.js

[Nest.js] Config 패키지

Grace 2023. 5. 16. 17:35

Nest는 dotenv를 내부적으로 활용하는 @nestjs/config 패키지를 제공합니다. 이를 이용해서 COnfigModule을 동적으로 생성할 수 있습니다.

$ npm i --save @nestjs/config

이 패키지에는 ConfigModule 이름을 가진 모듈이 이미 존재합니다. 이 모듈을 동적 모듈로 가져옵니다.

...
import { ConfigModule } from '@nestjs/config';

@Module({
  imports: [ConfigModule.forRoot()],
  ...
})
export class AppModule {}

정적 모듈을 가져올 때와는 달리 ConfigModule.forRoot() 메서드를 호출합니다. forRoot 메서드는 DynamicModule을 리턴하는 정적 메서드입니다. 동적 모듈을 작성할 때 forRoot 라는 이름 대신 어떤 다른 일므을 써도 상관없지만 관례상 forRoot나 register를 붙입니다. 비동기 함수일 때는 forRootAsync, registerAsync로 합니다.

static forRoot(options?: ConfigModuleOptions): DynamicModule;

인수로는 ConfigModuleOptions를 받습니다. 즉, ConfigModule은 소비 모듈이 원하는 옵션값을 전달하여 원하는 대로 동적으로 ConfigModule을 생성합니다. ConfigModule을 위와 같이 가져왔다면 프로젝트의 루트 디렉터리에 있는 .env 파일을 찾아 환경 변수로 등록합니다. 우리는 3개의 .env 파일을 가지고 있으므로 envFilePath 옵션을 주도록 합시다.

import { ConfigModule } from '@nestjs/config';

@Module({
  imports: [ConfigModule.forRoot({
    envFilePath: (process.env.NODE_ENV === 'production') ? '.production.env'
      : (process.env.NODE_ENV === 'stage') ? '.stage.env' : '.development.env'
  })],
  controllers: [AppController],
  providers: [AppService, ConfigService]
})
export class AppModule {}

ConfigModuleOptions에는 envFilePath 외에도 여러 가지 옵션이 있습니다.

export interface ConfigModuleOptions {
  cache?: boolean;
  isGlobal?: boolean;
  ignoreEnvFile?: boolean;
  ignoreEnvVars?: boolean;
  envFilePath?: string | string[],
  encoding?: string;
  validate?: (config: Record<string, any>) => Record<string, any>;
  validateionSchema: any;
  validationOptions?: Record<string, any>;
  load?: Array<ConfigFactory>;
  expandVariables?: boolean;
}

Nest가 제공하는 ConfigModule은 .env 파일에서 읽어온 환경 변수 값을 가져오는 프로바이더인 ConfigService가 있습니다. 이를 원하는 컴포넌트에서 주입하여 사용하면 됩니다.

import { Controller, Get } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';

@Controller()
export class AppController {
  constructor(private readonly configService: ConfigService) {}
  
  @Get('/db-host-from-fonfig')
  getDatabaseHostFromConfigService(): string {
    return this.configService.get('DATABASE_HOST');
  }
}

@nest/config 패키지를 사용하지 않고 직접 dotenv를 사용하여 .env 파일이 존재하는 폴더를 동적으로 전달해도 됩니다.

'BackEnd > Nest.js' 카테고리의 다른 글

[Nest.js] JWT 인증/인가  (0) 2023.05.26
[Nest.js] 파이프와 유효성 검사  (0) 2023.05.16
[Nest.js] 프로바이더  (0) 2023.05.16
[Nest.js] 인터페이스  (0) 2023.05.08
[Nest.js] 백엔드 개발 기본 지식  (0) 2023.04.27