2022. 3. 17. 18:49ㆍBACK END/NODE.JS
필요상황
서로 다른 운영체제 사용자간 협업 등에서 특정 환경변수 주입이 필요한 상황,
보안상의 문제로 개발, 배포 버전의 설정을 달리해야하는 상황 등
데이터베이스 수정을 위해 사용 중이던 DB를 로컬에 백업하고, 개발 기간 동안 로컬에 백업된 DB를 대신 활용해야 하는 상황. cross-env 패키지를 사용하면 동적으로 process.env(환경 변수)를 변경할 수 있으며, 모든 운영체제에서 동일한 방법으로 환경 변수를 변경할 수 있게 됨.
수 시간 내로 완성될 작업이라 '.env'를 임시로 수정하여 해결할 수 있었지만 이후 이루어질 DB정규화 등의 과정을 위해 cross-env를 활용하게 되었음.
설치
npm install --save-dev cross-env
유사한 철자를 활용한 악성라이브러리 이슈가 있었던 만큼 주의해야함.
NOTE : Version 7 of cross-env only supports Node.js 10 and higher, to use it on Node.js 8 or lower install version 6 npm install --save-dev cross-env@6
활용
페이즈 설정
package.json
...
"scripts": {
"dev": "cross-env NODE_ENV=development nodemon ./bin/www",
"local": "cross-env NODE_ENV=local nodemon ./bin/www",
"start": "cross-env NODE_ENV=production nodemon ./bin/www",
},
...
"scripts"는 콘솔창에 'npm run ~~~~', 혹은 'npm start' 라는 명령을 입력하면 수행할 부분을 설정 해주는 것인데, 이 부분에서 cross-env 를 활용하여 기존의 'start'에 추가하여 'dev'와 'local'이라는 페이즈를 만들어줌.
환경변수파일(.env)추가
env/.env.dev
...
PORT = 10015
...
env/.env.local
...
PORT = 10010
...
env폴더 만들고 phase별 필요한 변수를 담아 .env파일을 만들어줌. DB를 포함한 여러 변수들을 담을 수 있지만 일단 port넘버로 확인
페이즈에 따른 환경변수파일 연결
app.js
...
dotenv.config({
path: path.resolve(
process.cwd(),
process.env.NODE_ENV == "development" ? "./env/.env.dev" :
process.env.NODE_ENV == "local" ? "./env/.env.local" :
".env"
)
});
console.log(`현재 환경설정 모드 : ${process.env.NODE_ENV}`)
...
dotenv.config 함수를 활용하여 package에서 설정한 Phase에 따라 사용할 환경변수 파일의 분기가 이루어짐
추가 확인작업
bin/www
...
for (const name of Object.keys(nets)) {
for (const net of nets[name]) {
// Skip over non-IPv4 and internal (i.e. 127.0.0.1) addresses
if (net.family === 'IPv4' && !net.internal && net.address.substr(0,3) !=='172') {
net_results.push(net.address);
}
}
}
...
console.log("www")
// Check Server !!!!!!!!!!!!!!!!!!!!!!!!
console.log(`================ Current URL >> ${net_results[0]}:${port}`)
console.log(`=================== NODE_ENV >> ${process.env.NODE_ENV}`)
...
필수과정은 아님. 의도대로 원하는 환경변수가 적용되었는지 확인하기 위해 IP와 PORT, Phase를 출력함.
실행
npm run dev
npm run local
터미널에서 "npm run ~~" 명령어로 설정한 페이즈를 실행할 수 있으며"dev"와 "local" 각각의 페이즈가 정상적으로 연결된 환경변수파일을 불러와서 활용함을 확인할 수 있음.
추가 팁. NODE_ENV를 "production"으로 설정하여 성능 향상
NODE_ENV 환경 변수는 애플리케이션이 실행되는 환경(일반적으로 개발 환경 또는 프로덕션 환경)을 지정합니다. 성능을 향상시키기 위해 할 수 있는 가장 간단한 일 중 하나는 NODE_ENV를 “production”으로 설정하는 것입니다.
NODE_ENV를 “production”으로 설정하면 Express는 다음과 같이 동작합니다.
보기 템플리트를 캐싱.CSS 확장기능을 통해 생성된 CSS 파일을 캐싱.더 간결한 오류 메시지를 생성.
테스트 결과, NODE_ENV를 “production”으로 설정하기만 해도 앱 성능이 3배 향상되는 것으로 나타났습니다!
특정한 환경을 위한 코드를 작성하는 경우, process.env.NODE_ENV를 통해 NODE_ENV의 값을 확인할 수 있습니다. 환경 변수의 값을 확인하는 작업은 성능 저하를 유발하므로 이러한 작업은 낮은 빈도로 실행해야 한다는 점에 주의하십시오.
프로덕션 환경에서의 Express 사용을 위한 성능 우수 사례
프로덕션 우수 사례: 성능 및 신뢰성 개요 이 문서에서는 프로덕션 환경에 배치된 Express 애플리케이션을 위한 성능 및 신뢰성 관련 우수 사례에 대해 논의합니다. 이 주제는 명백하게 “DevOps”
expressjs.com
ENV가 반영되지 않음!!!!!!!!!!!!!
.env.dev
...
PORT = 11010
...
development 페이즈로 정상 실행 되었는데 포트번호가 기본 환경변수(.env)의 것. .env.dev가 적용되지 않음!
해결방법
app.js
...
var rootRouter = require('./routes/index');
...
dotenv.config({
path: path.resolve(
process.cwd(),
process.env.NODE_ENV == "development" ? "./env/.env.dev" :
process.env.NODE_ENV == "local" ? "./env/.env.local" :
".env"
)
});
...
app.use('/', rootRouter);
...
express에서 라우터를 분리할 때 상단에 라우터를 선언해주고 하단에서 app.use를 통해 URL을 연결하게 됨.
습관적으로 그 사이에 dotenv.config()를 넣었으나 상단의 라우터 중에서 process.env를 먼저 호출하는 코드가 있어서 그런지(라고 추정 중) 분기가 제대로 이루어지지 않았음
app.js
...
dotenv.config({
path: path.resolve(
process.cwd(),
process.env.NODE_ENV == "development" ? "./env/.env.dev" :
process.env.NODE_ENV == "local" ? "./env/.env.local" :
".env"
)
});
...
var rootRouter = require('./routes/index');
...
app.use('/', rootRouter);
...
하여, 순서를 이렇게 바꿔서 먼저 분기가 이루어지면 정상적으로 작동하게됨
참조
cross-env
Run scripts that set and use environment variables across platforms
www.npmjs.com
windows에서 NODE_ENV를 바꿀 때에는 cross-env를 사용하자
`Webpack` 사용 도중 `process.env.NODE_ENV`가 `development`인지 `production`인지에 따라 `Webpack` 설정을 바꾸려고 하고 있었다. 구글링으로 해결하고 방법을 기술한다.
velog.io
Node.js 기반에서 환경변수 사용하기 (dotenv, cross-env)
환경변수가 무엇인지, 어떻게 사용하는 것이 좋을지, 관련한 라이브러리(dotenv, cross-env) 등 소개합니다.
velog.io
'BACK END > NODE.JS' 카테고리의 다른 글
node-cron을 활용한 스케쥴링 (0) | 2022.03.17 |
---|---|
replace함수로 string타입 데이터 가공 (0) | 2022.03.17 |
Bcrypt 암호화 (0) | 2022.03.17 |
REST 미지원 메서드 처리 (0) | 2022.03.17 |
Express 에서 Mongo DB 활용 로그 기록 기능 구현 (0) | 2022.03.17 |