환경 변수, config파일 그리고 .env

환경변수 (Environment Variable)

환경 변수는 프로세스가 컴퓨터에서 동작하는 방식에 영향을 미치는, 동적인 값들의 모임입니다. (출처: 위키백과) 실행할 파일이 들어있는 폴더의 경로를 환경변수에 미리 설정해 놓음으로써 cmdbash등과 같은 환경에서 실행하려는 프로그램이 현재 작업 경로에 있지 않아도 어디서든 실행할 수 있습니다. 하지만 경로뿐만 아니라 node.js등과 같은 서버 환경에서 필요한 설정들을 저장하는 용도로 사용될 수 있습니다.

config.json파일의 단점

아래와 같이 필요한 설정마다 config.json같이 설정파일을 구성할 수도 있습니다.

db-config.json
1
2
3
4
5
6
{
"host": "localhost",
"user": "username",
"password": "password",
"database": "dbname"
}

config파일은 절대적으로 github와 같은 버전 관리 시스템에 commit되지 않도록 신경 써주어야합니다. 문제는 여기서 발생합니다. 점점 mysql, redis 등 과 같은 다양한 설정들이 필요해지면서 redis-config.json 이나 mysql-config.json 처럼 gitcommit되지 않도록 .gitignore을 설정해주는 등 신경 써줘야하는 일이 많아지게 됩니다 .즉, 개발자가 실수할 가능성이 증가하기 때문입니다.

환경 변수를 이용하는 경우

환경 변수의 경우 전용 서버에 환경 변수 설정후 node.js의 경우 process.env.NAME과 같은 방법으로 접근할 수 있습니다. 이 경우 개발자가 gitcommit이 되지 않도록 신경 써줘야하는 부담감을 줄이고 실수할 가능성을 줄일 수 있습니다. Heroku와 같이 클라우드 서비스에 배포하는 경우 배포과정에서 아래의 사진처럼 쉽게 웹사이트에서 환경변수를 설정할 수 있어, 설정이 바뀔때 마다 번거로운 배포 과정없이 간단한 설정을 통해 변경할 수 있는 장점이 있습니다.

Heroku Config

.env 설정

node.js에서 dotenv를 통해 직접 환경 변수를 설정하지 않고도 .env파일에서 설정 값을 불러와 process.env.NAME의 형태로 환경변수로 사용할 수 있도록 할 수 있습니다. 물론 .env파일도 config파일과 마찬가지로 버전 관리 시스템에 공유되지 않도록 신경 써줘야하는 번거로움이 존재합니다. 하지만 dotenv공식문서만 보더라도 다중 .env파일을 가지는 않을것 을 강력히 권고하고 있듯이, .env파일은 하나만 가지므로 한번만 .gitignore에 추가해주면 됩니다.

.env
1
2
3
4
5
PORT=80
MYSQL_HOST=localhost
MYSQL_USER=username
MYSQL_PASSWORD=password
MYSQL_DATABASE=db_name

.env파일은 위와 같이 구성할 수 있고 아래와 같이 간단한 설정을 통해 process.env.NAME의 형태로 접근 할 수 있습니다.

자바스크립트를 사용하는 경우 :

test.js
1
2
require('dotenv').config();
console.log(process.env.PORT);

타입스크립트를 사용하는 경우 :

test.ts
1
2
3
4
import * as dotenv from 'dotenv';
dotenv.config();

console.log(process.env.PORT);

위의 .env를 불러오는 코드는 가능한 코드의 최상단의 위치시켜주는 것을 권장합니다. 그렇지 않고 .env파일이 process.env에 로드 되기 전에 접근하게 되면 undefined가 됩니다.