๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Front-End

await, async, promise

by ์ฝ”๋”ฉํ•˜๋Š” ๋ถ•์–ด 2021. 11. 10.
๋ฐ˜์‘ํ˜•

๐Ÿ“ž ๋น„๋™๊ธฐ๋ž€?

ํŠน์ • ์ฝ”๋“œ์˜ ์—ฐ์‚ฐ์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ์ฝ”๋“œ์˜ ์‹คํ–‰์„ ๋ฉˆ์ถ”์ง€ ์•Š๊ณ  ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ๋จผ์ € ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ.

ex) ajax, setTimeout(), callback

 

 

๐Ÿ‘‰๐Ÿป ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ์ด์œ ?

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



 

๐Ÿ“ž await, async

promise์˜ ๋ฌธ์ œ์ ์„ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ€์žฅ ์ตœ๊ทผ์— ๋‚˜์˜จ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ฌธ๋ฒ•.

  • ๊ธฐ์กด์˜ callback์ด๋‚˜promise์˜ ๋‹จ์ ์„ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์กŒ๋‹ค.
    ex) callback ์ง€์˜ฅ, then() ์ง€์˜ฅ
  • await์™€ async๋Š” ์ฃผ๋กœ ๊ฐ™์ด ์“ฐ์ธ๋‹ค.
  • ๊ธฐ์กด ๋™๊ธฐ์‹ ์ฒ˜๋ฆฌ์˜ ๋‹จ์ ์„ ๋ณด์™„ํ•˜๊ณ  ๊ฐ€๋…์„ฑ์„ ๋†’์—ฌ์ค€๋‹ค.
  • ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋Š” try-catch๋กœ ํ•œ๋‹ค.

 

 

๐Ÿ‘‡๐Ÿป ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•œ await, async

function ์•ž์— async๋งŒ ๋ถ™์—ฌ์ฃผ๋ฉด ๋˜๊ณ  ๋น„๋™๊ธฐ๋กœ ์ฒ˜๋ฆฌ๋˜๋Š” ๋ถ€๋ถ„ ์•ž์— await๋งŒ ๋ถ™์—ฌ์ฃผ๋ฉด ๋œ๋‹ค.

// ๊ฒŒ์‹œ๊ธ€ ๋“ฑ๋ก ํ•จ์ˆ˜
  const handleBoardSubmit = async () => {
    const result = await axios
      .post(`${BASE_URL}/board`, {
        title: submit.title,
        contents: submit.contents,
      })
      .catch((err) => {
        throw err;
      });
  };

await & async๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด promise๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๊ฐ€๋…์„ฑ์ด ์ข‹๋‹ค.



 

๐Ÿ“ž promise

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

 

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

 

 

๐Ÿ‘‰๐Ÿป promise์˜ ์ƒํƒœ ๊ฐ’

promise๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์•Œ์•„์•ผ ํ•˜๋Š” ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ๊ฐœ๋…์ด ๋ฐ”๋กœ promise์˜ ์ƒํƒœ(state)์ด๋‹ค. ์ƒํƒœ(state)๋ž€ promise์˜ ์ฒ˜๋ฆฌ ๊ณผ์ •์„ ์˜๋ฏธํ•œ๋‹ค.

promise๋Š” ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜์˜ ์ƒํƒœ๋ฅผ ๊ฐ€์ง„๋‹ค.



1. pending(๋Œ€๊ธฐ)

์ดํ–‰ํ•˜๊ฑฐ๋‚˜ ๊ฑฐ๋ถ€๋˜์ง€ ์•Š์€ ์ดˆ๊ธฐ ์ƒํƒœ.

์•„๋ž˜์™€ ๊ฐ™์ด new Promise() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋Œ€๊ธฐ(pending) ์ƒํƒœ๊ฐ€ ๋œ๋‹ค.

new Promise();

 

 

new Promise() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ callback ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๊ณ , callback ํ•จ์ˆ˜์˜ ์ธ์ž๋Š” resolve, reject์ด๋‹ค.

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

 

 

2. fulfilled(์ดํ–‰)

์—ฐ์‚ฐ์ด ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋จ.

callback ํ•จ์ˆ˜์˜ ์ธ์ž resolve๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ์‹คํ–‰ํ•˜๋ฉด ์ดํ–‰(fulfilled) ์ƒํƒœ๊ฐ€ ๋œ๋‹ค.

