JavaScript - 동기와 비동기

김서영·2024년 2월 13일
0

동기와 비동기


동기(Synshronous)

모든 일을 순서대로 하나씩 처리하는 것

순서대로 처리한다 == 이전 작업이 끝나면 다음 작업을 시작한다

요청과 응답을 동기식으로 처리한다면?

요청을 보내고 응답이 올 때까지 기다렸다가 다음 로직을 처리(택배같은 느낌)
순서가 중요한 처리에 대해서는 동기식으로 진행해야 한다

비동기(Asynchronous)

작업을 시작한 후 결과를 기다리지 않고 다음 작업을 처리하는 것(병렬적 수행)

시간이 필요한 작업들은 요청을 보낸 뒤 응답이 빨리 오는 작업부터 처리

예시) Gmail에서 메일 전송을 누르면 목록 화면으로 전환되지만 실제로 메일을 보내는 작업은 병렬적으로 뒤에서 처리됨
메일 보내기 성공! 이라는 화면이 떠도 아직 메일을 보내는 중인 것!!

비동기를 사용하는 이유

  • 예를 들어 아주 큰 데이터를 불러온 뒤 실행되는 앱이 있을 때, 동기로 처리한다면 데이터를 모두 불러온 뒤에야 앱의 실행 로직이 수행되므로 사용자들은 마치 앱이 멈춘 것과 같은 경험을 겪게 됨
  • 즉, 동기식 처리는 특정 로직이 실행되는 동안 다른 로직 실행을 차단하기 때문에 마치 프로그램이 응답하지 않는 듯한 사용자 경험을 만들게 됨
  • 비동기로 처리한다면 먼저 처리되는 부분부터 보여줄 수 있으므로, 사용자 경험에 긍정적인 효과를 볼 수 있음

=> 이와 같은 이유로 많은 웹 기능은 비동기 로직을 사용해서 구현되어 있음

JavaScript의 비동기 처리

JavaScript는 한 번에 하나의 일만 수행할 수 있는 Single Thread 언어로 동시에 여러 작업을 처리할 수 없음

Thread란?

작업을 처리할 때 실제로 작업을 수행하는 주체로, multi-thread라면 업무를 수행할 수 있는 주체가 여러개라는 의미

=> 즉, JavaScript는 하나의 작업을 요청한 순서대로 처리할 수 밖에 없다.

그러면 어떻게 Single Thread인 JavaScript가 비동기 처리를 할 수 있을까?

  • JavaScript 자체는 Single Thread이므로 비동기 처리를 할 수 있도록 도와주는 환경이 필요함
  • 특정 언어가 동작할 수 있는 환경을 "런타임"이라 함
  • JavaScript에서 비동기와 관련한 작업은 브라우저 또는 Node 환경에서 처리
  • 이 중에서 브라우저 환경에서의 비동기 동작은 크게 아래의 요소들로 구성됨
    - JavaScript Engine의 Call Stack
    - Web API
    - Task Queue
    - Event Loop

JavaScript 비동기 처리 동작 방식

  1. 모든 작업은 Call Stack으로 들어간 후 처리된다. (Call Stack은 알바)
  2. 오래 걸리는 작업이 Call Stack으로 들어오면 Web API로 보내 별도로 처리하도록 한다.
  3. Web API(주방장)에서 처리가 끝난 작업들은 곧바로 Call Stack으로 들어가지 못하고 Task Queue(요리(가판대))에 순서대로 들어간다.
  4. Event Loop(사장님)가 Call Stack이 비어 있는 것을 계속 체크하고 Call Stack이 빈다면 Task Queue에서 가장 오래된 (가장 앞에 있는) 작업을 Call Stack으로 보낸다.

비동기 처리 동작 요소

1. Call Stack(알바)

  • 요청이 들어올 때 마다 순차적으로 처리하는 Stack
  • 기본적인 JavaScript의 Single Thread 작업 처리

2. Web API(주방장)

  • JavaScript 엔진이 아닌 브라우저에서 제공하는 runtime 환경
  • 시간이 소요되는 작업을 처리(setTimeout, DOM Event, AJAX 요청 등)

3. Task Queue(요리)

  • 비동기 처리된 Callback함수가 대기하는 Queue

4. Event Loop(사장님)

  • Call Stack과 Task Queue를 지속적으로 모니터링
  • Call Stack이 비어 있는지 확인 후 비어 있다면 Task Queue에서 대기 중인 오래된 작업을 Call Stack으로 Push

정리

JavaScript는 한 번에 하나의 작업을 수행하는 Single Thread 언어로 동기적 처리를 하지만, 브라우저 환경에서는 Web API에서 처리된 작업이 지속적으로 Task Queue를 거쳐 Event Loop에 의해 Call Stack에 들어와 순차적으로 실행됨으로써 비동기 작업이 가능한 환경이 됨

profile
개발과 지식의 성장을 즐기는 개발자

0개의 댓글

관련 채용 정보