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.json
의 compilerOptions#assets
에 아래처럼 복사가 되도록 설정을 해놔야 한다.
{
...
"compilerOptions": {
"assets": [{"include": "../config/*.yaml", "outDir": "./dist/config"}]
}
}
기타
yaml file, 환경변수 사용등의 자세한 이야기는 ref. 1 을 참고하자.
댓글 없음:
댓글 쓰기