# [[Memory Leaks]] ## πŸ“Œ Brief Summary λ©”λͺ¨λ¦¬ λˆ„μˆ˜(Memory Leaks)λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήν•œ ν›„, 더 이상 ν•„μš”ν•˜μ§€ μ•ŠμŒμ—λ„ λΆˆκ΅¬ν•˜κ³  μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ κ°€λΉ„μ§€ 컬렉터(Garbage Collector)κ°€ 이λ₯Ό νšŒμˆ˜ν•˜μ§€ λͺ»ν•΄ λ°œμƒν•˜λŠ” ν˜„μƒμž…λ‹ˆλ‹€ [1]. μ΄λŠ” κ°œλ°œμžκ°€ μ½”λ“œ λ‚΄μ—μ„œ 더 이상 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” κ°μ²΄λ‚˜ DOM λ…Έλ“œμ— λŒ€ν•œ μ°Έμ‘°(Reference)λ₯Ό ν•΄μ œν•˜μ§€ μ•Šμ„ λ•Œ λ°œμƒν•˜λ©°, μ‹œκ°„μ΄ 지남에 따라 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ΄ μ§€μ†μ μœΌλ‘œ μ¦κ°€ν•˜κ²Œ λ§Œλ“­λ‹ˆλ‹€ [1, 2]. 결과적으둜 μ‚¬μš©μž μΈν„°νŽ˜μ΄μŠ€κ°€ λŠλ €μ§€κ³ , λΈŒλΌμš°μ € 탭이 λ©ˆμΆ”κ±°λ‚˜ 앱이 κ°•μ œ μ’…λ£Œλ˜λŠ” 치λͺ…적인 μ„±λŠ₯ μ €ν•˜λ₯Ό μ΄ˆλž˜ν•©λ‹ˆλ‹€ [2-4]. ## πŸ“– Core λŒ€Content * **λ°œμƒ 원리 및 μ£Όμš” νŒ¨ν„΄:** μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ κ°€λΉ„μ§€ μ»¬λ ‰ν„°λŠ” λ‚¨μ•„μžˆλŠ” μ°Έμ‘°κ°€ 없을 λ•Œλ§Œ λ©”λͺ¨λ¦¬λ₯Ό μžλ™μœΌλ‘œ νšŒμˆ˜ν•©λ‹ˆλ‹€ [1]. μ΅œμ‹  μžλ°”μŠ€ν¬λ¦½νŠΈ ν”„λ ˆμž„μ›Œν¬ ν™˜κ²½μ—μ„œ λ©”λͺ¨λ¦¬ λˆ„μˆ˜λ₯Ό μΌμœΌν‚€λŠ” κ°€μž₯ ν”ν•œ 원인은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€: * **Detached DOM Nodes:** λ¬Έμ„œ(DOM 트리)μ—μ„œλŠ” μ œκ±°λ˜μ—ˆμœΌλ‚˜, μžλ°”μŠ€ν¬λ¦½νŠΈ λ³€μˆ˜μ—μ„œ 계속 μ°Έμ‘°ν•˜κ³  μžˆμ–΄ λ©”λͺ¨λ¦¬μ—μ„œ ν•΄μ œλ˜μ§€ λͺ»ν•˜λŠ” κ³ μ•„(Orphaned) λ…Έλ“œμž…λ‹ˆλ‹€ [5-7]. * **이벀트 λ¦¬μŠ€λ„ˆ λˆ„μ :** μ»΄ν¬λ„ŒνŠΈκ°€ 마운트 ν•΄μ œ(Unmount)될 λ•Œ λ“±λ‘λœ 이벀트 λ¦¬μŠ€λ„ˆλ₯Ό μ œκ±°ν•˜μ§€ μ•Šμ•„ μ§€μ†μ μœΌλ‘œ μΆ•μ λ˜λŠ” ν˜„μƒμž…λ‹ˆλ‹€ [7]. * **ν΄λ‘œμ €(Closure)에 μ˜ν•œ μ°Έμ‘°:** ν΄λ‘œμ €κ°€ λΆ€λͺ¨ μŠ€μ½”ν”„μ˜ λ³€μˆ˜λ₯Ό 계속 μœ μ§€ν•˜μ—¬ λΆˆν•„μš”ν•˜κ²Œ 큰 객체듀을 λ©”λͺ¨λ¦¬μ— λ‚¨κ²¨λ‘λŠ” κ²½μš°μž…λ‹ˆλ‹€ [8]. * **React νŠΉν™” μš”μΈ:** `useEffect` ν›…(Hook)을 μ‚¬μš©ν•  λ•Œ 정리(Cleanup) ν•¨μˆ˜λ₯Ό λ°˜ν™˜ν•˜μ§€ μ•Šμ•„ 이벀트 λ¦¬μŠ€λ„ˆλ‚˜ ꡬ독(Subscription) μžμ›μ΄ μ»΄ν¬λ„ŒνŠΈ μ†Œλ©Έ 후에도 λ‚¨μ•„μžˆλŠ” κ²½μš°κ°€ λŒ€ν‘œμ μΈ μ›μΈμž…λ‹ˆλ‹€ [5, 9]. * **증상 및 감지:** λ©”λͺ¨λ¦¬κ°€ λ‹¨μˆœνžˆ 많이 μ‚¬μš©λ˜λŠ” 'λ©”λͺ¨λ¦¬ λΈ”λ‘œνŠΈ(Memory Bloat)'와 달리, λ©”λͺ¨λ¦¬ λˆ„μˆ˜λŠ” μΌμ •ν•œ μž‘μ—… λΆ€ν•˜ μ†μ—μ„œλ„ λ©”λͺ¨λ¦¬ μ†ŒλΉ„κ°€ μ§€μ†μ μœΌλ‘œ μ¦κ°€ν•˜μ—¬ μ•ˆμ •λ˜μ§€ μ•ŠλŠ” νŠΉμ„±μ΄ μžˆμŠ΅λ‹ˆλ‹€ [2, 4]. μ£Όμš” μ¦μƒμœΌλ‘œλŠ” μž¦μ€ κ°€λΉ„μ§€ μ»¬λ ‰μ…˜μœΌλ‘œ μΈν•œ 슀크립트 μ‹€ν–‰ μΌμ‹œ μ •μ§€(Jank), μ‹œκ°„μ΄ μ§€λ‚ μˆ˜λ‘ λŠλ €μ§€λŠ” μ„±λŠ₯, κΈ°λŠ₯ μ’…λ£Œ 후에도 κ°μ†Œν•˜μ§€ μ•ŠλŠ” λ©”λͺ¨λ¦¬ 점유율 등이 μžˆμŠ΅λ‹ˆλ‹€ [2, 4, 10, 11]. * **디버깅 및 ν”„λ‘œνŒŒμΌλ§ 방법:** * **Chrome Task Manager:** μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ‹€μ‹œκ°„ 'JavaScript Memory' μ‚¬μš©λŸ‰μ„ λͺ¨λ‹ˆν„°λ§ν•˜μ—¬ λˆ„μˆ˜ μ—¬λΆ€μ˜ 첫 λ‹¨μ„œλ₯Ό μž‘μŠ΅λ‹ˆλ‹€ [12, 13]. * **Heap Snapshots (νž™ μŠ€λƒ…μƒ·):** Chrome DevToolsλ₯Ό μ΄μš©ν•΄ μ—¬λŸ¬ μ‹œμ μ˜ μŠ€λƒ…μƒ·μ„ 찍고 비ꡐ(Comparison view)ν•˜μ—¬ μ§€μ†μ μœΌλ‘œ μ¦κ°€ν•˜λŠ” 객체(Delta 값이 μ–‘μˆ˜)λ₯Ό μ°ΎμŠ΅λ‹ˆλ‹€. 'Detached'λ₯Ό κ²€μƒ‰ν•˜μ—¬ κ³ μ•„ DOM λ…Έλ“œλ₯Ό μ°Ύκ³ , GC λ£¨νŠΈλ‘œλΆ€ν„° μ–΄λ–€ μ°Έμ‘°(Retainers)κ°€ 객체λ₯Ό μœ μ§€ν•˜κ³  μžˆλŠ”μ§€ μΆ”μ ν•©λ‹ˆλ‹€ [8, 11, 14, 15]. * **Allocation Timeline (ν• λ‹Ή νƒ€μž„λΌμΈ):** μ‹€μ‹œκ°„μœΌλ‘œ λ©”λͺ¨λ¦¬ ν• λ‹Ή νŒ¨ν„΄μ„ νŒŒμ•…ν•˜μ—¬ νŒŒλž€μƒ‰ λ§‰λŒ€κ°€ λ‚˜νƒ€λ‚œ ν›„ νšŒμƒ‰μœΌλ‘œ λ³€ν•˜μ§€ μ•Šκ³  μœ μ§€λ˜λŠ”(λ©”λͺ¨λ¦¬κ°€ ν•΄μ œλ˜μ§€ μ•ŠλŠ”) ꡬ간을 ν™•μΈν•©λ‹ˆλ‹€ [16-18]. * **Performance Recordings:** μ‹œκ°„μ— λ”°λ₯Έ λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ„ μ‹œκ°ν™”ν•˜λ©°, κ°•μ œ κ°€λΉ„μ§€ μ»¬λ ‰μ…˜μ„ μˆ˜ν–‰ν•œ 후에도 JS νž™(Heap) 크기가 μ‹œμž‘ μ‹œμ λ³΄λ‹€ λ†’κ²Œ μœ μ§€λ˜λ©΄ λˆ„μˆ˜λ₯Ό μ˜μ‹¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€ [19, 20]. * **예방 μ „λž΅:** 객체 μΊμ‹œλ₯Ό 관리할 λ•ŒλŠ” κ°€λΉ„μ§€ μ»¬λ ‰μ…˜μ΄ κ°€λŠ₯ν•œ `WeakMap`을 μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€ [21]. λ˜ν•œ CI νŒŒμ΄ν”„λΌμΈμ— Puppeteer 등을 ν™œμš©ν•œ μžλ™ν™”λœ λ©”λͺ¨λ¦¬ λˆ„μˆ˜ 감지 ν…ŒμŠ€νŠΈλ₯Ό ν†΅ν•©ν•˜κ³ , 각 ν”„λ ˆμž„μ›Œν¬μ˜ 생λͺ…μ£ΌκΈ°(예: React의 `useEffect` λ°˜ν™˜λΆ€, Vue의 `beforeUnmount` λ“±)에 λ§žλŠ” μ μ ˆν•œ 정리(Cleanup) νŒ¨ν„΄μ„ μ€€μˆ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€ [21]. ## βš–οΈ Trade-offs & Caveats μ†ŒμŠ€μ— κ΄€λ ¨ 정보가 μ œν•œμ μ΄λ‚˜, λ©”λͺ¨λ¦¬ λˆ„μˆ˜ μ΅œμ ν™” 및 λ””λ²„κΉ…μ—λŠ” λ‹€μŒκ³Ό 같은 μ œμ•½κ³Ό 개발 λ¦¬μ†ŒμŠ€ 츑면의 νŠΈλ ˆμ΄λ“œμ˜€ν”„κ°€ μ‘΄μž¬ν•©λ‹ˆλ‹€: * **디버깅 λ³΅μž‘μ„± 및 λ¦¬μ†ŒμŠ€ μ†Œλͺ¨:** Chrome DevTools의 νž™ μŠ€λƒ…μƒ· 비ꡐ와 ν• λ‹Ή νƒ€μž„λΌμΈ 뢄석은 개발 κ³Όμ •μ—μ„œ μƒλ‹Ήν•œ μ‹œκ°„κ³Ό 체계적인 뢄석 λŠ₯λ ₯을 μš”κ΅¬ν•©λ‹ˆλ‹€. λ˜ν•œ GC λ£¨νŠΈλ‘œλΆ€ν„°μ˜ μ°Έμ‘° 경둜(Retainer Path)λ₯Ό μˆ˜λ™μœΌλ‘œ 좔적해야 ν•˜λ―€λ‘œ λ³΅μž‘μ„±μ΄ λ†’μŠ΅λ‹ˆλ‹€ [8, 11, 22]. * **자료 ꡬ쑰의 μ œμ•½:** λ©”λͺ¨λ¦¬ λˆ„μˆ˜λ₯Ό μ˜ˆλ°©ν•˜κΈ° μœ„ν•΄ ν‘œμ€€ 객체(Object) μΊμ‹œ λŒ€μ‹  `WeakMap`을 μ‚¬μš©ν•˜λ©΄, μ°Έμ‘°κ°€ ν•΄μ œλ  수 μžˆλ‹€λŠ” μž₯점은 μžˆμœΌλ‚˜ 반볡(Iteration)이 λΆˆκ°€λŠ₯ν•˜κ³  ν‚€(Key)λ₯Ό 객체둜만 μ„€μ •ν•΄μ•Ό ν•˜λŠ” λ“±μ˜ κΈ°λŠ₯적 μ œμ•½μ΄ λ”°λ¦…λ‹ˆλ‹€ [21]. * **ν”„λ‘œλ•μ…˜ ν™˜κ²½μ—μ„œμ˜ λΉ„μš©:** ν”„λ‘œλ•μ…˜ ν™˜κ²½μ— λ„λ‹¬ν•˜κΈ° μ „ 개발 λ‹¨κ³„μ—μ„œ μ •κΈ°μ μœΌλ‘œ λ©”λͺ¨λ¦¬λ₯Ό ν”„λ‘œνŒŒμΌλ§ν•˜μ§€ μ•ŠμœΌλ©΄, ν”„λ‘œλ•μ…˜ λ‹¨κ³„μ—μ„œλŠ” μ§„λ‹¨ν•˜κΈ° 훨씬 μ–΄λ ΅κ³  μˆ˜μ •ν•˜λŠ” 데 훨씬 더 큰 λΉ„μš©μ΄ λ°œμƒν•©λ‹ˆλ‹€ [22]. ## πŸ”— Knowledge Connections ### Related Concepts #### [뢄석 및 진단 도ꡬ] - [[Chrome DevTools Memory Profiler]] - μ—°κ²° 이유: λ©”λͺ¨λ¦¬ λˆ„μˆ˜λ₯Ό 감지, 진단, μΆ”μ ν•˜κΈ° μœ„ν•œ κ°€μž₯ 핡심적인 싀무 λ„κ΅¬μž…λ‹ˆλ‹€ [3, 11]. - 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: νž™ μŠ€λƒ…μƒ·κ³Ό ν• λ‹Ή νƒ€μž„λΌμΈμ„ 톡해 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ λ©”λͺ¨λ¦¬ λΆ„λ°° ν˜„ν™©μ„ μ‹œκ°μ μœΌλ‘œ νŒŒμ•…ν•˜κ³ , GC(κ°€λΉ„μ§€ 컬렉터)κ°€ νšŒμˆ˜ν•˜μ§€ λͺ»ν•œ 객체의 원인을 λΆ„μ„ν•˜λŠ” 방법을 이해할 수 μžˆμŠ΅λ‹ˆλ‹€ [11, 14, 16]. #### [ν”„λ‘ νŠΈμ—”λ“œ μ•„ν‚€ν…μ²˜ 및 ν˜„μƒ] - [[Detached DOM Nodes]] - μ—°κ²° 이유: μ»΄ν¬λ„ŒνŠΈ 기반 UI κ°œλ°œμ—μ„œ κ°€μž₯ λΉˆλ²ˆν•˜κ²Œ λ°œμƒν•˜λŠ” λ©”λͺ¨λ¦¬ λˆ„μˆ˜ νŒ¨ν„΄μž…λ‹ˆλ‹€ [6, 7]. - 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: λ…Έλ“œκ°€ DOM νŠΈλ¦¬μ—μ„œ μ œκ±°λ˜μ—ˆμŒμ—λ„ λΆˆκ΅¬ν•˜κ³  μžλ°”μŠ€ν¬λ¦½νŠΈ λ³€μˆ˜ 등에 μ˜ν•œ μ°Έμ‘°κ°€ λ‚¨μ•„μžˆμ–΄ λ©”λͺ¨λ¦¬ λˆ„μˆ˜λ₯Ό μœ λ°œν•˜λŠ” 원리와 이λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•œ μ°Έμ‘° ν•΄μ œ 방법을 μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€ [6, 7, 15]. - [[Garbage Collection]] - μ—°κ²° 이유: μžλ°”μŠ€ν¬λ¦½νŠΈ λ©”λͺ¨λ¦¬ λˆ„μˆ˜μ˜ κ·Όλ³Έ 원인은 κ°€λΉ„μ§€ μ»¬λ ‰ν„°μ˜ λ™μž‘ 방식(μ°Έμ‘°κ°€ μ—†μ–΄μ•Ό λ©”λͺ¨λ¦¬ 회수)κ³Ό μ§κ²°λ©λ‹ˆλ‹€ [1, 2]. - 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: λ©”λͺ¨λ¦¬κ°€ μ‹œμŠ€ν…œμ— λ°˜ν™˜λ˜λŠ” μ‹œμ κ³Ό μž¦μ€ κ°€λΉ„μ§€ μ»¬λ ‰μ…˜μ΄ 슀크립트 싀행을 μΌμ‹œ μ€‘λ‹¨μ‹œμΌœ(Pause) λ Œλ”λ§ μ„±λŠ₯에 λ―ΈμΉ˜λŠ” 영ν–₯을 νŒŒμ•…ν•  수 μžˆμŠ΅λ‹ˆλ‹€ [2, 23]. #### [React νŒ¨ν„΄ 및 κ΅¬ν˜„] - [[useEffect Cleanup]] - μ—°κ²° 이유: React μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ‚΄μ—μ„œ ꡬ독 ν•΄μ œ 및 이벀트 λ¦¬μŠ€λ„ˆ 제거 μ‹€νŒ¨λ‘œ μΈν•œ λ©”λͺ¨λ¦¬ λˆ„μˆ˜λ₯Ό λ§‰λŠ” 직접적인 ν•΄κ²°μ±…μž…λ‹ˆλ‹€ [5, 9, 21]. - 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈμ˜ 생λͺ…μ£ΌκΈ° 관리와 μ»΄ν¬λ„ŒνŠΈ μ–Έλ§ˆμš΄νŠΈ μ‹œ λΆ€μˆ˜ 효과(Side-effects)λ₯Ό μ•ˆμ „ν•˜κ²Œ μ²˜λ¦¬ν•˜λŠ” λ©”μ»€λ‹ˆμ¦˜μ„ 이해할 수 μžˆμŠ΅λ‹ˆλ‹€ [9, 21]. ### Deeper Research Questions - κ°€λΉ„μ§€ μ»¬λ ‰μ…˜μ˜ λ™μž‘ 원리와 λΉ„κ΅ν•˜μ—¬, ν΄λ‘œμ €(Closure)에 μ˜ν•΄ μ°Έμ‘°κ°€ μœ μ§€λ˜λŠ” λ©”λͺ¨λ¦¬ λˆ„μˆ˜λŠ” ꡬ체적으둜 DevTools의 Retainer νŒ¨λ„μ—μ„œ μ–΄λ–»κ²Œ 좔적할 수 μžˆλŠ”κ°€? - μΊμ‹œ 관리에 `WeakMap`을 μ‚¬μš©ν•˜λŠ” μ „λž΅μ΄ 전톡적인 `Map`μ΄λ‚˜ 객체 λ¦¬ν„°λŸ΄μ„ μ‚¬μš©ν•  λ•Œμ˜ λ©”λͺ¨λ¦¬ 보쑴 방식과 기술적으둜 μ–΄λ–»κ²Œ λ‹€λ₯Έκ°€? - ν”„λ‘œλ•μ…˜ νŒŒμ΄ν”„λΌμΈ(CI/CD) ν™˜κ²½μ—μ„œ Puppeteerλ₯Ό ν™œμš©ν•˜μ—¬ λ©”λͺ¨λ¦¬ λˆ„μˆ˜λ₯Ό μžλ™μœΌλ‘œ ν…ŒμŠ€νŠΈν•˜κ³  μž‘μ•„λ‚΄λŠ” ꡬ체적인 κ΅¬ν˜„ 방법둠은 무엇인가? - λ©”λͺ¨λ¦¬ λΈ”λ‘œνŠΈ(Memory Bloat)와 λ©”λͺ¨λ¦¬ λˆ„μˆ˜(Memory Leak)λ₯Ό κ΅¬λΆ„ν•˜κΈ° μœ„ν•΄ Chrome Task Managerμ—μ„œ κ΄€μ°°ν•΄μ•Ό ν•˜λŠ” μ£Όμš” μ§€ν‘œμ™€ νŒ¨ν„΄μ€ μ–΄λ–»κ²Œ λ‹€λ₯Έκ°€? - React μ΄μ™Έμ˜ λͺ¨λ˜ ν”„λ ˆμž„μ›Œν¬(예: Angular의 `takeUntil`, Vue의 `beforeUnmount` λ“±)μ—μ„œλŠ” λ©”λͺ¨λ¦¬ λˆ„μˆ˜ λ°©μ§€λ₯Ό μœ„ν•΄ μ–΄λ–€ ꡬ쑰적 νŒ¨ν„΄μ„ μ‚¬μš©ν•˜λŠ”κ°€? ### Practical Application Contexts - **Implementation:** React μ»΄ν¬λ„ŒνŠΈλ₯Ό μž‘μ„±ν•  λ•Œ, `useEffect` λ‚΄μ—μ„œ μ„€μ •ν•œ νƒ€μ΄λ¨Έλ‚˜ μ™ΈλΆ€ 라이브러리 이벀트 λ¦¬μŠ€λ„ˆλŠ” λ°˜λ“œμ‹œ λ°˜ν™˜(return) ν•¨μˆ˜λ₯Ό 톡해 ν•΄μ œν•˜μ—¬ λ©”λͺ¨λ¦¬ λˆ„μˆ˜λ₯Ό 차단해야 ν•©λ‹ˆλ‹€ [7, 9, 21]. - **System Design:** μž₯κΈ° μ‹€ν–‰λ˜λŠ” SPA ν™˜κ²½μ—μ„œλŠ” μ»΄ν¬λ„ŒνŠΈ νŠΈλ¦¬κ°€ 자주 λ³€κ²½λ˜λ―€λ‘œ, 데이터 캐싱 계측 섀계 μ‹œ `WeakMap`을 λ„μž…ν•˜μ—¬ μ „μ—­ μƒνƒœμ—μ„œ 제거된 객체가 μžμ—°μŠ€λŸ½κ²Œ λ©”λͺ¨λ¦¬μ—μ„œ μ†Œλ©Έλ˜λ„λ‘ μ„€κ³„ν•©λ‹ˆλ‹€ [21]. - **Operation / Maintenance:** ν”„λ‘œλ•μ…˜ μ•±μ—μ„œ μ‚¬μš©μžκ°€ μž₯μ‹œκ°„ 이용 ν›„ '앱이 λ©ˆμΆ”κ±°λ‚˜ 느렀짐'을 보고할 경우, κ°œλ°œνŒ€μ€ 크둬 개발자 λ„κ΅¬μ˜ Performance νƒ­ 및 Memory νŒ¨λ„μ„ μΌœμ„œ μœ μ € μ‹œλ‚˜λ¦¬μ˜€λ₯Ό μž¬ν˜„ν•˜κ³  νž™ μŠ€λƒ…μƒ· κ°„μ˜ Deltaλ₯Ό λΉ„κ΅ν•˜μ—¬ μœ μ§€λ˜κ³  μžˆλŠ” 객체(Retained Size)λ₯Ό λ””λ²„κΉ…ν•©λ‹ˆλ‹€ [2, 11]. - **Learning Path:** μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ μ°Έμ‘° 및 μŠ€μ½”ν”„(Closure) 기초 ν•™μŠ΅ -> ν”„λ ˆμž„μ›Œν¬μ˜ 생λͺ…μ£ΌκΈ° ν›…(useEffect λ“±) 이해 -> Chrome DevToolsλ₯Ό ν™œμš©ν•œ Memory Profiling 기법 μˆ™λ‹¬ -> CI ν™˜κ²½μ—μ„œμ˜ μžλ™ν™” ν…ŒμŠ€νŠΈ ꡬ좕 λ‹¨κ³„λ‘œ λ‚˜μ•„κ°‘λ‹ˆλ‹€ [9, 11, 21]. - **My Project Relevance:** ν˜„μž¬ μ§„ν–‰ 쀑인 React μ½”λ“œλ² μ΄μŠ€ λ¦¬νŒ©ν† λ§ μ‹œ, κΈ°μ‘΄ 학생듀이 μž‘μ„±ν•œ μ½”λ“œ 쀑 `useEffect`의 λ°˜ν™˜ ν•¨μˆ˜ λˆ„λ½μ΄λ‚˜ λΆˆν•„μš”ν•œ 이벀트 λ¦¬μŠ€λ„ˆ 쀑볡 등둝을 μ‹λ³„ν•˜κ³  κ°œμ„ ν•˜μ—¬ μ•±μ˜ μž₯기적인 ꡬ동 μ•ˆμ •μ„±μ„ ν™•λ³΄ν•˜λŠ” 데 ν•„μˆ˜μ μΈ μ§€μ‹μž…λ‹ˆλ‹€ [9, 24, 25]. ### Adjacent Topics - [[Memory Bloat]] - ν™•μž₯ λ°©ν–₯: λ©”λͺ¨λ¦¬ λˆ„μˆ˜μ²˜λŸΌ 계속 μ¦κ°€ν•˜μ§€λŠ” μ•Šμ§€λ§Œ, μ΄ˆκΈ°λΆ€ν„° 졜적의 νŽ˜μ΄μ§€ 속도λ₯Ό μœ„ν•΄ ν•„μš”ν•œ μˆ˜μ€€λ³΄λ‹€ κ³Όλ„ν•˜κ²Œ λ§Žμ€ λ©”λͺ¨λ¦¬λ₯Ό μ‚¬μš©ν•˜λŠ” μƒνƒœλ₯Ό μ§„λ‹¨ν•˜κ³  μ΅œμ ν™”ν•˜λŠ” λ°©λ²•μœΌλ‘œ ν™•μž₯이 κ°€λŠ₯ν•©λ‹ˆλ‹€ [2, 10]. - [[Core Web Vitals]] - ν™•μž₯ λ°©ν–₯: μž¦μ€ κ°€λΉ„μ§€ μ»¬λ ‰μ…˜κ³Ό λ©”λͺ¨λ¦¬ λˆ„μˆ˜λ‘œ 인해 슀크립트 싀행이 μ§€μ—°λ˜λ©΄μ„œ FID(First Input Delay)λ‚˜ INP(Interaction to Next Paint) 같은 μ‹€μ œ μ‚¬μš©μž 체감 μ„±λŠ₯ μ§€ν‘œμ— λ―ΈμΉ˜λŠ” 영ν–₯을 μ‹¬μΈ΅μ μœΌλ‘œ 뢄석할 수 μžˆμŠ΅λ‹ˆλ‹€ [23, 26]. --- *Last updated: 2026-04-30*