Node.js는 백엔드 언어이지만 시스템 수준의 작업을 제어할 수 있는 기능도 갖추고 있습니다. 그 대표적인 예가 바로
spawn이란?
const { spawn } = require('child_process');기본 예제: ls 명령 실행
const { spawn } = require('child_process');
const ls = spawn('ls', ['-lh', '/usr']);
ls.stdout.on('data', (data) => {
console.log(`출력: ${data}`);
});
ls.stderr.on('data', (data) => {
console.error(`에러: ${data}`);
});
ls.on('close', (code) => {
console.log(`프로세스 종료 코드: ${code}`);
});이 예제는 리눅스/macOS 기준으로
spawn vs exec 차이점
spawn : 결과를 스트리밍 형태로 읽을 수 있어 대용량 출력에 적합exec : 전체 출력을 버퍼에 저장한 뒤 콜백으로 넘김 → 작은 작업에 적합
예제 1: Node.js로 Python 스크립트 실행
const { spawn } = require('child_process');
const py = spawn('python3', ['script.py']);
py.stdout.on('data', (data) => {
console.log(`Python 결과: ${data}`);
});
py.stderr.on('data', (data) => {
console.error(`Python 에러: ${data}`);
});
py.on('close', (code) => {
console.log(`Python 종료 코드: ${code}`);
});광고
예제 2: 인자 전달 및 동적 실행
const command = spawn('grep', ['hello']);
command.stdin.write('hello world\nbye world\n');
command.stdin.end();
command.stdout.on('data', (data) => {
console.log(`grep 결과: ${data}`);
});예제 3: 실시간 로그 모니터링 (tail)
const tail = spawn('tail', ['-f', '/var/log/system.log']);
tail.stdout.on('data', (data) => {
console.log(`로그 스트림: ${data}`);
});에러 처리 및 종료 감지
child.on('error', (err) => {
console.error('실행 중 에러 발생:', err);
});
child.on('close', (code) => {
console.log(`프로세스 종료 코드: ${code}`);
});마무리
이를 통해 Node.js는 웹 서버뿐 아니라, 데이터 처리 자동화, 로그 수집기, 커맨드라인 유틸리티 등 다양한 분야에서 강력한 도구로 확장될 수 있습니다.