본문 바로가기

Programming/JavaScript

Web Worker

Web Worker는 웹 브라우저에서 제공하는 기능 중 하나로, 메인 스레드와는 별개의 백그라운드 스레드에서 스크립트를 실행할 수 있게 해주는 API입니다. 이를 통해 복잡하고 시간이 많이 소요되는 작업을 메인 스레드와 독립적으로 처리할 수 있으며, 이는 웹 애플리케이션의 응답성과 성능을 향상시킬 수 있습니다.

주요 특징

멀티 스레딩 지원: JavaScript는 전통적으로 싱글 스레드로 작동합니다. Web Worker를 사용하면 별도의 스레드에서 스크립트를 실행할 수 있으며, 이는 복잡한 계산이나 대량의 데이터 처리 작업을 백그라운드에서 수행할 수 있게 해줍니다.

 

메인 스레드의 비동기 처리 가능: Web Worker를 사용하면 메인 스레드가 UI 업데이트나 사용자 인터랙션 처리에 집중할 수 있습니다. 이는 애플리케이션의 전반적인 반응성을 개선할 수 있습니다.

 

메시지 기반 통신: 메인 스레드와 Web Worker 사이의 데이터 교환은 postMessage 메서드를 통해 이루어집니다. 이 메시지 기반의 통신은 복사를 통해 이루어지므로, 데이터를 공유하진 않지만 메시지를 통해 데이터를 주고받을 수 있습니다.

 

제한된 자원 접근: 보안 및 성능 이유로, Web Worker는 DOM에 직접 접근할 수 없습니다. 또한 일부 Web API에 대한 접근이 제한될 수 있으나, XMLHttpRequest와 같은 네트워킹 기능, IndexedDB와 같은 데이터베이스 접근은 가능합니다.

예제 코드

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Web Worker ES6 Example</title>
</head>
<body>
    <script>
        if (window.Worker) {
            const myWorker = new Worker('worker.js');
            myWorker.postMessage(10); // 워커에 데이터 전송

            myWorker.onmessage = (e) => {
                console.log('Received from worker:', e.data);
            };

            myWorker.onerror = (error) => {
                console.error('Worker error:', error);
            };
        } else {
            console.log("Your browser doesn't support web workers.");
        }
    </script>
</body>
</html>
// worker.js에서 사용할 스크립트
self.addEventListener('message', (e) => {
    const data = e.data;
    const result = processData(data);
    self.postMessage(result);
});

- 메인 스크립트는 Worker 생성자를 사용하여 worker.js 파일로부터 새로운 Worker를 생성합니다.

- postMessage 메소드를 사용하여 Worker에 데이터를 보내고, onmessage 핸들러를 통해 Worker로부터 결과를 받습니다.

- onerror 핸들러를 설정하여 Worker 실행 중 발생할 수 있는 에러를 처리합니다.

- window.Worker를 검사하여 현재 브라우저가 Web Worker를 지원하는지 확인합니다.