Node.js란?
Node.js는 V8으로 빌드된 이벤트 기반 자바스크립트 런타임이다
논블로킹(Non-blocking) I/O와 단일 스레드 이벤트 루프를 통한 높은 처리 성능을 가지고 있다.
V8이란?
V8이란 CC+로 작성된 Google의 오픈 소스 Javascript, WebAssembly 엔진이다.
V8은 Javascript 소스 코드를 컴파일 및 실행하고, 객체에 대한 메모리 할당을 처리하며, 사용되지 않는 객체를 가비지 수집한다.
ECMA표준에 지정된 모든 데이터 유형, 연산자 객체 및 기능을 제공한다.
Node.js의 특징
JavaScript는 웹을 구성하는 가장 큰 언어 중 하나이다.
그 어떤 언어도 Javascript를 제외하고는 웹 페이지를 만들어 낼 수 없을 만큼 빼놓을 수 없는 언어 중 하나인데.
한 가지 단점이 있다. 웹 페이지를 JavasSript로 구현하고나면 사용자의 요청을 받아서 처리하는 부분을
서버 사이드 언어인 JAVA, PHP, Ruby 등 다른 언어를 사용하여 개발해야 한다는 점이다.
이러한 문제점을 해결하기 위해 나온 것이 Node.js이며, Node.js는 아래와 같은 특징을 가진다.
내장 HTTP 서버 라이브러리 가지고 있다.
•
http는 Node.js의 내장 라이브러리로 별도로 설치 할 필요가 없다. 이 라이브러리를 이용해 서버를 간단히 구현 할 수 있다.
const http = require('http');
const app = http.createServer( (req, res) => {
if (req.url === '/') return res.end('main')
if (req.url === '/login) return res.end('login)
})
const port = 3000;
app.listen( port, () => {
console.log(`server start on port ${port}`);
})
Plain Text
복사
npm(Node Package Manager)
가장 큰 오픈소스 라이브러리 저장소로 Node.js 선택하는 큰 이유 중 하나로 뽑을 수 있다.
Node.js에서 사용 할 수 있는 모듈들을 패키지화하여 저장소 역할을 하며 패키지 설치 및 관리를 위한 CLI을 제공한다.
package.json을 제공하며 많은 패키지를 사용하고 버전도 빈번하게 업데이트 되는 Node.js 프로젝트의 패키지를 일괄 관리 할 수 있게 해준다.
싱글스레드 논블로킹 모델
Node.js는 기본적으로 싱글스레드이다. Javsciprt를 실행하는 스레드가 단 하나이기 때문이다.
Node.js는 싱글스레드 논블로킹 모델로 구성되어 있고, 하나의 스레드로 동작하지만 비동기 I/O 작업을 통해 요청들을 서로 블로킹하지 않으며, 동시에 여러 요청들을 비동기로 수행함으로서 논블로킹이 가능하게 된다. 또한 클러스터링을 통해 프로세스를 포크하여 멀티스레드인 것 처럼 사용될 수 있고. 트래픽에 따라 프로세스를 포크할 수 있으므로 서버의 확장성이 용이하다는 장점을 가진다.
하지만 Node.js가 완전하게 싱글스레드로만 동작하지는 않으며 일부 블로킹 작업들 libuv의 스레드 풀에서 수행되기 때문이다.
이벤트 기반(Event-driven)
이벤트 기반이란 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식을 의미하며, 이벤트 리스너에 등록해둔 콜백함수를 실행방식으로 동작한다. 이러한 콜백함수들을 관리하는 것이 바로 이벤트 루프인데, 이벤트 루프를 알아보기 전에 Node.js의 내부 동작에 대해 알아보자.
Node.js를 크게 나누면 내장 라이브러리, V8엔진, 그리고 libuv로 구성되어 있다.
이 중 Node.js의 특성인 이벤트 기반, 논블로킹 I/O 모델은 libuv 라이브러리에서 구현된다.
Node.js에서 작성하는 모든 코드는 콜백함수로 이루어져 있고, libuv 내에 이벤트 루프에서 관리되고 처리된다.
이벤트 루프는 여러 개의 페이즈를 가지고, 각각의 큐를 가진다. 라운드(round-robin) 방식으로 노드 프로세스가 종료될 때까지 일정 규칙에 따라 페이를 계속 순회하면서 관리하고, FIFO순서로 콜백함수들을 처리한다.
Node.js가 어울리는 서비스
간단한 로직의 많은 요청 값을 가지는 서비스 = 채팅 서비스, 네트워크 스트리밍 등의 작은 서비스, 프로토 타이핑 류
Node.js가 어울리지 않는 서비스
싱글 쓰레드이기 때문에 단일 처리가 오래 걸리는 경우
로직 복잡도가 높은 경우, 에러로 인해 서버 장애로 이어질 수 있다.