Node.js가 작업을 처리하는 방법
런타임 환경에서 1+1 같은 자바스크립트로 처리할 수 있는 작업은 V8 엔진을 통해서 하게 된다. 하지만 파일을 읽거나 데이터베이스 접근 등과 같은 작업은 V8으로 할 수 없다. 이런 부분은 비동기 이벤트 처리 라이브러리인 libuv를 통해 작업한다. 즉, V8이 코드를 해석하고 Node.js APIs들 중 하나의 함수를 호출하고 Node.js 바인딩을 통해서 libuv에 의해서 원하는 작업을 처리한다.
node.js 오픈소스를 보면 lib은 node api의 javascript 부분(console, http, os, path, process)
src는 node binding의 c++부분
이렇게 자바스크립트 코드로부터 c++ 그리고 libuv까지 연결이 된다.
libuv (유니콘 벨로시랩터 라이브러리)
이벤트 루프를 기반으로 하는 비동기 I/O에 대한 지원을 제공하는 다중 플랫폼 C 라이브러리이다. 주로 Node.js에서 사용하도록 개발되었지만 Julia, Luvit, pyuv 등과 같은 다른 도구에서도 사용된다. Node.js는 이 라이브러리를 이용하여 지원되는 모든 플랫폼에서 통합 인터페이스로 I/O 작업을 추상화한다. 즉, libuv를 쓰면 각 플랫폼 (window, linux 등) 의 가장 빠른 비동기 IO 인터페이스로 통일된 코드를 돌릴 수 있는 장점이 있다.
이 라이브러리는 파일 시스템, DNS, 네트워크, 파이프, 신호 처리, 스트리밍을 처리하는 메커니즘을 제공한다.
원래 unix와 window는 파일 컨트롤 방법이 다르지만 libuv에서 서로 compatible하게 해주므로 노드를 사용하는 사람은 따로 신경쓰지 않고 unix, window에서 같은 방법을 사용할 수 있다.
동기와 비동기의 차이
동기(synchronous, 시간을 맞춤), 비동기 (Asynchronous, 시간을 맞추지 않음)
동기는 먼저 이전의 것이 끝나야 다음 작업을 할 수 있지만, 비동기는 1번 작업을 하면서 2번 작업을 할 수 있고, 3,4번 작업도 할 수 있다.
node.js에서 비동기를 주로 사용한다.
데이터베이스에서 데이터를 읽을 때 저장할 때, 지울 때 등 대부분의 요청이 비동기로 이루어진다. 대부분의 작업이 어느 정도의 시간을 요하기 때문이다. 이 덕분에 여러 개의 작업을 해도 다른 작업을 기다리지 않고 빠르게 여러 작업을 처리할 수 있다.
javasript는 동기 언어
자바스크립트는 한 줄 실행하고 또 다음 줄 실행하는 동기 언어이다. 하지만 콜백 함수를 실행하는 비동기 코드를 사용하는 경우도 있다.
비동기 코드를 작성하기 위해서 자바스크립트 이외의 도움을 받는다.
setTimeout도 사실 자바스크립트의 부분이 아니다. 브라우저에서 사용한다면 브라우저 api를 사용하는 것이며(window object), Node에서 사용한다면 Node api를 사용하는 것이다. (global object)
javascript는 비동기로 사용할 수 없지만, 다른 것의 도움을 받아서 비동기로 사용할 수 있다.
'NODE.JS' 카테고리의 다른 글
[Node.js] package.json 이름 규칙 (String does not match the pattern of "^(?:@[a-z0-9-*~][a-z0-9-*._~]*/)?[a-z0-9-~][a-z0-9-._~]*$".) (1) | 2024.01.07 |
---|---|
[Node.js] Blocking과 Non-Blocking (0) | 2024.01.05 |
[Node.js] Node.js API와 브라우저 API의 차이 (1) | 2024.01.05 |
[Node.js] Node.js란? (1) | 2024.01.05 |
[Node.js] npm과 npx, 그리고 yarn (0) | 2023.10.13 |