โœ๐Ÿป [Code Camp_TIL] 29์ผ์ฐจ: ์‹œ๊ฐ„๊ด€๋ จ ์ด๋ฒคํŠธ, event loop, ์Šค๋ ˆ๋“œ

code_Jยท2023๋…„ 4์›” 23์ผ
0

TIL

๋ชฉ๋ก ๋ณด๊ธฐ
36/41
post-thumbnail

์‹œ๊ฐ„๊ด€๋ จ ์ด๋ฒคํŠธ

๊ฒฐ์ œ๋ฅผ ์™„๋ฃŒํ•˜๊ณ  ๋ฐฑ์—”๋“œ๋กœ API ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ ๊ฒฐ์ œ๊ฐ€ ์ด๋ฃจ์–ด์ง„ ์‹œ์ ์˜ ์‹œ๊ฐ„์„ DB์— ํ•จ๊ป˜ ์ €์žฅํ•˜๊ฒŒ ๋œ๋‹ค. ์ด๋•Œ, ์‹œ๊ฐ„์„ ์ƒˆ๋กœ ์ƒ์„ฑํ•˜๋Š” ์ž‘์—…์€ ํ”„๋ก ํŠธ์—”๋“œ ์„œ๋ฒ„์—์„œ ํ•˜๋ฉด ์•ˆ ๋œ๋‹ค.


ํ”„๋ก ํŠธ์—”๋“œ ์„œ๋ฒ„์˜ ์‹œ๊ฐ„์˜ ๋ฌธ์ œ์  ์ดํ•ด

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


๊ธ€๋กœ๋ฒŒ ์„œ๋น„์Šค์˜ ๊ฒฝ์šฐ๋Š” ์–ด๋–จ๊นŒ? ๋ฐฑ์—”๋“œ์—์„œ UTC(์„ธ๊ณ„ํ‘œ์ค€์‹œ๊ฐ„) ๊ธฐ์ค€์œผ๋กœ ์‹œ๊ฐ„์„ ์ƒ์„ฑํ•˜๊ณ , ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— UTC ์‹œ๊ฐ„์œผ๋กœ ์ €์žฅ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฐฑ์—”๋“œ์—์„œ ์‘๋‹ต์„ ๋ฐ›์•„์˜ฌ ๋•Œ์—๋Š” ๋ฐ›์•„์˜จ UTC ์‹œ๊ฐ„์„ ํ•ด๋‹น ๋‚˜๋ผ์˜ ์‹œ๊ฐ„์œผ๋กœ ํ™˜์‚ฐํ•ด์„œ ๋ณด์—ฌ์ฃผ๊ฒŒ ๋œ๋‹ค.


์ด๋Ÿฌํ•œ ์‹œ๊ฐ„ ๊ด€๋ จ ์ฒ˜๋ฆฌ๋ฅผ ๋„์™€์ฃผ๋Š” ๋Œ€ํ‘œ์ ์ธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ๋‹ค!

moment.js ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ



์ด๋ฒคํŠธ


์ด๋ฒคํŠธ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ• 2๊ฐ€์ง€

  1. ์‚ฌ์šฉ์ž์˜ ํ–‰๋™(ํด๋ฆญ, ํƒ€์ดํ•‘ ๋“ฑ)
  2. ํŠน์ • ์‹œ๊ฐ„์— ๋„๋‹ฌ -> ํฌ๋ก ํƒญ

ํฌ๋ก ํƒญ์„ ์ด์šฉํ•˜๋ฉด ๊ด€๋ฆฌ์ž๊ฐ€ ์ •ํ•ด์ง„ ์‹œ๊ฐ„๊นŒ์ง€ ๋Œ€๊ธฐํ•˜๊ฑฐ๋‚˜, ๊ทธ ์‹œ๊ฐ„์— ํด๋ฆญ ๋“ฑ์˜ ์ด๋ฒคํŠธ๋ฅผ ์ง์ ‘ ๋ฐœ์ƒ์‹œํ‚ฌ ํ•„์š”๊ฐ€ ์—†์–ด์ง„๋‹ค.

์ฐธ๊ณ ! ๋ฆฌ๋ˆ…์Šค ๊ธฐ๋ฐ˜ OS์—๋Š” ํฌ๋ก ํƒญ์ด ๊ธฐ๋ณธ์œผ๋กœ ๊น”๋ ค์žˆ๋‹ค.

์ด๋ฒคํŠธ ๋ฃจํ”„(Event Loop)

setTimeout์˜ ์‹ค์ฒด


