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}`);
});
이처럼 환경 변수를 코드에서 직접 참조하는 대신, 애플리케이션의 나머지 부분과 환경 변수 사이에 추상화 레이어를 추가하면 보안, 유연성, 유지보수성을 향상시키고, 타입 오류를 줄일 수 있다.
- 보안: 직접 환경 변수에 접근하면 실수로 민감한 정보를 로그에 기록하거나 외부에 노출할 위험이 있으므로 추상화 레이어로 캡슐화를 진행한다.
- 유연성: 환경 변수를 직접 사용하면 다른 설정 소스로부터 설정을 로드하는 것이 어렵지만 환경변수 추상화 레이어를 적용하면 파일, 데이터베이스, 외부 서비스 등 다양한 설정 소스를 분리하여 사용할 수 있다.
- 유지보수: 환경 변수를 직접 사용하면 애플리케이션 전반에서 환경 변수의 키 이름을 하드코딩 해야 한다. 이러한 접근 방식은 환경 변수의 이름이 변경될 경우 모든 참조를 업데이트해야 하는 번거로움을 초래할 수 있다. 추상화 레이어를 통해 변수로 따로 관리하면 환경 변수 이름이 변경될 시 추상화 레이어만 수정하여 편리성을 높일 수 있다.
- 타입 안정성과 검증: 환경 변수는 기본적으로 모두 문자열로 취급되어 타입 오류가 발생하기 쉽고, 유효하지 않은 설정 값으로 인해 애플리케이션이 실행 시점에 에러를 발생시킨다. 유효성 검증을 통해 이를 사전에 예방할 수 있다.
'나의 개발일지 > node.js' 카테고리의 다른 글
NestJS에서 이미지 및 영상 처리 작업의 부하를 줄이기 위해 BullMQ 사용 (0) | 2024.10.07 |
---|---|
Node.js(NestJS)에서 FFmpeg 사용하여 동영상 파일 처리하기 (+ AWS S3 업로드) (3) | 2024.10.07 |
NestJS 환경변수 관리 - process.env보단 ConfigModule을 (0) | 2024.02.07 |
[nodejs | 노드js] package.json (0) | 2022.07.31 |
[nodejs | 노드js] 모듈(module), 내장 객체 (0) | 2022.07.27 |