Taeseong Blog

웹 워커(Web Worker)

2024-10-07

Web Worker

웹 워커(Web Worker)는 브라우저에서 자바스크립트를 실행할 때 메인 스레드와는 별도의 백그라운드 스레드에서 작업을 수행할 수 있도록 도와주는 API입니다. 이를 통해 무거운 작업(예: 데이터 처리, 계산, 파일 파싱 등)을 실행하면서도 사용자 인터페이스가 멈추거나 느려지는 것을 방지할 수 있습니다.

웹 워커의 주요 특징

  1. 백그라운드 스레드
    • 웹 워커는 메인 스레드(UI 스레드)와는 별도로 동작하므로, 메인 스레드에서 DOM 조작이나 이벤트 처리가 영향을 받지 않습니다.
  2. 비동기 처리
    • 워커는 메인 스레드와 메시지를 통해 통신하며, 이 메시징 시스템은 비동기적으로 동작합니다.
  3. 제한된 작업
    • 웹 워커는 DOM에 직접 접근할 수 없습니다.
    • 대신, 데이터를 처리하거나 메인 스레드에 결과를 반환하는 데 사용됩니다.
  4. 스레드 간 메시지 통신
    • postMessage() 메서드를 사용해 데이터를 워커에 전달하고, 워커는 onmessage 이벤트를 통해 응답을 반환합니다.

웹 워커의 종류

  1. Dedicated Worker (전용 워커)
    • 특정 스크립트에만 사용되는 워커입니다. 단일 스레드에서 실행됩니다.
    • 가장 기본적인 형태로, 하나의 페이지에서만 해당 워커를 사용할 수 있습니다.
  2. Shared Worker (공유 워커)
    • 여러 페이지 또는 여러 스크립트 간에 공유 가능한 워커입니다.
    • 여러 클라이언트가 같은 워커를 공유하며, connect 이벤트를 통해 연결됩니다.
  3. Service Worker (서비스 워커)
    • 네트워크 요청을 가로채거나 캐싱 등을 관리하는 데 사용되는 워커입니다.
    • 웹 애플리케이션의 성능을 개선하거나 오프라인 지원을 구현하는 데 사용됩니다.

웹 워커의 기본 사용법

1. 워커 스크립트 작성

javascript;
복사편집;
// worker.js
self.onmessage = function (e) {
  const result = e.data * 2; // 예: 받은 데이터를 두 배로 처리
  self.postMessage(result); // 결과를 메인 스레드로 전송
};

2. 메인 스크립트에서 워커 호출

javascript;
복사편집;
// main.js
const worker = new Worker("worker.js");

worker.onmessage = function (e) {
  console.log("결과:", e.data); // 워커에서 받은 결과 출력
};

worker.postMessage(10); // 워커에 데이터 전달

웹 워커의 장점

  • 복잡한 연산을 메인 스레드와 분리해 실행하므로, UI 응답성을 유지할 수 있습니다.
  • 병렬 작업이 가능하여 성능 향상에 기여합니다.

웹 워커의 제한사항

  1. DOM 접근 불가
    • 워커는 DOM을 직접 조작할 수 없습니다.
    • 대신 메인 스레드와 메시지를 주고받아 간접적으로 DOM을 업데이트해야 합니다.
  2. 동기 작업 제한
    • 모든 작업은 비동기로 처리되어야 합니다.
  3. CORS 제한
    • 워커는 동일 출처 정책(CORS)을 따르므로, 외부 스크립트를 로드하려면 적절한 CORS 설정이 필요합니다.
  4. 브라우저 지원
    • 대부분의 최신 브라우저에서 지원하지만, 일부 구형 브라우저에서는 사용할 수 없습니다.

웹 워커는 복잡한 연산과 대규모 데이터 처리로 인해 느려지는 사용자 경험을 개선하고자 할 때 유용한 도구입니다.