<!DOCTYPE html>
<html lang="ko">
  <head>
    <title>์ด๋ฒคํŠธ๋ฃจํ”„</title>
    <script>
      const onClickLoop = () => {
        console.log("์‹œ์ž‘!");

        setTimeout(() => {
          console.log("0์ดˆ ๋’ค์— ์‹คํ–‰๋  ๊ฑฐ์—์š”!");
        }, 0);

        let sum = 0;
        for (let i = 0; i <= 9000000000; i++) {
          sum += 1;
        }

        console.log("๋!");
      };
    </script>
  </head>
  <body>
    <button onclick="onClickLoop()">์‹œ์ž‘ํ•˜๊ธฐ</button>
  </body>
</html>

์œ„ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰์‹œํ‚ค๋ฉด ์ฝ˜์†”์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋œฌ๋‹ค.

์ฝ”๋“œ ์ˆœ์„œ๋Œ€๋กœ๋ผ๋ฉด '๋!' ์ฝ˜์†”๋ณด๋‹ค '0์ดˆ ๋’ค์— ์‹คํ–‰๋  ๊ฑฐ์—์š”!'๊ฐ€ ๋จผ์ € ๋– ์•ผ ํ•˜๋Š”๋ฐ ์ˆœ์„œ๊ฐ€ ๋ฐ”๋€ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.


์ด๋Ÿฌํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ด์œ ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋™์ž‘ ์›๋ฆฌ ๋•Œ๋ฌธ์ด๋‹ค. ์œ„์—์„œ ์‹คํ–‰์‹œ์ผฐ๋˜ ์ฝ”๋“œ์˜ ์‹คํ–‰ ์ˆœ์„œ๋ฅผ ์ž์„ธํ•˜๊ฒŒ ์‚ดํŽด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. callStack์—์„œ onClickLoop ํ•จ์ˆ˜ ์‹คํ–‰(Stack - Last In First Out / LIFO ๊ตฌ์กฐ)
  2. Background์— setTimeout()์„ ๋ณด๋‚ด์„œ ์‹คํ–‰
  3. setTimeout()์ด TaskQueue๋กœ ์ „๋‹ฌ๋˜์–ด ์Œ“์ž„ (Queue - First In First Out / FIFO ๊ตฌ์กฐ)
  4. TaskQueue์— ์Œ“์ด๋Š” ํ•จ์ˆ˜๋Š” CallStack์ด ๋‹ค ๋น„์›Œ์ง„ ๋‹ค์Œ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์— ์‹คํ–‰๋จ

์—ฌ๊ธฐ์„œ TaskQueue์— ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ CallStack์œผ๋กœ ๋ณด๋‚ด๋Š” ์—ญํ• ์„ ํ•˜๋Š” ๊ฒƒ์ด ์Šค๋ ˆ๋“œ(Thread)๋‹ค.


์‹ฑ๊ธ€์Šค๋ ˆ๋“œ vs ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ๋ฐฉ์‹์„ ๊ฐ–๊ณ  ์žˆ๋‹ค. ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ๋Š” CallStack์ด ๋น„์–ด์•ผ๋งŒ TaskQueue์— ์žˆ๋Š” ์ž‘์—…์„ CallStack์œผ๋กœ ๊ฐ€์ ธ์˜จ๋‹ค.

์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ์™€ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ์˜ ์ฐจ์ด๋Š” ์Šค๋ ˆ๋“œ(์ผ๊พผ)๊ฐ€ ํ•˜๋‚˜๋ƒ, ์—ฌ๋Ÿฟ์ด๋ƒ์˜ ์ฐจ์ด๋‹ค. ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ๋Š” ๋™์‹œ์— ์ผ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์—ฌ๋Ÿฟ์ด์„œ ๋‚˜๋ˆ ์„œ ํ•œ๋‹ค๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.

๋˜ํ•œ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ๋Š” ์‹ฑ๊ธ€์Šค๋ ˆ๋“œ๋ณด๋‹ค ์†๋„๊ฐ€ ๋Š๋ฆด ์ˆ˜ ์žˆ๋‹ค. ํ•˜๋˜ ์ผ์„ ์ค‘๋‹จํ•˜๊ณ  ์ €์žฅํ•˜๊ณ  ๋‹ค์Œ ์Šค๋ ˆ๋“œ๋กœ ๋„˜๊ฒจ์ฃผ๋Š”(์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ) ์‹œ๊ฐ„์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ์–ธ์–ด๋กœ๋Š” ์ž๋ฐ”, ํŒŒ์ด์ฌ ๋“ฑ์ด ์žˆ๋‹ค.

๋‘˜ ์ค‘ ๋ญ๊ฐ€ ๋” ์ข‹๋‹ค๊ณ  ํ•  ์ˆ˜๋Š” ์—†๋‹ค. ์žฅ๋‹จ์ ์„ ๋น„๊ตํ•ด์„œ ๋งž๋Š” ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.



profile
Web FE ๊ฐœ๋ฐœ์ž ์ทจ์ค€์ƒ

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