์ฝ๋ฐฑ ์ง์ฅ(Callback Hell)์ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์์ ์์ฃผ ๋ฐ์ํ๋ ์ฝ๋ ๊ตฌ์กฐ์ ํ ์ข
๋ฅ๋ก, ์ฌ๋ฌ ๋น๋๊ธฐ ๋์์ด ์ค์ฒฉ๋ ํํ๋ก ์ฝ๋๊ฐ ์์ฑ๋ ๋ ๋ฐ์ํ๋ ๊ฐ๋
์ฑ ์ ํ์ ์ ์ง๋ณด์์ ์ด๋ ค์์ ์ง์นญํฉ๋๋ค. ์ฃผ๋ก ์ฝ๋ฐฑ ํจ์๋ฅผ ์ฌ์ฉํ๋ ์ํฉ์์ ๋น๋๊ธฐ์ ์ธ ์์
๋ค์ด ์ค์ฒฉ๋์ด ๋ฐ์ํ๋ฉฐ, ์ฝ๋๊ฐ ๊ธธ์ด์ง์๋ก ๊ฐ๋
์ฑ์ด ๋จ์ด์ง๊ณ ๋ก์ง์ ์ดํด๊ฐ ์ด๋ ค์์ง๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
์๋ฅผ ๋ค์ด, ์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๊ณ , ๊ทธ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณตํ ํ ๋ค์ ์๋ฒ์ ์ ์กํ๊ณ , ๊ทธ ์๋ต์ ๋ฐ์์์ ํ๋ฉด์ ์ถ๋ ฅํ๋ ์ผ๋ จ์ ๋น๋๊ธฐ ๋์๋ค์ด ์ค์ฒฉ๋๋ ์ํฉ์์ ์ฝ๋ฐฑ ์ง์ฅ์ด ๋ฐ์ํ ์ ์์ต๋๋ค. ์ด๋ฌํ ์ค์ฒฉ๋ ์ฝ๋ฐฑ ํจ์๋ค์ ์ฝ๋์ ๋ค์ฌ์ฐ๊ธฐ ์์ค์ด ๊น์ด์ง๊ณ , ๊ฐ๋ ์ฑ์ด ๋จ์ด์ ธ ์ฝ๋๋ฅผ ์ดํดํ๊ธฐ ์ด๋ ค์์ง๋๋ค.
์๋ฅผ ๋ค์ด, ์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๊ณ , ๊ทธ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณตํ ํ ๋ค์ ์๋ฒ์ ์ ์กํ๊ณ , ๊ทธ ์๋ต์ ๋ฐ์์์ ํ๋ฉด์ ์ถ๋ ฅํ๋ ์ผ๋ จ์ ๋น๋๊ธฐ ๋์๋ค์ด ์ค์ฒฉ๋๋ ์ํฉ์์ ์ฝ๋ฐฑ ์ง์ฅ์ด ๋ฐ์ํ ์ ์์ต๋๋ค. ์ด๋ฌํ ์ค์ฒฉ๋ ์ฝ๋ฐฑ ํจ์๋ค์ ์ฝ๋์ ๋ค์ฌ์ฐ๊ธฐ ์์ค์ด ๊น์ด์ง๊ณ , ๊ฐ๋ ์ฑ์ด ๋จ์ด์ ธ ์ฝ๋๋ฅผ ์ดํดํ๊ธฐ ์ด๋ ค์์ง๋๋ค.
asyncFunction1(function(result1) { asyncFunction2(result1, function(result2) { asyncFunction3(result2, function(result3) { // ... }); }); });
์ด๋ฌํ ์ค์ฒฉ๋ ๊ตฌ์กฐ๋ ๋น๋๊ธฐ ๋์์ด ๋ง์์ง์๋ก ์ฝ๋๋ฅผ ์ดํดํ๊ธฐ ์ด๋ ค์์ง๋ฉฐ, ์๋ฌ ์ฒ๋ฆฌ ๋ฐ ์ ์ง๋ณด์๊ฐ ๋ณต์กํด์ง๋๋ค.
์ฝ๋ฐฑ ์ง์ฅ์ ํด๊ฒฐํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ผ๋ก๋ Promise๋ Async/Await์ ๊ฐ์ ๋น๋๊ธฐ ์ฒ๋ฆฌ ๋ฐฉ์์ ํ์ฉํ๋ ๊ฒ์ด ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์ฝ๋์ ๊ฐ๋ ์ฑ์ ํฅ์์ํค๊ณ , ๋น๋๊ธฐ ๋์๋ค์ ๋ณด๋ค ๋ช ์์ ์ด๊ณ ๊ด๋ฆฌํ๊ธฐ ์ฌ์ด ํํ๋ก ๊ตฌํํ ์ ์์ต๋๋ค.
์ฝ๋ฐฑ ์ง์ฅ์ ํด๊ฒฐํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ผ๋ก๋ Promise๋ Async/Await์ ๊ฐ์ ๋น๋๊ธฐ ์ฒ๋ฆฌ ๋ฐฉ์์ ํ์ฉํ๋ ๊ฒ์ด ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์ฝ๋์ ๊ฐ๋ ์ฑ์ ํฅ์์ํค๊ณ , ๋น๋๊ธฐ ๋์๋ค์ ๋ณด๋ค ๋ช ์์ ์ด๊ณ ๊ด๋ฆฌํ๊ธฐ ์ฌ์ด ํํ๋ก ๊ตฌํํ ์ ์์ต๋๋ค.
Promise๋ Async/Await์ ์ฌ์ฉํ์ฌ ์ฝ๋ฐฑ์ง์ฅ์ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ
์ฝ๋ฐฑ ์ง์ฅ์ ํด๊ฒฐํ๊ธฐ ์ํด Promise๋ Async/Await์ ์ฌ์ฉํ๋ ๊ฒ์ ๋น๋๊ธฐ ์ฝ๋๋ฅผ ๋ ๊ฐ๊ฒฐํ๊ณ ๊ฐ๋
์ฑ ์๊ฒ ๋ง๋ค ์ ์๋ ๋ฐฉ๋ฒ ์ค ํ๋์
๋๋ค. ์๋๋ ๊ฐ๊ฐ Promise์ Async/Await์ ์ฌ์ฉํ์ฌ ์ฝ๋ฐฑ ์ง์ฅ์ ํด๊ฒฐํ๋ ์์ ์ฝ๋์
๋๋ค.
๐ 1. Promise ์ฌ์ฉ
function asyncFunction1() { return new Promise((resolve) => { // ๋น๋๊ธฐ ์์ ์ํ setTimeout(() => { console.log('Async Function 1'); resolve('Result from Async Function 1'); }, 1000); }); } function asyncFunction2(result) { return new Promise((resolve) => { // ๋น๋๊ธฐ ์์ ์ํ setTimeout(() => { console.log('Async Function 2'); resolve('Result from Async Function 2'); }, 1000); }); } function asyncFunction3(result) { return new Promise((resolve) => { // ๋น๋๊ธฐ ์์ ์ํ setTimeout(() => { console.log('Async Function 3'); resolve('Result from Async Function 3'); }, 1000); }); } asyncFunction1() .then((result1) => asyncFunction2(result1)) .then((result2) => asyncFunction3(result2)) .then((result3) => { console.log('Final Result:', result3); }) .catch((error) => { console.error('Error:', error); });
๐ Async/Await ์ฌ์ฉ
function asyncFunction1() { return new Promise((resolve) => { // ๋น๋๊ธฐ ์์ ์ํ setTimeout(() => { console.log('Async Function 1'); resolve('Result from Async Function 1'); }, 1000); }); } function asyncFunction2(result) { return new Promise((resolve) => { // ๋น๋๊ธฐ ์์ ์ํ setTimeout(() => { console.log('Async Function 2'); resolve('Result from Async Function 2'); }, 1000); }); } function asyncFunction3(result) { return new Promise((resolve) => { // ๋น๋๊ธฐ ์์ ์ํ setTimeout(() => { console.log('Async Function 3'); resolve('Result from Async Function 3'); }, 1000); }); } async function runAsyncFunctions() { try { const result1 = await asyncFunction1(); const result2 = await asyncFunction2(result1); const result3 = await asyncFunction3(result2); console.log('Final Result:', result3); } catch (error) { console.error('Error:', error); } } runAsyncFunctions();
์์ ์ฝ๋์์๋ ๊ฐ๊ฐ์ ๋น๋๊ธฐ ํจ์๊ฐ Promise๋ฅผ ๋ฐํํ๋๋ก ์์ฑ๋์๊ณ , ์ด๋ฅผ ์์ฐจ์ ์ผ๋ก ํธ์ถํ๋๋ก then ๋๋ await์ ์ฌ์ฉํ์์ต๋๋ค. async & await์์ ์์ธ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ฐ๋ก try catch์
๋๋ค.
์ฝ๋์์ ๋ฐ์ํ ๋คํธ์ํฌ ํต์ ์ค๋ฅ๋ฟ๋ง ์๋๋ผ ๊ฐ๋จํ ํ์ ์ค๋ฅ ๋ฑ์ ์ผ๋ฐ์ ์ธ ์ค๋ฅ๊น์ง๋ catch๋ก ์ก์๋ผ ์ ์์ต๋๋ค. ๋ฐ๊ฒฌ๋ ์๋ฌ๋ error ๊ฐ์ฒด์ ๋ด๊ธฐ๊ธฐ ๋๋ฌธ์ ์๋ฌ์ ์ ํ์ ๋ง๊ฒ ์๋ฌ ์ฝ๋๋ฅผ ์ฒ๋ฆฌํด์ฃผ์๋ฉด ๋ฉ๋๋ค.
ํ๋ก๋ฏธ์ค๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด ํ๋ก๋ฏธ์ค ๊ฐ์ฒด์ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ ๊ฒฐ๊ณผ๊ฐ์ด ์ ์ฅ๋๋ฉฐ ์ฝ๋ฐฑ์ ๊ฒฝ์ฐ ๋งค๋ฒ ๋น๋๊ธฐ ํจ์๋ฅผ ํธ์ถํ์ฌ ๋น๋๊ธฐ์ฒ๋ฆฌ๋ ๊ฒฐ๊ณผ๊ฐ์ ์ป์๋ค๋ฉด ํ๋ก๋ฏธ์ค๋ .then ๋ฉ์๋๋ฅผ ํตํด์ ์ํ๋ ๋์ ์ ์ฅ๋์ด ์๋ ๋น๋๊ธฐ ๊ฐ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
Async & Await์ ์ฌ์ฉํ๋ฉด ๋น๋๊ธฐ ์ฝ๋๋ฅผ ๋๊ธฐ ์ฝ๋์ฒ๋ผ ์์ฑํ ์ ์์ต๋๋ค. ์ด๋ก์จ ์ฝ๋์ ์๋๊ฐ ๋ช ํํด์ง๊ณ ๊ฐ๋ ์ฑ์ด ํฅ์๋ฉ๋๋ค. Async & Await์ ์ฌ์ฉํ๋ฉด ์ฝ๋ฐฑ ์ง์ฅ์ ํผํ๊ณ ๋น๋๊ธฐ ์ฝ๋๋ฅผ ๊ตฌ์กฐ์ ์ด๊ณ ๋ช ๋ฃํ๊ฒ ์์ฑํ ์ ์์ต๋๋ค.
์ฝ๋์์ ๋ฐ์ํ ๋คํธ์ํฌ ํต์ ์ค๋ฅ๋ฟ๋ง ์๋๋ผ ๊ฐ๋จํ ํ์ ์ค๋ฅ ๋ฑ์ ์ผ๋ฐ์ ์ธ ์ค๋ฅ๊น์ง๋ catch๋ก ์ก์๋ผ ์ ์์ต๋๋ค. ๋ฐ๊ฒฌ๋ ์๋ฌ๋ error ๊ฐ์ฒด์ ๋ด๊ธฐ๊ธฐ ๋๋ฌธ์ ์๋ฌ์ ์ ํ์ ๋ง๊ฒ ์๋ฌ ์ฝ๋๋ฅผ ์ฒ๋ฆฌํด์ฃผ์๋ฉด ๋ฉ๋๋ค.
ํ๋ก๋ฏธ์ค๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด ํ๋ก๋ฏธ์ค ๊ฐ์ฒด์ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ ๊ฒฐ๊ณผ๊ฐ์ด ์ ์ฅ๋๋ฉฐ ์ฝ๋ฐฑ์ ๊ฒฝ์ฐ ๋งค๋ฒ ๋น๋๊ธฐ ํจ์๋ฅผ ํธ์ถํ์ฌ ๋น๋๊ธฐ์ฒ๋ฆฌ๋ ๊ฒฐ๊ณผ๊ฐ์ ์ป์๋ค๋ฉด ํ๋ก๋ฏธ์ค๋ .then ๋ฉ์๋๋ฅผ ํตํด์ ์ํ๋ ๋์ ์ ์ฅ๋์ด ์๋ ๋น๋๊ธฐ ๊ฐ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
Async & Await์ ์ฌ์ฉํ๋ฉด ๋น๋๊ธฐ ์ฝ๋๋ฅผ ๋๊ธฐ ์ฝ๋์ฒ๋ผ ์์ฑํ ์ ์์ต๋๋ค. ์ด๋ก์จ ์ฝ๋์ ์๋๊ฐ ๋ช ํํด์ง๊ณ ๊ฐ๋ ์ฑ์ด ํฅ์๋ฉ๋๋ค. Async & Await์ ์ฌ์ฉํ๋ฉด ์ฝ๋ฐฑ ์ง์ฅ์ ํผํ๊ณ ๋น๋๊ธฐ ์ฝ๋๋ฅผ ๊ตฌ์กฐ์ ์ด๊ณ ๋ช ๋ฃํ๊ฒ ์์ฑํ ์ ์์ต๋๋ค.