오늘은 Node.js 내장 모듈인 child_process에 대해 알아볼 것이다.
child_process란 외부 프로세스를 생성하고 상호작용할 수 있는 기능을 제공하는 내장 모듈이다.
이 모듈을 사용하면 Node.js 애플리케이션 내에서 다른 프로그램을 실행하고, 그 프로그램과의 표준 입력(stdin), 표준 출력(stdout), 표준 오류(stderr)를 통해 데이터를 주고받을 수 있다.
주로 다음과 같은 상황에서 많이 사용한다.
- 외부 명령어를 실행하고 그 결과를 가져와야 할 때
- 별도의 프로세스에서 비동기적으로 작업을 수행해야 할 때
- 다른 Node.js 애플리케이션과 통신하거나 데이터를 공유해야 할 때
child_process는 아래와 같은 기능을 제공한다.
- exec : 쉘 명령어를 실행하고 그 결과를 버퍼 형태로 반환한다..
- spawn : 새로운 프로세스를 생성하고 입출력 스트림을 통해 상호작용할 수 있다.
- fork : 새로운 Node.js 프로세스를 생성하고 부모-자식 간에 통신할 수 있다.
- execFile : 외부 프로그램을 실행하고 그 결과를 버퍼 형태로 반환한다.
사용 방법
exec.js
const exec = require('child_process').exec;
const process = exec('dir'); // 현재 경로에 있는 파일을 불러온다.
process.stdout.on('data', function(data) {
console.log(data.toString());
}); // 실행 결과
process.stderr.on('data', function(data) {
console.error(data.toString());
}); // 실행 에러
터미널 창에 dir이라는 명령어를 치면 현재 경로에 있는 파일을 읽어준다.
Node에서도 위와 같이 dir이라는 명령어를 칠 수 있게 해준다.
대신 직접 console.log(data.toString()); 를 통해서 출력해줘야 한다.
에러가 났을 경우에도 stderr를 통해 console.log로 출력해줘야 한다.
콘솔 결과
저번 글에서 멀티스레드는 다른 언어로 구현하는 것이 좋다고 했었는데 다른 언어로 구현하고 난 뒤
child_process.spawn을 통해서 Node로 다른 언어를 실행시킬 수 있다.
아래 spawn.js는 Node로 python 코드를 실행시키는 예제이다.
spawn.js
const spawn = require('child_process').spawn;
const process = spawn('python', ['test.py']);
process.stdout.on('data', function(data) {
console.log(data.toString());
}); // 실행 결과
process.stderr.on('data', function(data) {
console.error(data.toString());
}); // 실행 에러
test.py
print('hello python')
대신 python이 설치되어있어야 한다..!(다른 언어도 마찬가지)
Node가 python을 대신 실행시켜주는 것이 아닌 실행시켜달라고 요청하는 것이기 때문이다.
child_process 외에 Node.js 내장 모듈은 아래와 같이 여러가지 있다.
좀 더 디테일한 내용들은 공식 문서를 보고 상황에 맞춰서 사용하면 될 것 같다.
- assert : 값을 비교하여 프로그램이 제대로 동작하는지 테스트하는데 사용
- dns : 도메인 이름에 대한 IP 주소를 얻어내는데 사용
- net : HTTP보다 로우 레벨인 TCP나 IPC 통신을 할 때 사용
- string_decoder : 버퍼 데이터를 문자열로 바꾸는 데 사용
- tls : TLS와 SSL에 관련된 작업을 할 때 사용
- tty : 터미널과 관련된 작업을 할 때 사용
- dgram : UDP와 관련된 작업을 할 때 사용
- v8 : V8 엔진에 직접 접근할 때 사용
- vm : 가상 머신에 직접 접근할 때 사용
이상으로 Node.js 내장 모듈에 대해 알아보았다..!
'Node.js' 카테고리의 다른 글
Node.js - 버퍼/스트림 이해하기 (0) | 2023.05.17 |
---|---|
Node.js 내장 모듈 - fs (0) | 2023.05.16 |
Node.js 내장 모듈 - worker_threads (2) | 2023.05.12 |
Node.js 내장 모듈 - util (0) | 2023.05.10 |
Node.js 내장 모듈 - crypto (0) | 2023.05.06 |