์ฝœ๋ฐฑ(Callback)

๐Ÿ“„ ์ฝœ๋ฐฑ

์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ๋‹ค๋ฅธ ์ฝ”๋“œ๋ฅผ ์ธ์ž๋กœ ๋„˜๊ฒจ์ฃผ๋Š” ํ•จ์ˆ˜์ด๋‹ค.
๋‹ค๋ฅธ ์ฝ”๋“œ(ํ•จ์ˆ˜ ๋˜๋Š” ๋ฉ”์„œ๋“œ)์—๊ฒŒ ์ธ์ž๋กœ ๋„˜๊ฒจ์คŒ์œผ๋กœ์จ ๊ทธ ์ œ์–ด๊ถŒ๋„ ํ•จ๊ป˜ ์œ„์ž„ํ•œ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ํ˜ธ์ŠคํŠธ ํ™˜๊ฒฝ์ด ์ œ๊ณตํ•˜๋Š” ์—ฌ๋Ÿฌ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋น„๋™๊ธฐ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ“„ ์ฝœ๋ฐฑ์€ ์–ด๋–ค ๊ฒฝ์šฐ์— ์‚ฌ์šฉ๋ ๊นŒ?

function loadScript(src) {
  // <script> ํƒœ๊ทธ๋ฅผ ๋งŒ๋“ค๊ณ  ํŽ˜์ด์ง€์— ํƒœ๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  // ํƒœ๊ทธ๊ฐ€ ํŽ˜์ด์ง€์— ์ถ”๊ฐ€๋˜๋ฉด src์— ์žˆ๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋กœ๋”ฉํ•˜๊ณ  ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  let script = document.createElement("script");
  script.src = src;
  document.head.append(script);
}

loadScript("/my/script.js"); // script.js์—” "function newFunction() {โ€ฆ}"์ด ์žˆ์Šต๋‹ˆ๋‹ค.

newFunction(); // ํ•จ์ˆ˜๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค!

new Function()์—์„œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ด์œ ๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ฝ์–ด์˜ฌ ์ˆ˜ ์žˆ๋Š” ์‹œ๊ฐ„์„ ์ถฉ๋ถ„ํžˆ ํ™•๋ณดํ•˜์ง€ ๋ชปํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

function loadScript(src, callback) {
  let script = document.createElement('script');
  script.src = src;

  script.onload = () => callback(script);

  document.head.append(script);
}

loadScript('/my/script.js', function() {
  // ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ์Šคํฌ๋ฆฝํŠธ ๋กœ๋“œ๊ฐ€ ๋๋‚˜๋ฉด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
  newFunction(); // ์ด์ œ ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ์ œ๋Œ€๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  ...
});

loadScript์˜ ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜์— ์Šคํฌ๋ฆฝํŠธ ๋กœ๋”ฉ์ด ๋๋‚œ ํ›„ ์‹คํ–‰๋  ํ•จ์ˆ˜์ธ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค.
๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋˜ ํ•จ์ˆ˜๋Š” ์›ํ•˜๋Š” ๋™์ž‘์ด ์™„๋ฃŒ๋˜์—ˆ์„ ๋–„ ์‹คํ–‰๋œ๋‹ค.

์ด๊ฒƒ์„ ์ฝœ๋ฐฑ ๊ธฐ๋ฐ˜ ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.
๋น„๋™๊ธฐ์ ์œผ๋กœ ์ˆ˜ํ–‰๋˜์–ด์•ผํ•  ํ•„์š”์„ฑ์„ ๊ฐ€์ง„ ์ฝ”๋“œ์— ์ฝœ๋ฐฑ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ“„ ์˜ค๋ฅ˜ ์šฐ์„  ์ฝœ๋ฐฑ

์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ ์—๋Ÿฌ๋ฅผ ํ•ธ๋“ค๋งํ•  ์ˆ˜ ์žˆ๋‹ค.

function loadScript(src, callback) {
  let script = document.createElement("script");
  script.src = src;

  script.onload = () => callback(null, script);
  script.onerror = () =>
    callback(new Error(`${src}๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋„์ค‘์— ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.`));

  document.head.append(script);
}

loadScript("/my/script.js", function (error, script) {
  if (error) {
    // ์—๋Ÿฌ ์ฒ˜๋ฆฌ
  } else {
    // ์Šคํฌ๋ฆฝํŠธ ๋กœ๋”ฉ์ด ์„ฑ๊ณต์ ์œผ๋กœ ๋๋‚จ
  }
});

์˜ค๋ฅ˜ ์šฐ์„  ์ฝœ๋ฐฑ์˜ ๊ด€๋ก€

  1. callback์˜ ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜๋Š” ์—๋Ÿฌ๋ฅผ ์œ„ํ•ด ๋‚จ๊ฒจ๋‘”๋‹ค. ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ด ์ธ์ˆ˜๋ฅผ ์ด์šฉํ•ด callback(err)์ด ํ˜ธ์ถœ๋œ๋‹ค.
  2. ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜๋Š” ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์•˜์„ ๋•Œ๋ฅผ ์œ„ํ•ด ๋‚จ๊ฒจ๋‘”๋‹ค. ์›ํ•˜๋Š” ๋™์ž‘์ด ์„ฑ๊ณตํ•œ ๊ฒฝ์šฐ์—” callback(null, result1, result2)๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค.

์˜ค๋ฅ˜ ์šฐ์„  ์ฝœ๋ฐฑ์˜ ์žฅ์ 

์˜ค๋ฅ˜ ์šฐ์„  ์ฝœ๋ฐฑ์„ ์‚ฌ์šฉํ•˜๋ฉด, ๋‹จ์ผ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์—์„œ ์—๋Ÿฌ ์ผ€์ด์Šค์™€ ์„ฑ๊ณต ์ผ€์ด์Šค ๋ชจ๋‘๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

์ถœ์ฒ˜

Leave a comment