๊ณต๋ถ€

Web Worker๋กœ UI ๋ฉˆ์ถค ๋ฌธ์ œ ํ•ด๊ฒฐํ•˜๊ธฐ

๋ฐ˜์‘ํ˜•

WebWorker

1. Web Worker๋ž€? ๐Ÿค”

์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•  ๋•Œ, ๋ฌด๊ฑฐ์šด ์—ฐ์‚ฐ ์ž‘์—…์ด ์žˆ์œผ๋ฉด ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์‘๋‹ตํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด Web Worker๊ฐ€ ์‚ฌ์šฉ๋œ๋‹ค. Web Worker๋Š” ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰๋˜์–ด UI๊ฐ€ ๋ฉˆ์ถ”๋Š” ํ˜„์ƒ์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.


2. JavaScript์˜ Single Thread์™€ ํ™”๋ฉด ๋ฉˆ์ถค ๋ฌธ์ œ ๐Ÿ›‘

JavaScript๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ Single Thread ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค. ์ฆ‰, ํ•˜๋‚˜์˜ ์ž‘์—…์ด ๋๋‚˜๊ธฐ ์ „๊นŒ์ง€ ๋‹ค์Œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†๋‹ค. ์ด๋ฅผ **๋ฉ”์ธ ์Šค๋ ˆ๋“œ(๊ธฐ๋ณธ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ)**์—์„œ ์‹คํ–‰๋œ๋‹ค๊ณ  ํ‘œํ˜„ํ•œ๋‹ค.

์•„๋ž˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ ๋ฌด๊ฑฐ์šด ์—ฐ์‚ฐ์„ ์‹คํ–‰ํ•˜๋ฉด ๋ธŒ๋ผ์šฐ์ € UI๊ฐ€ ๋ฉˆ์ถ”๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ•œ๋‹ค.

// ๊ธด ์—ฐ์‚ฐ ์ˆ˜ํ–‰ (UI ๋ฉˆ์ถค ํ˜„์ƒ ๋ฐœ์ƒ)
function heavyComputation() {
  let sum = 0;
  for (let i = 0; i < 1_000_000_000; i++) {
    sum += i;
    if (i % 100_000_000 === 0) console.log("ํ˜„์žฌ ์ง„ํ–‰: ", i);
  }
  console.log("์—ฐ์‚ฐ ์™„๋ฃŒ: ", sum);
}

document.querySelector("button").addEventListener("click", () => {
  console.log("๋ฒ„ํŠผ ํด๋ฆญ! ํ•˜์ง€๋งŒ UI๋Š” ๋ฉˆ์ถค...");
});

heavyComputation(); // ์‹คํ–‰ํ•˜๋ฉด UI๊ฐ€ ๋ฉˆ์ถ˜๋‹ค

์œ„ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์—ฐ์‚ฐ์ด ๋๋‚  ๋•Œ๊นŒ์ง€ UI๊ฐ€ ๋ฉˆ์ถ˜๋‹ค. ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ด๋„ ๋ฐ˜์‘ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ์›น ํŽ˜์ด์ง€๊ฐ€ '์‘๋‹ต ์—†์Œ' ์ƒํƒœ๊ฐ€ ๋  ์ˆ˜๋„ ์žˆ๋‹ค.


3. Web Worker๋กœ ํ•ด๊ฒฐํ•˜๊ธฐ

Web Worker๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฌด๊ฑฐ์šด ์—ฐ์‚ฐ์„ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๊ฐ€ ์•„๋‹Œ ๋ณ„๋„์˜ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด UI ๋ฉˆ์ถค ํ˜„์ƒ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

3.1 Web Worker ํŒŒ์ผ ์ƒ์„ฑ (worker.js)

// worker.js
self.onmessage = function (event) {
  let sum = 0;
  for (let i = 0; i < 1_000_000_000; i++) {
    sum += i;
    if (i % 100_000_000 === 0) console.log("ํ˜„์žฌ ์ง„ํ–‰: ", i);
  }
  console.log("์—ฐ์‚ฐ ์™„๋ฃŒ: ", sum);
  postMessage(sum);
};

