# ๐Ÿค™๐Ÿผ ํ”„๋กœ๋ฏธ์Šค - ๋„ˆ์™€ ๋‚˜์˜ ์•ฝ์†

# ๐Ÿง‘๐Ÿผโ€๐Ÿš€ ํ”„๋กœ๋ฏธ์Šค๋ฅผ ์•Œ์•„์•ผ ํ•˜๋Š” ์ด์œ 

โ—์›น์„œ๋ฒ„์™€ ํ†ต์‹ ํ•˜๋Š” ๋กœ์ง์„ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๋ฉด โ—์ผ์ • ์‹œ๊ฐ„ ํ›„์— ๋™์ž‘ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๋ฉด โ—์„œ๋ฒ„์— ์š”์ฒญํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ด์šฉํ•ด์„œ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋” ๋‚˜์€ ๊ฒฝํ—˜์„ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๋ฉด โ—์›นํŽ˜์ด์ง€๋ฅผ ์›น์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๋ฉด

# ๐Ÿค™๐Ÿผ ํ”„๋กœ๋ฏธ์Šค

์•ž์„  ์ด์•ผ๊ธฐ์ธ ์„œ๋ฒ„์˜ ํ†ต์‹ ์„ ์œ„ํ•œ ๊ด€๊ณ„์™€ ์•ฝ์†์„ ์•Œ์•„๋ดค์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ํ”„๋ก ํŠธ์—”๋“œ์—์„œ ์ด ํ†ต์‹ ์„ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฃจ๋Š”์ง€๋ฅผ ์•Œ์•„์•ผ ํ•  ํ…๋ฐ์š”. ํ†ต์‹ ์ด๋ž€ ๊ฒƒ์€ ์‹คํ–‰ ์‹œ๊ฐ„์ด ์ •ํ™•ํžˆ ์–ผ๋งˆ๋‚˜ ๊ฑธ๋ฆด์ง€ ์•Œ ์ˆ˜ ์—†๋Š” ์ž‘์—…์ด๊ธฐ ๋•Œ๋ฌธ์—, ํ”„๋กœ๊ทธ๋ž˜๋จธ๋“ค์€ ํ”„๋กœ๋ฏธ์Šค๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

# ํ”„๋กœ๋ฏธ์Šค ๋„ˆ๋ž€ ๋…€์„

ํ”„๋กœ๋ฏธ์Šค๋ž€ MDN (opens new window) ๋ฌธ์„œ์—์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ์„ค๋ช…ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

promise

Promise๋Š” ํ”„๋กœ๋ฏธ์Šค๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ๊ผญ ์•Œ ์ˆ˜ ์žˆ์ง€๋Š” ์•Š์€ ๊ฐ’์„ ์œ„ํ•œ ๋Œ€๋ฆฌ์ž๋กœ, ๋น„๋™๊ธฐ ์—ฐ์‚ฐ์ด ์ข…๋ฃŒ๋œ ์ดํ›„์˜ ๊ฒฐ๊ณผ๊ฐ’์ด๋‚˜ ์‹คํŒจ ์ด์œ ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์ฒ˜๋ฆฌ๊ธฐ๋ฅผ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ๋ฏธ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋น„๋™๊ธฐ ๋ฉ”์„œ๋“œ์—์„œ ๋งˆ์น˜ ๋™๊ธฐ ๋ฉ”์„œ๋“œ์ฒ˜๋Ÿผ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ ์ตœ์ข… ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€๋Š” ์•Š๊ณ , ๋Œ€์‹  ํ”„๋กœ๋ฏธ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•ด์„œ ๋ฏธ๋ž˜์˜ ์–ด๋–ค ์‹œ์ ์— ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ ๋ฏธ๋ž˜์˜ ์–ด๋–ค ์‹œ์ ์— ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ณตํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ•œ๋งˆ๋””๋กœ ์ค„์—ฌ์„œ ์ด์•ผ๊ธฐํ•œ๋‹ค๋ฉด ํ”„๋กœ๋ฏธ์Šค๋Š”'๋ฏธ๋žซ๊ฐ’์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋ด…์‹œ๋‹ค. ์ปคํ”ผ์ง‘์— ๊ฐ€์„œ ๐Ÿ“๋”ธ๊ธฐ๋ผ๋–ผ๋ฅผ ์ฃผ๋ฌธ์„ ํ•˜๋ฉด, ์ง์›์€ ๐Ÿ›Ž๏ธ์ง„๋™๋ฒจ์„ ๋„˜๊ฒจ์ค๋‹ˆ๋‹ค. ์ด ์ง„๋™๋ฒจ์ด ๋ฐ”๋กœ ํ”„๋กœ๋ฏธ์Šค์ž…๋‹ˆ๋‹ค.

