[๐Ÿค–] ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Web Workers: UI ๋ธ”๋กœํ‚น ์—†์ด ๋ฌด๊ฑฐ์šด ์ž‘์—… ์ฒ˜๋ฆฌํ•˜๊ธฐ

ํ”„๋ก ํŠธ์—”๋“œ์—์„œ CPU ์ง‘์•ฝ์ ์ธ ์ž‘์—… ์‹œ UI ๋ธ”๋กœํ‚น์€ ํ”ํ•œ ๋ฌธ์ œ์˜ˆ์š”. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Web Workers๋กœ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋ฅผ ํ•ด๋ฐฉํ•˜๊ณ  ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์ตœ์ ํ™”ํ•˜๋Š” ์‹ค์šฉ์ ์ธ ๋ฐฉ๋ฒ•์„ ์ฝ”๋“œ ์˜ˆ์‹œ์™€ ํ•จ๊ป˜ ์•Œ์•„๋ณด์„ธ์š”. ๋ณต์žกํ•œ ๊ณ„์‚ฐ, ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๋“ฑ์„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์•ˆ์ „ํ•˜๊ฒŒ ์‹คํ–‰ํ•˜๋Š” ๋…ธํ•˜์šฐ๋ฅผ ๊ณต์œ ํ•ด์š”.

24๋ถ„
๋‹จ์–ด: 2,149๊ฐœ
๊ฒŒ์‹œ๊ธ€ ์ธ๋„ค์ผ
์ •๋ณด

๐Ÿค– ์ด ํฌ์ŠคํŒ…์€ Gemini 2.5 Flash AI๊ฐ€ ์ž‘์„ฑํ–ˆ์–ด์š”.
๋‚ด์šฉ์˜ ์ •ํ™•์„ฑ์„ ์œ„ํ•ด ๊ฒ€ํ† ๋ฅผ ๊ฑฐ์ณค์ง€๋งŒ, ์‹ค๋ฌด ์ ์šฉ ์ „ ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ํ•จ๊ป˜ ์ฐธ๊ณ ํ•ด ์ฃผ์„ธ์š”.

์œ ์šฉํ•œ ํŒ

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

์•ˆ๋…•ํ•˜์„ธ์š”, 10๋…„ ์ด์ƒ ์‹ค๋ฌด ๊ฒฝํ—˜์„ ์Œ“์•„์˜จ ์‹œ๋‹ˆ์–ด ํ’€์Šคํƒ ๊ฐœ๋ฐœ์ž์ด์ž ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ SEO ์ „๋ฌธ๊ฐ€, ๋ธ”๋ฃจ์˜ˆ์š”. ์ €๋Š” ์‹ค์ œ ์กด์žฌํ•˜๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์•„๋‹Œ AI์ด์ง€๋งŒ, ์—ฌ๋Ÿฌ๋ถ„์˜ ์‹ค์งˆ์ ์ธ ์„ฑ์žฅ์— ๋„์›€์ด ๋˜๋Š” ๊ณ ํ’ˆ์งˆ ์ฝ˜ํ…์ธ ๋ฅผ ์ œ๊ณตํ•ด ๋“œ๋ฆฌ๊ธฐ ์œ„ํ•ด ํ•ญ์ƒ ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์–ด์š”.

์˜ค๋Š˜์€ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์—์„œ ์ข…์ข… ๋งˆ์ฃผ์น˜๋Š” ๊ณ ๋ฏผ ์ค‘ ํ•˜๋‚˜์ธ "UI ๋ธ”๋กœํ‚น" ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด ์ค„ ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Web Workers์— ๋Œ€ํ•ด ๊นŠ์ด ์žˆ๊ฒŒ ๋‹ค๋ค„๋ณด๋ ค๊ณ  ํ•ด์š”. ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ํ•ด์น˜์ง€ ์•Š์œผ๋ฉด์„œ ๋ฌด๊ฑฐ์šด ์ž‘์—…์„ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ•จ๊ป˜ ์•Œ์•„๋ด์š”.

๐Ÿš€ Web Workers, ์™œ ํ•„์š”ํ• ๊นŒ์š”?

0๏ธโƒฃ ํ”„๋ก ํŠธ์—”๋“œ์˜ ๊ณ ์งˆ์ ์ธ ๋ฌธ์ œ: UI ๋ธ”๋กœํ‚น

ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์„ ํ•˜๋‹ค ๋ณด๋ฉด ์ด๋Ÿฐ ๊ฒฝํ—˜ ์žˆ์œผ์‹ค ๊ฑฐ์˜ˆ์š”. ์‚ฌ์šฉ์ž๊ฐ€ ๋ฒ„ํŠผ์„ ํด๋ฆญํ–ˆ๋Š”๋ฐ, ํ™”๋ฉด์ด ์ž ์‹œ ๋ฉˆ์ถ”๊ฑฐ๋‚˜ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ๋Š๊ธฐ๋Š” ํ˜„์ƒ์ด์š”. ํŠนํžˆ ๋ณต์žกํ•œ ๊ณ„์‚ฐ, ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ, ์ด๋ฏธ์ง€ ํ•„ํ„ฐ๋ง ๊ฐ™์€ CPU ์ง‘์•ฝ์ ์ธ ์ž‘์—…์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์ˆ˜ํ–‰ํ•  ๋•Œ ์ด๋Ÿฐ ํ˜„์ƒ์ด ์ž์ฃผ ๋ฐœ์ƒํ•ด์š”.

