Node.js 란?
Node.js 는 한마디로 자바스크립트를 실행시키는 런타임 환경
- 자바스크립트는 브라우저에서 종속되어있는 언어기 때문에 브라우저가 유일한 런타임 환경이었음
- 자바스크립트를 외부에서 실행하고자하는 노력은 지속되었으나, 속도가 느려서 잘 사용되진 않았음
- 그러던 중 구글에서 자바스크립트 엔진인 v8엔진을 탑재한 크롬 브라우저를 만들고, v8엔진을 공개함
- v8엔진은 속도가 빨랐고, v8을 기반으로 자바스크립트를 외부에서 실행하기 위한 Node 프로젝트가 진행됨
- 브라우저가 외부에서 자바스크립트를 실행할 수 있게 되고, 서버 또한 자바스크립트로 만들 수 있게 됨
Node.js 의 구성

Node.js는 세 가지 영역으로 되어있다.
- 자바스크립트 코드
- 우리가 작성하는 그 코드
- Node.js.
- 자바스크립트 코드를 실행
- libuv과 V8 사이의 인터페이스 역할
- V8 + libuv
- V8은 메모리 할당이 되는 Memory Heap과 함수 호출 스택이 쌓여 있는 Call Stack으로 구성되어 있는데, Call Stack에 쌓인 실행 컨텍스트에 따라 차례로 실행되기 때문에 V8 엔진은 비동기 처리가 불가
- 비동기 처리가 필요한 경우 Node api를 통해 libuv 라이브러리에서 제공하는 비동기 처리를 하는데, 이때 libuv가 제공하는 것이 이벤트 루프!
- libuv는 시스템 커널을 이용하는데, 커널은 멀티 스레드를 이용한다. (아래에서 언급하는 Thread Pool이 멀티 스레드)
Node.js 의 event-driven adchitecture
Node.js는 이벤트 기반으로 작동되는데, **이벤트 기반(event-driven)**이란 이벤트가 발생할 때 미리 지정해 둔 작업을 수행하는 것을 의미한다. Node.js는 이벤트 리스너에 등록해 둔 콜백함수를 실행하는 방식으로 동작하며, 모든 처리가 일련의 콜백을 처리하는 것과 같다고 봐도 무방하다.
Node.js는 싱글 스레드일까? (feat. 논블로킹)
- Node.js는 V8 이라는 자바스크립트 엔진과 비동기 작업을 처리하는 libuv library로 이루어져 있으며, libuv에서는 이벤트 루프를 제공한다.
- 사실 Node.js 는 싱글 스레드가 아니라 여러 개의 스레드를 가지고 있지만 자바스크립트를 처리할 수 있는 메인스레드인 이벤트 루프가 싱글 스레드이므로 싱글스레드라고 한다.
- Node.js는 싱글스레드 논블로킹 모델로 구성되어 있다. 하나의 스레드로 동작하지만, 비동기 I/O 작업을 통해 요청들을 서로 블로킹하지 않는다.
- Node.js에서의 논블로킹 모델은 Input과 Output이 관련된 작업(http, Database CRUD, third party api, filesystem) 등의 블로킹 작업들을 백그라운드에서 수행하고, 이를 비동기 콜백함수로 이벤트 루프에 전달하는 것을 말한다.
- 비동기적으로 수행되는 블로킹 작업은 자바스크립트 코드가 아니라 멀티스레드 환경인 아래의 Thread Pool(Worker Threads)에서 실행된다.

Event Loop의 작동
- V8 엔진으로부터 node.js API로 요청이 들어오면, 들어온 요청이 Event Queue에 추가
- 이벤트 루프는 Event Queue를 살펴, 요청이 있을 경우 선착순으로 처리
- Event Queue에 있던 요청은 libuv의 Thread Pool로 보내지며, Thread Pool은 여러 요청을 처리 가능. 동시에 이벤트 루프는 event queue에 요청이 있는지 계속해서 확인
- thread pool은 db 또는 file 또는 다른 서버 등에 보낸 요청과 같이 블로킹 연산을 수행
- Thread Pool은 요청 수행을 마치면 Callback 함수를 실행시켜 이벤트 루프로 응답을 전달
- 이벤트 루프는 응답을 클라이언트에 보냄
Node.js 동작원리 (Single thread, Event-driven, Non-Blocking I/O, Event loop)
Node.js 이벤트 루프(Event Loop) 샅샅이 분석하기
'자바스크립트' 카테고리의 다른 글
| Rest parameter와 Spread syntax (0) | 2023.04.19 |
|---|---|
| Event Loop (0) | 2023.04.12 |
| 동기적 실행 vs 비동기적 실행 (0) | 2023.03.28 |
| 프로토타입 체이닝 (상속 흉내) (0) | 2023.03.24 |
| 클로저 (private 흉내) (0) | 2023.03.21 |