스레드
- 스레드는 기본적으로 프로그램이 작업을 완료하는데 사용할 수 있는 단일 프로세스이다. 각 스레드는 한 번에 하나의 작업만 수행할 수 있다.
- 자바스크립트는 기본적으로 싱글 스레드이다. 컴퓨터가 여러 개의 CPU를 가지고 있어도 메인 스레드라 불리는 단일 스레드에서만 작업을 실행할 수 있다.
동기와 비동기의 차이점
동기
- 동기는 각 당사자가 즉시(또는 가능한 한 거의 즉시) 메시지를 수신(필요한 경우 처리 및 회신)하는 실시간 통신을 의미한다.
- 요청을 하면 응답이 완료될 때 까지 대기하며 다른 작업을 수행할 수 없다.
- 전화 통화하는 것은 동기식이라고 볼 수 있다.
- Blocking
-> 사용자의 입력을 처리하느라 웹 앱이 프로세서에 대한 제어권을 브라우저에게 반환하지 않는 현상을 말한다. 브라우저에게 제어권을 돌려주지 않으면 브라우저는 마치 정지된 것처럼 보일 수 있다.
-> 이벤트 a, 이벤트 b가 존재하고있고 이벤트 a를 동기식으로 수행 시, 이벤트 a가 종료되기 전까지는 이벤트 b가 수행되지않는다.
비동기
- 비동기라는 용어는 존재 하지 않거나 동시에 발생하는 둘 이상의 객체 또는 이벤트(또는 이전 항목이 완료 될 때까지 기다리지 않고 발생하는 여러 관련 작업)를 나타낸다.
컴퓨팅에서 "비동기"라는 단어는 두 가지 주요 컨텍스트에서 사용된다.
- 네트워킹 및 커뮤니케이션
-> 비동기 통신은 두 개 이상의 당사자간에 메시지를 교환하는 방법으로 각 당사자는 수신 즉시 수행하는 것이 아니라 편리하거나 가능할 때마다 메시지를 수신하고 처리한다. 또한 문제가 발생하면 수신자가 수정을 요청하거나 상황을 처리 할 것임을 이해하고 확인을 기다리지 않고 메시지를 보낼 수 있다.
-> 소프트웨어가 비동기적으로 통신한다는 의미는 프로그램이 다른 소프트웨어(예: 서버)로부터 정보를 요청하고 응답을 기다리는 동안 다른 작업을 계속할 수 있는 것으로 생각할 수 있다.
-> 전자 메일을 보내고 받는 것은 비동기식이라고 볼 수 있다.
- 소프트웨어 디자인
-> 비동기 소프트웨어 설계는 작업이 완료 될 때까지 기다리지 않고 원래 작업(또는 작업)과 함께 작업을 수행하도록 프로그램이 요청할 수있는 코드를 작성함으로써 개념을 확장한다. 보조 작업이 완료되면 합의 된 메커니즘을 사용하여 원래 작업에 알림이 전송되어 작업이 완료되었으며 결과(있는 경우)를 사용할 수 있음을 알 수 있다.
비동기 JavaScript란?
- 요청을 하고 응답이 완료될 때 까지 기다리는 것이아니라 요청을 하고 다른 작업을 수행하다가 요청완료 응답을 받고 해당 영역을 처리하는 것이다.
이는 자바스크립트 메인 스레드가 비동기 요청 처리를 위해 해당 영역에서 대기하지않고 비동기 요청 영역 외에 존재하는 코드들을 실행할 수 있음을 의미한다. 이는 Blocking을 발생시키지 않고 수행할 수 있는 장점이 있다.
가령 엄청난 수의 데이터를 계산하고 렌더링하는 과정을 거친다고 할 때 동기식으로 수행한다면 데이터가 계산될 때까지는 브라우저의 화면은 보이지 않고 계산이 완료된 후에 화면이 표시될 것이다. 시간이 오래걸리는 작업이라면 사용자 입장에서는 정상적으로 동작한다고 느끼기 어려울 수 있다.
비동기식으로 처리하게되면 데이터를 계산하는 것을 요청을 보내고 렌더링 후에 데이터 계산 요청 응답을 받아 처리할 수 있다.
- 웹 API기능은 Blocking과 관련된 이유로 현재 비동기 코드를 사용하여 실행되고 있다.
특히 외부 디바이스에서 어떤 종류의 리소스에 액세스 하거나 가져오는 기능들에 많이 사용한다.
예를 들자면, 서버에서 이미지를 가져오면 네트워크 환경, 다운로드 속도 등의 영향을 받아 이미지를 즉시 확인할 수 없다. 동기식으로 처리하게 된다면 이미지를 확인할 수 없는 상태에서 이미지와 관련된 코드가 수행될 수 있는데 에러 발생의 원인이 된다.
[참고자료]
MDN WEB DOCS - General asynchronous programming concepts
MDN WEB DOCS - Introducing asynchronous JavaScript