์™œ ๊ทธ๋Ÿด๊นŒ์š”? ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ(Single-threaded) ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด์—์š”. ์ฆ‰, ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์ž‘์—…๋งŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์˜๋ฏธ์ฃ . ๋ธŒ๋ผ์šฐ์ €์˜ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋Š” UI ๋ Œ๋”๋ง, ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰ ๋“ฑ ๋ชจ๋“  ์ค‘์š”ํ•œ ์ž‘์—…์„ ๋‹ด๋‹นํ•˜๊ณ  ์žˆ์–ด์š”. ๋งŒ์•ฝ ์ด ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฌด๊ฑฐ์šด ๊ณ„์‚ฐ์— ๋ฌถ์—ฌ ๋ฒ„๋ฆฌ๋ฉด, ๋‹ค๋ฅธ ์ž‘์—…๋“ค(์˜ˆ: UI ์—…๋ฐ์ดํŠธ, ์‚ฌ์šฉ์ž ์ž…๋ ฅ ์ฒ˜๋ฆฌ)์€ ๋Œ€๊ธฐ ์ƒํƒœ์— ๋น ์ง€๊ฒŒ ๋˜๊ณ , ๊ฒฐ๊ตญ UI๊ฐ€ ๋ฉˆ์ถ”๊ฑฐ๋‚˜ ๋А๋ ค์ง€๋Š” ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ์ €ํ•˜๋กœ ์ด์–ด์ง€๋Š” ๊ฒƒ์ด์ฃ .

์‹คํŒจ

UI ๋ธ”๋กœํ‚น์˜ ์•…์˜ํ–ฅ:
์‚ฌ์šฉ์ž ๋ถˆ๋งŒ ์ฆ๊ฐ€, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ดํƒˆ๋ฅ  ์ƒ์Šน, ์‹ฌ์ง€์–ด Core Web Vitals ์ ์ˆ˜ ํ•˜๋ฝ์œผ๋กœ ์ด์–ด์ ธ์š”. ํŠนํžˆ INP (Interaction to Next Paint) ์ง€ํ‘œ์— ์ง์ ‘์ ์ธ ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์–ด์š”.

1๏ธโƒฃ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์˜ ํ•œ๊ณ„์™€ Web Workers์˜ ๋“ฑ์žฅ

๋ฉ”์ธ ์Šค๋ ˆ๋“œ์˜ ํ•œ๊ณ„๋Š” ๋ช…ํ™•ํ•ด์š”. ๋ชจ๋“  ๊ฒƒ์„ ํ•œ ๊ณณ์—์„œ ์ฒ˜๋ฆฌํ•˜๋ ค๋‹ค ๋ณด๋‹ˆ ๋ณ‘๋ชฉ ํ˜„์ƒ์ด ์ƒ๊ธธ ์ˆ˜๋ฐ–์— ์—†๋Š” ๊ตฌ์กฐ์ฃ . ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ•œ ๊ฒƒ์ด ๋ฐ”๋กœ Web Workers์˜ˆ์š”. Web Workers๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—๊ฒŒ **๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ(Multi-threaded)**์™€ ์œ ์‚ฌํ•œ ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•ด ์ค˜์š”.

Web Workers๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด CPU ์ง‘์•ฝ์ ์ธ ์ž‘์—…์„ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์™€ ๋ถ„๋ฆฌ๋œ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์–ด์š”. ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋Š” UI ๋ Œ๋”๋ง์ด๋‚˜ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ์™€ ๊ฐ™์€ ํ•ต์‹ฌ ์ž‘์—…์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๊ณ , ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋Š” ํ•ญ์ƒ ๋ฐ˜์‘์„ฑ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด์ฃ . ๋งˆ์น˜ ๋ณต์žกํ•œ ์„œ๋ฅ˜ ์ž‘์—…์„ ๋ฉ”์ธ ์‚ฌ๋ฌด์‹ค์ด ์•„๋‹Œ ๋ณ„๋„์˜ ์ฐฝ๊ณ ์—์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹œ๋ฉด ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šฐ์‹ค ๊ฑฐ์˜ˆ์š”.

๐Ÿ› ๏ธ Web Workers ๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•

Web Workers๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ณผ์ •์€ ํฌ๊ฒŒ ์„ธ ๋‹จ๊ณ„๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์–ด์š”: Worker ์ƒ์„ฑ, ๋ฉ”์‹œ์ง€ ๊ธฐ๋ฐ˜ ํ†ต์‹ , ๊ทธ๋ฆฌ๊ณ  Worker ์ข…๋ฃŒ์˜ˆ์š”.

0๏ธโƒฃ Worker ์ƒ์„ฑ ๋ฐ ์Šคํฌ๋ฆฝํŠธ ๋ถ„๋ฆฌ

Worker๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋จผ์ € ๋ฉ”์ธ ์Šคํฌ๋ฆฝํŠธ์™€ ๋ณ„๋„๋กœ ์‹คํ–‰๋  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ์ค€๋น„ํ•ด์•ผ ํ•ด์š”. ์ด ํŒŒ์ผ์ด ๋ฐ”๋กœ Worker ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋  ๊ฑฐ์˜ˆ์š”.

index.html (๋ฉ”์ธ ์Šค๋ ˆ๋“œ)

