핵심 정리
const port = Number(process.env.PORT ?? "3000");
const debug = process.env.DEBUG === "true";실행 입력
입력 경계를 읽을 때 먼저 보는 기본형은 아래입니다.
- 환경 변수 읽기:
process.env.PORT - CLI 인자 읽기:
process.argv.slice(2) - 문자열을 숫자로 변환:
Number(...) - 문자열을 불리언으로 확정:
value === "true" - env와 argv를 한 config 객체로 합치기
argv는 실행 정보 + 사용자 인자
보통 실전에서는 slice(2)부터가 사용자 입력이라고 기억하면 충분합니다.
const args = process.argv.slice(2);즉 여기서는 CLI 파싱 자체보다 "입력 경계는 어디인가"를 정리합니다.
시작 시점 검증이 중요하다
필수 환경 변수나 필수 인자가 빠진 상태로 앱을 중간까지 띄우는 것보다, 시작하자마자 실패하는 편이 낫습니다.
그래서 Node 앱에서는 아래 패턴이 강합니다.
- env 읽기
- 타입 변환
- 필수값 검증
- config 객체 확정
const port = Number(process.env.PORT ?? "3000");
if (!Number.isInteger(port)) {
throw new Error("PORT must be an integer");
}즉 "읽는다"보다 "확정한다"가 더 중요합니다.
env와 argv 우선순위도 미리 정한다
CLI 도구는 같은 값을 env와 argv 양쪽에서 받을 수 있습니다. 이때 어느 쪽이 우선하는지 규칙을 미리 정해 두지 않으면, 운영과 로컬 실행에서 동작이 엇갈리기 쉽습니다.
어디서 들어오나
체크포인트
process.env값은 문자열- 숫자/불리언은 명시 변환
- 사용자 인자는
argv.slice(2) - 시작 시점에 필수값 검증
- env와 argv가 겹치면 우선순위를 먼저 정한다
const args = process.argv.slice(2);
const file = args[0];
if (!file) {
throw new Error("file path is required");
}환경 변수와 CLI 인자는 둘 다 "읽고 끝"이 아니라 "검증하고 확정"까지 가야 합니다.
주의할 점
환경 변수와 CLI 인자는 둘 다 외부 입력입니다. 앱 안쪽으로 들어오기 전에 검증과 타입 확정을 끝내지 않으면, 에러가 뒤로 밀리면서 원인 추적이 훨씬 어려워집니다.
참고 링크
1 sources