1. Web Worker

Web Worker는 백그라운드 스레드에서 JavaScript 코드를 실행할 수 있게 해주는 API입니다. Web Worker는 메인 스레드와 독립적이기 때문에 CPU 집약적인 작업이나 대용량 파일 업로드, 복잡한 계산 작업을 수행하면서도 UI가 멈추지 않게 합니다.

Web Worker 작동 방식

Web Worker 예제

먼저, worker 파일을 worker.js로 작성합니다:

javascript
Copy code
// worker.js
self.onmessage = function (event) {
  const data = event.data;
  // 예를 들어, 대용량 파일 청크 처리 또는 연산 수행
  const result = processData(data); // 무거운 작업 처리
  self.postMessage(result); // 처리 완료된 결과를 메인 스레드에 전송
};

function processData(data) {
  // 무거운 작업을 수행
  return data;
}

메인 스레드에서는 다음과 같이 Worker를 생성하고 사용합니다:

javascript
Copy code
// main.js
const worker = new Worker('worker.js');

worker.onmessage = function (event) {
  console.log('Worker 결과:', event.data);
};

// 무거운 작업을 Worker로 전달
worker.postMessage(largeData);

2. Service Worker

Service Worker는 네트워크 요청을 가로채 캐시를 관리하거나, 오프라인 지원, 푸시 알림 등을 가능하게 하는 백그라운드 스크립트입니다. 파일 업로드 시 사용자가 네트워크가 불안정한 환경에서도 안전하게 파일 업로드를 수행할 수 있도록 지원합니다. Service Worker는 주로 오프라인 지원캐싱 관리를 위해 사용됩니다.

Service Worker 주요 기능

Service Worker 예제

다음과 같이 Service Worker를 등록하고, 파일 업로드 요청을 가로챌 수 있습니다:

javascript
Copy code
// service-worker.js
self.addEventListener('fetch', event => {
  if (event.request.url.includes('/upload')) {
    event.respondWith(handleUploadRequest(event.request));
  }
});

async function handleUploadRequest(request) {
  // 캐시 처리 로직 또는 오프라인 대체 로직을 구현
  const response = await fetch(request); // 원래 요청을 수행
  return response;
}