๐ฃ ์ฝ๋ฐฑ์ ๋ฒํท ๋ฆด๋ ์ด์ ๋ํด ํบ์๋ณด์ !
์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ฐ๋ค ๋ณด๋ฉด ํ ๋ฒ์ฏค ๋ค์ด๋ดค์ ๋จ์ด, ๋ฐ๋ก ์ฝ๋ฐฑ(callback). ํจ์์ ์ธ์๋ก ์ ๋ฌ๋์ด ๋์ค์ ํธ์ถ๋๋ ์ด ๊ฐ๋ ์ ๋น๋๊ธฐ ์์ ์ ์ฌ์ฅ๋ถ์์ ์๋ํฉ๋๋ค. ๊ทธ๋ฐ๋ฐ, ์ด๋ฐ ์ฝ๋ฐฑ๋ ๋ฒํท ๋ฆด๋ ์ด(bucket relay)์ฒ๋ผ ๋์์์ด ๋ค์ ์ฃผ์์๊ฒ ์์ ์ ๋๊ธธ ์ ์๋ค๋ ์ฌ์ค, ์๊ณ ๊ณ์ จ๋์?
์ค๋์ ์ฝ๋ฐฑ๊ณผ ๋ฒํท ๋ฆด๋ ์ด์ ๊ฐ๋ , ์ด๋ฅผ ์ค์ ์ฝ๋์์ ์ด๋ป๊ฒ ๊ตฌํํ๋์ง, ๊ทธ๋ฆฌ๊ณ ์ด ํจํด์์ ์ฃผ์ํด์ผ ํ ์ ๊น์ง ์ฐจ๊ทผ์ฐจ๊ทผ ์์๋ด ์๋น. ๐
๐ ์ฝ๋ฐฑ(callback)์ด๋?
์ฝ๋ฐฑ์ “๋์ค์ ๋ถ๋ฌ์ค”๋ผ๋ ์๋ฏธ๋ฅผ ๊ฐ์ง ํจ์์ ๋๋ค. ์ฆ, ํจ์์ ์ธ์๋ก ์ ๋ฌ๋์ด ํน์ ์กฐ๊ฑด์ด ์ถฉ์กฑ๋๊ฑฐ๋ ์์ ์ด ์๋ฃ๋ ํ ์คํ๋๋ ํจ์์ฃ .
์ฝ๋ฐฑ ๊ธฐ๋ณธ ์์
function greet(name, callback) {
console.log(`Hello, ${name}!`);
callback();
}
function sayGoodbye() {
console.log("Goodbye!");
}
// greet์ ์ฝ๋ฐฑ ํจ์ ์ ๋ฌ
greet("Alice", sayGoodbye);
// ์ถ๋ ฅ:
// Hello, Alice!
// Goodbye!
๋น์ ๋ก ์ดํดํ๊ธฐ: “๋ฒํท ๋ฆด๋ ์ด”
๋ฒํท ๋ฆด๋ ์ด๋ ๋ฌผ์ ๋ด์ ๋ฒํท์ ํ ์ฌ๋์์ ๋ค์ ์ฌ๋์ผ๋ก ์ ๋ฌํ๋ ๊ณผ์ ์ ๋งํฉ๋๋ค. ์ฝ๋ฐฑ ํจ์๋ ์ด์ ๋น์ทํ๊ฒ, ํ๋์ ์์ ์ด ์๋ฃ๋๋ฉด ๋ค์ ์์ ์ผ๋ก ๊ฒฐ๊ณผ๋ฅผ ๋๊ฒจ์ฃผ๋ ์ญํ ์ ํฉ๋๋ค.
๐ ์ฝ๋ฐฑ์ ๋ฒํท ๋ฆด๋ ์ด๋?
์ฝ๋ฐฑ์ ๋ฒํท ๋ฆด๋ ์ด๋ ์ฝ๋ฐฑ ํจ์๊ฐ ์ฐ์์ ์ผ๋ก ํธ์ถ๋์ด ์์ ์ด ์ด์ด์ง๋ ๊ตฌ์กฐ๋ฅผ ์๋ฏธํฉ๋๋ค. ๋น๋๊ธฐ ์์ ์ด ์ฐ์์ ์ผ๋ก ์ด๋ฃจ์ด์ ธ์ผ ํ๋ ๊ฒฝ์ฐ, ์ด๋ฐ ํจํด์ด ์์ฃผ ๋ฑ์ฅํ์ฃ .
์ค์ ์์ : ์ฝ๋ฐฑ์ ๋ฒํท ๋ฆด๋ ์ด
function fetchData(userId, callback) {
setTimeout(() => {
console.log(`Fetched data for user ${userId}`);
callback(userId);
}, 1000);
}
function processData(userId, callback) {
setTimeout(() => {
console.log(`Processed data for user ${userId}`);
callback(userId);
}, 1000);
}
function saveData(userId, callback) {
setTimeout(() => {
console.log(`Saved data for user ${userId}`);
callback();
}, 1000);
}
// ์ฝ๋ฐฑ์ ๋ฒํท ๋ฆด๋ ์ด
fetchData(1, (userId) => {
processData(userId, (userId) => {
saveData(userId, () => {
console.log("All tasks completed!");
});
});
});
// ์ถ๋ ฅ:
// Fetched data for user 1
// Processed data for user 1
// Saved data for user 1
// All tasks completed!
โ ๏ธ ์ฝ๋ฐฑ ํฌ(callback hell)์ ๋ฌธ์
์ฝ๋ฐฑ์ ๋ฒํท ๋ฆด๋ ์ด๋ ๊ฐ๋ ฅํ ๋๊ตฌ์ง๋ง, ์ฝ๋ฐฑ ํฌ(callback hell)์ด๋ผ๋ ํจ์ ์ ๋น ์ง ์ ์์ต๋๋ค. ์ฝ๋ฐฑ ํจ์๊ฐ ์ค์ฒฉ๋๋ฉด์ ์ฝ๋๊ฐ ๋ณต์กํด์ง๊ณ ์ฝ๊ธฐ ์ด๋ ค์์ง๋ ๋ฌธ์ ๊ฐ ์๊ธฐ์ฃ .
์ฝ๋ฐฑ ํฌ ์์
doTask1((result1) => {
doTask2(result1, (result2) => {
doTask3(result2, (result3) => {
doTask4(result3, (result4) => {
console.log("All tasks completed!");
});
});
});
});
๐ ์ค์ฒฉ ๊ตฌ์กฐ๊ฐ ๊น์ด์ง๋ฉด ๊ฐ๋ ์ฑ๊ณผ ๋๋ฒ๊น ์ด ๋งค์ฐ ์ด๋ ค์์ง๋๋ค.
๐ ํด๊ฒฐ์ฑ : ์ฝ๋ฐฑ ํฌ์ ํผํ๋ ๋ฐฉ๋ฒ
1. Promise ์ฌ์ฉ
Promise๋ ์ฝ๋ฐฑ์ ๋์ฒดํ์ฌ ๋น๋๊ธฐ ์์ ์ ๋ ๋ช ํํ๊ฒ ํํํ ์ ์์ต๋๋ค.
fetchData(1)
.then((userId) => processData(userId))
.then((userId) => saveData(userId))
.then(() => console.log("All tasks completed!"))
.catch((error) => console.error(error));
2. async/await ์ฌ์ฉ
Promise์ ํจ๊ป ์ฌ์ฉ๋๋ async/await๋ ๋น๋๊ธฐ ์์ ์ ๋๊ธฐ ์ฝ๋์ฒ๋ผ ์ฝ๊ธฐ ์ฝ๊ฒ ๋ง๋ญ๋๋ค.
async function performTasks() {
const userId = await fetchData(1);
await processData(userId);
await saveData(userId);
console.log("All tasks completed!");
}
performTasks();
๐ ์ค๋ฌด์์ ์ฝ๋ฐฑ ๋ฆด๋ ์ด๊ฐ ์ฐ์ด๋ ์ฌ๋ก
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์
- ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์จ ๋ค, ์ฒ๋ฆฌํ๊ณ ์ ์ฅํ๋ ๋จ๊ณ๋ณ ์์
- ํ์ผ ์
๋ก๋
- ํ์ผ์ ์ ๋ก๋ํ ๋ค, ์์ถํ๊ณ ์ ์ฅ์์ ์ ์ฅํ๋ ์์
- API ์ฐ์ ํธ์ถ
- ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๊ณ , ํด๋น ์ ๋ณด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฅผ ์์ฒญ.
์ค๋ฌด ์์ : ์ฌ์ฉ์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ
function getUser(userId, callback) {
setTimeout(() => {
console.log(`User ${userId} fetched`);
callback({ userId, name: "Alice" });
}, 1000);
}
function getOrders(user, callback) {
setTimeout(() => {
console.log(`Orders for ${user.name} fetched`);
callback(["Order1", "Order2"]);
}, 1000);
}
function processOrders(orders, callback) {
setTimeout(() => {
console.log(`Orders processed: ${orders}`);
callback();
}, 1000);
}
getUser(1, (user) => {
getOrders(user, (orders) => {
processOrders(orders, () => {
console.log("All tasks completed!");
});
});
});
๐ฏ ์์ฝ
- ์ฝ๋ฐฑ์ ์ ์
- ์ฝ๋ฐฑ์ ํจ์์ ์ธ์๋ก ์ ๋ฌ๋์ด ๋์ค์ ํธ์ถ๋๋ ํจ์์ ๋๋ค.
- ๋ฒํท ๋ฆด๋ ์ด
- ์ฝ๋ฐฑ์ ์ฌ์ฉํด ์์ ์ ๋จ๊ณ๋ณ๋ก ์ฐ๊ฒฐํ๋ ํจํด์ ๋๋ค.
- ์ฝ๋ฐฑ ํฌ ํด๊ฒฐ์ฑ
- Promise์ async/await์ ํ์ฉํ์ธ์.
- ์ค๋ฌด ํ์ฉ
- ๋ฐ์ดํฐ ์ฒ๋ฆฌ, API ํธ์ถ, ํ์ผ ์์ ๋ฑ ๋น๋๊ธฐ ์์ ์์ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋ฉ๋๋ค.
๐ท ์ ์ค์ ๊ฐ๋ฐ์๊ฐ ๋์ด๋ด ์๋น! ๐ท