-주방에 비유(점원: 스레드, 주문: 요청, 서빙: 응답)
대신 논 블로킹 모델을 채택하여 일부 코드(I/O)를 백그라운드(다른 프로세스)에서 실행 가능
싱글 스레드 모델은 에러를 처리하지 못하는 경우 멈춤
멀티 스레드 모델은 에러 발생 시 새로운 스레드를 생성하여 극복
서버
: 네트워크를 통해 클라이언트에 정보나 서비스를제공하는 컴퓨터 또는 프로그램
클라이언트
: 요청을 보내는 주체로 브라우저 일 수도 있고, 데스크톱 프로그램일 수도 있고,
모바일 앱일 수도 있고, 다른 서버에 요청을 보내는 서버일 수도 있다.
런타임
: 특정 언어로 만든 프로그램들을 실행할 수 있는 환경을 뜻한다.
따라서 노드는 자바스크립트 프로그램을 컴퓨터에서 실행할 수 있다.
노드는 V8과 더불어 libuv라는 라이브러리를 사용한다. v8과 libuv는 c와 C++로 구현되어있다. 노드가 v8과 libuv에 연결해주므로, 노드를 사용할 때 v8과 libuv는 몰라도 된다.
이벤트 기반
: 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식을 의미합니다. 이벤트로는 클릭이나 네트워크 요청 등이 있을 수 있습니다.
이벤트 기반 시스템에서는 특정 이벤트가 발생할 때 무엇을 할지 미리 등록해둬야 합니다. 이를 이벤트 리스너(event listener)에 콜백(callback) 함수를 등록한다고 표현합니다.
버튼을 클릭할 때 경 고창을 띄우도록 설정하는 것을 예로 들어보겠습니다. 클릭 이벤트 리스너에 경고창을 띄우는
콜백 함수를 등록해두면 클릭 이벤트가 발생할 때마다 콜백 함수가 실행돼 경고창이 뜨는 것입니다.
노드는 자바스크립트 코드의 맨 위부터 한 줄씩 실행합니다. 함수 호출 부분을 발견했다면 호출한 함수를 호출 스택(call stack)에 넣습니다.
first 함수가 제일 먼저 호출되고, 그 안의 second 함수가 호출된 뒤, 마지막으로 third 함수가 호 출됩니다. 호출된 순서와는 반대로 실행이 완료됩니다. 따라서 콘솔에는 세 번째, 두 번째, 첫 번
째 순으로 찍히게 됩니다.
anonymous 함수는 처음 실행 시의 전역 콘텍스트(global context)를 의미합니다. 콘텍 스트는 함수가 호출되었을 때 생성되는 환경을 의미합니다. 자바스크립트 코드는 실행 시 기본적 으로 전역 콘텍스트 안에서 돌아간다고 생각하는 게 좋습니다. 함수는 실행되는 동안 호출 스택에 머물러 있다가 실행이 완료되면 호출 스택에서 지워집니다. third, second, first, anonymous 순으
로 지워지고, anonymous 콘텍스트까지 실행이 모두 완료되었다면 호출 스택은 비어 있게 됩니다.
이벤트 루프
: 이벤트 발생 시 호출할 콜백 함수들을 관리하고, 호출된 콜백 함수의 실행 순 서를 결정하는 역할을 담당합니다. 노드가 종료될 때까지 이벤트 처리를 위한 작업을 반복 하므로 루프(loop)라고 부릅니다.
백그라운드
: setTimeout 같은 타이머나 이벤트 리스너들이 대기하는 곳입니다. 자바스크립 트가 아닌 다른 언어로 작성된 프로그램이라고 봐도 무방하며, 여러 작업이 동시에 실행될 수 있습니다.
태스크 큐
: 이벤트 발생 후, 백그라운드에서는 태스크 큐로 타이머나 이벤트 리스너의 콜백 함수를 보냅니다. 정해진 순서대로 콜백들이 줄을 서 있으므로 콜백 큐라= 합니다. 콜백
들은 보통 완료된 순서대로 줄을 서 있지만, 특정한 경우 순서가 바뀌기도 합니다.
예제 코드에서 setTimeout이 호출될 때 콜백 함수 run은 백그라운드로
setTimeout과 anonymous가 실행 완료된 후 호출 스택이 완전히 비워지면, 이벤트 루프가 태스크 큐의 콜백을 호출 스택으로 올림