--- id: P-REINFORCE-AUTO-55865D category: "[[10_Wiki/πŸ’‘ Topics/Programming & Language]]" 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 μ•± μ„€κ³„μ˜ ν•„μˆ˜ μ‘°κ±΄μž…λ‹ˆλ‹€. - Raw Source: [[00_Raw/2026-04-20/useEffect 클린업(Cleanup).md]] ---