Front-end/Javascript

[Javascript] callback์˜ bucket relay: ํ˜‘์—…์˜ ์˜ˆ์ˆ  ๐ŸŽจ

xeunnie 2024. 12. 30. 01:00
728x90
๋ฐ˜์‘ํ˜•

๐Ÿ“ฃ ์ฝœ๋ฐฑ์˜ ๋ฒ„ํ‚ท ๋ฆด๋ ˆ์ด์— ๋Œ€ํ•ด ํ†บ์•„๋ณด์ž !

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์“ฐ๋‹ค ๋ณด๋ฉด ํ•œ ๋ฒˆ์ฏค ๋“ค์–ด๋ดค์„ ๋‹จ์–ด, ๋ฐ”๋กœ ์ฝœ๋ฐฑ(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();

๐Ÿ“š ์‹ค๋ฌด์—์„œ ์ฝœ๋ฐฑ ๋ฆด๋ ˆ์ด๊ฐ€ ์“ฐ์ด๋Š” ์‚ฌ๋ก€

  1. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž‘์—…
    • ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜จ ๋’ค, ์ฒ˜๋ฆฌํ•˜๊ณ  ์ €์žฅํ•˜๋Š” ๋‹จ๊ณ„๋ณ„ ์ž‘์—…
  2. ํŒŒ์ผ ์—…๋กœ๋“œ
    • ํŒŒ์ผ์„ ์—…๋กœ๋“œํ•œ ๋’ค, ์••์ถ•ํ•˜๊ณ  ์ €์žฅ์†Œ์— ์ €์žฅํ•˜๋Š” ์ž‘์—…
  3. 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!");
    });
  });
});

๐ŸŽฏ ์š”์•ฝ

  1. ์ฝœ๋ฐฑ์˜ ์ •์˜
    • ์ฝœ๋ฐฑ์€ ํ•จ์ˆ˜์˜ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋˜์–ด ๋‚˜์ค‘์— ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
  2. ๋ฒ„ํ‚ท ๋ฆด๋ ˆ์ด
    • ์ฝœ๋ฐฑ์„ ์‚ฌ์šฉํ•ด ์ž‘์—…์„ ๋‹จ๊ณ„๋ณ„๋กœ ์—ฐ๊ฒฐํ•˜๋Š” ํŒจํ„ด์ž…๋‹ˆ๋‹ค.
  3. ์ฝœ๋ฐฑ ํ—ฌ ํ•ด๊ฒฐ์ฑ…
    • Promise์™€ async/await์„ ํ™œ์šฉํ•˜์„ธ์š”.
  4. ์‹ค๋ฌด ํ™œ์šฉ
    • ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ, API ํ˜ธ์ถœ, ํŒŒ์ผ ์ž‘์—… ๋“ฑ ๋น„๋™๊ธฐ ์ž‘์—…์—์„œ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

 

๐ŸŒท ์ „์„ค์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜์–ด๋ด…์‹œ๋‹น! ๐ŸŒท

728x90
๋ฐ˜์‘ํ˜•