Language/JavaScript (WEB)

๐ŸŒ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ํ•ต์‹ฌ '๋น„๋™๊ธฐ' ์™„๋ฒฝ ์ดํ•ด โ—

์ธํŒŒ_ 2023. 5. 1. 08:58

js-sync-async

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

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ์–ธ์–ด์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์ž‘์—…๋งŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ์ด์ „ ์ž‘์—…์ด ์™„๋ฃŒ๋˜์–ด์•ผ ๋‹ค์Œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜๋ฉด์„œ ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐ ํ•จ์ˆ˜์™€ ์ฝ”๋“œ๋“ค์ด ์œ„์—์„œ ์•„๋ž˜๋กœ ์ฐจ๋ก€๋กœ ๋™์ž‘ํ•˜๋Š” ๋ฐฉ์‹์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ฝ”๋“œ ์ˆœ์ฐจ ์‹คํ–‰์„ ๋™๊ธฐ(Synchronous) ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ๋™๊ธฐ ๋ฐฉ์‹์€ ๊ฐ„๋‹จํ•˜๊ณ  ์ง๊ด€์ ์ด์ง€๋งŒ, ์ž‘์—…์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๊ฑฐ๋‚˜ ์‘๋‹ต์ด ๋Šฆ์–ด์ง€๋Š” ๊ฒฝ์šฐ์—๋Š” ์ „์ฒด์ ์ธ ์„ฑ๋Šฅ๊ณผ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์„œ๋ฒ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๊ณ  ์‘๋‹ต์„ ๋ฐ›์•„์•ผ ํ•˜๋Š” ์ž‘์—…์ด ์žˆ๋‹ค๋ฉด, ์‘๋‹ต์ด ์˜ฌ ๋•Œ๊นŒ์ง€ ๋‹ค๋ฅธ ์ž‘์—…์„ ํ•˜์ง€ ๋ชปํ•˜๊ณ  ๋Œ€๊ธฐํ•ด์•ผ ํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ํ”„๋กœ๊ทธ๋žจ์˜ ํ๋ฆ„์ด ๋ฉˆ์ถ”๊ฑฐ๋‚˜ ์ง€์—ฐ๋˜๊ฒŒ ๋œ๋‹ค.

Synchronous

๋”ฐ๋ผ์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์—ฌ๋Ÿฌ ์ž‘์—…์„ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋น„๋™๊ธฐ(Asynchronous) ๋ผ๋Š” ๊ฐœ๋…์„ ๋„์ž…ํ•˜์—ฌ, ํŠน์ • ์ž‘์—…์˜ ์™„๋ฃŒ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ์ž‘์—…์„ ๋™์‹œ์— ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์˜€๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ฐฐ์šฐ๋‹ค ๋ณด๋ฉด setTimeout() ํ•จ์ˆ˜๋‚˜ fetch() ํ•จ์ˆ˜๋ฅผ ์ ‘ํ•ด๋ณผ ๊ฒƒ์ด๊ณ , ์ด๋“ค์€ ๋น„๋™๊ธฐ๋กœ ๋™์ž‘ํ•œ๋‹ค๋Š” ์†Œ๋ฆฌ๋ฅผ ํ•œ๋ฒˆ ์ฏค์€ ๋“ค์–ด๋ณธ ์ ์ด ์žˆ์„ ๊ฒƒ์ด๋‹ค. ๋น„๋™๊ธฐ๋Š” ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๊ฐ€ ์ž‘์—…์„ ๋‹ค๋ฅธ ๊ณณ์— ์ธ๊ฐ€ํ•˜์—ฌ ์ฒ˜๋ฆฌ๋˜๊ฒŒ ํ•˜๊ณ , ๊ทธ ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ๋ฐ›์•„ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ, ์‰ฝ๊ฒŒ ๋งํ•ด ์ž‘์—…์„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์— ์š”์ฒญํ•˜์—ฌ ์ฒ˜๋ฆฌ๋˜๊ฒŒ ํ•˜์—ฌ ๋ฉ€ํ‹ฐ๋กœ ์ž‘์—…์„ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด๋ฉด ๋œ๋‹ค. 

Asynchronous

์„œ๋ฒ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๊ณ  ์‘๋‹ต์„ ๋ฐ›์•„์•ผ ํ•˜๋Š” ์ž‘์—…์ด ์žˆ๋‹ค๋ฉด, ์‘๋‹ต์ด ์˜ค๋Š” ๊ฒƒ๊ณผ ์ƒ๊ด€์—†์ด ๋‹ค๋ฅธ ์ž‘์—…์„ ๊ณ„์† ์ด์–ด๋‚˜๊ฐ€ ๋ณ‘๋ ฌ๋กœ ์ž‘์—…์„ ๋™์‹œ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•ด์ ธ ํ”„๋กœ๊ทธ๋žจ์˜ ํ๋ฆ„์ด ๋ฉˆ์ถ”๊ฑฐ๋‚˜ ์ง€์—ฐ๋˜์ง€ ์•Š๊ฒŒ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ Task๋“ค์ด ๋ณ‘๋ ฌ์ ์œผ๋กœ ๋™์‹œ์— ์ฒ˜๋ฆฌ๋˜๊ฒŒ ๋˜๊ณ  ์ด ์ฝ”๋“œ ์‹คํ–‰ ์‹œ๊ฐ„์€ ํš๊ธฐ์ ์œผ๋กœ ์ค„์–ด๋“ค๊ฒŒ ๋œ๋‹ค.


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

 

๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์˜ ์œ ์šฉ์„ฑ

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

ํ•˜์ง€๋งŒ ๋น„๋™๊ธฐ ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฟผ๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์‘๋‹ต์ด ์˜ฌ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ์—๋„ ๋‹ค๋ฅธ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ๊ฒฐ๊ณผ๊ฐ€ ์ฃผ์–ด์ง€๋Š”๋ฐ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋”๋ผ๋„ ๊ทธ ์‹œ๊ฐ„ ๋™์•ˆ ๋‹ค๋ฅธ ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ž์›์„ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋ ‡๊ฒŒ ๋น„๋™๊ธฐ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด, ๋Œ€๊ทœ๋ชจ ํŠธ๋ž˜ํ”ฝ์—์„œ๋„ ์•ˆ์ •์ ์œผ๋กœ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

๋Œ€ํ‘œ์ ์œผ๋กœ ์›น์—์„œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” Ajax ๊ธฐ์ˆ ์ด ์žˆ๋‹ค. ๋‹ค๋ฅธ ์„œ๋ฒ„์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ• ๋•Œ XMLHttpRequest ๊ฐ์ฒด๋‚˜ ํ˜น์€ fetch ๋ฉ”์„œ๋“œ๋กœ ์š”์ฒญ์„ํ•˜๊ฒŒ ํ•˜๋Š”๋ฐ, ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ์—๋„ ์‚ฌ์šฉ์ž์™€์˜ ์ธํ„ฐ๋ž™์…˜์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

// fetch ํ•จ์ˆ˜์— URL ์ „๋‹ฌ
fetch("https://jsonplaceholder.typicode.com/todos/1")
  .then(function(response) {
    return response.json(); // ์‘๋‹ต์„ JSON ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜
  })
  .then(function(data) {
    console.log(data); // JSON ๋ฐ์ดํ„ฐ๋ฅผ ์ถœ๋ ฅ
  })
  .catch(function(error) {
    console.error(error); // ์—๋Ÿฌ๋ฅผ ์ถœ๋ ฅ
  });

๋น„๋™๊ธฐ์˜ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ ์›๋ฆฌ

์•„๋งˆ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐœ๋ฐœ์ž๋ผ๋ฉด ํ•„์ˆ˜๋กœ ์ตํžˆ๋Š” ๊ฒƒ์ด ํ˜ธ์ถœ ์Šคํƒ๊ณผ ์ด๋ฒคํŠธ ๋ฃจํ”„ ์ผ ๊ฒƒ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์•„๋ž˜์™€ ๊ฐ™์€ ๊ทธ๋ฆผ์„ ๋ˆˆ๋น ์ง€๊ฒŒ ๋ด์™”์„ ๊ฒƒ์ด๋‹ค. ๋น„๋™๊ธฐ ํ•จ์ˆ˜์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ์ด๋ฒคํŠธ ๋ฃจํ”„์— ์˜ํ•ด์„œ Callback Queue์— ๋‹ด๊ธฐ๊ณ  ๋‹ค์‹œ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ์ธ Call Stack์— ๋‹ด๊ฒจ์„œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋™์ž‘ ์›๋ฆฌ ๊นŒ์ง€๋Š” ์•„๋งˆ ๋Œ€๋ถ€๋ถ„์˜ ๊ฐ•์˜์—์„œ ์ ‘ํ•ด๋ณด๊ณ  ๋„˜์–ด๊ฐ”์„ ๊ฒƒ์ด๋‹ค. 

js-Asynchronous

๊ทธ๋Ÿฐ๋ฐ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ์–ธ์–ด๋ผ๊ณ  ํ–ˆ๋Š”๋ฐ ์–ด๋–ป๊ฒŒ ์ž‘์—…(task)๋“ค์„ ๋™์‹œ์— ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋Š” ๊ฒƒ์ผ๊นŒ?

์ด์— ๋Œ€ํ•ด ์ •ํ™•ํžˆ ์„ค๋ช…ํ•˜์ง€ ๋ชปํ•˜๋Š” ๋…์ž๋ถ„๋“ค์€, ์•„๋งˆ ๋‹ค๋ฅธ ๊ณณ์—์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ด๋ฒคํŠธ ๋ฃจํ”„์™€ ํ˜ธ์ถœ ์Šคํƒ ๊ณผ์ •์„ ํ•™์Šตํ•˜๋Š”๋ฐ ์žˆ์–ด ๋†’์€ ํ™•๋ฅ ๋กœ Call Stack ์šฐ์ธก์— ์žˆ๋Š” Web APIs ์— ๋Œ€ํ•ด์„œ ๋Œ€์ถฉ ๋ณด๊ณ  ๋„˜์–ด๊ฐ”์„ ๊ฒƒ์ด๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์ฝœ ์Šคํƒ(Call Stack)์€ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ์ง€๋งŒ, ์„œ๋ฒ„์—๊ฒŒ ๋ฆฌ์†Œ์Šค๋ฅผ ์š”์ฒญํ•˜๊ฑฐ๋‚˜ ํŒŒ์ผ ์ž…์ถœ๋ ฅ ํ˜น์€ ํƒ€์ด๋จธ ๋Œ€๊ธฐ ์ž‘์—…์„ ์‹คํ–‰ํ•˜๋Š” Web APIs ๋“ค์€ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋™์‹œ ์ž‘์—… ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. (๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๋ฅผ ์ž˜ ๋ชจ๋ฅธ๋‹ค๋ฉด ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๋™์‹œ์— ์ฒ˜๋ฆฌ๋œ๋‹ค๊ณ  ์ดํ•ดํ•˜๋ฉด ๋œ๋‹ค)

