โ€œ์šฐ๋ฆฌ๊ฐ€ ์ „๋‹ฌํ•œ ํ•จ์ˆ˜๋ฅผ ๋‚˜์ค‘์— ๋ถˆ๋Ÿฌ์ค˜โ€

CallBack

โ€œ์šฐ๋ฆฌ๊ฐ€ ์ „๋‹ฌํ•œ ํ•จ์ˆ˜๋ฅผ ๋‚˜์ค‘์— ๋ถˆ๋Ÿฌ์ค˜โ€

1. ๋™๊ธฐ์™€ ๋น„๋™๊ธฐ

JavaScript is asynchronous. JS๋Š” ๋™๊ธฐ์ ์ด๋‹ค
ํ˜ธ์ด์ŠคํŒ… ๋œ ์ดํ›„๋ถ€ํ„ฐ ์ž‘์„ฑํ•œ ์ˆœ์„œ์— ๋งž์ถฐ ์ฝ”๋“œ๊ฐ€ ํ•˜๋‚˜์”ฉ ๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋œ๋‹ค
Execute the code block by order after hoisting.

โญ๏ธ hoisting์ด๋ž€?
var,function declaration์ด ์ œ์ผ ์œ„๋กœ ์˜ฌ๋ผ๊ฐ€๋Š” ๊ฒƒ
โญ๏ธโญ๏ธํ•จ์ˆ˜์˜ ์„ ์–ธ์€ ์ œ์ผ ์œ„๋กœ!!!!โญ๏ธโญ๏ธ
ํ˜ธ์ด์ŠคํŒ…์ด ๋œ ์ดํ›„๋ถ€ํ„ฐ, ์ฝ”๋“œ๊ฐ€ ๋‚˜ํƒ€๋‚˜๋Š” ๋Œ€๋กœ, ์ž๋™์ ์œผ๋กœ ์‹คํ–‰๋œ๋‹ค

asynchronous ๋น„๋™๊ธฐ์ ์œผ๋กœ ์–ธ์ œ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋ ์ง€ ์˜ˆ์ธกํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ

console.log(1);
setTimeout(() => console.log(2), 1000);
console.log(3);
// JS์—”์ง„์€ ์ฝ”๋“œ๋ฅผ ์œ„๋ถ€ํ„ฐ ์•„๋ž˜๋กœ ์‹คํ–‰ํ•œ๋‹ค.

function setTimeout(handler: TimerHandler, timeout?: number, ...arguments: any[]): number;
// TimeHandler๋ผ๋Š” callbackํ•จ์ˆ˜์™€, timeout์œผ๋กœ ์‹œ๊ฐ„์„ ์ง€์ •ํ•œ๋‹ค



1-1. Synchronous callback

: ์ฆ‰๊ฐ์ , ๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰

function printImmediately(print) {
  print();
}

// callbackํ•จ์ˆ˜๋ฅผ ๋ฐ›์•„์„œ callback์„ ๋ฐ”๋กœ ์‹คํ–‰ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค.
// callbackํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ, print๋กœ callbackํ•จ์ˆ˜๋ฅผ ๋ฐ›์„ ์ž๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด๋†“๋Š”๋‹ค.

printImmediately(() => console.log("hello"));
  • โญ๏ธ JS์—”์ง„์ด ์–ด๋–ป๊ฒŒ ์ดํ•ดํ–ˆ์„๊นŒ? hoisting!

1-2. Asynchronous callback

: ๋‚˜์ค‘์—,์–ธ์ œ๋ ์ง€ ์•Œ ์ˆ˜ ์—†๋Š” ๋น„๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰

function printWithDelay(print, timeout) {
  setTimeout(print, timeout);
}
printWithDelay(() => console.log("async callback"), 2000);
// ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๋™์ž‘ํ•˜๋Š” callback ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•ด์•ผํ•จ
  • โญ๏ธ JS์—”์ง„์ด ์–ด๋–ป๊ฒŒ ์ดํ•ดํ–ˆ์„๊นŒ? hoisting!

callback hell example

class UserStorage {
  loginUser(id, password, onSuccess, onError) {
    // callbackํ•จ์ˆ˜๋ฅผ ๋„ฃ๊ธฐ ์œ„ํ•œ ์ž๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด๋‘ .
    // parameter๋ฅผ ๊ทธ๋ƒฅ ๋ฐ›์„ ์ˆ˜๋„์žˆ๊ณ  callbackํ•จ์ˆ˜๋กœ ๋ฐ›์„ ์ˆ˜๋„ ์žˆ๋‹ค

    setTimeout(() => {
      if (
        (id === "ellie" && password === "dream") ||
        (id === "coder" && password === "academy")
      ) {
        onSuccess(id); ์ „๋‹ฌ๋ฐ›์€ onSuccess๋ฅผ ๋ถ€๋ฅด๊ณ  id๋ฅผ ์ „๋‹ฌํ•œ๋‹ค
      } else {
        onError(new Error("not found"));
      }
    }, 2000);
  }

