Development/Web
웹 워커 vs. 서비스 워커
레오나르도 다빈츠
2025. 5. 2. 20:25
웹 워커(Web Worker)
개념
브라우저에서 UI와 분리된 백그라운드 스레드로 무거운 계산을 맡겨서 UI가 멈추지 않게 한다.
CPU를 많이 사용하는 계산, 이미지 처리, 암호화 등을 하고 싶을 때 사용한다.
DOM에는 접근 불가하다.
💡 사용 예시: 이미지 필터 처리, 대규모 정렬 등
📄 Web Worker가 없을 때
// 이 코드는 브라우저를 몇 초간 멈추게 한다.
const bigArray = [...Array(1e8)].map(() => Math.random());
const sorted = bigArray.sort();
📄 Web Worker 사용
// main.js
const worker = new Worker('sortWorker.js');
worker.postMessage(bigArray); // 데이터를 워커에게 전달
worker.onmessage = (e) => {
console.log('정렬 완료', e.data);
};
// sortWorker.js
onmessage = (e) => {
const sorted = e.data.sort();
postMessage(sorted); // 결과 전달
};
서비스 워커(Service Worker)
개념
브라우저와 네트워크 사이에 낀 프록시이다. 오프라인 캐싱, 푸시 알림 등에 사용된다. (PWC의 핵심기술)
사용자가 오프라인이거나, 리소스를 캐시해서 빠르게 응답하거나, 푸시 알림을 보내고 싶을 때 사용한다.
💡 사용 예시: 오프라인 상태에서 페이지 열기 가능
📄 Service Worker 사용
// service-worker.js
self.addEventListener('install', (event) => {
event.waitUntil(
caches.open('v1').then((cache) =>
cache.addAll([
'/',
'/index.html',
'/styles.css',
'/app.js',
]),
),
);
});
self.addEventListener('fetch', (event) => {
event.respondWith(
caches.match(event.request).then((cachedResponse) => {
return cachedResponse || fetch(event.request);
}),
);
});
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/service-worker.js');
}