1. Node.js
Node.js는 Chrome V8 JavaScript Engine으로 빌드된 JavaScript Runtime이다. 기존에는 자바스크립트 프로그램을 웹 브라우저에서만 실행할 수 있었다. 이는 브라우저가 자바스크립트 런타임을 내장하고 있기 때문이다. 브라우저 외의 환경에서 자바스크립트를 실행하려는 여러 시도가 있었으나, 자바스크립트의 실행 속도 문제 때문에 불가능했다. 그러나 2008년 구글이 V8 엔진을 사용해 크롬 브라우저를 출시하면서 속도 문제가 해결되었고, 이를 바탕으로 2009년에 Node.js가 개발되었다.
* 런타임: 특정 언어로 만든 프로그램들을 실행할 수 있는 환경.
2. Node.js 특징
1) 싱글 스레드 (Single thread)
Node.js를 실행하면 먼저 프로세스가 하나 생성된다. 그 프로세스에서 내부적으로 여러 개의 스레드를 생성한다. 하지만 그 중에서 적접 제어할 수 있는 스레드는 하나뿐이다. 그래서 Node.js는 싱글 스레드 기반이라고 불린다. 이처럼 Node.js는 여러 개의 스레드를 가지고 있지만 자바스크립트를 실행하는 스레드는 하나이므로 노드를 싱글 스레드라고 한다. 이 때 그 싱글 스레드가 바로 이벤트 루프이다.
Node.js는 본질적으로 싱글 스레드 기반이지만, libuv 스레드 풀과 워커 스레드를 통해 멀티스레드 작업을 지원한다. 스레드 풀은 Node.js가 암호화, 파일 입출력, 압축 등과 같은 특정 작업을 수행할 때 내부적으로 멀티스레드를 사용한다. 또한, 워커 스레드는 Node.js 12 버전부터 안정화된 기능으로, 개발자가 직접 멀티 스레드를 사용할 수 있게 해준다.
2) 이벤트 기반 (Event-driven)
이벤트 기반이란 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식을 의미한다.
노드는 이벤트가 발생하면 이벤트 리스너에 등록해둔 콜백 함수를 호출한다. 발생한 이벤트가 없거나 이벤트를 다 처리하면, 다음 이벤트가 발생할 때까지 대기한다.
3) 논블로킹 I/O 모델 (Non-Blocking I/O Model)
논블로킹이란 이전 작업이 완료될 때까지 대기하지 않고 다음 작업을 수행하는 것을 의미한다. 반대로 블로킹은 이전 작업이 끝나야만 다음 작업을 수행하는 것을 의미한다. I/O는 입력(Input)과 출력(Output)을 의미한다. 파일 시스템 접근(파일 읽기 및 쓰기, 폴더 만들기 등)이나 네트워크를 통한 요청 같은 작업이 I/O의 일종이다.
노드는 I/O 작업 등을 할 때 논블로킹 방식으로 처리하여 이전 작업이 완료될 때까지 대기하지 않고 다음 작업을 수행함으로써 다수의 요청을 효율적으로 처리한다.
3. Node.js 구조
📌 V8 (JavaScript Engine)
Node.js에서 사용하는 JavaScript 엔진으로 코드를 컴파일하고 서버 사이드에서 실행
📌 Bindings (Node API)
Node.js 시스템과 V8 엔진 간의 상호작용을 가능하게 하는 C++ 라이브러리
📌 Libuv Library
Node.js에서 비동기 I/O 작업을 처리하기 위한 C 라이브러리
📌 Event Queue
비동기 I/O 작업 결과를 저장하고 처리하기 위한 자료구조 (웹브라우저의 Task Queue와 비슷)
📌 Event Loop
Event Queue에 저장된 I/O 작업 결과를 처리하고, 다음 작업을 수행하도록 하는 관리자
📌 Worker Threads
CPU 집약적인 작업을 처리하기 위해 Node.js 10 버전부터 추가된 멀티 스레드
🔗 참조
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!