Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 시스템콜
- Vue.js
- 코드트리
- 핀토스
- 스택
- 사이드프로젝트
- TiL
- 모션비트
- 자바스크립트
- 백준
- 크래프톤 정글
- pintos
- 티스토리챌린지
- corou
- JavaScript
- Java
- 소켓
- Flutter
- 알고리즘
- 크래프톤정글
- userprog
- 4기
- 리액트
- 나만무
- 자바
- 큐
- defee
- CSS
- 오블완
- HTML
Archives
- Today
- Total
미새문지
이벤트 루프 (Event Loop) 본문
728x90
이벤트 루프 (Event Loop)
이벤트 루프는 자바스크립트의 실행 모델에서 비동기 작업을 효율적으로 처리하기 위한 핵심 메커니즘이며, 자바스크립트는 싱글 스레드 기반 언어로 한 번에 하나의 작업만 실행할 수 있지만, 이벤트 루프 덕분에 비동기 작업을 효과적으로 관리하고, UI를 렌더링하면서도 중단 없이 프로그램을 실행할 수 있다.
구성 요소
콜 스택 (Call Stack)
- 함수 호출이 쌓이고, 실행이 끝나면 제거되는 LIFO(Last In, First Out) 구조
- 현재 실행 중인 작업이 위치하며, 동기 코드는 콜 스택에 쌓였다가 순서대로 실행된다.
태스크 큐 (Task Queue)
- 비동기 작업의 콜백 함수가 대기하는 곳
- 태스크 큐에는 매크로태스크와 마이크로태스크라는 두 가지 종류가 있으며, 이벤트 루프는 태스크 큐에서 작업을 하나씩 꺼내 콜 스택이 비어 있는 경우 실행한다.
웹 API
- 타이머, DOM 이벤트, AJAX 요청 등 브라우저가 제공하는 API
- 비동기 작업을 처리한 후 결과(콜백 함수)를 태스크 큐에 전달한다.
작동 원리
- 콜 스택 확인
- 콜 스택에 작업이 남아 있다면 이를 실행하고, 콜 스택이 비어 있으면 다음 단계를 진행한다.
- 마이크로태스크 큐 처리
- 마이크로태스크 큐에 작업이 있다면 모두 처리하며, 마이크로태스크는 매크로태스크보다 우선순위가 높다.
- 매크로태스크 큐 처리
- 마이크로태스크 큐가 비어 있는 경우, 매크로태스크 큐에서 작업 하나를 가져와 처리한다.
태스크 큐의 종류
- 매크로태스크 (Macro Task)
- setTimeout이나 이벤트 리스너 같은 주요 비동기 작업이 등록되는 큐
- 이벤트 루프는 매크로태스크 큐에서 작업을 하나씩 꺼내어 처리한다.
- 마이크로태스크 (Micro Task)
- Promise의 .then과 .catch같은 높은 우선순위 작업이 등록되는 큐
- 이벤트 루프는 매크로태스크를 실행하기 직전에 마이크로태스크 큐의 모든 작업을 완료한다.
실행 순서
console.log("Start"); // 1
setTimeout(() => {
console.log("setTimeout"); // 5
}, 0);
Promise.resolve()
.then(() => {
console.log("Promise 1"); // 3
})
.then(() => {
console.log("Promise 2"); // 4
});
console.log("End"); // 2
- "Start" 출력 → 동기 코드 실행
- "End" 출력 → 동기 코드 실행 완료
- Promise 1 출력 → 마이크로태스크 큐의 작업 실행
- Promise 2 출력 → 마이크로태스크 큐의 나머지 작업 실행
- setTimeout 출력 → 매크로태스크 실행
이벤트 루프 장점
- 비동기 처리
이벤트 루프를 통해 네트워크 요청, 타이머, 사용자 입력 등의 비동기 작업을 동기 코드와 함께 효율적으로 처리할 수 있다. - UI 렌더링 최적화
브라우저의 렌더링 주기와 조화를 이루어 사용자 경험을 방해하지 않도록 설계할 수 있다. - 비동기 코드의 순서 보장
태스크 큐의 규칙에 따라 작업이 순서대로 실행되므로 개발자가 실행 흐름을 예측할 수 있다.
자주 하는 실수
- 마이크로태스크와 매크로태스크의 우선순위를 오해
예를 들어, setTimeout보다 Promise 콜백이 먼저 실행된다는 사실을 잊고 코드 작성 - 블로킹 코드 작성
긴 동기 작업이 콜 스택을 차지하면 이벤트 루프가 다음 작업을 진행하지 못함
728x90
'개발 TIL' 카테고리의 다른 글
Controlled Component와 Uncontrolled Component (0) | 2025.01.14 |
---|---|
Props와 State (0) | 2025.01.13 |
Tanstack-query (0) | 2025.01.09 |
실행 컨텍스트(Execution Context) (0) | 2025.01.08 |
Reflow와 Repaint (0) | 2025.01.08 |