Node.js 동작 원리

wltjd1688·2025년 2월 12일

풀사이클

목록 보기
14/74

node.js동작원리에 대해서 자세히 알아보자

  • 2025-02-12, node.js 비동기에 관한글을 읽고 정리할 필요가 있음

Node.js의 특징

Node.js는 자바스크립트를 스크립트 언어 이상으로 프로그래밍 언어 역할을 할 수 있도록 지원하는 플랫폼이다. node.js를 이용해서 자바스크립트로 백엔드를 구현할 수 있으며, 대부분의 자바스크립트를 실행할 수 있게 해주는 엔진이다.
공식 홈페이지에서는 "V8 JavaScript엔진으로 빌드된 JavaScript 런타임"이라고 나와있다.

V8엔진?

c++로 개발된 Google의 JavaScript 및 WebAssembly 기반 오픈소스 엔진이다.
v8은 JIT compilation를 사용하여 js코드를 실행한다.
대표적으로 Chrome과 node.js가 있다.

인터프리터와 컴파일

인터프리터(interpret) 컴파일(compile)
번역 방법 한줄 씩 번역 후 실행 전체를 번역 후 한번에 실행
장점 한줄씩 바로 실행되니까 컴바일보다 빠르다. 코드의 전체를 보기에 효율적인 실행코드가 생성된다.
단점 인터프리터 없이 실행할 수 없다. 기계어에 종속적인 실행코드가 생성되므로 기기가 달라지면 새로 컴파일 해야한다.
대표 Node.js, python c, c++, JAVA

조금 더 자세히 설명하면 v8엔진은 인터프리터 방식을 사용해 빠른 실행을 하면서, 성능 최적화를 위해 JIT 컴파일러(Tubo Fan)을 통해 자주 사용되는 코드를 감지하고 기계어로 변화해주어 실행 속도를 높인 하이브리드 엔진이라고 할 수 있다.

싱글 스레드

한 개의 스레드에서 모든 작업을 처리한다. => 요리사가 한명

javascript가 기본적으로 단일 스레드이기에 Node.js도 단일(싱글) 스레드 환경에서 동작한다.
이는 많은 이점을 가져온다.

  • 동시성 문제에 대한 걱정이 없음
  • 메모리 사용 효율이 좋음
  • 내부적으로 처리하는 비동기 작업

논블로킹 I/O

I/O 작업이 완료될 때까지 기다리지 않고 다른 작업을 처리함 => 한명이 일하는데, 노련해서 라면 1개 물 올려놓고, 볶음밥 함

논 블로킹 방식은 javascript가 기본적으로 단일 스레드로 동작하기 때문에 채택되었으며,이로인해 싱글 스레드의 한계인 기존의 작업이 처리되기 전까지 다른 작업이 차단되는걸 막아줌

이벤트 루프와 libuv 라이브러리

비동기적으로 작업을 처리함 => 주문이 들어와야만 일함

이벤트 루프

Node.js에서 발생하는 비동기 작업(콜백함수 등)을 관리하는 주체이다.
여러 단계로 구성되어, 각 단계마다 특정 종류의 작업들을 처리함
Node.js가 시작되면 이벤트 루프를 초기화하고 제공된 입력 스크립트를 처리하거나 비동기 API를 호출, 일정 타이머 또는 호출을 수행한 다음 이벤트 루프 처리를 시작한다.

  • Timers: setTimeout(), setInterval()로 예약된 콜백 실행
  • Pending: 이전 루프에서 미처리된 I/O 콜백 처리
  • Idle, Prepare: 내부 Libuv 작업 준비
  • Poll: 새로운 I/O 이벤트를 받아 실행
  • Check: setImmediate()로 예약된 콜백 처리
  • Close: 소켓 종료 등 close 관련 콜백 실행
    또는
  • process.nextTick: 이벤트 루프 단계 사이에 콜백을 실행할 수 있다. 이 기능은 특정 상황에서 무한 실행 루프를 유발할 수도 있으므로 주의가 필요하다.

libuv?
Node.js 내부에 포함된 C 기반 라이브러리인 libuv는, 네트워크 I/O, 파일 I/O 등의 비동기 작업을 수행한다. 또한 시스템 커널의 비동기 API와 인터페이스 역할을 하며, 자체 쓰레드를 이용하여 블로킹 작업들을 처리한다.


참고

profile
일단 해!!!!

0개의 댓글