티스토리 뷰
동기(sync) vs 비동기(async), 블로킹 vs 논블로킹
사전적 의미는 일단 치워두고, 대조되는 개념들을 어떤 관점으로 봐야하는지 짧게 설명해보겠습니다.
- 동기 vs 비동기 : 처리해야 할 작업들을 어떠한 '흐름'으로 처리 할 것인가에 대한 관점
- 블로킹 vs 논블로킹 : 처리되어야 하는 (하나의) 작업이, 전체적인 작업 '흐름'을 막느냐 안막느냐에 대한 관점
이제 동기 vs 비동기, 블로킹 vs 논블로킹을 예제로 쉽게 설명해보겠습니다.
등장인물
- 개발팀장 : 개발팀 작업의 흐름을 조율하고, 개발팀 사원들에게 업무를 지시한다.
- 사원1, 사원2, 사원3 : 개발팀장이 지시한 일을 성실하게 수행한다.
시나리오1 (비동기 + 논블로킹)
- 개발팀장이 사원1에게 업무A를, 사원2에게 업무B를, 사원3에게 업무C를 지시하였다. (비동기적 작업 지시)
- (그리고 바쁜 개발팀장은 개발팀 업무 이외에도 다른 업무를 보기 시작한다.)
- 사원들은 각자 본인의 맡은 작업을 끝내는대로 개발팀장에게 보고한다. (논블로킹 방식의 작업 처리)
시나리오1은 일반적인 회사의 작업 '흐름'입니다. 개발팀장이 사원들에게 업무를 지시하고 사원들은 본인이 맡은 일을 수행한 후에 개발팀장에게 본인의 작업을 보고하는 방식입니다.
여기서 개발팀장이 업무들을 '비동기적' 방식으로 처리하고 있습니다. 그리고 사원들은 본인의 작업을 '논블로킹' 방식으로 수행합니다.
시나리오2 (동기 + 논블로킹)
만약에, 개발팀장이 업무를 '동기적'으로 처리한다면 아래와 같은 시나리오가 발생됩니다.
- 개발팀장이 사원1에게 업무A를 지시한다.
- 개발팀장은 사원1이 업무A를 끝맞칠때 까지 사원1 모니터 뒤에서 기다린다.. .. 끝날 때 까지.. (동기적 작업 지시)
- 사원1이 업무A를 끝내면 개발팀장이 확인한다.
- 개발팀장이 사원2에게 업무B를 지시한다.
- 개발팀장은 사원2가 업무B를 끝맞칠때 까지 사원2 모니터 뒤에서 기다린다.. .. 끝날 때 까지.. (동기적 작업 지시)
- 사원2가 업무B를 끝내면 개발팀장이 확인한다.
- ....(사원3은 생략)...
전체적인 작업의 흐름을 제어하는 개발팀장이 사원에게 업무를 지시하고, 그 사원이 해당 업무를 끝내고 보고 받을 때 까지 기다리게 됩니다.
사원2와 사원3은 업무만 지시된다면 성실하게 수행할 준비가 되어있지만, 개발팀장의 작업 흐름상 앞선 사원의 일이 끝날 때까지 작업을 진행하지 못하게 됩니다.
시나리오3 (비동기 + 블로킹)
만약에, 개발팀장이 업무를 '비동기적'으로 처리하지만 사원들이 업무를 '블로킹'하게 진행한다면 아래와 같은 시나리오가 발생됩니다.
- 개발팀장이 사원1에게 업무A를 지시하고, 사원2에게 업무B를 지시하고 싶었지만... (비동기적 작업 지시를 하고 싶었지만)
- 사원1이 개발팀장을 붙잡는다. (블로킹 방식의 작업처리)
- 그리고 사원1은 자신의 일이 다 끝날때 까지 개발팀장을 놓아주지 않는다.
- 사원1의 업무가 끝나고 보고받고 나서야, 개발팀장은 사원2에게 업무B를 지시한다.
- ...(사원2,3 생략)..
개발팀장이 '비동기적'으로 작업을 진행하고 싶다하여도, 사원들이 개발팀장을 붙잡는다면 (blocking) 개발팀장은 사원들의 업무가 끝나고 보고 될 때까지 기다리게 됩니다.
시나리오4 (동기 + 블로킹)
(시나리오2와 동일하게 진행됩니다.)
결론
동기-비동기를 말하고자 한다면 개발팀장에 입장에서, 그리고 블로킹-논블로킹을 말하고자 한다면 사원의 입장에서 생각해야 합니다. (그리고 개발팀장도 상사에게 업무를 지시 받게 된다면 블로킹vs논블로킹 관점에서 생각해볼 수 있습니다.)
이를 조합하면 4가지에 경우가 발생되며, 비동기(async)+논블로킹 방식이 갖는 장점은 다른 3가지 경우에 비교하여 독보적이라 할 수 있습니다. 흔히 '비동기로 처리했다' 라는 말을 주로 사용하는데 이는 수행하고자 하는 작업이 '논블로킹'임을 내포하는 말입니다.
이렇게만 보면 '동기' 혹은 '블로킹' 방식이 효율적이지 못한 방식같지만, 순차적으로 작업이 처리되어야 한다면 '동기' 혹은 '블로킹' 방식을 사용해야 합니다.
'Development' 카테고리의 다른 글
절차지향 프로그래밍 붐은 온다.. (객체지향에 얽매이지 말자) (0) | 2024.05.15 |
---|---|
슬랙 앱 만들기 삽질 기록기 (0) | 2023.10.15 |
IntelliJ Live Template으로 테스트 코드 빠르게 작성하기 (0) | 2021.10.17 |
maven 저장소에 라이브러리 업로드하기 (2) | 2020.09.13 |
TDD로 개발하면 좋을까? (why TDD) (4) | 2019.06.16 |