잡(job)기술

Node.js child_process의 exec와 spawn 차이 정리

무니이구나 2025. 6. 20. 13:08

Node.js에서 외부 명령어를 실행해야 할 때 흔히 사용하는 API가 바로 child_process 모듈의 execspawn이다. 둘 다 자식 프로세스를 생성해 명령을 실행할 수 있게 해주지만, 내부 동작 방식과 사용 목적은 다소 다르다.

이 글에서는 execspawn의 핵심 차이점과 언제 어떤 상황에서 사용하면 좋을지 예제와 함께 정리한다.


execspawn은 무엇인가?

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에서 외부 명령어를 실행할 때 execspawn을 적절히 선택하는 것은 성능, 보안, 기능성 측면에서 매우 중요하다. 각각의 동작 방식과 차이를 명확히 이해하고, 프로젝트에 가장 적합한 방법을 선택하자.