Node Env?
소개
node application에서 흔하게 사용하는 enviroment 변수의 사용에 대해서 간략히 알아봅니다.
enviroment 개념
어떤 process환경에서 접근 가능한 변수(key-value)를 의미 합니다. unix 환경을 사용하고 있다면 간단히 다음 명령어로 현재 shell의 환경 변수를 알 수 있습니다.
$ printenv
window의 환경에서 JAVA_HOME등을 위해서 설정하는 환경변수등이 이러 변수의 대표적인 예 입니다.
주의해야 할 부분은 환경변수가 ‘어떤 process환경’ 에서 접근 가능한 변수라는 부분 입니다. 위의 printenv로 확인 가능한 환경변수는 해당 shell(terminal) process 환경에서 접근 가능한 환경 변수를 보여줍니다.
만약 사용자가 어떤 ‘node application’을 구동한 경우, node 프로그램상에서 process.env[key] 로 접근하는 환경변수는, 해당 node process 환경에서 접근 가능한 변수 입니다.
이는 해당 node 프로그램을 구동하게되는 부모 process(만약 어떤 shell에서 수행했다면)와 항상 동일한게 아니라 각기 독립적일수 있다는 사실을 명심해야 합니다.
해당 부분은 node 에서 child process을 fork하는 command의 api document을 보면 더 쉽게 이해 가능합니다. 참고: https://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback
webpack env와 혼동하지 말기
webpack을 이용한 bundle환경을 구축하였을때, 특히 server을 node로 구성하는경우, 위의 기본 개념을 정확하게 이해하지 못해서 환경변수 설정에 대한 실수를 할 가능성이 많습니다.
webpack역시 node에서 구동되는 node application 이기 때문에 더욱 그러한 경우가 많이 있습니다.
webpack에서 webpack command을 수행할때, cli환경에서 webpack에 env을 지정 or 넘겨줄 수 있습니다.
$ webpack --config webpack.config.js --env.MY_ENV=test --env.MULTI=test_multi
이 경우 env 값에 MY_ENV와 MULTI가 존재하지만 이는 webpack process환경 내에서만 유의미합니다.
해당 빌드의 결과물로 server.js가 생성되었다고 가정하였을때, node server.js을 하여도, 위 환경변수는 존재하지 않습니다. 왜냐하면, node server.js는 새로운 node process이고, 이 node process을 수행하때, 동일한 환경변수를 지정하지 않았기 때문입니다.
따라서 해당형태로 구동하고 싶다면, 아래와 같이 새로운 node process 구동시에도 환경변수를 지정해 주어야 합니다.
$ MY_ENV=test MULTI=test_multi node server.js
결국 기본 개념과 동일한 이야기 인데, 핵심은 어떤 process의 환경변수를 맞추어 주려면 해당 process수행와 동시에 환경변수를 지정해 주어야 합니다.
Cross Platform환경에서의 enviroments
개발자 개발환경 및 제품(project)의 실행환경이 동일하면 큰 문제가 없지만 만약 window, mac, linux등 서로 다른 환경을 가지고 있을 경우, 각각의 platform 별로 환경 변수를 설정하는 방법에 차이가 있어 문제가 발생 할 수 있습니다.
따라서 이러한 cross platform 환경에서도 동일한 형태의 환경변수 사용을 위해서 node.js진영에서 많이 사용하는 환경 변수 설정 모듈(유틸)을 소개합니다.
dotenv
참고: https://github.com/motdotla/dotenv#readme
프로젝트에 .env라는 숨김 파일이나 지정된 파일을, node application실행 전에 적용하여 environment을 설정하는 유틸성 모듈 입니다. node 명령어와 동시에 사용하는 방법도 가능하고, programmatically 하게 사용하는 방법도 가능합니다. 서로다른 platform 에서의 처리는 dotenv가 내부적을 알아서 처리해 줍니다.
node와 같이 실행
$ node -r dotenv/config your_script.js dotenv_config_path=/custom/path/to/.env
programmatically 하게 실행
require('dotenv').config({ path: '/custom/path/to/.env' })
crossenv
참고: https://github.com/kentcdodds/cross-env#readme
서로 다른 platform와 무관하게, unix형태의 process수행시 env을 설정하는것과 동일한 형태로 env을 설정하면 해당 env을 process env로 설정해주는 유틸성 모듈 입니다.
$ cross-env NODE_ENV=production webpack --config build/webpack.config.js
실제 사용은 unix계열에서 사용하는것고 거의 동일하며, 앞에 cross-env 명령어를 추가해 주는 형태로 사용 가능합니다.