[NestJS] module에 환경 변수 사용하기

calm0_0·2023년 10월 25일
0

NestJS

목록 보기
2/3

NestJS에서 환경 변수에 접근할 때 dotenv를 사용하다가 아래와 같이 ConfigModule 을 사용하려고 했다.

@Module({
  imports: [
    ConfigModule.forRoot(configModuleOptions),
    TypeOrmModule.forRoot({
      type: 'mysql',
      host: configService.get('DB_HOST'),
      port: +configService.get<number>('DB_PORT'),
      username: configService.get('DB_USERNAME'),
      database: configService.get('DB_DATABASE'),
      password: configService.get('DB_PASSWORD'),
      entities: [__dirname + '/**/*.entity{.ts,.js}'],
      synchronize: false,  
    }),
    ...
  ],
})

export class AppModule {}

하지만 환경 변수 값을 읽지 못하고 에러가 발생했다. 애플리케이션이 bootstraping 될 때, 즉 모듈의 생성 시점에는 config module을 사용할 수 없었고, 그래서 환경 변수 값을 불러오지 못했던 것이다.

애플리케이션이 bootstraping 될 때 TypeOrmModule 에서 동적 구성을 허용할 수 있도록 forRoot() 대신 forRootAsync() 를 사용함으로써 해결했다.

@Module({
  imports: [
    ConfigModule.forRoot(configModuleOptions),
    TypeOrmModule.forRootAsync({
      imports: [ConfigModule],
      useClass: TypeOrmConfigService,
      inject: [ConfigService],
    }),
	...
  ],
})

export class AppModule {}

TypeOrmModule 에서 ConfigModule 을 imports, ConfigService 를 inject 하고 있다. 이는 ConfigModule을 직접 사용하면서, useClass 의 TypeOrmConfigService 에서 설정을 반환하는데, 내부에서 ConfigService 를 사용하겠다는 것이다. 이렇게 useClass 키워드로 모듈을 동적으로 만들어 문제를 해결했다.



Reference
https://kscodebase.tistory.com/553
https://4sii.tistory.com/417
https://stackoverflow.com/questions/52570212/nestjs-using-configservice-with-typeormmodule

profile
공부한 내용들을 정리하는 블로그

0개의 댓글