[Javascript] ๐ŸŒŸ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๐ŸŒŸ

GyungHo Goยท2020๋…„ 7์›” 8์ผ
6
post-thumbnail
post-custom-banner

์•ž์˜ ๊ธ€์—์„œ ๋™๊ธฐ์™€ ๋น„๋™๊ธฐ์˜ ๊ฐ„๋‹จํ•œ ๊ฐœ๋…์„ ์‚ดํŽด ๋ณด์•˜๋‹ค.
์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ์˜ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์— ๋Œ€ํ•ด ์ข€ ๋” ๊นŠ์ด์žˆ๊ฒŒ ๋‹ค๋ค„๋ณด๊ฒ ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋™๊ธฐ์ ์ธ ์–ธ์–ด?

  • Javascript๋Š” ๋™๊ธฐ์ ์ธ ์–ธ์–ด์ด๊ณ , blocking์ด๋ฉฐ, single-threadedํ•œ ์–ธ์–ด์ด๋‹ค. ํ•˜์ง€๋งŒ ์ด๊ฒƒ์€ ํ•œ๋ฒˆ์— ํ•œ๋ฒˆ์˜ ์ž‘์—…๋งŒ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ํŠน์„ฑ์„ ์˜๋ฏธํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋ชจ๋“  ๊ฒƒ์—์„œ ์ด๋Ÿฌํ•œ ํŠน์„ฑ์„ ์˜๋ฏธํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค. ๋งŒ์•ฝ ๋งŽ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค๋ฅผ ์š”์ฒญํ•ด์•ผ ํ•œ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ• ๊นŒ? ๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค๋ฉด ํ•˜๋‚˜์˜ ์ž‘์—…์— ๋Œ€ํ•œ ์š”์ฒญ์„ ํ•˜๊ณ  ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ ๋‹ค๋ฅธ ์ž‘์—…์€ ๋Œ€๊ธฐํ•ด์•ผ ํ• ๊ฒƒ์ด๋‹ค. ์‹œ๊ฐ„์ด ๊ต‰์žฅํžˆ ์˜ค๋ž˜ ๊ฑธ๋ฆฐ๋‹ค.

  • Javascript๋Š” ์ด๋Ÿฌํ•œ ์ด์Šˆ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ํ•ด๊ฒฐ์ฑ…์„ ์ œ์‹œํ–ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์ด Javascript๊ฐ€ ๋น„๋™๊ธฐ์  ์–ธ์–ด๋ผ๊ณ  ์˜คํ•ดํ•˜๋Š” ์ด์œ ๊ฐ€ Javascript๋ฅผ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ

  • ํŠน์ • ์ฝ”๋“œ์˜ ์—ฐ์‚ฐ์ด ๋๋‚  ๋•Œ ๊นŒ์ง€ ์ฝ”๋“œ์˜ ์‹คํ–‰์„ ๋ฉˆ์ถ”์ง€ ์•Š๊ณ  ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ๋จผ์ € ์‹คํ–‰ํ•˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ํŠน์„ฑ์„ ์˜๋ฏธํ•œ๋‹ค.

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

ํ•˜์ง€๋งŒ ์ด๋ฅผ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค๋ฉด ์ž‘์—…์˜ ํ๋ฆ„์ด ๋ฉˆ์ถ”์ง€ ์•Š๊ณ  ๋™์‹œ์— ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ณผ์ •์—์„œ ๋‹ค๋ฅธ ํ•จ์ˆ˜๋„ ํ˜ธ์ถœ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒฝ์šฐ

  • Ajax Web API ์š”์ฒญ : ์„œ๋ฒ„์ชฝ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์™€์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ
  • ํŒŒ์ผ ์ฝ๊ธฐ : ์„œ๋ฒ„์—์„œ ํŒŒ์ผ์„ ์ฝ์–ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ
  • ์•”ํ˜ธํ™”/๋ณตํ˜ธํ™” : ๋ฐ”๋กœ ์ฒ˜๋ฆฌ ๋˜์ง€ ์•Š๊ณ , ์‹œ๊ฐ„์ด ์–ด๋Š์ •๋„ ๊ฑธ๋ฆฌ๋Š” ๊ฒฝ์šฐ
  • ์ž‘์—… ์˜ˆ์•ฝ : setTimeout์„ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒฝ์šฐ

๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ฐฉ์‹

1.์ฝœ๋ฐฑ ์ง€์˜ฅ (Callback Hell..๐Ÿ˜ซ)

์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ํ•จ์ˆ˜ ์•ˆ์—์„œ ์–ด๋–ค ํŠน์ •ํ•œ ์‹œ์ ์— ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งํ•œ๋‹ค. ๋ณดํ†ต ์ฝœ๋ฐฑํ•จ์ˆ˜๋Š” ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌํ•˜์—ฌ ํŠน์ • ์‹œ์ ์— ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

