async / await ๋ž€?? (Javascript)

๊น€์ข…ํ™”ยท2023๋…„ 10์›” 14์ผ

JavaScript

๋ชฉ๋ก ๋ณด๊ธฐ
18/18


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

๐Ÿง ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ž€?

  • ๋™๊ธฐ์  (Synchronous) : ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ณ  ์ข…๋ฃŒ๋œ ํ›„์— ๋‹ค์Œ ์ฝ”๋“œ ์‹คํ–‰
    • ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ์ฝ”๋“œ๊ฐ€ ๋๋‚˜์•ผ ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ์‹์„
    • CPU์˜ ๊ณ„์‚ฐ์— ์˜ํ•ด ์ฆ‰์‹œ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•œ ๋Œ€๋ถ€๋ถ„์˜ ์ฝ”๋“œ๋Š” ๋™๊ธฐ์  ์ฝ”๋“œ
    • ๊ณ„์‚ฐ์ด ๋ณต์žกํ•ด์„œ CPU๊ฐ€ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐ์— ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์ฝ”๋“œ ์—ญ์‹œ ๋™๊ธฐ์  ์ฝ”๋“œ
  • ๋น„๋™๊ธฐ์ (Asynchronous) : ์ฝ”๋“œ๊ฐ€ ๋ณ‘๋ ฌ์ ์œผ๋กœ ์‹คํ–‰
    • ์‹คํ–‰ ์ค‘์ธ ์ฝ”๋“œ์˜ ์™„๋ฃŒ ์—ฌ๋ถ€์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ ์ฆ‰์‹œ ๋‹ค์Œ ์ฝ”๋“œ๋กœ ๋„˜์–ด๊ฐ€๋Š” ๋ฐฉ์‹
    • setTimout, addEventListner ๋“ฑ
    • ๋ณ„๋„์˜ ์š”์ฒญ, ์‹คํ–‰ ๋Œ€๊ธฐ, ๋ณด๋ฅ˜ ๋“ฑ๊ณผ ๊ด€๋ จ๋œ ์ฝ”๋“œ๋Š” ๋ชจ๋‘ ๋น„๋™๊ธฐ์  ์ฝ”๋“œ
  • ๊ธฐ์กด์˜ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ์ฝ”๋“œ๊ฐ€ ๊ธธ์–ด ์งˆ์ˆ˜๋ก ์ฝœ๋ฐฑํ•จ์ˆ˜ ๋‚ด๋ถ€์— ์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ ์ƒ๊ฒจ ๋“ค์—ฌ์“ฐ๊ธฐ๊ฐ€ ๊นŠ์–ด์ง€๊ณ , ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง€๋Š” ๋‹จ์ 
setTimeout(
  function (name) {
    var coffeeList = name;
    console.log(coffeeList);

    setTimeout(
      function (name) {
        coffeeList += ", " + name;
        console.log(coffeeList);

        setTimeout(
          function (name) {
            coffeeList += ", " + name;
            console.log(coffeeList);

            setTimeout(
              function (name) {
                coffeeList += ", " + name;
                console.log(coffeeList);
              },
              500,
              "์นดํŽ˜๋ผ๋–ผ"
            );
          },
          500,
          "์นดํŽ˜๋ชจ์นด"
        );
      },
      500,
      "์•„๋ฉ”๋ฆฌ์นด๋…ธ"
    );
  },
  500,
  "์—์Šคํ”„๋ ˆ์†Œ"
);

์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ ๊ธธ์–ด์งˆ ์ˆ˜๋ก ๊ฐ€๋…์„ฑ์ด ์ ์  ๋–จ์–ด์ง„๋‹ค.

  • ์ด๋ฅผ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด Promise ๋“ฑ์žฅ.
    • ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์— ๋Œ€ํ•ด ์ฒ˜๋ฆฌ๊ฐ€ ๋๋‚˜๋ฉด ์•Œ๋ ค๋‹ฌ๋ผ๋Š” โ€œ์•ฝ์†โ€
    • new ์—ฐ์‚ฐ์ž๋กœ ํ˜ธ์ถœํ•œ Promise์˜ ์ธ์ž๋กœ ๋„˜์–ด๊ฐ€๋Š” ์ฝœ๋ฐฑ์€ ๋ฐ”๋กœ ์‹คํ–‰๋œ๋‹ค
    • new Promise() ๋‚ด๋ถ€์˜ resolve(๋˜๋Š” reject) ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ตฌ๋ฌธ์ด ์žˆ์„ ๊ฒฝ์šฐ resolve(๋˜๋Š” reject) ๋‘˜ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „๊นŒ์ง€๋Š” ๋‹ค์Œ(then), ์˜ค๋ฅ˜(catch)๋กœ ๋„˜์–ด๊ฐ€์ง€ ์•Š๋Š”๋‹ค.
    • ์ด ๋ฐฉ๋ฒ•์œผ๋กœ ๋น„๋™๊ธฐ์  ์ฝ”๋“œ๋ฅผ ๋™๊ธฐ์ ์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค
    • ํ•˜์ง€๋งŒ Promise ๊ฐ์ฒด๋„ ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•ด์ง€๋ฉด ์—ฌ๋Ÿฌ ๊ฐœ์˜ Promise๋ฅผ ์—ฐ๊ฒฐํ•˜๋ฉด์„œ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง€๊ณ , ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๊ฐ€ ์–ด๋ ค์›Œ ์งˆ ์ˆ˜ ์žˆ๋‹ค.
