๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Front-End/Javascript

[TIL] setInterval ํ•จ์ˆ˜, Event loop ๊ทธ๋ฆฌ๊ณ  ํƒ€์ด๋จธ - 1ํŽธ

๋ฐ˜์‘ํ˜•

 

Hi there ~ ๐Ÿ‘‹

 

์š”์ฆ˜ ์—ด์‹ฌํžˆ ๋ธ”๋กœ๊ทธ๋ฅผ ์“ฐ๊ณ  ์žˆ์–ด์š”!! ใ…Žใ…Ž
๋ธ”๋กœ๊ทธ์— ์ง€๋‚œ 3๊ฐœ์›”๋™์•ˆ ์†Œํ™€ํ–ˆ์—ˆ๋Š”๋ฐ, ๋‹ค์‹œ ํž˜์„ ๋‚ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค!! (์•„์ž์•„์ž)

 

์•ˆ๋ผ_์ผํ•ด
์•ˆ๋ผ ์ผํ•ด

 

์˜ค๋Š˜์˜ ์ฃผ์ œ๋Š” ๋ฐ”๋กœ ํƒ€์ด๋จธ์—์š”!

์ €ํฌ ํšŒ์‚ฌ์—๋Š” ๋ ˆ๊ฑฐ์‹œ๊ฐ€ ๋˜๊ธฐ ์ผ๋ณด์ง์ „์˜ ํƒ€์ด๋จธ ์ฝ”๋“œ๊ฐ€ ์žˆ์—ˆ์–ด์š”..๐Ÿฅบ

 

ํšŒ์‚ฌ์˜ ๋‹ค๋ฅธ ์ฃผ๋‹ˆ์–ด ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๋ถ„๋“ค์€ ํ˜„์žฌ ์ง„ํ–‰์ค‘์ธ ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ์–ด์„œ ์ˆ˜์ •ํ•˜๊ธฐ์— ๋ฐ”์˜์‹  ๊ฒƒ ๊ฐ™์•˜์–ด์š”!

๊ทธ๋ž˜์„œ ์ œ๊ฐ€ ํƒ€์ด๋จธ์˜ ๊ตฌ์กฐ์™€ ๋กœ์ง์„ ๊ฐœ์„ ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ต๋‹ˆ๋‹ค..ใ…Ž

 

1. Event loop์™€ ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ

์ฒซ ๋ฒˆ์งธ ๋ฌธ์ œ์˜€์–ด์š”! 

 

๋ฒ„๊ทธ-์ˆ˜์ •-์ „
๋ฒ„๊ทธ ์ˆ˜์ • ์ „

 

// ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๊ฐ€ ๋  ํƒ€์ด๋จธ ์ฝ”๋“œ..
const timeRef = useRef(0);

useEffect(() => {
    if (timeRef.current === 0 && startTime !== 0 && statusOfTime !== 'PAUSE')
      timeRef.current = Math.floor((Date.now() - startTime) / 1000);
    let interval = 0;

    switch (statusOfTime) {
      // ํƒ€์ด๋จธ๊ฐ€ ๋Œ์•„๊ฐˆ ๋•Œ - ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ์ฝ”๋“œ!
      case 'RUNNING':
        interval = window.setInterval(() => {
          timeRef.current++;
          if (checkCurrentTimeIsOverRange(timeRef.current)) {
            clearInterval(interval);
          }
        }, 1000);
        break;
      // ํƒ€์ด๋จธ๊ฐ€ ์ผ์‹œ์ •์ง€ํ–ˆ์„ ๋•Œ
      case 'PAUSE':
        timeRef.current =
          pauseMatchTime !== 0 && timeRef.current === 0
            ? pauseMatchTime
            : timeRef.current;
        updatePauseTime(matchId, timeRef.current);
        clearInterval(interval);
        break;
      // ํƒ€์ด๋จธ๊ฐ€ ๋Œ€๊ธฐ ์ค‘์ผ ๋•Œ
      case 'READY':
        clearInterval(interval);
        timeRef.current = 0;
        break;
    }

    return () => clearInterval(interval);
  }, [
    isCountUp,
    statusOfTime,
    matchId,
    pauseMatchTime,
    setTime,
    startTime,
    stopWatchStartTime,
    checkCurrentTimeIsOverRange,
  ]);

 

