본문 바로가기

자바스크립트

Node.js의 동작방식

Node.js 란?

Node.js 는 한마디로 자바스크립트를 실행시키는 런타임 환경

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

 

Node.js 의 구성

Node.js는 세 가지 영역으로 되어있다.

 

  1. 자바스크립트 코드
    • 우리가 작성하는 그 코드
  2. Node.js
    • 자바스크립트 코드를 실행
    • libuv과 V8 사이의 인터페이스 역할
  3. 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의 작동

  1. V8 엔진으로부터 node.js API로 요청이 들어오면, 들어온 요청이 Event Queue에 추가
  2. 이벤트 루프는 Event Queue를 살펴, 요청이 있을 경우 선착순으로 처리
  3. Event Queue에 있던 요청은 libuv의 Thread Pool로 보내지며, Thread Pool은 여러 요청을 처리 가능. 동시에 이벤트 루프는 event queue에 요청이 있는지 계속해서 확인
  4. thread pool은 db 또는 file 또는 다른 서버 등에 보낸 요청과 같이 블로킹 연산을 수행
  5. Thread Pool은 요청 수행을 마치면 Callback 함수를 실행시켜 이벤트 루프로 응답을 전달
  6. 이벤트 루프는 응답을 클라이언트에 보냄

 

 

Node.js 동작원리 (Single thread, Event-driven, Non-Blocking I/O, Event loop)

Node.js 이벤트 루프(Event Loop) 샅샅이 분석하기

Node.js란?

Javascript와 Nodejs, 그리고 싱글 스레드

node.js는 single thread일까?

왜 node.js는 single-thread 인가

[10분 테코톡] 유세지의 Node.js

'자바스크립트' 카테고리의 다른 글

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