What is Async Await All About?
•
Async Await은 JavaScript에서 굉장히 핵심적인 Keyword이다. (Node.js Runtime 만의 Keyword가 아니다. Modern Browser나 Frontend에서도 사용이 가능한 Keyword이다.)
•
Async Await은 Asynchronous한 Code를 Synchronous하게 작성할 수 있도록 돕늗다. (Asynchronous한 Code가 Synchronous하게 동작하도록 하는 것은 아니다.)
•
그렇다면 Asynchronous한 Code에 Async Await을 이용하기 위해서, Code가 Asynchronous하다는 것을 어떻게 알 수 있는가? → Promise를 이용하는 구문들이 바로 Asynchronous이다. (Promise가 Asynchronous한 Code를 처리할 수 있도록 만들어진 Object이기 때문이다.)
•
Synchronous하게 보이도록 Code를 작성하는 Async Await는 Node.js를 Blocking Execution하게 만드는가? → 그렇지 않다. 말 그대로 Synchronous하게 보이는 것일 뿐이고 이는 여전히 Asynchronous하기 때문에 Non-Blocking Exeuction이다.
•
그렇다면 기존에 이용했던 then() catch() Method들은 무엇인가? → Callback들인데, 이 녀석들도 Asynchronous한 Code를 처리할 수 있는 또 다른 방법이다. (이전의 작업이 완료되면 수행할 Callback Function을 작성하는 방식으로 말이다.) 이와 같이 처리하면, Callback Function들이 복잡하게 Nested 될 가능성이 높고, 이는 곧 가독성이 떨이지는 현상으로 이어진다.
** Async Await들은 Promise Type에 대해서 처리를 하는데, Mongoose Operation들은 Mongoose 특성상 Real Promise Type을 Return하지 않고 Promise-Like Object를 Return한다. 그렇다고 Async Await이나 then() catch() Method를 이용 못하는 것은 아니지만, 정확히 Promise Type이 아님을 알아둬야 한다. 그렇다면 이런 Mongoose의 Operation들은 Promise가 아닌데, Promise처럼 동작할 수 있게 해주는 것은 어떻게 가능한 것일까? 바로 Mongoose가 이를 지원하기 때문에 Promise처럼 동작하게 하여 Operation들이 Promise-Like Object를 Return하게 되는 것이다.
** 추가적으로 참고하자면, Mongoose Operation들이 실제 Promise를 Return하도록 만들고 싶다면, exec() Method를 Chaining으로 걸어주면 된다.
Transforming "Then Catch" to "Async Await"
•
Callback Chaining시 then() catch() Method를 통해서 Error Catch를 했다면, 이를 async await로 바꾸게 되면 Error Catch는 try catch를 이용하도록 한다.
** Async Await은 Callback에는 이용 불가능 하다는 것을 명심해야 한다. 오로지 then() catch() Method로 이용하는 Promise에 대해서만 사용 가능하다.