์๋ฐ์คํฌ๋ฆฝํธ์์ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ ๋ค๋ฃจ๋ค ๋ณด๋ฉด Callback Hell์ด๋ผ๋ ๋ฌธ์ ๋ฅผ ๋ง๋๊ฒ ๋ฉ๋๋ค. ์ด๋ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ฌ๋ฌ ๋ฒ ์ค์ฒฉํด์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ฐ์ํ๋ ๋ฌธ์ ๋ก, ์ฝ๋๊ฐ ๊น์ด์ง๊ณ ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง๋ฉฐ ์ ์ง๋ณด์๊ฐ ์ด๋ ค์์ง๋ ์ํฉ์ ๋งํฉ๋๋ค. ํนํ, ์ด์ ํฌ์คํ ์์ ๋ค๋ฃฌ async ํ๋ก๊ทธ๋๋ฐ๊ณผ ๋ฐ์ ํ๊ฒ ๊ด๋ จ์ด ์์ต๋๋ค.
โฃ ๋ชฉ์ฐจ
์๋ฐ์คํฌ๋ฆฝํธ async ํ๋ก๊ทธ๋๋ฐ์ ๊ดํ ๋ด์ฉ์ ์๋ ํฌ์คํ
์ ์ฐธ๊ณ ํด ์ฃผ์ธ์๐
01. Callback Hell์ ์์๐
Callback Hell์ ์ดํดํ๊ธฐ ์ํด ๊ฐ๋จํ ์์๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ๋ค์์ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ค์ฒฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ์์ ์ ๋๋ค.
getData(function(result1) {
processData(result1, function(result2) {
saveData(result2, function(result3) {
console.log('All done!');
});
});
});
์์ ๊ฐ์ ์ฝ๋๋ ์ฝ๊ธฐ ์ด๋ ต๊ณ , ์๋ฌ ์ฒ๋ฆฌ๊ฐ ๋ณต์กํด์ง ์ ์์ต๋๋ค. ์ด๋ฅผ Callback Hell์ด๋ผ๊ณ ๋ถ๋ฆ ๋๋ค.
02. Promise์ ๋ฑ์ฅโจ
Promise๋ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์๋ฐ์คํฌ๋ฆฝํธ์ ๋์ ๋ ๊ธฐ๋ฅ์ ๋๋ค. Promise๋ ๋น๋๊ธฐ ์์ ์ ๋ ์ฝ๊ฒ ๊ด๋ฆฌํ๊ณ , ๊ฐ๋ ์ฑ์ ๋์ฌ์ค๋๋ค. ๊ฐ๋จํ ๋งํด, Promise๋ ๋น๋๊ธฐ ์์ ์ ์ฑ๊ณต ๋๋ ์คํจ๋ฅผ ๋ํ๋ด๋ ๊ฐ์ฒด์ ๋๋ค.
03. Promise ์ฌ์ฉ๋ฒ ๊ธฐ์ด ๐ ๏ธ
Promise๋ new Promise ์์ฑ์๋ฅผ ํตํด ์์ฑ๋ฉ๋๋ค. ์์ฑ์๋ ๋ ๊ฐ์ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ธ์๋ก ๋ฐ์ต๋๋ค. resolve์ reject ๋น๋๊ธฐ ์์ ์ด ์ฑ๊ณตํ๋ฉด resolve๋ฅผ ํธ์ถํ๊ณ , ์คํจํ๋ฉด reject๋ฅผ ํธ์ถํฉ๋๋ค.
new Promise((resolve, reject) => {
// ๋น๋๊ธฐ ์์
์ํ
if (์ฑ๊ณต) {
resolve(result); // ์ฑ๊ณต ์ ํธ์ถ
} else {
reject(error); // ์คํจ ์ ํธ์ถ
}
});
Promise๋ .then(), .catch(), .finally() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ ์์ ์ ๊ฒฐ๊ณผ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.
04. Callback Hell์ Promise๋ก ๋ฐ๊พธ๊ธฐ๐
์์ ๋ณธ Callback Hell ์์ ๋ฅผ Promise๋ก ๋ณํํด ๋ณด๊ฒ ์ต๋๋ค.
getData()
.then(result1 => processData(result1))
.then(result2 => saveData(result2))
.then(result3 => console.log('All done!'))
.catch(error => console.error(error));
์ด๋ ๊ฒ ํ๋ฉด ์ฝ๋๊ฐ ํจ์ฌ ๊น๋ํด์ง๊ณ , ๊ฐ ๋จ๊ณ์์์ ์๋ฌ ์ฒ๋ฆฌ๊ฐ ์ฉ์ดํด์ง๋๋ค.
05. Promise Chaining๐
Promise Chaining์ ์ฌ๋ฌ ๋น๋๊ธฐ ์์ ์ ์์ฐจ์ ์ผ๋ก ์ฒ๋ฆฌํ ๋ ์ ์ฉํฉ๋๋ค. ํ๋์ then์ด ๋ฐํํ๋ ๊ฐ์ ๋ค์ then์ผ๋ก ์ ๋ฌ๋ฉ๋๋ค.
fetch('https://api.example.com/data')
.then(response => response.json())
.then(data => {
console.log(data);
return processData(data);
})
.then(processedData => saveData(processedData))
.catch(error => console.error('Error:', error));
์ด์ฒ๋ผ Promise Chaining์ ํตํด ๋น๋๊ธฐ ์์ ์ ์์ฐจ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ณ , ๊ฐ๋ ์ฑ์ ์ ์งํ ์ ์์ต๋๋ค.
06. Promise.all๊ณผ Promise.race๐ซ
- Promise.all: ์ฌ๋ฌ ๊ฐ์ Promise๋ฅผ ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌํ๊ณ , ๋ชจ๋ Promise๊ฐ ํด๊ฒฐ๋์์ ๋ ํ๋์ Promise๋ฅผ ๋ฐํํฉ๋๋ค. ํ๋๋ผ๋ ์คํจํ๋ฉด, ์คํจํ Promise๋ฅผ ๋ฐํํฉ๋๋ค.
- Promise.race: ์ฌ๋ฌ ๊ฐ์ Promise ์ค ๊ฐ์ฅ ๋จผ์ ํด๊ฒฐ๋๊ฑฐ๋ ๊ฑฐ๋ถ๋ Promise๋ฅผ ๋ฐํํฉ๋๋ค.
let promise1 = new Promise((resolve) => setTimeout(resolve, 100, "์ฒซ ๋ฒ์งธ"));
let promise2 = new Promise((resolve) => setTimeout(resolve, 200, "๋ ๋ฒ์งธ"));
let promise3 = new Promise((resolve, reject) => setTimeout(reject, 150, "์ธ ๋ฒ์งธ ์คํจ"));
Promise.all([promise1, promise2])
.then((results) => {
console.log(results); // ["์ฒซ ๋ฒ์งธ", "๋ ๋ฒ์งธ"]
})
.catch((error) => {
console.error(error);
});
Promise.race([promise1, promise2, promise3])
.then((result) => {
console.log(result); // "์ฒซ ๋ฒ์งธ"
})
.catch((error) => {
console.error(error); // "์ธ ๋ฒ์งธ ์คํจ"
});
07. ์๋ฌ ํธ๋ค๋ง๐ฅ
Promise์์ ์๋ฌ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๊ฐ๋จํฉ๋๋ค. .catch() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์๋ฌ๋ฅผ ์ก์๋ด๊ณ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
doSomething()
.then(result => doSomethingElse(result))
.catch(error => console.error('Something went wrong:', error));
Callback Hell์ ์๋ฐ์คํฌ๋ฆฝํธ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์์ ํํ ๋ฐ์ํ๋ ๋ฌธ์ ์ ๋๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด Promise๋ฅผ ์ฌ์ฉํ๋ฉด ์ฝ๋์ ๊ฐ๋ ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ด ํฌ๊ฒ ํฅ์๋ฉ๋๋ค. Promise๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ ์์ ์ ๊ด๋ฆฌํ๊ณ , chaining๊ณผ ์๋ฌ ํธ๋ค๋ง์ ํตํด ๋ ์์ ํ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.