thumbnail
๐Ÿคน ๋š๋”ฑ๋š๋”ฑ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋™์ž‘ ์›๋ฆฌ
JavaScript
2022.01.15

์›น ๋ธŒ๋ผ์šฐ์ €์˜ ๋™์ž‘ ์›๋ฆฌ๋ฅผ ์™œ ์•Œ์•„์•ผ ํ•ด?

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


๋จผ์ € ์ผ๋ฐ˜์ ์œผ๋กœ ์šฐ๋ฆฌ๊ฐ€ ์•Œ๊ณ ์žˆ๋Š” ํ•ด์„ ์ˆœ์„œ๋ฅผ ์‚ดํŽด๋ณด์ž๋ฉด

print(1+1)
 time.sleep(1)
 print(2+2)
  • ์ฝ”๋“œ ์ˆœ์„œ๋Œ€๋กœ ์œ„์—์„œ ์•„๋ž˜๋กœ ํ•˜๋‚˜์”ฉ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. (feat.python)
    1. print(1+1) ์‹คํ–‰ ํ›„ ๊ฒฐ๊ณผ 2 ์ถœ๋ ฅ
    2. time.sleep(1) ์‹คํ–‰์œผ๋กœ 1์ดˆ ์‰ฌ๊ณ ~
    3. print(2+2) ์‹คํ–‰ ํ›„ ๊ฒฐ๊ณผ 4 ์ถœ๋ ฅ

๊ทธ๋Ÿผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š”?

console.log(1 + 1)

setTimeout(function () {
  console.log(2 + 2)
}, 1000)

console.log(3 + 3)
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์ฝ”๋“œ๋ฅผ ์œ„์— ์ ๋“  ๋ฐ‘์— ์ ๋“  ๋น ๋ฅธ ๊ฒƒ๋ถ€ํ„ฐ ์‹คํ–‰ํ•ด์ค€๋‹ค.

    1. console.log(1+1) ์‹คํ–‰ ํ›„ ๊ฒฐ๊ณผ 2 ์ถœ๋ ฅ
    2. console.log(3+3) ์‹คํ–‰ ํ›„ ๊ฒฐ๊ณผ 6 ์ถœ๋ ฅ..?
    3. setTimeout(function(){...}) ์‹คํ–‰์œผ๋กœ ๊ฒฐ๊ณผ 4 ์ถœ๋ ฅ
  • ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ•ด์„ํ•˜๋Š” ์ˆœ์„œ๋Š” ๋‚ด๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ์•Œ๊ณ  ์žˆ๋˜ ์ˆœ์„œ์™€๋Š” ํ™•์‹คํžˆ ๋‹ค๋ฅด๋‹ค.
    ์ด ์˜๋ฌธ์„ ํ’€๊ธฐ ์œ„ํ•ด์„œ Keep Going!


How JavaScript Works ๐Ÿ˜ตโ€๐Ÿ’ซ

image

  • ์›น ๋ธŒ๋ผ์šฐ์ € : ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰ํ•ด์ฃผ๋Š” ์—”์ง„(ํฌ๋กฌ, ์›จ์ผ, ํŒŒ์ด์–ดํญ์Šค ๋“ฑ)

  • ์‹คํ–‰ํ•˜๋Š”๋ฐ ์žˆ์–ด, ์ •ํ™•ํ•œ ์›๋ฆฌ์™€ ๋‹จ๊ณ„๊ฐ€ ์กด์žฌํ•œ๋‹ค.


image

Heap

๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์ด ์ผ์–ด๋‚˜๋Š” ๊ณณ. ์‰ฝ๊ฒŒ ๋งํ•ด์„œ ๋ณ€์ˆ˜๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๊ณต๊ฐ„์ด๋‹ค.

Stack

์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ด์ฃผ๋Š” ๊ณณ. ๋‹จ, ํ•œ ๋ฒˆ์— ํ•œ ์ค„์”ฉ๋งŒ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ Single Thread์ด๋‹ค.
์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋‹ค๊ฐ€ ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋‚˜๋ฉด Heap ์•ˆ์— ์ €์žฅ๋œ ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ ธ๋‹ค ์“ด๋‹ค.
setTimeout() ๊ณผ ๊ฐ™์€ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๊ฐ€ ๋“ค์–ด์˜ค๋ฉด Waiting Room์œผ๋กœ ๋†”๋‘๊ณ  ๋‚˜๋จธ์ง€ ์ฝ”๋“œ๋ฅผ ๊ณ„์† ์‹คํ–‰ํ•œ๋‹ค.

image

image

Waiting Room

Ajax ์š”์ฒญ ์ฝ”๋“œ๋‚˜ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ์™€ ๊ฐ™์€ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋Š” ์—ฌ๊ธฐ์„œ ์ž ๊น ๋Œ€๊ธฐํ•œ๋‹ค.

Queue

image

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