new Promise(function (resolve) {
	setTimeout(function () {
		var name = '์—์Šคํ”„๋ ˆ์†Œ';
		console.log(name);
		resolve(name);
	}, 500);
}).then(function (prevName) {
	return new Promise(function (resolve) {
		setTimeout(function () {
			var name = prevName + ', ์•„๋ฉ”๋ฆฌ์นด๋…ธ';
			console.log(name);
			resolve(name);
		}, 500);
	});
}).then(function (prevName) {
	return new Promise(function (resolve) {
		setTimeout(function () {
			var name = prevName + ', ์นดํŽ˜๋ชจ์นด';
			console.log(name);
			resolve(name);
		}, 500);
	});
}).then(function (prevName) {
	return new Promise(function (resolve) {
		setTimeout(function () {
			var name = prevName + ', ์นดํŽ˜๋ผ๋–ผ';
			console.log(name);
			resolve(name);
		}, 500);
	});
});

Promise๊ฐ€ ์—ฐ๊ฒฐ๋˜๋ฉด์„œ then ๋ถ€๋ถ„์ด ๊ณ„์† ๋ฐ˜๋ณต.. ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์ด ์ ์  ๋–จ์–ด์ง€๋Š” ๋‹จ์ 
์ด๋ฅผ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ๋น„๋™๊ธฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์ตœ์‹  ๋ฌธ๋ฒ•์ธ async / await๊ฐ€ ๋“ฑ์žฅ

  • async๋ฅผ ๋ถ™์ด๋ฉด ํ•ด๋‹น ํ•จ์ˆ˜๋Š” ํ•ญ์ƒ ํ”„๋กœ๋ฏธ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ ํ”„๋กœ๋ฏธ์Šค๊ฐ€ ์•„๋‹Œ ๊ฒƒ์€ ํ”„๋กœ๋ฏธ์Šค๋กœ ๊ฐ์‹ธ ๋ฐ˜ํ™˜ํ•œ๋‹ค
  • await๋Š” async ํ•จ์ˆ˜ ์•ˆ์—์„œ๋งŒ ๋™์ž‘ํ•œ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” await ํ‚ค์›Œ๋“œ๋ฅผ ๋งŒ๋‚˜๋ฉด ํ”„๋กœ๋ฏธ์Šค๊ฐ€ ์ฒ˜๋ฆฌ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๊ณ , ํ”„๋กœ๋ฏธ์Šค๊ฐ€ ์ฒ˜๋ฆฌ๋˜๋ฉด ๊ทธ ๊ฒฐ๊ณผ์™€ ํ•จ๊ป˜ ์‹คํ–‰์ด ์žฌ๊ฐœ๋œ๋‹ค.
  • ํ”„๋กœ๋ฏธ์Šค๊ฐ€ ์ฒ˜๋ฆฌ๋˜๊ธธ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ์—๋Š” ์—”์ง„์ด ๋‹ค๋ฅธ ์ž‘์—…(์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰, ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ๋“ฑ)์„ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฆฌ์†Œ์Šค๊ฐ€ ๋‚ญ๋น„๋˜์ง€ ์•Š๋Š”๋‹ค.
  • ํ”„๋กœ๋ฏธ์Šค์—์„œ ์—๋Ÿฌ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด .catch()๋ฅผ ์‚ฌ์šฉํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ async์—์„œ๋Š” catch {}๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค try-catch{}
var addCoffee = function (name) {
	return new Promise(function (resolve) {
		setTimeout(function(){
			resolve(name);
		}, 500);
	});
};
var coffeeMaker = async function () {
	var coffeeList = '';
	var _addCoffee = async function (name) {
		coffeeList += (coffeeList ? ', ' : '') + await addCoffee(name);
	};
	await _addCoffee('์—์Šคํ”„๋ ˆ์†Œ');
	console.log(coffeeList);
	await _addCoffee('์•„๋ฉ”๋ฆฌ์นด๋…ธ');
	console.log(coffeeList);
	await _addCoffee('์นดํŽ˜๋ชจ์นด');
	console.log(coffeeList);
	await _addCoffee('์นดํŽ˜๋ผ๋–ผ');
	console.log(coffeeList);
};
coffeeMaker();

0๊ฐœ์˜ ๋Œ“๊ธ€