티스토리 뷰
- 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 애플리케이션의 코드는 다음과 같이 실행된다.
- 애플리케이션에서 요청이 발생하면 V8 엔진은 자바스크립트 코드로 된 요청을 바이트 코드나 기계어로 변경
- 자바스크립트로 작성된 Node.js의 API는 C++로 작성된 코드를 사용
- V8 엔진은 이벤트 루프로 libuv를 사용하고 전달된 요청을 libuv 내부의 이벤트 큐에 추가
- 이벤트 큐에 쌓인 요청은 이벤트 루프에 전달되고, 운영체제 커널에 비동기 처리를 맡기며, 운영체제 내부적으로 비동기 처리가 힘든 경우는 워커 스레드에서 처리
- 운영체제의 커널 또는 워커 스레드가 완료한 작업은 다시 이벤트 루프로 전달됨
- 이벤트 루프에서는 콜백으로 전달된 요청에 대한 완료 처리를 하고 넘김
- 완료 처리된 응답을 Node.js 애플리케이션으로 전달
싱글 스레드
- 자바스크립트 엔진(V8)은 자바스크립트를 실행하는 힙과 콜 스택을 가지고 있으며, 싱글 스레드로 실행된다.
- 싱글 스레드라는 말은 콜 스택이 하나만 있으며, 콜 스택이 하나이므로 한 번에 하나의 작업만 가능하다.
이벤트 기반 아키텍처
- 싱글 스레드인 자바스크립트는 동시에 여러 작업을 처리할 수 없다.
- 이벤트 기반 아키텍처를 적용하여 콜 스택에 쌓인 작업을 다른 곳에서 처리하도록 한다.
- 다음은 Node.js에서 동시 요청을 처리하는 방법이다.
- 자바스크립트 코드는 V8의 콜 스택에 쌓이고 I/O 처리가 필요한 코드는 이벤트 루프로 보내게 된다.
- 이벤트 루프에서는 루프를 실행하면서 운영체제 또는 스레드 워커에 I/O 처리를 맡긴다.
- 스레드 워커와 운영체제는 받은 요청에 대한 결과를 이벤트 루프로 돌려 준다.
- 이벤트 루프에서는 결과값에 대한 코드를 콜 스택에 다시 추가한다.
이벤트 루프
- 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
- HTML
- 미들웨어
- Servlet
- script element
- 서블릿
- JSP
- html css
- CSS 속성
- CSS
- Session
- 세션
- 제이쿼리
- FMT
- 스프링
- Spring
- 서브넷팅
- Network
- Binding
- 네트워크
- httpServletRequest
- Redux
- 내장객체
- 리액트
- javaserverpage
- Java Server Page
- nodejs
- Cookie
- a 태그
- react
- el
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |