๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๊ฐœ๋ฐœ/Javascript

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ / Promise / async / await / fetch

by 1mj 2022. 4. 20.

๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๊ตฌ์กฐ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์›๋ž˜ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ๊ธฐ๋ฐ˜ ์–ธ์–ด์ด๋ฉฐ ๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋œ๋‹ค. ํ˜ธ์ถœ ์Šคํƒ(Call Stack)์ด ํ•˜๋‚˜์—ฌ์„œ ์Šคํƒ ๋‚ด์— ์Œ“์ธ ์ž‘์—…์„ ์ˆœ์„œ๋Œ€๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.

 

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

 

setTimeout() ์œผ๋กœ ์ผ์ • ์‹œ๊ฐ„ ๋™์•ˆ ์ž‘์—…์„ ์ง€์—ฐ์‹œํ‚ค๋Š” ์˜ˆ์‹œ์ด๋‹ค. ์ด ์˜ˆ์ œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด 3์ดˆ ๋’ค์— '3์ดˆ ์ง€์—ฐ!'์ด๋ผ๋Š” ๋ฌธ๊ตฌ๋ฅผ ์ฐ๋Š”๋‹ค.

 

setTimeout(function() {
	console.log('3์ดˆ ์ง€์—ฐ!');
}, 3000);

 

์ง€๊ธˆ์€ 3์ดˆ์งœ๋ฆฌ ์ฝ”๋“œ์ด์ง€๋งŒ, ์„œ๋ฒ„์—์„œ ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ค๋Š” ๋“ฑ์˜ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•  ๋•Œ๋Š” ๋” ์‹œ๊ฐ„์ด ๊ธธ์–ด์ง€๊ฒŒ ๋œ๋‹ค. ๊ทธ ์‹œ๊ฐ„ ๋™์•ˆ ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ  ๊ธฐ๋‹ค๋ฆฌ๋ฉด ์‚ฌ์šฉ์ž๋„ ๊ณ„์† ๊ธฐ๋‹ค๋ฆฌ๊ฒŒ ๋œ๋‹ค.

 

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

 

setTimeout() ์€ ์ธ์ž๋กœ ๋ฐ›์€ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์™ธ๋ถ€ API์— ์˜ˆ์•ฝํ•˜๊ธฐ๋งŒ ํ•˜๊ณ  ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฑด ์›๋ž˜ ์ฝ”๋“œ๋ž‘ ์ƒ๊ด€์—†์ด ๋”ฐ๋กœ ๋™์ž‘ํ•œ๋‹ค. ์ด๊ฒƒ์ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

 

 

setTimeout ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋ฉด ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ œ๊ณตํ•˜๋Š” Web API ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  Call Stack์—์„œ ์ œ๊ฑฐํ•œ๋‹ค. ์ผ์ • ์‹œ๊ฐ„์ด ์ง€๋‚œ ๋’ค ๋๋‚œ ์ž‘์—…์„ callback queue์— ๋„ฃ๋Š”๋‹ค. event loop๋Š” call stack์„ ๊ฐ์‹œํ•˜๋‹ค๊ฐ€ ๋น„์–ด์žˆ์œผ๋ฉด callback queue์— ์žˆ๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ call stack์— ๋„˜๊ธฐ๊ณ  ์‹คํ–‰ํ•œ๋‹ค. (์‹ค์ œ๋กœ setTimeout์— ์ฃผ์–ด์ง„ ์‹œ๊ฐ„์€ callback queue์— ๋“ค์–ด๊ฐ€๋Š” ์‹œ๊ฐ„์ผ ๋ฟ ์‹คํ–‰๊นŒ์ง€ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์ด ์•„๋‹ ์ˆ˜๋„ ์žˆ๋‹ค.)

 

์•„๋ž˜ ์˜ˆ์‹œ๋Š” setTimeout() 0์ดˆ, 3์ดˆ ์งœ๋ฆฌ๋ฅผ ์‹คํ–‰ํ–ˆ์„ ๋•Œ์˜ ์ฝ”๋“œ์ด๋‹ค.

 

console.log('11111');
setTimeout(
    function() {
        console.log('22222');
    }
, 0);
setTimeout(
    function() {
        console.log('33333');
    }
, 3000);
console.log('44444');

 

'22222'๋ฅผ ์ฐ๋Š” ์ฝ”๋“œ๋Š” 0์ดˆ ์ง€์—ฐ ํ›„ ์‹คํ–‰๋˜์–ด์•ผ ํ•˜์ง€๋งŒ ์™ธ๋ถ€ API๋กœ ์œ„์ž„๋˜๊ณ  0์ดˆ ํ›„ ์ฝœ๋ฐฑ ํ์— ๋“ค์–ด์™€ ๊ธฐ๋‹ค๋ฆฌ๋‹ค๊ฐ€ ์ฝœ ์Šคํƒ์ด ๋นˆ ํ›„์— ์‹คํ–‰๋˜๋ฏ€๋กœ ์ถœ๋ ฅ ์ˆœ์„œ๋Š” '11111' → '44444' → '22222' → '33333'๊ฐ€ ๋œ๋‹ค.

 

 

promise

ES6 ๋ถ€ํ„ฐ๋Š” Promise๋กœ ๋น„๋™๊ธฐ ์ž‘์—…์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฝœ๋ฐฑ์ด ์•„๋‹Œ Promise๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์€ ์ด์œ ๋Š” ์—ฌ๊ธฐ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”. 

 

์ฐธ๊ณ ๋กœ Promise๋Š” ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜์ง€๋งŒ callback queue๊ฐ€ ์•„๋‹Œ job queue๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์ด๋Š” callback queue๋ณด๋‹ค ๋†’์€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ€์ง„๋‹ค.

 

๋น„๋™๊ธฐ ์ž‘์—…์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. Promise ์ƒ์„ฑ์ž๋Š” ์ธ์ž๋กœ executor ํ•จ์ˆ˜๋ฅผ ๋ฐ›์œผ๋ฉฐ Promise ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

executor ํ•จ์ˆ˜๋Š” resolve, reject ๋‘ ๊ฐœ์˜ ์ธ์ž๋ฅผ ๊ฐ€์ง€๊ณ  ์ด๋“ค๋„ ๋ชจ๋‘ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜์ด๋‹ค. ์ž‘์—…์— ์„ฑ๊ณตํ•  ๊ฒฝ์šฐ resolve, ์‹คํŒจํ•  ๊ฒฝ์šฐ reject๋ฅผ ํ˜ธ์ถœํ•˜๋ฉฐ ์ด์— ๋”ฐ๋ฅธ ์ž‘์—…์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

const promise = new Promise((resolve, reject) => {
	// ์ฒ˜๋ฆฌํ•  ๋น„๋™๊ธฐ ์ž‘์—…
});

 

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

 

promise
  .then(() => {
    console.log("์„ฑ๊ณต, then!");
  })
  .catch(() => {
    console.log("์‹คํŒจ, catch!");
  });

 

promise ๊ฐ์ฒด๊ฐ€ resolve()๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด then, reject()๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด catch๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

 

 

async/await

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์ธ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•, Promise๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์—์„œ ๊ทธ ๋‹จ์ ๋“ค์„ ๋ณด์™„ํ•œ ๊ฒƒ์ด aync/await์ด๋‹ค.

 

์œ„์—์„œ ์ž‘์„ฑํ–ˆ๋˜ Promise๋ฅผ async๋กœ ๋ณ€๊ฒฝํ•ด๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

async๋Š” promise๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋น„๋™๊ธฐ ํ›„ ์ž‘์—…์€ promise๋ฅผ ์ด์šฉํ•˜๋ฉด ๋œ๋‹ค.

 

// Promise
const promise = new Promise((resolve, reject) => {
	// ์ฒ˜๋ฆฌํ•  ๋น„๋™๊ธฐ ์ž‘์—…
});

// async
async function asyncFunction() {
	// ์ฒ˜๋ฆฌํ•  ๋น„๋™๊ธฐ ์ž‘์—…
}
const promise = asyncFunction();
...

 

์—ฌ๊ธฐ์„œ await๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด Promise ๊ฐ์ฒด์˜ then(), catch()๋กœ ์‚ฌํ›„ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์ด๋‹ค.

ํ•จ์ˆ˜ ์•ž์— async ์˜ˆ์•ฝ์–ด๋ฅผ, ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์ฝ”๋“œ ์•ž์— await๋ฅผ ๋ถ™์ด๋ฉด ๋œ๋‹ค. await๋Š” async ์•ˆ์—์„œ๋งŒ ๋™์ž‘ํ•œ๋‹ค.

 

function fetchHello() {
  return new Promise(function(resolve, reject) {
    setTimeout(function() {
      var greet = 'hello';
      resolve(greet);
    }, 3000);
  });
}

async function printHello() {
  var result = await fetchHello();
  console.log(result); 
}

printHello();
console.log('bye');

// bye ์ถœ๋ ฅ ํ›„ 3์ดˆ ๋’ค hello

 

await๋Š” fetchHello ๊ฐ€ ๋๋‚  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ ๊ทธ ์•„๋ž˜์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ๊ฒƒ์ด๊ณ  printHello ํ•จ์ˆ˜๋Š” async ์ด๋ฏ€๋กœ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋œ๋‹ค. Promise์—์„œ ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ reject, catch()๋กœ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ async/await์—์„œ๋Š” await ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์ชฝ์—์„œ try~catch ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

 

fetch

๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋Š” ์ฃผ๋กœ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด ์‹œ๊ฐ„์ด ๋งŽ์ด ์†Œ์š”๋˜๋Š” ์ž‘์—…์— ์‚ฌ์šฉ๋œ๋‹ค.

 

์„œ๋ฒ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•  ๋•Œ XMLHttpRequest ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ „์ฒด ํŽ˜์ด์ง€์˜ ๋ฆฌ๋กœ๋“œ ์—†์ด๋„ URL ๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ฌ ์ˆ˜ ์žˆ๋‹ค. ajax๋„ XMLHttpRequest ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์˜ˆ์‹œ์ด๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ XMLHttpRequest()์™€ Promise๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ ํ†ต์‹ ์„ ๊ตฌํ˜„ํ•˜๋Š” ์ฝ”๋“œ๋Š” ๋„ˆ๋ฌด ๋ณต์žกํ•˜๋‹ค. ๊ทธ๋ž˜์„œ ES6๋ถ€ํ„ฐ XMLHttpRequest() ๋Œ€์‹  fetch API๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

fetch๋Š” Promise๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ ์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

// XMLHttpRequest() ์‚ฌ์šฉ
const request = new XMLHttpRequest();
request.open('GET', URL);

// fetch API ์‚ฌ์šฉ
const request = fetch(URL);

 

'๊ฐœ๋ฐœ > Javascript' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

ES6 Syntax  (0) 2022.05.03
TypeScript  (0) 2022.04.28
Promise ํŒจํ„ด  (0) 2022.04.14
javascript ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ  (0) 2022.02.06
javascript ๋ณ€์ˆ˜ / ํ˜ธ์ด์ŠคํŒ… / var, let, const ์ฐจ์ด  (0) 2022.01.26

๋Œ“๊ธ€