웹 워커는 메인 스레드와 별개의 백그라운드 스레드에서 JavaScript를 실행하는 API입니다. 무거운 연산을 워커에서 처리하면 UI가 블로킹되지 않아 사용자 경험이 향상됩니다. 워커는 DOM에 직접 접근할 수 없으며,
postMessage를 통해 메인 스레드와 통신합니다.웹 워커는 메인 스레드와 별도의 백그라운드 스레드에서 스크립트를 실행할 수 있게 해주는 API입니다.
JavaScript는 기본적으로 싱글 스레드입니다. 무거운 연산이 메인 스레드에서 실행되면 UI가 멈추게 됩니다. Web Worker를 사용하면 별도 스레드에서 연산을 수행하여 UI 응답성을 유지할 수 있습니다. postMessage를 통해 메인 스레드와 데이터를 주고받습니다.
같은 연산을 메인 스레드와 워커에서 실행하여 UI 블로킹 여부를 비교하세요.
// 메인 스레드에서 피보나치 계산
function fibonacci(n) {
if (n <= 1) return n;
return fibonacci(n - 1) + fibonacci(n - 2);
}
fibonacci(38); // UI가 멈춤!실제 코드로 동작 원리를 확인하세요.
// worker.js
self.onmessage = function(event) {
const { type, data } = event.data;
if (type === 'heavy-calc') {
// 무거운 계산을 워커에서 수행
const result = data.reduce((sum, n) => {
for (let i = 0; i < 1000000; i++) { sum += Math.sqrt(n); }
return sum;
}, 0);
self.postMessage({ type: 'result', data: result });
}
};
// main.js
const worker = new Worker('worker.js');
worker.postMessage({ type: 'heavy-calc', data: [1, 2, 3, 4, 5] });
worker.onmessage = (e) => console.log('결과:', e.data);
worker.onerror = (e) => console.error('에러:', e.message);postMessage를 통해 메인 스레드와 통신합니다.postMessage()로 메시지를 전송하고,onmessage 이벤트로 수신합니다. 데이터는 기본적으로 구조화된 복제(Structured Clone) 방식으로 복사되어 전달됩니다. 대용량 데이터의 경우 Transferable Objects(ArrayBuffer 등)를 사용하면 복사 없이 소유권을 이전하여 성능을 높일 수 있습니다.