
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. ์ฐธ๊ณ ์๋ฃ ๐
- MDN Web Worker ๋ฌธ์
- HTML5 Rocks ํํ ๋ฆฌ์ผ
- Web Worker ๊ฐ๋จ ์ ๋ฆฌ
- Web worker๋ก ์ฑ๋ฅ ํฅ์์ํค๊ธฐ
- ๋๊ท๋ชจ ๋ฐ์ดํฐ ๋น ๋ฅด๊ฒ ์ฒ๋ฆฌํ๊ธฐ
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
