[Node.js] dotenv와 config 파일로 환경변수 관리하기

[Node.js] dotenv와 config 파일로 환경변수 관리하기

1. .env 파일과 config.js의 역할

  • .env 파일: 환경 변수들이 정의된 파일이다. 일반적으로 각 개발 환경(개발, 테스트, 프로덕션)에 따라 환경 변수를 저장하여, 설정 값들을 코드에 하드코딩하는 것을 피하고 유연하게 환경을 관리할 수 있게 해준다.
  • config.js 파일: 환경 변수들을 로드하고 사용하는 데 필요한 로직을 포함한 파일이다. config.js 파일을 통해 .env 파일에 정의된 환경 변수를 쉽게 가져와서 사용할 수 있다.

2. .env 파일 설정

.env 파일에는 중요한 환경 변수들이 저장된다. 예를 들어 데이터베이스 접속 정보나 서버 포트 같은 정보를 담고 있다. 예시는 다음과 같다.


NODE_PORT=3000
DB_HOST=localhost
DB_PORT=3306
DB_NAME=mydatabase
DB_USERNAME=root
DB_PASSWORD=password123

이렇게 .env 파일에 환경 변수를 정의하면, 이 값들을 코드에서 사용할 수 있게 된다.

3. dotenv로 환경 변수 로드하기

환경 변수를 Node.js 애플리케이션에서 사용할 수 있게 하려면, dotenv 모듈을 사용해야 한다. dotenv는 .env 파일의 내용을 읽어와서 process.env 객체에 추가해주는 역할을 한다.

dotenv 설치

먼저 dotenv를 설치해야 한다.


npm install dotenv

dotenv를 설치한 후에, 애플리케이션 내에서 이를 사용하여 환경 변수를 로드할 수 있다.

4. config.js 파일: 환경 변수 관리


import dotenv from 'dotenv';

dotenv.config(); // .env 파일 로드

// 필수 값 확인 및 디폴트 값 처리 함수
function required(key, defaultValue = undefined) {
    const value = process.env[key] || defaultValue;
    if (value === undefined) {
        throw new Error(`Key ${key} is undefined`);
    }
    return value;
}

export const config = {
    host: {
        port: parseInt(required("NODE_PORT", 8080)),
    },
    db: {
        host: required("DB_HOST"),
        port: parseInt(required("DB_PORT")),
        database: required("DB_NAME"),
        user: required("DB_USERNAME"),
        password: required("DB_PASSWORD"),
        charset: required("DB_CHARSET")
    },
};

4.1. 코드 설명

  1. dotenv.config():
    • .env 파일을 읽어서 환경 변수들을 process.env 객체에 로드한다.
    • 이를 통해 .env 파일에 정의된 값들을 코드에서 쉽게 참조할 수 있게 된다.
  2. required(key, defaultValue) 함수:
    • 특정 환경 변수가 필수인지 여부를 확인하고, 해당 변수가 설정되어 있지 않으면 오류를 발생시킨다.
    • 이 함수는 환경 변수가 존재하지 않는 경우 에러 메시지를 출력하며, 만약 defaultValue가 제공되었다면 이를 대신 사용한다.
    • 예를 들어, NODE_PORT가 설정되어 있지 않다면 디폴트 값인 8080을 사용할 수 있도록 설정되어 있다.
  3. 환경 변수 구성 객체 config:
    • config.host.portNODE_PORT 환경 변수를 가져오며, 없을 경우 디폴트 값으로 8080을 사용한다.
    • config.db: 데이터베이스 관련 설정들로, 데이터베이스 연결을 위해 필요한 정보를 환경 변수로부터 로드한다.

4.2. required 함수의 중요성

required 함수는 환경 변수가 반드시 필요할 경우, 해당 변수가 설정되어 있지 않을 때 에러를 발생시키는 중요한 역할을 한다. 이를 통해 잘못된 설정으로 인해 애플리케이션이 실행 중 오류가 발생하는 것을 방지할 수 있다.


5. app.js에서 환경 변수 사용하기

app.js 파일에서는 config.js로부터 로드한 환경 변수를 사용하고 있다. 이를 통해 서버 포트 설정과 같은 중요한 설정을 코드에 직접 하드코딩하지 않고, 환경 변수를 통해 동적으로 설정할 수 있게 된다.

app.js 코드


import express from "express";
import dotenv from "dotenv";
import figlet from "figlet";

import { logger } from "#util/logger.js";
import { config } from "#config/config.js";

const app = express();

// dotenv를 통해 환경 변수 로드
dotenv.config();

// 서버 실행
app.listen(config.host.port, () => {
    figlet("NYAONGLAB", (err, data) => {
        if (err) {
            logger.error(`Something wrong with figlet.. , ${err}`);
        }
        logger.info(`

        ${data}

        Server is running on port ${config.host.port}`);
    });
});

5.1. 코드 설명

  • dotenv.config():
    • 사실 config.js에서 이미 dotenv.config()를 호출하여 환경 변수를 로드하고 있으므로 app.js에서 이 줄은 생략해도 무방하다. 그러나 중복 호출은 큰 문제가 되지는 않는다.
  • config.host.port:
    • config 객체를 통해 포트를 가져와서 서버를 시작한다. 이를 통해 .env 파일에 정의된 포트로 서버를 구동할 수 있게 된다.
  • 서버 시작 시 메시지 출력:
    • figlet을 사용하여 텍스트 아스키 아트를 출력하며, 서버가 성공적으로 실행되었음을 로그에 기록한다.
    • config.host.port를 사용하여 실행 중인 포트를 표시한다.

6. 마무리

Node.js에서 .env 파일과 config.js 파일을 사용하면 환경 변수들을 쉽게 관리하고, 코드의 가독성과 유지보수성을 높일 수 있다. .env 파일에 중요한 설정을 저장하고, dotenv를 통해 이를 로드함으로써, 다양한 환경(개발, 테스트, 프로덕션)에서도 설정을 유연하게 관리할 수 있다.

또한, config.js 파일을 통해 이러한 환경 변수들을 잘 정의하고 관리하면, 코드를 보다 명확하게 유지할 수 있으며, 누락된 환경 변수에 대해 명시적으로 오류를 처리할 수 있게 된다.

댓글