1. 동기와 비동기

프로그래밍을 공부해본 사람은 한 번 쯤 “싱글 스레드”, “멀티 스레드”, **“동기”**나 **“비동기”**같은 알쏭달쏭한 단어들을 들어보게 된다. 자바스크립트를 학습하면서도 비동기 처리라던가, 비동기 통신이라던가 하는 말들을 접하게 되는데 대체 이 비 동기라는 것이 무엇을 의미하는 것이고, 개발에 있어 어떤 고려사항이 있는 걸까?

이 장에서는 먼저 동기비동기가 무엇을 의미하는지 알아보고, 자바스크립트 상에서의 그 예시를 살펴보자.

1.1. 동기

자바스크립트를 학습하면서 “비동기”와 관련된 테크닉을 많이 접하게 되지만, 의외로 자바스크립트는 동기식 언어이다. **동기(Syncronous)**는 순차적인 흐름을 가진다. 하나의 작업이 실행되는 동안, 뒤의 다른 작업들은 그대로 멈춘 채 자신의 차례가 오기까지를 기다린다.

손님이 새우버거를 먹기 위해 패스트푸드점에 방문하는 상황을 떠올려보자. 손님은 카운터로 가서 점원에게 “새우버거 주세요”라고 주문하며 카드를 건넬 것이다. 점원은 주문을 듣고 ‘새우 재고가 충분히 있었던가?’ 잠시 생각해본 뒤 햄버거 값을 결제한다. 그동안 손님은 결제가 완료될 때 까지 카운터에서 멍하니 기다릴 것이고, 결제가 완료되면 주문번호가 적힌 영수증과 손님의 카드를 점원이 돌려주며 주문이 완료된다.

1-1. 동기식 방식에서의 처리 흐름

1-1. 동기식 방식에서의 처리 흐름

이 일련의 과정 중에서 동기식 프로그램의 특징을 엿볼 수 있다. 손님이 주문을 요청(새우버거)하면, 점원은 그 요청에 대한 처리를 거쳐 응답(영수증과 카드)을 내놓는다. 그리고 손님은 응답이 돌아오기까지 카운터를 떠나지 않고 기다린 뒤, 응답을 받고 나서야 다음 행동을 할 수 있다.

한 번에 하나의 태스크를 수행하는 것은 싱글 스레드(Single Thred)에서 코드가 동작할 경우이다. 요청에 대한 처리를 할 수 있는 주체가 단 하나만 존재하기 때문에 위와 같이 순차적인 흐름을 가질 수 밖에 없다.

싱글 스레드를 사용하는 동기식의 작업은, 작업의 순서가 보장되어있어 설계가 단순하고 안전하다는 장점이 있다. 하지만 응답이 돌아오기까지 다음 동작으로 넘어가지 못하기 때문에, 자원을 효율적으로 사용하지 못한다는 점이 단점.

1.2 비동기

**비동기(Astnchronous)**는 반대로, 어떠한 요청을 보내면 해당 요청의 응답에 관계 없이 바로 다음 동작이 실행된다. 즉, 실행중인 작업이 끝나기를 기다리지 않고 바로 다음 작업으로 넘어갈 수 있다는 뜻이다.

아까의 패스트푸드점에 이번에는 점장이 방문했다. 매장에 손님이 없는 것을 확인하고는 점원들에게 오늘 해야할 업무를 지시내린다. 점원1에게는 청소를, 점원2에게는 설거지를 해 달라고 요청한 뒤 점장은 구석에서 식사를 한다. 그럼 점장이 식사를 하는 동안 점원들은 각각 청소와 설거지를 하며 매장을, 접시를 구석 구석 닦는다.

1-2. 동기식 방식에서의 처리 흐름

1-2. 동기식 방식에서의 처리 흐름

점원들의 작업은 비동기식으로 처리되고 있다. 점장은 점원1에게 요청을 보낸 후, 응답을 받지 않은 상태에서 점원2에게 다시 다른 요청을 보낸다. 둘 모두 완료 보고라는 응답이 돌아오지 않았지만 점장은 신경쓰지 않고 다음 작업으로 넘어갈 수도 있다.

멀티 스레드(Multi Thred) 방식에서는 요청을 처리할 수 있는 작업 단위가 여러 개이기 때문에, 하나의 태스크가 끝나기를 기다리지 않아도 다음 실행을 할 수 있게 된다.

멀티 스레드를 사용하는 비동기식의 작업은, 요청에 대한 응답이 늦어지더라도 그 시간동안 다른 작업을 할 수 있다는 장점이 있다. 하지만 싱글 스레드와 비교하면 설계가 복잡한데다가, 만약 비동기식으로 보낸 요청의 결과가 다음 실행에 영향을 미치는 경우에는 코드가 개발자의 의도와 다르게 동작할 수 있음을 주의해야 한다.

1.2.1 비동기식 실행의 예