๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ๊ตฌํ˜„: Web Worker์™€ WebAssembly

๋น„๋™๊ธฐ๋กœ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค? ๋งŽ์ด๋“ค async/await๋งŒ ์“ฐ๋ฉด ์ž‘์—…์ด โ€œ๋™์‹œ์—โ€ ๋ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋น„๋™๊ธฐ๋Š” ํ•˜๋‚˜์˜ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๊ฐ€ ์ผ์„ ์ž˜๊ฒŒ ์ชผ๊ฐœ ์ˆœ์„œ ์—†์ด ์ฒ˜๋ฆฌํ•ด ๋ณด์ด๋Š” ๊ธฐ๋ฒ•์ด์ง€, ์‹ค์ œ๋กœ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ณ‘๋ ฌ๋กœ ๊ณ„์‚ฐํ•˜๋Š” ๊ฑด ์•„๋‹™๋‹ˆ๋‹ค.

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

1. ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๊ฐ€ ํ•„์š”ํ•œ ์ด์œ 

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

2. Web Worker๋กœ ๋™์‹œ์„ฑ ๊ตฌํ˜„

Web Worker๋Š” ๋ณ„๋„์˜ ์Šค๋ ˆ๋“œ์—์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ๋ฉ”์ธ ์Šค๋ ˆ๋“œ(UI)์™€ ๋…๋ฆฝ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋ฏ€๋กœ ๋ฌด๊ฑฐ์šด ์—ฐ์‚ฐ์„ ๋งก๊ธฐ๊ธฐ ์ข‹์Šต๋‹ˆ๋‹ค.

// worker.js (๋ณ„๋„์˜ ํŒŒ์ผ)
self.onmessage = function(event) {
  let num = event.data;
  let result = 0;
  for (let i = 0; i < num; i++) {
    result += i;
  }
  self.postMessage(result);
};
// main.js
const worker = new Worker("worker.js");
worker.postMessage(1000000); // Worker์—๊ฒŒ ์ž‘์—… ์š”์ฒญ

worker.onmessage = (e) => {
  console.log("๊ฒฐ๊ณผ:", e.data);
};



Web Worker๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด UI ๋ฉˆ์ถค ์—†์ด ๋ฌด๊ฑฐ์šด ๊ณ„์‚ฐ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3. WebAssembly๋ฅผ ํ™œ์šฉํ•œ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ

WebAssembly(WASM)๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋™์ž‘ํ•˜๋Š” ์ €์ˆ˜์ค€ ์ด์ง„ ์ฝ”๋“œ ํฌ๋งท์ž…๋‹ˆ๋‹ค. ์„ฑ๋Šฅ์ด ์ค‘์š”ํ•œ ์—ฐ์‚ฐ์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋Œ€์‹  C/C++/Rust ๊ฐ™์€ ์–ธ์–ด๋กœ ์ž‘์„ฑํ•œ ๋’ค, WebAssembly๋กœ ์ปดํŒŒ์ผํ•ด์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

// ์˜ˆ์‹œ: C ์ฝ”๋“œ (sum.c)
int sum(int n) {
  int result = 0;
  for (int i = 0; i < n; i++) {
    result += i;
  }
  return result;
}

์ด ์ฝ”๋“œ๋ฅผ emscripten ๊ฐ™์€ ๋„๊ตฌ๋กœ WebAssembly๋กœ ์ปดํŒŒ์ผํ•˜๋ฉด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๊ณ ์„ฑ๋Šฅ์œผ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4. Web Worker vs WebAssembly ๋น„๊ต

๊ตฌ๋ถ„ Web Worker WebAssembly
์ฃผ์š” ๋ชฉ์  UI์™€ ๋ถ„๋ฆฌ๋œ ๋น„๋™๊ธฐ ์‹คํ–‰ ๊ณ ์„ฑ๋Šฅ ์—ฐ์‚ฐ (C/C++/Rust ํ™œ์šฉ)
์žฅ์  JS๋งŒ์œผ๋กœ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ๊ฐ€๋Šฅ ๋„ค์ดํ‹ฐ๋ธŒ์— ๊ฐ€๊นŒ์šด ์„ฑ๋Šฅ
๋‹จ์  ์„ฑ๋Šฅ์€ JS ํ•œ๊ณ„ ๋‚ด ํ•™์Šต/๋นŒ๋“œ ๊ณผ์ •์ด ํ•„์š”

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

+ Recent posts