# [[Memory Leak Detection]] ## ๐Ÿ“Œ Brief Summary ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜(Memory Leak)๋ž€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•œ ํ›„ ํ•ด๋‹น ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ํ•ด์ œํ•˜์ง€ ์•Š์•„ ๋ฐœ์ƒํ•˜๋Š” ํ˜„์ƒ์ž…๋‹ˆ๋‹ค [1]. ์ด๋กœ ์ธํ•ด ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ๋ฉ”๋ชจ๋ฆฌ ์†Œ๋น„๊ฐ€ ์ง€์†์ ์œผ๋กœ ์ฆ๊ฐ€ํ•˜๋ฉฐ, ๊ฒฐ๊ตญ ์„ฑ๋Šฅ ์ €ํ•˜, ๋ธŒ๋ผ์šฐ์ € ํƒญ ๋ฉˆ์ถค ๋˜๋Š” ํฌ๋ž˜์‹œ ๋“ฑ์„ ์œ ๋ฐœํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค [2]. ์ฃผ๋กœ ๋ฌธ์„œ์—์„œ ์ œ๊ฑฐ๋œ DOM ๋…ธ๋“œ, ์ •๋ฆฌ๋˜์ง€ ์•Š์€ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ, ํด๋กœ์ €์— ์˜ํ•ด ์˜๋„์น˜ ์•Š๊ฒŒ ์œ ์ง€๋˜๋Š” ๊ฐ์ฒด ์ฐธ์กฐ ๋“ฑ์ด ์ฃผ์š” ์›์ธ์œผ๋กœ ์ž‘์šฉํ•ฉ๋‹ˆ๋‹ค [3, 4]. ## ๐Ÿ“– Core ์†Œ์Šค Content **์ฆ์ƒ ๋ฐ ์‹๋ณ„** * ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ์ด ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ์ ์ง„์ ์œผ๋กœ ์ €ํ•˜๋˜๊ฑฐ๋‚˜, ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ์•ˆ์ •ํ™”(plateau)๋˜์ง€ ์•Š๊ณ  ๊ณ„์† ์ฆ๊ฐ€ํ•˜๋Š” ์ฆ์ƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค [1, 2, 5]. * Chrome Task Manager๋ฅผ ์‚ฌ์šฉํ•ด ์‹ค์‹œ๊ฐ„ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 'Memory footprint'๋Š” DOM ๋…ธ๋“œ์™€ ๊ฐ™์€ OS ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ, 'JavaScript Memory'์˜ ๊ด„ํ˜ธ ์•ˆ ์ˆซ์ž๋Š” ์—ฐ๊ฒฐ๋œ(reachable) ๊ฐ์ฒด๋“ค์ด ์‚ฌ์šฉํ•˜๋Š” JS ํž™(heap)์˜ ํฌ๊ธฐ๋ฅผ ๋‚˜ํƒ€๋‚ด์–ด, ์ด ์ˆ˜์น˜๊ฐ€ ๊ณ„์† ์ฆ๊ฐ€ํ•˜๋ฉด ๋ˆ„์ˆ˜์ผ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค [6, 7]. **๋””๋ฒ„๊น… ๋ฐ ๋ถ„์„ ๋„๊ตฌ** * **Heap Snapshots (ํž™ ์Šค๋ƒ…์ƒท):** Chrome DevTools์˜ Memory ํŒจ๋„์„ ์ด์šฉํ•ด ํŠน์ • ์‹œ์ ์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ถ„ํฌ๋ฅผ ์บก์ฒ˜ํ•ฉ๋‹ˆ๋‹ค [8, 9]. ์˜์‹ฌ๋˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์ „ํ›„๋กœ ์Šค๋ƒ…์ƒท์„ ์ฐ๊ณ  ๋น„๊ต(Comparison view)ํ•˜์—ฌ ์–‘์˜ Delta ๊ฐ’์„ ๊ฐ€์ง€๋Š” ๊ฐ์ฒด๋ฅผ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [9]. 'Detached' ํ•„ํ„ฐ ๊ฒ€์ƒ‰์„ ํ†ตํ•ด DOM ํŠธ๋ฆฌ์—์„œ ๋ถ„๋ฆฌ๋˜์—ˆ์œผ๋‚˜ JavaScript ์ฐธ์กฐ๋กœ ์ธํ•ด ๋ฉ”๋ชจ๋ฆฌ์— ๋‚จ์•„์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3, 8]. * **Allocation Timeline (ํ• ๋‹น ํƒ€์ž„๋ผ์ธ):** ์‹ค์‹œ๊ฐ„ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ํŒจํ„ด์„ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค [10, 11]. ํŒŒ๋ž€์ƒ‰ ๋ง‰๋Œ€๋Š” ์ƒˆ๋กœ์šด ํ• ๋‹น์„, ํšŒ์ƒ‰ ๋ง‰๋Œ€๋Š” ํ•ด์ œ๋œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ํŒŒ๋ž€์ƒ‰ ๋ง‰๋Œ€๊ฐ€ ์ง€์†์ ์œผ๋กœ ํšŒ์ƒ‰์œผ๋กœ ๋ณ€ํ•˜์ง€ ์•Š์œผ๋ฉด ๋ˆ„์ˆ˜ ๊ฐ์ฒด์ž„์„ ์•”์‹œํ•ฉ๋‹ˆ๋‹ค [11]. * **Performance Recordings:** ์‹œ๊ฐ„ ๊ฒฝ๊ณผ์— ๋”ฐ๋ฅธ ํŽ˜์ด์ง€์˜ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์‹œ๊ฐํ™”ํ•˜๋ฉฐ, ๋…ธ๋“œ ์ˆ˜๋‚˜ JS ํž™ ๊ทธ๋ž˜ํ”„๊ฐ€ ์šฐ์ƒํ–ฅํ•˜๋Š” ํŒจํ„ด์„ ๋ณด์ผ ๋•Œ ๋ˆ„์ˆ˜๋ฅผ ์˜์‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [12, 13]. **์ฃผ์š” ๋ฐœ์ƒ ํŒจํ„ด** * **Detached DOM Nodes:** DOM ๋ฌธ์„œ์—์„œ ์ œ๊ฑฐ๋˜์—ˆ์œผ๋‚˜ JavaScript ๋‚ด ๋ณ€์ˆ˜ ๋“ฑ์— ์˜ํ•ด ์ฐธ์กฐ๊ฐ€ ์œ ์ง€๋˜์–ด ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๊ฐ€ ์ˆ˜์ง‘ํ•˜์ง€ ๋ชปํ•˜๋Š” ๋…ธ๋“œ์ž…๋‹ˆ๋‹ค [3, 14]. * **์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๋ฐ ๊ตฌ๋… ๋ˆ„์ :** ์ปดํฌ๋„ŒํŠธ ๋งˆ์šดํŠธ ํ•ด์ œ ์‹œ ๋ฆฌ์Šค๋„ˆ๋‚˜ ์˜ต์ €๋ฒ„๋ธ” ๊ตฌ๋…์„ ์ •๋ฆฌ(cleanup)ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค (์˜ˆ: React์˜ `useEffect` ์ •๋ฆฌ ํ•จ์ˆ˜ ๋ˆ„๋ฝ, Angular์˜ ๊ตฌ๋… ํ•ด์ œ ๋ˆ„๋ฝ) [3, 15, 16]. * **ํด๋กœ์ €(Closure) ์œ ์ง€:** ํด๋กœ์ €๊ฐ€ ๋ถ€๋ชจ ์Šค์ฝ”ํ”„์˜ ๋ณ€์ˆ˜๋ฅผ ์‚ด๋ ค๋‘์–ด ๋ถˆํ•„์š”ํ•˜๊ฒŒ ํฐ ๊ฐ์ฒด ์ฐธ์กฐ๊ฐ€ ์œ ์ง€๋˜๋Š” ๊ฒฝ์šฐ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [4]. **์˜ˆ๋ฐฉ ์ „๋žต** * ๋ฐ์ดํ„ฐ ์บ์‹ฑ ์‹œ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์„ ๋ฐฉํ•ดํ•˜์ง€ ์•Š๋„๋ก ๊ฐ์ฒด ๋Œ€์‹  `WeakMap`์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค [16]. * ๊ฐœ๋ฐœ ๊ณผ์ • ๋˜๋Š” CI ํŒŒ์ดํ”„๋ผ์ธ์— Puppeteer๋ฅผ ํ™œ์šฉํ•œ ์ž๋™ํ™”๋œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๊ฐ์ง€ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ฉํ•ฉ๋‹ˆ๋‹ค [16]. ## โš–๏ธ Trade-offs & Caveats * **๋ฉ”๋ชจ๋ฆฌ ํŒฝ์ฐฝ(Bloat)๊ณผ์˜ ๊ตฌ๋ณ„:** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ฑ๋Šฅ์ด ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ๋‚˜๋น ์ง€๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜์™€ ๋‹ฌ๋ฆฌ, ๋‹จ์ˆœํžˆ ์ตœ์ ํ™”๋˜์ง€ ์•Š์•„ ์ง€์†์ ์œผ๋กœ ์„ฑ๋Šฅ์ด ๋‚˜์œ '๋ฉ”๋ชจ๋ฆฌ ํŒฝ์ฐฝ(Memory Bloat)'์„ ๊ตฌ๋ณ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [5]. ์ด ๊ธฐ์ค€์€ ๊ธฐ๊ธฐ ์„ฑ๋Šฅ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๋ฏ€๋กœ, ๋Œ€์ƒ ์‚ฌ์šฉ์ž์˜ ๊ธฐ๊ธฐ ํ™˜๊ฒฝ์„ ๊ณ ๋ คํ•œ ์ธก์ • ๊ธฐ์ค€์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค [17]. * **๋ถ„์„ ๊ณผ์ •์˜ ๋ณต์žก์„ฑ:** ํž™ ์Šค๋ƒ…์ƒท์„ ์ฐ๊ณ  ๋ถ„์„ํ•˜๋Š” ๊ณผ์ •์€ ๋กœ๋”ฉ ์ฒ˜๋ฆฌ์— ์‹œ๊ฐ„์ด ์†Œ์š”๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜(GC) ๋ฃจํŠธ๋กœ๋ถ€ํ„ฐ์˜ ๊ฑฐ๋ฆฌ์™€ Retainer path๋ฅผ ๋ถ„์„ํ•˜๋Š” ๊ฒƒ์€ ์›์ธ์„ ์ฐพ๋Š” ๋ฐ ์ถ”๊ฐ€์ ์ธ ํ•™์Šต ๊ณก์„ ์ด ์š”๊ตฌ๋ฉ๋‹ˆ๋‹ค [4, 8]. * **๊ฐ•์ œ GC์˜ ํ•„์š”์„ฑ:** ์ •ํ™•ํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ์‹๋ณ„ ๋ฐ ํŒจ์น˜ ํ›„ ํ™•์ธ์„ ์œ„ํ•ด์„œ๋Š” ์Šค๋ƒ…์ƒท์„ ์บก์ฒ˜ํ•˜๊ฑฐ๋‚˜ ์„ฑ๋Šฅ ๋…นํ™”๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ ์ „ํ›„์— ๋ฐ˜๋“œ์‹œ ์ˆ˜๋™์œผ๋กœ ๊ฐ•์ œ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜(ํœด์ง€ํ†ต ์•„์ด์ฝ˜ ํด๋ฆญ ๋“ฑ)์„ ์‹คํ–‰ํ•˜์—ฌ, ์ •์ƒ์ ์œผ๋กœ ํ•ด์ œ๋œ ๊ฐ์ฒด๋ฅผ ๋ˆ„์ˆ˜ ๋ฐ์ดํ„ฐ์—์„œ ๋ฐฐ์ œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [9, 12, 18]. ## ๐Ÿ”— Knowledge Connections ### Related Concepts #### [๋ถ„์„ ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ] - [[Chrome DevTools]] - ์—ฐ๊ฒฐ ์ด์œ : Memory ํŒจ๋„์˜ Heap Snapshot, Allocation Timeline ๋“ฑ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ์ง„๋‹จํ•˜๊ธฐ ์œ„ํ•œ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ํ•„์ˆ˜ ํ™˜๊ฒฝ์ž…๋‹ˆ๋‹ค [8-10]. - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ธŒ๋ผ์šฐ์ € ๋‚ด๋ถ€์—์„œ ๊ฐ์ฒด ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์–ด๋–ป๊ฒŒ ํ• ๋‹น๋˜๊ณ , GC ๋ฃจํŠธ๊ฐ€ ์ฐธ์กฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์ถ”์ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์‹ค์ œ์  ๋””๋ฒ„๊น… ํ๋ฆ„. #### [์ฃผ์š” ๋ˆ„์ˆ˜ ์›์ธ/์•„ํ‚คํ…์ฒ˜] - [[Detached DOM Nodes]] - ์—ฐ๊ฒฐ ์ด์œ : DOM ํŠธ๋ฆฌ์—์„  ์ œ๊ฑฐ๋˜์—ˆ์œผ๋‚˜ JS ์ฝ”๋“œ์—์„œ ์ฐธ์กฐ๋ฅผ ์œ ์ง€ํ•ด ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๊ฐ€ ์ˆ˜์ง‘ํ•˜์ง€ ๋ชปํ•˜๋Š”, ๊ฐ€์žฅ ๋Œ€ํ‘œ์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ํŒจํ„ด์ž…๋‹ˆ๋‹ค [3, 14]. - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํ”„๋ŸฐํŠธ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(ํŠนํžˆ SPA)์—์„œ UI ์—…๋ฐ์ดํŠธ ๋ฐ ์ปดํฌ๋„ŒํŠธ ๋งˆ์šดํŠธ ํ•ด์ œ ์‹œ ๋ฐœ์ƒํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„ ๋ฉ”์ปค๋‹ˆ์ฆ˜. - [[Garbage Collection]] - ์—ฐ๊ฒฐ ์ด์œ : JS๋Š” ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ž๋™์œผ๋กœ ํšŒ์ˆ˜ํ•˜์ง€๋งŒ, GC ๋ฃจํŠธ(root)์— ์ฐธ์กฐ๊ฐ€ ๋‚จ์•„์žˆ์œผ๋ฉด ์ด ๊ณผ์ •์ด ๋ฐฉํ•ด๋ฅผ ๋ฐ›์•„ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [1, 4]. - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Shallow size์™€ Retained size์˜ ์ฐจ์ด์  ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ์˜ ๊ทผ๋ณธ์ ์ธ ํ•œ๊ณ„ [18]. #### [์˜ˆ๋ฐฉ ๋ฐ ์บ์‹ฑ ์ „๋žต] - [[WeakMap]] - ์—ฐ๊ฒฐ ์ด์œ : ์บ์‹œ๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ, ๊ฐ•ํ•œ ์ฐธ์กฐ๋ฅผ ๋‚จ๊ธฐ์ง€ ์•Š์•„ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์„ ๋ฐฉํ•ดํ•˜์ง€ ์•Š๋Š” ์ด์ƒ์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ๊ธฐ๋ฒ•์œผ๋กœ ์ œ์‹œ๋ฉ๋‹ˆ๋‹ค [16]. - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: JavaScript ํ™˜๊ฒฝ์—์„œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•˜๋ฉฐ ๋ฐ์ดํ„ฐ๋ฅผ ์บ์‹ฑํ•˜๋Š” ๊ณ ๊ธ‰ ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด. ### Deeper Research Questions - Chrome DevTools์˜ ํž™ ์Šค๋ƒ…์ƒท(Heap Snapshot)์—์„œ ๋ช…์‹œ๋˜๋Š” Shallow Size์™€ Retained Size์˜ ์ •ํ™•ํ•œ ์ฐจ์ด์ ์€ ๋ฌด์—‡์ด๋ฉฐ, ๋””๋ฒ„๊น… ๊ณผ์ •์—์„œ ๊ฐ๊ฐ ์–ด๋–ป๊ฒŒ ํ™œ์šฉ๋˜๋Š”๊ฐ€? - React์˜ `useEffect` ํด๋ฆฐ์—…(cleanup) ํ•จ์ˆ˜ ๋ˆ„๋ฝ์ด ํ”„๋ŸฐํŠธ์—”๋“œ์—์„œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ์œ ๋ฐœํ•˜๋Š” ๊ธฐ์ˆ ์  ์›๋ฆฌ๋Š” ๋ฌด์—‡์ด๋ฉฐ, ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ๋ณ„ ๋ชจ๋ฒ” ์‚ฌ๋ก€๋Š” ๋ฌด์—‡์ธ๊ฐ€? - ์„œ๋ฒ„ ์‚ฌ์ด๋“œ(Node.js) ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋Š” ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ(๋ธŒ๋ผ์šฐ์ €) ํ™˜๊ฒฝ๊ณผ ๋น„๊ตํ–ˆ์„ ๋•Œ ์›์ธ ๋ฐ ๋””๋ฒ„๊น… ๋ฐฉ๋ฒ•(V8 inspector protocol ํ™œ์šฉ) ์ธก๋ฉด์—์„œ ์–ด๋–ค ์ฐจ์ด๊ฐ€ ์žˆ๋Š”๊ฐ€? - Puppeteer๋ฅผ ํ™œ์šฉํ•œ ์ž๋™ํ™”๋œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ํ…Œ์ŠคํŠธ ์Šคํฌ๋ฆฝํŠธ๋ฅผ CI/CD ํŒŒ์ดํ”„๋ผ์ธ์— ๊ตฌ์ถ•ํ•  ๋•Œ ์œ ์˜ํ•ด์•ผ ํ•  ๊ธฐ์ˆ ์  ์ œ์•ฝ ์‚ฌํ•ญ์€ ๋ฌด์—‡์ธ๊ฐ€? - ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜(Memory Leak)์™€ ๋ฉ”๋ชจ๋ฆฌ ํŒฝ์ฐฝ(Memory Bloat)์„ ๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ ์กฐ๊ธฐ์— ์‹๋ณ„ํ•˜๊ณ  ๊ตฌ๋ณ„ํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ€์žฅ ์ •๋Ÿ‰์ ์ด๊ณ  ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ์ง€ํ‘œ๋Š” ๋ฌด์—‡์ธ๊ฐ€? ### Practical Application Contexts - **Implementation:** React, Vue ๋“ฑ์˜ SPA ํ”„๋ ˆ์ž„์›Œํฌ ๊ฐœ๋ฐœ ์‹œ, ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ธ๋งˆ์šดํŠธ๋˜๋Š” ์‹œ์ (`useEffect` return ํ•จ์ˆ˜, `beforeUnmount` ๋“ฑ)์— ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ์™€ ํƒ€์ด๋จธ, ์˜ต์ €๋ฒ„๋ธ” ๊ตฌ๋…์„ ๋ช…์‹œ์ ์œผ๋กœ ํ•ด์ œํ•˜๋Š” ํด๋ฆฐ์—… ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค [15, 16]. - **System Design:** ์žฅ๊ธฐ ์‹คํ–‰๋˜๋Š” ์บ์‹œ ์‹œ์Šคํ…œ ๊ตฌ์ถ• ์‹œ, ๋ˆ„์ˆ˜๋กœ ์ธํ•œ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ผ๋ฐ˜ ๊ฐ์ฒด(Object) ๋Œ€์‹  `WeakMap`์„ ๋„์ž…ํ•˜์—ฌ GC๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ด๋ฃจ์–ด์ง€๋„๋ก ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค [16]. - **Operation / Maintenance:** ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์˜ ๋ณต์žกํ•œ ์‚ฌ์šฉ์ž ์ƒํ˜ธ์ž‘์šฉ ํ›„ ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋ณด๊ณ ๋˜๋ฉด, Chrome Task Manager์™€ Performance ํƒญ์„ ์‚ฌ์šฉํ•ด ์ฃผ๊ธฐ์ ์ธ ๊ฐ•์ œ GC ์ดํ›„์—๋„ ์šฐ์ƒํ–ฅํ•˜๋Š” 'JavaScript Memory' ์ง€ํ‘œ๋ฅผ ํ™•์ธํ•˜๋Š” ์œ ์ง€๋ณด์ˆ˜ ์ ˆ์ฐจ๋ฅผ ์ˆ˜๋ฆฝํ•ฉ๋‹ˆ๋‹ค [6, 7, 12]. - **Learning Path:** Chrome DevTools์˜ 'Memory' ํƒญ์—์„œ ์Šค๋ƒ…์ƒท์„ ์บก์ฒ˜ํ•˜๊ณ  'Comparison' ๋ทฐ๋ฅผ ํ†ตํ•ด 'Delta' ๋ฐ 'Retained Size'๋ฅผ ๋ถ„์„ํ•˜๋Š” ์‹ค์Šต์„ ๊ฑฐ์ณ, ๋ฉ”๋ชจ๋ฆฌ ์„ฑ๋Šฅ ๊ฐœ์„ ์˜ ๊ธฐ์ดˆ๋ฅผ ๋‹ค์ง‘๋‹ˆ๋‹ค [9, 18]. - **My Project Relevance:** ๋ชจ๋ฐ”์ผ์ด๋‚˜ ์ €์‚ฌ์–‘ ๊ธฐ๊ธฐ์—์„œ ์‚ฌ์šฉ์ž๋“ค์˜ ๋Œ€์‹œ๋ณด๋“œ ๋ฌดํ•œ ์Šคํฌ๋กค ๋ฐ ํ™”๋ฉด ์ „ํ™˜ ์ค‘ ์•ฑ ํฌ๋ž˜์‹œ ํ˜„์ƒ์ด ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ, Detached DOM ๋˜๋Š” ์Œ“์—ฌ ์žˆ๋Š” ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๊ฐ€ ์žˆ๋Š”์ง€ ํƒ€์ž„๋ผ์ธ ํ”„๋กœํŒŒ์ผ๋ง์„ ํ†ตํ•ด ์ ๊ฒ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [2, 3, 14]. ### Adjacent Topics - [[Core Web Vitals]] - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋กœ ์ธํ•ด ๋ธŒ๋ผ์šฐ์ €์˜ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๊ฐ€ ๊ณผ๋ถ€ํ•˜์— ๊ฑธ๋ฆฌ๊ฑฐ๋‚˜ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์ด ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ฐœ์ƒํ•˜์—ฌ ์‹คํ–‰์„ ์ค‘๋‹จ์‹œํ‚ฌ ๋•Œ, ์ด๊ฒƒ์ด INP(Interaction to Next Paint)์™€ ๊ฐ™์€ ์‚ฌ์šฉ์ž ์ฒด๊ฐ ์„ฑ๋Šฅ ์ง€ํ‘œ์— ์–ด๋–ป๊ฒŒ ์น˜๋ช…์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”์ง€ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค. - [[React Server Components (RSC)]] - ํ™•์žฅ ๋ฐฉํ–ฅ: ํด๋ผ์ด์–ธํŠธ ์ธก์— ์ „์†ก๋˜๋Š” JavaScript์˜ ์–‘ ์ž์ฒด๋ฅผ ์ค„์ด๊ณ  ์ƒํ˜ธ์ž‘์šฉ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ์„œ๋ฒ„๋กœ ์˜ฎ๊น€์œผ๋กœ์จ, ๋ธŒ๋ผ์šฐ์ € ๋‹จ์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฐ ํŒฝ์ฐฝ ์œ„ํ—˜์„ ์•„ํ‚คํ…์ฒ˜ ์ˆ˜์ค€์—์„œ ์–ด๋–ป๊ฒŒ ๊ฒฝ๊ฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š”์ง€ ํƒ๊ตฌํ•ฉ๋‹ˆ๋‹ค. --- *Last updated: 2026-04-30*