동기방식 (Synchronous) ; 설계가 매우 간단하고 직관적이지만 결과가 주어질 때까지 아무것도 못하고 대기해야 하는 단점.
요청을 보낸 후 응답(=결과)를 받아야지만 다음 동작이 이루어지는 방식이다.
어떠한 일을 처리할 동안 다른 프로그램은 정지한다.
실제 cpu가 느려지는 것은 아니지만 시스템의 전체적인 효율이 저하된다고 할 수 있다.
비동기 방식 (Asynchronous) ; 동기보다 복잡하지만 결과가 주어지는데 시간이 걸리더라도 그 시간동안 다른 작업을 할 수 있으므로 자원을 효율적으로 사용할 수 있는 장점이 있다.
요청을 보낸 후 응답(=결과)와는 상관없이 다음 방식이 동작하는 방식이다.
결과가 주어지는데 시간이 걸리더라도 그 시간 동안 다른 작업을 할 수 있으므로 자원을 효율적으로 사용할 수 있다.
비동기식은 비동기식 처리를 요청할 때 할일 이 끝난 후 처리결과를 알려주는 콜백이라는 함수를 함께 알려준다.
비동기식 처리를 요청하였을 때 호출받은 함수는 바로 응답(=확인)을 수행한다.
이 응답은 처리 결과에 대한 응답이 아니라 요청에 대한 확인 동작일 뿐이다.
호출받은 함수는 처리가 끝나면 요청한 함수를 호출하여 처리 결과를 전달하게 된다.
이러한 함수 호출의 흐름은 사용자가 아닌 일을 마친 시스템이 호출하는 형태이기 때문에 콜백이라고 불린다.
이미 응답을 했기 때문에 처리결과를 함수 호출이라는 형태로 전달하는 것이다.
비동기 방식은 DOS같은 단일 운영체제에서는 불가능하며 windows 같은 multitask 환경에서만 가능하다.
(ajax에서는 success, error, complete 을 콜백함수라고 할 수 있다.)
출처: https://private.tistory.com/24
동기는 결과를 받을 때까지 사용할 수 없으므로, 자원을 효율적으로 사용할 수 있는 비동기를 사용.
비동기 함수를 구현하면 지속적으로 응답할 수 있게 해주지만, 동기적 방식에 비해 많은 비용이 발생한다. 동기적 실행에 대해 다시 한번 봐보자.
// 동기적 실행(프로그램 실행 방향 ->)1단계 -> 2단계 -> 3단계
동기적으로 코드를 작성하면 각 단계가 순서대로 실행되는 구문들의 절차라고 표현할 수 있다. 그리고 각 단계의 결과는 이전 단계의 결과에 의존하게 된다. 변수 및 다음에 발생할 상황을 쉽게 파악할 수 있으며, 코드 작성 및 디버깅이 쉽다. 물론 지연 시간과 완료 시간이 각각 다르다면 모든 작업이 함께 작동한다고 보장할 수 없다.
반면 비동기적으로 코드를 작성하면 위에서 1단계, 2단계, 3단계 작업이 독립적인 작업이라면 어떤 순서로 실행되더라도 상관이 없으며, 동시에 종료될 필요도 없다. 하지만 그렇기 때문에 1단계에서 발생한 데이터를 2단계에서 사용할 수 있다고 보장할 수 없다.
// 비동기적 실행(프로그램 실행 방향은 아래로!)1단계 --------- 완료
|
2단계 ---------------------- 완료
|
3단계 ---완료
그래서 사람들은 각 작업을 순서대로 실행되게 보장되도록 하기 위해 노력했으며, 이런 비동기적 함수 구조를 하나로 묶는 체인을 만들기 시작했다. 즉 콜백 함수를 중첩시키는 것이다. 이렇게 하면 비동기 호출이 일어나더라도 각 단계의 순서를 보장할 수 있었다.