Node.js

Node.js

V8 엔진으로 빌드 된 JavaScript 런타임 환경(프로그래밍 언어가 구동되는 환경)
브라우저 이외의 환경에서도 동작할 수 있도록 엔진을 브라우저에서 독립시킴
비동기 I/O를 지원. 단일 스레드 이벤트 루프 기반으로 동작해 요청 처리 성능이 좋음

Single Thread 기반 비동기 방식

node는 정확히 이야기하면 싱글 스레드는 아니다. 노드도 여러개의 스레드를 가지고 있으나 자바스크립트를 실행하는 스레드는 단 하나이므로 노드를 싱글 스레드라고 한다. 그 싱글 스레드가 바로 이벤트 루프.
노드는 이벤트 기반의 플랫폼이므로 이벤트가 발생할 때 미리 지정해둔 작업을 수행한다.
노드는 v8이라는 자바스크립트 엔진과 비동기 작업을 처리하는 libuv 라이브러리로 이루어져 있음.
자바스크립트 엔진은 콜 스택에 쌓인 실행 컨텍스트에 따라 위에서부터 차례로 실행이 일어남
→ 비동기 처리를 할 수 없음. 따라서 비동기 처리를 위해서는 Node API를 통해 libuv 라이브러리에서 제공하는 비동기 처리를 진행한다.
libuv의 이벤트 루프는 자바스크립트 엔진으로부터 비동기 작업을 넘겨받아 OS의 비동기 interface에 넘겨주거나 스레드 풀에 할당함. 이후 할당한 작업이 끝나면 태스크 큐에 콜백함수를 전달한 후 콜스택이 비게될 경우 차례로 콜스택으로 다시 넘겨 실행한다.
싱글스레드 논블록킹 모델로 프로세스 내에서 하나의 스레드가 하나의 요청만을 수행하지만 비동기 I/O 작업을 통해 동시에 많은 요청을 비동기로 수행(이전 작업이 완료될 때까지 대기하지 않고 다음 작업 수행)으로써 싱글스레드일지라도 논블로킹이 가능합니다.
한순간 하나의 작업만 처리하지만 비동기 동작하기 때문에 단일 쓰레드임에도 불구하고 동시에 많은 작업 처리 가능
동시에 요청이 오더라도 처리가 완료될 때까지 기다리지 않아 서버 부하가 적음
이벤트 루프 기반 비동기방식? 하나의 쓰레드가 요청을 받으면 바로 다음 처리에 요청을 보내놓고 다른 작업을 처리하다가 먼저 요청한 작업이 끝나면 이벤트를 받아 응답을 보냄

JavaScript와 NodeJS는 어떻게 다를까?

JavaScript는 프로그래밍 언어.
node는 자바스크립트를 구동할 수 있는 런타임이다.
이전에는 자바스크립트 런타임이 브라우저 밖에 존재하지 않아 웹 브라우저가 없으면 사용할 수 없어 클라이언트 개발 용도로만 국한되었음. JS 런타임을 desktop app으로 추출하여 브라우저 밖에서 자바스크립트를 다양한 용도로 사용할 수 있게 되었음.

브라우저 vs NodeJS

브라우저

HTML, CSS, 자바스크립트를 실행해 웹페이지를 브라우저 화면에 렌더링하는 것이 목적
DOM API 기본 제공
파일 시스템
클라이언트 사이드 Web API 지원 (DOM, BOM, Canvas, XMLHttpRequest, fetch, )

NodeJS

브라우저 외부에서 자바스크립트 실행환경을 제공하는 것이 목적
DOM API
파일 시스템 기본 제공
ECMAScript, NodeJS 고유의 API 지원

node.js의 강점

한순간 하나의 작업만 처리하지만 비동기 동작하기 때문에 단일 쓰레드임에도 불구하고 동시에 많은 작업 처리 가능
동시에 요청이 오더라도 처리가 완료될 때까지 기다리지 않아 서버 부하가 적음
eventloop 기반 비동기 방식
빠른 실행
프로세스가 종료되도 1~2초면 프로세스를 다시 실행시킬 수 있음
offloading
저수준의 오래 걸리는 일은 Node에게, 고수준의 로직 (비지니스 모델)은 메인 스레드에서 처리
→ node가 빠른 속도와 매우 높은 확장성을 갖는 근본적인 이유!
하지만 저수준 처리는 node가 빠르게 처리하기 어려움. javascript는 인터프리터 언어로 저수준 처리는 기계어 수준으로 컴파일하는 컴파일러 언어인 C언어나 WebAssembly가 빠르다.
따라서 Node.js에서는 C와 WebAssembly 모듈을 바인딩하여 사용하는 방법을 제공
오픈소스 생태계가 방대함
npm을 통해 다양한 모듈 사용 가능
한 가지 언어로 서버-클라이언트 모두 개발 가능

Node.js로 개발하면 좋은 웹서비스

간단한 로직을 가진 웹서비스
대용량 (동시에 여러 요청을 처리)
빠른 응답시간을 요구
빠른 개발 요구
비동기 방식에 어울리는 서비스 (네트워크 스트리밍, 채팅)

어울리지 않는 웹서비스

단일 처리가 오래 걸리는 경우 : 싱글 쓰레드이기 때문
서버 체크로직이 많은 경우 : 비동기방식이기 때문에 CallBack Hell에 빠지지 않기 위해
업무 복잡도/난이도가 높은 경우 : 에러가 나면 서버가 죽기 때문에 코드 품질 중요

Reference