# 동기, 비동기

### Sync 와 Async

***

#### 동기 방식

{% hint style="info" %}
**Sync 란?**

실행 함수의 결과 값이 반환 되기 까지 스레드가 대기하는 동작 방식이다.

\
논리적 흐름이 순차적으로 흘러가기 때문에 함수의 결과 값을 기준으로 이후의 다른 행위를 하는데 재료로 사용할 수 있다.
{% endhint %}

동기 방식은 함수의 결과를 대기 하기 때문에 시간이 오래 걸리는 함수를 사용자가 모두 감당하기엔 유저 경험이 떨어질 수 있다.

> ***하지만, 무작정 긴 대기 시간을 기다려야 한다고 사용하지 말아야 할 동작 방식일까?***

* 대부분의 프로그래밍을 하게 되면 초기엔 동기 방식으로 동작하게 설계하며 논리적 흐름대로 작성하면 되기 때문에 구현이 굉장히 간단하다.
* 실행을 제어하는 함수가 대기하고 있기 때문에 에러가 발생하는 지점을 추적하기 용이하다.
* 하나의 함수가 반환하는 결과를 필요로하는 의존 관계에 효율적이다.

예를 들어, 은행 업무를 보고 있다고 가정해보자.

은행의 대부분 인터넷 업무들은 한 번에 한 명의 사용자만 접근이 가능한데, 만약 내가 은행 사이트에 있는 정보를 가져오기 위해 로그인 하고 데이터를 추출하는 프로그램을 만들었다.

처음엔 동기 방식으로 구성하여 한 번의 데이터를 추출할 때 너무 긴 시간이 걸려서 비동기를 사용하고자 모두 개선했다.

데이터가 갑자기 추출되지 않는다. 어떤 문제가 있을까?

당연, 비동기 통신으로 인해 현재 로그인 한 사용자가 로그아웃 하지 않고 다시 로그인을 시도하게 되어 동시 접속으로 인해 데이터를 가져오지 못하게된다.

이런 경우엔 동기 방식으로 데이터를 가져와야하는데, 과연 비동기는 전지전능 하지 않다.

#### 비동기 방식

{% hint style="info" %}
**Async 란?**

실행 함수의 결과 값이 반환 여부와 상관 없이 스레드가 다른 논리적 행위를 실행 시킬 수 있는 동작 방식이다.

주로, 행위에 대한 결과를 반환하기 까지 시간이 오래 걸리는 경우 비동기 통신 방식을 통해 사용자에게 긴 대기 시간 대신, 다른 행위를 할 수 있도록 자율권을 넘긴다.
{% endhint %}

요즘의 생성형 AI 가 사용자에게 답변을 제공하기 까지 수 초가 소요된다. 사용자는 AI 의 답변을 기다릴 때 까지 화면이 멈추고 현재 페이지에서 다른 동작을 못한다고 하면 우린 10초가 걸렸을 때 한 화면만 보고 있을 수 있을까?

이렇게, 내가 결과를 기대하지 않고 실행에만 중점을 두며 결과는 함수가 반환 되었을 때 받도록 구성할 수 있는 비동기 동작 방식은 많은 사용자에게 편리성을 주었다.

하지만, 비동기 동작 방식은 실행 흐름이 보장 되지 않는다.

> ***비동기의 달콤함이 사용자에게 어떤 고통스러운 보상을 선물할까?***

1. 비동기 동작 과정에서 중간에 동기식 코드가 섞여 있으면, **그 부분에서 블로킹되어 전체 흐름이 느려진다**
2. 함수 호출 결과의 순서를 보장하지 않기 때문에 첫 번째 함수가 두 번째 함수보다 먼저 도착하리란 보장이 없다.
3. 여러 비동기 작업이 있을 때, 각 작업의 완료 시점을 예측하기 어렵다. 따라서 의도한 순서대로 실행되도록 제어하는 복잡한 로직이 필요할 수 있다
