동기비동기 방식.


처음으로 클라이언트/서버 프로그래밍을 할 때 수없이 강조받은 내용이다.


클라이언트와 서버 통신을 동기와 비동기 방식 중 어떤 방식으로 할 것인지 결정하는 것.


동기식 서버를 구성할 것인지, 비동기식 서버를 구성할 것인지.


하지만 이 얘기를 들으면서 항상 궁금했다.


뭐가 동기식이고 뭐가 비동기식인지.


둘의 개념을 살펴보고 책을 뒤져보며 이해하려해봤는데 명확히 머리속으로는 그려지지 않았다.


그리고 지금, 지금껏 이해하고 명확하게 된 부분만이라도 정리한다.



한 마디로 말해서, 동기비동기는 A와 B 두 대상이 데이터를 주고 받는 교환하는 방법의 차이이다.



동기식 처리 방법은 A가 B에게 데이터를 요구했을 때, 이 요청에 따른 응답을 주어야만 A가 다시 작업 처리가 가능하다.


Synchronous란 뜻은 '동시에 일어난다'라는 뜻을 가지며, 

여기서 동시에 일어난다는 것은 요청에 따른 응답이 동시에 일어난다는 것을 뜻한다.


Asynchronous란 뜻은 '동시에 일어나지 않는다'라는 뜻을 가지며, 비동기식 처리 방법은

A의 요청에 따른 응답을 B가 즉시 전해주지 않아도, 그 유휴 시간동안 A는 또 다른 작업을 처리 가능한 방식을 의미한다.


여기서 유휴 시간의 존재가 있다고해서 비동기식 처리 방법은 굉장히 느린 것이 아니다. 이 유휴 시간은 요청에 따라

B가 이를 처리하는 과정이 무척 길수도 있겠지만, 대부분 굉장히 짧다. 단지, 연속적인 속성을 지니지 않을 뿐이다.


컴퓨터는 사람에겐 무척이나 짧은 1초동안 자신의 CPU 헤르츠만큼 작업을 수행할 수 있다.

그렇기에 1초, 아니면 1초보다 더 짧게 내지는 더 긴 시간을 아무 행동없이 보내는 것은 컴퓨터 활용에서 굉장히 아쉽다.


이런 시간들을 사용하여 좀 더 유연하고 효율적인 작업을 하는 방식을 비동기식 방식이라고 하며,

오직 하나의 작업에만 충실하여, 이 작업 이외엔 컴퓨터를 활용하지 않는다면 동기식 방식이라고 한다.


이 개념은 소켓 네트워크에서 블로킹과 논블로킹 방식과도 매우 유사하다.



하지만 언제나 이런 개념을 알아도 막상 하나의 게임이나 서비스를 생각하면서 이 클라이언트/서버 구조가

비동기 방식인지, 동기 방식인지 떠올리기는 어렵다.



그럴때면, 한 시점에 반드시 A와 B의 데이터가 반드시 일치해야 하는 경우를 살핀다.

일치하지 않았을 경우 정말정말 치명적인 상황.


바로 은행 계좌 처리이다. 한 사람이 ATM기기에서 돈을 출금했는데, 그 계좌 잔고의 변화가 즉각 갱신이 일어나지 않으면

이것이 조금씩 커져 결국 전체 시스템의 문제로 발생한다. (절대 그럴 일 없겠지만, 이렇게되면 그 은행은 아마 망할 것 같다.)


확실한 것은 이 글을 쓰고있는 나도 아직 명확하게 감이 안잡힌다. 아니 애초에 정답이란게 있는 부분인가.


서버를 동기/비동기 둘 중에 하나를 선택하라고 했지만, 은행을 제외한 대부분의 서비스는 비동기라고 생각한다.


왜냐하면 만약 동기 서버라면 클라이언트 A가 요청을 보내기 전까진 그 서버는 멈춘채 클라이언트 A의 요청을 기다린다.

하지만 실제 서버에 연결된 클라이언트는 A만 있는 것이 아니라 적게는 수 백명 부터 많게는 수 천, 수 만명까지. 서버는

여러 클라이언트의 요청을 동시에 처리해야 하는 서비스를 가진다.


그렇기에 단순히 클라이언트 A 하나만의 동기화가 아닌 여러 클라이언트의 작업을 처리할 수 있어야 한다. 그래서 대부분의

서버는 비동기식 서버라고 생각은 하지만!!!


이 부분이다!

항상 헷갈리는 부분. 

은행 계좌와 마찬가지로 게임이나 서비스로 치면 그 컨텐츠의 크리티컬한 요소는 반드시 데이터 동기화가 이루어져야 한다. 

그렇지 않다면 그 서비스는 망할테니까.


분명 수 많은 클라이언트들의 접속을 유지하기 위해선 구성은 비동기식으로 해야할 텐데, 그 작업의 갱신은 동기화가 이루어

져야 한다.


???


뭘까 도대체. 놓치고 있는 부분이.


비동기식 서버 안에서 새롭게 동기화 시키는 부분이 필요한걸까, 물론 필요하겠지. 그럼 그 방식이 동기식 서버랑은 

관련이 없는 내용일까? 아니면 비동기식 서버 틀안에서 동기식 서버로 구성된 부분이 있는 걸까. 혼재된걸까?


분명 쓰기 전까지만 해도 뭔가 명료해서 작성하고 있었는데, 쓰다보니 다시 의문이다.


역시 이 부분은 직접 동기식과 비동기식 서버를 구성해서 비교해보지 않는 이상 이론만으로는 풀리지 않을 것 같다.


그래서 나중에 정말 다시 정리되면 새로 쓰기로하고 제목도 수정했다.




+ Recent posts