-
이벤트 루프란?Web/Node.js 2019. 9. 28. 01:10
다음 코드의 답을 예상해보자.
답은 이러하다.
왜 이런 답이 나오는지 코드를 따라가며 하나씩 살펴보자.
처음 호출은 console.log('시작') 이다.
호출 스택 즉 콜 스택 부분에 들어가게 된다.
이렇게 쌓인 console.log는 실행되고 지워지며 다음 setTimeout 줄으로 넘어가게 된다.
역시 setTimeout도 스택에 담기고 실행되고 지워지며 다음 줄로 넘어가게 된다.
이때 run 함수는 어딜로 가는 것일까? run 함수는 이벤트 루프에 의하여 테스크 큐에 저장 된다.
이후 console.log('끝')이 콜 스택에 담기고 실행되고 지워진다.
이제 콜 스택이 비워져있으면 이벤트 루프에 의하여 테스트 큐에 제일 앞에 있는 run 이 3초후에 실행되며
run() 안에 있던 console.log('3초후에 시작')을 호출하여 출력한다. 이후 종료되고 run() 도 종료하게 된다.
따라서 답은
시작
끝
3초후에 출력
이 되는 것이다.
그렇다면 언제 테스트 큐에 들어가게 될까?
setTImeout, setInterval, setImmediate, Promise resolve, reject ( async, await)
, 이벤트리스너의 콜백 등이 있겠다.
실제 테스크 큐는 여러개 이며
실제로는 가로 한줄이 하나의 큐이고 각각의 다른 큐에 들어가게 된다. 이벤트 루프의 역할은 여러개의 큐에서
정해진 순서대로 하나씩 꺼내오는 일이다.
첫번째 줄이 제일 우선 순위가 높다 하면 호출 스택으로 꺼내오고 사라지고 두번째도 꺼내오게 된다.
이제 세번쨰를 호출해야 하는데 예를들어 우선순위가 높은 이벤트리스너의 콜백이 있다면 첫번쨰 줄로 가게 되고
이벤트 루프가 이를 먼저 호출하게 된다.
이벤트 루프의 동작을 잘 알고 있다면 코드의 실행 순서를 잘 조종할 수 있게 될것이다.
* 참고자료 : 조현영 님의 node.js 교과서