앞선 내용에서, 자바스크립트와 노드의 이벤트 관련 원리들에 대해서 기본적인 설명을 진행했습니다. 이번 아티클을 읽기 위한 사전 지식이니 혹시라도 기억이 나지 않는다면 다시 한번 살펴보고 오시기 바랍니다.
이번에는 흔히 사용하는 함수 setTimeout(function, time)을 이용해서 좀 더 심층적으로 자바스크립트와 노드의 이벤트 처리 원리에 대해서 살펴보도록 하겠습니다.
아래의 예제 코드를 보고 한번 결과를 예측해 보도록 하겠습니다.
function run(){
console.log("3초가 지나고 실행되는 함수입니다.");
}
console.log("시작합니다.");
setTimeout(run, 3000);
console.log("끝입니다.");
/* 출력
시작합니다.
끝입니다.
3초가 지나고 실행되는 함수입니다.
*/
자, 지금까지 살펴본 내용으로는 이 부분을 정확히 설명하기 어렵습니다. 당연하죠. 안 배웠으니까요(;;). 특히, 어디서 이해가 안 되는지 정확히 짚어본다면 바로 콜백 함수 run이 호출스택에 언제 들어가는지 여부를 알 수가 없는 부분입니다.
이를 setTimeout의 동작 원리와 함께 살펴보기 위해서는 우선 몇 가지 기본 개념을 익혀둬야 합니다.
· 이벤트 루프 : 이벤트가 발생했을 때 호출할 콜백 함수를 관리하고, 이렇게 호출된 콜백 함수의 실행 순서를 결정하는 역할을 담당합니다(노드 종료 시까지 이벤트 처리를 반복해서 루프라는 단어를 사용합니다)
· 백그라운드 : setTimeout같은 타이머나 이벤트 리스너들이 대기하는 곳입니다. 자바스크립트가 아닌 다른 언어로 작성된 프로그램으로 취급해도 되며, 여러 개의 작업이 동시에 실행될 수 있습니다.
· 태스크 큐 : 이벤트가 일단 발생하면, 백그라운드는 해당되는 이벤트 리스너 혹은 타이머에서 정의한 콜백 함수를 이 태스크 큐로 보내게 됩니다. 콜백 함수들의 queue이므로 콜백 큐라고 하기도 하죠. 완료된 순서로 보통 줄을 서며, 특별한 경우에 순서가 바뀔 수는 있습니다.
다소 헷갈릴 수 있겠지만, 순서대로 코드 작동 방식을 나열해 보겠습니다.
(1) 호출 스택에 전역 컨텍스트 anonymous, 그리고 setTimeout이 들어갑니다.
(2) 그럼 우리가 배웠던 대로 반대 순서로 함수가 실행됩니다. setTimeout이 가장 먼저 실행되겠죠? setTimeout이 실행됨과 동시에 콜백 함수인 run을 위에서 언급한 백그라운드로 보내버립니다. 그리고 setTimeout은 호출 스택에서 제거됩니다.
(3) anonymous가 호출 스택에서 빠집니다. 이제 호출 스택은 빈 상태가 되었습니다.
(4) 백그라운드에서는 3초가 지난 후, run을 태스크 큐로 보냅니다.
(5) 태스크 큐로 보내진 run은 이벤트 루프가 빈 호출 스택으로 보내버립니다. 호출 스택이 비어 있으면, 이벤트 루프는 태스크 큐에서 하나씩 함수를 가져와 호출 스택에 넣고 실행합니다. 참고로 이벤트 루프가 태스크 큐의 콜백 함수를 호출 스택으로 보내는 규칙은 별도로 정의되어 있습니다.
(6) run이 실행되고, 실행 완료 후 호출 스택에서 제거됩니다. 그리고 이벤트 루프는 계속 대기하며 태스크 큐에 콜백 함수가 들어오기를 기다립니다.
* 만일 호출 스택에 함수가 너무 많이 있다면 3초가 지나도 run이 실행 안될 수도 있습니다. 말했듯이, 이벤트 루프는 호출 스택이 비어 있어야만 태스크 큐에 들어있는 run을 호출 스택으로 가져오기 때문이죠. setTimeout의 시간에 오차가 발생하는 이유입니다.
'Programming > Node.js' 카테고리의 다른 글
1. Node.js 핵심 개념 이해 (5) - 서버로서의 노드 (2) | 2024.01.23 |
---|---|
1. Node.js 핵심 개념 이해 (4) - Single Thread (0) | 2024.01.20 |
1. Node.js 핵심 개념 이해 (3) - Non Blocking I/O (0) | 2024.01.17 |
1. Node.js 핵심 개념 이해 (2) - Event Driven, Context [1/2] (1) | 2024.01.14 |
1. Node.js 핵심 개념 이해 (1) - 서버, 런타임 (1) | 2024.01.13 |