
javascript를 공부하면서 혼동하기 쉬운 개념인
블럭 (Block) vs 논블럭(Non-Block)
동기(Synchronous) vs 비동기(Asynchronous)에대해서 정확하게 짚고넘어가보자.
우선 각각의 개념을 살펴보자.
- Block
호출된 함수가 자신이 할 일을 모두 마칠 때까지 제어권을 계속 가지고서 호출한 함수에게 바로 return하지 않으면 블럭이다.
- Non-Block
호출된 함수가 자신이 할 일을 마치지 않았더라도 바로 제어권을 바로 return하여 호출한 함수가 다른 일을 진행할 수 있도록 하면 넌블럭이다.
- Synchronous
호출된 함수의 수행 결과 및 종료를 호출된 함수 뿐 아니라 호출한 함수도 함께 신경쓰면 동기이다.
- Asynchoronous
호출된 함수의 수행 결과 및 종료를 호출된 함수 혼자 직접 신경쓰고 처리하면 비동기이다.
흔히 '동기' == '블로킹' , '비동기' == '논블로킹' 으로 많이 헷갈립니다.
동기/비동기는 작업을 수행하는 주체가 두 개 이상이어야 합니다.
이 때 작업의 시간(시작, 종료 등)을 서로 맞춘다면 이를 동기라고 부르고, 서로 작업의 시간이 관계없다면 이를 비동기라고 부릅니다.
반면 블로킹/논블로킹은 작업의 대상이 2개 이상이어야 합니다.
두 개념이 서로 바라보는 관점이 다르기 때문에 동기/블로킹, 동기/논블로킹, 비동기/블로킹, 비동기/논블로킹의 다양한 조합이 가능합니다.
동기 작업이란 작업을 수행하는 두 개 이상의 주체가 서로 동시에 수행하거나, 동시에 끝나거나, 끝나는 동시에 시작할 때를 의미합니다. 시작과 종료를 동시에 하거나, 하나의 작업이 끝나는 동시에 다른 주체가 작업을 시작하면 이는 동기 작업이라고 볼 수 있습니다.
비동기 작업은 두 주체가 서로의 시작, 종료시간과는 관계 없이 별도의 수행 시작/종료시간을 가지고 있을 때를 뜻합니다. 서로 다른 주체가 하는 작업이 자신의 작업 시작, 종료시간과는 관계가 없을 때 비동기라고 부를 수 있습니다.

블로킹과 논블로킹은 다른 작업을 수행하는 주체를 어떻게 상대하는지가 중요합니다. 자신의 작업을 하다가 다른 작업 주체가 하는 작업의 시작부터 끝까지 기다렸다가 다시 자신의 작업을 시작한다면 이는 블로킹이고, 다른 주체의 작업과 관계없이 자신의 작업을 계속한다면 이를 논블로킹이라고 할 수 있습니다.
스레드 A가 어떤 작업을 하는 다른 대상을 호출하고, 그 대상이 가져온 결과물을 받아 다시 작업을 재개하고 있습니다. 예를 들자면 Java에서 JDBC를 사용하여 DB에 질의를 날리고 결과를 받아오는 작업을 블로킹 작업이라고 부를 수 있습니다. 이와 반대로 다른 주체에게 작업을 요청하고 그 결과를 받을 때까지 기다리지 않으며 자신의 작업을 한다면 이를 논블로킹이라고 할 수 있습니다.


동기이며 블로킹인 작업은 어떤 작업이 있을까요? 동기의 조건인 '두 개 이상의 작업의 시작시간, 종료시간이 같거나 시작과 동시에 종료할 것', 그리고 블로킹의 조건인 '다른 작업을 하는 동안 자신의 작업을 일시정지할 것' 을 만족하는 작업의 예는 아래와 같습니다.

비동기의 조건인 '다른 작업과 시작, 종료 시간을 맞추지 말 것'과 블로킹의 조건인 '다른 작업의 주체가 작업하는동안 기다릴 것'을 만족해야 합니다. 비동기, 블로킹 조합은 결국 다른 작업이 끝날 때를 기다려야 하기 때문에 동기, 블로킹과 비슷한 작업 효율이 나옵니다. 즉 그리 좋은 효율이 나오지 않습니다. 개발자가 유도해서 이 상황을 만드는 것보다 비동기, 논블로킹 작업을 실행하였지만 자기도 모르게 블로킹 작업을 실행했을 때 이러한 결과가 나옵니다.

동기의 조건인 '두 개 이상의 작업의 시작시간, 종료시간이 같거나 시작과 동시에 종료할 것', 논블로킹의 조건인 '다른 작업의 주체가 작업하는동안 기다리지 말 것' 을 만족하는 동기, 논블로킹 조합도 비동기, 블로킹 조합처럼 작업 효율이 좋지 않은 편입니다. 논블로킹으로 자신의 작업을 계속하고 있지만 다른 작업과의 동기를 위해 계속해서 다른 작업이 끝났는지 조회합니다.

'다른 작업과 시작, 종료 시간을 맞추지 말 것', '다른 작업의 주체가 작업하는동안 기다리지 말 것' 을 만족하는 비동기, 논블로킹 조합은 자원이 충분하다면 효율이 좋은 조합입니다. 자신의 작업이 멈추지도 않고, 다른 주체가 하는 작업의 결과가 나왔을 때 콜백을 설정하기도 합니다. 다른 주체에게 작업을 맡겨놓고 자신이 하던 일을 계속할 수 있기 때문에 해야 할 작업이 대규모이고, 동기가 필요하지 않을 때 효과적입니다.

개인적으로 블로킹 / 논블로킹개념을 한번 읽자마자 쉽게 이해가 되었는데 동기 / 비동기가 정확히 뭔지 쉽게 이해가 되지않았다. 쉽게말해서 하나의 작업이 종료되어야 다른 작업이 실행된다 => 동기
하나의 작업이 시작되거나 종료되는지와 관계없이 다른 작업이 실행된다 => 비동기 로 이해하면 될거같다.