js-Asynchronous

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

์ฆ‰, ๋ธŒ๋ผ์šฐ์ €๋ผ๋Š” ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”์ธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์Šค๋ ˆ๋“œ๋ฅผ ์ฐจ๋‹จํ•˜์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Web API์˜ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜์—ฌ ๋™์‹œ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ด๋‹ค.

๋งŒ์ผ ์•„๋ž˜์™€ ๊ฐ™์ด 3์ดˆ๋ฅผ ๋Œ€๊ธฐํ•˜๋Š” setTimeout ๋น„๋™๊ธฐ ํ•จ์ˆ˜์™€ ๊ทธ์™ธ ์ž‘์—…(Task)๋“ค์ด ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค๋ฉด, ์ด setTimeout ์ฝ”๋“œ๊ฐ€ Web APIs ๋“ค ์ค‘ ํƒ€์ด๋จธ ์ฒ˜๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” Timer API์— ๋„˜์–ด๊ฐ€์„œ 3000ms ๋ฐ€๋ฆฌ์ดˆ๋ฅผ ๋ณ‘๋ ฌ๋กœ ์ฒ˜๋ฆฌ๋˜๋ฉด์„œ, ๋™์‹œ์— ๋ฉ”์ธ ์ฝœ ์Šคํƒ์˜ Task1, Task2 ... ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

setTimeout(() => {
	console.log('5์ดˆ ๋Œ€๊ธฐ ์™„๋ฃŒ')
}, 3000);

Task1();
Task2();
Task3();

js-Asynchronous
๊ฐ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•˜๋‹ˆ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ์ด๋‹ค

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

 

๐Ÿ”„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ด๋ฒคํŠธ ๋ฃจํ”„ ๊ตฌ์กฐ & ๋™์ž‘ ์›๋ฆฌ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋น„๋™๊ธฐ์™€ ์ด๋ฒคํŠธ ๋ฃจํ”„ ๋ธŒ๋ผ์šฐ์ €์˜ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๋กœ ์ž‘์—…์„ ๋™์‹œ์— Javascript๋Š” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ์–ธ์–ด๋ผ๊ณ  ๋“ค์–ด๋ณธ ์ ์ด ์žˆ์„ ๊ฒƒ์ด๋‹ค. '์‹ฑ๊ธ€' ์Šค๋ ˆ๋“œ๋ผ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์ž‘์—…๋งŒ ์ˆ˜ํ–‰์ด ๊ฐ€๋Šฅํ•˜

inpa.tistory.com

 

์™œ ์™„๋ฒฝํ•œ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋”ฉ์ด ์•„๋‹Œ๊ฐ€

setTimeout์„ ์ด์šฉํ•ด ๋น„๋™๊ธฐ์˜ ๋ฉ€ํ‹ฐ ์ž‘์—… ์ฒ˜๋ฆฌ๋ฅผ ์„ค๋ช…ํ–ˆ์ง€๋งŒ, ์‚ฌ์‹ค ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋น„๋™๊ธฐ๋Š” ์™„๋ฒฝํ•œ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋”ฉ์ด ์•„๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ํƒ€์ด๋จธ 3000ms ๋งŒ ๋ณ‘๋ ฌ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๊ณ , ๊ทธ ์•ˆ์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ์‹คํ–‰ ์ฝ”๋“œ๋Š” ์ถ”ํ›„์— ์ด๋ฒคํŠธ ๋ฃจํ”„์— ์ธํ•ด ์ฝœ ์Šคํƒ(Call Stack)์— ๋“ค์–ด๊ฐ€ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ๋กœ ์ฒ˜๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

js-Asynchronous

setTimeout ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ fetch ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ด๋‹ค. ์„œ๋ฒ„์— ์š”์ฒญํ•ด์„œ ๋ฆฌ์†Œ์Šค๋ฅผ ๋‹ค์šด๋กœ๋“œ ํ•˜๋Š” ๊ฒƒ์€ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๋กœ ๋ณ‘๋ ฌ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜์ง€๋งŒ, ์š”์ฒญ์ด ์™„๋ฃŒ๋˜๊ณ  ๋‚˜์„œ์˜ ํ›„์ฒ˜๋ฆฌ then ํ•ธ๋“ค๋Ÿฌ์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ์ฝœ ์Šคํƒ์— ๋ณ„๋„๋กœ ์ฒ˜๋ฆฌ๋œ๋‹ค.

js-Asynchronous

๋ณ‘๋ ฌ๋กœ ๋™์‹œ ์ฒ˜๋ฆฌํ• ๊บผ๋ฉด ์ „์ฒด๋ฅผ ์™„์ „ํžˆ ์ฒ˜๋ฆฌํ•  ๊ฒƒ์ด์ง€ ์™œ ์ด๋Ÿฐ์‹์œผ๋กœ ๋ฒˆ๊ฑฐ๋กญ๊ฒŒ ๋‚˜๋ˆˆ ๊ฒƒ์ผ๊นŒ?

์•„๋งˆ ์ž๋ฐ”์˜ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ(Thread) ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•ด๋ณด์‹  ๋…์ž๋ถ„๋“ค์€ ์ด์— ๋Œ€ํ•œ ์ด์œ ๋ฅผ ์•Œ๊ณ  ์žˆ์„ ๊ฒƒ์ด๋‹ค. ์™„์ „ํ•œ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋Š” ์„ฑ๋Šฅ ๋งŒํผ์€ ์ด๋“์„ ์–ป์„์ˆ˜ ์žˆ์„์ง€๋„ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ, ํ•ญ์ƒ ๋™์‹œ์„ฑ ๋ฌธ์ œ๊ฐ€ ๋”ฐ๋ผ์™€ synchronized ์ฒ˜๋ฆฌ๊ฐ€ ์ˆ˜๋ฐ˜๋œ๋‹ค๋Š” ์‚ฌ์‹ค ๋ง์ด๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋น„๋™๊ธฐ๋งŒ ๋ฐฐ์šฐ์‹  ๋ถ„๋“ค์€ ์ด์— ๋Œ€ํ•ด ์ž˜ ์™€๋‹ฟ์ง€ ์•Š์„ ์ˆ˜ ์žˆ์ง€๋งŒ, ์ด synchronized ์ฒ˜๋ฆฌ๋ฅผ ์ž˜๋ชปํ•˜๋ฉด ์˜คํžˆ๋ ค ์„ฑ๋Šฅ ๊ฐ์†Œ๊ฐ€ ์ผ์–ด๋‚˜๊ธฐ ๋•Œ๋ฌธ์— ๊ณ ๋‚œ์ด๋„์˜ ์ง€์‹๊ณผ ์‹ค๋ ฅ์„ ์š”๊ตฌํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” ๋™์‹œ์„ฑ ๋ฌธ์ œ์— ๋Œ€ํ•ด ์‹ฌํ”Œํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋น„๋™๊ธฐ ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ๋ฐฉ์‹์„ ์ฑ„ํƒํ•˜์˜€๋‹ค๊ณ  ๋ณด๋ฉด ๋œ๋‹ค. ์ด๋ฐ–์— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์–ธ์–ด๋ฅผ ์„ค๊ณ„ํ•  ๊ณผ๊ฑฐ ๋‹น์‹œ์—๋Š” ๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์„œ ์ปดํ“จํ„ฐ๋Š” ๋ณดํŽธ์ ์ด์ง€ ์•Š์•˜์„ ๋ฟ๋”๋Ÿฌ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ฒ˜๋ฆฌํ•  ์ฝ”๋“œ ์–‘๋„ ์ ์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋ผ๋Š” ์ด์œ ๋„ ์žˆ๋‹ค.

 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋„ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋”ฉ์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์–ด

๊ทธ๋Ÿผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์˜์›ํžˆ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋”ฉ์„ ๊ตฌํ˜„ ๋ชปํ•˜๋Š” ๊ฒƒ์ผ๊นŒ? ๊ทธ๋ž˜์„œ ๋‚˜์˜จ ๊ฒƒ์ด ๋ฐ”๋กœ ์›น ์›Œ์ปค(web workers)์ด๋‹ค. ์›น ์›Œ์ปค๋ฅผ ์ด์šฉํ•˜๋ฉด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋„ ์ž๋ฐ”์˜ ์Šค๋ ˆ๋“œ์™€ ๊ฐ™์ด ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•  ์ˆ˜๊ฐ€ ์žˆ๋‹ค.

// ์›น ์›Œ์ปค ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ(worker.js)
self.addEventListener('message', function(e) {
  // ๋ฉ”์ธ ์Šคํฌ๋ฆฝํŠธ๋กœ๋ถ€ํ„ฐ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์œผ๋ฉด ์‹คํ–‰ํ•  ํ•จ์ˆ˜
  var result = "Hello " + e.data;
  self.postMessage(result); // ๊ฒฐ๊ณผ๋ฅผ ๋ฉ”์ธ ์Šคํฌ๋ฆฝํŠธ๋กœ ์ „์†ก
}, false);
// ๋ฉ”์ธ ์Šคํฌ๋ฆฝํŠธ์—์„œ ์›น ์›Œ์ปค ์‚ฌ์šฉ ์˜ˆ์‹œ
var worker = new Worker('./worker.js'); // ์›น ์›Œ์ปค ๊ฐ์ฒด ์ƒ์„ฑ

worker.addEventListener('message', function(e) {
  // ์›น ์›Œ์ปค๋กœ๋ถ€ํ„ฐ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์œผ๋ฉด ์‹คํ–‰ํ•  ํ•จ์ˆ˜
  console.log(e.data); // ๊ฒฐ๊ณผ ์ถœ๋ ฅ
}, false);

worker.postMessage('World'); // ์›น ์›Œ์ปค์—๊ฒŒ ๋ฉ”์‹œ์ง€ ์ „์†ก

web-worker

Node.js์—์„œ๋„ Worker_Threads ๋ชจ๋“ˆ๋กœ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ธŒ๋ผ์šฐ์ €์˜ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ

