JavaScript Visualized: โญ๏ธ๐ Promises & Async/Await
Posted on September 03, 2020ย - ย 10 min readreference: https://dev.to/lydiahallie/javascript-visualized-promises-async-await-5gke
JavaScript ์ฝ๋๋ฅผ ๋ค๋ค๋ณด์ ์ผ ํ๋ ์ ์ด ์์ผ์ ๊ฐ์? ์์๋๋ก ์ ๋์ํ์ง ์์๋์? ์๋ง ํจ์๋ค์ด ์์๋ก ์์ ๋ชปํ ์์ ์ด๋ ์ง์ฐ๋์ ์คํ๋ ์ ์ด ์์ฃ . ES6์๋ ์ด๋ฐ ๊ฒ๋ค์ ์ํ ์์ฃผ ๋ฉ์ง ๊ธฐ๋ฅ์ด ์๊ฐ ๋์ต๋๋ค: Promise์ฃ !
๋ช ๋ ์ ์ ๊ถ๊ธํ๋ ๊ฒ๋ค์ด ์์๊ณ ์ ์ด ์ ์ค๊ธธ๋ ๋ค์ ํ ๋ฒ ์ ๋๋ฉ์ด์ ์ ๋ง๋ค ๊ธฐํ๊ฐ ์๊ฒผ์ต๋๋ค. Promise์ ๋ํด ์ด์ผ๊ธฐ๋ฅผ ํด๋ณด์ฃ : ์ ์ฐ๋ฆฌ๊ฐ ๊ทธ๊ฑธ ์จ์ผํ๊ณ , ๋ด๋ถ์์ ์ด๋ป๊ฒ ๋์ํ๋์ง์ ๋ํด์์. ๊ทธ๋ฆฌ๊ณ ์ต๊ทผ์ ์ด๊ฑธ ์ฌ์ฉํ๋ ๊ฐ์ฅ ๋ชจ๋ํ ๋ฐฉ๋ฒ์ ๋ญ๊น์?
๋ง์ฝ ์ด์ ์ ์์ฑํ JavaScript Event Loop ํฌ์คํธ๋ฅผ ๋จผ์ ์ฝ์ด๋ณด์๋ ๊ฑธ ์ถ์ฒ๋๋ฆฝ๋๋ค! ์ด๋ฒ ํฌ์คํธ์์๋ ์ฝ ์คํ, Web API์ Queue์ ๋ํ ๊ธฐ๋ณธ ์ง์์ ์ ์ ๋ก ์์ฑ๋๊ณ , ์ฌ๊ธฐ์๋ ๊ฝค ํฅ๋ฏธ๋ก์ด ์ถ๊ฐ ๊ธฐ๋ฅ๋ค์ ๋ค๋ค๋ณผ๊ฑฐ์์! ๐คฉ
๐โจโป๏ธJavaScript Visualized: Event Loop
์๊ฐ
JavaScript๋ฅผ ์์ฑํ ๋, ์ฐ๋ฆฐ ์ข ์ข ๋ค๋ฅธ ์์ ์ ์์กด๋ ์์ ์ ๋ค๋ค์ผํ ๋๊ฐ ์์ต๋๋ค. ์ด๋ค ์ด๋ฏธ์ง๋ฅผ ๋ฐ๊ณ , ์์ถํ๊ณ , ํํฐ๋ฅผ ์ ์ฉํด์ ์ ์ฅํด์ผ๋๋ ์ํฉ์ด ์๋ค๊ณ ํด๋ณด์ฃ ๐ธ
๊ฐ์ฅ ์ฒ์ ํด์ผํ ๊ฑด ํธ์งํ ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ๋๋ค. getImage
ํจ์๊ฐ ์ด๊ฑธ ๋ด๋นํ์ฃ ! ์ด๋ฏธ์ง๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ๋ก๋ํ๊ณ ๋์์ผ์ง๋ง, resizeImage
ํจ์๋ก ์ ๋ฌํ ์ ์์ต๋๋ค. ์ด๋ฏธ์ง๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ๋ฆฌ์ฌ์ด์ฆ ํ๊ณ ๋๋ฉด, ํํฐ๋ฅผ ์ ์ฉํ๊ธฐ ์ํด ์ด๋ฏธ์ง๋ฅผ applyFilter
๋ก ๋ณด๋ด์ฃ . ์ด๋ฏธ์ง๊ฐ ์์ถ ๋๊ณ ํํฐ ์ฒ๋ฆฌ๊ฐ ๋ ํ์ ์ด๋ฏธ์ง๋ฅผ ์ ์ฅํ๊ณ ์ฌ์ฉ์์๊ฒ ๋ชจ๋ ์์
์ด ์๋ฃ๋๋ค๊ณ ์๋ ค์ค์ผ ํฉ๋๋ค!
๋์ ๊ฐ๋ฉด, ์ด๋ฐ ์์ผ๋ก ์์ฑ์ด ๋ ๊ฒ๋๋ค:
ํ ..์ฌ๊ธฐ์์ ๋ ์ฌ๊ฒจ ๋ณผ๋งํ ๊ฒ ์๋์? ๊ด์ฐฎ์ ํธ์ด์ง๋ง ํ๋ฅญํ์ง ์์ฃ . ์ด์ ์ฝ๋ฐฑ์ ์์กดํ๋ ์ค์ฒฉ๋ ์ฝ๋ฐฑ์ด ๋ง์ด ์์ต๋๋ค. ์ฐ๋ฆฐ ์ด๊ฑธ ์ข ์ข ์ฝ๋ฐฑ ์ง์ฅ์ด๋ผ๊ณ ๋ถ๋ฅด์ฃ . ์ค์ฒฉ๋ ์ฝ๋ฐฑ ํจ์๊ฐ ๋ง์ผ๋ฉด ์ฝ๋๋ฅผ ์ฝ๊ธฐ ์ด๋ ต๊ฒ ํ๋๊น์!
๋คํํ๋ ์ฐ๋ฆฌ์๊ฒ ์ด์ promise๋ผ๋ ๋์ฐ๋ฏธ๊ฐ ์๊ฒผ์ต๋๋ค! promise๊ฐ ๋ญ์ง ๊ทธ๋ฆฌ๊ณ ์ด๋ค ์ํฉ์์ ๋์์ด ๋๋์ง ๋ณด๋๋ก ํ์ฃ ! ๐
Promise ๋ฌธ๋ฒ
๋ง์ ํํ ๋ฆฌ์ผ์์ ES6์ ๋์ ๋ Promise์ ๋ํด ์ด๋ ๊ฒ ๋งํฉ๋๋ค:
โPromise๋ ๋ฏธ๋์ ์ด๋ค ์์ ์ ์๋ฃ ๋๋ ์คํจ์ ๋ํ ๊ฐ์ ๋ํ๋ด๋ ์๋ฆฌํ์์(placeholder) ์ ๋๋คโ
๋ค..์ ๋ ์ด ์ค๋ช ์ด ์ ํ ๋ช ํํ์ง ์๊ฒ ๋๊ปด์ก์ด์. ์ฌ์ค ์ด๊ฑด Promise๋ฅผ ๋ ์ด์ํ๊ณ , ๋ง์ฐํ๊ณ , ์ ์ ์๋ ๊ฒ์ผ๋ก ๋ง๋๋ ์ค๋ช ์ด์์ฃ . ๊ทธ๋ผ Promise๊ฐ ์ค์ ๋ก ์ฝ์ํด์ฃผ๋ ๊ฒ ๋ญ์ง ๋ณด๋๋ก ํ์ฃ .
์ฐ๋ฆฐ ์ฝ๋ฐฑ์ ๋ฐ๋ Promise
์์ฑ์๋ฅผ ์ฌ์ฉํ์ฌ Promise๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ์ข์์. ํ ๋ฒ ํด๋ณด์ฃ !
์ ๊น๋ง, ๋ญ๊ฐ ๋ฐํ๋์ฃ ?
Promise
๋ ์ํ์ธ([[PromiseStatus]]
)์ ๊ฐ์ธ ([[PromiseValue]]
)์ ํฌํจํ๋ ๊ฐ์ฒด์
๋๋ค. ์์ ์์์์,ย [[PromiseStatus]]
ย ์ด "pending"
์ด๊ณ , promise์ ๊ฐ์ด undefined
์ธ ๊ฑธ ์ ์ ์์ ๊ฒ๋๋ค.
๊ฑฑ์ ๋ง์ธ์. ์ฌ๋ฌ๋ถ๋ค์ด ์ด ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ ํ์๋ ์์ผ๋๊น์, [[PromiseStatus]]
์ [[PromiseValue]]
์์ฑ์ ์ ๊ทผ๋ ํ ์ ์์ต๋๋ค! ๊ทธ๋ฌ๋ ์ด๋ฐ ์์ฑ์ ๊ฐ๋ค์ promise๊ฐ ๋์ํ ๋ ์์ฃผ ์ค์ํฉ๋๋ค.
PromiseStatus
์ ๊ฐ์ 3๊ฐ์ง์ ์ํ๊ฐ ๋ ์ ์์ต๋๋ค:
- โ
ย
fulfilled
: Promise๊ฐresolved
๋๋ค๋ ๊ฑธ ์๋ฏธํฉ๋๋ค. ๋ชจ๋ ๊ฒ๋ค์ด ์ ๋๊ณ promise ๋ด์์ ์ด๋ค ์๋ฌ๋ ๋ฐ์ํ์ง ์์๋ค๋ ๋ป์ด์ฃ . - โย
rejected
ย : Promise๊ฐrejected
๋ ๊ฒ๋๋ค. ๋ญ๊ฐ ์๋ชป ๋์ ๋๋ฅผ ๋งํฉ๋๋ค. - โณย
pending
: Promise๊ฐ ์๋ฃ๋์ง๋ ์์๊ณ , ์คํจํ์ง๋ ์์ ์ํ์ ๋๋ค. (์์ง๊น์ง๋), Promise๊ฐ ์ฌ์ ํpending
์ํ์ธ๊ฑฐ์ฃ .
์ข์์. ์ด ๋ชจ๋ ๊ฒ ๊ด์ฐฎ๊ฒ ๋ณด์ด์ง๋ง, ์ธ์ promise์ ์ํ๊ฐ "pending"
์ด๊ณ "fulfilled"
๋ "rejected"
๊ฐ ๋ ๊น์? ๊ทธ๋ฆฌ๊ณ ์ ์ด ์ํ๊ฐ ์ค์ํ๊ฑธ๊น์?
์์ ์์ ์์, ์ฐ๋ฆฐ ์์ฃผ ๊ฐ๋จํ ์ฝ๋ฐฑ ํจ์์ธ () => {}
๋ฅผ Promise
์์ฑ์๋ก ๋๊ฒผ์ต๋๋ค. ๊ทธ๋ฌ๋, ์ด ์ฝ๋ฐฑ ํจ์๋ ์ค์ ๋ก 2๊ฐ์ ์ธ์๋ฅผ ๋ฐ์ต๋๋ค. ์ฒซ ๋ฒ์งธ ์ธ์๋ ๋ณดํต resolve
๋ res
๋ก ํ๋๋ฐ, ์ด๋ Promise๊ฐ resolve ์ผ ๋๋ง ํธ์ถ๋๋ ๋ฉ์๋์
๋๋ค. ๋ ๋ฒ์งธ ์ธ์๋ ๋ณดํต reject
๋ rej
๋ก ํ๋๋ฐ Promise๊ฐ reject์ผ ๋๋ง ํธ์ถ๋๋ ๋ฉ์๋์
๋๋ค. ๋ญ๊ฐ ์๋ชป๋๋ค๋ ๊ฑฐ์ฃ .
resolve
๋ reject
๋ฉ์๋๊ฐ ํธ์ถ ๋์ ๋ ์ด๋ค ๋ก๊ทธ๊ฐ ๋จ๊ฒจ์ง๋์ง ํ
์คํธ ํด๋ณด์ฃ ! ์์ ์์ , resolve
๋ฅผ res
๋ก, reject
๋ฅผ rej
๋ก ๋ง๋ค์์ต๋๋ค.
๋๋ด์ฃผ๋ค์! ๋๋์ด "pending"
์ํ์ undefined
๊ฐ์ ๋ ๋ ค๋ฒ๋ฆฌ๋ ๋ฐฉ๋ฒ์ ์๊ฒ ๋์ต๋๋ค! ๋ง์ฝ resolve
๋ฉ์๋๊ฐ ํธ์ถ ๋๋ฉด Promise์ ์ํ๋ "fulfilled"
๊ฐ ๋๊ณ , rejected
๋ฉ์๋๊ฐ ํธ์ถ ๋๋ฉด "rejected"
๊ฐ ๋ฉ๋๋ค.
Promise์ ๊ฐ์ [[PromiseValue]]
๊ณ ์ด๋, resolved
๋ rejected
๋ผ๋ ๋ฉ์๋์ ์ ๋ฌ๋๋ ์ธ์์ ๊ฐ์ด ๋ฉ๋๋ค.
์ฌ๋ฏธ์๋ ์ฌ์ค์, Jake Archibald๊ฐ ์ด ๊ธฐ์ฌ๋ฅผ ๊ต์ ํ๋๋ก ํ๋๋ฐ, ๊ทธ๋ ์ค์ ๋ก ํฌ๋กฌ์์ ์ง๊ธ โfulfilledโ ๋์ โresolvedโ ์ํ๋ก ํ์๋๋ ๋ฒ๊ทธ๊ฐ ์์์ ์ง์ ํ์ต๋๋ค. Mathias Bynens ๋๋ถ์ ์นด๋๋ฆฌ ๋ฒ์ ์์ ์์ ์ด ๋์์ต๋๋ค!
์ข์์, ์ด์ ๋ง์ฐํ Promise
๊ฐ์ฒด๋ฅผ ์ด๋ป๊ฒ ๋ค๋ค์ผํ ์ง ์กฐ๊ธ ๋ ์๊ฒ ๋์ต๋๋ค. ๊ทผ๋ฐ ์ด๊ฒ ์ด๋์ ์ฐ์ผ๊ฐ์?
์๊ฐ ๋ถ๋ถ์์ ๋ณด์ฌ๋๋ ธ๋ ์์ ๋ฅผ ๋ณด๋ฉด, ์ด๋ฏธ์ง๋ฅผ ๋ฐ๊ณ , ์์ถํด์, ํํฐ๋ฅผ ์ ์ฉํ๊ณ ์ ์ฅํ์์ฃ ! ๊ฒฐ๊ตญ ์ค์ฒฉ๋ ์ฝ๋ฐฑ์ผ๋ก ๋์กํด์ก์ต๋๋ค.
๋คํํ๋, Promise๊ฐ ์ด ๋ถ๋ถ์ ๋์์ฃผ์ฃ ! ๋จผ์ , ์ ์ฒด ์ฝ๋ ๋ธ๋ญ์ ๋ค์ ์์ฑํด๋ด
์๋ค. ๊ฐ ํจ์์ ๋ฐํ์ Promise
๋ก์.
์ด๋ฏธ์ง๊ฐ ์ ๋๋ก ๋ก๋ ๋์๋ค๋ฉด, Promise๋ ๋ก๋๋ ์ด๋ฏธ์ง์ ํจ๊ป resolve ์ฒ๋ฆฌ๋ฅผ ํ๊ณ , ๊ทธ๊ฒ ์๋๋ผ ํ์ผ์ ๋ก๋ฉํ๋ ์ค์ ๋ญ๊ฐ ๋ฌธ์ ๊ฐ ์๊ฒผ๋ค๋ฉด, promise๋ ์๋ฌ๋ฅผ ๋ฐ์ํ๋ reject ์ฒ๋ฆฌ๋ฅผ ํฉ์๋ค.
ํฐ๋ฏธ๋์์ ์ค์ ๋ก ์ด๊ฒ ๋์ํ ๋ ์ด๋ค ์ผ์ด ์ผ์ด๋๋์ง ๋ณด๋๋ก ํ์ฃ !
๋ฉ์ง๋๋ค! Promise๋ ์์๋๋ก ํ์ฑ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ผ๋ก ๋ฐํํ๋ค์.
๊ทธ๋ฐ๋ฐ..์ด์ ๋ญ์ฃ ? ์ฐ๋ฆฐ Promise ๊ฐ์ฒด ์ ์ฒด๋ฅผ ๋ณผ ๊ฒ ์๋๋ผ, ๊ทธ ๋ฐ์ดํฐ์ ๊ฐ๋ง ๋ด์ผํ์ฃ . ๊ทธ๋์ Promise์ ๊ฐ์ ์ป๊ธฐ ์ํ ๋ด์ฅ ๋ฉ์๋๊ฐ ์์ต๋๋ค. Promise์๋ 3๊ฐ์ ๋ฉ์๋๋ฅผ ๋ถ์ผ ์ ์์ต๋๋ค:
.then()
: Promise์ ์๋ฃ ๋ค์ ํธ์ถ๋ฉ๋๋ค..catch()
: Promise์ ์คํจ ๋ค์ ํธ์ถ๋ฉ๋๋ค..finally()
: Promise๊ฐ ์๋ฃ๊ฐ ๋๊ฑฐ๋ ์คํจ๊ฐ ๋๋๋ผ๋ ํญ์ ํธ์ถ๋ฉ๋๋ค.
.then
๋ฉ์๋๋ resolve
๋ฉ์๋์ ์ ๋ฌ๋๋ ๊ฐ์ ๋ฐ์ต๋๋ค.
.catch
๋ฉ์๋๋ rejected
๋ฉ์๋์ ์ ๋ฌ๋๋ ๊ฐ์ ๋ฐ์ต๋๋ค.
๋ง์ง๋ง์ผ๋ก, Promise์ ์ ์ฒด ๊ฐ์ฒด๊ฐ ์๋ Promise๊ฐ ์๋ฃ๋ ๊ฒ์ ๊ด๋ จ๋ ๊ฐ๋ง ๋ฐ์ต๋๋ค! ๊ทธ๋ฆฌ๊ณ ์ด ๊ฐ์ ๊ฐ์ง๊ณ ์ฐ๋ฆฌ๊ฐ ์ํ๋ ์์ ์ ํ ์ ์๊ฒ ๋์ฃ .
์ฐธ๊ณ ๋ก, Promise๊ฐ ํญ์ ์๋ฃ๋๊ฑฐ๋ ์คํจํ๋ค๋ ๊ฑธ ์๊ณ ์์ ๋๋, Promise์ ์๋ฃ๋ ์คํจ์ ๋ํด ์ฒ๋ฆฌํ๊ณ ์ ํ๋ ๊ฐ์ผ๋ก Promise.resolve
๋ Promise.reject
๋ฅผ ์ธ ์๋ ์์ต๋๋ค!
๋ค์ ์์ ๋ค์์ ์ด๋ฐ ๋ฌธ๋ฒ์ ์ข ์ข ๋ณด์๊ฒ ๋ ๊ฒ๋๋ค ๐
getImage
์์ ๋ฅผ ์คํํ๊ธฐ ์ํด ์ค์ฒฉ๋ ์ฝ๋ฐฑ ํจ์๋ค์ ์ฌ์ฉํด์ผ ํ๋๋ฐ์. ๋คํํ๋ .then
ํธ๋ค๋ฌ๊ฐ ๋์์ ์ค๋๋ค. ๐ฅณ
.then
์ ๊ฒฐ๊ณผ ์์ฒด ๋ํ Promise์ ๊ฐ์
๋๋ค. ์ด ๋ง์ ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๋งํผ .then
์ ์ฒด์ด๋ํ ์ ์๋ค๋ ๋ง์ด์ฃ : ์ด์ then
์ฝ๋ฐฑ์ ๊ฒฐ๊ณผ๊ฐ ํ๋์ ์ธ์๋ก์จ ๋ค์ .then
์ฝ๋ฐฑ์ ์ ๋ฌ๋ฉ๋๋ค!
getImage
์์ ์ ๊ฒฝ์ฐ ์ด๋ฏธ์ง ์ฒ๋ฆฌ๋ฅผ ๋ค์ ํจ์๋ก ์ ๋ฌํ๊ธฐ ์ํด ์ฌ๋ฌ ๊ฐ์ then
์ฝ๋ฐฑ์ ์ฒด์ด๋ํ ์ ์๊ฒ ๋ฉ๋๋ค! ์ฌ๋ฌ ๊ฐ์ ์ฝ๋ฐฑ ์ค์ฒฉ ๋์ ๊น๋ํ then
์ฒด์ด๋์ผ๋ก ๊ตฌํํ ์ ์๊ฒ ๋ฉ๋๋ค.
์๋ฒฝํ๋ค์! ์ด ๊ตฌ๋ฌธ์ ์ด๋ฏธ ์ฝ๋ฐฑ ์ค์ฒฉ๋ณด๋ค ํจ์ฌ ๋์ ๋ณด์ ๋๋ค.
Microtask์ (Macro)task
์ด์ Promise๋ฅผ ์ด๋ป๊ฒ ๋ง๋๋์ง ์ข ๋ ์ ์๊ฒ ๋์๊ณ Promise์ ๊ฐ์ ์ด๋ป๊ฒ ์ถ์ถ ํ๋์ง ์๊ฒ ๋์์ต๋๋ค. ์คํฌ๋ฆฝํธ์ ์ฝ๋๋ฅผ ์ข ๋ ์ถ๊ฐํด์ ์คํ ํด๋ณด์ฃ :
์ ๊น ์ด๊ฒ ๋ญ์ฃ ?! ๐คฏ
๋จผ์ , Start!
๊ฐ ๋ก๊ทธ๋ก ๋จ๊ฒจ์ง๋๋ค. ๊ด์ฐฎ์ฃ . ์ฐ๋ฆฐ console.log('Start!')
๊ฐ ์ฒซ ๋ฒ์งธ ๋ผ์ธ์ ์๋ ๊ฑธ ๋ดค์ผ๋๊น์! ๊ทธ๋ฐ๋ฐ, ๋ก๊ทธ๋ก ๋จ๊ฒจ์ง๋ ๋ ๋ฒ์งธ ๊ฐ์ด End!
์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๊ฑด Promise์ ์๋ฃ ๊ฐ์ด ์๋์ฃ ! End!
๊ฐ ๋จ๊ณ ๋์์ผ Promise์ ๊ฐ์ด ๋ก๊ทธ๋ก ๋จ๊ฒจ์ก์ต๋๋ค. ์ง๊ธ ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ฑธ๊น์?
์ด์ ๋ง์ง๋ง์ผ๋ก Promise์ ์ง๋ฉด๋ชฉ์ ๋ณธ ๊ฒ๋๋ค! ๐๋น๋ก JavaScript๊ฐ ์ฑ๊ธ ์ค๋ ๋์ด๊ธด ํ์ง๋ง, ์ฐ๋ฆฐ Promise
๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ์ ์ธ ๋์์ ์ถ๊ฐํ ์ ์์ต๋๋ค!
๊ทธ๋ฐ๋ฐ ์ ์, ์ด์ ์ ์ด๋ฐ ๊ฑธ ๋ณธ ์ ์๋์? ๐ค JavaScript Event Loop์์, ์ผ์ข
์ ๋น๋๊ธฐ์ ์ธ ๋์์ ๋ง๋ค๊ธฐ ์ํ์ฌ setTimeout
๊ฐ์ ๋ธ๋ผ์ฐ์ ์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์์์ฃ ?
๋ง์์! ํ์ง๋ง, event loop ๋ด์๋, ์ค์ ๋ก 2๊ฐ ์ ํ์ queue๊ฐ ์์ต๋๋ค: (macro)task queue์ (๋๋ ๊ทธ๋ฅ task queue๋ผ๊ณ ๋ ํฉ๋๋ค) microtask queue์ ๋๋ค. (macro)task queue๋ (macro)task๋ค์ ์ํ ๊ฒ์ด๊ณ , microtask queue๋ microtask๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.
๊ทธ๋ผ (macro)task์ microtask๋ ๋ญ๊น์? ์ฌ๊ธฐ์์ ๋ค๋ฃจ๋ ๊ฒ๋ณด๋ค ๋ช ๊ฐ์ง๊ฐ ๋ ์์ง๋ง ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๊ฒ๋ค์ ์๋ ํ์ ์์ต๋๋ค!
Tasks Type | Cases |
---|---|
(Macro)task | setTimeout |setInterval |setImmediate |
Microtask | process.nextTick |Promise callback |queueMicrotask |
์, Promise
๋ microtask ๋ชฉ๋ก์ ์์ฃ ! ๐ Promise
๊ฐ ์๋ฃ๋๊ณ ๊ทธ๊ฒ์ then()
, catch()
๋ finally()
๋, ๋ฉ์๋ ๋๋ ๋ฉ์๋ ๋ด์ ์ฝ๋ฐฑ์ microtask queue์ ์ถ๊ฐ๋ฉ๋๋ค! ์ด ๋ง์ then()
, catch()
๋ finally()
๋ฉ์๋ ๋ด์ ์ฝ๋ฐฑ์ด ์ฆ์ ์คํ๋์ง ์๋๋ค๋ ๊ฒ์ด๊ณ , ๋ณธ์ง์ ์ผ๋ก JavaScript ์ฝ๋์ ๋น๋๊ธฐ์ ์ธ ๋์์ ๋ํ๋ค๋ ๊ฒ์ด์ฃ !
๊ทธ๋ผ then()
, catch()
๋ finally()
์ ์ฝ๋ฐฑ์ด ์คํ๋๋ ์์ ์ด ์ธ์ ์ผ๊น์? event loop๋ task์ ๋ค๋ฅธ ์ฐ์ ์์๋ฅผ ๋ถ์ฌํฉ๋๋ค:
- ํ์ฌ ์ฝ ์คํ์ ์๋ ๋ชจ๋ ํจ์๋ค์ด ์คํ๋ฉ๋๋ค. ๊ฐ์ ๋ฐํํ๋ฉด ์คํ์์ ๋น ์ ธ๋๊ฐ๋๋ค.
- ์ฝ ์คํ์ด ๋น๋ฉด, ํ์ ์์ฌ์๋ ๋ชจ๋ microtask๊ฐ ํ๋์ฉ ๋น ์ ธ๋์ค๊ณ ์ฝ ์คํ์ผ๋ก ๊ฐ์ ์คํ๋ฉ๋๋ค. (microtask ๊ทธ ์์ฒด๋ค ๋ํ ์๋ก์ด microtask๋ฅผ ๋ฐํํ ์ ์์ด ํจ๊ณผ์ ์ผ๋ก ๋ฌดํ์ microtask ๋ฃจํ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค ๐ฌ)
- ๋ง์ฝ ์ฝ ์คํ๊ณผ microtask queue๊ฐ ๋ชจ๋ ๋น๋ฉด, ์ด๋ฒคํธ ๋ฃจํ๋ (macro)task queue์ ๋จ์ task๊ฐ ์๋์ง ํ์ธํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ task๋ค์ด ๋์์ ์ฝ ์คํ์ ์์ด๊ณ ์คํ๋๊ณ ๋น ์ ธ๋๊ฐ๋๋ค!
๋น ๋ฅด๊ฒ ๊ฐ๋จํ ์์ ๋ฅผ ๋ณด๋๋ก ํ์ฃ :
Task1
: ํจ์๋ ์ฝ ์คํ์ ์ฆ์ ์ถ๊ฐ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด ์ฝ๋์์ ํธ์ถํ๋ ์ฆ์์.Task2
,Task3
,Task4
: mircotask๋ค์ ๋๋ค. ์๋ฅผ ๋ค์ด promise์then
์ฝ๋ฐฑ์ด๋queueMicrotask
์ ์ถ๊ฐ๋ task์ ๋๋ค.Task5
,Task6
: (macro)task์ ๋๋ค. ์๋ฅผ ๋ค์ดsetTimeout
์ด๋setImmediate
์ ์ฝ๋ฐฑ์ ๋๋ค.
๋จผ์ , Task1
์ ๊ฐ์ ๋ฐํํ๊ณ ์ฝ ์คํ์์ ๋น ์ ธ๋๊ฐ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋์, ์์ง์ microtask queue์ ์์ฌ์๋ task๋ฅผ ํ์ธํฉ๋๋ค. ํด๋น task๋ค์ด ์ ๋ถ ์ฝ ์คํ์ ์ค๋ฅด๊ณ ๋น ์ ธ๋๊ฐ๋ฉด, ์์ง์ (macro)task queue์ task๊ฐ ์๋์ง ํ์ธํ๊ณ , ํด๋น queue์์ ๋นผ์จ ๋ค์ ์ฝ ์คํ์ ์ฌ๋ฆฌ๊ณ ๊ฐ์ ๋ฐํํ๋ฉด ์ฝ ์คํ์์ ๋น ์ ธ๋๊ฐ๋๋ค.
์ข์์. ๋ถํ์ ๋ฐ์ค๊ฐ ์์ฃผ ๋ง๋ค์. ์ค์ ์ฝ๋๋ฅผ ์ฌ์ฉํด๋ณด์ฃ !
์ ์ฝ๋์์, macro task๋ก setTimeout
์ ์ฌ์ฉํ๊ณ , microtask๋ promise์ then()
์ฝ๋ฐฑ์ ์ฌ์ฉํ์ต๋๋ค. ์์ง์ด setTimeout
ํจ์ ๋ผ์ธ์ ๋๋ฌํ๋ฉด ์ฝ๋๋ฅผ ๋จ๊ณ์ ์ผ๋ก ์คํํ๊ณ ๋ก๊ทธ๊ฐ ์ด๋ป๊ฒ ๋จ๋์ง ๋ณด๋๋ก ํ์ฃ !
์ฐธ๊ณ - ์์ ์์๋ console.log, setTimeout์ด๋ Promise.resolve๋ฅผ ์ฝ ์คํ์ ์ถ๊ฐ๋๋ค๊ณ ๋ณด์ฌ์ง๊ณ ์์ต๋๋ค. ์ด๊ฒ๋ค์ ๋ด๋ถ ๋ฉ์๋๋ค์ด๊ณ ์คํ ํธ๋ ์ด์ค์์ ์ค์ ๋ก ๋ณด์ด์ง ์์ต๋๋ค - ๊ทธ๋ฌ๋ ์ฌ๋ฌ๋ถ๋ค์ด ๋๋ฒ๊ฑฐ๋ฅผ ์ฌ์ฉํ๋๋ฐ๋ ์ด๊ฒ๋ค์ด ๋ณด์ด์ง ์๋๋ผ๋ ๊ฑฑ์ ๋ง์ธ์! ์ฌ๋ฌ ๋ณด์ผ๋ฌ ํ๋ ์ดํธ ์ฝ๋๋ฅผ ์ถ๊ฐํ์ง ์๊ณ ์ฝ๊ฒ ๊ฐ๋ ์ ์ค๋ช ํฉ๋๋ค ๐
์ฒซ ๋ฒ์งธ ๋ผ์ธ์์ ์์ง์ด console.log()
๋ฉ์๋๋ฅผ ๋ง๋ฉ๋๋ค. ์ด๊ฒ์ ์ฝ ์คํ์ ์ถ๊ฐ๋๊ณ , ์ฝ์์ Start!
๋ฅผ ๋จ๊น๋๋ค. ๊ทธ๋ฆฌ๊ณ ํด๋น ๋ฉ์๋๋ ์ฝ ์คํ์์ ๋น ์ ธ๋๊ฐ ๋ค ์์ง์ ์ฒ๋ฆฌ๋ฅผ ์ด์ด๊ฐ๋๋ค.
์์ง์ setTimeout
๋ฉ์๋๋ฅผ ๋ง๋๊ณ , ํด๋น ๋ฉ์๋๋ ์ฝ ์คํ์์ ๋น ์ ธ๋๊ฐ๋๋ค. setTimeout
๋ฉ์๋๋ ๋ธ๋ผ์ฐ์ ์ ๋ค์ดํฐ๋ธ ๋ฉ์๋์
๋๋ค: ์ด๊ฒ์ ์ฝ๋ฐฑ ํจ์๋ (() => console.log('In timeout')
) ์ธ๋ฐ ํ์ด๋จธ๊ฐ ๋๋ ๋๊น์ง Web API์ ์ถ๊ฐ๋ฉ๋๋ค. ๋น๋ก ํ์ด๋จธ์ 0
์ ๋ฃ์์ง๋ง, ์ฝ๋ฐฑ์ Web API์ ๋จผ์ ์ ๋ฌ๋ฉ๋๋ค. ๊ทธ๋ฐ ๋ค (macro)task queue์ ์ถ๊ฐ๋ฉ๋๋ค: setTimeout
์ macro task์
๋๋ค!
์์ง์ด Promise.resolve()
๋ฉ์๋๋ฅผ ๋ง๋ฉ๋๋ค. Promise.resolve()
๋ฉ์๋๋ ์ฝ ์คํ์ ์ถ๊ฐ๋๊ณ ์๋ฃ๋ ๊ฐ์ผ๋ก Promise
๋ฅผ ๊ฐ์ง๋๋ค. ๊ทธ๊ฒ์ then
์ฝ๋ฐฑ ํจ์๋ microtask queue์ ์ถ๊ฐ๋ฉ๋๋ค.
์์ง์ console.log()
๋ฉ์๋๋ฅผ ๋ง๋ฉ๋๋ค. ์ด๊ฑด ๊ทธ ์ฆ์ ์ฝ ์คํ์ ์ถ๊ฐ ๋๊ณ , ์ฝ์์ End!
๋ผ๋ ๊ฐ์ ๋จ๊ธด ๋ค, ์ฝ ์คํ์์ ๋น ์ ธ๋๊ฐ๊ณ , ์์ง์ ๊ณ์ ์ฒ๋ฆฌ๋ฅผ ์ด์ด๊ฐ๋๋ค.
์์ง์ ํ์ฌ ์ฝ ์คํ์ด ๋น์ด์๋ ๊ฑธ ํ์ธํฉ๋๋ค. ์ฝ ์คํ์ด ๋น์ด์๊ธฐ ๋๋ฌธ์, microtask queue์ ์์ธ task๊ฐ ์๋์ง๋ฅผ ํ์ธํ ๊ฒ๋๋ค! ๊ทธ๋ฆฌ๊ณ ๊ฑฐ๊ธฐ์๋ promise์ then
์ฝ๋ฐฑ์ด ์์ ์ ์ฐจ๋ก๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ณ ์์ต๋๋ค! ๊ทธ๊ฒ ๋น ์ ธ๋์ ์ฝ ์คํ์ ๋ค์ด๊ฐ๊ณ , promise์ resolve ๊ฐ์ ๋ก๊ทธ๋ก ๋จ๊น๋๋ค: ์ด๋ฒ ์์ ์์ ๋ฌธ์์ด Promise!
์
๋๋ค.
์์ง์ ์ฝ ์คํ์ด ๋น์ด์๋ ๊ฑธ ์๊ณ , microtask queue์ ์์ธ task๊ฐ ์๋์ง ํ ๋ฒ ๋ ์ฒดํฌํฉ๋๋ค. ์์ฃ . microtask queue๊ฐ ์์ ํ ๋น์์ต๋๋ค.
์ด์ (macro)task queue๋ฅผ ๋ณผ ์ฐจ๋ก์
๋๋ค: setTimeout
์ฝ๋ฐฑ์ ์ฌ์ ํ ๊ฑฐ๊ธฐ์์ ๊ธฐ๋ค๋ฆฌ๋ ์ค์
๋๋ค! setTimeout
์ฝ๋ฐฑ์ด ๋น ์ ธ๋์ ์ฝ ์คํ์ ์ฌ๋ผ๊ฐ๋๋ค. ์ฝ๋ฐฑ ํจ์๋ ๋ฌธ์์ด "In timeout!"
์ ๋จ๊ธฐ๋ console.log
๋ฉ์๋๋ฅผ ๋ฐํํฉ๋๋ค. ๊ทธ๋ฐ ๋ค ์ฝ๋ฐฑ์ ์ฝ ์คํ์์ ๋น ์ ธ๋๊ฐ๋๋ค.
๋ง์ง๋ง์ผ๋ก, ๋ชจ๋ ๊ฒ ๋๋ฌ์ต๋๋ค! ๐ฅณ์์์ ๋ดค๋ ๊ฒฐ๊ณผ๊ฐ ๊ทธ๋ ๊ฒ ์์ ๋ฐ์ ์๋ ๊ฒ ๊ฐ๋ค์.
Async/Await
ES7์ JavaScript์์ ๋น๋๊ธฐ ๋์์ ๋ค๋ฃจ๋ ์๋ก์ด ๋ฐฉ๋ฒ์ ๋์
ํ๊ณ , ๊ทธ๊ฒ์ promise๋ฅผ ๋ ์ฝ๊ฒ ๋ง๋ค์ด์ค๋๋ค! async
์ await
ํค์๋์ ๋์
์ผ๋ก ์ฐ๋ฆฌ๋ ๋ฌต์์ ์ผ๋ก promise๋ฅผ ๋ฐํํ๋ async ํจ์๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ๊ทธ๋ฐ๋ฐ.. ์ด๊ฑธ ์ด๋ป๊ฒ ํ์ฃ ? ๐ฎ
์ ์, ์ฐ๋ฆฌ๋ new Promise(() => {})
๋ Promise.resolve
๋ Promise.reject
๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ผ๋ก Promise
๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ๋ช
์์ ์ผ๋ก promise๋ฅผ ๋ง๋ค์ด๋ผ ์ ์์์ต๋๋ค.
๋ช
์์ ์ผ๋ก Promise
๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ๋์ , ์ด์ ์ฐ๋ฆฌ๋ ๋ฌต์์ ์ผ๋ก ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ ๋น๋๊ธฐ ํจ์๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค! ์ด ๋ง์ ์ฐ๋ฆฌ๊ฐ ๋์ด์ Promise
๊ฐ์ฒด๋ฅผ ์ค์ค๋ก ์์ฑํ์ง ์๋๋ค๋ ๊ฒ์ด์ฃ .
๋น๋ก async ํจ์๊ฐ ๋ฌต์์ ์ผ๋ก promise๋ฅผ ๋ฐํํ๋ค๋ ๊ฒ๋ ์์ฃผ ๋๋จํ ์ผ์ด์ง๋ง, async
ํจ์์ ์ง๋ฉด๋ชฉ์ await
ํค์๋๋ฅผ ์ฌ์ฉํ ๋ ๋ณผ ์ ์์ต๋๋ค! await
ํค์๋๋ก await
ํ(๊ธฐ๋ค๋ฆฐ) ๊ฐ์ด promise ์๋ฃ์ ๋ฐํ๊ฐ์ ๊ธฐ๋ค๋ฆฌ๋ ๋์ ๋น๋๊ธฐ์ ์ผ๋ก ํจ์๋ฅผ ์ผ์์ ์ผ๋ก ์ค๋จํ ์ ์์ต๋๋ค. ์ด์ ์ then()
์ฝ๋ฐฑ๊ณผ ๊ฐ์ด ๋ง์ฝ ์ด๋ฐ promise์ ์๋ฃ ๊ฐ์ ์ํ๋ค๋ฉด, await
๋ promise์ ๊ฐ์ ๋ณ์๋ฅผ ํ ๋นํ ์ ์์ต๋๋ค!
๊ทธ๋ฌ๋๊น ์ฐ๋ฆฐ async ํจ์๋ฅผ ์ง์ฐ์ํฌ ์ ์๋๊ฑฐ์ฃ ? ์ข์์. ๊ทธ๋ฐ๋ฐ..์ด๊ฒ ๋ฌด์จ ์๋ฏธ์ฃ ?
์ฝ๋ ๋ธ๋ญ์ ์คํํ ๋ ์ด๋ค ์ผ์ด ์ผ์ด๋๋์ง ๋ณด์์ฃ :
ํ .. ์ง๊ธ ๋ฌด์จ ์ผ์ด ์ผ์ด๋๋๊ฑฐ์ฃ ?
๋จผ์ , ์์ง์ด console.log
๋ฅผ ๋ง๋ฉ๋๋ค. ์ฝ ์คํ์์ Before function!
์ ๋จ๊ธฐ๊ณ ๋น ์ ธ๋๊ฐ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋์, async ํจ์์ธ myFunc()
๋ฅผ ํธ์ถํ ํ, myFunc
์ ํจ์ ๋ฐ๋ ์์ญ์ด ์คํ๋ฉ๋๋ค. ํจ๋ถ ๋ฐ๋ ์์ญ ๋ด์ ์ฒซ ๋ฒ์งธ ๋ผ์ธ์์, ์ด๋ฒ์๋ ๋ฌธ์์ด์ด In function!
์ธ ๋ ๋ค๋ฅธ console.log
๋ฅผ ํธ์ถํฉ๋๋ค. console.log
๋ ์ฝ ์คํ์ ์ถ๊ฐ๋๊ณ , ๊ฐ์ ๋จ๊ธฐ๊ณ , ๋น ์ ธ๋๊ฐ๋๋ค.
ํจ์์ ๋ฐ๋ ์์ญ์ด ๊ณ์ ์คํ ์ค์ธ ์ํ๋ก ๋ ๋ฒ์งธ ๋ผ์ธ์ผ๋ก ๊ฐ๋๋ค. ๋๋์ด, await
ํค์๋๊ฐ ๋์์ต๋๋ค! ๐
์ฒซ ๋ฒ์งธ๋ก ๋ฐ์ํ๋ ์ผ์ ๋๊ธฐํ๋ ๊ฐ์ด ์คํ๋๋ค๋ ๊ฒ์
๋๋ค: ์ด๋ฒ ์์์์ ํจ์ one
์
๋๋ค. ์ฝ ์คํ์ ๊ฐ๋ค๊ฐ ๋น ์ ธ๋๊ฐ๊ณ , ๋ง์ง๋ง์ promise์ ์๋ฃ๊ฐ์ด ๋ฐํ๋ฉ๋๋ค. ์ผ๋จ promise๊ฐ ์๋ฃ๋๊ณ one
์ด ๊ฐ์ ๋ฐํํ๋ฉด ์์ง์ await
ํค์๋๋ฅผ ๋ง๋๊ฒ ๋ฉ๋๋ค.
await
ํค์๋๋ฅผ ๋ง๋๋ฉด, async
ํจ์๋ ์ ์ ์ ์งํฉ๋๋ค. โ๐ผ ํจ์ ๋ฐ๋ ์์ญ์ ์คํ์ด ์ค๋จ๋๊ณ , async ํจ์์ ๋๋จธ์ง ๋ถ๋ถ์ ์ผ๋ฐ์ ์ธ task๊ฐ ์๋ microtask๋ก ์คํ๋ฉ๋๋ค!
์ด์ await
ํค์๋๋ฅผ ๋ง์ฃผํ์ฌ async ํจ์์ธ myFunc
๋ ์ผ์ ์ค๋จ๋์๊ณ , ์์ง์ async ํจ์์์ ๋น ์ ธ ๋์ async ํจ์๋ฅผ ํธ์ถํ ์คํ ์ปจํ
์คํธ์์ ์ฝ๋์ ์คํ์ ์ด์ด๊ฐ๋๋ค: ์ด ์์ ์์ ์ ์ญ ์คํ ์ปจํ
์คํธ์
๋๋ค! ๐๐ฝโโ๏ธ
๋ง์ง๋ง์ผ๋ก, ์ ์ญ ์คํ ์ปจํ
์คํธ์์๋ ๋ ์ด์ ์คํํ task๊ฐ ์๊ฒ ๋ฉ๋๋ค! ์ด๋ฒคํธ ๋ฃจํ๋ ๋๊ธฐ ์ค์ธ microtask๊ฐ ์๋์ง ์ฒดํฌํฉ๋๋ค: ๋๊ธฐ ์ค์ธ microtask๊ฐ ์์ฃ ! async์ธ myFunc
ํจ์๋ one
์ ์๋ฃ ๊ฐ ์ดํ ๋๊ธฐํ๊ณ ์์์ฃ . myFunc
๊ฐ ์ฝ ์คํ์ผ๋ก ๋ค์ด์ ๋จ์ ์ฝ๋์ ์คํ์ ์ด์ด๊ฐ๋๋ค.
๋ณ์ res
๋ ๋์ด์ด ์์ ์ ๊ฐ์ ์ป๋๋ฐ, one
์์ ๋ฐํ๋ promise์ ์๋ฃ ๊ฐ์ด ๋๊ฒ ์ฃ ! ์์ ์ ๊ฒฝ์ฐ res
์ ๊ฐ์ผ๋ก console.log
๋ฅผ ์คํํฉ๋๋ค. One!
์ด ์ฝ์์ ๊ธฐ๋ก๋๊ณ ์ฝ ์คํ์ ๋น ์ ธ๋๊ฐ๋๋ค! ๐
๋๋์ด, ๋ค ๋๋ฌ์ต๋๋ค! async
ํจ์๊ฐ promise์ then
๊ณผ ์ด๋ป๊ฒ ๋ค๋ฅธ์ง ์๊ฒ ๋์
จ๋์? await
ํค์๋๋ async
ํจ์๋ฅผ ์ผ์ ์ค๋จํ๋ ๋ฐ๋ฉด, Promise์ ๋ฐ๋๋ then
์ ์ฌ์ฉํ๋ฉด ๊ณ์ ์คํ๋ฉ๋๋ค!
ํ ์๋นํ ๋ง์ ๋ด์ฉ์ด์์ต๋๋ค! ๐คฏPromise๋ก ์์ ์ ํ์ค ๋ ์ฝ๊ฐ ์๋๋๋ ๋๋์ด ๋ค๋๋ผ๋ ๊ฑฑ์ ๋ง์ธ์. ๊ฐ์ธ์ ์ผ๋ก ๋น๋๊ธฐ JavaScript ๊ด๋ จ ์์ ์ ํ ๋ ํจํด์ ์ตํ๊ณ ์์ ๊ฐ์ ์ป๊ธฐ ์ํด์๋ ์ฝ๊ฐ์ ๊ฒฝํ์ด ํ์ํ๋ค๊ณ ๋๋๋๋ค.
๊ทธ๋๋ ๋น๋๊ธฐ JavaScript๋ก ์์ ์ ํ์ค ๋ โ์๊ธฐ์น์์โ ๋๋ โ์์ธกํ ์ ์๋โ ๋์๋ค์ด ์กฐ๊ธ ๋ ์ดํด๋์ จ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค!
๊ทธ๋ฆฌ๊ณ ๋ ๊ทธ๋ ๋ฏ, ์ธ์ ๋ ์ง ์ง๋ฌธํด์ฃผ์ธ์! ๐