์ด ์ง„๋™๋ฒจ์€ ๋ฏธ๋ž˜์— ๋‚ด๊ฐ€ ์•„๋ฉ”๋ฆฌ์นด๋…ธ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋ผ๋Š” '์•ฝ์†' ์ž…๋‹ˆ๋‹ค. ์ด ์•ฝ์†์„ ๊ธฐ๋‹ค๋ฆฌ๋ฉด์„œ ์—ฌ๋Ÿฌ๋ถ„์€ ๋‹ค๋ฅธ ๊ฑธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์นœ๊ตฌ์™€ ์นดํ†ก์„ ํ•  ์ˆ˜๋„ ์žˆ๊ณ , ๊ฒŒ์ž„์„ ํ•  ์ˆ˜๋„ ์žˆ๊ณ  ๋˜๋Š” ์œ ํŠœ๋ธŒ๋ฅผ ๋ณด๊ณ  ์žˆ์„ ์ˆ˜๋„ ์žˆ๊ฒ ์ฃ . ๊ทธ๋ฆฌ๊ณ  ์ง„๋™๋ฒจ์ด ์šธ๋ฆฌ๋ฉด ์นด์šดํ„ฐ๋กœ ๊ฐ€์„œ ์ฃผ๋ฌธํ•œ ๋”ธ๊ธฐ๋ผ๋–ผ๋ฅผ ๋ฐ›์•„์™€ ๋ง›์žˆ๊ฒŒ ๐Ÿ“๋”ธ๊ธฐ๋ผ๋—ด๋ฅผ ์ฆ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์ด๋Ÿฐ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง„๋™๋ฒจ์ด ์šธ๋ ค์„œ ์นด์šดํ„ฐ์— ๊ฐ”๋”๋‹ˆ "์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค, ์†๋‹˜. ์˜ค๋Š˜ ๋”ธ๊ธฐ ์žฌ๊ณ ๊ฐ€ ๋‹ค ๋–จ์–ด์ ธ์„œ ๋”ธ๊ธฐ๋ผ๋–ผ ์ฃผ๋ฌธ์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค ๐Ÿ˜ญ" ๋ผ๊ณ  ํ•˜๋Š”๊ฒ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋‹ค๋ฅธ ๋ฉ”๋‰ด๋ฅผ ๊ณ ๋ฏผํ•˜๊ณ  ์š”์ฒญํ•˜๋˜๊ฐ€ ํฌ๊ธฐํ•ด์•ผ๋งŒ ํ•˜์ฃ .

์ด์ฒ˜๋Ÿผ ๋ฏธ๋žซ๊ฐ’์ธ ๐Ÿ›Ž๏ธํ”„๋กœ๋ฏธ์Šค๋Š” ์„ฑ๊ณตํ•  ์ˆ˜๋„, ์‹คํŒจํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฐ ๋ฏธ๋žซ๊ฐ’์„ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•œ ํ”„๋กœ๋ฏธ์Šค๊ฐ€ ๋“ฑ์žฅํ•˜๊ธฐ ์ „์— ์‚ฌ์šฉํ•˜๋˜ ๋ฐฉ๋ฒ•์€ ์ฝœ๋ฐฑ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

callback1(function(value1) {
  callback2(value1, function(value2) {
    callback3(value2, function(value3) {
      callback4(value3, function(value4) {
        callback5(value4, function(value5) {
            // value5๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฒ˜๋ฆฌ
        });
      });
    });
  });
});

