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