Node.js는 크롬 V8 자바스크립트 엔진으로 빌드된 자바스크립트 런타임이다.
한마디로 자바스크립트로 만들어진 프로그램을 구동시켜주는 환경이다.
Node.js는 이벤트 기반, 논 블록킹 I/O 모델을 사용해 가볍고 효율적이다. 또한 패키지 매니저인 npm은 오픈소스 라이브러리이다.
Node.js는 기본적으로 싱글 스레드의 논 블로킹 I/O 방식이다.
한번에 여러가지 일을 받아서 진행하며, 그 처리 결과가 나오는 순서에 따라 출력해준다고 생각 할 수 있다.
Node.js는 우리의 코드를 코어 라이브러리를 통해 모듈로 구동하며, 해당 내용을 V8 엔진과 libuv를 통해 처리한다.
V8엔진은 JS & C++로 구현되어 있으며, libuv는 C / C++로 구성되어 있다.
V8엔진은 자바스크립트를 구동하는데 역할을 하며, libuv를 통해 이벤트 기반 및 논 블록킹 I/O 모델을 구현하고 있다.
이벤트 기반에서 가장 중요시 되는 것은 이벤트 루프이다.
이벤트 루프가 콜백의 호출 순서를 정하고, 작업을 진행한다.
이벤트 루프 : 이벤트 발생 시 호출할 콜백 함수들을 관리하고, 호출된 콜백 함수의 실행 순서를 결정하는 역할을 담당한다.
노드가 종료될 때까지 이벤트 처리를 위한 작업을 반복하므로 루프라고 불린다.
태스크 큐: 이벤트 발생 후 호출되어야 할 콜백 함수들이 기다리는 공간. 콜백들이 이벤트 루프가 정한 순서대로 줄을 서있으므로 콜백 큐라고도 부른다.
백그라운드: 타이머나 I/O 작업 콜백 또는 이벤트 리스너들이 대기하는 곳이다.
기본적으로 브라우저 상에서 자바스크립크가 동작하는 방식과 똑같다.
1) 이벤트 루프를 통해 함수를 호출 스택에 쌓는다.
2) 호출된 함수를 백그라운드작업에 넘겨야 하는지 판단하여 실행하거나 백그라운드 작업으로 이관한다.
3) 백그라운드는 작업한 결과를 태스크큐에 저장한다.
4) 태스큐 큐에 저장된 콜백은 호출스택이 모두 비워진 상태에서만 실행된다.
멀티 스레드 방식에 비해 컴퓨터 자원을 적게 사용
I/O 작업이 많은 서버로 적합 (채팅)
멀티 스레드 방식보다 쉬움
웹서버가 내장되어 있음 (node.js library)
자바스크립트를 사용함 (사용이 쉬움)
JSON 형식과 호환이 쉬움
싱글 스레드라서 CPU 코어 하나만 사용함 (작업이 크면 타격이 큼)
CPU 작업이 많은 서버로는 부적합
하나뿐인 스레드가 멈추지 않도록 관리해야함 (죽으면 서버가 죽음)
서버 규모가 커졌을 때 서버를 관리하기 어려움
어중간한 성능