3.2 ๋ฉ”์ธ ์Šคํฌ๋ฆฝํŠธ์—์„œ Web Worker ํ˜ธ์ถœ (main.js)

const worker = new Worker("worker.js");

document.querySelector("button").addEventListener("click", () => {
  console.log("๋ฒ„ํŠผ ํด๋ฆญ! UI ๋ฐ˜์‘ ์ •์ƒ!");
});

worker.postMessage("start");
worker.onmessage = function (event) {
  console.log("์—ฐ์‚ฐ ๊ฒฐ๊ณผ: ", event.data);
};

์ด์ œ ์‹คํ–‰ํ•ด๋ณด๋ฉด UI๊ฐ€ ๋ฉˆ์ถ”์ง€ ์•Š๊ณ , ๋ฒ„ํŠผ๋„ ์ •์ƒ์ ์œผ๋กœ ํด๋ฆญํ•  ์ˆ˜ ์žˆ๋‹ค! ๐ŸŽ‰


4. Web Worker์˜ ์žฅ์  โœ…

โœ… UI ๋ฉˆ์ถค ํ˜„์ƒ ๋ฐฉ์ง€: ๋ฌด๊ฑฐ์šด ์—ฐ์‚ฐ์„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰ํ•˜์—ฌ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๊ฐœ์„ ํ•œ๋‹ค. โœ… ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ™œ์šฉ: ๋ธŒ๋ผ์šฐ์ €์˜ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์™€ ๋ณ„๋„๋กœ ์‹คํ–‰๋˜์–ด ์„ฑ๋Šฅ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค. โœ… ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ: postMessage()๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์œผ๋ฉฐ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋œ๋‹ค.


5. Web Worker ์‚ฌ์šฉ ์‹œ ์ฃผ์˜ํ•  ์  โš ๏ธ

  • DOM ์กฐ์ž‘ ๋ถˆ๊ฐ€: Worker ๋‚ด๋ถ€์—์„œ๋Š” document๋ฅผ ์ง์ ‘ ์กฐ์ž‘ํ•  ์ˆ˜ ์—†๋‹ค.
  • ํŒŒ์ผ ๊ฒฝ๋กœ ๋ฌธ์ œ: Worker ํŒŒ์ผ์€ ๊ฐ™์€ ๋„๋ฉ”์ธ์—์„œ ์‹คํ–‰๋˜์–ด์•ผ ํ•œ๋‹ค.
  • ๋ฐ์ดํ„ฐ ์ „์†ก ๋น„์šฉ: postMessage()๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ, ๋ฐ์ดํ„ฐ ํฌ๊ธฐ๊ฐ€ ํด ๊ฒฝ์šฐ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค.

6. ์š”์•ฝ ๐Ÿ“Œ

JS๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ๋ผ์„œ ๊ธด ์—ฐ์‚ฐ์ด ์‹คํ–‰๋˜๋ฉด UI๊ฐ€ ๋ฉˆ์ถ”๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. Web Worker๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์—ฐ์‚ฐ์„ ์ฒ˜๋ฆฌํ•˜์—ฌ UI ๋ฉˆ์ถค ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.


6. ์ฐธ๊ณ  ์ž๋ฃŒ ๐Ÿ””

 

 

Web Workers API - Web APIs | MDN

Web Workers makes it possible to run a script operation in a background thread separate from the main execution thread of a web application. The advantage of this is that laborious processing can be performed in a separate thread, allowing the main (usuall

developer.mozilla.org

 

 

์›น ์ž‘์—…์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ €์˜ ๊ธฐ๋ณธ ์Šค๋ ˆ๋“œ์—์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰  |  Articles  |  web.dev

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

web.dev

 

 

 

๋ฐ˜์‘ํ˜•

Categories