(JavaScript) 비동기(1) 비동기 처리의 원리

김정욱·2020년 9월 14일
2

JavaScript

목록 보기
1/10
post-thumbnail

JavaScript


[특징]

  • 싱글 스레드
  • 가볍고 빠르다
  • 배우기 쉽다

[설명]

JavaScript(이하 JS)싱글 스레드 기반으로 동작하는 스크립트 언어이다.
'싱글 스레드'라는 것은 일을 처리하는 스레드가 하나인데 어떻게 빠르게 동작할 수 있나? 하는 의문이 들 수 있다. 해답은 JS는 비동기적인 처리를 지원하기 때문이다. 그렇다면 '싱글 스레드'인 JS가 어떻게 비동기적인 처리를 지원하는지 동작 방식을 알아보고, 이것을 이해하기 위해 JS 런타임의 구성을 알아보자


[JavaScript 런타임(Runtime)]

  • JavaScript 엔진 / Web APIs / 이벤트 루프 / 콜백 큐 (태스크 큐) 4가지 구성
  • [JS Runtime 동작 순서]
    1) 함수는 Call StackLIFO순서로 쌓여서 실행
    2-1) 함수에 콜백함수가 있을 때 JS내부에서 처리 가능하면 Call Stack에 쌓음
    2-2) JS내부에서 처리 안되면(비동기 API) Web API에게 위임
    3-2) Web API는 비동기 API 실행 후 콜백함수를 Callback Queue에 삽입
    4-2) Event LoopCall Stack이 비었을 때 Callback Queue에서
             콜백함수 빼서 Call Stack에 넣어준다.
    5) Call Stack에 올라간 콜백 함수는 pop되어 실행

[비동기 동작 방식]

1. JS에서 콜백 함수가 실행
: JS에서 실행되는 콜백함수의 종류는 2가지 이다.
    1) JS 내부적으로 처리하는 콜백 함수 -> 동기적으로 실행
    2) 외부에서 처리해야 하는 비동기 API에 있는 콜백 함수 -> 비동기적 실행
        // 우리는 2)를 해야하는 상황


2. Web API의 '비동기 API' 처리
: JS는 자체적으로 비동기 API를 처리하지는 못한다!(중요)
   대신 JS 런타임 구성요소인 Web API를 통해 비동기 API를 처리한다.
   바로 이 때 JS는 Web API에게 비동기 API 처리를 위임하고 다른 일을 할 수    있는 것이다. (비동기적인 처리가 가능한 이유)


3. 비동기 API의 수행 완료
: 수행된 비동기 API는 해당하는 콜백 함수를 Callback Queue에 삽입


4. 이벤트 루프의 처리
: 이벤트 루프는 호출 스택이 비어있을 때 콜백 큐에 콜백 함수를 실행
   (JS가 싱글 스레드인 이유는 이벤트 루프가 싱글 스레드이기 때문!)
   (Web API는 멀티 스레드로 구성되어 여러 비동기 요청을 처리 가능)


정리

  • JavaScript특정 비동기 API에 대해 어떤 원리비동기적인 처리를 하는지 알아보았다.
  • 우리가 코딩을 할 때 비동기 코드가독성을 떨어뜨리고 불편하다. 따라서 우리는 이러한 비동기적인 처리를 동기적으로 처리할 수 있도록 '흐름 제어' 라는 것을 해야한다.
  • 다음 (JavaScript) 비동기(2) 편에서는 흐름 제어에 대해 알아본다.

(참고 자료)
https://ooeunz.tistory.com/89
https://it-eldorado.tistory.com/86?category=749286

profile
Developer & PhotoGrapher

3개의 댓글

comment-user-thumbnail
2021년 2월 2일

어이쿠 좋은 글 감사합니다~! :)

1개의 답글
comment-user-thumbnail
2021년 6월 17일

맨 마지막 이벤트루프가 싱글이어서 싱글스레드라는 내용을 보고 궁금해서 질문 남겨요!
그러면 이벤트루프가 예를 들어 2개가 있다고 가정하면, 콜스택도 2개가 되서 분산처리를 하는 걸까요?
간단하면서 중요한 내용만 정리해주셔서 감사합니다!

답글 달기