요즘 성능개선에 대해 고민이 많은데, 구글링을 하면 웹워커를 사용한 예시가 늘고 있다. 이에대한 궁금증 해소차원 웹워커에 대해 작성해봅니다.
언제 웹워커를 사용하지?
웹 워커를 사용하면 메인 스레드가 차단되지 않아서 사용자 경험이 개선된다.
워커스크립트 작성
// worker.js
self.onmessage = function(e) {
const result = e.data * 2; // 간단한 예시 작업
postMessage(result);
};
리액트에서 사용
import React, { useEffect, useState } from 'react';
const MyComponent = () => {
const [workerResult, setWorkerResult] = useState(null);
useEffect(() => {
const worker = new Worker(new URL('./worker.js', import.meta.url));
worker.onmessage = function(e) {
setWorkerResult(e.data);
};
worker.postMessage(10); // 워커에 메시지 전송
return () => {
worker.terminate(); // 컴포넌트 언마운트 시 워커 종료
};
}, []);
return (
<div>
<p>워커 결과: {workerResult}</p>
</div>
);
};
export default MyComponent;
웹워커를 사용하다보면, 메모리가 더이상 필요하지 않음에도 불구하고 해제되지 않아 메모리 공간이 줄어드는 현상이 있다. 이를 방지하기 위한 방법은
terminate() 메서드를 호출하여 종료useEffect(() => {
const worker = new Worker('worker.js');
// 작업 완료 후 또는 컴포넌트 언마운트 시
return () => {
worker.terminate();
};
}, []);
전송할 데이터 최소화 : 메인 스레드와 웹 워커간에 주고받는 데이터의 크기와 빈도를 최소화
// 예시: ArrayBuffer를 사용하여 큰 데이터 전송
const buffer = new ArrayBuffer(1024);
worker.postMessage(buffer, [buffer]);