Node.js프로세스와 CLI

spawn과 exec 차이

외부 프로그램을 실행할 때 자주 비교하는 `spawn()`과 `exec()`의 차이를 정리합니다.

마지막 수정 2026년 3월 20일

기본 패턴

javascript
import { spawn } from "node:child_process";

const child = spawn("node", ["--version"]);

child.stdout.on("data", (chunk) => {
  console.log(chunk.toString());
});

설명

  • child_process는 Node 바깥의 프로그램을 실행할 때 쓰는 모듈입니다.
  • spawn()은 표준 입출력을 스트림으로 다루며, 긴 출력이나 지속적인 로그를 처리할 때 잘 맞습니다.
  • exec()는 명령 실행 결과를 한 번에 문자열로 받아 보는 데 편하지만, 내부적으로 셸을 거치고 출력 버퍼 제한도 신경 써야 합니다.
  • 따라서 "출력이 크고 길게 흐르는가"와 "짧은 명령 결과만 한 번에 받으면 되는가"가 두 API를 가르는 가장 실전적인 기준입니다.
  • 빌드 도구, Git 래퍼, 시스템 명령 호출 같은 자동화 코드에서 이 차이를 이해하면 API 선택이 훨씬 쉬워집니다.

짧은 예제

javascript
import { exec } from "node:child_process";

exec("node --version", (error, stdout) => {
  if (error) throw error;
  console.log(stdout.trim());
});

빠른 정리

API잘 맞는 상황
spawn()긴 출력, 스트림 처리, 실시간 로그
exec()짧은 명령, 결과를 문자열로 한 번에 받기
fork()별도 Node 프로세스와 IPC 통신
공통 주의실패 코드, 종료 시점, 표준 에러 처리

주의할 점

사용자 입력을 그대로 셸 명령에 섞어 exec() 하면 보안 문제가 생길 수 있습니다. 외부 입력이 들어가는 경우에는 인자를 분리해 spawn() 쪽으로 설계하는 편이 더 안전합니다.

참고 링크

1 sources