JustDoEat

[JavaScripts] Promise๊ฐ์ฒด์˜ ๋™์ž‘๋ฐฉ์‹ ๋ณธ๋ฌธ

์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ

[JavaScripts] Promise๊ฐ์ฒด์˜ ๋™์ž‘๋ฐฉ์‹

kingmusung 2024. 7. 6. 19:00

๐Ÿ’ก Synchronous VS Asynchronous

  • Synchronous: ๋™๊ธฐ์ ์œผ๋กœ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š” ํ”„๋กœ๊ทธ๋žจ
  • Asynchronous: ๋น„๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š” ํ”„๋กœ๊ทธ๋žจ
btn.addEventListener('click', () => {});

์ด๋ฏธ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ๋“ฑ๋กํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๊ณผ์ •์—์„œ, ๋น„๋™๊ธฐ์ ์ธ ์‹คํ–‰์ด ๋˜๊ณ  ์žˆ๋˜ ๊ฒƒ์ด๋‹ค.

 

๐Ÿ“Œ Promise

 

๐Ÿ• ์„ฑํ›ˆ์ด๊ฐ€ ํ”ผ์ž์ง‘์— ๊ฐ€์„œ ํ”ผ์ž๋ฅผ ์ฃผ๋ฌธ์„ ํ–ˆ๊ณ , ์š”๋ฆฌ์‚ฌ๊ฐ€ ์ง„๋™๋ฒจ๋กœ ์•Œ๋ ค์ค€๋‹ค๊ณ  ์ง„๋™๋ฒจ์„ ์ฃผ์—ˆ๋‹ค.

์š”๋ฆฌ์‚ฌ๋Š” ์„ฑํ›ˆ์ด์˜ ์ฃผ๋ฌธ ํฌํ•จ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ฃผ๋ฌธ์ด ๋ฐ€๋ ค์žˆ์„ ๊ฒƒ์ด๋‹ค.

  • ์ง„๋™๋ฒจ์ด ํŒŒ๋ž€์ƒ‰์ด๋ฉด ์Œ์‹์ด ์ •์ƒ์ ์œผ๋กœ ๋‚˜์˜จ ๊ฒƒ์ด๊ณ ,
  • ์ง„๋™๋ฒจ์ด ๋นจ๊ฐ„์ƒ‰์ด๋ฉด ์Œ์‹ ์กฐ๋ฆฌ์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด ๊ฒƒ์ด๋‹ค.

 

  1. ์„ฑํ›ˆ์ด(Consumer),
  2. ์š”๋ฆฌ์‚ฌ(producer),
  3. ์ฃผ๋ฌธ(producing code)
  4. ์ง„๋™๋ฒจ(promise)
  5. ํŒŒ๋ž€์ƒ‰(resolve→value) : value=ํ”ผ์ž, ์ฆ‰ ๊ฒฐ๊ด๊ฐ’
  6. ๋นจ๊ฐ„์ƒ‰(reject→error) : ์—๋Ÿฌ๋ฐœ์ƒ
  7. ๋นจ๊ฐ„์ƒ‰์— ๋Œ€ํ•œ ํ›„์†์กฐ์น˜(consuming code) : ๋‹ค๋ฅธ ๋ฉ”๋‰ด๋ฅผ ์‹œํ‚ฌ ๊ฒƒ์ธ์ง€ ๋“ฑ์˜ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค.
  8. ๋นจ๊ฐ„์ƒ‰, ํŒŒ๋ž€์ƒ‰(State) : ์ƒํƒœ๋ฅผ ์ด์•ผ๊ธฐํ•œ๋‹ค.

 

๐Ÿ“Œ promise๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” promise ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์ค€๋‹ค, ๊ฐ์ฒด ์•ˆ์— ์žˆ๋Š” ํ•จ์ˆ˜๋Š” “์‹คํ–‰ํ•จ์ˆ˜”๋กœ์จ ๊ฐ์ฒด๊ฐ€ ์‹คํ–‰๋  ๋•Œ ๊ฐ™์ด ์‹คํ–‰๋œ๋‹ค.

์ฆ‰, promise ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฑด ์„ฑํ›ˆ์ด๊ฐ€ ์ฃผ๋ฌธ์„ ํ•˜๊ณ  ์š”๋ฆฌ์‚ฌ๊ฐ€ ์š”๋ฆฌ๋ฅผ “๋ฐ”๋กœ”์‹œ์ž‘ํ•˜๋Š” ์ƒํ™ฉ

 

