특정 언어로 만든 프로그램들을 실행할 수 있는 환경.
NodeJS → Javascript 의 런타임이다.
2008년 구글이 V8엔진을 크롬에 장착시키면서 브라우저 밖에서도 V8엔진을 기반으로 Javascript를 실행시킬 수 있는 Node.js가 탄생하게 되었다.
NodeJS의 런타임을 이해하려면 Javascript의 런타임을 이해해야 한다.
싱글 스레드
이다.
- one thread == one call stack == one thing at a time
- 따라서 다중 처리를 위해서
Non-blocking I/O
Event Loop
의 도움이 필요하다.
- 필요하면
child_process.fork()
를 통해서 자식 프로세스를 생성하여 멀티프로세싱을 지원한다. cluster
를 사용해서 프로세스간의 소켓을 공유할 수 있다.
- Node.js 는 입력 스크립트를 실행한 후에 이벤트 루프에 바로 진입하고 더이상 실행할 콜백이 없다면 이벤트 루프는 종료된다.
Non-blocking I/O
- 이전 작업이 완료될 때까지 대기하지 않고 다음 작업을 수행한다. (block하지 않는다)
- I/O이 완료되면 응답이 Task Queue에 저장이 되고 Event Loop에 의해서 Stack에 올려진다.
- I/O는 파일 시스템 접근, 네트워크 요청
Event Loop
- callback queue → call Stack
- call stack이 비게 되면 task queue에서 가져온다.
- event loop 예시
이벤트 기반
이다.
- 이벤트가 발생하면 미리 지정해둔 작업을 수행한다.
- 즉, event-listener에게 callback함수를 등록한다.
- NodeJS는 libuv 라이브러리를 통해서 비동기 이벤트 I/O를 관리한다.