Jaeilit

자바스크립트의 비동기 프로그래밍 Promise 본문

TIL

자바스크립트의 비동기 프로그래밍 Promise

Jaeilit 2023. 11. 16. 22:14
728x90

비동기 프로그래밍의 반대 말은 동기 프로그래밍입니다.

동기 프로그래밍은 순차적으로 위에서 아래로 작성 된 순서대로 코드를 실행하는 프로그래밍법을 이야기하는데요

 

만약에 동기적으로 프로그래밍을 하다가 시간이 많이 걸리는 작업을 만나면 어떻게 될까요?

브라우저는 이 동기작업이 완료 될때까지 멈춰있게 됩니다.

 

이런 현상을 방지하고자 비동기적인 프로그래밍이 필요한데 자바스크립트 엔진에서는 브라우저의 웹 API 를 활용하여 비동기 프로그래밍을 할 수 있습니다.

 

자바스크립트 엔진에는 메모리 힙과 콜 스택이 있습니다.

그 중에서 콜 스택이 비동기 프로그래밍을 가능하게 하는데 어떻게 가능하게 하는지 살펴보겠습니다.

 

콜 스택에는 함수를 호출하면 함수의 실행 컨텍스트가 순차적으로 스택 구조로 쌓이게 됩니다.

그래서 호출스택(Call Stack) 이라고도 하며 이 실행 컨텍스트가 실행되고 종료되면 사라지게 됩니다.

이 방법은 어디까지나 동기적인 프로그래밍에서 이루어지고 비동기 코드는 웹 API로 위임됩니다.

위임 된 비동기 코드는 실행이 완료되면 Callback Queue 로 비동기 코드의 콜백 함수가 이동하게 되고

동기 코드들을 실행하던 Call stack 이 비어있다면 이 Callback Queue 의 콜백 함수들이 Call Stack 으로 이동하게 되는데 이러한 과정을 이벤트 루프라고 합니다.

 

큐의 종류

 

1. 태스크 큐(Task Queue) 

- 매크로 태스크 큐라고도 부르며 브라우저나 노드 환경에서 발생하는 이벤트와 콜백함수를 처리하는데 사용되고 setTimeout 이나 setinterval, I/O 작업, UI 이벤트 처리 등이 매크로 태스트 큐에 속합니다.

 

2. 마이크로 태스크 큐(Micro Task Queue) 

- Promise 나 MutationObserver 또는 asycn/await의 콜백들이 여기에 포함됩니다.

 

큐의 종류는 위의 2가지 외에도 애니메이션 프레임이 존재하는데 실행의 우선순위는 마이크로 태스트큐 -> 애니메이션 프레임 -> 태스크 큐 순서입니다.

또한 이벤트 루프는 마이크로 태스트 큐나 애니메이션을 방문할때는 큐 안에 있는 모든 작업들을 수행하지만 태스크 큐를 방문할때는 한번에 하나의 작업만 call stack 으로 전달하고 다른 queue 를 순회합니다.

 

예제)

console.log('script start');

setTimeout(function () {
  console.log('setTimeout');
}, 0);

Promise.resolve()
  .then(function () {
    console.log('promise1');
  })
  .then(function () {
    console.log('promise2');
  });

console.log('script end');

// script start
// script end
// promise1
// promise2
// setTimeout

 

실행순서는 아래와 같습니다.

 

1. 동기 코드가 먼저 실행됩니다. script start, end

2. 마이크로 태스크 큐의 Promise 함수가 실행됩니다. promise1, promise2

3. 태스트 큐의 함수들이 실행됩니다. setTimeout

 

 

728x90

'TIL' 카테고리의 다른 글

Graphql 과 RESTful API 차이점  (0) 2024.04.11
스토리북 chromatic action error  (0) 2024.03.08
자바스크립트 V8 엔진  (1) 2023.10.26
번들러 웹팩  (0) 2023.09.07
함수형 프로그래밍 - 고차함수 HOF ( 일급객체 )  (0) 2023.08.21