console.log(1 + 1)
setTimeout(function () {
  console.log(2 + 2)
}, 0)
console.log(3 + 3)
  • setTimeout()์˜ ์‹œ๊ฐ„์ด 0์ด๋ผ๋ฉด ์–ด๋–จ๊นŒ?
    1. console.log(1+1) ์‹คํ–‰ ํ›„ ๊ฒฐ๊ณผ 2 ์ถœ๋ ฅ
    2. console.log(3+3) ์‹คํ–‰ ํ›„ ๊ฒฐ๊ณผ 6 ์ถœ๋ ฅ
    3. setTimeout(() => {...}, 0) ์‹คํ–‰ ํ›„ ๊ฒฐ๊ณผ 4 ์ถœ๋ ฅ
  • setTimeout๊ณผ ๊ฐ™์€ ํ•จ์ˆ˜๋Š” ๋ฌด์กฐ๊ฑด ๋Œ€๊ธฐ์‹ค๋กœ ์ด๋™ํ•œ ๋‹ค์Œ, Queue์—์„œ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ Stack์—์„œ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋งˆ์ง€๋ง‰์œผ๋กœ ์ถœ๋ ฅ์ด ๋œ๋‹ค.

โœจ ์ •๋ฆฌ

์• ์ดˆ์— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์–ด๋ ค์šด ๋กœ์ง์ด๋‚˜ 10์ดˆ ์ด์ƒ ๊ฑธ๋ฆฌ๋Š” ์–ด๋ ค์šด ์—ฐ์‚ฐ(๋ฐ˜๋ณต๋ฌธ)์ด Stack์— ์žˆ์œผ๋ฉด, ์ค‘๊ฐ„์— ๋ฒ„ํŠผ ํด๋ฆญ์„ ํ•˜๊ฑฐ๋‚˜ Ajax ์š”์ฒญ ํ›„ ์ฝ”๋“œ ์‹คํ–‰์ด๋‚˜ setTimeout ํ•จ์ˆ˜๋“ค์ด ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค..

์™œ๋ƒํ•˜๋ฉด! ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋Š” ๊ฒƒ์€ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋กœ, Waiting Room์„ ๊ฑฐ์ณ์„œ Queue์— ๊ฐ”๋‹ค๊ฐ€ Stack์œผ๋กœ ๊ฐ€์•ผํ•˜๋Š”๋ฐ
์ด ๋•Œ Stack์— ๊ณ„์† ํ•  ์ผ์ด ์Œ“์—ฌ์žˆ์œผ๋ฉด ๋ณด๋‚ด์งˆ ์ˆ˜ ์—†๋‹ค! ๐Ÿ˜ซ

Stack์œผ๋กœ ๊ฐ€๊ธฐ ์œ„ํ•ด์„œ๋Š” Stack ์ž๋ฆฌ๊ฐ€ ๊ผญ. ๊ผญ ๋น„์–ด์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ์ ์„ ๊ธฐ์–ตํ•˜์ž.


image ๋ธŒ๋ผ์šฐ์ €๋Š” ๋ณต์žกํ•ด์ง€๋ฉด ๊ทธ๋Œ€๋กœ Freezingโ€ฆ


โ˜‘๏ธ Stack ๋ฐ”์˜๊ฒŒ ํ•˜์ง€๋ง ๊ฒƒ! ์‚ฌ์ดํŠธ๊ฐ€ ๋Š๋ ค์ ธ์„œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์ด ๋‚˜๋น ์งˆ ์ˆ˜ ์žˆ๋‹ค. โ„๏ธ

โ˜‘๏ธ Queue ๋ฐ”์˜๊ฒŒ ํ•˜์ง€๋ง ๊ฒƒ! ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ๋‹ค์ค‘์œผ๋กœ ๊ฑธ์–ด๋‘๋ฉด ๊ทธ ์ž์ฒด๋กœ๋„ ์‚ฌ์ดํŠธ๊ฐ€ ๋ฒ„๋ฒ…๊ฑฐ๋ฆด ์ˆ˜ ์žˆ๋‹ค. โ˜ƒ๏ธ

โ˜‘๏ธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋™๊ธฐ์ ? ๋น„๋™๊ธฐ์ ? ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์›๋ž˜ ๋™๊ธฐ์  ์ฒ˜๋ฆฌ๋‹ค. ํ•œ ๋ฒˆ์— ํ•œ ์ค„ ์‹คํ–‰(Stack)์„ ํ•œ๋‹ค. ๊ฐ€๋” ๋น„๋™๊ธฐ์ ์ธ ์ฒ˜๋ฆฌ๋„ ๊ฐ€๋Šฅํ•œ๋ฐ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ํ•จ์ˆ˜๋Š” ๋†”๋‘๊ณ  ์ฐจ๋ก€๋Œ€๋กœ ์‹คํ–‰ํ•œ๋‹ค.


์ด์–ด์ง€๋Š” ๋‹ค์Œ ํฌ์ŠคํŒ…์€ Event Loop์— ๋Œ€ํ•ด์„œ ๋” ์ž์„ธํ•˜๊ฒŒ ๋งํ•ด๋ณผ ๊ฒƒ์ด๋‹ค.


์ฐธ๊ณ  ๋‚ด์šฉ

์ฝ”๋”ฉ์• ํ”Œ

Thank You for Visiting My Blog, Have a Good Day ๐Ÿ˜Š
ยฉ2021 Developer minkyung choi, Powered By Gatsby.