๐ŸŽ„ ์„ฑ์žฅ์ผ์ง€ 4.0

์ฑ… ํ–‰๋ณตํ•œ ์ด๊ธฐ์ฃผ์˜์ž(์›จ์ธ ๋‹ค์ด์–ด)์˜ ๋‚ด์šฉ์— ์ž๊ทน๋ฐ›์•„ ์‹œ์ž‘ํ•˜๋Š” ์†Œ๋ฐ•ํ•œ ์„ฑ์žฅ๊ธฐ๋ก

์‚ด์•„์žˆ๋Š” ๊ฝƒ๊ณผ ์ฃฝ์€ ๊ฝƒ์€ ์–ด๋–ป๊ฒŒ ๊ตฌ๋ณ„ํ•˜๋Š”๊ฐ€?
์„ฑ์žฅํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด ์‚ด์•„ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.
์ƒ๋ช…์˜ ์œ ์ผํ•œ ์ฆ๊ฑฐ๋Š” ์„ฑ์žฅ์ด๋‹ค!

๐ŸŒณ (1.0)ํ‚ค์›Œ๋“œ
์ตœ๋Œ€ํ•œ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ •๋ฆฌ, ์ถ”ํ›„์— ๋ณด๋ฉด์„œ ์Šค์Šค๋กœ ์„ค๋ช…
๐Ÿ‰ (2.0)๊ฒฝํ—˜ ์œ„์ฃผ๋กœ
๋‹จ์ˆœ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ๋ณด๋‹ค ๋ฌด์—‡์„ ๋ฐฐ์› ๊ณ  ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ–ˆ๋Š”์ง€ ์งง๊ณ  ๊ฐ„๋‹จํ•˜๊ฒŒ ์ž‘์„ฑ
โ„๏ธ (3.0)์ •ํ•ด์ง„ ํ…œํ”Œ๋ฆฟ์— ๋งž์ถฐ์„œ
ํ‚ค์›Œ๋“œ, ๊ฒฝํ—˜ ๋ชจ๋‘ ์ข‹๋‹ค. ๋‹ค๋งŒ ๋งค์ผ ์ž‘์„ฑํ•˜๊ธฐ๋กœ ๋งˆ์Œ ๋จน์€๋งŒํผ ํ•ต์‹ฌ๋งŒ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ…œํ”Œ๋ฆฟ์„ ์ž‘์„ฑ
(3.1)230102๋ถ€ํ„ฐ ์‹œ์ž‘๋˜๋Š” ํ•™์Šต์— ๊ด€ํ•œ ๋‚ด์šฉ ์ถ”๊ฐ€
(3.2)230313๋ถ€ํ„ฐ ์ข€๋” ๊ฒฝํ—˜, ๊ฐ์ • ์œ„์ฃผ์˜ ๋‚ด์šฉ๋„ ๋‹ด๊ธฐ!
๐ŸŒพ (4.0)ํ•™์Šต ํ‚ค์›Œ๋“œ์—์„œ ์ตœ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ์ •๋ณด ์ œ๊ณต, ๊ณ ๋ฏผ์—์„œ ๋‚ด ๊ฒฝํ—˜์„ ์ž์„ธํžˆ ์ ์ž!

๐Ÿ”‘ ์˜ค๋Š˜์˜ ํ•™์Šต ํ‚ค์›Œ๋“œ

๋™๊ธฐ(synchronous)?

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

๋น„๋™๊ธฐ(asynchronous)?

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

setTimeout์˜ ๋™์ž‘์›๋ฆฌ?

setTimeout(() => console.log('๋น„๋™๊ธฐ์ž…๋‹ˆ๋‹ค.'), 10000);

setTimeout์€ ๋ธŒ๋ผ์šฐ์ €์˜ V8 ์—”์ง„ ์ž์ฒด์— ๋‚ด์žฅ๋˜์–ด์žˆ๋Š” ํ•จ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋‹ค. ์›น ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ œ๊ณตํ•˜๋Š” api์ธ WEB API ์ค‘ ํ•˜๋‚˜์ด๋‹ค. ์‹คํ–‰๋˜๋ฉด 10000ms ์ฆ‰, 10์ดˆ ๋’ค์— cb(callback) ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•ด๋‹ฌ๋ผ๋Š” ์ด๋ฒคํŠธ๊ฐ€ ๋“ฑ๋ก๋˜๊ณ  10์ดˆ ๋’ค์— cb๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

