비동기 프로그래밍에서 'microtask'와 'macrotask'의 차이는 무엇인가요?
_____- Microtask 는 자바스크립트 런타임 내에서 우선순위가 높은 작업 큐로서, 현재 실행 중인 작업이 끝난 직후에 처리되는 작업들을 말합니다. 대표적으로 `Promise`의 `.then()`, `queueMicrotask()` 등이 여기에 해당합니다.
- Macrotask 는 상대적으로 우선순위가 낮은 작업 큐로, 이벤트 루프의 한 사이클마다 하나씩 실행되는 작업입니다. 타이머(`setTimeout`, `setInterval`), I/O 이벤트, UI 이벤트 처리 등이 macrotask에 속합니다.
---
Q2: microtask와 macrotask가 각각 어떻게 실행되나요?
1. 현재 스크립트(콜 스택에 있는 작업)를 실행한다.
2. 콜 스택이 비면, 먼저 모든 microtask 큐에 있는 작업 을 순서대로 전부 처리한다.
3. 이후에 macrotask 큐에서 하나의 작업 을 꺼내 실행한다.
4. 실행이 끝나면 다시 2~3단계를 반복한다.
이 때문에 microtask가 macrotask보다 먼저 실행되고, microtask 큐가 모두 비워진 후에야 macrotask를 실행합니다.
---
Q3: microtask와 macrotask의 구체적인 예시는 무엇인가요?
- Microtask 예시
- `Promise.then()`, `Promise.catch()`, `Promise.finally()` 콜백
- `queueMicrotask()`로 등록한 콜백
- `MutationObserver` 콜백
- Macrotask 예시
- `setTimeout()`, `setInterval()` 콜백
- DOM 이벤트 핸들러 (예: 클릭, 키보드 이벤트)
- I/O 작업 콜백 (네트워크 요청 완료 등)
- UI 렌더링 작업 (브라우저마다 다름)
---
Q4: microtask와 macrotask 차이를 이해하기 위한 간단한 코드 예시는?
```javascript
console.log('script start');
setTimeout(() => {
console.log('setTimeout (macrotask)');
}, 0);
Promise.resolve().then(() => {
console.log('promise.then (microtask)');
console.log('script end');
```
출력 순서
```
script start
script end
promise.then (microtask)
setTimeout (macrotask)
```
해설:
- 먼저 스크립트가 즉시 실행되고,
- `Promise.then` 콜백(microtask)은 현재 콜 스택이 빈 직후 실행되고,
- `setTimeout` 콜백(macrotask)은 microtask 실행 후에 실행됩니다.
---
Q5: 왜 microtask가 macrotask보다 우선적으로 처리되나요?
microtask 큐는 현재 실행 컨텍스트가 끝난 후 즉시 후속 작업들을 처리하기 위해 설계되었습니다. 이로 인해 다음 렌더링 전에 비동기 작업의 결과를 신속하게 반영할 수 있습니다. 반면 macrotask는 상대적으로 더 큰 단위의 작업 또는 덜 긴급한 이벤트 처리를 위해 예약됩니다.
---
Q6: microtask를 과도하게 사용하면 어떤 문제가 발생하나요?
microtask를 무한히 생성하면 macrotask가 실행되지 않아 UI 업데이트나 사용자 이벤트 처리 등이 지연될 수 있습니다. 이는 브라우저가 멈춘 것 같은 현상으로 이어지므로 주의가 필요합니다.
---
Q7: microtask와 macrotask 차이를 이해하는 것이 중요한 이유는 무엇인가요?
비동기 코드의 실행 순서와 타이밍을 정확히 이해해야 디버깅, 성능 최적화, UI 반응성 개선 등에 도움이 됩니다. 특히 `Promise`와 `setTimeout`을 혼용할 때 의도치 않은 실행 순서 문제를 방지할 수 있습니다.
---
정리하면,
- Microtask : 우선순위가 높은 작업 큐, 현재 작업 후 바로 실행 (주로 Promise 콜백)
- Macrotask : 우선순위가 낮은 작업 큐, microtask가 모두 처리된 후 실행 (주로 타이머, 이벤트 콜백)
이 차이를 이해하는 것이 비동기 프로그래밍에서 올바른 로직 설계에 필수적입니다.
작성자:
이윤지 [비회원]
| 작성일자: 1년 전
2024-09-12 16:03:44
조회수: 173 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
조회수: 173 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.