프엔 공부 중 빠지지 않는 이벤트 루프!
비동기 처리를 가능하게 해주는 이벤트 루프 제대로 이해해보자고! 😀😀😀
이벤트 루프
자바스크립트는 싱글 스레드 언어로 한 번에 하나의 코드만 처리할 수 있다.
만약 싱글 스레드로 모든 브라우저 동작이 실행된다면, 우리는 파일 다운로드 중에는 다른 작업을 아무것도 못하고 대기해야 하는 상황이 생긴다. 그렇기 때문에 우리는 파일 다운로드, 이벤트, 네트워크 요청과 같이 비동기처리 방식이 필요할 때가 아주 많이 있다.
이렇게 파일 다운, 타이머, 네트워크 요청과 같이 오래 걸리는 작업들은 동시에 작업 처리를 진행하도록 해야하는 데 이러한 비동기 작업을 효율적으로 관리하는 것이 바로 이벤트 루프이다!
💁♀️ 자바스크립트에서 여러 작업을 동시에 처리하거나, 여러 작업 중 우선적으로 실행할 작업을 결정하는 관리자 역할을 하는 것이 "이벤트 루프" 이다.
자바스크립트는 위 이미지의 구조로 되어있고 Event Loop는 브라우저 내부의 Call Stack, Web APIs, Callback Queue 등의 요소들을 모니터링하며 비동기적으로 실행되는 작업을 관리하고, 이를 순서대로 처리하며 프로그램 실행 흐름을 제어한다.

Callback Queue에는 macrotask queue(매크로 태스크 큐), microtask queue(마이크로 태스크 큐) 가 있다.
💁♀️ Animation Frames?

이벤트 루프는 비동기 작업을 Web API에 옮기고 작업이 완료되면 Queue에 적재했다가 Call Stack에 작업을 관리, 옮기는 역할을 한다.
Call Stack, Task Queue에 작업이 남아있는지 반복적으로 무한 루프하며 확인하기 때문에 이벤트 "루프"이다.
function bar() {
setTimeout(() => {
console.log("Second")
}, 500);
}
function foo() {
console.log("First");
}
function baz() {
console.log("Third");
}
bar();
foo();
baz();
//노출 순서
First
Second
Third
위 스크립트는 아래 코드 실행 과정으로 진행된다.

💁♀️ 코드와 gif를 비교하며 보면 이해가 훨씬 쉽다 ㅎ.ㅎ
console.log('Start!');
setTimeout(() => {
console.log('Timeout!');
}, 0);
Promise.resolve('Promise!').then(res => console.log(res));
console.log('End!');
//노출 순서
Start!
End!
Promise!
Timeout!






Animation Frames는 브라우저가 화면을 다시 그릴 때 실행되는 함수들을 담아두는 공간이다.
👇requestAnimationFrame 메소드 예시
Animation Frames의 실행 순서와 우선순위는 브라우저에 따라 다를 수 있으며, 이벤트 루프의 명세가 명확하게 정의되지 않은 부분이 있기 때문에 브라우저마다 동작이 다를 수 있다.
위 설명과 같이 Microtask Queue > Animation Frame > Task Queue 순서가 일반적이지만, 항상 보장되는 것은 아니다.
특정 브라우저의 동작 방식이나 업데이트된 이벤트 루프에 따라 다를 수 있기에, 정확한 확인을 위해서는 크로스 브라우저 테스트가 필요하다.
실제 브라우저 동작 예


👩💻프엔이라면 반드시 알아야 할 이벤트 루프!
직접 코드를 써보고 조작해볼 수 있는 사이트와 함께 순서를 확인해보자

처음 이벤트 루프를 접했을 때는 동공지진이 왔었지만, 계속 반복해서 다양한 자료들을 찾아보니 점점 이해가 되었다! 역시 복습이 체고 🫶
✅ 참고
https://inpa.tistory.com/entry/%F0%9F%94%84-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EB%A3%A8%ED%94%84-%EA%B5%AC%EC%A1%B0-%EB%8F%99%EC%9E%91-%EC%9B%90%EB%A6%AC
https://hudi.blog/async-javascript/
_https://meetup.nhncloud.com/posts/89
https://jakearchibald.com/2015/tasks-microtasks-queues-and-schedules/