자바스크립트는 한 번에 하나의 태스크만 실행할 수 있는 싱글 스레드 방식으로 동작한다. 따라서 처리에 시간이 걸리는 작업의 경우 블로킹 현상(작업 중단)이 발생한다. 이렇게 현재 실행 중인 태스크가 종료할 때까지 다음에 실행될 태스크가 대기하는 방식을 동기(Sychronous) 처리라고 한다.
사실 이 동기적인 처리를 작업이 순차적으로 처리된다는 것으로 이해는 하고 있었지만 "왜 '동기적(Synchronous)'이라는 표현을 쓸까?" 라는 풀리지 않는 의문이 있었다. 내가 이해하고 있는 '동기적'이라는 개념은 어떤 것들을 같은 상태로 만드는 것'이기 때문이다.
그렇다면 동기적인 처리는 무엇을 같은 상태로 만드는 걸까?
자료 조사를 하다가 찾은 글에서 단서를 찾을 수 있었다. 이 글에서는 '동기적인'이라는 단어의 뜻은 다음과 같이 해석하고 있다.
그래서 필자는 동시에 발생하는 것은 현재 작업의 요청과 응답이 아니라 현재 작업의 응답과 다음 작업의 요청이라고 설명하는 게 더 맞지 않나 싶다.(애초에 Synchronous는 형용사라 주어가 없다)
즉, 현재 작업의 응답과 동시에 다음 작업의 요청이 시작되는 것이다. 그러므로 '블로킹(blocking)'은 동기적인 처리 과정에서 다음에 처리될 작업이 진행되지 않고 멈춰있는 상태를 의미한다. 이렇게 이해하니 단어에 대한 의문은 어느 정도 해소가 된 것 같다.
동기 처리 방식은 태스크를 순서대로 하나씩 처리하기 때문에 실행 순서가 보장된다. 하지만 앞선 태스크가 종료될 때까지 이후 태스크들이 블로킹(중단)되는 단점이 있다.
반면 비동기 처리 방식은 현재 실행 중인 태스크가 종료되지 않은 상태라 해도 다음 태스크를 곧바로 실행하기 때문에 블로킹이 발생하지 않는다(논 블로킹, Non-blcoking). 하지만 태스크의 실행 순서가 보장되지 않는다는 단점이 있다.
비동기 처리를 위해 자바스크립트 엔진은 이벤트 루프를 가지고 있다. 이를 통해 동기적으로 작업이 처리되는 동안 태스크 큐에서는 비동기 처리 함수를 대기시켜놓고 있다가 동기적인 작업들이 종료되면 비동기 처리 함수를 처리한다.
자바스크립트 엔진은 이벤트 루프를 이용한 비동기 처리를 지원하기 때문에 싱글 스레드지만 동시에 여러 일을 처리할 수 있는 것처럼 보인다. 이를 동시성(concurrency)라고 한다.