잡(job)기술
Node.js child_process의 exec와 spawn 차이 정리
무니이구나
2025. 6. 20. 13:08
Node.js에서 외부 명령어를 실행해야 할 때 흔히 사용하는 API가 바로 child_process
모듈의 exec
와 spawn
이다. 둘 다 자식 프로세스를 생성해 명령을 실행할 수 있게 해주지만, 내부 동작 방식과 사용 목적은 다소 다르다.
이 글에서는 exec
와 spawn
의 핵심 차이점과 언제 어떤 상황에서 사용하면 좋을지 예제와 함께 정리한다.
exec
와 spawn
은 무엇인가?
exec
exec
는 셸을 통해 명령어를 실행한다.- 즉, 내부적으로는
sh
,bash
, 또는 Windows에서는cmd.exe
를 호출해서 전체 명령어 문자열을 실행한다. - 이 때문에
ls -al | grep log
처럼 셸 문법을 그대로 사용할 수 있다. - 실행 결과는
stdout
,stderr
를 버퍼에 저장한 뒤 한꺼번에 콜백 함수로 전달된다.
spawn
spawn
은 명령어를 셸을 거치지 않고 직접 실행한다.- 다시 말해,
spawn('ls', ['-al'])
처럼 명령어와 인자를 명확하게 나눠서 실행하며, 파이프(|
) 같은 셸 문법은 사용할 수 없다. - 출력은 스트림으로 전달되며, 데이터를 받을 때마다
data
이벤트가 발생한다. - 따라서 출력이 실시간으로 많거나 지속적으로 나오는 작업에 적합하다.
이 차이로 인해 보안적, 기능적으로 다음과 같은 차이가 생긴다.
구분 | exec | spawn |
---|---|---|
셸 사용 | 기본적으로 셸을 사용 | 기본적으로 셸을 사용하지 않음 (옵션 필요) |
파이프 등 셸 문법 | 사용 가능 | 기본적으로 불가능 (shell: true 설정 시 가능) |
인자 처리 | 전체 문자열로 실행 | 명령어와 인자를 배열로 구분 실행 |
보안성 | 명령어 인젝션 취약 가능성 있음 | 인자 별로 분리되므로 보안상 더 안전 |
주요 차이점 비교 정리
항목 | exec |
spawn |
---|---|---|
실행 방식 | 셸을 통해 문자열 전체 실행 | 명령어와 인자를 직접 실행 |
출력 처리 | 결과를 버퍼에 저장 후 콜백 전달 | 스트림(stdout , stderr )으로 실시간 전달 |
출력 제한 | 기본 버퍼 200KB, 초과 시 오류 가능 | 제한 없음, 대용량 출력 처리에 유리 |
셸 기능 사용 | O ( |, &&, >, 등 사용 가능) | X (옵션 필요)
|
보안 위험 | 명령어 인젝션 가능성 있음 | 상대적으로 안전 |
언제 exec
를 사용해야 할까?
다음과 같은 상황에서는 exec
가 적합하다.
- 실행 결과가 작고, 전체 결과만 필요한 경우
- 셸 명령어 문법을 사용해야 할 때 (예:
grep
,|
,&&
,>
, 등) - 사용이 간편한 방식이 필요할 때
예시:
const { exec } = require('child_process');
exec('ls -al | grep log', (error, stdout, stderr) => {
if (error) {
console.error(`오류 발생: ${error.message}`);
return;
}
console.log(`출력 결과:\n${stdout}`);
});
언제 spawn
을 사용해야 할까?
다음과 같은 경우에는 spawn
이 더 적절하다.
- 실시간 출력이 필요하거나 출력량이 많은 경우
- 명령어와 인자를 명확히 분리해서 실행하고 싶을 때
- 외부 입력과 출력을 스트림 기반으로 처리하고 싶을 때
예시
const { spawn } = require('child_process');
const ls = spawn('ls', ['-al']);
ls.stdout.on('data', (data) => {
console.log(`stdout: ${data}`);
});
ls.stderr.on('data', (data) => {
console.error(`stderr: ${data}`);
});
ls.on('close', (code) => {
console.log(`프로세스 종료 코드: ${code}`);
});
exec vs spawn 선택 기준
상황 | 추천 API |
---|---|
결과가 작고, 셸 문법을 쓰고 싶다 | exec |
실시간 처리, 스트리밍 작업이다 | spawn |
명령어 인젝션을 방지하고 싶다 | spawn |
실행 명령이 복잡한 셸 명령어다 | exec |
Node.js에서 외부 명령어를 실행할 때 exec
와 spawn
을 적절히 선택하는 것은 성능, 보안, 기능성 측면에서 매우 중요하다. 각각의 동작 방식과 차이를 명확히 이해하고, 프로젝트에 가장 적합한 방법을 선택하자.