참고
- https://docs.nestjs.com/techniques/database#async-configuration
- https://github.com/myvoltron/typeorm-configuration/tree/master/src
개요
Nest.js 환경에서 환경변수를 로드할 때 @nestjs/config
패키지를 사용합니다. 해당 패키지와 함께 TypeORM configuration 하는 방법을 알아봅니다.
참고로 여기서 쓰이는 방법은 다른 패키지 쓸 때도 적용할 수 있습니다.
일단 환경변수 설정하기 feat. ConfigModule
우선 환경변수 로드를 위해서 ConfigModule
설정을 해야합니다. 저는 해당 모듈의 설정 파일을 src/config/config.validator.ts
에 두었습니다.
import { ConfigModuleOptions } from '@nestjs/config/dist';
import * as Joi from 'joi';
export const CONFIG_VALIDATOR: ConfigModuleOptions = {
validationSchema: Joi.object({
DB_HOST: Joi.string().required(),
DB_PORT: Joi.number().required(),
DB_USERNAME: Joi.string().required(),
DB_PASSWORD: Joi.string().required(),
DB_DATABASE: Joi.string().required(),
}),
isGlobal: true,
};
Joi
패키지를 사용해서 환경변수 검증을 할 수 있습니다. 그리고 isGlobal
옵션을 true
로 설정해서 전역적으로 쓰일 수 있게 했습니다.
그리고 AppModule
에 ConfigModule
을 imports 해줍니다.
import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { CONFIG_VALIDATOR } from './app/config/config.validator';
import { CatsModule } from './cats/cats.module';
@Module({
imports: [CatsModule, ConfigModule.forRoot(CONFIG_VALIDATOR)],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
ConfigService를 통해 TypeORM Configuration 하기
이제 ConfigService를 주입받아서 TypeORM 설정을 해야합니다. 우선 저같은 경우에는 TypeORM 설정 파일을 src\app\mysql\mysql-config.provider.ts
에 두었습니다.
import { Injectable } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
import { TypeOrmModuleOptions, TypeOrmOptionsFactory } from '@nestjs/typeorm';
@Injectable()
export class MysqlConfigProvider implements TypeOrmOptionsFactory {
constructor(private configService: ConfigService) {}
createTypeOrmOptions(): TypeOrmModuleOptions {
return {
type: 'mysql',
host: this.configService.get('DB_HOST'),
port: this.configService.get<number>('DB_PORT'),
username: this.configService.get('DB_USERNAME'),
password: this.configService.get('DB_PASSWORD'),
database: this.configService.get('DB_DATABASE'),
autoLoadEntities: true,
synchronize: true,
logging: true,
};
}
}
이제 마지막으로 AppModule에서 TypeOrmModule을 imports 하면됩니다.
import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { TypeOrmModule } from '@nestjs/typeorm';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { CONFIG_VALIDATOR } from './app/config/config.validator';
import { MysqlConfigProvider } from './app/mysql/mysql-config.provider';
import { CatsModule } from './cats/cats.module';
@Module({
imports: [
CatsModule,
ConfigModule.forRoot(CONFIG_VALIDATOR),
TypeOrmModule.forRootAsync({
useClass: MysqlConfigProvider,
}),
],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}