기본 패턴
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