๋™๊ธฐ ์ฒ˜๋ฆฌ์—์„œ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ํ•ด๊ฒฐ์ฑ…์€ ๋น„๋™๊ธฐ callback์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
์ฝœ๋ฐฑ ์ง€์˜ฅ์€ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์—ฐ์†ํ•ด์„œ ์‚ฌ์šฉํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.

ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ ๊ฐ’์„ ๋ฐ›์€ ๋‹ค์Œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์— ์œ„์™€ ๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ ์ฝœ๋ฐฑ์œผ๋กœ ๋ฐ›์•„ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

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

์ด๋Ÿฌํ•œ ์ฝœ๋ฐฑ ์ง€์˜ฅ์„ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” Promise์™€ Async/await๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

2. Promise

Promise๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ข€ ๋” ํŽธ๋ฆฌํ•˜๊ฒŒ ์ฒ˜๋ฆฌ ํ•  ์ˆ˜ ์žˆ๋„๋ก ES6์— ๋„์ž…๋œ ๊ธฐ๋Šฅ์ด๋‹ค.

const promise = new Promise ((resolve, reject) => {
	//executor ์‹คํ–‰์ž, ์‹คํ–‰ ํ•จ์ˆ˜.. 
})

resolve๋Š” new Promise๊ฐ€ ๋งŒ๋“ค์–ด ์งˆ๋•Œ ์ž๋™์œผ๋กœ ์‹คํ–‰๋œ๋‹ค. executor์˜ ์ธ์ˆ˜ resolve, reject๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ž์ฒด์ ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ์ฝœ๋ฐฑ์ด๋‹ค.

  • resolve : ์ž‘์—…์ด ์„ฑ๊ณต์ ์œผ๋กœ ๋๋‚œ ๊ฒฝ์šฐ, ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” value์™€ ํ•จ๊ป˜ ํ˜ธ์ถœํ•œ๋‹ค.
  • reject : ์—๋Ÿฌ ๋ฐœ์ƒ ์‹œ ์—๋Ÿฌ ๊ฐ์ฒด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” error์™€ ํ•จ๊ป˜ ํ˜ธ์ถœํ•œ๋‹ค.

executor๋Š” ์ž๋™์œผ๋กœ ์‹คํ–‰๋˜๋Š”๋ฐ ์—ฌ๊ธฐ์„œ ์›ํ•˜๋Š” ์ผ์ด ์ฒ˜๋ฆฌ๋œ๋‹ค. ์ฒ˜๋ฆฌ๊ฐ€ ๋๋‚˜๋ฉด ์„ฑ๊ณต ์—ฌ๋ถ€์— ๋”ฐ๋ผ resolve๋‚˜ reject๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

Promise์˜ 3๊ฐ€์ง€ ์ƒํƒœ(states)

ํ”„๋กœ๋ฏธ์Šค๋Š” 3๊ฐ€์ง€์˜ ์ƒํƒœ(states)๋ฅผ ๊ฐ€์ง€๋ฉฐ, ์—ฌ๊ธฐ์„œ ์ƒํƒœ๋ž€ ํ”„๋กœ๋ฏธ์Šค์˜ ์ฒ˜๋ฆฌ ๊ณผ์ •์„ ์˜๋ฏธํ•œ๋‹ค. new Promise()๋กœ ํ”„๋กœ๋ฏธ์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ข…๋ฃŒ๋  ๋•Œ๊นŒ์ง€ 3๊ฐ€์ง€ ์ƒํƒœ๋ฅผ ๊ฐ€์ง„๋‹ค.

  • Pending : ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋กœ์ง์ด ์•„์ง ์™„๋ฃŒ๋˜์ง€ ์•Š์€ ์ƒํƒœ (๋Œ€๊ธฐ)
  • Fulfilled : ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์™„๋ฃŒ๋˜์–ด ํ”„๋กœ๋ฏธ์Šค๊ฐ€ ๊ฒฐ๊ณผ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ด์ค€ ์ƒํƒœ (์„ฑ๊ณต)
  • Rejected : ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์‹คํŒจํ•˜๊ฑฐ๋‚˜ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ ์ƒํƒœ(์‹คํŒจ)
const myPromise = new Promise((resolve, reject) => {
	setTimeout (() => {
    resolve(1);
   }, 1000);
 });
 
 myPromise.then(n => {
 console.log(n);
});

์ถœ์ฒ˜ ๋ฒจ๋กœํผํŠธ

์ž‘์—…์ด ๋๋‚˜๊ณ  ๋˜ ๋‹ค๋ฅธ ์ž‘์—…์„ ํ•˜๊ณ ์ž ํ• ๋•Œ, .then(...)์„ ๋ถ™์–ด์„œ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

const promise = new Promise((resolve, reject) => {
  setTimeout(() => {
    reject(new Error());
  }, 1000);
});

