Node.js는 javascript 런타임
Node.js는 비동기 이벤트 주도 자바스크립트 런타임으로써 확장성 있는 네트워크 어플리케이션 만들 수 있도록 설계됨
싱글 스레드는 프로세스 내에서 하나의 스레드가 하나의 요청만을 수행합니다.
해당 요청이 수행 될때 다른 요청을 함께 할 수 없습니다. 이를 싱글스레드 블로킹 모델이라고 합니다. 진행되고 있는 요청이 예정되어 있는 요청을 블로킹하기 때문입니다.
멀티 스레드는 스레드 풀에서 실행의 요청만큼 스레드를 매칭하여 작업을 수행합니다. 멀티스레드가 단순히 좋아보이지만 큰 단점이 있습니다. 스레드 푸렝 스레드가 늘어날 수록 CPU 비용을 소모하고, 만약 요청이 적다면 놀고있는 스레드가 생깁니다.
Node.js는 싱글스레드 논블로킹 모델로 구성되어 있습니다. 하나의 스레드에 동작하지만, 비동기 I/O 작업을 통해서 요청들은 서로 블로킹하지 않습니다.
즉 동시에 많은 요청들은 비동기로 수행함으로써 싱글스레드일지라도 논블로킹이 가능합니다.
또한 Node.js는 클러스터링을 통해 프로세스를 포크(fork)하여 멀티 스레드인것 처럼 사용될 수 있습니다. 트래픽에 따라서 프로세스를 포크할 수 있으므로 서버의 확장성이 용이하다는 장점을 갖습니다.
Node는 완전히 싱글 스레드는 아닌게 일부 Blocking작업들이 libuv의 슬레드 풀에 수행됩니다. 대부부분은 싱글 스레드 입니다.
이벤트 기반이란 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식을 의미합니다.
이벤트 리스너에 등록해둔 콜백함수를 실행하는 방식으로 작동합니다.
이벤트 기반 모델에서는 이벤트 루프 개념을 뺴놓을 수 없습니다. 이벤트에 따라 호출되는 콜백함수를 관리하는 것이 바로 이벤트 루프입니다.