[컴] NestJS 에서 ConfigModule 예시

nestjs config / env / 설정

NestJS 에서 ConfigModule 예시

NestJS 에서는 configuration 을 set할 때 ConfigService를 노출하는 ConfigModule 을 사용하는 것을 권장한다. 이 ConfigService가 알맞은 .env file 을 load 하는 것이다.

직접 만들어도 되고, @nestjs/config package 를 사용해도 된다. @nestjs/config package 내부에서 dotenv 를 사용한다.

npm i --save @nestjs/config

root module 에 아래처럼 ConfigModule을 추가한다.

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

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

@Module({
    // 이 때 1번째로 import 를 해야 그 이후 module 에서 ConfigModule을
    // 접근할 수 있다.
  imports: [ConfigModule.forRoot({
      // .env.dev.local 을 찾고, 없으면 .env.dev 를 찾는다.
      // 기본적으로 `.env`를 찾는다.
      envFilePath: ['.env.dev.local', '.env.dev'],
      // true 이면, global module 이 된다. 그래서 root module에서 한번만 import 하면, 
      // 다른 module 에서 import 없이 사용할 수 있다.
      isGlobal: true
    }),
    TypeOrmModule.forRootAsync({
      imports: [ConfigModule],
      inject: [ConfigService],
      useFactory: async (configService: ConfigService) => {
        return ({
          type: 'mysql',
          host: configService.get('HOST'),
          port: +configService.get('PORT'),
          username: configService.get('DATABASE_USER'),
          password: configService.get('DATABASE_PASSWORD'),
          database: configService.get('DATABASE'),
          // entities: [
          //   __dirname + '/**/*.entity{.ts,.js}',
          // ],
          autoLoadEntities: true,
          synchronize: true,
        })
    }}),
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

.env file :

DATABASE_USER=test
DATABASE_PASSWORD=test

이제 .env file 의 변수가 load 되면, nestjs 에서 process.env.DATABASE_USER 등을 이용해서 사용할 수 있게 된다. 그리고 또한 ConfigService 에도 저장돼서 ConfigService.get() 를 통해서도 접근할 수 있게 된다. ConfigService provider는 ConfigModule.forRoot()를 통해 등록돼서 사용할 수 있게 된다.

즉 process.env 에 .env file 의 값들을 load 한 것이라 볼 수 있다.

dist directory에 복사

nest build 시에는 .ts file 외에는 자동으로 복사하지 않는다. 그래서 nest-cli.jsoncompilerOptions#assets 에 아래처럼 복사가 되도록 설정을 해놔야 한다.

{
  ...
  "compilerOptions": {
    "assets": [{"include": "../config/*.yaml", "outDir": "./dist/config"}]
  }
}

기타

yaml file, 환경변수 사용등의 자세한 이야기는 ref. 1 을 참고하자.

Reference

  1. Configuration | NestJS - A progressive Node.js framework
  2. Ultimate Guide: NestJS Config & Environment Variables [2022]

댓글 없음:

댓글 쓰기