Ayden's journal

03. 환경변수 설정

@nestjs/dotenv

환경 변수를 효과적으로 관리하고 로드하는 것은 애플리케이션의 유연성과 보안성을 높이는 데 아주 중요하다. ExpressJS로 개발할 때는 dotenv라는 라이브러리를 사용하는데, NestJS는 내부적으로 dotenv를 튜닝해놓은 @nestjs/dotenv를 제공하고 있다. 이를 사용하면 동적으로 configModule을 생성할 수 있다.

npm i --save @nestjs/config

 

configModule의 forRoot 메서드는 configModuleOption을 인자로 받아 동적 모듈을 구성한다. 이 옵션 중 isGlobal을 사용하면 글로벌 모듈을 구성할 수 있는데, @nestjs/config가 제공하는 configService를 원하는 컴포넌트에 주입하여 사용할 수 있다.

import { ConfigModule } from "@nestjs/config"

@Module({
  imports: [ConfigModule.forRoot({
    envFilePath: [`${__dirname}/config/env/.env.${process.env.NODE_ENV}`],
    isGlobal: true,
  })],
})
export class AppModule {}

 

 

커스텀 config와 환경 변수 검증

환경 변수를 사용하다보면 하나의 파일에 AWS 관련 변수도 들어가고, JWT 관련 변수도 들어간다. @nestjs/config 패키지에서 제공하는 registerAs 함수를 사용하면 환경 변수의 일부를 의미론적인 객체로서 configModuleOption에 '등록'할 수 있다. 또, 이렇게 만들어진 객체는 @Inject 데코레이터를 통해 프로바이더에 주입할 수 있다.

만약 의미론적 객체의 유효성을 검증하고 싶다면 Joi 라이브러리를 함께 사용할 수 있다. 알아본 바에 의하면 validate 프로퍼티와 Zod 라이브러리를 사용하여 동일한 수준의 유효성 검사를 진행할 수도 있다. 하지만 공식 문서에서 Joi를 권장하고 있기에 나도 Joi를 사용하고 있다.

export const jwtConfig = registerAs('jwt', () => ({
  accessSecret: process.env.JWT_ACCESS_SECRET,
  refreshSecret: process.env.JWT_REFRESH_SECRET,
}));

export const awsConfig = registerAs('aws', () => ({
  s3: process.env.AWS_S3,
  region: process.env.AWS_Region,
}));

// Joi를 사용한 런타임에서의 값 검증
export const validationSchema = Joi.object({
  AWS_S3: Joi.string().required(),
  AWS_Region: Joi.string().required(),
  JWT_ACCESS_SECRET: Joi.string().required(),
  JWT_REFRESH_SECRET: Joi.string().required(),
})

 

이렇게 registerAs로 만든 객체들은 configModuleOption의 load에 배열의 형태로 제공된다.

@Module({
  imports: [ConfigModule.forRoot({
    envFilePath: [`${__dirname}/config/env/.env.${process.env.NODE_ENV}`],
    isGlobal: true,
    load: [awsConfig, jwtConfig],
    validationSchema,
  })],
})
export class AppModule {}

 

앞서 잠깐 언급하기도 했지만, 이렇게 나뉘어진 config들은 @Inject 데코레이터로 주입받아 사용할 수 있다.

@Injectable()
export class AuthService {
  @Inject(jwtConfig.KEY) private jwt: ConfigType<typeof jwtConfig>,
  
  validateToken() {
    const { accessSecret, refreshSecret } = this.jwt
    
    ...
  }
}

 

 

 

 

 

+ 유닉스 커맨드라인을 쓴다면 export 키워드로 NODE_ENV를 설정할 수 있다. 이 값을 확인해보고 싶다면 터미널에 echo $NODE_ENV를 입력하면 된다.

export NODE_ENV=production
echo $NODE_ENV // production

블로그의 정보

Ayden's journal

Beard Weard Ayden

활동하기