티스토리 뷰

Javascript/Node.js

Node.js 란

dev23 2024. 4. 17. 15:12
반응형

- Node.js는 서버 측 자바스크립트 런타임 환경이다.

- Node.js는 V8 자바스크립트 엔진과 libuv 및 C/C++에 의존성을 가진 자바스크립트 런타임으로, 여기서 런타임은 자바스크립트로 된 프로그램을 실행할 수 있는 프로그램이다.

 

구성 요소

- Node.js의 소스 코드는 C++와 자바스크립트, 파이썬 등으로 이루어져 있다.

- 사용자 코드(자바스크립트)는 Node.js의 API를 사용하고, Node.js API는 Node.js에 바인딩되어 있는 소스이거나 직접 만든 C++ 애드온을 호출한다.

- C++에서는 V8을 사용해 자바스크립트를 해석(JIT 컴파일러) 및 최적화하고 어떤 코드냐에 따라 C/C++ 종속성이 있는 코드를 실행한다.

- DNS, HTTP 파서, OpenSSL, zlib 이외의 C/C++ 코드들은 lbuv의 API를 사용해 해당 운영체제에 맞는 API를 사용한다.

- Node.js의 구성 요소 중 V8과 libuv가 중요하며, V8은 자바스크립트 코드를 실해아도록 해 주고, libuv는 이벤트 루프 및 운영체제 계층 기능을 사용하도록 API를 제공한다.

 

V8 엔진

- V8은 C++로 만든 오픈 소스 자바스크립트 엔진이다. 

- 엔진은 사용자가 작성한 코드를 실행하는 프로그램을 말하며, 파서, 컴파일러, 가비지 컬렉터, 콜 스택, 힙으로 구성되어 있다.

- V8 엔진은 자바스크립트를 실행할 수 있는 엔진이며, 인터프리터 역할을 하는 이그니션과 컴파일러 역할을 하는 터보팬을 사용해 컴파일한다.

 

libuv

- Node.js는 HTTP, 파일, 소켓 통신 IO 기능 등 자바스크립트에 없는 기능을 libuv라는 C++ 라이브러리를 사용해 해결한다.

- libuv는 비동기 입출력, 이벤트 기반에 초점을 맞춘 라이브러리이다.

- libuv는 다양한 플랫폼에서 사용할 수 있는 이벤트 루프를 제공하며, 네트워크 파일 IO, DNS, 스레드 풀 기능을 추가로 제공한다.

- Node.js에서는 C++ 바인딩 기능으로 자바스크립트에서 libuv의 API를 사용한다.

 

Node.js 아키텍처

- Node.js 애플리케이션의 코드는 다음과 같이 실행된다.

 

  1. 애플리케이션에서 요청이 발생하면 V8 엔진은 자바스크립트 코드로 된 요청을 바이트 코드나 기계어로 변경
  2. 자바스크립트로 작성된 Node.js의 API는 C++로 작성된 코드를 사용
  3. V8 엔진은 이벤트 루프로 libuv를 사용하고 전달된 요청을 libuv 내부의 이벤트 큐에 추가
  4. 이벤트 큐에 쌓인 요청은 이벤트 루프에 전달되고, 운영체제 커널에 비동기 처리를 맡기며, 운영체제 내부적으로 비동기 처리가 힘든 경우는 워커 스레드에서 처리
  5. 운영체제의 커널 또는 워커 스레드가 완료한 작업은 다시 이벤트 루프로 전달됨
  6. 이벤트 루프에서는 콜백으로 전달된 요청에 대한 완료 처리를 하고 넘김
  7. 완료 처리된 응답을 Node.js 애플리케이션으로 전달

 

싱글 스레드

- 자바스크립트 엔진(V8)은 자바스크립트를 실행하는 힙과 콜 스택을 가지고 있으며, 싱글 스레드로 실행된다.

- 싱글 스레드라는 말은 콜 스택이 하나만 있으며, 콜 스택이 하나이므로 한 번에 하나의 작업만 가능하다.

 

 

이벤트 기반 아키텍처

- 싱글 스레드인 자바스크립트는 동시에 여러 작업을 처리할 수 없다.

- 이벤트 기반 아키텍처를 적용하여 콜 스택에 쌓인 작업을 다른 곳에서 처리하도록 한다.

- 다음은 Node.js에서 동시 요청을 처리하는 방법이다.

 

  1. 자바스크립트 코드는 V8의 콜 스택에 쌓이고 I/O 처리가 필요한 코드는 이벤트 루프로 보내게 된다.
  2. 이벤트 루프에서는 루프를 실행하면서 운영체제 또는 스레드 워커에 I/O 처리를 맡긴다.
  3. 스레드 워커와 운영체제는 받은 요청에 대한 결과를 이벤트 루프로 돌려 준다.
  4. 이벤트 루프에서는 결과값에 대한 코드를 콜 스택에 다시 추가한다.

 

이벤트 루프

- Node.js의 이벤트 루프는 libuv에 있으며 각 운영체제의 계층을 추상화한 기능을 제공한다.

- 이벤트 루프는 여러 개의 FIFO 큐로 이루어져 있으며, 각 단계를 돌면서 각 큐에 쌓인 이벤트를 모두 처리한다.

- 콜 스택이 하나지만, 이벤트 루프에서 운영체제의 비동기 I/O 기능을 사용하거나, 스레드 풀을 사용해서 모든 작업을 비동기로 처리할 수 있다.

- 이벤트 루프에서는 여러 큐를 사용해 특정 우선순위대로 작업들을 처리해 준다.

 

 

장단점

- Node.js를 사용하면 자바스크립트로 고성능 서버를 쉽게 개발할 수 있다.

- CPU 사용량이 많은 작업을 하는 서버가 아니라면, 굉장히 적은 메모리로 아주 좋은 성능을 낼 수 있다.

- Node.js는 마이크로 서비스와 클라우드 환경에도 적합하다. 메모릴르 적게 사용하며 CPU 성능에 크게 좌우되지 않아서 비용을 절약할 수 있다.

- 랭킹이나 매칭 등 CPU를 많이 사용해야 하는 서비스에는 Node.js가 적합하지 않다.

 

 

 

반응형

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

Nodejs Express  (0) 2024.04.28
Node.js 서버  (0) 2024.04.17
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함