본문 바로가기

개발에 도움이 되는/JavaScript

Node.js

- Node.js

 1. 자바스크립트를 브라우저 밖에서도 실행시킬 수 있게 만든 자바스크립트 런타임(실행 환경)

 

 2. Single Thread Non-Blocking Model

 

 3. SIngle Thread지만 비동기 I/O 작업을 통해 요청들을 서로 Blocking 하지 않음

 

 4. 동시에 많은 요청들을 비동기로 수행함으로써 Single Thread지만 Non-Blocking이 가능

 

 5. 이벤트 기반으로 동작

   - 이벤트 기반 : 이벤트가 발생할 때 미리 지정해둔 작업을 처리하는 방식, Node.js는 이벤트 리스너에 등록해둔 콜백 함수를 실행하는 방식으로 동작(이벤트 루프가 이를 가능하게 해줌)

 

 6. Clustering을 통해 프로세스를 fork하여 Multi Thread 처럼 사용 가능하여 서버의 확정성이 용이함

 

 

- Node.js 구조

 

  - V8 : 자바스크립트 엔진으로써 자바스크립트를 실행하는 엔진

 

  - Libuv

   1. Node.js에서 비동기 처리를 담당하는 라이브러리

   2. 네트워크, 파일 I/O등 비동기 처리 지원

   3. 비동기는 시스템마다 제공하는 API 이용

   4. 시스템에서 제공하는 API가 없거나 특수한 경우 Thread pool 이용

   5. Thread pool을 따로 설정하지 않는다면 Default는 Thread 4개

 

- 실행 과정

 

  1. 자바스크립트로 작성된 코드를 Node.js로 실행

 

  2. Event Loop에 진입하기 전에 코드를 실행

 

  3. fs, socket과 같이 libuv를 호출하는 함수가 있으면 libuv는 코드 제어권을 가지지 않고 다음 코드를 실행할 수 있도록 제어권을 넘기고 libuv는 호출된 작업이 동기 / 비동기 검사 후 시스템 API를 이용하거나 Thread pool에 생성된 Thread에게 작업을 위임 후 작업이 완료되면 Callback 함수를 Task Queue에 등록

 

  4. 코드를 모두 실행했으면 이벤트 루프를 생성할지, 종료할지 결정(libuv에 의해 Callback이 등록되었다면 이벤트 루프 생성, 없으면 프로그램 종료)

 

  5. Task Queue에서 대기하다가 Call Stack이 비는 시점에 이벤트 루프를 돌려 해당 Callback을 Call Stack에 넣음.

     이벤트 루프는 Timers -> Pending I/O Callbacks -> Idle, Prepare -> Poll -> Check -> Close Callback (각각을 Phase라고 함)순으로 해당 Queue에 등록된 작업을 실행

 

 - 이벤트 루프 (Event Loop) 구조

 

  1. Timers : 루프의 시작을 알림,  setTimeout, setInterval에 등록된 Callback 관리, 타이머에 등록된 Callback이 언제 실행할지만 관리하고 실행은 Poll에서 진행, Timer Callback은 Min-Heap 자료구조 기반으로 구성

 

  2. Pending I/O Callbacks : 다음 Phase 실행을 위해 연기된 Callback 실행, 각 Phase는 라운드 로빈 방식으로 일정 시간동안 실행 후 다음 Phase로 넘어가기 때문에 이전에 실행 못한 작업을 실행함

 

  3. Idle, Prepare : Node.js 내부 관리용 Phase

 

  4. Poll : setTimeout, setInterval, setImmediate로 등록된 Callback을 제외한 대부분이 여기서 처리

해당 watch_queue가 비어있지 않다면 작업을 순차적으로 처리, 비어있다면 아래 규칙에 따라 넘어가거나 대기한다.

   1) Check phase를 확인하여 setImmediate가 있는지 확인 후 있는 경우 Check phase 단계로 이동

   2) 만약 없다면 Timers phase 단계에서 실행할 timer 함수가 있는지 확인 후 실행할 수 있는 시간까지 대기 후 Timers phase 단계로 넘어감

   3) 대기하는 동안 watch_queue에 Callback 함수가 쌓인다면 즉시 실행

 

  5. Check : setImmediate로 등록된 Callback 관리, setImmediate에 의해서만 해당 phase에 Callback을 등록

 

  6. Close Callback : socket 또는 handle이 닫힌 경우와 같은 close 이벤트를 처리하기 위한 단계

 

 

- Node.js가 적합한 상황

  1. 비동기이기 때문에 file upload나 download 같은 네트워크 streaming 서비스에 유리

  2. Single Page App 개발에 용이

  3. Json API 기반 어플리케이션

  4. 가볍고 생산성이 높은 웹 개발 프레임워크를 가지고 있어 간단한 로직을 가지고 대용량과 빠른 응답 시간을 요구하는 애플리케이션에 적합

 

- Node.js가 적합하지 않은 상황 : CPU 작업이 많은 어플리케이션

반응형

'개발에 도움이 되는 > JavaScript' 카테고리의 다른 글

클로저(Closure)  (0) 2022.03.13
스코프(Scope)  (0) 2022.02.27
실행 컨텍스트(Execution Context)  (0) 2022.01.15
호이스팅(Hoisting)  (1) 2022.01.05
JavaScript  (0) 2021.12.26