@하마
넵 옳으신 말씀입니다. 우선 말씀해주신 것들에 대한 제 생각을 말씀 드려보자면
예제1)
이 경우 클라이언트와 서버의 통신만 보면 동기, 서버와 미들웨어의 통신은 비동기, 이후 모든 작업이 완료되어 서버가 클라이언트에 push 해주는 방식은 비동기 등 하나의 워크 플로우에도 다양한 방법들이 포함되어 있습니다. 이런 현상은 이 워크 플로우에만 국한되는 것이 아니라 다른 작업들도 마찬가지지요.
그렇기 때문에 결국은 어디까지 묶어서 생각하냐에 이 워크 플로우가 동기냐, 비동기냐는 달라질 수 있다는 생각이 듭니다. 물론 말씀해주신 예의 전체적인 워크 플로우는 비동기식입니다 :)
예제2)
우선 저는 iocp를 사용해본 적이 없기 때문에 이 부분은 양해를 부탁드립니다. 제가 알고 있는 proactor패턴은 비동기 작업이 완료되면 이벤트 핸들링하는 패턴으로 알고있는데, 어떠한 작업이 끝나면 순차적으로 이벤트 핸들러가 호출되므로 마찬가지로 이 관계만 보면 동기라고 해석될수도 있다고 생각합니다.
그러나 이 전체 플로우가 비동기라고 불리는 이유는 상위 프로세스가 proactor 패턴을 사용한 프로세스에게 작업을 지시한 이후, 처리되는 작업들의 순서가 보장되지 않기 때문이기도 하고 상위 프로세스가 해당 작업들의 완료 여부를 신경쓰고 있지 않기 때문이기도 합니다. 작업이 완료된 후의 처리는 미리 등록해놓은 이벤트 핸들러가 처리하는 것이지 작업을 지시한 상위 프로세스가 처리하는 것이 아니니까요.
예제3)
Future 패턴의 isDone, isComplete 등을 사용하는 방식이 동기냐 비동기냐는 개발자들 사이에서도 의견이 갈리는 것으로 알고 있습니다. 저는 개인적으로 작업을 지시한 상위 프로세스가 하위 프로세스의 작업 완료 여부를 신경써야한다는 점에서 이 과정은 동기 방식이라고 생각합니다. 물론 별도의 Executor를 사용하여 처리하는 방법은 비동기이구요.
그리고 말씀하신 부분처럼 동기, 비동기라는 것이 명확한 이론이 아니고 추상적인 개념에 가까운 것이다보니까 어떤 특정 예제를 가져와서 “이게 동기고 이게 비동기다”라고 하는 것에는 무리가 있다고 생각합니다.
그러나 이 개념에 대해서 잘 모르고 계신 분들께 설명할 때는 프로세스, 클럭, 이벤트 등의 개념을 가져와서 설명하는 것보다 익숙한 코드를 예시로 설명하는 것이 더 이해가 잘될 것이라고 생각했습니다. 사실 제가 동기&논블럭의 예제로 사용한 제너레이터 역시 비동기 프로그래밍의 요소 중 하나이기 때문에 엄밀히 따지자면 맞는 예제는 아니지요.
하마님께서 남겨주신 피드백을 하나하나 읽어보면서 제가 포스팅을 작성하면서 “이 정도는 괜찮겠지”하고 넘어갔던 부분들을 예리하게 짚어주셔서 놀랐습니다. 반성하게 되네요 ㅜㅜ
소중한 시간 내어 긴 글로 이렇게 자세하게 피드백주신 분이 처음이라 저도 그에 대한 제 생각을 최대한 적는 것이 예의라고 생각되어 한번 적어보았습니다. 피드백 감사합니다!