์•„๋ž˜์˜ ๋ง์„ ์ดํ•ดํ•ด๋ณด๊ธฐ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์‹ฑ๊ธ€ ์“ฐ๋ ˆ๋“œ ๊ธฐ๋ฐ˜์ด๋ฉฐ ๋…ผ ๋ธ”๋กœํ‚น ๋ฐฉ์‹์˜ ๋น„๋™๊ธฐ์ ์ธ ๋™์‹œ์„ฑ ์–ธ์–ด์ด๋ฉฐ ์ฝœ ์Šคํƒ, ์ด๋ฒคํŠธ ๋ฃจํ”„์™€ ์ฝœ๋ฐฑ ํ ๊ทธ๋ฆฌ๊ณ  ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋‹ค๋ฅธ API๋“ค์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์‹ฑ๊ธ€ ์“ฐ๋ ˆ๋“œ์ด์ง€๋งŒ, ์‹คํ–‰๋˜๋Š” ํ™˜๊ฒฝ(๋ธŒ๋ผ์šฐ์ €, nodejs ๋“ฑ)์—์„œ ์ œ๊ณตํ•˜๋Š” event loop, callback queue๋ฅผ ํ†ตํ•ด ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” ๋™์‹œ์„ฑ์€ ์šฐ๋ฆฌ๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ๋น„๋™๊ธฐ ๋กœ์ง์ด ๋™์‹œ์— ์‹คํ–‰๋˜๋Š” ์„ฑ์งˆ์„ ๋งํ•œ๋‹ค.(๋™๊ธฐ = ๋™์‹œ์— ์ผ์–ด๋‚œ๋‹ค, ๋น„๋™๊ธฐ = ๋™์‹œ์— ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค ์˜ ๊ฐœ๋…์€ ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ์ด ๊ฐ™์€ ์ž๋ฆฌ์—์„œ ์ผ์–ด๋‚˜๊ณ  ๋ง๊ณ ๋ฅผ ๋งํ•œ๋‹ค.)

JSON(JavaScript Object Notation)

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

fetch api

  • ๊ธฐ์กด์—๋Š” XMLHTTPRequest ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ํ†ต์‹ ์„ ์ง„ํ–‰ํ•˜์˜€๋‹ค.
  • ์ ์  ๋น„๋™๊ธฐ ์š”์ฒญ์ด ๋” ๋ณต์žกํ•˜๊ณ  ์ฆ๊ฐ€๋˜๋ฉด์„œ, ๋น„๋™๊ธฐํ†ต์‹  ๋กœ์ง์— ๋ณด๊ธฐ ์ข‹์€ ํŒจํ„ด์ด ์ ์šฉ๋˜๊ณ  ์žˆ๋‹ค.
  • fetch api๋Š” ํ”„๋กœ๋ฏธ์Šค ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ ๋กœ์ง์„ ์ข€๋” ๋™๊ธฐ์ ์œผ๋กœ ๋ณด์ด๊ฒŒ๋” ํ•ด์ค€๋‹ค.(๊ฐ€๋…์„ฑ์„ ๋†’์—ฌ์ค€๋‹ค.)

Promise ํŒจํ„ด

  • Promise ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ๋™๊ธฐ์ ์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์—ฌ์ฃผ๋Š” ํŒจํ„ด์ด๋‹ค.

Promise: all vs allSettled

  • Promise.all(): ๋ชจ๋“  Promise ๊ฐ์ฒด๊ฐ€ fulfilled๋˜๋ฉด resolveํ•œ ๊ฐ’๋“ค์˜ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜. ๋‹จ, ํ•˜๋‚˜๋ผ๋„ ์—๋Ÿฌ ๋ฐœ์ƒ ์‹œ ์ฆ‰์‹œ rejectํ•œ ๊ฐ’ ๋ฐ˜ํ™˜.
  • Promise.allSettled(): fulfilled์™€ rejected ์ƒ๊ด€์—†์ด ๋ชจ๋“  Promise ๊ฐ์ฒด๊ฐ€ settled๊ฐ€ ๋˜๋ฉด ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์ค€๋‹ค.

Promise: race vs any

  • Promise.race(): fulfilled๋“  rejected๋“  ๊ทธ์ € ๊ฐ€์žฅ ๋จผ์ € settled๋œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • Promise.any(): ๋จผ์ € ์ฒ˜๋ฆฌ๋œ ์ƒํƒœ๋“ค ์ค‘์—์„œ fulfilled์ธ ์ƒํƒœ๋งŒ ๋ฐ˜ํ™˜ํ•œ๋‹ค.(๋งŒ์•ฝ ๋ชจ๋“  Promise์—์„œ fulfilled๊ฐ€ ์—†๋‹ค๋ฉด AggregateError ๋ฐœ์ƒ)

