동기와 비동기란?
동기(Synchronous)는 답변을 기다리는 것, 비동기(Asynchronous)는 답변을 기다리지 않는 것이다. 2명의 사람이 수박을 트럭에 싣는 일을 한다고 가정한다. 여기서 사람 A는 수박을 들어서 다른 사람 B에게 전달한다. B는 수박을 받아서 트럭에 싣는다. 이때, 동기 방식으로 일은 진행하면 사람 A가 B에게 수박을 전달하고, B가 트럭에 수박을 싣고 난 후 "다 됐어!"라고 답변할 때까지 A는 답변을 기다리며 다음 일을 진행하지 않는 방식이다. 즉, B에게서 답변이 오면 A가 다음 일을 진행하는 것이다. 비동기 방식으로 일을 진행하게 되면 A가 B에게 수박을 전달하고, B가 수박을 전달받았든지 못 받았든지 A는 다시 수박을 전달하는 일을 진행한다. 다른 예로 택배기사가 택배 배달을 하는 일을 생각한다. 동기방식으로 일을 진행한다고 가정할 경우 택배기사가 1호 집에 택배를 전달한다. 그리고 나면 1호 집에서 "잘 받았습니다"라는 답변이 올 때까지 일을 하지 않고 기다린다. 답변이 오고 나면 2호 집에 택배를 전달한다. 비동기식으로 일을 진행하면 1호 집에 택배를 전달하고, 답변을 기다리지 않고 바로 2호 집으로 이동하여 일을 한다.
동기와 비동기의 장단점
위의 예에서 보면 비동기가 훨씬 더 효율적이라는 생각이 든다. 답변을 기다리는 단계가 없이 바로바로 일을 진행하기 때문에 자원을 효율적으로 사용할 수 있는 것이다. 하지만 비동기식으로 일을 진행하게 되면 전달을 잘 받았는지, 못 받았는지 결과를 확인할 수 없다. 택배기사는 물건을 전달했다고 하지만 물건을 받아야 할 사람이 받지 못했다고 하는 경우 문제가 되는 것이다. 때문에 이 경우 물건을 잘 전달했다는 사진을 찍는 행위를 추가해 준다. 행위가 하나 추가되기 때문에 비동기방식의 경우 효율적이긴 하지만 일의 방식이 조금 복잡해지는 단점이 있다. 정리하면 동기 방식의 경우 업무가 단순하지만 답변을 기다려야만 하기 때문에 자원이 비효율적인 방식으로 사용된다. 비동기 방식의 경우 기다리는 시간이 없기 때문에 자원이 효율적으로 사용된다는 장점이 있지만 추가적인 프로세스로 인해 업무가 복잡해질 수 있다는 단점이 있다.
Blocking과 Non-blocking
동기 방식에서 상대방의 답변을 기다리는 상태를 나타내는 용어가 있다. 바로 Blocking이다. 비동기식에서 답변을 기다리지 않는 형태를 표현하는 용어는 Non-blocking이 된다.
동기를 사용하는 경우
만약 어떤 일에 대한 결과로 인해 다음 일이 수행되는 방식의 일인 경우에는 동기 방식으로 일이 진행되어야 한다. 아이스크림 가게에서 아이스크림을 사고 남은 돈으로 정육점에서 고기를 산다고 할 때 아이스크림 가게에서 아이스크림을 사고 거스름돈을 받지 않은 상태로 정육점으로 이동해서는 안될 일이다. 이와 같이 결과가 다음 행동에 대해 지장을 주는 경우가 생길 경우 동기 방식으로 진행을 해야 한다. A계좌에서 B계좌로 만 원을 이체하는 일을 진행한다고 하면 이 방식 역시 동기로 진행되어야 한다. A계좌에서 돈을 인출하는 프로그램을 실행한 뒤 결과를 기다리지 않고 B에게 만 원을 송금할 수는 없기 때문이다. 돈이 성공적으로 인출되었다는 결괏값을 받은 후에서야 B에게 돈을 송금할 수 있다.
댓글