Dev/Nodejs
Node.js 와 이벤트 루프
싯벨트
2024. 4. 3. 00:02
728x90
노드의 정의
Node.js 는 Chrome v8 자바스크립트 엔진으로 빌드된 자바스크립트 런타임이라고 정의됩니다.
이때 런타임이란 특정 언어의 실행기로, 특정 언어로 만든 프로그램들을 실행할 수 있는 환경입니다.
노드의 기반이 되는 라이브러리는 V8과 libuv이며, 이벤트루프는 libuv의 특징 중 하나인 이벤트 기반과 연결됩니다.
이벤트 기반
이벤트 기반이란 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식을 말합니다.
발생한 이벤트를 처리해서 이벤트가 없는 상황에서는 다음 이벤트 발생까지 대기하고, 새롭게 발생한 이벤트를 처리합니다.
이벤트 루프
실행될 이벤트, 즉 콜백함수들을 어떤 순서로 호출할지 관리하는 개념입니다.
호출스택(call stack)에 실행할 함수의 실행컨텍스트를 쌓습니다.
코드를 순차적으로 진행하되, 콜백함수는 백그라운드라고 불리는 Node API (브라우저에서는 Web API)에 넘기고 완료되면 태스크 큐에 쌓입니다. 태스크큐에서 대기하는 콜백함수는 콜스택에서 맨아래 위치한 전역 컨텍스트(global context)까지 사라진 뒤 콜스택으로 옮겨진 뒤 실행됩니다.
이때, 태스크큐는 두 가지 종류가 있으며 높은 우선순위를 갖는 큐를 마이크로태스크큐라고 하여 이벤트루프가 우선적으로 큐를 확인하여 콜스택으로 가져옵니다. 마이크로 태스크큐에 쌓이는 이벤트에는 대표적으로 promise.then과 process.nextTick 이 있습니다.
참조문서
- <노드교과서> 1.1.2 자바스크립트 런타임 ~ 1.1.3 이벤트 기반
- 이벤트 루프 설명을 잘 풀어쓴 글
- 콜스택에 쌓이는 콜백함수를 표현할 때 anonymous라고 전역 컨텍스트를 표현했기에 이벤트루프가 태스크큐를 가져오기 전에 콜스택이 완전히 비는 상황을 온전하게 살펴볼 수 있음
- 맨 처음 코드의 실행은 전역컨텍스트를 포함하지만 이벤트 루프에서 불러온 콜백들을 수행할 땐 전역 컨텍스트가 없이 함수 컨텍스트만 콜스택에 쌓여서 실행되기를 반복함.
- 코드 실행에 따른 이벤트루프의 동작을 이해할 수 있는 영상
- 이벤트 루프가 어떻게 동작하는지 코드로 직접 테스트해볼 수 있는 사이트
- 위의 영상에서 활용함