  //์—ญํ•  ๋ฐ›์•„์˜ฌ ๋•Œ
  getRoles(user, onSuccess, onError) {
    setTimeout(() => {
      if (user === "ellie") {
        onSuccess({ name: "ellie", role: "admin" });
        ์ „๋‹ฌ๋ฐ›์€ onSuccess๋ฅผ ๋ถ€๋ฅด๊ณ  name๊ณผ role์„ ์ „๋‹ฌํ•œ๋‹ค
      } else {
        onError(new Error("not access"));
      }
    }, 1000);
  }
}



const userStorage = new UserStorage();
const id = prompt("enter your id");
const password = prompt("enter your password");
// ์‚ฌ์šฉ์ž์˜ id, password๋ฅผ ๋ฐ›์•„์˜ค๊ณ 
userStorage.loginUser(
  id,
  password,
  (user) => {
    userStorage.getRoles(
      user,
      (userWithRole) => {
        alert(`Hello, ${user.name}, you have a ${user.role} role`);
        // ๋กœ๊ทธ์ธํ–ˆ์„ ๋•Œ user๋Š” id๋งŒ ์žˆ์Œ.
        alert(
          `Hello, ${userWithRole.name}, you have a ${userWithRole.role} role`
        );
      },
        //์ด๊ฒŒ ์‹คํ–‰๋˜๋ ค๋ฉด, loginUser ์„ฑ๊ณต + getRoles ์„ฑ๊ณต
      (error) => {
        onsole.log("error");
      }
    );
  },
  //์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธ ์„ฑ๊ณตํ•˜๋ฉด, userStorage์—์„œ getRole๋กœ ์—ญํ• ์„ ๋ฐ›์•„์™€์•ผํ•จ
  (error) => console.log("error")
);
// ๋กœ๊ทธ์ธ์„ ํ•ด์•ผํ•จ. userStorage์˜ loginUser์— ๋ฐ›์•„์˜จ id์™€ password๋ฅผ ์ „๋‹ฌ


์ฝœ๋ฐฑ ํ•จ์ˆ˜ ์•ˆ์—์„œ ๋‹ค๋ฅธ๊ฒƒ์„ ํ˜ธ์ถœํ•˜๊ณ , ๊ทธ ์•ˆ์—์„œ ๋˜๋‹ค๋ฅธ ์ฝœ๋ฐฑ์„ ์ „๋‹ฌํ•˜๊ณ , ํ˜ธ์ถœํ•˜๊ณ  ์ „๋‹ฌ์ „๋‹ฌโ€ฆ.
=>์ฝœ๋ฐฑ ์ง€์˜ฅ!

์ด ์ฝœ๋ฐฑ์ง€์˜ฅ์˜ ์ˆœ์„œ!

  • ๋กœ๊ทธ์ธํ•œ ๋‹ค์Œ์—(loginUser)
  • ๊ทธ ๋กœ๊ทธ์ธํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ด์šฉํ•ด์„œ(userStorage)
  • ์‚ฌ์šฉ์ž์˜ ์—ญํ• ์„ ๋ฐ›์•„์˜ค๋Š”๊ตฌ๋‚˜(getRoles)

๋ฌธ์ œ์ !

  • ๊ฐ€๋…์„ฑ์ด ๋งค์šฐ ๋–จ์–ด์ง€๊ณ , ์œ„์™€๊ฐ™์€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ดํ•ดํ•˜๋Š” ๊ฒƒ๋„ ํž˜๋“ค๋‹ค
  • ์—๋Ÿฌ๋ฐœ์ƒ์‹œ, ์ฒด์ธ์ด ๊ธธ์ˆ˜๋ก ๋””๋ฒ„๊น…์ด ํž˜๋“ค๋‹ค

๋น„๋™๊ธฐ ํ•จ์ˆ˜๋ฅผ ์“ฐ๋ ค๋ฉด callback์ง€์˜ฅ์„ ๋งŒ๋“ค ์ˆ˜ ๋ฐ–์— ์—†๋Š”๋ฐ, ๊ทธ๋Ÿผ ๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์“ฐ๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด??
๋‹ค์ŒํŽธ,Promise์—์„œ!