...
노드 env 환경변수 설정
보통 노드 서비스를 개발(development)하고 배포(production)할 때 env 값을 이용해서 구성한다. 예를들어 배포 모드 일 때에는 파일 캐싱, 에러 메세지 감추기 등 배포에 적합한 환경 설정을 하고, 개발 모드 일 때에는 파일 캐싱 방지, 디버그를 위한 상세한 에러 메세지 보이기 등 개발에 필요한 환경 설정을 한다.
실무 코드를 들자면 대표적으로 노드 서버의 로그를 찍어주는 morgan 미들웨어일 경우 다음과 같이 로그 레벨을 개발일떄는 'dev', 배포일떄는 'combined' 로 설정하여 적용시킨다.
// 노드 환경 변수 설정에 따라 morgan 설정을 달리함
if (process.env.NODE_ENV === 'production') {
app.use(morgan('combined')); // 배포
} else {
app.use(morgan('dev')); // 개발
}
위처럼 process.env.NODE_ENV 를 직접 .env 파일에 명시해서 사용해도 되지만, 개발과 배포 환경을 돌아가면서 테스트하고 개발할때 일일히 텍스트를 바꿔주는건 조금 번거롭다. 그래서 다음과 같이 package.json 의 script 부분에 개발 환경과 배포 환경 npm 스크립트 명령어를 다르게해서 개발환경을 편리하게 구성이 가능하다.
{
"name": "nordbird",
"version": "1.0.0",
"description": "포트폴리오",
"main": "app.js",
"scripts": {
"start": "NODE_ENV=production PORT=80 node app", // NODE_ENV 환경변수를 production으로 PORT 환경변수를 80으로 하고 서버 실행
"dev": "nodemon app",
},
"keywords": [],
"author": "inpa",
"license": "MIT",
"devDependencies": {
"nodemon": "^2.0.15"
},
"dependencies": {
// ...
}
}
이런식으로 package를 구성하게 되면, $ npm start 할때는 서비스 배포환경이 되고, $ npm run dev 하면 개발환경으로 웹서비스를 실행하게 된다. 그리고 "start" 부분을 자세히 보면 환경변수에 값을 대입하는 것을 볼 수 있다.(process.env.NODE_ENV가 production이 되고, process.env.PORT가 80이 된다)
이렇게 설정하면, 스크립트를 실행할 때 process.env값을 동적으로 설정하여, 위에서 if문을 사용하여 1개의 진입점으로도 상황에 맞게 환경변수를 사용할 수 있는 것이다.
하지만 크나큰 문제점이 존재한다. 저러한 방식은 맥OS나 리눅스에서는 돌아가지만, 전세계에서 가장 많이 사용하는 윈도우OS 에서는 빌드 인식이 안된다는 점이다.
> npm start
'NODE_ENV'은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는 배치 파일이 아닙니다.
다행히 노드 패키지 진영엔 cross-env 모듈이 존재한다. cross-env 모듈을 사용하면 OS간의 호환성을 해결할 수 있다.
cross-env 모듈
cross-env 모듈은 프로젝트 참여자 각각이 MacOS, Windows, Linux 등 다양한 OS 마다 환경변수를 설정하는 방법이 다르기 때문에 이것에 대한 대책을 마련한 모듈이다. 그래서 corss-env 패키지를 사용하면 동적으로 process.env(환경 변수)를 변경할 수 있으며 모든 운영체제에서 동일한 방법으로 환경 변수를 변경할 수 있게 된다.
cross-env 모듈 사용법
> npm install cross-env
{
...
"scripts": {
"start": "cross-env NODE_ENV=production PORT=80 node server", // cross-env 를 명시해준다
"dev": "nodemon server",
"test": "jest"
},
...
}
적용 방법은 매우 간단하다. package.json 의 환경변수 부분 앞에 cross-env를 붙이기만 하면 이제 윈도우에서도 실행이 되게 된다.
💡 crossenv 사건
노드와 npm 생태계를 떠들썩하게 만든 사건이 있었다. 이름하여 ‘crossenv 사건’ 이다.
사람들이 cross-env를 설치할 때 실수로 cross-env 대신 crossenv를 설치해서 발생했는데, crossenv는 사용자의 .env 파일에 들어 있는 키들을 해커에게 전송하는 악성 패키지였던 것이었다. 다행히 문제를 발견한 즉시 패키지가 차단되어 피해가 크게 확산되지는 않았지만, 유명한 패키지를 설치하는 과정에 혼동을 야기해 해킹하려는 시도가 있었다는 점에서 충격적인 사건이었다. 따라서 패키지를 설치할 때는 항상 주의를 기울여야 한다.
이 글이 좋으셨다면 구독 & 좋아요
여러분의 구독과 좋아요는
저자에게 큰 힘이 됩니다.