이 개념을 정리하는 이유 😀
Spring 공부 중 WebClient를 사용하기 위해 공부하다가 Non-Blocking 방식으로 WebClient가 동작한다라고 하는 부분이 이해가 잘 되지 않아서 이 개념들을 정리해 봅니다.
이해 해보자
Blocking: 자신의 작업을 수행하다 다른 주체의 작업이 시작되는 경우 제어권을 뺏기는 경우
Non-blocking: 자신의 작업을 수행하다 다른 주체의 작업이 시작되어도 제어권을 뺏기지 않는 경우
Synchronous: 작업을 동시에 시작하거나 동시에 끝이나는 상황, 혹은 끝나는 동시에 시작함을 의미 (결과에 관심이 있는 상태)
Asynchronous: 작업의 시작 종료가 일치하지 않으며, 끝나는 동시에 시작하지 않음을 의미 (결과에 관심이 없는 상태)
위와 같이 정리한 말만으로는 이해가 어려워서 여러 자료를 참고한 후 다음과 같이 정리할 수 있었습니다.
Blocking과 Non-Blocking의 차이는 다른 작업을 실행하는 시점에서 제어권이 누구에게 있는지로 판단할 수 있다.
Synchronous와 Asynchronous는 순서와 결과에 관심이 있는지 여부로 판단할 수 있다.
blocking과 non-blocking은 제어권 여부로 판단한다는 것을 어느 정도 말그대로 이해할 수 있지만, synchronous와 asynchronous의 차이를 이해하기 위해 다음 설명을 덧붙여보겠습니다.
Synchronous는 번역하면 동기, Asynchronous는 비동기를 의미하고 동기/비동기의 많은 뜻 중에서 끝나는 동시에 시작함과 하지 않음에 집중해 보겠습니다.
이에따라 저는 동기는 다른 작업이 끝나는 시점에 기존 작업을 시작함, 비동기는 다른 작업이 끝나는 시점과 상관없이 기존 작업이 시작됨으로 해석했습니다.
- 동기에 따라 다른 작업이 끝나는 시점에 기존 작업을 시작한다는 것은 다른 작업의 결과물이 필요하다는 것을 의미
- 비동기에 따라 다른 작업이 끝나는 것과 상관없이 기존 작업이 진행된다면, 다른 작업의 결과물이 필요하지 않은 것을 의미
따라서 위와 같은 이해의 과정을 통해서 동기와 비동기 여부가 순서와 결과에 관심이 있는지 여부로 판단한다는 말이 어떤 뜻인지를 가늠할 수 있었습니다.
(또한 작업의 종료 시점을 신경쓰는 것은 곧 작업의 순서를 신경쓰는 것과 같다고 생각했습니다.)
많이 보이는 표로 다시 공부해보자.
이 표는 어느 글을 참고하나 설명의 예시로 들고 있었는데, 그만큼 정리가 잘 되어 있어서 그런 것 같아 저도 개념 이해를 위해 가져와 봤습니다..
가장 대표적인 형태는 Synchronous - Blocking, Asynchronous-NonBlocking 모델일 것 같습니다. (그렇다고 동기 = 블로킹, 비동기 = 논블로킹 이건 아닙니다)
엄연히 두 개념은 비슷한듯 다른 것이
- 동기/비동기는 작업을 같이 처리해야 하느냐에 대한 관점으로 보는 개념이고,
- blocking/non-blocking은 다른 작업이 처리되는 과정에서 제어권을 어떻게 할 것이냐의 관점으로 바라보는 것이기 때문입니다.
Sync-Blocking 모델은 그림에서도 볼 수 있듯이 제어권을 다른 작업이 가져가고(그 동안에는 대기), 다른 작업의 결과를 바탕으로 기존 작업이 반환받은 결과로 작업을 이어나가는 구조입니다.
Async-NonBlocking 모델은 완전 반대로 다른 작업이 실행되어도 기존 작업은 자기 할 일을 하고, 다른 작업의 결과가 반환되어도 별로 신경을 쓰지 않는 구조로 동작하죠
추가적으로 Sync-NonBlocking은 제어권을 안뺏기지만, 다른 작업의 결과물이 필요한 상황이라 계속해서 결과가 반환되었는지 확인하는 모델이고
Async-Blocking 모델은 결과물이 필요 없는데, 제어권을 뺏겨서 기다려야만 하는 아주 이상하고 비효율적인 모델이라고 이해할 수 있을 것 같습니다.
추가로 그림에서 보면, 비동기 모델의 실행 과정에서 call-back 함수를 전달하는데, 이건 다른 작업(함수)를 호출하는 시점에서 현재 작업(함수)가 결과를 처리할 실행 가능한 코드를 넘겨주는 하나의 방법으로 사용한 것 같습니다. (콜백 함수로 알아서 처리해라라는 느낌?)
참고: 프로그래밍에서 콜백 or 콜백 함수는 다른 코드의 인수로서 넘겨주는 실행 가능한 코드를 의미합니다. 콜백 함수는 넘겨 받는 코드에서 알아서 알맞은 시점에 활용할 수 있습니다.
참고한 자료들
'TIL(Today I Learned)' 카테고리의 다른 글
CORS에 대한 개념 정리 (0) | 2023.02.06 |
---|---|
[Java] 시간 정보 다루기 (0) | 2023.02.03 |
[JAVA] java.util 패키지 정리 (0) | 2023.02.01 |
[Java] java.lang 패키지 정리 (0) | 2023.01.31 |
@RequestParam vs @RequestBody vs @RequestPart 공부한 내용 정리 (0) | 2023.01.31 |
댓글