컴퓨터에서 Thread는 실행되는 작업의 최소 단위를 말합니다. 즉, 하나의 작업을 실행하면 하나의 Thread 위에 올려서 작업이 진행 되야 한다는 걸 의미하는데, 컴퓨터에서는 이를 여러개 생성하여 여러 작업을 처리하는 소위 멀티 쓰레딩 (Multi-Threading)을 진행합니다. 덕분에 우리는 이것 저것을 한꺼번에 실행하여 즐길 수 있죠.
그러나 웹에서 동작하는 Javascript 언어는 Single Thread 언어입니다. 그 말인 즉, 하나의 행위가 끝나야 다음 행위를 할 수 있다는 것을 의미합니다. 이를 동기(Synchronous) 라고도 표현 합니다.

좋은 예로 alert("Hello Wolrd!"); 함수가 있습니다. 해당 함수를 실행하면, 팝업창에서 확인을 누르기 전 까지 다른 코드의 기능이 동작하지 않게 됩니다.
허나 웹 페이지는 해야 할 일이 너무 많습니다. 이미지 파일도 불러와야 하고, 목록 조회도 해야 하고, 로그인 처리도 해야하고 등등등... 하나의 작업을 처리하고 다음 작업을 진행하는 동기 형태의 프로그래밍은 작업이 너무 오래 걸리고, 응답이 늦어지는 경우에는 전체적인 성능 저하 및 사용자 경험에 영향을 줄 수 있게 됩니다.
그래서 Javascript는 다중 처리를 하기 위해 비동기 처리라는 것을 하게 됩니다.

위에서 동기처리는 순차적으로 작업을 수행해 나갈 때, 지금 수행중인 업무가 종료되야 다음 업무가 시작되는 것이라고 했죠. 비동기 처리는 수행해야 하는 여러 업무를 병렬적으로 수행하는 개념 입니다. 즉, A 업무를 진행하다 막히면 그대로 대기하고, B 업무를 수행하는 방식으로 볼 수 있습니다. 그러다 A 업무에 대한 완료 신호를 받으면 그대로 완료 후 작업에 대한 일을 이어나갈 수도 있습니다.
이러한 비동기 처리는, 자바스크립트의 런타임 환경 중 하나인, API를 통해 지원 됩니다. 지난 포스트에서, 자바스크립트의 런타임은 JS Engine + API로 구성이 되있다고 했는데, 바로 이 API를 말합니다. 거기에 웹 브라우저와 서버 별 구동 방식에 따른 차이도 존재하구요.
웹 브라우저의 API에는 비동기 처리를 지원하는 방식이 2가지가 있습니다. 바로 이벤트 루프를 이용한 방법과 Web Worker API를 사용하는 방법이 있습니다.
주로 자바스크립트의 입출력 작업을 비동기로 처리하여 메인 쓰레드가 차단되지 않도록 하는 방식 입니다.
Web Workder는 자바스크립트의 메인 스레드와 별도로 실행되는 백그라운드 스레드 입니다. 주로 CPU 집약적인 작업을 처리하여 메인 스레드의 부하를 줄이는 데 사용됩니다. 프론트엔드 개발자가 직접 멀티 스레드를 활용하여 개발하고 싶을 때도 사용한다고 하네요.
정확히는 Node.js 에서 사용하는 LIBUV가 웹 서버에서의 비동기 처리 역할을 진행합니다.
Node.js도 Single Thread 기반의 런타임 환경인데, Libuv는 이런 환경에서 비동기적으로 I/O 작업을 처리할 수 있도록 지원합니다.
📑 출처 및 참조
[ASAC] 강의 자료
https://dev.to/bbarbour/if-javascript-is-single-threaded-how-is-it-asynchronous-56gd
https://en.wikipedia.org/wiki/Thread_(computing)
https://inpa.tistory.com/entry/%F0%9F%8C%90-js-async
https://poiemaweb.com/js-async