ES6์์ ์ถ๊ฐ๋ ๋ฌธ๋ฒ์ ๋ฐฐ์ ๋ค.
โ
callback hell(์ฝ๋ฐฑ ํฌ)
โ
Promise(ํ๋ก๋ฏธ์ค)
โ
async/await
์๋ฐ์คํฌ๋ฆฝํธ์ ํน์ฑ์ธ ๋งํผ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ ์ธ์ ๋ ๋ฐ์ํ๋ค. ํ์ง๋ง setTimeout
์ฒ๋ผ ๋น๋๊ธฐ๋ก ํธ์ถ๋๋ ํจ์์์ ๋ป๋๋ก ์ฝ๋๊ฐ ๋์ํ์ง ์๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ๋ค.
setTimeout(callback, delay)
setTimeout ํจ์๋ฅผ ํธ์ถํ๋ฉด ์ฒซ๋ฒ์งธ ์ธ์์ธ ์ฝ๋ฐฑ ํจ์๋ฅผ ํธ์ถ ์ค์ผ์ค๋งํ๊ณ , ํ์ด๋จธ id๋ฅผ ๋ฐํํ ํ ํจ์๋ฅผ ์ฆ์ ์ข ๋ฃํ๋ค. ์ด ์ฝ๋ฐฑ ํจ์๋ ํจ์์ ์ข ๋ฃ ์ดํ์ ๋์ํ๊ธฐ ๋๋ฌธ์ ์ฝ๋ฐฑ ํจ์์ ๊ฒฐ๊ณผ ๊ฐ์ ์ธ๋ถ๋ก ๋ฐํํ๊ฑฐ๋ ์์ ์ค์ฝํ์ ๋ณ์๋ก ํ ๋นํ๋ฉด undefined๊ฐ ๋ฐ์ํ๋ค.
๊ทธ๋ผ ์ด๋ป๊ฒ ํด๊ฒฐํ ๊น?
๋น๋๊ธฐ ํจ์์ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ ๊ฐ์ ์ ์ญ์์ ์ฌ์ฉํ ์ ์๊ฒ๋ ๊ทธ ๊ฒฐ๊ณผ ๊ฐ์ ํ์ ์ฒ๋ฆฌํ๋ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ ๋ฌํ๋ ๊ฒ ์ผ๋ฐ์ ์ธ ์ ๊ทผ์ด์๋ค. ๋น๋๊ธฐ ์ฒ๋ฆฌ๊ฐ ์ฑ๊ณตํ๋ฉด ํธ์ถํ ์ฝ๋ฐฑ ํจ์์ ๊ทธ๋ ์ง ์์ ๋ ํธ์ถํ ์ฝ๋ฐฑ ํจ์๋ฅผ ๋ฐ๋ก ์ ๋ฌํด ํ์ ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
์ด๋ ์ฝ๋ฐฑ ํจ์์ ๋์๋ ์ค์ฒฉ์ ์ผ๊ธฐํ๊ธฐ๋ ํ๋ค. ์ฒ๋ฆฌ ๊ฒฐ๊ณผ์ ๋ํ ํ์ ์กฐ์น๋ก ์ฝ๋ฐฑ ํจ์๋ฅผ ์ ๋ฌํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ฒ๋ฆฌํ ์ฝ๋ฐฑ ํจ์๋ฅผ ๋ ๋ค์ ์ธ์๋ก ์ ๋ฌํด์ผ ํ๋ค๋ฉด ๋ง์ด๋ค. ์ผ๋ช ์ฝ๋ฐฑ ํฌ(callback hell)์ ๋น ์ง๋ ๊ฒ์ด๋ค.
๋์๋ ๋ค์ฌ์ฐ๊ธฐ ๋๋ฌธ์ ์ฝ๋ ํด์์ด ์ฝ์ง ์์ ๋ฟ๋๋ฌ ์๋ฌ ์ฒ๋ฆฌ๋ ์ด๋ ต๋ค. ์ด๋ฅผ ๋ณด์ํ ๋ฐฉ๋ฒ์ผ๋ก ES6์์ Promise๋ฅผ ๋์ ํ๋ค. ์ดํ์ Promise๋ฅผ ๋ณด์ํ async/await๋ ๋ฑ์ฅํ๊ณ ๋ง์ด๋ค.
์ด์ ํ๋์ฉ ์ดํด๋ณด์.
Promise ์์ฑ์ ํจ์๋ฅผ new ์ฐ์ฐ์์ ํจ๊ป ํธ์ถํ์ฌ ํ๋ก๋ฏธ์ค(Promise ๊ฐ์ฒด)๋ฅผ ์์ฑํ๋ค. ECMAScript ์ฌ์์ ์ ์๋์์ผ๋ฏ๋ก ํธ์คํธ ๊ฐ์ฒด๊ฐ ์๋ ํ์ค ๋นํธ์ธ ๊ฐ์ฒด๋ค.
์ด ์์ฑ์ ํจ์๋ ๋น๋๊ธฐ ์ฒ๋ฆฌํ ์ฝ๋ฐฑ ํจ์ resolve์ reject๋ฅผ ๋งค๊ฐ๋ณ์(์ธ์)๋ก ์ ๋ฌ ๋ฐ๋๋ค. ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์ํํ๋ค๋ ๊ธฐ๋ณธ ์์ด๋์ด๋ ์ฝ๋ฐฑ ํจ์์์ ์์๋์๊ธฐ ๋๋ฌธ์ ํ๋ก๋ฏธ์ค๋ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ฌ์ฉํ๋ค. ๋ค๋ง ํ์ ํ ๋ฉ์๋์ ์กด์ฌ๋ก ์ฝ๋ฐฑ ํฌ์ ๋น ์ง์ง ์๋๋ค.
๋น๋๊ธฐ ์ฒ๋ฆฌ์ ์ฑ๊ณตํ๋ฉด resolve ํจ์์ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์ธ์๋ก ์ ๋ฌํด ํธ์ถํ๊ณ , ์คํจํ๋ฉด reject ํจ์์ ์๋ฌ๋ฅผ ์ธ์๋ก ์ ๋ฌํด ํธ์ถํ๋ค.
ํ๋ก๋ฏธ์ค๋ ๋น๋๊ธฐ ์ฒ๋ฆฌ์ ์งํ ์ ๋์ ๋ฐ๋ผ ์ํ ์ ๋ณด๋ฅผ ๊ฐ๋๋ค.
์ํ ์ ๋ณด๊ฐ ์๋ค๋ ๊ฑด ์ํ ๋ณํ์ ๋ฐ๋ฅธ ๊ฒฐ๊ณผ ๊ฐ๋ ๊ฐ์ง๋ค๋ ์๋ฏธ๊ฐ ๋๋ค. ์ฆ ํ๋ก๋ฏธ์ค๋ ๋น๋๊ธฐ ์ฒ๋ฆฌ ์ํ์ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๊ด๋ฆฌํ๋ ๊ฐ์ฒด์ด๋ค.
์ํ๊ฐ ๋ฐ๋๊ณ ๋๋ฉด ํ์ ์ฒ๋ฆฌ๋ฅผ ํด์ผ ํ๋ค. fulfilled ์ํ๋ then ๋ฉ์๋๋ฅผ, rejected ์ํ๋ catch ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค. catch ๋ฉ์๋๋ ๋น๋๊ธฐ ์ฒ๋ฆฌ๊ฐ ์ฑ๊ณตํ๋ฉด ํธ์ถ๋์ง ์๋๋ค.
์ด๋ก ์ then ๋ฉ์๋๋ ๋ ๊ฐ์ ์ธ์๋ฅผ ๋ฐ๊ธฐ ๋๋ฌธ์ reject๋ ์ฒ๋ฆฌํ ์ ์์ง๋ง, ๊ทธ๋ ๊ฒ ๋๋ฉด ์ฝ๋ฐฑ ํจ์๊ฐ ํ ์ค์ ๋ ๊ฐ์ด๋ค. ๊ฐ๋
์ฑ์ ์๊ฐํด์ catch ๋ฉ์๋๋ฅผ ํ์ฉํ๋ ๊ฒ ์ข๋ค.
Promise.prototype.finally
then๊ณผ catch๋ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ ํธ์ถ ์ฌ๋ถ๊ฐ ๋ฌ๋ผ์ก๋ค๋ฉด, finally๋ ๊ฒฐ๊ณผ์ ๋ฌด๊ดํ๋ค. ์ฆ ํ๋ก๋ฏธ์ค์ ์ํ์ ๊ด๋ จ ์๋ ๊ณตํต ์ํ์ ์ฒ๋ฆฌํ ๋ ์ ์ฉํ๋ค. ํ ๊ฐ์ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ธ์๋ก ์ ๋ฌ ๋ฐ๋๋ค.
then, catch, finally ๋ฉ์๋๋ ์ธ์ ๋ ํ์ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ก ํ๋ก๋ฏธ์ค๋ฅผ ๋ฐํํ๋ค. ๊ทธ๋์ ์ฐ์์ ์ธ ํธ์ถ์ด ๊ฐ๋ฅํ๋ฐ, ์ด๋ฅผ ํ๋ก๋ฏธ์ค ์ฒด์ด๋(promise chaining)์ด๋ผ๊ณ ํ๋ค.
ํ๋ก๋ฏธ์ค ์ฒด์ด๋ ์ฌ์ฉ ์ ์ฅ์ ์ ํฌ๊ฒ ๋ ๊ฐ์ง๋ค.
์ด๋ฐ ์ ์์ ๊ธฐ์กด์ ์ฝ๋ฐฑ ํจ์๋ณด๋ค๋ ๋ซ์ง๋ง, ํ๋ก๋ฏธ์ค๋ ์ฝ๋ฐฑ ํจํด์ ์ฌ์ฉํ๊ณ ์๊ธฐ ๋๋ฌธ์ ๊ฐ๋ ์ฑ ๊ฐ์ ์ ํ๊ณ๊ฐ ์๋ค.
์ด ๋ฌธ์ ๋ ES8์ ๋์๋ async/await๋ก ํด๊ฒฐํ๋ค.
then์ด๋ catch ๊ฐ์ ํ์ ์ฒ๋ฆฌ ๋ฉ์๋ ์์ด ๋๊ธฐ ์ฒ๋ฆฌ ๋ฐฉ์์ฒ๋ผ ํ๋ก๋ฏธ์ค๊ฐ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋๋ก ํ๋ค.
asyn ํจ์
await ํค์๋
์์ ์๊ฐ์ ์ ๊ณต๋ ์์ ์ค ํ๋๋ฅผ ๊ฐ์ ธ์ ์ดํด๋ณด๋ฉด ์ ๋ฆฌํ๊ธฐ ๋ ์ข์ ๊ฒ ๊ฐ๋ค.
(4 + 5) * 3 - 3 ์promise์ async/await๋ก ๊ณ์ฐํ๊ธฐ.
// ๋ํ๊ธฐ ํจ์ ํ๋ก๋ฏธ์ค ๊ฐ์ฒด ์์ฑ
function add(n1, n2) {
return new Promise(function(res){
setTimeout(function(){
let result = n1 + n2;
res(result);
});
}, 2000);
}
// ๊ณฑํ๊ธฐ ํจ์ ํ๋ก๋ฏธ์ค ๊ฐ์ฒด ์์ฑ
function mul(n) {
return new Promise(function(res){
setTimeout(() => {
let result = n * 3;
res(result);
}, 2000);
});
}
// ๋นผ๊ธฐ ํจ์ ํ๋ก๋ฏธ์ค ๊ฐ์ฒด ์์ฑ
function sub(n) {
return new Promise(function(res){
setTimeout(function(){
let result = n - 3;
res(result);
}, 2000);
});
}
์ด๋ฅผ async/await๋ก ๊ตฌํํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
async function exec(){
const sum = await add(4, 5);
console.log(`1: ${sum}`);
const mult = await mul(sum);
console.log(`2: ${mult}`);
const subb = await sub(mult);
console.log(`3: ${subb}`);
}
exec();
์ฌ์ฉ ๋ฐฉ๋ฒ์ ์ผ์ถ ์๊ฒ ๋๋ฐ ์ด๊ฑธ ์ด๋ป๊ฒ ์ฌ์ฉํ ์ง ๊ฐ์ด ์ ์กํ๋ค. ์์ ๋ถ ๋ง๋ก๋ ํ๋ก์ ํธ ํ๋ ์งํํ๋ฉด ์จ๊ฐ ๋ธ๋ก๊ทธ๋ฅผ ๊ฒ์ํด ๊ฐ๋ฉฐ ์ ์ ๋ก ์๊ฒ ๋๋ค๋๋ฐ.. ํ ๋ฌ ๋ค๋ฉด ์ง๊ธ๊ณผ ๋ค๋ฅธ ๋๋์ผ์ง ๊ถ๊ธํด์ง๋ค.
ํ๋ก๋ฏธ์ค๋ ์๋ฐ์คํฌ๋ฆฝํธ์์ ์ค์ํ ํค์๋ ์ค ํ๋๋ผ๊ณ ํ๋๋ฐ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์ํ ์ฝ๋ฐฑ ํจํด์ ๋ฌธ์ ์ ๋ถํฐ ์ดํด๋ณด๋ ๊ทธ ์ด์ ๊ฐ ์ดํด๋๋ค.
์์ ์ด ํ๋ฃจ 6์๊ฐ์ธ ๋งํผ ๋ง์ ๋ด์ฉ์ ํ ๋ฒ์ ์ ํ๊ฒ ๋์ด์ ์ด๋ป๊ฒ ์ ๋ฆฌํ ์ง ๊ณ ๋ฏผ์ค๋ฌ์ ๋๋ฐ ์ด์ ์ผ ํ์ด ์กํ๋ค. ๋ฐฐ์ด ๋ด์ฉ์ ๋ชฉ์ฐจ๋ฅผ ์ง๊ณ , ๊ทธ ๋ด์ฉ ์ค์์ ์ค์ํ ํค์๋๋ ์๊ณ ์ถ์ ๋ถ๋ถ์ ๊ณ ๋ฅธ๋ค. ์ฆ ์ฃผ์ ๊ฐ ์๋ ์์ฌ๋ฅผ ํํ๋ค. ๊ฒ๋ค๊ฐ ํ ๊ฐ๋ง ๊ณจ๋ผ๋ ์ถ๊ฐ ์๋ฃ๋ฅผ ์ฐพ๋ค๋ณด๋ฉด ์ ์ ๋ก ๋์ด๋๊ธฐ ๋๋ฌธ์... ๋ฌดํผ ์ด๋ฐ ์์ผ๋ก ๊ธฐ๋กํ๋ ๊ฒ ๋์ค์ ๋ค์ ์ฐพ์๋ณผ ๋์๋ ์ดํดํ๊ธฐ ์ข์ ๊ฒ ๊ฐ๋ค.