Files
2nd/10_Wiki/Topics/useEffect 클린업(Cleanup).md
T
2026-05-02 23:33:34 +09:00

4.3 KiB


id: P-Reinforce-AUTO-55865D category: Unified confidence_score: 0.90 tags: [auto-reinforced] last_reinforced: 2026-04-20 github_commit: "[P-Reinforce] Continuous Worker - useEffect 클린업(Cleanup)"

useEffect 클린업(Cleanup)

📌 한 줄 통찰 (The Karpathy Summary)

useEffect 훅 내부에서 반환(return)하는 클린업 함수는 컴포넌트가 화면에서 사라질 때(Unmount) 또는 다음 이펙트가 실행되기 전에 호출되어, 불필요하게 남아있는 백그라운드 작업이나 자원 점유를 해제함으로써 애플리케이션의 메모리 누수(memory Leak)를 방지하는 핵심 메커니즘입니다.

📖 구조화된 지식 (Synthesized Content)

1. 클린업의 필요성과 메모리 누수 방지 React 컴포넌트가 언마운트되더라도, useEffect 내에서 실행된 타이머, 이벤트 리스너, 외부 네트워크 연결 등은 자동으로 종료되지 않습니다. 클린업 작업을 누락하면 컴포넌트가 파괴된 후에도 숨겨진 백그라운드에서 이벤트가 계속 수신되거나 연산이 실행되어, 시간이 지날수록 메모리 점유율이 증가하고 결국 앱을 느려지게 하거나 크래시를 유발합니다.

2. 주요 클린업 대상 및 적용 사례 성능 저하를 막기 위해 다음과 같은 상황에서 반드시 클린업 함수를 작성해야 합니다.

  • 타이머 및 애니메이션 프레임 해제: setInterval을 호출했다면 클린업에서 clearInterval을 실행하고, 게임 루프 등을 위해 requestAnimationFrame을 사용했다면 cancelAnimationFrame을 호출하여 백그라운드 동작을 멈춰야 합니다.
  • 이벤트 리스너 제거: window.addEventListener('resize', handleResize)mousemove 이벤트를 등록했다면, 반드시 window.removeEventListener로 구독을 해제해야 렌더링되지 않는 컴포넌트에서 이벤트 핸들러가 실행되는 것을 막을 수 있습니다.
  • 외부 네트워크 및 워커 종료: 웹소켓(WebSocket)이나 웹 워커(Web Worker) 인스턴스를 생성했다면, 연결이 열린 채로 메모리를 낭비하지 않도록 클린업 시점에 ws.close()worker.terminate()를 호출해야 합니다.
  • 거대한 객체 참조 해제 (GC 지원): useRef 등을 사용해 거대한 데이터 세트 등 큰 객체를 참조하고 있다면, 언마운트 시 명시적으로 참조에 null을 할당(processedRef.current = null)하여 자바스크립트 가비지 컬렉터(GC)가 해당 메모리를 정상적으로 회수할 수 있도록 처리해야 합니다.
  • WebGL 및 GPU 자원 해제 (Three.js/R3F): 일반적인 힙 메모리와 달리 GPU 메모리에 올라간 자원들은 자동으로 가비지 컬렉션되지 않습니다. 따라서 React Three Fiber 등에서 생성한 3D 모델의 컴포넌트가 사라질 때는, 클린업 함수에서 명시적으로 지오메트리, 재질, 텍스처 등에 대해 .dispose() 메서드를 호출하여 VRAM 누수를 방지해야 합니다.

⚠️ 모순 및 업데이트 (Contradictions & RL Update)

  • 과거 데이터와의 충돌: 자동화 엔진에 의해 매핑된 지식으로, 추후 정밀 검증 필요.
  • 정책 변화: Programming & Language 분야의 자동 자산화 수행.

🔗 지식 연결 (Graph)

  • Related Topics: Memory Leak Prevention (메모리 누수 방지), 반응형 윈도우 리사이즈(Resize) 이벤트 처리, 웹 워커(Web Worker), Three.js 자원 해제 (Dispose)
  • Projects/Contexts: 고성능 실시간 상호작용 시스템, 멀티스레드 기반 웹 애플리케이션
  • Contradictions/Notes: React 18의 Strict Mode(개발 환경)에서는 컴포넌트가 의도적으로 한 번 더 마운트/언마운트되는 과정을 거칩니다. 이 과정에서 클린업 함수가 제대로 구현되어 있지 않으면 예기치 않은 이중 실행(예: 두 번 연결되는 웹소켓 등) 버그를 조기에 발견할 수 있으므로, 정확한 클린업 작성은 안정적인 React 앱 설계의 필수 조건입니다.