Promise์˜ then

  • Promise๋ฅผ ํ†ตํ•ด resolve์™€ reject ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.
  • ์ด ๋•Œ, ์–ด๋–ค ๊ฐ’์„ resolveํ•˜๊ฒŒ ๋˜๋ฉด ๊ทธ ๋•Œ ์šฐ๋ฆฌ๋Š” ๊ทธ ๊ฐ’์„ then์˜ ๋‚ด๋ถ€ ์ฝœ๋ฐฑํ•จ์ˆ˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์•„์„œ ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ข€ ๋‹จ์ˆœํ•˜๊ฒŒ ์ƒ๊ฐํ•ด๋ณด์ž๋ฉด, then(cb)๋ฅผ ํ†ตํ•ด์„œ ์šฐ๋ฆฌ๋Š” resolve๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ(์ด๋ฒคํŠธ ๊ฐœ๋…), then์œผ๋กœ ์ „๋‹ฌํ•œ cb๋ฅผ resolve๋กœ ์ „๋‹ฌํ•œ ๊ฐ’๊ณผ ํ•จ๊ป˜ micro task queue์— ๋ณด๋‚ด๊ฒŒ ๋œ๋‹ค.

๐Ÿ€ ์˜ค๋Š˜์˜ ๊ณ ๋ฏผ ํ‚ค์›Œ๋“œ

fetch์™€ then ์ฝ”๋“œ ์‹คํ–‰

fetch(URL).then(cb1).then(cb2)

์œ„์˜ ์ฝ”๋“œ๊ฐ€ ์–ด๋–ป๊ฒŒ ์‹คํ–‰๋˜๊ณ  ์ฒ˜๋ฆฌ๋˜๋Š”์ง€?!

fetch์™€ then, then์€ ์ด ์ž์ฒด๋Š” ๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰์ด ๋œ๋‹ค. fetch ๋‚ด๋ถ€์—์„œ ์„œ๋ฒ„์™€์˜ ํ†ต์‹ ์ด ์„ฑ๊ณตํ•˜๋ฉด ์–ด๋–ค ์‘๋‹ต์„ resolveํ•˜๊ฒŒ ๋˜๋Š” ํ”„๋กœ๋ฏธ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
์ฆ‰, resolve ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋ฉด then์„ ํ†ตํ•ด ๋“ฑ๋ก๋œ cb๊ฐ€ micro task queue์— ์ „๋‹ฌ๋˜๋ฉฐ ์ฝœ์Šคํƒ์ด ๋น„์—ˆ์„ ๋•Œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.
์‹œ์ €โ€ฆ ๋๊นŒ์ง€ ๊ตดํ•˜์ง€ ์•Š๊ณ  promise์™€ then์ด addEventListener์™€ ์œ ์‚ฌํ•˜๋‹ค๋Š” ์ƒ๊ฐ์„ ๊ฐ€์ ธ์™€์ค˜์„œ ๊ณ ๋ง™์Šต๋‹ˆ๋‹นใ…‹ใ…‹ใ…‹ใ…‹ใ…‹

๐Ÿ“ ์š”์•ฝ ๋ฐ ํ•˜๋ฃจ ๊ฐ„๋‹จ ํšŒ๊ณ 

  • Promise, fetch, ๋™๊ธฐ/๋น„๋™๊ธฐ ์—๊ฒŒ ํ•˜๋ฃจ์ข…์ผ ๋‘๋“œ๋ ค๋งž์€ ํ•˜๋ฃจ

์˜ค๋Š˜์˜ ์ž˜ํ•œ ์ 

  • ๋™๋ฃŒ๋“คํ•˜๊ณ  ํ•˜๋ฃจ์ข…์ผ ํ† ๋ก ํ•˜๋ฉด์„œ ๋จธ๋ฆฌ ์‹ธ๋งค๊ณ  ๊ณต๋ถ€ํ•œ ์ 
  • ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฏธ๋ฆฌ๋ฏธ๋ฆฌ ํ’€์–ด๋‘” ์ 

์˜ค๋Š˜์˜ ์•„์‰ฌ์šด ์ 

  • ๊ณ„ํšํ–ˆ๋˜ ๊ฐ•์˜์™€ ์ฝ”๋“œ ๊ตฌํ˜„์„ ๋งŽ์ด ๋ชปํ•œ ์ 

์ฐธ๊ณ