[JS] Web Worker

Web Worker

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

 

ex) ๋ชจ๋‹ˆํ„ฐ๋ง ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ

โžก๏ธ 1์ดˆ๋งˆ๋‹ค ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์•„์งˆ์ˆ˜๋ก ์•ฑ์€ ๋А๋ ค์ง€๊ณ  UI๋Š” ์ง€์—ฐ๋œ๋‹ค.


๐Ÿ˜ผMain Thread
- ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‹คํ–‰ํ•˜๋Š” UI ์Šค๋ ˆ๋“œ
- Web Worker๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ํ†ต์‹ ์„ ์ฃผ๋„

๐ŸญWorker Thread
- ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๊ฐ€ ์ƒ์„ฑํ•œ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์Šค๋ ˆ๋“œ
- ๋…๋ฆฝ๋œ ํ™˜๊ฒฝ์—์„œ ์ž‘์—…ํ•˜๋ฉฐ, ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์™€ ๋ฉ”์‹œ์ง€ ๊ตํ™˜์œผ๋กœ ํ†ต์‹ 

 

1. Web Worker ์ƒ์„ฑ

- ์„ค์ •๋œ ์‹œ๊ฐ„(1์ดˆ)๋งˆ๋‹ค refresh token์„ Main Thread๋กœ ๋ณด๋‚ด๋Š” Web Worker์ด๋‹ค.

- selft๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” Worker ๊ฐ์ฒด ์Šค์Šค๋กœ์—๊ฒŒ ๋“ค์–ด์˜ค๋Š” message๋ฅผ Listenํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

const intervalWorker = new Worker(
  URL.createObjectURL(
    new Blob(
      [
          `self.onmessage = (evt) => { 
          	const { refreshToken } = evt.data;
						 	
            setInterval(() => { 
                postMessage({ refreshToken });
            }, motionDetectTime);
            
          };`
      ],
      {
          type: `application/javascript`
      }
    )
  )
);

 

2.  Main Thead์—์„œ Worker Thread๋กœ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ

- postMessge๋ฅผ ํ†ตํ•ด Worker Thread์— ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.

  • motionDetectTime: ์ฃผ๊ธฐ์  ์ž‘์—…์˜ ๊ฐ„๊ฒฉ(ms)
  • refreshToken: ์‚ฌ์šฉ์ž ์ธ์ฆ ํ† ํฐ
intervalWorker.postMessage({ 
	motionDetectTime: 1000,
	refreshToken: localStorage.getItem(`refreshToken`)
});

 

3.Worker Thread์—์„œ ๋ฉ”์„ธ์ง€ ์ฒ˜๋ฆฌ

  1. refresh token ์—†์„ ๊ฒฝ์šฐ: ์›Œ์ปค ์ข…๋ฃŒ & ๋กœ๊ทธ์•„์›ƒ
  2. ๋ชจ์…˜์ด ๊ฐ์ง€๋˜๋Š” ๊ฒฝ์šฐ: refresh token ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๊ฒฝ์šฐ ์›Œ์ปค ์ข…๋ฃŒ
  3. ๋ชจ์…˜์ด ๊ฐ์ง€๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ: ์›Œ์ปค ์ข…๋ฃŒ
intervalWorker.onmessage = evt => {
	const refreshToken = localStorage.getItem(`refreshToken`);

    if (!refreshToken || !checkMotionFunc()) {
        intervalWorker.terminate();
        if(!refreshToken) logout();
    } else {
        if (evt.data.refreshToken !== refreshToken) {
            intervalWorker.terminate();
        }
    }
};

const autoLogoutTime = 1200000;

const checkMotionFunc = () => {
    const motionTime: number = Number(localStorage.getItem(`motionTime`));

    if (null === motionTime || autoLogoutTime < Date.now() - motionTime) {
        sessionStorage.setItem(`noMotion`, String(true));

        logout();

        return false;
    } else {
        return true;
    }
};

const checkMotionEventFunc = () => {
    if (!checkMotionFunc()) return;
    localStorage.setItem(`motionTime`, String(Date.now()));
};

 

 

'โ˜€๏ธFront-End > ๐Ÿ“—JavaScript' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[JS] OffscreenCanvas  (0) 2024.12.26
[JS] ResizeObserver  (0) 2024.12.09
[JS] var, let, const  (0) 2024.02.22
[JS] JavaScript Engine  (0) 2023.10.23
[JS] ECMAScript  (0) 2023.10.17