본문 바로가기
Node.js

Node.js 구조 & 동작 원리

by WhoamixZerOne 2022. 8. 17.

최근에 Node.js 공부하고 개발은 하지만, 구조나 동작 원리? 등에 대해서 자세히 알지 못하고 Expressjs 공식문서 혹은 구글에 찾아보면서 개발을 했었다. 그러다 문득 생각한 게 좋은? 잘하는 개발자가 되려면 내가 쓰는 것에 대해서 알아야 하지 않을까 생각이 들어서 이 글을 쓰게 됐다.

 

이전 글 Node.js 교과서 1주차에서도 Node.js에 대해서 아주 간략하게 설명을 했지만 다시 한번 얘기하자면,

Node.js는 크롬 V8 자바스크립트 엔진 기반으로 자바스크립트 런타임 실행환경이다.

Node.js의 특징은 싱글 스레드(Single Thread), 이벤트 기반(Event Driven), 논 블로킹 I/O(Non Blocking I/O) 모델 특징들이 있다. 특징들을 얘기하기 전에 먼저 Node.js의 구조부터 얘기하는 게 좋을 것 같다.

 

✔ Node.js 구조

[출처]: https://blog.usejournal.com/nodejs-architecture-concurrency-model-f71da5f53d1d

Node.js 구조는 많은 라이브러리로 구성되어 있지만 가장 중요한 역할을 하는 중요 요소 2가지가 있다.

V8 자바스크립트 엔진, LibUv 라이브러리이다.

 

✔ V8 자바스크립트 엔진

자바스크립트 엔진은 크게 두 가지 영역으로 나뉜다.

  • Call Stack 실행 : 코드의 실행에 따라 호출 스택이 쌓이는 영역
    - 함수가 실행되면 콜 스택에 순차적으로 Push 되고 함수가 종료되면 Pop 되는 FILO(First In Last Out) 특징
  • Heap Memory 할당 : 메모리 할당이 일어나는 영역- 동적으로 생성된 객체(인스턴스)는 heap에 할당

✔libuv

C 라이브러리로 논블로킹 I/O 작업을 지원하는 모든 플랫폼에서 일관된 인터페이스로 추상화하는 데 사용한다.

운영체제 수준에서 비동기로 처리될 수 없는 작업을 위한 스레드 풀(Thread Pool)도 포함하고 있고 Event Loop, Event Queue를 관리한다.

 

자바스크립트 실행을 담당하는 stack 호출은 자바스크립트 엔진인 V8에서 담당하고 비동기 I/O Event Loop는 libuv가 담당하는 것을 알 수 있다.

 

✔Event Loop

이벤트 루프는 Main Thread 안에서 실행되며 비동기 callback 작업이 수행될 수 있도록 도와준다.

  1. 이벤트 루프가 Blocking I/O 인지 아닌지 Script를 평가한다
  2. 커널단의 비동기 I/O 지원으로 처리가 가능하면 처리 한 후에 이벤트 큐에 callback을 등록한다
  3. 커널단의 지원 처리가 불가능한 작업은 libuv 내의 별도의 스레드 풀에서 워커 스레드(Work Thread)에 작업을 넘겨준다. 워커 스레드는 작업을 완료한 후 이벤트 큐에 callback을 등록한다
  4. 이벤트 루프는 주기적으로 콜 스택이 비어있는지 체크하고 이벤트 큐에 실행 대기 중인 callback이 있으면 callback들을 콜 스택에 이동시켜 Main Thread에서 실행하도록 해준다

[출처]: https://sjh836.tistory.com/149 (빨간색코딩 님)

Event Loop는 각 요청을 특성에 맞게 커널이나 스레드 풀에 넘겨주고, 이벤트 큐에서 실행 대기 중인 callback을 메인 스레드에 의해 실행될 수 있도록 콜 스택으로 옮기는 역할을 한다고 볼 수 있다.

 

ES6에 새로 추가된 Microtask Queue, Animation Frames가 도입되었습니다.

Microtask Queue는 Event Queue와 동일한 계층에 존재하고 Promise의 비동기 호출 시 마이크로 태스크 큐에 등록한다.

이벤트 루프의 우선순위는 마이크로태스크 > 애니메이션 프레임 > 태스크이다. 하지만 우선순위는 브라우저마다 호출 순서가 다를 수 있다.

그리고 위의 그림과 같이 Event Queue(Task Queue)는 한 개가 아닌 여러 개의 큐가 존재한다.

 

✔Event Loop Phases

[출처]: https://nodejs.org/ko/docs/guides/event-loop-timers-and-nexttick/

위의 그림과 같이 이벤트 루프는 여러 단계들을 반복적으로 순회하면 실행한다.

  1. timers
  2. pending callbacks
  3. idle, prepare
  4. poll
  5. check
  6. close callbacks

 

✔정리

  • Node.js에서 자바스크립트 실행은 1개의 Call Stack으로 Main Thread에 의해서만 수행된다
  • 단일 스레드이기 libuv library를 사용하여 Event Loop를 이용한 비동기 callback 방식 제공한다
  • Event Loop는 요청의 특성에 맞게 커널 비동기 함수 또는 Thread Pool에 작업을 위임하며 Call Stack, Event Queue(여러 개의 큐)를 확인하면서 Call Stack이 비어있으면 Event Queue에 있는 callback을 Call Stack으로 이동시켜 실행시킨다.

 

🔗 Reference

 

 

'Node.js' 카테고리의 다른 글

[NestJS] Passport JWT 토큰 인증 구현 & 에러 핸들링  (1) 2023.07.06
[NestJS] Configuration 설정 & TypeORM 연결  (0) 2023.05.31
Node.js 교과서 4주차  (0) 2022.06.09
Node.js 교과서 3주차  (0) 2022.06.01
Node.js 교과서 2주차  (0) 2022.05.25

댓글