Nest JS 환경 변수
NestJS에서 환경 변수 설정은 ConfigModule을 통해서 한다. 설정된 환경 변수를 다른 모듈에서 사용하려면 ConfigService를 주입받아 사용한다.
ConfigModule 초기화 순서
- ConfigModule.forRoot() 함수로 초기화한다. 보통 app.module.ts에서 해당 코드를 실행한다.
- ConfigModule을 초기화할 때 envFilePath 설정에서 환경 변수를 읽은 뒤 process.env에 설정되어 있는 환경 변수와 합친다.
- 커스텀 환경 변수를 설정한 load 옵션의 설정과 병합한 뒤 ConfigService를 초기화한다.
ConfigService는 다른 모듈에 의존성 주입을 해서 추가적인 설정 없이 사용한다.
@nestjs/config 설치
npm i @nestjs/config
해당 명령어를 통해 @nestjs/config 를 설치한다.
@nestjs/config는 내부적으로 dotenv를 사용한다. dotenv는. env 파일에 환경 변수를 설정하고 불러오는 자바스크립트로 만들어진 라이브러리다.
ConfigModule 초기화
//app.module.ts
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { ConfigModule } from '@nestjs/config'; //ConfigModule 불러오기
@Module({
imports: [ConfigModule.forRoot()], //ConfigModule.forRoot() 로 초기화
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
ConfigModule.forRoot() 함수에는 여러 옵션이 있다.
cache | 메모리 환경 변수를 캐시할지 여부 (앱 성능 향상) |
encoding | 환경 변수 파일 인코딩 |
envFilePath | 환경 변수 파일 경로 |
ignoreEnvFile | true 면 .env 파일이 무시 됨 |
ignoreEnvVars | true 면 환경 변수가 무효화 됨 |
isGlobal | true 면 global module로 등록 됨. 다른 모듈에서 import 불필요. |
load | 커스텀 환경 설정 파일을 로딩 시에 사용 |
validate | 환경 변수 유효성 검증 함수 |
envFilePath
env 파일에 경로를 지정한다.
local, dev, prod 등 실행 환경에 따라 사용하는 env 파일이 바뀌기 때문에 설정을 해주면 편하다.
//package.json
"scripts": {
"start": "set NODE_ENV=local && nest start --watch",
"start:dev": "set NODE_ENV=dev && nest start --watch",
"start:prod": "set NODE_ENV=prod && nest start --watch"
},
package.json 파일의 스크립트를 수정해준다.
//app.module.ts
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { ConfigModule } from '@nestjs/config';
@Module({
imports: [
ConfigModule.forRoot({
envFilePath: `${process.cwd()}/envs/.env.${process.env.NODE_ENV}`
})],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
위와 같이 작성 후 .env.local 파일을 작성한다.
// .env.local
TEST = local
이제 환경 변수를 사용 가능하다.
import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';
import { ConfigService } from '@nestjs/config';
@Controller()
export class AppController {
constructor(
private readonly appService: AppService,
private readonly configService: ConfigService,
) {}
@Get()
getHello(): string {
console.log(111, this.configService.get('TEST')); // local 이 출력된다.
return this.appService.getHello();
}
}
isGlobal
//app.module.ts
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { ConfigModule } from '@nestjs/config';
@Module({
imports: [ ConfigModule.forRoot({
isGlobal: true, //글로벌 설정
envFilePath: `${process.cwd()}/envs/${process.env.NODE_ENV}`,
})],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
isGlobal 을 true 로 설정하면 다른 모듈에서 ConfigModule 을 import 할 필요가 없어진다. 굳이 안 할 필요가 없다.
cache
//app.module.ts
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { ConfigModule } from '@nestjs/config';
@Module({
imports: [ ConfigModule.forRoot({
isGlobal: true,
envFilePath: `${process.cwd()}/envs/${process.env.NODE_ENV}`,
cache : true //캐시 설정
})],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
env 파일은 앱이 최초 실행될 때 가져오고 변동되지 않는다. 캐시를 사용하면 성능적으로 향상된다. 굳이 안 할 필요가 없다
개인 기록용입니다. 만약 잘못된 부분이 있다면 댓글로 알려주신다면 감사하겠습니다!
'프레임워크\라이브러리 > Nest.js' 카테고리의 다른 글
[NestJS] 커스텀 파이프 (0) | 2024.02.20 |
---|---|
[NestJS] 파이프 (1) | 2024.02.18 |
[NestJS] DTO (1) | 2024.02.12 |
[NestJS] 컨트롤러 (0) | 2024.02.08 |
[NestJS] 설치 (1) | 2024.02.06 |