실행 순서를 확인하려고 로그를 찍어봤는데, 위에 쓴 setTimeout보다 아래에 쓴 Promise의 콜백이 먼저 나와요.


console.log("1 동기");
setTimeout(() => console.log("2 타이머"), 0);
Promise.resolve().then(() => console.log("3 프로미스"));
console.log("4 동기");


1 동기
4 동기
3 프로미스
2 타이머


setTimeout을 더 위에 썼고 지연도 0인데 왜 3(프로미스)이 2(타이머)보다 먼저 나오나요? 마이크로태스크랑 매크로태스크가 다르다는데, 이벤트 루프가 정확히 어떤 순서로 도는 건가요?