์ด๋Ÿฌํ•œ ๋น„๋™๊ธฐ ์›๋ฆฌ๋Š” ๊ผญ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์–ธ์–ด ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ธŒ๋ผ์šฐ์ €์˜ HTML ๋งˆํฌ์—… ์–ธ์–ด์—์„œ๋„ ๋™์ผํ•˜๊ฒŒ ์ ์šฉ๋œ๋‹ค. HTML ์˜ ํŒŒ์‹ฑ ๋™์ž‘ ๋ฐฉ์‹์„ ์˜ˆ๋กœ ๋“ค ์ˆ˜ ์žˆ๋Š”๋ฐ, ์•„๋ž˜์™€ ๊ฐ™์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด <script> ํƒœ๊ทธ๋ฅผ HTML ํŒŒ์ผ์˜ <head> ํƒœ๊ทธ ์•ˆ์— ๋„ฃ์œผ๋ฉด, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์ด ๋‹ค์šด๋กœ๋“œ๋˜๊ณ  ์‹คํ–‰๋  ๋•Œ๊นŒ์ง€ HTML ํŒŒ์‹ฑ์ด ์ค‘๋‹จ๋˜๊ฒŒ ๋œ๋‹ค. ์ด๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์›น ํŽ˜์ด์ง€์˜ ๋‚ด์šฉ์„ ๋ณด๋Š”๋ฐ ์˜ค๋ž˜ ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๊ฒŒ ๋œ๋‹ค.

<!DOCTYPE html>
<html>
<head>
  <script src="script1.js"></script>
  <script src="script2.js"></script>
  <script src="script3.js"></script>
</head>
<body>
  <h1>์›น ํŽ˜์ด์ง€ ์ œ๋ชฉ</h1>
  <p>์›น ํŽ˜์ด์ง€ ๋‚ด์šฉ</p>
</body>
</html>

๋ธŒ๋ผ์šฐ์ €์˜ ๋น„๋™๊ธฐ
Synchronous

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์— ๋น„๋™๊ธฐ ํ•จ์ˆ˜๊ฐ€ ์žˆ๋‹ค๋ฉด html์—๋„ ๋น„๋™๊ธฐ๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ์ˆ ์ด ์žˆ๋‹ค. ๋ฐ”๋กœ <script> ํƒœ๊ทธ์— ๋ถ™์ด๋Š” async ๊ณผ defer ํ‚ค์›Œ๋“œ ์ด๋‹ค. async์™€ defer ์†์„ฑ์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด HTML ํŒŒ์‹ฑ๊ณผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋‹ค์šด๋กœ๋“œ๊ฐ€ ๋™์‹œ์— ์ง„ํ–‰๋˜์–ด ํŽ˜์ด์ง€ ๋กœ๋”ฉ ์†๋„๋ฅผ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

<!DOCTYPE html>
<html>
<head>
  <script async src="script1.js"></script>
  <script async src="script2.js"></script>
  <script async src="script3.js"></script>
</head>
<body>
  <h1>์›น ํŽ˜์ด์ง€ ์ œ๋ชฉ</h1>
  <p>์›น ํŽ˜์ด์ง€ ๋‚ด์šฉ</p>
</body>
</html>

html-async
Asynchronous

๊ทธ๋ฆผ์„ ๋น„๊ตํ•˜๋ฉด ๋˜‘๊ฐ™์€ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ ์žˆ์–ด Asynchronous๊ฐ€ ์ด ๊ฑธ๋ฆฐ Time์ด ๋” ์ ์€๊ฑธ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์ด ์—ญ์‹œ ์œ„์—์„œ ๋ฐฐ์šด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ Web APIs ์›๋ฆฌ์™€ ๊ฐ™์ด, ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ ๋™์ž‘ ์ž์ฒด๋ฅผ ๋น„๋™๊ธฐ๋กœ ๋ธŒ๋ผ์šฐ์ € ๋‚ด๋ถ€์˜ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ์— ์–‘๋„ํ•˜๊ณ  ๊ณ„์† html ํŒŒ์‹ฑ์„ ์ด์–ด๋‚˜๊ฐ€๋ฉด์„œ ๋™์‹œ์— ํŒŒ์ผ์„ ๋‹ค์šด๋ฐ›๋Š” ์›๋ฆฌ์ด๋‹ค.

HTML์˜ ๋น„๋™๊ธฐ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์ฝœ ์Šคํƒ๊ณผ ์ด๋ฒคํŠธ ๋ฃจํ”„ ๋™์ž‘๊ณผ๋Š” ๋ณ„๊ฐœ๋กœ ๋ธŒ๋ผ์šฐ์ € ๋‚ด๋ถ€ ๊ตฌํ˜„์— ์˜์กดํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

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


๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์˜ ๋ฌธ์ œ์ 

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