โญ ์œ„ ๊ทธ๋ฆผ์„ ๋ณด์ž,

 

promise ๊ฐ์ฒด๋Š” state, result๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ ,

 

resolve๋Š” state, result,

 

reject๋„ state, result๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

 

๋งŒ์•ฝ ์ž‘์—…์ด ์„ฑ๊ณต์ ์œผ๋กœ ์‹คํ–‰์ด ๋˜์—ˆ๋‹ค๋ฉด, promise๊ฐ์ฒด์˜ state๋Š” fulfilled, result๋Š” value๋กœ ๋ฐ”๋€” ๊ฒƒ์ด๊ณ .

 

์‹คํŒจ๋ฅผ ํ–ˆ๋‹ค๋ฉด, state๋Š” rejected, result๋Š” error๋กœ ๋ฐ”๋€” ๊ฒƒ์ด๋‹ค.

 

let promise = new Promise((resolve, reject) => {
    let success = true; // ์˜ˆ์‹œ๋กœ ์„ฑ๊ณต ์กฐ๊ฑด์„ true๋กœ ์„ค์ •
    if (success) {
        resolve('์ž‘์—… ์„ฑ๊ณต!');
    } else {
        reject('์ž‘์—… ์‹คํŒจ ใ… ใ… ');
    }
});

promise
    .then(result => {
        console.log(result); // '์ž‘์—…์ด ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค' ์ถœ๋ ฅ
    })
    .catch(error => {
        console.log(error); // '์ž‘์—…์ด ์‹คํŒจํ•˜์˜€์Šต๋‹ˆ๋‹ค' ์ถœ๋ ฅ
    });

 

โญ ์ด์ œ ์œ„ ์ฝ”๋“œ๋ฅผ ๋ณด์ž, ์ž‘์—…์ด ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๊ฐ€ ๋˜์—ˆ๋‹ค๋ฉด

 

sucess๋ฅผ true๋กœ ์„ค์ •์„ ํ•ด์„œ ๋ฌด์กฐ๊ฑด resolve('์ž‘์—…์„ฑ๊ณต!') ์ด ๋ถ€๋ถ„์ด ํ•„์—ฐ์ ์œผ๋กœ ์‹คํ–‰์ด ๋  ๊ฒƒ์ด๊ณ . resolve ๋‚ด๋ถ€์˜ value๋Š” "์ž‘์—…์„ฑ๊ณต!" ์ด๋ผ๋Š” ๊ฐ’์„ ๊ฐ€์งˆ ๊ฒƒ์ด๋‹ค. => ์ด๋กœ ์ธํ•ด Promise๊ฐ์ฒด๋Š” ์„ฑ๊ณต์ƒํƒœ๊ฐ€ ๋จ

 

๊ทธ ํ›„ promise ๊ฐ์ฒด๊ฐ€ ์„ฑ๊ณต์ƒํƒœ์ด๋ฏ€๋กœ,. then๋ฌธ์— ์žˆ๋Š” result ์—๋Š” resolve.value = "์ž‘์—…์„ฑ๊ณต!" ์ด ๋“ค์–ด์žˆ์„ ๊ฒƒ์ด๊ณ , ์ตœ์ข…์ ์œผ๋กœ ์ฝ˜์†”์—๋Š” "์ž‘์—…์„ฑ๊ณต!" ์ด ์ฐํž ๊ฒƒ์ด๋‹ค

 

 

๐Ÿ“Œ ๋‚ด๊ฐ€ ์ดํ•ดํ•˜๊ธฐ ํž˜๋“ค์—ˆ๋˜ ๋ถ€๋ถ„์€..

resolve, rejectํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜์ง€๋„ ์•Š์•˜๊ณ  ๋‚ด๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋„˜๊ฒจ์ค€ ํ•จ์ˆ˜๊ฐ€ ์—†๋Š”๋ฐ, ์–ด๋–ป๊ฒŒ ์ฝœ๋ฐฑ์ด ๋˜๋Š” ๊ฑฐ์ง€ ํ•˜๊ณ  ์ƒ๊ฐ์ด ๋งŽ์•˜๋‹ค.

resolve, reject๋Š” ์œ„ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ์ด๋ฏธ ์ •์˜๊ฐ€ ๋˜์–ด์žˆ๋Š” ํ•จ์ˆ˜์ด์ž ๋กœ์ง์ธ๊ฑธ ์ƒ๊ฐํ•ด ๋ณด๋‹ˆ๊นŒ ์ดํ•ด๊ฐ€ ๋˜์—ˆ๋‹ค..