에러 발생 상황
데이터베이스 관련 정보는 소중하기 때문에 production 전용 환경변수 파일은 서버에 접속 후에 envs 디렉토리 하위에 직접 .env.production 파일을 생성했습니다.
이후 cross-env NODE_ENV=production pm2 start src/bin/www.js 명령 스크립트를 실행해 서버를 실행시켰습니다.
그러나 NODE_ENV 값이 설정되지 않는 경우 예외 처리 로직이 실행되어 로그 메세지 상에는 'process.env.NODE_ENV를 설정하지 않았습니다.' 가 보여질 뿐이었습니다.
위에서 보시다시피 명령 스크립트 상에 NODE_ENV 를 production 으로 설정했음에도 불구하구요.
로그 메세지 상에 환경변수 파일을 파싱하는 config.js 쪽에서 에러가 발생했으니 config.js 에 작성된 코드에 문제가 있을 것이라고 예상했습니다.
=== 쓰면 안되고... == 을 써야 합니다...
결국 해결을 했는데, 문제는 바로 NODE_ENV 값에 따라 각각 다른 .env 파일을 파싱하는 로직이었습니다.
기존에 에러를 발생시킨 코드는 다음과 같습니다.
const dotenv = require('dotenv');
if (process.env.NODE_ENV === 'production') {
dotenv.config({ path: 'envs/.env.production' });
} else if (process.env.NODE_ENV === 'development') {
dotenv.config({ path: 'envs/.env.development' });
} else {
throw new Error('process.env.NODE_ENV를 설정하지 않았습니다.');
}
'===' 비교 연산자의 경우 좌변항과 우변항의 값뿐만 아니라 자료형까지 일치하는지 판단합니다.
그러나 process.env.NODE_ENV 의 자료형은 string 이 아니어서 if, else if 문 조건식을 만족하지 못하고 결국 에러가 발생한 거죠.
저는 '===' 비교 연산자 대신 '==' 비교 연산자로 변경해 좌변항과 우변항 간 값 일치 여부만 판단하도록 변경했습니다.
const dotenv = require('dotenv');
if (process.env.NODE_ENV == 'production') {
dotenv.config({ path: 'envs/.env.production' });
} else if (process.env.NODE_ENV == 'development') {
dotenv.config({ path: 'envs/.env.development' });
} else {
throw new Error('process.env.NODE_ENV를 설정하지 않았습니다.');
}
이후 cross-env NODE_ENV=production pm2 start src/bin/www.js 명령 스크립트를 실행해 서버가 정상적으로 실행된 것을 확인했습니다.
'포트폴리오 > JJINCAFE IN SEOUL' 카테고리의 다른 글
[리팩토링] 폴더 구조의 변경 (0) | 2022.11.15 |
---|---|
[리팩토링] 회원가입 API 트랜잭션 처리 및 관심사 분리 (0) | 2022.11.15 |
[Docker 적용] MySQL 서비스 컨테이너에 .sql 파일 Import 후 데이터베이스에 적용하기 (0) | 2022.11.15 |