Search
▪️

Understanding Async Await in Node.js

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에 대해서만 사용 가능하다.