본문 바로가기

개발/Java

Block vs Non-Block & Sync vs Async

배경


오늘도 우아한테크의 테코톡을 보며 내용을 정리해 보는 시간을 가져보겠습니다. Sync vs Async? 동기와 비동기를 말하는 것 같은데 이 부분은 평소에 관심이 좀 있던 부분이었으나 Block vs Non-Block은 어떤 것인지 살펴보도록 하겠습니다.

 

내용


Block vs Non-Block

먼저 block에 대해서 이야기 해보겠습니다. blocking이란 자신의 작업을 진행하다가 다른 주체의 작업이 시작되면 다른 작업이 끝날 때까지 기다렸다 시작하는 것을 말합니다. 

 

non-blocking이란 다른 주체의 작업에 관련없이 작업을 하는 것입니다.

 

blocking과 non-blocking의 가장 큰 핵심은 다른 주체가 작업할 때 자신의 제어권이 있는지 없는지로 판단한다고 합니다.

 

 

Sync vs Async

먼저 synchronous는 잘 알고 있는 동기형식이고 작업을 동시에 수행 또는 끝나거나 끝나는 동시에 시작함을 의미합니다. 이렇게 보면 blocking과 의미가 비슷한 것 같습니다. 하지만 차이가 있죠.

 

asynchronous는 비동기형식이고 시작, 종료가 일치하지 않으며 끝나는 동시에 시작하지 않음을 뜻합니다. 여기도 보면 non-blocking과 비슷한데? 라는 생각이 듭니다. 하지만 여기도 차이가 존재합니다.

 

 

각각의 차이를 보기 위해 표를 먼저 보고 가겠습니다.

이 부분에 공부를 할 때 가장 많이 접하게 되는 표라고 합니다. 가장 먼저 머리에 담아두고 가야 할것이 Blocking과 Non-Blocking을 구분할 때에는 제어권, Sync와 Async를 구분할 때는 결과 처리에 초점을 맞추어야 한다는 것입니다.

 

  1.  Blocking / Sync
    한 작업이 처리되는 동안 다른 작업이 처리되지 않고(Blocking), 결과를 받게 되면 작업을 바로 처리(Sync)하는 방식.
  2. Blocking / Async
    한 작업이 처리되는 동안 다른 작업이 처리되지 않고(Blocking), 결과를 받게 되어도 바로 처리하지 않고 자신의 일이 끝나고 처리(Async)하는 방식. 보통 개발자들의 실수로 나타나게 되는 방식입니다.
  3. Non-Blocking / Sync
    한 작업이 처리되는 동안 다른 작업을 처리하면서(Non-Blocking), 결과 처리 상태를 물어보고 완료되면 받아서 바로 처리(Sync)하는 방식.
  4. Non-Blocking / Async
    다른 작업이 시작되어도 멈추지 않고 자신의 일을 진행(Non-Blocking)하고, 결과 처리를 받아도 바로 처리하지 않고 자신의 일이 끝나고 처리(Async). (ex. 자바스크립트의 callback)

 

비슷한 개념들이지만 제어의 관점에서 보는 것, 그리고 결과처리의 관점에서 보는 것에 따라 나뉜다고 볼 수 있습니다.

 

실제 코드에서 보면 여러가지 복잡게 얽혀 있어서 구분하기는 쉽지 않을 겁니다. 코드의 부분적으로 보면 동기적으로만 작동해, non-blocking으로 작동해. 이런식으로 볼 수도 있겠지만 전체 흐름으로 보게 되면 또 다르게 해석할 수도 있는 부분이 있는거죠.

 

좀 어려운 부분이지만, 실무에서 어떻게 적용될지 궁금해지네요. 튜터분들에게 물어보는 시간도 가져야 될 것 같습니다.

'개발 > Java' 카테고리의 다른 글

디버깅  (0) 2024.11.25
Fetch Join  (0) 2024.11.24
Thread Pool  (0) 2024.11.22
static method(정적 메서드)  (1) 2024.11.21
Request, Response Logging  (1) 2024.11.20