-
Node.js 를 시작하기 전에Node.js 2020. 4. 12. 23:56
기본적으로 Node.js 에 대해 알아보자.
다음은 공식 사이트에 게시된 노드 소개글이다.
Node.js는 크롬 V8 자바스크립트 엔진으로 빌드된 자바스크립트 런타임입니다.
Node.js는 이벤트 기반 , 논블로킹 I/O 모델을 사용해 가볍고 효율적입니다.
Node.js의 패키지 생태계인 npm은 세계에서 가장 큰 오픈 소스 라이브러리 생태계이기도 합니다.
런타임은 특정 언어로 만든 프로그램을 실행할 수 있는 환경을 말하는데,
노드는 자바스크립트를 컴퓨터에서 실행할 수 있게 해준다.
예전에는 자바스크립트의 속도 때문에 브라우저에서만 실행할 수 있었지만
구글이 V8 엔진을 사용하여 크롬을 출시하자 속도문제가 해결되어
지금의 노드가 탄생했다.
노드는 V8과 더불어 libuv라는 라이브러리를 사용한다.
libuv는 노드의 특성인 이벤트 기반 , 논블로킹 I/O 모델을 사용한다.
그럼 이제 이벤트 기반에 대해 알아보자.
이벤트 기반은 이벤트가 발생하였을 때에 미리 지정해둔 동작을 수행하게 만들어 놓은것이다.
미리 지정해둔 동작을 이벤트 리스너에 등록해놓고 이벤트가 발생되기까지
이벤트 리스너에서는 기다린다. 그리고 이벤트가 발생하면 함수를 호출하여 내보내는 방식이다.
여기서 이벤트 루프라는 개념이 생기는데,
여러 이벤트가 동시에 발생했을 때 어떤 순서로 함수를 호출할지를 이벤트 루프가 판단한다.
이벤트 루프를 간단하게 설명하기 위해 아래의 코드를 보고 결과를 예측해보자.
function first() {
second();console.log('첫 번째')
}
function first() {
third();console.log('두 번째')
}
function first() {
console.log('세 번째')
}
결과는 세 번째 , 두 번째 , 첫 번째 순으로 콘솔에 찍히게 된다.
왜냐하면 함수가 스택 영역에 저장되어 이런 형태로 실행되기 때문이다.
third() second() first() main() 쌓이는 순서는 main() -> first() -> second() -> third()
실행하는 순서는 반대로 실행된다.
애초에 스택 영역은 선입후출이라 먼저 쌓이는것이 제일 밑으로 내려가기 때문이다.
여기서의 main 함수는 처음 실행 시의 전역 컨텍스트를 의미하는데,
컨텍스트는 함수가 호출 되었을 때 생성하는 환경을 의미한다.
자바스크립트는 기본적으로 전역 컨텍스트 안에서 돌아간다고 생각하면 쉽다.
이번에는 특정 밀리초(1000분의 1초) 이후의 코드를 실행하는 setTimeout을 사용하여
로그를 예상해보자.
function run() {
console.log('3초 후 실행');}
console.log('시작');
setTimeout(run,3000);
console.log('끝');
결과는 사실 예측이 쉽다.
시작 -> 끝 -> 3초후 실행
이런식이 되는데 호출 스택으로 설명하기는 어렵다.
setTimeout 함수의 콜백인 run이 호출 스택에 언제 들어가는지 알기가 어렵기 떄문이다.
이를 파악하려면 이벤트 루프, 태스크 큐 , 백그라운드를 알아야 한다.
- 이벤트 루프 : 이벤트 발생 시 호출할 콜백 함수들을 관리하고 , 호출된 콜백 함수의 실행 순서를 결정하는 역할을 담당한다.노드가 종료될 때 까지 이벤트 처리를 위한 작업을 반복하므로 루프라고 불린다.
- 테스크 큐: 이벤트 발생 후 호출되어야 할 콜백 함수들이 기다리는 공간이다. 콜백들이 이벤트 루프가 정한 순서대로 줄을 서있으므로 콜백 큐라고도 불린다.
- 백그라운드: 타이머나 I/O 작업 또는 이벤트 리스너들이 대기하는 곳이다.
- 이벤트 루프 1
호출 스택 setTimeout() main() 백그라운드 타이머 run 3초 run 태스크 큐 1. 호출 스택에 쌓임 (이벤트 루프 발생)
2.setTimeout() 실행 시 콜백함수 run은 백그라운드로
3.백그라운드에서 3초 후에 태스크 큐로 보내서 함수를 호출한다.