์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๊ธฐ์— ๊ฐ„ํŽธํ•˜๊ณ , ์˜ค๋žœ ์‹œ๊ฐ„ ๋™์•ˆ ํ‘œ์ค€์ ์ธ ๋ฐฉ๋ฒ•์ด์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์„œ๋น„์Šค์˜ ๋กœ์ง์ด ๋ณต์žกํ•ด์ง€๊ณ  ์—ฌ๋Ÿฌ ๋น„๋™๊ธฐ ๋™์ž‘๋“ค์ด ํ•„์š”ํ•œ ์‹œ์ ๋ถ€ํ„ฐ ๋น„๋™๊ธฐ ํ•จ์ˆ˜์—์„œ ๋‹ค๋ฅธ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ๊ฑฐ๊ธฐ์„œ ๋˜ ๋‹ค๋ฅธ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋“ฑ์˜ ์ค‘์ฒฉ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ๋ฅผ ํ”ํžˆ '์ฝœ๋ฐฑ ์ง€์˜ฅ' ์— ๋น ์กŒ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ์ฝœ๋ฐฑ์˜ ์—ฐ๊ฒฐ์€ ์—๋Ÿฌ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋Š” ๊ฒฝ์šฐ์—์„œ๋„ ์ƒ๋‹นํžˆ ๊ณค๋ž€ํ•œ ์ƒํ™ฉ์„ ๋งŒ๋“ค์–ด๋ƒ…๋‹ˆ๋‹ค.

try {
  setTimeout(() => { throw new Error('Error!'); }, 1000);
} catch (e) {
  console.log('์—๋Ÿฌ๋ฅผ ์บ์น˜ํ•˜์ง€ ๋ชปํ•œ๋‹ค..');
  console.log(e);
}

try ๋ธ”๋ก ๋‚ด์—์„œ setTimeout ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋ฉด 1์ดˆ ํ›„์— ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๊ณ  ์ด ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ์˜ˆ์™ธ๋Š” catch ๋ธ”๋ก์—์„œ catch๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ try catch ๋ฌธ์„ ๋น ์ ธ๋‚˜์˜จ ๋‹ค์Œ์— setTimeout ํ•จ์ˆ˜๊ฐ€ 1์ดˆ ๋’ค์— ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ฒŒ๋‹ค๊ฐ€ ๋ณดํ†ต ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋“ค์€ ๋‘ ๊ฐœ์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌ๋ฐ›์Šต๋‹ˆ๋‹ค. ์š”์ฒญ์ด ์„ฑ๊ณตํ•œ ๊ฒฝ์šฐ์— ์‹คํ–‰ํ•  ์ฝœ๋ฐฑ ํ•จ์ˆ˜์™€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์‹คํ–‰ํ•  ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ๋ณต์žก์„ฑ์ด 2๋ฐฐ ์ด์ƒ ์ฆ๊ฐ€ํ•˜์ฃ .

# ๐Ÿค™๐Ÿผ ๊ทธ๋ž˜์„œ ๋“ฑ์žฅํ•œ ํ”„๋กœ๋ฏธ์Šค

