본문 바로가기
나의 개발일지/node.js

nodejs(expressjs) 환경변수 validation

by stella_gu 2024. 2. 14.

NestJS의 ConfigModule을 접하고 expressjs로 만들었던 프로젝트에도 환경변수 유효성 검사와 기본값 설정을 추가해 봐야겠다고 생각하고 실행해 보았다.
 
왠지 라이브러리가 있을 것 같아 찾아보니 환경변수 유효성 검사와 기본값 설정 등을 할 수 있는 envalid라는 라이브러리가 있었지만 추가로 라이브러리를 깔고 싶지는 않아서 기존에 데이터 검증을 위해 설치했던 joi 라이브러리를 사용하였다.
 
[npm envalid] https://www.npmjs.com/package/envalid

envalid

Validation for your environment variables. Latest version: 8.0.0, last published: 5 months ago. Start using envalid in your project by running `npm i envalid`. There are 497 other projects in the npm registry using envalid.

www.npmjs.com

 
1. 패키지 설치

npm install dotenv joi

 
2. 루트 경로에 .env 파일 생성

PORT=3000
DATABASE_URL=mongodb://localhost/myapp

 
3. envConfig.js 파일 생성하여 유효성 검증 처리 모듈 내보내기

require('dotenv').config();
const Joi = require('joi');

const envVarsSchema = Joi.object({
  PORT: Joi.number().default(3000),	// joi의 default로 기본값 설정
  DATABASE_URL: Joi.string().required()
}).unknown();

const { value: envVars, error } = envVarsSchema.validate(process.env);

if (error) {
  throw new Error(`Config validation error: ${error.message}`);
}

module.exports = {
  port: envVars.PORT,
  databaseURL: envVars.DATABASE_URL
};

 
4. envConfig 모듈 사용

// app.js에서의 사용 예시
const express = require('express');
const config = require('./config');
const app = express();

app.listen(config.port, () => {
  console.log(`Server running on port ${config.port}`);
});

 
 
 
이처럼 환경 변수를 코드에서 직접 참조하는 대신, 애플리케이션의 나머지 부분과 환경 변수 사이에 추상화 레이어를 추가하면 보안, 유연성, 유지보수성을 향상시키고, 타입 오류를 줄일 수 있다.

- 보안: 직접 환경 변수에 접근하면 실수로 민감한 정보를 로그에 기록하거나 외부에 노출할 위험이 있으므로 추상화 레이어로 캡슐화를 진행한다.
- 유연성: 환경 변수를 직접 사용하면 다른 설정 소스로부터 설정을 로드하는 것이 어렵지만 환경변수 추상화 레이어를 적용하면 파일, 데이터베이스, 외부 서비스 등 다양한 설정 소스를 분리하여 사용할 수 있다.
- 유지보수: 환경 변수를 직접 사용하면 애플리케이션 전반에서 환경 변수의 키 이름을 하드코딩 해야 한다. 이러한 접근 방식은 환경 변수의 이름이 변경될 경우 모든 참조를 업데이트해야 하는 번거로움을 초래할 수 있다. 추상화 레이어를 통해 변수로 따로 관리하면 환경 변수 이름이 변경될 시 추상화 레이어만 수정하여 편리성을 높일 수 있다.
- 타입 안정성과 검증: 환경 변수는 기본적으로 모두 문자열로 취급되어 타입 오류가 발생하기 쉽고, 유효하지 않은 설정 값으로 인해 애플리케이션이 실행 시점에 에러를 발생시킨다. 유효성 검증을 통해 이를 사전에 예방할 수 있다.