그렇다면...
어떻게 JS에서 병렬처리를 할 수 있는 것일까?
JS 자체만으로 보면 싱글스레드가 맞지만 JS는 독립적으로 실행되지 않고,
런타임(웹 Browser, Node.js 등)의 환경에 맞추어 실행된다.
그래서 JS는 싱글스레드지만 이벤트 루프를 통해 비동기로 처리하여 동시성을 지원한다.
JS가 런타임 환경에서 실행되었을 때 비동기 처리를 도와주는 요소가 있다.
Call Stack:
-자바스크립트에서 수행해야 할 함수들을 순차적으로 스택에 담아 처리
Web API:
-웹 브라우저에서 제공하는 API로 AJAX나 Timeout등의 비동기 작업을 실행
Task Queue:
-Callback Queue라고도 하며 Web API에서 넘겨받은 Callback함수를 저장
Event Loop:
-Call Stack이 비어있다면 Task Queue의 작업을 Call Stack으로 옮김
예를 들면..
이 코드를 실행하여 출력된 콘솔 순서를 확인해보면 코드 순서와는 다르게
거북이, 토끼, 햄스터 순서로 출력된다.
이에 대한 대답은 '보다 쉽게 접할 수 있도록' 한 것이다.
멀티스레드를 채택했다면 웹페이지에서 발생하는 동시성 문제를 해결하기 위해 코드 하나하나에 대한 검증과 테스트를 거쳐야 하는데 복잡한 로직일수록 그만큼 검증도 복잡해질 것이다.
본래 JS가 웹페이지의 보조 기능을 수행하기 위해 만들어졌기 때문에
싱글스레드를 채택함으로써 복잡한 시나리오를 신경쓰지 않고 런타임 환경에서의 비동기 처리를 통해 작업을 수행하여 쉽게 서비스를 만들기 위함이다.