Node.js는 Chrome V8 Javascript 엔진으로 빌드된 자바스크립트 런타임이다.
공식 사이트의 노드 소개 글에는 서버라는 말이 없으니 당황스러울 수 있다. 서버라는 말이 없는 이유는 노드가 서버만 실행할 수 있는 것은 아니기 때문이다.
Server는 네트워크를 통해 클라이언트에 정보나 서비스를 제공하는 컴퓨터 또는 프로그램을 말한다.
Client는 요청을 보내는 주체로 브라우저
, 데스크톱 프로그램
, 모바일 앱
, 또 다른 서버
이다.
서버는 클라이언트의 요청에 대해 응답을 한다. 응답으로 항상 YES를 해야 하는 것은 아니고, No를 할 수 있다. 어떤 사이트로부터 차단당한다면 그 사이트의 서버는 클라이언트의 요청에 매번 No를 응답할 것이다.
노드는 자바스크립트 프로그램이 서버로서 기능하기 위한 도구를 제공하므로 서버 역할을 수행할 수 있다. 왜 다른 언어를 사용하지 않고 굳이 노드를 사용해 서버를 만들까? 이 궁금증을 해결하려면 먼저 노드의 특성을 알아야 한다. 공식 웹 사이트에 게시돠ㅣㄴ 노드 소개 글을 바탕으로 노드의 특성을 알아 보고자 한다.
런타임
: 특정 언어로 만든 프로그램들을 실행할 수 있는 환경
노드 = 자바스크립트 실행기
2008년 구글이 V8 엔진을 사용해 크롬을 출시하자 그동안 실행 속도 문제로 큰 호응을 받지 못한 자바스크립트의 속도 문제가 해결 되었다.
노드는 V8과 더불어 libuv라는 라이브러리를 사용한다.
libuv 라이브러리는 노드의 특성인 이벤트 기반, 논블로킹 I/O 모델을 구현하고 있다.
이벤트 기반이란 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식을 의미한다.
=> click
이나 네트워크 요청
이 있다.
이벤트 기반 시스템에서는 특정 이벤트가 발생할 때 무엇을 할지 미리 등록해야 한다.
=> 이벤트리스너
에 콜백함수
를 등록한다고 표현
이벤트 기반 모델에서는 이벤트 루프
가 여러 이벤트가 동시에 발생했을 때 어떤 순서로 콜백 함수를 호출할지를 판단한다.
노드는 자바스크립트 코드의 맨 위부터 한 줄 씩 실행한다
function first() {
second();
console.log("1번");
}
function second() {
third();
console.log("2번");
}
function third() {
console.log("3번");
}
first();
3번
2번
1번
그림에서 anonymous
함수는 처음 실행 시의 전역 콘텍스트
를 의미한다.
function run() {
console.log("3초 후 실행")
}
console.log("시작");
setTimeout(run, 3000);
console.log("끝");
시작
끝
3초 후 실행
콘솔 결과는 쉽게 예측할 수 있지만 호출 스택으로 설명하기는 어렵다.
이벤트 루프
: 이벤트 발생 시 호출할 콜백 함수들을 관리하고, 호출된 콜백 함수의 실행 순서를 결정하는 역할을 담당한다. 노드가 종료될 때까지 이벤트 처리를 위한 작업을 반복하므로 루프라고 한다.
백그라운드
:setTimeout
같은 타이머나 이벤트 리스너들이 대기하는 곳이다. 자바스크립트가 아닌 다른 언어로 작성된 프로그램이라고 봐도 무방하며, 여러 작업이 동시에 실행될 수 있다.
테스크 큐
: 이벤트 발생 후, 백그라운드에서는 테스크 큐로 타이머나 이벤트 리스너의 콜백함수를 보낸다. 정해진 순서대로 콜백들이 줄을 서 있으므로 콜백 큐라고도 한다. 콜백들은 보통 완료된 순서대로 줄을 서 있지만 특정한 경우 순서가 바뀌기도 한다.
만약 호출 스택에 함수가 너무 많이 들어 있으면 3초가 지난 후에도 run 함수가 실행되지 않을 수 있다. 이벤트 루프
는 호출 스택이 비어 있을 때만 테스크 큐에 있는 run 함수를 호출 스택으로 가져오기 때문이다. 이것이 setTimeout의 시간이 정확하지 않을 수 있다는 이유이다.
이해가 잘 되는구먼유