์‰ฝ๊ฒŒ ์˜ˆ๋ฅผ ๋“ค์–ด๋ณด๋ฉด ์•„๋ž˜์˜ html์˜ ์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋Š” ์—๋Ÿฌ๋ฅผ ์ผ์œผํ‚ค๊ฒŒ ๋œ๋‹ค. ์™œ๋ƒํ•˜๋ฉด $('body').appned() ์ฝ”๋“œ๋Š” ์ œ์ด์ฟผ๋ฆฌ ์ „์šฉ ์ฝ”๋“œ๋กœ์„œ ์ œ์ด์ฟผ๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒŒ์ผ์ด ๋‹ค์šด์„ ๋ชจ๋‘ ๋ฐ›์€ ์ƒํƒœ์—ฌ์•ผ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ํ•˜์ง€๋งŒ ์ œ์ด์ฟผ๋ฆฌ ์†Œ์ŠคํŒŒ์ผ ํ˜ธ์ถœ์„ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ง„ํ–‰ํ•ด ์†Œ์ŠคํŒŒ์ผ์ด ๋‹ค์šด๋กœ๋“œ ๋˜๊ธฐ๋„ ์ „์— ์ œ์ด์ฟผ๋ฆฌ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ–ˆ์œผ๋‹ˆ ์—๋Ÿฌ๊ฐ€ ์ผ์–ด๋‚˜๋Š”๊ฒŒ ๋‹น์—ฐํ•œ ๊ฒƒ์ด๋‹ค. (๋งŒ์ผ ์†Œ์ŠคํŒŒ์ผ ๋‹ค์šด์„ ์—„์ฒญ ๋นจ๋ฆฌํ•œ๋‹ค๋ฉด ์—๋Ÿฌ๊ฐ€ ์ผ์–ด๋‚˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค)

<script async src='https://code.jquery.com/jquery-3.6.0.min.js'></script>
<script>
	// ์ œ์ด์ฟผ๋ฆฌ ํŒŒ์ผ์„ ๋น„๋™๊ธฐ์ ์œผ๋กœ ํ˜ธ์ถœํ•˜๊ณ  ๋ฐ”๋กœ ์ œ์ด์ฟผ๋ฆฌ ์ „์šฉ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ ์‹œ์ผฐ๊ธฐ ๋•Œ๋ฌธ์— ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋‹ค
    $('body').append('<h1>Hello World</h1>'); // ! ERROR
</script>

์ด๋ฐ–์—๋„ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์„๋•Œ ๋น„๋™๊ธฐ ํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ์— ์˜ํ–ฅ์„ ์ค„ ๋•Œ๋„ ๋ฌธ์ œ๊ฐ€ ๋œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ ์ฝ”๋“œ๋Š” ์„œ๋ฒ„์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์กฐํšŒํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋กœ์ง์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ‘œํ˜„ํ•œ ์˜ˆ์ œ์ด๋‹ค. getDB() ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์กฐํšŒํ•˜๋Š”๋ฐ, ์ด๋•Œ ์กฐํšŒ ์‹œ๊ฐ„์ด 3์ดˆ ๊ฑธ๋ฆฐ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž. ๊ทธ๋ฆฌ๊ณ  DB๋กœ๋ถ€ํ„ฐ ์‘๋‹ต์„ ๋ฐ›๊ฒŒ ๋˜๋ฉด data ๋ณ€์ˆ˜์— ์ €์žฅํ•˜๊ณ  ๊ฐ’์„ ๋‘๋ฐฐ ๊ณฑ์…ˆ ์—ฐ์‚ฐ ํ›„ ์ถœ๋ ฅํ•˜๋ ค๊ณ  ํ•œ๋‹ค.

function getDB() {
    let data;
    // ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋Š” 3์ดˆ ๊ฑธ๋ฆฐ๋‹ค๊ณ  ๊ฐ€์ • (๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ)
    setTimeout(() => {
        data = 100;
    }, 3000);

    return data;
}

function main() {
    let value = getDB();
    value *= 2;
    console.log('value์˜ ๊ฐ’ : ', value);
}
main(); // ๋ฉ”์ธ ์Šค๋ ˆ๋“œ ์‹คํ–‰

js-async

ํ•˜์ง€๋งŒ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•ด ๋ณด๋‹ˆ data ๋ณ€์ˆ˜์— NaN์ด๋ผ๋Š” ์ด์ƒํ•œ ๊ฐ’์ด ๋“ค์–ด๊ฐ€ ์žˆ๋‹ค. ์™œ ์ด๋Ÿฐ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์™”์„๊นŒ? ๊ทธ ์ด์œ ๋Š” ๋น„๋™๊ธฐ ํ•จ์ˆ˜์ธ setTimeout ํ•จ์ˆ˜๊ฐ€ 3์ดˆ ๋™์•ˆ ๋Œ€๊ธฐํ•˜๋Š” ๋™์•ˆ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๋‹ค์Œ ์ฝ”๋“œ์ธ console.log(data)๋ฅผ ์‹คํ–‰ํ•˜ ์˜€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด๋•Œ data ๋ณ€์ˆ˜์—๋Š” ์•„์ง ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ์—ฌ๊ธฐ์— ์—ฐ์‚ฐ์„ ํ•˜๋‹ˆ ์ด์ƒํ•œ ๊ฐ’์ด ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

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


๋น„๋™๊ธฐ๋ฅผ ์•Œ๋งž๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ฒ•

 

๋น„๋™๊ธฐ์™€ ์ฝœ๋ฐฑ ํ•จ์ˆ˜

