Files
2nd/01_Archive/2026-04-20/Multi-threaded Architecture.md

41 lines
5.1 KiB
Markdown

---
id: P-REINFORCE-AUTO-4271F6
category: "10_Wiki/💡 Topics/Graphics & Performance"
confidence_score: 0.90
tags: [auto-reinforced]
last_reinforced: 2026-04-20
github_commit: "[P-Reinforce] Continuous Worker - Multi-threaded Architecture"
---
# [[Multi-threaded Architecture|Multi-threaded Architecture]]
## 📌 한 줄 통찰 (The Karpathy Summary)
> 자바스크립트의 단일 스레드(Single-thread) 제약을 극복하기 위해 웹 워커(Web Worker)와 OffscreenCanvas를 활용하여 무거운 CPU 연산이나 3D 그래픽 렌더링을 백그라운드로 분리하고, 메인 스레드와 고효율로 상태를 동기화하여 매끄러운 반응성을 보장하는 진보된 애플리케이션 설계 패턴입니다.
## 📖 구조화된 지식 (Synthesized Content)
**1. 멀티스레딩의 필요성과 Web Worker 분리** 자바스크립트는 기본적으로 단일 스레드 환경이므로 대규모 데이터 정렬, 이미지 처리, 물리 연산 등 무거운 작업을 수행하면 메인 스레드가 블로킹되어 UI가 멈추는 프리징(Freezing) 현상이 발생합니다. 이를 방지하기 위해 무거운 연산을 웹 워커(Web Worker)로 오프로딩(Offloading)하면, UI 상호작용은 메인 스레드에서 방해 없이 처리하고 연산은 백그라운드 스레드에서 병렬로 진행할 수 있습니다. React 앱에서는 `@koale/useworker`와 같은 훅 기반 라이브러리를 통해 워커 설정을 단순화하여 활용할 수 있습니다.
**2. OffscreenCanvas와 WebGL/R3F 렌더링 분리** 복잡한 3D 씬을 다루는 WebGL 애플리케이션이나 Three.js/React Three Fiber(R3F) 환경의 경우 렌더링 연산 자체가 메인 스레드 자원을 크게 소모합니다. `OffscreenCanvas`를 사용하면 DOM과 Canvas API를 분리하여 캔버스의 제어권을 웹 워커로 넘길 수 있습니다. 이 구조에서는 렌더링과 DOM 조작이 물리적으로 분리되어 서로의 성능에 영향을 주지 않으며, 메인 스레드의 트래픽(과부하)과 무관하게 워커에서 부드러운 애니메이션을 독립적으로 유지할 수 있습니다.
**3. 대리 인터랙션(Event Forwarding) 시스템** 웹 워커 내부에는 DOM이나 `window` 객체가 존재하지 않으므로 사용자의 마우스 클릭, 터치 등의 이벤트를 직접 수신할 수 없습니다. 따라서 메인 스레드에서 이벤트를 캡처한 뒤, 이벤트의 타입과 포인터 좌표 등 필수 데이터만 워커로 전달(`postMessage`)하여 워커 내부에서 상호작용 및 레이캐스팅(Raycasting)을 처리하도록 하는 이벤트 포워딩 파이프라인 구축이 필수적입니다.
**4. 고효율 상태 동기화 (State Synchronization)** 메인 스레드(React DOM UI)와 워커(WebGL 씬 또는 연산 로직) 양쪽에서 동일한 앱 상태를 읽고 써야 하는 경우, 스레드 간 상태 동기화가 가장 큰 과제가 됩니다.
- **프록시 및 델타 동기화:** Valtio와 같은 프록시 기반 상태 관리 도구를 사용하여 로컬 저장소를 구축한 뒤, 상태가 변할 때마다 변경된 작업 내용(Operations/Delta)만 `Broadcast Channel API`를 통해 상대 스레드에 전달하여 동기화합니다.
- **SharedArrayBuffer:** 지연 시간이 극도로 낮아야 하는 환경이나 ECS 기반의 게임에서는 두 스레드가 메모리를 직접 공유하는 `SharedArrayBuffer`를 사용하여 직렬화(Serialization) 및 복사 비용 없이 원자적(Atomic) 연산을 수행합니다.
## ⚠️ 모순 및 업데이트 (Contradictions & RL Update)
- **과거 데이터와의 충돌:** 자동화 엔진에 의해 매핑된 지식으로, 추후 정밀 검증 필요.
- **정책 변화:** Graphics & Performance 분야의 자동 자산화 수행.
## 🔗 지식 연결 (Graph)
- **Related Topics:** [[Web Worker (웹 워커)|Web Worker (웹 워커)]], [[OffscreenCanvas|OffscreenCanvas]], [[SharedArrayBuffer|SharedArrayBuffer]], [[상태 관리 최적화 (Zustand, Jotai, Valtio)|상태 관리 최적화 (Zustand, Jotai, Valtio)]]
- **Projects/Contexts:** [[고성능 실시간 상호작용 시스템을 위한 React 기반 게임 엔진 아키텍처|고성능 실시간 상호작용 시스템을 위한 React 기반 게임 엔진 아키텍처]], 대규모 데이터 분석 및 시각화 대시보드
- **Contradictions/Notes:** 멀티스레딩이 무조건적인 성능 향상을 가져오지는 않습니다. 메인 스레드와 워커 스레드 간에 데이터를 주고받는 과정(`postMessage`)에는 직렬화로 인한 오버헤드(약 5~10ms)가 수반됩니다. 따라서 연산 시간이 50ms 미만인 비교적 가벼운 작업을 워커로 분리하면, 통신 비용이 연산 시간보다 커져 오히려 전체 성능이 하락할 수 있으므로 철저한 프로파일링을 기반으로 병목 구간에만 도입해야 합니다.
---
_Last updated: 2026-04-15_
- Raw Source: 00_Raw/2026-04-20/Multi-threaded Architecture.md
---