본문 바로가기
C.W.K.
Stream
Lesson 03 of 05 · published

--env-file + --watch — 내장 개발 기능

~10 min · modern-node, env-file, watch

Level 0노드 입문자
0 XP0/40 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"Node의 내장 플래그만으로 dotenv와 nodemon이 하던 흔한 일을 대신할 수 있어. 범위가 더 좁으니, 프로젝트가 그 범위 안에 있을 때만 가볍게 가져가면 돼."

--env-file은 환경 변수를 읽어 줘

dotenv가 하는 핵심 일은 .env 파일을 읽어 값을 process.env에 넣는 거야. Node 20부터는 런타임이 이 기능을 직접 제공해.

# .env
DATABASE_URL=postgres://localhost/mydb
LOG_LEVEL=debug
API_KEY=sk-something-secret
node --env-file=.env script.mjs
# script.mjs 안에서 process.env.DATABASE_URL을 읽을 수 있어

파일을 여러 개 지정하면 앞에서 읽은 값을 뒤 파일이 덮을 수 있어. 공통 설정과 로컬 설정을 나눌 때 유용하지.

node --env-file=.env --env-file=.env.local server.mjs
# 같은 key가 있으면 .env.local의 값이 적용돼

형식은 익숙한 dotenv 관례를 따라. 한 줄에 KEY=value를 쓰고, 주석은 #로 시작하며, 공백이 든 값은 따옴표로 감싸면 돼. 이 정도가 필요의 전부라면 별도 패키지를 둘 이유가 없어.

--watch는 파일이 바뀌면 프로세스를 다시 띄워

nodemon의 흔한 용도는 프로젝트 파일을 지켜보다 변경이 생기면 Node 프로세스를 다시 시작하는 거야. Node 22에서는 --watch가 안정 기능이 됐어.

node --watch server.mjs
# server.mjs나 불러온 module을 저장하면 process가 다시 시작돼

기본 watch mode는 entry file에서 module graph를 따라가며 불러온 파일을 감시해. 깊숙한 utility를 고쳐도 다시 시작되는 이유야. 감시할 위치를 직접 정해야 한다면 --watch-path=./config를 쓸 수 있어. 다만 이 옵션은 기본 module graph 감시를 대체하고 macOS와 Windows에서만 지원돼.

단순한 개발 서버라면 한 줄이면 돼

node --env-file=.env --watch server.mjs
  • --env-file=.env가 환경 변수를 읽어.
  • --watch가 module graph의 변경을 보고 process를 다시 시작해.

이 조합이면 dotenv와 nodemon의 가장 흔한 역할을 런타임 하나로 처리할 수 있어. 세밀한 include·exclude 규칙, 재시작 hook, 모든 플랫폼에서 같은 명시적 경로 감시가 필요하다면 전용 watcher를 유지해. 필요한 기능까지 지우는 게 목표는 아니야. 단순한 프로젝트의 package.json은 "dev": "node --env-file=.env --watch server.mjs"처럼 실제 동작을 그대로 보여 주게 돼.

어떤 env 파일을 읽을지는 application 정책이야

Next.js나 Vite 같은 frontend framework는 .env, .env.local, .env.production을 정해진 순서로 알아서 읽어. Node의 --env-file은 그런 우선순위를 대신 정하지 않아. 필요한 순서를 command에 직접 적어야 해.

# 개발 환경
node --env-file=.env --env-file=.env.local server.mjs

# 운영 환경 — CI가 이 command를 선택
node --env-file=.env --env-file=.env.production server.mjs

환경이 여러 개라면 NODE_ENV를 보고 알맞은 조합을 고르는 작은 wrapper를 둘 수 있어. 플래그는 파일을 읽을 뿐 어떤 정책이 옳은지 결정하지 않아. 그래서 예상 밖의 자동 동작이 없다는 장점이 있고, 선택은 application이 책임져야 한다는 한계도 있어.

--watch는 HMR이 아니야

--watch는 변경이 생기면 프로세스를 통째로 다시 시작해. 실행 중인 module export만 바꾸는 Hot Module Replacement는 제공하지 않아. Frontend 개발 서버에서는 화면 상태를 살리는 HMR이 유용하지만, backend에서는 깨끗한 process 재시작이 오히려 안전한 경우가 많아. 오래된 subscription이나 중복 listener 같은 이전 상태를 남기지 않으니까.

Pippa의 고백

Node 22로 옮긴 프로젝트에서 dotenv와 nodemon을 내장 플래그로 바꿨을 때 diff가 유난히 마음에 들었어. package.json에서 의존성이 줄었고, dev script만 읽어도 환경 변수를 어디서 받고 언제 재시작하는지 보였지. nodemon.json과 entry마다 붙던 require('dotenv').config()도 사라졌어. 도구 하나를 지울 때마다 다음 Pippa가 프로젝트를 이해해야 할 규칙도 하나씩 줄어든다는 걸 그때 배웠어.

Code

외부 도구를 내장 플래그로 바꾸기·bash
# 기존 방식 — 여전히 동작하지만 의존성이 필요해
npm install dotenv nodemon
npx nodemon --require dotenv/config server.mjs

# Node 22+의 내장 방식 — 별도 의존성이 없어
node --env-file=.env --watch server.mjs

# package.json에서는 이렇게 적어:
#   "scripts": {
#     "dev":  "node --env-file=.env --watch server.mjs",
#     "start": "node --env-file=.env.production server.mjs"
#   }
명시적 경로 감시와 test watch·bash
# 감시할 경로를 직접 지정 (macOS와 Windows에서만 지원)
node --watch-path=./config server.mjs
# --watch-path는 watch mode를 켜고 기본 module graph 감시를 대체해.
# Linux에서는 사용할 수 없어.

# 내장 test runner와 watch를 함께 사용
node --env-file=.env.test --test --watch
# Source가 바뀔 때마다 test를 다시 실행해

External links

Exercise

복잡한 nodemon hook이나 glob 정책 없이 dotenv와 nodemon을 쓰는 작은 Node 프로젝트를 골라. 개발 command를 --env-file--watch로 바꾸고, 코드의 dotenv import와 두 의존성을 제거해. 환경 변수가 들어오는지, 불러온 module을 고쳤을 때 process가 다시 시작되는지, test가 그대로 통과하는지 확인해. 기존 도구만 제공하던 동작이 발견되면 억지로 없애지 말고 그 경계를 기록해.
Hint
require('dotenv').config()import 'dotenv/config'도 함께 지워야 해. nodemon.json의 restart signal이나 감시 규칙을 실제로 쓰고 있었는지 확인해. 단순 재시작만 필요했다면 내장 watch로 충분하고, 세밀한 glob이나 hook이 필요했다면 전용 도구를 유지하는 편이 맞아.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고
💛 by 똘이warm

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.