블럭과 논블럭?
주로 동기와 비동기 와 함께 많이 소개 되는데요,,
이번에 WebClient 를 공부하면서 처음 들어보았습니다.
저는 처음 개념을 접했을 때 동기-블럭, 비동기-논블럭 으로 이해했는데 오산이었습니다.
이번 정리를 통해 앞으로 혼용하는 일을 방지하고자 합니다.
블럭과 논블럭의 차이를 정확히 이해하려면 동기와 비동기를 알고 있어야 합니다.
이 포스팅은 동기와 비동기의 차이를 알고 있다는 전제하여 작성합니다.
블럭 & 논블럭 / 동기 & 비동기
블럭과 논블럭을 구분하는 가장 중요한 핵심은 함수 제어권의 위치 입니다.
예를 들어 함수 실행 순서가 A→B 인 로직이 있습니다.
- 블럭은 A함수를 호출하고 모든 행위를 마칠 때까지 기다렸다 종료되면 B함수를 호출합니다.
- 논블럭은 A함수를 호출하고 A함수가 끝나기도 전에 B함수를 호출합니다.
블럭(Block)
호출된 함수가 자신이 할 일을 모두 마칠 때까지 제어권을 계속 가지고서
호출한 함수에게 바로 제어권을 return 하지 않는 경우
논블럭(Non-Block)
호출된 함수가 자신이 할 일을 마치지 않았더라도 바로 제어권을 바로 return하여
호출한 함수가 다른 일을 진행할 수 있는 경우
근데 저는 단편적인 예제로만은 동기, 비동기와 뭐가 다른지 확실히 이해하기 힘들더라구요
그래서 아래 4가지 상황으로 구체적으로 살펴보겠습니다.
- 이때 동기와 비동기의 함수 return을 신경쓰는 여부를 인지해주셨으면 좋겠습니다.
전체적인 상황을 카페에서 음료를 시켰을 때로 설정하겠습니다.
동기 / 블럭
손님 : 딸기라떼 주문
직원 : 만드는 중
손님 : 테이블에 못가고 기다리는 중(음료가 언제나오는지 궁궁함)
이때 손님은 음료가 언제나오는지 궁금해 합니다.
동기/블럭은 호출한 함수가 끝날 때 까지 다른 작업을 못하고 있습니다.
일반적인 동기 방식 입니다.
동기 / 논블럭
손님 : 딸기라떼 주문
직원 : 만드는 중
손님 : 테이블 착석
손님 : 다 됐나요?
손님 : 다 됐나요?
손님 : 다 됐나요?
여기서 핵심은 손님이 계속 음료를 확인한다는 점입니다.
함수의 제어권은 바로 호출한 함수로 넘어 가 다른 작업을 할 수 있지만 그전에 호출된 함수의 동기를 위하여 기존 작업을 계속 신경써야 합니다.
비동기 / 블럭
손님 : 딸기라테 주문
직원 : 만드는 중
손님 : 테이블에 못가고 기다리는 중(음료가 언제나오는지 궁궁하지 않음)
언뜻 보면 동기/블럭과 비슷해 보입니다.
하지만 결과(음료가 언제 나오는지)를 궁금해하지 않습니다.
왜냐하면 함수의 결과를 궁금해하지 않는 비동기이기 때문입니다.
→ 기존 작업이 끝날때까지 기다려야 합니다.
결과적으론 동기/블럭 과 똑같아 보입니다. (비효율)
비동기 / 논블럭
손님 : 딸기라떼 주문
직원 : 만드는 중
손님 : 테이블에 착석, 책 읽는 중
직원 : 딸기라떼 나왔습니다~!
손님 : 딸기라뗴 픽업
함수의 제어권이 바로 호출한 함수에게 넘어가며, 비동기 방식으로 다른 일을 동시에 할 수 있게 됩니다.
함수가 끝나면 콜백함수를 호출합니다.
대규모 서비스나, 동기가 필요하지 않을 때 효과적일거 같습니다.
이렇듯 상황에 따라 동기-비동기, 블럭-논블럭 을 유동적으로 사용하는 것이 좋아 보입니다.
무조건 비동기-논블럭이 좋다는 것이 아닌, 서비스에 따라 잘 판단하여 사용하는 것이 중요합니다.
비동기 / 논블럭 을 쓰면 안되는 경우
순차적으로 진행해야 하는 은행 전산업무, 값의 정확성이 필요로 하는 금융 관련 업무같은 경우
비동기 / 논블럭 한 코드는 치명적이며 지양해야합니다.
+ 콜백 함수
함수가 끝나는 시점에 호출되는 함수
비동기는 콜백 함수와 세트
비동기는 함수의 리턴 값에 관심이 없기 때문에 함수를 호출한 곳에서 결과를 처리하지 않고 호출된 함수가 콜백함수를 호출합니다.
콜백 함수는 비동기의 동기화를 위해 사용됩니다.(결과 예측)
콜백 함수를 사용하면 함수의 실행 순서를 보장해줍니다.