All Articles

JS | 자바스크립트의 비동기 처리

https://sculove.github.io/post/javascriptflow/

자바스크립트 엔진

자바스크립트 엔진

  • 자바스크립트는 단일 쓰레드
    하나의 스택만 가지고 있고, 한번에 하나의 작업만 가능하다.
  • 자바스크립트 엔진은 힙(heap)과 콜 스택(call stack)으로 구성되어있다.
  • 함수가 호출되면 함수를 실행하기 위한 실행 컨텍스트를 구성하여 콜 스택에 쌓아올린다.
  • 힙에는 메모리(변수, 데이터)가 저장되고 스택에서 작업(코드)을 수행한다.
  • 콜 스택은 말 그대로 스택 구조로 되어 있어서, 선입후출 방식이다. (‘최근에 들어온 애가 먼저 나간다’)
    함수가 호출되면 콜 스택에 차례로 쌓이고, 콜스택 최상단의 함수가 실행된다. 실행 중에 또 다른 함수가 호출되어 콜스택에 쌓이면 기존에 실행 중이던 함수는 잠시 중단되고 다시 최상단의 함수가 실행된다.

자바스크립트의 비동기 처리

자바스크립트 비동기 처리과정

  • 하지만 비동기 처리하는 과정은 조금 다르다.
  • 실제 애플리케이션은 여러 작업을 동시에 처리하는 것처럼 보이는데, 이런 동시성을 가능하도록 하는 것이 이벤트 루프이다.
  • 비동기 작업들은 (이벤트핸들러 함수, 서버 통신 등) 모두 자바스크립트가 아닌 Web API에서 처리된다.
  • 코드 실행 중에 비동기 작업을 만나면 그 코드는 콜스택에서 바로 빠져나와 Web API로 전달된다. web api에서 작업을 완료한 뒤에 콜백함수는 큐(queue)에서 대기한다.
  • 큐에 쌓인 작업(task)들은 스택의 작업이 모두 완료되고 스택이 빈 상태가 되면, 하나씩 스택으로 이동한다.
    큐는 선입선출 방식 (들어온 순서대로 나간다)
  • 이벤트 루프는 스택의 작업 상태와 (비어있는지) 큐의 상태를 반복 확인한다.
    => 스택이 비면 -> 큐에서 스택으로 작업 이동 -> 스택에서 작업 실행
  • 비동기 작업은 microtask, task, animation frame 작업으로 구분된다.
  • microtask가 task보다 먼저 실행된다.
  • microtask가 처리된 후엔 requestAnimationFrame이 호출되고 화면이 브라우저 렌더링이 발생한다.
  • microtask에는 mutationObserverpromise가 해당된다.