728x90
"이벤트 기반이란? 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식을 말합니다."
이벤트 리스너에는 콜백(callback) 함수를 등록합니다. 그리고 시스템에서 이벤트가 발생할 때 콜백 함수를 호출하게 됩니다. 이벤트가 완료되면 다음 이벤트가 발생할 때까지 대기하게 됩니다.
여러 이벤트가 동시에 발생하면 어떤 순서로 콜백 함수를 호출할지 이벤트 루프에서 결정합니다.
function first() {
second();
console.log('첫 번째');
}
function second() {
third();
console.log('두 번째');
}
function third() {
console.log('세 번째');
}
first();
위 예제 코드를 실행하면 아래와 같이 함수들이 호출 스택에 쌓이게 됩니다.
스택에 쌓인 함수들은 위에서 아래로 실행되게 됩니다.
출력 결과는 다음과 같습니다.
세 번째
두 번째
첫 번째
다음 예제를 살펴보겠습니다.
function run() {
console.log('3초 후 실행');
}
consol.log('시작');
setTimeout(run, 3000);
consol.log('종료');
실행 결과는 예측할 수 있겠지만 이를 파악하기 위해서는 이벤트 루프, 태스크 큐, 백그라운드를 알아야 합니다.
- 이벤트 루프: 이벤트 발생 시 호출할 콜백 함수들을 관리하고, 호출된 콜백 함수의 실행 순서를 결정하는 역할을 담당합니다. 노드가 종료될 때까지 이벤트 처리를 위한 작업을 반복하기 때문에 이벤트 루프라고 합니다.
- 백그라운드: setTimeout 같은 타이머나 이벤트 리스너들이 대기하는 곳입니다. 여러 작업이 동시에 실행될 수 있습니다.
- 태스크 큐: 이벤트 발생 후, 백그라운드에서는 태스크 큐로 타이머나 이벤트 리스너의 콜백 함수를 보냅니다. 정해진 순서대로 콜백들이 줄을 서 있으므로 콜백 큐라고도 부릅니다. 콜백들은 보통 완료된 순서대로 줄을 서 있지만 특정한 경우에는 순서가 바뀌기도 합니다.
이제 위 코드의 실행 과정을 파악해보겠습니다.
1. 호출 스택에 쌓여있던 setTimeout이 실행되면 콜백 run 함수는 백그라운드로 이동합니다.
2. 백그라운드에서 3초의 시간이 지나면 태스크 큐로 보내집니다.
3. 호출 스택이 완료되고 비어지면 이벤트 루프가 콜백 함수를 태스크 큐에서 호출 스택으로 옮깁니다.
4. 호출 스택으로 온 함수는 실행되고 다시 비워집니다.
정해진 시간이 지나고 태스크 큐에 콜백 함수가 보내졌더라도 호출 스택에 실행할 함수가 아직 남아 있다면 실행이 완료 될때까지 큐에 남아있을 것입니다. 이는 setTimeout의 시간이 정확하지 않을 수 있는 이유가 됩니다.
[참조]
(도서) Node.js 교과서 개정 2판 - 조현영 지음
728x90
'Develop > Javascript' 카테고리의 다른 글
[Node.js] 싱글스레드 (0) | 2022.12.23 |
---|---|
[Node.js] 논블로킹 I/O (0) | 2022.12.22 |
[node.js] Chat with WebSocket (0) | 2022.07.26 |
자바스크립트 자료형 #2 객체와 배열 (0) | 2020.03.17 |
자바스크립트 자료형 #1 기본 자료형 (0) | 2020.03.17 |
댓글