ํ”ํžˆ ๋น„๋™๊ธฐ๋ฅผ ๋‹ค๋ฃฐ๋•Œ ์ž์ฃผ ์—ฎ์—ฌ ๋“ฑ์žฅํ•˜๋Š” ๊ฐœ๋…์ด ์ฝœ๋ฐฑ(callback) ํ•จ์ˆ˜์ด๋‹ค. ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์ผ๊ธ‰ ๊ฐ์ฒด ํŠน์„ฑ์„ ์ด์šฉํ•ด ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜์— ํ•จ์ˆ˜ ์ž์ฒด๋ฅผ ๋„˜๊ฒจ, ํ•จ์ˆ˜ ๋‚ด์—์„œ ๋งค๊ฐœ๋ณ€์ˆ˜ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ธฐ๋ฒ•์„ ๋งํ•œ๋‹ค.

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

function getDB(callback) {
    // ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ๋ถ€ํ„ฐ 3์ดˆ ํ›„์— ๋ฐ์ดํ„ฐ ๊ฐ’์„ ๋ฐ›์•„์˜จ ํ›„, ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ํ˜ธ์ถœ
    setTimeout(() => {
        const value = 100;
        callback(value);
    }, 3000);
}

function main() {
    // ํ˜ธ์ถœํ•  ์ž‘์—…์— ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ๋„˜๊ธด๋‹ค
    getDB(function(value) {
        let data = value * 2;
        console.log('data์˜ ๊ฐ’ : ', data);
    });
}
main();

js-async

์œ„ ์ฝ”๋“œ๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ๋‚ด์—์„œ data ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ๋ฐ›์•„ ์ถœ๋ ฅํ•˜๋ฏ€๋กœ, ๋น„๋™๊ธฐ ์ž‘์—…์ด ์™„๋ฃŒ๋œ ํ›„์— ์ถœ๋ ฅ๋˜๊ฒŒ ๋œ๋‹ค. ์ฆ‰, ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ๋น„๋™๊ธฐ ํ•จ์ˆ˜์—์„œ ์ž‘์—… ๊ฒฐ๊ณผ๋ฅผ ์ „๋‹ฌ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋˜์–ด ์ž‘์—… ์ˆœ์„œ๋ฅผ ๋งž์ถœ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ๋”ฐ๋ผ์„œ ๋น„๋™๊ธฐ ํ•จ์ˆ˜์™€ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ์„œ๋กœ ๋ฐ€์ ‘ํ•œ ๊ด€๊ณ„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๋‹ค๋งŒ ๋„ˆ๋ฌด ๋ณต์žกํ•˜๊ฒŒ ์–ฝํžŒ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋•Œ๋ฌธ์— ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ๋ฐฉ์‹์€ ์ฝ”๋“œ ๋ณต์žก๋„๋ฅผ ์ฆ๊ฐ€์‹œ์ผœ, ๊ฐœ๋ฐœ์ž๊ฐ€ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ๋ฆ„์„ ์ฝ๊ธฐ ์–ด๋ ค์›Œ์ง€๋Š” ๋“ฑ์˜ ๋ฌธ์ œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์–ด ์ž˜๋ชปํ•˜๋ฉด ์ฝœ๋ฐฑ ์ง€์˜ฅ(callback hell) ์— ๋น ์งˆ์ˆ˜ ์žˆ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค. ์กฐ๊ธˆ ์–ต์ง€์Šค๋Ÿฌ์šด ์ฝ”๋“œ์ง€๋งŒ ์ •๋ง๋กœ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋“ค์„ ๋ณต์žกํ•˜๊ฒŒ ์ค‘์ฒฉํ•˜์—ฌ ๊ตฌ์„ฑํ•œ๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ '์•„๋ด๊ฒ'์— ๋งž์•„ ํ—ˆ๋ฆฌ๊ฐ€ ๊ตฌ๋ถ€๋Ÿฌ์ง„ ์šฐ์Šค๊ฝ ์Šค๋Ÿฌ์šด ์ฝ”๋“œ ๋ชจ์–‘์ด ๋˜๊ฒŒ ๋œ๋‹ค.

callback-hell


๋น„๋™๊ธฐ์™€ ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด

์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ์—„์—ฐํžˆ ๋งํ•˜์ž๋ฉด ๋น„๋™๊ธฐ๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์ผ์ข…์˜ 'ํŽธ๋ฒ•' ๊ฐ™์€ ๊ฒƒ์ด์ง€ ์ •์‹์œผ๋กœ ์ง€์›ํ•˜๋Š” ๋น„๋™๊ธฐ ์ „์šฉ ํ•จ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ Promise ๊ฐ์ฒด๋Š” ์ด๋Ÿฌํ•œ ํ•œ๊ณ„์ ์„ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ์ „์šฉ ๊ฐ์ฒด๋กœ์„œ ํƒ„์ƒํ•˜์˜€๋‹ค. Promise๋Š” ๋น„๋™๊ธฐ ์ž‘์—…์˜ ์„ฑ๊ณต ๋˜๋Š” ์‹คํŒจ์™€ ๊ทธ ๊ฒฐ๊ณผ๊ฐ’์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ์ฒด์ด๋‹ค. ๊ทธ๋ž˜์„œ Promise๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋น„๋™๊ธฐ ์ž‘์—…์„ ์‰ฝ๊ณ  ๊น”๋”ํ•˜๊ฒŒ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

function getDB() {
  return new Promise((resolve) => {
    setTimeout(() => {
      const value = 100;
      resolve(value);
    }, 3000);
  });
}