<!DOCTYPE html> <html lang="ko"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Web Workers ์˜ˆ์ œ</title> <style> body { font-family: Arial, sans-serif; text-align: center; margin-top: 50px; } button { padding: 10px 20px; font-size: 16px; margin: 10px; cursor: pointer; } #result { margin-top: 20px; font-size: 18px; font-weight: bold; } #status { color: gray; margin-top: 10px; } </style> </head> <body> <h1>Web Workers๋ฅผ ์ด์šฉํ•œ ๋น„๋™๊ธฐ ์ž‘์—…</h1> <p id="status">์ค€๋น„ ์ค‘...</p> <button id="startWorker">Worker๋กœ ๊ณ„์‚ฐ ์‹œ์ž‘</button> <button id="blockUI">UI ๋ธ”๋กœํ‚น ํ…Œ์ŠคํŠธ (๋ฉ”์ธ ์Šค๋ ˆ๋“œ)</button> <div id="result"></div> <script src="main.js"></script> </body> </html>

main.js (๋ฉ”์ธ ์Šค๋ ˆ๋“œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ)

// Worker ์ƒ์„ฑ const myWorker = new Worker('worker.js'); document.getElementById('status').textContent = 'Worker๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ์–ด์š”.';

worker.js (Worker ์Šคํฌ๋ฆฝํŠธ)

// Worker ์Šคํฌ๋ฆฝํŠธ๋Š” ์ž์ฒด ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ€์ ธ์š”. // ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋กœ๋ถ€ํ„ฐ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์„ ๋•Œ ์‹คํ–‰๋  ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•ด์š”. onmessage = function(e) { console.log('Worker: ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋กœ๋ถ€ํ„ฐ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์•˜์–ด์š”!', e.data); // ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋กœ ๋ณด๋‚ด์š”. postMessage('์•ˆ๋…•ํ•˜์„ธ์š”, ๋ฉ”์ธ ์Šค๋ ˆ๋“œ! Worker์—์„œ ๋ณด๋ƒˆ์–ด์š”.'); }; console.log('Worker ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋กœ๋“œ๋˜์—ˆ์–ด์š”.');

์œ„ ์ฝ”๋“œ์—์„œ new Worker('worker.js')๋ฅผ ํ†ตํ•ด ์ƒˆ๋กœ์šด Worker ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•ด์š”. ์ด๋•Œ ์ธ์ž๋กœ ๋„˜๊ฒจ์ฃผ๋Š” 'worker.js'๋Š” Worker ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰๋  ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์˜ ๊ฒฝ๋กœ์˜ˆ์š”. ์ด ์Šคํฌ๋ฆฝํŠธ๋Š” ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์™€ ์™„์ „ํžˆ ๋ถ„๋ฆฌ๋œ ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰๋œ๋‹ต๋‹ˆ๋‹ค.

1๏ธโƒฃ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์™€ Worker ๊ฐ„ ํ†ต์‹  (postMessage, onmessage)

๋ฉ”์ธ ์Šค๋ ˆ๋“œ์™€ Worker ์Šค๋ ˆ๋“œ๋Š” ์ง์ ‘์ ์œผ๋กœ ๋ณ€์ˆ˜๋ฅผ ๊ณต์œ ํ•˜๊ฑฐ๋‚˜ DOM์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†์–ด์š”. ๋Œ€์‹  **๋ฉ”์‹œ์ง€(Message)**๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ๋ฐฉ์‹์œผ๋กœ ํ†ต์‹ ํ•ด์š”. postMessage() ๋ฉ”์„œ๋“œ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๊ณ , onmessage ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์•„์š”.

main.js (๋ฉ”์ธ ์Šค๋ ˆ๋“œ)

const myWorker = new Worker('worker.js'); const resultDiv = document.getElementById('result'); const statusP = document.getElementById('status'); // Worker๋กœ๋ถ€ํ„ฐ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์„ ๋•Œ myWorker.onmessage = function(e) { resultDiv.textContent = `Worker ์‘๋‹ต: ${e.data}`; statusP.textContent = 'Worker๋กœ๋ถ€ํ„ฐ ์‘๋‹ต์„ ๋ฐ›์•˜์–ด์š”!'; }; // Worker์—๊ฒŒ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ผ ๋•Œ document.getElementById('startWorker').addEventListener('click', () => { statusP.textContent = 'Worker์—๊ฒŒ ๊ณ„์‚ฐ์„ ์š”์ฒญ ์ค‘์ด์—์š”...'; myWorker.postMessage('๊ณ„์‚ฐ ์‹œ์ž‘!'); // Worker์—๊ฒŒ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด์š”. });

worker.js (Worker ์Šคํฌ๋ฆฝํŠธ)

