노드는 크롬 v8 자바스크립트 엔진으로 빌드된 자바스크립트 런타임이다. 즉, 노드는 자바스크립트를 컴퓨터에서 실행할 수 있게 만들어주는 자바스크립트 실행기이다.
*런타임 : 프로그램 언어가 구동되는 환경
이벤트기반
논블로킹 I/O 모델
싱글스레드
노드는 이 세 단어 때문에 노드는 가볍고 효율적이라고 한다. 각 단어의 뜻을 알아보자.
이벤트가 발생하면 이벤트 리스너에 등록해둔 콜백함수를 호출하고, 발생한 이벤트를 다 처리하면 다음 이벤트가 발생할때까지 대기하는 일련의 과정을 이벤트기반이라고 한다.
여러 이벤트가 동시에 발생했을 때 어떤 순서로 콜백 함수를 호출할지는 이벤트 루프
가 판단한다.
(중요) 노드는 자바스크립트 코드에서 맨 위부터 한 줄씩 실행
즉, 노드가 함수 호출을 받아 함수들을 호출 스택에 쌓고
맨 위에 있는 코드부터 실행을 시킨다.
이벤트 루프 : 이벤트가 발생할때 호출할 콜백 함수들을 관리하고, 그 콜백 함수의 실행 순서를 결정. 노드가 종료될 때까지 이벤트 처리를 위한 작업을 반복하므로 루프라고 부른다.
테스트 큐 : 이벤트 발생 후 호출되어야할 콜백 함수들이 기다리는 공간.
백그라운드 : 타이머와 같은 이벤트 리스너들이 기다리는 공간.
예시로 설명을 해보자. 2초 뒤에 알럿창을 띄우는 코드는 어떻게 동작할까?
1. 우선 호출 스택에 setTimeout 함수가 들어온다.
2. 타이머 함수이므로 백그라운드로 넘어간다.
3. 2초 후 백그라운드에서 테스크 큐로 들어간다
4. 호출 스택 실행이 끝났기 때문에 이벤트 루프가 테스크 큐의 콜백 함수를 호출 스택으로 올린다.
5. setTimeout 함수가 호출 스택에서 실행되고 호출스택에서 비워진다.
작업이 완료될 때까지 멈추지 않고 다음 작업을 수행하는 것을 의미한다.
동기, 비동기 방식에서 비동기 방식과 유사하다고 이해하면 되겠다.
위 예시를 덧붙여 설명해보자.
console.log('시작')
2초 뒤에 실행되는 setTimeout 함수
console.log('다음 작업')
이 경우 블로킹 방식이라면 콘솔창에 시작 -> 2초 함수 실행 후 -> 다음 작업 순서로 진행되지만 논블로킹 방식이라면 콘솔창에 시작 -> 다음 작업 -> 2초 함수 실행 으로 진행된다.
즉, 오래 걸리는 작업을 기다려주지 않고 다음 호출 스택이 먼저 실행되기 때문에 블로킹 방식보다 더 짧은 시간에 작업을 처리할 수 있다.
컴퓨터가 작업을 처리할 수 있는 일손.
노드는 싱글 스레드이기 때문에 주어진 작업을 혼자 처리해야 한다.
혼자서 많은 요청을 처리해야 하기 때문에 요청이 들어온 순서대로 요청 완료 후 다음 요청을 실행시키지 않고,
조금 더 효율적으로 아까 말한 논블로킹 방식을 이용해 우선 요청을 전부 받고 완료된 순서대로 실행
시킨다.
멀티 스레드를 사용하면 보다 많은 일손이 생기는 것이므로 더 빠르고 효율적인 작업이 가능하지만 컴퓨터 자원이 그만큼 많이 발생된다.
노드의 장점
노드의 단점