더북(TheBook)

setTimeout(콜백, 0)은 코드를 논블로킹으로 만들기 위해 사용하는 기법 중 하나입니다. 사실 노드에서는 setTimeout(콜백, 0) 대신 다른 방식을 주로 사용하긴 합니다(3.4.3절의 setImmediate 참조). 이벤트 루프를 이해했다면, setTimeout의 콜백 함수인 longRunningTask가 태스크 큐로 보내지므로 순서대로 실행되지 않는다는 것을 알 수 있습니다. 다음 작업이 먼저 실행된 후, 오래 걸리는 작업이 완료됩니다.

다만, 아무리 논블로킹 방식으로 코드를 작성하더라도 코드가 전부 여러분이 작성한 것이라면 전체 소요 시간이 짧아지지는 않습니다. 여러분의 코드는 서로 동시에 실행되지 않기 때문입니다. 단순히 실행 순서만 바뀔 뿐입니다. 위 예제에서는 console.log('다음 작업')longRunningTask 모두 여러분이 작성한 코드입니다.

하지만 I/O 작업이 없다고 해서 논블로킹이 의미가 없는 것은 아닙니다. 오래 걸리는 작업을 처리해야 하는 경우, 논블로킹을 통해 실행 순서를 바꿔줌으로써 그 작업 때문에 간단한 작업들이 대기하는 상황을 막을 수 있다는 점에서 의의가 있습니다. 또한, 논블로킹동시가 같은 의미가 아니라는 사실을 알아두세요. 동시성은 동시 처리가 가능한 작업을 논블로킹 처리해야 얻을 수 있는 것입니다.

Note ≣ setTimeout(콜백, 0)

밀리초를 0으로 설정했으므로 바로 실행되는 것으로 착각할 수도 있습니다. 하지만 브라우저와 노드에서는 기본적인 지연 시간이 있으므로 바로 실행되지 않습니다. HTML5 브라우저에서는 4ms, 노드에서는 1ms의 지연 시간이 있습니다.

블로킹과 논블로킹 외에 동기와 비동기라는 개념도 들어봤을 것입니다. 동기와 비동기, 블로킹과 논블로킹의 관계는 3.6.1절에서 코드와 함께 설명합니다. 노드에서는 동기와 블로킹이 유사하고 비동기와 논블로킹이 유사하다고만 알아두면 됩니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.