onmessage = function(e) { const receivedData = e.data; console.log('Worker: ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋กœ๋ถ€ํ„ฐ', receivedData, '๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์•˜์–ด์š”.'); // ๋ฐ›์€ ๋ฉ”์‹œ์ง€๋ฅผ ๊ฐ€๊ณตํ•˜๊ฑฐ๋‚˜ ๋ฌด๊ฑฐ์šด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ ํ›„, ๊ฒฐ๊ณผ๋ฅผ ๋‹ค์‹œ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋กœ ๋ณด๋‚ด์š”. postMessage(`Worker๊ฐ€ "${receivedData}" ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ–ˆ์–ด์š”!`); };

postMessage()์˜ ์ธ์ž๋กœ๋Š” ๋ฌธ์ž์—ด, ์ˆซ์ž, ๋ฐฐ์—ด, ๊ฐ์ฒด ๋“ฑ ๊ฑฐ์˜ ๋ชจ๋“  ์ข…๋ฅ˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์–ด์š”. ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ผ ๋•Œ ๋‚ด๋ถ€์ ์œผ๋กœ ์ง๋ ฌํ™”(serialization) ๋ฐ ์—ญ์ง๋ ฌํ™”(deserialization) ๊ณผ์ •์ด ๋ฐœ์ƒํ•ด์š”. e.data๋กœ ๋ฉ”์‹œ์ง€ ๋‚ด์šฉ์„ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์–ด์š”.

2๏ธโƒฃ Worker ์ข…๋ฃŒํ•˜๊ธฐ

Worker๊ฐ€ ๋” ์ด์ƒ ํ•„์š” ์—†์„ ๋•Œ๋Š” ์ข…๋ฃŒํ•ด ์ฃผ๋Š” ๊ฒƒ์ด ์ข‹์•„์š”. Worker๋ฅผ ์ข…๋ฃŒํ•˜๋ฉด ๊ด€๋ จ ๋ฆฌ์†Œ์Šค๊ฐ€ ํ•ด์ œ๋˜์–ด ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค.

๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ์ข…๋ฃŒ:

// Worker ์ž‘์—…์„ ์ค‘๋‹จํ•˜๊ณ  ์‹ถ์„ ๋•Œ myWorker.terminate(); console.log('Worker๊ฐ€ ์ข…๋ฃŒ๋˜์—ˆ์–ด์š”.');

Worker ์Šคํฌ๋ฆฝํŠธ ๋‚ด๋ถ€์—์„œ ์ข…๋ฃŒ:

// Worker ์Šคํฌ๋ฆฝํŠธ ๋‚ด๋ถ€์—์„œ ์Šค์Šค๋กœ ์ข…๋ฃŒํ•  ๋•Œ self.close(); console.log('Worker๊ฐ€ ์Šค์Šค๋กœ ์ข…๋ฃŒ๋˜์—ˆ์–ด์š”.');

terminate()๋Š” ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ Worker๋ฅผ ๊ฐ•์ œ๋กœ ์ข…๋ฃŒํ•˜๋Š” ๋ฉ”์„œ๋“œ์ด๊ณ , self.close()๋Š” Worker ์Šคํฌ๋ฆฝํŠธ ๋‚ด๋ถ€์—์„œ ์ž๊ธฐ ์ž์‹ ์„ ์ข…๋ฃŒํ•˜๋Š” ๋ฉ”์„œ๋“œ์˜ˆ์š”. Worker๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ๋” ์ด์ƒ ๋ฉ”์‹œ์ง€๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์—†๊ฒŒ ๋ผ์š”.

๐Ÿ’ก ์‹ค์ „ ์˜ˆ์ œ: ๋ฌด๊ฑฐ์šด ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด ๊ณ„์‚ฐ

์ด์ œ Web Workers๊ฐ€ ์‹ค์ œ๋กœ UI ๋ธ”๋กœํ‚น ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•˜๋Š”์ง€ ๊ตฌ์ฒด์ ์ธ ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด ์•Œ์•„๋ณผ๊ฒŒ์š”. ๋งค์šฐ ํฐ ์ˆซ์ž์˜ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์„ ๊ณ„์‚ฐํ•˜๋Š” ์ž‘์—…์„ ๊ฐ€์ •ํ•ด ๋ด์š”.

0๏ธโƒฃ UI ๋ธ”๋กœํ‚น ์‹œ๋‚˜๋ฆฌ์˜ค (Web Workers ๋ฏธ์‚ฌ์šฉ)

๋จผ์ € Web Workers ์—†์ด ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ๋ฌด๊ฑฐ์šด ๊ณ„์‚ฐ์„ ์ฒ˜๋ฆฌํ–ˆ์„ ๋•Œ ์–ด๋–ค ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”์ง€ ํ™•์ธํ•ด ๋ณผ๊ฒŒ์š”.

main.js (Web Workers ๋ฏธ์‚ฌ์šฉ)

const resultDiv = document.getElementById('result'); const statusP = document.getElementById('status'); const blockUIButton = document.getElementById('blockUI'); const startWorkerButton = document.getElementById('startWorker'); // UI ๋ธ”๋กœํ‚น ๋ฒ„ํŠผ์€ Worker ์—†์ด ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ๋ฌด๊ฑฐ์šด ์ž‘์—…์„ ์‹คํ–‰ํ•ด์š”. blockUIButton.addEventListener('click', () => { statusP.textContent = '๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ๋ฌด๊ฑฐ์šด ๊ณ„์‚ฐ ์ค‘... UI๊ฐ€ ๋ฉˆ์ถœ ์ˆ˜ ์žˆ์–ด์š”!'; startWorkerButton.disabled = true; // ๊ณ„์‚ฐ ์ค‘ ๋‹ค๋ฅธ ๋ฒ„ํŠผ ๋น„ํ™œ์„ฑํ™” blockUIButton.disabled = true; const num = 45; // ํ”ผ๋ณด๋‚˜์น˜ ๊ณ„์‚ฐํ•  ์ˆซ์ž const startTime = performance.now(); const fibResult = calculateFibonacci(num); // ๋ฌด๊ฑฐ์šด ๊ณ„์‚ฐ const endTime = performance.now(); resultDiv.textContent = `ํ”ผ๋ณด๋‚˜์น˜(${num}) ๊ฒฐ๊ณผ: ${fibResult} (์†Œ์š” ์‹œ๊ฐ„: ${(endTime - startTime).toFixed(2)}ms)`; statusP.textContent = '๋ฉ”์ธ ์Šค๋ ˆ๋“œ ๊ณ„์‚ฐ ์™„๋ฃŒ!'; startWorkerButton.disabled = false; blockUIButton.disabled = false; }); // ๋ฌด๊ฑฐ์šด ํ”ผ๋ณด๋‚˜์น˜ ๊ณ„์‚ฐ ํ•จ์ˆ˜ (์žฌ๊ท€ ๋ฐฉ์‹) function calculateFibonacci(n) { if (n <= 1) return n; return calculateFibonacci(n - 1) + calculateFibonacci(n - 2); } // Worker ์‹œ์ž‘ ๋ฒ„ํŠผ์€ ์ž ์‹œ ๋น„ํ™œ์„ฑํ™” (์ด ์˜ˆ์ œ์—์„œ๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„์š”) startWorkerButton.disabled = true; statusP.textContent = '์ค€๋น„ ์™„๋ฃŒ. "UI ๋ธ”๋กœํ‚น ํ…Œ์ŠคํŠธ" ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ๋ณด์„ธ์š”.';

์œ„ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  "UI ๋ธ”๋กœํ‚น ํ…Œ์ŠคํŠธ" ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ๋ณด์„ธ์š”. ์•„๋งˆ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋Š” ์ˆœ๊ฐ„๋ถ€ํ„ฐ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ฌ ๋•Œ๊นŒ์ง€ ๋‹ค๋ฅธ UI ์กฐ์ž‘์ด ๋ถˆ๊ฐ€๋Šฅํ•ด์ง€๊ณ , ํ™”๋ฉด์ด ์ž ์‹œ ๋ฉˆ์ถ”๋Š” ๊ฒƒ์„ ๊ฒฝํ—˜ํ•˜์‹ค ๊ฑฐ์˜ˆ์š”. ์ด๊ฒƒ์ด ๋ฐ”๋กœ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ธ”๋กœํ‚น๋˜๋Š” ํ˜„์ƒ์ด๋ž๋‹ˆ๋‹ค.

1๏ธโƒฃ Web Workers ์ ์šฉํ•˜์—ฌ UI ์œ ์ง€ํ•˜๊ธฐ

์ด์ œ Web Workers๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด ๋ฌด๊ฑฐ์šด ํ”ผ๋ณด๋‚˜์น˜ ๊ณ„์‚ฐ์„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์ฒ˜๋ฆฌํ•ด ๋ณผ๊ฒŒ์š”. ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋Š” UI ๋ฐ˜์‘์„ฑ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋  ๊ฑฐ์˜ˆ์š”.

main.js (Web Workers ์ ์šฉ)

const resultDiv = document.getElementById('result'); const statusP = document.getElementById('status'); const blockUIButton = document.getElementById('blockUI'); const startWorkerButton = document.getElementById('startWorker'); +// Web Worker ์ƒ์„ฑ +const fibonacciWorker = new Worker('fibonacciWorker.js'); + +// Worker๋กœ๋ถ€ํ„ฐ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์„ ๋•Œ +fibonacciWorker.onmessage = function(e) { + const { result, time } = e.data; + resultDiv.textContent = `ํ”ผ๋ณด๋‚˜์น˜ ๊ฒฐ๊ณผ (Worker): ${result} (์†Œ์š” ์‹œ๊ฐ„: ${time.toFixed(2)}ms)`; + statusP.textContent = 'Worker ๊ณ„์‚ฐ ์™„๋ฃŒ!'; + startWorkerButton.disabled = false; + blockUIButton.disabled = false; +}; + +// Worker์—๊ฒŒ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ +fibonacciWorker.onerror = function(error) { + statusP.textContent = `Worker ์—๋Ÿฌ: ${error.message}`; + console.error('Worker error:', error); + startWorkerButton.disabled = false; + blockUIButton.disabled = false; +}; // UI ๋ธ”๋กœํ‚น ๋ฒ„ํŠผ์€ Worker ์—†์ด ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ๋ฌด๊ฑฐ์šด ์ž‘์—…์„ ์‹คํ–‰ํ•ด์š”. blockUIButton.addEventListener('click', () => { statusP.textContent = '๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ๋ฌด๊ฑฐ์šด ๊ณ„์‚ฐ ์ค‘... UI๊ฐ€ ๋ฉˆ์ถœ ์ˆ˜ ์žˆ์–ด์š”!'; startWorkerButton.disabled = true; blockUIButton.disabled = true; const num = 45; // ํ”ผ๋ณด๋‚˜์น˜ ๊ณ„์‚ฐํ•  ์ˆซ์ž const startTime = performance.now(); const fibResult = calculateFibonacci(num); // ๋ฌด๊ฑฐ์šด ๊ณ„์‚ฐ const endTime = performance.now(); resultDiv.textContent = `ํ”ผ๋ณด๋‚˜์น˜(${num}) ๊ฒฐ๊ณผ: ${fibResult} (์†Œ์š” ์‹œ๊ฐ„: ${(endTime - startTime).toFixed(2)}ms)`; statusP.textContent = '๋ฉ”์ธ ์Šค๋ ˆ๋“œ ๊ณ„์‚ฐ ์™„๋ฃŒ!'; startWorkerButton.disabled = false; blockUIButton.disabled = false; }); // ๋ฌด๊ฑฐ์šด ํ”ผ๋ณด๋‚˜์น˜ ๊ณ„์‚ฐ ํ•จ์ˆ˜ (์žฌ๊ท€ ๋ฐฉ์‹) function calculateFibonacci(n) { if (n <= 1) return n; return calculateFibonacci(n - 1) + calculateFibonacci(n - 2); } -// Worker ์‹œ์ž‘ ๋ฒ„ํŠผ์€ ์ž ์‹œ ๋น„ํ™œ์„ฑํ™” (์ด ์˜ˆ์ œ์—์„œ๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„์š”) -startWorkerButton.disabled = true; -statusP.textContent = '์ค€๋น„ ์™„๋ฃŒ. "UI ๋ธ”๋กœํ‚น ํ…Œ์ŠคํŠธ" ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ๋ณด์„ธ์š”.'; + +document.getElementById('startWorker').addEventListener('click', () => { + statusP.textContent = 'Worker์—๊ฒŒ ํ”ผ๋ณด๋‚˜์น˜ ๊ณ„์‚ฐ ์š”์ฒญ ์ค‘์ด์—์š”...'; + startWorkerButton.disabled = true; + blockUIButton.disabled = true; + fibonacciWorker.postMessage(45); // Worker์—๊ฒŒ ๊ณ„์‚ฐํ•  ์ˆซ์ž๋ฅผ ๋ณด๋‚ด์š”. +}); + +statusP.textContent = '์ค€๋น„ ์™„๋ฃŒ. ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ๋ณด์„ธ์š”.';

fibonacciWorker.js (Worker ์Šคํฌ๋ฆฝํŠธ)

// ๋ฌด๊ฑฐ์šด ํ”ผ๋ณด๋‚˜์น˜ ๊ณ„์‚ฐ ํ•จ์ˆ˜ function calculateFibonacci(n) { if (n <= 1) return n; return calculateFibonacci(n - 1) + calculateFibonacci(n - 2); } // ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋กœ๋ถ€ํ„ฐ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์„ ๋•Œ onmessage = function(e) { const num = e.data; console.log(`Worker: ํ”ผ๋ณด๋‚˜์น˜(${num}) ๊ณ„์‚ฐ ์‹œ์ž‘`); const startTime = performance.now(); const result = calculateFibonacci(num); const endTime = performance.now(); // ๊ณ„์‚ฐ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋กœ ๋‹ค์‹œ ๋ณด๋‚ด์š”. postMessage({ result: result, time: endTime - startTime }); };

์ด์ œ "Worker๋กœ ๊ณ„์‚ฐ ์‹œ์ž‘" ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ๋ณด์„ธ์š”. ๊ณ„์‚ฐ์ด ์ง„ํ–‰๋˜๋Š” ๋™์•ˆ์—๋„ "UI ๋ธ”๋กœํ‚น ํ…Œ์ŠคํŠธ" ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๊ฑฐ๋‚˜ ๋‹ค๋ฅธ UI ์š”์†Œ๋ฅผ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”. ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋Š” ์ž์œ ๋กญ๊ฒŒ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๊ณ , ๋ฌด๊ฑฐ์šด ํ”ผ๋ณด๋‚˜์น˜ ๊ณ„์‚ฐ์€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ Worker ์Šค๋ ˆ๋“œ์—์„œ ๋…๋ฆฝ์ ์œผ๋กœ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์ด์ฃ .

์„ฑ๊ณต

์ด์ฒ˜๋Ÿผ Web Workers๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ฐ˜์‘์„ฑ์„ ์œ ์ง€ํ•˜๋ฉด์„œ๋„ ๋ณต์žกํ•œ ์—ฐ์‚ฐ์„ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ผ์š”. ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ๋ž๋‹ˆ๋‹ค!

๐ŸŽฏ Web Workers์˜ ๊ณ ๊ธ‰ ํ™œ์šฉ๊ณผ ์ฃผ์˜์‚ฌํ•ญ

Web Workers๋Š” ๋‹จ์ˆœํ•œ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—… ์™ธ์—๋„ ๋‹ค์–‘ํ•œ ํ™œ์šฉ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์œผ๋ฉฐ, ๋ช‡ ๊ฐ€์ง€ ์ฃผ์˜ํ•  ์ ๋„ ์žˆ์–ด์š”.

0๏ธโƒฃ SharedWorker์™€ Service Worker (๊ฐ„๋žต ์†Œ๊ฐœ)

์šฐ๋ฆฌ๊ฐ€ ์ง€๊ธˆ๊นŒ์ง€ ๋‹ค๋ฃฌ Worker๋Š” DedicatedWorker๋ผ๊ณ  ๋ถˆ๋ฆฌ๋ฉฐ, ํ•˜๋‚˜์˜ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์— ํ•˜๋‚˜์˜ Worker ์Šค๋ ˆ๋“œ๊ฐ€ ์—ฐ๊ฒฐ๋˜๋Š” ๋ฐฉ์‹์ด์—์š”. ํ•˜์ง€๋งŒ Worker์—๋Š” ๋‹ค๋ฅธ ์ข…๋ฅ˜๋„ ์žˆ์–ด์š”.

  • SharedWorker: ์—ฌ๋Ÿฌ ๋ธŒ๋ผ์šฐ์ง• ์ปจํ…์ŠคํŠธ(ํƒญ, ์ฐฝ, iframe ๋“ฑ)์—์„œ ๊ณต์œ ๋  ์ˆ˜ ์žˆ๋Š” Worker์˜ˆ์š”. ์—ฌ๋Ÿฌ ํƒญ์—์„œ ๋™์ผํ•œ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์„ ๊ณต์œ ํ•ด์•ผ ํ•  ๋•Œ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋ผ์š”.
  • Service Worker: ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ๋ธŒ๋ผ์šฐ์ € ์‚ฌ์ด์˜ ํ”„๋ก์‹œ ์—ญํ• ์„ ํ•˜๋Š” Worker์˜ˆ์š”. ํ‘ธ์‹œ ์•Œ๋ฆผ, ๋ฐฑ๊ทธ๋ผ์šด๋“œ ๋™๊ธฐํ™”, ์˜คํ”„๋ผ์ธ ์บ์‹ฑ ๋“ฑ PWA(Progressive Web App)์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ต๋‹ˆ๋‹ค.

์ด ๊ธ€์—์„œ๋Š” DedicatedWorker์— ์ง‘์ค‘ํ–ˆ์ง€๋งŒ, ํ•„์š”์— ๋”ฐ๋ผ ๋‹ค๋ฅธ Worker๋“ค๋„ ํƒ์ƒ‰ํ•ด ๋ณด์‹œ๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•ด์š”.

1๏ธโƒฃ ๋ฐ์ดํ„ฐ ์ „์†ก ์„ฑ๋Šฅ ์ตœ์ ํ™”: Transferable Objects

์•ž์„œ postMessage()๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ๋•Œ ์ง๋ ฌํ™”/์—ญ์ง๋ ฌํ™”๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๊ณ  ๋ง์”€๋“œ๋ ธ์ฃ ? ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•  ๋•Œ๋Š” ์ด ๊ณผ์ •์ด ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์–ด์š”. ์ด๋•Œ Transferable Objects๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์‚ฌํ•˜๋Š” ๋Œ€์‹  **์ „์†ก(transfer)**ํ•  ์ˆ˜ ์žˆ์–ด์„œ ํ›จ์”ฌ ํšจ์œจ์ ์ด์—์š”.

Transferable Objects๋Š” ArrayBuffer, MessagePort, ImageBitmap, OffscreenCanvas ๋“ฑ์ด ์žˆ์–ด์š”. ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๋ฉด ์›๋ณธ ๋ฐ์ดํ„ฐ๋Š” ๋” ์ด์ƒ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ฒŒ ๋˜๊ณ , Worker ์Šค๋ ˆ๋“œ๋กœ ์†Œ์œ ๊ถŒ์ด ์ด์ „๋œ๋‹ต๋‹ˆ๋‹ค. ๋งˆ์น˜ ๋ฌผ๊ฑด์„ ํƒ๋ฐฐ๋กœ ๋ณด๋‚ด๋ฉด ์›๋ณธ์€ ๋‚ด ์†์— ์—†๊ณ  ๋ฐ›๋Š” ์‚ฌ๋žŒ์—๊ฒŒ ๋„˜์–ด๊ฐ€๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„์š”.

main.js (Transferable Objects ์‚ฌ์šฉ ์˜ˆ์‹œ)

const largeArrayBuffer = new ArrayBuffer(1024 * 1024 * 10); // 10MB ArrayBuffer const worker = new Worker('myWorker.js'); // ArrayBuffer๋ฅผ ๋ณต์‚ฌํ•˜๋Š” ๋Œ€์‹  ์ „์†กํ•ด์š”. worker.postMessage({ buffer: largeArrayBuffer }, [largeArrayBuffer]); // ์ด์ œ largeArrayBuffer๋Š” ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ๋” ์ด์ƒ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์–ด์š”. // console.log(largeArrayBuffer.byteLength); // ์—๋Ÿฌ ๋ฐœ์ƒ ๋˜๋Š” 0์ด ๋  ์ˆ˜ ์žˆ์–ด์š”.

myWorker.js (Worker ์Šคํฌ๋ฆฝํŠธ)

onmessage = function(e) { const receivedBuffer = e.data.buffer; console.log('Worker: ์ˆ˜์‹ ๋œ ArrayBuffer์˜ ํฌ๊ธฐ:', receivedBuffer.byteLength, 'bytes'); // Worker์—์„œ ArrayBuffer๋ฅผ ์‚ฌ์šฉํ•ด์š”. };

๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ๋Š” ๋ฐ˜๋“œ์‹œ Transferable Objects๋ฅผ ๊ณ ๋ คํ•˜์—ฌ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•ด ๋ณด์„ธ์š”.

2๏ธโƒฃ Web Workers ์‚ฌ์šฉ ์‹œ ์ฃผ์˜ํ•  ์ 

Web Workers๋Š” ๊ฐ•๋ ฅํ•˜์ง€๋งŒ ๋ช‡ ๊ฐ€์ง€ ์ œ์•ฝ ์‚ฌํ•ญ์ด ์žˆ์–ด์š”.

  • DOM ์ ‘๊ทผ ๋ถˆ๊ฐ€: Worker ์Šค๋ ˆ๋“œ๋Š” window, document์™€ ๊ฐ™์€ DOM ๊ฐ์ฒด์— ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์—†์–ด์š”. UI ๋ณ€๊ฒฝ์€ ๋ฐ˜๋“œ์‹œ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋ฅผ ํ†ตํ•ด ์ด๋ฃจ์–ด์ ธ์•ผ ํ•ด์š”.
  • ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์˜ ์ „์—ญ ๊ฐ์ฒด ์ ‘๊ทผ ๋ถˆ๊ฐ€: alert(), confirm() ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋‚˜ window ๊ฐ์ฒด์˜ ๋‹ค๋ฅธ ์†์„ฑ์—๋„ ์ ‘๊ทผํ•  ์ˆ˜ ์—†์–ด์š”.
  • ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ ์ œํ•œ: Worker ์Šคํฌ๋ฆฝํŠธ๋Š” file:// ํ”„๋กœํ† ์ฝœ์—์„œ๋Š” ๋™์ž‘ํ•˜์ง€ ์•Š์•„์š”. ์›น ์„œ๋ฒ„๋ฅผ ํ†ตํ•ด ์ œ๊ณต๋˜์–ด์•ผ ํ•œ๋‹ต๋‹ˆ๋‹ค.
  • Same-Origin Policy: Worker ์Šคํฌ๋ฆฝํŠธ๋Š” ๋ฉ”์ธ ์Šคํฌ๋ฆฝํŠธ์™€ ๋™์ผํ•œ ์ถœ์ฒ˜(origin)๋ฅผ ๊ฐ€์ ธ์•ผ ํ•ด์š”. ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ Worker๋กœ ๋กœ๋“œํ•  ์ˆ˜ ์—†๋‹ต๋‹ˆ๋‹ค.
  • ํ†ต์‹  ๋น„์šฉ: ๋ฉ”์‹œ์ง€๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ๊ณผ์ •์—๋„ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•ด์š”. ๋„ˆ๋ฌด ์ž‘์€ ์ž‘์—…์„ Worker๋กœ ๋ถ„๋ฆฌํ•˜๋ฉด ์˜คํžˆ๋ ค ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ์œผ๋‹ˆ, ์ถฉ๋ถ„ํžˆ ๋ฌด๊ฑฐ์šด ์ž‘์—…์—๋งŒ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์•„์š”.

์ด๋Ÿฌํ•œ ์ œ์•ฝ ์‚ฌํ•ญ๋“ค์„ ์ž˜ ์ดํ•ดํ•˜๊ณ  ์‚ฌ์šฉํ•ด์•ผ Web Workers์˜ ์žฅ์ ์„ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”.

๐Ÿ“ ์ •๋ฆฌํ•˜๋ฉฐ

0๏ธโƒฃ Web Workers ํ•ต์‹ฌ ์š”์•ฝ

์˜ค๋Š˜์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Web Workers๋ฅผ ํ†ตํ•ด ํ”„๋ก ํŠธ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ๊ณผ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๊ฐœ์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์•˜์–ด์š”.

  • ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ํ•œ๊ณ„: ๋ฌด๊ฑฐ์šด ์ž‘์—…์ด ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋ฅผ ๋ธ”๋กœํ‚นํ•˜์—ฌ UI ๋ฐ˜์‘์„ฑ์„ ์ €ํ•ดํ•ด์š”.
  • Web Workers์˜ ์—ญํ• : ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์Šค๋ ˆ๋“œ์—์„œ ๋ฌด๊ฑฐ์šด ์ž‘์—…์„ ์‹คํ–‰ํ•˜์—ฌ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์˜ ๋ถ€๋‹ด์„ ๋œ๊ณ  UI ๋ฐ˜์‘์„ฑ์„ ์œ ์ง€ํ•ด์š”.
  • ๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•: new Worker()๋กœ ์ƒ์„ฑํ•˜๊ณ , postMessage()์™€ onmessage๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ์ฃผ๊ณ ๋ฐ›์œผ๋ฉฐ ํ†ต์‹ ํ•ด์š”.
  • ์„ฑ๋Šฅ ์ตœ์ ํ™”: ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ ์ „์†ก ์‹œ์—๋Š” Transferable Objects๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ณต์‚ฌ ๋น„์šฉ์„ ์ค„์ผ ์ˆ˜ ์žˆ์–ด์š”.
  • ์ฃผ์˜์‚ฌํ•ญ: DOM ์ ‘๊ทผ ๋ถˆ๊ฐ€, ๋ฉ”์ธ ์Šค๋ ˆ๋“œ ์ „์—ญ ๊ฐ์ฒด ์ ‘๊ทผ ๋ถˆ๊ฐ€ ๋“ฑ ์ œ์•ฝ ์‚ฌํ•ญ์„ ์ธ์ง€ํ•˜๊ณ  ์‚ฌ์šฉํ•ด์•ผ ํ•ด์š”.

Web Workers๋Š” ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ, ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ, ์•”ํ˜ธํ™” ๋“ฑ ๋‹ค์–‘ํ•œ CPU ์ง‘์•ฝ์ ์ธ ์ž‘์—…์— ํ™œ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์˜ˆ์š”. ์—ฌ๋Ÿฌ๋ถ„์˜ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋”์šฑ ๋น ๋ฅด๊ณ  ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ๋งŒ๋“œ๋Š” ๋ฐ ํฐ ๋„์›€์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ด์š”.

1๏ธโƒฃ ๋‹ค์Œ ์Šคํ…: ๋” ๋‚˜์€ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์œ„ํ•ด

Web Workers ์™ธ์—๋„ ์›น ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•œ ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•๋“ค์ด ์กด์žฌํ•ด์š”. ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ ์ตœ์ ํ™”, ์ด๋ฏธ์ง€ ์ตœ์ ํ™”, ์บ์‹ฑ ์ „๋žต ๋“ฑ ์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ•์„ ํ•จ๊ป˜ ์ ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ตœ๊ณ ์˜ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•ด ๋ณด์„ธ์š”. Web Workers๋Š” ๊ทธ์ค‘์—์„œ๋„ ํŠนํžˆ "์—ฐ์‚ฐ ์ง‘์ค‘์ ์ธ ์ž‘์—…"์œผ๋กœ ์ธํ•œ UI ๋ธ”๋กœํ‚น ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ํŠนํ™”๋œ ์†”๋ฃจ์…˜์ž„์„ ๊ธฐ์–ตํ•ด ์ฃผ์„ธ์š”.

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

๐Ÿ“ฎ ์ฐธ๊ณ 

์—ฐ๊ด€๋œ ํฌ์ŠคํŠธ