myPromise
  .then(n => {
    console.log(n);
  })
  .catch(error => {
    console.log(error);
  });

์ถœ์ฒ˜ ๋ฒจ๋กœํผํŠธ

์„ฑ๊ณตํ•˜๋ฉด .then()๋ฉ”์†Œ๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ณ , ์‹คํŒจํ•˜๋ฉด reject๋ฅผ ์‚ฌ์šฉํ•˜๊ณ ,
error๋Š”.catch()๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ฒ˜๋ฆฌํ•œ๋‹ค.

3. async/ await

async/ await๋Š” ES8๋ฌธ๋ฒ•์œผ๋กœ์„œ ๊ฐ€์žฅ ์ตœ๊ทผ์— ๋‚˜์˜จ ๋ฌธ๋ฒ•์ด๋‹ค. ์ฝœ๋ฐฑํ•จ์ˆ˜์™€ promise์˜ ๋‹จ์ ์„ ๋ณด์™„ํ•˜๊ณ  ๊ฐœ๋ฐœ์ž๊ฐ€ ์ฝ๊ธฐ ์ข‹์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ฒŒ ๋„์™€์ค€๋‹ค.

async/await๋Š” promise๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜์žˆ๋‹ค.
๋ชจ๋“  asyncํ•จ์ˆ˜๋Š” promise๋ฅผ ๋ฆฌํ„ดํ•˜๊ณ , ๋ชจ๋“  awaitํ•จ์ˆ˜๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ promise๊ฐ€ ๋œ๋‹ค.

๊ธฐ๋ณธ๋ฌธ๋ฒ• & ๊ฐ„๋‹จํ•œ ์‚ฌ์šฉ๋ฒ•

async function ํ•จ์ˆ˜๋ช…(){
 await ๋น„๋™๊ธฐ์ฒ˜๋ฆฌ_๋ฉ”์„œ๋“œ๋ช…();
}

ํ•จ์ˆ˜ ์•ž์— async๋ฅผ ๋ถ™์ด๊ณ , ํ˜ธ์ถœํ•  ๋น„๋™๊ธฐ ํ•จ์ˆ˜ ์•ž์— ์ฆ‰ promise์•ž์— await ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์ธ๋‹ค. ํ•จ์ˆ˜ ์•ž์— async๊ฐ€ ์„ ์–ธ ๋˜์–ด์•ผ๋งŒ await๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

async

async๋Š” function์•ž์— ์œ„์น˜ํ•œ๋‹ค. function์•ž์— async๋ฅผ ๋ถ™์ด๋ฉด ํ•ด๋‹น ํ•จ์ˆ˜๋Š” ํ•ญ์ƒ promise๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

await

await๋ฅผ ๋งŒ๋‚˜๋ฉด promise๊ฐ€ ์ฒ˜๋ฆฌ๋  ๋•Œ ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ๋‹ค. ๊ฒฐ๊ณผ๋Š” ๊ทธ ์ดํ›„์— ๋ณ€ํ™˜๋œ๋‹ค. ์ผ๋ฐ˜ ํ•จ์ˆ˜์—๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค. asyncํ•จ์ˆ˜๊ฐ€ ์•„๋‹Œ๋ฐ await๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฌธ๋ฒ• ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ์œ„์—๋„ ๋งํ–ˆ๋“ฏ์ด await๋Š” async ํ•จ์ˆ˜์—์„œ๋งŒ ๋ฐœ์ƒํ•œ๋‹ค.

๊ธฐ๋ณธ์ ์ธ ์‚ฌ์šฉ๋ฒ•

function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

async function process() {
  console.log('์•ˆ๋…•ํ•˜์„ธ์š”!');
  await sleep(1000); // 1์ดˆ์‰ฌ๊ณ 
  console.log('๋ฐ˜๊ฐ‘์Šต๋‹ˆ๋‹ค!');
}

process();

์ถœ์ฒ˜ ๋ฒจ๋กœํผํŠธ

์˜ˆ์™ธ์ฒ˜๋ฆฌ

async & await์—์„œ ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฐ”๋กœ try-catch์ด๋‹ค. ํ”„๋กœ๋ฏธ์Šค์—์„œ ์—๋Ÿฌ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด .catch()๋ฅผ ์‚ฌ์šฉํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ async์—์„œ๋Š” catch {} ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

async function logTodoTitle() {
  try {
    var user = await fetchUser();
    if (user.id === 1) {
      var todo = await fetchTodo();
      console.log(todo.title); // delectus aut autem
    }
  } catch (error) {
    console.log(error);
  }
}

์ถœ์ฒ˜ joshua1988.github

๋‚ด ์ƒ๊ฐ..

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

์ฐธ๊ณ 

profile
๊ธฐ๋กํ•˜๋Š” ์Šต๊ด€
post-custom-banner

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