ํ•˜์ง€๋งŒ ํ”„๋กœ๋ฏธ์Šค๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ๋ฌธ์ œ๋ฅผ ๊ฐ„ํŽธํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ๋ฏธ์Šค๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋ฐ›๋Š” ๋Œ€์‹ ์—, ์„ฑ๊ณต๊ณผ ์‹คํŒจ์— ๋Œ€์‘ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ค‘์ฒฉํ•˜์ง€ ์•Š๊ณ , ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋น„๋™๊ธฐ ๋™์ž‘์„ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ๋ฏธ์Šค๋Š” ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ „๋‹ฌ๋ฐ›์•„์„œ ์‘๋‹ต์— ๋”ฐ๋ผ ๋‘ ๊ฐ€์ง€ ๋ฉ”์„œ๋“œ ์ค‘ ํ•˜๋‚˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. ํ”„๋ผ๋ฏธ์Šค๋Š” ๋น„๋™๊ธฐ ์ž‘์—…์ด ์„ฑ๊ณตํ•˜๊ฑฐ๋‚˜ ์ถฉ์กฑ๋œ ๊ฒฝ์šฐ then() ๋ฉ”์„œ๋“œ์— ๊ฒฐ๊ณผ๋ฅผ ๋„˜๊ฒจ์ค๋‹ˆ๋‹ค. ๋น„๋™๊ธฐ ์ž‘์—…์— ์‹คํŒจํ•˜๊ฑฐ๋‚˜ ๊ฑฐ๋ถ€๋˜๋Š” ๊ฒฝ์šฐ์—๋Š” catch() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. then()๊ณผ catch() ๋ฉ”์„œ๋“œ์—๋Š” ๋ชจ๋‘ ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ๋‘ ๋ฉ”์„œ๋“œ์— ์ „๋‹ฌ๋˜๋Š” ํ•จ์ˆ˜์—๋Š” ๋น„๋™๊ธฐ ์ž‘์—…์˜ ๊ฒฐ๊ณผ์ธ ์‘๋‹ต๋งŒ์ด ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ๋ฏธ์Šค๋Š” ๋‘ ๊ฐœ์˜ ์ธ์ž, resolve() ์™€ reject() ๋ฅผ ์ „๋‹ฌ๋ฐ›์Šต๋‹ˆ๋‹ค. resolve()๋Š” ์ฝ”๋“œ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ–ˆ์„ ๋•Œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. resolve()๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด then() ๋ฉ”์„œ๋“œ์— ์ „๋‹ฌ๋œ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ํ”„๋กœ๋ฏธ์Šค๋ฅผ ์„ค์ •ํ•  ๋•Œ then()๊ณผ catch() ๋ฉ”์„œ๋“œ๋ฅผ ๋ชจ๋‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. then() ๋ฉ”์„œ๋“œ๋Š” ์„ฑ๊ณตํ•œ ๊ฒฝ์šฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ , catch() ๋ฉ”์„œ๋“œ๋Š” ๊ฑฐ์ ˆ๋œ ๊ฒฝ์šฐ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

new Promise(function(resolve, reject) {
  // ...
}).then(resolve()).catch(reject())

image.png

then()์„ ์—ฐ์†์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฉด, ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ค‘์ฒฉ๋œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์— ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋Œ€์‹  ์—ฌ๋Ÿฌ ๊ฐœ์˜ then() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์•„๋ž˜๋กœ ๋‚ด๋ ค์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ”„๋กœ๋ฏธ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ, ์•”๋ฌต์ ์ธ ๋ฐ˜ํ™˜์„ ์ด์šฉํ•˜๋Š” ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋กœ ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ํ•œ ์ค„๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

getUserPreferences()
.then(preference => getMusic(preferenc.theme))
.then(music => { console.log(music.album) })

์—ฌ๊ธฐ์„œ ํ”„๋กœ๋ฏธ์Šค๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” catch() ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐœ๋ณ„์ ์œผ๋กœ ์—ฐ๊ฒฐํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. catch() ๋ฉ”์„œ๋“œ๋ฅผ ํ•˜๋‚˜๋งŒ ์ •์˜ํ•ด์„œ ํ”„๋กœ๋ฏธ์Šค๊ฐ€ ๊ฑฐ์ ˆ๋˜๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ๋ฅผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ํ”„๋กœ๋ฏธ์Šค๊ฐ€ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ์ƒํ™ฉ ์ค‘ ํ•˜๋‚˜๋Š” ๋ฐ”๋กœ API์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์ด ํ”„๋กœ๋ฏธ์Šค๋ฅผ ํ™œ์šฉํ•ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” fetch์— ๋Œ€ํ•ด ์•Œ์•„๋ด…์‹œ๋‹ค.

# ๋Œ€ํ™”ํ•˜๊ณ  ์‹ถ์€ fetch

๊ทœ๋ชจ๊ฐ€ ์žˆ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์•ฑ์„ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ํ•„์—ฐ์ ์œผ๋กœ API๋ฅผ ๋‹ค๋ฃจ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. API๋ฅผ ์ด์šฉํ•˜๋ฉด ํŽ˜์ด์ง€๊ฐ€ ์•„๋‹Œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์–ด์„œ, ํ™”๋ฉด์„ ์ƒˆ๋กœ ๊ณ ์นจ ํ•˜์ง€ ์•Š์•„๋„ ์š”์†Œ๋ฅผ ๊ฐฑ์‹ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰ ๋ฌธ์„œ๋ฅผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด์ฃ .