new Promise(function(resolve, reject) { resolve(); });

 

๊ทธ๋ฆฌ๊ณ  ์ดํ–‰ ์ƒํƒœ๊ฐ€ ๋˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด then()์„ ์ด์šฉํ•˜์—ฌ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ ๊ฐ’์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

function getData() {
  return new Promise(function(resolve, reject) {
    var data = 100;
    resolve(data);
  });
}

// resolve()์˜ ๊ฒฐ๊ณผ ๊ฐ’ data๋ฅผ resolvedData๋กœ ๋ฐ›์Œ
getData().then(function(resolvedData) {
  console.log(resolvedData); // 100
});

 

 

3. rejected(์‹คํŒจ)

์—ฐ์‚ฐ์ด ์‹คํŒจํ•จ.

 

new Promise()๋กœ ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋ฉด callback ํ•จ์ˆ˜ ์ธ์ž๋กœ resolve์™€ reject๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์—ฌ๊ธฐ์„œ reject๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ํ˜ธ์ถœํ•˜๋ฉด ์‹คํŒจ(rejected) ์ƒํƒœ๊ฐ€ ๋œ๋‹ค.

new Promise(function(resolve, reject) { reject(); });

 

๊ทธ๋ฆฌ๊ณ  ์‹คํŒจ ์ƒํƒœ๊ฐ€ ๋˜๋ฉด ์‹คํŒจํ•œ ์ด์œ (์‹คํŒจ ์ฒ˜๋ฆฌ์˜ ๊ฒฐ๊ณผ ๊ฐ’)๋ฅผ catch()๋กœ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

function getData() {
  return new Promise(function(resolve, reject) {
    reject(new Error("Request is failed"));
  });
}

// reject()์˜ ๊ฒฐ๊ณผ ๊ฐ’ Error๋ฅผ err์— ๋ฐ›์Œ
getData().then().catch(function(err) {
  console.log(err); // Error: Request is failed
});

 

๋Œ€๊ธฐ ์ค‘์ธ ํ”„๋กœ๋ฏธ์Šค๋Š” ๊ฐ’๊ณผ ํ•จ๊ป˜ ์ดํ–‰ํ•  ์ˆ˜๋„, ์–ด๋–ค ์ด์œ (์˜ค๋ฅ˜)๋กœ ์ธํ•ด ๊ฑฐ๋ถ€๋  ์ˆ˜ ์žˆ๋‹ค.
์ดํ–‰์ด๋‚˜ ๊ฑฐ๋ถ€๋  ๋•Œ, ํ”„๋กœ๋ฏธ์Šค์— ์—ฐ๊ฒฐํ•œ ์ฒ˜๋ฆฌ๊ธฐ๋Š” ๊ทธ ํ”„๋กœ๋ฏธ์Šค์˜ then ๋ฉ”์„œ๋“œ์— ์˜ํ•ด ๋Œ€๊ธฐ์—ด์— ์˜ค๋ฅธ๋‹ค.
์ด๋ฏธ ์ดํ–‰ํ–ˆ๊ฑฐ๋‚˜ ๊ฑฐ๋ถ€๋œ ํ”„๋กœ๋ฏธ์Šค์— ์—ฐ๊ฒฐํ•œ ์ฒ˜๋ฆฌ๊ธฐ๋„ ํ˜ธ์ถœํ•œ๋‹ค.

 

 


์ฐธ๊ณ  ์‚ฌ์ดํŠธ

๐Ÿ‘‰๐Ÿป MDN - Promise
๐Ÿ‘‰๐Ÿป ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Promise ์‰ฝ๊ฒŒ ์ดํ•ดํ•˜๊ธฐ
๐Ÿ‘‰๐Ÿป JavaScript Async/Await (๋น„๋™๊ธฐ ํ•จ์ˆ˜์™€ ์‹คํ–‰ ์ˆœ์„œ)

๋ฐ˜์‘ํ˜•

'Front-End' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Self Refactoring Tip  (0) 2021.11.17
RESTful API ๋ž€?  (0) 2021.11.15
gitignore  (0) 2021.11.10
Axios ๋ž€?  (0) 2021.11.10
SSR, CSR, SPA  (0) 2021.11.05

๋Œ“๊ธ€