
동기 vs 비동기 : 처리해야 할 작업들을 어떠한 '흐름'으로 처리 할 것인가에 대한 관점
블로킹 vs 논블로킹 : 처리되어야 하는 (하나의) 작업이, 전체적인 작업 '흐름'을 막느냐 안막느냐에 대한 관점
작업이 실행될 때, 해당 작업이 완료될 때까지 기다린다. 즉, 해당 작업이 끝나기 전까지는 다른 작업을 수행하지 않는다. 호출하는 함수가 호출된 함수의 작업이 완료되었는지를 계속 신경쓰고 있다.
반대로, 비동기는 호출하는 함수가 호출된 함수의 작업 완료 여부를 신경쓰지 않는다. 호출하는 함수는 함수를 호출할 때 callback 함수를 같이 전달하고, 작업이 완료되면 callback 함수가 실행된다.
자신의 일이 끝날 때 까지 전체적인 흐름을 막는다.
자신의 일이 끝날 때 까지 전체적인 흐름을 막지 않는다.

async를 함수 앞에 붙이면, “이 함수는 비동기적인 함수이고 Promise를 반환한다”라고 선언하는 것이다. 반환 값이 Promise 생성 함수가 아니어도 반환되는 값을 Promise 객체에 넣는다.
await는 async함수 안에서만 동작한다.
await 키워드를 만나면 Promise가 처리될 때까지 기다린다.
Promise는 비동기 함수가 반환하는 객체