์ตœ๊ทผ ํ”„๋ก ํŠธ์—”๋“œ์˜ ํŠธ๋ Œ๋“œ ์ค‘ ํ•˜๋‚˜์ธ ๋‹จ์ผ ํŽ˜์ด์ง€ ์›น์•ฑ(Single Page Application)์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ธ๊ธฐ๋ฅผ ๋„๋Š” ์ด์œ  ์ค‘ ํ•˜๋‚˜์ด์ง€๋งŒ, Ajax๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์ž‘์—…์€ ์˜ค๋žœ ์‹œ๊ฐ„ ๋™์•ˆ ๊ฝค ๋ฒˆ๊ฑฐ๋กœ์šด ๋ฐฉ๋ฒ•์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์˜ค๋žœ์‹œ๊ฐ„ ๊ฐœ๋ฐœ์ž๋“ค์€ ๋ณต์žก๋„๋ฅผ ๋‚ฎ์ถ˜ jQuery์™€ ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ์š”. ๊ฐœ๋ฐœ์ž๋“ค์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์ด๋‹ค ๋ณด๋‹ˆ, ๊ธฐ์กด์˜ ๋ณต์žก๋„๋ฅผ ๋‚ฎ์ถ˜fetch๋ผ๋Š” ๋„๊ตฌ๋ฅผ ๋งŒ๋“ค์–ด๋ƒˆ์Šต๋‹ˆ๋‹ค.

# fetchํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด

fetch()๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด API ๋์ (์—”๋“œ ํฌ์ธํŠธ)์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด ์—”๋“œํฌ์ธํŠธ๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•ด jsonplaceholder (opens new window)๋ผ๋Š” ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•  ๊ฒ๋‹ˆ๋‹ค. ์ด ์„œ๋น„์Šค๋Š” ๊ฐ€์ƒ์˜ ๋ธ”๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋จผ์ € ์š”์ฒญํ•  ๋‚ด์šฉ์€ ๊ฐ„๋‹จํ•œ GET ์š”์ฒญ์ž…๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” fetch() ํ˜ธ์ถœ์€ ๊ฐ„๋‹จํ•œ๋ฐ์š”. ์•„๋ž˜์™€ ๊ฐ™์ด ๋์  url์„ ์ธ์ž๋กœ ํ•ด์„œ fetch()๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

fetch('https://jsonplaceholder.typicode.com/posts/1')

์œ„ ์š”์ฒญ์„ ํ•˜๋ฉด ์‘๋‹ต ๋ณธ๋ฌธ์€ ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

{
  "userId": 1,
  "id": 1,
  "title": "sunt aut facere repellat provid...",
  "body": "quia et suscipit\nsuscipit rec..."
}

๐Ÿ‘จ๐Ÿผโ€๐ŸŽจ ์ฐธ ์‰ฝ์ฃ ?

์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ๋‚˜๋ฉด fetch()๋Š” ์‘๋‹ต์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํ”„๋กœ๋ฏธ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด์–ด์„œ ํ•ด์•ผ ํ•  ์ž‘์—…์€ then() ๋ฉ”์„œ๋“œ์— ์‘๋‹ต์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‚ฌ์‹ค ์šฐ๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๊ฒƒ์€ ์‘๋‹ต ๋ณธ๋ฌธ์ธ ๊ฒฝ์šฐ๊ฐ€ ๋Œ€๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€๋งŒ ์‘๋‹ต ๊ฐ์ฒด๋Š” ๋ณธ๋ฌธ ์™ธ์—๋„ ์ƒํƒœ ์ฝ”๋“œ, ํ—ค๋” ๋“ฑ ๋‹ค์–‘ํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ํ˜•ํƒœ๊ฐ€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ค๋ฃจ๋Š” JSON ํ˜•ํƒœ๊ฐ€ ์•„๋‹ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ json()์ด๋ผ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด ์‘๋‹ต๊ฐ์ฒด๋ฅผ JSON์œผ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋•Œ ์ฃผ์˜ํ•  ์ ์€ json()๋ฉ”์„œ๋“œ๋„ ํ”„๋กœ๋ฏธ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— then() ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ถ”๊ฐ€ํ•œ then() ๋ฉ”์„œ๋“œ์—์„œ ์ฝœ๋ฐฑ์—์„œ ํŒŒ์‹ฑ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ ์ค‘ ์ œ๋ชฉ๋งŒ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์— ์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

