Node.js 간략한 개념 정리

개발하는 구황작물·2024년 2월 29일
0
post-thumbnail

원래는 Java 백엔드로 회사에 입사하게 되었으나
회사 내부 프로젝트를 Node.js로 하게 되었다.

그래서 알아보는 Node.js 개념

Node.js란

Nodejs 공식 홈페이지를 들어가면 다음과 같이 작성되어 있다.

Node.js is an open-source and cross-platform JavaScript runtime environment. It is a popular tool for almost any kind of project!

Node.js runs the V8 JavaScript engine, the core of Google Chrome, outside of the browser. This allows Node.js to be very performant.

A Node.js app runs in a single process, without creating a new thread for every request. Node.js provides a set of asynchronous I/O primitives in its standard library that prevent JavaScript code from blocking and generally, libraries in Node.js are written using non-blocking paradigms, making blocking behavior the exception rather than the norm.

요약하자면
1. Nodejs는 javascript를 서버에서도 사용할 수 있도록 만든 Javascript 런타임 환경이다.
2. Nodejs는 Chrome의 핵심 엔진인 V8을 기반으로 동작한다.
3. Nodejs는 새로운 스레드를 생성하지 않고 단일 프로세스로 움직이며, 비동기적으로 움직인다.

무슨 말인지 하나씩 살펴보자

1. Nodejs는 javascript를 서버에서도 사용할 수 있도록 만든 Javascript 런타임 환경이다.

javascript는 스크립트 언어로 웹 브라우저 안에서만 작동할 수 있는 언어였다.
Node.js는 이러한 javascript를 서버에서도 사용할 수 있게 해주는 런타임이다.

2. Nodejs는 Chrome의 핵심 엔진인 V8을 기반으로 동작한다.

V8엔진은 Google이 개발한 오픈소스로 C++로 작동하는 고성능 JS, 웹 어셈블리 엔진이다.
대표적인 AJITC이며, 현재 Chrome과 Node.js에서 활용되고 있다.

V8 동작원리를 간단히 살펴보자면

먼저 parser에 js 코드를 넘긴다. 이후 parser가 소스 코드를 분석한 후, AST(Abstract Syntax Tree, 추상 구문 트리)로 변환을 시킨다. 이후, Ignition Interpreter에게 넘기면 바이트 코드로 변환을 시켜준다.
이렇게 변환된 바이트 코드를 실행함으로써 소스코드가 작동하게 되고, 그 중 자주 사용되는 코드는(hotspot) TurboFan Compiler로 보내져, Optimized Machine Code(최적화된 코드)로 다시 컴파일 된다.

Ignition Interpreter

  • 바이트코드로 해석해주는 인터프리터로 전체 프로그램을 컴파일 하는 컴파일러와 달리 필요한 라인만 컴파일 한다.
  • 구문 분석기가 생성한 AST를 입력으로 사용한다.
  • 코드를 처음 실행할 때만 동작한다.

TurboFan Compiler

  • 히든 클래스와 인라인 캐싱을 통해 컴파일링을 최적화 한다.

이러한 방식으로 v8엔진이 작동하여 다른 Js엔진보다 속도가 빠르다.
(위의 내용외에도 설명할 것이 많으나 너무 길어질 것 같아 간단하게 정리하였습니다.)

3. Nodejs는 새로운 스레드를 생성하지 않고 단일 프로세스로 움직이며, 비동기적으로 움직인다.

Nodejs는 단일 스레드, async/non blocking 방식으로 작동한다.

정확히는 메인 스레드인 이벤트 루프는 싱글 스레드이고 이벤트 루프 뒤에서 일하는 스레드는 멀티 스레드로 움직인다.


https://sjh836.tistory.com/149

요청이 이벤트 루프를 통해 들어오면 커널에 Non-Blocking I/O 요청 요청인지 확인한 후, Non-Blocking I/O 요청이라면 커널에게 비동기 요청을 하고, Blocking I/O(File 읽기...) 라면 워크 스레드가 담긴 스레드 풀에 요청을 한다.


Reference
https://nodejs.org/en/learn/getting-started/introduction-to-nodejs
https://sjh836.tistory.com/149
https://medium.com/zigbang/nodejs-event-loop%ED%8C%8C%ED%97%A4%EC%B9%98%EA%B8%B0-16e9290f2b30

profile
어쩌다보니 개발하게 된 구황작물

0개의 댓글