๊ธฐ์กด ์ฝ”๋“œ์˜ ๋ฌธ์ œ์ ์€ setInterval๋กœ ๋งค์ดˆ๋งˆ๋‹ค timeRef.current++ ํ•˜๋Š” ์‹์œผ๋กœ ์‹œ๊ฐ„์„ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒƒ์ด์—ˆ์–ด์š”!

 

setInterval์€ ์ •ํ™•ํ•œ ์‹œ๊ฐ„์„ ๋ณด์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์œผ๋กœ ์œ ๋ช…ํ•˜์ฃ .

 

JavaScript V8 ์—”์ง„์˜ ์ฝœ ์Šคํƒ์— ๋‹ค๋ฅธ ์ž‘์—…๋“ค์ด ์Œ“์ธ๋‹ค๋ฉด ์˜ˆ์ƒ๊ณผ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฆ‰, 1์ดˆ๋งˆ๋‹ค timeRef.current++๊ฐ€ ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๋Š”๋ฐ, ์ค‘๊ฐ„์— ๊ณ„์† ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋˜์—ˆ์„ ๋•Œ,
์˜์กด์„ฑ ๋ฐฐ์—ด์— ์žˆ๋Š” ๊ฐ’์ด ๋ณ€ํ•˜์—ฌ ๋‹ค๋ฅธ ์ž‘์—…์ด ๋จผ์ € ์ˆ˜ํ–‰๋˜์–ด timeRef.current++๊ฐ€ ๋ฐ€๋ฆด ๊ฐ€๋Šฅ์„ฑ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

(์‹ค์ œ๋กœ ์œ„์— ์งค์ด ์˜ˆ์‹œ์—์š”!)

 

์ด ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ๋Š” ์ž์„ธํ•˜๊ฒŒ ๋‹ค๋ฃฌ ๋ฐ”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค! -> ์—ฌ๊ธฐ๋ฅผ ํด๋ฆญ

 

 

์ด๋ฒคํŠธ ๋ฃจํ”„์˜ ๊ฐœ๋…์„ ์ ์šฉํ•˜์—ฌ ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ๋ฅผ ์ˆ˜์ •ํ•˜์—ฌ ๋ฒ„๊ทธ๋Š” ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

 

๋ฒ„๊ทธ-์ˆ˜์ •-ํ›„
๋ฒ„๊ทธ ์ˆ˜์ • ํ›„

 

 

์ด๋ ‡๊ฒŒ 1๋‹จ๊ณ„ ์ˆ˜์ •์ด ๋๋‚ฌ์Šต๋‹ˆ๋‹ค.

 

 

๊ธ€์ด ๋„ˆ๋ฌด ๊ธธ์–ด์ง€๋Š” ๊ฒƒ ๊ฐ™์•„์„œ,

 

 

2ํŽธ, ํƒ€์ด๋จธ์˜ ์‹œ๊ฐ„์„ ๋ณด์žฅํ•ด๋ณด์ž! ๋Š” ๋‹ค์Œ ์‹œ๊ฐ„์— ์ฐพ์•„์˜ค๊ฒ ์Šต๋‹ˆ๋‹ค!

 

 

 


์ฐธ๊ณ ์ž๋ฃŒ

 

https://ssocoit.tistory.com/249

 

[JavaScript] setTimeout๊ณผ setInterval์€ ์ •ํ™•ํ•œ ์‹œ๊ฐ„์„ ๋ณด์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค!

์ด๋ฒˆ์—๋„ ์Šคํ†ฑ์›Œ์น˜๋ฅผ ๋งŒ๋“ค๋‹ค๊ฐ€.. ๋ง๋กœ๋งŒ ๋“ฃ๋˜ setTimeout๊ณผ setInterval์˜ ์‹œ๊ฐ„๋ณด์žฅ๋ฌธ์ œ๋ฅผ ์ง์ ‘ ๋งž๋‹ฅ๋œจ๋ฆฌ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ง๋กœ๋งŒ ๋“ฃ๋˜๊ฑธ ๊ฐ„๋‹จํ•œ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค๋ฉด์„œ ์ง์ ‘ ๊ฒช์œผ๋‹ˆ๊นŒ ์ฐธ ์˜ค๋ฌ˜ํ•˜๋„ค์š” ใ…Ž

ssocoit.tistory.com

 

https://yeomyeom.tistory.com/94

 

[JS] Event loop

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

yeomyeom.tistory.com

 

๋ฐ˜์‘ํ˜•