전 포스팅에서 Blocking과 Non-Blocking을 다뤘었는데 이번엔 비슷해 보이는 개념인 sync / async에 대해서 포스팅 하려 한다.
Synchronous의 약자로 "동기"라는 뜻이다.
즉 다시말해 요청을 보내게 되면 요청에 대한 응답을 받을때까지 대기하였다가 응답을 받는다는 말이다. (요청한 객체가 응답을 직접 받는다)
조금 더 정확하게 말하면 특정 작업을 수행할때, 그 작업의 완료 여부를 신경쓰는 것을 말한다.
그렇기 때문에 동기식 처리는 작업을 동시에 수행하거나, 동시에 끝나거나, 이전 작업이 끝나는 동시에 시작한다.
간단한 예시로 A 함수가 B 함수에게 작업을 요청했다면, A 함수는 B 함수가 작업이 끝나고 응답을 보내는 것을 기다린 후 다음 작업을 수행한다는 것이다.
그에 반해 sync의 반대 용어인 async는 비동기라는 뜻으로, 요청에 대한 응답을 기다리지 않고 다른 작업을 수행한다.
따라서, 동기식 처리와 달리 요청한 객체가 응답을 직접 받지 않고 콜백함수의 형태로 받는다.
또한, 작업의 시작과 종료가 동기와 달리 일정하지 않다.
A 함수가 B 함수에게 작업을 요청했다면, A 함수는 B 함수가 응답을 보내는 것을 기다리지 않고 다른 작업을 수행한다. 수행 중, B 함수가 응답을 보낸다면, 콜백함수의 형태로 받아온다
이 포스트의 핵심이다. 사실 나도 이 게시글을 쓰기 전까지는 정확한 차이를 몰랐다.
먼저 간단하게 Blocking / Non-Blocking과 sync/async를 정리하자.
- | Blocking | Non-Blocking |
---|---|---|
구분 기준 | 작업시 B가 완료까지 제어권 O | B는 제어권 X |
Blocking과 Non-Blocking의 구분 기준은 호출된 함수가 제어권을 소유하고 있느냐, 바로 호출한 함수에게 돌려주느냐 이다.
Blocking의 경우 B에게 제어권이 있기에 A는 B의 작업 완료시까지 다른 작업을 수행하지 못하고 기다린다.
👨🏻💻 (A) : 과장님 업무 서류 처리 부탁드립니다.
👨🏻💼 (B) : 서류 지금 처리해서 드릴테니까 여기서 잠시 기다리세요.
- 업무의 제어권은 과장 B에게 있다.
사원 A는 과장 B의 서류 처리 전까지 타 업무 X
반대로 Non - Blocking의 경우, 제어권이 A에게 다시 되돌아 가기에 A는 B의 작업완료를 기다리지 않고 다른 작업을 수행한다.
👨🏻💻 (A) : 과장님 업무 서류 처리 부탁드립니다.
👨🏻💼 (B) : 제가 서류 처리해서 갖다 드릴테니 자리가서 다른 업무 보고 계세요.
- 위와 달리 업무의 제어권을 사원 A에게 넘겨주어 과장 B가 서류 처리 중에도 사원 A는 다른 업무가 가능하다.
- | sync | async |
---|---|---|
구분 기준 | 작업들이 시간을 맞추어 실행 | 작업들이 시간을 맞추지 않고 실행 |
여기서 말하는 시간을 맞추어 실행된다는 것은 위에서 말했던 작업들이 동시에 시작하거나, 동시에 끝나거나, 끝과 동시에 시작되는 것을 말한다.
sync의 경우, B의 작업 결과를 응답받아 A가 처리한다. 따라서 작업의 종료/시작시간이 일치한다.
👨🏻💻 (A) : 과장님 업무 서류 처리 부탁드립니다.
👨🏻💼 (B) : 여기 서류 처리파일입니다. 바로 서류처리 파일 인사부서에 메일로 보내주세요
👨🏻💻 (A) : 네 지금 바로 보내겠습니다.
- A가 B에게 요청한 서류처리라는 업무가 종료됨과 동시에 메일 보내기라는 업무가 시작된다.
즉 시간을 맞추어 실행된다.
반대로, async의 경우 A와 B가 작업의 시작과 종료시간을 전혀 신경쓰지 않는다. B는 그저 요청받은 작업이 완료되면 콜백함수로써 응답한다.
👨🏻💻 (A) : 과장님 업무 서류 처리 부탁드립니다.
👨🏻💼 (B) : 음 제가 알아서 서류 처리해서 보내드릴게요. 그동안 뭐 다른 업무 하시던지 하고 계세요
...B의 서류 처리중...
👨🏻💼 (B) : 여기 서류 처리한거 드릴게요
👨🏻💻 (A) : 네 처리하신거 제 책상에 두시면 제가 하던 업무들 마치고 알아서 처리하겠습니다.
- A는 B에게 요청한 서류처리라는 업무의 종료시간을 신경쓰지 않고 다른 업무를 진행한다. B 또한 A의 업무 진행을 신경쓰지 않고 요청받은 업무를 수행한다.
따라서 Blocking / Non - Blocking과 sync / async 4개의 개념은 혼용되어 사용 될 수 있다
일반적인 동기 함수의 작동 방식이다.
Blocking의 특성인 제어권이 호출된 함수 B에게 있고, sync의 특성인 작업처리 시간을 맞춰야 한다는것이 결합된 것이다.
즉, A가 B에게 작업을 요청하고, 작업 제어권은 B에게 있기에 A는 B의 작업 완료 전까지 다른 작업을 수행하지 못한다. B의 작업이 완료되면 A에게 다시 제어권이 넘어가 다른 작업을 수행한다 (작업처리 시간 맞춤 O)
비동기 블로킹 처리는 비동기이기 때문에 작업 처리 시간은 상관이 없다.
하지만 Blocking의 특성으로 제어권이 요청받은 B에게 있기에 요청한 A는 B의 작업이 끝날때까지 대기하게 된다.
Blocking - sync와 비슷하지만 B의 작업결과가 콜백함수로 처리된다는 차이점이 있긴한다.
동기적으로 실행되기에 작업처리시간은 일치해야한다. 하지만 Non - Blocking의 특성으로 제어권은 호출한 A에게 다시 돌아온다.
여기서 특징은 작업처리시간이 일치해야 하기 때문에 제어권이 A에게 있어 다른 작업을 수행할수 있음에도 불구하고 B의 작업완료 여부를 계속해서 확인한다는 점이다.
일반적인 비동기 함수의 작동 방식이다.
비동기적으로 실행되기에 작업처리시간이 일치 하지 않아도 되고, Non - Blocking이기에 작업의 제어권 또한 A에게 다시 돌아와 다른 작업을 수행 할 수 있다.
즉, A는 B에게 작업 요청 후 제어권을 다시 돌려받기에 B의 작업 결과에 상관없이 바로 다른 작업을 할 수 있다.
B는 작업을 수행하고 그 결과를 콜백함수로 반환한다.
Blocking / Non - Blocking의 핵심은 한 작업을 처리하는 동안 다른 작업을 처리할수 있느냐 없느냐 이다.
"작업처리의 제어권이 누구에게 있는가? 따라서 A와 B의 동시작업이 가능한가?"
sync / async의 핵심은 작업이 시간을 맞추어 실행되는 것이다.
요청한(받은)작업처리가 시간을 맞추어 진행되는가?