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