fetch('https://jsonplaceholder.typicode.com/posts/1')
.then(data => {
  return data.json
})
.then(post => {
  console.log(post.title)
})

๊ทธ๋Ÿฐ๋ฐ ํ•œ ๊ฐ€์ง€ ์•ˆํƒ€๊นŒ์šด ์‚ฌ์‹ค์ด ์žˆ์Šต๋‹ˆ๋‹ค๐Ÿ˜ญ. fetch() ํ”„๋กœ๋ฏธ์Šค๋Š” ์ƒํƒœ ์ฝ”๋“œ๊ฐ€ 40x ์—๋Ÿฌ๋กœ ์ธํ•ด ์š”์ฒญ์— ์‹คํŒจํ•œ ๊ฒฝ์šฐ์—๋„ ์‘๋‹ต ๋ณธ๋ฌธ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰ ์š”์ฒญ์ด ์‹คํŒจํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ catch ๋ฉ”์„œ๋“œ๋งŒ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ธ๋ฐ์š”. ์‘๋‹ต์—๋Š” ์‘๋‹ต ์ฝ”๋“œ๊ฐ€ 200์—์„œ 299 ์‚ฌ์ด์ธ ๊ฒฝ์šฐ true๋กœ ์„ค์ •๋˜๋Š” ok๋ผ๋Š” ํ•„๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ•„๋“œ๋ฅผ ์ด์šฉํ•ด์„œ ์‘๋‹ต์„ ํ™•์ธํ•˜๊ณ , ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

fetch('https://jsonplaceholder.typicode.com/posts/1')
.then(data => {
  if (!data.ok) {
    throw new Error(data.status)
  }
  return data.json()
})
.then(post => {
  console.log(post.title)
})
.catch(error => {
  console.log(error)
})

์ด์ œ ์ƒˆ๋กœ์šด ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์„ ์ถ”๊ฐ€ํ•˜๋Š” API๋ฅผ ํ™œ์šฉํ•ด๋ณผ๊นŒ์š”? POST ์š”์ฒญ์€ GET ์š”์ฒญ๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ, ๋‘ ๋ฒˆ์งธ ์ธ์ž๋กœ ์กฐ๊ฑด์„ ๋‹ด์€ ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋จผ์ €, POST ์š”์ฒญ์„ ๋ณด๋‚ด๊ธฐ ๋•Œ๋ฌธ์— POST ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ์„ ์–ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ƒˆ๋กœ์šด ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์„ ์ƒ์„ฑํ•˜๋Š” JSON ๋ฐ์ดํ„ฐ๋ฅผ ๋„˜๊ฒจ์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  JSON ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๊ธฐ ๋•Œ๋ฌธ์— ํ—ค๋”์˜ Content-Type์„ application/json์œผ๋กœ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ JSON ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์€ ๋ฌธ์ž์—ด๋กœ ์š”์ฒญ ๋ณธ๋ฌธ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

const newPost = {
  title: 'jun',
  body: 'jun is cool boy',
  userId: '1'
}

const option = {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json'
  },
  body: JSON.stringify(newPost)
}

fetch('https://jsonplaceholder.typicode.com/posts/1', option)
.then(data => {
  if (!data.ok) {
    throw new Error(data.status)
  }
  return data.json()
})
.then(post => {
  console.log(post.title)
})
.catch(error => {
  console.log(error)
})

# Async Await

