JavaScript ๋ชจ๋ ์์ปค์ ๋ํ ํฌ๊ด์ ์ธ ๊ฐ์ด๋๋ก, ๊ตฌํ, ์ด์ , ์ฌ์ฉ ์ฌ๋ก ๋ฐ ๊ณ ์ฑ๋ฅ ์น ์ ํ๋ฆฌ์ผ์ด์ ๊ตฌ์ถ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ค๋ฃน๋๋ค.
JavaScript ๋ชจ๋ ์์ปค: ํฅ์๋ ์ฑ๋ฅ์ ์ํ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ฒ๋ฆฌ ํ์ฉ
์ค๋๋ ์ ์น ๊ฐ๋ฐ ํ๊ฒฝ์์ ๋ฐ์์ฑ์ด ๋ฐ์ด๋๊ณ ์ฑ๋ฅ์ด ์ฐ์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๊ณตํ๋ ๊ฒ์ ๋งค์ฐ ์ค์ํฉ๋๋ค. JavaScript๋ ๊ฐ๋ ฅํ์ง๋ง ๋ณธ์ง์ ์ผ๋ก ๋จ์ผ ์ค๋ ๋์ ๋๋ค. ์ด๋ ํนํ ๊ณ์ฐ ์ง์ฝ์ ์ธ ์์ ์ ์ฒ๋ฆฌํ ๋ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์ด๋ํ ์ ์์ต๋๋ค. JavaScript ๋ชจ๋ ์์ปค๋ฅผ ์ฌ์ฉํ์ธ์. โ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ค๋ ๋๋ก ์์ ์ ์คํ๋ก๋ํ์ฌ ๊ธฐ๋ณธ ์ค๋ ๋๊ฐ ์ฌ์ฉ์ ์ธํฐํ์ด์ค ์ ๋ฐ์ดํธ ๋ฐ ์ํธ ์์ฉ์ ์ฒ๋ฆฌํ๋๋ก ํ์ฌ ๋์ฑ ๋ถ๋๋ฝ๊ณ ๋ฐ์์ฑ์ด ๋ฐ์ด๋ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๋ ํ๋์ ์ธ ์๋ฃจ์ ์ ๋๋ค.
JavaScript ๋ชจ๋ ์์ปค๋ ๋ฌด์์ธ๊ฐ์?
JavaScript ๋ชจ๋ ์์ปค๋ ์น ํ์ด์ง ๋๋ ์น ์ ํ๋ฆฌ์ผ์ด์
์ ๊ธฐ๋ณธ ์คํ ์ค๋ ๋์ ๋ณ๋๋ก ๋ฐฑ๊ทธ๋ผ์ด๋ ์ค๋ ๋์์ JavaScript ์ฝ๋๋ฅผ ์คํํ ์ ์๋๋ก ํ๋ ์น ์์ปค์ ํ ์ ํ์
๋๋ค. ๊ธฐ์กด ์น ์์ปค์ ๋ฌ๋ฆฌ ๋ชจ๋ ์์ปค๋ ES ๋ชจ๋(import
๋ฐ export
๋ฌธ) ์ฌ์ฉ์ ์ง์ํ์ฌ ์ฝ๋ ๊ตฌ์ฑ ๋ฐ ์ข
์์ฑ ๊ด๋ฆฌ๋ฅผ ํจ์ฌ ๋ ์ฝ๊ณ ์ ์ง ๊ด๋ฆฌ ๊ฐ๋ฅํ๊ฒ ๋ง๋ญ๋๋ค. ๊ธฐ๋ณธ ์ค๋ ๋๋ฅผ ์ฐจ๋จํ์ง ์๊ณ ์์
์ ์ํํ ์ ์๋ ๋ณ๋ ฌ๋ก ์คํ๋๋ ๋
๋ฆฝ์ ์ธ JavaScript ํ๊ฒฝ์ด๋ผ๊ณ ์๊ฐํ์ญ์์ค.
๋ชจ๋ ์์ปค ์ฌ์ฉ์ ์ฃผ์ ์ด์ :
- ๊ฐ์ ๋ ์๋ต์ฑ: ๊ณ์ฐ ์ง์ฝ์ ์ธ ์์ ์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ค๋ ๋๋ก ์คํ๋ก๋ํ๋ฉด ๊ธฐ๋ณธ ์ค๋ ๋๋ UI ์ ๋ฐ์ดํธ ๋ฐ ์ฌ์ฉ์ ์ํธ ์์ฉ์ ์ฒ๋ฆฌํ ์ ์์ผ๋ฏ๋ก ๋์ฑ ๋ถ๋๋ฝ๊ณ ๋ฐ์์ฑ์ด ๋ฐ์ด๋ ์ฌ์ฉ์ ๊ฒฝํ์ ์ป์ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๋ณต์กํ ์ด๋ฏธ์ง ์ฒ๋ฆฌ ์์ ์ ์์ํด ๋ณด์ธ์. ๋ชจ๋ ์์ปค๊ฐ ์์ผ๋ฉด ์ฒ๋ฆฌ๊ฐ ์๋ฃ๋ ๋๊น์ง UI๊ฐ ๋ฉ์ถฅ๋๋ค. ๋ชจ๋ ์์ปค๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ฏธ์ง ์ฒ๋ฆฌ๊ฐ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์ํ๋๊ณ UI๊ฐ ์๋ต์ฑ์ ์ ์งํฉ๋๋ค.
- ํฅ์๋ ์ฑ๋ฅ: ๋ชจ๋ ์์ปค๋ ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ์ฌ ๋ฉํฐ ์ฝ์ด ํ๋ก์ธ์๋ฅผ ํ์ฉํ์ฌ ์์ ์ ๋์์ ์คํํ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๊ณ์ฐ ์ง์ฝ์ ์ธ ์์ ์ ์ ์ฒด ์คํ ์๊ฐ์ ํฌ๊ฒ ์ค์ผ ์ ์์ต๋๋ค.
- ๊ฐ์ํ๋ ์ฝ๋ ๊ตฌ์ฑ: ๋ชจ๋ ์์ปค๋ ES ๋ชจ๋์ ์ง์ํ์ฌ ๋ ๋์ ์ฝ๋ ๊ตฌ์ฑ ๋ฐ ์ข ์์ฑ ๊ด๋ฆฌ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ ์ฝ๊ฒ ์์ฑ, ์ ์ง ๊ด๋ฆฌ ๋ฐ ํ ์คํธํ ์ ์์ต๋๋ค.
- ๊ธฐ๋ณธ ์ค๋ ๋ ๋ก๋ ๊ฐ์: ์์ ์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ค๋ ๋๋ก ์คํ๋ก๋ํ๋ฉด ๊ธฐ๋ณธ ์ค๋ ๋์ ๋ถํ๋ฅผ ์ค์ฌ ์ฑ๋ฅ์ ํฅ์์ํค๊ณ ํนํ ๋ชจ๋ฐ์ผ ์ฅ์น์์ ๋ฐฐํฐ๋ฆฌ ์๋น๋ฅผ ์ค์ผ ์ ์์ต๋๋ค.
๋ชจ๋ ์์ปค์ ์๋ ๋ฐฉ์: ์์ธํ ์ดํด๋ณด๊ธฐ
๋ชจ๋ ์์ปค์ ํต์ฌ ๊ฐ๋ ์ JavaScript ์ฝ๋๋ฅผ ๋ ๋ฆฝ์ ์ผ๋ก ์คํํ ์ ์๋ ๋ณ๋์ ์คํ ์ปจํ ์คํธ๋ฅผ ๋ง๋๋ ๊ฒ์ ๋๋ค. ๋ค์์ ์๋ ๋ฐฉ์์ ๋ํ ๋จ๊ณ๋ณ ๋ถ์์ ๋๋ค.
- ์์ปค ์์ฑ: ๊ธฐ๋ณธ JavaScript ์ฝ๋์์ ์์ปค ์คํฌ๋ฆฝํธ์ ๊ฒฝ๋ก๋ฅผ ์ง์ ํ์ฌ ์ ๋ชจ๋ ์์ปค ์ธ์คํด์ค๋ฅผ ๋ง๋ญ๋๋ค. ์์ปค ์คํฌ๋ฆฝํธ๋ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์คํํ ์ฝ๋๋ฅผ ํฌํจํ๋ ๋ณ๋์ JavaScript ํ์ผ์ ๋๋ค.
- ๋ฉ์์ง ์ ๋ฌ: ๊ธฐ๋ณธ ์ค๋ ๋์ ์์ปค ์ค๋ ๋ ๊ฐ์ ํต์ ์ ๋ฉ์์ง ์ ๋ฌ์ ํตํด ๋ฐ์ํฉ๋๋ค. ๊ธฐ๋ณธ ์ค๋ ๋๋
postMessage()
๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์์ปค ์ค๋ ๋๋ก ๋ฉ์์ง๋ฅผ ๋ณด๋ผ ์ ์์ผ๋ฉฐ, ์์ปค ์ค๋ ๋๋ ๋์ผํ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๊ธฐ๋ณธ ์ค๋ ๋๋ก ๋ฉ์์ง๋ฅผ ๋ค์ ๋ณด๋ผ ์ ์์ต๋๋ค. - ๋ฐฑ๊ทธ๋ผ์ด๋ ์คํ: ์์ปค ์ค๋ ๋๊ฐ ๋ฉ์์ง๋ฅผ ๋ฐ์ผ๋ฉด ํด๋น ์ฝ๋๋ฅผ ์คํํฉ๋๋ค. ์์ปค ์ค๋ ๋๋ ๊ธฐ๋ณธ ์ค๋ ๋์ ๋ ๋ฆฝ์ ์ผ๋ก ์๋ํ๋ฏ๋ก ์ค๋ ์คํ๋๋ ์์ ์ UI๋ฅผ ์ฐจ๋จํ์ง ์์ต๋๋ค.
- ๊ฒฐ๊ณผ ์ฒ๋ฆฌ: ์์ปค ์ค๋ ๋๊ฐ ์์ ์ ์๋ฃํ๋ฉด ๊ฒฐ๊ณผ๋ฅผ ํฌํจํ๋ ๋ฉ์์ง๋ฅผ ๊ธฐ๋ณธ ์ค๋ ๋๋ก ๋ค์ ๋ณด๋ ๋๋ค. ๊ทธ๋ฐ ๋ค์ ๊ธฐ๋ณธ ์ค๋ ๋๋ ๊ฒฐ๊ณผ๋ฅผ ์ฒ๋ฆฌํ๊ณ ๊ทธ์ ๋ฐ๋ผ UI๋ฅผ ์ ๋ฐ์ดํธํ ์ ์์ต๋๋ค.
๋ชจ๋ ์์ปค ๊ตฌํ: ์ค์ฉ์ ์ธ ๊ฐ์ด๋
๊ณ์ฐ ์ง์ฝ์ ์ธ ๊ณ์ฐ์ ์ํํ๊ธฐ ์ํด ๋ชจ๋ ์์ปค๋ฅผ ๊ตฌํํ๋ ์ค์ฉ์ ์ธ ์๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์ฆ, n๋ฒ์งธ ํผ๋ณด๋์น ์ ๊ณ์ฐ์ ๋๋ค.
1๋จ๊ณ: ์์ปค ์คํฌ๋ฆฝํธ ์์ฑ(fibonacci.worker.js)
๋ค์ ๋ด์ฉ์ ์ฌ์ฉํ์ฌ fibonacci.worker.js
๋ผ๋ ์ JavaScript ํ์ผ์ ๋ง๋ญ๋๋ค.
// fibonacci.worker.js
function fibonacci(n) {
if (n <= 1) {
return n;
} else {
return fibonacci(n - 1) + fibonacci(n - 2);
}
}
self.addEventListener('message', (event) => {
const n = event.data;
const result = fibonacci(n);
self.postMessage(result);
});
์ค๋ช :
fibonacci()
ํจ์๋ n๋ฒ์งธ ํผ๋ณด๋์น ์๋ฅผ ์ฌ๊ท์ ์ผ๋ก ๊ณ์ฐํฉ๋๋ค.self.addEventListener('message', ...)
ํจ์๋ ๋ฉ์์ง ์์ ๊ธฐ๋ฅผ ์ค์ ํฉ๋๋ค. ์์ปค๊ฐ ๊ธฐ๋ณธ ์ค๋ ๋์์ ๋ฉ์์ง๋ฅผ ๋ฐ์ผ๋ฉด ๋ฉ์์ง ๋ฐ์ดํฐ์์n
์ ๊ฐ์ ์ถ์ถํ๊ณ , ํผ๋ณด๋์น ์๋ฅผ ๊ณ์ฐํ๊ณ ,self.postMessage()
๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ณธ ์ค๋ ๋๋ก ๋ค์ ๋ณด๋ ๋๋ค.
2๋จ๊ณ: ๊ธฐ๋ณธ ์คํฌ๋ฆฝํธ ์์ฑ(index.html ๋๋ app.js)
๋ชจ๋ ์์ปค์ ์ํธ ์์ฉํ HTML ํ์ผ ๋๋ JavaScript ํ์ผ์ ๋ง๋ญ๋๋ค.
// index.html or app.js
๋ชจ๋ ์์ปค ์์
์ค๋ช :
- ํผ๋ณด๋์น ๊ณ์ฐ์ ํธ๋ฆฌ๊ฑฐํ๋ ๋ฒํผ์ ๋ง๋ญ๋๋ค.
- ๋ฒํผ์ ํด๋ฆญํ๋ฉด ์์ปค ์คํฌ๋ฆฝํธ(
fibonacci.worker.js
)์ ๊ฒฝ๋ก๋ฅผ ์ง์ ํ๊ณtype
์ต์ ์'module'
๋ก ์ค์ ํ์ฌ ์Worker
์ธ์คํด์ค๋ฅผ ๋ง๋ญ๋๋ค. ์ด๋ ๋ชจ๋ ์์ปค๋ฅผ ์ฌ์ฉํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค. - ์์ปค ์ค๋ ๋์์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ๊ธฐ ์ํด ๋ฉ์์ง ์์ ๊ธฐ๋ฅผ ์ค์ ํฉ๋๋ค. ์์ปค๊ฐ ๋ฉ์์ง๋ฅผ ๋ค์ ๋ณด๋ผ ๋ ๊ณ์ฐ๋ ํผ๋ณด๋์น ์๋ก
resultDiv
์ ๋ด์ฉ์ ์ ๋ฐ์ดํธํฉ๋๋ค. - ๋ง์ง๋ง์ผ๋ก
worker.postMessage(40)
๋ฅผ ์ฌ์ฉํ์ฌ ์์ปค ์ค๋ ๋๋ก ๋ฉ์์ง๋ฅผ ๋ณด๋ด Fibonacci(40)์ ๊ณ์ฐํ๋๋ก ์ง์ํฉ๋๋ค.
์ค์ ๊ณ ๋ ค ์ฌํญ:
- ํ์ผ ์ก์ธ์ค: ๋ชจ๋ ์์ปค๋ DOM ๋ฐ ๊ธฐํ ๋ธ๋ผ์ฐ์ API์ ๋ํ ์ก์ธ์ค๊ฐ ์ ํ๋์ด ์์ต๋๋ค. DOM์ ์ง์ ์กฐ์ํ ์ ์์ต๋๋ค. UI๋ฅผ ์ ๋ฐ์ดํธํ๋ ค๋ฉด ๊ธฐ๋ณธ ์ค๋ ๋์์ ํต์ ์ด ํ์์ ์ ๋๋ค.
- ๋ฐ์ดํฐ ์ ์ก: ๊ธฐ๋ณธ ์ค๋ ๋์ ์์ปค ์ค๋ ๋ ๊ฐ์ ์ ๋ฌ๋ ๋ฐ์ดํฐ๋ ๊ณต์ ๋์ง ์๊ณ ๋ณต์ฌ๋ฉ๋๋ค. ์ด๋ฅผ ๊ตฌ์กฐ์ ๋ณต์ ๋ผ๊ณ ํฉ๋๋ค. ํฐ ๋ฐ์ดํฐ ์งํฉ์ ๊ฒฝ์ฐ ์ฑ๋ฅ์ ํฅ์์ํค๊ธฐ ์ํด ์ ๋ก ๋ณต์ฌ ์ ์ก์ ์ํด ์ ๋ฌ ๊ฐ๋ฅํ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค.
- ์ค๋ฅ ์ฒ๋ฆฌ: ๊ธฐ๋ณธ ์ค๋ ๋์ ์์ปค ์ค๋ ๋ ๋ชจ๋์์ ์ ์ ํ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๊ตฌํํ์ฌ ๋ฐ์ํ ์ ์๋ ๋ชจ๋ ์์ธ๋ฅผ ํฌ์ฐฉํ๊ณ ์ฒ๋ฆฌํฉ๋๋ค. ์์ปค ์คํฌ๋ฆฝํธ์ ์ค๋ฅ๋ฅผ ํฌ์ฐฉํ๋ ค๋ฉด
worker.addEventListener('error', ...)
๋ฅผ ์ฌ์ฉํ์ญ์์ค. - ๋ณด์: ๋ชจ๋ ์์ปค๋ ๋์ผ ์ถ์ฒ ์ ์ฑ ์ ๋ฐ๋ฆ ๋๋ค. ์์ปค ์คํฌ๋ฆฝํธ๋ ๊ธฐ๋ณธ ํ์ด์ง์ ๋์ผํ ๋๋ฉ์ธ์์ ํธ์คํ ๋์ด์ผ ํฉ๋๋ค.
๊ณ ๊ธ ๋ชจ๋ ์์ปค ๊ธฐ์
๊ธฐ๋ณธ ์ฌํญ ์ธ์๋ ์ฌ๋ฌ ๊ฐ์ง ๊ณ ๊ธ ๊ธฐ์ ์ ํตํด ๋ชจ๋ ์์ปค ๊ตฌํ์ ๋์ฑ ์ต์ ํํ ์ ์์ต๋๋ค.
์ ๋ฌ ๊ฐ๋ฅํ ๊ฐ์ฒด
๊ธฐ๋ณธ ์ค๋ ๋์ ์์ปค ์ค๋ ๋ ๊ฐ์ ํฐ ๋ฐ์ดํฐ ์งํฉ์ ์ ์กํ๋ ๊ฒฝ์ฐ ์ ๋ฌ ๊ฐ๋ฅํ ๊ฐ์ฒด๋ ์๋นํ ์ฑ๋ฅ ์ด์ ์ ์ ๊ณตํฉ๋๋ค. ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ๋ ๋์ ์ ๋ฌ ๊ฐ๋ฅํ ๊ฐ์ฒด๋ ๋ฉ๋ชจ๋ฆฌ ๋ฒํผ์ ์์ ๊ถ์ ๋ค๋ฅธ ์ค๋ ๋๋ก ์ ์กํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ฐ์ดํฐ ๋ณต์ฌ์ ์ค๋ฒํค๋๊ฐ ์ ๊ฑฐ๋๊ณ ์ฑ๋ฅ์ด ํฌ๊ฒ ํฅ์๋ ์ ์์ต๋๋ค.
// ๊ธฐ๋ณธ ์ค๋ ๋
const arrayBuffer = new ArrayBuffer(1024 * 1024); // 1MB
const worker = new Worker('worker.js', { type: 'module' });
worker.postMessage(arrayBuffer, [arrayBuffer]); // ์์ ๊ถ ์ด์
// ์์ปค ์ค๋ ๋ (worker.js)
self.addEventListener('message', (event) => {
const arrayBuffer = event.data;
// arrayBuffer ์ฒ๋ฆฌ
});
SharedArrayBuffer
SharedArrayBuffer
๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ๋ฌ ์์ปค์ ๊ธฐ๋ณธ ์ค๋ ๋๊ฐ ๋์ผํ ๋ฉ๋ชจ๋ฆฌ ์์น์ ์ก์ธ์คํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๋ ๋ณต์กํ ํต์ ํจํด๊ณผ ๋ฐ์ดํฐ ๊ณต์ ๊ฐ ๊ฐ๋ฅํฉ๋๋ค. ๊ทธ๋ฌ๋ SharedArrayBuffer
๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๊ฒฝ์ ์กฐ๊ฑด๊ณผ ๋ฐ์ดํฐ ์์์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ฃผ์ ๊น๊ฒ ๋๊ธฐํํด์ผ ํฉ๋๋ค. ์ข
์ข
Atomics
์ฐ์ฐ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
์ฐธ๊ณ : SharedArrayBuffer
๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๋ณด์ ๋ฌธ์ (Spectre ๋ฐ Meltdown ์ทจ์ฝ์ฑ)๋ก ์ธํด ์ ์ ํ HTTP ํค๋๋ฅผ ์ค์ ํด์ผ ํฉ๋๋ค. ํนํ Cross-Origin-Opener-Policy
๋ฐ Cross-Origin-Embedder-Policy
HTTP ํค๋๋ฅผ ์ค์ ํด์ผ ํฉ๋๋ค.
Comlink: ์์ปค ํต์ ๋จ์ํ
Comlink๋ ๊ธฐ๋ณธ ์ค๋ ๋์ ์์ปค ์ค๋ ๋ ๊ฐ์ ํต์ ์ ๋จ์ํํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. ์์ปค ์ค๋ ๋์์ JavaScript ๊ฐ์ฒด๋ฅผ ๋ ธ์ถํ๊ณ ๋์ผํ ์ปจํ ์คํธ์์ ์คํ๋๋ ๊ฒ์ฒ๋ผ ๊ธฐ๋ณธ ์ค๋ ๋์์ ํด๋น ๋ฉ์๋๋ฅผ ์ง์ ํธ์ถํ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ฉ์์ง ์ ๋ฌ์ ํ์ํ ์์ฉ๊ตฌ ์ฝ๋๊ฐ ํฌ๊ฒ ์ค์ด๋ญ๋๋ค.
// ์์ปค ์ค๋ ๋ (worker.js)
import * as Comlink from 'comlink';
const api = {
add(a, b) {
return a + b;
},
};
Comlink.expose(api);
// ๊ธฐ๋ณธ ์ค๋ ๋
import * as Comlink from 'comlink';
async function main() {
const worker = new Worker('worker.js', { type: 'module' });
const api = Comlink.wrap(worker);
const result = await api.add(2, 3);
console.log(result); // ์ถ๋ ฅ: 5
}
main();
๋ชจ๋ ์์ปค์ ์ฌ์ฉ ์ฌ๋ก
๋ชจ๋ ์์ปค๋ ๋ค์๊ณผ ๊ฐ์ ๊ด๋ฒ์ํ ์์ ์ ํนํ ์ ํฉํฉ๋๋ค.
- ์ด๋ฏธ์ง ๋ฐ ๋น๋์ค ์ฒ๋ฆฌ: UI ์ ์ง๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ํํฐ๋ง, ํฌ๊ธฐ ์กฐ์ ๋ฐ ์ธ์ฝ๋ฉ๊ณผ ๊ฐ์ ๋ณต์กํ ์ด๋ฏธ์ง ๋ฐ ๋น๋์ค ์ฒ๋ฆฌ ์์ ์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ค๋ ๋๋ก ์คํ๋ก๋ํฉ๋๋ค. ์๋ฅผ ๋ค์ด ์ฌ์ง ํธ์ง ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ชจ๋ ์์ปค๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ์ฐจ๋จํ์ง ์๊ณ ์ด๋ฏธ์ง์ ํํฐ๋ฅผ ์ ์ฉํ ์ ์์ต๋๋ค.
- ๋ฐ์ดํฐ ๋ถ์ ๋ฐ ๊ณผํ ๊ณ์ฐ: ํต๊ณ ๋ถ์, ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ ํ๋ จ ๋ฐ ์๋ฎฌ๋ ์ด์ ๊ณผ ๊ฐ์ ๊ณ์ฐ ์ง์ฝ์ ์ธ ๋ฐ์ดํฐ ๋ถ์ ๋ฐ ๊ณผํ ๊ณ์ฐ ์์ ์ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์ํํฉ๋๋ค. ์๋ฅผ ๋ค์ด ๊ธ์ต ๋ชจ๋ธ๋ง ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ฉ์ ๊ฒฝํ์ ์ํฅ์ ๋ฏธ์น์ง ์๊ณ ๋ชจ๋ ์์ปค๋ฅผ ์ฌ์ฉํ์ฌ ๋ณต์กํ ์๋ฎฌ๋ ์ด์ ์ ์คํํ ์ ์์ต๋๋ค.
- ๊ฒ์ ๊ฐ๋ฐ: ๋ชจ๋ ์์ปค๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒ์ ๋ ผ๋ฆฌ, ๋ฌผ๋ฆฌ ๊ณ์ฐ ๋ฐ AI ์ฒ๋ฆฌ๋ฅผ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ค๋ ๋์์ ์ํํ์ฌ ๊ฒ์ ์ฑ๋ฅ๊ณผ ์๋ต์ฑ์ ํฅ์์ํต๋๋ค. ์๋ฅผ ๋ค์ด ๋ณต์กํ ์ ๋ต ๊ฒ์์ ๋ชจ๋ ์์ปค๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ์ ๋์ ๋ํ AI ๊ณ์ฐ์ ๋์์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
- ์ฝ๋ ํธ๋์คํ์ผ ๋ฐ ๋ฒ๋ค๋ง: ์ฝ๋ ํธ๋์คํ์ผ ๋ฐ ๋ฒ๋ค๋ง ์์ ์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ค๋ ๋๋ก ์คํ๋ก๋ํ์ฌ ๋น๋ ์๊ฐ ๋ฐ ๊ฐ๋ฐ ์ํฌํ๋ก๋ฅผ ๊ฐ์ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด ์น ๊ฐ๋ฐ ๋๊ตฌ๋ ๋ชจ๋ ์์ปค๋ฅผ ์ฌ์ฉํ์ฌ ์ต์ ๋ฒ์ ์ JavaScript ์ฝ๋๋ฅผ ์ด์ ๋ธ๋ผ์ฐ์ ์์ ํธํ์ฑ์ ์ํด ์ด์ ๋ฒ์ ์ผ๋ก ํธ๋์คํ์ผํ ์ ์์ต๋๋ค.
- ์ํธํ ์์ : ์ํธํ ๋ฐ ํด๋ ๊ณผ ๊ฐ์ ์ํธํ ์์ ์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ค๋ ๋์์ ์คํํ์ฌ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ๋ฐฉ์งํ๊ณ ๋ณด์์ ํฅ์์ํต๋๋ค.
- ์ค์๊ฐ ๋ฐ์ดํฐ ์ฒ๋ฆฌ: ์ค์๊ฐ ์คํธ๋ฆฌ๋ฐ ๋ฐ์ดํฐ(์: ์ผ์, ๊ธ์ต ํผ๋)๋ฅผ ์ฒ๋ฆฌํ๊ณ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋ถ์์ ์ํํฉ๋๋ค. ์ฌ๊ธฐ์๋ ๋ฐ์ดํฐ ํํฐ๋ง, ์ง๊ณ ๋๋ ๋ณํ์ด ํฌํจ๋ ์ ์์ต๋๋ค.
๋ชจ๋ ์์ปค ์์ ์ ๋ํ ๋ชจ๋ฒ ์ฌ๋ก
ํจ์จ์ ์ด๊ณ ์ ์ง ๊ด๋ฆฌ ๊ฐ๋ฅํ ๋ชจ๋ ์์ปค ๊ตฌํ์ ๋ณด์ฅํ๋ ค๋ฉด ๋ค์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด์ญ์์ค.
- ์์ปค ์คํฌ๋ฆฝํธ ๊ฐ์ํ: ์์ปค ์ค๋ ๋์ ์์ ์๊ฐ์ ์ค์ด๊ธฐ ์ํด ์์ปค ์คํฌ๋ฆฝํธ์ ์ฝ๋ ์์ ์ต์ํํฉ๋๋ค. ํน์ ์์ ์ ์ํํ๋ ๋ฐ ํ์ํ ์ฝ๋๋ง ํฌํจํฉ๋๋ค.
- ๋ฐ์ดํฐ ์ ์ก ์ต์ ํ: ๋ถํ์ํ ๋ฐ์ดํฐ ๋ณต์ฌ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ํฐ ๋ฐ์ดํฐ ์งํฉ์ ์ ์กํ๋ ๋ฐ ์ ๋ฌ ๊ฐ๋ฅํ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ์ค๋ฅ ์ฒ๋ฆฌ ๊ตฌํ: ๊ธฐ๋ณธ ์ค๋ ๋์ ์์ปค ์ค๋ ๋ ๋ชจ๋์์ ๋ฐ์ํ ์ ์๋ ๋ชจ๋ ์์ธ๋ฅผ ํฌ์ฐฉํ๊ณ ์ฒ๋ฆฌํ๊ธฐ ์ํด ๊ฐ๋ ฅํ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๊ตฌํํฉ๋๋ค.
- ๋๋ฒ๊น ๋๊ตฌ ์ฌ์ฉ: ๋ธ๋ผ์ฐ์ ์ ๊ฐ๋ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ ์์ปค ์ฝ๋๋ฅผ ๋๋ฒ๊น ํฉ๋๋ค. ๋๋ถ๋ถ์ ์ต์ ๋ธ๋ผ์ฐ์ ๋ ์น ์์ปค์ฉ ์ ์ฉ ๋๋ฒ๊น ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค.
- Comlink ์ฌ์ฉ ๊ณ ๋ ค: ๋ฉ์์ง ์ ๋ฌ์ ๋ํญ ๋จ์ํํ๊ณ ๊ธฐ๋ณธ ๋ฐ ์์ปค ์ค๋ ๋ ๊ฐ์ ๋ ๊นจ๋ํ ์ธํฐํ์ด์ค๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
- ์ฑ๋ฅ ์ธก์ : ์ฑ๋ฅ ํ๋กํ์ผ๋ง ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ์ ๋ํ ๋ชจ๋ ์์ปค์ ์ํฅ์ ์ธก์ ํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ถ๊ฐ ์ต์ ํ ์์ญ์ ์๋ณํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
- ์๋ฃ ์ ์์ปค ์ข
๋ฃ: ๋ฆฌ์์ค๋ฅผ ํ๋ณดํ๊ธฐ ์ํด ๋ ์ด์ ํ์ํ์ง ์์ ๊ฒฝ์ฐ ์์ปค ์ค๋ ๋๋ฅผ ์ข
๋ฃํฉ๋๋ค.
worker.terminate()
๋ฅผ ์ฌ์ฉํ์ฌ ์์ปค๋ฅผ ์ข ๋ฃํฉ๋๋ค. - ๊ณต์ ๊ฐ๋ฅํ ๋ณ๊ฒฝ ๊ฐ๋ฅํ ์ํ ๋ฐฉ์ง: ๊ธฐ๋ณธ ์ค๋ ๋์ ์์ปค ๊ฐ์ ๊ณต์ ๊ฐ๋ฅํ ๋ณ๊ฒฝ ๊ฐ๋ฅํ ์ํ๋ฅผ ์ต์ํํฉ๋๋ค. ๋ฉ์์ง ์ ๋ฌ์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๋๊ธฐํํ๊ณ ๊ฒฝ์ ์กฐ๊ฑด์ ๋ฐฉ์งํฉ๋๋ค.
SharedArrayBuffer
๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐAtomics
๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ ํ ๋๊ธฐํ๋ฅผ ์ํํ์ญ์์ค.
๋ชจ๋ ์์ปค ๋ ๊ธฐ์กด ์น ์์ปค
๋ชจ๋ ์์ปค์ ๊ธฐ์กด ์น ์์ปค๋ ๋ชจ๋ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ฒ๋ฆฌ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ง๋ง ๋ช ๊ฐ์ง ์ฃผ์ ์ฐจ์ด์ ์ด ์์ต๋๋ค.
๊ธฐ๋ฅ | ๋ชจ๋ ์์ปค | ๊ธฐ์กด ์น ์์ปค |
---|---|---|
ES ๋ชจ๋ ์ง์ | ์(import , export ) |
์๋์(importScripts() ์ ๊ฐ์ ํด๊ฒฐ ๋ฐฉ๋ฒ ํ์) |
์ฝ๋ ๊ตฌ์ฑ | ES ๋ชจ๋์ ์ฌ์ฉํ์ฌ ๋ ๋์ ์ฑ๋ฅ | ๋ ๋ณต์กํ๋ฉฐ ์ข ์ข ๋ฒ๋ค๋ง์ด ํ์ํฉ๋๋ค. |
์ข ์์ฑ ๊ด๋ฆฌ | ES ๋ชจ๋๋ก ๊ฐ์ํ | ๋ ์ด๋ ค์ด ๊ณผ์ |
์ ๋ฐ์ ์ธ ๊ฐ๋ฐ ๊ฒฝํ | ๋ ํ๋์ ์ด๊ณ ๊ฐ์ํ๋จ | ๋ ์ฅํฉํ๊ณ ์ง๊ด์ ์ด์ง ์์ |
๋ณธ์ง์ ์ผ๋ก ๋ชจ๋ ์์ปค๋ ES ๋ชจ๋ ์ง์ ๋๋ถ์ JavaScript์์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ฒ๋ฆฌ์ ๋ํ ๋ ํ๋์ ์ด๊ณ ๊ฐ๋ฐ์ ์นํ์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ์ ๊ณตํฉ๋๋ค.
๋ธ๋ผ์ฐ์ ํธํ์ฑ
๋ชจ๋ ์์ปค๋ ๋ค์๊ณผ ๊ฐ์ ์ต์ ๋ธ๋ผ์ฐ์ ์์ ๋ฐ์ด๋ ๋ธ๋ผ์ฐ์ ์ง์์ ์ ๊ณตํฉ๋๋ค.
- Chrome
- Firefox
- Safari
- Edge
caniuse.com์์ ์ต์ ๋ธ๋ผ์ฐ์ ํธํ์ฑ ์ ๋ณด๋ฅผ ํ์ธํ์ธ์.
๊ฒฐ๋ก : ๋ฐฑ๊ทธ๋ผ์ด๋ ์ฒ๋ฆฌ์ ํ์ ํ์ฉํ์ธ์
JavaScript ๋ชจ๋ ์์ปค๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ๊ณผ ์๋ต์ฑ์ ๊ฐ์ ํ๋ ๊ฐ๋ ฅํ ๋๊ตฌ์ ๋๋ค. ๊ณ์ฐ ์ง์ฝ์ ์ธ ์์ ์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ค๋ ๋๋ก ์คํ๋ก๋ํ๋ฉด ๊ธฐ๋ณธ ์ค๋ ๋๊ฐ UI ์ ๋ฐ์ดํธ ๋ฐ ์ฌ์ฉ์ ์ํธ ์์ฉ์ ์ฒ๋ฆฌํ ์ ์์ด ๋์ฑ ์ํํ๊ณ ์ฆ๊ฑฐ์ด ์ฌ์ฉ์ ๊ฒฝํ์ ์ป์ ์ ์์ต๋๋ค. ES ๋ชจ๋์ ์ง์ํ๋ ๋ชจ๋ ์์ปค๋ ๊ธฐ์กด ์น ์์ปค์ ๋นํด ๋ฐฑ๊ทธ๋ผ์ด๋ ์ฒ๋ฆฌ์ ๋ํ ๋ ํ๋์ ์ด๊ณ ๊ฐ๋ฐ์ ์นํ์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ์ ๊ณตํฉ๋๋ค. ๋ชจ๋ ์์ปค์ ์ฑ๋ฅ์ ํ์ฉํ๊ณ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ฌ๋ ฅ์ ์ต๋ํ ํ์ฉํ์ธ์!