SPA에서는 한 페이지 안에 다양한 기능이 존재하고, 한 기능이 실행 되었을 때 나머지 기능들이 동기적 실행이 완료 되기를 대기하며 작동하지 않으면 안된다.
예를 들어 유튜브에서 어떤 영상을 클릭했는데 그 영상이 모두 로딩될 때까지 어떠한 추가 기능도 실행되지 않고 blocking 되어있으면 안 될 것이다.
기능 실행 등 요청이 접수된 후에 비동기적인 작업이 진행되어야 다른 기능들도 한 웹앱 안에서 순조롭게 작동할 수 있게 된다.
heavy한 작업을 하는 동안(예시: 네트워크에서 데이터를 받아오거나, 파일에서 무언가 큰 데이터를 읽어오는 그런 과정) 사용자의 요청에 응답을 하려면 다음 코드가 실행되어져야 한다.
console.log('test')
가 먼저 실행되었다.비동기가 코드 실행 시 매번 적용되는 것은 아니다. 사용자의 요청이 실행되거나 요청에 대한 응답이 돌아왔을 때는 또 다시 순차적으로 명령이 수행되어야 할 때도 있다.
예를 들어 유튜브에서 '먹방'이라고 검색하여 검색 결과를 받아오는 것은 비동기적으로 실행되어야 하지만 검색어 '먹방'으로 인해 도착한 검색 결과들을 다시 사용자에게 원하는 대로 가공해서 보여주기 위해서는 비동기 실행이 끝난 "후"에 그 결과를 가지고(여기가 매우 중요) 코드를 작성해 원하는 결과를 시각화 할 수 있다.
어쨌든 일단 비동기로 발현한 것을 잡아와 다시 동기적 순서에 맞춰 가공하는 것이 쉽지는 않았을 것이다. 이를 보완하고자 아래와 같은 방법(callback → Promise객체 → Async/Await)들이 발전해 왔다.
call back 함수를 이용해 비동기적으로 A, B, C 로그 찍기
아래 코드에서 볼 수 있듯이 비동기 처리 구현은 가능하나 "콜백 지옥"이라는 것이 형성되었고, 가독성 또한 떨어지는 구조이다.
Promise 객체를 사용할 때에도, 테크닉이 부족하다면 아래와 같이 Promise hell에 빠질 수 있다..
따라서! return을 잘 명시해주어 코드 가독성을 높이자.
Async - Await은 Promise 객체의 sytax sugar 같은 개념이라고 한다.
Async는 await과 항상 함께 한다. Await 모드는 Promise 객체를 받아 처리하고, 만약 비동기 함수가 아닌 동기적 함수라면 리턴 값을 그대로 받는다.
Async 함수는 Promise가 없으면 의미가 없다. Promise 객체를 통해 비동기적으로 처리된 내용을 동기적인 코드 진행 순서로 보여주는 역할을 하기 때문이다.(아하! 명확하게 이해가 갔다!)
3가지는 용도에 맞춰서 적절히 사용해야 한다. callback은 별 다른 키워드 없이도 구현할 수 있는 문법이기 때문에 간단한 것을 구현하는,, 복잡한 상황이 아닐 때 사용하면 좋다. callback 외 Promise나 Async-await 방식은 Promise 인스턴스로 전환되었다가 다시 돌아오는 작업을 거쳐야 하기 때문에 이 과정을 굳이 하지 않아도 되는 상황까지 고려했을 때 callback도 때에 따라선 좋은 답이 될 수 있다.
유튜브:
https://www.youtube.com/watch?v=U57kU311-nE
naseriansuzie님 블로그:
https://velog.io/@naseriansuzie/imcourseTIL20