function main() {
  getDB()
    .then((value) => {
      let data = value * 2;
      console.log('data์˜ ๊ฐ’ : ', data);
    })
    .catch((error) => {
      console.error(error);
    });
}

main();
 

๐Ÿ“š ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Promise ๊ฐœ๋… & ๋ฌธ๋ฒ• ์ •๋ณตํ•˜๊ธฐ

์ฝœ๋ฐฑ ์ง€์˜ฅ์„ ํƒˆ์ถœํ•˜๋Š” ์ƒˆ๋กœ์šด ๋ฌธ๋ฒ• ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ '๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ' ๋ž€ ํ˜„์žฌ ์‹คํ–‰์ค‘์ธ ์ž‘์—…๊ณผ๋Š” ๋ณ„๋„๋กœ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ค๋Š” ์ž‘์—…์€ ์‹œ๊ฐ„

inpa.tistory.com


๋น„๋™๊ธฐ์™€ async / await

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

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ Promise๋‚˜ async/await์™€ ๊ฐ™์€ ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋„ ์ด๋Ÿฐ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์˜ ํ๋ฆ„์„ ์ข€ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ์ธ์ง€ํ•˜๊ณ ์ž ํ•˜๋Š” ๋…ธ๋ ฅ์ธ ๊ฒƒ์ด๋‹ค.
function getDB() {
    return new Promise((resolve, reject) => {
        // ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋Š” 3์ดˆ ๊ฑธ๋ฆฐ๋‹ค๊ณ  ๊ฐ€์ • (๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ)
        setTimeout(() => {
            const value = 100;
            resolve(value); // Promise ๊ฐ์ฒด ๋ฐ˜ํ™˜
        }, 3000);
    });
}

async function main() {
    let data = await getDB(); // await ํ‚ค์›Œ๋“œ๋กœ Promise๊ฐ€ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ๋‹ค
    data *= 2;
    console.log('data์˜ ๊ฐ’ : ', data);
}
main(); // ๋ฉ”์ธ ์Šค๋ ˆ๋“œ ์‹คํ–‰
 

๐Ÿ“š ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Async/Await ๊ฐœ๋… & ๋ฌธ๋ฒ• ์ •๋ณต

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

inpa.tistory.com

 

๊ทธ๋Ÿผ ๋ฌด์กฐ๊ฑด await๊ฐ€ ๋‹ต์ธ๊ฐ€?

์ด๋ ‡๊ฒŒ ๋ณด๋ฉด async/await์ด ๋น„๋™๊ธฐ๋ฅผ ์ฒ˜๋ฆฌํ•จ์— ์žˆ์–ด callback์ด๋‚˜ Promise ๋ฐฉ์‹๋ณด๋‹ค ํ›จ์”ฌ ์ข‹์•„ ๋ณด์ด์ง€๋งŒ, ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์— ๋”ฐ๋ผ์„œ๋Š” ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•ด์งˆ ์ˆ˜๋„ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์— ๋Œ€ํ•œ 3๊ฐ€์ง€ ๋ฐฉ์‹์€ ์šฉ๋„์— ๋งž์ถฐ์„œ ์ ์ ˆํžˆ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. 

์™œ๋ƒํ•˜๋ฉด callback ๋ฐฉ์‹์€ ๋ณ„ ๋‹ค๋ฅธ ํ‚ค์›Œ๋“œ ์—†์ด๋„ ์ •๋ง ๋‹จ์ˆœํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ๋ฒ•์ด๊ธฐ ๋•Œ๋ฌธ์—, ์ฝœ๋ฐฑ ์ง€์˜ฅ์„ ๋งž์ดํ•  ์ •๋„์˜ ๋ณต์žกํ•œ ์ƒํ™ฉ์ด ์•„๋‹ ๋•Œ๋ฉด ์˜คํžˆ๋ ค ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ€๋…์„ฑ์ด ์ข‹๋‹ค. ๋Œ€ํ‘œ์ ์ธ ์˜ˆ๋กœ Node.js์˜ Express ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ์„œ๋ฒ„ ๋ผ์šฐํŒ…์„ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์„ ์ œ๊ณตํ•œ๋‹ค.

const express = require("express"); // Express ๋ชจ๋“ˆ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
const app = express(); // Express ์•ฑ ๊ฐ์ฒด ์ƒ์„ฑ

// /home url ๊ฒฝ๋กœ์— GET ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ์ด์— ๋Œ€ํ•œ ๋ผ์šฐํŒ… ์ •์˜
app.get("/home", function (req, res) {
  // ์‘๋‹ต ๋ณด๋‚ด๊ธฐ
  res.send("Hello, Express!");
});

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


# ์ฐธ๊ณ ์ž๋ฃŒ

https://velog.io/@nittre/%EB%B8%94%EB%A1%9C%ED%82%B9-Vs.-%EB%85%BC%EB%B8%94%EB%A1%9C%ED%82%B9-%EB%8F%99%EA%B8%B0-Vs.-%EB%B9%84%EB%8F%99%EA%B8%B0

https://dev.to/lydiahallie/javascript-visualized-event-loop-3dif

https://medium.com/sjk5766/javascript-%EB%B9%84%EB%8F%99%EA%B8%B0-%ED%95%B5%EC%8B%AC-event-loop-%EC%A0%95%EB%A6%AC-422eb29231a8