์ด๋Ÿฐ ํ”„๋กœ๋ฏธ์Šค๋Š” async/await์„ ์ด์šฉํ•ด์„œ ๋”์šฑ ํŽธํ•˜๊ฒŒ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๊ฒŒ ๋ฐœ์ „ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ๋ฏธ์Šค๋Š” ์ฝœ๋ฐฑ๊ณผ ๋น„๊ตํ•˜๋ฉด ์—„์ฒญ๋‚œ ๋ฐœ์ „์ด์ง€๋งŒ, ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์—ฌ์ „ํžˆ ๋‹ค์†Œ ํˆฌ๋ฐ•ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ”„๋กœ๋ฏธ์Šค๋ฅผ ์‚ฌ์šฉํ•ด๋„ ์—ฌ์ „ํžˆ ๋ฉ”์„œ๋“œ์—์„œ ์ฝœ๋ฐฑ์„ ๋‹ค๋ค„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹คํ–‰ํžˆ ์–ธ์–ด๋Š” ๊ณ„์† ๋ฐœ์ „ํ•ฉ๋‹ˆ๋‹ค.

async ํ‚ค์›Œ๋“œ๋ฅผ ์ด์šฉํ•ด์„œ ์„ ์–ธํ•œ ํ•จ์ˆ˜๋Š” ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋น„๋™๊ธฐ ํ•จ์ˆ˜์˜ ๋‚ด๋ถ€์—์„œ await ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ’์ด ๋ฐ˜ํ™˜๋  ๋•Œ๊นŒ์ง€ ํ•จ์ˆ˜์˜ ์‹คํ–‰์„ ์ค‘์ง€์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

async function getUser() {
  cosnst eastjun = await getTargetUser();
  return eastjun;
}

๋น„๋™๊ธฐ ํ•จ์ˆ˜์˜ ์žฌ๋ฐŒ๋Š” ์ ์€ ํ”„๋กœ๋ฏธ์Šค๋กœ ๋ณ€ํ™˜๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰ getUser()์„ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ then() ๋ฉ”์„œ๋“œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ญ”๊ฐ€ ํฌ๊ฒŒ ๋‹ฌ๋ผ์ง„ ๊ฒƒ ๊ฐ™์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋Š”๋ฐ, async ํ•จ์ˆ˜๊ฐ€ ๋น›๋‚˜๋Š” ๋•Œ๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ”„๋กœ๋ฏธ์Šค๋ฅผ ๋‹ค๋ฃฐ ๋•Œ์ž…๋‹ˆ๋‹ค.

async function getArtistPreference() {
  const theme = await getUSerPreferences()
  const album = await getMusic(theme)
  const artist = await getArtist(album)
  return artist
}

getArtistPreference()
.then(artist => console.log(artist))
.catch(error => console.error(error))

# ๐Ÿ“˜ ์ •๋ฆฌ

โœ… ํ”„๋กœ๋ฏธ์Šค๋Š” ์–ด๋–ค ์‹œ์ ์— ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ฏธ๋žซ๊ฐ’์ด๋‹ค. โœ… ํ”„๋กœ๋ฏธ์Šค๋Š” ์„ฑ๊ณต๊ณผ ์‹คํŒจ์— ๋Œ€์‘ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•˜๊ณ , ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ „๋‹ฌ๋ฐ›์•„์„œ ์‘๋‹ต์— ๋”ฐ๋ผ ๋‘ ๊ฐ€์ง€ ๋ฉ”์„œ๋“œ ์ค‘ ํ•˜๋‚˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. โœ… ํ”„๋กœ๋ฏธ์Šค๋Š” ๋‘ ๊ฐœ์˜ ์ธ์ž resolve()์™€ reject()๋ฅผ ์ „๋‹ฌ๋ฐ›๋Š”๋‹ค. โœ… fetch๋Š” ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์„ ํฌํ•จํ•œ ๋ฆฌ์†Œ์Šค ์ตœ๋“์„ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์ •์˜๋œ API์ด๋‹ค. โœ… fetch()๋ฅผ ๋ถˆ๋Ÿฌ๋“ค์ด๋Š” ๊ฒฝ์šฐ ์—”๋“œํฌ์ธํŠธ๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค. โœ… fetch()๋Š” Promise๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค. โœ… async/awiat์„ ์ด์šฉํ•˜๋ฉด ํ”„๋กœ๋ฏธ์Šค๋ฅผ ํ›จ์”ฌ ๊น”๋”ํ•˜๊ฒŒ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋‹ค.

# ๐Ÿ”— ์ฐธ๊ณ  ๋งํฌ