์๋ฐ์คํฌ๋ฆฝํธ์์ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ ํ์ ๊ฐ๋ ์ ๋๋ค. ํนํ ๋คํธ์ํฌ ์์ฒญ, ํ์ผ ์ฝ๊ธฐ ๋ฑ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๋ ์์ ์ ๋ฉ์ธ ์ค๋ ๋๋ฅผ ๋ฉ์ถ์ง ์๊ณ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ฌ์ฉ๋์ฃ . ์ด ๊ธ์์๋ ๋น๋๊ธฐ ์ฒ๋ฆฌ์ ํต์ฌ์ธ Promise์ async/await์ ๋์ ์๋ฆฌ๋ฅผ ๋๊ตฌ๋ ์ดํดํ ์ ์๋๋ก ์ฝ๊ฒ, ํ์ง๋ง ๊น์ด ์๊ฒ ์ค๋ช ํด ๋๋ฆด๊ฒ์!
์๋ฐ์คํฌ๋ฆฝํธ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฑ๊ธ ์ค๋ ๋(Single Thread) ์ธ์ด์ ๋๋ค. ์ฆ, ์์ ์ ํ ๋ฒ์ ํ๋์ฉ ์์๋๋ก ์ฒ๋ฆฌํ์ฃ (๋๊ธฐ ์ฒ๋ฆฌ).
๐ ๋น์ :
- ๋๊ธฐ: ์๋น์์ ์ฃผ๋ฌธํ๊ณ ์์์ด ๋์ฌ ๋๊น์ง ์นด์ดํฐ ์์์ ๊ผผ์ง ์๊ณ ์์ ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ์ ๋๋ค. (๋ค๋ฅธ ์๋ ์ฃผ๋ฌธ ๋ถ๊ฐ)
- ๋น๋๊ธฐ: ์๋น์์ ์ฃผ๋ฌธํ๊ณ ์๋ฆฌ์ ์์ ๋ค๋ฅธ ์ผ์ ํ๊ฑฐ๋ ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ์ ๋๋ค. (๋ค๋ฅธ ์๋ ์ฃผ๋ฌธ ๊ฐ๋ฅ)
Promise๋ ๋น๋๊ธฐ ์์ ์ ์ต์ข ์๋ฃ(์ฑ๊ณต) ๋๋ ์คํจ(์ค๋ฅ)๋ฅผ ๋ํ๋ด๋ ๊ฐ์ฒด์ ๋๋ค. ๋น๋๊ธฐ ์์ ์ ๊ฒฐ๊ณผ๋ฅผ ๋ง์น ๋๊ธฐ ์์ ์ ๊ฒฐ๊ณผ์ฒ๋ผ ์ฌ์ฉํ ์ ์๊ฒ ํด์ฃผ๋ โ๋ฏธ๋์ ๊ฐ์ ๋ํ ์ฝ์โ์ด์ฃ .
Promise ๊ฐ์ฒด๋ ์์ฑ ์๊ฐ๋ถํฐ ๊ฒฐ๊ณผ๊ฐ ํ์ ๋ ๋๊น์ง ๋ค์ 3๊ฐ์ง ์ํ ์ค ํ๋๋ฅผ ๊ฐ์ง๋๋ค.
| ์ํ (State) | ์๋ฏธ |
| Pending (๋๊ธฐ) | ๋น๋๊ธฐ ์์ ์ด ์งํ ์ค์ธ ์ด๊ธฐ ์ํ์ ๋๋ค. |
| Fulfilled (์ดํ/์ฑ๊ณต) | ๋น๋๊ธฐ ์์ ์ด ์ฑ๊ณต์ ์ผ๋ก ๋๋ฌ๊ณ , ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค. |
| Rejected (๊ฑฐ๋ถ/์คํจ) | ๋น๋๊ธฐ ์์ ์ด ์คํจํ๊ณ , ์ค๋ฅ(์๋ฌ)๋ฅผ ๋ฐํํฉ๋๋ค. |
new Promise()๋ก ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ฉด ๋๊ธฐ ์ํ๊ฐ ๋ฉ๋๋ค.executor ํจ์๊ฐ ์คํ๋๋ฉฐ, ๋น๋๊ธฐ ์์
์ด ์์๋ฉ๋๋ค.resolve ํจ์ ํธ์ถ $\rightarrow$ Fulfilled ์ํ๋ก ์ ํ. ๊ฒฐ๊ณผ ๊ฐ์ .then()์ผ๋ก ๋ฐ์ต๋๋ค.reject ํจ์ ํธ์ถ $\rightarrow$ Rejected ์ํ๋ก ์ ํ. ์ค๋ฅ๋ .catch()๋ก ๋ฐ์ต๋๋ค..then(), .catch()).then() ๋ฉ์๋๋ฅผ ํตํด ์ฌ๋ฌ ๊ฐ์ ๋น๋๊ธฐ ์์
์ ์์ฐจ์ ์ผ๋ก ์ฐ๊ฒฐํ ์ ์์ต๋๋ค. ์ด๋ฅผ Promise ์ฒด์ด๋(Chaining)์ด๋ผ๊ณ ํฉ๋๋ค.
JavaScript
// A ์์
-> B ์์
-> C ์์
์์ผ๋ก ์คํ
fetchUser()
.then(getUserData) // A ์ฑ๊ณต -> B ์คํ
.then(formatData) // B ์ฑ๊ณต -> C ์คํ
.catch(handleError); // ์ค๊ฐ์ ์คํจํ๋ฉด catch๋ก ์ด๋
async/await๋ ES8(ECMAScript 2017)์ ๋์ ๋ ๋ฌธ๋ฒ์ผ๋ก, Promise๋ฅผ ๋์ฑ ๋๊ธฐ ์ฝ๋์ฒ๋ผ ๋ณด์ด๊ฒ ๋ง๋ค์ด ๊ฐ๋ ์ฑ์ ๋์ฌ์ค๋๋ค.
ํจ์ ์์ async ํค์๋๋ฅผ ๋ถ์ด๋ฉด, ์ด ํจ์๋ ํญ์ Promise๋ฅผ ๋ฐํํ๋๋ก ๋ง๋ญ๋๋ค.
async function fetchData() { return '๊ฒฐ๊ณผ'; }Promise.resolve('๊ฒฐ๊ณผ')๋ฅผ ๋ฐํํฉ๋๋ค.await ํค์๋๋ ๋ฐ๋์ async ํจ์ ์์์๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค.
await์ Promise ์์ ๋ถ์ฌ์ ์ฌ์ฉํ๋ฉฐ, ํด๋น Promise๊ฐ Fulfilled ๋๋ Rejected ์ํ๊ฐ ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฝ๋๋ค.await์ Promise์ ๊ฒฐ๊ณผ ๊ฐ(resolve ๊ฐ)์ ๋ฐํํฉ๋๋ค.async/await๊ฐ ๋๊ธฐ์ฒ๋ผ ๋ณด์ด์ง๋ง ๋น๋๊ธฐ๋ก ๋์ํ๋ ํต์ฌ์ ์๋ฐ์คํฌ๋ฆฝํธ ๋ด๋ถ์ ์ด๋ฒคํธ ๋ฃจํ(Event Loop)์ ์ ๋๋ ์ดํฐ(Generator) ํจ์ ์๋ฆฌ์ ๊ธฐ๋ฐํฉ๋๋ค.
async ํจ์๊ฐ ์คํ๋๋ฉด, ๋ด๋ถ์ ์ผ๋ก ์ ๋๋ ์ดํฐ์ฒ๋ผ ๋์ํ๋ ํจ์๋ก ๋ณํ๋ฉ๋๋ค.await somePromise()๋ฅผ ๋ง๋๋ฉด, ํด๋น Promise์ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ค๋ฆฝ๋๋ค.async ํจ์๋ ์ ์ ์คํ์ ์ผ์ ์ค์ง(Yield)ํ๊ณ , ๋ฉ์ธ ์ค๋ ๋๋ฅผ ๋ง์ง ์์ต๋๋ค.JavaScript
async function process() {
const resultA = await taskA(); // 1. taskA ์์, async ํจ์ ์ผ์ ์ค์ง
// (์ค์ง๋๋ ๋์ ๋ฉ์ธ ์ค๋ ๋๋ ๋ค๋ฅธ ์์
์ฒ๋ฆฌ ๊ฐ๋ฅ)
const resultB = await taskB(resultA); // 2. taskA ์๋ฃ ํ ์ฌ๊ฐ, taskB ์์
return resultB;
}
| ๊ตฌ๋ถ | Promise | async/await |
| ๋ฌธ๋ฒ | .then(), .catch() ์ฒด์ด๋ ๋ฐฉ์ | try...catch๋ฅผ ์ฌ์ฉํ ๋๊ธฐ ์ฝ๋ ํํ |
| ๊ฐ๋ ์ฑ | ๋ค์ ๋ณต์กํด์ง ์ ์์ (์ฝ๋ฐฑ ์ง์ฅ ๋ฐฉ์ง) | ์๋์ ์ผ๋ก ๋์ (๋๊ธฐ ์ฝ๋์ฒ๋ผ ๋ณด์) |
| ์ค๋ฅ ์ฒ๋ฆฌ | .catch() ์ฌ์ฉ | try...catch ๋ธ๋ก ์ฌ์ฉ |
| ์ฌ์ฉ์ฒ | Promise ๊ธฐ๋ฐ API๋ฅผ ์ฌ์ฉํ ๋, ์ ์์ค(Low-level) ์ฒ๋ฆฌ ์ | ๋๋ถ๋ถ์ ๋น๋๊ธฐ ์ฝ๋ (๊ฐ๋ ์ฑ ์ต์ฐ์ ) |
โ ์ถ์ฒ ๊ฐ์ด๋
async/await๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์๋์ ์ผ๋ก ๊ถ์ฅ๋ฉ๋๋ค. ์ฝ๋์ ํ๋ฆ์ ์ดํดํ๊ธฐ ๊ฐ์ฅ ์ฝ๊ณ ์ค๋ฅ ์ฒ๋ฆฌ(try...catch)๋ ๊ฐํธํฉ๋๋ค.async/await๋ Promise ์์ ๋ง์์์ง ๋ฌธ๋ฒ์ ์คํ(Syntactic Sugar)์ผ ๋ฟ์ด๋ฏ๋ก, ๊ทผ๋ณธ ์๋ฆฌ์ธ Promise์ ์ํ์ ๋์ ์๋ฆฌ๋ฅผ ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.๋ก์ปฌ ๋คํธ์ํฌ ํ๊ฒฝ์ ์กฐ๊ธ์ด๋ผ๋ ๋ค๋ค๋ณธ ์ฌ๋์ด๋ผ๋ฉด ํ ๋ฒ์ฏค์ ๋ง์ฃผ์น๋ ์ต์ํ ๋จ์ด๊ฐ ์์ต๋๋ค. ๋ฐ๋ก NetBIOS์ NBT์ ๋๋ค.…
์๋ ํ์ธ์! ํ๋ ์น ๊ฐ๋ฐ์์ ๋ฐ์ดํฐ ๊ตํ์ ํต์ฌ์ธ JSON(JavaScript Object Notation)์ ๋์ฑ ๊ฐ๋ ฅํ๊ณ ์์ ์ ์ผ๋ก ๋ง๋ค์ด์ฃผ๋ ๋๊ตฌ,…
โ ECMAScript 3(E3)๋ ๋ฌด์์ผ๊น ECMAScript 3๋ 1999๋ ์ ๊ณต์ํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ค์ด๋ค. ์ง๊ธ ๋ณด๋ฉด ์ค๋๋ ๊ธฐ์ ๊ฐ์ง๋ง,…
CoffeeScript๋ ํ๋ ํ๋ก ํธ์๋ ๊ฐ๋ฐ ์ํ๊ณ์์ ๋งค์ฐ ์ธ๊ธฐ ์์๋ ์ธ์ด์๊ณ , ์ง๊ธ๋ ํน์ ํ๋ก์ ํธ๋ ๋ ๊ฑฐ์ ์์คํ , ๊ฐ๊ฒฐํ…
ํ๋์ ์ธ ํ๋ก๊ทธ๋๋ฐ ํ๊ฒฝ์์ ๋ฉ๋ชจ๋ฆฌ ๋์(Memory Leak)๋ ์ฌ์ ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ ์ ํ์ ์ถฉ๋์ ์ผ์ผํค๋ ์ฃผ์ ์์ธ ์ค…
(Critical Rendering Path, ํต์ฌ ๋ ๋๋ง ๊ฒฝ๋ก ์๋ฒฝ ์ดํด) ์น ๋ธ๋ผ์ฐ์ ์ ์ฃผ์๋ฅผ ์ ๋ ฅํ๊ณ ์ํฐ๋ฅผ ๋๋ฅด๋ ์๊ฐ,…