Node.js란?
Chrome V8 Javascript 엔진으로 빌드된 Javascript 런타임
서버
요청(request)을 보내는 측은 클라이언트이고, 요청에 응답(response)을 하는 측은 서버입니다.
웹이나 앱을 사용할 때 우리의 개인적인 데이터(이메일, 아이디 등)와 서비스의 데이터가 생성되고, 그 데이터는 서버에 저장됩니다.
사용자가 어떤 요청(request)을 하면 서버 어딘가에 저장돼있는 요청 데이터를 응답(response) 해주는 역할을 합니다.
런타임
런타임은 특정 언어로 만든 프로그램을 실행할 수 있는 환경을 말합니다.
노드는 위의 설명과 같이 Chrome V8 Javascript 엔진으로 빌드된 Javascript 런타임입니다. 즉 Javascript를 실행할 수 있는 환경입니다.
자바스크립트 코드로 짜면 노드가 알아서 V8과 libuv라는 라이브러리에 연결해줍니다. (참고로 libuv와 V8은 C와 C++로 구현돼있습니다.)
V8은 크롬에 내장돼있는 매우 빠른 자바스크립트 엔진이고 libuv는 이벤트 기반(Event Driven), 논 블로킹 I/O(Non-Bloking I/O) 모델을 구현하고 있는 라이브러리입니다.
노드의 특징🧚♀️
- 이벤트 기반(Event Driven)
- 논 블로킹 I/O(Non-Bloking I/O)
- 싱글 스레드(Single Thread)
이벤트 기반(Event Driven)
이벤트 리스너에 특정 이벤트가 있을 경우에 실행할 콜백 함수를 설정하고, 특정 이벤트가 발생하면 그 콜백 함수를 실행한합니다.
- 이벤트 루프는 이벤트가 발생시 호출할 콜백함수를 관리하고, 호출된 콜백함수의 실행 순서를 결정해주는 역할을 한다. 노드가 끝나기 전까지 이벤트가 발생하는지 계속 확인하고 처리하기 때문에 이벤트 루프라고 한다.
- 백그라운드는 setTimeOut()과 같은 타이머나 이벤트 리스너들이 대기하는 곳이다.
- 태스크 큐는 백그라운드에서 이벤트 리스너나 타이머의 콜백 함수들을 넘겨주면 순서대로 줄을 서 있게 된다. 특정한 경우에는 순서가 바뀌기도 한다.
function run(){
console.log("hi")
}
setTimeout(run, 3000);
만약에 위와 같은 코드를 실행하면 호출 스택에 anonymouse라는 처음 실행 시 생기는 가상의 전역 컨텍스트가 들어가 있고 위의 setTimeout 함수가 호출 스택에 들어갑니다. setTimeout 함수가 먼저 실행되어 run 콜백함수가 백그라운드로 넘어가고, anonymouse가 실행이 됩니다.

처음에 실행된 setTimeout 의 run 콜백함수는 백그라운드에서 3000밀리초(3초)간 대기하고 있습니다. 3초가 지나면 태스크 큐에 run 콜백함수가 들어갑니다.
그리고 호출 스택이 비어 있으면 이벤트 루프에서 태스크 큐에 있던 run 콜백함수를 호출스택에 넣습니다. 그리고 run 콜백함수를 실행하게 됩니다.

논 블로킹 I/O(Non-Bloking)
논 블로킹(Non-Bloking): 이전 작업이 끝나지 않아도 대기하지 않고 다음 작업을 수행함.
블로킹(Bloking): 이전 작업이 끝날때까지 대기한 다음 작업을 수행함.
자바스크립트상에서 실행되지 않는 I/O 작업은 동시에 처리할 수 있습니다. I/O작업을 백그라운드에 넘겨 동시에 처리할 수 있습니다.(논 블로킹)
setTimeout(콜백함수, 0)는 코드를 논 블로킹으로 만들기 위해 사용하는 방법 중 하나입니다. 코드를 논 블로킹했다고 동시성이 보장되지는 않고, 동시 처리가 가능한 작업을 논 블로킹 처리했을 때 동시성을 얻을 수 있습니다.
동시에 처리가 가능한 I/O 작업은 논 블로킹 처리하여 동시성을 얻을 수 있습니다.
싱글 스레드(Single Thread)
노드에서 우리가 직접 제어할 수 있는 스레드는 하나뿐입니다. 하지만 스레드풀(Thread Pool)에서는 노드가 특정 동작을 수행할 때 스스로 멀티 스레드를 사용하며 노드 12 버전에서 안정화된 기능인 워커 스레드(Worker Thread) 덕분에 멀티 스레드를 사용할 수 있습니다. 워커 스레드(Worker Thread)는 CPU작업이 많은 경우에 사용됩니다.
노드가 채택하고 있는 싱글 스레드 방식은 스레드 하나가 논 블로킹(Non-Bloking) 모델로 여러 요청이 들어왔을때 차례대로 요청을 받고, 요청에 따른 작업을 수행시키며 완료된 순서대로 결과를 내는 것입니다.
그런데 하나의 스레드가 멈추거나 CPU를 많이 쓰는 작업이라서 시간이 오래 걸린다면 많은 요청이 버거울 수 있습니다. 그러한 작업에는 멀티 스레딩(Multi-threading) 또는 멀티 프로세싱(Multi-processing) 방식이 사용됩니다.
CPU 작업이 많을 때는 멀티 스레딩(Multi-threading)을, I/O 요청이 많을 때는 멀티 프로세싱(Multi-processing)이 더 효율적입니다.
'nodejs 교과서' 카테고리의 다른 글
노드 장단점 (0) | 2022.07.04 |
---|