🔹 비동기 = 논블로킹?
java 개발자로서 비동기와 논블로킹 처리를 접할 일이 크게 없다가, 최근 WebClient를 학습하며 둘의 차이에 대해 이해하게 되었다.
비동기와 논블로킹이 같은 것인가? 라고 하면 당연히 아니지만, 엄연히 다른 것이냐고 해도 그것도 아니라고 볼 수 있다고 생각한다. 이를 알기 위해서는 각자의 처리 방식을 이해해야 한다.
위 사진은 IBM DeveloperWorks Library에서 제공한 Sync/Async와 Blocking/Non-Blocking의 구분이다.
표를 보면 알 수 있듯이 (동기, 논블로킹)이나 (비동기, 블로킹) 방식 또한 존재할 수 있다는 것이다.
🔹 동기 (Synchronous) / 비동기 (Aynchronous)
1. 동기 (Synchronous)
동기 방식은 각 작업 사이에서 실행 흐름을 일치 시킨다. 특정 작업의 완료 후에만 다음 작업이 시작될 수 있으며, 이를 통해 작업 간의 명확한 순서와 의존성을 보장한다.
2. 비동기 (Aynchronous)
비동기 방식은 작업의 완료 여부와 상관없이 다른 작업을 시작하고 진행할 수 있다. 요청한 작업이 끝나지 않았어도 다음 작업을 바로 수행할 수 있으며, 이를 통해 작업의 순서나 완료 시간에 대한 의존성을 최소화한다.
결론적으로 동기와 비동기의 차이는 작업 간의 의존성이다. 동기는 각 작업이 이전에 수행해야 하는 작업에 의존하는 반면, 비동기는 이전 작업에 상관없이 독립적인 수행을 한다는 것이다.
🔹 블로킹 (Blocking) / 논블로킹 (Non-blocking)
1. 블로킹 (Blocking)
블로킹 방식은 특정 작업의 완료를 대기하는 동안 현재 실행 중인 작업이 그 외 어떤 작업도 수행하지 못하고 멈춘다. 작업의 완료 여부가 진행의 필수 조건이 된다.
2. 논블로킹 (Non-blocking)
논블로킹 방식은 특정 작업의 완료를 대기하는 동안 현재 실행 중인 작업이 완료 여부와 관계없이 다른 작업을 계속해서 수행할 수 있다. 이는 불필요한 대기를 방지하여 자원 활용도를 높일 수 있다.
블로킹과 논블로킹의 차이는 작업 완료 대기 여부라고 볼 수 있겠다. 블로킹은 완료를 대기하며 다른 작업 수행을 중단하는 반면, 논블로킹은 작업 대기 중에도 다른 작업을 수행할 수 있다.
🔹 비동기와 논블로킹의 차이
위 내용만으로는 비동기와 논블로킹의 차이를 크게 체감할 수 없을 것이다.
이제는 callback
과 return
이 두 개의 단어를 사용하여 두 방식의 차이를 느껴보자.
동기와 비동기의 차이는 작업 간의 의존성이라고 하였다. 이는 즉 각 작업이 이전 작업에 영향을 받는지에 대한 차이이다. callback
함수를 생각해보자. 대표적인 비동기 함수인 callback
을 통해 부른 작업은, 스스로 자신의 일을 처리하기 때문에 다른 작업이 종속될 일이 없는 것이다.
결국 동기 및 비동기는 특정 작업이 완료되어 변형되거나 반환 된 데이터들이 다음 작업에 영향을 미치는 지에 따라 선택할 수 있다.
그렇다면 블로킹과 논블로킹의 차이를 보자. 작업 완료 대기 여부라는 것은 의존 여부와 관계 없이 이전 작업의 완료에 대해 기다릴지 말지 결정하는 것이다. 논블로킹 방식 같은 경우에는 완료를 하지 않더라도 즉시 return
을 하여 그 작업의 진행을 지속하도록 하고, 이후에 완료 처리를 진행한다.
이를 보면 의존성과 완료 여부로, 구분하는 개념 자체가 다르다고 볼 수 있다.
🔹 각 조합의 차이
- 동기 + 블로킹: 이전 작업에 대한 처리를 위해 이전 작업 완료를 대기
- 동기 + 논블로킹: 이전 작업에 대한 처리를 위해 완료 되었는지 반복적으로 확인 (어찌 됐든 이전 작업 처리를 못하니 대기 발생)
- 비동기 + 논블로킹: 이전 작업 처리를 할 필요가 없으므로 이전 작업 완료를 대기하지 않고 다른 작업 수행
- 비동기 + 블로킹: 이전 작업처리를 할 필요가 없음에도 불구하고 이전 작업 완료를 대기
'개발자 커리어 및 교육 > 개발 지식' 카테고리의 다른 글
네이밍 컨벤션 (Camel Case, Pascal Case, Snake Case, Kebab Case, Hungarian Notation) (0) | 2024.07.15 |
---|