diff --git a/00_Raw/A2A (Agent-to-Agent).md b/00_Raw/A2A (Agent-to-Agent).md deleted file mode 100644 index 2fcef8a8..00000000 --- a/00_Raw/A2A (Agent-to-Agent).md +++ /dev/null @@ -1,62 +0,0 @@ -# [[A2A (Agent-to-Agent)]] - -## ๐Ÿ“Œ Brief Summary -A2A (Agent-to-Agent)๋Š” ๋…๋ฆฝ์ ์ธ AI ์—์ด์ „ํŠธ๋“ค ์‚ฌ์ด ๋˜๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ์—์ด์ „ํŠธ ํ•˜๋‹ˆ์Šค(Agent Harness) ๊ฐ„์˜ ์›๊ฒฉ ์ž‘์—… ์œ„์ž„, ํ†ต์‹  ๋ฐ ์กฐ์ •์„ ํ‘œ์ค€ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์„ค๊ณ„๋œ ์˜คํ”ˆ ํ”„๋กœํ† ์ฝœ์ด๋‹ค [1-5]. 2025๋…„ Google์— ์˜ํ•ด ๋„์ž…๋œ ์ด ํ”„๋กœํ† ์ฝœ์€ HTTPS์™€ Server-Sent Events(SSE)๋ฅผ ์ „์†ก ๊ณ„์ธต์œผ๋กœ ํ™œ์šฉํ•˜์—ฌ ์žฅ๊ธฐ ์‹คํ–‰ ์ž‘์—…์˜ ์ง„ํ–‰ ์ƒํ™ฉ ์ŠคํŠธ๋ฆฌ๋ฐ๊ณผ ์ƒํƒœ ์œ ์ง€(Stateful) ์ƒํ˜ธ์ž‘์šฉ์„ ์ง€์›ํ•œ๋‹ค [1, 3, 6-8]. ์ฃผ๋กœ ์‹คํ–‰ ๋ฃจํ”„(E-component)์˜ ๋‹ค์ค‘ ์—์ด์ „ํŠธ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๋ฉฐ, ์—์ด์ „ํŠธ๊ฐ€ ๋‹ค๋ฅธ ์—์ด์ „ํŠธ์˜ ๋‚ด๋ถ€ ๊ตฌํ˜„์„ ์•Œ ํ•„์š” ์—†์ด ์•ˆ์ „ํ•˜๊ฒŒ ํ•˜์œ„ ์ž‘์—…์„ ์œ„์ž„ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š”๋‹ค [2, 4]. - -## ๐Ÿ“– Core ์†Œ์Šค Content -**ํ”„๋กœํ† ์ฝœ ์•„ํ‚คํ…์ฒ˜ ๋ฐ ํ†ต์‹  ๋ชจ๋ธ** -A2A๋Š” HTTPS์™€ Server-Sent Events(SSE)๋ฅผ ํ†ตํ•ด ์›๊ฒฉ ์—์ด์ „ํŠธ ๊ฐ„์˜ ํ”ผ์–ดํˆฌํ”ผ์–ด(Peer-to-Peer) ์ˆ˜์ค€ ํ†ต์‹ ์„ ์ง€์›ํ•œ๋‹ค [1, 3, 9, 10]. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ƒํƒœ ์œ ์ง€ ์„ธ์…˜(Stateful sessions)๊ณผ ์ž‘์—… ID ๊ด€๋ฆฌ๋ฅผ ์ง€์›ํ•˜์—ฌ ์›๊ฒฉ ์—์ด์ „ํŠธ๊ฐ€ ๊ธด ์‹œ๊ฐ„ ๋™์•ˆ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ์ž‘์—…์˜ ์ง„ํ–‰ ์ƒํ™ฉ์„ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ŠคํŠธ๋ฆฌ๋ฐํ•  ์ˆ˜ ์žˆ๋‹ค [6-8]. ๋˜ํ•œ ๋ฉ”์‹œ์ง€์™€ ์•„ํ‹ฐํŒฉํŠธ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ, ๊ฒฐ๊ณผ๋ฌผ์„ ๋‹จ์ˆœํ•œ ์ฑ„ํŒ… ๋ฉ”์‹œ์ง€๊ฐ€ ์•„๋‹Œ ๊ตฌ์กฐํ™”๋œ ์ž‘์—… ์•„ํ‹ฐํŒฉํŠธ(Task Artifact) ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ๊ทœ์ •ํ•œ๋‹ค [8]. - -**๋ฐœ๊ฒฌ(Discovery) ๋ฉ”์ปค๋‹ˆ์ฆ˜ ๋ฐ ํ†ตํ•ฉ ๊ฒฝ๊ณ„** -A2A ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜๋Š” ํ•˜๋‹ˆ์Šค๋Š” '์—์ด์ „ํŠธ ์นด๋“œ(Agent Card)'๋ฅผ ํ†ตํ•ด ์ž์‹ ์ด ํ˜ธ์ŠคํŒ…ํ•˜๋Š” ์—์ด์ „ํŠธ์˜ ๊ธฐ๋Šฅ(Capabilities)๊ณผ ํ†ต์‹  ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์„ ์–ธํ•œ๋‹ค [2, 4, 5, 8]. ์ด๋ฅผ ํ†ตํ•ด ์œ„์ž„ํ•˜๋Š” ์—์ด์ „ํŠธ(Delegating agent)๋Š” ๋™์ ์œผ๋กœ ์ž‘์—…์— ์ ํ•ฉํ•œ ์™ธ๋ถ€ ์—์ด์ „ํŠธ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ  ์œ„์ž„ํ•  ์ˆ˜ ์žˆ๋‹ค [5]. ์ด ๊ณผ์ •์—์„œ A2A๋Š” ์—์ด์ „ํŠธ์™€ ๋„๊ตฌ ๊ฐ„ ํ†ต์‹ ์„ ๋‹ด๋‹นํ•˜๋Š” MCP(Model Context Protocol)์™€ ์ƒํ˜ธ๋ณด์™„์  ์Šคํƒ์„ ํ˜•์„ฑํ•œ๋‹ค [11-14]. ์ฆ‰, ํ•˜๋‹ˆ์Šค์™€ ํ•˜๋‹ˆ์Šค ๊ฐ„์˜ ํ†ต์‹ ์€ A2A๊ฐ€ ๋‹ด๋‹นํ•˜๊ณ , ํ•˜๋‹ˆ์Šค ๋‚ด๋ถ€์˜ ๋„๊ตฌ ํ˜ธ์ถœ์€ MCP๊ฐ€ ๋‹ด๋‹นํ•˜์—ฌ ์‹œ์Šคํ…œ์˜ ์—ญํ•  ๋ถ„๋ฆฌ๋ฅผ ๋ช…ํ™•ํžˆ ํ•œ๋‹ค [12, 14]. - -**๋ณด์•ˆ, ์œ„์ž„ ๋ฐ ๊ฑฐ๋ฒ„๋„Œ์Šค(Governance)** -A2A๋Š” ์ž„์‹œ๋ฐฉํŽธ์ ์ธ ๋ฉ”์‹œ์ง€ ์ „๋‹ฌ์ด ์•„๋‹Œ, ๋ช…ํ™•ํ•œ ์ž‘์—… ๊ฒฝ๊ณ„, ๊ถŒํ•œ ๋ถ€์—ฌ ๋ฒ”์œ„(Authorization scopes), ์™„๋ฃŒ ์‹ ํ˜ธ ๋“ฑ์„ ๊ฐ–์ถ˜ ๊ฐ์‚ฌ ๊ฐ€๋Šฅํ•œ(Auditable) ํ†ต์‹ ์„ ์ œ๊ณตํ•œ๋‹ค [15, 16]. OAuth ํ๋ฆ„๊ณผ HTTPS ๊ฐ•์ œํ™”๋ฅผ ํ†ตํ•ด ๋ณด์•ˆ ๋ชจ๋ธ์˜ ์™„์„ฑ๋„๋ฅผ ๋†’์˜€์œผ๋ฉฐ [6, 7], ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ํ™˜๊ฒฝ์—์„œ๋Š” ๊ณ ์œ„ํ—˜ ์—์ด์ „ํŠธ์™€ ์ €์œ„ํ—˜ ์—์ด์ „ํŠธ ๊ฐ„์˜ ์œ„์ž„ ๊ฒฝ๊ณ„๋ฅผ ํ†ต์ œํ•˜๊ธฐ ์œ„ํ•œ ์‹ ๋ขฐ ๊ฒฝ๊ณ„(Trust boundaries) ๋ฐ ์œ„์ž„ ์ฒด์ธ์˜ ๊นŠ์ด ์ œํ•œ(Depth limits) ์„ค์ •์ด ๊ฐ•์ œ๋œ๋‹ค [17-19]. - -## โš–๏ธ Trade-offs & Caveats -A2A์˜ ํ†ต์‹  ๋ฐฉ์‹์€ ๋„คํŠธ์›Œํฌ ๊ธฐ๋ฐ˜(HTTPS/SSE)์ด๋ฏ€๋กœ, ๊ต์ฐจ ๋„คํŠธ์›Œํฌ ์—์ด์ „ํŠธ ์œ„์ž„ ์‹œ ์ตœ์†Œ 50~200ms์˜ ๋Œ€๊ธฐ ์‹œ๊ฐ„(Latency)์ด ๋ฐœ์ƒํ•œ๋‹ค [6, 7]. ์ด๋Š” ํ•˜๋‹ˆ์Šค ๋กœ์ปฌ ๋‚ด๋ถ€์—์„œ ๋„๊ตฌ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” MCP(2~15ms ๋Œ€๊ธฐ ์‹œ๊ฐ„)์™€ ๋น„๊ตํ•  ๋•Œ ์ƒ๋Œ€์ ์œผ๋กœ ๋А๋ฆฐ ์†๋„์ด๋ฏ€๋กœ, ์ง€์—ฐ ์‹œ๊ฐ„์— ๋ฏผ๊ฐํ•œ ๋‹จ์ผ ํ•˜๋‹ˆ์Šค ๋‚ด ํ†ตํ•ฉ ์ž‘์—…๋ณด๋‹ค๋Š” ๋ถ„์‚ฐ๋œ ์—์ด์ „ํŠธ ๊ฐ„์˜ ์›๊ฒฉ ์œ„์ž„์— ์ œํ•œ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ ํ•ฉํ•˜๋‹ค [6, 7]. - -๋˜ํ•œ, ์—์ด์ „ํŠธ ๊ฐ„ ํ†ต์‹ ์€ '๊ต์ฐจ ์—์ด์ „ํŠธ ํ”„๋กฌํ”„ํŠธ ์ธ์ ์…˜(Cross-agent prompt injection)'์ด๋ผ๋Š” ์ƒˆ๋กœ์šด ๋ณด์•ˆ ์ทจ์•ฝ์ ์„ ์•ผ๊ธฐํ•  ์ˆ˜ ์žˆ๋‹ค [20, 21]. ์†์ƒ๋œ ์—์ด์ „ํŠธ๊ฐ€ A2A ๋ฉ”์‹œ์ง€ ๋ฒ„์Šค๋ฅผ ํ†ตํ•ด ๋™๋ฃŒ ์—์ด์ „ํŠธ์—๊ฒŒ ์•…์˜์ ์ธ ์ง€์‹œ๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ํ•˜๋‹ˆ์Šค ๊ณ„์ธต์—์„œ ๋ฉ”์‹œ์ง€ ์Šคํ‚ค๋งˆ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๋ฐ ์—์ด์ „ํŠธ ์‹ ์› ํ™•์ธ(Agent identity verification) ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์—„๊ฒฉํ•˜๊ฒŒ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค [20, 21]. ๋งˆ์ง€๋ง‰์œผ๋กœ, A2A ์ž‘์—… ์œ„์ž„ ์‹œ ํฌํ•จ๋œ ๊ถŒํ•œ ์ •๋ณด๊ฐ€ ์ˆ˜์‹  ์ธก ํ•˜๋‹ˆ์Šค์˜ ๋‚ด๋ถ€ MCP ๋„๊ตฌ ๊ถŒํ•œ์œผ๋กœ ์–ด๋–ป๊ฒŒ ๋ฒˆ์—ญ๋˜์–ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ํ†ตํ•ฉ ๊ฒฝ๊ณ„ ํ‘œ์ค€์ด ์•„์ง ๋ถˆ๋ช…ํ™•ํ•˜์—ฌ, ๋ฐฐํฌ ์‹œ ์ถ”๊ฐ€์ ์ธ ํ†ตํ•ฉ ์ฝ”๋“œ๊ฐ€ ์š”๊ตฌ๋œ๋‹ค๋Š” ์ œ์•ฝ์ด ์žˆ๋‹ค [12, 14]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -#### [์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] -- [[Agent Harness]] - - ์—ฐ๊ฒฐ ์ด์œ : A2A ํ†ต์‹ ์„ ์ค‘์žฌํ•˜๊ณ  ์ƒํƒœ ์ผ๊ด€์„ฑ, ์ ‘๊ทผ ์ œ์–ด, ๊ถŒํ•œ ๋ถ€์—ฌ ๋“ฑ์˜ ๊ฑฐ๋ฒ„๋„Œ์Šค๋ฅผ ๋Ÿฐํƒ€์ž„์— ์ง‘ํ–‰ํ•˜๋Š” ๊ธฐ๋ฐ˜ ์ธํ”„๋ผ์ด๋‹ค [2, 4, 22]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋‹ค์ค‘ ์—์ด์ „ํŠธ ํ™˜๊ฒฝ์—์„œ ์—์ด์ „ํŠธ์˜ ์ž์œจ์  ํ†ต์‹ ์ด ์–ด๋–ป๊ฒŒ ํ•˜๋‹ˆ์Šค์˜ ํ†ต์ œ(E-component์˜ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ๋ฐ L-component์˜ ๋ผ์ดํ”„์‚ฌ์ดํด ํ›…) ์•„๋ž˜์—์„œ ์•ˆ์ „ํ•˜๊ฒŒ ๊ด€๋ฆฌ๋˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค [2, 4, 23]. - -- [[Model Context Protocol (MCP)]] - - ์—ฐ๊ฒฐ ์ด์œ : ์—์ด์ „ํŠธ์™€ ์™ธ๋ถ€ ์‹œ์Šคํ…œ/๋„๊ตฌ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ํ‘œ์ค€์œผ๋กœ, ์—์ด์ „ํŠธ ๊ฐ„ ์—ฐ๊ฒฐ์„ ๋‹ด๋‹นํ•˜๋Š” A2A์™€ ๊ฒฐํ•ฉํ•˜์—ฌ ์ „์ฒด ์—์ด์ „ํŠธ ํ†ต์‹  ์Šคํƒ(Communication Stack)์„ ํ˜•์„ฑํ•œ๋‹ค [5, 11, 13]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํ•˜๋‹ˆ์Šค ์ธํ”„๋ผ ๋‚ด์—์„œ ๋„๊ตฌ ํ˜ธ์ถœ(MCP)๊ณผ ์ž‘์—… ์œ„์ž„(A2A)์ด ์–ด๋–ป๊ฒŒ ์•„ํ‚คํ…์ฒ˜์ ์œผ๋กœ ๋ถ„๋ฆฌ๋˜๊ณ  ์ƒํ˜ธ ์ž‘์šฉํ•˜๋Š”์ง€, ๊ทธ ์ฑ…์ž„์˜ ๊ฒฝ๊ณ„๋ฅผ ๋ช…ํ™•ํžˆ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค [12, 14]. - -- [[Multi-Agent Orchestration]] - - ์—ฐ๊ฒฐ ์ด์œ : ๋‹ค์ˆ˜์˜ ์—์ด์ „ํŠธ๊ฐ€ ํŠน์ • ์ž‘์—…์„ ์™„์ˆ˜ํ•˜๊ธฐ ์œ„ํ•ด ํ† ํด๋กœ์ง€(Topology)๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ  ํ˜‘๋ ฅํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋กœ, A2A๋Š” ์ด๋ฅผ ๋„คํŠธ์›Œํฌ๋ฅผ ๋„˜์–ด ์›๊ฒฉ์œผ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ํ•ต์‹ฌ ๊ธฐ์ˆ ์ด๋‹ค [2, 4, 5, 17]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋‹จ์ผ ์—์ด์ „ํŠธ์˜ ์‹คํ–‰ ๋ฃจํ”„๋ฅผ ๋„˜์–ด, ์—์ด์ „ํŠธ์˜ ์‹ ์› ๊ด€๋ฆฌ, ๋ฉ”์‹œ์ง€ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๋ฐ ๊ณต์œ  ์ƒํƒœ์˜ ์ผ๊ด€์„ฑ ๋ณด์žฅ๊ณผ ๊ฐ™์€ ๋ณตํ•ฉ์ ์ธ ๊ฑฐ๋ฒ„๋„Œ์Šค ๊ณผ์ œ๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค [2, 4, 24, 25]. - -#### [๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ] -- [[Agent Card]] - - ์—ฐ๊ฒฐ ์ด์œ : A2A ํ”„๋กœํ† ์ฝœ ๋‚ด์—์„œ ๊ฐ ์—์ด์ „ํŠธ๊ฐ€ ์ž์‹ ์˜ ๊ธฐ๋Šฅ, ์—ญํ• , ํ†ต์‹  ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•˜๊ณ  ์„ ์–ธํ•˜๋Š” ๊ฒ€์ƒ‰ ๋ฉ”์ปค๋‹ˆ์ฆ˜(Discovery mechanism)์ด๋‹ค [2, 4, 8]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์›๊ฒฉ ํ•˜๋‹ˆ์Šค์— ์œ„์น˜ํ•œ ์—์ด์ „ํŠธ๋“ค์ด ์‚ฌ์ „์— ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ์•Œ์ง€ ๋ชปํ•˜๋”๋ผ๋„, ์–ด๋–ป๊ฒŒ ๋™์ ์œผ๋กœ ๊ธฐ๋Šฅ์„ ๊ฒ€์ƒ‰ํ•˜๊ณ  ์ž‘์—…์„ ์š”์ฒญํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ทธ ์›๋ฆฌ๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค [2, 4, 5]. - -### Deeper Research Questions -- A2A๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์ž‘์—… ์‚ฌ์–‘(Task Specification) ๋ฐ ๊ถŒํ•œ ๋ชจ๋ธ์€ ํ•˜๋‹ˆ์Šค ๋‚ด๋ถ€์˜ ๋„๊ตฌ ์‹คํ–‰ ๊ณ„์ธต์ธ MCP์˜ ์„ธ๋ถ„ํ™”๋œ ์ ‘๊ทผ ๊ถŒํ•œ(Permissions)์œผ๋กœ ์–ด๋–ป๊ฒŒ ๋งคํ•‘๋˜๊ณ  ๋ณ€ํ™˜๋˜๋Š”๊ฐ€? -- ๊ต์ฐจ ์—์ด์ „ํŠธ ํ”„๋กฌํ”„ํŠธ ์ธ์ ์…˜(Cross-agent prompt injection) ๊ณต๊ฒฉ์„ ๋ฐฉ์–ดํ•˜๊ธฐ ์œ„ํ•ด A2A ๋ฉ”์‹œ์ง€ ๋ฒ„์Šค์™€ ํ•˜๋‹ˆ์Šค ์ •์ฑ… ์—”์ง„์€ ์–ด๋–ค ์ˆ˜์ค€์˜ ์Šคํ‚ค๋งˆ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ์™€ ์‹ ์› ์ธ์ฆ์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š”๊ฐ€? -- A2A ์œ„์ž„ ์ฒด์ธ(Delegation Chain)์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌดํ•œ ๋ฃจํ”„๋‚˜ ๊ต์ฐฉ ์ƒํƒœ(Deadlock)๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ ์—์ด์ „ํŠธ๋Š” ์–ด๋–ค ๊ด€์ธก ๊ฐ€๋Šฅ์„ฑ(Observability) ๋ฐ ๊ฐ•์ œ ์ข…๋ฃŒ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ฐ–์ถ”์–ด์•ผ ํ•˜๋Š”๊ฐ€? -- IBM์˜ ACP(Agent Communication Protocol)๊ฐ€ ์ •์˜ํ•˜๋Š” ์˜๋„(Intent) ํ†ต์‹ ๊ณผ A2A์˜ ์ž‘์—… ์œ„์ž„(Task Delegation) ํ†ต์‹ ์€ ์ƒํ˜ธ ๋ฐฐํƒ€์ ์ธ๊ฐ€, ์•„๋‹ˆ๋ฉด ๋‹จ์ผ ์—์ด์ „ํŠธ ์‹œ์Šคํ…œ ๋‚ด์—์„œ ๊ณ„์ธตํ™”๋˜์–ด ํ†ตํ•ฉ๋  ์ˆ˜ ์žˆ๋Š”๊ฐ€? -- ์›๊ฒฉ ํ•˜๋‹ˆ์Šค ๊ฐ„ A2A ์ŠคํŠธ๋ฆฌ๋ฐ(SSE ๊ธฐ๋ฐ˜) ๋Œ€๊ธฐ ์‹œ๊ฐ„(Latency)์€ ์Œ์„ฑ ์—์ด์ „ํŠธ๋‚˜ ์‹ค์‹œ๊ฐ„ ์‘๋‹ต์ด ํ•„์š”ํ•œ ์—์ด์ „ํ‹ฑ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„์— ์–ด๋–ค ์ œ์•ฝ์„ ๊ฐ€ํ•˜๋Š”๊ฐ€? - -### Practical Application Contexts -- **Implementation:** Google์˜ A2A ํ‘œ์ค€ ๋ช…์„ธ์— ๋”ฐ๋ผ ํ•˜๋‹ˆ์Šค ์ธํ”„๋ผ์— HTTPS ๋ฐ SSE ๊ธฐ๋ฐ˜์˜ ์—”๋“œํฌ์ธํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ, ์›๊ฒฉ ์—์ด์ „ํŠธ์— ์žฅ๊ธฐ ์‹คํ–‰ ์ž‘์—…์„ ์œ„์ž„ํ•˜๊ณ  ์•„ํ‹ฐํŒฉํŠธ ํ˜•ํƒœ์˜ ๊ฒฐ๊ณผ๋ฌผ๊ณผ ๋น„๋™๊ธฐ ์ง„ํ–‰ ์ŠคํŠธ๋ฆผ์„ ์ˆ˜์‹ ํ•œ๋‹ค [2, 6-8]. -- **System Design:** ์—์ด์ „ํŠธ ํ†ต์‹  ์Šคํƒ ์„ค๊ณ„ ์‹œ, ๋‚ด๋ถ€ ๋„๊ตฌ ์ ‘๊ทผ์€ ์ง€์—ฐ ์‹œ๊ฐ„์ด ์งง์€ MCP ์–ด๋Œ‘ํ„ฐ์— ๋งก๊ธฐ๊ณ , ๋‹ค๋ฅธ ์„œ๋ธŒ ์‹œ์Šคํ…œ์ด๋‚˜ ์›๊ฒฉ ์—์ด์ „ํŠธ๋กœ์˜ ์œ„์ž„์€ A2A ์–ด๋Œ‘ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์•„ํ‚คํ…์ฒ˜์˜ ์ฑ…์ž„์„ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌํ•œ๋‹ค [26, 27]. -- **Operation / Maintenance:** ๋‹ค์ค‘ ์—์ด์ „ํŠธ ์—ฐํ•ฉ ํ™˜๊ฒฝ์—์„œ A2A ํ˜ธ์ถœ ํŠธ๋žœ์žญ์…˜, ์œ„์ž„ ๊นŠ์ด, ๊ถŒํ•œ ๋ฒ”์œ„๋ฅผ ์ค‘์•™ ํ•˜๋‹ˆ์Šค ๊ด€๋ฆฌ ๋„๊ตฌ(์˜ˆ: Agent 365, Admin Center)์— ๊ธฐ๋กํ•˜์—ฌ ์—ฐ์‡„์  ์˜ค๋ฅ˜๋‚˜ ์—์ด์ „ํŠธ ์˜ค๋‚จ์šฉ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•œ๋‹ค [17, 19, 28]. -- **Learning Path:** ๋‹จ์ผ ์—์ด์ „ํŠธ ํ•˜๋‹ˆ์Šค์˜ ๊ตฌ์„ฑ(์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ, ๋„๊ตฌ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ)์„ ๋จผ์ € ํ•™์Šตํ•œ ํ›„, ๋ถ„์‚ฐ ์—์ด์ „ํŠธ ์‹œ์Šคํ…œ์—์„œ A2A ์—์ด์ „ํŠธ ์นด๋“œ๋ฅผ ํ†ตํ•œ ์„œ๋น„์Šค ๊ฒ€์ƒ‰ ๋ฐ OAuth2 ๊ธฐ๋ฐ˜์˜ ์‹ ์› ํ™•์ธ ๋ฐฉ์‹์„ ํ•™์Šตํ•œ๋‹ค [2, 6, 7]. -- **My Project Relevance:** ๋ณตํ•ฉ์ ์ธ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์ž๋™ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ ๋ถ€์„œ์˜ ํŠนํ™” ์—์ด์ „ํŠธ(์ธ์‚ฌ, ์žฌ๋ฌด, IT ๋“ฑ)๊ฐ€ ์„œ๋กœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์š”์ฒญํ•˜๊ณ  ์ž‘์—…์„ ์œ„์ž„ํ•ด์•ผ ํ•  ๋•Œ, A2A ํ”„๋กœํ† ์ฝœ์„ ๋„์ž…ํ•˜์—ฌ ๊ฐ์ž์˜ ํ•˜๋‹ˆ์Šค ๊ฒฉ๋ฆฌ์„ฑ์„ ์œ ์ง€ํ•˜๋ฉด์„œ๋„ ํ‘œ์ค€ํ™”๋œ ์†Œํ†ต ์ฑ„๋„์„ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. - -### Adjacent Topics -- [[Agent Communication Protocol (ACP)]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ์ž‘์—… ์œ„์ž„ ๋ฐ ์•„ํ‹ฐํŒฉํŠธ ์ƒ์„ฑ์— ์ดˆ์ ์„ ๋งž์ถ˜ A2A์™€ ๋‹ฌ๋ฆฌ, ๊ณ ์ˆ˜์ค€์˜ ๋Œ€ํ™”(Dialogue) ๋ฐ ์˜๋„(Intent) ์ „๋‹ฌ์„ ๋ชฉํ‘œ๋กœ ํ•˜๋Š” ACP์˜ ์ฐจ์ด์ ๊ณผ ํ•˜๋‹ˆ์Šค ํ†ต์‹  ์Šคํƒ ๋‚ด์—์„œ์˜ ๊ณ„์ธต์  ๊ด€๊ณ„๋ฅผ ๋น„๊ต ์—ฐ๊ตฌํ•œ๋‹ค [1, 3, 29, 30]. - ---- -*Last updated: 2026-05-01* \ No newline at end of file diff --git a/00_Raw/Agent Skills (Anthropic).md b/00_Raw/Agent Skills (Anthropic).md deleted file mode 100644 index b62a41f5..00000000 --- a/00_Raw/Agent Skills (Anthropic).md +++ /dev/null @@ -1,61 +0,0 @@ -# [[Agent Skills (Anthropic)]] - -## ๐Ÿ“Œ Brief Summary -Agent Skills๋Š” 2025๋…„ 12์›” Anthropic์ด ๊ณต๊ฐœํ•œ ์˜คํ”ˆ ํ‘œ์ค€(agentskills.io)์œผ๋กœ, ์—์ด์ „ํŠธ๊ฐ€ ํŠน์ • ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ•™์Šตํ•  ์ˆ˜ ์žˆ๋„๋ก ์žฌ์‚ฌ์šฉ ๋ฐ ์ด์‹ ๊ฐ€๋Šฅํ•œ ์Šคํ‚ฌ ํŒจํ‚ค์ง€๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์›์ž์ (atomic)์ธ ๊ฐœ๋ณ„ ๋„๊ตฌ ํ˜ธ์ถœ์„ ํ‘œ์ค€ํ™”ํ•˜๋Š” MCP(Model Context Protocol)์™€ ๋‹ฌ๋ฆฌ ์›Œํฌํ”Œ๋กœ์šฐ์™€ ์ˆ˜๋ช… ์ฃผ๊ธฐ(Lifecycle) ์ˆ˜์ค€์˜ ์ƒํ˜ธ ์šด์šฉ์„ฑ์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์Šคํ‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํŠน์ • ํ•˜๋„ค์Šค์— ์ข…์†๋œ ์‚ฌ์œ ์ (proprietary) ์•„ํ‹ฐํŒฉํŠธ์—์„œ ๋…๋ฆฝ์ ์ธ ํ•˜๋„ค์Šค ๊ฐ„ ์ด์‹ ๋ฐ ๋ฐฐํฌ๊ฐ€ ๊ฐ€๋Šฅํ•œ ์˜คํ”ˆ ์ƒํƒœ๊ณ„ ์ž์›์œผ๋กœ ํƒˆ๋ฐ”๊ฟˆ์‹œํ‚ต๋‹ˆ๋‹ค. - -## ๐Ÿ“– Core Content -- **์•„ํ‚คํ…์ฒ˜ ์Šคํƒ์—์„œ์˜ ์œ„์น˜ (L-Component ํ†ตํ•ฉ)**: Agent Skills๋Š” ํ•˜๋„ค์Šค ์„ค๊ณ„์—์„œ ๋„๊ตฌ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ(T-component)๊ฐ€ ์•„๋‹Œ ์ˆ˜๋ช… ์ฃผ๊ธฐ ๋ฐ ์›Œํฌํ”Œ๋กœ์šฐ ๊ด€๋ฆฌ(L-component) ๊ณ„์ธต์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋‹จ์ผ ๋„๊ตฌ ์ž‘์—…(Tool invocation)์„ ์ฒ˜๋ฆฌํ•˜๋Š” MCP์™€ ๊ฒฐํ•ฉํ•˜์—ฌ, ํ•˜์œ„ ์ˆ˜์ค€์˜ ๋„๊ตฌ ์‹คํ–‰๊ณผ ์ƒ์œ„ ์ˆ˜์ค€์˜ ์›Œํฌํ”Œ๋กœ์šฐ ์กฐํ•ฉ์„ ๋ถ„๋ฆฌํ•˜๋Š” ์ž์—ฐ์Šค๋Ÿฌ์šด '2๊ณ„์ธต ํ”„๋กœํ† ์ฝœ ์Šคํƒ(two-layer protocol stack)'์„ ํ˜•์„ฑํ•ฉ๋‹ˆ๋‹ค. -- **ํŒจํ‚ค์ง€ ๊ตฌ์„ฑ ๋ฐ ๊ตฌ์กฐ**: ๊ฐ ์Šคํ‚ฌ์€ `SKILL.md` ๋ช…์„ธ ํŒŒ์ผ, ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์Šคํฌ๋ฆฝํŠธ, ๊ทธ๋ฆฌ๊ณ  ๋ฆฌ์†Œ์Šค ํŒŒ์ผ์ด ํฌํ•จ๋œ ๋””๋ ‰ํ† ๋ฆฌ ํ˜•ํƒœ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์—์ด์ „ํŠธ๊ฐ€ ํš๋“ํ•˜๊ณ  ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐœ๋ณ„์ ์ธ ์—ญ๋Ÿ‰(discrete capability)์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. -- **์ƒํ˜ธ ์šด์šฉ์„ฑ (Interoperability & Portability)**: ์Šคํ‚ฌ ํŒจํ‚ค์ง€์— ๋Œ€ํ•œ ํ‘œ์ค€ ํฌ๋งท์„ ์ œ๊ณตํ•จ์œผ๋กœ์จ, ํ•œ ์กฐ์ง์—์„œ ์ƒ์„ฑ๋œ ์Šคํ‚ฌ์„ Cursor, VS Code, Goose, OpenCode, Amp ๋“ฑ ๋…๋ฆฝ์ ์ธ ์—ฌ๋Ÿฌ ์—์ด์ „ํŠธ ํ•˜๋„ค์Šค์—์„œ ์ฆ‰์‹œ ์ฑ„ํƒํ•˜๊ณ  ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Anthropic์˜ ์ž์ฒด Agent SDK ์—ญ์‹œ Agent Skills๋ฅผ ์ผ๊ธ‰ ๊ฐ์ฒด(first-class constructs)๋กœ ํ†ตํ•ฉํ•ฉ๋‹ˆ๋‹ค. -- **์ธํ”„๋ผ ๋ฐ ๊ฑฐ๋ฒ„๋„Œ์Šค ํšจ๊ณผ**: ์—์ด์ „ํŠธ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ๊ณต์‹์ ์ธ ์ธํ”„๋ผ ์ปดํฌ๋„ŒํŠธ๋กœ ๊ทœ๊ฒฉํ™”ํ•จ์œผ๋กœ์จ ์ค‘๋Œ€ํ•œ ๊ฑฐ๋ฒ„๋„Œ์Šค ํšจ๊ณผ๋ฅผ ์ฐฝ์ถœํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ์ฒด์ ์œผ๋กœ (1) ํ•˜๋„ค์Šค ๊ฐ„ ์Šคํ‚ฌ ์ด์‹์„ฑ, (2) ์›Œํฌํ”Œ๋กœ์šฐ ํŒจํ„ด์˜ ๋ฒ„์ „ ๊ด€๋ฆฌ ๋ฐ ํ๊ธฐ(deprecation), (3) ์›Œํฌํ”Œ๋กœ์šฐ์˜ ์ „์ œ ์กฐ๊ฑด ๋ฐ ์‹คํŒจ ๋ชจ๋“œ์— ๋Œ€ํ•œ ๋ช…์‹œ์  ๋ฌธ์„œํ™”, (4) ๋ชจ๋ธ ๋ณ€๊ฒฝ๊ณผ ๋ฌด๊ด€ํ•˜๊ฒŒ ์›Œํฌํ”Œ๋กœ์šฐ ์ˆ˜์ค€์˜ ์„ฑ๋Šฅ ๊ฐœ์„ ์— ๋Œ€ํ•œ ์žฌํ˜„ ๊ฐ€๋Šฅํ•œ ํ‰๊ฐ€๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. - -## โš–๏ธ Trade-offs & Caveats -์†Œ์Šค์— ๊ด€๋ จ ์ •๋ณด๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. (Agent Skills ๊ฐœ๋ณ„ ๊ธฐ์ˆ ์˜ ๋ช…์‹œ์ ์ธ ๋ถ€์ž‘์šฉ์ด๋‚˜ ๋‹จ์ ์— ๋Œ€ํ•ด์„œ๋Š” ์†Œ์Šค ๋ฐ์ดํ„ฐ ๋‚ด์— ๊ตฌ์ฒด์ ์œผ๋กœ ์„œ์ˆ ๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ ์ผ๋ฐ˜์ ์ธ ์Šคํ‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์šด์šฉ๊ณผ ๊ด€๋ จํ•˜์—ฌ, ์ง€๋‚˜์น˜๊ฒŒ ๋ฐฉ๋Œ€ํ•œ ์Šคํ‚ฌ ๋ฌธ์„œ๋ฅผ ์ œํ•œ ์—†์ด ๋กœ๋“œํ•  ๊ฒฝ์šฐ ์ปจํ…์ŠคํŠธ ์œˆ๋„์šฐ๊ฐ€ ์˜ค์—ผ๋˜๊ณ  ๋…ธ์ด์ฆˆ๊ฐ€ ๋ฐœ์ƒํ•ด ์„ ํƒ ํ’ˆ์งˆ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์—์ด์ „ํŠธ๊ฐ€ ์Šค์Šค๋กœ ์ƒ์„ฑํ•œ ์Šคํ‚ฌ(self-generated skills)์˜ ๊ฒฝ์šฐ ์‹ ๋ขฐ์„ฑ์ด ๋ณด์žฅ๋˜์ง€ ์•Š์•„ ํ•˜๋„ค์Šค ์ฐจ์›์˜ ํ๋ ˆ์ด์…˜ ๋ฐ ๊ฒ€์ฆ(quality-gate) ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ํ•„์š”ํ•˜๋‹ค๋Š” ์ œ์•ฝ์ด ์–ธ๊ธ‰๋ฉ๋‹ˆ๋‹ค.) - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -#### [ํ”„๋กœํ† ์ฝœ ๋ฐ ์ƒํ˜ธ ์šด์šฉ์„ฑ ํ‘œ์ค€] -- [[MCP (Model Context Protocol)]] - - ์—ฐ๊ฒฐ ์ด์œ : Agent Skills์™€ ํ•จ๊ป˜ 2๊ณ„์ธต ํ”„๋กœํ† ์ฝœ ์Šคํƒ์„ ๊ตฌ์„ฑํ•˜๋Š” ํ•ต์‹ฌ ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: MCP๊ฐ€ ์›์ž์ ์ธ ์™ธ๋ถ€ ๋„๊ตฌ ๋ฐ ๋ฐ์ดํ„ฐ ์†Œ์Šค ์—ฐ๊ฒฐ์„ ๋‹ด๋‹นํ•˜๋Š” ๋ฐ˜๋ฉด, Agent Skills๋Š” ์—ฌ๋Ÿฌ MCP ๋„๊ตฌ๋“ค์„ ์กฐํ•ฉํ•˜์—ฌ "์–ด๋–ค ์กฐ๊ฑด์—์„œ ์–ด๋–ป๊ฒŒ ์ ์šฉํ• ์ง€"์— ๋Œ€ํ•œ ๋‹ค๋‹จ๊ณ„ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์ง€์‹œํ•˜๋Š”์ง€ ๊ทธ ์ฐจ์ด์™€ ์ƒํ˜ธ๋ณด์™„์„ฑ์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - -#### [ํ•˜๋„ค์Šค ์•„ํ‚คํ…์ฒ˜ ๋ฐ ๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] -- [[L-component (Lifecycle hooks)]] - - ์—ฐ๊ฒฐ ์ด์œ : Agent Skills๊ฐ€ ์ž‘๋™ํ•˜๊ณ  ํ†ตํ•ฉ๋˜๋Š” ์—์ด์ „ํŠธ ํ•˜๋„ค์Šค์˜ ๊ฑฐ๋ฒ„๋„Œ์Šค ๊ณ„์ธต์ž…๋‹ˆ๋‹ค. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์Šคํ‚ฌ์ด ๋‹จ์ˆœํ•œ ๋„๊ตฌ ๋“ฑ๋ก(T-component)์„ ๋„˜์–ด ์—์ด์ „ํŠธ์˜ ์ž‘์—… ํ๋ฆ„, ์ •์ฑ… ์‹œํ–‰, ๋‹ค๋‹จ๊ณ„ ์‹คํ–‰์„ ๊ด€๋ฆฌํ•˜๋Š” ์ƒ์œ„ ์ธํ”„๋ผ๋กœ์„œ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -- [[Context Engineering]] - - ์—ฐ๊ฒฐ ์ด์œ : ์ด์‹ ๊ฐ€๋Šฅํ•œ ์Šคํ‚ฌ์„ ์—์ด์ „ํŠธ๊ฐ€ ํ™œ์šฉํ•˜๋ ค๋ฉด ์ปจํ…์ŠคํŠธ ์œˆ๋„์šฐ์— ์Šคํ‚ฌ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์™€ ๋‚ด์šฉ์„ ํšจ๊ณผ์ ์œผ๋กœ ์ฃผ์ž…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: `SKILL.md`์™€ ๊ฐ™์€ ์ง€์‹ ์•„ํ‹ฐํŒฉํŠธ๊ฐ€ ์ปจํ…์ŠคํŠธ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด ์–ด๋–ป๊ฒŒ ์ ์ง„์  ๊ณต๊ฐœ(Progressive disclosure)๋‚˜ ์ง€์—ฐ ๋กœ๋”ฉ(Lazy loading) ๋ฐฉ์‹์œผ๋กœ ์—์ด์ „ํŠธ์—๊ฒŒ ์ œ๊ณต๋˜๋Š”์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - -#### [์—์ด์ „ํŠธ ๋ฉ”๋ชจ๋ฆฌ ๋ฐ ์ง€์†์„ฑ] -- [[Skill Library]] - - ์—ฐ๊ฒฐ ์ด์œ : Agent Skills๊ฐ€ ๋ชจ์—ฌ ์—์ด์ „ํŠธ์˜ ์ ˆ์ฐจ์  ์ง€์‹(Procedural knowledge)์„ ๊ตฌ์„ฑํ•˜๋Š” ์˜๊ตฌ์ ์ธ ์ €์žฅ์†Œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ผํšŒ์„ฑ ํ”„๋กฌํ”„ํŠธ๊ฐ€ ์•„๋‹Œ, ์„ธ์…˜์„ ์ดˆ์›”ํ•˜์—ฌ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์›Œํฌํ”Œ๋กœ์šฐ ์ง€์‹์ด ์—์ด์ „ํŠธ์˜ ๋Šฅ๋ ฅ ์„ฑ์žฅ์— ์–ด๋–ป๊ฒŒ ๊ธฐ์—ฌํ•˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - -### Deeper Research Questions - -- MCP๊ฐ€ ์›์ž์  ๋„๊ตฌ ํ˜ธ์ถœ์„, Agent Skills๊ฐ€ ๋‹ค๋‹จ๊ณ„ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” 2๊ณ„์ธต ๊ตฌ์กฐ์—์„œ ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ ๋””๋ฒ„๊น… ๋ฐ ์ถ”์ (Tracing)์€ ๊ฐ ๊ณ„์ธต์—์„œ ์–ด๋–ป๊ฒŒ ๋ถ„๋ฆฌ๋˜์–ด ์ฒ˜๋ฆฌ๋˜๋Š”๊ฐ€? -- ์—์ด์ „ํŠธ๊ฐ€ ๊ฒฝํ—˜์„ ํ†ตํ•ด ์Šค์Šค๋กœ ์ง„ํ™”์‹œํ‚จ ์Šคํ‚ฌ(Evolved skills)์„ SKILL.md ํ‘œ์ค€ ํฌ๋งท์œผ๋กœ ์ถœ๋ ฅํ•˜๊ณ  ๊ฒ€์ฆํ•˜์—ฌ ์˜๊ตฌ์ ์ธ ์Šคํ‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋“ฑ๋กํ•˜๊ธฐ ์œ„ํ•œ ํ•˜๋„ค์Šค ์ˆ˜์ค€์˜ ํŒŒ์ดํ”„๋ผ์ธ(Quality-gate)์€ ๋ฌด์—‡์ธ๊ฐ€? -- Agent Skills๋ฅผ ํ†ตํ•ด ์„œ๋กœ ๋‹ค๋ฅธ ํ”„๋ ˆ์ž„์›Œํฌ(์˜ˆ: LangGraph, OpenClaw ๋“ฑ) ๊ฐ„์— ์Šคํ‚ฌ์„ ์ด์‹ํ•  ๋•Œ, ๊ฐ ํ•˜๋„ค์Šค์˜ ๊ณ ์œ ํ•œ ๋ฉ”๋ชจ๋ฆฌ๋‚˜ ์ƒํƒœ ๊ด€๋ฆฌ(State management) ์ฐจ์ด๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ์ถฉ๋Œ์€ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐ๋˜๋Š”๊ฐ€? -- ์กฐ์ง ๋‚ด ๋‹ค์–‘ํ•œ ๋„๋ฉ”์ธ ์ง€์‹์„ Agent Skills ํŒจํ‚ค์ง€๋กœ ๋ชจ๋“ˆํ™”ํ•˜์—ฌ ๋ฐฐํฌํ•  ๋•Œ, ์—์ด์ „ํŠธ๊ฐ€ ์ƒํ™ฉ์— ๋งž๋Š” ์Šคํ‚ฌ๋งŒ ์ ์žฌ์ ์†Œ์— ๊ฒ€์ƒ‰ํ•˜๊ณ  ๋กœ๋“œํ•˜๊ฒŒ ๋งŒ๋“œ๋Š”(Progressive disclosure) ์ตœ์ ์˜ ๊ฒ€์ƒ‰ ์•„ํ‚คํ…์ฒ˜๋Š” ๋ฌด์—‡์ธ๊ฐ€? -- ๋ชจ๋ธ์˜ ์ถ”๋ก  ๋Šฅ๋ ฅ ํ–ฅ์ƒ์ด ์•„๋‹Œ, Agent Skills ์ ์šฉ๊ณผ ๊ฐ™์€ '์›Œํฌํ”Œ๋กœ์šฐ(Harness) ์ตœ์ ํ™”'๋งŒ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ์—์ด์ „ํŠธ ํ•œ๊ณ„์˜ ์ƒํ•œ์„ ์€ ์–ด๋””๊นŒ์ง€์ธ๊ฐ€? - -### Practical Application Contexts - -- **Implementation:** ๊ฐœ๋ฐœ์ž๋Š” ๋‹จ์ผ ํ”„๋กฌํ”„ํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋Œ€์‹ , ํŠน์ • ์ž‘์—… ์ˆ˜ํ–‰ ๊ทœ์น™, ์˜ˆ์™ธ ์ฒ˜๋ฆฌ, ๊ด€๋ จ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํฌํ•จํ•˜๋Š” `SKILL.md` ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์—์ด์ „ํŠธ์˜ ์—ญ๋Ÿ‰์„ ๋ชจ๋“ˆํ™”ํ•˜์—ฌ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -- **System Design:** ๋„๊ตฌ(Tool) ์ธํ”„๋ผ๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ, ๋‹จ์ˆœ API ์—ฐ๋™์€ MCP ์„œ๋ฒ„๋กœ ๊ตฌ์ถ•ํ•˜๊ณ , ํ•ด๋‹น API๋“ค์„ ์—ฎ์–ด ๋ณต์žกํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ณผ์ •์€ Agent Skills๋กœ ์ถ”์ƒํ™”ํ•˜์—ฌ ์‹œ์Šคํ…œ์„ ๋‘ ๊ณ„์ธต์œผ๋กœ ๋ถ„๋ฆฌ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค. -- **Operation / Maintenance:** ํŠน์ • ํŒ€์ด ๊ฐœ๋ฐœํ•œ ๋ฒ„๊ทธ ์ˆ˜์ • ์ ˆ์ฐจ๋‚˜ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ์ฒดํฌ๋ฆฌ์ŠคํŠธ ๋“ฑ์„ ํ‘œ์ค€ Agent Skills ํŒจํ‚ค์ง€๋กœ ๊ด€๋ฆฌํ•˜์—ฌ, ์กฐ์ง ๋‚ด ๋‹ค์–‘ํ•œ ํ•˜๋„ค์Šค ํˆด(์˜ˆ: VS Code, Cursor ๋“ฑ)์„ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ๊ฐœ๋ฐœ์ž ์—์ด์ „ํŠธ๊ฐ€ ์ผ๊ด€๋œ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ๊ณต์œ ํ•˜๊ณ  ๋ฒ„์ „์„ ๊ด€๋ฆฌํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. -- **Learning Path:** ์—์ด์ „ํŠธ ์‹œ์Šคํ…œ ํ•™์Šต ์‹œ ๊ธฐ๋ณธ ๋ชจ๋ธ API ํ˜ธ์ถœ $\rightarrow$ MCP๋ฅผ ํ†ตํ•œ ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ/๋„๊ตฌ ์—ฐ๋™ $\rightarrow$ Agent Skills๋ฅผ ํ†ตํ•œ ์›Œํฌํ”Œ๋กœ์šฐ ๋ฐ ์ˆ˜๋ช… ์ฃผ๊ธฐ ์ œ์–ด ์ˆœ์œผ๋กœ ํ•˜๋„ค์Šค ์—”์ง€๋‹ˆ์–ด๋ง์˜ ๊นŠ์ด๋ฅผ ํ™•์žฅํ•ด ๋‚˜๊ฐ‘๋‹ˆ๋‹ค. -- **My Project Relevance:** ๋‹ค์ค‘ ์—์ด์ „ํŠธ(Multi-agent) ์‹œ์Šคํ…œ์ด๋‚˜ ์ž๋™ํ™” ๊ฐœ๋ฐœ ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌ์ถ•ํ•  ๋•Œ, ๋ฐ˜๋ณต๋˜๋Š” ์ž‘์—… ํŒจํ„ด(์˜ˆ: CI/CD ์˜ค๋ฅ˜ ์ž๋™ ๋ณต๊ตฌ ์›Œํฌํ”Œ๋กœ์šฐ)์„ Agent Skills ํ‘œ์ค€์œผ๋กœ ํŒจํ‚ค์ง•ํ•˜์—ฌ ์ด์‹์„ฑ์„ ๋†’์ด๊ณ , ๋ชจ๋ธ์„ ๊ต์ฒดํ•˜๋”๋ผ๋„ ๊ธฐ์กด ์ž‘์—… ๋ฐฉ์‹์„ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - -### Adjacent Topics - -- [[A2A (Agent-to-Agent Protocol)]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: Agent Skills๊ฐ€ '์–ด๋–ป๊ฒŒ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์‹คํ–‰ํ•  ๊ฒƒ์ธ๊ฐ€'์— ๋Œ€ํ•œ ์ง€์‹์˜ ํ‘œ์ค€์ด๋ผ๋ฉด, A2A๋Š” ์—ฌ๋Ÿฌ ์—์ด์ „ํŠธ ๊ฐ„์— '์ž‘์—…(Task)์„ ์–ด๋–ป๊ฒŒ ์œ„์ž„ํ•˜๊ณ  ํ†ต์‹ ํ•  ๊ฒƒ์ธ๊ฐ€'์— ๋Œ€ํ•œ ํ”„๋กœํ† ์ฝœ ํ‘œ์ค€์ž…๋‹ˆ๋‹ค. ์›Œํฌํ”Œ๋กœ์šฐ ์‹คํ–‰๊ณผ ์›๊ฒฉ ์—์ด์ „ํŠธ ์œ„์ž„ ๊ฐ„์˜ ์ƒํ˜ธ ์ž‘์šฉ ๊ตฌ์กฐ๋ฅผ ํ™•์žฅํ•˜์—ฌ ์กฐ์‚ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -- [[Agent-Computer Interface (ACI)]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ์—์ด์ „ํŠธ๊ฐ€ ์ฝ”๋“œ๋ฅผ ํŽธ์ง‘ํ•˜๊ณ  ํ„ฐ๋ฏธ๋„๊ณผ ์ƒํ˜ธ์ž‘์šฉํ•˜๊ธฐ ์œ„ํ•œ ์ „์šฉ ์ธํ„ฐํŽ˜์ด์Šค ์„ค๊ณ„ ๊ฐœ๋…์œผ๋กœ, Agent Skills ๋‚ด๋ถ€์˜ ์‹คํ–‰ ์Šคํฌ๋ฆฝํŠธ๋‚˜ ๋„๊ตฌ๋“ค์ด ์—์ด์ „ํŠธ์˜ ์ถ”๋ก ์— ์ ํ•ฉํ•˜๊ฒŒ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑ๋˜์–ด์•ผ ํ•˜๋Š”์ง€ ์ธํ„ฐํŽ˜์ด์Šค ์ตœ์ ํ™” ๊ด€์ ์—์„œ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - ---- -*Last updated: 2026-05-01* \ No newline at end of file diff --git a/00_Raw/Agile Environments.md b/00_Raw/Agile Environments.md deleted file mode 100644 index dbf3a829..00000000 --- a/00_Raw/Agile Environments.md +++ /dev/null @@ -1,47 +0,0 @@ -# [[Agile Environments]] - -## ๐Ÿ“Œ Brief Summary -Agile Environments(์• ์ž์ผ ํ™˜๊ฒฝ)๋Š” ์š”๊ตฌ์‚ฌํ•ญ์ด ์ง€์†์ ์œผ๋กœ ๋ณ€ํ™”ํ•˜๋Š” ํ”„๋กœ์ ํŠธ๋‚˜ ์Šคํƒ€ํŠธ์—… ํ™˜๊ฒฝ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค [1]. ์ด๋Ÿฌํ•œ ํ™˜๊ฒฝ์—์„œ๋Š” ๋ฏธ๋ž˜์— ํ•„์š”ํ• ์ง€๋„ ๋ชจ๋ฅด๋Š” ๋ณต์žกํ•œ ๊ธฐ๋Šฅ์„ ๋ฏธ๋ฆฌ ๊ฐœ๋ฐœํ•˜๊ธฐ๋ณด๋‹ค๋Š” ์˜ค์ง ํ˜„์žฌ์˜ ์š”๊ตฌ์‚ฌํ•ญ์— ์ง‘์ค‘ํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค [2]. ๋”ฐ๋ผ์„œ ๊ฐ ๊ธฐ๋Šฅ์„ ๋…๋ฆฝ์ ์œผ๋กœ ์ƒ์„ฑํ•˜๊ณ  ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์—ฐํ•˜๊ณ  ๋ชจ๋“ˆํ™”๋œ ์ ‘๊ทผ ๋ฐฉ์‹์ด ๋งค์šฐ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค [3]. - -## ๐Ÿ“– Core ์†Œ์Šค์— ๊ด€๋ จ ์ •๋ณด๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค.Content -์• ์ž์ผ ํ™˜๊ฒฝ(Agile Environments)๊ณผ ๊ด€๋ จํ•˜์—ฌ ์ œ๊ณต๋œ ์†Œ์Šค์—์„œ ๋‹ค๋ฃจ๊ณ  ์žˆ๋Š” ๊ตฌ์ฒด์ ์ธ ์„ค๋ช…์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. - -* **YAGNI ์›์น™์˜ ์ค‘์š”์„ฑ**: ์• ์ž์ผ ํ™˜๊ฒฝ์—์„œ๋Š” "You Aren't Gonna Need It (YAGNI)" ์›์น™์ด ํŠนํžˆ ํ•„์ˆ˜์ ์œผ๋กœ ์ž‘์šฉํ•ฉ๋‹ˆ๋‹ค [2]. ๋ณ€ํ™”ํ•˜๋Š” ์š”๊ตฌ์‚ฌํ•ญ์„ ๊ฐ€์ง„ ์Šคํƒ€ํŠธ์—…์ด๋‚˜ ์• ์ž์ผ ํ”„๋กœ์ ํŠธ์—์„œ๋Š”, ๋ฏธ๋ž˜์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๋Œ€๋น„ํ•˜์—ฌ ๋ณต์žกํ•œ ๊ธฐ๋Šฅ์„ ๋ฏธ๋ฆฌ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์„ ํ”ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [1, 2]. ๊ฐœ๋ฐœํŒ€์€ ์˜ค์ง ํ˜„์žฌ์˜ ์š”๊ตฌ์‚ฌํ•ญ์—๋งŒ ์ง‘์ค‘ํ•จ์œผ๋กœ์จ ๋‚˜์ค‘์— ์œ ์ง€๋ณด์ˆ˜ํ•ด์•ผ ํ•  ๋ณต์žก์„ฑ๊ณผ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์ฝ”๋“œ(dead code)์˜ ์–‘์„ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2]. -* **๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ(Feature-Based Structure)์˜ ์ ํ•ฉ์„ฑ**: ํ”„๋ก ํŠธ์—”๋“œ ์•„ํ‚คํ…์ฒ˜ ์ธก๋ฉด์—์„œ ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ํด๋” ๊ตฌ์กฐ๋Š” ์• ์ž์ผ ๊ฐœ๋ฐœ ๋ฐฉ๋ฒ•๋ก ๊ณผ ๋งค์šฐ ์ž˜ ๋งž์Šต๋‹ˆ๋‹ค [3]. ์ด ๊ตฌ์กฐ์—์„œ๋Š” ๊ฐ๊ฐ์˜ ๊ธฐ๋Šฅ(feature)์ด ๋…๋ฆฝ์ ์œผ๋กœ ๋ถ„๋ฆฌ๋˜์–ด ์ƒ์„ฑ ๋ฐ ๊ตฌํ˜„๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์• ์ž์ผ ํ™˜๊ฒฝ์—์„œ ์š”๊ตฌํ•˜๋Š” ์œ ์—ฐ์„ฑ๊ณผ ๋ณ‘๋ ฌ์ ์ธ ๊ฐœ๋ฐœ์„ ํšจ๊ณผ์ ์œผ๋กœ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค [3]. -* *์ฐธ๊ณ : ์ฃผ์–ด์ง„ ์†Œ์Šค์—๋Š” ๊ฐœ๋ฐœ ์›์น™(YAGNI) ๋ฐ ํด๋” ๊ตฌ์กฐ(Feature-Based)์™€ ์• ์ž์ผ์˜ ์—ฐ๊ด€์„ฑ๋งŒ ์–ธ๊ธ‰๋˜์–ด ์žˆ์œผ๋ฉฐ, ์Šคํฌ๋Ÿผ์ด๋‚˜ ์Šคํ”„๋ฆฐํŠธ ๋“ฑ ์• ์ž์ผ ํ™˜๊ฒฝ ์ž์ฒด์˜ ์ „๋ฐ˜์ ์ธ ํ”„๋กœ์„ธ์Šค๋‚˜ ์ด๋ก ์— ๋Œ€ํ•ด์„œ๋Š” ์†Œ์Šค์— ๊ด€๋ จ ์ •๋ณด๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค.* - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts -- [[YAGNI]] - - ์—ฐ๊ฒฐ ์ด์œ : ์• ์ž์ผ ํ™˜๊ฒฝ์—์„œ ๋ฏธ๋ž˜์˜ ๋ถˆํ™•์‹คํ•œ ๊ธฐ๋Šฅ์„ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์ง€ ์•Š๊ณ  ํ˜„์žฌ์˜ ์š”๊ตฌ์‚ฌํ•ญ์— ์ง‘์ค‘ํ•˜๋„๋ก ์ด๋„๋Š” ๊ฐ€์žฅ ํ•ต์‹ฌ์ ์ธ ๊ฐœ๋ฐœ ์›์น™์ž…๋‹ˆ๋‹ค [1, 2]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์• ์ž์ผ ํ™˜๊ฒฝ์—์„œ ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ(Dead Code)์˜ ์ƒ์„ฑ์„ ๋ฐฉ์ง€ํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜ ๋น„์šฉ์„ ์ตœ์†Œํ™”ํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ํŒ๋‹จ ๊ธฐ์ค€์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2]. -- [[Feature-Based Structure]] - - ์—ฐ๊ฒฐ ์ด์œ : ์• ์ž์ผ ๋ฐฉ๋ฒ•๋ก ๊ณผ ๊ฐ€์žฅ ์ž˜ ์–ด์šธ๋ฆฌ๋Š” ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด์œผ๋กœ, ์ฝ”๋“œ ๋ฒ ์ด์Šค๋ฅผ ๊ธฐ๋Šฅ ๋‹จ์œ„๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ๋…๋ฆฝ์ ์ธ ๊ฐœ๋ฐœ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค [3]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์• ์ž์ผ ํŒ€์ด ์š”๊ตฌ์‚ฌํ•ญ ๋ณ€๊ฒฝ์— ๋งž์ถฐ ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ์„ ๋…๋ฆฝ์ ์œผ๋กœ ํ™•์žฅํ•˜๊ณ  ๊ฐœ๋ฐœํ•  ๋•Œ ํŒŒ์ผ๊ณผ ํด๋”๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑํ•ด์•ผ ํ•˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3]. -- [[Startup Projects]] - - ์—ฐ๊ฒฐ ์ด์œ : ์• ์ž์ผ ํ™˜๊ฒฝ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์š”๊ตฌ์‚ฌํ•ญ์ด ์ง€์†์ ์œผ๋กœ ๋ณ€ํ™”ํ•˜๋Š” ํŠน์„ฑ์„ ๊ณต์œ ํ•˜๋ฉฐ, YAGNI ์›์น™์ด ๊ฐ•ํ•˜๊ฒŒ ์ ์šฉ๋˜๋Š” ๋Œ€ํ‘œ์ ์ธ ๋น„์ฆˆ๋‹ˆ์Šค ํ™˜๊ฒฝ์ž…๋‹ˆ๋‹ค [1]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์• ์ž์ผ ์›์น™์ด ์‹ค๋ฌด์—์„œ ์–ด๋– ํ•œ ํ˜•ํƒœ์˜ ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๋‚˜ ์ƒํ™ฉ(๋น ๋ฅธ ๋ณ€ํ™”์™€ ์œ ์—ฐ์„ฑ ์š”๊ตฌ)์—์„œ ์ฃผ๋กœ ์ฑ„ํƒ๋˜๋Š”์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1]. - -### Deeper Research Questions -- ์• ์ž์ผ ํ™˜๊ฒฝ์—์„œ YAGNI ์›์น™์„ ์—„๊ฒฉํ•˜๊ฒŒ ์ ์šฉํ•˜์—ฌ ๋‹น์žฅ์˜ ๊ธฐ๋Šฅ๋งŒ ๊ฐœ๋ฐœํ•  ๋•Œ, ํ–ฅํ›„ ์‹œ์Šคํ…œ์ด ํ™•์žฅ๋˜๋ฉด์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ์ˆ  ๋ถ€์ฑ„(Technical Debt)๋Š” ์–ด๋–ป๊ฒŒ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋Š”๊ฐ€? -- ์š”๊ตฌ์‚ฌํ•ญ์ด ๋Š์ž„์—†์ด ๋ณ€ํ™”ํ•˜๋Š” ์• ์ž์ผ ํ”„๋กœ์ ํŠธ์—์„œ Feature-Based Structure๊ฐ€ ๊ธฐ์กด์˜ ํŒŒ์ผ ์œ ํ˜• ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ(File-Type Based Structure)๋ณด๋‹ค ํŒ€ ํ˜‘์—… ๋ฐ ์œ ์ง€๋ณด์ˆ˜์— ์œ ๋ฆฌํ•œ ๊ตฌ์ฒด์  ์ด์œ ๋Š” ๋ฌด์—‡์ธ๊ฐ€? -- ์Šคํƒ€ํŠธ์—… ํ”„๋กœ์ ํŠธ์˜ ์ดˆ๊ธฐ ๋‹จ๊ณ„์—์„œ ์• ์ž์ผ ์›์น™(YAGNI, KISS ๋“ฑ)์„ ์ ์šฉํ•  ๋•Œ์™€, ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ํ™˜๊ฒฝ์œผ๋กœ ํ™•์žฅ(Scaling)๋  ๋•Œ ์•„ํ‚คํ…์ฒ˜ ์›์น™(SOLID ๋“ฑ)์˜ ์ ์šฉ ๋น„์ค‘์€ ์–ด๋–ป๊ฒŒ ๋ณ€ํ™”ํ•ด์•ผ ํ•˜๋Š”๊ฐ€? -- ๊ธฐ๋Šฅ(Feature)์„ ๋…๋ฆฝ์ ์œผ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ฐœ๋ฐœํ•˜๋Š” ์• ์ž์ผ ํ™˜๊ฒฝ์—์„œ, ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ ๊ฐ„์— ๊ณต์œ ๋˜๋Š” ๊ต์ฐจ ์˜์กด์„ฑ(Cross-cutting concerns)์€ ๊ตฌ์กฐ์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•ด์•ผ ํ•˜๋Š”๊ฐ€? -- ์• ์ž์ผ ํ™˜๊ฒฝ์˜ 'ํ˜„์žฌ ์š”๊ตฌ์‚ฌํ•ญ์— ๋Œ€ํ•œ ์ง‘์ค‘'๊ณผ '์žฅ๊ธฐ์ ์ธ ์†Œํ”„ํŠธ์›จ์–ด ์•„ํ‚คํ…์ฒ˜์˜ ๊ฒฌ๊ณ ํ•จ' ์‚ฌ์ด์˜ ๊ท ํ˜•์„ ๋งž์ถ”๊ธฐ ์œ„ํ•œ ๊ฐœ๋ฐœ ๊ฑฐ๋ฒ„๋„Œ์Šค๋Š” ์–ด๋–ป๊ฒŒ ๊ตฌ์ถ•ํ•ด์•ผ ํ•˜๋Š”๊ฐ€? - -### Practical Application Contexts -- **Implementation:** ์ฃผ์–ด์ง„ ์Šคํ† ๋ฆฌ๋‚˜ ํƒœ์Šคํฌ์˜ ์š”๊ตฌ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ตœ์†Œํ•œ์˜ ์ฝ”๋“œ๋งŒ ์šฐ์„ ์ ์œผ๋กœ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค (์˜ค๋ฒ„์—”์ง€๋‹ˆ์–ด๋ง ๊ธˆ์ง€) [2]. -- **System Design:** ํ”„๋กœ์ ํŠธ ํด๋”์™€ ๋ชจ๋“ˆ์„ ๊ธฐ๋Šฅ(Feature)์„ ์ค‘์‹ฌ์œผ๋กœ ์„ค๊ณ„ํ•˜์—ฌ, ์š”๊ตฌ์‚ฌํ•ญ์ด ๋ณ€๊ฒฝ๋˜๋”๋ผ๋„ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ์ตœ์†Œํ™”ํ•˜๊ณ  ๋…๋ฆฝ์ ์ธ ๋ฐฐํฌ ๋ฐ ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค [3]. -- **Operation / Maintenance:** ์–ธ์  ๊ฐ€ ์“ฐ์ผ ๊ฒƒ์ด๋ผ ์˜ˆ์ƒํ•˜๊ณ  ์ž‘์„ฑํ•œ ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ๋ฅผ ๋ฐฐ์ œํ•จ์œผ๋กœ์จ, ์šด์˜ ๋‹จ๊ณ„์—์„œ ํŒ€์ด ๊ด€๋ฆฌํ•˜๊ณ  ํŒŒ์•…ํ•ด์•ผ ํ•  ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ์˜ ๋ณต์žก์„ฑ์„ ๋Œ€ํญ ๋‚ฎ์ถฅ๋‹ˆ๋‹ค [2]. -- **Learning Path:** ์• ์ž์ผ ํ™˜๊ฒฝ์— ํ•ฉ๋ฅ˜ํ•˜๊ธฐ ์œ„ํ•ด YAGNI ์›์น™์˜ ์ ์šฉ๋ฒ•๊ณผ Feature-Sliced Design๊ณผ ๊ฐ™์€ ์ตœ์‹  ๊ธฐ๋Šฅ ๋‹จ์œ„์˜ ๋ชจ๋“ˆํ˜• ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด์„ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค [2, 3]. -- **My Project Relevance:** ์žฆ์€ ๊ธฐํš ๋ณ€๊ฒฝ์ด ์˜ˆ์ƒ๋˜๋Š” ์ดˆ๊ธฐ ๋‹จ๊ณ„์˜ ์Šคํƒ€ํŠธ์—… ํ”„๋กœ์ ํŠธ๋‚˜ ์• ์ž์ผ ์กฐ์ง์„ ์„ธํŒ…ํ•  ๋•Œ, ์ดˆ๊ธฐ ๊ฐœ๋ฐœ ์†๋„๋ฅผ ๋†’์ด๋ฉด์„œ๋„ ๋ณ€๊ฒฝ์— ์œ ์—ฐํ•˜๊ฒŒ ๋Œ€์‘ํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ€์ด๋“œ๋ผ์ธ์œผ๋กœ ์ง๊ฒฐ๋ฉ๋‹ˆ๋‹ค [1, 3]. - -### Adjacent Topics -- [[SOLID Principles]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ์• ์ž์ผ ํ™˜๊ฒฝ์—์„œ ๋‹น์žฅ์˜ ๊ธฐ๋Šฅ์„ ๋‹จ์ˆœํ•˜๊ฒŒ ๊ฐœ๋ฐœ(YAGNI)ํ•˜๋ฉด์„œ๋„, ์žฅ๊ธฐ์ ์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ทœ๋ชจ๊ฐ€ ์ปค์กŒ์„ ๋•Œ ์ฝ”๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ์œ ์ง€๋ณด์ˆ˜ ๊ฐ€๋Šฅํ•˜๊ฒŒ ์„ค๊ณ„ํ• ์ง€ ๊ฐ์ฒด ์ง€ํ–ฅ์ /๊ตฌ์กฐ์  ๊ด€์ ์—์„œ ์ดํ•ด๋ฅผ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1, 4]. -- [[Clean Code]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋น ๋ฅธ ๋ณ€ํ™”์™€ ๋ฐ˜๋ณต ๊ฐœ๋ฐœ(Iteration)์ด ์ผ์–ด๋‚˜๋Š” ์• ์ž์ผ ํ™˜๊ฒฝ ์†์—์„œ, ์—ฌ๋Ÿฌ ๋ช…์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ฝ”๋“œ๋ฅผ ์‰ฝ๊ฒŒ ์ฝ๊ณ  ํ˜‘์—…ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ธฐ๋ณธ์ ์ธ ์ฝ”๋“œ ํ’ˆ์งˆ ์œ ์ง€ ๊ธฐ๋ฒ•์œผ๋กœ ํ™•์žฅ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค [4, 5]. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Agile Software Development in Small Teams.md b/00_Raw/Agile Software Development in Small Teams.md deleted file mode 100644 index b8fce13b..00000000 --- a/00_Raw/Agile Software Development in Small Teams.md +++ /dev/null @@ -1,70 +0,0 @@ -# [[Agile Software Development in Small Teams]] - -## ๐Ÿ“Œ Brief Summary -์†Œ๊ทœ๋ชจ ํŒ€(์˜ˆ: 2~5์ธ)์—์„œ์˜ ์• ์ž์ผ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์€ ํ”„๋กœ์„ธ์Šค ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ตœ์†Œํ™”ํ•˜๊ณ  ๋น ๋ฅธ ํ”ผ๋“œ๋ฐฑ ๋ฃจํ”„๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์„ ํ•ต์‹ฌ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค [1, 2]. ๋ณต์žกํ•œ ์›Œํฌํ”Œ๋กœ์šฐ(์˜ˆ: Git-Flow) ๋Œ€์‹  ๊ฐ€๋ฒผ์šด ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜(Feature-Branch)๋‚˜ ํŠธ๋ ํฌ ๊ธฐ๋ฐ˜(Trunk-Based) ๊ฐœ๋ฐœ์„ ์ฑ„ํƒํ•˜์—ฌ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค [3, 4]. ๋˜ํ•œ, YAGNI(You Aren't Gonna Need It) ์›์น™๊ณผ ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜์˜ ๊ตฌ์กฐ(Feature-Based Structure)๋ฅผ ์ ์šฉํ•˜์—ฌ ์˜ค๋ฒ„์—”์ง€๋‹ˆ์–ด๋ง์„ ํ”ผํ•˜๊ณ  ์ฝ”๋“œ์˜ ํ™•์žฅ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ํ™•๋ณดํ•ฉ๋‹ˆ๋‹ค [5, 6]. - -## ๐Ÿ“– Core Content - -* **๊ฐ€๋ฒผ์šด ๋ธŒ๋žœ์นญ ์›Œํฌํ”Œ๋กœ์šฐ (Lightweight Branching Workflows)** - * ์†Œ๊ทœ๋ชจ ํŒ€์˜ ๊ฒฝ์šฐ, ๋ฌด๊ฒ๊ณ  ๋ณต์žกํ•œ Git-Flow๋ณด๋‹ค๋Š” '๋‹จ์ˆœ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜ ์›Œํฌํ”Œ๋กœ์šฐ(Simple Feature-Branch Workflow)'๋‚˜ '์งง์€ ์ˆ˜๋ช…์˜ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜๋ฅผ ํ™œ์šฉํ•œ ํŠธ๋ ํฌ ๊ธฐ๋ฐ˜ ๊ฐœ๋ฐœ(Trunk-Based Development)'์ด ๊ฐ€์žฅ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค [1-3]. - * ์ด๋ฅผ ํ†ตํ•ด ๊ณผ๋„ํ•œ ํ”„๋กœ์„ธ์Šค ๋ถ€๋‹ด ์—†์ด ์ฝ”๋“œ ์•ˆ์ •์„ฑ์„ ์ง€ํ‚ค๊ณ , ๊ธด ๋ธŒ๋žœ์น˜ ์œ ์ง€๋กœ ์ธํ•œ ๋Œ€๊ทœ๋ชจ ๋ณ‘ํ•ฉ ์ถฉ๋Œ์„ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [4, 7, 8]. - -* **์†Œ๊ทœ๋ชจ ์• ์ž์ผ ํŒ€์„ ์œ„ํ•œ ํ•ต์‹ฌ ๊ทœ์น™ (Key Rules for Collaboration)** - * **์•ˆ์ •์ ์ธ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜ ์œ ์ง€:** `main` (๋˜๋Š” `master`) ๋ธŒ๋žœ์น˜๋Š” ํ•ญ์ƒ ๋ฐฐํฌ ๊ฐ€๋Šฅํ•˜๊ณ  ์•ˆ์ •์ ์ธ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•ด์•ผ ํ•˜๋ฉฐ, ์ง์ ‘ ํ‘ธ์‹œ(Direct push)๋ฅผ ๊ธˆ์ง€ํ•˜๋Š” ๋ณดํ˜ธ ์ •์ฑ…(Branch protection)์„ ์ ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [1-3, 9]. - * **๋‹จ์ผ ์ž‘์—… ๋ธŒ๋žœ์น˜์™€ ์›์ž์  ์ปค๋ฐ‹:** ๋ชจ๋“  ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด๋‚˜ ๋ฒ„๊ทธ ์ˆ˜์ •์€ `main`์—์„œ ๋ถ„๊ธฐ๋œ ์งง์€ ์ˆ˜๋ช…์˜ ๋ธŒ๋žœ์น˜์—์„œ ์ง„ํ–‰ํ•˜๋ฉฐ(์˜ˆ: `feature/login-page`), ํ•˜๋‚˜์˜ ์ปค๋ฐ‹์—๋Š” ํ•˜๋‚˜์˜ ๋…ผ๋ฆฌ์  ๋ณ€๊ฒฝ(Atomic Commits)๋งŒ ๋‹ด์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค [2, 3, 10, 11]. - * **์ฝ”๋“œ ๋ฆฌ๋ทฐ์™€ ๋ณ‘ํ•ฉ (PR & Merge):** ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด Pull Request(PR)๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์ตœ์†Œ 1๋ช… ์ด์ƒ์˜ ๋™๋ฃŒ ๋ฆฌ๋ทฐ์™€ CI ํ…Œ์ŠคํŠธ ํ†ต๊ณผ๋ฅผ ๊ฑฐ์ณ์•ผ๋งŒ ๋ณ‘ํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [9-12]. ๋ณ‘ํ•ฉ ์‹œ์—๋Š” ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด Squash Merge๋ฅผ ๊ถŒ์žฅํ•˜๋ฉฐ, ๋ณ‘ํ•ฉ๋œ ๋ธŒ๋žœ์น˜๋Š” ์ž๋™์œผ๋กœ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค [9, 10, 12, 13]. - -* **์• ์ž์ผ ํ™˜๊ฒฝ์˜ ์†Œํ”„ํŠธ์›จ์–ด ์„ค๊ณ„ ์›์น™๊ณผ ๊ตฌ์กฐ** - * **YAGNI ์›์น™:** ์• ์ž์ผ ํ™˜๊ฒฝ์—์„œ๋Š” "You Aren't Gonna Need It(๋‹น์žฅ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ธฐ๋Šฅ์€ ๋งŒ๋“ค์ง€ ๋ง๋ผ)" ์›์น™์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค. ์‹คํ˜„๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋Š” ๋ฏธ๋ž˜์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์œ„ํ•ด ๋ณต์žกํ•œ ๊ธฐ๋Šฅ์„ ๋ฏธ๋ฆฌ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒƒ์„ ์ง€์–‘ํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ์™€ ์œ ์ง€๋ณด์ˆ˜ ๋ถ€๋‹ด์„ ์ค„์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค [5, 14]. - * **๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ (Feature-Based Structure):** ๊ธฐ์ˆ ์ ์ธ ํŒŒ์ผ ์œ ํ˜•์ด ์•„๋‹Œ ๋น„์ฆˆ๋‹ˆ์Šค ๊ธฐ๋Šฅ(Feature)์„ ์ค‘์‹ฌ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ํด๋”ํ™”ํ•˜๋Š” ์ ‘๊ทผ ๋ฐฉ์‹์€ ์• ์ž์ผ ๊ฐœ๋ฐœ ๋ฐฉ๋ฒ•๋ก ๊ณผ ๋งค์šฐ ์ž˜ ๋งž์Šต๋‹ˆ๋‹ค [6, 15]. ๊ธฐ๋Šฅ๋“ค์ด ๋…๋ฆฝ์ ์œผ๋กœ ์ƒ์„ฑ ๋ฐ ๊ตฌํ˜„๋  ์ˆ˜ ์žˆ์–ด ํŒ€์ด ์ฝ”๋“œ๋ฅผ ํ™•์žฅํ•  ๋•Œ ๋งˆ์ฐฐ์ด ์ ์Šต๋‹ˆ๋‹ค [6]. - -## โš–๏ธ Trade-offs & Caveats -* **๋‹จ์ˆœ์„ฑ vs. ๊ตฌ์กฐ์  ํ•œ๊ณ„:** ๊ฐ€๋ฒผ์šด ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜ ์ „๋žต์ด๋‚˜ ํŠธ๋ ํฌ ๊ธฐ๋ฐ˜ ๊ฐœ๋ฐœ์€ ์†Œ๊ทœ๋ชจ ํŒ€(2~5๋ช…)์—๊ฒŒ ๋ฐฐ์šฐ๊ธฐ ์‰ฝ๊ณ  ํ”„๋กœ์„ธ์Šค ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์ ๋‹ค๋Š” ๊ฐ•๋ ฅํ•œ ์žฅ์ ์ด ์žˆ์ง€๋งŒ [4, 8], ํŒ€ ๊ทœ๋ชจ๊ฐ€ ํฌ๊ฒŒ ์„ฑ์žฅํ•˜๊ฑฐ๋‚˜ ์—„๊ฒฉํžˆ ์˜ˆ์ •๋œ ๋ฆด๋ฆฌ์Šค ์ผ์ •์„ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๋ฌด๊ฒ๋”๋ผ๋„ Git-Flow์™€ ๊ฐ™์€ ๋ฆด๋ฆฌ์Šค/๊ฐœ๋ฐœ ๋ธŒ๋žœ์น˜๊ฐ€ ๋ถ„๋ฆฌ๋œ ์ „๋žต์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [4, 16]. -* **Trunk-Based Development์˜ ๋†’์€ ์š”๊ตฌ์‚ฌํ•ญ:** ํŠธ๋ ํฌ ๊ธฐ๋ฐ˜ ๊ฐœ๋ฐœ์€ ๋น ๋ฅธ ํ†ตํ•ฉ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜์ง€๋งŒ, ํŒ€์› ๊ฐ„์˜ ๊ธด๋ฐ€ํ•œ ์กฐ์œจ๊ณผ ๊ฐ•๋ ฅํ•œ ์ง€์†์  ํ†ตํ•ฉ(CI) ํ™˜๊ฒฝ ๊ตฌ์ถ•์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค [4, 8]. ๊ฐ•๋ ฅํ•œ CI ํŒŒ์ดํ”„๋ผ์ธ ์—†์ด ๋นˆ๋ฒˆํ•œ ๋ณ‘ํ•ฉ๋งŒ ์‹œ๋„ํ•  ๊ฒฝ์šฐ, ์˜คํžˆ๋ ค `main` ๋ธŒ๋žœ์น˜์˜ ์•ˆ์ •์„ฑ์ด ์œ„ํ˜‘๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -* **YAGNI์˜ ๋ถ€์ž‘์šฉ:** YAGNI ์›์น™์€ ๋‚ญ๋น„๋˜๋Š” ๋…ธ๋ ฅ์„ ์ค„์—ฌ์ฃผ์ง€๋งŒ, ์‹œ์Šคํ…œ์˜ ์ „๋ฐ˜์ ์ธ ๋ฐ‘๊ทธ๋ฆผ์ด๋‚˜ ๋ฏธ๋ž˜์˜ ํ™•์žฅ์„ฑ์„ ๋„ˆ๋ฌด ๊ณ ๋ คํ•˜์ง€ ์•Š๊ณ  ๊ฐœ๋ฐœํ•  ๊ฒฝ์šฐ(Oversimplify) ๋‚˜์ค‘์— ๋Œ€๋Œ€์ ์ธ ์•„ํ‚คํ…์ฒ˜ ์ˆ˜์ •์ด ํ•„์š”ํ•ด์งˆ ์œ„ํ—˜(Trade-off)๋„ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค [17]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -#### [Workflow & Version Control (๋ฒ„์ „ ๊ด€๋ฆฌ ๋ฐ ํ˜‘์—… ๋ฐฉ์‹)] -- [[Feature-Branch Workflow]] - - ์—ฐ๊ฒฐ ์ด์œ : 2~5์ธ ๊ทœ๋ชจ์˜ ์†Œ๊ทœ๋ชจ ํŒ€์—์„œ ์ถฉ๋Œ์„ ์ตœ์†Œํ™”ํ•˜๊ณ  ๊ฐ€๋ฒผ์šด ํ”„๋กœ์„ธ์Šค๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ€์žฅ ๋„๋ฆฌ ๊ถŒ์žฅ๋˜๋Š” ํ•ต์‹ฌ Git ๋ธŒ๋žœ์น˜ ์ „๋žต์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [2, 3]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์งง์€ ์ˆ˜๋ช…์˜ ๋ธŒ๋žœ์น˜ ๊ด€๋ฆฌ์™€ Pull Request๋ฅผ ํ†ตํ•œ ๋น„๋™๊ธฐ ์ฝ”๋“œ ๋ฆฌ๋ทฐ๊ฐ€ ํŒ€์˜ ๋ฏผ์ฒฉ์„ฑ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ. -- [[Trunk-Based Development]] - - ์—ฐ๊ฒฐ ์ด์œ : ์ˆ™๋ จ๋œ ์†Œ๊ทœ๋ชจ ํŒ€์ด ๋น ๋ฅธ ํ”ผ๋“œ๋ฐฑ๊ณผ CI/CD์˜ ํšจ์œจ์„ ๊ทน๋Œ€ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” ๋Œ€์•ˆ์  ์• ์ž์ผ ์›Œํฌํ”Œ๋กœ์šฐ์ž…๋‹ˆ๋‹ค [1, 4]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ธŒ๋žœ์น˜ ๋ถ„๋ฆฌ๋ฅผ ์ตœ์†Œํ™”ํ•˜๊ณ  ๋นˆ๋ฒˆํ•˜๊ฒŒ ์ฝ”๋“œ๋ฅผ ๋ณ‘ํ•ฉํ•˜๋Š” ๊ฒƒ์ด ํ†ตํ•ฉ ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ์˜ˆ๋ฐฉํ•˜๋Š”์ง€. - -#### [Software Engineering Principles (์†Œํ”„ํŠธ์›จ์–ด ๊ณตํ•™ ์›์น™)] -- [[YAGNI (You Aren't Gonna Need It)]] - - ์—ฐ๊ฒฐ ์ด์œ : ์• ์ž์ผ ํ™˜๊ฒฝ์—์„œ ๋‚ญ๋น„๋ฅผ ์ค„์ด๊ณ  ํ˜„์žฌ์˜ ์š”๊ตฌ์‚ฌํ•ญ์—๋งŒ ์ง‘์ค‘ํ•˜๊ฒŒ ํ•จ์œผ๋กœ์จ, ๋น ๋ฅด๊ณ  ๊ฐ€๋ฒผ์šด ๊ฐœ๋ฐœ ์ฃผ๊ธฐ๋ฅผ ์œ ์ง€ํ•˜๋„๋ก ๋•๋Š” ํ•ต์‹ฌ ์„ค๊ณ„ ์›์น™์ž…๋‹ˆ๋‹ค [5, 17]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ณผ๋„ํ•œ ์‚ฌ์ „ ์„ค๊ณ„(Over-engineering)๋ฅผ ๋ฐฉ์ง€ํ•˜์—ฌ ๊ฐœ๋ฐœ ์†๋„๋ฅผ ๋†’์ด๋Š” ์ฒ ํ•™์  ๋ฐฐ๊ฒฝ. -- [[Feature-Based Structure]] - - ์—ฐ๊ฒฐ ์ด์œ : ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ธฐ์ˆ ์  ์—ญํ• ์ด ์•„๋‹Œ ๋น„์ฆˆ๋‹ˆ์Šค ๊ธฐ๋Šฅ(Feature) ๋‹จ์œ„๋กœ ๋ฌถ์–ด ๋…๋ฆฝ์„ฑ์„ ๋ถ€์—ฌํ•˜๋Š” ๊ตฌ์กฐ๋กœ, ๊ธฐ๋Šฅ ๋‹จ์œ„๋กœ ๊ฐœ๋ฐœ๊ณผ ๋ฐฐํฌ๋ฅผ ๋ฐ˜๋ณตํ•˜๋Š” ์• ์ž์ผ ๋ฐฉ๋ฒ•๋ก ๊ณผ ์ง๊ฒฐ๋ฉ๋‹ˆ๋‹ค [6, 15]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ์‘์ง‘๋„(Cohesion)๋ฅผ ๋†’์ด๊ณ  ๋…๋ฆฝ์ ์ธ ๊ธฐ๋Šฅ ํ™•์žฅ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ํด๋” ๊ตฌ์กฐ ์„ค๊ณ„๋ฒ•. - -### Deeper Research Questions - -- ์†Œ๊ทœ๋ชจ ์• ์ž์ผ ํŒ€์ด ์„ฑ์žฅํ•˜์—ฌ ๋Œ€ํ˜• ํŒ€(์˜ˆ: 10๋ช… ์ด์ƒ)์ด ๋  ๋•Œ, ๊ฒฝ๋Ÿ‰ํ™”๋œ Feature-Branch ์›Œํฌํ”Œ๋กœ์šฐ์—์„œ Git-Flow์™€ ๊ฐ™์€ ๋ณต์žกํ•œ ์›Œํฌํ”Œ๋กœ์šฐ๋กœ ์ „ํ™˜ํ•ด์•ผ ํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ์ž„๊ณ„์ ๊ณผ ์ง•ํ›„๋Š” ๋ฌด์—‡์ธ๊ฐ€? -- ์†Œ๊ทœ๋ชจ ํŒ€์ด Trunk-Based Development๋ฅผ ๋„์ž…ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์ˆ˜์ ์œผ๋กœ ๊ฐ–์ถฐ์•ผ ํ•˜๋Š” CI/CD ํŒŒ์ดํ”„๋ผ์ธ์˜ ์„ฑ์ˆ™๋„์™€ ์ž๋™ํ™” ํ…Œ์ŠคํŠธ์˜ ์ปค๋ฒ„๋ฆฌ์ง€ ์ˆ˜์ค€์€ ์–ด๋А ์ •๋„์ธ๊ฐ€? -- ํ”„๋ก ํŠธ์—”๋“œ ํ™˜๊ฒฝ์—์„œ Feature-Based Structure(ํ˜น์€ Feature-Sliced Design)๋ฅผ ๋„์ž…ํ•  ๋•Œ, ๊ณตํ†ต ๋กœ์ง(Shared concerns)์˜ ๊ฒฝ๊ณ„๋ฅผ ์–ด๋–ป๊ฒŒ ์ •์˜ํ•ด์•ผ ์• ์ž์ผ ํŒ€์˜ ๊ฐœ๋ฐœ ์†๋„ ์ €ํ•˜๋ฅผ ๋ง‰์„ ์ˆ˜ ์žˆ๋Š”๊ฐ€? -- YAGNI ์›์น™์„ ์—„๊ฒฉํ•˜๊ฒŒ ์ ์šฉํ•˜๋ฉด์„œ ๋ฐœ์ƒํ•˜๋Š” ๊ธฐ์ˆ  ๋ถ€์ฑ„(Technical Debt)๋ฅผ ์• ์ž์ผ ์Šคํ”„๋ฆฐํŠธ ๋‚ด์—์„œ ์•ˆ์ „ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•˜๊ณ  ๋ฆฌํŒฉํ† ๋งํ•˜๋Š” ์ฒด๊ณ„์ ์ธ ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? -- Pull Request ๊ธฐ๋ฐ˜์˜ ํ˜‘์—…์—์„œ, ๋ณ‘ํ•ฉ ์ง€์—ฐ์„ ๋ฐฉ์ง€ํ•˜๊ณ  ๋น ๋ฅธ ํ”ผ๋“œ๋ฐฑ์„ ์œ ๋„ํ•˜๊ธฐ ์œ„ํ•œ ์ด์ƒ์ ์ธ PR ํฌ๊ธฐ ์ œํ•œ(์˜ˆ: ์ฝ”๋“œ ๋ผ์ธ ์ˆ˜)๊ณผ Atomic Commit ๊ฐ•์ œ ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? - -### Practical Application Contexts - -- **Implementation:** ๊ฐœ๋ฐœ์ž๋Š” ์ž‘์—…์„ ์‹œ์ž‘ํ•  ๋•Œ `main` ๋ธŒ๋žœ์น˜์—์„œ ์งง์€ ์ˆ˜๋ช…์˜ ๋ธŒ๋žœ์น˜๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ ๋’ค ์ž‘๊ณ  ๋…ผ๋ฆฌ์ ์ธ ๋‹จ์œ„(Atomic Commits)๋กœ ์ชผ๊ฐœ์–ด ์ž์ฃผ ์ปค๋ฐ‹ํ•ฉ๋‹ˆ๋‹ค [10, 13]. -- **System Design:** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํด๋” ๊ตฌ์กฐ๋ฅผ ๋„๋ฉ”์ธ์ด๋‚˜ ๊ธฐ๋Šฅ(Feature) ๊ธฐ์ค€์œผ๋กœ ์„ค๊ณ„ํ•˜์—ฌ, ์†Œ๊ทœ๋ชจ ํŒ€์›์ด ๊ฐ์ž ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์„ ๋™์‹œ์— ๊ฐœ๋ฐœํ•˜๋”๋ผ๋„ ์„œ๋กœ์˜ ์ฝ”๋“œ ์˜์—ญ์„ ์นจ๋ฒ”ํ•˜์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค [6]. -- **Operation / Maintenance:** GitHub ๋“ฑ ์ €์žฅ์†Œ ์„ค์ •์—์„œ `main` ๋ธŒ๋žœ์น˜ ๋ณดํ˜ธ(Branch Protection) ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•˜๊ณ , ์ตœ์†Œ 1๋ช…์˜ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ์Šน์ธ๊ณผ ์ž๋™ํ™” ํ…Œ์ŠคํŠธ(CI) ํ†ต๊ณผ๋ฅผ ํ•„์ˆ˜ ๋ณ‘ํ•ฉ ์กฐ๊ฑด์œผ๋กœ ๊ฐ•์ œํ•˜์—ฌ ํ”„๋กœ๋•์…˜ ์•ˆ์ •์„ฑ์„ ํ™•๋ณดํ•ฉ๋‹ˆ๋‹ค [9]. -- **Learning Path:** ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ ํŒ€์„ ๊ตฌ์„ฑํ•  ๋•Œ, ์ฒ˜์Œ๋ถ€ํ„ฐ ๋ฌด๊ฑฐ์šด ๋ฃฐ์„ ๊ฐ•์š”ํ•˜๊ธฐ๋ณด๋‹ค ๋‹จ์ผ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ, Pull Request๋ฅผ ํ†ตํ•œ ๋ฆฌ๋ทฐ, Squash Merge๋ฅผ ์ด์šฉํ•œ ๊น”๋”ํ•œ ํžˆ์Šคํ† ๋ฆฌ ๊ด€๋ฆฌ ๋“ฑ ํ•ต์‹ฌ ์›Œํฌํ”Œ๋กœ์šฐ๋ถ€ํ„ฐ ํ•™์Šต์‹œํ‚ต๋‹ˆ๋‹ค [1, 13, 18]. -- **My Project Relevance:** ํ˜„์žฌ ์ง„ํ–‰ ์ค‘์ธ 2-5์ธ ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์— ๋ถˆํ•„์š”ํ•œ ๋ฏธ๋ž˜ ํ™•์žฅ์„ ๋Œ€๋น„ํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š๋Š” YAGNI ์›์น™๊ณผ, `feat/*`, `fix/*` ํ˜•ํƒœ์˜ ๋‹จ์ˆœํ•œ ๋ธŒ๋žœ์น˜ ์ „๋žต์„ ๋„์ž…ํ•˜๋ฉด ๋ณ‘ํ•ฉ ์ถฉ๋Œ์„ ์ค„์ด๊ณ  ๋น ๋ฅด๊ฒŒ ๊ฒฐ๊ณผ๋ฌผ์„ ๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2, 4, 16]. - -### Adjacent Topics - -- [[Continuous Integration (CI)]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ์†Œ๊ทœ๋ชจ ํŒ€์ด ์งง์€ ์ฃผ๊ธฐ์˜ ์ฝ”๋“œ ๋ณ‘ํ•ฉ(Merge)์„ ์•ˆ์ „ํ•˜๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋’ท๋ฐ›์นจํ•˜๋Š” ์ž๋™ํ™”๋œ ๋นŒ๋“œ ๋ฐ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ ๊ตฌ์ถ• ๊ฐ€์ด๋“œ๋กœ ํ™•์žฅ. -- [[Conventional Commits]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ํŒ€์› ๊ฐ„์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜์„ ์ผ๊ด€๋˜๊ฒŒ ๋งŒ๋“ค๊ณ  (`feat:`, `fix:` ๋“ฑ), ํ–ฅํ›„ ๋ฆด๋ฆฌ์Šค ๋…ธํŠธ๋ฅผ ์ž๋™ํ™”ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” ์ปค๋ฐ‹ ์ž‘์„ฑ ํ‘œ์ค€ ๊ทœ์น™ ํƒ๊ตฌ. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Automated Governance.md b/00_Raw/Automated Governance.md deleted file mode 100644 index 630c4289..00000000 --- a/00_Raw/Automated Governance.md +++ /dev/null @@ -1,59 +0,0 @@ -# [[Automated Governance]] - -## ๐Ÿ“Œ Brief ์ฝ”์•ฝ Summary -Automated Governance(๊ฑฐ๋ฒ„๋„Œ์Šค ์ž๋™ํ™”)๋Š” ์ฝ”๋”ฉ ํ‘œ์ค€๊ณผ ์•„ํ‚คํ…์ฒ˜ ๊ทœ์น™์„ ์ˆ˜๋™์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๋Œ€์‹  ์ž๋™ํ™”๋œ ๋„๊ตฌ๋ฅผ ํ†ตํ•ด ์‹œ์Šคํ…œ์ ์œผ๋กœ ๊ฐ•์ œํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก ์ž…๋‹ˆ๋‹ค [1, 2]. ์ด๋Š” ํŒ€ ํ˜‘์—…์˜ ๊ธฐ๋ฐ˜์ด ๋˜๋ฉฐ, ๊ฐœ๋ฐœ์ž๊ฐ€ ํŒŒ์ผ์„ ์ฐพ์„ ๋•Œ ๊ฒช๋Š” ํ˜ผ๋ž€์„ ์—†์• ๊ณ  ํ™˜๊ฒฝ ์„ค์ • ๋ถˆ์ผ์น˜๋กœ ์ธํ•œ ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค [1]. ์ฃผ๋กœ ESLint, Prettier, Husky์™€ ๊ฐ™์€ ๋„๊ตฌ์™€ CI/CD ํŒŒ์ดํ”„๋ผ์ธ์„ ํ™œ์šฉํ•˜์—ฌ ๊ณ ํ’ˆ์งˆ์˜ ์ฝ”๋“œ๋งŒ ์ €์žฅ์†Œ์— ๋ณ‘ํ•ฉ๋˜๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค [2, 3]. - -## ๐Ÿ“– Core Content -* **์ž๋™ํ™” ๋„๊ตฌ์˜ ํ•„์š”์„ฑ:** ์ฝ”๋”ฉ ํ‘œ์ค€์„ ์ˆ˜๋™์œผ๋กœ ๊ฐ•์ œํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ๋น„ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค [2]. ํ˜„๋Œ€์˜ ํ”„๋ก ํŠธ์—”๋“œ ํ”„๋กœ์ ํŠธ๋Š” ESLint์™€ Prettier๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ฝ”๋“œ ์œ„๋ฐ˜ ์‚ฌํ•ญ์„ ์ž๋™์œผ๋กœ ์ฐพ์•„๋‚ด๊ณ  ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค [2]. -* **์•„ํ‚คํ…์ฒ˜ ๊ฒฝ๊ณ„์˜ ์ž๋™ ๊ฐ•์ œ:** ESLint ๊ทœ์น™์„ ์„ธ๋ถ€์ ์œผ๋กœ ๊ตฌ์„ฑํ•˜์—ฌ ํŠน์ • ์ž„ํฌํŠธ ํŒจํ„ด์„ ๊ธˆ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2]. ์˜ˆ๋ฅผ ๋“ค์–ด, ํ•˜๋‚˜์˜ ๊ธฐ๋Šฅ(feature)์ด ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์˜ ๋‚ด๋ถ€ ๋ชจ๋“ˆ์„ ์ง์ ‘ ์ž„ํฌํŠธํ•˜์ง€ ๋ชปํ•˜๋„๋ก ์ฐจ๋‹จํ•จ์œผ๋กœ์จ, Feature-Sliced Design(FSD)๊ณผ ๊ฐ™์€ ์•„ํ‚คํ…์ฒ˜ ๊ฒฝ๊ณ„๋ฅผ ์‹œ์Šคํ…œ์ ์œผ๋กœ ๊ฐ•์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2]. -* **Git ํ›…(Hooks)์„ ํ†ตํ•œ ์‚ฌ์ „ ์ฐจ๋‹จ:** Husky์™€ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ Git ํ›…์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค [2]. ์ด๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ๊ฐ€ ์ปค๋ฐ‹๋˜๊ธฐ ์ „์— ๋ฆฐํŒ…, ํฌ๋งทํŒ…, ํƒ€์ž… ๊ฒ€์‚ฌ๋ฅผ ์ž๋™์œผ๋กœ ์‹คํ–‰ํ•˜์—ฌ, ๊ธฐ์ค€์„ ํ†ต๊ณผํ•œ ๊ณ ํ’ˆ์งˆ์˜ ์ฝ”๋“œ๋งŒ์ด ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ๋ฐ˜์˜๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค [2]. -* **์ง€์†์  ํ†ตํ•ฉ(CI/CD) ํŒŒ์ดํ”„๋ผ์ธ ์ ์šฉ:** ํŒ€์˜ ์„ฑ๊ณต์ ์ธ ๊ฑฐ๋ฒ„๋„Œ์Šค๋Š” ๋กœ์ปฌ ํ™˜๊ฒฝ์˜ ๋ฆฐํŒ… ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ฐ•๋ ฅํ•œ CI/CD ํŒŒ์ดํ”„๋ผ์ธ์„ ํ†ตํ•œ ์ž๋™ํ™”์— ๋‹ฌ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค [3]. ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ(Visual tests) ๋“ฑ์˜ ์ž๋™ํ™” ๋„๊ตฌ ์—ญ์‹œ CI ํŒŒ์ดํ”„๋ผ์ธ์˜ PR ๊ฒ€์‚ฌ(PR checks)์™€ ์—ฐ๋™๋˜์–ด ์˜๋„์น˜ ์•Š์€ UI ๋ฒ„๊ทธ๊ฐ€ ๋ณ‘ํ•ฉ๋˜๋Š” ๊ฒƒ์„ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค [4]. - -## โš–๏ธ Trade-offs & Caveats -* **์†Œ์Šค์— ๊ด€๋ จ ์ •๋ณด๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค.** -* ์ œ๊ณต๋œ ์†Œ์Šค์—์„œ๋Š” ๊ฑฐ๋ฒ„๋„Œ์Šค ์ž๋™ํ™”(Automated Governance)์˜ ๋‹จ์ ์ด๋‚˜ ๋ถ€์ž‘์šฉ์— ๋Œ€ํ•ด ์ง์ ‘์ ์œผ๋กœ ๋ช…์‹œํ•˜๊ณ  ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ, ๊ตฌ์กฐ์  ์—„๊ฒฉ์„ฑ์„ ์œ„ํ•ด ESLint ์„ค์ •, Husky ์ดˆ๊ธฐ ๊ตฌ์ถ•, CI/CD ํ†ตํ•ฉ ๋“ฑ **๋‹ค์–‘ํ•œ ์ž๋™ํ™” ๋„๊ตฌ๋ฅผ ์…‹์—…ํ•˜๋Š” ์ถ”๊ฐ€์ ์ธ ํ™˜๊ฒฝ ๊ตฌ์„ฑ ์ž‘์—…์ด ์š”๊ตฌ**๋œ๋‹ค๋Š” ์ ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2, 3]. ๋˜ํ•œ ๊ทœ์น™ ์œ„๋ฐ˜์„ ์ปค๋ฐ‹์ด๋‚˜ PR ๋‹จ๊ณ„์—์„œ ์—„๊ฒฉํ•˜๊ฒŒ ์ฐจ๋‹จํ•˜๋ฏ€๋กœ [2, 4], ํŒ€ ์ „์ฒด๊ฐ€ ์ด ๊ฐ•์ œ๋œ ๊ทœ์น™(์˜ˆ: FSD ์•„ํ‚คํ…์ฒ˜ ๊ทœ์น™)์„ ๋ช…ํ™•ํžˆ ์ดํ•ดํ•˜๊ณ  ๋”ฐ๋ฅด์ง€ ์•Š์œผ๋ฉด ๊ฐœ๋ฐœ ํ๋ฆ„์— ์ œ์•ฝ์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ์œ ์ถ”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -#### [๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ] -- [[ESLint and Prettier]] - - ์—ฐ๊ฒฐ ์ด์œ : ์ฝ”๋”ฉ ํ‘œ์ค€ ์œ„๋ฐ˜์„ ์ž๋™์œผ๋กœ ์‹๋ณ„ํ•˜๊ณ  ์ˆ˜์ •ํ•˜๋ฉฐ ๊ฑฐ๋ฒ„๋„Œ์Šค ์ž๋™ํ™”๋ฅผ ์ง์ ‘์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ํ•ต์‹ฌ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค [2]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์•„ํ‚คํ…์ฒ˜ ๊ฒฝ๊ณ„(์˜ˆ: ๊ธฐ๋Šฅ ๊ฐ„ ์ž„ํฌํŠธ ๊ธˆ์ง€)๋ฅผ ์Šคํฌ๋ฆฝํŠธ ์ˆ˜์ค€์—์„œ ์–ด๋–ป๊ฒŒ ์ž๋™ํ™”ํ•˜๊ณ  ํ†ต์ œํ•˜๋Š”์ง€ ๊ตฌ์ฒด์ ์ธ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2]. - -- [[Husky]] - - ์—ฐ๊ฒฐ ์ด์œ : ์ฝ”๋“œ ์ปค๋ฐ‹ ์ด์ „์— ๋ฆฐํŒ…, ํฌ๋งทํŒ…, ํƒ€์ž… ๊ฒ€์‚ฌ ๋“ฑ์˜ ๊ฑฐ๋ฒ„๋„Œ์Šค ๊ทœ์น™์„ ๊ฐ•์ œ๋กœ ์‹คํ–‰ํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” Git ํ›…(Hook) ๊ด€๋ฆฌ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค [2]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ž˜๋ชป๋œ ์ฝ”๋“œ๊ฐ€ ์›๊ฒฉ ์ €์žฅ์†Œ์— ๋„๋‹ฌํ•˜๊ธฐ ์ „, ๊ฐœ๋ฐœ์ž์˜ ๋กœ์ปฌ ํ™˜๊ฒฝ์—์„œ ์„ ์ œ์ ์œผ๋กœ ๋ฌธ์ œ๋ฅผ ์ฐจ๋‹จํ•˜๋Š” ํŒŒ์ดํ”„๋ผ์ธ์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2]. - -#### [์•„ํ‚คํ…์ฒ˜/ํ”„๋กœ์„ธ์Šค] -- [[Feature-Sliced Design (FSD)]] - - ์—ฐ๊ฒฐ ์ด์œ : ๋„๊ตฌ๋ฅผ ํ†ตํ•œ ๊ฑฐ๋ฒ„๋„Œ์Šค(Automated Governance)๊ฐ€ ๊ถ๊ทน์ ์œผ๋กœ ์ง€ํ‚ค๊ณ ์ž ํ•˜๋Š” ์—„๊ฒฉํ•œ ๊ณ„์ธต ๊ตฌ์กฐ ๋ฐ ๋ชจ๋“ˆํ™” ๋ฐฉ๋ฒ•๋ก ์ž…๋‹ˆ๋‹ค [2, 5]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์™œ ESLint์™€ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ชจ๋“ˆ ๊ฐ„์˜ ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ๊ทœ์น™์„ ๊ฐ•์ œํ•ด์•ผ๋งŒ ๋Œ€๊ทœ๋ชจ ์‹œ์Šคํ…œ์ด ๋ถ•๊ดดํ•˜์ง€ ์•Š๋Š”์ง€ ๊ตฌ์กฐ์ ์ธ ์ด์œ ๋ฅผ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2, 5]. - -- [[CI/CD ํŒŒ์ดํ”„๋ผ์ธ]] - - ์—ฐ๊ฒฐ ์ด์œ : ์ž๋™ํ™”๋œ ๋ฆฐํŒ…, ํ…Œ์ŠคํŠธ ๋ฐ ๊ฑฐ๋ฒ„๋„Œ์Šค ๊ทœ์น™์ด ํ’€ ๋ฆฌํ€˜์ŠคํŠธ(PR) ๋‹จ๊ณ„์—์„œ ๊ฒ€์ฆ๋˜๋Š” ์ค‘์•™ํ™”๋œ ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค [3, 4]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ฐœ๋ณ„ ๊ฐœ๋ฐœ์ž์˜ ํ™˜๊ฒฝ์„ ๋„˜์–ด, ํŒ€ ๋‹จ์œ„์˜ ํ˜‘์—… ์›Œํฌํ”Œ๋กœ์šฐ์—์„œ ์ฝ”๋“œ ํ’ˆ์งˆ์ด ์–ด๋–ป๊ฒŒ ์ง€์†์ ์œผ๋กœ ์œ ์ง€๋˜๊ณ  ๋ณดํ˜ธ๋˜๋Š”์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3, 4]. - -### Deeper Research Questions -- ESLint ๊ทœ์น™์„ ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ์„ค์ •ํ•ด์•ผ Feature-Sliced Design(FSD)์—์„œ ์š”๊ตฌํ•˜๋Š” ๊ณ„์ธต ๊ฐ„์˜ '๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ'์„ ์ž๋™์œผ๋กœ ๊ฐ•์ œํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? -- ๋กœ์ปฌ ํ™˜๊ฒฝ์—์„œ์˜ Husky ๊ธฐ๋ฐ˜ Pre-commit ํ›…๊ณผ CI/CD ์„œ๋ฒ„์—์„œ์˜ ๊ฒ€์ฆ ํŒŒ์ดํ”„๋ผ์ธ์€ ์–ด๋–ค ๊ธฐ์ค€์œผ๋กœ ์—ญํ• ์„ ๋ถ„๋‹ดํ•˜์—ฌ ํšจ์œจ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋Š”๊ฐ€? -- ์ž๋™ํ™”๋œ ๋ฆฐํŒ…๊ณผ ์—„๊ฒฉํ•œ ๊ฑฐ๋ฒ„๋„Œ์Šค๊ฐ€ ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐ ์†๋„์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ๊ณผ, ์ด๋ฅผ ์ƒ์‡„ํ•˜๊ธฐ ์œ„ํ•œ ์ ์ ˆํ•œ ๋„์ž… ์‹œ์ ์€ ์–ธ์ œ์ธ๊ฐ€? -- ์ฝ”๋”ฉ ํ‘œ์ค€ ์™ธ์—, ์ž๋™ํ™” ๋„๊ตฌ(Storybook visual tests ๋“ฑ)๋ฅผ CI์— ์—ฐ๋™ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์˜คํƒ(Flake/Noise)์„ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? -- ์ƒํƒœ ๊ด€๋ฆฌ(State Management) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ ์‹œ ๋ฐœ์ƒํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜ ์œ„๋ฐ˜(์˜ˆ: ๊ธ€๋กœ๋ฒŒ ์Šคํ† ์–ด์˜ ๋ฌด๋ถ„๋ณ„ํ•œ ์ ‘๊ทผ) ๋˜ํ•œ Automated Governance๋ฅผ ํ†ตํ•ด ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? - -### Practical Application Contexts -- **Implementation:** ํ”„๋กœ์ ํŠธ ์„ค์ • ์‹œ ESLint์™€ Prettier๋ฅผ ์ตœ์šฐ์„ ์œผ๋กœ ๊ตฌ์„ฑํ•˜๊ณ , Husky๋ฅผ ํ™œ์šฉํ•ด `git commit` ๋ช…๋ น์–ด๊ฐ€ ์‹คํ–‰๋  ๋•Œ ์ž๋™์œผ๋กœ ์ฝ”๋“œ ํฌ๋งทํŒ… ๋ฐ ํƒ€์ž… ์—๋Ÿฌ๋ฅผ ๊ฒ€์ถœํ•˜๋„๋ก ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค [2]. -- **System Design:** FSD ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋„์ž…ํ•  ๋•Œ, ๊ฐœ๋ฐœ์ž์˜ ์‹ค์ˆ˜๋กœ ๊ธฐ๋Šฅ(features) ๊ฐ„ ์˜์กด์„ฑ์ด ์—‰ํ‚ค์ง€ ์•Š๋„๋ก ESLint ๋ฃฐ(rule) ์„ค๊ณ„ ์‹œ ๊ฐ ํด๋”์˜ ์ž„ํฌํŠธ ๋ฒ”์œ„๋ฅผ ์ œํ•œํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜ ๋ณดํ˜ธ๋ง์„ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค [2, 5]. -- **Operation / Maintenance:** CI ์„œ๋ฒ„ ์„ค์ •์—์„œ PR ์ƒ์„ฑ ์‹œ Storybook ์Šคํฌ๋ฆฐ์ƒท ํ…Œ์ŠคํŠธ ๋ฐ ์ฝ”๋“œ ๋ฆฐํ„ฐ๋ฅผ ํ†ต๊ณผํ•ด์•ผ๋งŒ Main ๋ธŒ๋žœ์น˜๋กœ ๋ณ‘ํ•ฉ(Merge)ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ƒํƒœ ๊ฒ€์‚ฌ(PR checks)๋ฅผ ์šด์˜ํ•ฉ๋‹ˆ๋‹ค [3, 4]. -- **Learning Path:** ๋‹จ์ˆœํ•œ React ๊ธฐ๋Šฅ ๊ตฌํ˜„์„ ๋„˜์–ด์„œ, ํŒ€ ํ”„๋กœ์ ํŠธ ํ˜‘์—…์„ ์œ„ํ•ด ์ฝ”๋“œ ์ปจ๋ฒค์…˜์„ ๋งž์ถ”๋Š” ๋„๊ตฌ(Linting)์™€ Git ํ›…(Hooks) ์‚ฌ์šฉ๋ฒ•์„ ์ตํžˆ๋Š” ๋‹ค์Œ ๋‹จ๊ณ„ ํ•™์Šต์œผ๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค [2]. -- **My Project Relevance:** ๋‹ค์ˆ˜์˜ ํŒ€์›์ด ๋™์‹œ์— ์ž‘์—…ํ•˜๋Š” ํ™˜๊ฒฝ์ด๊ฑฐ๋‚˜, ์ฝ”๋“œ๊ฐ€ ๋ฐฉ๋Œ€ํ•ด์ง€๋Š” ํ™•์žฅ ๋‹จ๊ณ„(Scalable phase)์—์„œ ๋ฆฌ๋ทฐ์–ด์˜ ์ˆ˜๋™์ ์ธ ํ™•์ธ ๋ถ€๋‹ด์„ ์ค„์ด๊ณ  ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ์ฆ‰๊ฐ์ ์œผ๋กœ ํ”„๋กœ์ ํŠธ์— ๋„์ž…ํ•ด์•ผ ํ•˜๋Š” ํ•„์ˆ˜ ํ™˜๊ฒฝ ์„ธํŒ…์ž…๋‹ˆ๋‹ค [2, 6]. - -### Adjacent Topics -- [[Git Branching Strategies]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ์—„๊ฒฉํ•˜๊ฒŒ ๊ฒ€์ฆ๋œ ์ฝ”๋“œ๋งŒ์ด ํ•ฉ์ณ์ง€๋„๋ก ์ง€์›ํ•˜๋Š” GitHub Flow ๋“ฑ์˜ ๋ธŒ๋žœ์น˜ ์ „๋žต๊ณผ ํ’€ ๋ฆฌํ€˜์ŠคํŠธ(PR) ๋ฌธํ™”์— ๋Œ€ํ•œ ์ดํ•ด๋กœ ๋‚˜์•„๊ฐ‘๋‹ˆ๋‹ค [7, 8]. -- [[React Compiler]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ์ฝ”๋“œ ์Šคํƒ€์ผ๊ณผ ์ž„ํฌํŠธ ๊ทœ์น™์„ ๊ฐ•์ œํ•˜๋Š” 'Governance'๋ฅผ ๋„˜์–ด, ๋ฆฌ๋ Œ๋”๋ง ์ตœ์ ํ™”(Memoization) ์ž์ฒด๋ฅผ ๋นŒ๋“œ ํƒ€์ž„์— ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ '์ž๋™ํ™”'ํ•ด์ฃผ๋Š” ์ตœ์‹  ์„ฑ๋Šฅ ์ž๋™ํ™” ์˜์—ญ์œผ๋กœ ๊ด€์‹ฌ์‚ฌ๋ฅผ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค [9, 10]. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/CI-CD Pipeline Integration.md b/00_Raw/CI-CD Pipeline Integration.md deleted file mode 100644 index 60367a24..00000000 --- a/00_Raw/CI-CD Pipeline Integration.md +++ /dev/null @@ -1,61 +0,0 @@ -# [[CI/CD Pipeline Integration]] - -## ๐Ÿ“Œ Brief ํŒŒSummary -CI/CD ํŒŒ์ดํ”„๋ผ์ธ ํ†ตํ•ฉ์€ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ์ฝ”๋“œ ํ’ˆ์งˆ์„ ์ผ๊ด€๋˜๊ฒŒ ์œ ์ง€ํ•˜๊ณ  ๋ฐฐํฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ž๋™ํ™”ํ•˜๊ธฐ ์œ„ํ•œ ํ•ต์‹ฌ ์ธํ”„๋ผ์ž…๋‹ˆ๋‹ค [1, 2]. ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜์—์„œ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๊ฐ€ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜๋กœ ๋ณ‘ํ•ฉ(Merge)๋˜๊ธฐ ์ „์— ๋ฆฐํŒ…, ํฌ๋งทํŒ…, ํƒ€์ž… ๊ฒ€์‚ฌ ๋ฐ ์ž๋™ํ™”๋œ UI ํšŒ๊ท€ ํ…Œ์ŠคํŠธ ๋“ฑ์˜ ๊ฒ€์‚ฌ๋ฅผ ์˜๋ฌด์ ์œผ๋กœ ํ†ต๊ณผํ•˜๋„๋ก ๊ฐ•์ œํ•ฉ๋‹ˆ๋‹ค [2, 3]. ์ด๋ฅผ ํ†ตํ•ด ์šด์˜์ฒด์ œ ๊ฐ„ ํŒŒ์ผ๋ช… ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„ ๋ฌธ์ œ๋กœ ์ธํ•œ ๋นŒ๋“œ ์‹คํŒจ๋‚˜ ์˜๋„์น˜ ์•Š์€ UI ๊ฒฐํ•จ์ด ํ”„๋กœ๋•์…˜์— ๋ฐฐํฌ๋˜๋Š” ๊ฒƒ์„ ์‚ฌ์ „์— ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค [4, 5]. - -## ๐Ÿ“– Core Content -- **๋นŒ๋“œ ์•ˆ์ •์„ฑ ๋ณด์žฅ ๋ฐ ์—๋Ÿฌ ์˜ˆ๋ฐฉ:** - ํ”„๋ก ํŠธ์—”๋“œ ํ”„๋กœ์ ํŠธ์—์„œ ํŒŒ์ผ๋ช… ๊ทœ์น™(์˜ˆ: ํŒŒ์ผ๋ช…์€ kebab-case, ์ปดํฌ๋„ŒํŠธ๋Š” PascalCase)์„ ์—„๊ฒฉํžˆ ์ง€ํ‚ค์ง€ ์•Š์œผ๋ฉด, ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๋Š” ๋กœ์ปฌ ์šด์˜์ฒด์ œ(Windows, macOS)์—์„œ๋Š” ์ •์ƒ ์ž‘๋™ํ•˜๋”๋ผ๋„ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ์—„๊ฒฉํžˆ ๊ตฌ๋ถ„ํ•˜๋Š” CI/CD ํŒŒ์ดํ”„๋ผ์ธ(์ฃผ๋กœ Linux ํ™˜๊ฒฝ)์—์„œ๋Š” ๋นŒ๋“œ ์‹คํŒจ๋ฅผ ์œ ๋ฐœํ•ฉ๋‹ˆ๋‹ค [3, 4]. ํŒŒ์ดํ”„๋ผ์ธ์€ ์ด๋Ÿฌํ•œ ํ™˜๊ฒฝ ๋ถˆ์ผ์น˜ ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” 1์ฐจ ๋ฐฉ์–ด์„  ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. -- **Pull Request (PR) ์ž๋™ํ™” ๊ฒ€์‚ฌ:** - GitHub Flow์™€ ๊ฐ™์€ ๋ชจ๋˜ ๋ธŒ๋žœ์น˜ ์›Œํฌํ”Œ๋กœ์šฐ์—์„œ CI/CD ํŒŒ์ดํ”„๋ผ์ธ์€ PR์˜ ์ตœ์ข… ํ’ˆ์งˆ ํ†ต์ œ ๊ด€๋ฌธ(Gate) ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค [6]. PR์ด ์—ด๋ฆฌ๋ฉด CI ํŒŒ์ดํ”„๋ผ์ธ์ด ์ž๋™์œผ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋ฉฐ, ๋ชจ๋“  ๊ฒ€์‚ฌ(Checks)๋ฅผ ํ†ต๊ณผํ•˜๊ณ  ๋™๋ฃŒ์˜ ๋ฆฌ๋ทฐ๋ฅผ ๋งˆ์นœ ํ›„์—๋งŒ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜ ๋ณ‘ํ•ฉ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค [2, 7, 8]. -- **์‹œ๊ฐ์  ํšŒ๊ท€ ๋ฐ ์ ‘๊ทผ์„ฑ ํ…Œ์ŠคํŠธ ํ†ตํ•ฉ:** - CI ์›Œํฌํ”Œ๋กœ์šฐ(์˜ˆ: GitHub Actions, GitLab Pipelines ๋“ฑ)์— Chromatic์ด๋‚˜ Happo์™€ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ํ†ตํ•ฉํ•˜์—ฌ ์ž๋™ํ™”๋œ ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ(Visual Regression Testing)์™€ ์ ‘๊ทผ์„ฑ ํ…Œ์ŠคํŠธ(Accessibility Testing)๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5, 9, 10]. ์ฝ”๋“œ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ํŒŒ์ดํ”„๋ผ์ธ ๋‚ด์—์„œ ์‹ค์ œ ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์„ ๋ชจ๋ฐฉํ•˜์—ฌ UI ์ปดํฌ๋„ŒํŠธ์˜ ์Šคํฌ๋ฆฐ์ƒท์„ ์บก์ฒ˜ํ•˜๊ณ , ์ด๋ฅผ ๊ธฐ์กด ๊ธฐ์ค€์ (Baseline)๊ณผ ํ”ฝ์…€ ๋‹จ์œ„๋กœ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค [11, 12]. ๋ ˆ์ด์•„์›ƒ์ด๋‚˜ ์ƒ‰์ƒ์— ์˜๋„์น˜ ์•Š์€ ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ•˜๋ฉด PR์— ์‹คํŒจ ๋ฐฐ์ง€(Badge)๋ฅผ ๋‹ฌ์•„ ์ˆ˜๋™ ๋ฆฌ๋ทฐ๋ฅผ ๊ฐ•์ œํ•ฉ๋‹ˆ๋‹ค [5, 10]. -- **์›Œํฌํ”Œ๋กœ์šฐ ์—ฐ๊ณ„ ๋ฐ ๋ฆด๋ฆฌ์Šค ๋ฐฐํฌ:** - ๋‹จ์ˆœํ•œ ๋ธŒ๋žœ์นญ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ, ๋ฉ”์ธ ๋ธŒ๋žœ์น˜๋Š” ํ•ญ์ƒ ์•ˆ์ •์ ์ด๊ณ  ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [13]. CI/CD๋Š” ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์— ์ฝ”๋“œ๊ฐ€ ๋ณ‘ํ•ฉ๋จ๊ณผ ๋™์‹œ์— ์ž๋™์œผ๋กœ ํ”„๋กœ๋•์…˜์— ๋ฐฐํฌ(Deploy from main)ํ•˜๋„๋ก ์„ค์ •๋˜๋ฉฐ, ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ๊ทœ์น™(Conventional Commits)์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฆด๋ฆฌ์Šค ๋…ธํŠธ๋ฅผ ์ž๋™ํ™”ํ•˜๋Š” ๋ฐ์—๋„ ํ™œ์šฉ๋ฉ๋‹ˆ๋‹ค [6, 14]. - -## โš–๏ธ Trade-offs & Caveats -**์†Œ์Šค์— ๊ด€๋ จ ์ •๋ณด๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค.** (์ œ๊ณต๋œ ์†Œ์Šค์—๋Š” CI/CD ํŒŒ์ดํ”„๋ผ์ธ ์ž์ฒด์˜ ์•„ํ‚คํ…์ฒ˜์  ๋‹จ์ ์ด๋‚˜ ๊ตฌ์ถ• ๋น„์šฉ ๋“ฑ์— ๋Œ€ํ•œ ์‹ฌ์ธต์ ์ธ ๋…ผ์˜๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.) -๋‹ค๋งŒ, ํŒŒ์ดํ”„๋ผ์ธ์— ํ†ตํ•ฉ๋œ ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ(Visual Testing) ๊ธฐ๋Šฅ๊ณผ ๊ด€๋ จํ•˜์—ฌ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ธฐ์ˆ ์  ์ œ์•ฝ ๋ฐ ๊ด€๋ฆฌ ์š”์†Œ๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค: -- **Flaky Tests ๋ฐ ์˜คํƒ(False Positives):** UI ํ…Œ์ŠคํŠธ ํŠน์„ฑ์ƒ ์• ๋‹ˆ๋ฉ”์ด์…˜, ๋น„๋™๊ธฐ ์—์…‹ ๋กœ๋”ฉ ๋“ฑ์œผ๋กœ ์ธํ•ด ๋ถˆ์•ˆ์ •ํ•œ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [9, 15]. -- **๋…ธ์ด์ฆˆ ๊ด€๋ฆฌ ํ•„์š”:** ์ด๋ฏธ์ง€ ์••์ถ• ๋…ธ์ด์ฆˆ๋‚˜ ๋ธŒ๋ผ์šฐ์ € ์•ˆํ‹ฐ์•จ๋ฆฌ์–ด์‹ฑ ์ฐจ์ด ๋“ฑ ์˜๋„์น˜ ์•Š์€ ๋ฏธ์„ธํ•œ ์ฐจ์ด๋กœ ์ธํ•ด CI๊ฐ€ ์‹คํŒจํ•˜๋Š” ๊ฒƒ์„ ๋ง‰๊ธฐ ์œ„ํ•ด, ์ƒ‰์ƒ ํ—ˆ์šฉ ์˜ค์ฐจ(color-delta tolerance)๋ฅผ ์ ์ ˆํžˆ ์„ค์ •ํ•ด์•ผ๋งŒ ํŒŒ์ดํ”„๋ผ์ธ์ด ์ค‘๋‹จ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [9, 16]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -#### [๊ด€๊ณ„ ์œ ํ˜• A: ๊ฐœ๋ฐœ ์›Œํฌํ”Œ๋กœ์šฐ ๋ฐ ํ˜•์ƒ ๊ด€๋ฆฌ] -- [[Git Branching Strategies]] - - ์—ฐ๊ฒฐ ์ด์œ : CI/CD ํ†ตํ•ฉ์€ ํŒ€์˜ ๋ธŒ๋žœ์นญ ์ „๋žต(ํŠนํžˆ Trunk-based ๋˜๋Š” GitHub Flow)๊ณผ ๋งž๋ฌผ๋ ค ์ž‘๋™ํ•˜๋ฉฐ, ์งง์€ ์ฃผ๊ธฐ์˜ ๋ธŒ๋žœ์น˜๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ๋ณ‘ํ•ฉ๋  ๋•Œ๋งˆ๋‹ค ์ฝ”๋“œ๋ฅผ ๊ฒ€์ฆํ•˜๋Š” ๊ธฐ๋ฐ˜์ด ๋ฉ๋‹ˆ๋‹ค [13, 14]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: CI/CD ํŒŒ์ดํ”„๋ผ์ธ์ด ๋ฉ”์ธ ๋ธŒ๋žœ์น˜ ๋ณดํ˜ธ(Branch protection) ๋ฐ ๋ฐฐํฌ ์ž๋™ํ™”์— ์–ด๋–ป๊ฒŒ ๊ธฐ์—ฌํ•˜๋Š”์ง€ ์›Œํฌํ”Œ๋กœ์šฐ ๊ด€์ ์—์„œ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2, 17]. - -#### [๊ด€๊ณ„ ์œ ํ˜• B: ํ’ˆ์งˆ ๋ณด์ฆ ๋ฐ ์ž๋™ํ™” ๋„๊ตฌ] -- [[Visual Regression Testing]] - - ์—ฐ๊ฒฐ ์ด์œ : CI/CD ํŒŒ์ดํ”„๋ผ์ธ ๋‚ด๋ถ€์—์„œ UI ๋ฒ„๊ทธ๊ฐ€ ํ”„๋กœ๋•์…˜์— ๋„๋‹ฌํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์Šคํ† ๋ฆฌ๋ถ(Storybook)๊ณผ ํ•จ๊ป˜ ์ž๋™์œผ๋กœ ์‹คํ–‰๋˜๋Š” ํ•ต์‹ฌ ํ…Œ์ŠคํŠธ ํ”„๋กœ์„ธ์Šค์ž…๋‹ˆ๋‹ค [5, 18]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํŒŒ์ดํ”„๋ผ์ธ์ด ๋‹จ์ˆœํžˆ ์ฝ”๋“œ ์—๋Ÿฌ๋งŒ ์žก๋Š” ๊ฒƒ์„ ๋„˜์–ด ํ”ฝ์…€ ๋‹จ์œ„์˜ UI ๋ ˆ์ด์•„์›ƒ, ๋ฐ˜์‘ํ˜• ๋””์ž์ธ, ์ ‘๊ทผ์„ฑ(A11y)๊นŒ์ง€ ์–ด๋–ป๊ฒŒ ๊ฒ€์ฆํ•˜๋Š”์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [11, 18]. - -#### [๊ด€๊ณ„ ์œ ํ˜• C: ์ฝ”๋“œ ์ปจ๋ฒค์…˜ ๋ฐ ์ •์  ๋ถ„์„] -- [[Linting and Governance]] - - ์—ฐ๊ฒฐ ์ด์œ : CI/CD ํ™˜๊ฒฝ์ด๋‚˜ ๊ทธ ์ด์ „(Git Hook ๋‹จ๊ณ„)์— Husky, ESLint, Prettier ๋“ฑ์„ ํ†ตํ•ด ์•„ํ‚คํ…์ฒ˜ ๊ทœ์น™(์˜ˆ: Feature ๊ฐ„ ์ž˜๋ชป๋œ ์ž„ํฌํŠธ)๊ณผ ๋ช…๋ช… ๊ทœ์น™์„ ๊ฐ•์ œ๋กœ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค [3, 19]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ž๋™ํ™”๋œ ํŒŒ์ดํ”„๋ผ์ธ์ด ๊ฐœ๋ฐœ์ž์˜ ์ˆ˜๋™ ๋ฆฌ๋ทฐ ๋ถ€๋‹ด์„ ์ค„์ด๊ณ  ํ”„๋กœ์ ํŠธ์˜ ๊ฑฐ๋ฒ„๋„Œ์Šค๋ฅผ ์‹œ์Šคํ…œ์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ์œ ์ง€ํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3]. - -### Deeper Research Questions -- ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๋Š” ๊ฐœ๋ฐœ์ž์˜ ๋กœ์ปฌ OS ํ™˜๊ฒฝ๊ณผ ์—„๊ฒฉํ•˜๊ฒŒ ๊ตฌ๋ถ„ํ•˜๋Š” CI/CD ๋ฆฌ๋ˆ…์Šค ์„œ๋ฒ„ ํ™˜๊ฒฝ ๊ฐ„์˜ ๋นŒ๋“œ ์‹คํŒจ(Build Failure) ๊ฒฉ์ฐจ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ํŒŒ์ดํ”„๋ผ์ธ ์„ค์ • ๊ธฐ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? -- CI/CD ํ™˜๊ฒฝ์—์„œ Chromatic์ด๋‚˜ Happo๋ฅผ ํ™œ์šฉํ•œ ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ ์ˆ˜ํ–‰ ์‹œ ๋ฐœ์ƒํ•˜๋Š” ์†๋„ ์ €ํ•˜๋ฅผ ์ตœ์†Œํ™”ํ•˜๊ณ , ๋‹ค์ค‘ ๋ธŒ๋ผ์šฐ์ € ๋ณ‘๋ ฌ ํ…Œ์ŠคํŠธ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ตฌ์„ฑํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜๋Š” ๋ฌด์—‡์ธ๊ฐ€? -- ๋Œ€๊ทœ๋ชจ React ํ”„๋กœ์ ํŠธ์—์„œ Feature-Sliced Design(FSD) ์›์น™์„ ๋„์ž…ํ–ˆ์„ ๋•Œ, CI ํŒŒ์ดํ”„๋ผ์ธ์˜ ESLint ๋ฃฐ(Rule) ์„ค์ •์„ ํ†ตํ•ด ์ปดํฌ๋„ŒํŠธ ๊ฐ„์˜ ์ž˜๋ชป๋œ ์˜์กด์„ฑ(Coupling)์„ ์–ด๋–ป๊ฒŒ ์ž๋™ ์ฐจ๋‹จํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? -- ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ๊ทœ์•ฝ(Conventional Commits)์„ ํ†ตํ•ด CI/CD ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ์‹œ๋งจํ‹ฑ ๋ฒ„์ €๋‹(Semantic Versioning)๊ณผ ๋ฆด๋ฆฌ์Šค ๋…ธํŠธ๋ฅผ ์™„์ „ํžˆ ์ž๋™ํ™”ํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ์›Œํฌํ”Œ๋กœ์šฐ ๊ตฌ์„ฑ ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? - -### Practical Application Contexts -- **Implementation:** GitHub Actions, GitLab Pipelines, CircleCI ๋“ฑ์˜ CI ์ œ๊ณต ํ™˜๊ฒฝ์— Happo ๋˜๋Š” Chromatic์„ ์—ฐ๋™ํ•˜๋Š” ์Šคํ…์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์ธ์ฆ์„ ์œ„ํ•œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜(Project Token)๋ฅผ ๊ตฌ์„ฑํ•˜์—ฌ ์‹œ๊ฐ์  ๊ฒ€์ฆ์„ ์ž๋™ํ™”ํ•ฉ๋‹ˆ๋‹ค [10]. -- **System Design:** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ `main` ๋ธŒ๋žœ์น˜๋ฅผ ๋ณดํ˜ธ(Protected Branch) ์ƒํƒœ๋กœ ์„ค์ •ํ•˜๊ณ , 1๋ช… ์ด์ƒ์˜ ๋™๋ฃŒ ๋ฆฌ๋ทฐ์™€ CI ํ…Œ์ŠคํŠธ(๋ฆฐํŒ…, ๋‹จ์œ„ ํ…Œ์ŠคํŠธ, ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ)๋ฅผ ํ†ต๊ณผํ•ด์•ผ๋งŒ ๋ณ‘ํ•ฉ(Merge)์ด ๊ฐ€๋Šฅํ•œ ๊ฐ•์ œ์  ์‹œ์Šคํ…œ(Gate)์„ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค [2, 17]. -- **Operation / Maintenance:** CI ๊ณผ์ •์—์„œ UI ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๊ฐ์ง€๋˜๋ฉด ๋ฆฌ๋ทฐ์–ด๊ฐ€ ๋ณ€๊ฒฝ ๋‚ด์šฉ์„ ํ™•์ธํ•˜๊ณ , ์˜๋„๋œ ๋ณ€๊ฒฝ์ผ ๊ฒฝ์šฐ ๋กœ์ปฌ์ด๋‚˜ CI ๋Œ€์‹œ๋ณด๋“œ์—์„œ ์ƒˆ๋กœ์šด ๋ฒ ์ด์Šค๋ผ์ธ(Baseline)์œผ๋กœ ์Šน์ธ(Accept)ํ•˜์—ฌ ํ…Œ์ŠคํŠธ ๊ธฐ์ค€์„ ๊ฐฑ์‹ ํ•ฉ๋‹ˆ๋‹ค [20, 21]. -- **Learning Path:** React ์ปดํฌ๋„ŒํŠธ ๋ฐ ๋กœ์ปฌ ์ƒํƒœ ๊ฐœ๋ฐœ โž” ์ •์  ๋ถ„์„ ๋„๊ตฌ(ESLint) ๋ฐ Git Hooks(Husky) ์ ์šฉ โž” ๋ธŒ๋žœ์น˜ ๊ด€๋ฆฌ ์ „๋žต ๋„์ž… โž” **CI/CD ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ• ๋ฐ Storybook UI ํ…Œ์ŠคํŠธ ์—ฐ๋™** โž” ํ”„๋กœ๋•์…˜ ์ž๋™ ๋ฐฐํฌ. -- **My Project Relevance:** ํŒ€ ๋‹จ์œ„ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•  ๋•Œ ๊ฐ์ž์˜ ํ™˜๊ฒฝ ์ฐจ์ด๋กœ ์ธํ•œ ๋นŒ๋“œ ์—๋Ÿฌ๋ฅผ ๋ง‰๊ณ , ๋ณต์žกํ•œ ๋กœ์ง ๋ฐ UI๊ฐ€ ํฌํ•จ๋œ ์ฝ”๋“œ๊ฐ€ ์ˆ˜๋™ ํ™•์ธ์˜ ํ•œ๊ณ„๋กœ ์ธํ•ด ๋ฒ„๊ทธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๊ฒƒ์„ ๋ฏธ์—ฐ์— ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ฆ‰์‹œ ์„ค์ •ํ•ด์•ผ ํ•  ํ•ต์‹ฌ ๊ฐœ๋ฐœ ์ธํ”„๋ผ์ž…๋‹ˆ๋‹ค. - -### Adjacent Topics -- [[Storybook]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: CI ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ๋ Œ๋”๋งํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•  UI ์ปดํฌ๋„ŒํŠธ๋“ค์„ ๊ฒฉ๋ฆฌ๋œ ํ™˜๊ฒฝ์—์„œ ๋ฌธ์„œํ™”ํ•˜๊ณ  ์ธํ„ฐ๋ž™์…˜์„ ์ •์˜ํ•˜๋Š” ๊ธฐ๋ฐ˜ ๋„๊ตฌ๋กœ์„œ์˜ ํ™œ์šฉ๋ฒ• ํƒ๊ตฌ [12, 22]. -- [[Husky & Git Hooks]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ์›๊ฒฉ CI ํŒŒ์ดํ”„๋ผ์ธ์— ์ฝ”๋“œ๊ฐ€ ๋„๋‹ฌํ•˜๊ธฐ ์ „, ๊ฐœ๋ฐœ์ž์˜ ๋กœ์ปฌ ํ™˜๊ฒฝ์—์„œ ์ปค๋ฐ‹์„ ์‹œ๋„ํ•˜๋Š” ์‹œ์ ์— ๋ฏธ๋ฆฌ ์ฝ”๋“œ ํ’ˆ์งˆ ๊ฒ€์ฆ(Linting/Formatting)์„ ๊ฐ•์ œํ•˜๋Š” ๋ฐฉ๋ฒ• ํƒ๊ตฌ [3]. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Chrome DevTools.md b/00_Raw/Chrome DevTools.md deleted file mode 100644 index 46995bbb..00000000 --- a/00_Raw/Chrome DevTools.md +++ /dev/null @@ -1,65 +0,0 @@ -# [[Chrome DevTools]] - -## ๐Ÿ“Œ Brief Summary -Chrome DevTools๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ๋””๋ฒ„๊น…ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š” ๋ธŒ๋ผ์šฐ์ € ๋‚ด์žฅ ๋„๊ตฌ ์„ธํŠธ์ด๋‹ค [1, 2]. ์„ฑ๋Šฅ ํŒจ๋„, ๋ฉ”๋ชจ๋ฆฌ ํŒจ๋„, ์ž‘์—… ๊ด€๋ฆฌ์ž(Task Manager) ๋“ฑ์„ ํ†ตํ•ด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜(Memory leak), ๋ฉ”๋ชจ๋ฆฌ ํŒฝ์ฐฝ(Memory bloat), ์žฆ์€ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜(Garbage collection)๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ์‹œ๊ฐํ™”ํ•˜๊ณ  ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋‹ค [3]. ์ด ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ JavaScript ์‹คํ–‰ ์‹œ๊ฐ„, ํ”„๋ ˆ์ž„ ๋ Œ๋”๋ง, DOM ๋…ธ๋“œ ์ƒํƒœ ๋“ฑ์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ถ„์„ํ•จ์œผ๋กœ์จ ์ตœ์ ํ™”๋œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค [4]. - -## ๐Ÿ“– Core Content -Chrome DevTools๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ฌธ์ œ ๋ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ฑ๋Šฅ์„ ์ง„๋‹จํ•˜๋Š” ๋ฐ ๋‹ค์–‘ํ•œ ๋„๊ตฌ์™€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค. - -* **Chrome ์ž‘์—… ๊ด€๋ฆฌ์ž (Task Manager):** ์‹ค์‹œ๊ฐ„์œผ๋กœ ํŽ˜์ด์ง€์˜ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์‹œ์ž‘์ ์ด๋‹ค [5]. 'Memory footprint' ์—ด์€ DOM ๋…ธ๋“œ๊ฐ€ ์ €์žฅ๋˜๋Š” OS ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ์ด ์ˆ˜์น˜๊ฐ€ ์ฆ๊ฐ€ํ•˜๋ฉด DOM ๋…ธ๋“œ๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ์žˆ์Œ์„ ๋œปํ•œ๋‹ค [6]. 'JavaScript Memory' ์—ด์˜ ๊ด„ํ˜ธ ์•ˆ ๋ผ์ด๋ธŒ ์ˆซ์ž๋Š” ๋„๋‹ฌ ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” JS ํž™ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ, ์ด ์ˆ˜์น˜๊ฐ€ ์ฆ๊ฐ€ํ•˜๋ฉด ์ƒˆ๋กœ์šด ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๊ฑฐ๋‚˜ ๊ธฐ์กด ๊ฐ์ฒด๊ฐ€ ์ปค์ง€๊ณ  ์žˆ์Œ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค [6]. -* **์„ฑ๋Šฅ ํŒจ๋„ (Performance Panel):** ์‹œ๊ฐ„ ๊ฒฝ๊ณผ์— ๋”ฐ๋ฅธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ๋ฐ ๋ Œ๋”๋ง ๋™์ž‘์„ ์‹œ๊ฐํ™”ํ•œ๋‹ค [7]. JS ํž™, ๋ฌธ์„œ, DOM ๋…ธ๋“œ, ๋ฆฌ์Šค๋„ˆ, GPU ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ๊ทธ๋ž˜ํ”„๋กœ ํ‘œ์‹œํ•˜๋ฉฐ, ๊ฐ•์ œ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ๋ฒ„ํŠผ์„ ํ†ตํ•ด ๋ฒ ์ด์Šค๋ผ์ธ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค [8, 9]. ๋˜ํ•œ JS ์‹คํ–‰ ์‹œ๊ฐ„, ํ”„๋ ˆ์ž„ ๋ Œ๋”๋ง, ํŽ˜์ธํŠธ ๋ฐ ๋ ˆ์ด์•„์›ƒ ์ด๋™ ๋“ฑ์„ ์ถ”์ ํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ Œ๋”๋ง ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค [4, 10]. -* **๋ฉ”๋ชจ๋ฆฌ ํŒจ๋„ (Memory Panel):** - * **ํž™ ์Šค๋ƒ…์ƒท (Heap Snapshots):** ํŠน์ • ์‹œ์ ์— ํŽ˜์ด์ง€์˜ JS ๊ฐ์ฒด์™€ DOM ๋…ธ๋“œ ๊ฐ„์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ถ„ํฌ๋ฅผ ๋ณด์—ฌ์ค€๋‹ค [11]. ํŠนํžˆ JavaScript ์ฝ”๋“œ์—์„œ ์—ฌ์ „ํžˆ ์ฐธ์กฐํ•˜๊ณ  ์žˆ์–ด ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์ด ๋˜์ง€ ์•Š๋Š” ๋ถ„๋ฆฌ๋œ DOM ๋…ธ๋“œ(Detached DOM nodes)๋ฅผ ์ฐพ๋Š” ๋ฐ ํšจ๊ณผ์ ์ด๋‹ค [12, 13]. ์—ฌ๋Ÿฌ ์Šค๋ƒ…์ƒท์„ ๋น„๊ต(Comparison ๋ทฐ)ํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ๊ณ„์† ์ฆ๊ฐ€ํ•˜๋Š” ๊ฐ์ฒด(Delta ๊ฐ’์ด ์–‘์ˆ˜์ธ ๊ฐ์ฒด)๋ฅผ ์ฐพ์•„ ๋ˆ„์ˆ˜๋ฅผ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋‹ค [14]. - * **ํ• ๋‹น ํƒ€์ž„๋ผ์ธ (Allocation Timelines / Instrumentation on timeline):** JS ํž™์— ์ƒˆ๋กœ์šด ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ• ๋‹น๋˜๋Š” ์‹œ์ ์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ถ”์ ํ•œ๋‹ค [15, 16]. ํŒŒ๋ž€์ƒ‰ ๋ง‰๋Œ€๋Š” ์ƒˆ๋กœ์šด ํ• ๋‹น์„ ์˜๋ฏธํ•˜๋ฉฐ, ํšŒ์ƒ‰์œผ๋กœ ๋ณ€ํ•˜์ง€ ์•Š๊ณ  ๋‚จ์•„ ์žˆ๋Š” ํŒŒ๋ž€์ƒ‰ ๋ง‰๋Œ€๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ๊ณ„์† ๋‚จ์•„ ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ๋‚˜ํƒ€๋‚ด์–ด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ํ›„๋ณด๋ฅผ ํŠน์ •ํ•  ์ˆ˜ ์žˆ๋‹ค [16, 17]. - * **ํ• ๋‹น ์ƒ˜ํ”Œ๋ง (Allocation sampling):** JavaScript ํ•จ์ˆ˜๋ณ„๋กœ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์–ด๋–ป๊ฒŒ ํ• ๋‹น๋˜์—ˆ๋Š”์ง€ ๋ถ„์„ํ•˜๋ฉฐ, ๊ฐ€์žฅ ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•œ ํ•จ์ˆ˜๋ฅผ ์ƒ๋‹จ์— ํ‘œ์‹œํ•œ๋‹ค [18]. -* **์„œ๋ฒ„์‚ฌ์ด๋“œ ๋””๋ฒ„๊น…:** Node.js ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฒฝ์šฐ `chrome://inspect`๋ฅผ ํ†ตํ•ด V8 ์ธ์ŠคํŽ™ํ„ฐ ํ”„๋กœํ† ์ฝœ์— ์—ฐ๊ฒฐํ•˜์—ฌ, ์„œ๋ฒ„์‚ฌ์ด๋“œ ์ฝ”๋“œ์—์„œ๋„ ํด๋ผ์ด์–ธํŠธ์™€ ๋™์ผํ•œ Chrome DevTools ๋ฉ”๋ชจ๋ฆฌ ํ”„๋กœํŒŒ์ผ๋ง ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค [19]. - -## โš–๏ธ Trade-offs & Caveats -Chrome DevTools์˜ ํž™ ์Šค๋ƒ…์ƒท ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ๋•Œ, ์Šค๋ƒ…์ƒท์„ ์บก์ฒ˜ํ•˜๊ณ  ์ฒ˜๋ฆฌ ๋ฐ ๋กœ๋“œํ•˜๋Š” ๋ฐ ์ผ์ • ์‹œ๊ฐ„์ด ์†Œ์š”๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ์„ฑ๋Šฅ์  ์ œ์•ฝ์ด ์žˆ๋‹ค [11]. ๊ทธ ์™ธ Chrome DevTools์˜ ์‚ฌ์šฉ์— ๋”ฐ๋ฅธ ์ง์ ‘์ ์ธ ๋ถ€์ž‘์šฉ์ด๋‚˜ ๊ธฐ์ˆ ์  ์„ ํƒ์˜ ๋ฐ˜๋Œ€ ๊ธ‰๋ถ€์— ๋Œ€ํ•ด์„œ๋Š” ์†Œ์Šค์— ๊ด€๋ จ ์ •๋ณด๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -#### [์„ฑ๋Šฅ ๋ถ„์„ ๋ฐ ์ตœ์ ํ™”] -- [[Memory Leak]] - - ์—ฐ๊ฒฐ ์ด์œ : Chrome DevTools์˜ ํ•ต์‹ฌ ํ™œ์šฉ ๋ชฉ์  ์ค‘ ํ•˜๋‚˜๋Š” ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ๊ณ„์† ์ฆ๊ฐ€ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ํ˜„์ƒ์„ ์ง„๋‹จํ•˜๊ณ  ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์ด๋‹ค [3, 20]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํž™ ์Šค๋ƒ…์ƒท ๊ฐ„์˜ ๊ฐ์ฒด Delta ๊ฐ’ ๋น„๊ต๋‚˜ ํƒ€์ž„๋ผ์ธ์˜ ํŒŒ๋ž€์ƒ‰ ๋ง‰๋Œ€ ๋ถ„์„์„ ํ†ตํ•ด ์–ด๋–ป๊ฒŒ ๋ˆ„์ˆ˜ ๊ฐ์ฒด๋ฅผ ์‹๋ณ„ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค [14, 16]. - -- [[Garbage Collection]] - - ์—ฐ๊ฒฐ ์ด์œ : ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ถˆํ•„์š”ํ•œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํšŒ์ˆ˜ํ•˜๋Š” ๊ณผ์ •์ด๋ฉฐ, ์ด ์ž‘์—…์ด ๋„ˆ๋ฌด ์ž์ฃผ ๋ฐœ์ƒํ•˜๋ฉด ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰์ด ์ผ์‹œ ์ค‘์ง€๋˜์–ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ง€์—ฐ ํ˜„์ƒ์ด ๋ฐœ์ƒํ•œ๋‹ค [3, 20]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: DevTools์—์„œ ์„ฑ๋Šฅ ๊ธฐ๋ก ์‹œ์ž‘ ์ „ํ›„๋กœ ๊ฐ•์ œ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์„ ์‹คํ–‰ํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ๋ณ€ํ™”๋Ÿ‰์„ ์ •ํ™•ํžˆ ์ธก์ •ํ•˜๊ณ (๋ฒ ์ด์Šค๋ผ์ธ ์„ค์ •), ๋ถˆํ•„์š”ํ•œ ๊ฐ์ฒด๊ฐ€ ์ œ๋Œ€๋กœ ์ˆ˜๊ฑฐ๋˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋งฅ๋ฝ์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค [8, 14]. - -#### [๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ๋ฐ ์ƒํƒœ ๊ด€๋ฆฌ] -- [[Detached DOM Nodes]] - - ์—ฐ๊ฒฐ ์ด์œ : DOM ํŠธ๋ฆฌ์—์„œ๋Š” ์ œ๊ฑฐ๋˜์—ˆ์œผ๋‚˜ JavaScript๊ฐ€ ์—ฌ์ „ํžˆ ์ฐธ์กฐ๋ฅผ ์œ ์ง€ํ•˜๊ณ  ์žˆ์–ด ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜๋˜์ง€ ๋ชปํ•˜๋Š” ๋…ธ๋“œ๋“ค๋กœ, React์™€ ๊ฐ™์€ ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜ UI์—์„œ ๋ฐœ์ƒํ•˜๋Š” ํ”ํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ์›์ธ์ด๋‹ค [12, 13]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํž™ ์Šค๋ƒ…์ƒท์—์„œ "Detached"๋ฅผ ํ•„ํ„ฐ๋งํ•˜๊ณ  ์œ ์ง€ ๊ฒฝ๋กœ(Retainer paths)๋ฅผ ์ถ”์ ํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค [11, 21]. - -#### [๊ด€๋ จ ๋””๋ฒ„๊น… ๋„๊ตฌ] -- [[React Profiler]] - - ์—ฐ๊ฒฐ ์ด์œ : Chrome DevTools ์„ฑ๋Šฅ ํŒจ๋„๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜์–ด, ์–ด๋–ค ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ธ์ œ ๋ Œ๋”๋ง๋˜์—ˆ๊ณ  ๋ Œ๋”๋ง์— ์–ผ๋งˆ๋‚˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ๋Š”์ง€๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋„๊ตฌ์ด๋‹ค [22, 23]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ธŒ๋ผ์šฐ์ € ์ˆ˜์ค€์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ฐ ๋ Œ๋”๋ง ์„ฑ๋Šฅ ๋ถ„์„(Chrome DevTools)๊ณผ React ํ”„๋ ˆ์ž„์›Œํฌ ์ˆ˜์ค€์˜ ๋ Œ๋”๋ง ๋ณ‘๋ชฉ ํ˜„์ƒ ๋ถ„์„(React Profiler)์„ ์–ด๋–ป๊ฒŒ ๊ฒฐํ•ฉํ•˜์—ฌ ์ตœ์ ํ™”์— ์ ์šฉํ•˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค [4, 23]. - -### Deeper Research Questions - -- ์žฆ์€ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜(Garbage Collection) ํ˜„์ƒ์ด ๋ฐœ์ƒํ•˜์—ฌ UI๊ฐ€ ๋Š๊ธธ ๋•Œ, Chrome DevTools์˜ ํ• ๋‹น ํƒ€์ž„๋ผ์ธ(Allocation Timeline)์„ ํ™œ์šฉํ•˜์—ฌ ์›์ธ์ด ๋˜๋Š” ํ•จ์ˆ˜์˜ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ํŒจํ„ด์„ ์–ด๋–ป๊ฒŒ ๊ตฌ์ฒด์ ์œผ๋กœ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? -- ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ Node.js ๋ฐฑ์—”๋“œ ํ™˜๊ฒฝ์—์„œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ์˜์‹ฌ๋  ๋•Œ, `chrome://inspect`๋ฅผ ํ™œ์šฉํ•œ V8 ์ธ์ŠคํŽ™ํ„ฐ ํ”„๋กœํ† ์ฝœ ๋ถ„์„์€ ๊ธฐ์กด ๋ธŒ๋ผ์šฐ์ € ๋””๋ฒ„๊น…๊ณผ ์–ด๋–ค ์‹ค๋ฌด์ ์ธ ์ฐจ์ด์ ๊ณผ ํ•œ๊ณ„๋ฅผ ๊ฐ€์ง€๋Š”๊ฐ€? -- ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ณด์œ  ๊ธฐ๊ธฐ์˜ ๋ฉ”๋ชจ๋ฆฌ ํ•œ๊ณ„๋ฅผ ์ดˆ๊ณผํ•˜์—ฌ ์ผ๊ด€๋˜๊ฒŒ ๋А๋ ค์ง€๋Š” '๋ฉ”๋ชจ๋ฆฌ ํŒฝ์ฐฝ(Memory Bloat)'๊ณผ ๊ณ„์†ํ•ด์„œ ์‚ฌ์šฉ๋Ÿ‰์ด ์ฆ๊ฐ€ํ•˜๋Š” '๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜(Memory Leak)'๋ฅผ Chrome ์ž‘์—… ๊ด€๋ฆฌ์ž์™€ ํž™ ์Šค๋ƒ…์ƒท์œผ๋กœ ์ •ํ™•ํ•˜๊ฒŒ ๊ตฌ๋ถ„ํ•˜๋Š” ๊ธฐ์ค€์€ ๋ฌด์—‡์ธ๊ฐ€? -- Detached DOM ๋…ธ๋“œ๋‚˜ ํด๋กœ์ €(Closure)์— ์˜ํ•œ ์œ ์ง€ ์ฐธ์กฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ, ํž™ ์Šค๋ƒ…์ƒท์˜ ์œ ์ง€ ๊ฒฝ๋กœ(Retainer paths) ํŒจ๋„์„ ๋ถ„์„ํ•˜์—ฌ ๊ฐ€์žฅ ํšจ์œจ์ ์œผ๋กœ ์ฐธ์กฐ ๊ณ ๋ฆฌ๋ฅผ ๋Š์–ด๋‚ด๋Š” ์•„ํ‚คํ…์ฒ˜ ๊ฐœ์„  ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? -- Chrome DevTools์˜ ์„ฑ๋Šฅ ํŒจ๋„์„ ํ†ตํ•ด ์ˆ˜์ง‘ํ•œ ๋ Œ๋”๋ง ์‹œ๊ฐ„, ํ”„๋ ˆ์ž„ ๋“œ๋กญ ๋“ฑ์˜ ๋ฐ์ดํ„ฐ์™€ React Profiler์˜ ๊ฒฐ๊ณผ๋ฅผ ๋งคํ•‘ํ•˜์—ฌ ๋ณต์žกํ•œ ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ์˜ ๋ Œ๋”๋ง ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ์ •ํ™•ํžˆ ์งš์–ด๋‚ด๋Š” ๋ฐฉ๋ฒ•๋ก ์€ ๋ฌด์—‡์ธ๊ฐ€? - -### Practical Application Contexts - -- **Implementation:** ๊ฐœ๋ฐœ ์ค‘์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ด๋ฒคํŠธ ๋ฆญ(Event leak)์ด๋‚˜ ๋ฐ์ดํ„ฐ ์ž”์กด ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ํ• ๋‹น ํƒ€์ž„๋ผ์ธ ๊ธฐ๋ก ๊ธฐ๋Šฅ์„ ์ผœ๊ณ  ์‚ฌ์šฉ์ž ์ƒํ˜ธ์ž‘์šฉ ํ›„ ๊ฐ•์ œ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์„ ์‹คํ–‰ํ•ด๋ณด๋Š” ๊ณผ์ •์—์„œ ์‚ฌ์šฉ๋œ๋‹ค. -- **System Design:** ์ปดํฌ๋„ŒํŠธ ๋งˆ์šดํŠธ ํ•ด์ œ ์‹œ ์ œ๊ฑฐ๋˜์ง€ ์•Š์€ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ(Event listener)๋‚˜ ํด๋กœ์ €๋กœ ์ธํ•ด ๋ฉ”๋ชจ๋ฆฌ์— ๊ฐ์ฒด๊ฐ€ ๋‚จ์ง€ ์•Š๋„๋ก, ํ”„๋ ˆ์ž„์›Œํฌ ๋ผ์ดํ”„์‚ฌ์ดํด(์˜ˆ: React์˜ useEffect cleanup) ์„ค๊ณ„๋ฅผ ๊ฐ•์ œํ•˜๋Š” ์ง€ํ‘œ๋กœ ํ™œ์šฉ๋œ๋‹ค. -- **Operation / Maintenance:** ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ์žฅ์‹œ๊ฐ„ ์‚ฌ์šฉ ์‹œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋А๋ ค์ง€๊ฑฐ๋‚˜ ํฌ๋ž˜์‹œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋Š” ์‚ฌ์šฉ์ž ์ œ๋ณด๋ฅผ ๋ฐ›์•˜์„ ๋•Œ, ํž™ ์Šค๋ƒ…์ƒท์„ ์บก์ฒ˜ ๋ฐ ๋น„๊ตํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ์ง„๋‹จํ•˜๊ณ  ์‚ฌํ›„ ๋””๋ฒ„๊น…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ํ•„์ˆ˜์ ์œผ๋กœ ์ ์šฉ๋œ๋‹ค. -- **Learning Path:** ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๊ฐ€ JavaScript์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜๊ณผ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ์›๋ฆฌ๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ์ดํ•ดํ•˜๊ณ , ์„ฑ๋Šฅ ์ตœ์ ํ™”์˜ ๊ธฐ๋ณธ๊ธฐ๋ฅผ ๋‹ค์ง€๊ธฐ ์œ„ํ•œ ํ•ต์‹ฌ ํ•™์Šต ๋„๊ตฌ๋กœ ํ™œ์šฉ๋œ๋‹ค. -- **My Project Relevance:** ํ˜„์žฌ ์œ ์ง€๋ณด์ˆ˜ ์ค‘์ธ ํ”„๋กœ์ ํŠธ๋‚˜ ์ƒˆ๋กœ ๊ตฌ์ถ•ํ•˜๋Š” ํ”„๋ก ํŠธ์—”๋“œ ์‹œ์Šคํ…œ์—์„œ, ๋ถˆํ•„์š”ํ•œ DOM ๋…ธ๋“œ ๋ฐ ๊ฑฐ๋Œ€ํ•œ JavaScript ๋ฒˆ๋“ค๋กœ ์ธํ•œ ์ดˆ๊ธฐ ๋กœ๋”ฉ ๋ฐ ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์ •๊ธฐ ์„ฑ๋Šฅ ๊ฐ์‚ฌ ๋„๊ตฌ๋กœ ์ง์ ‘ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. - -### Adjacent Topics - -- [[Core Web Vitals]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: Chrome DevTools ์„ฑ๋Šฅ ํŒจ๋„์—์„œ ์ธก์ •ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ First Input Delay (FID), Interaction to Next Paint (INP) ๋“ฑ ์‹ค์ œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜(UX) ํ’ˆ์งˆ์„ ๋‚˜ํƒ€๋‚ด๋Š” Core Web Vitals ์ง€ํ‘œ๋ฅผ ์ข…ํ•ฉ์ ์œผ๋กœ ํ‰๊ฐ€ํ•˜๊ณ  ์ตœ์ ํ™”ํ•˜๋Š” ์ „๋žต์œผ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋‹ค. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Code Splitting.md b/00_Raw/Code Splitting.md deleted file mode 100644 index 96aa31b1..00000000 --- a/00_Raw/Code Splitting.md +++ /dev/null @@ -1,58 +0,0 @@ -# [[Code Splitting]] - -## ๐Ÿ“Œ Brief Summary -ํฐ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค์„ ๋” ์ž‘์€ ์ฒญํฌ(chunk) ๋‹จ์œ„๋กœ ๋‚˜๋ˆ„์–ด ์‚ฌ์šฉ์ž๊ฐ€ ํ•„์š”๋กœ ํ•  ๋•Œ(on demand) ๋กœ๋“œํ•˜๋Š” ํ”„๋กœ์„ธ์Šค์ž…๋‹ˆ๋‹ค [1, 2]. ๋ชจ๋“  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋ฅผ ์ดˆ๊ธฐ์— ํ•œ ๋ฒˆ์— ๋‹ค์šด๋กœ๋“œํ•˜๋Š” ๋Œ€์‹ , ํ•„์š”ํ•œ ํŒŒ์ผ๋งŒ ๋จผ์ € ๋ถˆ๋Ÿฌ์˜ค๊ฒŒ ํ•˜์—ฌ ์ดˆ๊ธฐ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ๊ทน์ ์œผ๋กœ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2, 3]. ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ดˆ๊ธฐ ํŽ˜์ด์ง€ ๋กœ๋“œ ์†๋„๋ฅผ ํ–ฅ์ƒ์‹œํ‚ค๊ณ , ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ฒด๊ฐ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•˜๋Š” ํ•ต์‹ฌ์ ์ธ ํ”„๋ก ํŠธ์—”๋“œ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค [1, 4]. - -## ๐Ÿ“– Core Content -* **๋ผ์šฐํŠธ ๊ธฐ๋ฐ˜ ๋ถ„ํ•  (Route-level Code Splitting):** ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ด๊ณ  ํšจ๊ณผ์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ํŠน์ • ๋ผ์šฐํŠธ๋กœ ์ด๋™ํ•  ๋•Œ๋งŒ ํ•ด๋‹น ํŽ˜์ด์ง€์˜ ์ฝ”๋“œ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๋„๋ก ํ•˜์—ฌ ์ดˆ๊ธฐ ๋กœ๋”ฉ ์‹œ ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ ๋‹ค์šด๋กœ๋“œ๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค [1, 2, 5]. -* **์ปดํฌ๋„ŒํŠธ ์ˆ˜์ค€ ์ง€์—ฐ ๋กœ๋”ฉ (Component-level Lazy Loading):** ์ฐจํŠธ, ์ง€๋„, ๋ฆฌ์น˜ ํ…์ŠคํŠธ ์—๋””ํ„ฐ์ฒ˜๋Ÿผ ํฌ๊ณ  ๋ฌด๊ฑฐ์šด ์ปดํฌ๋„ŒํŠธ๋‚˜ ๋“œ๋ฌผ๊ฒŒ ์‚ฌ์šฉ๋˜๋Š” ๋ชจ๋‹ฌ, ์„ค์ • ํŒจ๋„ ๋“ฑ์„ ๋ Œ๋”๋ง์ด ํ•„์š”ํ•œ ์‹œ์ ์—๋งŒ ๋กœ๋“œํ•˜๋„๋ก ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค [6, 7]. React์—์„œ๋Š” `React.lazy()`์™€ ๋™์  ์ž„ํฌํŠธ(dynamic imports), ๊ทธ๋ฆฌ๊ณ  ``๋ฅผ ํ™œ์šฉํ•ด ์ด๋ฅผ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [4, 6, 8]. -* **๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ถ„ํ•  (Vendor Splitting):** Vite(๋‚ด๋ถ€์ ์œผ๋กœ Rollup ์‚ฌ์šฉ) ๋“ฑ์˜ ๋ฒˆ๋“ค๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ `manualChunks` ์˜ต์…˜์„ ํ†ตํ•ด React ์ฝ”์–ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜ ์ฐจํŠธ ๋“ฑ ๋ฌด๊ฑฐ์šด ๋ฒค๋” ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ ํŒŒ์ผ๋กœ ๋ถ„ํ• ํ•ฉ๋‹ˆ๋‹ค [5, 9, 10]. ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ž์ฃผ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ธŒ๋ผ์šฐ์ € ์บ์‹ฑ ํšจ์œจ์„ ๊ทน๋Œ€ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5, 11]. -* **๋ฒˆ๋“ค๋Ÿฌ์˜ ์ž๋™ํ™” ์ง€์›:** ์ตœ์‹  ๋ฒˆ๋“ค๋Ÿฌ(Webpack, Vite)๋Š” ์ฝ”๋“œ ๋‚ด์— ์ž‘์„ฑ๋œ ๋™์  ์ž„ํฌํŠธ(`import()`)๋ฅผ ๊ฐ์ง€ํ•˜๋ฉด ์ž๋™์œผ๋กœ ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ ์ฒญํฌ๋กœ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค [4, 6]. - -## โš–๏ธ Trade-offs & Caveats -* **ํ•„์ˆ˜ ์ปดํฌ๋„ŒํŠธ์— ๋Œ€ํ•œ ์˜ค๋‚จ์šฉ ๊ธˆ์ง€:** ํŽ˜์ด์ง€์— ์ฆ‰์‹œ ํ•„์š”ํ•œ ์Šคํฌ๋กค ์—†์ด ๋ณผ ์ˆ˜ ์žˆ๋Š”(above-the-fold) ํ•ต์‹ฌ ์ปดํฌ๋„ŒํŠธ๋‚˜, ๋ Œ๋”๋ง ์†๋„๊ฐ€ ๋นจ๋ผ์•ผ ํ•˜๋Š” ์š”์†Œ์—๋Š” ์ง€์—ฐ ๋กœ๋”ฉ๊ณผ ์ฝ”๋“œ ๋ถ„ํ• ์„ ํ”ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [7]. ์˜คํžˆ๋ ค ์ฒซ ํ™”๋ฉด์„ ๊ทธ๋ฆฌ๋Š” ์‹œ๊ฐ„์„ ์ง€์—ฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -* **์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ์ €ํ•˜ ๋ฐฉ์ง€ (Fallback UI ํ•„์š”):** ์ฝ”๋“œ๋ฅผ ๋™์ ์œผ๋กœ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋™์•ˆ ๋„คํŠธ์›Œํฌ ์ง€์—ฐ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ``๋ฅผ ์‚ฌ์šฉํ•ด ๋ชจ๋“ˆ์ด ๋กœ๋“œ๋˜๋Š” ๋™์•ˆ ์Šคํ”ผ๋„ˆ๋‚˜ ์Šค์ผˆ๋ ˆํ†ค๊ณผ ๊ฐ™์€ Fallback UI๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [5, 8]. -* **๋„คํŠธ์›Œํฌ ์š”์ฒญ ์ฆ๊ฐ€์˜ ์œ„ํ—˜:** ๋„ˆ๋ฌด ์ž˜๊ฒŒ ์ฝ”๋“œ๋ฅผ ๋ถ„ํ• ํ•˜๋ฉด ์˜คํžˆ๋ ค ์ˆ˜๋งŽ์€ ๋„คํŠธ์›Œํฌ ์š”์ฒญ์ด ๋ฐœ์ƒํ•ด ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ๋Š” `rollup-plugin-visualizer` ๋“ฑ์˜ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ด 500kB ์ด์ƒ์˜ ํฐ ์ฒญํฌ๋ฅผ ํƒ€๊ฒŸ์œผ๋กœ ์‹๋ณ„ํ•˜๊ณ  ์ ์ ˆํ•˜๊ฒŒ ๋ถ„ํ• ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [12, 13]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -#### [์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] -- [[Lazy Loading]] - - ์—ฐ๊ฒฐ ์ด์œ : ์ฝ”๋“œ ๋ถ„ํ• ์ด ๋ฒˆ๋“ค์„ ์ชผ๊ฐœ๋Š” ํ–‰์œ„๋ผ๋ฉด, ์ง€์—ฐ ๋กœ๋”ฉ(Lazy Loading)์€ ๊ทธ ์ชผ๊ฐœ์ง„ ์ฝ”๋“œ๋ฅผ ํ•„์š” ์‹œ์ ์— ๋กœ๋“œํ•˜๋Š” ๊ธฐ์ˆ ์  ๋ฐฉ๋ฒ•๋ก ์ž…๋‹ˆ๋‹ค [2, 3]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ถ„ํ• ๋œ ์ฝ”๋“œ๊ฐ€ ์–ธ์ œ ๋ธŒ๋ผ์šฐ์ €๋กœ ์ „์†ก๋˜๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋ณ‘ํ•ฉ๋˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [8]. -- [[Core Web Vitals]] - - ์—ฐ๊ฒฐ ์ด์œ : ์ฝ”๋“œ ๋ถ„ํ• ์„ ์ ์šฉํ•˜๋Š” ์ฃผ๋œ ์„ฑ๋Šฅ์  ๋ชฉ์ ์€ ์ดˆ๊ธฐ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰์„ ์ตœ์†Œํ™”ํ•˜์—ฌ LCP(Largest Contentful Paint)์™€ INP(Interaction to Next Paint) ๊ฐ™์€ ํ•ต์‹ฌ ์›น ์ง€ํ‘œ๋ฅผ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๋ฐ ์žˆ์Šต๋‹ˆ๋‹ค [1, 8, 14]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ตœ์ ํ™” ๊ฒฐ๊ณผ๊ฐ€ ์‹ค์ œ ์‚ฌ์šฉ์ž์˜ ์ฒด๊ฐ ์„ฑ๋Šฅ ๋ฐ ํŽ˜์ด์ง€ ์ธก์ • ์ง€ํ‘œ์— ์–ด๋–ป๊ฒŒ ๊ธ์ •์  ์˜ํ–ฅ์„ ์ฃผ๋Š”์ง€ ํ‰๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [15]. - -#### [๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ] -- [[React.lazy() and Suspense]] - - ์—ฐ๊ฒฐ ์ด์œ : React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ปดํฌ๋„ŒํŠธ ๋ ˆ๋ฒจ ๋ฐ ๋ผ์šฐํŠธ ๋ ˆ๋ฒจ์˜ ๋™์  ์ฝ”๋“œ ๋ถ„ํ• ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๊ณต์‹ API์ž…๋‹ˆ๋‹ค [6, 8]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋™์  ์ž„ํฌํŠธ ์ฒ˜๋ฆฌ ๊ณผ์ •์—์„œ์˜ ๋น„๋™๊ธฐ UI ๋ Œ๋”๋ง ํ๋ฆ„๊ณผ ์˜ˆ์™ธ(์ง€์—ฐ) ์ฒ˜๋ฆฌ ๋ฐฉ์‹์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5]. -- [[Vite (Rollup)]] - - ์—ฐ๊ฒฐ ์ด์œ : ๊ฐœ๋ฐœ ๋ฐ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฒˆ๋“ค๋งํ•˜๊ณ  ์‹ค์ œ ๋ฌผ๋ฆฌ์ ์ธ ์ฒญํฌ ํŒŒ์ผ๋“ค๋กœ ๋ถ„๋ฆฌํ•ด ๋‚ด๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค [9, 11]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ฒˆ๋“ค๋Ÿฌ์˜ `manualChunks` ์„ค์ •์„ ํ†ตํ•ด ์–ด๋–ป๊ฒŒ ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๋‚˜๋ˆ„์–ด ๋ธŒ๋ผ์šฐ์ € ์บ์‹ฑ์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5]. - -### Deeper Research Questions -- ๋ผ์šฐํŠธ ๊ธฐ๋ฐ˜ ๋ถ„ํ• ๊ณผ ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜ ๋ถ„ํ• ์„ ์–ด๋А ์ •๋„ ๋น„์œจ๋กœ ์ ์šฉํ•ด์•ผ ์ดˆ๊ธฐ ๋ Œ๋”๋ง ์„ฑ๋Šฅ๊ณผ ์ดํ›„ ํƒ์ƒ‰ ์‹œ์˜ ๋„คํŠธ์›Œํฌ ์ง€์—ฐ ๊ฐ„์˜ ๊ท ํ˜•์„ ์ด๋ฃฐ ์ˆ˜ ์žˆ๋Š”๊ฐ€? -- Vite๋‚˜ Webpack ํ™˜๊ฒฝ์—์„œ `manualChunks`๋ฅผ ์„ค์ •ํ•  ๋•Œ, ๋ธŒ๋ผ์šฐ์ €์˜ HTTP/2 ๋ฐ HTTP/3 ๋‹ค์ค‘ํ™”(multiplexing) ํ™˜๊ฒฝ์„ ๊ณ ๋ คํ•œ ๊ฐ€์žฅ ์ด์ƒ์ ์ธ ์ฒญํฌ ๊ฐœ์ˆ˜์™€ ํฌ๊ธฐ๋Š” ๋ฌด์—‡์ธ๊ฐ€? -- ๋™์  ์ฒญํฌ(chunk)๋ฅผ ๋กœ๋“œํ•˜๋Š” ๋„์ค‘ ์‚ฌ์šฉ์ž์˜ ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ์ด ๋Š๊ธฐ๊ฑฐ๋‚˜ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ, React Error Boundaries์™€ ๊ฒฐํ•ฉํ•˜์—ฌ ์–ด๋–ป๊ฒŒ ์•ˆ์ •์ ์ธ Fallback ๊ฒฝํ—˜์„ ์„ค๊ณ„ํ•  ๊ฒƒ์ธ๊ฐ€? -- ์ฝ”๋“œ ๋ถ„ํ• ๋กœ ์ธํ•ด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ง€์—ฐ ๋กœ๋“œ๋  ๋•Œ, ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์˜์กดํ•˜๋Š” ์ƒํƒœ(Context, Zustand ๋“ฑ)๋Š” ๋กœ๋“œ ์‹œ์ ์— ์–ด๋–ป๊ฒŒ ๋™๊ธฐํ™”๋˜๋Š”๊ฐ€? -- Above-the-fold UI์— ์ž˜๋ชป ์ง€์—ฐ ๋กœ๋”ฉ์„ ์ ์šฉํ–ˆ์„ ๋•Œ LCP ์ ์ˆ˜์— ๋ฏธ์น˜๋Š” ์•…์˜ํ–ฅ์„ ํ™•์ธํ•˜๋ ค๋ฉด ๋ธŒ๋ผ์šฐ์ € ๊ฐœ๋ฐœ์ž ๋„๊ตฌ์˜ ์„ฑ๋Šฅ(Performance) ํŒจ๋„์—์„œ ์–ด๋–ค ์ง€ํ‘œ๋ฅผ ์ค‘์ ์ ์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋งํ•ด์•ผ ํ•˜๋Š”๊ฐ€? - -### Practical Application Contexts -- **Implementation:** React ์ฝ”๋“œ์—์„œ `import { Chart } from 'chart.js'`์™€ ๊ฐ™์€ ์ •์  ์ž„ํฌํŠธ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ , `const HeavyComponent = React.lazy(() => import('./HeavyComponent'))`๋กœ ๊ฐ์‹ธ์„œ ํŠน์ • ๋ฒ„ํŠผ์ด ๋ˆŒ๋ฆฌ๊ฑฐ๋‚˜ ๋ผ์šฐํŠธ๊ฐ€ ์ „ํ™˜๋  ๋•Œ ๋ Œ๋”๋ง๋˜๊ฒŒ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค [4, 6, 8]. -- **System Design:** ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ ์‹œ, ๋ชจ๋“  ์ฝ”๋“œ๊ฐ€ ํฌํ•จ๋œ ํ•˜๋‚˜์˜ `index.js` ๋ชจ๋†€๋ฆฌ์Šค ๋ฒˆ๋“ค ๋Œ€์‹ , Vite์˜ `vite.config.ts`์—์„œ `manualChunks` ์„ค์ •์„ ํ†ตํ•ด React ์ฝ”์–ด ๋ฐ ๋ฌด๊ฑฐ์šด ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ณ„๊ฐœ์˜ ์บ์‹ฑ ๊ฐ€๋Šฅํ•œ ์ฒญํฌ๋กœ ๋ถ„๋ฆฌํ•˜๋„๋ก ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค [5, 10]. -- **Operation / Maintenance:** CI/CD ํŒŒ์ดํ”„๋ผ์ธ์ด๋‚˜ ๋กœ์ปฌ ๋นŒ๋“œ ๊ณผ์ •์— `rollup-plugin-visualizer` ๋“ฑ์˜ ๋ฒˆ๋“ค ๋ถ„์„ ๋„๊ตฌ๋ฅผ ์—ฐ๊ฒฐํ•˜์—ฌ ์‹œ๊ฐ์  ํŠธ๋ฆฌ๋งต์„ ํ™•์ธํ•˜๊ณ , 500kB๋ฅผ ์ดˆ๊ณผํ•˜๋Š” ๊ฑฐ๋Œ€ ์ฒญํฌ๊ฐ€ ๋ฐœ๊ฒฌ๋˜๋ฉด ์ถ”๊ฐ€์ ์ธ ๋ถ„ํ•  ๋Œ€์ƒ์„ ์‹๋ณ„ํ•˜์—ฌ ์ตœ์ ํ™”ํ•ฉ๋‹ˆ๋‹ค [4, 12, 13]. -- **Learning Path:** ์šฐ์„  React์˜ ๋ฒˆ๋“ค๋ง ๊ฐœ๋…์„ ์ดํ•ดํ•œ ํ›„, ๋™์  ์ž„ํฌํŠธ ๊ตฌ๋ฌธ ํ™œ์šฉ -> `React.lazy()` ๋ฐ `` ์ ์šฉ -> ๋ผ์šฐํ„ฐ์— ์ฝ”๋“œ ๋ถ„ํ•  ๊ฒฐํ•ฉ -> ๋ฒˆ๋“ค ๋ถ„์„๊ธฐ ๋ฐ Core Web Vitals ์ธก์ •์„ ํ†ตํ•œ ํšจ๊ณผ ๊ฒ€์ฆ ์ˆœ์„œ๋กœ ์ง€์‹์„ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค [6, 8]. -- **My Project Relevance:** ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๊ฐ€ ์ปค์ง์— ๋”ฐ๋ผ ๋ฉ”์ธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค์ด ์ˆ˜ ๋ฉ”๊ฐ€๋ฐ”์ดํŠธ ๋‹จ์œ„๋กœ ๋ฌด๊ฑฐ์›Œ์ ธ ๋ชจ๋ฐ”์ผ ๊ธฐ๊ธฐ ๋“ฑ์—์„œ ๋กœ๋”ฉ ์†๋„ ์ €ํ•˜ ํ˜„์ƒ์ด ๋ณด์ผ ๊ฒฝ์šฐ, ์ฆ‰๊ฐ์ ์œผ๋กœ ๋ผ์šฐํŠธ ๊ธฐ๋ฐ˜ ์ฝ”๋“œ ๋ถ„ํ• ๊ณผ ์ฐจํŠธ/์—๋””ํ„ฐ ๋“ฑ ๋ฌด๊ฑฐ์šด UI์˜ ์ง€์—ฐ ๋กœ๋”ฉ์„ ๋„์ž…ํ•˜์—ฌ LCP ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3, 14, 16]. - -### Adjacent Topics -- [[Tree Shaking]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ์ฝ”๋“œ ๋ถ„ํ• ์ด ํ•„์š”ํ•œ ์ฝ”๋“œ๋ฅผ '์ชผ๊ฐœ์–ด' ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ์‹์ด๋ผ๋ฉด, ํŠธ๋ฆฌ ์‰์ดํ‚น์€ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์ฃฝ์€ ์ฝ”๋“œ(Dead Code) ์ž์ฒด๋ฅผ ๋ฒˆ๋“ค์—์„œ '์ œ๊ฑฐ'ํ•˜์—ฌ ์ดˆ๊ธฐ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ค„์ด๋Š” ์ƒํ˜ธ ๋ณด์™„์ ์ธ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค [17, 18]. -- [[Server Components (Next.js)]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ์˜ ์ฝ”๋“œ ๋ถ„ํ• ์—์„œ ๋” ๋‚˜์•„๊ฐ€, ์•„์˜ˆ ์ •์ ์ธ UI ๋ Œ๋”๋ง์„ ์„œ๋ฒ„์—์„œ ์ฒ˜๋ฆฌํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ๋กœ ๋ณด๋‚ด๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค์˜ ์–‘ ์ž์ฒด๋ฅผ ํš๊ธฐ์ ์œผ๋กœ ์ค„์ด๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•˜๋Š” ์ตœ์‹  ์•„ํ‚คํ…์ฒ˜ ์ ‘๊ทผ๋ฒ•์ž…๋‹ˆ๋‹ค [19-21]. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Concurrent Features.md b/00_Raw/Concurrent Features.md deleted file mode 100644 index 2c5c54ed..00000000 --- a/00_Raw/Concurrent Features.md +++ /dev/null @@ -1,56 +0,0 @@ -# [[Concurrent Features]] - -## ๐Ÿ“Œ Brief Summary -Concurrent Features๋Š” React 18๋ถ€ํ„ฐ ๋„์ž…๋œ ๊ธฐ๋Šฅ์œผ๋กœ, ๋ Œ๋”๋ง ์ž‘์—…์„ ์ผ์‹œ ์ค‘์ง€(pause), ์ค‘๋‹จ(interrupt), ์žฌ๊ฐœ(resume)ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค [1]. ์ด๋ฅผ ํ†ตํ•ด ์ค‘์š”ํ•œ ์‚ฌ์šฉ์ž ์ƒํ˜ธ์ž‘์šฉ(ํด๋ฆญ, ํƒ€์ดํ•‘ ๋“ฑ)์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋†’์ด๊ณ , ์ƒ๋Œ€์ ์œผ๋กœ ๋А๋ฆฐ ์—…๋ฐ์ดํŠธ(๋Œ€์šฉ๋Ÿ‰ ํ•„ํ„ฐ๋ง ๋“ฑ)๋ฅผ ์ง€์—ฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1]. ๊ฒฐ๊ณผ์ ์œผ๋กœ ์•ฑ์˜ ์‹ค์ œ ์—ฐ์‚ฐ ์†๋„ ์ž์ฒด๋ฅผ ๋งˆ๋ฒ•์ฒ˜๋Ÿผ ๋น ๋ฅด๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ, ์ธ์ง€๋˜๋Š” ์†๋„(perceived speed)๋ฅผ ์ตœ์ ํ™”ํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ฐ˜์‘์„ฑ ์žˆ๊ฒŒ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค [2]. - -## ๐Ÿ“– Core Content -* **๋™์‹œ์„ฑ ๋ Œ๋”๋ง(Concurrent Rendering)์˜ ์›๋ฆฌ:** ์ตœ์‹  ๋ฒ„์ „์˜ React์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ, ๋ Œ๋”๋ง ์ž‘์—…์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ง€์ •ํ•˜์—ฌ ์ค‘์š”๋„๊ฐ€ ๋†’์€ ์ƒํ˜ธ์ž‘์šฉ์ด ๋ Œ๋”๋ง์— ์˜ํ•ด ์ฐจ๋‹จ(block)๋˜์ง€ ์•Š๊ณ  ์ฆ‰์‹œ ๋ฐ˜์‘ํ•˜๋„๋ก ๋•์Šต๋‹ˆ๋‹ค [1]. -* **`useTransition`์„ ํ†ตํ•œ ์šฐ์„ ์ˆœ์œ„ ์ œ์–ด:** ํŠน์ • ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋ฅผ '๊ธด๊ธ‰ํ•˜์ง€ ์•Š์€(non-urgent)' ๊ฒƒ์œผ๋กœ ํ‘œ์‹œํ•˜์—ฌ ์ง€์—ฐ์‹œํ‚ค๋Š” ํ›…(Hook)์ž…๋‹ˆ๋‹ค [3]. ์‹ค์‹œ๊ฐ„ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋‚˜ ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ ํ•„ํ„ฐ๋ง ์‹œ, ์‚ฌ์šฉ์ž์˜ ํƒ€์ดํ•‘ ๊ฐ™์€ ์ž…๋ ฅ์€ ์ฆ‰๊ฐ์ ์œผ๋กœ ๋ฐ˜์‘ํ•˜๊ฒŒ ํ•˜๋ฉด์„œ ๋ฌด๊ฑฐ์šด ๋ Œ๋”๋ง ์ฒ˜๋ฆฌ๋Š” ๋’ค๋กœ ๋ฏธ๋ฃฐ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3]. ๋˜ํ•œ `isPending` ์ƒํƒœ๋ฅผ ํ™œ์šฉํ•ด ์ž…๋ ฅ ์ฆ‰๊ฐ์„ฑ์„ ๋ง‰์ง€ ์•Š๊ณ  ๋กœ๋”ฉ ์Šคํ”ผ๋„ˆ๋‚˜ ์Šค์ผˆ๋ ˆํ†ค UI๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค [3]. -* **`useDeferredValue`๋ฅผ ํ†ตํ•œ ๊ฐ’ ์ฐธ์กฐ ์ง€์—ฐ:** `useTransition`์ด ์—…๋ฐ์ดํŠธ๋ฅผ ์–ธ์ œ ๋ฐœ์ƒ์‹œํ‚ฌ์ง€๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค๋ฉด, `useDeferredValue`๋Š” ๋ฌด๊ฑฐ์šด ๊ฐ’์„ ์–ธ์ œ '์ฝ์„์ง€'๋ฅผ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค [4]. ์ž…๋ ฅ๊ณผ ๊ฐ™์€ UI ๋ณ€๊ฒฝ์€ ์ฆ‰์‹œ ๋ฐ˜์˜ํ•˜๋ฉด์„œ, ํŒŒ์ƒ๋˜๋Š” ๋ฌด๊ฑฐ์šด ๋กœ์ง ์ ์šฉ์€ ์‚ด์ง ์ง€์—ฐ์‹œ์ผœ ์‹ค์‹œ๊ฐ„ ํผ(form) ๋“ฑ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋Š๊น€ ํ˜„์ƒ(jank)์„ ์ค„์—ฌ์ค๋‹ˆ๋‹ค [4]. -* **ํ”„๋ ˆ์ž„์›Œํฌ ์ง€์› ํ™˜๊ฒฝ:** 2025๋…„ ๊ธฐ์ค€ Next.js(App Router), Remix, Vite + React 18+ ํ™˜๊ฒฝ ๋“ฑ ๋Œ€๋ถ€๋ถ„์˜ ํ’€์Šคํƒ ๋ฐ ๋ฒˆ๋“ค๋Ÿฌ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋™์‹œ์„ฑ ๋ Œ๋”๋ง ๊ธฐ๋Šฅ์ด ํ†ตํ•ฉ๋˜์–ด ์ง€์›๋ฉ๋‹ˆ๋‹ค [2]. - -## โš–๏ธ Trade-offs & Caveats -* **์„ฑ๋Šฅ ํ–ฅ์ƒ์˜ ๋ณธ์งˆ์  ํ•œ๊ณ„:** ์ด ๊ธฐ๋Šฅ๋“ค์€ ์•ฑ์˜ ์‹ค์ œ ์—ฐ์‚ฐ ์†๋„๋ฅผ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๋†’์—ฌ์ฃผ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ "์ธ์ง€๋˜๋Š” ์†๋„(perceived speed)"๋ฅผ ์šฐ์„ ์‹œํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค [2]. ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์ด ๊ณ„์† ์ง„ํ–‰๋˜๋Š” ๋™์•ˆ UI์˜ ๋ฐ˜์‘์„ฑ์„ ์œ ์ง€ํ•  ๋ฟ, ์‹คํ–‰ํ•ด์•ผ ํ•  ์—ฐ์‚ฐ๋Ÿ‰ ์ž์ฒด๊ฐ€ ์ค„์–ด๋“œ๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค [2]. -* **์„ ๋ณ„์  ์‚ฌ์šฉ ์š”๊ตฌ:** ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ์— ์ „์—ญ์ ์œผ๋กœ ์‚ฌ์šฉํ•ด์„œ๋Š” ์•ˆ ๋˜๋ฉฐ, ์ฃผ๋กœ '์ƒํ˜ธ์ž‘์šฉ์ด ๋งŽ์€ ๋ทฐ(interactive views)'์— ์„ ๋ณ„์ ์œผ๋กœ ์ ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [4]. -* **ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ:** ๋ Œ๋”๋ง์„ ์ฐจ๋‹จํ•˜๋Š”(render-blocking) ๊ตฌ์‹ ํŒจํ„ด(๊ฐ€๋“œ๊ฐ€ ์—†๋Š” ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ ๋“ฑ)์ด๋‚˜ ์˜ค๋ž˜๋œ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์„ž์–ด์„œ ์‚ฌ์šฉํ•˜๋ฉด ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ์•ผ๊ธฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [4]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -#### [๊ด€๊ณ„ ์œ ํ˜• A: ์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] -- [[useTransition]] - - ์—ฐ๊ฒฐ ์ด์œ : ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋ฅผ ๊ธด๊ธ‰ํ•˜์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œํ•˜์—ฌ ์ง€์—ฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” Concurrent Feature์˜ ํ•ต์‹ฌ ์š”์†Œ์ž…๋‹ˆ๋‹ค [3]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: React๊ฐ€ ๋ Œ๋”๋ง ์šฐ์„ ์ˆœ์œ„๋ฅผ ์กฐ์ •ํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ž…๋ ฅ ๋ฐ˜์‘์„ฑ์„ ์žƒ์ง€ ์•Š๊ฒŒ ์œ ์ง€ํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ๋ฉ”์ปค๋‹ˆ์ฆ˜. - -- [[useDeferredValue]] - - ์—ฐ๊ฒฐ ์ด์œ : ๋น„์šฉ์ด ํฐ ํŒŒ์ƒ ๋ฐ์ดํ„ฐ์˜ ๋ Œ๋”๋ง ๋ฐ˜์˜ ์‹œ์ ์„ ์ง€์—ฐ์‹œ์ผœ UI ๋Š๊น€์„ ๋ง‰๋Š” ๋˜ ๋‹ค๋ฅธ ์ฃผ์š” ์š”์†Œ์ž…๋‹ˆ๋‹ค [4]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ƒํƒœ์˜ ์—…๋ฐ์ดํŠธ ์‹œ์ ์ด ์•„๋‹Œ, ๊ณ„์‚ฐ๋œ ๊ฐ’์„ ์ฝ์–ด ๋“ค์ด๋Š” ์‹œ์ ์„ ๋ถ„๋ฆฌํ•˜๋Š” ์ตœ์ ํ™” ์ „๋žต. - -#### [๊ด€๊ณ„ ์œ ํ˜• B: ๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ] -- [[Suspense]] - - ์—ฐ๊ฒฐ ์ด์œ : Concurrent Feature(ํŠนํžˆ `useTransition`)์™€ ๊ฒฐํ•ฉํ•˜์—ฌ ๋ฌด๊ฑฐ์šด ๋ Œ๋”๋ง์ด๋‚˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋กœ๋“œ๋˜๋Š” ๋™์•ˆ Fallback UI๋ฅผ ์œ ์—ฐํ•˜๊ฒŒ ํ‘œ์‹œํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค [4]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋น„๋™๊ธฐ ๋กœ๋”ฉ ์ƒํƒœ์—์„œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜(UX)์„ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ์„ค๊ณ„ํ•˜๋Š” ์„ ์–ธ์  UI ํŒจํ„ด. - -### Deeper Research Questions -- Concurrent Rendering์ด ๋™์ž‘ํ•  ๋•Œ ๋ธŒ๋ผ์šฐ์ €์˜ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ์ž‘์—…์„ ์ผ์‹œ ์ค‘์ง€ํ•˜๊ณ  ์žฌ๊ฐœ(pause, interrupt, resume)ํ•˜๋Š”๊ฐ€? -- `useTransition`๊ณผ `useDeferredValue`๋Š” ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ค ์ƒํ™ฉ์—์„œ ๊ฐ๊ฐ ์„ ํƒ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•˜๋ฉฐ, ๋‘ ๊ฐ€์ง€๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์ œ์•ฝ ์‚ฌํ•ญ์€ ์—†๋Š”๊ฐ€? -- ๊ตฌ์‹ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(outdated state libraries)๊ฐ€ Concurrent Features์™€ ์„ž์˜€์„ ๋•Œ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜๋Š” ๊ธฐ์ˆ ์  ์›๋ฆฌ๋Š” ๋ฌด์—‡์ธ๊ฐ€? -- ์ธ์ง€๋˜๋Š” ์†๋„(perceived speed)๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด Concurrent ๊ธฐ๋Šฅ์„ ๊ณผ๋„ํ•˜๊ฒŒ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๋‚˜ ์Šค์ผ€์ค„๋ง ์˜ค๋ฒ„ํ—ค๋“œ๋Š” ์–ด๋А ์ •๋„์ธ๊ฐ€? -- Next.js๋‚˜ Remix ๊ฐ™์€ ์ตœ์‹  ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ Concurrent Features๋ฅผ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•˜์—ฌ ์ŠคํŠธ๋ฆฌ๋ฐ(streaming) ์—…๋ฐ์ดํŠธ์™€ ๊ฐ™์€ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์ด๋Œ์–ด๋‚ด๋Š”๊ฐ€? - -### Practical Application Contexts -- **Implementation:** ์‹ค์‹œ๊ฐ„ ๊ฒ€์ƒ‰์ฐฝ, ํƒ€์ž…์–ดํ—ค๋“œ(Typeahead) ์ž…๋ ฅ๊ธฐ, ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ๊ทธ๋ฆฌ๋“œ ํ•„ํ„ฐ๋ง ๋“ฑ ์‚ฌ์šฉ์ž ์ž…๋ ฅ์ด ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค ๋ฌด๊ฑฐ์šด UI๋ฅผ ๋‹ค์‹œ ๊ทธ๋ ค์•ผ ํ•˜๋Š” ๊ณณ์— ๊ตฌํ˜„ํ•˜์—ฌ ์ž…๋ ฅ์ด ๋ฒ„๋ฒ…์ด์ง€ ์•Š๋„๋ก ๋งŒ๋“ญ๋‹ˆ๋‹ค [3, 4]. -- **System Design:** ์‚ฌ์šฉ์ž์˜ ์ฆ‰๊ฐ์ ์ธ ํ”ผ๋“œ๋ฐฑ์ด ํ•„์š”ํ•œ ๋ทฐ์™€, ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์ง€์—ฐ ๋ Œ๋”๋ง๋˜์–ด๋„ ๋ฌด๋ฐฉํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ์‹œ์Šคํ…œ ๊ตฌ์กฐ ๋ฐ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ธฐํšํ•ฉ๋‹ˆ๋‹ค [4]. -- **Operation / Maintenance:** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋กœํŒŒ์ผ๋ง ์ค‘ ์ž…๋ ฅ ์ง€์—ฐ(Input Lag)์ด ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ณด๊ณ ๋˜๋Š” ๋ถ€๋ถ„์„ ์ฐพ์•„๋‚ด๊ณ , ํ•ด๋‹น ๋ถ€๋ถ„์— ๋ Œ๋”๋ง ์ฐจ๋‹จ ํŒจํ„ด์ด ์—†๋Š”์ง€ ์ ๊ฒ€ํ•˜์—ฌ Concurrent ๊ธฐ๋Šฅ์„ ์ ์ง„์ ์œผ๋กœ ๋„์ž…ํ•ฉ๋‹ˆ๋‹ค [4, 5]. -- **Learning Path:** ๋‹จ์ˆœํ•œ React Hook(`useState`, `useEffect`)์˜ ๋ Œ๋”๋ง ๊ณผ์ •์„ ์ดํ•ดํ•œ ํ›„, ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ์ตœ์ ํ™”(`React.memo`, `useCallback`)๋ฅผ ๋ฐฐ์šฐ๊ณ , ์ตœ์ข…์ ์œผ๋กœ ๋ Œ๋”๋ง์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ œ์–ดํ•˜๋Š” ๊ณ ๊ธ‰ ์ตœ์ ํ™” ๊ณผ์ •์œผ๋กœ Concurrent ๊ธฐ๋Šฅ์„ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค. -- **My Project Relevance:** ๊ฒ€์ƒ‰ ํ•„ํ„ฐ๊ฐ€ ๋งŽ์€ ๋Œ€์‹œ๋ณด๋“œ๋‚˜ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์‹œ๊ฐํ™” ์ฐจํŠธ๋ฅผ ๊ตฌ์ถ•ํ•  ๋•Œ UI ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฉˆ์ถ”๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜์—ฌ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ํฌ๊ฒŒ ๊ฐœ์„ ํ•˜๋Š” ๋ฐ ์ง์ ‘์ ์œผ๋กœ ์ ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - -### Adjacent Topics -- [[Server Components]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ํด๋ผ์ด์–ธํŠธ์—์„œ ๋ Œ๋”๋ง์„ ์ง€์—ฐ์‹œํ‚ค๊ฑฐ๋‚˜ ์ตœ์ ํ™”ํ•˜๋Š” ๊ฒƒ์„ ๋„˜์–ด, ๋ฌด๊ฑฐ์šด ๋ Œ๋”๋ง ์ž‘์—… ์ž์ฒด๋ฅผ ์„œ๋ฒ„๋กœ ์™„์ „ํžˆ ์˜ฎ๊ฒจ ํด๋ผ์ด์–ธํŠธ์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค ํฌ๊ธฐ์™€ ์‹คํ–‰ ๋ถ€๋‹ด์„ ๊ทผ๋ณธ์ ์œผ๋กœ ์ค„์ด๋Š” ๋ฐฉ๋ฒ•๋ก  ํƒ๊ตฌ [6, 7]. -- [[Code Splitting & Lazy Loading]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ํ™”๋ฉด์˜ ๋ Œ๋”๋ง ๊ณผ์ •์„ ๋งค๋„๋Ÿฝ๊ฒŒ ํ•˜๋Š” ๊ฒƒ์„ ๋„˜์–ด, ์ดˆ๊ธฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ๋”ฉ ์‹œ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ๋‹ค์šด๋กœ๋“œํ•˜๋Š” ์ฝ”๋“œ์˜ ์–‘ ์ž์ฒด๋ฅผ ๋ถ„ํ• ํ•˜์—ฌ ์ดˆ๊ธฐ ์‘๋‹ต์„ฑ(Time to Interactive)์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ์ „๋žต ํƒ๊ตฌ [8, 9]. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Concurrent Rendering in React 18+.md b/00_Raw/Concurrent Rendering in React 18+.md deleted file mode 100644 index b20eeb11..00000000 --- a/00_Raw/Concurrent Rendering in React 18+.md +++ /dev/null @@ -1,62 +0,0 @@ -# [[Concurrent Rendering in React 18+]] - -## ๐Ÿ“Œ Brief Summary -React 18+์˜ ๋™์‹œ์„ฑ ๋ Œ๋”๋ง(Concurrent Rendering)์€ React๊ฐ€ ๋ Œ๋”๋ง ์ž‘์—…์„ ์ผ์‹œ ์ค‘์ง€, ์ค‘๋‹จ ๋ฐ ์žฌ๊ฐœํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค [1]. ์ด๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๋Š” ์—…๋ฐ์ดํŠธ ๋ฐœ์ƒ ์‹œ๊ธฐ์™€ ๋ฐฉ์‹์„ ์„ธ๋ฐ€ํ•˜๊ฒŒ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์‚ฌ์šฉ์ž์˜ ์ƒํ˜ธ์ž‘์šฉ์„ฑ์„ ์ €ํ•˜์‹œํ‚ค์ง€ ์•Š์œผ๋ฉด์„œ๋„ ํ™”๋ฉด์ด ๋ฉˆ์ถ”์ง€ ์•Š๋Š” ๋” ๋ถ€๋“œ๋Ÿฝ๊ณ  ๋ฐ˜์‘์„ฑ ๋†’์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1, 2]. - -## ๐Ÿ“– Core Content - -**๋™์‹œ์„ฑ ๋ Œ๋”๋ง์˜ ๊ฐœ๋…๊ณผ ์ด์ ** -* React 18๋ถ€ํ„ฐ ๋„์ž…๋œ ๋™์‹œ์„ฑ ๊ธฐ๋Šฅ์€ ๋ Œ๋”๋ง ์ž‘์—…์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋™์ ์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. ๋ Œ๋”๋ง ์ž‘์—…์„ ์ฐจ๋‹จํ•˜์ง€ ์•Š๊ณ , ๋А๋ฆฐ ๋ฐ์ดํ„ฐ ํ•„ํ„ฐ๋ง ์—…๋ฐ์ดํŠธ ๋“ฑ์„ ์ง€์—ฐ์‹œํ‚ค๋Š” ๋™์‹œ์— ํด๋ฆญ์ด๋‚˜ ํƒ€์ดํ•‘๊ณผ ๊ฐ™์€ ์ค‘์š”ํ•œ ์‚ฌ์šฉ์ž ์ƒํ˜ธ์ž‘์šฉ์— ์ฆ‰๊ฐ์ ์œผ๋กœ ๋ฐ˜์‘ํ•˜๋„๋ก ๋ Œ๋”๋ง์„ ์ผ์‹œ ์ค‘์ง€ํ•˜๊ฑฐ๋‚˜ ์žฌ๊ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1]. ์ด๋Š” ์ตœ์‹  React ๋ฒ„์ „์˜ ๊ธฐ๋ณธ ๋™์ž‘์œผ๋กœ ๋‚ด์žฅ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค [1]. - -**์ฃผ์š” ๋™์‹œ์„ฑ ํ›…(Hooks)** -* **`useTransition`:** ํŠน์ • ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋ฅผ '๊ธด๊ธ‰ํ•˜์ง€ ์•Š์€(non-urgent)' ๊ฒƒ์œผ๋กœ ํ‘œ์‹œํ•˜์—ฌ ์ง€์—ฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ํ›…์ž…๋‹ˆ๋‹ค [3]. ์‹ค์‹œ๊ฐ„ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ํ‘œ์‹œ, ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ ์„ธํŠธ ํ•„ํ„ฐ๋ง, ๋ณต์žกํ•œ ์ฐจํŠธ ๋ฐ ํ…Œ์ด๋ธ” ๋ Œ๋”๋ง๊ณผ ๊ฐ™์€ ๋ฌด๊ฑฐ์šด ์ž‘์—…์ด ์‚ฌ์šฉ์ž์˜ ์ฆ‰๊ฐ์ ์ธ ์ƒํ˜ธ์ž‘์šฉ์„ ์ฐจ๋‹จํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค [3]. ์ œ๊ณต๋˜๋Š” `isPending` ์ƒํƒœ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋ฅผ ์ฐจ๋‹จํ•˜์ง€ ์•Š๊ณ  ๋กœ๋”ฉ ์Šคํ”ผ๋„ˆ๋‚˜ ์Šค์ผˆ๋ ˆํ†ค UI๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3]. -* **`useDeferredValue`:** `useTransition`์ด ์—…๋ฐ์ดํŠธ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š” ์‹œ์ ์„ ์ œ์–ดํ•œ๋‹ค๋ฉด, `useDeferredValue`๋Š” ๋น„์šฉ์ด ๋งŽ์ด ๋“œ๋Š” ๊ฐ’์„ *์ฝ๊ณ  ์ ์šฉํ•˜๋Š” ์‹œ์ *์„ ์ง€์—ฐ์‹œํ‚ต๋‹ˆ๋‹ค [4]. ๊ฒ€์ƒ‰์ฐฝ์˜ ์ž…๋ ฅ ๊ฐ’ ๋“ฑ UI ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ์ฆ‰์‹œ ๋ฐ˜์˜ํ•˜๋ฉด์„œ, ํŒŒ์ƒ๋˜๋Š” ๋ฌด๊ฑฐ์šด ๊ณ„์‚ฐ ๋กœ์ง์€ ์•ฝ๊ฐ„ ์ง€์—ฐ์‹œ์ผœ ์‹ค์‹œ๊ฐ„ ํผ์ด๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค์—์„œ์˜ ํ™”๋ฉด ๋Š๊น€(Jank) ํ˜„์ƒ์„ ์ค„์—ฌ์ค๋‹ˆ๋‹ค [4]. - -**์‚ฌ์šฉ ๋ชจ๋ฒ” ์‚ฌ๋ก€ ๋ฐ ํ”„๋ ˆ์ž„์›Œํฌ ์ง€์›** -* ๋™์‹œ์„ฑ ๊ธฐ๋Šฅ์€ ์•ฑ์˜ ๋ชจ๋“  ๊ณณ์ด ์•„๋‹Œ '์ƒํ˜ธ์ž‘์šฉ์ด ์ง‘์ค‘๋œ ๋ทฐ'์— ์ „๋žต์ ์œผ๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [4]. ๋ฐ์ดํ„ฐ๊ฐ€ ๋กœ๋“œ๋˜๋Š” ๋™์•ˆ ๋Œ€์ฒด UI๋ฅผ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด `Suspense`์™€ ๊ฒฐํ•ฉํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค [4]. -* ์ฃผ์˜ํ•  ์ ์€ ๊ตฌ์‹ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜ ๋ Œ๋”๋ง์„ ์ฐจ๋‹จํ•˜๋Š” ํŒจํ„ด(์˜ˆ: ๊ฐ€๋“œ ๋กœ์ง์ด ์—†๋Š” ์˜ค๋ž˜๋œ ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ)๊ณผ ํ˜ผ์šฉํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค [4]. -* ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ๋“ค์€ ์—ฐ์‚ฐ ์†๋„ ์ž์ฒด๋ฅผ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๋†’์ด๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์ž‘์—…์ด ๊ณ„์†๋˜๋Š” ๋™์•ˆ UI๊ฐ€ ๋ฐ˜์‘ํ•˜๋„๋ก ์œ ์ง€ํ•จ์œผ๋กœ์จ '์ฒด๊ฐ ์†๋„(perceived speed)'๋ฅผ ์šฐ์„ ์‹œํ•˜๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค [4]. -* 2025๋…„ ๊ธฐ์ค€ Next.js(App Router), Remix, Vite + React 18 ๋“ฑ ๋Œ€๋ถ€๋ถ„์˜ ์ตœ์‹  ํ’€์Šคํƒ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด ๋™์‹œ์„ฑ ๋ Œ๋”๋ง์„ ์™„์ „ํžˆ ํ†ตํ•ฉํ•˜์—ฌ ์ง€์›ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค [5]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -- [[useTransition]] - - ์—ฐ๊ฒฐ ์ด์œ : ๋™์‹œ์„ฑ ๋ Œ๋”๋ง ํ™˜๊ฒฝ์—์„œ ํŠน์ • ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋ฅผ '๊ธด๊ธ‰ํ•˜์ง€ ์•Š์€ ์ž‘์—…'์œผ๋กœ ๋ช…์‹œ์ ์œผ๋กœ ๋ถ„๋ฅ˜ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ํ•ต์‹ฌ ํ›…์ž…๋‹ˆ๋‹ค [3]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ƒํƒœ ์—…๋ฐ์ดํŠธ์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋‚ฎ์ถ”์–ด ์‚ฌ์šฉ์ž ์ž…๋ ฅ์— ๋Œ€ํ•œ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ ์ฐจ๋‹จ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ์ œ์–ด ๋ฐฉ๋ฒ•. - -- [[useDeferredValue]] - - ์—ฐ๊ฒฐ ์ด์œ : ์—ฐ์‚ฐ ๋น„์šฉ์ด ๋†’์€ ๊ฐ’์˜ ํ™”๋ฉด ์ ์šฉ ์‹œ์ ์„ ๋Šฆ์ถ”์–ด UI์˜ ์ฆ‰๊ฐ์ ์ธ ์ฒด๊ฐ ๋ฐ˜์‘์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๋™์‹œ์„ฑ ๊ธฐ๋Šฅ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [4]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์‚ฌ์šฉ์ž ์ž…๋ ฅ(ํƒ€์ดํ•‘ ๋“ฑ)์˜ ์ฆ‰๊ฐ์ ์ธ ๋ฐ˜์˜๊ณผ ๋ฌด๊ฑฐ์šด ํŒŒ์ƒ ๋ฐ์ดํ„ฐ ๋ Œ๋”๋ง ๊ฐ„์˜ ์ฒ˜๋ฆฌ ์‹œ์ ์„ ๋ถ„๋ฆฌํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜. - -- [[Suspense]] - - ์—ฐ๊ฒฐ ์ด์œ : ๋™์‹œ์„ฑ ํ›…(`useTransition` ๋“ฑ)๊ณผ ๊ฒฐํ•ฉํ•˜์—ฌ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋‚˜ ์ง€์—ฐ๋œ ๋ Œ๋”๋ง์ด ์™„๋ฃŒ๋˜๊ธฐ ์ „๊นŒ์ง€ ์ž์—ฐ์Šค๋Ÿฌ์šด ๋Œ€์ฒด UI(Fallback UI)๋ฅผ ํ‘œ์‹œํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค [4]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ ๊ณผ์ •์—์„œ ๋™์‹œ์„ฑ ๋ Œ๋”๋ง์„ ํ™œ์šฉํ•œ ๋ถ€๋“œ๋Ÿฌ์šด ์‚ฌ์šฉ์ž ๊ฒฝํ—˜(UX) ์„ค๊ณ„ ๋ฐฉ์‹. - -### Deeper Research Questions - -- React์˜ ๋™์‹œ์„ฑ ๋ Œ๋”๋ง ์—”์ง„์€ ๋‚ด๋ถ€์ ์œผ๋กœ ๊ธด๊ธ‰ ์—…๋ฐ์ดํŠธ์™€ ์ง€์—ฐ ์—…๋ฐ์ดํŠธ์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์–ด๋–ค ์Šค์ผ€์ค„๋ง ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š”๊ฐ€? -- `useTransition`๊ณผ `useDeferredValue`๋ฅผ ๋ณต์žกํ•œ ๋‹จ์ผ ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ Œ๋”๋ง ์—ฃ์ง€ ์ผ€์ด์Šค๋‚˜ ์„ฑ๋Šฅ์  ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๋Š” ๋ฌด์—‡์ธ๊ฐ€? -- ๊ตฌ์‹ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(Context API๋ฅผ ์ž˜๋ชป ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋“ฑ)๊ฐ€ React 18์˜ ๋™์‹œ์„ฑ ๋ Œ๋”๋ง ํŒจํ„ด์„ ๋ฐฉํ•ดํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์ •ํ™•ํ•œ ๊ธฐ์ˆ ์  ์›๋ฆฌ(์˜ˆ: Tearing ํ˜„์ƒ)๋Š” ๋ฌด์—‡์ธ๊ฐ€? -- ๋™์‹œ์„ฑ ๋ Œ๋”๋ง์˜ ๋„์ž…์ด ๋ธŒ๋ผ์šฐ์ €์˜ INP(Interaction to Next Paint)์™€ TBT(Total Blocking Time) ์ง€ํ‘œ ์ตœ์ ํ™”์— ์ˆ˜ํ•™์ ์œผ๋กœ ์–ด๋–ค ์—ฐ๊ด€์„ฑ์„ ๊ฐ€์ง€๋Š”๊ฐ€? -- ๋™์‹œ์„ฑ ๋ Œ๋”๋ง์œผ๋กœ ์ธํ•ด ๋ Œ๋”๋ง ํŠธ๋ฆฌ๊ฐ€ ์ค‘๋‹จ(Interrupt)๋˜๊ณ  ํ๊ธฐ๋œ ํ›„ ๋‹ค์‹œ ์‹œ์ž‘๋  ๋•Œ, ๋ถˆํ•„์š”ํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ React์˜ ๋‚ด๋ถ€ ์ตœ์ ํ™” ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ๋ฌด์—‡์ธ๊ฐ€? - -### Practical Application Contexts - -- **Implementation:** ๋ผ์ด๋ธŒ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์ฐฝ, ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ ์„ธํŠธ ํ•„ํ„ฐ๋ง ๊ธฐ๋Šฅ ๊ตฌํ˜„ ์‹œ `useTransition`๊ณผ `useDeferredValue`๋ฅผ ์ ๊ทน ํ™œ์šฉํ•˜์—ฌ ์ž…๋ ฅ ์ค‘ ๋ฐœ์ƒํ•˜๋Š” ํ™”๋ฉด ๋ฉˆ์ถค(Jank) ๋ฐฉ์ง€ [3, 4]. -- **System Design:** ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ ์‹œ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋™์‹œ์„ฑ ๋ Œ๋”๋ง์ด ํ™œ์„ฑํ™”๋œ Next.js App Router๋‚˜ Remix์™€ ๊ฐ™์€ ์ตœ์‹  React ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋„์ž…ํ•˜์—ฌ ๋ฐ˜์‘์„ฑ ์ด์ ์„ ๊ทน๋Œ€ํ™” [5]. -- **Operation / Maintenance:** ๊ธฐ์กด ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ๋ Œ๋”๋ง์„ ์ฐจ๋‹จํ•˜๋Š” ์š”์†Œ(์˜ค๋ž˜๋œ ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ ๋“ฑ)๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•˜๊ณ , ๋™์‹œ์„ฑ ๊ธฐ๋Šฅ์ด ์ถฉ๋Œ ์—†์ด ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋„๋ก ์œ ์ง€๋ณด์ˆ˜ ํ™˜๊ฒฝ ๊ฐœ์„  [4]. -- **Learning Path:** ์ „ํ†ต์ ์ธ '๋™๊ธฐ์  ๋ Œ๋”๋ง(Synchronous Rendering)' ๋ชจ๋ธ์ด ๊ฐ€์ง„ ํ•œ๊ณ„๋ฅผ ๋ฒ—์–ด๋‚˜, ์ž‘์—… ๋‹จ์œ„์˜ ์ผ์‹œ ์ค‘์ง€์™€ ์žฌ๊ฐœ๊ฐ€ ๊ฐ€๋Šฅํ•œ ๋ Œ๋”๋ง ํŒจ๋Ÿฌ๋‹ค์ž„์œผ๋กœ ๊ฐœ๋ฐœ์ž์˜ ์‚ฌ๊ณ  ๋ฐฉ์‹์„ ์ „ํ™˜. -- **My Project Relevance:** ํ˜„์žฌ ์ง„ํ–‰ ์ค‘์ธ ์„œ๋น„์Šค ๋‚ด ๋ฌด๊ฑฐ์šด ๋Œ€์‹œ๋ณด๋“œ ํ™”๋ฉด์ด๋‚˜ ๋ณต์žกํ•œ ๊ฒ€์ƒ‰ ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ์ฒด๊ฐํ•˜๋Š” '์ธ์‹ ์†๋„(Perceived Speed)'๋ฅผ ์ตœ์ ํ™”ํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜ ๊ฐœ์„  ์ง€ํ‘œ๋กœ ํ™œ์šฉ [3, 4]. - -### Adjacent Topics - -- [[React Server Components]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋™์‹œ์„ฑ ๋ Œ๋”๋ง๊ณผ ํ•จ๊ป˜ Next.js App Router ํ™˜๊ฒฝ์˜ ํ•ต์‹ฌ ์„ฑ๋Šฅ ์ตœ์ ํ™” ์ถ•์„ ์ด๋ฃจ๋ฉฐ, ํด๋ผ์ด์–ธํŠธ ์ธก ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค์„ ํš๊ธฐ์ ์œผ๋กœ ์ค„์—ฌ์ฃผ๋Š” ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์˜ ๋ Œ๋”๋ง ์›๋ฆฌ ํƒ๊ตฌ [5, 6]. - -- [[Core Web Vitals (INP/TBT)]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋™์‹œ์„ฑ ๋ Œ๋”๋ง ๊ธฐ๋Šฅ ์ ์šฉ์ด ์›น์˜ ํ•ต์‹ฌ ๋ฐ˜์‘์„ฑ ์ง€ํ‘œ์ธ INP ๋ฐ TBT๋ฅผ ์–ด๋–ป๊ฒŒ ๊ฐœ์„ ํ•˜๋Š”์ง€ ์‹ค์ œ ์„ฑ๋Šฅ ์ธก์ • ํˆด(Chrome DevTools, Lighthouse) ๋ฐ์ดํ„ฐ์™€ ์—ฐ๊ณ„ํ•˜์—ฌ ์กฐ์‚ฌ [7-9]. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Context API to Zustand Migration.md b/00_Raw/Context API to Zustand Migration.md deleted file mode 100644 index d21786f7..00000000 --- a/00_Raw/Context API to Zustand Migration.md +++ /dev/null @@ -1,54 +0,0 @@ -# [[Context API to Zustand Migration]] - -## ๐Ÿ“Œ Brief Summary -Context API์—์„œ Zustand๋กœ์˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์€ React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ Œ๋”๋ง ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ  ์ƒํƒœ ๊ด€๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๋‹จ์ˆœํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜ํ–‰๋˜๋Š” ์•„ํ‚คํ…์ฒ˜ ๊ฐœ์„  ์ž‘์—…์ž…๋‹ˆ๋‹ค [1-3]. ์ „์—ญ ์ƒํƒœ ๋ณ€๊ฒฝ ์‹œ ์ด๋ฅผ ๊ตฌ๋…ํ•˜๋Š” ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์žฌ๋ Œ๋”๋ง๋˜๋Š” Context API์˜ ํƒœ์ƒ์  ํ•œ๊ณ„๋ฅผ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค [1, 2]. ์ƒํƒœ์˜ ํŠน์ • ์กฐ๊ฐ(slice)๋งŒ ๊ตฌ๋…ํ•  ์ˆ˜ ์žˆ๋Š” ์„ ํƒ์ž(Selector) ํŒจํ„ด์„ ์ œ๊ณตํ•˜๋Š” Zustand๋ฅผ ๋„์ž…ํ•จ์œผ๋กœ์จ, ์ ์ง„์ ์œผ๋กœ ํ”„๋กœ์ ํŠธ์˜ ํ™•์žฅ์„ฑ๊ณผ ์ตœ์ ํ™”๋ฅผ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3-5]. - -## ๐Ÿ“– Core Content -* **Context API์˜ ์„ฑ๋Šฅ์  ํ•œ๊ณ„ (Re-render ๋ฌธ์ œ)**: Context API๋Š” ๊ทผ๋ณธ์ ์œผ๋กœ '๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ์‹œ์Šคํ…œ'์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค [1, 6]. Context๊ฐ€ ๊ฐ€์ง„ ์—ฌ๋Ÿฌ ์ƒํƒœ ๊ฐ’ ์ค‘ ํ•˜๋‚˜๋งŒ ๋ณ€๊ฒฝ๋˜๋”๋ผ๋„, `useContext`๋ฅผ ํ†ตํ•ด ํ•ด๋‹น Context๋ฅผ ๊ตฌ๋…ํ•˜๊ณ  ์žˆ๋Š” ๋ชจ๋“  ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žฌ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค [2, 3]. ์ด๋Ÿฌํ•œ ํŠน์„ฑ์œผ๋กœ ์ธํ•ด ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ๋‚˜ ์‚ฌ์šฉ์ž ์ž…๋ ฅ๊ณผ ๊ฐ™์ด ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ณ€๊ฒฝ๋˜๋Š” ์ƒํƒœ(Dynamic state)๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ฑ๋Šฅ์ด ํฌ๊ฒŒ ์ €ํ•˜๋˜๋Š” ์ผ๋ช… '์žฌ๋ Œ๋”๋ง ํญํ’(Re-render storm)'์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [7-9]. -* **Zustand๋ฅผ ํ†ตํ•œ ์„ฑ๋Šฅ ์ตœ์ ํ™” (Selector Pattern)**: Zustand๋Š” ์ƒํƒœ์™€ ์—…๋ฐ์ดํŠธ ๋กœ์ง์„ React ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ ์™ธ๋ถ€์— ์กด์žฌํ•˜๋Š” ํ‰๋ฒ”ํ•œ JavaScript ๊ฐ์ฒด(store)๋กœ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค [10]. Zustand์˜ ํ•ต์‹ฌ์€ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ „์ฒด ์Šคํ† ์–ด๋ฅผ ๊ตฌ๋…ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์„ ํƒ์ž(Selector) ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•„์š”ํ•œ ํŠน์ • ์ƒํƒœ ์กฐ๊ฐ(slice)์—๋งŒ ๊ตฌ๋…ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค [1, 3]. ์ด๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๋Š” ์„ฑ๋Šฅ ์ €ํ•˜ ์—†์ด ๊ธ€๋กœ๋ฒŒ ์ƒํƒœ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3]. -* **ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์ƒํƒœ ๊ด€๋ฆฌ ์•„ํ‚คํ…์ฒ˜**: ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ณผ์ •์—์„œ ๋ชจ๋“  Context๋ฅผ Zustand๋กœ ๊ต์ฒดํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค [11]. ํ…Œ๋งˆ(๋‹คํฌ/๋ผ์ดํŠธ ๋ชจ๋“œ)๋‚˜ ๋‹ค๊ตญ์–ด ์„ค์ •(Locale), ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ(Feature flag)์ฒ˜๋Ÿผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ๋“œ ์‹œ ํ•œ ๋ฒˆ ์„ค์ •๋˜๊ณ  ๊ฑฐ์˜ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ์ •์ ์ธ ์„ค์ • ๊ฐ’์—๋Š” ์—ฌ์ „ํžˆ Context API๊ฐ€ ํ›Œ๋ฅญํ•œ ์„ ํƒ์ง€์ž…๋‹ˆ๋‹ค [11, 12]. ๋ฐ˜๋ฉด ์žฅ๋ฐ”๊ตฌ๋‹ˆ, ์•Œ๋ฆผ ์‹œ์Šคํ…œ, UI ์ƒํƒœ ๋“ฑ ๋™์ ์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒํƒœ๋Š” Zustand ์Šคํ† ์–ด์—์„œ ๊ด€๋ฆฌํ•˜๋„๋ก ์ฑ…์ž„์„ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ด์ƒ์ ์ธ ๋ชจ๋ฒ” ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค [11, 13]. -* **์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜(Incremental Migration) ์ „๋žต**: ๋Œ€๊ทœ๋ชจ ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ์ „์ฒด ์ƒํƒœ๋ฅผ ํ•œ ๋ฒˆ์— ์žฌ์ž‘์„ฑ(Rewrite)ํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์œ„ํ—˜ํ•ฉ๋‹ˆ๋‹ค [4]. ๋Œ€์‹ , ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์˜ ์•Œ๋ฆผ ๊ธฐ๋Šฅ์ฒ˜๋Ÿผ ๋‹จ์ˆœํ•œ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ ๊ฒฐ์ œ ํ๋ฆ„๊ณผ ๊ฐ™์€ ๋ณต์žกํ•œ ๋„๋ฉ”์ธ์œผ๋กœ ์Šคํ† ์–ด๋ฅผ ํ•˜๋‚˜์”ฉ ์ฒœ์ฒœํžˆ ์ด์ „ํ•˜๋Š” ์ ์ง„์  ์ ‘๊ทผ๋ฒ•์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค [4]. ์ด๋ฅผ ํ†ตํ•ด ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ์„ ๋ฉˆ์ถ”์ง€ ์•Š์œผ๋ฉด์„œ๋„ ๋ ˆ๊ฑฐ์‹œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ํ˜„๋Œ€ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [4]. - -## โš–๏ธ Trade-offs & Caveats -* **์œ ์—ฐ์„ฑ์œผ๋กœ ์ธํ•œ ์ผ๊ด€์„ฑ ์ €ํ•˜ ์œ„ํ—˜**: Zustand๋Š” ์ƒ์šฉ๊ตฌ(Boilerplate)๊ฐ€ ๊ฑฐ์˜ ์—†๊ณ  ์„ค๊ณ„๊ฐ€ ๋งค์šฐ ์œ ์—ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ํŒ€ ๋‚ด์— ์—„๊ฒฉํ•œ ์ฝ”๋“œ ์ปจ๋ฒค์…˜์ด ์—†๋‹ค๋ฉด ์‹ฌ๊ฐํ•œ ์ผ๊ด€์„ฑ ๋ฌธ์ œ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [14-16]. ์˜ˆ๋ฅผ ๋“ค์–ด ํŒ€์›๋“ค์ด ๊ฐ๊ฐ ์ฝœ๋ฐฑ, ํ”„๋กœ๋ฏธ์Šค, ์ปค์Šคํ…€ ๋ฏธ๋“ค์›จ์–ด ๋“ฑ ๊ฐ๊ธฐ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ์ฝ”๋“œ๋ฒ ์ด์Šค๊ฐ€ ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [15, 17]. -* **๊ตฌ๋… ๋ฐ ์„ ํƒ์ž(Selector) ๊ด€๋ฆฌ์˜ ์–ด๋ ค์›€**: Zustand๋ฅผ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ์˜ฌ๋ฐ”๋ฅธ ์„ ํƒ์ž ํŒจํ„ด์„ ์ ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ์ปดํฌ๋„ŒํŠธ ๊ตฌ๋…์ด ํญ๋ฐœ์ ์œผ๋กœ ๋Š˜์–ด๋‚˜ ์„ฑ๋Šฅ ์ด์Šˆ๊ฐ€ ์žฌ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [16, 18]. ํŒ€ ๋‚ด ๋ชจ๋“  ๊ฐœ๋ฐœ์ž๊ฐ€ ์„ ํƒ์ž ์‚ฌ์šฉ ๊ทœ์น™์„ ์ˆ™์ง€ํ•ด์•ผ ํ•˜๋Š” ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [18]. -* **์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ํ™˜๊ฒฝ์—์„œ์˜ ํ•œ๊ณ„์ **: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋งค์šฐ ๊ฑฐ๋Œ€ํ•ด์ง€๊ฑฐ๋‚˜ 10๋ช… ์ด์ƒ์˜ ํฐ ํŒ€์ด ์ž‘์—…ํ•  ๊ฒฝ์šฐ, Zustand์˜ ์ž์œ ๋กœ์›€๋ณด๋‹ค๋Š” Redux๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋‹จ์ผ ์ง„์‹ค ๊ณต๊ธ‰์›(Single source of truth)๊ณผ ๊ฐ•์ œ๋œ ๊ตฌ์กฐ, ๊ฐ•๋ ฅํ•œ ๋ฏธ๋“ค์›จ์–ด ์ƒํƒœ๊ณ„, ๋ธŒ๋ผ์šฐ์ € ๋””๋ฒ„๊น… ๋„๊ตฌ๊ฐ€ ๋” ์ ํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [19-21]. ๋”ฐ๋ผ์„œ Zustand๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•œ ์ดํ›„์—๋„, ํ”„๋กœ์ ํŠธ ๋ณต์žก์„ฑ์ด ํŠน์ • ์ž„๊ณ„์ ์„ ๋„˜์œผ๋ฉด ๋‹ค์‹œ Redux๋กœ์˜ ๊ณ ํ†ต์Šค๋Ÿฌ์šด ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ๊ณ„ํšํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [21, 22]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -#### [์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ  (Architecture & Infrastructure)] -- [[Selector Pattern]] - - ์—ฐ๊ฒฐ ์ด์œ : Context API๊ฐ€ ๊ฐ€์ง„ ์ „์ฒด ์žฌ๋ Œ๋”๋ง์˜ ๋งน์ ์„ ๊ทน๋ณตํ•˜๊ณ , Zustand๊ฐ€ ํšจ์œจ์ ์œผ๋กœ ์ƒํƒœ๋ฅผ ๊ตฌ๋…ํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ํ•ต์‹ฌ ๋””์ž์ธ ํŒจํ„ด์ž…๋‹ˆ๋‹ค [1, 3]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ React ๋ Œ๋”๋ง ์‚ฌ์ดํด์— ๊ฐœ์ž…ํ•˜์—ฌ ๋ Œ๋”๋ง ๋ฒ”์œ„๋ฅผ ์ตœ์†Œํ™”ํ•˜๋Š” ๋‚ด๋ถ€ ๋ฉ”์ปค๋‹ˆ์ฆ˜ [3]. - -- [[Re-render Storm]] - - ์—ฐ๊ฒฐ ์ด์œ : Context API ๊ธฐ๋ฐ˜์˜ ํ”„๋กœ์ ํŠธ์—์„œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ๊ฒฐ์‹ฌํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฐ€์žฅ ์น˜๋ช…์ ์ธ ์„ฑ๋Šฅ์  ๋ถ€์ž‘์šฉ์ž…๋‹ˆ๋‹ค [7, 8]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๊นŠ์€ ๋ Œ๋”๋ง ํŠธ๋ฆฌ๊ฐ€ ํ”„๋ก ํŠธ์—”๋“œ ์„ฑ๋Šฅ๊ณผ UX(์ฒด๊ฐ ์†๋„, INP ๋“ฑ)์— ๋ฏธ์น˜๋Š” ์•…์˜ํ–ฅ [2, 7, 8]. - -#### [๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ (Implementation & Tools)] -- [[Incremental Migration]] - - ์—ฐ๊ฒฐ ์ด์œ : ๋Œ€ํ˜• ๋ฆฌํŒฉํ† ๋ง์ด๋‚˜ ๊ตฌ์กฐ์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์ง„ํ–‰ํ•  ๋•Œ ๋ฆฌ์Šคํฌ๋ฅผ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•ด ํ˜„์—…์—์„œ ๊ถŒ์žฅํ•˜๋Š” ์ ์šฉ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค [4]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ ์†๋„์™€ ์ฝ”๋“œ๋ฒ ์ด์Šค ๊ฐœ์„ ์ด๋ผ๋Š” ๋‘ ๊ฐ€์ง€ ๋ชฉํ‘œ๋ฅผ ๋™์‹œ์— ๋‹ฌ์„ฑํ•˜๋Š” ์•ˆ์ •์ ์ธ ์—”์ง€๋‹ˆ์–ด๋ง ์ „๋žต [4]. - -### Deeper Research Questions -- Zustand์˜ ์„ ํƒ์ž(selector) ํŒจํ„ด์„ ์‚ฌ์šฉํ•  ๋•Œ ์–•์€ ๋น„๊ต(shallow comparison)์™€ ๊นŠ์€ ๋น„๊ต(deep comparison)๋ฅผ ์–ด๋–ป๊ฒŒ ์ ์šฉํ•ด์•ผ ์ปดํฌ๋„ŒํŠธ ์žฌ๋ Œ๋”๋ง์„ ๊ฐ€์žฅ ํšจ๊ณผ์ ์œผ๋กœ ์ฐจ๋‹จํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? -- ์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜(Incremental Migration)์„ ์ง„ํ–‰ํ•˜๋Š” ๋™์•ˆ Context API์™€ Zustand๊ฐ€ ๊ณต์กดํ•  ๋•Œ, ๋‘ ์ƒํƒœ ์ €์žฅ์†Œ ๊ฐ„์˜ ์ƒํƒœ ๋™๊ธฐํ™” ๋ฐ ๋‹จ์ผ ์ง„์‹ค ๊ณต๊ธ‰์›(Single Source of Truth) ์›์น™์„ ์–ด๋–ป๊ฒŒ ์œ ์ง€ํ•  ๊ฒƒ์ธ๊ฐ€? -- Zustand๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์œ ์—ฐ์„ฑ์ด ๋‹จ์ ์œผ๋กœ ๋ณ€๋ชจํ•˜๋Š” ๋Œ€๊ทœ๋ชจ ๋น„๋™๊ธฐ ์ƒํƒœ ๊ด€๋ฆฌ ์ƒํ™ฉ์—์„œ, Redux(๋˜๋Š” RTK Query)๋กœ์˜ 2์ฐจ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์ด ํ•„์ˆ˜์ ์ธ ์ž„๊ณ„์ ์€ ๊ตฌ์ฒด์ ์œผ๋กœ ์–ธ์ œ์ธ๊ฐ€? -- Zustand ์Šคํ† ์–ด์˜ ๊ตฌ์กฐ๋ฅผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด๋ฅผ ๋‹ค๋ฃจ๋Š” '๋‹จ์ผ ๊ธ€๋กœ๋ฒŒ ์Šคํ† ์–ด'์™€ ๋„๋ฉ”์ธ ๋‹จ์œ„๋กœ ์ชผ๊ฐœ๋Š” '๋‹ค์ค‘ ์Šคํ† ์–ด'๋กœ ๋‚˜๋ˆŒ ๋•Œ ๊ฐ๊ฐ์˜ ์„ฑ๋Šฅ๊ณผ ์œ ์ง€๋ณด์ˆ˜ ์ธก๋ฉด์˜ ์žฅ๋‹จ์ ์€ ๋ฌด์—‡์ธ๊ฐ€? -- Context API์™€ Zustand๋ฅผ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ํŒจํ„ด์œผ๋กœ ์šด์šฉํ•  ๋•Œ, ์‹œ์Šคํ…œ ๋””์ž์ธ ๊ด€์ ์—์„œ ์ „์—ญ Provider์˜ ๊นŠ์ด(Depth) ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? - -### Practical Application Contexts -- **Implementation:** React์˜ `useContext` ๋ฐ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฐ์‹ธ๋Š” `Provider` ํŒจํ„ด ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ , `create()` ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ์ปดํฌ๋„ŒํŠธ ์™ธ๋ถ€์— ๋ชจ๋“ˆํ™”๋œ Zustand ์Šคํ† ์–ด๋ฅผ ์ •์˜ํ•˜์—ฌ, ์„ ํƒ์ž ํ•จ์ˆ˜๋กœ ํ•„์š”ํ•œ ์ƒํƒœ๋งŒ ๊ฐ€์ ธ์˜ค๋„๋ก ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค [10, 23]. -- **System Design:** ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ ์‹œ, ๋ณ€๊ฒฝ์ด ๋“œ๋ฌธ ์ •์  ์ „์—ญ ๋ฐ์ดํ„ฐ(๋‹คํฌ ๋ชจ๋“œ, ๋กœ์ผ€์ผ, ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ ๋“ฑ)๋Š” ๊ธฐ์กด Context API ํŠธ๋ฆฌ์— ๋‚จ๊ฒจ๋‘๊ณ , ์‚ฌ์šฉ์ž์™€ ์ƒํ˜ธ์ž‘์šฉ์ด ์žฆ์€ ๋ฐ์ดํ„ฐ(์žฅ๋ฐ”๊ตฌ๋‹ˆ, ์‚ฌ์šฉ์ž ์ž…๋ ฅ ๋“ฑ)๋Š” Zustand ์Šคํ† ์–ด๋กœ ๋ถ„๋ฆฌํ•˜๋Š” '์—ญํ•  ๋ถ„๋ฆฌ ์‹œ์Šคํ…œ(ํˆฌํŠธ๋ž™)'์„ ๊ตฌ์ถ•ํ•ฉ๋‹ˆ๋‹ค [11-13]. -- **Operation / Maintenance:** ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฒ ์ด์Šค ๊ฐœ์„  ์‹œ ๋ฆฌ์Šคํฌ๋ฅผ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•ด '์ „์ฒด ์žฌ์ž‘์„ฑ'์„ ์ง€์–‘ํ•˜๊ณ  ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์Šคํ† ์–ด(์˜ˆ: ์•Œ๋ฆผ ๊ธฐ๋Šฅ๋ถ€ํ„ฐ ์‹œ์ž‘)์”ฉ Zustand๋กœ ์ „ํ™˜ํ•˜๋Š” ์ ์ง„์  ์ „๋žต์„ ์ฑ„ํƒํ•˜์—ฌ ์„œ๋น„์Šค ์—ฐ์†์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค [4]. -- **Learning Path:** ์ฒ˜์Œ React์˜ ๋ฐ์ดํ„ฐ ํ๋ฆ„๊ณผ Prop Drilling ๋ฌธ์ œ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ๋‚ด์žฅ ๊ธฐ๋Šฅ์ธ Context API๋ฅผ ์ถฉ๋ถ„ํžˆ ํ•™์Šตํ•œ ํ›„, ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ ๋ Œ๋”๋ง ์„ฑ๋Šฅ ์ด์Šˆ๋ฅผ ๊ฒช์–ด๋ณธ ์‹œ์ ์— Zustand๋ฅผ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์ด ์ตœ์ ์˜ ํ•™์Šต ๊ณก์„ ์„ ํ˜•์„ฑํ•ฉ๋‹ˆ๋‹ค [24]. -- **My Project Relevance:** ํƒ€์ธ์ด ์ž‘์„ฑํ•œ ๊ธฐ์กด React ํ”„๋กœ์ ํŠธ(ํ•™์‚ฌ ์กธ์—… ๋…ผ๋ฌธ ๋“ฑ)๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•  ๋•Œ, ๋ณต์žกํ•˜๊ฒŒ ์–ฝํ˜€์žˆ๋Š” ์ „์—ญ ์ƒํƒœ์™€ ๋ฌด๊ฑฐ์šด Redux ๊ตฌํ˜„์ฒด, ํ˜น์€ ๊ณผ๋„ํ•˜๊ฒŒ ๋‚จ์šฉ๋œ Context API๋ฅผ ํŒŒ์•…ํ•ด Zustand ๊ฐ™์€ ๊ฒฝ๋Ÿ‰ํ™” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋Œ€์ฒดํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ(Client State)๋ฅผ ๋‹จ์ˆœํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5, 9, 25]. - -### Adjacent Topics -- [[TanStack Query (React Query)]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: Zustand๋Š” ์ฃผ๋กœ ์ „์—ญ 'ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ(Client State)'๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋„๊ตฌ์ด๋ฏ€๋กœ, API๋ฅผ ํ†ตํ•œ ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ๋‚˜ ์บ์‹ฑ, ๋กœ๋”ฉ ์ฒ˜๋ฆฌ ๋“ฑ์„ ๋‹ด๋‹นํ•˜๋Š” '์„œ๋ฒ„ ์ƒํƒœ(Server State)' ๊ด€๋ฆฌ ๋„๊ตฌ์ธ TanStack Query์™€ ์–ด๋–ป๊ฒŒ ๊ฒฐํ•ฉํ•˜์—ฌ ์™„์ „ํ•œ ์ƒํƒœ ๊ด€๋ฆฌ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์žฅํ•˜์—ฌ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค [1, 25]. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Context API.md b/00_Raw/Context API.md deleted file mode 100644 index b0dfba57..00000000 --- a/00_Raw/Context API.md +++ /dev/null @@ -1,46 +0,0 @@ -# [[Context API]] - -## ๐Ÿ“Œ Brief Summary -Context API๋Š” React์— ๋‚ด์žฅ๋œ ์ƒํƒœ ๊ณต์œ  ์†”๋ฃจ์…˜์œผ๋กœ, ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ์˜ ๋ชจ๋“  ๋ ˆ๋ฒจ์„ ํ†ตํ•ด ๋ช…์‹œ์ ์œผ๋กœ props๋ฅผ ์ „๋‹ฌํ•˜์ง€ ์•Š๊ณ ๋„ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค [1, 2]. ์ด๋Š” ๋…๋ฆฝ์ ์ธ ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ๋ผ๊ธฐ๋ณด๋‹ค๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ์ „์†ก ๋ฉ”์ปค๋‹ˆ์ฆ˜์— ๊ฐ€๊น์Šต๋‹ˆ๋‹ค [3, 4]. ์ฃผ๋กœ ํ…Œ๋งˆ, ๋‹ค๊ตญ์–ด ์„ค์ • ๋“ฑ ๋ณ€๊ฒฝ์ด ๊ฑฐ์˜ ์—†๋Š” ์ •์ ์ธ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์—ญ์ ์œผ๋กœ ๊ณต์œ ํ•  ๋•Œ ์ ํ•ฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค [5, 6]. - -## ๐Ÿ“– Core Content -* **์ž‘๋™ ๋ฐฉ์‹ ๋ฐ ๊ตฌ์กฐ:** Context API๋Š” `React.createContext()`๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ƒ์„ฑ๋˜๋ฉฐ, ์ƒํƒœ ๊ฐ’์„ ์ œ๊ณตํ•˜๋Š” `Provider`์™€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š” `Consumer`(์‹ค๋ฌด์—์„œ๋Š” ์ฃผ๋กœ `useContext` ํ›…)๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค [4]. Provider๋Š” ๊ฐ’์„ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธํ•˜๊ณ , ํŠธ๋ฆฌ์˜ ์–ด๋А ๊นŠ์ด์— ์žˆ๋“  `useContext`๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ํ•ด๋‹น ๊ฐ’์„ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [4]. ๋‹จ, ์ƒํƒœ ์ž์ฒด๋ฅผ ๊ด€๋ฆฌํ•˜๋ ค๋ฉด `useState`๋‚˜ `useReducer`์™€ ๊ฐ™์€ ํ›…๊ณผ ๋ฐ˜๋“œ์‹œ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [4, 7]. -* **์„ฑ๋Šฅ์  ํ•œ๊ณ„์™€ ๋ฆฌ๋ Œ๋”๋ง ํญํฌ:** Context์˜ ๊ฐ€์žฅ ํฐ ๋‹จ์ ์€ ์„ฑ๋Šฅ ๊ด€๋ฆฌ์ž…๋‹ˆ๋‹ค [8]. Context๋กœ ์ „๋‹ฌ๋˜๋Š” ๊ฐ’ ์ค‘ ์ผ๋ถ€๋งŒ ๋ณ€๊ฒฝ๋˜๋”๋ผ๋„, ํ•ด๋‹น Context๋ฅผ ๊ตฌ๋…ํ•˜๋Š” **๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง**๋ฉ๋‹ˆ๋‹ค [8, 9]. React๋Š” ํŠน์ • ๋ฐ์ดํ„ฐ ๋ถ€๋ถ„๋งŒ ์‚ฌ์šฉํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ตฌ๋ณ„ํ•ด ๋‚ด์ง€ ๋ชปํ•˜๋ฏ€๋กœ, ์ƒํƒœ ๋ณ€๊ฒฝ์ด ์žฆ์€ ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ์ „์ฒด ๋Œ€์‹œ๋ณด๋“œ๊ฐ€ ์ˆ˜ ์ดˆ๊ฐ„ ๋ฉˆ์ถ”๋Š” ๋“ฑ ์‹ฌ๊ฐํ•œ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ์„ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1, 10]. -* **๊ตฌ์กฐ์  ์ตœ์ ํ™” ์ „๋žต:** ์ด๋Ÿฌํ•œ ๋ฆฌ๋ Œ๋”๋ง ๋ฌธ์ œ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ชจ๋“  ์ƒํƒœ๋ฅผ ํ•˜๋‚˜์˜ 'Global Context'์— ๋‹ด๋Š” ์•ˆํ‹ฐ ํŒจํ„ด์„ ํ”ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [11, 12]. ๋Œ€์‹  `ThemeContext`, `NotificationContext`์ฒ˜๋Ÿผ ์ƒํƒœ๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž‘์€ ๋„๋ฉ”์ธ๋ณ„ Context๋กœ ๋ถ„๋ฆฌํ•˜๊ณ , ์ปค์Šคํ…€ ํ›…๊ณผ Selector ํŒจํ„ด์„ ํ™œ์šฉํ•ด ํ•„์š”ํ•œ ๊ฐ’๋งŒ ์Šค์ฝ”ํ”„๋ฅผ ์ขํ˜€ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค [12, 13]. -* **์‚ฌ์šฉ์˜ ์ ํ•ฉ์„ฑ:** ํ…Œ๋งˆ(๋ผ์ดํŠธ/๋‹คํฌ ๋ชจ๋“œ), ์–ธ์–ด ํ™˜๊ฒฝ ์„ค์ •, ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ ๋“ฑ **๋ณ€๊ฒฝ ๋นˆ๋„๊ฐ€ ๋งค์šฐ ๋‚ฎ๊ณ  ์ •์ ์ธ ๋ฐ์ดํ„ฐ**๋ฅผ ๊ณต์œ ํ•˜๊ฑฐ๋‚˜ ์™ธ๋ถ€ ์ข…์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์€ ์ž‘์€ ํ”„๋กœ์ ํŠธ ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฐœ๋ฐœ์— ์™„๋ฒฝํ•œ ์„ ํƒ์ž…๋‹ˆ๋‹ค [5, 6, 14]. ๋ฐ˜๋ฉด, ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ, ์ž์ฃผ ์—…๋ฐ์ดํŠธ๋˜๋Š” ์žฅ๋ฐ”๊ตฌ๋‹ˆ, ๋ณต์žกํ•œ ๋น„๋™๊ธฐ ์ž‘์—…์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋Š” Context๋ฅผ ํ”ผํ•˜๊ณ  Zustand๋‚˜ Redux๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค [15-18]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts -- [[Prop Drilling]] - - ์—ฐ๊ฒฐ ์ด์œ : ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ ๊นŠ๊ฒŒ ์ค‘์ฒฉ๋œ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด ๋ถˆํ•„์š”ํ•œ ์ค‘๊ฐ„ ์ปดํฌ๋„ŒํŠธ๋“ค์„ ๊ฑฐ์ณ์•ผ ํ•˜๋Š” ํŒจํ„ด์ž…๋‹ˆ๋‹ค [2]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Context API๊ฐ€ ํƒ„์ƒํ•˜๊ฒŒ ๋œ ๊ทผ๋ณธ์ ์ธ ๋ฐฐ๊ฒฝ๊ณผ, ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ํŠธ๋ฆฌ ์•„๋ž˜๋กœ "๊ฑด๋„ˆ๋›ฐ์–ด" ์ „๋‹ฌํ•˜๋Š”์ง€ ๊ทธ ๋ชฉ์ ์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2, 19]. -- [[useContext]] - - ์—ฐ๊ฒฐ ์ด์œ : Context API์˜ Provider๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ๊ฐ’์„ ์ฝ๊ธฐ ์œ„ํ•ด ๊ฐœ๋ณ„ ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ ํ˜ธ์ถœํ•˜๋Š” React์˜ ๋‚ด์žฅ ํ›…์ž…๋‹ˆ๋‹ค [4]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ตฌ๋…(Subscription)์ด ๋ฐœ์ƒํ•˜๋Š” ์ •ํ™•ํ•œ ์ง€์ ๊ณผ, ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ ์–ด๋–ค ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฆฌ๋ Œ๋”๋ง์ด ํŠธ๋ฆฌ๊ฑฐ๋˜๋Š”์ง€ ๋ Œ๋”๋ง ๋™์ž‘ ์›๋ฆฌ๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [8]. -- [[Zustand]] - - ์—ฐ๊ฒฐ ์ด์œ : Context API์˜ ๋ฆฌ๋ Œ๋”๋ง ํ•œ๊ณ„์™€ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ๋ฅผ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด ์ž์ฃผ ๋น„๊ต๋˜๊ณ  ์ฑ„ํƒ๋˜๋Š” ๊ฒฝ๋Ÿ‰ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค [20, 21]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Zustand์˜ 'Selector ํŒจํ„ด'์ด ์–ด๋–ป๊ฒŒ ํŠน์ • ์ƒํƒœ ์Šฌ๋ผ์ด์Šค๋งŒ ๊ตฌ๋…ํ•˜๊ฒŒ ํ•˜์—ฌ Context API์˜ "์ „์ฒด ๋ฆฌ๋ Œ๋”๋ง" ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š”์ง€ ์„ฑ๋Šฅ ์ตœ์ ํ™”์˜ ์ฐจ์ด๋ฅผ ๋น„๊ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [8, 10]. - -### Deeper Research Questions -- Context API์™€ ์™ธ๋ถ€ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(Zustand, Redux)๋ฅผ ๋™์ผํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์—์„œ ํšจ์œจ์ ์œผ๋กœ ํ˜ผ์šฉ(Hybrid)ํ•˜๊ธฐ ์œ„ํ•ด, ์ •์  ์ƒํƒœ์™€ ๋™์  ์ƒํƒœ๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ์ตœ์ ์˜ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ ๊ธฐ์ค€์€ ๋ฌด์—‡์ธ๊ฐ€? -- Context API์˜ "๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ" ํŠน์„ฑ์œผ๋กœ ์ธํ•œ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋„๋ฉ”์ธ๋ณ„๋กœ Context๋ฅผ ์ชผ๊ฐค ๋•Œ, ์ฝ”๋“œ์˜ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ์žƒ์ง€ ์•Š์œผ๋ฉด์„œ๋„ ์„ฑ๋Šฅ์„ ์žก์„ ์ˆ˜ ์žˆ๋Š” ์ ์ ˆํ•œ ๋ถ„๋ฆฌ ์ž…๋„(Granularity)๋Š” ์–ด๋А ์ •๋„์ธ๊ฐ€? -- `use-context-selector`์™€ ๊ฐ™์€ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Context API์˜ ๋ฆฌ๋ Œ๋”๋ง ๋ฌธ์ œ๋ฅผ ์šฐํšŒํ•˜๋Š” ๋ฐฉ์‹์€, ์ฒ˜์Œ๋ถ€ํ„ฐ Zustand๋‚˜ Redux๋ฅผ ๋„์ž…ํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„๊ตํ•˜์—ฌ ๋„์ž… ๋น„์šฉ ๋ฐ ์žฅ๊ธฐ์  ํ™•์žฅ์„ฑ ์ธก๋ฉด์—์„œ ์–ด๋–ค ์žฅ๋‹จ์ ์„ ๊ฐ€์ง€๋Š”๊ฐ€? -- ์˜์กด์„ฑ ์ฃผ์ž…(Dependency Injection)์˜ ๋ชฉ์ ์œผ๋กœ Context API๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ, ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ(Jest ๋“ฑ)์ด๋‚˜ Storybook์—์„œ Provider ๋ชจํ‚น(Mocking)์„ ์„ค๊ณ„ํ•  ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์ทจ์•ฝ์ ๊ณผ ํ•ด๊ฒฐ์ฑ…์€ ๋ฌด์—‡์ธ๊ฐ€? -- ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฌด๋ถ„๋ณ„ํ•œ `useEffect`์™€ Context API๊ฐ€ ๊ฒฐํ•ฉ๋˜์—ˆ์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” '๋ฆฌ๋ Œ๋”๋ง ํญํ’(Re-render storm)'์„ React DevTools Profiler๋กœ ์ง„๋‹จํ•˜๊ณ  ๋ฆฌํŒฉํ† ๋งํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ๊ณผ์ •์€ ์–ด๋–ป๊ฒŒ ๋˜๋Š”๊ฐ€? - -### Practical Application Contexts -- **Implementation:** React ํ”„๋กœ์ ํŠธ์—์„œ `React.createContext()`๋กœ ํ…Œ๋งˆ๋‚˜ ๋กœ์ผ€์ผ ์ •๋ณด๋ฅผ ์ •์˜ํ•˜๊ณ , ์ตœ์ƒ์œ„ ๋ ˆ์ด์–ด(`app/` ๋˜๋Š” ์ตœ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ)๋ฅผ `Provider`๋กœ ๊ฐ์‹ผ ๋’ค, ๋‚ด๋ถ€ ์ปดํฌ๋„ŒํŠธ์—์„œ `useContext`๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ์„ค์ •๊ฐ’์„ ๋ถˆ๋Ÿฌ์™€ UI์— ์ฆ‰๊ฐ์ ์œผ๋กœ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค [4, 22, 23]. -- **System Design:** ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ ์‹œ ์ƒํƒœ์˜ '๋ณ€๊ฒฝ ๋นˆ๋„'์— ๋”ฐ๋ผ ์ €์žฅ์†Œ๋ฅผ ์ด์›ํ™”ํ•ฉ๋‹ˆ๋‹ค. ๋‹คํฌ๋ชจ๋“œ, ๋กœ๊ทธ์ธ ์—ฌ๋ถ€ ๊ฐ™์€ ์ •์ ์ธ ์„ค์ •์€ Context API์— ๋ฐฐ์น˜ํ•˜๊ณ , ์žฅ๋ฐ”๊ตฌ๋‹ˆ๋‚˜ ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ์ฒ˜๋Ÿผ ์ˆ˜์‹œ๋กœ ๋ณ€ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋Š” Zustand๋‚˜ Redux ๊ฐ™์€ ์™ธ๋ถ€ ์Šคํ† ์–ด์— ๋ฐฐ์น˜ํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง ์ „ํŒŒ๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค [24]. -- **Operation / Maintenance:** ์„ฑ๋Šฅ ํ”„๋กœํŒŒ์ผ๋ง ์‹œ ์‚ฌ์šฉ์ž ์ธํ„ฐ๋ž™์…˜ ์ดํ›„ ๋Œ€์‹œ๋ณด๋“œ๊ฐ€ ์ผ์‹œ์ ์œผ๋กœ ๋ฉˆ์ถ”๋Š” ํ˜„์ƒ์ด ๋ฐœ๊ฒฌ๋˜๋ฉด, React DevTools์˜ Profiler๋ฅผ ์ด์šฉํ•ด ์›์ธ์„ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค. ์›์ธ์ด ๋‹จ์ผ Context ์—…๋ฐ์ดํŠธ์— ์˜ํ•œ ์ˆ˜๋ฐฑ ๊ฐœ ์ปดํฌ๋„ŒํŠธ์˜ ๋ฆฌ๋ Œ๋”๋ง์œผ๋กœ ํ™•์ธ๋  ๊ฒฝ์šฐ, Context๋ฅผ ์ž˜๊ฒŒ ์ชผ๊ฐœ๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋Š” ์œ ์ง€๋ณด์ˆ˜ ๊ฒฐ์ •์„ ๋‚ด๋ฆฝ๋‹ˆ๋‹ค [1, 25]. -- **Learning Path:** React ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ์ฒ˜์Œ ๋ฐฐ์šฐ๋Š” ๋‹จ๊ณ„์—์„œ, ์ปดํฌ๋„ŒํŠธ ๊ฐ„ Props ์ „๋‹ฌ์˜ ํ”ผ๋กœ๋„๋ฅผ ์ค„์ด๋Š” ์ฒซ ๋ฒˆ์งธ ๋„๊ตฌ๋กœ ํ•™์Šต๋ฉ๋‹ˆ๋‹ค. ์ดํ›„ ์‹ค์ œ ๋ณต์žกํ•œ ์•ฑ์„ ๋งŒ๋“ค๋ฉฐ ํ•œ๊ณ„๋ฅผ ๊ฒฝํ—˜ํ•˜๊ณ , Redux์˜ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ๊ตฌ์กฐ๋‚˜ Zustand์˜ ๋…๋ฆฝ๋œ ์Šคํ† ์–ด ๊ฐœ๋…์„ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ฐ›์•„๋“ค์ด๊ฒŒ ํ•˜๋Š” ํ•ต์‹ฌ ํ•™์Šต ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค [14, 26, 27]. -- **My Project Relevance:** ๊ธฐ์กด ์ฝ”๋“œ๋ฒ ์ด์Šค์— 'Global Context' ์•ˆํ‹ฐ ํŒจํ„ด(๋ชจ๋“  ์ƒํƒœ๋ฅผ ํ•œ ๊ณณ์— ๋ชฐ์•„๋„ฃ์€ ํ˜•ํƒœ)์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š”์ง€ ์ ๊ฒ€ํ•˜๊ณ  [11], ๋ Œ๋”๋ง ๋ณ‘๋ชฉ์ด ์žˆ๋Š” ๊ฒฝ์šฐ `useMemo`, `useCallback`๊ณผ ํ•จ๊ป˜ Context๋ฅผ ์ฑ…์ž„๋ณ„๋กœ ๋ถ„ํ• ํ•˜๋Š” ๋ฆฌํŒฉํ† ๋ง ๋ชฉํ‘œ์™€ ์ง์ ‘์ ์œผ๋กœ ์—ฐ๊ด€๋ฉ๋‹ˆ๋‹ค [1, 12]. - -### Adjacent Topics -- [[React.memo]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: Context API์— ์˜ํ•ด ๋ฐœ์ƒํ•˜๋Š” ๋ถˆํ•„์š”ํ•œ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์–•์€ ๋น„๊ต(Shallow Compare) ์ตœ์ ํ™” ๋„๊ตฌ๋กœ, ๋ Œ๋”๋ง ์„ฑ๋Šฅ ์ตœ์ ํ™”(Performance Optimization) ๊ธฐ๋ฒ• ์ „๋ฐ˜์œผ๋กœ์˜ ์ดํ•ด๋ฅผ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค [28, 29]. -- [[Concurrent Rendering]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: React 18์˜ ๋™์‹œ์„ฑ ๋ Œ๋”๋ง ๊ธฐ๋Šฅ(`useTransition`, `useDeferredValue`)์„ ํ†ตํ•ด ๋ฌด๊ฑฐ์šด ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง์„ ์–ด๋–ป๊ฒŒ ์ง€์—ฐ์‹œํ‚ค๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฐ˜์‘์„ฑ์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ƒํƒœ ์—…๋ฐ์ดํŠธ ํ๋ฆ„์œผ๋กœ ํƒ๊ตฌ๋ฅผ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค [6, 30]. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Debugging Frontend Applications.md b/00_Raw/Debugging Frontend Applications.md deleted file mode 100644 index 51a64a0b..00000000 --- a/00_Raw/Debugging Frontend Applications.md +++ /dev/null @@ -1,74 +0,0 @@ -# [[Debugging Frontend Applications]] - -## ๐Ÿ“Œ Brief Summary -ํ”„๋ก ํŠธ์—”๋“œ ๋””๋ฒ„๊น…์€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ, ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜, ๊ทธ๋ฆฌ๊ณ  ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง๊ณผ ๊ฐ™์€ ์„ฑ๋Šฅ ์ €ํ•˜ ์š”์ธ์„ ์‹๋ณ„ํ•˜๊ณ  ํ•ด๊ฒฐํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค [1-3]. Chrome DevTools์™€ ๊ฐ™์€ ๋ธŒ๋ผ์šฐ์ € ๋‚ด์žฅ ๋„๊ตฌ๋ถ€ํ„ฐ React DevTools, ๊ทธ๋ฆฌ๊ณ  Sentry๋‚˜ LogRocket๊ณผ ๊ฐ™์€ ํ”„๋กœ๋•์…˜ ํด๋ผ์šฐ๋“œ ๋กœ๊น… ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฌธ์ œ์˜ ๊ทผ๋ณธ ์›์ธ์„ ์ถ”์ ํ•ฉ๋‹ˆ๋‹ค [4-7]. ํšจ๊ณผ์ ์ธ ๋””๋ฒ„๊น… ์ „๋žต๊ณผ ์—๋Ÿฌ ํ•ธ๋“ค๋ง ์•„ํ‚คํ…์ฒ˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•˜๊ณ  ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์ตœ์ ํ™”ํ•˜๋Š” ๋ฐ ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค [8-10]. - -## ๐Ÿ“– Core Content - -* **๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜(Memory Leaks) ํƒ์ง€ ๋ฐ ํ•ด๊ฒฐ:** - * ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋Š” ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š์Œ์—๋„ ํ•ด์ œ๋˜์ง€ ์•Š์„ ๋•Œ ๋ฐœ์ƒํ•˜๋ฉฐ, ์•ฑ ์†๋„ ์ €ํ•˜์™€ ๋ธŒ๋ผ์šฐ์ € ํƒญ ์ถฉ๋Œ์„ ์œ ๋ฐœํ•ฉ๋‹ˆ๋‹ค [2, 11]. - * Chrome DevTools์˜ Task Manager๋ฅผ ํ†ตํ•ด ์‹ค์‹œ๊ฐ„ JavaScript ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ํ™•์ธํ•˜๊ณ , Performance ํƒญ์˜ ๊ธฐ๋ก์„ ํ†ตํ•ด ์‹œ๊ฐ„ ๊ฒฝ๊ณผ์— ๋”ฐ๋ฅธ ๋ฉ”๋ชจ๋ฆฌ ์ฆ๊ฐ€ ํŒจํ„ด์„ ์‹œ๊ฐํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [12, 13]. - * Memory ํŒจ๋„์˜ **Heap Snapshots**์„ ์‚ฌ์šฉํ•˜์—ฌ ์Šค๋ƒ…์ƒท ๊ฐ„์˜ ์ฐจ์ด(Delta)๋ฅผ ๋น„๊ตํ•จ์œผ๋กœ์จ, DOM์—์„œ ์ œ๊ฑฐ๋˜์—ˆ์œผ๋‚˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฐธ์กฐ๊ฐ€ ๋‚จ์•„์žˆ๋Š” 'Detached DOM nodes'๋ฅผ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [14-17]. ๋˜ํ•œ, **Allocation Timeline**์„ ํ†ตํ•ด ์ƒˆ๋กœ์šด ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์–ธ์ œ ํ• ๋‹น๋˜๋Š”์ง€ ์ถ”์ ํ•˜์—ฌ ๋ˆ„์ˆ˜ ํ›„๋ณด๋ฅผ ์ฐพ์•„๋ƒ…๋‹ˆ๋‹ค [18, 19]. -* **React ์ปดํฌ๋„ŒํŠธ ๋ฐ ์„ฑ๋Šฅ ๋””๋ฒ„๊น…:** - * **๋ฆฌ๋ Œ๋”๋ง ์›์ธ ์ถ”์ :** React DevTools์˜ Profiler๋ฅผ ์‚ฌ์šฉํ•ด ์–ด๋–ค ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ธ์ œ, ์™œ ๋ Œ๋”๋ง๋˜์—ˆ๋Š”์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ฐœ๋ฐœ ์ „์šฉ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ `why-did-you-render`๋ฅผ ํ†ตํ•ด ์‹ค์ œ props๋‚˜ ์ƒํƒœ ๋ณ€๊ฒฝ ์—†์ด ๋ฐœ์ƒํ•˜๋Š” ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ์ฝ˜์†” ๊ฒฝ๊ณ ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [7, 20]. - * **React Error Boundaries:** React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” Error Boundary๋ผ๋Š” ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ์˜ ๋ Œ๋”๋ง, ์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ, ์ƒ์„ฑ์ž์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ๋ฅผ ํฌ์ฐฉํ•ฉ๋‹ˆ๋‹ค [1]. ์ด๋Š” UI๋ฅผ ์œ„ํ•œ `try-catch` ๋ธ”๋ก ์—ญํ• ์„ ํ•˜๋ฉฐ, ์•ฑ ์ „์ฒด๊ฐ€ ์ถฉ๋Œํ•˜๋Š” ๋Œ€์‹  Fallback UI๋ฅผ ํ‘œ์‹œํ•˜์—ฌ ์•ฑ์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์„ ์ƒํ˜ธ์ž‘์šฉ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋กœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค [1, 8, 10]. -* **์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ์™€ ๋””๋ฒ„๊น… ํŽธ์˜์„ฑ:** - * ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ์˜ ์„ ํƒ์€ ๋””๋ฒ„๊น… ๊ฒฝํ—˜์— ํฐ ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค. Context API๋Š” ์ƒํƒœ ๋ณ€๊ฒฝ ๊ธฐ๋ก ์ถ”์ ์ด๋‚˜ ์‹œ๊ฐ„ ์—ฌํ–‰(Time-travel) ๋””๋ฒ„๊น…์ด ๋ถˆ๊ฐ€๋Šฅํ•˜์—ฌ ๋ฒ„๊ทธ ์›์ธ์„ ํŒŒ์•…ํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค [21]. ๋ฐ˜๋ฉด, Redux๋Š” Redux DevTools๋ฅผ ํ†ตํ•ด ์–ด๋–ค ์•ก์…˜์ด ์–ธ์ œ ๋””์ŠคํŒจ์น˜๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ์ƒํƒœ ์ด๋ ฅ์„ ๊ฒ€์‚ฌ ๋ฐ ์žฌ์ƒ(Replay)ํ•  ์ˆ˜ ์žˆ์–ด ๋ณต์žกํ•œ ๋น„๋™๊ธฐ ์—๋Ÿฌ๋ฅผ ์‹ ์†ํ•˜๊ฒŒ ๋””๋ฒ„๊น…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [21, 22]. -* **ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ๋กœ๊น…:** - * ๋ฐฐํฌ๋œ ํ”„๋กœ๋•์…˜ ์•ฑ์—์„œ๋Š” Sentry, LogRocket, Datadog RUM ๋“ฑ์˜ ํด๋ผ์šฐ๋“œ ๋กœ๊น… ํˆด์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž๊ฐ€ ๊ฒฝํ—˜ํ•˜๋Š” ์—๋Ÿฌ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค [23-25]. - * Sentry๋Š” ์ง€๋Šฅํ˜• ์—๋Ÿฌ ๊ทธ๋ฃนํ™”(Error grouping)์™€ ์—๋Ÿฌ ๋ฐœ์ƒ ์ „์˜ ์ฝ˜์†” ๋กœ๊ทธ, ๋„คํŠธ์›Œํฌ ์š”์ฒญ ๋“ฑ์„ ๋ณด์—ฌ์ฃผ๋Š” ๋นต๋ถ€์Šค๋Ÿฌ๊ธฐ(Breadcrumb) ํŠธ๋ ˆ์ผ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [4, 25]. LogRocket์€ ์‚ฌ์šฉ์ž์˜ ์ „์ฒด ํ™”๋ฉด์„ ๋…นํ™”ํ•˜๋“ฏ DOM ๋ฐ Redux/Vuex ์ƒํƒœ ๋ณ€ํ™”๊นŒ์ง€ ์บก์ฒ˜ํ•˜๋Š” ์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด(Session replay) ๊ธฐ๋Šฅ์œผ๋กœ ์ƒ์„ธํ•œ ๋””๋ฒ„๊น… ์ปจํ…์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [5]. Datadog RUM์€ ํ”„๋ก ํŠธ์—”๋“œ ์—๋Ÿฌ๋ฅผ ๋ฐฑ์—”๋“œ ๋ถ„์‚ฐ ํŠธ๋ ˆ์ด์‹ฑ(Distributed tracing)๊ณผ ์ƒ๊ด€๊ด€๊ณ„ ์ง€์–ด(Correlation) ๋ณต์žกํ•œ ์‹œ์Šคํ…œ์˜ ์—๋Ÿฌ๋ฅผ ํŒŒ์•…ํ•˜๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค [24]. - -## โš–๏ธ Trade-offs & Caveats - -* **ํด๋ผ์šฐ๋“œ ๋กœ๊น… ๋„๊ตฌ์˜ ์„ฑ๋Šฅ ๋ฐ ๋น„์šฉ ๋ฌธ์ œ:** ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ๋“ค์€ ๋ Œ๋”๋ง ์„ฑ๋Šฅ ๋ฐ ๋ฒˆ๋“ค ํฌ๊ธฐ์— ์ง์ ‘์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค. ์ผ๋ถ€ ๋„๊ตฌ ๊ตฌํ˜„ ์‹œ ์ตœ๋Œ€ 120ms์˜ ์ถ”๊ฐ€ ๋กœ๋“œ ์‹œ๊ฐ„์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [26]. ๋˜ํ•œ, Datadog๊ณผ ๊ฐ™์€ ํˆด์€ ๋กœ๊ทธ ์ˆ˜์ง‘(Ingest)๊ณผ ๊ฒ€์ƒ‰์„ ์œ„ํ•œ ์ธ๋ฑ์‹ฑ(Index)์— ๋Œ€ํ•ด ์ด์ค‘ ๊ณผ๊ธˆ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด ๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ๋น„์šฉ์ด ๋งค์šฐ ๊ฐ€ํŒŒ๋ฅด๊ฒŒ ์ฆ๊ฐ€ํ•˜๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค [27, 28]. -* **์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด์™€ ๊ฐœ์ธ์ •๋ณด ์นจํ•ด (Privacy Concerns):** LogRocket์ฒ˜๋Ÿผ '๋ชจ๋“  ๊ฒƒ์„ ์บก์ฒ˜'ํ•˜๋Š” ์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด ๋ฐฉ์‹์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ•๋ ฅํ•œ ๋””๋ฒ„๊น… ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜์ง€๋งŒ, ๋ฏผ๊ฐํ•œ ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๊นŒ์ง€ ๋…นํ™”๋  ์ˆ˜ ์žˆ๋Š” ์‹ฌ๊ฐํ•œ ๊ฐœ์ธ์ •๋ณด ์นจํ•ด ์šฐ๋ ค๊ฐ€ ๋™๋ฐ˜๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ณ„๋„์˜ ๋งˆ์Šคํ‚น ๋ฐ ์„ค์ • ์ž‘์—…์ด ๊ฐ•์ œ๋ฉ๋‹ˆ๋‹ค [5, 29, 30]. -* **Error Boundaries์˜ ํ•œ๊ณ„:** ์„ ์–ธ์ ์ธ UI ์—๋Ÿฌ ์ฒ˜๋ฆฌ์— ๊ฐ•๋ ฅํ•˜์ง€๋งŒ, ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ๋‚ด๋ถ€์˜ ์—๋Ÿฌ, `setTimeout` ๊ฐ™์€ ๋น„๋™๊ธฐ ์ฝ”๋“œ, ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง(SSR), ๊ทธ๋ฆฌ๊ณ  Error Boundary ์ž์ฒด์—์„œ ๋ฐœ์ƒํ•œ ์—๋Ÿฌ๋Š” ํฌ์ฐฉํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ถ€๋ถ„์€ ์ „ํ†ต์ ์ธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ `try/catch` ๋ธ”๋ก์œผ๋กœ ๋””๋ฒ„๊น… ๋ฐ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์•ผ ํ•˜๋Š” ์ œ์•ฝ์ด ์žˆ์Šต๋‹ˆ๋‹ค [31, 32]. -* **React Compiler ๋„์ž…์— ๋”ฐ๋ฅธ ๋””๋ฒ„๊น… ๋‚œ์ด๋„ ์ฆ๊ฐ€:** ์ฝ”๋“œ๋ฅผ ์ž๋™์œผ๋กœ ์ตœ์ ํ™”ํ•ด์ฃผ๋Š” React Compiler๋Š” ๋‚ด๋ถ€ ๋กœ์ง์ด ๋ธ”๋ž™๋ฐ•์Šค(Black box) ํ˜•ํƒœ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” ์ตœ์ ํ™”๋œ ๋ถ€๋ถ„๊ณผ ๊ทธ ์ด์œ ์— ๋Œ€ํ•œ ๊ฐ€์‹œ์„ฑ์„ ์žƒ๊ฒŒ ๋˜๋ฉฐ, ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๋ฆฌ๋ Œ๋”๋ง ๋ฐœ์ƒ ์‹œ ์ฝ”๋“œ์ƒ์˜ `React.memo`๋‚˜ `useCallback` ํ˜ธ์ถœ์„ ํ™•์ธํ•˜๋Š” ๋Œ€์‹  React DevTools Profiler์— ์ „์ ์œผ๋กœ ์˜์กดํ•ด ์กฐ์‚ฌํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋””๋ฒ„๊น… ๋‚œ์ด๋„๊ฐ€ ์ƒ์Šนํ•ฉ๋‹ˆ๋‹ค [33]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -#### [๊ด€๊ณ„ ์œ ํ˜• A (๋ธŒ๋ผ์šฐ์ € ๋ฐ ์„ฑ๋Šฅ ๋ถ„์„ ๊ธฐ๋ฐ˜ ๋„๊ตฌ)] -- [[Chrome DevTools]] - - ์—ฐ๊ฒฐ ์ด์œ : ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํž™ ๋ฉ”๋ชจ๋ฆฌ์™€ DOM์˜ ์ƒํƒœ๋ฅผ ํ”„๋กœํŒŒ์ผ๋งํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ์ง„๋‹จํ•˜๋Š” ๊ฐ€์žฅ ๊ทผ๋ณธ์ ์ธ ํ”„๋ก ํŠธ์—”๋“œ ๋””๋ฒ„๊น… ๋„๊ตฌ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [6, 34]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ธŒ๋ผ์šฐ์ €์˜ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜(GC) ๋™์ž‘ ์›๋ฆฌ, ๋ถ„๋ฆฌ๋œ DOM ๋…ธ๋“œ(Detached DOM nodes)์™€ ํด๋กœ์ €(Closure)๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ์œ ํ•˜์—ฌ ์„ฑ๋Šฅ์„ ์ €ํ•˜์‹œํ‚ค๋Š” ์›๋ฆฌ๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2, 14, 17, 35]. - -#### [๊ด€๊ณ„ ์œ ํ˜• B (React ์ปดํฌ๋„ŒํŠธ ๋ฐ ์—๋Ÿฌ ํ•ธ๋“ค๋ง ๋„๊ตฌ)] -- [[React Error Boundaries]] - - ์—ฐ๊ฒฐ ์ด์œ : ๋ Œ๋”๋ง ๋ฐ ์ƒ๋ช…์ฃผ๊ธฐ ๋„์ค‘ ๋ฐœ์ƒํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๋ฅผ ๋””๋ฒ„๊น…/ํ•ธ๋“ค๋งํ•˜์—ฌ "ํ•˜์–€ ํ™”๋ฉด(White screen of death)"์„ ๋ง‰์•„์ฃผ๋Š” React๋งŒ์˜ ๊ณ ์œ ํ•œ ๋ฐฉ์–ด์  ๋””๋ฒ„๊น… ํŒจํ„ด์ž…๋‹ˆ๋‹ค [1, 36]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์„ ์–ธ์ (Declarative) UI ํŠธ๋ฆฌ์˜ ์—๋Ÿฌ ์ „ํŒŒ ๋ฐฉ์‹๊ณผ, ๋ช…๋ นํ˜•(Imperative) ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์—์„œ `try-catch`๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜์  ์ฐจ์ด๋ฅผ ๋ช…ํ™•ํžˆ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [32]. -- [[React DevTools Profiler]] - - ์—ฐ๊ฒฐ ์ด์œ : ์–ด๋–ค ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ธ์ œ, ์™œ ๋ฆฌ๋ Œ๋”๋ง๋˜์—ˆ๋Š”์ง€๋ฅผ ์ธก์ •(Profiling)ํ•˜์—ฌ ๋ Œ๋”๋ง ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ๋””๋ฒ„๊น…ํ•˜๋Š” ํ•„์ˆ˜ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค [7, 37]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: React์˜ ๋ Œ๋”๋ง ๋ผ์ดํ”„์‚ฌ์ดํด, ๋ถˆํ•„์š”ํ•œ ์ƒํƒœ ๋ฐ props ๋ณ€๊ฒฝ ์ถ”์ , ๊ทธ๋ฆฌ๊ณ  React Compiler ๋„์ž… ์ „ํ›„์˜ ๋ Œ๋”๋ง ํŒจ์Šค(Render pass) ์ฐจ์ด๋ฅผ ๊ฒ€์ฆํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [7, 38]. - -#### [๊ด€๊ณ„ ์œ ํ˜• C (ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ ๊ด€์ธก์„ฑ ๋„๊ตฌ)] -- [[Session Replay & Distributed Tracing]] - - ์—ฐ๊ฒฐ ์ด์œ : ๋กœ์ปฌ์—์„œ ์žฌํ˜„์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ํ”„๋กœ๋•์…˜ ์—๋Ÿฌ๋ฅผ ์ถ”์ ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ์ž์˜ ๋ธŒ๋ผ์šฐ์ € ์ƒํ˜ธ์ž‘์šฉ(Sentry, LogRocket)๊ณผ ๋ฐฑ์—”๋“œ ๋ฐ์ดํ„ฐ ํ๋ฆ„(Datadog)์„ ์—ฐ๊ฒฐํ•˜์—ฌ ๋””๋ฒ„๊น… ๋‹จ์„œ๋ฅผ ์ฐพ๋Š” ํ•ต์‹ฌ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค [5, 24, 39]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํ’€์Šคํƒ ํ™˜๊ฒฝ์—์„œ์˜ ์—”๋“œํˆฌ์—”๋“œ(End-to-End) ์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง ํ•œ๊ณ„์™€ ํ”„๋ก ํŠธ์—”๋“œ ์—๋Ÿฌ๊ฐ€ ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค์— ๋ฏธ์น˜๋Š” ์—ฐ๊ด€ ๊ด€๊ณ„๋ฅผ ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [24, 25]. - -### Deeper Research Questions - -- Chrome DevTools์˜ Heap Snapshot ๋ถ„์„์—์„œ 'Shallow size'์™€ 'Retained size'์˜ ์ฐจ์ด๋Š” ํ”„๋ก ํŠธ์—”๋“œ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ์ธก๋ฉด์—์„œ ์–ด๋–ป๊ฒŒ ํ•ด์„๋˜๋ฉฐ, ๋””๋ฒ„๊น… ์‹œ ์–ด๋–ค ๊ธฐ์ค€ํ‘œ๊ฐ€ ๋˜๋Š”๊ฐ€? [40] -- React Error Boundary๊ฐ€ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋‚˜ ๋น„๋™๊ธฐ ์ฝ”๋“œ์˜ ์—๋Ÿฌ๋ฅผ ์žก์ง€ ๋ชปํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜์  ์ด์œ ๋Š” ๋ฌด์—‡์ด๋ฉฐ, ์ด๋ฅผ ๋ณด์™„ํ•˜์—ฌ ์ „์ฒด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์—๋Ÿฌ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ์บก์ฒ˜ํ•˜๊ธฐ ์œ„ํ•œ ์ตœ์ ์˜ ๋กœ๊น… ํŒจํ„ด์€ ๋ฌด์—‡์ธ๊ฐ€? [31, 32] -- Sentry, LogRocket, Datadog RUM ๋“ฑ ํด๋ผ์šฐ๋“œ ๊ธฐ๋ฐ˜ ๋กœ๊น… ๋„๊ตฌ๊ฐ€ ํ”„๋ก ํŠธ์—”๋“œ ๋ฒˆ๋“ค ํฌ๊ธฐ ์ฆ๊ฐ€ ๋ฐ ์ดˆ๊ธฐ ๋ Œ๋”๋ง ์„ฑ๋Šฅ ์ง€์—ฐ(์ตœ๋Œ€ 120ms ์ถ”๊ฐ€ ๋กœ๋“œ)์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•œ ์„ค์ • ๋ฐ ๋กœ๋“œ ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? [26, 41] -- Redux DevTools์˜ ์‹œ๊ฐ„ ์—ฌํ–‰(Time-travel) ๋””๋ฒ„๊น… ์›๋ฆฌ๋Š” ๋ฌด์—‡์ด๋ฉฐ, ์™œ Context API๋‚˜ Zustand๋ณด๋‹ค ๋ณต์žกํ•œ ๋น„๋™๊ธฐ ์ƒํƒœ์˜ ๋ฒ„๊ทธ๋ฅผ ๋” ๋น ๋ฅด๊ณ  ์ •ํ™•ํ•˜๊ฒŒ ์ฐพ์•„๋‚ผ ์ˆ˜ ์žˆ๋Š”๊ฐ€? [21, 22] -- React Compiler ๋„์ž… ์ดํ›„ ์ž๋™ํ™”๋œ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ Œ๋”๋ง ์ด์Šˆ(์˜ˆ: Library Compatibility ๋ฌธ์ œ๋กœ ์ธํ•œ ์ฐธ์กฐ ๋ณ€๊ฒฝ)๋ฅผ ๋””๋ฒ„๊น…ํ•˜๊ธฐ ์œ„ํ•ด React Profiler๋ฅผ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•ด์•ผ ํ•˜๋Š”๊ฐ€? [33, 42, 43] - -### Practical Application Contexts - -- **Implementation:** ๊ฐœ๋ฐœ์ž๋Š” `why-did-you-render` ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ”„๋กœ์ ํŠธ์— ์—ฐ๋™ํ•ด, ๋กœ์ปฌ ๊ฐœ๋ฐœ ์‹œ ๋ถˆํ•„์š”ํ•œ ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง ์›์ธ์„ ์ฝ˜์†” ๊ฒฝ๊ณ ๋ฅผ ํ†ตํ•ด ์ฆ‰๊ฐ์ ์œผ๋กœ ํŒŒ์•…ํ•˜๊ณ  ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [20, 44]. -- **System Design:** ํ”„๋ก ํŠธ์—”๋“œ ์‹œ์Šคํ…œ ์„ค๊ณ„ ์‹œ ๋Œ€์‹œ๋ณด๋“œ, ์ฐจํŠธ, ๋ณต์žกํ•œ ํผ ๋“ฑ ์žฅ์•  ๋ฐœ์ƒ ํ™•๋ฅ ์ด ๋†’์€ UI ์ปดํฌ๋„ŒํŠธ ๊ฐ๊ฐ์— ๋…๋ฆฝ์ ์ธ `Error Boundary`๋ฅผ ๋ฐฐ์น˜ํ•ด ํ•˜๋‚˜์˜ ์œ„์ ฏ ๊ฒฐํ•จ์ด ์ „์ฒด ์•ฑ์˜ ๋งˆ๋น„๋ฅผ ๊ฐ€์ ธ์˜ค์ง€ ์•Š๋„๋ก ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค [8, 45, 46]. -- **Operation / Maintenance:** ํ”„๋กœ๋•์…˜ ๋‹จ๊ณ„์—์„œ๋Š” Sentry๋‚˜ LogRocket๊ณผ ๊ฐ™์€ ๊ด€์ธก์„ฑ(Observability) ํˆด์„ ํ†ตํ•ฉํ•˜์—ฌ, ์˜ค๋ฅ˜ ๋กœ๊ทธ ๋ฐœ์ƒ ์‹œ ์‚ฌ์šฉ์ž๊ฐ€ ํด๋ฆญํ•œ ์ด๋ฒคํŠธ์™€ ํ™”๋ฉด์˜ ์ƒํƒœ(Session Replay)๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํ™•์ธํ•˜๊ณ  ๋น ๋ฅด๊ฒŒ ์ด์Šˆ๋ฅผ ๋Œ€์‘(Hotfix)ํ•ฉ๋‹ˆ๋‹ค [5, 25, 47]. -- **Learning Path:** ์ฃผ๋‹ˆ์–ด ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ํ•™์Šตํ•  ๋•Œ, Chrome DevTools์˜ Memory ํƒญ์„ ์‚ฌ์šฉํ•ด ์Šค๋ƒ…์ƒท์„ ์ฐ๊ณ  DOM ๋…ธ๋“œ๊ฐ€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ณ€์ˆ˜์— ์˜ํ•ด ์ฐธ์กฐ๋˜์–ด ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜๋˜์ง€ ์•Š๋Š” ์ƒํ™ฉ(Detached Elements)์„ ์‹ค์Šตํ•ฉ๋‹ˆ๋‹ค [14, 15, 17]. -- **My Project Relevance:** React ํ”„๋กœ์ ํŠธ์—์„œ ์ „์—ญ ์ƒํƒœ๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ, ๋‹จ์ˆœ ์„ค์ •(Theme ๋“ฑ)์€ ๋””๋ฒ„๊น…์ด ๋‹จ์ˆœํ•œ Context API๋กœ, ๋ณ€๊ฒฝ์ด ์žฆ๊ณ  ์ƒํƒœ ์ถ”์ ์ด ์ค‘์š”ํ•œ ์š”์†Œ๋Š” DevTools๋ฅผ ์ง€์›ํ•˜๋Š” Redux๋‚˜ Zustand๋ฅผ ๋„์ž…ํ•˜์—ฌ ๋””๋ฒ„๊น… ์šฉ์ด์„ฑ์„ ํ™•๋ณดํ•ฉ๋‹ˆ๋‹ค [22, 48, 49]. - -### Adjacent Topics - -- [[State Management Architecture]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(Redux, Zustand, Context API ๋“ฑ)์˜ ์•„ํ‚คํ…์ฒ˜์  ์„ ํƒ์ด ์ƒํƒœ ๋ณ€ํ™” ์ถ”์ ์„ฑ๊ณผ DevTools ๋””๋ฒ„๊น… ํ€„๋ฆฌํ‹ฐ์— ์–ด๋–ค ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”์ง€ ๋ถ„์„ [21, 22, 49]. -- [[Frontend Performance Optimization]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋””๋ฒ„๊น…์„ ํ†ตํ•ด ๋ฐœ๊ฒฌํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜์™€ ๋ถˆํ•„์š”ํ•œ ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง(Re-renders) ๋ฌธ์ œ๋ฅผ ์‹ค์งˆ์ ์ธ ์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ธฐ๋ฒ•(๊ฐ€์ƒํ™”, ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…)์œผ๋กœ ํ•ด๊ฒฐํ•˜์—ฌ Core Web Vitals๋ฅผ ๊ฐœ์„ ํ•˜๋Š” ๋ฐฉํ–ฅ [20, 50]. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Debugging.md b/00_Raw/Debugging.md deleted file mode 100644 index b28d7147..00000000 --- a/00_Raw/Debugging.md +++ /dev/null @@ -1,70 +0,0 @@ -# [[Debugging]] - -## ๐Ÿ“Œ Brief Summary -๋””๋ฒ„๊น…(Debugging)์€ ์†Œํ”„ํŠธ์›จ์–ด ์‹œ์Šคํ…œ, ํŠนํžˆ ๋ณต์žกํ•œ ํ”„๋ก ํŠธ์—”๋“œ ํ™˜๊ฒฝ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ, ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜, ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง ๋“ฑ์˜ ๋ฌธ์ œ๋ฅผ ์‹๋ณ„ํ•˜๊ณ  ํ•ด๊ฒฐํ•˜๋Š” ํ•„์ˆ˜์ ์ธ ๊ณผ์ •์ž…๋‹ˆ๋‹ค [1], [2], [3], [4]. ํ˜„๋Œ€์˜ ๋””๋ฒ„๊น…์€ ๋‹จ์ˆœํ•œ `console.log` ํ™•์ธ์„ ๋„˜์–ด, ํด๋ผ์šฐ๋“œ ๊ธฐ๋ฐ˜ ๋กœ๊น… ๋„๊ตฌ์™€ ๋ฉ”๋ชจ๋ฆฌ ํ”„๋กœํŒŒ์ผ๋Ÿฌ, ๋ธŒ๋ผ์šฐ์ € ๊ฐœ๋ฐœ์ž ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•˜๋Š” ๊ณ ๋„ํ™”๋œ ์‹œ์Šคํ…œ ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ๋ถ„์„ ์ž‘์—…์œผ๋กœ ์ง„ํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค [5], [6], [7]. ํšจ๊ณผ์ ์ธ ๋””๋ฒ„๊น… ์ฒด๊ณ„์˜ ๊ตฌ์ถ•์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ ์ €ํ•˜์™€ ์ค‘๋‹จ์„ ๋ฐฉ์ง€ํ•˜๊ณ  ์พŒ์ ํ•œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์œ ์ง€ํ•˜๋Š” ํ•ต์‹ฌ ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค [1], [2], [8]. - -## ๐Ÿ“– Core Content -* **ํ”„๋ก ํŠธ์—”๋“œ ์—๋Ÿฌ ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ํด๋ผ์šฐ๋“œ ๋„๊ตฌ ํ™œ์šฉ:** - ํ˜„๋Œ€์˜ ํ”„๋ก ํŠธ์—”๋“œ ๋””๋ฒ„๊น…์€ Sentry, LogRocket, Datadog RUM๊ณผ ๊ฐ™์€ ํด๋ผ์šฐ๋“œ ๊ธฐ๋ฐ˜ ๋กœ๊น… ๋ฐ ๊ด€์ธก(Observability) ๋„๊ตฌ๋ฅผ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค [5]. Sentry๋Š” ์—๋Ÿฌ ๊ทธ๋ฃนํ™” ๋ฐ ์ฝ˜์†” ๋กœ๊ทธ, ๋„คํŠธ์›Œํฌ ์š”์ฒญ, ์‚ฌ์šฉ์ž ์ƒํ˜ธ์ž‘์šฉ์„ ํฌ๊ด„ํ•˜๋Š” ๋ธŒ๋ ˆ๋“œํฌ๋Ÿผ(Breadcrumbs)์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [9]. LogRocket์€ ์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด ๊ธฐ๋Šฅ์„ ํ†ตํ•ด Redux/Vuex ์ƒํƒœ ๋ณ€ํ™”์™€ ๋„คํŠธ์›Œํฌ ์š”์ฒญ ํ—ค๋” ๋“ฑ ์‚ฌ์šฉ์ž์˜ ์ „์ฒด ์„ธ์…˜์„ ๋…นํ™”ํ•˜๋“ฏ ์ถ”์ ํ•˜์—ฌ ๋ณต์žกํ•œ ๋ฒ„๊ทธ์˜ ์›์ธ์„ ์ง„๋‹จํ•˜๊ฒŒ ๋•์Šต๋‹ˆ๋‹ค [10]. Datadog RUM์€ ํ”„๋ก ํŠธ์—”๋“œ ์—๋Ÿฌ๋ฅผ ๋ฐฑ์—”๋“œ ํŠธ๋ ˆ์ด์Šค์™€ ์—ฐ๊ณ„ํ•˜์—ฌ ์ข…๋‹จ๊ฐ„(End-to-end) ๋””๋ฒ„๊น…์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค [11], [12]. -* **๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜(Memory Leaks) ๋ฐ ๋ธ”๋กœํŠธ(Bloat) ๋””๋ฒ„๊น…:** - ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ™˜๊ฒฝ์—์„œ ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•ด์ œ๋˜์ง€ ์•Š์œผ๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋‚˜ ๋ธ”๋กœํŠธ ํ˜„์ƒ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [1], [13]. ๋””๋ฒ„๊น… ์‹œ Chrome ์ž‘์—… ๊ด€๋ฆฌ์ž(Task Manager)๋ฅผ ํ†ตํ•ด DOM ๋…ธ๋“œ ์ƒ์„ฑ ์ˆ˜์น˜์™€ JS ํž™(Heap) ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์˜ ์‹ค์‹œ๊ฐ„ ์ฆ๊ฐ€ ์ถ”์ด๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [14], [15]. ๋” ๊นŠ์€ ๋ถ„์„์„ ์œ„ํ•ด Chrome DevTools์˜ Memory ํƒญ์—์„œ 'Heap Snapshot'์„ ์ดฌ์˜ํ•œ ๋’ค ๋‘ ์‹œ์ ์˜ ์Šค๋ƒ…์ƒท์„ ๋น„๊ต(Comparison ๋ทฐ)ํ•˜์—ฌ ๋ธํƒ€(Delta) ๊ฐ’์ด ์–‘์ˆ˜์ธ ๊ฐ์ฒด๋ฅผ ์ฐพ์•„๋ƒ…๋‹ˆ๋‹ค [6], [16]. ์ด๋ฅผ ํ†ตํ•ด ๋ถ„๋ฆฌ๋œ DOM ํŠธ๋ฆฌ(Detached DOM nodes), ์ถ•์ ๋œ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ, ํด๋กœ์ €๋กœ ์œ ์ง€๋œ ์ฐธ์กฐ(Closure-retained references) ๋“ฑ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜(GC)์„ ๋ฐฉํ•ดํ•˜๋Š” ๋ˆ„์ˆ˜ ํŒจํ„ด์„ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค [17], [18], [19]. -* **React ๋ Œ๋”๋ง ์„ฑ๋Šฅ ๋ฐ ์ƒํƒœ ๊ด€๋ฆฌ ๋””๋ฒ„๊น…:** - ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง ์ด์Šˆ๋ฅผ ๋””๋ฒ„๊น…ํ•˜๊ธฐ ์œ„ํ•ด React DevTools์˜ Profiler๋‚˜ `why-did-you-render` ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค [4], [20]. ์ด๋ฅผ ํ†ตํ•ด ์–ด๋–ค ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ธ์ œ, ์–ผ๋งˆ์˜ ๋ Œ๋”๋ง ์‹œ๊ฐ„์„ ์†Œ๋ชจํ–ˆ๊ณ , ์–ด๋–ค ํ”„๋กญ์Šค๋‚˜ ์ƒํƒœ ๋ณ€ํ™”๊ฐ€ ์›์ธ์ธ์ง€ ์‹œ๊ฐ์ ์œผ๋กœ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [4], [21]. ๋ณต์žกํ•œ ์ƒํƒœ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์„ ๋””๋ฒ„๊น…ํ•  ๋•Œ๋Š”, Redux DevTools๋ฅผ ํ†ตํ•ด ์ƒํƒœ ๊ธฐ๋ก ๊ฒ€์‚ฌ, ์•ก์…˜ ๋ฆฌํ”Œ๋ ˆ์ด ๋“ฑ ์‹œ๊ฐ„ ์—ฌํ–‰(Time-travel) ๋””๋ฒ„๊น… ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฒ„๊ทธ๋ฅผ ์‹ ์†ํžˆ ์ถ”์ ํ•ฉ๋‹ˆ๋‹ค [22], [23]. -* **Error Boundaries๋ฅผ ํ™œ์šฉํ•œ ์žฅ์•  ์–ต์ œ ๋ฐ ๋Œ€์ฒด UI:** - React 16๋ถ€ํ„ฐ ๋„์ž…๋œ Error Boundaries๋Š” ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ์˜ ๋ Œ๋”๋ง ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•˜๋Š” JavaScript ์—๋Ÿฌ๋ฅผ ํฌ์ฐฉํ•˜์—ฌ ์ „์ฒด ์•ฑ์ด ๋นˆ ํ™”๋ฉด("white screen of death")์œผ๋กœ ํฌ๋ž˜์‹œ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค [24], [3]. ์ด ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ๋Š” ์—๋Ÿฌ ๋ฐœ์ƒ ์‹œ ๋‚ด๋ถ€ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ์‚ฌ์šฉ์ž์—๊ฒŒ ์นœ์ˆ™ํ•œ ๋Œ€์ฒด UI(Fallback UI)๋ฅผ ๋ Œ๋”๋งํ•˜๊ณ  ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ์— ์—๋Ÿฌ ์ •๋ณด๋ฅผ ๋กœ๊น…ํ•˜๋Š” ๋””๋ฒ„๊น… ์•ˆ์ „๋ง ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค [24], [8]. - -## โš–๏ธ Trade-offs & Caveats -* **ํด๋ผ์šฐ๋“œ ๋กœ๊น… ํˆด ๋„์ž…์˜ ์ œ์•ฝ ๋ฐ ๋น„์šฉ:** LogRocket๊ณผ ๊ฐ™์ด ์‚ฌ์šฉ์ž ์„ธ์…˜์„ ๋ชจ๋‘ ์บก์ฒ˜ํ•˜๋Š” ๋„๊ตฌ๋Š” ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋…ธ์ถœ๋  ์ˆ˜ ์žˆ์–ด ํ”„๋ผ์ด๋ฒ„์‹œ ์„ค์ • ์ž‘์—…์— ๊ธด ์‹œ๊ฐ„์ด ์†Œ์š”๋˜๋ฉฐ, ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ ๋ฐ ๋กœ๋”ฉ ์„ฑ๋Šฅ์— ์•…์˜ํ–ฅ(์˜ค๋ฒ„ํ—ค๋“œ)์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [10], [25], [26]. Datadog RUM ๋“ฑ์˜ ๋„๊ตฌ๋Š” ๋Œ€๊ทœ๋ชจ ํŠธ๋ž˜ํ”ฝ ๋ฐœ์ƒ ์‹œ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘(Ingest)๊ณผ ์ธ๋ฑ์‹ฑ ๋น„์šฉ ์ธก๋ฉด์—์„œ ์š”๊ธˆ ๊ตฌ์กฐ๊ฐ€ ๋ณต์žกํ•˜๊ณ  ๋น„์šฉ์ด ๊ธ‰์ฆํ•  ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค [27], [28]. -* **React Compiler ํ™œ์šฉ ์‹œ ๋””๋ฒ„๊น… ๊ฐ€์‹œ์„ฑ ์ €ํ•˜:** React Compiler๋ฅผ ์ ์šฉํ•˜๋ฉด ์ž๋™์œผ๋กœ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ์ตœ์ ํ™”๊ฐ€ ์ด๋ฃจ์–ด์ง€์ง€๋งŒ, ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ธ”๋ž™๋ฐ•์Šค์ฒ˜๋Ÿผ ์ž‘๋™ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค [29], [7]. `React.memo`๋‚˜ `useMemo` ๋“ฑ ๋ช…์‹œ์ ์ธ ์ฝ”๋“œ๊ฐ€ ์‚ฌ๋ผ์ง€๋ฏ€๋กœ, ๊ฐœ๋ฐœ์ž๊ฐ€ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์ง๊ด€์ ์ธ ์ฝ”๋“œ ๋ถ„์„์ด ์–ด๋ ค์›Œ์ง€๊ณ  ์ „์ ์œผ๋กœ Profiler์— ์˜์กดํ•ด ๋””๋ฒ„๊น…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค [7]. -* **Error Boundaries์˜ ํฌ์ฐฉ ๋ฒ”์œ„ ํ•œ๊ณ„:** Error Boundaries๋Š” ๋ Œ๋”๋ง, ์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ, ์ƒ์„ฑ์ž ๋‚ด๋ถ€์˜ ์—๋Ÿฌ๋Š” ํฌ์ฐฉํ•˜์ง€๋งŒ, ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ, ๋น„๋™๊ธฐ ์ฝ”๋“œ(์˜ˆ: `setTimeout`, `Promises`), ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง(SSR), ํ˜น์€ Error Boundary ์ž์ฒด์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ๋Š” ํฌ์ฐฉํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค [30], [31]. ์ด๋Ÿฌํ•œ ์—๋Ÿฌ๋ฅผ ๋””๋ฒ„๊น…ํ•˜๊ณ  ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ฐœ๋ณ„์ ์œผ๋กœ `try/catch` ๊ตฌ๋ฌธ์„ ์‚ฝ์ž…ํ•ด์•ผ๋งŒ ํ•ฉ๋‹ˆ๋‹ค [32], [33]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -#### [ํ”„๋ก ํŠธ์—”๋“œ ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ์ง„๋‹จ ํ™˜๊ฒฝ] -- [[Cloud Logging Tools]] - - ์—ฐ๊ฒฐ ์ด์œ : ์ฝ˜์†” ๋กœ๊ทธ๋งŒ์œผ๋กœ ํŒŒ์•…ํ•  ์ˆ˜ ์—†๋Š” ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์˜ ์‹ค์‚ฌ์šฉ์ž ์—๋Ÿฌ์™€ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ๋””๋ฒ„๊น…ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ํด๋ผ์šฐ๋“œ ์†”๋ฃจ์…˜. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Sentry, LogRocket ๋“ฑ์„ ํ™œ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž์˜ ํ™˜๊ฒฝ์  ๋ณ€์ˆ˜, ์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด, ์ƒํƒœ ์ถ”์ , ์—๋Ÿฌ ๊ทธ๋ฃนํ™” ๊ธฐ๋ฒ•์„ ํ†ตํ•œ ๋””๋ฒ„๊น… ์›Œํฌํ”Œ๋กœ์šฐ ์„ค๊ณ„ ๋ฐฉ๋ฒ• [9], [34], [35]. - -#### [๋ฉ”๋ชจ๋ฆฌ ๋ฐ ์„ฑ๋Šฅ ๋ถ„์„ ๋„๊ตฌ] -- [[Heap Snapshots]] - - ์—ฐ๊ฒฐ ์ด์œ : ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ ๊ตฌ์กฐ๋ฅผ ์Šค๋ƒ…์ƒท ํ˜•ํƒœ๋กœ ๋ถ„์„ํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๊ฐ์ฒด๋ฅผ ๋””๋ฒ„๊น…ํ•˜๋Š” ํ•ต์‹ฌ ๋„๊ตฌ. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ธŒ๋ผ์šฐ์ € ๊ฐœ๋ฐœ์ž ๋„๊ตฌ์˜ '๋น„๊ต(Comparison)' ๋ฐ 'Detached DOM' ํƒ์ƒ‰ ๊ธฐ๋Šฅ์„ ์ด์šฉํ•ด, ์ œ๊ฑฐ๋œ ์š”์†Œ๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” ํด๋กœ์ € ๋“ฑ ๊ตฌ์ฒด์  ๋ˆ„์ˆ˜ ์›์ธ์„ ์ฐพ์•„๋‚ด๋Š” ์‹œ๊ฐ์  ์ถ”์  ์›๋ฆฌ [17], [6], [16]. -- [[React Profiler]] - - ์—ฐ๊ฒฐ ์ด์œ : ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ Œ๋”๋ง ์ง€์—ฐ ์‹œ๊ฐ„๊ณผ ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง ํšŸ์ˆ˜๋ฅผ ์ง„๋‹จํ•˜๊ณ  ๋””๋ฒ„๊น…ํ•˜๋Š” ๋‚ด์žฅ ๋ถ„์„ ๋„๊ตฌ. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง ์‹œ๊ฐ„, ๋ Œ๋” ํŠธ๋ฆฌ ์‹œ๊ฐํ™”, ๊ทธ๋ฆฌ๊ณ  React Compiler ๋„์ž… ํ›„ ์ž๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ์„ฑ๊ณต ์—ฌ๋ถ€ ์ง„๋‹จ ๋ฐฉ๋ฒ• [36], [4], [37]. - -#### [๋””๋ฒ„๊น… ์„ค๊ณ„ ํŒจํ„ด ๋ฐ ์ƒํƒœ ๊ด€๋ฆฌ ๊ธฐ์ˆ ] -- [[Time-Travel Debugging]] - - ์—ฐ๊ฒฐ ์ด์œ : ์ƒํƒœ ๋ณ€๊ฒฝ ๋กœ๊ทธ๋ฅผ ํ†ตํ•ด ์•ฑ์˜ ๊ณผ๊ฑฐ ์ƒํƒœ๋ฅผ ์žฌํ˜„(Replay)ํ•˜๋ฉฐ ๋…ผ๋ฆฌ์  ์˜ค๋ฅ˜๋ฅผ ๋””๋ฒ„๊น…ํ•˜๋Š” ๊ฐœ๋ฐœ์ž ํŽธ์˜ ๊ธฐ๋Šฅ. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Redux DevTools ์ƒํƒœ๊ณ„์—์„œ ์ง€์›ํ•˜๋Š” ์—„๊ฒฉํ•œ ์ƒํƒœ ๋ณ€ํ™” ์ถ”์  ๋ฉ”์ปค๋‹ˆ์ฆ˜๊ณผ, ์ด๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๋‹จ์ˆœ Context API ํ™˜๊ฒฝ์˜ ํ•œ๊ณ„ [22], [23]. -- [[Error Boundaries]] - - ์—ฐ๊ฒฐ ์ด์œ : ์„ ์–ธ์ ์ธ React ํ™˜๊ฒฝ์—์„œ UI์˜ ๋ Œ๋”๋ง ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๋ฅผ ๊ฒฉ๋ฆฌํ•˜๊ณ  ํฌ์ฐฉํ•˜๊ธฐ ์œ„ํ•œ ๋””๋ฒ„๊น… ๋ฐฉ์–ด๋ง‰. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์•ฑ ์ „์ฒด ๋ถ•๊ดด๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ๊ธฐ๋Šฅ์  ํŠน์„ฑ๊ณผ, ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ ์ƒํ™ฉ์„ Sentry ๋“ฑ ๋ชจ๋‹ˆํ„ฐ๋ง ํˆด์— ์ž๋™์œผ๋กœ ๋กœ๊น…ํ•˜๋„๋ก ์—ฐ๊ฒฐํ•˜๋Š” ๊ตฌ์กฐ ์„ค๊ณ„ [24], [38], [8]. - -### Deeper Research Questions - -- ํ”„๋ก ํŠธ์—”๋“œ ๋ชจ๋‹ˆํ„ฐ๋ง ์†”๋ฃจ์…˜(LogRocket, Sentry ๋“ฑ)์„ ํ”„๋กœ์ ํŠธ์— ์—ฐ๋™ํ•  ๋•Œ, ๋กœ๊น… ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์ดˆ๊ธฐ ๋กœ๋”ฉ ๋ฐ Core Web Vitals ์ง€ํ‘œ(LCP, INP ๋“ฑ)์— ๋ฏธ์น˜๋Š” ๊ตฌ์ฒด์ ์ธ ์•…์˜ํ–ฅ๊ณผ ์ตœ์ ํ™” ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? -- Chrome DevTools์˜ Heap Snapshot๊ณผ Allocation Timeline์„ ๊ฒฐํ•ฉํ•˜์—ฌ ๋ณต์žกํ•œ ๋‹จ์ผ ํŽ˜์ด์ง€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(SPA)์˜ ๋ฏธ์„ธํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ์ถ”์ ํ•˜๋Š” ์›Œํฌํ”Œ๋กœ์šฐ๋Š” ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? -- React Error Boundaries๊ฐ€ ๋น„๋™๊ธฐ ์ฝ”๋“œ๋‚˜ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์˜ ์—๋Ÿฌ๋ฅผ ์žก์ง€ ๋ชปํ•˜๋Š” ๋ธŒ๋ผ์šฐ์ € ์ด๋ฒคํŠธ ๋ฃจํ”„ ๊ธฐ๋ฐ˜์˜ ๊ตฌ์กฐ์  ์›์ธ์€ ๋ฌด์—‡์ด๋ฉฐ, ์ด๋ฅผ ๊ทน๋ณตํ•˜๋Š” ์ตœ์ ์˜ ํ†ตํ•ฉ ์—๋Ÿฌ ์ฒ˜๋ฆฌ ์•„ํ‚คํ…์ฒ˜๋Š” ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„๋˜๋Š”๊ฐ€? -- React Compiler ๋„์ž… ์ดํ›„ ์ปดํŒŒ์ผ ํƒ€์ž„ ์ตœ์ ํ™” ํ™˜๊ฒฝ์—์„œ, ๊ธฐ์กด ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜(`useMemo`, `React.memo`) ํ™˜๊ฒฝ๊ณผ ๋น„๊ตํ•ด ๋””๋ฒ„๊น… ๋ฐฉ์‹๊ณผ ์„ฑ๋Šฅ ์ถ”์  ํŒจ๋Ÿฌ๋‹ค์ž„์€ ์–ด๋–ป๊ฒŒ ๋ณ€ํ™”ํ•˜๋Š”๊ฐ€? -- Redux์˜ Time-Travel Debugging์„ Zustand์™€ ๊ฐ™์€ ๊ฒฝ๋Ÿ‰ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ™˜๊ฒฝ์—์„œ๋„ ์œ ์‚ฌํ•œ ์ˆ˜์ค€์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ณ  ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” DevTools ํ†ตํ•ฉ ๋ฐฉ์•ˆ์€ ๋ฌด์—‡์ธ๊ฐ€? - -### Practical Application Contexts - -- **Implementation:** React ์ปดํฌ๋„ŒํŠธ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด ๊ฐœ๋ฐœ ๋‹จ๊ณ„์—์„œ `React DevTools Profiler` ๋ฐ `why-did-you-render` ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ํ™œ์šฉํ•ด ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ์œ ๋ฐœํ•˜๋Š” ํ”„๋กญ์Šค(Props)์™€ ์ƒํƒœ๋ฅผ ์ฐพ์•„ ๋ฆฌํŒฉํ† ๋งํ•ฉ๋‹ˆ๋‹ค [20], [21]. -- **System Design:** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋””์ž์ธ ์‹œ ๋Œ€์‹œ๋ณด๋“œ๋‚˜ ์™ธ๋ถ€ ์œ„์ ฏ ๋“ฑ ๋ถˆ์•ˆ์ •ํ•œ ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„๋งˆ๋‹ค ์„ธ๋ถ„ํ™”๋œ `Error Boundaries`๋ฅผ ๋ž˜ํ•‘ํ•˜์—ฌ ํŠน์ • ๊ตฌ๊ฐ„์—์„œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ด๋„ ์ „์ฒด UI๊ฐ€ ์‚ด์•„์žˆ๋„๋ก ๊ฒฌ๊ณ ํ•˜๊ฒŒ ์‹œ์Šคํ…œ์„ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค [39], [40]. -- **Operation / Maintenance:** ์šด์˜ ์ค‘์ธ ์„œ๋น„์Šค์— Sentry๋ฅผ ์—ฐ๋™ํ•˜์—ฌ ์—๋Ÿฌ ๋ธŒ๋ ˆ๋“œํฌ๋Ÿผ์„ ์ˆ˜์ง‘ํ•˜๊ณ , LogRocket์˜ ์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด๋กœ ํฌ๋ž˜์‹œ ์ง์ „ ์‚ฌ์šฉ์ž์˜ ์ •ํ™•ํ•œ ํด๋ฆญ/์ž…๋ ฅ ๋™์ž‘๊ณผ ์ƒํƒœ๋ฅผ ํŒŒ์•…ํ•˜์—ฌ ๋ฒ„๊ทธ๋ฅผ ์‹ ์†ํ•˜๊ฒŒ ๋””๋ฒ„๊น…ํ•ฉ๋‹ˆ๋‹ค [9], [34], [10], [35]. -- **Learning Path:** Chrome DevTools๋ฅผ ํ†ตํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋ฐ ์ž‘์—… ๊ด€๋ฆฌ์ž(Task Manager) ํ™•์ธ๋ฒ•์„ ์ˆ™์ง€ํ•˜๊ณ  [14], React์˜ ๋ฆฌ๋ Œ๋”๋ง ๋ฉ”์ปค๋‹ˆ์ฆ˜๊ณผ Profiler ์‚ฌ์šฉ๋ฒ•์„ ๋ฐฐ์šด ๋’ค [41], [4], ์ ์ง„์ ์œผ๋กœ Redux/Zustand ๋“ฑ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ DevTools๋ฅผ ํ™œ์šฉํ•œ ํƒ€์ž„ ํŠธ๋ž˜๋ธ” ๋””๋ฒ„๊น…์œผ๋กœ ํ•™์Šต์„ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค [23]. -- **My Project Relevance:** ํ˜„์žฌ ์ง„ํ–‰ ์ค‘์ธ ํ”„๋ก ํŠธ์—”๋“œ ํ”„๋กœ์ ํŠธ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ํƒ์ง€(Detached DOM Nodes ์ถ”์ )์™€ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ Chrome DevTools ๋ฐ Profiler ๊ธฐ์ˆ ์„ ์ฆ‰๊ฐ ์ ์šฉํ•ด ๋ณผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์—๋Ÿฌ ๋ฐ”์šด๋”๋ฆฌ๋ฅผ ํ†ตํ•œ ํ”„๋กœ๋•์…˜ ๋ ˆ๋ฒจ ์•ˆ์ •์„ฑ์„ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - -### Adjacent Topics - -- [[Performance Optimization]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋””๋ฒ„๊น… ๊ณผ์ •์—์„œ ๋ฐœ๊ฒฌ๋œ ๋ณ‘๋ชฉ ํ˜„์ƒ(๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜, ๊ณผ๋„ํ•œ ๋ Œ๋”๋ง, ๋ฌด๊ฑฐ์šด ๋ฒˆ๋“ค ์ฒญํฌ)์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๊ตฌ์ฒด์ ์ธ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…, ์ง€์—ฐ ๋กœ๋”ฉ(Lazy Loading), ์—์…‹ ์ตœ์ ํ™” ๋“ฑ์˜ ์•„ํ‚คํ…์ฒ˜ ๊ฐœ์„  ๊ธฐ๋ฒ• ํƒ๊ตฌ. -- [[State Management Architecture]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋””๋ฒ„๊น…์˜ ๋ณต์žก์„ฑ์„ ๋‚ฎ์ถ”๊ณ  ์ƒํƒœ ๋ณ€ํ™”์˜ ์ถ”์ ์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด, Redux, Zustand, React Context API ๋“ฑ ์—ฌ๋Ÿฌ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋™์ž‘ ์›๋ฆฌ์™€ ๋„์ž… ํŠธ๋ ˆ์ด๋“œ์˜คํ”„(Trade-offs) ๋น„๊ต. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Detached DOM Nodes.md b/00_Raw/Detached DOM Nodes.md deleted file mode 100644 index 72778d9f..00000000 --- a/00_Raw/Detached DOM Nodes.md +++ /dev/null @@ -1,63 +0,0 @@ -# [[Detached DOM Nodes]] - -## ๐Ÿ“Œ Brief Summary -Detached DOM Nodes(๋ถ„๋ฆฌ๋œ DOM ๋…ธ๋“œ)๋ž€ ํŽ˜์ด์ง€์˜ DOM ํŠธ๋ฆฌ์—์„œ๋Š” ์ œ๊ฑฐ๋˜์—ˆ์œผ๋‚˜, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ ๋‚ด์—์„œ ์—ฌ์ „ํžˆ ์ฐธ์กฐ๋ฅผ ์œ ์ง€ํ•˜๊ณ  ์žˆ์–ด ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘(Garbage Collected) ๋Œ€์ƒ์ด ๋˜์ง€ ๋ชปํ•˜๋Š” DOM ์š”์†Œ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค [1, 2]. ์ด๋Ÿฌํ•œ ๋…ธ๋“œ๋Š” ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณ„์† ์ ์œ ํ•˜๊ฒŒ ๋˜์–ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์„ฑ๋Šฅ ์ €ํ•˜์™€ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜(Memory Leak)๋ฅผ ์ผ์œผํ‚ค๋Š” ์ฃผ์š” ์›์ธ์ด ๋ฉ๋‹ˆ๋‹ค [1]. ๊ฐœ๋ฐœ์ž๋Š” Chrome DevTools์˜ ํž™ ์Šค๋ƒ…์ƒท(Heap Snapshots)๊ณผ ๊ฐ™์€ ํ”„๋กœํŒŒ์ผ๋ง ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด ๋…ธ๋“œ๋“ค์„ ์‹๋ณ„ํ•˜๊ณ  ๋””๋ฒ„๊น…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3, 4]. - -## ๐Ÿ“– Core Content -* **๋ฐœ์ƒ ์›๋ฆฌ ๋ฐ ์ •์˜:** DOM ๋…ธ๋“œ๋Š” ํŽ˜์ด์ง€์˜ DOM ํŠธ๋ฆฌ์™€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ ์–‘์ชฝ ๋ชจ๋‘์—์„œ ์ฐธ์กฐ๊ฐ€ ์—†์„ ๋•Œ๋งŒ ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘๊ธฐ๋กœ๋ถ€ํ„ฐ ํšŒ์ˆ˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1]. ๋งŒ์•ฝ ๋ฌธ์„œ(Document)์—์„œ๋Š” ๋…ธ๋“œ๊ฐ€ ์‚ญ์ œ๋˜์—ˆ์ง€๋งŒ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ณ€์ˆ˜๋‚˜ ๊ฐ์ฒด๊ฐ€ ํ•ด๋‹น ๋…ธ๋“œ๋ฅผ ๊ณ„์† ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋‹ค๋ฉด, ๊ทธ ๋…ธ๋“œ๋Š” '๋ถ„๋ฆฌ๋œ(Detached)' ์ƒํƒœ๊ฐ€ ๋˜์–ด ๋ฉ”๋ชจ๋ฆฌ์— ์ž”๋ฅ˜ํ•ฉ๋‹ˆ๋‹ค [1]. -* **์ปดํฌ๋„ŒํŠธ ํ™˜๊ฒฝ์—์„œ์˜ ์ฃผ์š” ์›์ธ:** React์™€ ๊ฐ™์€ ๋ชจ๋˜ ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜ UI ๊ฐœ๋ฐœ์—์„œ ๋งค์šฐ ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค [2]. ์ฃผ๋กœ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ธ๋งˆ์šดํŠธ๋  ๋•Œ `useEffect`์˜ ๋ฐ˜ํ™˜ ํ•จ์ˆ˜(cleanup ํ•จ์ˆ˜)์—์„œ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ์ œ๊ฑฐํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์ƒํƒœ ๊ตฌ๋…์„ ํ•ด์ œํ•˜์ง€ ์•Š์•„, ๋” ์ด์ƒ ํ™”๋ฉด์— ๋ณด์ด์ง€ ์•Š๋Š” DOM ์š”์†Œ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ๋ฌถ์—ฌ ์žˆ๊ฒŒ ๋˜๋Š” ๊ฒฝ์šฐ์— ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [2, 3]. ๋˜ํ•œ, ํด๋กœ์ €(Closure)๊ฐ€ ๋ถ€๋ชจ ์Šค์ฝ”ํ”„์˜ ๋ณ€์ˆ˜๋ฅผ ์‚ด๋ ค๋‘์–ด ๋ถˆํ•„์š”ํ•˜๊ฒŒ ํฐ ๊ฐ์ฒด(DOM ํฌํ•จ)์˜ ์ฐธ์กฐ๋ฅผ ์œ ์ง€ํ•˜๋Š” ํŒจํ„ด๋„ ์›์ธ์ด ๋ฉ๋‹ˆ๋‹ค [5]. -* **์ง„๋‹จ ๋ฐ ๋ถ„์„ ๊ธฐ๋ฒ•:** - * **ํž™ ์Šค๋ƒ…์ƒท(Heap Snapshots):** Chrome DevTools์˜ Memory ํŒจ๋„์„ ์‚ฌ์šฉํ•ด ํŠน์ • ์‹œ์ ์˜ ๋ฉ”๋ชจ๋ฆฌ ์ƒํƒœ๋ฅผ ์Šค๋ƒ…์ƒท์œผ๋กœ ์ฐ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [4]. ์‚ฌ์šฉ์ž ์•ก์…˜ ์ „ํ›„๋กœ ์Šค๋ƒ…์ƒท์„ ์บก์ฒ˜ํ•œ ๋’ค ์ด๋ฅผ ๋น„๊ต(Comparison view)ํ•˜๊ณ , ํด๋ž˜์Šค ํ•„ํ„ฐ์— 'Detached'๋ฅผ ๊ฒ€์ƒ‰ํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ์— ๊ณ ๋ฆฝ๋œ DOM ํŠธ๋ฆฌ๋ฅผ ์ฐพ์•„๋ƒ…๋‹ˆ๋‹ค [2-4, 6]. - * **๊ฐ์ฒด ์‹๋ณ„ ๋ฐ ์ฐธ์กฐ ๊ฒฝ๋กœ:** ์Šค๋ƒ…์ƒท์˜ Objects ์ฐฝ์—์„œ ํ•ด๋‹น ๋ถ„๋ฆฌ๋œ ๋…ธ๋“œ๋ฅผ ํด๋ฆญํ•˜๋ฉด, `detachedTree`์™€ ๊ฐ™์ด ์ด ๋…ธ๋“œ๋ฅผ ๋ถ™์žก๊ณ  ์žˆ๋Š” ์‹ค์ œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ณ€์ˆ˜๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [7]. GC ๋ฃจํŠธ(GC root)๋กœ๋ถ€ํ„ฐ์˜ ๊ฑฐ๋ฆฌ(Distance)๋ฅผ ์‚ดํŽด๋ณด๋ฉด ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ค ์ฐธ์กฐ ์ฒด์ธ์„ ๋Š์–ด์•ผ ํ•˜๋Š”์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5]. - * **Detached Elements ํ”„๋กœํ•„:** 'Detached elements' ํ”„๋กœํŒŒ์ผ์„ ๊ธฐ๋กํ•˜์—ฌ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๊ฐ€ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” ๋ถ„๋ฆฌ๋œ ์ •ํ™•ํ•œ HTML ๋…ธ๋“œ์™€ ๊ทธ ๊ฐœ์ˆ˜๋ฅผ ํ™•์ธํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค [8]. - -## โš–๏ธ Trade-offs & Caveats -์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ณ€์ˆ˜์— DOM ๋…ธ๋“œ๋ฅผ ์˜๋„์ ์œผ๋กœ ๋ณด๊ด€ํ•˜๋Š” ๊ฒƒ์€ ๋น ๋ฅธ DOM ์กฐ์ž‘์ด๋‚˜ ์žฌ์‚ฌ์šฉ์„ ์œ„ํ•œ ์บ์‹ฑ(Caching) ์ „๋žต ๋“ฑ ์„ฑ๋Šฅ ์ตœ์ ํ™”์˜ ๊ธฐ์ˆ ์  ์„ ํƒ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ๋ฐฉ์‹์€ ์ ์ ˆํ•œ ์‹œ์ ์— ์ฐธ์กฐ๋ฅผ ํ•ด์ œํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ์น˜๋ช…์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜(Memory Leak)๋ฅผ ์œ ๋ฐœํ•œ๋‹ค๋Š” ๋šœ๋ ทํ•œ ์ œ์•ฝ ์‚ฌํ•ญ์ด์ž ๋ถ€์ž‘์šฉ(Caveat)์„ ๊ฐ–์Šต๋‹ˆ๋‹ค [1, 7, 9]. - -ํŠนํžˆ ํž™ ์Šค๋ƒ…์ƒท(Heap Snapshot)์ด๋‚˜ ํ• ๋‹น ํƒ€์ž„๋ผ์ธ(Allocation Timeline)์„ ํ†ตํ•ด ๋ถ„๋ฆฌ๋œ DOM ๋…ธ๋“œ๋ฅผ ์ถ”์ ํ•˜๋Š” ๊ณผ์ •์€ ๋””๋ฒ„๊น… ๊ด€์ ์—์„œ ๋งค์šฐ ๊ฐ•๋ ฅํ•˜์ง€๋งŒ, ์Šค๋ƒ…์ƒท ์ƒ์„ฑ๊ณผ ๋ถ„์„์— ์‹œ๊ฐ„์ด ์†Œ์š”๋˜๋ฉฐ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ๊ฒฝ์šฐ ๋ธŒ๋ผ์šฐ์ € ์„ฑ๋Šฅ์— ๋ถ€ํ•˜๋ฅผ ์ค„ ์ˆ˜ ์žˆ๋‹ค๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค [4, 10]. (์ด์™ธ์— ๋ถ„๋ฆฌ๋œ DOM ๋…ธ๋“œ๋ฅผ ํ™œ์šฉํ•˜๋Š” ๊ธฐ์ˆ ์  ์„ ํƒ์— ๋”ฐ๋ฅธ ๋ฐ˜๋Œ€ ๊ธ‰๋ถ€์— ๊ด€ํ•ด์„œ๋Š” ์†Œ์Šค์— ๊ด€๋ จ ์ •๋ณด๊ฐ€ ๋‹ค์†Œ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค.) - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -#### [๋ฌธ์ œ ์›์ธ ๋ฐ ํ˜„์ƒ (Problem & Symptoms)] -* [[Memory Leaks]] - * ์—ฐ๊ฒฐ ์ด์œ : ๋ถ„๋ฆฌ๋œ DOM ๋…ธ๋“œ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ™˜๊ฒฝ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜์˜ ๊ฐ€์žฅ ํ”ํ•œ ํ˜•ํƒœ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค [1]. - * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๊ฐ€ ์ˆ˜์ง‘ํ•˜์ง€ ๋ชปํ•œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ˆ„์ ๋˜๋ฉด์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์†๋„๊ฐ€ ๋А๋ ค์ง€๊ณ  ๊ฒฐ๊ตญ ํƒญ์ด๋‚˜ ์•ฑ์ด ๋ฉˆ์ถ”๊ฑฐ๋‚˜ ์ถฉ๋Œ(crash)ํ•˜๋Š” ํ˜„์ƒ ๋ฐ ๊ทธ ์ง„๋‹จ ๋ฐฉ๋ฒ• [9, 11]. -* [[Garbage Collection]] - * ์—ฐ๊ฒฐ ์ด์œ : ๋ถ„๋ฆฌ๋œ DOM ๋…ธ๋“œ๊ฐ€ ๊ณ„์† ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฐจ์ง€ํ•˜๋Š” ๊ทผ๋ณธ์ ์ธ ์ด์œ ๊ฐ€ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์˜ ๋™์ž‘ ๋ฐฉ์‹๊ณผ ์—ฐ๊ด€๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค [1, 9]. - * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์ด ๋” ์ด์ƒ ์ฐธ์กฐ(Reference)๊ฐ€ ์—†๋Š” ๋ฉ”๋ชจ๋ฆฌ๋งŒ ํšŒ์ˆ˜ํ•œ๋‹ค๋Š” ์›์น™๊ณผ, ์ฐธ์กฐ๊ฐ€ ์–ด๋–ป๊ฒŒ ์œ ์ง€๋˜๋Š”์ง€์— ๋Œ€ํ•œ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜ [9]. - -#### [๋ถ„์„ ๋ฐ ๋””๋ฒ„๊น… ๋„๊ตฌ (Analysis & Debugging Tools)] -* [[Heap Snapshots]] - * ์—ฐ๊ฒฐ ์ด์œ : ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด ๋ถ„๋ฆฌ๋œ DOM ํŠธ๋ฆฌ๋ฅผ ์ฐพ์•„๋‚ด๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ํ•ต์‹ฌ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค [4]. - * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํŠน์ • ์ˆœ๊ฐ„์˜ ๋ฉ”๋ชจ๋ฆฌ ์ƒํƒœ๋ฅผ ์ฐ์–ด ์‚ฌ์šฉ์ž ๋™์ž‘ ์ „ํ›„์˜ ๋ณ€ํ™”๋Ÿ‰(Delta)์„ ๋น„๊ตํ•˜๊ณ , ์–ด๋– ํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ณ€์ˆ˜(Retainers)๊ฐ€ ๊ฐ์ฒด์˜ ์ˆ˜๋ช…์„ ์—ฐ์žฅํ•˜๊ณ  ์žˆ๋Š”์ง€ ํŒŒ์•…ํ•˜๋Š” ์‹ค๋ฌด์ ์ธ ํ”„๋กœํŒŒ์ผ๋ง ๊ธฐ๋ฒ• [3, 5, 6]. -* [[Chrome DevTools Memory Panel]] - * ์—ฐ๊ฒฐ ์ด์œ : ํž™ ์Šค๋ƒ…์ƒท ๋ถ„์„, Allocation Timeline ๊ธฐ๋ก ๋ฐ Detached elements ํ”„๋กœํ•„์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋ธŒ๋ผ์šฐ์ € ๋‚ด์žฅ ๋””๋ฒ„๊น… ํ™˜๊ฒฝ์ž…๋‹ˆ๋‹ค [4, 8, 10]. - * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํ”„๋ก ํŠธ์—”๋“œ ํ™˜๊ฒฝ์—์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํž™ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•(์‹ค์‹œ๊ฐ„ ํ• ๋‹น ์ถ”์ , ํ•จ์ˆ˜๋ณ„ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น, GC ๋ฐœ์ƒ ๋นˆ๋„)์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ๋ถ„์„ํ•˜๋Š” ์ „๋ฐ˜์ ์ธ ํ”„๋กœ์„ธ์Šค [8, 10, 12]. - -### Deeper Research Questions - -* ๋ชจ๋˜ ์ปดํฌ๋„ŒํŠธ ํ”„๋ ˆ์ž„์›Œํฌ(์˜ˆ: React)์—์„œ DOM ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๋ˆ„์ ๊ณผ ํด๋กœ์ € ์ฐธ์กฐ ์™ธ์— ๋ถ„๋ฆฌ๋œ DOM ๋…ธ๋“œ๋ฅผ ๊ฐ€์žฅ ์ž์ฃผ ์œ ๋ฐœํ•˜๋Š” ์•ˆํ‹ฐ ํŒจํ„ด์€ ๋ฌด์—‡์ธ๊ฐ€? [2, 3, 5] -* ์˜๋„์ ์ธ DOM ๋…ธ๋“œ ์บ์‹ฑ(Caching)์„ ํ†ตํ•œ ๋ Œ๋”๋ง ์„ฑ๋Šฅ ์ตœ์ ํ™”์™€ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜(๋ถ„๋ฆฌ๋œ DOM ๋…ธ๋“œ) ์‚ฌ์ด์˜ ๊ฒฝ๊ณ„๋ฅผ ์‹œ์Šคํ…œ ์„ค๊ณ„ ๊ด€์ ์—์„œ ์–ด๋–ป๊ฒŒ ์กฐ์œจํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? [1, 9] -* ํž™ ์Šค๋ƒ…์ƒท(Heap Snapshots)์˜ 'Retainers' ํŒจ๋„์—์„œ ๋ณด์—ฌ์ฃผ๋Š” GC ๋ฃจํŠธ(GC Root)๋กœ๋ถ€ํ„ฐ์˜ ๊ฑฐ๋ฆฌ(Distance) ์ •๋ณด๋Š” ์ฐธ์กฐ ์—ฐ๊ฒฐ์„ ํ•ด์ œํ•  ๋•Œ ์–ด๋–ค ๊ตฌ์ฒด์ ์ธ ์ง€์นจ์„ ์ œ๊ณตํ•˜๋Š”๊ฐ€? [5] -* ์ž๋™ํ™”๋œ CI(Continuous Integration) ํŒŒ์ดํ”„๋ผ์ธ์—์„œ Puppeteer ๋“ฑ์„ ํ™œ์šฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ถ„๋ฆฌ๋œ DOM ๋…ธ๋“œ ๋ฐœ์ƒ(๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜) ์—ฌ๋ถ€๋ฅผ ์„ ์ œ์ ์œผ๋กœ ํ…Œ์ŠคํŠธํ•˜๊ณ  ๋ฐฉ์ง€ํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์„ฑ ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? [13] -* ๋ฉ”๋ชจ๋ฆฌ ์บ์‹œ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ์ผ๋ฐ˜ ๊ฐ์ฒด(Object) ๋Œ€์‹  `WeakMap`์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ถ„๋ฆฌ๋œ DOM ๋…ธ๋“œ์™€ ๊ฐ™์€ ๋ˆ„์ˆ˜ ๋ฌธ์ œ๋ฅผ ์˜ˆ๋ฐฉํ•˜๋Š” ๋ฐ ์–ด๋–ป๊ฒŒ ๊ธฐ์—ฌํ•˜๋Š”๊ฐ€? [13] - -### Practical Application Contexts - -* **Implementation:** React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ ์ค‘, `useEffect` ๋‚ด๋ถ€์—์„œ ์ถ”๊ฐ€ํ•œ ํƒ€์ด๋จธ, ๊ตฌ๋…(subscription), ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๋“ฑ์€ ์ปดํฌ๋„ŒํŠธ ์–ธ๋งˆ์šดํŠธ ์‹œ ๋ฐ˜ํ™˜ํ•˜๋Š” cleanup ํ•จ์ˆ˜์—์„œ ๋ฐ˜๋“œ์‹œ ์ œ๊ฑฐํ•˜์—ฌ DOM ๋…ธ๋“œ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ๊ณ ๋ฆฝ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค [3, 13]. -* **System Design:** ์บ์‹œ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ๋•Œ DOM ์š”์†Œ๋‚˜ ํฐ ๊ฐ์ฒด๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ๋ณด๊ด€ํ•ด์•ผ ํ•œ๋‹ค๋ฉด, ์ฐธ์กฐ๊ฐ€ ์—†์„ ๋•Œ ์ž๋™์œผ๋กœ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์ด ๋˜๋„๋ก `WeakMap`์„ ํ™œ์šฉํ•˜๋Š” ์„ค๊ณ„ ํŒจํ„ด์„ ๋„์ž…ํ•ฉ๋‹ˆ๋‹ค [13]. -* **Operation / Maintenance:** ์žฅ์‹œ๊ฐ„ ์‹คํ–‰๋˜๋Š” ํƒญ์—์„œ ์†๋„ ์ €ํ•˜ ๋ฒ„๊ทธ ๋ฆฌํฌํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ, ์œ ์ง€๋ณด์ˆ˜ ๊ฐœ๋ฐœ์ž๋Š” Chrome DevTools๋ฅผ ์—ด๊ณ  ๊ฐ•์ œ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜(ํœด์ง€ํ†ต ์•„์ด์ฝ˜ ํด๋ฆญ)์„ ์ˆ˜ํ–‰ํ•œ ๋’ค, ์˜์‹ฌ๋˜๋Š” ์•ก์…˜ ์ „ํ›„์˜ ํž™ ์Šค๋ƒ…์ƒท์„ ์ฐ๊ณ  ๋น„๊ตํ•˜์—ฌ ์ž”๋ฅ˜ํ•œ "Detached" ๋…ธ๋“œ๋“ค์„ ์ƒ‰์ถœํ•˜๋Š” ๋””๋ฒ„๊น… ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค [4, 6]. -* **Learning Path:** ํ”„๋ก ํŠธ์—”๋“œ ์„ฑ๋Šฅ ์ตœ์ ํ™” ํ•™์Šต ๋‹จ๊ณ„์—์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜๊ณผ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜์˜ ๊ธฐ๋ณธ ์›๋ฆฌ๋ฅผ ํ•™์Šตํ•œ ๋‹ค์Œ, Chrome DevTools ์‚ฌ์šฉ๋ฒ•์„ ์ตํ˜€ ์‹ค์ œ ์ž‘์„ฑํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์กด์žฌํ•˜๋Š” ๋ถ„๋ฆฌ๋œ DOM ๋…ธ๋“œ๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ์‹๋ณ„ํ•˜๊ณ  ์ œ๊ฑฐํ•ด ๋ณด๋Š” ๊ณผ์ •์œผ๋กœ ํ•™์Šต์„ ์ „๊ฐœํ•ฉ๋‹ˆ๋‹ค [1, 6, 9]. -* **My Project Relevance:** ํ˜„์žฌ ์ง„ํ–‰ ์ค‘์ธ ํ”„๋ก ํŠธ์—”๋“œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ตœ์ ํ™” ์ž‘์—… ์ค‘, ๋ผ์šฐํŒ… ๋ณ€๊ฒฝ์ด๋‚˜ ๋ชจ๋‹ฌ ์ฐฝ์„ ์—ด๊ณ  ๋‹ซ์„ ๋•Œ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ๊ณ„์† ์ฆ๊ฐ€ํ•œ๋‹ค๋ฉด ๋ฉ”๋ชจ๋ฆฌ ํ”„๋กœํŒŒ์ผ๋ง ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ถ„๋ฆฌ๋œ DOM ํŠธ๋ฆฌ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ์žˆ๋Š”์ง€ ์ฆ‰์‹œ ์ง„๋‹จํ•˜๊ณ  ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - -### Adjacent Topics - -* [[Performance Profiling]] - * ํ™•์žฅ ๋ฐฉํ–ฅ: ๋ถ„๋ฆฌ๋œ DOM ๋…ธ๋“œ ํƒ์ง€ ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ ์ด์Šˆ ์™ธ์—๋„ ํฌ๋กฌ DevTools์˜ Performance ํƒญ์„ ์ด์šฉํ•ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰ ์‹œ๊ฐ„, ๊ธด ์ž‘์—…(Long tasks), ๋ Œ๋”๋ง(paint) ์ง€์—ฐ ๋“ฑ ์ „๋ฐ˜์ ์ธ ํ”„๋ก ํŠธ์—”๋“œ ์‹คํ–‰ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ์„ ์ฐพ์•„๋‚ด๋Š” ๊ธฐ๋ฒ•์œผ๋กœ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค [14, 15]. -* [[React Component Lifecycle Cleanup]] - * ํ™•์žฅ ๋ฐฉํ–ฅ: React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํŠน์„ฑ์ƒ, ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋‚˜ ์™ธ๋ถ€ ์ƒํƒœ ๊ตฌ๋…์„ ํ•ด์ œํ•˜์ง€ ์•Š๋Š” ๋“ฑ ์ปดํฌ๋„ŒํŠธ ์ƒ๋ช…์ฃผ๊ธฐ ๊ด€๋ฆฌ ์‹คํŒจ๊ฐ€ ๋ถ„๋ฆฌ๋œ DOM ๋…ธ๋“œ๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค. ์˜ฌ๋ฐ”๋ฅธ ์ปดํฌ๋„ŒํŠธ ํ•ด์ œ ํŒจํ„ด ๋ฐ Hooks(`useEffect`) ํ™œ์šฉ๋ฒ•์„ ๊นŠ์ด ์žˆ๊ฒŒ ํŒŒ์•…ํ•ฉ๋‹ˆ๋‹ค [3, 13]. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Engineering Scalable Frontend Systems.md b/00_Raw/Engineering Scalable Frontend Systems.md deleted file mode 100644 index 387ef5fb..00000000 --- a/00_Raw/Engineering Scalable Frontend Systems.md +++ /dev/null @@ -1,84 +0,0 @@ -# [[Engineering Scalable Frontend Systems]] - -## ๐Ÿ“Œ Brief Summary -ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ํ”„๋ก ํŠธ์—”๋“œ ์‹œ์Šคํ…œ(Engineering Scalable Frontend Systems)์€ ๋‹จ์ˆœํ•œ ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰์„ ๋„˜์–ด ์œ ์ง€๋ณด์ˆ˜์„ฑ, ๊ณ ์„ฑ๋Šฅ, ๊ฒฌ๊ณ ์„ฑ์„ ๊ฐ–์ถ˜ ๋ถ„์‚ฐ ์†Œํ”„ํŠธ์›จ์–ด ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค [1]. ์ด๋Š” ๊ธฐ์ˆ ์  ํŒŒ์ผ ๊ธฐ๋ฐ˜ ํด๋” ๊ตฌ์กฐ์—์„œ ๊ธฐ๋Šฅ ์ค‘์‹ฌ(Feature-Based) ๋ฐ ๋„๋ฉ”์ธ ๊ธฐ๋ฐ˜ ์„ค๊ณ„๋กœ์˜ ์ „ํ™˜์„ ์š”๊ตฌํ•˜๋ฉฐ, ์—„๊ฒฉํ•œ ์ฝ”๋“œ ์ปจ๋ฒค์…˜๊ณผ ๊ฑฐ๋ฒ„๋„Œ์Šค๋ฅผ ๋™๋ฐ˜ํ•ฉ๋‹ˆ๋‹ค [2, 3]. ๋˜ํ•œ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์— SOLID์™€ ๊ฐ™์€ ์†Œํ”„ํŠธ์›จ์–ด ๊ณตํ•™ ์›์น™์„ ๊ฒฐํ•ฉํ•˜๊ณ , ์„œ๋ฒ„/ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ์˜ ๋ถ„๋ฆฌ, ๊ทธ๋ฆฌ๊ณ  ๋นŒ๋“œ ํƒ€์ž„ ๋ฐ ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ํ†ตํ•ด ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ์„ฑ์žฅ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค [1, 4, 5]. - -## ๐Ÿ“– Core Content - -* **์•„ํ‚คํ…์ฒ˜ ๋ฐ ํด๋” ๊ตฌ์กฐ์˜ ์ง„ํ™”** - ๊ธฐ์กด์˜ ์ปดํฌ๋„ŒํŠธ, ํ›…, ์Šคํƒ€์ผ ๋“ฑ์„ ํŒŒ์ผ ํƒ€์ž…๋ณ„๋กœ ๋ชจ์•„๋‘๋Š” ๊ตฌ์กฐ๋Š” ์•ฑ์ด ์ปค์งˆ์ˆ˜๋ก ์ธ์ง€ ๋ถ€ํ•˜๋ฅผ ๋†’์ด๊ณ  ํ™•์žฅ์„ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค [2, 6]. 2025๋…„์˜ ํ”„๋ก ํŠธ์—”๋“œ ์‹œ์Šคํ…œ์€ ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ๊ณผ ๊ธฐ๋Šฅ(Feature)์„ ์ค‘์‹ฌ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์‘์ง‘์‹œํ‚ค๋Š” ๊ตฌ์กฐ๋ฅผ ํ‘œ์ค€์œผ๋กœ ์‚ผ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค [3, 7]. ํŠนํžˆ **Feature-Sliced Design (FSD)** ๊ฐ™์€ ์•„ํ‚คํ…์ฒ˜๋Š” ์ฝ”๋“œ๋ฅผ ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ๋ณ„ ๋ ˆ์ด์–ด(shared, entities, features, widgets, pages, app)๋กœ ๋‚˜๋ˆ„๊ณ , ์ƒ์œ„ ๊ณ„์ธต์—์„œ ํ•˜์œ„ ๊ณ„์ธต์œผ๋กœ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์—„๊ฒฉํ•œ ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ๊ทœ์น™์„ ๊ฐ•์ œํ•ฉ๋‹ˆ๋‹ค [8-10]. ๊ฐ ์Šฌ๋ผ์ด์Šค๋Š” `index.ts`๋ฅผ ํ†ตํ•ด ํผ๋ธ”๋ฆญ API(Public API)๋งŒ ์™ธ๋ถ€์— ๋…ธ์ถœํ•˜์—ฌ ๋‚ด๋ถ€ ๊ตฌํ˜„์„ ์บก์Аํ™”ํ•ฉ๋‹ˆ๋‹ค [4, 11, 12]. -* **์†Œํ”„ํŠธ์›จ์–ด ๊ณตํ•™ ์›์น™์˜ ์ ์šฉ (SOLID & Clean Code)** - ํ”„๋ก ํŠธ์—”๋“œ ์ฝ”๋“œ์˜ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ์œ„ํ•ด SOLID, DRY, KISS, YAGNI ์›์น™์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค [4, 13]. - * ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)์— ๋”ฐ๋ผ ๋„ˆ๋ฌด ๋งŽ์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋Œ€ํ˜• ์ปดํฌ๋„ŒํŠธ(์˜ˆ: 300์ค„ ์ด์ƒ)๋Š” ๋ฐ์ดํ„ฐ ํŒจ์นญ, ์ƒํƒœ ๊ด€๋ฆฌ, UI ๋ Œ๋”๋ง ๋“ฑ์˜ ์ฑ…์ž„์— ๋งž๊ฒŒ ๋” ์ž‘๊ณ  ๋…๋ฆฝ์ ์ธ ๋‹จ์œ„๋กœ ๋ถ„๋ฆฌ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [14]. - * ๊ฐœ๋ฐฉ-ํ์‡„ ์›์น™(OCP)์€ ๊ธฐ์กด ์ปดํฌ๋„ŒํŠธ ์†Œ์Šค๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  `children` prop์ด๋‚˜ Render Props ํŒจํ„ด์„ ์ด์šฉํ•œ ์ปดํฌ๋„ŒํŠธ ํ•ฉ์„ฑ(Composition)์œผ๋กœ ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค [15, 16]. - * ์ค‘๋ณต์„ ์ค„์ด๋Š” DRY ์›์น™์€ ๊ณตํ†ต ๋กœ์ง์„ ์ปค์Šคํ…€ ํ›…์œผ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•˜์ง€๋งŒ, ์ง€๋‚˜์นœ ์ถ”์ƒํ™”๋Š” ์ฝ”๋“œ ํŒŒ์•…์„ ์–ด๋ ต๊ฒŒ ํ•˜๋ฏ€๋กœ ๋‹จ์ˆœ์„ฑ์„ ์œ ์ง€ํ•˜๋Š” KISS ์›์น™๊ณผ ๊ท ํ˜•์„ ์ด๋ฃจ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [17]. -* **์ƒํƒœ ๊ด€๋ฆฌ ํŒจ๋Ÿฌ๋‹ค์ž„์˜ ์„ธ๋ถ„ํ™”** - ๊ฑฐ๋Œ€ํ•œ ๋‹จ์ผ ์ƒํƒœ ์ €์žฅ์†Œ(์˜ˆ: ๊ณผ๊ฑฐ์˜ Redux)์— ์˜์กดํ•˜๊ธฐ๋ณด๋‹ค๋Š” ๋ฐ์ดํ„ฐ์˜ ์„ฑ๊ฒฉ์— ๋”ฐ๋ผ ์ตœ์ ์˜ ๋„๊ตฌ๋ฅผ ์„ ํƒํ•˜์—ฌ ์ƒํƒœ๋ฅผ ํŒŒํŽธํ™” ๋ฐ ์ „๋ฌธํ™”ํ•ฉ๋‹ˆ๋‹ค [5]. - * **์ „์—ญ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒํƒœ:** Context API๋Š” ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ ์ „์ฒด๋ฅผ ๋ฆฌ๋ Œ๋”๋งํ•˜๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ [18, 19], ์ƒํƒœ ๋ณ€๊ฒฝ์ด ์žฆ๊ณ  ๊ทœ๋ชจ๊ฐ€ ํฐ ์•ฑ์—์„œ๋Š” ๋ถ€๋ถ„ ๊ตฌ๋…(Selector)์„ ์ง€์›ํ•˜์—ฌ ๋ Œ๋”๋ง ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๋Š” **Zustand**๋‚˜ **Jotai**๊ฐ€ ์„ ํ˜ธ๋ฉ๋‹ˆ๋‹ค [5, 20, 21]. - * **์„œ๋ฒ„ ์ƒํƒœ (API Layer):** API์—์„œ ๊ฐ€์ ธ์˜จ ๋ฐ์ดํ„ฐ๋Š” ์บ์‹ฑ, ๋™๊ธฐํ™”, ๋กœ๋”ฉ/์—๋Ÿฌ ์‚ฌ์ดํด ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋ฏ€๋กœ, ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ์™€ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌํ•˜์—ฌ **TanStack Query (React Query)** ๋“ฑ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค [18, 22]. -* **์„ฑ๋Šฅ ์—”์ง€๋‹ˆ์–ด๋ง ๋ฐ ๋นŒ๋“œ ์ตœ์ ํ™”** - ์ดˆ๊ธฐ ๋กœ๋”ฉ ์‹œ๊ฐ„๊ณผ Core Web Vitals ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด ๋‹ค์–‘ํ•œ ๊ธฐ๋ฒ•์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค [23, 24]. - * **๋นŒ๋“œ/์ปดํŒŒ์ผ ํƒ€์ž„:** Vite์™€ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ES ๋ชจ๋“ˆ์„ ์ œ๊ณตํ•˜๊ณ , ํ”„๋กœ๋•์…˜์—์„œ๋Š” Rollup์˜ `manualChunks`๋ฅผ ํ™œ์šฉํ•ด ์šฉ๋Ÿ‰์ด ํฐ ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(React, Recharts ๋“ฑ)๋ฅผ ๋ถ„ํ•  ์บ์‹ฑํ•˜์—ฌ ์บ์‹œ ํšจ์œจ์„ ๋†’์ž…๋‹ˆ๋‹ค [23, 25-27]. ๋˜ํ•œ **React Compiler**์˜ ๋„์ž…์œผ๋กœ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ž๋™์œผ๋กœ ์ฝ”๋“œ์˜ ๋ฆฌ๋ Œ๋”๋ง ๋ฐฉ์ง€(๋ฉ”๋ชจ์ด์ œ์ด์…˜)๋ฅผ ์ฒ˜๋ฆฌํ•˜์—ฌ ์ˆ˜๋™ ์ตœ์ ํ™”(`useMemo`, `useCallback`)์˜ ์˜ค๋ฅ˜๋ฅผ ์ค„์—ฌ์ค๋‹ˆ๋‹ค [25, 28, 29]. - * **๋Ÿฐํƒ€์ž„ ์ตœ์ ํ™”:** ๋™์  ์ž„ํฌํŠธ๋ฅผ ์ด์šฉํ•œ ๋ผ์šฐํŠธ ๋ฐ ์ปดํฌ๋„ŒํŠธ ๋ ˆ๋ฒจ์˜ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…(Code Splitting & Lazy Loading), ๊ทธ๋ฆฌ๊ณ  ์ˆ˜์ฒœ ๊ฐœ์˜ ๋ฆฌ์ŠคํŠธ ์•„์ดํ…œ ๋ Œ๋”๋ง ์‹œ DOM ๋น„๋Œ€๋ฅผ ๋ง‰๋Š” ๊ฐ€์ƒํ™”(Virtualization) ๊ธฐ์ˆ ์ด ํ•„์ˆ˜์ ์œผ๋กœ ์š”๊ตฌ๋ฉ๋‹ˆ๋‹ค [30-32]. -* **๋ณต์›๋ ฅ(Resilience) ๋ฐ ์‹œ์Šคํ…œ ๊ฑฐ๋ฒ„๋„Œ์Šค** - ๊ฒฌ๊ณ ํ•œ ์‹œ์Šคํ…œ์€ ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜๊ฐ€ ์ „์ฒด ์•ฑ์˜ ํฌ๋ž˜์‹œ๋กœ ์ด์–ด์ง€๋Š” ๊ฒƒ์„ ๋ง‰์Šต๋‹ˆ๋‹ค. UI์˜ ๋ถˆ์•ˆ์ •ํ•œ ์˜์—ญ์ด๋‚˜ ์„œ๋“œํŒŒํ‹ฐ ์œ„์ ฏ์€ **Error Boundaries**๋กœ ๊ฐ์‹ธ ํด๋ฐฑ UI๋ฅผ ์ œ๊ณตํ•˜์—ฌ ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค [33-35]. ๋˜ํ•œ, ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•œ DevTools ํž™ ์Šค๋ƒ…์ƒท ๋””๋ฒ„๊น…๊ณผ Sentry, LogRocket ๊ฐ™์€ ํด๋ผ์šฐ๋“œ ๋„๊ตฌ๋ฅผ ์ด์šฉํ•œ ํ”„๋กœ๋•์…˜ ์—๋Ÿฌ ๋ชจ๋‹ˆํ„ฐ๋ง์ด ํ™œ์šฉ๋ฉ๋‹ˆ๋‹ค [36-38]. ํ˜‘์—… ์ฐจ์›์—์„œ๋Š” ์ผ๊ด€๋œ ๋„ค์ด๋ฐ ๊ทœ์น™(์˜ˆ: ํŒŒ์ผ๋ช…์€ kebab-case, ์ปดํฌ๋„ŒํŠธ๋Š” PascalCase)๊ณผ ESLint, Prettier, Husky๋ฅผ ํ†ตํ•œ ์ž๋™ํ™”๋œ ๊ฑฐ๋ฒ„๋„Œ์Šค, ๊ทธ๋ฆฌ๊ณ  Storybook์„ ํ™œ์šฉํ•œ ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ๊ฐ€ ์ฝ”๋“œ ํ’ˆ์งˆ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค [39-41]. - -## โš–๏ธ Trade-offs & Caveats -* **Feature-Sliced Design (FSD)์˜ ์ดˆ๊ธฐ ๋„์ž… ๋น„์šฉ ๋ฐ ๋ณต์žก์„ฑ:** FSD๋Š” ํ™•์žฅ์„ฑ๊ณผ ๋ชจ๋“ˆํ™”์— ๋›ฐ์–ด๋‚˜์ง€๋งŒ ๋Ÿฌ๋‹ ์ปค๋ธŒ๊ฐ€ ๋†’์œผ๋ฉฐ, ์ž‘์€ ๊ทœ๋ชจ์˜ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์˜ค๋ฒ„์—”์ง€๋‹ˆ์–ด๋ง์œผ๋กœ ๋А๊ปด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [42, 43]. ๋˜ํ•œ '์ธ์ฆ(Auth)' ๊ฐ™์€ ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ(Cross-cutting concerns)๋ฅผ ์ •ํ™•ํžˆ ์–ด๋–ค ๊ธฐ๋Šฅ์ด๋‚˜ ์Šฌ๋ผ์ด์Šค์— ๋ฐฐ์น˜ํ• ์ง€ ๊ฒฝ๊ณ„๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ์–ด๋ ค์›Œ ํŒ€ ๋‚ด ๊ทœ์น™ ํ•ฉ์˜์™€ ์ง€์†์ ์ธ ๋ฌธ์„œํ™”๊ฐ€ ์š”๊ตฌ๋ฉ๋‹ˆ๋‹ค [44, 45]. -* **React Compiler ์ ์šฉ์˜ ์ œ์•ฝ:** React Compiler๊ฐ€ ์ž๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ์„ฑ๋Šฅ์„ ๋†’์—ฌ์ฃผ์ง€๋งŒ, ์ด๋Š” ๋ธ”๋ž™๋ฐ•์Šค๋กœ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜ˆ๊ธฐ์น˜ ์•Š๊ฒŒ ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์›์ธ์„ ๋””๋ฒ„๊น…ํ•˜๊ธฐ ๋” ์–ด๋ ค์›Œ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [46]. ๋˜ํ•œ ๋งค ๋ Œ๋”๋ง๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๊ฐ์ฒด ์ฐธ์กฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์ถฉ๋Œํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ๊ฒฝ์šฐ React์˜ ๋ถˆ๋ณ€์„ฑ ๋ฐ ๋ถ€์ˆ˜ ํšจ๊ณผ ๊ทœ์น™(Rules of React)์„ ์—„๊ฒฉํžˆ ์ค€์ˆ˜ํ•˜๋„๋ก ๋Œ€๋Œ€์ ์ธ ๋ฆฌํŒฉํ† ๋ง์ด ์„ ํ–‰๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [28, 47, 48]. -* **Context API vs. ์™ธ๋ถ€ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„:** Context API๋Š” ๋‚ด์žฅ ๊ธฐ๋Šฅ์ด๋ฏ€๋กœ ์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๋Š” ์žฅ์ ์ด ์žˆ์ง€๋งŒ, ๋ณ€๊ฒฝ์ด ์žฆ์€ ์ƒํƒœ์— ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ๋ถˆํ•„์š”ํ•œ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์˜ ์—ฐ์‡„ ๋ฆฌ๋ Œ๋”๋ง์„ ์œ ๋ฐœํ•˜๋Š” ์น˜๋ช…์ ์ธ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ์„ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค [19, 20]. ๋ฐ˜๋Œ€๋กœ Zustand๋‚˜ TanStack Query๋ฅผ ๋„์ž…ํ•˜๋ฉด ๋ฆฌ๋ Œ๋”๋ง ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์œผ๋‚˜, ์‹œ์Šคํ…œ์— ์ƒˆ๋กœ์šด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์˜์กด์„ฑ๊ณผ ํ•™์Šต ๊ณก์„ ์ด ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค [21, 49]. -* **DRY์™€ KISS ์›์น™์˜ ์ƒ์ถฉ:** ์ค‘๋ณต์„ ์ค„์ด๊ธฐ(DRY) ์œ„ํ•ด ๊ณตํ†ต ๋กœ์ง์„ ๊ณ ์ฐจ ์ปดํฌ๋„ŒํŠธ(HOC)๋‚˜ ์ปค์Šคํ…€ ํ›…์œผ๋กœ ์ง€๋‚˜์น˜๊ฒŒ ์ถ”์ƒํ™”ํ•˜๋ฉด, ์ฝ”๋“œ๊ฐ€ ์›๋ž˜์˜ ๋‹จ์ˆœํ•œ ํ˜•ํƒœ๋ณด๋‹ค ์ดํ•ดํ•˜๊ณ  ๋””๋ฒ„๊น…ํ•˜๊ธฐ ํ›จ์”ฌ ์–ด๋ ค์›Œ์ ธ ๊ฒฐ๊ตญ KISS ์›์น™์„ ์œ„๋ฐฐํ•˜๊ฒŒ ๋˜๋Š” ๋ถ€์ž‘์šฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [17]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -#### [๊ด€๊ณ„ ์œ ํ˜• A: ์•„ํ‚คํ…์ฒ˜ ๋ฐ ์‹œ์Šคํ…œ ๊ตฌ์กฐ (Architecture & Structural Design)] -* `[[Feature-Sliced Design (FSD)]]` - * ์—ฐ๊ฒฐ ์ด์œ : ํ˜„๋Œ€ ํ”„๋ก ํŠธ์—”๋“œ์˜ ๋ชจ๋“ˆํ™” ๋ฐ ํ™•์žฅ์„ฑ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋„๋ฆฌ ์ฑ„ํƒ๋˜๋Š” ์•„ํ‚คํ…์ฒ˜ ๋ฐฉ๋ฒ•๋ก ์˜ ํ•ต์‹ฌ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [9, 10]. - * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ ๊ธฐ๋ฐ˜์˜ ์ฝ”๋“œ ๋ถ„ํ• , ์—„๊ฒฉํ•œ ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ๊ทœ์น™ ์ ์šฉ ๋ฐฉ๋ฒ•, ๊ทธ๋ฆฌ๊ณ  ํผ๋ธ”๋ฆญ API๋ฅผ ํ†ตํ•œ ๋ชจ๋“ˆ ์บก์Аํ™” ์›๋ฆฌ [4, 8, 50]. -* `[[Error Boundaries]]` - * ์—ฐ๊ฒฐ ์ด์œ : ๋ถ€๋ถ„์ ์ธ UI ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๊ฐ€ ์‹œ์Šคํ…œ ์ „์ฒด์˜ ์žฅ์• (White screen of death)๋กœ ํ™•์‚ฐ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๊ตฌ์กฐ์  ์•ˆ์ „ ์žฅ์น˜์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [33, 34]. - * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ Œ๋”๋ง ํŠธ๋ฆฌ์—์„œ ์ปดํฌ๋„ŒํŠธ ๊ฒฐํ•จ์„ ๊ฒฉ๋ฆฌํ•˜๋Š” ์›๋ฆฌ์™€ ์‹œ์Šคํ…œ ๋ณต์›๋ ฅ์„ ๋†’์ด๋Š” ์—๋Ÿฌ ์ฒ˜๋ฆฌ ์ „๋žต [33, 35]. - -#### [๊ด€๊ณ„ ์œ ํ˜• B: ์ƒํƒœ ๊ด€๋ฆฌ ํŒจ๋Ÿฌ๋‹ค์ž„ (State Management Paradigms)] -* `[[Zustand vs Context API]]` - * ์—ฐ๊ฒฐ ์ด์œ : ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ์—์„œ ์„ฑ๋Šฅ๊ณผ ํ™•์žฅ์„ฑ์„ ๊ฒฐ์ •์ง“๋Š” ๊ฐ€์žฅ ๋นˆ๋ฒˆํ•œ ์•„ํ‚คํ…์ฒ˜ ๊ฒฐ์ • ์ง€์ ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [5, 19]. - * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Context API์˜ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ๋ Œ๋”๋ง ๋ฌธ์ œ์ ๊ณผ ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ Zustand์˜ ๊ตฌ๋…/์„ ํƒ์ž(Selector) ๊ธฐ๋ฐ˜ ๋ Œ๋”๋ง ์ตœ์ ํ™” ๊ธฐ๋ฒ• [19, 20, 51]. -* `[[TanStack Query (React Query)]]` - * ์—ฐ๊ฒฐ ์ด์œ : ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ์™€ ์„œ๋ฒ„ ์ƒํƒœ(Server State)๋ฅผ ๊ตฌ์กฐ์ ์œผ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ API ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ์˜ ๋ณ‘๋ชฉ์„ ์—†์• ์ฃผ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [18, 22]. - * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ฐ์ดํ„ฐ ์บ์‹ฑ, ๋ฐฑ๊ทธ๋ผ์šด๋“œ ๋™๊ธฐํ™” ๋ฐ API ๊ณ„์ธต์˜ ๊ด€์‹ฌ์‚ฌ ๋ถ„๋ฆฌ(Separation of Concerns) [18, 22]. - -#### [๊ด€๊ณ„ ์œ ํ˜• C: ์„ฑ๋Šฅ ๋ฐ ๋นŒ๋“œ ์ตœ์ ํ™” (Performance & Build Optimization)] -* `[[React Compiler]]` - * ์—ฐ๊ฒฐ ์ด์œ : ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์˜ ๋ณต์žก์„ฑ์„ ์ค„์ด๊ณ  ๋นŒ๋“œ ํƒ€์ž„์— ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง ์„ฑ๋Šฅ์„ ์ž๋™์œผ๋กœ ์ตœ์ ํ™”ํ•˜๋Š” ์ตœ์‹  ํ•ต์‹ฌ ๋„๊ตฌ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [25, 28, 29]. - * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์„ ์–ธ์  UI ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ์˜ ๋นŒ๋“œ ํƒ€์ž„ ์ตœ์ ํ™” ํ•œ๊ณ„ ๋ฐ React์˜ ๊ทœ์น™(Rules of React)์ด ๊ฐ•์ œํ•˜๋Š” ๋ถˆ๋ณ€์„ฑ์˜ ์ค‘์š”์„ฑ [52, 53]. -* `[[Code Splitting & Lazy Loading]]` - * ์—ฐ๊ฒฐ ์ด์œ : ์ดˆ๊ธฐ ๋กœ๋“œ(First Paint) ์†๋„ ํ–ฅ์ƒ๊ณผ JavaScript ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ œ์–ดํ•˜๋Š” ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์‹œ์Šคํ…œ์˜ ํ•„์ˆ˜ ์„ฑ๋Šฅ ์ „๋žต์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [30, 31, 54]. - * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Vite๋‚˜ Webpack ๊ฐ™์€ ๋ฒˆ๋“ค๋Ÿฌ ํ™˜๊ฒฝ์—์„œ ๋™์  ์ž„ํฌํŠธ๋ฅผ ํ†ตํ•œ ๋ผ์šฐํŠธ ๋‹จ์œ„ ๋ถ„ํ•  ๋ฐ ๋ฌด๊ฑฐ์šด ๋ฒค๋” ์ฒญํฌ(`manualChunks`)์˜ ์บ์‹ฑ ๋ถ„๋ฆฌ ์ „๋žต [26, 27, 31]. - -### Deeper Research Questions - -* ๊ฑฐ๋Œ€ํ•œ ๋ชจ๋†€๋ฆฌ์‹ ๊ตฌ์กฐ ํ˜น์€ ๋‹จ์ผ ํŒŒ์ผ ํƒ€์ž…(components/, hooks/) ๊ธฐ๋ฐ˜์˜ ๋ ˆ๊ฑฐ์‹œ React ์•ฑ์„ Feature-Sliced Design(FSD) ์•„ํ‚คํ…์ฒ˜๋กœ ์ ์ง„์ ์œผ๋กœ ๋ฆฌํŒฉํ† ๋งํ•  ๋•Œ ๊ณ ๋ คํ•ด์•ผ ํ•  ์ตœ์ ์˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? -* React Compiler๊ฐ€ ๋„์ž…๋˜์–ด ์ปดํฌ๋„ŒํŠธ์˜ ๋ฆฌ๋ Œ๋”๋ง์„ ์ž๋™์œผ๋กœ ์ œ์–ดํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด, ๊ฐœ๋ฐœ์ž๋Š” ๋” ์ด์ƒ `useMemo`๋‚˜ `useCallback`์„ ์ž‘์„ฑํ•  ํ•„์š”๊ฐ€ ์™„์ „ํžˆ ์—†์–ด์ง€๋Š”๊ฐ€? ํ˜น์€ ์—ฌ์ „ํžˆ ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์ด ํ•„์ˆ˜์ ์ธ ์—ฃ์ง€ ์ผ€์ด์Šค๋Š” ๋ฌด์—‡์ธ๊ฐ€? -* Zustand์™€ ๊ฐ™์€ ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ ๊ด€๋ฆฌ์™€ TanStack Query์™€ ๊ฐ™์€ ์„œ๋ฒ„ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋™์‹œ ์‚ฌ์šฉํ•  ๋•Œ, ๋‘ ์ƒํƒœ ์‚ฌ์ด์˜ ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™”์™€ ์˜์กด์„ฑ ์ฃผ์ž…์€ ์–ด๋–ป๊ฒŒ ์„ค๊ณ„ํ•ด์•ผ ์‘์ง‘๋„๋ฅผ ๋†’์ผ ์ˆ˜ ์žˆ๋Š”๊ฐ€? -* ํ”„๋ก ํŠธ์—”๋“œ ์„ฑ๋Šฅ ์ตœ์ ํ™” ์ค‘ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜(Memory Leak)๋ฅผ ์˜ˆ๋ฐฉํ•˜๊ธฐ ์œ„ํ•ด Chrome DevTools ํž™ ์Šค๋ƒ…์ƒท์—์„œ ์‹๋ณ„๋˜๋Š” '๋ถ„๋ฆฌ๋œ DOM ๋…ธ๋“œ(Detached DOM Nodes)'์™€ ํด๋กœ์ €(Closure) ์ž”๋ฅ˜ ๋ฌธ์ œ๋ฅผ ํ”„๋กœ๋•์…˜์—์„œ ์–ด๋–ป๊ฒŒ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? -* Vite๋ฅผ ํ™œ์šฉํ•œ ๋นŒ๋“œ ์‹œ ๋Œ€๊ทœ๋ชจ ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์ธํ•œ ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ ๊ฒฝ๊ณ ("Large Chunks")๋ฅผ ๊ทผ๋ณธ์ ์œผ๋กœ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด `manualChunks` ์„ค์ •์„ ์–ด๋–ป๊ฒŒ ๋ถ„ํ• ํ•ด์•ผ ๋ธŒ๋ผ์šฐ์ €์˜ ๋ณ‘๋ ฌ ๋‹ค์šด๋กœ๋“œ ๋ฐ ์บ์‹ฑ ํšจ์œจ์„ ๊ทน๋Œ€ํ™”ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? - -### Practical Application Contexts - -* **Implementation:** ์‹ ๊ทœ ๋„๋ฉ”์ธ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ๋•Œ ๋กœ์ง, UI, ์ปค์Šคํ…€ ํ›…์„ ํ•˜๋‚˜์˜ ํ”ผ์ฒ˜(Feature) ํด๋”์— ์‘์ง‘์‹œํ‚ค๊ณ  ๋‹ค๋ฅธ ํ”ผ์ฒ˜์—์„œ์˜ ์ง์ ‘ ์ž„ํฌํŠธ๋ฅผ ์ œํ•œํ•˜์—ฌ ์ฒ ์ €ํžˆ ์บก์Аํ™”๋œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค [3, 4]. ๋นˆ๋ฒˆํžˆ ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ๋‚˜ ๋ Œ๋”๋ง ๋กœ์ง ์•ˆ์—์„œ๋Š” ์ธ๋ผ์ธ ์ต๋ช… ํ•จ์ˆ˜ ์‚ฌ์šฉ์„ ์ง€์–‘ํ•˜๊ณ  ๋ถˆํ•„์š”ํ•œ ์žฌํ• ๋‹น์„ ๋ง‰์Šต๋‹ˆ๋‹ค [55, 56]. -* **System Design:** ์‹œ์Šคํ…œ ์ดˆ๊ธฐ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ ์ƒํƒœ์˜ ์œ ํ˜•์„ ๋ช…ํ™•ํžˆ ๋ถ„๋ฅ˜ํ•˜์—ฌ, ์ž์ฃผ ๋ฐ”๋€Œ์ง€ ์•Š๋Š” ํ…Œ๋งˆ/์„ค์ •์€ Context API์—, ์ƒํ˜ธ์ž‘์šฉ์ด ์žฆ์€ ์žฅ๋ฐ”๊ตฌ๋‹ˆ/UI ์ƒํƒœ๋Š” Zustand์—, ์„œ๋ฒ„ ๋ฐ์ดํ„ฐ๋Š” TanStack Query์— ์œ„์ž„ํ•˜๋Š” ๋‹ค์ธต์  ์ƒํƒœ ํŠธ๋ฆฌ๋ฅผ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค [5, 18, 57]. -* **Operation / Maintenance:** ํ”„๋กœ๋•์…˜ ๋ฐฐํฌ ํ›„ Sentry, LogRocket, Datadog๊ณผ ๊ฐ™์€ ๊ฐ€์‹œ์„ฑ(Observability) ๋ฐ ํด๋ผ์šฐ๋“œ ๋กœ๊น… ๋„๊ตฌ๋ฅผ ์—ฐ๋™ํ•ด ์‚ฌ์šฉ์ž ์„ธ์…˜์„ ๋ฆฌํ”Œ๋ ˆ์ดํ•˜๊ณ  ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜ ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ์ด์Šˆ๋ฅผ ์‚ฌ์ „์— ํƒ์ง€ํ•ฉ๋‹ˆ๋‹ค [36, 37]. -* **Learning Path:** React ๊ธฐ์ดˆ(useState, Props)์™€ ์ปดํฌ๋„ŒํŠธ ๋ถ„๋ฆฌ(SOLID, Clean Code) ๊ฐœ๋…์„ ์ˆ™์ง€ํ•œ ํ›„, ์ ์ง„์ ์œผ๋กœ Context API์˜ ํ•œ๊ณ„๋ฅผ ์ฒดํ—˜ํ•˜๊ณ  Zustand๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋Š” ๊ณผ์ •์„ ๊ฑฐ์น˜๋ฉฐ ๋ Œ๋”๋ง ์ตœ์ ํ™”์™€ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์˜ ์›๋ฆฌ๋ฅผ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค [4, 14, 58]. -* **My Project Relevance:** ํ˜„์žฌ ์œ ์ง€๋ณด์ˆ˜ ์ค‘์ธ ๊ฑฐ๋Œ€ํ•œ React ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ๋‹ค๋ฉด, ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ ์ƒ๋‹จ์— ๋ฌด๋ถ„๋ณ„ํ•˜๊ฒŒ ๋ฐฐ์น˜๋œ Context Provider๋ฅผ ๊ฑท์–ด๋‚ด๊ณ  Zustand ๊ธฐ๋ฐ˜์˜ ๋ถ€๋ถ„ ๊ตฌ๋… ํŒจํ„ด์œผ๋กœ ๋ฆฌํŒฉํ† ๋งํ•˜๊ฑฐ๋‚˜ [21], Storybook ๋ฐ Chromatic์„ CI ํŒŒ์ดํ”„๋ผ์ธ์— ๋„์ž…ํ•˜์—ฌ PR ๋‹จ๊ณ„์—์„œ ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ(Visual Test)๋ฅผ ์ž๋™ํ™”ํ•˜์—ฌ ํ’ˆ์งˆ์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [41, 59]. - -### Adjacent Topics - -* `[[Core Web Vitals]]` - * ํ™•์žฅ ๋ฐฉํ–ฅ: LCP(Largest Contentful Paint), INP(Interaction to Next Paint), CLS(Cumulative Layout Shift) ๋“ฑ ๊ตฌ๊ธ€์ด ์ •์˜ํ•œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ์ค‘์‹ฌ์˜ ์„ฑ๋Šฅ ์ธก์ • ์ง€ํ‘œ๋ฅผ ์ดํ•ดํ•˜๊ณ , ์•ž์„œ ๋‹ค๋ฃฌ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…, ๋ ˆ์ด์ง€ ๋กœ๋”ฉ, ๋ Œ๋”๋ง ์ตœ์ ํ™” ๊ธฐ๋ฒ•์ด ์‹ค์ œ ์‚ฌ์šฉ์ž ์ฒด๊ฐ ์†๋„ ํ–ฅ์ƒ์— ์–ด๋–ป๊ฒŒ ์ง๊ฒฐ๋˜๋Š”์ง€ ์‹ฌ์ธต ๋ถ„์„ํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์—ฐ๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [23, 60, 61]. -* `[[Git Branching Strategies & CI/CD Governance]]` - * ํ™•์žฅ ๋ฐฉํ–ฅ: ๋ณต์žกํ•œ ํ”„๋ก ํŠธ์—”๋“œ ์‹œ์Šคํ…œ์„ ๋‹ค์ˆ˜์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ˜‘์—…ํ•˜์—ฌ ๊ตฌ์ถ•ํ•  ๋•Œ ์ถฉ๋Œ์„ ์ตœ์†Œํ™”ํ•˜๊ณ  ๋ฆด๋ฆฌ์Šค ์•ˆ์ •์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•œ GitHub Flow, Trunk-Based Development ๋“ฑ์˜ ๋ธŒ๋žœ์นญ ์ „๋žต๊ณผ, ESLint/Prettier ์ž๋™ํ™”, Conventional Commits๋ฅผ ํ™œ์šฉํ•œ ๋ฐฐํฌ ํŒŒ์ดํ”„๋ผ์ธ(CI/CD) ํ†ต์ œ ๋ฐฉ๋ฒ•์„ ํ™•์žฅํ•ด์„œ ์กฐ์‚ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [62-64]. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Error Handling.md b/00_Raw/Error Handling.md deleted file mode 100644 index 416792da..00000000 --- a/00_Raw/Error Handling.md +++ /dev/null @@ -1,64 +0,0 @@ -# [[Error Handling]] - -## ๐Ÿ“Œ Brief Summary -React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ์˜ Error Handling์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—๋Ÿฌ๋กœ ์ธํ•ด ์ „์ฒด ์•ฑ์ด ์ค‘๋‹จ๋˜๊ฑฐ๋‚˜ ๋ฐฑ์ง€ ํ™”๋ฉด์ด ๋‚˜ํƒ€๋‚˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค [1, 2]. ํ•ต์‹ฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ธ ์—๋Ÿฌ ๋ฐ”์šด๋”๋ฆฌ(Error Boundaries)๋ฅผ ํ†ตํ•ด ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ์—์„œ ๋ฐœ์ƒํ•œ ๋ Œ๋”๋ง ์—๋Ÿฌ๋ฅผ ํฌ์ฐฉํ•˜๊ณ , ๋Œ€์‹  ๋Œ€์ฒด UI(Fallback UI)๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค [1]. ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋‚˜ ๋น„๋™๊ธฐ ์ž‘์—…์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ๋Š” ์—๋Ÿฌ ๋ฐ”์šด๋”๋ฆฌ๊ฐ€ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์ „ํ†ต์ ์ธ `try/catch` ๋ธ”๋ก๊ณผ ๊ฒฐํ•ฉํ•˜์—ฌ ํฌ๊ด„์ ์ธ ์—๋Ÿฌ ๊ด€๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค [3-5]. - -## ๐Ÿ“– Core Content -* **์—๋Ÿฌ ๋ฐ”์šด๋”๋ฆฌ(Error Boundaries)์˜ ๋™์ž‘ ์›๋ฆฌ:** - ์—๋Ÿฌ ๋ฐ”์šด๋”๋ฆฌ๋Š” ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์˜ ๋ Œ๋”๋ง, ์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ, ์ƒ์„ฑ์ž์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ๋ฅผ ์žก๋Š” ํŠน๋ณ„ํ•œ React ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ์ž…๋‹ˆ๋‹ค [1, 5]. `static getDerivedStateFromError()` ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—๋Ÿฌ ๋ฐœ์ƒ ์‹œ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์—ฌ Fallback UI๋ฅผ ๋ Œ๋”๋งํ•˜๊ณ , `componentDidCatch()` ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—๋Ÿฌ ์ •๋ณด๋ฅผ ๋กœ๊น…ํ•ฉ๋‹ˆ๋‹ค [6]. ์ด๋ฅผ ํ†ตํ•ด ํŠน์ • UI ๋ถ€๋ถ„์— ๋ฒ„๊ทธ๊ฐ€ ์žˆ๋”๋ผ๋„ ๋‚˜๋จธ์ง€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์•ˆ์ •์ ์œผ๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค [7]. -* **์—๋Ÿฌ ํฌ์ฐฉ์˜ ํ•œ๊ณ„ (์˜ˆ์™ธ ์‚ฌํ•ญ):** - ์—๋Ÿฌ ๋ฐ”์šด๋”๋ฆฌ๋Š” ํŠธ๋ฆฌ์—์„œ ์ž์‹ ์˜ ์•„๋ž˜์— ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ์˜ ์—๋Ÿฌ๋งŒ ํฌ์ฐฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ž๊ธฐ ์ž์‹ ์—์„œ ๋ฐœ์ƒํ•œ ์—๋Ÿฌ๋Š” ํฌ์ฐฉํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค [8]. ๋˜ํ•œ, ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ, ๋น„๋™๊ธฐ ์ฝ”๋“œ(์˜ˆ: `setTimeout` ๋˜๋Š” Promise), ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง(SSR) ์ค‘ ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ๋Š” ํฌ์ฐฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค [5, 6]. -* **์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์™€ ๋น„๋™๊ธฐ ์ฝ”๋“œ์˜ ์—๋Ÿฌ ์ฒ˜๋ฆฌ:** - ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋Š” ๋ Œ๋”๋ง ์ค‘์— ์‹คํ–‰๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ, ์—ฌ๊ธฐ์„œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ด๋„ React๋Š” ์—ฌ์ „ํžˆ ํ™”๋ฉด์— ๋ฌด์—‡์„ ํ‘œ์‹œํ•ด์•ผ ํ• ์ง€ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค [4]. ๋”ฐ๋ผ์„œ ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ์—๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ํ‘œ์ค€ ๋ช…๋ นํ˜• ์ฝ”๋“œ ์—๋Ÿฌ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์ธ `try/catch` ๋ฌธ์„ ์ง์ ‘ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [3-5]. -* **ํฌ์ฐฉ๋˜์ง€ ์•Š์€ ์—๋Ÿฌ(Uncaught Errors)์˜ ๊ฒฐ๊ณผ:** - React 16๋ถ€ํ„ฐ๋Š” ์—๋Ÿฌ ๋ฐ”์šด๋”๋ฆฌ์— ์˜ํ•ด ํฌ์ฐฉ๋˜์ง€ ์•Š์€ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ, ์†์ƒ๋œ UI๋ฅผ ๊ทธ๋Œ€๋กœ ๋‘๋Š” ๊ฒƒ์ด ๋ณด์•ˆ์ด๋‚˜ ์˜ค์ž‘๋™(์˜ˆ: ์ž˜๋ชป๋œ ์†ก๊ธˆ ๊ธˆ์•ก ํ‘œ์‹œ, ์—‰๋šฑํ•œ ์‚ฌ๋žŒ์—๊ฒŒ ๋ฉ”์‹œ์ง€ ์ „์†ก ๋“ฑ) ์ธก๋ฉด์—์„œ ๋” ์œ„ํ—˜ํ•˜๋‹ค๊ณ  ํŒ๋‹จํ•˜์—ฌ ์ „์ฒด React ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ๋ฅผ ๋งˆ์šดํŠธ ํ•ด์ œ(Unmount)ํ•ฉ๋‹ˆ๋‹ค [9, 10]. -* **ํ”„๋กœ๋•์…˜ ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ๋””๋ฒ„๊น…:** - ์—๋Ÿฌ ๋ฐ”์šด๋”๋ฆฌ๋Š” ๋‹จ์ˆœํžˆ UI๋ฅผ ๋ณต๊ตฌํ•˜๋Š” ๊ฒƒ์„ ๋„˜์–ด, Sentry, LogRocket, SigNoz ๋“ฑ๊ณผ ๊ฐ™์€ ํ”„๋ก ํŠธ์—”๋“œ ์—๋Ÿฌ ๋กœ๊น… ์„œ๋น„์Šค์™€ ๊ฒฐํ•ฉํ•˜์—ฌ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์˜ ์—๋Ÿฌ๋ฅผ ๊ธฐ๋กํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค [11]. ์ด ๋„๊ตฌ๋“ค์€ ์ง€๋Šฅํ˜• ์—๋Ÿฌ ๊ทธ๋ฃนํ™”, ์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด, ์ „์ฒด ์Šคํƒ ํŠธ๋ ˆ์ด์Šค๋ฅผ ์ œ๊ณตํ•˜์—ฌ ์›์ธ ํŒŒ์•…์„ ๋•์Šต๋‹ˆ๋‹ค [12-14]. - -## โš–๏ธ Trade-offs & Caveats -* **ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ ๊ฐ•์ œ:** ์—๋Ÿฌ ๋ฐ”์šด๋”๋ฆฌ๋Š” ์˜ค์ง ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ๋กœ๋งŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5, 8]. ํ˜„๋Œ€์˜ React ์ฝ”๋“œ๋ฒ ์ด์Šค๊ฐ€ ๋Œ€๋ถ€๋ถ„ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์™€ Hooks๋กœ ์ž‘์„ฑ๋œ๋‹ค๋Š” ์ ์„ ๊ณ ๋ คํ•˜๋ฉด ์ด์งˆ์ ์ธ ๊ตฌ์กฐ๊ฐ€ ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ•จ์ˆ˜ํ˜•์œผ๋กœ ์‚ฌ์šฉํ•˜๋ ค๋ฉด `react-error-boundary`์™€ ๊ฐ™์€ ๋ณ„๋„์˜ ๋ž˜ํผ(Wrapper) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์˜์กดํ•ด์•ผ ํ•˜๋Š” ์ œ์•ฝ์ด ์žˆ์Šต๋‹ˆ๋‹ค [5]. -* **์ „์—ญ vs ์ง€์—ญ ์—๋Ÿฌ ๋ฐ”์šด๋”๋ฆฌ์˜ ๋”œ๋ ˆ๋งˆ:** ์•ฑ ์ „์ฒด๋ฅผ ํ•˜๋‚˜์˜ ์—๋Ÿฌ ๋ฐ”์šด๋”๋ฆฌ๋กœ ๊ฐ์‹ธ๋ฉด ์„ค์ •์€ ์‰ฝ์ง€๋งŒ, ์ž‘์€ ์ปดํฌ๋„ŒํŠธ ํ•˜๋‚˜์˜ ์˜ค๋ฅ˜๋กœ ์ธํ•ด ์ „์ฒด UI๊ฐ€ Fallback์œผ๋กœ ๋Œ€์ฒด๋˜์–ด ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [11, 15]. ๋ฐ˜๋Œ€๋กœ ์„œ๋“œํŒŒํ‹ฐ ์œ„์ ฏ, ๋ณต์žกํ•œ ํผ ๋“ฑ ๋ถˆ์•ˆ์ •ํ•œ ์š”์†Œ๋ฅผ ๊ฐœ๋ณ„์ ์œผ๋กœ ๊ฐ์‹ธ๋ฉด(Granularity) ํŠน์ • ์˜์—ญ๋งŒ ์—๋Ÿฌ ์ฒ˜๋ฆฌ๋˜์–ด ๋‚˜๋จธ์ง€ ์•ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ด๋ฅผ ์„ค๊ณ„ํ•˜๊ณ  ๋ฐฐ์น˜ํ•˜๋Š” ์ž‘์—…์˜ ๋ณต์žก๋„์™€ ๊ด€๋ฆฌ ๋น„์šฉ์ด ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค [9, 11, 15]. -* **์™„๋ฒฝํ•œ ๋ณดํ˜ธ์˜ ๋ถˆ๊ฐ€๋Šฅ:** ์•ž์„œ ์–ธ๊ธ‰๋œ ๊ฒƒ์ฒ˜๋Ÿผ ์—๋Ÿฌ ๋ฐ”์šด๋”๋ฆฌ๋Š” ๋น„๋™๊ธฐ ๋กœ์ง์ด๋‚˜ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์˜ ์—๋Ÿฌ๋ฅผ ์žก์ง€ ๋ชปํ•˜๋ฏ€๋กœ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๊ฒฉ์ƒ ๋ฐ์ดํ„ฐ ํŽ˜์นญ ๋“ฑ ๋น„๋™๊ธฐ ๋กœ์ง์ด ๋งŽ์„ ๊ฒฝ์šฐ ์—๋Ÿฌ ๋ฐ”์šด๋”๋ฆฌ๋งŒ์œผ๋กœ๋Š” ์‹œ์Šคํ…œ์˜ ์ค‘๋‹จ์„ ์™„์ „ํžˆ ๋ง‰์„ ์ˆ˜ ์—†์œผ๋ฉฐ, ๋ชจ๋“  ์ƒํ˜ธ์ž‘์šฉ ์ง€์ ์— ๋ฐฉ์–ด์ ์ธ ๋กœ์ง(`try/catch`)์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๋Š” ์ˆ˜๊ณ ๊ฐ€ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค [3, 4]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -#### [์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] -- [[Error Boundaries]] - - ์—ฐ๊ฒฐ ์ด์œ : React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์„ ์–ธํ˜• UI ๋ Œ๋”๋ง ์ค‘ ๋ฐœ์ƒํ•˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—๋Ÿฌ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์ค‘์‹ฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [1]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์•ฑ์˜ ํฌ๋ž˜์‹œ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ  ์†์ƒ๋œ ์ปดํฌ๋„ŒํŠธ ๋Œ€์‹  ์ •์ƒ์ ์ธ ๋Œ€์ฒด ํ™”๋ฉด์„ ๋ Œ๋”๋งํ•˜๋Š” React๋งŒ์˜ ์—๋Ÿฌ ๋ณต๊ตฌ ์ „๋žต์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1, 2, 10]. - -- [[Component Lifecycle]] - - ์—ฐ๊ฒฐ ์ด์œ : ์—๋Ÿฌ ๋ฐ”์šด๋”๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” React ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ์˜ ํŠน์ • ์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ(`getDerivedStateFromError`, `componentDidCatch`)๊ฐ€ ํ•„์ˆ˜์ ์œผ๋กœ ์š”๊ตฌ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [6]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ Œ๋”๋ง ๋‹จ๊ณ„์—์„œ ์–ด๋–ป๊ฒŒ ์—๋Ÿฌ๋ฅผ ์žก๊ณ  ์ปดํฌ๋„ŒํŠธ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š”์ง€ ๋‚ด๋ถ€ ๋™์ž‘์„ ์‹ฌ์ธต์ ์œผ๋กœ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3, 6]. - -#### [๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ] -- [[Cloud Logging Tools]] - - ์—ฐ๊ฒฐ ์ด์œ : ์‚ฌ์šฉ์ž ๋ธŒ๋ผ์šฐ์ €(ํ”„๋กœ๋•์…˜)์—์„œ ๋ฐœ์ƒํ•œ ์—๋Ÿฌ๋ฅผ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ธ์ง€ํ•˜๊ณ  ๋ถ„์„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Sentry, LogRocket, Datadog ๊ฐ™์€ ์™ธ๋ถ€ ๋ชจ๋‹ˆํ„ฐ๋ง ํˆด ํ†ตํ•ฉ์ด ํ•„์ˆ˜์ ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [11, 12, 14]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ฐœ์ƒํ•œ ์—๋Ÿฌ์˜ ์Šคํƒ ํŠธ๋ ˆ์ด์Šค ์ถ”์ , ์‚ฌ์šฉ์ž ์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด๋ฅผ ํ†ตํ•œ ์ƒํ™ฉ ๋ณต์› ๋“ฑ ์‹ฌํ™”๋œ ์—๋Ÿฌ ์ถ”์  ๊ธฐ๋ฒ•์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [12-14]. - -- [[try/catch]] - - ์—ฐ๊ฒฐ ์ด์œ : ์—๋Ÿฌ ๋ฐ”์šด๋”๋ฆฌ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†๋Š” ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ, ๋น„๋™๊ธฐ ํ†ต์‹  ์ฝ”๋“œ ๋‚ด์˜ ์—๋Ÿฌ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ํ‘œ์ค€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฐฉ์‹์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [3-5]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์„ ์–ธํ˜• ์—๋Ÿฌ ์ฒ˜๋ฆฌ(Error Boundary)์™€ ๋ช…๋ นํ˜• ์—๋Ÿฌ ์ฒ˜๋ฆฌ(try/catch)์˜ ์—ญํ•  ๋ถ„๋‹ด๊ณผ ์ฐจ์ด๋ฅผ ๋ช…ํ™•ํžˆ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3, 4]. - -### Deeper Research Questions -- ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋‚˜ ๋น„๋™๊ธฐ ํ•จ์ˆ˜(์˜ˆ: setTimeout, Promise) ๋‚ด๋ถ€์˜ ์—๋Ÿฌ๊ฐ€ React์˜ ๋ Œ๋”๋ง ์‚ฌ์ดํด์—์„œ ๋ฒ—์–ด๋‚˜ ์—๋Ÿฌ ๋ฐ”์šด๋”๋ฆฌ์— ํฌ์ฐฉ๋˜์ง€ ์•Š๋Š” ๊ทผ๋ณธ์ ์ธ ์•„ํ‚คํ…์ฒ˜์  ์ด์œ ๋Š” ๋ฌด์—‡์ธ๊ฐ€? -- ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ ์‹œ๋Œ€์—์„œ ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜์˜ ์—๋Ÿฌ ๋ฐ”์šด๋”๋ฆฌ๊ฐ€ ๊ฐ–๋Š” ํ•œ๊ณ„์ ์€ ๋ฌด์—‡์ด๋ฉฐ, ์ปค๋ฎค๋‹ˆํ‹ฐ(์˜ˆ: `react-error-boundary` ๋“ฑ)๋Š” ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ๊ทน๋ณตํ•˜๊ณ  ์žˆ๋Š”๊ฐ€? -- ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํŽ˜์ด์ง€ ๋ ˆ๋ฒจ, ์œ„์ ฏ ๋ ˆ๋ฒจ ๋“ฑ ์—ฌ๋Ÿฌ ๊ฒน์œผ๋กœ ์—๋Ÿฌ ๋ฐ”์šด๋”๋ฆฌ๋ฅผ ์ค‘์ฒฉ ๋ฐฐ์น˜(Nesting)ํ•  ๋•Œ ์—๋Ÿฌ๊ฐ€ ์ƒ์œ„๋กœ ์ „ํŒŒ(Propagate)๋˜๋Š” ๊ทœ์น™๊ณผ ํšจ๊ณผ์ ์ธ ๋ฐฐ์น˜ ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? -- SSR(Server-Side Rendering) ํ™˜๊ฒฝ์„ ์ง€์›ํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ(์˜ˆ: Next.js)์—์„œ๋Š” ํด๋ผ์ด์–ธํŠธ ์ค‘์‹ฌ์˜ React ์—๋Ÿฌ ๋ฐ”์šด๋”๋ฆฌ ์™ธ์— ์„œ๋ฒ„ ์ธก ์—๋Ÿฌ๋ฅผ ์–ด๋–ป๊ฒŒ ํ†ตํ•ฉ ๊ด€๋ฆฌํ•˜๋Š”๊ฐ€? -- Sentry์™€ ๊ฐ™์€ ์™ธ๋ถ€ ๋กœ๊น… ๋„๊ตฌ๋Š” ์ตœ์†Œํ™”(Minified)๋œ ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ ํŒŒ์ผ์—์„œ ์—๋Ÿฌ๊ฐ€ ๋‚ฌ์„ ๋•Œ, ์–ด๋–ป๊ฒŒ ์›๋ž˜ ์ปดํฌ๋„ŒํŠธ์™€ ๋ฐœ์ƒ ์œ„์น˜๋ฅผ ์ •ํ™•ํžˆ ๋งคํ•‘ํ•˜์—ฌ ์•Œ๋ ค์ฃผ๋Š”๊ฐ€? - -### Practical Application Contexts -- **Implementation:** React ์ปดํฌ๋„ŒํŠธ ์ž‘์„ฑ ์‹œ ํ•˜์–€ ํ™”๋ฉด์ด ๋œจ๋Š” ๊ฒƒ์„ ๋ง‰๊ธฐ ์œ„ํ•ด ์ตœ์ƒ๋‹จ์ด๋‚˜ ๋ถˆ์•ˆ์ •ํ•œ ์„œ๋“œํŒŒํ‹ฐ ์œ„์ ฏ ์ฃผ์œ„์— `ErrorBoundary` ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  `fallback UI` ํ”„๋กœํผํ‹ฐ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค [2, 9, 15]. ๋น„๋™๊ธฐ ํ˜ธ์ถœ ์‹œ์—๋Š” ๋ฐ˜๋“œ์‹œ `try/catch`๋กœ ๊ฐ์‹ธ ๋ณ„๋„์˜ ์—๋Ÿฌ ์ฒ˜๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค [3, 5]. -- **System Design:** ํŽ˜์ด์Šค๋ถ ๋ฉ”์‹ ์ €์˜ ์˜ˆ์‹œ์ฒ˜๋Ÿผ, ์‚ฌ์ด๋“œ๋ฐ”, ์ •๋ณด ํŒจ๋„, ๋ฉ”์‹œ์ง€ ์ž…๋ ฅ์ฐฝ ๋“ฑ ๋…๋ฆฝ์ ์ธ ๊ธฐ๋Šฅ์„ ๊ฐ๊ฐ ์—๋Ÿฌ ๋ฐ”์šด๋”๋ฆฌ๋กœ ๊ฐ์‹ธ ํ•œ ๊ธฐ๋Šฅ์ด ๊ณ ์žฅ ๋‚˜๋„ ์‹œ์Šคํ…œ์˜ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์€ ๊ณ„์† ์ƒํ˜ธ์ž‘์šฉ ๊ฐ€๋Šฅํ•˜๋„๋ก ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค [15, 16]. -- **Operation / Maintenance:** ํ”„๋กœ๋•์…˜์— ๋ฐฐํฌ๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— Sentry ๊ฐ™์€ ๊ด€์ธก์„ฑ(Observability) ๋„๊ตฌ๋ฅผ ์—ฐ๊ฒฐํ•ด ์—๋Ÿฌ ๋ฐ”์šด๋”๋ฆฌ์˜ `componentDidCatch`์—์„œ ์—๋Ÿฌ๋ฅผ ์ „์†กํ•˜๋„๋ก ๊ตฌ์„ฑํ•˜์—ฌ ์‚ฌ์šฉ์ž ๋ถˆ๋งŒ ์ ‘์ˆ˜ ์ด์ „์— ๋ฒ„๊ทธ๋ฅผ ์‹๋ณ„ํ•˜๊ณ  ๋””๋ฒ„๊น…ํ•ฉ๋‹ˆ๋‹ค [11, 14]. -- **Learning Path:** ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๊ธฐ๋ณธ์ ์ธ `try/catch` ๋ช…๋ นํ˜• ์—๋Ÿฌ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์„ ๋จผ์ € ์ˆ™์ง€ํ•˜๊ณ , ์ดํ›„ React์˜ ์ปดํฌ๋„ŒํŠธ ์ƒ๋ช…์ฃผ๊ธฐ์™€ ์—๋Ÿฌ ๋ฐ”์šด๋”๋ฆฌ๋ฅผ ๊ฒฐํ•ฉํ•œ ์„ ์–ธ์  ์—๋Ÿฌ ์ฒ˜๋ฆฌ ๊ธฐ๋ฒ•์„ ํ•™์Šตํ•˜๋ฉฐ, ๋งˆ์ง€๋ง‰์œผ๋กœ ํด๋ผ์šฐ๋“œ ๋กœ๊น… ํˆด ํ†ตํ•ฉ์„ ๋ฐฐ์›๋‹ˆ๋‹ค. -- **My Project Relevance:** ํ˜„์žฌ ์ง„ํ–‰ ์ค‘์ธ ํ”„๋กœ์ ํŠธ์˜ ๋ณต์žก์„ฑ์— ๋งž๊ฒŒ ์น˜๋ช…์ ์ธ ์˜ค๋ฅ˜๋กœ๋ถ€ํ„ฐ ์•ฑ ์ „์ฒด ํฌ๋ž˜์‹œ๋ฅผ ๋ฐฉ์ง€ํ•  ์—๋Ÿฌ ๋ฐ”์šด๋”๋ฆฌ์˜ ๋ฐฐ์น˜ ์œ„์น˜๋ฅผ ๊ฒฐ์ •ํ•˜๊ณ , ๋ฏธ์ฒ˜ ํŒŒ์•…ํ•˜์ง€ ๋ชปํ•œ ํ”„๋กœ๋•์…˜ ์—๋Ÿฌ์˜ ๋ชจ๋‹ˆํ„ฐ๋ง ์ฒด๊ณ„๋ฅผ ๋„์ž…ํ•˜๋Š” ๋ฐ ์ง์ ‘์ ์œผ๋กœ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - -### Adjacent Topics -- [[State Management]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: Redux, Zustand ๋“ฑ์˜ ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ ๋‚ด์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ํŽ˜์นญ ์—๋Ÿฌ๋‚˜ ๋ฐ์ดํ„ฐ ์ •๊ทœํ™”(Normalization) ๊ณผ์ •์˜ ์˜ˆ์™ธ๊ฐ€ UI ์—๋Ÿฌ ๋ฐ”์šด๋”๋ฆฌ์™€ ์–ด๋–ป๊ฒŒ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋ฉฐ ์ฒ˜๋ฆฌ๋˜๋Š”์ง€ ํ™•์žฅํ•˜์—ฌ ์—ฐ๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Folder Structure Best Practices.md b/00_Raw/Folder Structure Best Practices.md deleted file mode 100644 index c340d218..00000000 --- a/00_Raw/Folder Structure Best Practices.md +++ /dev/null @@ -1,69 +0,0 @@ -# [[Folder Structure Best Practices]] - -## ๐Ÿ“Œ Brief Summary -React ๋“ฑ ํ”„๋ก ํŠธ์—”๋“œ ํ”„๋กœ์ ํŠธ์—์„œ ์ฝ”๋“œ์˜ ์œ ์ง€๋ณด์ˆ˜์„ฑ, ํ™•์žฅ์„ฑ, ๊ทธ๋ฆฌ๊ณ  ํ˜‘์—… ํšจ์œจ์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ํŒŒ์ผ๊ณผ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ฒด๊ณ„์ ์œผ๋กœ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก ์ž…๋‹ˆ๋‹ค [1]. ํ˜„๋Œ€์ ์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ๊ณผ๊ฑฐ์˜ ํŒŒ์ผ ์œ ํ˜• ๊ธฐ๋ฐ˜(์œ ํ˜•๋ณ„ ๋ถ„๋ฅ˜) ๊ตฌ์กฐ์—์„œ ๋ฒ—์–ด๋‚˜, ๊ธฐ๋Šฅ(Feature)์ด๋‚˜ ๋„๋ฉ”์ธ ์ค‘์‹ฌ์œผ๋กœ ๊ด€๋ จ๋œ ๋กœ์ง์„ ๋ฌถ๋Š” ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๋˜๋Š” ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ๋ฐฉ์‹์ด ๋ชจ๋ฒ” ์‚ฌ๋ก€๋กœ ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค [2, 3]. ์ด๋ฅผ ํ†ตํ•ด UI, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง, ์ƒํƒœ ๊ด€๋ฆฌ ๋“ฑ์˜ ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌํ•˜๊ณ  ํ”„๋กœ์ ํŠธ๊ฐ€ ์ปค์ง์— ๋”ฐ๋ผ ๋ฐœ์ƒํ•˜๋Š” ๊ธฐ์ˆ  ๋ถ€์ฑ„๋ฅผ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [4]. - -## ๐Ÿ“– Core ์†Œ์Šค Content - -* **๊ตฌ์กฐ์˜ ์ง„ํ™”์™€ ํ•œ๊ณ„:** - * ์ดˆ๊ธฐ ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ๋Š” ์ฃผ๋กœ ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๋ฅผ `components` ํด๋”์—, ๋ชจ๋“  ํ›…์„ `hooks` ํด๋”์— ๋„ฃ๋Š” ํ”Œ๋žซ(Flat) ๊ตฌ์กฐ๋‚˜ ํŒŒ์ผ ์œ ํ˜• ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค [5, 6]. - * ํ•˜์ง€๋งŒ ์•ฑ์˜ ๊ทœ๋ชจ๊ฐ€ ์ปค์ง€๋ฉด ๋‹จ์ผ ๊ธฐ๋Šฅ์„ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ํด๋”๋ฅผ ๋„˜๋‚˜๋“ค์–ด์•ผ ํ•˜๋ฏ€๋กœ, ๊ฐœ๋ฐœ ์†๋„๊ฐ€ ๋А๋ ค์ง€๊ณ  ๋””๋ฒ„๊น…์ด ์–ด๋ ค์›Œ์ง€๋ฉฐ ์ฝ”๋“œ๋ฒ ์ด์Šค๊ฐ€ ๋ณต์žกํ•ด์ง€๋Š” ํ•œ๊ณ„๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [3, 6, 7]. -* **๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜(Feature-based) ๋ฐ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๊ตฌ์กฐ:** - * 2025๋…„ ๊ธฐ์ค€ ๊ฐ€์žฅ ๊ถŒ์žฅ๋˜๋Š” ์ ‘๊ทผ ๋ฐฉ์‹์€ ํŒŒ์ผ ์œ ํ˜•์ด ์•„๋‹Œ ๋น„์ฆˆ๋‹ˆ์Šค ๊ธฐ๋Šฅ์ด๋‚˜ ๋ชจ๋“ˆ์„ ์ค‘์‹ฌ์œผ๋กœ ํด๋”๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค [2, 8, 9]. - * ๊ฐ ๊ธฐ๋Šฅ(Feature)์€ ์บก์Аํ™”๋˜์–ด ๋‹ค๋ฅธ ๊ธฐ๋Šฅ๊ณผ ๋…๋ฆฝ์ ์œผ๋กœ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๊ทœ๋ชจ ํ™•์žฅ ์‹œ ๊ธฐ์กด ์ฝ”๋“œ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ณ  ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ๋งค๋„๋Ÿฝ๊ฒŒ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [8, 10]. -* **๊ถŒ์žฅ ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ตฌ์„ฑ (src/ ํ•˜์œ„):** - * `assets/`: ์ด๋ฏธ์ง€, ํฐํŠธ ๋“ฑ ์ •์  ๋ฏธ๋””์–ด ๋ฆฌ์†Œ์Šค ๋ณด๊ด€ [11, 12]. - * `components/`: ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ์—์„œ ๊ณตํ†ต์œผ๋กœ ์žฌ์‚ฌ์šฉ๋˜๋Š” ๋„๋ฉ”์ธ์— ๊ตฌ์• ๋ฐ›์ง€ ์•Š๋Š” UI ์š”์†Œ (์˜ˆ: ๋ฒ„ํŠผ, ๋ชจ๋‹ฌ, ๋„ค๋น„๊ฒŒ์ด์…˜ ๋ฐ” ๋“ฑ) [2, 12, 13]. - * `features/` (๋˜๋Š” `modules/`): ์ธ์ฆ(Auth), ๋Œ€์‹œ๋ณด๋“œ(Dashboard) ๋“ฑ ๋„๋ฉ”์ธ๋ณ„ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง. ์ด ํด๋” ๋‚ด๋ถ€์—๋Š” ํ•ด๋‹น ๊ธฐ๋Šฅ์—๋งŒ ์“ฐ์ด๋Š” ์ปดํฌ๋„ŒํŠธ, ํ›…, API ๋“ฑ์„ ์บก์Аํ™”ํ•˜์—ฌ ๋ณด๊ด€ํ•ฉ๋‹ˆ๋‹ค [2, 9, 13]. - * `hooks/`: ํผ ์ฒ˜๋ฆฌ, ๋ฐ์ดํ„ฐ ํŽ˜์นญ ๋“ฑ ์•ฑ ์ „๋ฐ˜์—์„œ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ปค์Šคํ…€ ํ›… [9, 14]. - * `pages/` (๋˜๋Š” `routes/`): ๋ผ์šฐํŒ…์— ๋งคํ•‘๋˜๋Š” ํŽ˜์ด์ง€ ๋ ˆ๋ฒจ ์ปดํฌ๋„ŒํŠธ [15, 16]. - * `services/`: ์„œ๋“œํŒŒํ‹ฐ ์„œ๋น„์Šค ์—ฐ๋™์ด๋‚˜ API ์š”์ฒญ ๋“ฑ ์™ธ๋ถ€ ํ†ต์‹  ๋กœ์ง [16, 17]. - * `store/` (๋˜๋Š” `context/`): Redux, Zustand, Context API๋ฅผ ํ™œ์šฉํ•˜๋Š” ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ ๋กœ์ง [14-16]. - * `utils/`: ๋‚ ์งœ ํฌ๋งทํŒ…, ๋ฐ์ดํ„ฐ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๋“ฑ ์ƒํƒœ๋ฅผ ๊ฐ€์ง€์ง€ ์•Š๋Š” ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜ [17, 18]. - * `styles/`: ๊ธ€๋กœ๋ฒŒ CSS, ํ…Œ๋งˆ(Theme) ๋“ฑ ์ „์—ญ ์Šคํƒ€์ผ๋ง ํŒŒ์ผ [18, 19]. - * `types/`: TypeScript ์‚ฌ์šฉ ์‹œ ์ „์—ญ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ํƒ€์ž… ๋ฐ ์ธํ„ฐํŽ˜์ด์Šค ๋ณด๊ด€ [18]. - * `config/`: ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋‚˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์—ญ ์„ค์ •(API ๊ธฐ๋ณธ URL ๋“ฑ) ๊ด€๋ฆฌ [18, 20]. -* **Feature-Sliced Design (FSD):** - * ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ํด๋” ๊ตฌ์กฐ๋ณด๋‹ค ๋” ์—„๊ฒฉํ•˜๊ฒŒ ์˜์กด์„ฑ์˜ ๋ฐฉํ–ฅ์„ ํ†ต์ œํ•˜๋Š” ํ”„๋ก ํŠธ์—”๋“œ ์•„ํ‚คํ…์ฒ˜ ๋ฐฉ๋ฒ•๋ก ์ž…๋‹ˆ๋‹ค [21]. - * `shared` -> `entities` -> `features` -> `widgets` -> `pages` -> `app` ์ด๋ผ๋Š” ๊ณ ์ •๋œ ๋‹ค์ธต ๊ณ„์ธต(Layer)์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค [22, 23]. - * ์ƒ์œ„ ๊ณ„์ธต์€ ํ•˜์œ„ ๊ณ„์ธต์˜ ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์ง€๋งŒ(Import), ํ•˜์œ„ ๊ณ„์ธต์€ ์ƒ์œ„ ๊ณ„์ธต์„ ์ฐธ์กฐํ•  ์ˆ˜ ์—†๋Š” ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ๊ทœ์น™์„ ํ†ตํ•ด ์ˆœํ™˜ ์˜์กด์„ฑ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค [22, 24]. -* **Next.js ํ™˜๊ฒฝ์—์„œ์˜ ๋ผ์šฐํŠธ ๊ทธ๋ฃน (Route Groups):** - * Next.js ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•œ ํด๋”๋ช… `(folderName)` ๋ฐฉ์‹์„ ํ†ตํ•ด, ์‹ค์ œ URL ๊ฒฝ๋กœ์—๋Š” ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์œผ๋ฉด์„œ๋„ ๊ด€๋ จ ๊ธฐ๋Šฅ์ด๋‚˜ ๋…ผ๋ฆฌ์— ๋”ฐ๋ผ ๋ผ์šฐํŠธ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ๊ทธ๋ฃนํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [25-27]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts -- [[Feature-Sliced Design]] - - ์—ฐ๊ฒฐ ์ด์œ : ๋Œ€๊ทœ๋ชจ React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํด๋” ๊ตฌ์กฐ๋ฅผ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•ด ๊ณ ์•ˆ๋œ ์ „๋ฌธ์ ์ธ ํ”„๋ก ํŠธ์—”๋“œ ์•„ํ‚คํ…์ฒ˜ ๋ฐฉ๋ฒ•๋ก ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [21]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํด๋” ๊ฐ„์˜ ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ๊ทœ์น™๊ณผ ๊ฐ ํด๋”(Layer, Slice, Segment)๊ฐ€ ๋‹ด๋‹นํ•ด์•ผ ํ•˜๋Š” ์—ญํ• ์˜ ์—„๊ฒฉํ•œ ๋ถ„๋ฆฌ ๋ฐฉ์‹ [22, 28]. - -- [[Separation of Concerns]] (๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ) - - ์—ฐ๊ฒฐ ์ด์œ : ํด๋” ๊ตฌ์กฐ๋ฅผ ์„ค๊ณ„ํ•˜๋Š” ๊ทผ๋ณธ์ ์ธ ๋ชฉ์ ์ด UI ๋ Œ๋”๋ง, ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ, ๋ฐ์ดํ„ฐ ํ†ต์‹ (API) ๋“ฑ์˜ ์ฑ…์ž„์„ ๊ฐ๊ธฐ ๋‹ค๋ฅธ ์œ„์น˜๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๋ฐ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [4, 29]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: `services/`, `store/`, `components/` ๋“ฑ์˜ ํด๋”๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)์„ ํ”„๋ก ํŠธ์—”๋“œ ์•„ํ‚คํ…์ฒ˜ ์ „๋ฐ˜์— ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ• [4, 30]. - -- [[Naming Conventions]] (๋ช…๋ช… ๊ทœ์น™) - - ์—ฐ๊ฒฐ ์ด์œ : ์ผ๊ด€๋œ ํด๋” ๋ฐ ํŒŒ์ผ ๋ช…๋ช… ๊ทœ์น™(์˜ˆ: ํด๋”๋ช…์€ kebab-case, ์ปดํฌ๋„ŒํŠธ๋Š” PascalCase)์€ ํด๋” ๊ตฌ์กฐ ๋‚ด์—์„œ ํŒŒ์ผ์„ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๊ฒŒ ์ฐพ๊ณ  ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๋Š” ํ•ต์‹ฌ ๊ทœ์น™์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [31-33]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋‹ค์–‘ํ•œ ์šด์˜์ฒด์ œ์™€ CI/CD ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ๋นŒ๋“œ ์—๋Ÿฌ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ  ํŒ€ ๋‚ด ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ• [34, 35]. - -### Deeper Research Questions -- ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜(Feature-based) ํด๋” ๊ตฌ์กฐ์—์„œ ๊ฐ ๊ธฐ๋Šฅ์ด ์ƒํ˜ธ์ž‘์šฉํ•ด์•ผ ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๊ต์ฐจ ๊ด€์‹ฌ์‚ฌ(Cross-cutting concerns)๋‚˜ ๊ณต์œ  ์˜์กด์„ฑ์„ ์–ด๋–ป๊ฒŒ ๊ด€๋ฆฌํ•˜๊ณ  ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? -- ๋ ˆ๊ฑฐ์‹œ ํŒŒ์ผ ์œ ํ˜• ๊ธฐ๋ฐ˜(File-type based) React ํ”„๋กœ์ ํŠธ๋ฅผ ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ํ˜น์€ Feature-Sliced Design์œผ๋กœ ์ ์ง„์ ์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ€์žฅ ์•ˆ์ „ํ•˜๊ณ  ํšจ์œจ์ ์ธ ๋‹จ๊ณ„๋Š” ๋ฌด์—‡์ธ๊ฐ€? -- Feature-Sliced Design์˜ ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ์›์น™์„ ESLint์™€ ๊ฐ™์€ ์ •์  ๋ถ„์„ ๋„๊ตฌ๋กœ ์ž๋™ ๊ฐ•์ œํ™”(Governance)ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? -- ํด๋” ๊ตฌ์กฐ๋ฅผ ๋ชจ๋“ˆํ™”ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ํŒŒ์ผ ์ค‘์ฒฉ ๋ฌธ์ œ์™€ ์ด๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•œ ์ ์ ˆํ•œ ์ธ๋ฑ์Šค(Barrel) ํŒŒ์ผ ์‚ฌ์šฉ ์ „๋žต์˜ ์žฅ๋‹จ์ ์€ ๋ฌด์—‡์ธ๊ฐ€? -- ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(Context API, Zustand, Redux ๋“ฑ)์˜ ์ข…๋ฅ˜์— ๋”ฐ๋ผ ๊ถŒ์žฅ๋˜๋Š” `store/` ํด๋” ๋‚ด๋ถ€์˜ ๊ตฌ์กฐ๋Š” ์–ด๋–ป๊ฒŒ ๋‹ฌ๋ผ์ ธ์•ผ ํ•˜๋Š”๊ฐ€? - -### Practical Application Contexts -- **Implementation:** React ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ, ๋ชจ๋“  ์š”์†Œ๋ฅผ `components/` ํด๋”์— ๋„ฃ์ง€ ์•Š๊ณ  ํŠน์ • ๋„๋ฉ”์ธ(์˜ˆ: ์ธ์ฆ)์—๋งŒ ์“ฐ์ด๋Š” ์š”์†Œ๋Š” `features/auth/components/`๋กœ ๊ฒฉ๋ฆฌํ•˜์—ฌ ์บก์Аํ™”๋ฅผ ์‹ค์ฒœํ•ฉ๋‹ˆ๋‹ค. -- **System Design:** ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐ ์„ธํŒ… ๋‹จ๊ณ„์—์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ์„ ๋ถ„์„ํ•˜์—ฌ ์–ด๋–ค ์ฝ”๋“œ๊ฐ€ ์ „์—ญ(`shared/` ๋˜๋Š” `components/`)์— ์†ํ•˜๊ณ  ์–ด๋–ค ์ฝ”๋“œ๊ฐ€ ๋กœ์ปฌ(`features/`)์— ์†ํ• ์ง€ ๊ธฐ์ค€์„ ๋งˆ๋ จํ•ฉ๋‹ˆ๋‹ค. -- **Operation / Maintenance:** ๊ธฐ๋Šฅ์— ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ, ํ•ด๋‹น ๊ธฐ๋Šฅ์˜ ํด๋”(`features/feature-name/`)๋งŒ ํ™•์ธํ•˜๋ฉด UI, ์ƒํƒœ, API ์š”์ฒญ ๋กœ์ง์ด ๋ชจ์—ฌ ์žˆ์–ด ๋””๋ฒ„๊น… ๋ฐ ์œ ์ง€๋ณด์ˆ˜ ์†๋„๊ฐ€ ํฌ๊ฒŒ ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค. -- **Learning Path:** ์ฒ˜์Œ์—๋Š” ๋‹จ์ˆœํ•œ ํ”Œ๋žซ ๊ตฌ์กฐ๋กœ React๋ฅผ ํ•™์Šตํ•œ ํ›„, ์ปดํฌ๋„ŒํŠธ๊ฐ€ 30๊ฐœ ์ด์ƒ์œผ๋กœ ๋Š˜์–ด๋‚˜๋Š” ์‹œ์ ์— ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ํด๋” ๊ตฌ์กฐ๋ฅผ ๋„์ž…ํ•˜์—ฌ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ ์—ญ๋Ÿ‰์„ ๊ธฐ๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -- **My Project Relevance:** ํ˜„์žฌ ์ง„ํ–‰ ์ค‘์ด๊ฑฐ๋‚˜ ๋ฆฌํŒฉํ† ๋งํ•ด์•ผ ํ•  React ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ, ๊ฑฐ๋Œ€ํ•ด์ง„ `components/` ํด๋”๋ฅผ ๋„๋ฉ”์ธ ๋‹จ์œ„์˜ `features/` ํด๋”๋กœ ๋‚˜๋ˆ„๊ณ  ์žฌ์‚ฌ์šฉ ๋ถˆ๊ฐ€ ๋กœ์ง๋“ค์„ ๋ถ„๋ฆฌํ•˜๋Š” ๋ฐ ์ง์ ‘์ ์œผ๋กœ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. - -### Adjacent Topics -- [[State Management]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ์ „์—ญ ์ƒํƒœ(Global State)์™€ ๋กœ์ปฌ ์ƒํƒœ(Local State)๋ฅผ ์–ด๋””์— ๋ณด๊ด€ํ•ด์•ผ ํ•˜๋Š”์ง€, Zustand์™€ ๊ฐ™์€ ๋„๊ตฌ๊ฐ€ `store/` ํด๋”์˜ ๊ตฌ์กฐ๋ฅผ ์–ด๋–ป๊ฒŒ ๋‹จ์ˆœํ™”ํ•˜๋Š”์ง€ ํ™•์žฅํ•˜์—ฌ ์กฐ์‚ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -- [[Code Splitting]] (์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…) - - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋ผ์šฐํŠธ ํ˜น์€ ํด๋”(Feature) ๋‹จ์œ„๋กœ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…๊ณผ ์ง€์—ฐ ๋กœ๋”ฉ(Lazy Loading)์„ ์ ์šฉํ•˜์—ฌ ์ดˆ๊ธฐ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ค„์ด๊ณ  ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๋Š” ์ „๋žต๊ณผ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Folder Structure.md b/00_Raw/Folder Structure.md deleted file mode 100644 index 2d165975..00000000 --- a/00_Raw/Folder Structure.md +++ /dev/null @@ -1,74 +0,0 @@ -# [[Folder Structure]] - -## ๐Ÿ“Œ Brief Summary -ํด๋” ๊ตฌ์กฐ(Folder Structure)๋Š” ์†Œํ”„ํŠธ์›จ์–ด ํ”„๋กœ์ ํŠธ ๋‚ด์—์„œ ํŒŒ์ผ๊ณผ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๋…ผ๋ฆฌ์ ์œผ๋กœ ์กฐ์งํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜์  ๊ธฐ๋ฐ˜์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค [1, 2]. ์ตœ์‹  ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์—์„œ๋Š” ๋‹จ์ˆœํ•œ ํŒŒ์ผ ์œ ํ˜• ๊ธฐ๋ฐ˜(File-Type Based) ๊ตฌ์กฐ์˜ ํ•œ๊ณ„๋ฅผ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด, ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ์ด๋‚˜ ๊ธฐ๋Šฅ(Feature)์„ ์ค‘์‹ฌ์œผ๋กœ ๋ชจ๋“ˆํ™”ํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์ง„ํ™”ํ•ด ์™”์Šต๋‹ˆ๋‹ค [3, 4]. ์ž˜ ์„ค๊ณ„๋œ ํด๋” ๊ตฌ์กฐ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์œ ์ง€๋ณด์ˆ˜์„ฑ, ํ™•์žฅ์„ฑ, ํŒ€ ํ˜‘์—… ํšจ์œจ์„ ๊ทน๋Œ€ํ™”ํ•˜๊ณ  ๊ธฐ์ˆ  ๋ถ€์ฑ„๋ฅผ ์ค„์ด๋Š” ๋ฐ ํ•ต์‹ฌ์ ์ธ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค [2, 5-9]. - -## ๐Ÿ“– Core Content - -- **๊ธฐ์กด ๊ตฌ์กฐ์˜ ํ•œ๊ณ„์™€ ์ง„ํ™”**: ๊ณผ๊ฑฐ์—๋Š” ์ปดํฌ๋„ŒํŠธ, ํ›…, ์Šคํƒ€์ผ ๋“ฑ์„ ๊ฐ๊ฐ์˜ ๊ธฐ์ˆ ์  ํŒŒ์ผ ์œ ํ˜•๋ณ„ ํด๋”์— ๋ชจ์•„๋‘๋Š” ๋ฐฉ์‹(File-Type Based Structure)์„ ์ฃผ๋กœ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค [3, 10]. ์ด ๋ฐฉ์‹์€ ์†Œ๊ทœ๋ชจ ์•ฑ์—์„œ๋Š” ์„ค์ •์ด ์ง๊ด€์ ์ด์ง€๋งŒ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ปค์งˆ์ˆ˜๋ก ํ•˜๋‚˜์˜ ๊ธฐ๋Šฅ์„ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ํด๋”๋ฅผ ํƒ์ƒ‰ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๊ฐœ๋ฐœ์ž์˜ ์ธ์ง€ ๋ถ€ํ•˜๋ฅผ ๋†’์ด๊ณ  ์ŠคํŒŒ๊ฒŒํ‹ฐ ์ฝ”๋“œ๋ฅผ ์œ ๋ฐœํ•ฉ๋‹ˆ๋‹ค [3, 10]. -- **๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ์กฐ์ง(Feature-Based Organization)**: 2025๋…„ ํ˜„์žฌ ์—…๊ณ„ ํ‘œ์ค€์€ ๋น„์ฆˆ๋‹ˆ์Šค ๊ธฐ๋Šฅ(๋„๋ฉ”์ธ)์„ ์ค‘์‹ฌ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค [4, 11]. `src/features/` ๋””๋ ‰ํ„ฐ๋ฆฌ ํ•˜์œ„์— ํŠน์ • ๊ธฐ๋Šฅ(์˜ˆ: ์ธ์ฆ, ๋Œ€์‹œ๋ณด๋“œ)๊ณผ ๊ด€๋ จ๋œ ์ปดํฌ๋„ŒํŠธ, ํ›…, API ๋กœ์ง, ํƒ€์ž…์„ ๋ชจ์•„๋‘์–ด ๋†’์€ ์‘์ง‘๋„์™€ ๋ชจ๋“ˆ ๋…๋ฆฝ์„ฑ์„ ํ™•๋ณดํ•ฉ๋‹ˆ๋‹ค [11, 12]. -- **๊ถŒ์žฅ๋˜๋Š” ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ํด๋” ๊ตฌ์กฐ**: ๋Œ€๊ทœ๋ชจ ํ™•์žฅ์ด ๊ฐ€๋Šฅํ•œ React ํ”„๋กœ์ ํŠธ๋Š” ํŒŒ์ผ ์œ ํ˜•๊ณผ ๊ธฐ๋Šฅ์„ ๊ฒฐํ•ฉํ•œ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค [13]. ๋Œ€ํ‘œ์ ์ธ `src/` ํ•˜์œ„ ๊ตฌ์„ฑ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค: - - `assets/`: ์ด๋ฏธ์ง€, ํฐํŠธ ๋“ฑ ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ์—์„œ ๊ณต์œ ๋˜๋Š” ์ •์  ๋ฏธ๋””์–ด ๋ฆฌ์†Œ์Šค [13, 14]. - - `components/`: ๋ฒ„ํŠผ, ๋ชจ๋‹ฌ ๋“ฑ ๋„๋ฉ”์ธ์— ์ข…์†๋˜์ง€ ์•Š๊ณ  ์žฌ์‚ฌ์šฉ๋˜๋Š” ๊ณตํ†ต UI ์ปดํฌ๋„ŒํŠธ [11, 14, 15]. - - `features/`: ๋„๋ฉ”์ธ๋ณ„ ํŠน์ • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๋ฐ UI๊ฐ€ ์บก์Аํ™”๋œ ๋ชจ๋“ˆ [11, 12, 15]. - - `pages/` (๋˜๋Š” `routes/`): ๋ผ์šฐํŒ…์— ๋งคํ•‘๋˜๋Š” ํŽ˜์ด์ง€ ๋ ˆ๋ฒจ ์ปดํฌ๋„ŒํŠธ [16, 17]. - - `hooks/`, `services/`, `utils/`: ๊ณตํ†ต ์ปค์Šคํ…€ ํ›…, ์™ธ๋ถ€ API ํ†ต์‹  ๋ฐ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง, ํ—ฌํผ ํ•จ์ˆ˜ [12, 17-20]. - - `store/` (๋˜๋Š” `context/`): ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ ๋กœ์ง [16-18]. -- **Feature-Sliced Design (FSD)**: ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ๋ฅผ ๋” ์—„๊ฒฉํ•œ ์•„ํ‚คํ…์ฒ˜ ๋ฐฉ๋ฒ•๋ก ์œผ๋กœ ๋ฐœ์ „์‹œํ‚จ ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค [21, 22]. ์ฝ”๋“œ๋ฅผ `app`, `pages`, `widgets`, `features`, `entities`, `shared`๋ผ๋Š” ๋ช…ํ™•ํ•œ ๊ณ„์ธต(Layer)์œผ๋กœ ๋‚˜๋ˆ•๋‹ˆ๋‹ค [23, 24]. ์ƒ์œ„ ๊ณ„์ธต์ด ํ•˜์œ„ ๊ณ„์ธต์—๋งŒ ์˜์กดํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ๊ทœ์น™์„ ๊ฐ•์ œํ•˜์—ฌ ์ˆœํ™˜ ์ฐธ์กฐ์™€ ์•„ํ‚คํ…์ฒ˜์˜ ๋ถ•๊ดด๋ฅผ ๋ง‰์Šต๋‹ˆ๋‹ค [22, 23]. -- **๋„ค์ด๋ฐ ์ปจ๋ฒค์…˜๊ณผ ๊ฑฐ๋ฒ„๋„Œ์Šค**: ํด๋” ๊ตฌ์กฐ๋Š” ์—„๊ฒฉํ•œ ๋ช…๋ช… ๊ทœ์น™๊ณผ ๊ฒฐํ•ฉ๋  ๋•Œ ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค. ์šด์˜์ฒด์ œ ๊ฐ„(Windows/Mac vs Linux) ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„ ๋ฌธ์ œ๋กœ ์ธํ•œ CI/CD ๋นŒ๋“œ ์‹คํŒจ๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด ํŒŒ์ผ๊ณผ ํด๋”๋ช…์€ ์ฃผ๋กœ `kebab-case`๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, React ์ปดํฌ๋„ŒํŠธ ๋ช…์นญ์€ `PascalCase`๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ‘œ์ค€์ž…๋‹ˆ๋‹ค [25-30]. Next.js์—์„œ๋Š” `(folderName)` ํ˜•ํƒœ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ URL ๊ฒฝ๋กœ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ณ  ๋…ผ๋ฆฌ์ ์œผ๋กœ ๋ผ์šฐํŠธ๋ฅผ ๊ทธ๋ฃนํ™”ํ•˜๋Š” ํŒจํ„ด๋„ ํ™œ์šฉ๋ฉ๋‹ˆ๋‹ค [31, 32]. - -## โš–๏ธ Trade-offs & Caveats -๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜(Feature-based) ๊ตฌ์กฐ๋‚˜ Feature-Sliced Design(FSD)๊ณผ ๊ฐ™์€ ๊ณ ๋„ํ™”๋œ ํด๋” ๊ตฌ์กฐ๋Š” ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ๋‚˜ ์ดˆ๋ณด์ž์—๊ฒŒ๋Š” ๊ณผ๋„ํ•œ ์˜ค๋ฒ„ํ—ค๋“œ(Overkill)๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [33]. ๋‹จ์ˆœํ•œ ์•ฑ์— ์ ์šฉํ•  ๊ฒฝ์šฐ ๋ถˆํ•„์š”ํ•œ ํ•˜์œ„ ํด๋”์™€ ์ค‘๋ณต๋œ ๊ตฌ์กฐ๋ฅผ ๋ฌด์ˆ˜ํžˆ ์ƒ์„ฑํ•˜๊ฒŒ ๋˜์–ด ์˜คํžˆ๋ ค ๊ฐœ๋ฐœ ์†๋„๋ฅผ ์ €ํ•˜์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [33]. - -ํŠนํžˆ FSD ๊ตฌ์กฐ๋ฅผ ๋„์ž…ํ•  ๊ฒฝ์šฐ, ํŠน์ • ๋ชจ๋“ˆ์ด ์–ด๋А ๊ณ„์ธต์— ์†ํ•ด์•ผ ํ•˜๋Š”์ง€("์ด ๋ชจ๋“ˆ์ด feature์ธ๊ฐ€ widget์ธ๊ฐ€?")๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐ ์žˆ์–ด ์˜๋ฏธ๋ก ์  ๋…ผ์Ÿ๊ณผ ์ธ์ง€์  ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [34]. ๋˜ํ•œ, ํŒ€ ์ „์ฒด๊ฐ€ ์ด ๋ฐฉ๋ฒ•๋ก ๊ณผ ๊ณ„์ธต ๊ทœ์น™์„ ๋ช…ํ™•ํžˆ ์ดํ•ดํ•˜๊ณ  ๋ฌธ์„œํ™”ํ•˜์ง€ ์•Š์œผ๋ฉด, ๊ฐœ๋ฐœ์ž๋“ค์ด ๊ทœ์น™์„ ๋ฌด์‹œํ•˜๊ณ  ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ์ตœํ•˜๋‹จ์ธ `shared` ํด๋”์— ์Ÿ์•„๋ถ€์–ด ์˜คํžˆ๋ ค ๋ฒ„๊ทธ๋ฅผ ์–‘์‚ฐํ•˜๊ณ  ์ฝ”๋“œ ๋ณ€๊ฒฝ ์‹œ์˜ ์˜ํ–ฅ ๋ฒ”์œ„(Blast radius)๋ฅผ ํ†ต์ œ ๋ถˆ๋Šฅ์œผ๋กœ ๋งŒ๋“ค ์œ„ํ—˜์ด ํฝ๋‹ˆ๋‹ค [34, 35]. - -์ถ”๊ฐ€๋กœ, ๋ชจ๋“ˆ ๋‚ด๋ถ€๋ฅผ ์บก์Аํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์ง„์ž…์ ์„ ํ•˜๋‚˜๋กœ ํ†ต์ผํ•˜๋Š” ๋ฐฐ๋Ÿด ํŒŒ์ผ(Barrel files, ์˜ˆ: `index.ts`๋ฅผ ํ†ตํ•œ Public API ๋…ธ์ถœ) ํŒจํ„ด์€ ๋‚ด๋ถ€ ๋ฆฌํŒฉํ† ๋ง์„ ์•ˆ์ „ํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ์ง€๋งŒ, ๋ฒˆ๋“ค๋ง(Bundling)์ด๋‚˜ ํŠธ๋ฆฌ ์‰์ดํ‚น(Tree-shaking) ๊ณผ์ •์—์„œ ์›์น˜ ์•Š๋Š” ๋ชจ๋“ˆ๊นŒ์ง€ ๋ถˆ๋Ÿฌ์™€ ์„ฑ๋Šฅ์ƒ ๋ถˆ์ด์ต์„ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋‹จ์ ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค [34, 36, 37]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -#### [์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] -- [[Feature-Sliced Design]] - - ์—ฐ๊ฒฐ ์ด์œ : Folder Structure๋ฅผ ๋‹จ์ˆœํ•œ ๋””๋ ‰ํ„ฐ๋ฆฌ ๋ถ„๋ฆฌ๊ฐ€ ์•„๋‹Œ, ๊ณ„์ธต(Layer)๊ณผ ์Šฌ๋ผ์ด์Šค(Slice) ๊ธฐ๋ฐ˜์˜ ์—„๊ฒฉํ•œ ์•„ํ‚คํ…์ฒ˜ ๋ฐฉ๋ฒ•๋ก ์œผ๋กœ ์Šน๊ฒฉ์‹œํ‚จ ๊ฐœ๋…์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [21-24]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ์›์น™๊ณผ ๋ชจ๋“ˆ ์บก์Аํ™”๋ฅผ ํ†ตํ•ด ๋Œ€๊ทœ๋ชจ React ์•ฑ์ด ์–ด๋–ป๊ฒŒ ์ŠคํŒŒ๊ฒŒํ‹ฐ ์ฝ”๋“œ๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [23, 37]. -- [[Separation of Concerns]] - - ์—ฐ๊ฒฐ ์ด์œ : Folder Structure๋ฅผ UI ๋ Œ๋”๋ง, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง, ์ƒํƒœ ๊ด€๋ฆฌ ๋“ฑ์œผ๋กœ ๋‚˜๋ˆ„๋Š” ํ•ต์‹ฌ ์†Œํ”„ํŠธ์›จ์–ด ๊ณตํ•™ ์›๋ฆฌ์ž…๋‹ˆ๋‹ค [8, 30]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์™œ `components/`์™€ `services/`, `store/` ํด๋”๋ฅผ ๋ถ„๋ฆฌํ•ด์•ผ ํ•˜๋Š”์ง€ ๊ทธ ๊ทผ๋ณธ์ ์ธ ์ด์œ ๋ฅผ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [30]. -- [[Domain-Driven Design]] - - ์—ฐ๊ฒฐ ์ด์œ : ํ”„๋ก ํŠธ์—”๋“œ ์ฝ”๋“œ์˜ ํด๋”๋ฅผ ๊ธฐ์ˆ ์  ์œ ํ˜•์ด ์•„๋‹Œ ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ(๊ธฐ๋Šฅ) ์ค‘์‹ฌ์œผ๋กœ ๋‚˜๋ˆ„๋Š” ๋ฐ ๋…ผ๋ฆฌ์  ๊ธฐ๋ฐ˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [12, 38]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: `features/` ํด๋” ๋‚ด์— ์ฝ”๋“œ๋ฅผ ์‘์ง‘์‹œํ‚ค๋Š” ๊ฒƒ์ด ๋น„์ฆˆ๋‹ˆ์Šค ์š”๊ตฌ์‚ฌํ•ญ ๋ณ€ํ™”์— ์–ด๋–ป๊ฒŒ ์œ ์—ฐํ•˜๊ฒŒ ๋Œ€์ฒ˜ํ•˜๊ฒŒ ํ•˜๋Š”์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [38]. - -#### [๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ] -- [[Naming Conventions]] - - ์—ฐ๊ฒฐ ์ด์œ : ์ผ๊ด€๋œ ๋ช…๋ช… ๊ทœ์น™์€ ํด๋” ๊ตฌ์กฐ์˜ ๊ฐ€๋…์„ฑ๊ณผ ์˜ˆ์ธก ๊ฐ€๋Šฅ์„ฑ์„ ์™„์„ฑํ•˜๋Š” ํ•„์ˆ˜ ์š”์†Œ์ž…๋‹ˆ๋‹ค [25, 26, 30, 39]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์™œ ํด๋”๋ช…์€ `kebab-case`๋ฅผ ์“ฐ๊ณ  ์ปดํฌ๋„ŒํŠธ๋Š” `PascalCase`๋ฅผ ์จ์•ผ CI/CD ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜์ง€ ์•Š๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [25, 40]. -- [[State Management]] - - ์—ฐ๊ฒฐ ์ด์œ : ํด๋” ๊ตฌ์กฐ์—์„œ ์ „์—ญ ์ƒํƒœ(`store/`, `context/`)์™€ ์ง€์—ญ/๊ธฐ๋Šฅ ์ƒํƒœ(`features/`)๋ฅผ ์–ด๋””์— ์œ„์น˜์‹œํ‚ฌ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ํ•ต์‹ฌ ์š”์†Œ์ž…๋‹ˆ๋‹ค [16, 18, 19, 41, 42]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Zustand, Context API ๋“ฑ ๊ด€๋ฆฌ ๋„๊ตฌ์— ๋”ฐ๋ผ ์ „์—ญ ์ธํ”„๋ผ ์ƒํƒœ์™€ ๋„๋ฉ”์ธ ์ƒํƒœ๋ฅผ ๋ถ„๋ฆฌ ๋ฐฐ์น˜ํ•˜๋Š” ์ „๋žต์„ ํ•™์Šตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [43]. - -### Deeper Research Questions - -- Feature-Sliced Design(FSD)์—์„œ ํ•˜์œ„ ๊ณ„์ธต์ด ์ƒ์œ„ ๊ณ„์ธต์„ ์ฐธ์กฐํ•˜์ง€ ๋ชปํ•˜๋„๋ก ESLint ๊ทœ์น™์„ ํ†ตํ•ด ์–ด๋–ป๊ฒŒ ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ์„ ๊ฐ•์ œํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? -- ๋ฐฐ๋Ÿด ํŒŒ์ผ(`index.ts`)์„ ์ด์šฉํ•œ Public API ํŒจํ„ด์ด Webpack์ด๋‚˜ Vite์˜ ํŠธ๋ฆฌ ์‰์ดํ‚น(Tree-shaking) ์ตœ์ ํ™”์— ๋ฏธ์น˜๋Š” ์ •ํ™•ํ•œ ๋ถ€์ž‘์šฉ๊ณผ ๊ทธ ํ•ด๊ฒฐ์ฑ…์€ ๋ฌด์—‡์ธ๊ฐ€? -- '์ธ์ฆ(Auth)'๊ณผ ๊ฐ™์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „๋ฐ˜์— ๊ฑธ์ณ ์‚ฌ์šฉ๋˜๋Š” ๊ต์ฐจ ์ ˆ๋‹จ ๊ด€์‹ฌ์‚ฌ(Cross-cutting concerns)๋Š” ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜(Feature-based) ํด๋” ๊ตฌ์กฐ์—์„œ ์–ด๋–ป๊ฒŒ ๋ถ„๋ฆฌํ•˜๊ณ  ๋ฐฐ์น˜ํ•ด์•ผ ์ฝ”๋“œ ์‘์ง‘๋„๋ฅผ ์žƒ์ง€ ์•Š๋Š”๊ฐ€? -- ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ(Flat structure)์—์„œ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ(Feature-Sliced Design)๋กœ ํด๋” ๊ตฌ์กฐ๋ฅผ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•ด์•ผ ํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ์ž„๊ณ„์ (์ปดํฌ๋„ŒํŠธ ์ˆ˜, ํŒ€ ๊ทœ๋ชจ ๋“ฑ)์ด๋‚˜ ์ฝ”๋“œ ์Šค๋ฉœ ์ง€ํ‘œ๋Š” ๋ฌด์—‡์ธ๊ฐ€? -- Next.js์˜ App Router์—์„œ ์ œ๊ณตํ•˜๋Š” Route Grouping `(folder)` ๋ฌธ๋ฒ•๊ณผ ๊ธฐ์กด์˜ ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ํด๋” ๋ถ„๋ฆฌ(`features/`) ํŒจํ„ด์„ ์–ด๋–ป๊ฒŒ ์ถฉ๋Œ ์—†์ด ์กฐํ™”๋กญ๊ฒŒ ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? - -### Practical Application Contexts - -- **Implementation:** ์šด์˜์ฒด์ œ(Windows vs Linux)์— ๋”ฐ๋ฅธ ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„ ์ด์Šˆ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ํด๋”์™€ ํŒŒ์ผ๋ช… ์ƒ์„ฑ ์‹œ ์ผ๊ด€๋œ `kebab-case`๋ฅผ ์ ์šฉํ•˜๋Š” ๊ทœ์น™์„ ํ”„๋กœ์ ํŠธ ๋ฆฐํŒ… ๋ฃฐ์— ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค [25-27]. -- **System Design:** ํ”„๋กœ์ ํŠธ ์„ค๊ณ„ ์ดˆ๊ธฐ ๋‹จ๊ณ„์—์„œ `features/` ํด๋”๋ฅผ ์ •์˜ํ•˜์—ฌ UI ์š”์†Œ์™€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์˜ ๊ฒฝ๊ณ„๋ฅผ ๋ช…ํ™•ํžˆ ํ•˜๊ณ , ๊ณตํ†ต ์ปดํฌ๋„ŒํŠธ๋Š” ์˜ค์ง Presentation ์—ญํ• ๋งŒ ์ˆ˜ํ–‰ํ•˜๋„๋ก ์‹œ์Šคํ…œ์„ ๊ตฌ์กฐํ™”ํ•ฉ๋‹ˆ๋‹ค [11, 44]. -- **Operation / Maintenance:** ์ƒˆ๋กœ์šด ๊ฐœ๋ฐœ์ž๊ฐ€ ํŒ€์— ํ•ฉ๋ฅ˜ํ–ˆ์„ ๋•Œ, ๊ธฐ๋Šฅ๋ณ„๋กœ ๊ณ ๋ฆฝ๋œ ํด๋” ๊ตฌ์กฐ๋ฅผ ํ†ตํ•ด ์ „์ฒด ์ฝ”๋“œ๋ฅผ ํŒŒ์•…ํ•˜์ง€ ์•Š๊ณ ๋„ ์ž์‹ ์ด ๋งก์€ ๋„๋ฉ”์ธ(`features/auth` ๋“ฑ)๋งŒ ๋ถ„์„ํ•˜์—ฌ ์ฆ‰์‹œ ์œ ์ง€๋ณด์ˆ˜ ์—…๋ฌด์— ํˆฌ์ž…๋  ์ˆ˜ ์žˆ๋„๋ก ๋•์Šต๋‹ˆ๋‹ค [6]. -- **Learning Path:** ์ฒ˜์Œ React๋ฅผ ํ•™์Šตํ•  ๋•Œ๋Š” Flat ๊ตฌ์กฐ๋กœ ์‹œ์ž‘ํ•˜์—ฌ ๊ธฐ๋ณธ๊ธฐ๋ฅผ ์ตํžˆ๊ณ , ํ”„๋กœ์ ํŠธ๊ฐ€ ์ปค์ง์— ๋”ฐ๋ผ File-Type Based ๊ตฌ์กฐ๋ฅผ ๊ฑฐ์ณ ์ตœ์ข…์ ์œผ๋กœ Feature-Based ๋˜๋Š” FSD ์•„ํ‚คํ…์ฒ˜๋กœ ์ง„ํ™”ํ•˜๋Š” ์ˆœ์ฐจ์  ํ•™์Šต์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค [4, 9, 10, 33]. -- **My Project Relevance:** ํ˜„์žฌ ์ง„ํ–‰ ์ค‘์ธ ๋˜๋Š” ๊ณ„ํš๋œ React ํ”„๋กœ์ ํŠธ์˜ ๊ทœ๋ชจ์™€ ํŒ€์›์˜ ์ˆ™๋ จ๋„๋ฅผ ํ‰๊ฐ€ํ•˜์—ฌ, ์ง€๋‚˜์น˜๊ฒŒ ๋ณต์žกํ•œ FSD๋ฅผ ๋ฐ”๋กœ ๋„์ž…ํ•˜๊ธฐ๋ณด๋‹ค๋Š” `features/`์™€ `components/`๋ฅผ ๊ฒฐํ•ฉํ•œ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๋ฐฉ์‹์„ ์ ์šฉํ•ด ์ ์ง„์ ์ธ ๋ชจ๋“ˆํ™”๋ฅผ ์‹œ๋„ํ•˜๋Š” ์ง€ํ‘œ๋กœ ์‚ผ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - -### Adjacent Topics - -- [[Code Splitting]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ํด๋” ๊ตฌ์กฐ๋ฅผ ๋ผ์šฐํŠธ๋‚˜ ๊ธฐ๋Šฅ ๋‹จ์œ„๋กœ ๋ช…ํ™•ํžˆ ๋‚˜๋ˆ„๋ฉด, Vite๋‚˜ Webpack์„ ์ด์šฉํ•ด ํ•ด๋‹น ๋ชจ๋“ˆ๋“ค์„ ๋…๋ฆฝ์ ์ธ ์ฒญํฌ(Chunk)๋กœ ๋‚˜๋ˆ„์–ด ์ง€์—ฐ ๋กœ๋”ฉ(Lazy Loading)ํ•˜๋Š” ์ตœ์ ํ™” ์ „๋žต์œผ๋กœ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [45, 46]. -- [[Micro-Frontends]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋ชจ๋†€๋ฆฌ์‹ ๋‹จ์ผ ํด๋” ๊ตฌ์กฐ๊ฐ€ ๊ฐ๋‹นํ•  ์ˆ˜ ์—†์„ ๋งŒํผ ๊ฑฐ๋Œ€ํ•ด์ง„ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ํ™˜๊ฒฝ์—์„œ, ์•„์˜ˆ ๋…๋ฆฝ์ ์œผ๋กœ ๋ฐฐํฌ ๋ฐ ์šด์˜ ๊ฐ€๋Šฅํ•œ ํ”„๋ก ํŠธ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ๋ถ„ํ• ํ•˜๋Š” ๊ทน๋‹จ์  ์•„ํ‚คํ…์ฒ˜ ๋ฐฉ๋ฒ•๋ก ์œผ๋กœ ํ™•์žฅ๋ฉ๋‹ˆ๋‹ค [21]. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Frontend Application Stability.md b/00_Raw/Frontend Application Stability.md deleted file mode 100644 index 038d3a71..00000000 --- a/00_Raw/Frontend Application Stability.md +++ /dev/null @@ -1,68 +0,0 @@ -# [[Frontend Application Stability]] - -## ๐Ÿ“Œ Brief ๋‹จ๊ธฐ ์š”์•ฝ -Frontend Application Stability(ํ”„๋ก ํŠธ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์•ˆ์ •์„ฑ)๋Š” ํ˜„๋Œ€์˜ ๋ณต์žกํ•œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜, ์„ฑ๋Šฅ ์ €ํ•˜ ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ์šฐ์•„ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋ฉฐ ์‹ ๋ขฐ์„ฑ ์žˆ๊ฒŒ ์ž‘๋™ํ•˜๋Š” ์ƒํƒœ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค [1-3]. ์ด๋ฅผ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹จ์ผ ์ปดํฌ๋„ŒํŠธ์˜ ์˜ค๋ฅ˜๊ฐ€ ์ „์ฒด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํฌ๋ž˜์‹œ(์˜ˆ: ํฐ ํ™”๋ฉด)๋กœ ์ด์–ด์ง€๋Š” ๊ฒƒ์„ ๋ง‰๋Š” ๋ฐฉ์–ด ๊ธฐ์ œ์™€ ํšจ์œจ์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ, ๊ทธ๋ฆฌ๊ณ  ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„๊ฐ€ ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค [2, 4, 5]. ๊ฒฐ๊ณผ์ ์œผ๋กœ ์•ˆ์ •์ ์ธ ์‹œ์Šคํ…œ์€ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๊ฒฐํ•จ์ด ๋ฐœ์ƒํ•˜๋”๋ผ๋„ ์•ฑ์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์„ ์ƒํ˜ธ์ž‘์šฉ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜๋ฉฐ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๋ณดํ˜ธํ•ฉ๋‹ˆ๋‹ค [6, 7]. - -## ๐Ÿ“– Core Content -* **์—๋Ÿฌ ๊ฒฝ๊ณ„(Error Boundaries)๋ฅผ ํ†ตํ•œ ์žฅ์•  ๊ฒฉ๋ฆฌ:** React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋ Œ๋”๋ง ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ ์ „์ฒด ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ๋ฅผ ๋งˆ์šดํŠธ ํ•ด์ œํ•˜์—ฌ ๋นˆ ํ™”๋ฉด์„ ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค [8, 9]. ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด Error Boundary(ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ ํ˜•ํƒœ)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•˜์œ„ ํŠธ๋ฆฌ์—์„œ ๋ฐœ์ƒํ•˜๋Š” JavaScript ์—๋Ÿฌ(๋ Œ๋”๋ง, ์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ, ์ƒ์„ฑ์ž ๋‚ด๋ถ€)๋ฅผ ํฌ์ฐฉํ•˜๊ณ  ๋Œ€์ฒด UI(Fallback UI)๋ฅผ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค [2, 9]. ๋Œ€์‹œ๋ณด๋“œ, ์„œ๋“œํŒŒํ‹ฐ ์œ„์ ฏ, ๋ณต์žกํ•œ ํผ ๋“ฑ ๋ถˆ์•ˆ์ •ํ•œ UI ์„น์…˜์„ ๊ฐœ๋ณ„ Error Boundary๋กœ ๊ฐ์‹ธ๋ฉด ํ•œ ์ปดํฌ๋„ŒํŠธ์— ๋ฒ„๊ทธ๊ฐ€ ์žˆ์–ด๋„ ์•ฑ์˜ ๋‚˜๋จธ์ง€ ๊ธฐ๋Šฅ์€ ์ •์ƒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค [4, 6, 8]. -* **๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๊ด€๋ฆฌ์™€ ์„ฑ๋Šฅ ์•ˆ์ •์„ฑ:** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์žฅ์‹œ๊ฐ„ ์‹คํ–‰๋  ๋•Œ ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•ด์ œ๋˜์ง€ ์•Š๊ณ  ๋ˆ„์ ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜(Memory Leak)๋Š” ๋ชจ๋ฐ”์ผ ๊ธฐ๊ธฐ์—์„œ์˜ ์•ฑ ์ •์ง€๋‚˜ ์„ฑ๋Šฅ ์ €ํ•˜์˜ ์ฃผ์›์ธ์ž…๋‹ˆ๋‹ค [3, 10, 11]. ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งˆ์šดํŠธ ํ•ด์ œ๋  ๋•Œ ์ œ๊ฑฐ๋˜์ง€ ์•Š์€ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋‚˜ DOM ํŠธ๋ฆฌ์—์„œ ๋ถ„๋ฆฌ๋˜์—ˆ์œผ๋‚˜ JavaScript ์ฐธ์กฐ๊ฐ€ ๋‚จ์•„์žˆ๋Š” 'Detached DOM nodes', ํด๋กœ์ €(Closure)์— ์˜ํ•ด ์œ ์ง€๋˜๋Š” ๋ถˆํ•„์š”ํ•œ ์ฐธ์กฐ ๋“ฑ์ด ๋Œ€ํ‘œ์ ์ธ ์›์ธ์ž…๋‹ˆ๋‹ค [12-14]. ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด `useEffect` ๋‚ด์—์„œ ์ •๋ฆฌ(Cleanup) ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ•˜๋ฉฐ [15], ๊ฐ์ฒด ์บ์‹ฑ ์‹œ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์ด ๊ฐ€๋Šฅํ•œ `WeakMap`์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [16]. -* **์˜์กด์„ฑ ์ œ์–ด์™€ ์•„ํ‚คํ…์ฒ˜ ๋ชจ๋“ˆํ™”:** ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ UI ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฌด๋ถ„๋ณ„ํ•˜๊ฒŒ ์„ž์ด๊ณ  ์•”๋ฌต์ ์ธ ์˜์กด์„ฑ์ด ์ƒ๊ธฐ๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ์กฐ๊ฐ€ ๋ถ•๊ดด๋ฉ๋‹ˆ๋‹ค [17, 18]. FSD(Feature-Sliced Design) ๊ฐ™์€ ์•„ํ‚คํ…์ฒ˜๋Š” ์ฝ”๋“œ๋ฅผ ๊ธฐ๋Šฅ(Scope) ๋‹จ์œ„๋กœ ๊ตฌ์„ฑํ•˜๊ณ  ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ(์ƒ์œ„ ๋ ˆ์ด์–ด๋Š” ํ•˜์œ„ ๋ ˆ์ด์–ด์— ์˜์กดํ•  ์ˆ˜ ์žˆ์œผ๋‚˜ ์—ญ์€ ๋ถˆ๊ฐ€)์„ ๊ฐ•์ œํ•ฉ๋‹ˆ๋‹ค [19]. ์ด๋Ÿฌํ•œ ๊ทœ์น™์€ ์ˆœํ™˜ ์ฐธ์กฐ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ์ฝ”๋“œ ๋ณ€๊ฒฝ ์‹œ ๋‹ค๋ฅธ ๋ชจ๋“ˆ์— ๋ฏธ์น˜๋Š” ๋ถ€์ž‘์šฉ(Side effect)์„ ์ฐจ๋‹จํ•˜์—ฌ ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ์•ˆ์ •์„ฑ์„ ๋†’์ž…๋‹ˆ๋‹ค [19, 20]. -* **๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ๊ฐ€์‹œ์„ฑ ํ™•๋ณด:** ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ์˜ ์•ˆ์ •์„ฑ์„ ์œ ์ง€ํ•˜๋ ค๋ฉด ์‚ฌ์šฉ์ž ํ™˜๊ฒฝ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ๋ฅผ ํฌ์ฐฉํ•˜๋Š” ๋กœ๊น… ๋„๊ตฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค [21, 22]. Sentry, LogRocket, Datadog ๊ฐ™์€ ํด๋ผ์šฐ๋“œ ๋„๊ตฌ๋“ค์€ ๋‹จ์ˆœํ•œ ์Šคํƒ ํŠธ๋ ˆ์ด์Šค๋ฅผ ๋„˜์–ด, ๋„คํŠธ์›Œํฌ ์š”์ฒญ, ์‚ฌ์šฉ์ž ์ƒํ˜ธ์ž‘์šฉ, Redux/Zustand ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ํฌํ•จํ•œ '์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด(Session Replay)'๋ฅผ ์ œ๊ณตํ•˜์—ฌ ๋ณต์žกํ•œ ๋ฒ„๊ทธ์˜ ๊ทผ๋ณธ ์›์ธ์„ ์ถ”์ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค [22-26]. -* **์›Œํฌํ”Œ๋กœ์šฐ ๋ฐ ๋ฐฐํฌ ์•ˆ์ •์„ฑ:** Git ํ”Œ๋กœ์šฐ ํ™˜๊ฒฝ์—์„œ main ๋ธŒ๋žœ์น˜์˜ ๋ฐฐํฌ ์•ˆ์ •์„ฑ์„ ์œ ์ง€ํ•˜๋ ค๋ฉด ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜(Feature branch) ๋‹จ์œ„๋กœ ์ž‘์—…์„ ๋ถ„๋ฆฌํ•˜๊ณ  Pull Request ๋‹จ๊ณ„์—์„œ ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ๊ฑฐ์ณ์•ผ ํ•ฉ๋‹ˆ๋‹ค [27-29]. ํŠนํžˆ Storybook๊ณผ Happo ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์—ฐ๋™ํ•˜๋ฉด, ์‹œ๊ฐ์  ํšŒ๊ท€(Visual Regression)์™€ ์ ‘๊ทผ์„ฑ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด ์˜๋„์น˜ ์•Š์€ UI ๋ณ€๊ฒฝ์ด๋‚˜ ๊ฒฐํ•จ์ด ํ”„๋กœ๋•์…˜์— ๋ฐฐํฌ๋˜๋Š” ๊ฒƒ์„ ์‚ฌ์ „์— ์ฐจ๋‹จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [30-32]. - -## โš–๏ธ Trade-offs & Caveats -* **Error Boundaries์˜ ํฌ์ฐฉ ํ•œ๊ณ„:** Error Boundaries๋Š” ์„ ์–ธ์ ์ธ ๋ Œ๋”๋ง ๋‚ด์˜ ์—๋Ÿฌ๋Š” ํฌ์ฐฉํ•˜์ง€๋งŒ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ๋‚ด๋ถ€, ๋น„๋™๊ธฐ ์ฝ”๋“œ(`setTimeout` ๋“ฑ), ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง, ํ˜น์€ Error Boundary ์ปดํฌ๋„ŒํŠธ ์ž์ฒด์—์„œ ๋ฐœ์ƒํ•œ ์—๋Ÿฌ๋Š” ์žก์•„๋‚ด์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค [33-35]. ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ ๊ธฐ์กด์˜ ๋ช…๋ นํ˜• `try/catch` ๋ธ”๋ก์„ ์ˆ˜๋™์œผ๋กœ ์‚ฌ์šฉํ•ด ๋Œ€์‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [34, 36]. -* **๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ์˜ ์„ฑ๋Šฅ ๋ถ€ํ•˜ ๋ฐ ๋น„์šฉ:** ์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด์™€ ์ƒ์„ธํ•œ ํ”„๋ก ํŠธ์—”๋“œ ๋กœ๊น…์„ ์ œ๊ณตํ•˜๋Š” ๋„๊ตฌ(์˜ˆ: LogRocket, Datadog)๋Š” ์ƒ์„ธํ•œ ๋””๋ฒ„๊น… ์ปจํ…์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•˜๋Š” ์ด์ ์ด ์žˆ์œผ๋‚˜, ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค๊ณ  ํŽ˜์ด์ง€ ๋กœ๋“œ ์‹œ๊ฐ„์„ ์ตœ๋Œ€ 120ms๊นŒ์ง€ ์ง€์—ฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ์„ฑ๋Šฅ ์ƒ์˜ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค [37-39]. ๋˜ํ•œ, ํŠธ๋ž˜ํ”ฝ์ด ๋†’์€ ์„œ๋น„์Šค์—์„œ๋Š” ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘(Ingest) ๋ฐ ์ธ๋ฑ์‹ฑ(Index)์— ๋ง‰๋Œ€ํ•œ ๋น„์šฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๋กœ๊ทธ ๋ณผ๋ฅจ์„ ์กฐ์ ˆํ•˜๋Š” ๋“ฑ์˜ ํƒ€ํ˜‘์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค [40-42]. -* **์•„ํ‚คํ…์ฒ˜ ์—„๊ฒฉ์„ฑ์— ๋”ฐ๋ฅธ ํ•™์Šต ๊ณก์„ :** FSD๋‚˜ ์—„๊ฒฉํ•œ ํด๋” ๋ถ„๋ฆฌ ์ •์ฑ…์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์žฅ๊ธฐ์  ์•ˆ์ •์„ฑ์„ ๋•์ง€๋งŒ, ์ดˆ๊ธฐ ์ง„์ž… ์žฅ๋ฒฝ์ด ๋†’์Šต๋‹ˆ๋‹ค [43, 44]. ๊ฐœ๋ฐœ์ž๊ฐ€ ์ปดํฌ๋„ŒํŠธ ์ค‘์‹ฌ ์‚ฌ๊ณ ์—์„œ '๊ธฐ๋Šฅ(Feature)' ์ค‘์‹ฌ ์‚ฌ๊ณ ๋กœ ์ „ํ™˜ํ•ด์•ผ ํ•˜๋ฉฐ, ์ž‘์€ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๋ถˆํ•„์š”ํ•œ ์ถ”์ƒํ™”๋‚˜ ์˜ค๋ฒ„์—”์ง€๋‹ˆ์–ด๋ง์œผ๋กœ ๋А๊ปด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [43, 45, 46]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -#### [๊ด€๊ณ„ ์œ ํ˜• A (์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ )] -- [[Feature-Sliced Design]] - - ์—ฐ๊ฒฐ ์ด์œ : ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ฝ”๋“œ์˜ ๋ชจ๋“ˆ์„ฑ๊ณผ ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ์„ ๊ฐ•์ œํ•˜์—ฌ ๊ตฌ์กฐ์  ๋ถ•๊ดด๋กœ ์ธํ•œ ๋ถˆ์•ˆ์ •์„ฑ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค [19, 47, 48]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง, ๊ณต์œ  UI, ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋ช…ํ™•ํ•œ ๊ณ„์ธต(Layers)์œผ๋กœ ๋‚˜๋ˆ„๊ณ  ์™ธ๋ถ€ ์ธํ„ฐํŽ˜์ด์Šค(Public API)๋งŒ์„ ๋…ธ์ถœ์‹œ์ผœ ์˜์กด์„ฑ์„ ๊ด€๋ฆฌํ•˜๋Š” ์›๋ฆฌ [19, 20, 49]. - -- [[React Error Boundaries]] - - ์—ฐ๊ฒฐ ์ด์œ : ๋Ÿฐํƒ€์ž„ ๋ Œ๋”๋ง ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์•ฑ ์ „์ฒด๊ฐ€ ์ •์ง€ํ•˜๋Š” ๊ฒƒ์„ ๋ง‰๊ณ , ์‚ฌ์šฉ์ž์—๊ฒŒ ์œ ์—ฐํ•œ ๋Œ€์ฒ˜ ๋ฐฉ์•ˆ์„ ์ œ๊ณตํ•˜๋Š” ํ•ต์‹ฌ ๋ฐฉ์–ด ์ˆ˜๋‹จ์ž…๋‹ˆ๋‹ค [2, 7, 9]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: React ์ปดํฌ๋„ŒํŠธ ์ƒ๋ช…์ฃผ๊ธฐ ๋‚ด์—์„œ ์—๋Ÿฌ๋ฅผ ์ „ํŒŒํ•˜๊ณ  ๋Œ€์ฒด ํ™”๋ฉด(Fallback UI)์œผ๋กœ ๋ณต๊ตฌํ•˜๋Š” ์„ ์–ธ์  ์—๋Ÿฌ ์ฒ˜๋ฆฌ ๋ฐฉ์‹ [33, 34, 50]. - -- [[Memory Leaks]] - - ์—ฐ๊ฒฐ ์ด์œ : ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์žฅ์‹œ๊ฐ„ ์‚ฌ์šฉ๋  ๋•Œ ๋ฉ”๋ชจ๋ฆฌ ํ•œ๊ณ„๋ฅผ ์ดˆ๊ณผํ•˜์—ฌ ์•ฑ์ด ๋ฉˆ์ถ”๊ฑฐ๋‚˜ ์ถฉ๋Œ(Crash)ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ์ฃผ์š” ์›์ธ์ž…๋‹ˆ๋‹ค [10, 11]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ถ„๋ฆฌ๋œ DOM ๋…ธ๋“œ(Detached DOM nodes)๋‚˜ ํ•ด์ œ๋˜์ง€ ์•Š์€ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๊ฐ€ JavaScript ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๋ฅผ ๋ฐฉํ•ดํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜ [12, 13, 51]. - -#### [๊ด€๊ณ„ ์œ ํ˜• B (๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ)] -- [[Cloud Logging Tools]] - - ์—ฐ๊ฒฐ ์ด์œ : ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์˜ ํ”„๋ก ํŠธ์—”๋“œ ์—๋Ÿฌ์™€ ์„ฑ๋Šฅ ์ด์Šˆ๋ฅผ ๊ฐ€์‹œํ™”ํ•˜๊ณ  ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜์—ฌ ๋ฌธ์ œ ํ•ด๊ฒฐ ์†๋„๋ฅผ ๊ทน๋Œ€ํ™”ํ•ฉ๋‹ˆ๋‹ค [21, 22]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด(Session Replay), ์—๋Ÿฌ ์ž๋™ ๊ทธ๋ฃนํ™”, ๋ถ„์‚ฐ ์ถ”์ (Distributed Tracing)์„ ํ†ตํ•œ ๋ณต์žกํ•œ ๋ฒ„๊ทธ ์ปจํ…์ŠคํŠธ์˜ ํ•ด์„ ๊ณผ์ • [23-25, 52]. - -- [[Chrome DevTools Memory Profiler]] - - ์—ฐ๊ฒฐ ์ด์œ : ๋ˆˆ์— ๋ณด์ด์ง€ ์•Š๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜์™€ ๊ฐ์ฒด ์œ ์ง€(Retention) ์ƒํƒœ๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ง„๋‹จํ•˜์—ฌ ์•ˆ์ •์„ฑ์„ ๊ฐœ์„ ํ•˜๋Š” ๋ถ„์„ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค [5, 11]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํž™ ์Šค๋ƒ…์ƒท(Heap Snapshot)์˜ ๋ธํƒ€(Delta) ๊ฐ’ ๋น„๊ต ๋ฐ ํ• ๋‹น ํƒ€์ž„๋ผ์ธ(Allocation Timeline)์„ ํ†ตํ•ด ๋ˆ„์ˆ˜ ์›์ธ ๊ฐ์ฒด๋ฅผ ์—ญ์ถ”์ ํ•˜๋Š” ๋ฐฉ๋ฒ• [5, 53, 54]. - -### Deeper Research Questions - -- React Error Boundaries๊ฐ€ ๋น„๋™๊ธฐ ๋กœ์ง์ด๋‚˜ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์˜ˆ์™ธ๋ฅผ ๋ณธ์งˆ์ ์œผ๋กœ ํฌ์ฐฉํ•˜์ง€ ๋ชปํ•˜๋Š” React์˜ ๋ Œ๋”๋ง ์•„ํ‚คํ…์ฒ˜์  ์ด์œ ๋Š” ๋ฌด์—‡์ธ๊ฐ€? -- ํ”„๋ก ํŠธ์—”๋“œ ํ™˜๊ฒฝ์—์„œ WeakMap์„ ํ™œ์šฉํ•œ ์บ์‹œ ๊ด€๋ฆฌ๊ฐ€ ํด๋กœ์ €(Closure)๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ์˜ˆ๋ฐฉํ•˜๋Š”๊ฐ€? -- ๋Œ€๊ทœ๋ชจ ํŒ€ ํ™˜๊ฒฝ์—์„œ Feature-Sliced Design(FSD) ๋„์ž… ์‹œ, ์ธ์ฆ(Auth)๊ณผ ๊ฐ™์€ ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ(Cross-cutting concerns)๋ฅผ ๋ ˆ์ด์–ด ์›์น™์— ์œ„๋ฐฐ๋˜์ง€ ์•Š๊ฒŒ ๋ฐฐ์น˜ํ•˜๋Š” ์ตœ์ ์˜ ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? -- ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์— Sentry๋‚˜ LogRocket์„ ์ ์šฉํ•  ๋•Œ, Core Web Vitals(ํŠนํžˆ TBT, INP ๋“ฑ) ์ €ํ•˜๋ฅผ ์ตœ์†Œํ™”ํ•˜๋ฉด์„œ๋„ ํ•„์š”ํ•œ ๋กœ๊ทธ๋ฅผ ํ™•๋ณดํ•˜๊ธฐ ์œ„ํ•œ ์ตœ์ ์˜ ์ƒ˜ํ”Œ๋ง ๋น„์œจ๊ณผ ์„ค์ • ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? -- ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ(Context API vs. Zustand ๋“ฑ)์˜ ์„ ํƒ์ด ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง ํญ์ฃผ๋ฅผ ์œ ๋ฐœํ•˜์—ฌ ์•ฑ์˜ ์„ฑ๋Šฅ์  ์•ˆ์ •์„ฑ์— ๋ฏธ์น˜๋Š” ๊ตฌ์กฐ์ ์ธ ์ฐจ์ด๋Š” ๋ฌด์—‡์ธ๊ฐ€? - -### Practical Application Contexts - -- **Implementation:** React ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜ ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋Š” ์œ„์ ฏ์€ ๊ฐœ๋ณ„ Error Boundary๋กœ ๊ฐ์‹ธ ์˜ค๋ฅ˜๋ฅผ ๊ตญ์†Œํ™”(Isolate)ํ•˜๊ณ , `useEffect` ํ›… ๋‚ด๋ถ€์˜ ์ด๋ฒคํŠธ ๊ตฌ๋…์€ ๋ฐ˜๋“œ์‹œ ํ•ด์ œ(Cleanup)ํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค [4, 8, 15, 16]. -- **System Design:** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํด๋” ๊ตฌ์กฐ๋ฅผ ๊ธฐ์ˆ  ์Šคํƒ ๊ธฐ์ค€์ด ์•„๋‹Œ ๊ธฐ๋Šฅ(Feature/Domain) ๊ธฐ๋ฐ˜ ๋˜๋Š” FSD ๊ตฌ์กฐ๋กœ ์„ค๊ณ„ํ•˜์—ฌ ๋ชจ๋“ˆ ๊ฐ„์˜ ์•”๋ฌต์ ์ธ ์–ฝํž˜์„ ๋ง‰๊ณ  ์žฅ๊ธฐ์ ์ธ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค [48, 55, 56]. -- **Operation / Maintenance:** Sentry ๋˜๋Š” Datadog RUM์„ CI/CD ํŒŒ์ดํ”„๋ผ์ธ๊ณผ ํ†ตํ•ฉํ•˜์—ฌ, ์ƒˆ๋กœ์šด ๋ฐฐํฌ ์งํ›„ ๋ฐœ์ƒํ•˜๋Š” ๊ณ ์œ ํ•œ ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜๋‚˜ ํผํฌ๋จผ์Šค ์ €ํ•˜๋ฅผ ์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด๋ฅผ ํ†ตํ•ด ์ฆ‰๊ฐ์ ์œผ๋กœ ์ธ์ง€ํ•˜๊ณ  ํ•ซํ”ฝ์Šค๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค [22-24, 52]. -- **Learning Path:** ์šฐ์„  React์˜ ๋ Œ๋”๋ง ๋™์ž‘ ์›๋ฆฌ์™€ ์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ๋ฅผ ํ•™์Šตํ•œ ๋’ค, Error Boundaries ๊ตฌํ˜„ -> Chrome DevTools๋ฅผ ํ™œ์šฉํ•œ Memory Leak ๋ถ„์„ ๊ธฐ๋ฒ• -> FSD ๊ฐ™์€ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด ์ˆœ์„œ๋กœ ์‹œ์Šคํ…œ ๋ ˆ๋ฒจ์˜ ์•ˆ์ •์„ฑ ์„ค๊ณ„ ๋Šฅ๋ ฅ์„ ํ‚ค์›๋‹ˆ๋‹ค [2, 9, 47, 53]. -- **My Project Relevance:** ํ˜„์žฌ ์œ ์ง€๋ณด์ˆ˜ ์ค‘์ด๊ฑฐ๋‚˜ ๊ฐœ๋ฐœ ์ค‘์ธ ํ”„๋กœ์ ํŠธ์˜ `main` ๋ธŒ๋žœ์น˜ ์•ˆ์ •์„ฑ์„ ์œ„ํ•ด Pull Request ์‹œ Storybook ๋ฐ Happo๋ฅผ ํ†ตํ•œ ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ(Visual Regression Test) ์ž๋™ํ™”๋ฅผ ์—ฐ๋™ํ•˜๊ณ , ๋ถˆ์•ˆ์ •ํ•œ ํŽ˜์ด์ง€ ๊ตฌ์—ญ์— Error Boundary๋ฅผ ์”Œ์›Œ ์‚ฌ์šฉ์ž์˜ ์ดํƒˆ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [8, 30, 31]. - -### Adjacent Topics - -- [[React Performance Optimization]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ์•ˆ์ •์„ฑ ์œ ์ง€๋ฟ ์•„๋‹ˆ๋ผ `React.memo`, `useMemo`, `useCallback`, ๊ฐ€์ƒํ™”(Virtualization) ๋“ฑ์„ ํ†ตํ•ด ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ์ฐจ๋‹จํ•˜๊ณ  ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ์„ ๊ทน๋Œ€ํ™”ํ•˜๋Š” ์‹คํ–‰ ๋ ˆ๋ฒจ์˜ ์ตœ์ ํ™” ๊ธฐ๋ฒ• ํƒ๊ตฌ [57-60]. -- [[Git Workflow & Governance]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ์•ˆ์ •์ ์ธ ๋ฐฐํฌ์™€ ๋ฒ„์ „ ๊ด€๋ฆฌ๋ฅผ ๋‹ด๋ณดํ•˜๊ธฐ ์œ„ํ•œ Feature Branching, GitHub Flow, Conventional Commits ๋“ฑ ํ˜‘์—… ๊ทœ์น™ ๋ฐ CI/CD ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ(Quality gates) ์ ์šฉ ๋ฐฉ์•ˆ [29, 61-63]. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Frontend Engineering Governance.md b/00_Raw/Frontend Engineering Governance.md deleted file mode 100644 index 713f17b3..00000000 --- a/00_Raw/Frontend Engineering Governance.md +++ /dev/null @@ -1,60 +0,0 @@ -# [[Frontend Engineering Governance]] - -## ๐Ÿ“Œ Brief Summary -Frontend Engineering Governance๋Š” ์ผ๊ด€๋œ ๋„ค์ด๋ฐ ๊ทœ์น™, ํ”„๋กœ์ ํŠธ ํ‘œ์ค€, ์ž๋™ํ™”๋œ ๋ฆฐํŒ… ๋„๊ตฌ ๋ฐ ์—„๊ฒฉํ•œ Git ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ํ†ตํ•ด ํ”„๋ก ํŠธ์—”๋“œ ํ”„๋กœ์ ํŠธ์˜ ์ฝ”๋“œ ํ’ˆ์งˆ๊ณผ ํ˜‘์—… ํšจ์œจ์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ์ฒด๊ณ„์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค [1, 2]. ์ˆ˜๋™์ ์ธ ์ฝ”๋“œ ๋ฆฌ๋ทฐ์— ์˜์กดํ•˜๋Š” ๋Œ€์‹  ESLint, Prettier, Husky์™€ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์•„ํ‚คํ…์ฒ˜ ๊ฒฝ๊ณ„๋ฅผ ๋ณดํ˜ธํ•˜๊ณ  ์ฝ”๋“œ ํ’ˆ์งˆ ๊ฒ€์ฆ์„ ์ž๋™ํ™”ํ•˜๋Š” ๋ฐ ์ค‘์ ์„ ๋‘ก๋‹ˆ๋‹ค [3]. ์ด๋ฅผ ํ†ตํ•ด ์ž ์žฌ์ ์ธ ๋ฒ„๊ทธ์™€ ์•„ํ‚คํ…์ฒ˜์˜ ๋ถ•๊ดด๋ฅผ ์˜ˆ๋ฐฉํ•˜๊ณ  ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๋ฉฐ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค [4, 5]. - -## ๐Ÿ“– Core Content -* **๋„ค์ด๋ฐ ๊ทœ์น™ ๋ฐ ํ‘œ์ค€ํ™” (Naming Conventions):** ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜๋Š” ํ™˜๊ฒฝ(์˜ˆ: Linux ๊ธฐ๋ฐ˜ ์šด์˜ ์„œ๋ฒ„)์—์„œ ๋นŒ๋“œ ์‹คํŒจ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ํŒŒ์ผ ๋ฐ ํด๋” ์ด๋ฆ„์€ `kebab-case`๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค [6]. ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ๋Š” `PascalCase`, ์‚ฌ์šฉ์ž ์ •์˜ ํ›…(Custom Hooks)๊ณผ ์ผ๋ฐ˜ ๋ณ€์ˆ˜ ๋ฐ ํ•จ์ˆ˜๋Š” `camelCase`, ์ƒ์ˆ˜๋Š” `UPPER_SNAKE_CASE`๋กœ ํ‘œ์ค€ํ™”ํ•˜์—ฌ ๊ฐ€๋…์„ฑ์„ ๋†’์ด๊ณ  ํŒŒ์ผ์˜ ๋ชฉ์ ์„ ๋ช…ํ™•ํžˆ ํ•ฉ๋‹ˆ๋‹ค [3, 7-9]. -* **์ž๋™ํ™”๋œ ํˆด ๊ธฐ๋ฐ˜ ๊ฑฐ๋ฒ„๋„Œ์Šค (Governance through Tooling):** ์ˆ˜๋™์ ์ธ ์ฝ”๋“œ ํ‘œ์ค€ ๊ฐ•์ œ๋Š” ๋น„ํšจ์œจ์ ์ด๋ฏ€๋กœ, ํ˜„๋Œ€์ ์ธ ํ”„๋กœ์ ํŠธ๋Š” ESLint์™€ Prettier๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์œ„๋ฐ˜ ์‚ฌํ•ญ์„ ์ž๋™์œผ๋กœ ์ฐพ์•„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค [3]. ํŠนํžˆ ESLint ๊ทœ์น™์„ ๊ตฌ์„ฑํ•˜์—ฌ ํŠน์ • ์ž„ํฌํŠธ ํŒจํ„ด(์˜ˆ: ํ•œ ๊ธฐ๋Šฅ์ด ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์˜ ๋‚ด๋ถ€๋ฅผ ์ง์ ‘ ์ž„ํฌํŠธํ•˜๋Š” ๊ฒƒ)์„ ๊ธˆ์ง€ํ•จ์œผ๋กœ์จ Feature-Sliced Design(FSD)๊ณผ ๊ฐ™์€ ์•„ํ‚คํ…์ฒ˜์˜ ๊ณ„์ธต์  ๊ฒฝ๊ณ„๋ฅผ ์—„๊ฒฉํ•˜๊ฒŒ ๊ฐ•์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3]. -* **Git ํ›…(Git Hooks)์„ ํ†ตํ•œ ์‚ฌ์ „ ๋ฐฉ์ง€:** Husky์™€ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ๋„์ž…ํ•˜์—ฌ ์ฝ”๋“œ๊ฐ€ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ์ปค๋ฐ‹๋˜๊ธฐ ์ „์— ๋ฆฐํŒ…, ์ฝ”๋“œ ํฌ๋งทํŒ…, ํƒ€์ž… ๊ฒ€์‚ฌ๋ฅผ ํ•„์ˆ˜์ ์œผ๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค [3]. ์ด๋ฅผ ํ†ตํ•ด ํ’ˆ์งˆ์ด ๋‚ฎ์€ ์ฝ”๋“œ๋‚˜ ๊ทœ์น™์„ ์œ„๋ฐ˜ํ•œ ์ฝ”๋“œ๊ฐ€ ์ฝ”๋“œ๋ฒ ์ด์Šค์— ๋“ค์–ด์˜ค๋Š” ๊ฒƒ์„ ์›์ฒœ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค [3]. -* **ํ˜‘์—… ์›Œํฌํ”Œ๋กœ์šฐ ๋ฐ Git ๊ฑฐ๋ฒ„๋„Œ์Šค (Git Governance):** ๊ฐœ๋ฐœ์ž๋Š” ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์— ์ง์ ‘ ์ปค๋ฐ‹ํ•˜์ง€ ์•Š๊ณ  ์งง์€ ์ˆ˜๋ช…์˜ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜(Feature Branch)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ๋™๋ฃŒ์˜ ์ฝ”๋“œ ๋ฆฌ๋ทฐ์™€ CI/CD ๊ฒ€์‚ฌ๋ฅผ ํ†ต๊ณผํ•œ ํ›„์—๋งŒ ๋ณ‘ํ•ฉ(Merge)ํ•ฉ๋‹ˆ๋‹ค [4]. ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๋Š” 'Conventional Commits' ๊ทœ๊ฒฉ(`feat:`, `fix:`, `docs:`, `refactor:`, `chore:`)์„ ์ค€์ˆ˜ํ•˜์—ฌ ๊ฐ€๋…์„ฑ์„ ๋†’์ด๊ณ  ๋ฆด๋ฆฌ์Šค ๋…ธํŠธ ์ž๋™ํ™”๋ฅผ ๋•์Šต๋‹ˆ๋‹ค [10]. ๋˜ํ•œ, ์ถ”์ ์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ๋ธŒ๋žœ์น˜ ์ด๋ฆ„๊ณผ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€์— ํ‹ฐ์ผ“ ID(์˜ˆ: `PROJ-123`)๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค [11, 12]. -* **์‹œ๊ฐ์  ๋ฆฌ๋ทฐ ๋ฐ PR ํ’ˆ์งˆ ๊ด€๋ฆฌ (Visual Reviews):** ํ’€ ๋ฆฌํ€˜์ŠคํŠธ(PR)๋Š” ๋‹จ์ผ ์ž‘์—…์— ์ดˆ์ ์„ ๋งž์ถฐ ์ž‘๊ฒŒ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [10]. Storybook ๋ฐ Chromatic๊ณผ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ CI ํŒŒ์ดํ”„๋ผ์ธ์— ํ†ตํ•ฉํ•˜์—ฌ, PR์ด ์—ด๋ฆด ๋•Œ๋งˆ๋‹ค ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ(Visual regression testing)๋ฅผ ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๊ณ  ์˜๋„์น˜ ์•Š์€ UI ๋ณ€๊ฒฝ์ด ์—†๋Š”์ง€ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค [13-15]. - -## โš–๏ธ Trade-offs & Caveats -๊ฐ•๋ ฅํ•œ ๋ฆฐํŒ… ๊ทœ์น™ ๋ฐ ์ž๋™ํ™”๋œ ๊ฑฐ๋ฒ„๋„Œ์Šค๋Š” ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐ์— ๋„๊ตฌ ์„ค์ •(ESLint, Husky, CI ์—ฐ๋™ ๋“ฑ)์— ๋งŽ์€ ์‹œ๊ฐ„ ํˆฌ์ž๋ฅผ ์š”๊ตฌํ•˜๋ฉฐ, ๊ฐœ๋ฐœ์ž๋“ค์—๊ฒŒ ๋‹ค์†Œ ๊ฐ€ํŒŒ๋ฅธ ๋Ÿฌ๋‹ ์ปค๋ธŒ๋ฅผ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3, 16]. ์—„๊ฒฉํ•œ ๊ทœ์น™์œผ๋กœ ์ธํ•ด ๋‹จ์ˆœํ•œ ๊ธฐ๋Šฅ ๊ตฌํ˜„์ด๋‚˜ ํ”„๋กœํ† ํƒ€์ดํ•‘ ์‹œ์—๋„ ๋ถ€๊ฐ€์ ์ธ ๋ฆฐํŠธ ์—๋Ÿฌ ์ˆ˜์ • ๋ฐ ์•„ํ‚คํ…์ฒ˜ ๊ทœ์น™ ์ค€์ˆ˜๊ฐ€ ๊ฐ•์ œ๋˜์–ด ์ดˆ๊ธฐ ๊ฐœ๋ฐœ ์†๋„๋ฅผ ๋Šฆ์ถœ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3]. ๋˜ํ•œ, ์ž‘์€ ๊ทœ๋ชจ์˜ ํŒ€์ด๋‚˜ ๋‹จ์ˆœํ•œ ํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ์šฐ ์ง€๋‚˜์น˜๊ฒŒ ๋ณต์žกํ•œ Git Flow๋‚˜ ๊ณผ๋„ํ•œ ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ ์„ค์ •์€ ๋ถˆํ•„์š”ํ•œ ๊ด€๋ฆฌ ์˜ค๋ฒ„ํ—ค๋“œ(Overhead)๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ํŒ€์˜ ์„ฑ์ˆ™๋„์™€ ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ์— ๋งž๋Š” ์ ์ ˆํ•œ ์ˆ˜์ค€์˜ ๊ทœ์น™(์˜ˆ: ๋‹จ์ˆœํ•œ Feature-Branch ์›Œํฌํ”Œ๋กœ์šฐ)์„ ์ฑ„ํƒํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค [17, 18]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -#### [๊ด€๊ณ„ ์œ ํ˜• A (์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ )] -* [[Feature-Sliced Design (FSD)]] - * ์—ฐ๊ฒฐ ์ด์œ : ํ”„๋ก ํŠธ์—”๋“œ ์ฝ”๋“œ์˜ ์Šค์ฝ”ํ”„์™€ ์ฑ…์ž„์„ ๋ช…ํ™•ํžˆ ๊ตฌ๋ถ„ํ•˜๊ณ  ๊ณ„์ธต ๊ฐ„์˜ ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ์„ ๊ฑฐ๋ฒ„๋„Œ์Šค ๊ทœ์น™์œผ๋กœ ๊ฐ•์ œํ•ด์•ผ ํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [19, 20]. - * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ESLint ๊ทœ์น™์„ ํ†ตํ•ด ๋ชจ๋“ˆ ๊ฐ„ ์ž„ํฌํŠธ๋ฅผ ์–ด๋–ป๊ฒŒ ์ œํ•œํ•˜์—ฌ ์‹œ์Šคํ…œ์˜ ๊ตฌ์กฐ์  ๋ถ•๊ดด๋ฅผ ๋ง‰์„ ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ์‹ค์งˆ์  ์ดํ•ด [3]. -* [[Conventional Commits]] - * ์—ฐ๊ฒฐ ์ด์œ : ๋ช…ํ™•ํ•œ Git ๊ฑฐ๋ฒ„๋„Œ์Šค๋ฅผ ์œ„ํ•ด ํ•„์ˆ˜์ ์œผ๋กœ ์ฑ„ํƒ๋˜๋Š” ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ์ž‘์„ฑ ํ‘œ์ค€์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [10]. - * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํŒ€ ์ „์ฒด์˜ ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ณ , ๋ฆด๋ฆฌ์Šค ์ž๋™ํ™” ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐฉ๋ฒ• [10, 21]. - -#### [๊ด€๊ณ„ ์œ ํ˜• B (๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ)] -* [[ESLint and Prettier]] - * ์—ฐ๊ฒฐ ์ด์œ : ์ˆ˜๋™ ๋ฆฌ๋ทฐ์˜ ๋น„ํšจ์œจ์„ฑ์„ ์ œ๊ฑฐํ•˜๊ณ  ์ฝ”๋”ฉ ํ‘œ์ค€๊ณผ ์•„ํ‚คํ…์ฒ˜ ๊ทœ์น™์„ ์ž๋™์œผ๋กœ ๊ฐ•์ œํ•˜๋Š” ๊ฑฐ๋ฒ„๋„Œ์Šค์˜ ํ•ต์‹ฌ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค [3]. - * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํ”„๋กœ์ ํŠธ ๋‚ด ๋„ค์ด๋ฐ ๊ทœ์น™ ์ผ๊ด€์„ฑ ์œ ์ง€ ๋ฐ ์•„ํ‚คํ…์ฒ˜ ๊ฒฝ๊ณ„ ์œ„๋ฐ˜ ๋ฐฉ์ง€๋ฅผ ์ฝ”๋“œ๋กœ ์ž๋™ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ• [3]. -* [[Husky]] - * ์—ฐ๊ฒฐ ์ด์œ : ๊ฐœ๋ฐœ์ž๊ฐ€ ์ฝ”๋“œ๋ฅผ ์ปค๋ฐ‹ํ•˜๊ธฐ ์ „(Pre-commit)์— ๊ฑฐ๋ฒ„๋„Œ์Šค ๊ทœ์น™(๋ฆฐํŒ…, ํฌ๋งทํŒ…)์„ ๋ฌด์กฐ๊ฑด์ ์œผ๋กœ ํ†ต๊ณผํ•˜๋„๋ก ํ›…(Hook)์„ ๊ฑธ์–ด์ฃผ๋Š” ๋„๊ตฌ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [3]. - * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ž˜๋ชป๋œ ์ฝ”๋“œ๊ฐ€ ์›๊ฒฉ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋กœ ํ‘ธ์‹œ๋˜๋Š” ๊ฒƒ์„ ์›์ฒœ์ ์œผ๋กœ ์ฐจ๋‹จํ•˜๋Š” ํ”„๋ก ํŠธ์—”๋“œ ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ์›จ์ด ๊ตฌ์„ฑ [3]. -* [[Visual Regression Testing (Chromatic)]] - * ์—ฐ๊ฒฐ ์ด์œ : ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜ ํ”„๋ก ํŠธ์—”๋“œ์—์„œ ์ฝ”๋“œ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ UI๊ฐ€ ๊นจ์ง€์ง€ ์•Š์•˜๋Š”์ง€ ํ’€ ๋ฆฌํ€˜์ŠคํŠธ(PR) ๋‹จ๊ณ„์—์„œ ๊ฒ€์ฆํ•˜๋Š” ์‹œ๊ฐ์  ํ’ˆ์งˆ ๊ฑฐ๋ฒ„๋„Œ์Šค ์ˆ˜๋‹จ์ž…๋‹ˆ๋‹ค [13, 15]. - * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Storybook๊ณผ ์—ฐ๋™ํ•˜์—ฌ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๊ณผ์ •์—์„œ ์ธ๊ฐ„์ด ๋†“์น˜๊ธฐ ์‰ฌ์šด ํ”ฝ์…€ ๋‹จ์œ„์˜ ์‹œ๊ฐ์  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ž๋™์œผ๋กœ ๊ฐ์ง€ํ•˜๋Š” ์›๋ฆฌ [22, 23]. - -### Deeper Research Questions -* ESLint๋ฅผ ํ™œ์šฉํ•ด Feature-Sliced Design์˜ ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ(Unidirectional dependencies) ๊ทœ์น™์„ ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ์„ค์ •ํ•˜๊ณ  ๊ฐ•์ œํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? -* Husky์™€ ๊ฐ™์€ Git ํ›… ๋„๊ตฌ๋ฅผ ๋„์ž…ํ–ˆ์„ ๋•Œ ๊ฐœ๋ฐœ์ž ๊ฒฝํ—˜(Developer Experience)์„ ์ €ํ•ดํ•˜์ง€ ์•Š์œผ๋ฉด์„œ๋„ ํ•„์ˆ˜ ๊ฒ€์‚ฌ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์ตœ์ ์˜ ์†๋„ ์ตœ์ ํ™” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? -* ์†Œ๊ทœ๋ชจ 3์ธ ํŒ€์—์„œ ๋Œ€๊ทœ๋ชจ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ํŒ€์œผ๋กœ ์„ฑ์žฅํ•จ์— ๋”ฐ๋ผ Git ๋ธŒ๋žœ์นญ ์ „๋žต๊ณผ ๋ฆฌ๋ทฐ ๊ฑฐ๋ฒ„๋„Œ์Šค ๊ทœ์น™์€ ๋‹จ๊ณ„๋ณ„๋กœ ์–ด๋–ป๊ฒŒ ์ง„ํ™”ํ•ด์•ผ ํ•˜๋Š”๊ฐ€? -* ๋‹จ์ผ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ๋ฐฉ๋Œ€ํ•œ ์ฝ”๋“œ๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ(Monorepo), ๋„๋ฉ”์ธ๋ณ„ ๊ฑฐ๋ฒ„๋„Œ์Šค ๊ทœ์น™์„ ์–ด๋–ป๊ฒŒ ๋ถ„๋ฆฌํ•˜์—ฌ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? -* ๊ธฐ์กด์˜ ๋ ˆ๊ฑฐ์‹œ ํ”„๋กœ์ ํŠธ(๊ฑฐ๋ฒ„๋„Œ์Šค๊ฐ€ ์—†๋Š” ์ƒํƒœ)์— ์ž๋™ํ™”๋œ ๋ฆฐํŒ…, ๋„ค์ด๋ฐ ๊ทœ์น™, ํ‹ฐ์ผ“ ID ์‹œ์Šคํ…œ์„ ์—…๋ฌด ์ค‘๋‹จ ์—†์ด ์ ์ง„์ ์œผ๋กœ ๋„์ž…ํ•˜๊ธฐ ์œ„ํ•œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? - -### Practical Application Contexts -* **Implementation:** ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐ ์„ธํŒ… ์‹œ Prettier, ESLint, Husky๋ฅผ ์„ค์น˜ํ•˜์—ฌ ์ฝ”๋“œ ์Šคํƒ€์ผ๊ณผ ๋„ค์ด๋ฐ ๊ทœ์น™์„ ์ •์˜ํ•˜๊ณ , ๊ฐœ๋ฐœ์ž์˜ ๋กœ์ปฌ ํ™˜๊ฒฝ์—์„œ ์ž๋™์œผ๋กœ ์ฝ”๋“œ๊ฐ€ ํฌ๋งทํŒ… ๋ฐ ๊ฒ€์ฆ๋˜๋„๋ก ๋‚ด์žฌํ™”ํ•ฉ๋‹ˆ๋‹ค [3]. -* **System Design:** FSD์™€ ๊ฐ™์€ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ, ํ•˜์œ„ ๊ณ„์ธต์ด ์ƒ์œ„ ๊ณ„์ธต์„ ์ž„ํฌํŠธํ•˜์ง€ ๋ชปํ•˜๋„๋ก ์‹œ์Šคํ…œ์ ์ธ ๋ฆฐํŠธ(Lint) ๋ฃฐ์„ ํ•จ๊ป˜ ์„ค๊ณ„ํ•˜์—ฌ ์•„ํ‚คํ…์ฒ˜์˜ ์˜๋„๊ฐ€ ๋ฌด๋„ˆ์ง€์ง€ ์•Š๊ฒŒ ๋ณดํ˜ธํ•ฉ๋‹ˆ๋‹ค [3]. -* **Operation / Maintenance:** PR(Pull Request) ํ…œํ”Œ๋ฆฟ๊ณผ Conventional Commits์„ ์˜๋ฌดํ™”ํ•˜๊ณ , ๋ธŒ๋žœ์น˜๋ช…์— ์ด์Šˆ ํ‹ฐ์ผ“ ๋ฒˆํ˜ธ(์˜ˆ: `feature/PROJ-123-user-auth`)๋ฅผ ์‚ฝ์ž…ํ•˜๊ฒŒ ํ•˜์—ฌ ์œ ์ง€๋ณด์ˆ˜ ์‹œ ๋ณ€๊ฒฝ ์ด๋ ฅ๊ณผ ๊ธฐํš ์˜๋„๋ฅผ ์‰ฝ๊ฒŒ ์ถ”์ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์šด์˜ํ•ฉ๋‹ˆ๋‹ค [10, 24]. -* **Learning Path:** React ๋ฌธ๋ฒ•๊ณผ ์ปดํฌ๋„ŒํŠธ ์ƒํƒœ๊ณ„๋ฅผ ์ตํžŒ ํ›„, ํ˜‘์—…์„ ์œ„ํ•œ ํด๋ฆฐ ์ฝ”๋“œ ์›์น™๊ณผ Git ์ „๋žต์„ ํ•™์Šตํ•˜๊ณ , ์ด๋ฅผ ์‹ค์ œ ํ”„๋กœ์ ํŠธ์— ๊ฐ•์ œํ•˜๊ธฐ ์œ„ํ•œ ํ™˜๊ฒฝ ๊ตฌ์ถ•(ESLint ์„ค์ • ๋“ฑ)์œผ๋กœ ๋‚˜์•„๊ฐ€๋Š” ๊ณผ์ •์— ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค [3, 25]. -* **My Project Relevance:** ํ˜„์žฌ ์ง„ํ–‰ ์ค‘์ด๊ฑฐ๋‚˜ ์•ž์œผ๋กœ ๋„์ž…๋  ํŒ€ ํ”„๋กœ์ ํŠธ์—์„œ ๊ฐœ๋ฐœ์ž ๊ฐ„ ์ฝ”๋“œ ์Šคํƒ€์ผ ์ถฉ๋Œ๊ณผ ๋ถˆ๋ช…ํ™•ํ•œ ์ปค๋ฐ‹ ๋กœ๊ทธ๋กœ ์ธํ•œ ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ง์ ‘ Git ํ›…์„ ์„ค์ •ํ•˜๊ณ  PR ๊ทœ์น™์„ ๋„์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3, 26]. - -### Adjacent Topics -* [[Clean Code Principles (SOLID, DRY, KISS, YAGNI)]] - * ํ™•์žฅ ๋ฐฉํ–ฅ: ๊ฑฐ๋ฒ„๋„Œ์Šค๊ฐ€ ๊ทœ์น™์˜ "๋„๊ตฌ์  ๊ฐ•์ œ"๋ผ๋ฉด, ํด๋ฆฐ ์ฝ”๋“œ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ทธ ๊ตฌ์กฐ ์•ˆ์—์„œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ถ„๋ฆฌํ•˜๊ณ  ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์ค€์ˆ˜ํ•ด์•ผ ํ•  ๊ทผ๋ณธ์ ์ธ ์‚ฌ๊ณ ๋ฐฉ์‹๊ณผ ์ฒ ํ•™์„ ์ดํ•ดํ•˜๋„๋ก ํ™•์žฅ๋ฉ๋‹ˆ๋‹ค. -* [[CI/CD Pipelines]] - * ํ™•์žฅ ๋ฐฉํ–ฅ: ๋กœ์ปฌ ํ™˜๊ฒฝ์˜ Git ํ›…์„ ๋„˜์–ด ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ(GitHub Actions ๋“ฑ)์—์„œ ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ์ž๋™์œผ๋กœ ๊ฒ€์ฆ, ๋นŒ๋“œ, ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ ๋ฐ ๋ฐฐํฌํ•˜๋Š” ์ง€์†์  ํ†ตํ•ฉ/๋ฐฐํฌ ํŒŒ์ดํ”„๋ผ์ธ ๊ฐœ๋…์œผ๋กœ ์ดํ•ด๋ฅผ ๋„“ํž™๋‹ˆ๋‹ค. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Frontend Performance Debugging.md b/00_Raw/Frontend Performance Debugging.md deleted file mode 100644 index e8479bfa..00000000 --- a/00_Raw/Frontend Performance Debugging.md +++ /dev/null @@ -1,72 +0,0 @@ -# [[Frontend Performance Debugging]] - -## ๐Ÿ“Œ Brief Summary -ํ”„๋ก ํŠธ์—”๋“œ ์„ฑ๋Šฅ ๋””๋ฒ„๊น…(Frontend Performance Debugging)์€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜, ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง, ์žฆ์€ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ๋“ฑ์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ์„ฑ๋Šฅ ์ €ํ•˜์™€ ์‘๋‹ต ์ง€์—ฐ์„ ์‹๋ณ„ํ•˜๊ณ  ํ•ด๊ฒฐํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค [1-3]. ๊ฐœ๋ฐœ์ž๋Š” ๋ธŒ๋ผ์šฐ์ €์˜ ๋‚ด์žฅ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ(Chrome DevTools)๋ฅผ ํ™œ์šฉํ•ด ๋ฉ”๋ชจ๋ฆฌ ์ƒํƒœ์™€ ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง ๋น„์šฉ์„ ๋กœ์ปฌ์—์„œ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค [4, 5]. ๋” ๋‚˜์•„๊ฐ€ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋Š” ํด๋ผ์šฐ๋“œ ๊ธฐ๋ฐ˜ ๋กœ๊น… ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹ค์ œ ์‚ฌ์šฉ์ž์˜ ์„ธ์…˜๊ณผ ์—๋Ÿฌ๋ฅผ ์ถ”์ ํ•จ์œผ๋กœ์จ ๋ณต์žกํ•œ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ์˜ ๊ทผ๋ณธ ์›์ธ์„ ํŒŒ์•…ํ•ฉ๋‹ˆ๋‹ค [6-8]. - -## ๐Ÿ“– Core ์†Œ์Šค Content -**๋ฉ”๋ชจ๋ฆฌ ๋ฌธ์ œ ์ง„๋‹จ (Memory Issues Diagnosis)** -ํ”„๋ก ํŠธ์—”๋“œ ์„ฑ๋Šฅ ์ €ํ•˜์˜ ์ฃผ์š” ์›์ธ ์ค‘ ํ•˜๋‚˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜(Memory Leak)์™€ ๋ฉ”๋ชจ๋ฆฌ ํŒฝ์ฐฝ(Memory Bloat)์ž…๋‹ˆ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” ์‚ฌ์šฉ์ด ๋๋‚œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๊ฐ€ ํšŒ์ˆ˜ํ•˜์ง€๋งŒ, DOM ๋…ธ๋“œ๊ฐ€ ๋ฌธ์„œ์—์„œ ์ œ๊ฑฐ๋œ ํ›„์—๋„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฐธ์กฐ๊ฐ€ ๋‚จ์•„์žˆ๋Š” '๋ถ„๋ฆฌ๋œ DOM ๋…ธ๋“œ(Detached DOM Nodes)', ๋ˆ„์ ๋œ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ, ํด๋กœ์ €(Closure)์— ์˜ํ•ด ์œ ์ง€๋˜๋Š” ์ฐธ์กฐ ๋“ฑ์ด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ์œ ๋ฐœํ•ฉ๋‹ˆ๋‹ค [2, 9, 10]. Chrome DevTools์˜ Task Manager๋ฅผ ํ†ตํ•ด ์‹ค์‹œ๊ฐ„ DOM ๋…ธ๋“œ์™€ JS ํž™(Heap) ๋ฉ”๋ชจ๋ฆฌ ์ฆ๊ฐ€๋ฅผ ํ™•์ธํ•˜๊ณ , Memory ํŒจ๋„์˜ Heap Snapshot์„ ๋น„๊ตํ•˜์—ฌ ๋ถ„๋ฆฌ๋œ DOM ํŠธ๋ฆฌ๋ฅผ ์‹๋ณ„ํ•˜๋ฉฐ, Allocation Timeline์„ ์‚ฌ์šฉํ•ด ์–ธ์ œ ์ƒˆ๋กœ์šด ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ• ๋‹น๋˜๋Š”์ง€ ์ถ”์ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [4, 11, 12]. ๋นˆ๋ฒˆํ•œ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์€ ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰์„ ์ž์ฃผ ์ผ์‹œ ์ •์ง€์‹œ์ผœ ํ™”๋ฉด์˜ ๋Š๊น€(Jank)์„ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค [1]. - -**React ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง ํ”„๋กœํŒŒ์ผ๋ง (React Rendering Profiling)** -React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ์ƒํƒœ(State), ํ”„๋กœํผํ‹ฐ(Props), ์ปจํ…์ŠคํŠธ(Context) ๋ณ€๊ฒฝ ๋˜๋Š” ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์˜ ๋ Œ๋”๋ง์— ์˜ํ•ด ๋ฆฌ๋ Œ๋”๋ง์ด ํŠธ๋ฆฌ๊ฑฐ๋ฉ๋‹ˆ๋‹ค [13]. ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์€ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋ฅผ ์ฐจ๋‹จํ•˜๊ณ  ์ƒํ˜ธ์ž‘์šฉ ์‹œ๊ฐ„์„ ์ง€์—ฐ์‹œํ‚ต๋‹ˆ๋‹ค [3]. ์ด๋ฅผ ๋””๋ฒ„๊น…ํ•˜๊ธฐ ์œ„ํ•ด React DevTools Profiler๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์–ด๋–ค ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ธ์ œ, ์™œ ๋ Œ๋”๋ง๋˜์—ˆ๋Š”์ง€, ์–ผ๋งˆ๋‚˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ๋Š”์ง€(Flamegraph ๋ทฐ ๋“ฑ)๋ฅผ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค [5, 14]. ๋˜ํ•œ, ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์ „์šฉ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ `why-did-you-render`๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์‹ค์ œ ์ƒํƒœ๋‚˜ prop ๋ณ€๊ฒฝ ์—†์ด ๋ฐœ์ƒํ•˜๋Š” ๋ฆฌ๋ Œ๋”๋ง์— ๋Œ€ํ•œ ์ฝ˜์†” ๊ฒฝ๊ณ ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [15, 16]. - -**ํ”„๋กœ๋•์…˜ ๊ด€์ธก์„ฑ๊ณผ ํด๋ผ์šฐ๋“œ ๋กœ๊น… (Production Observability and Logging)** -๋กœ์ปฌ ํ™˜๊ฒฝ์„ ๋„˜์–ด ์‹ค์ œ ์šด์˜ ํ™˜๊ฒฝ์˜ ์„ฑ๋Šฅ์„ ๋””๋ฒ„๊น…ํ•˜๊ธฐ ์œ„ํ•ด Sentry, LogRocket, Datadog RUM, SigNoz์™€ ๊ฐ™์€ ํ”„๋ก ํŠธ์—”๋“œ ํด๋ผ์šฐ๋“œ ๋กœ๊น… ๋„๊ตฌ๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค [17, 18]. ์ด ๋„๊ตฌ๋“ค์€ ๋‹จ์ˆœํ•œ ์—๋Ÿฌ ๋กœ๊น…์„ ๋„˜์–ด ์‚ฌ์šฉ์ž๊ฐ€ ์—๋Ÿฌ๋‚˜ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ๊ฒช๊ธฐ ์ง์ „์˜ ํ–‰๋™์„ ๋น„๋””์˜ค์ฒ˜๋Ÿผ ๋‹ค์‹œ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด(Session Replay), ํ”„๋ก ํŠธ์—”๋“œ ์—๋Ÿฌ๋ฅผ ๋ฐฑ์—”๋“œ ํŠธ๋ ˆ์ด์Šค์™€ ์—ฐ๊ด€ ์ง€์–ด ๋ถ„์„ํ•˜๋Š” ๋ถ„์‚ฐ ํŠธ๋ ˆ์ด์‹ฑ(Distributed Tracing), ๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ ์‚ฌ์šฉ์ž์˜ Core Web Vitals(LCP, FID, INP ๋“ฑ) ๋ชจ๋‹ˆํ„ฐ๋ง ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์—ฌ ๋งน์  ์—†๋Š” ๋””๋ฒ„๊น…์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค [7, 8, 19-21]. - -## โš–๏ธ Trade-offs & Caveats -* **๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ์˜ ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ฐ˜๋Œ€ ๊ธ‰๋ถ€:** LogRocket์ด๋‚˜ Sentry ๊ฐ™์€ ๊ฐ•๋ ฅํ•œ ๋กœ๊น… ๋ฐ ์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ๋“ค์„ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ์— ํƒ‘์žฌํ•˜๋ฉด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ๊ฐ€ ์ปค์ง€๊ณ  ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค. ์ผ๋ถ€ ๋„๊ตฌ๋Š” ์ตœ๋Œ€ 120ms์˜ ์ถ”๊ฐ€ ๋กœ๋“œ ์‹œ๊ฐ„์„ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ 1์ดˆ๊ฐ€ ์ค‘์š”ํ•œ ์„œ๋น„์Šค์—์„œ๋Š” ๊ฐ€๋ฒผ์šด ์˜ต์…˜์„ ์„ ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [22-24]. -* **์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด์™€ ํ”„๋ผ์ด๋ฒ„์‹œ ๋ฌธ์ œ:** ๋ชจ๋“  ์‚ฌ์šฉ์ž ์„ธ์…˜๊ณผ DOM/์ƒํƒœ ๋ณ€ํ™”๋ฅผ ๊ธฐ๋กํ•˜๋Š” ๋„๊ตฌ(์˜ˆ: LogRocket)์˜ ๊ธฐ๋ณธ '๋ชจ๋‘ ์บก์ฒ˜' ๋ฐฉ์‹์€ ๋ฏผ๊ฐํ•œ ๊ฐœ์ธ์ •๋ณด๋ฅผ ๋…ธ์ถœํ•  ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋งˆ์Šคํ‚น ์„ค์ •์„ ์ˆ˜๋™์œผ๋กœ ์—„๊ฒฉํžˆ ๊ตฌ์„ฑํ•ด์•ผ ํ•˜๋Š” ๊ด€๋ฆฌ ๋น„์šฉ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [19, 23, 25, 26]. -* **๋น„์šฉ๊ณผ ๊ฐ€์‹œ์„ฑ์˜ ํƒ€ํ˜‘ (Cost vs. Visibility):** Datadog๊ณผ ๊ฐ™์€ ๋Œ€๊ทœ๋ชจ ์˜ต์ €๋ฒ„๋นŒ๋ฆฌํ‹ฐ ํ”Œ๋žซํผ์€ ์ˆ˜์ง‘(Ingestion)๊ณผ ์ƒ‰์ธ(Indexing) ๋‹จ๊ณ„์—์„œ ์ด์ค‘ ๊ณผ๊ธˆ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ํŠธ๋ž˜ํ”ฝ์ด ๋งŽ์€ ๊ฒฝ์šฐ ์—„์ฒญ๋‚œ ๋น„์šฉ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋น„์šฉ ์ ˆ๊ฐ์„ ์œ„ํ•ด ๋กœ๊ทธ์˜ 20%๋งŒ ์ƒ‰์ธํ•˜๊ฒŒ ๋˜๋ฉด, ์‹ค์ œ ์žฅ์•  ๋ฐœ์ƒ ์‹œ ๋””๋ฒ„๊น…์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ์˜ 80%๊ฐ€ ๊ฒ€์ƒ‰๋˜์ง€ ์•Š๋Š” ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [27-29]. -* **์ตœ์ ํ™” ๊ธฐ๋ฒ• ์ž์ฒด์˜ ์˜ค๋ฒ„ํ—ค๋“œ:** `React.memo()`, `useCallback`, `useMemo`์™€ ๊ฐ™์€ ์ตœ์ ํ™” ํ›…์€ ์ด์ „ ์ฐธ์กฐ๊ฐ’์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜๊ณ  ๋น„๊ตํ•˜๋Š” ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ๋ Œ๋”๋ง ๋น„์šฉ๋ณด๋‹ค ๋น„๊ต ๋น„์šฉ์ด ๋” ํฐ ๊ฐ€๋ฒผ์šด ์ปดํฌ๋„ŒํŠธ์— ๋‚จ์šฉํ•˜๋ฉด ์˜คํžˆ๋ ค ์„ฑ๋Šฅ์„ ์ €ํ•˜์‹œํ‚ค๋Š” ์›์ธ์ด ๋ฉ๋‹ˆ๋‹ค [30, 31]. -* **์ปดํŒŒ์ผ๋Ÿฌ ์ž๋™ํ™”๋กœ ์ธํ•œ ๋””๋ฒ„๊น… ๋‚œ์ด๋„ ์ƒ์Šน:** React Compiler ๊ฐ™์€ ๋นŒ๋“œ ํƒ€์ž„ ์ž๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ช…์‹œ์ ์ธ ํ›… ์ž‘์„ฑ์„ ์ค„์ผ ์ˆ˜ ์žˆ์ง€๋งŒ, ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ธ”๋ž™๋ฐ•์Šค๋กœ ์ž‘๋™ํ•˜๋ฏ€๋กœ ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ ์ฝ”๋“œ ์ƒ์—์„œ ์›์ธ์„ ์ฐพ๊ธฐ ์–ด๋ ค์›Œ React DevTools Profiler์— ์ „์ ์œผ๋กœ ์˜์กดํ•ด์•ผ ํ•˜๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค [32]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -#### [๊ด€๊ณ„ ์œ ํ˜• A (๋กœ์ปฌ ๋””๋ฒ„๊น… ๋ฐ ๋ถ„์„ ๋„๊ตฌ)] -- [[Chrome DevTools Memory Profiler]] - - ์—ฐ๊ฒฐ ์ด์œ : ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜์™€ ๊ฐ์ฒด ๋ณด์กด ์ƒํƒœ๋ฅผ ํ”„๋กœํŒŒ์ผ๋งํ•˜๋Š” ๋ธŒ๋ผ์šฐ์ € ๋‚ด์žฅ ๋„๊ตฌ. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Heap Snapshots ๋น„๊ต, Allocation Timeline์„ ํ†ตํ•œ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ์ถ”์ , Detached DOM tree ํŒŒ์•… ๊ธฐ๋ฒ• [9, 12, 33]. -- [[React DevTools Profiler]] - - ์—ฐ๊ฒฐ ์ด์œ : React ํŠน์œ ์˜ ๋ Œ๋”๋ง ์‚ฌ์ดํด๊ณผ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ์„ ์‹œ๊ฐํ™”ํ•˜๋Š” ํ•ต์‹ฌ ๋„๊ตฌ. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง ์†Œ์š” ์‹œ๊ฐ„, ๋ Œ๋”๋ง ๋ฐœ์ƒ ์›์ธ(Props/State ๋ณ€๊ฒฝ ์—ฌ๋ถ€ ํŒ๋ณ„) [5, 14]. - -#### [๊ด€๊ณ„ ์œ ํ˜• B (ํ”„๋กœ๋•์…˜ ๊ด€์ธก์„ฑ ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง)] -- [[Frontend Cloud Logging Tools]] - - ์—ฐ๊ฒฐ ์ด์œ : Sentry, LogRocket, Datadog RUM, SigNoz ๋“ฑ ๋ฐฐํฌ ์ดํ›„ ๋ฐœ์ƒํ•˜๋Š” ์„ฑ๋Šฅ ์ €ํ•˜์™€ ๋ฒ„๊ทธ๋ฅผ ์ถ”์ ํ•˜๋Š” ํ”Œ๋žซํผ. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํ”„๋กœ๋•์…˜ ๋ ˆ๋ฒจ์—์„œ์˜ ์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด, ์ž๋™ ์—๋Ÿฌ ๊ทธ๋ฃนํ™”, ์—”๋“œํˆฌ์—”๋“œ ๋ถ„์‚ฐ ํŠธ๋ ˆ์ด์‹ฑ, Core Web Vitals ์ถ”์  [7, 8, 20, 21, 34]. - -#### [๊ด€๊ณ„ ์œ ํ˜• C (์•„ํ‚คํ…์ฒ˜ ๋ฐ ์•ˆํ‹ฐํŒจํ„ด)] -- [[JavaScript Memory Leaks]] - - ์—ฐ๊ฒฐ ์ด์œ : ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ฑ๋Šฅ์„ ์ ์ง„์ ์œผ๋กœ ํŒŒ๊ดดํ•˜๋Š” ํ˜„์ƒ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ํŒฝ์ฐฝ, ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ๋“ฑ๊ณผ ์—ฐ๊ด€. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํด๋กœ์ € ์ž”๋ฅ˜ ์ฐธ์กฐ(Closure-Retained References), ํ•ด์ œ๋˜์ง€ ์•Š์€ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ์˜ ๋™์ž‘ ๋ฉ”์ปค๋‹ˆ์ฆ˜ [2, 10, 35]. -- [[React Re-render Optimization]] - - ์—ฐ๊ฒฐ ์ด์œ : React์˜ ๋ Œ๋”๋ง ํŠน์„ฑ์ƒ ๋ฐœ์ƒํ•˜๋Š” ๋ฉ”์ธ ์Šค๋ ˆ๋“œ ๋ธ”๋กœํ‚น ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์ฝ”๋“œ ๋ ˆ๋ฒจ ๊ธฐ๋ฒ•. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ฐธ์กฐ ์•ˆ์ •์„ฑ(Reference stability), ์ต๋ช… ํ•จ์ˆ˜์˜ ๋ถ€์ž‘์šฉ, `useMemo` ๋ฐ `useCallback`์˜ ์˜ฌ๋ฐ”๋ฅธ ํ™œ์šฉ๋ฒ• [36-38]. - -### Deeper Research Questions - -- ํ”„๋ก ํŠธ์—”๋“œ ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ ์ˆ˜์ง‘ํ•˜๋Š” Sentry, LogRocket ๋“ฑ์˜ ํˆด์ด ์œ ๋ฐœํ•˜๋Š” ์„ฑ๋Šฅ ์ €ํ•˜(๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ ๋ฐ ์‹คํ–‰ ์˜ค๋ฒ„ํ—ค๋“œ)๋ฅผ ์ตœ์†Œํ™”ํ•˜๋ฉด์„œ๋„ Core Web Vitals ๋“ฑ ์œ ์˜๋ฏธํ•œ ๋””๋ฒ„๊น… ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๋Š” ์ตœ์ ์˜ ์„ค์ • ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? -- JavaScript ํ™˜๊ฒฝ์˜ Allocation Timeline ์ƒ์—์„œ ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ฐœ์ƒํ•˜๋Š” ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜(GC) ์ŠคํŒŒ์ดํฌ์™€ ์‹ค์ œ ๋ธŒ๋ผ์šฐ์ €์˜ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ ๋ฉˆ์ถค ํ˜„์ƒ(Jank/INP ์ €ํ•˜) ๊ฐ„์˜ ์ƒ๊ด€๊ด€๊ณ„๋ฅผ ์–ด๋–ป๊ฒŒ ์ •๋Ÿ‰์ ์œผ๋กœ ํ”„๋กœํŒŒ์ผ๋งํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? -- React Compiler๊ฐ€ ์ž๋™ํ™”ํ•˜๋Š” ์˜์—ญ๊ณผ ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(์˜ˆ: ํ•ญ์ƒ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” `useLocation`, `useMutation`)๋กœ ์ธํ•ด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ตœ์ ํ™”๋ฅผ ์šฐํšŒํ•˜๋Š” ๊ฒฝ์šฐ, ์ด ์ถฉ๋Œ์„ ๋””๋ฒ„๊น…ํ•˜๊ณ  ํ•ด๊ฒฐํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ํŒจํ„ด์€ ๋ฌด์—‡์ธ๊ฐ€? -- Puppeteer ๊ธฐ๋ฐ˜์˜ Automated Memory Testing์„ CI/CD ํŒŒ์ดํ”„๋ผ์ธ์— ํ†ตํ•ฉํ•˜์—ฌ, Detached DOM node๋‚˜ Event Listener ๋ˆ„์ ๊ณผ ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ํ”„๋กœ๋•์…˜ ๋ฐฐํฌ ์ „์— ์ฐจ๋‹จํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? -- Context API ์‚ฌ์šฉ ์‹œ ๋ฐœ์ƒํ•˜๋Š” ๊ด‘๋ฒ”์œ„ํ•œ ๋ฆฌ๋ Œ๋”๋ง ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Zustand์™€ ๊ฐ™์€ ์™ธ๋ถ€ ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ์˜ 'Selector' ํŒจํ„ด์„ ์‚ฌ์šฉํ•  ๋•Œ, ๋””๋ฒ„๊น… ๊ณผ์ •์—์„œ Redux DevTools ์—ฐ๋™์ด ์ œ๊ณตํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ์ด์ ์€ ๋ฌด์—‡์ธ๊ฐ€? - -### Practical Application Contexts - -- **Implementation:** React ์ปดํฌ๋„ŒํŠธ ๋งˆ์šดํŠธ ํ•ด์ œ ์‹œ `useEffect` ํด๋ฆฐ์—… ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ์ œ๊ฑฐํ•จ์œผ๋กœ์จ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ , ๋กœ์ปฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ `why-did-you-render` ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ์ฝ˜์†” ๊ฒฝ๊ณ ๋กœ ์กฐ๊ธฐ ๊ฐ์ง€ํ•œ๋‹ค [15, 39]. -- **System Design:** ์ดˆ๊ธฐ ํ”„๋ก ํŠธ์—”๋“œ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ ๋‹จ๊ณ„๋ถ€ํ„ฐ SigNoz(OpenTelemetry ๊ธฐ๋ฐ˜)๋‚˜ Sentry์™€ ๊ฐ™์€ ๋กœ๊น… ๋„๊ตฌ ๋„์ž…์„ ์ธํ”„๋ผ ๊ตฌ์„ฑ ์š”์†Œ๋กœ ๊ฒฐ์ •ํ•˜๊ณ , ์‚ฌ์šฉ์ž ์ •๋ณด ๋ณดํ˜ธ๋ฅผ ์œ„ํ•ด ์„ธ์…˜ ์บก์ฒ˜ ์‹œ ๋ฏผ๊ฐ ๋ฐ์ดํ„ฐ ๋งˆ์Šคํ‚น ์ •์ฑ…์„ ์‚ฌ์ „ ์„ค๊ณ„ํ•œ๋‹ค [21, 25, 26, 40]. -- **Operation / Maintenance:** ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ์•ฑ์ด ๋ฌด๊ฑฐ์›Œ์ง€๊ฑฐ๋‚˜ ๋А๋ ค์ง„๋‹ค๋Š” ์‚ฌ์šฉ์ž ์ œ๋ณด๊ฐ€ ๋“ค์–ด์˜ฌ ๊ฒฝ์šฐ, Chrome DevTools Memory ํŒจ๋„์˜ Heap Snapshot์„ ํ†ตํ•ด ๋ถ„๋ฆฌ๋œ DOM ๋…ธ๋“œ๊ฐ€ ์ ์ง„์ ์œผ๋กœ ๋ˆ„์ ๋˜๋Š”์ง€ ๊ฒ€์‚ฌํ•˜๊ณ  ์›์ธ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•œ๋‹ค [1, 9, 41]. -- **Learning Path:** ์šฐ์„  JavaScript ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ์˜ ๋™์ž‘ ์›๋ฆฌ์™€ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ํŒจํ„ด์„ ํ•™์Šตํ•œ ๋’ค, Chrome DevTools์˜ Task Manager์™€ Memory ํŒจ๋„ ์‚ฌ์šฉ๋ฒ•์„ ์ตํžˆ๊ณ , ์ตœ์ข…์ ์œผ๋กœ React Profiler์™€ ํ”„๋กœ๋•์…˜ ๋กœ๊น… ๋„๊ตฌ ํ™œ์šฉ๋ฒ•์œผ๋กœ ํ•™์Šต์„ ํ™•์žฅํ•œ๋‹ค. -- **My Project Relevance:** ํ˜„์žฌ ์ง„ํ–‰ํ•˜๋Š” React ๊ธฐ๋ฐ˜ ๋Œ€์‹œ๋ณด๋“œ ํ”„๋กœ์ ํŠธ์—์„œ ํ…Œ์ด๋ธ” ๋ฐ์ดํ„ฐ๋‚˜ ์ฐจํŠธ ์—…๋ฐ์ดํŠธ ์‹œ ํ™”๋ฉด ๋ฉˆ์ถค์ด ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ, Chrome DevTools Performance ํƒญ์„ ํ†ตํ•ด ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰ ์‹œ๊ฐ„์„ ํ™•์ธํ•˜๊ณ  React Profiler๋ฅผ ๋ถ™์—ฌ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ฆฌ๋ Œ๋”๋ง๋˜๋Š” ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‹๋ณ„, `React.memo` ๋˜๋Š” ์‹๋ณ„์ž(Key)๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ์ตœ์ ํ™” ์ž‘์—…์— ์ง์ ‘ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. - -### Adjacent Topics - -- [[Core Web Vitals]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ํ”„๋ก ํŠธ์—”๋“œ ์„ฑ๋Šฅ ์ตœ์ ํ™”์™€ ๋””๋ฒ„๊น…์˜ ๊ถ๊ทน์ ์ธ ์„ฑ๊ณผ ์ง€ํ‘œ์ด์ž ๊ธฐ์ค€์ ์ด ๋˜๋Š” ์‹ค์ œ ์‚ฌ์šฉ์ž ์ฒด๊ฐ ์†๋„ ์ง€ํ‘œ(LCP, FID, INP, CLS ๋“ฑ) ์‹ฌ์ธต ํƒ๊ตฌ [8]. -- [[React Server Components (RSC)]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: Next.js ํ™˜๊ฒฝ์—์„œ ํด๋ผ์ด์–ธํŠธ ์ธก ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ ์ž์ฒด๋ฅผ ์ค„์ด๊ณ  ์ƒํ˜ธ์ž‘์šฉ ์—†๋Š” UI๋ฅผ ์„œ๋ฒ„์—์„œ ๋ Œ๋”๋งํ•จ์œผ๋กœ์จ ๊ทผ๋ณธ์ ์ธ ํด๋ผ์ด์–ธํŠธ ๋””๋ฒ„๊น… ์š”์†Œ ๋ฐ ๋ฆฌ๋ Œ๋”๋ง ๋น„์šฉ์„ ์ œ๊ฑฐํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜ [42, 43]. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Frontend Scalable Architecture.md b/00_Raw/Frontend Scalable Architecture.md deleted file mode 100644 index 561d0034..00000000 --- a/00_Raw/Frontend Scalable Architecture.md +++ /dev/null @@ -1,75 +0,0 @@ -# [[Frontend Scalable Architecture]] - -## ๐Ÿ“Œ Brief Summary -ํ”„๋ก ํŠธ์—”๋“œ ํ™•์žฅ ๊ฐ€๋Šฅ ์•„ํ‚คํ…์ฒ˜(Frontend Scalable Architecture)๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ UI ์ปดํฌ๋„ŒํŠธ์˜ ๊ฒฐํ•ฉ์„ ๋ฐฉ์ง€ํ•˜๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ์žฅ์„ ์•ˆ์ „ํ•˜๊ฒŒ ๋„๋ชจํ•˜๋Š” ๊ตฌ์กฐ์  ๋ฐฉ๋ฒ•๋ก ์ด๋‹ค [1]. ๋‹จ์ˆœํ•œ ๋ Œ๋”๋ง ์†๋„ ์ตœ์ ํ™”๋ฅผ ๋„˜์–ด ์ƒํƒœ ์†Œ์œ ๊ถŒ ๋ช…ํ™•ํ™”, ๋ช…์‹œ์  ์˜์กด์„ฑ ๊ด€๋ฆฌ, ๊ธฐ๋Šฅ(Feature) ์ค‘์‹ฌ์˜ ๋ชจ๋“ˆํ™”๋ฅผ ํ†ตํ•ด ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ํ™•์žฅ์„ ๋ชฉํ‘œ๋กœ ํ•œ๋‹ค [1, 2]. ํ˜„๋Œ€์ ์ธ ์•„ํ‚คํ…์ฒ˜๋Š” Feature-Sliced Design(FSD)๊ณผ ๊ฐ™์€ ๊ณ„์ธต์  ๋ชจ๋ธ์„ ๋„์ž…ํ•˜์—ฌ ํŒ€ ๊ฐ„ ํ˜‘์—… ํšจ์œจ์„ ๋†’์ด๊ณ  ์žฅ๊ธฐ์ ์ธ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•œ๋‹ค [3]. - -## ๐Ÿ“– Core Content -- **๊ธฐ๋Šฅ(Feature) ๊ธฐ๋ฐ˜ ์กฐ์ง๊ณผ FSD (Feature-Sliced Design):** - ๊ณผ๊ฑฐ์˜ ๊ธฐ์ˆ  ํŒŒ์ผ ํƒ€์ž…(์ปดํฌ๋„ŒํŠธ, ํ›…, ์Šคํƒ€์ผ ๋“ฑ) ๊ธฐ์ค€ ํด๋” ๊ตฌ์กฐ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ปค์งˆ์ˆ˜๋ก ํƒ์ƒ‰๊ณผ ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ ๋‹ค [4, 5]. 2025๋…„ ๊ธฐ์ค€ ํ‘œ์ค€์€ ๋น„์ฆˆ๋‹ˆ์Šค ๊ธฐ๋Šฅ(๋„๋ฉ”์ธ)์„ ์ค‘์‹ฌ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์ด๋‹ค [6]. ํŠนํžˆ FSD๋Š” ์•ฑ์„ 7๊ฐœ์˜ ๊ณ„์ธต(`shared`, `entities`, `features`, `widgets`, `pages`, `app`)์œผ๋กœ ๋‚˜๋ˆ„์–ด ์ƒ์œ„ ๊ณ„์ธต์ด ํ•˜์œ„ ๊ณ„์ธต์—๋งŒ ์˜์กดํ•˜๊ฒŒ ํ•˜๋Š” **๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ**์„ ๊ฐ•์ œํ•œ๋‹ค [7]. ๋˜ํ•œ `index.ts`๋ฅผ ์œ ์ผํ•œ ์ง„์ž…์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” Public API ๊ทœ์น™์„ ํ†ตํ•ด ๋‚ด๋ถ€ ๋กœ์ง์„ ์บก์Аํ™”ํ•œ๋‹ค [8, 9]. - -- **SOLID ๋ฐ ํด๋ฆฐ ์ฝ”๋“œ ์›์น™์˜ ์ ์šฉ:** - React ์ปดํฌ๋„ŒํŠธ ๊ฐœ๋ฐœ ์‹œ ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)์„ ์ ์šฉํ•˜์—ฌ ์—ญํ• ์ด ๋งŽ์€ ๋Œ€ํ˜• ์ปดํฌ๋„ŒํŠธ(์˜ˆ: 300์ค„ ์ด์ƒ)๋ฅผ ์ž‘๊ณ  ์ง‘์ค‘๋œ ํ˜•ํƒœ์˜ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ถ„๋ฆฌํ•œ๋‹ค [10]. ๊ฐœ๋ฐฉ-ํ์‡„ ์›์น™(OCP)์€ `children`์ด๋‚˜ `render props`๋ฅผ ํ†ตํ•œ ํ•ฉ์„ฑ์œผ๋กœ ๊ตฌํ˜„ํ•˜๋ฉฐ, ์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›์น™(ISP)์„ ํ†ตํ•ด ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฑฐ๋Œ€ํ•œ Props ๊ฐ์ฒด ์ „๋‹ฌ์„ ๋ฐฉ์ง€ํ•˜์—ฌ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ˜๋‹ค [11]. ๋˜ํ•œ DRY(์ค‘๋ณต ๋ฐฉ์ง€) ์›์น™๊ณผ KISS(๋‹จ์ˆœ์„ฑ ์œ ์ง€) ์›์น™ ๊ฐ„์˜ ๊ท ํ˜•์„ ์žก์•„ ๊ณผ๋„ํ•œ ์ถ”์ƒํ™”๋ฅผ ๋ฐฉ์ง€ํ•œ๋‹ค [12]. - -- **ํŒŒํŽธํ™” ๋ฐ ์ „๋ฌธํ™”๋œ ์ƒํƒœ ๊ด€๋ฆฌ:** - ๊ฑฐ๋Œ€ํ•œ ๋‹จ์ผ ์Šคํ† ์–ด ๋ฐฉ์‹์—์„œ ๋ฒ—์–ด๋‚˜ ์ƒํƒœ ํŠน์„ฑ์— ๋งž๋Š” ๋„๊ตฌ๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ์„ ํƒํ•œ๋‹ค. ๋กœ์ปฌ ์ƒํƒœ๋Š” `useState`๋ฅผ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์—ญ ์ƒํƒœ๋Š” ๋ Œ๋”๋ง ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด Context API ๋Œ€์‹  `Zustand`๋‚˜ `Jotai`๋ฅผ ํ™œ์šฉํ•˜๋ฉฐ, ์„œ๋ฒ„ ์ƒํƒœ(์บ์‹œ, ๋„คํŠธ์›Œํฌ ๋™๊ธฐํ™”)๋Š” `TanStack Query`๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ API ๋„คํŠธ์›Œํฌ ๊ณ„์ธต๊ณผ UI๋ฅผ ๋ถ„๋ฆฌํ•œ๋‹ค [13-16]. - -- **๋นŒ๋“œ ํƒ€์ž„ ์„ฑ๋Šฅ ๋ฐ ๋ฒˆ๋“ค๋ง ์ตœ์ ํ™”:** - Vite๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœ ์ค‘์—๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ES ๋ชจ๋“ˆ์„ ์ œ๊ณตํ•ด ์ฆ‰๊ฐ์ ์ธ ๋ฐ˜์˜์„ ์–ป๊ณ , ํ”„๋กœ๋•์…˜์—์„œ๋Š” Rollup์„ ํ†ตํ•œ `manualChunks` ์„ค์ •๊ณผ `React.lazy`๋ฅผ ํ™œ์šฉํ•ด ๊ฒฝ๋กœ(Route) ์ˆ˜์ค€์˜ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…์„ ์ ์šฉํ•œ๋‹ค [17-20]. ํŠนํžˆ 2025๋…„์— ์•ˆ์ •ํ™”๋œ React Compiler๋Š” ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง ๋ฐฉ์ง€๋ฅผ ์œ„ํ•œ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ๋นŒ๋“œ ํƒ€์ž„์— ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์ฃผ์–ด ์ˆ˜๋™ ์ตœ์ ํ™”(`useMemo`, `useCallback`)๋กœ ์ธํ•œ ์ฝ”๋“œ ๋ณต์žก๋„๋ฅผ ํš๊ธฐ์ ์œผ๋กœ ์ค„์—ฌ์ค€๋‹ค [18, 21, 22]. - -- **์•ˆ์ •์„ฑ ๋ฐ ์˜ค๋ฅ˜ ๋ณต๊ตฌ ์ธํ”„๋ผ:** - ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ผ๋ถ€๊ฐ€ ์‹คํŒจํ•˜๋”๋ผ๋„ ์ „์ฒด๊ฐ€ ๋ฉˆ์ถ”์ง€ ์•Š๋„๋ก React Error Boundaries๋ฅผ ๋ถˆ์•ˆ์ •ํ•œ UI ์„น์…˜์— ์ „๋žต์ ์œผ๋กœ ๋ฐฐ์น˜ํ•œ๋‹ค [23, 24]. ํ”„๋กœ๋•์…˜ ๋‹จ๊ณ„์—์„œ๋Š” Sentry, LogRocket ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜, ๋ถ„๋ฆฌ๋œ DOM ๋…ธ๋“œ ํŒŒ์•…, ์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด๋ฅผ ํ†ตํ•œ ์—๋Ÿฌ ๋ชจ๋‹ˆํ„ฐ๋ง ์ฒด๊ณ„๋ฅผ ๊ตฌ์ถ•ํ•œ๋‹ค [25-27]. - -## โš–๏ธ Trade-offs & Caveats -- **์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ์˜ ์„ ํƒ (Context vs Zustand vs Redux):** Context API๋Š” ๊ธฐ๋ณธ ๋‚ด์žฅ ๋„๊ตฌ๋ผ๋Š” ์žฅ์ ์ด ์žˆ์œผ๋‚˜, ์ƒํƒœ ๊ฐ’์˜ ์ผ๋ถ€๋งŒ ๋ณ€๊ฒฝ๋˜์–ด๋„ ํ•ด๋‹น ์ปจํ…์ŠคํŠธ๋ฅผ ๊ตฌ๋…ํ•˜๋Š” ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง๋˜๋Š” ์น˜๋ช…์ ์ธ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์œ ๋ฐœํ•œ๋‹ค [28, 29]. ๋ฐ˜๋ฉด Zustand๋Š” ์„ ํƒ์ž(Selector) ํŒจํ„ด์œผ๋กœ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ๊ตฌ์กฐ๊ฐ€ ๊ฐ€๋ณ์ง€๋งŒ, ๋„ˆ๋ฌด ์œ ์—ฐํ•˜์—ฌ ํŒ€ ๋‚ด ๊ทœ์น™์ด ๋ถ€์žฌํ•  ๊ฒฝ์šฐ ์ „์—ญ ์ƒํƒœ์™€ ๋น„๋™๊ธฐ ๋กœ์ง์ด ์ค‘๊ตฌ๋‚œ๋ฐฉ์ด ๋˜๋Š” ๋ถ€์ž‘์šฉ(Store Soup)์„ ๋‚ณ์„ ์ˆ˜ ์žˆ๋‹ค [30-32]. Redux๋Š” ์—„๊ฒฉํ•œ ํŒจํ„ด์„ ์ œ๊ณตํ•˜์—ฌ ๋Œ€๊ทœ๋ชจ ํŒ€์— ์•ˆ์ •์ ์ด๋‚˜, ๊ณผ๋„ํ•œ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ๋กœ ์ดˆ๊ธฐ ๊ฐœ๋ฐœ๊ณผ MVP ๊ตฌํ˜„ ์†๋„๋ฅผ ํฌ๊ฒŒ ๋Šฆ์ถ˜๋‹ค [33, 34]. -- **์„ฑ๋Šฅ ์ตœ์ ํ™”์˜ ํ•จ์ •:** `React.memo`๋‚˜ `useCallback`์„ ๋ฌด๋ถ„๋ณ„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ํŒ๋‹จํ•˜๋Š” ์–•์€ ๋น„๊ต ์ฒ˜๋ฆฌ์— ๋น„์šฉ์ด ๋” ๋ฐœ์ƒํ•ด ์˜คํžˆ๋ ค ์„ฑ๋Šฅ์„ ์•…ํ™”์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค [35, 36]. -- **FSD ์•„ํ‚คํ…์ฒ˜์˜ ์˜ค๋ฒ„ํ—ค๋“œ:** Feature-Sliced Design์€ ๋ช…ํ™•ํ•œ ์บก์Аํ™”์™€ ๋ถ„๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ œ๊ณตํ•˜์ง€๋งŒ, ํŠน์ • ๋ชจ๋“ˆ์ด 'feature'์ธ์ง€ 'widget'์ธ์ง€ ๊ฒฝ๊ณ„๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ธฐ ๋ชจํ˜ธํ•œ ์ƒํ™ฉ ๋“ฑ ์‹œ๋งจํ‹ฑ ๊ฒฐ์ •์„ ์œ„ํ•œ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉฐ, ์ƒˆ๋กœ์šด ํŒ€์›์—๊ฒŒ๋Š” ๊ฐ€ํŒŒ๋ฅธ ํ•™์Šต ๊ณก์„ ์œผ๋กœ ์ž‘์šฉํ•œ๋‹ค [37, 38]. -- **๋งˆ์ดํฌ๋กœ ํ”„๋ก ํŠธ์—”๋“œ(Micro-Frontends):** ์กฐ์ง์ ์ธ ํ™•์žฅ์„ฑ์„ ํ•ด๊ฒฐํ•˜๊ณ  ๋…๋ฆฝ์ ์ธ ๋ฐฐํฌ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜์ง€๋งŒ, ๋Ÿฐํƒ€์ž„ ํ†ตํ•ฉ์˜ ๋ณต์žก์„ฑ, ์„ฑ๋Šฅ ์˜ค๋ฒ„ํ—ค๋“œ ์ฆ๊ฐ€, ํŒŒํŽธํ™”๋œ ๊ฐœ๋ฐœ์ž ๊ฒฝํ—˜์„ ์ดˆ๋ž˜ํ•˜๋ฏ€๋กœ ๊ธฐ๋ณธ ์•„ํ‚คํ…์ฒ˜๋ผ๊ธฐ๋ณด๋‹ค๋Š” ์ตœํ›„์˜ ์ˆ˜๋‹จ์œผ๋กœ ๊ฐ„์ฃผํ•ด์•ผ ํ•œ๋‹ค [3]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -#### [์•„ํ‚คํ…์ฒ˜ ๋ฐ ๋ฐฉ๋ฒ•๋ก ] -- [[Feature-Sliced Design]] - - ์—ฐ๊ฒฐ ์ด์œ : ๋Œ€๊ทœ๋ชจ ํ”„๋ก ํŠธ์—”๋“œ ์•ฑ์˜ ๊ตฌ์กฐ๋ฅผ ๊ธฐ์ˆ  ๊ณ„์ธต์ด ์•„๋‹Œ ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ(๊ธฐ๋Šฅ) ์ค‘์‹ฌ์œผ๋กœ ๋‚˜๋ˆ„๊ณ , ์—„๊ฒฉํ•œ ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ์ œ๊ณตํ•˜๋Š” ํ•ต์‹ฌ ์•„ํ‚คํ…์ฒ˜์ด๊ธฐ ๋•Œ๋ฌธ [3, 7]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํด๋” ๊ตฌ์กฐํ™”, ์บก์Аํ™”๋ฅผ ์œ„ํ•œ Public API ์ œ์–ด ์ „๋žต, ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ์„ ํ†ตํ•œ ๊ฒฐํ•ฉ๋„ ๊ฐ์†Œ ์›๋ฆฌ [7, 8]. -- [[SOLID Principles in React]] - - ์—ฐ๊ฒฐ ์ด์œ : ํ™•์žฅ์„ฑ ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ์™€ ํ›… ์„ค๊ณ„๋ฅผ ์œ„ํ•œ ๊ทผ๋ณธ์ ์ธ ์†Œํ”„ํŠธ์›จ์–ด ์—”์ง€๋‹ˆ์–ด๋ง ๊ฐ€์ด๋“œ๋ผ์ธ์ด๊ธฐ ๋•Œ๋ฌธ [9]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: SRP(๋‹จ์ผ ์ฑ…์ž„ ์›์น™)์™€ ISP(์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›์น™)๋ฅผ ํ™œ์šฉํ•ด ๊ฒฐํ•ฉ๋„๋Š” ๋‚ฎ์ถ”๊ณ  ์‘์ง‘๋„๋Š” ๋†’์€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ถ„๋ฆฌํ•ด๋‚ด๋Š” ์‹ค๋ฌด์  ๊ธฐ๋ฒ• [10, 11]. - -#### [์ƒํƒœ ๊ด€๋ฆฌ ๋ฐ ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋„๊ตฌ] -- [[Zustand]] - - ์—ฐ๊ฒฐ ์ด์œ : Context API์˜ '๋ฆฌ๋ Œ๋”๋ง ํญํฌ' ํ•œ๊ณ„๋ฅผ ๊ทน๋ณตํ•˜๊ณ  Redux์˜ ๋ณต์žก์„ฑ์„ ํ”ผํ•˜๋ฉด์„œ ์ „์—ญ ์ƒํƒœ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ์Šค์ผ€์ผ๋งํ•˜๋Š” ๋Œ€์•ˆ์ด๊ธฐ ๋•Œ๋ฌธ [29, 32]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Selector ํŒจํ„ด์ด ์ปดํฌ๋„ŒํŠธ์˜ ํŠน์ • ์ƒํƒœ ๊ตฌ๋…์„ ์ œ์–ดํ•˜์—ฌ ์–ด๋–ป๊ฒŒ ๋ Œ๋”๋ง ์ตœ์ ํ™”๋ฅผ ๋‹ฌ์„ฑํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜ [32]. -- [[React Compiler]] - - ์—ฐ๊ฒฐ ์ด์œ : 2025๋…„ ๊ธฐ์ค€ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ˆ˜๋™์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋˜ ๋ฉ”๋ชจ์ด์ œ์ด์…˜(`useMemo`, `useCallback` ๋“ฑ) ์ž‘์—…์„ ๋นŒ๋“œ ํƒ€์ž„์— ์ž๋™ํ™”ํ•˜์—ฌ ์ฝ”๋“œ ๋ณต์žก๋„๋ฅผ ํš๊ธฐ์ ์œผ๋กœ ๋‚ฎ์ถฐ์ฃผ๋Š” ๋„๊ตฌ์ด๊ธฐ ๋•Œ๋ฌธ [21, 22]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ฐœ๋ณ„ JSX ์š”์†Œ์˜ ์„ธ๋ฐ€ํ•œ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ์ž‘๋™ ๋ฐฉ์‹๊ณผ ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€์‘ํ•˜๊ธฐ ์œ„ํ•œ ์ตœ์ ํ™” ์ œ์•ฝ ์กฐ๊ฑด [39, 40]. -- [[React Error Boundaries]] - - ์—ฐ๊ฒฐ ์ด์œ : ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํŠน์ • ํ•˜์œ„ ๋ชจ๋“ˆ์ด๋‚˜ ์ปดํฌ๋„ŒํŠธ์˜ ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜๊ฐ€ ์ „์ฒด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํฌ๋ž˜์‹œ๋กœ ์ด์–ด์ง€๋Š” ๊ฒƒ์„ ๋ง‰๋Š” ํ•ต์‹ฌ ์•ˆ์ •ํ™” ์žฅ์น˜์ด๊ธฐ ๋•Œ๋ฌธ [23, 24]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์—๋Ÿฌ์˜ ์„ ์–ธ์  ๊ฒฉ๋ฆฌ์™€ Fallback UI ์ œ๊ณต์„ ํ†ตํ•ด ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์˜ UX์™€ ํšŒ๋ณต๋ ฅ์„ ๊ฐ•ํ™”ํ•˜๋Š” ๋ฐฉ์‹ [41, 42]. - -### Deeper Research Questions - -- Feature-Sliced Design(FSD)์—์„œ Cross-cutting concern(๊ต์ฐจ ๊ด€์‹ฌ์‚ฌ)์„ ์™„๋ฒฝํžˆ ๊ฒฉ๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ํ˜„์‹ค์ ์œผ๋กœ ์–ด๋ ค์šด ์ด์œ ๋Š” ๋ฌด์—‡์ด๋ฉฐ, ์ด๋ฅผ ์ƒ์œ„ ๊ณ„์ธต์—์„œ ์–ด๋–ป๊ฒŒ ์ปดํฌ์ง€์…˜(Composition)์œผ๋กœ ํ•ด๊ฒฐํ•ด์•ผ ํ•˜๋Š”๊ฐ€? -- React Compiler๊ฐ€ ๋นŒ๋“œ ํƒ€์ž„์— ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์ž๋™ํ™”ํ•จ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ , ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(์˜ˆ: TanStack Query ๋“ฑ)๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ถˆ์•ˆ์ •ํ•œ ์ฐธ์กฐ(Unstable References)๊ฐ€ ์žˆ์„ ๋•Œ ์™œ ์—ฌ์ „ํžˆ ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์ด ํ•„์š”ํ•œ๊ฐ€? -- Context API๊ฐ€ ์œ ๋ฐœํ•˜๋Š” '๋ฆฌ๋ Œ๋”๋ง ํญํฌ ํ˜„์ƒ'์„ ์šฐํšŒํ•˜๊ธฐ ์œ„ํ•ด ์„ค๊ณ„๋œ Zustand์˜ Selector ํŒจํ„ด์€ ๋‚ด๋ถ€์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ํ•„์š”ํ•œ ์ƒํƒœ ๋ณ€ํ™”๋งŒ ๊ฐ์ง€ํ•˜๊ณ  ์ปดํฌ๋„ŒํŠธ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š”๊ฐ€? -- Vite ํ™˜๊ฒฝ์—์„œ `manualChunks`์™€ `React.lazy`๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ๊ฑฐ๋Œ€ํ•œ ๋ฒˆ๋“ค(Large Chunks)์„ ๋ถ„๋ฆฌํ•ด ๋‚ผ ๋•Œ, ์ด๋Ÿฌํ•œ ์ „๋žต์ด Core Web Vitals(ํŠนํžˆ LCP ๋ฐ INP)์— ๋ฏธ์น˜๋Š” ์‹ค์ œ ๋ธŒ๋ผ์šฐ์ € ๋™์ž‘ ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ์–ด๋– ํ•œ๊ฐ€? -- ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋งˆ์ดํฌ๋กœ ํ”„๋ก ํŠธ์—”๋“œ(Micro-Frontends) ๋„์ž… ์‹œ ๋ฐœ์ƒํ•˜๋Š” ๋Ÿฐํƒ€์ž„ ํ†ตํ•ฉ์˜ ์„ฑ๋Šฅ ์˜ค๋ฒ„ํ—ค๋“œ๋Š” FSD์™€ ๊ฐ™์€ ๋ชจ๋†€๋ฆฌ์‹ ๋ชจ๋“ˆํ˜• ์•„ํ‚คํ…์ฒ˜์™€ ๋น„๊ตํ•˜์—ฌ ์–ด๋– ํ•œ ํ•œ๊ณ„๋ฅผ ๊ฐ€์ง€๋Š”๊ฐ€? - -### Practical Application Contexts - -- **Implementation:** ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ ๋‹จ์œ„๋กœ ํด๋”๋ฅผ ์ƒ์„ฑ(Feature ํด๋”)ํ•˜๋ฉฐ, 300์ค„์ด ๋„˜์–ด๊ฐ€๋Š” ์ปดํฌ๋„ŒํŠธ๋Š” ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)์— ๋”ฐ๋ผ ์ž‘์€ UI ์š”์†Œ์™€ ์ปค์Šคํ…€ ํ›…์œผ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ์ž‘์„ฑํ•œ๋‹ค [6, 10, 43]. -- **System Design:** ๋ชจ๋“ˆ ๊ฐ„ ๊ฒฐํ•ฉ๋„๋ฅผ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•ด ํ•˜์œ„ ๊ณ„์ธต(์˜ˆ: shared, entities)์—์„œ ์ƒ์œ„ ๊ณ„์ธต(์˜ˆ: features, pages)์„ ์ฐธ์กฐํ•˜์ง€ ๋ชปํ•˜๋„๋ก ESLint ๊ทœ์น™์œผ๋กœ ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ์„ ๊ฐ•์ œํ•˜๊ณ , ๊ฐ ํด๋”์˜ ์ ‘๊ทผ ์ฐฝ๊ตฌ๋ฅผ `index.ts`๋กœ ์บก์Аํ™”(Public API ๊ทœ์น™)ํ•˜์—ฌ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์„ค๊ณ„ํ•œ๋‹ค [7, 8, 44]. -- **Operation / Maintenance:** ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ Sentry๋ฅผ ํ†ตํ•ด Error Boundary๊ฐ€ ์žก์ง€ ๋ชปํ•œ ์—๋Ÿฌ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ , ํฌ๋กฌ DevTools์˜ ๋ฉ”๋ชจ๋ฆฌ ์Šค๋ƒ…์ƒท์ด๋‚˜ LogRocket๊ณผ ๊ฐ™์€ ๋””๋ฒ„๊น… ํˆด๋กœ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๋ฏธํ•ด์ œ์— ๋”ฐ๋ฅธ Detached DOM ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ์ง€์†์ ์œผ๋กœ ์ถ”์  ๋ฐ ์œ ์ง€๋ณด์ˆ˜ํ•œ๋‹ค [25-27]. -- **Learning Path:** React ์ฝ”์–ด ์›๋ฆฌ์™€ ์ƒํƒœ ๊ด€๋ฆฌ์˜ ํ•œ๊ณ„(Context API ๋ณ‘๋ชฉ ํ˜„์ƒ) ์ธ์ง€ โ†’ ํ™•์žฅ์„ฑ์„ ๊ณ ๋ คํ•œ ์•„ํ‚คํ…์ฒ˜ ์›์น™(FSD, SOLID) ํ•™์Šต โ†’ ๋„๋ฉ”์ธ ๋ถ„๋ฆฌ ๋„๊ตฌ ์ ์šฉ(Zustand, TanStack Query) โ†’ ์„ฑ๋Šฅ ๋ฐ ๋ฒˆ๋“ค๋ง ์ตœ์ ํ™”(React Compiler, Vite ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…) ์ˆœ์„œ๋กœ ํ•™์Šต ๋กœ๋“œ๋งต์„ ๊ตฌ์„ฑํ•œ๋‹ค [45]. -- **My Project Relevance:** ์†Œ์Šค์— ๊ด€๋ จ ์ •๋ณด๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. - -### Adjacent Topics - -- [[Core Web Vitals]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ํ”„๋ก ํŠธ์—”๋“œ ์•„ํ‚คํ…์ฒ˜์—์„œ์˜ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…๊ณผ ๋ฆฌ์†Œ์Šค ์ง€์—ฐ ๋กœ๋”ฉ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์ด ์‹ค์ œ ์‚ฌ์šฉ์ž ์ฒด๊ฐ ์†๋„(LCP, INP, CLS ๋“ฑ)์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ์ธก์ •ํ•˜๊ณ  ๋ฐ์ดํ„ฐ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ์ „๋žต์œผ๋กœ ํ™•์žฅ [17, 46]. -- [[Git Branching Workflow]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ์—„๊ฒฉํ•˜๊ฒŒ ๊ตฌ์กฐํ™”๋œ ๋Œ€ํ˜• ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ์—ฌ๋Ÿฌ ํŒ€์›๊ณผ ํ•จ๊ป˜ ์ถฉ๋Œ ์—†์ด ๊ฐœ๋ฐœํ•˜๊ธฐ ์œ„ํ•œ ๊นƒ ๋ธŒ๋žœ์นญ ์ „๋žต(GitHub Flow ์ ์šฉ ์—ฌ๋ถ€), Conventional Commits ์ž‘์„ฑ๋ฒ• ๋ฐ CI/CD ํ’ˆ์งˆ ๊ฒ€์ฆ ํŒŒ์ดํ”„๋ผ์ธ์œผ๋กœ ํ™•์žฅ [47, 48]. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Functional Components.md b/00_Raw/Functional Components.md deleted file mode 100644 index d4cdfc2e..00000000 --- a/00_Raw/Functional Components.md +++ /dev/null @@ -1,72 +0,0 @@ -# [[Functional Components]] - -## ๐Ÿ“Œ Brief Summary -Functional Components(ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ)๋Š” ๊ณผ๊ฑฐ ํด๋ž˜์Šค ๊ธฐ๋ฐ˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋Œ€์ฒดํ•˜์—ฌ ํ˜„๋Œ€ React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์˜ ํ‘œ์ค€์œผ๋กœ ์ž๋ฆฌ ์žก์€ ํ•ต์‹ฌ UI ์ž‘์„ฑ ๋‹จ์œ„์ž…๋‹ˆ๋‹ค [1, 2]. ์ž์ฒด์ ์œผ๋กœ ์ƒํƒœ(state)์™€ ๋ถ€์ˆ˜ ํšจ๊ณผ(side effect)๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด `useState`, `useEffect` ๋“ฑ์˜ React ํ›…(Hooks)๊ณผ ๊ฒฐํ•ฉํ•˜์—ฌ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค [3-5]. ๊ฐ•๋ ฅํ•˜๊ณ  ์œ ์—ฐํ•œ ๊ธฐ๋Šฅ์„ฑ์„ ์ œ๊ณตํ•˜์ง€๋งŒ, ์ž์ฒด์ ์œผ๋กœ Error Boundary(์—๋Ÿฌ ๊ฒฝ๊ณ„) ์—ญํ• ์„ ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๋ช…ํ™•ํ•œ ๊ตฌ์กฐ์  ์ œ์•ฝ๋„ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค [6, 7]. - -## ๐Ÿ“– Core Content - -* **ํ›…(Hooks)์„ ํ†ตํ•œ ์ƒํƒœ ๋ฐ ๋กœ์ง ๊ด€๋ฆฌ:** - ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋Š” `useState`, `useReducer`, `useEffect` ๋“ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒํƒœ ๊ด€๋ฆฌ์™€ ๋ถ€์ˆ˜ ํšจ๊ณผ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค [3-5]. ํ›…์€ ๋ฐ˜๋“œ์‹œ ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์˜ ์ตœ์ƒ๋‹จ์—์„œ๋งŒ ํ˜ธ์ถœ๋˜์–ด์•ผ ํ•˜๋ฉฐ ๋ฃจํ”„๋‚˜ ์กฐ๊ฑด๋ฌธ ๋‚ด์—์„œ ์‚ฌ์šฉ๋˜์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค [8]. -* **๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ํ˜„๋Œ€ํ™” ๊ธฐ์ค€:** - React ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•  ๋•Œ ํด๋ž˜์Šค ๊ธฐ๋ฐ˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์™€ ํ›…์œผ๋กœ ์ „ํ™˜ํ•˜๋Š” ๊ฒƒ์€ ๊ฐ€์žฅ ํšจ๊ณผ์ ์ธ ์•„ํ‚คํ…์ฒ˜ ๊ฐœ์„ (solid win)์œผ๋กœ ํ‰๊ฐ€๋ฐ›์Šต๋‹ˆ๋‹ค [2]. -* **์†Œํ”„ํŠธ์›จ์–ด ๊ณตํ•™ ์›์น™(SOLID & Clean Code)์˜ ์ ์šฉ:** - ํด๋ž˜์Šค์—์„œ ํ•จ์ˆ˜ํ˜•์œผ๋กœ ํ˜•ํƒœ๊ฐ€ ๋ณ€ํ–ˆ๋”๋ผ๋„ ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP) ๋“ฑ์€ ์—ฌ์ „ํžˆ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค [1]. ์ปดํฌ๋„ŒํŠธ๊ฐ€ 300์ค„ ์ด์ƒ ๊ธธ์–ด์ง€๊ฑฐ๋‚˜ ์ƒํƒœ ๊ด€๋ฆฌ, ๋ฐ์ดํ„ฐ ํŽ˜์นญ, UI ๋ Œ๋”๋ง ์ฑ…์ž„์„ ๋™์‹œ์— ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค๋ฉด, ์ฑ…์ž„์„ ๋ถ„๋ฆฌํ•˜์—ฌ ๋” ์ž‘์€ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋‚˜ ์ปค์Šคํ…€ ํ›…์œผ๋กœ ์ชผ๊ฐœ์•ผ ํ•ฉ๋‹ˆ๋‹ค [1, 9, 10]. ์ด๋Š” ์ฝ”๋“œ์˜ ๋ฐ˜๋ณต์„ ์ค„์ด๋Š” DRY ์›์น™๊ณผ ๋ณต์žก์„ฑ์„ ์ค„์ด๋Š” KISS ์›์น™์„ ๋‹ฌ์„ฑํ•˜๋Š” ๋ฐ ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค [11, 12]. -* **์ปดํฌ๋„ŒํŠธ์˜ ์ฐธ์กฐ(Reference) ๋™์ž‘ ๋ฐ ๋ Œ๋”๋ง ์ฃผ์˜์ :** - ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ JSX์˜ props๋กœ ์ธ๋ผ์ธ ์ต๋ช… ํ•จ์ˆ˜(`() => {...}`)๋ฅผ ์ง์ ‘ ๋„˜๊ธฐ๋Š” ๊ฒƒ์€ ์ง€์–‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [13, 14]. ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋Š” ๋ Œ๋”๋ง๋  ๋•Œ๋งˆ๋‹ค ๋‚ด๋ถ€์˜ ์ธ๋ผ์ธ ํ•จ์ˆ˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒˆ๋กœ ์ƒ์„ฑํ•˜๋ฏ€๋กœ, ์ž์‹ ์ปดํฌ๋„ŒํŠธ์— ์ƒˆ๋กœ์šด ์ฐธ์กฐ(Reference)๊ฐ€ ์ „๋‹ฌ๋˜์–ด ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ์œ ๋ฐœํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [14, 15]. - -## โš–๏ธ Trade-offs & Caveats - -* **Error Boundary๋กœ์จ์˜ ์‚ฌ์šฉ ๋ถˆ๊ฐ€ (์ œ์•ฝ ์‚ฌํ•ญ):** - ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์˜ ๊ฐ€์žฅ ํฐ ์ œ์•ฝ ์ค‘ ํ•˜๋‚˜๋Š” ์ž์ฒด์ ์œผ๋กœ Error Boundary(์—๋Ÿฌ ๊ฒฝ๊ณ„) ์—ญํ• ์„ ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ์ž์‹ ์ปดํฌ๋„ŒํŠธ์˜ ์—๋Ÿฌ๋ฅผ ์žก๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” `getDerivedStateFromError` ๋˜๋Š” `componentDidCatch` ์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ, ์—๋Ÿฌ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด์„œ๋Š” ์—ฌ์ „ํžˆ ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜๊ฑฐ๋‚˜ `react-error-boundary`์™€ ๊ฐ™์€ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ž˜ํผ(Wrapper)๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [6, 7]. -* **๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜์™€ ํด๋กœ์ €(Closure)๋กœ ์ธํ•œ ๋ถ€์ž‘์šฉ:** - ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์™€ ํ›…์„ ์‚ฌ์šฉํ•  ๋•Œ ํด๋กœ์ € ํŠน์„ฑ์œผ๋กœ ์ธํ•ด ์˜ค๋ž˜๋œ ๋ณ€์ˆ˜๋‚˜ ๊ฐ์ฒด๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ์œ ์ง€๋˜๋Š” 'Stale Closure' ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [16, 17]. ํŠนํžˆ `useEffect` ๋‚ด๋ถ€์—์„œ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ๊ตฌ๋…(subscribe)ํ•˜๊ณ  ์–ธ๋งˆ์šดํŠธ ์‹œ ํด๋ฆฐ์—…(cleanup) ํ•จ์ˆ˜๋กœ ์ œ๊ฑฐํ•˜์ง€ ์•Š์œผ๋ฉด ์‹ฌ๊ฐํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค [18-20]. -* **๊ณผ๋„ํ•œ ํ›… ์‚ฌ์šฉ์œผ๋กœ ์ธํ•œ ๋ณต์žก์„ฑ(Trade-off):** - ๋ฌด๋ถ„๋ณ„ํ•œ `useEffect` ์‚ฌ์šฉ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์žฆ์€ ๋ฆฌ๋ Œ๋”๋ง์„ ์œ ๋ฐœํ•˜์—ฌ ํผํฌ๋จผ์Šค๋ฅผ ํฌ๊ฒŒ ๋–จ์–ด๋œจ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [21]. ๋˜ํ•œ ์„ฑ๋Šฅ์„ ๋†’์ด๊ฒ ๋‹ค๊ณ  `useCallback`๊ณผ `useMemo`๋ฅผ ๋ชจ๋“  ๊ณณ์— ๋‚จ์šฉํ•˜๋Š” ๊ฒƒ์€ ์˜คํžˆ๋ ค ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๋น„๊ต์— ๋“œ๋Š” ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋” ์ปค์งˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, Chrome DevTools ๋ฐ React Profiler๋ฅผ ํ†ตํ•œ ์„ฑ๋Šฅ ์ธก์ •์ด ์„ ํ–‰๋œ ํ›„ ๊ผญ ํ•„์š”ํ•œ ๊ณณ์—๋งŒ ์ ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [22-24]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -#### [๊ด€๊ณ„ ์œ ํ˜• A: ์•„ํ‚คํ…์ฒ˜ ๋ฐ ํ•ต์‹ฌ ๊ธฐ์ˆ ] -- `[[React Hooks]]` - - ์—ฐ๊ฒฐ ์ด์œ : ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋‹จ์ˆœํ•œ UI ๋ Œ๋”๋ง ํ•จ์ˆ˜๋ฅผ ๋„˜์–ด ๋ผ์ดํ”„์‚ฌ์ดํด ๋ฐ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ๋Š” ํ•ต์‹ฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [3]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: `useState`์™€ `useEffect`๋ฅผ ํ†ตํ•œ ์ƒํƒœ ๋ฐ ๋ถ€์ˆ˜ ํšจ๊ณผ ๊ด€๋ฆฌ, ์˜์กด์„ฑ ๋ฐฐ์—ด(dependency array)์˜ ์˜ฌ๋ฐ”๋ฅธ ์‚ฌ์šฉ๋ฒ• ๋ฐ ๋ Œ๋”๋ง ์‚ฌ์ดํด [3, 4, 21]. - -- `[[SOLID Principles]]` - - ์—ฐ๊ฒฐ ์ด์œ : ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋ฅผ ์„ค๊ณ„ํ•˜๊ณ  ๋ฆฌํŒฉํ† ๋งํ•  ๋•Œ ์ฝ”๋“œ๋ฅผ ๋ชจ๋“ˆํ™”ํ•˜๋Š” ๊ธฐ์ค€์ (์˜ˆ: ๋‹จ์ผ ์ฑ…์ž„ ์›์น™)์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [1, 25]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ฑฐ๋Œ€ํ•œ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง(Custom Hooks)๊ณผ ์ˆœ์ˆ˜ UI ์ปดํฌ๋„ŒํŠธ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ํด๋ฆฐ ์ฝ”๋“œ(Clean Code) ํŒจํ„ด [1, 10, 11]. - -#### [๊ด€๊ณ„ ์œ ํ˜• B: ์ตœ์ ํ™” ๋ฐ ํ™œ์šฉ ๋„๊ตฌ] -- `[[Memoization (React.memo, useMemo, useCallback)]]` - - ์—ฐ๊ฒฐ ์ด์œ : ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋Š” ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง ์‹œ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•จ๊ป˜ ์žฌ์‹คํ–‰๋˜๋ฏ€๋กœ, ์ด๋ฅผ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•œ ์ˆ˜๋™ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์ด ํ•„์ˆ˜์ ์œผ๋กœ ์ˆ˜๋ฐ˜๋ฉ๋‹ˆ๋‹ค [26, 27]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํ•จ์ˆ˜์™€ ๊ฐ์ฒด์˜ ์ฐธ์กฐ ์•ˆ์ •์„ฑ(Reference Equality), ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง ์ฐจ๋‹จ ์›๋ฆฌ ๋ฐ ์ž˜๋ชป๋œ ์‚ฌ์šฉ์œผ๋กœ ์ธํ•œ ์˜ค๋ฒ„ํ—ค๋“œ ์œ„ํ—˜์„ฑ [14, 24, 28]. - -- `[[Error Boundaries]]` - - ์—ฐ๊ฒฐ ์ด์œ : ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์˜ ๋ช…ํ™•ํ•œ ๊ธฐ์ˆ ์  ํ•œ๊ณ„๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ธฐ๋Šฅ์œผ๋กœ, ๋ Œ๋”๋ง ์ค‘ ๋ฐœ์ƒํ•˜๋Š” ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜๋ฅผ ์šฐํšŒ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค [7, 29]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ๋ฅผ ๋ถ•๊ดด์‹œํ‚ค์ง€ ์•Š๊ณ , ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ ๋ถ€๋ถ„์ ์œผ๋กœ ํด๋ฐฑ(fallback) UI๋ฅผ ์ œ๊ณตํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์•ˆ์ •์„ฑ ํ™•๋ณด ๋ฐฉ๋ฒ• [30, 31]. - -### Deeper Research Questions - -- ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ ๋„์ž…์œผ๋กœ ์‚ฌ๋ผ์ง„ ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ์˜ ๋ผ์ดํ”„์‚ฌ์ดํด ๋ฉ”์„œ๋“œ(์˜ˆ: `componentDidMount`, `componentDidUpdate`)๋Š” `useEffect` ๋‚ด๋ถ€์—์„œ ๋‚ด๋ถ€์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ๋Œ€์ฒด๋˜๊ณ  ์Šค์ผ€์ค„๋ง๋˜๋Š”๊ฐ€? -- ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ ํด๋กœ์ €(Closure) ๋™์ž‘์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜์™€ 'Stale Closure' ๋ฌธ์ œ๋ฅผ Chrome DevTools (Memory Profiler)๋ฅผ ์‚ฌ์šฉํ•ด ์–ด๋–ป๊ฒŒ ์ถ”์ ํ•˜๊ณ  ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? -- ์ž๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์ง€์›ํ•˜๋Š” `React Compiler`์˜ ๋„์ž…์ด ์•ˆ์ •ํ™”๋  ๊ฒฝ์šฐ, ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ํŒจํ„ด(๊ธฐ์กด์˜ `useMemo`, `useCallback` ์˜์กด์„ฑ ํƒˆํ”ผ ๋“ฑ)์— ์–ด๋–ค ๊ทผ๋ณธ์ ์ธ ๋ณ€ํ™”๊ฐ€ ์ผ์–ด๋‚˜๋Š”๊ฐ€? -- ์™œ React ์•„ํ‚คํ…์ฒ˜ ์ƒ Error Boundary ๊ธฐ๋Šฅ์€ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์™€ ํ›…์œผ๋กœ ์›ํ˜• ๊ทธ๋Œ€๋กœ ๊ตฌํ˜„๋  ์ˆ˜ ์—†์œผ๋ฉฐ, ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ์˜ ์ƒ๋ช…์ฃผ๊ธฐ์—๋งŒ ์ข…์†๋˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ๋Š”๊ฐ€? -- ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์— ์˜์กด์„ฑ ์—ญ์ „ ์›์น™(DIP)๊ณผ ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)์„ ์ ์šฉํ•˜์—ฌ UI, ์„œ๋ฒ„ ์ƒํƒœ(TanStack Query), ์ „์—ญ ์ƒํƒœ(Zustand)๋ฅผ ์™„๋ฒฝํžˆ ๊ฒฉ๋ฆฌํ•˜๋Š” ๊ฐ€์žฅ ๋ชจ๋ฒ”์ ์ธ ์ฝ”๋“œ ๊ตฌ์กฐ๋Š” ๋ฌด์—‡์ธ๊ฐ€? - -### Practical Application Contexts - -- **Implementation:** ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฐฐ์ œํ•˜๊ณ  `useState`์™€ `useEffect`๋ฅผ ์‚ฌ์šฉํ•ด ์ตœ์‹  ๋ฆฌ์•กํŠธ ํ‘œ์ค€์— ๋งž์ถฐ ํ™”๋ฉด ๋‹จ์œ„์™€ UI ์š”์†Œ๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค [2, 3]. -- **System Design:** ๋กœ์ง๊ณผ ๋ทฐ์˜ ๊ฐ•๊ฒฐํ•ฉ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด, ๋ฐ์ดํ„ฐ ํŽ˜์นญ๊ณผ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์€ ๋ณ„๋„์˜ Custom Hook์ด๋‚˜ ์„œ๋น„์Šค ๊ณ„์ธต์œผ๋กœ ๋ถ„๋ฆฌํ•˜๊ณ  ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋Š” ์‹œ๊ฐ์  ๋ Œ๋”๋ง(Presentation) ๊ธฐ๋Šฅ๋งŒ ์ˆ˜ํ–‰ํ•˜๋„๋ก ์‹œ์Šคํ…œ์„ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค [9, 32]. -- **Operation / Maintenance:** ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ ์ต๋ช… ํ•จ์ˆ˜ ๋ฐ ์ธ๋ผ์ธ ๊ฐ์ฒด๊ฐ€ ๋‚จ์šฉ๋˜์ง€ ์•Š๋„๋ก ESLint(`eslint-plugin-react-hooks`) ๋ฐ `why-did-you-render` ๊ฐ™์€ ๋„๊ตฌ๋ฅผ CI/CD ํŒŒ์ดํ”„๋ผ์ธ์— ํ†ตํ•ฉํ•ด ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง ๋ˆ„์ˆ˜๋ฅผ ๋ง‰์Šต๋‹ˆ๋‹ค [33-35]. -- **Learning Path:** (๊ธฐ์ดˆ) JSX์™€ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์˜ ์ดํ•ด โž” (์ค‘๊ธ‰) React Hooks ๊ธฐ๋ฐ˜ ์ƒํƒœ/๋ผ์ดํ”„์‚ฌ์ดํด ์ œ์–ด ๋ฐ ์ปค์Šคํ…€ ํ›… ๋ถ„๋ฆฌ โž” (๊ณ ๊ธ‰) Memoization ๊ธฐ๋ฒ•, Closure ํ•จ์ • ๊ทน๋ณต ๋ฐ React Compiler ๋™์ž‘ ์›๋ฆฌ ํŒŒ์•… [3, 36-38]. -- **My Project Relevance:** ํ˜„์žฌ ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋กœ ์ด๋ฃจ์–ด์ง„ React ํ”„๋กœ์ ํŠธ๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•ด์•ผ ํ•  ๊ฒฝ์šฐ, ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ชจ๋‘ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋กœ ๋ณ€ํ™˜(Migration)ํ•˜๊ณ  ๋ถˆํ•„์š”ํ•œ ๋กœ์ง์„ ์ปค์Šคํ…€ ํ›…์œผ๋กœ ๋“ค์–ด๋‚ด์–ด ๊ฐ€๋…์„ฑ ๋ฐ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๋Š” ์ฒซ ๋ฒˆ์งธ ๋งˆ์ผ์Šคํ†ค์œผ๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2, 9, 39]. - -### Adjacent Topics - -- `[[React Compiler]]` - - ํ™•์žฅ ๋ฐฉํ–ฅ: ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ ์ˆ˜๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋˜ `useMemo`์™€ `useCallback`์˜ ๋ถˆํŽธํ•จ์„ ๋นŒ๋“œ ํƒ€์ž„์— ์ž๋™์œผ๋กœ ๋ถ„์„ํ•ด ์ตœ์ ํ™”(Auto-memoization)ํ•ด์ฃผ๋Š” ๋ฏธ๋ž˜์˜ React ์„ฑ๋Šฅ ๊ฐœ์„  ๋„๊ตฌ์˜ ์›๋ฆฌ ์ดํ•ด [37, 40]. -- `[[Feature-Sliced Design (FSD)]]` - - ํ™•์žฅ ๋ฐฉํ–ฅ: ์ˆ˜๋ฐฑ ๊ฐœ์˜ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์™€ ์ปค์Šคํ…€ ํ›…๋“ค์ด ์–ฝํžŒ ๊ฑฐ๋Œ€ํ•œ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ๋„๋ฉ”์ธ(Domain)๊ณผ ๊ธฐ๋Šฅ(Feature) ๋‹จ์œ„์˜ ๊ณ„์ธต ๊ตฌ์กฐ๋กœ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ชจ๋“ˆํ™”ํ•˜๋Š” ์Šค์ผ€์ผ๋ง ๋ฐฉ๋ฒ•๋ก  ํƒ๊ตฌ [41-43]. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Functional Programming in React.md b/00_Raw/Functional Programming in React.md deleted file mode 100644 index 14f6dac9..00000000 --- a/00_Raw/Functional Programming in React.md +++ /dev/null @@ -1,65 +0,0 @@ -# [[Functional Programming in React]] - -## ๐Ÿ“Œ Brief Summary -React์—์„œ์˜ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค(UI)๋ฅผ ์ƒํƒœ(State)์™€ ์†์„ฑ(Props)์˜ ์ˆœ์ˆ˜ ํ•จ์ˆ˜(Pure function)๋กœ ํ‘œํ˜„ํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜ ํŒจ๋Ÿฌ๋‹ค์ž„์ž…๋‹ˆ๋‹ค [1]. ํด๋ž˜์Šค ๊ธฐ๋ฐ˜ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฒ—์–ด๋‚˜ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์™€ Hooks๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ƒํƒœ ๋ฐ ๋ถ€์ž‘์šฉ(Side effects)์„ ๊ด€๋ฆฌํ•˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ์˜ ์˜ˆ์ธก ๊ฐ€๋Šฅ์„ฑ๊ณผ ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•ฉ๋‹ˆ๋‹ค [2, 3]. ๋ถˆ๋ณ€์„ฑ(Immutability)์„ ์œ ์ง€ํ•˜๊ณ  ๋ Œ๋”๋ง ์ค‘ ๋ถ€์ž‘์šฉ์„ ๋ฐฐ์ œํ•˜๋Š” ๊ฒƒ์ด ์ด ํŒจ๋Ÿฌ๋‹ค์ž„์ด ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜๊ธฐ ์œ„ํ•œ ํ•ต์‹ฌ ๊ทœ์น™์ž…๋‹ˆ๋‹ค [4]. - -## ๐Ÿ“– Core Content -* **์ˆœ์ˆ˜ ํ•จ์ˆ˜๋กœ์„œ์˜ UI (UI as Pure Functions):** - React์˜ JSX์™€ ์„ ์–ธ์  ๋ Œ๋”๋ง ๊ตฌ์กฐ๋Š” UI๋ฅผ ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ์˜ ๊ด€์ ์—์„œ ์ƒ๊ฐํ•˜๋„๋ก ๊ถŒ์žฅํ•˜๋ฉฐ, ๊ฐ ์ปดํฌ๋„ŒํŠธ๋Š” ์ƒํƒœ์™€ props๋ฅผ ๋ฐ›์•„ UI๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ˆœ์ˆ˜ ํ•จ์ˆ˜ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค [1]. ์ด๋Š” ์ฝ”๋“œ์˜ ์˜ˆ์ธก ๊ฐ€๋Šฅ์„ฑ์„ ๋†’์ด๊ณ  ํ…Œ์ŠคํŠธ๋ฅผ ์‰ฝ๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค [1]. -* **ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์™€ Hooks ํŒจ๋Ÿฌ๋‹ค์ž„:** - React ์ƒํƒœ๊ณ„๋Š” ๊ณผ๊ฑฐ์˜ ํด๋ž˜์Šค ๊ธฐ๋ฐ˜ ์„ค๊ณ„์—์„œ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ตฌ์กฐ๋กœ ์ „ํ™˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค [3]. ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ์ƒํƒœ(State)์™€ ๋ถ€์ž‘์šฉ์„ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•ด React Hooks(`useState`, `useEffect` ๋“ฑ)๊ฐ€ ๋„์ž…๋˜์—ˆ์œผ๋ฉฐ, ์ด๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ๋ Œ๋”๋ง์„ ๊น”๋”ํ•˜๊ฒŒ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฐ•๋ ฅํ•œ ์ˆ˜๋‹จ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [2, 5]. -* **๋ถˆ๋ณ€์„ฑ๊ณผ ๋ถ€์ž‘์šฉ ๊ฒฉ๋ฆฌ (Immutability & Side-effect Isolation):** - ํ•จ์ˆ˜ํ˜• React์˜ ๊ธฐ๋ณธ ๊ทœ์น™์€ ๋ Œ๋”๋ง ๊ณผ์ • ์ค‘ ๋ฐ์ดํ„ฐ์˜ ๋ถˆ๋ณ€์„ฑ์„ ์œ ์ง€ํ•˜๊ณ  ๋ถ€์ž‘์šฉ์„ ๋ฐฐ์ œํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค [4]. ๋ฐ์ดํ„ฐ ํ†ต์‹ ์ด๋‚˜ ๊ตฌ๋…๊ณผ ๊ฐ™์€ ๋ถ€์ž‘์šฉ์€ `useEffect` ํ›… ๋‚ด๋ถ€๋กœ ๋ช…์‹œ์ ์œผ๋กœ ๊ฒฉ๋ฆฌํ•˜์—ฌ, ๋ Œ๋”๋ง ์ž์ฒด๋Š” ์ˆœ์ˆ˜ํ•˜๊ฒŒ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [6, 7]. -* **๊ณ ์ฐจ ์ปดํฌ๋„ŒํŠธ (Higher-Order Components, HOC):** - ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๊ณ ์ฐจ ํ•จ์ˆ˜ ๊ฐœ๋…์„ ์ฐจ์šฉํ•œ ํŒจํ„ด์œผ๋กœ, ํ•˜๋‚˜์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ธ์ž๋กœ ๋ฐ›์•„ ์ถ”๊ฐ€์ ์ธ ๊ธฐ๋Šฅ์„ ๋ถ€์—ฌํ•œ ์ƒˆ๋กœ์šด ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค [8]. ์ด๋ฅผ ํ†ตํ•ด ์ปดํฌ๋„ŒํŠธ ๊ฐ„์˜ ๋กœ์ง์„ ํ•จ์ˆ˜ ์ˆ˜์ค€์—์„œ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [8]. - -## โš–๏ธ Trade-offs & Caveats -* **๋ Œ๋”๋ง ์ฃผ๊ธฐ์™€ ์ฐธ์กฐ ์•ˆ์ •์„ฑ(Reference Stability) ๋ฌธ์ œ:** ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋Š” ๋ Œ๋”๋ง ์‹œ๋งˆ๋‹ค ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ ๋ชจ๋“  ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜๋ฅผ ์ƒˆ๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค [9, 10]. JSX ๋‚ด๋ถ€์— ์ต๋ช… ํ•จ์ˆ˜๋‚˜ ์ธ๋ผ์ธ ๊ฐ์ฒด๋ฅผ ๋‚จ์šฉํ•˜๋ฉด, ์–•์€ ๋น„๊ต(Shallow comparison)๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž์‹ ์ปดํฌ๋„ŒํŠธ(`React.memo` ๋“ฑ)์— ๋งค๋ฒˆ ์ƒˆ๋กœ์šด ์ฐธ์กฐ๊ฐ€ ์ „๋‹ฌ๋˜์–ด ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ์œ ๋ฐœํ•˜๋Š” ๋ถ€์ž‘์šฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค [11, 12]. -* **์˜ค๋ž˜๋œ ํด๋กœ์ € (Stale Closures):** ํ•จ์ˆ˜ํ˜• ํŒจ๋Ÿฌ๋‹ค์ž„์—์„œ ๋น„๋™๊ธฐ ์ž‘์—… ๋“ฑ์„ ์ˆ˜ํ–‰ํ•  ๋•Œ, ํ•จ์ˆ˜๊ฐ€ ๊ณผ๊ฑฐ์˜ ๋ Œ๋”๋ง ์‹œ์ ์˜ ์ƒํƒœ๋ฅผ "๊ธฐ์–ต"ํ•˜๋Š” ํด๋กœ์ € ํŠน์„ฑ์œผ๋กœ ์ธํ•ด ์ตœ์‹  ์ƒํƒœ๊ฐ€ ๋ฐ˜์˜๋˜์ง€ ์•Š๋Š” ๋ฒ„๊ทธ(Stale Closures)๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค [13, 14]. -* **์ตœ์ ํ™” ๋„๊ตฌ์˜ ๋‚จ์šฉ (Overhead of Memoization):** ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง์„ ๋ง‰๊ธฐ ์œ„ํ•ด `useCallback`, `useMemo` ๋“ฑ์„ ๋ฌด๋ถ„๋ณ„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด, ์˜์กด์„ฑ ๋ฐฐ์—ด์„ ๋น„๊ตํ•˜๊ณ  ์บ์‹ฑํ•˜๋Š” ๋น„์šฉ์ด ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‹จ์ˆœํžˆ ๋‹ค์‹œ ๋ Œ๋”๋งํ•˜๋Š” ๋น„์šฉ๋ณด๋‹ค ์˜คํžˆ๋ ค ๋” ์ปค์ ธ ์„ฑ๋Šฅ์„ ์ €ํ•˜์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [12, 15]. -* **๋ถ€์ž‘์šฉ ์ •๋ฆฌ ๋ˆ„๋ฝ์œผ๋กœ ์ธํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜:** `useEffect` ๋‚ด๋ถ€์—์„œ ๋ฐœ์ƒํ•œ ๊ตฌ๋…(Subscription)์ด๋‚˜ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๋“ฑ์„ ๋ฐ˜ํ™˜(cleanup) ํ•จ์ˆ˜๋กœ ์ •๋ฆฌํ•˜์ง€ ์•Š์œผ๋ฉด, ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ธ๋งˆ์šดํŠธ๋œ ํ›„์—๋„ ์ฐธ์กฐ๊ฐ€ ๋‚จ์•„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ์„ ์ €ํ•˜์‹œํ‚ค๋Š” ์‹ฌ๊ฐํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ์ดˆ๋ž˜ํ•ฉ๋‹ˆ๋‹ค [7, 16, 17]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -#### [์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] -- [[Pure Function]] - - ์—ฐ๊ฒฐ ์ด์œ : React์˜ ๋ Œ๋”๋ง ์ฒ ํ•™์€ UI๋ฅผ ์ƒํƒœ์™€ Props์˜ ์ˆœ์ˆ˜ ํ•จ์ˆ˜๋กœ ์ทจ๊ธ‰ํ•˜๋Š” ๊ฒƒ์—์„œ ์ถœ๋ฐœํ•ฉ๋‹ˆ๋‹ค [1]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ž…๋ ฅ๊ฐ’์ด ๋™์ผํ•˜๋ฉด ํ•ญ์ƒ ๋™์ผํ•œ UI๋ฅผ ๋ Œ๋”๋งํ•ด์•ผ ํ•œ๋‹ค๋Š” ์›์น™๊ณผ React Compiler๊ฐ€ ์ž‘๋™ํ•˜๊ธฐ ์œ„ํ•œ ์ „์ œ ์กฐ๊ฑด [1, 4]. -- [[Immutability]] - - ์—ฐ๊ฒฐ ์ด์œ : React๊ฐ€ ์ปดํฌ๋„ŒํŠธ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ฐ์ง€(Diffing)ํ•˜๊ณ  ๋ Œ๋”๋ง ์ตœ์ ํ™”๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ํ•„์ˆ˜ ๊ทœ์น™์ž…๋‹ˆ๋‹ค [4, 18]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ƒํƒœ๋ฅผ ์ง์ ‘ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  ์ƒˆ๋กœ์šด ์ฐธ์กฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ๋งŒ `React.memo`์™€ ๊ฐ™์€ ์ตœ์ ํ™”๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™ํ•˜๋Š” ์›๋ฆฌ [11, 18]. - -#### [๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ] -- [[React Hooks]] - - ์—ฐ๊ฒฐ ์ด์œ : ์ˆœ์ˆ˜ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์— ์ƒํƒœ ์œ ์ง€์™€ ๋ถ€์ž‘์šฉ ์ฒ˜๋ฆฌ ๋Šฅ๋ ฅ์„ ๋ถ€์—ฌํ•˜๋Š” ํ•ต์‹ฌ ๊ตฌํ˜„์ฒด์ž…๋‹ˆ๋‹ค [2]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์˜์กด์„ฑ ๋ฐฐ์—ด(Dependency array)์˜ ๊ด€๋ฆฌ์™€ ํด๋กœ์ €(Closure)๋ฅผ ํ™œ์šฉํ•œ ์ƒํƒœ ์บก์ฒ˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜ [6, 19]. -- [[React Compiler]] - - ์—ฐ๊ฒฐ ์ด์œ : ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๊ฐ€ React์˜ ๊ทœ์น™(๋ถˆ๋ณ€์„ฑ, ๋ถ€์ž‘์šฉ ์—†์Œ)์„ ์ค€์ˆ˜ํ•  ๊ฒฝ์šฐ, ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ์—†์ด๋„ ๋นŒ๋“œ ํƒ€์ž„์— ์ž๋™์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ตœ์ ํ™”ํ•ด ์ฃผ๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค [4, 20, 21]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ Œ๋”๋ง ๊ฒฐ๊ณผ๋ฌผ์„ ์บ์‹ฑํ•˜์—ฌ ์ˆ˜๋™์œผ๋กœ `useMemo`๋‚˜ `useCallback`์„ ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š” ๋ถ€๋‹ด์„ ์ค„์ด๋Š” ๋ฐฉ์‹ [22, 23]. - -### Deeper Research Questions -- React ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์˜ ๋ Œ๋”๋ง ๋ถ€์ž‘์šฉ(side effects)๊ณผ ๋ถˆ๋ณ€์„ฑ(immutability)์„ ์–ด๋–ค ๋ฐฉ์‹์˜ ์ •์  ๋ถ„์„์„ ํ†ตํ•ด ๊ฒ€์ฆํ•˜๊ณ  ์ž๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์ˆ˜ํ–‰ํ•˜๋Š”๊ฐ€? -- ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์˜ ๋น„๋™๊ธฐ ์ž‘์—… ์ฒ˜๋ฆฌ ์‹œ ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ฐœ์ƒํ•˜๋Š” '์˜ค๋ž˜๋œ ํด๋กœ์ €(Stale Closures)' ๋ฌธ์ œ๋Š” ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ์˜ `this` ์ฐธ์กฐ ๋ฐฉ์‹๊ณผ ๋น„๊ตํ•˜์—ฌ ์–ด๋–ค ๊ตฌ์กฐ์  ์ฐจ์ด์—์„œ ๋น„๋กฏ๋˜๋Š”๊ฐ€? -- React์˜ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ ์ฐธ์กฐ ์•ˆ์ •์„ฑ(Reference Equality) ๊ฒฐ์—ฌ๊ฐ€ `React.memo`์˜ ์–•์€ ๋น„๊ต(Shallow comparison)์— ๋ฏธ์น˜๋Š” ๊ตฌ์ฒด์ ์ธ ์„ฑ๋Šฅ ์ €ํ•˜ ๊ณผ์ •์€ ๋ฌด์—‡์ธ๊ฐ€? -- ํ•จ์ˆ˜ํ˜• ๊ธฐ๋ฐ˜์˜ ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ Context API์™€ Zustand ๊ฐ™์€ ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ๋Š” ๋ฆฌ๋ Œ๋”๋ง ํ†ต์ œ(Selector ํŒจํ„ด ์œ ๋ฌด) ์ธก๋ฉด์—์„œ ์–ด๋–ค ์„ฑ๋Šฅ์  ์•„ํ‚คํ…์ฒ˜ ์ฐจ์ด๋ฅผ ๋ณด์ด๋Š”๊ฐ€? -- ์ปค์Šคํ…€ ํ›…(Custom Hooks)์œผ๋กœ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ถ”์ƒํ™”ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” DRY(Don't Repeat Yourself) ์›์น™๊ณผ KISS(Keep It Simple, Stupid) ์›์น™ ๊ฐ„์˜ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๋ฅผ ์–ด๋–ป๊ฒŒ ์กฐ์œจํ•ด์•ผ ํ•˜๋Š”๊ฐ€? - -### Practical Application Contexts -- **Implementation:** React ์ปดํฌ๋„ŒํŠธ๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)์„ ์ค€์ˆ˜ํ•˜์—ฌ 300์ค„ ์ด์ƒ์˜ ๊ฑฐ๋Œ€ํ•œ ํ•จ์ˆ˜๋ฅผ ์ž‘๊ณ  ์ˆœ์ˆ˜ํ•œ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ถ„๋ฆฌํ•˜๊ณ , ๋ถ€์ž‘์šฉ์€ `useEffect` ๋‚ด๋ถ€๋กœ ๋ช…์‹œ์ ์œผ๋กœ ๊ฒฉ๋ฆฌํ•˜์—ฌ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [3, 6, 24]. -- **System Design:** ๋กœ์ง๊ณผ UI ๋ Œ๋”๋ง ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋ถ„๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด, ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ ๋กœ์ง์€ 'Custom Hooks' ๋””๋ ‰ํ† ๋ฆฌ(์˜ˆ: `useAuth`, `useFetch`)์— ๋ชจ์œผ๊ณ  ์ˆœ์ˆ˜ UI๋Š” 'Components' ํด๋”๋กœ ๊ตฌ์กฐํ™”ํ•˜๋Š” ์„ค๊ณ„๋ฅผ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค [25, 26]. -- **Operation / Maintenance:** ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์šด์˜ ์‹œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ์˜์‹ฌ๋˜๋ฉด, Chrome DevTools์˜ Memory ํ”„๋กœํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ›… ์ •๋ฆฌ(cleanup) ๋ˆ„๋ฝ์œผ๋กœ ์ธํ•œ '๋ถ„๋ฆฌ๋œ DOM ๋…ธ๋“œ(Detached DOM Nodes)'๋‚˜ ๋‹ซํžŒ ํด๋กœ์ € ์ฐธ์กฐ๋ฅผ ์ถ”์ ํ•˜์—ฌ ์œ ์ง€๋ณด์ˆ˜ํ•ฉ๋‹ˆ๋‹ค [7, 17, 27]. -- **Learning Path:** ์šฐ์„  React Hooks์˜ ๊ธฐ๋ณธ ๊ทœ์น™๊ณผ ํ•จ์ˆ˜ ์ƒ๋ช…์ฃผ๊ธฐ(ํด๋กœ์ €, ์˜์กด์„ฑ ๋ฐฐ์—ด)๋ฅผ ์ˆ™์ง€ํ•œ ๋’ค, ๋ฉ”๋ชจ์ด์ œ์ด์…˜(`useMemo`, `React.memo`)์„ ํ†ตํ•œ ๋ Œ๋”๋ง ์ตœ์ ํ™” ๊ธฐ๋ฒ•์„ ๋ฐฐ์šฐ๊ณ , ์ดํ›„ ์ƒํƒœ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ(Zustand ๋“ฑ) ์„ค๊ณ„๋กœ ๋‚˜์•„๊ฐ€๋Š” ๊ฒฝ๋กœ๊ฐ€ ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค [2, 28, 29]. -- **My Project Relevance:** ์˜ค๋ž˜๋œ ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜ ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฅผ ๊ธฐ๋Šฅํ˜• ์ปดํฌ๋„ŒํŠธ์™€ ์ปค์Šคํ…€ ํ›…์œผ๋กœ ๋ฆฌํŒฉํ† ๋ง(Refactoring)ํ•˜์—ฌ ์ฝ”๋“œ ๊ฐ€๋…์„ฑ๊ณผ ๋ชจ๋“ˆ์„ฑ์„ ๊ฐœ์„ ํ•˜๊ณ , ๋กœ์ง ์ค‘๋ณต์„ ์ œ๊ฑฐ(DRY)ํ•˜๋Š” ์‹ค๋ฌด ๊ณผ์ •์— ์ง๊ฒฐ๋ฉ๋‹ˆ๋‹ค [5, 26]. - -### Adjacent Topics -- [[React Hooks Pitfalls]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ ์˜์กด์„ฑ ๋ฐฐ์—ด ๋ˆ„๋ฝ, ์ž˜๋ชป๋œ ์ƒํƒœ ์—…๋ฐ์ดํŠธ, ์ •๋ฆฌ(cleanup) ๋ˆ„๋ฝ ๋“ฑ Hooks๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋นˆ๋ฒˆํ•˜๊ฒŒ ๊ฒช๋Š” ์•ˆํ‹ฐํŒจํ„ด๊ณผ ๋ฐฉ์–ด์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ๋ฒ• ํƒ๊ตฌ [6, 7, 19]. -- [[React Performance Optimization]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ํ•จ์ˆ˜ํ˜• ์•„ํ‚คํ…์ฒ˜์—์„œ ๋นˆ๋ฒˆํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ง‰๊ธฐ ์œ„ํ•œ ์ง€์—ฐ ๋กœ๋”ฉ(`React.lazy`), ๊ฐ€์ƒํ™”(Virtualization), ๊ทธ๋ฆฌ๊ณ  ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์˜ ํ•œ๊ณ„ ๋ŒํŒŒ ์ „๋žต ์—ฐ๊ตฌ [30-32]. -- [[Feature-Sliced Design (FSD)]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋‹จ์ˆœํžˆ ๊ธฐ๋Šฅ์ (Functional)์œผ๋กœ ๋ถ„๋ฆฌ๋œ ์ปดํฌ๋„ŒํŠธ์™€ ํ›…๋“ค์„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ ๊ด€์ ์—์„œ ๊ณ„์ธต(Layers)๊ณผ ์Šฌ๋ผ์ด์Šค(Slices)๋กœ ๊ทœ๊ฒฉํ™”ํ•˜์—ฌ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์•„ํ‚คํ…์ฒ˜๋กœ ์กฐํ•ฉํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก  [33-35]. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/JSON-RPC 2.0.md b/00_Raw/JSON-RPC 2.0.md deleted file mode 100644 index 83c8ea59..00000000 --- a/00_Raw/JSON-RPC 2.0.md +++ /dev/null @@ -1,56 +0,0 @@ -# [[JSON-RPC 2.0]] - -## ๐Ÿ“Œ Brief Summary -JSON-RPC 2.0์€ AI ์—์ด์ „ํŠธ ํ•˜๋„ค์Šค ํ™˜๊ฒฝ์—์„œ ๋ชจ๋ธ(ํด๋ผ์ด์–ธํŠธ)๊ณผ ์™ธ๋ถ€ ๋„๊ตฌ ๋ฐ ๋ฆฌ์†Œ์Šค(์„œ๋ฒ„) ๊ฐ„์˜ ํ†ต์‹ ์„ ํ‘œ์ค€ํ™”ํ•˜๋Š” ๊ธฐ๋ฐ˜ ๋ฉ”์‹œ์ง• ๊ตํ™˜ ํ”„๋กœํ† ์ฝœ์ž…๋‹ˆ๋‹ค. ์ฃผ๋กœ MCP(Model Context Protocol) ๋ฐ ACP(Agent Client Protocol)์™€ ๊ฐ™์€ ์—์ด์ „ํŠธ ํ†ต์‹  ํ‘œ์ค€์˜ ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ ๊ณ„์ธต์„ ๊ตฌ์„ฑํ•˜์—ฌ ๋ฉ”์‹œ์ง€์˜ ๊ตฌ์กฐ์™€ ์˜๋ฏธ(Semantics)๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์š”์ฒญ(Request)๊ณผ ์‘๋‹ต(Response)์„ ๊ณ ์œ  ID๋กœ ์—ฐ๊ด€ ์ง“๊ณ , ์‘๋‹ต์„ ๊ธฐ๋Œ€ํ•˜์ง€ ์•Š๋Š” ๋‹จ๋ฐฉํ–ฅ ์•Œ๋ฆผ(Notification) ์ „์†ก์„ ์ง€์›ํ•˜์—ฌ ์—์ด์ „ํŠธ์™€ ์™ธ๋ถ€ ์‹œ์Šคํ…œ ๊ฐ„์˜ ๊ฒฐ์ •๋ก ์  ์ƒํ˜ธ์ž‘์šฉ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. - -## ๐Ÿ“– Core Content -* **๋ฐ์ดํ„ฐ ๊ณ„์ธต์˜ ๋ฉ”์‹œ์ง€ ๊ตฌ์กฐํ™”:** JSON-RPC 2.0์€ ์—์ด์ „ํŠธ ํ•˜๋„ค์Šค์™€ ์™ธ๋ถ€ ๋„๊ตฌ ๊ฐ„์˜ ํ†ต์‹ ์„ ์œ„ํ•œ ๋ฐ์ดํ„ฐ ๊ณ„์ธต(Data layer) ํ”„๋กœํ† ์ฝœ๋กœ ๊ธฐ๋Šฅํ•ฉ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๋Š” JSON-RPC 2.0 ํ˜•์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ์ ์ ˆํžˆ ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ๊ณ ์œ ํ•œ `id` ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์š”์ฒญ๊ณผ ์‘๋‹ต ๊ฐ„์˜ ์ƒํ˜ธ ์—ฐ๊ด€์„ฑ(correlation)์„ ๋ณด์žฅํ•˜๋ฉฐ, ํ†ต์‹ ์˜ ํƒ€์ž… ์•ˆ์ •์„ฑ(Type safety)๊ณผ ๋ช…ํ™•์„ฑ์„ ํ™•๋ณดํ•ฉ๋‹ˆ๋‹ค [1-4]. -* **์•Œ๋ฆผ(Notification) ์‹œ๋งจํ‹ฑ ์ง€์›:** ์‘๋‹ต์„ ์š”๊ตฌํ•˜์ง€ ์•Š๋Š” ๋‹จ๋ฐฉํ–ฅ ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋ฅผ ์œ„ํ•ด JSON-RPC 2.0์˜ ์•Œ๋ฆผ ๋ฉ”์‹œ์ง€๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ด ์•Œ๋ฆผ ๋ฉ”์‹œ์ง€์—๋Š” `id` ํ•„๋“œ๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ํŠน์ง•์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„๋Š” ๋„๊ตฌ ๋ชฉ๋ก์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด๋‚˜ ์‹ค์‹œ๊ฐ„ ๋™์  ์—…๋ฐ์ดํŠธ๋ฅผ ์—ฐ๊ฒฐ๋œ ํด๋ผ์ด์–ธํŠธ(AI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜)์— ์ฆ‰๊ฐ์ ์œผ๋กœ ํ†ต์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3, 5, 6]. -* **์ „์†ก ๊ณ„์ธต(Transport Layer)๊ณผ์˜ ๊ฒฐํ•ฉ:** JSON-RPC 2.0 ๋ฉ”์‹œ์ง€๋Š” ํ†ต์‹  ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ •์˜ํ•˜๋Š” ์ „์†ก ๊ณ„์ธต์„ ํ†ตํ•ด ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ์ฃผ๋กœ ๋กœ์ปฌ ํ”„๋กœ์„ธ์Šค ๊ฐ„ ์ง์ ‘ ํ†ต์‹ ์„ ์œ„ํ•ด ๋„คํŠธ์›Œํฌ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์—†๋Š” ํ‘œ์ค€ ์ž…์ถœ๋ ฅ(stdio)์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, ์›๊ฒฉ ์„œ๋ฒ„์™€์˜ ํ†ต์‹  ๋ฐ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆฌ๋ฐ์„ ์œ„ํ•ด Server-Sent Events(SSE)๊ฐ€ ๊ฒฐํ•ฉ๋œ HTTP POST๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ „์†ก๋ฉ๋‹ˆ๋‹ค [7]. -* **ํ•˜๋„ค์Šค ๋ฐ ์—์ด์ „ํŠธ ํ”„๋กœํ† ์ฝœ์˜ ํ‘œ์ค€ ๊ธฐ๋ฐ˜:** Anthropic์˜ MCP๋Š” Language Server Protocol(LSP)์˜ ๋ฉ”์‹œ์ง€ ํ๋ฆ„ ๊ฐœ๋…์„ ์žฌ์‚ฌ์šฉํ•˜๋ฉฐ JSON-RPC 2.0 ๊ธฐ๋ฐ˜ ์œ„์—์„œ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค [8]. ๋˜ํ•œ ์—์ด์ „ํŠธ์™€ IDE ํด๋ผ์ด์–ธํŠธ ๊ฐ„์˜ ํ†ต์‹ ์„ ํ‘œ์ค€ํ™”ํ•˜๋Š” ACP(Agent Client Protocol) ์—ญ์‹œ JSON-RPC 2.0์„ ์‚ฌ์šฉํ•˜๋ฉฐ, OpenAI์˜ Codex ํ•˜๋„ค์Šค๋Š” ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ ํ‘œ๋ฉด์— ์—์ด์ „ํŠธ ๋Ÿฐํƒ€์ž„์„ ๋…ธ์ถœํ•˜๊ธฐ ์œ„ํ•ด stdio ๊ธฐ๋ฐ˜์˜ JSON-RPC/JSONL ํ”„๋กœํ† ์ฝœ(Item/Turn/Thread ํ”„๋กœํ† ์ฝœ)์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค [9, 10]. - -## โš–๏ธ Trade-offs & Caveats -* **์ง€์—ฐ ์‹œ๊ฐ„๊ณผ ํ™•์žฅ์„ฑ์˜ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„:** JSON-RPC 2.0์„ stdio(ํ‘œ์ค€ ์ž…์ถœ๋ ฅ) ์ „์†ก๊ณผ ๊ฒฐํ•ฉํ•˜์—ฌ ๋กœ์ปฌ ๋„๊ตฌ๋ฅผ ํ˜ธ์ถœํ•  ๊ฒฝ์šฐ 2~15ms์˜ ๋งค์šฐ ๋‚ฎ์€ ์ง€์—ฐ ์‹œ๊ฐ„์œผ๋กœ ๋‹จ์ผ ํ•˜๋„ค์Šค ์—์ด์ „ํŠธ์˜ ๊ธด๋ฐ€ํ•œ ํ†ตํ•ฉ ๋ฃจํ”„์— ์ตœ์ ํ™”๋œ ์„ฑ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Š” ๋‹ค์ค‘ ํ…Œ๋„ŒํŠธ(Multi-tenant) ๋˜๋Š” ์›๊ฒฉ ํ™˜๊ฒฝ์œผ๋กœ ํ™•์žฅํ•  ๋•Œ ๋ถˆ๋ฆฌํ•˜๋ฉฐ, ์ด ๊ฒฝ์šฐ JSON-RPC๋ฅผ HTTP+SSE ์ „์†ก์œผ๋กœ ๋„˜๊ฒจ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋ฏ€๋กœ 50~200ms ์ด์ƒ์˜ ๋„คํŠธ์›Œํฌ ์ง€์—ฐ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [11, 12]. -* **ํ”„๋กœํ† ์ฝœ ์ž์ฒด์˜ ๋ณด์•ˆ ๋ฐ ์ƒํƒœ ๊ด€๋ฆฌ ํ•œ๊ณ„:** JSON-RPC 2.0 ํ”„๋กœํ† ์ฝœ ์ž์ฒด์—๋Š” ์ƒํƒœ ์ €์žฅ(Stateful) ์„ธ์…˜ ๊ด€๋ฆฌ ๊ธฐ๋Šฅ์ด๋‚˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์Šคํ‘ธํ•‘(Tool spoofing)์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋ณด์•ˆ ๋ชจ๋ธ์ด ๋‚ด์žฅ๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ JSON-RPC๋ฅผ ๋„์ž…ํ•˜๋Š” ์—์ด์ „ํŠธ ํ•˜๋„ค์Šค๋Š” ํ”„๋กœํ† ์ฝœ ๊ณ„์ธต์—๋งŒ ์˜์กดํ•ด์„œ๋Š” ์•ˆ ๋˜๋ฉฐ, ์•…์˜์ ์ธ ๋„๊ตฌ ์ฃผ์ž…์ด๋‚˜ ๊ถŒํ•œ ๋‚จ์šฉ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ํ•˜๋„ค์Šค์˜ ์ˆ˜๋ช…์ฃผ๊ธฐ ํ›…(Lifecycle Hooks, L-component)์„ ํ†ตํ•œ ๊ฐ•๋ ฅํ•œ ์‚ฌ์ „/์‚ฌํ›„ ๊ฒ€์ฆ ์ •์ฑ…์„ ์ถ”๊ฐ€๋กœ ์ง์ ‘ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [13-15]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -#### [๊ด€๊ณ„ ์œ ํ˜• A (์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ )] -* [[Model Context Protocol]] (MCP) - * ์—ฐ๊ฒฐ ์ด์œ : AI ์—์ด์ „ํŠธ์™€ ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ, ๋„๊ตฌ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฐœ๋ฐฉํ˜• ํ‘œ์ค€์œผ๋กœ JSON-RPC 2.0์„ ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ ํ†ต์‹  ํ”„๋กœํ† ์ฝœ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค [1, 3]. - * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: JSON-RPC 2.0์ด ์‹ค์ œ ์—์ด์ „ํŠธ ๋Ÿฐํƒ€์ž„์—์„œ ๋„๊ตฌ ํƒ์ƒ‰(Discovery), ์‹คํ–‰(Execution), ์ž์› ์ ‘๊ทผ์— ํ™œ์šฉ๋˜๋Š” ๊ตฌ์ฒด์ ์ธ ๋ฐ์ดํ„ฐ ๊ตํ™˜ ์Šคํ‚ค๋งˆ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -* [[Agent Client Protocol]] (ACP) - * ์—ฐ๊ฒฐ ์ด์œ : ์ฝ”๋”ฉ ์—์ด์ „ํŠธ์™€ IDE ๋“ฑ์˜ ํด๋ผ์ด์–ธํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐ„์˜ ํ†ตํ•ฉ์„ ํ‘œ์ค€ํ™”ํ•˜๊ธฐ ์œ„ํ•ด JSON-RPC 2.0์„ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœํ† ์ฝœ์ž…๋‹ˆ๋‹ค [9]. - * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์—์ด์ „ํŠธ ํ•˜๋„ค์Šค์˜ ์‹คํ–‰ ๋ฃจํ”„(E-component)๊ฐ€ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๊ณ  ์ƒํƒœ ์—…๋ฐ์ดํŠธ ๋ฐ ์ทจ์†Œ(Cancellation) ๋ช…๋ น์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - -#### [๊ด€๊ณ„ ์œ ํ˜• B (๊ตฌํ˜„/์ „์†ก ๋งค์ปค๋‹ˆ์ฆ˜)] -* [[stdio transport]] - * ์—ฐ๊ฒฐ ์ด์œ : JSON-RPC 2.0 ๋ฉ”์‹œ์ง€๋ฅผ ๋„คํŠธ์›Œํฌ ์˜ค๋ฒ„ํ—ค๋“œ ์—†์ด ๋กœ์ปฌ ๋จธ์‹ ์—์„œ ๊ฐ€์žฅ ๋น ๋ฅด๊ฒŒ ์ „์†กํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ํ‘œ์ค€ ์ž…์ถœ๋ ฅ ์ „์†ก ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค [7]. - * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋‹จ์ผ ํ•˜๋„ค์Šค ๋‚ด์—์„œ ๋„๊ตฌ ์‹คํ–‰(T-component) ์ง€์—ฐ ์‹œ๊ฐ„์„ ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„๋กœ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•œ ์‹œ์Šคํ…œ ๋ ˆ๋ฒจ์˜ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -* [[Lifecycle Hooks]] (ํ•˜๋„ค์Šค L-component) - * ์—ฐ๊ฒฐ ์ด์œ : JSON-RPC 2.0์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ†ต์‹ ํ•˜๋Š” ๋„๊ตฌ ๋ฐ ์„œ๋ฒ„์— ๋Œ€ํ•ด, ์‹ค์ œ ์‹คํ–‰ ๊ถŒํ•œ์„ ํ†ต์ œํ•˜๊ณ  ์ •์ฑ…์„ ์ง‘ํ–‰(Policy enforcement)ํ•˜๋Š” ํ•˜๋„ค์Šค์˜ ํ•„์ˆ˜ ๋ณด์•ˆ/๊ฑฐ๋ฒ„๋„Œ์Šค ๊ณ„์ธต์ž…๋‹ˆ๋‹ค [13, 14, 16]. - * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋‹จ์ˆœํžˆ JSON-RPC ๋ฉ”์‹œ์ง€๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ๊ฒƒ์„ ๋„˜์–ด, ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ํ•˜๋„ค์Šค ํ™˜๊ฒฝ์—์„œ ๋„๊ตฌ ํ˜ธ์ถœ์„ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ณด์žฅํ•˜๋Š” ๋ฐฉ์–ด ๊ณ„์ธต์„ ์–ด๋–ป๊ฒŒ ๊ตฌ์ถ•ํ•˜๋Š”์ง€ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - -### Deeper Research Questions -* ๋‹ค์ค‘ ์—์ด์ „ํŠธ(Multi-agent) ์‹œ์Šคํ…œ์—์„œ JSON-RPC 2.0 ๊ธฐ๋ฐ˜์˜ ์•Œ๋ฆผ(Notification) ๋ฉ”์‹œ์ง€๋Š” ์—์ด์ „ํŠธ ๊ฐ„์˜ ์ž‘์—… ์ƒํƒœ(Task graph)๋ฅผ ๋™๊ธฐํ™”ํ•˜๋Š” ๋ฐ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ํ™œ์šฉ๋  ์ˆ˜ ์žˆ๋Š”๊ฐ€? -* JSON-RPC 2.0 ๋ฉ”์‹œ์ง€๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์—์ด์ „ํŠธ ํ•˜๋„ค์Šค์˜ ์‹คํ–‰ ๋ฃจํ”„(E-component)๋Š” ๋„คํŠธ์›Œํฌ ์‹œ๊ฐ„ ์ดˆ๊ณผ(Timeout)๋‚˜ ์Šคํ‚ค๋งˆ ๋ถˆ์ผ์น˜ ๋“ฑ ์™ธ๋ถ€ ๋„๊ตฌ ์„œ๋ฒ„์˜ ์‹คํŒจ๋ฅผ ์–ด๋–ป๊ฒŒ ๋ถ„๋ฅ˜ํ•˜๊ณ  ๋ณต๊ตฌ(Retry/Graceful degradation)ํ•˜๋Š”๊ฐ€? -* ๋กœ์ปฌ ํ”„๋กœ์„ธ์Šค ๊ฐ„์˜ JSON-RPC ํ†ต์‹ (stdio)๊ณผ ๋ถ„์‚ฐ ํ™˜๊ฒฝ์—์„œ์˜ HTTP ํ†ต์‹  ๊ฐ„์— ํŠธ๋žœ์žญ์…˜์˜ ์ƒํƒœ์™€ ์ปจํ…์ŠคํŠธ ์ถœ์ฒ˜(Provenance)๋ฅผ ๋ณด์กดํ•˜๊ธฐ ์œ„ํ•ด ํ•˜๋„ค์Šค ์„ค๊ณ„๋Š” ์–ด๋–ป๊ฒŒ ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•˜๋Š”๊ฐ€? -* JSON-RPC 2.0 ํฌ๋งท์„ ํ†ตํ•ด ์˜ค๊ฐ€๋Š” ๋Œ€์šฉ๋Ÿ‰ ๋„๊ตฌ ์ถœ๋ ฅ ๊ฒฐ๊ณผ๋ฅผ ํ”„๋กฌํ”„ํŠธ ์œˆ๋„์šฐ ํ•œ๊ณ„ ๋‚ด์—์„œ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด, ํ•˜๋„ค์Šค์˜ ์ปจํ…์ŠคํŠธ ๊ด€๋ฆฌ์ž(C-component)๋Š” ์–ด๋–ค ๊ณ„์ธต์  ์š”์•ฝ ๋ฐ ์•„ํ‹ฐํŒฉํŠธ ๋ถ„๋ฆฌ ์ „๋žต์„ ์‚ฌ์šฉํ•˜๋Š”๊ฐ€? - -### Practical Application Contexts -* **Implementation:** MCP ์„œ๋ฒ„ ๊ตฌ์ถ• ์‹œ JSON-RPC 2.0 ๊ทœ๊ฒฉ์— ๋งž์ถฐ `tools/list`, `tools/call` ๋“ฑ ๊ณ ์œ  ID๋ฅผ ํฌํ•จํ•œ ์š”์ฒญ๊ณผ ๊ฒฐ๊ณผ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. -* **System Design:** ์—์ด์ „ํŠธ ํ•˜๋„ค์Šค ์„ค๊ณ„ ์‹œ, ๋กœ์ปฌ ๋ณด์•ˆ ์ƒŒ๋“œ๋ฐ•์Šค ๋‚ด๋ถ€์˜ ๋„๊ตฌ๋Š” stdio ๊ธฐ๋ฐ˜ JSON-RPC๋กœ ์—ฐ๊ฒฐํ•˜๊ณ  ์›๊ฒฉ ์—์ด์ „ํŠธ ๊ฐ„ ์œ„์ž„์€ HTTP ๊ธฐ๋ฐ˜์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋„๋ก ์ „์†ก ๊ณ„์ธต์„ ๋ถ„๋ฆฌํ•˜๋Š” ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋„์ž…ํ•ฉ๋‹ˆ๋‹ค. -* **Operation / Maintenance:** ํ•˜๋„ค์Šค์˜ ํ‰๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค(V-component)๋‚˜ ๊ด€์ธก ๊ฐ€๋Šฅ์„ฑ(Observability) ์‹œ์Šคํ…œ์„ ํ†ตํ•ด JSON-RPC 2.0 ๋ฉ”์‹œ์ง€ ํŽ˜์ด๋กœ๋“œ์˜ ๋กœ๊ทธ๋ฅผ ์บก์ฒ˜ํ•˜์—ฌ, ์—์ด์ „ํŠธ์˜ ์‹คํ–‰ ๊ถค์ (Trajectory)๊ณผ ๋„๊ตฌ ํ˜ธ์ถœ ์‹คํŒจ ์›์ธ์„ ์ถ”์  ๋ฐ ๋””๋ฒ„๊น…ํ•ฉ๋‹ˆ๋‹ค. -* **Learning Path:** LLM ๋ชจ๋ธ์˜ ์ถœ๋ ฅ์ด ์™ธ๋ถ€ ์„ธ๊ณ„์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ป๊ฒŒ ๊ตฌ์กฐํ™”๋œ ๋ช…๋ น์œผ๋กœ ๋ณ€ํ™˜๋˜๋Š”์ง€ ์ดํ•ดํ•˜๊ณ ์ž ํ•  ๋•Œ, ๊ธฐ๋ฐ˜์ด ๋˜๋Š” JSON-RPC 2.0 ์‚ฌ์–‘์„ ํ•™์Šตํ•˜๊ณ  ์ด๋ฅผ ์ ์šฉํ•œ MCP ์•„ํ‚คํ…์ฒ˜ ์ŠคํŽ™์œผ๋กœ ๋‚˜์•„๊ฐ‘๋‹ˆ๋‹ค. -* **My Project Relevance:** ๋งž์ถคํ˜• AI ์—…๋ฌด ์ž๋™ํ™” ์—์ด์ „ํŠธ๋ฅผ ๊ตฌ์ถ•ํ•  ๋•Œ, ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋‚˜ ๋ ˆ๊ฑฐ์‹œ API๋ฅผ JSON-RPC 2.0 ๊ธฐ๋ฐ˜์˜ ํ‘œ์ค€ MCP ์„œ๋ฒ„๋กœ ๋ž˜ํ•‘(Wrapping)ํ•˜์—ฌ ํŠน์ • ์—์ด์ „ํŠธ ํ”„๋ ˆ์ž„์›Œํฌ ์ข…์†์„ฑ ์—†์ด ๋ฒ”์šฉ์ ์œผ๋กœ ํ†ต์‹ ํ•˜๋„๋ก ํ†ตํ•ฉํ•ฉ๋‹ˆ๋‹ค. - -### Adjacent Topics -* [[Language Server Protocol]] (LSP) - * ํ™•์žฅ ๋ฐฉํ–ฅ: JSON-RPC๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ์ฃผ์š” ํ‘œ์ค€์œผ๋กœ, ์ฝ”๋”ฉ ์—์ด์ „ํŠธ ํ•˜๋„ค์Šค๊ฐ€ ๋ณต์žกํ•œ ์†Œํ”„ํŠธ์›จ์–ด ํ”„๋กœ์ ํŠธ ํ™˜๊ฒฝ์—์„œ ์‹œ๋งจํ‹ฑ ์ฝ”๋“œ ๋ถ„์„ ๋ฐ ์‹ฌ๋ณผ ํƒ์ƒ‰(find_symbol ๋“ฑ)์„ ํšจ์œจ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ป๊ฒŒ ๋„๊ตฌํ™”ํ•˜๋Š”์ง€ ๊ทธ ๊ฐœ๋…์„ ์—ฐ์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -* [[Agent-to-Agent Protocol]] (A2A) - * ํ™•์žฅ ๋ฐฉํ–ฅ: ์—์ด์ „ํŠธ์™€ ๋„๊ตฌ ๊ฐ„ ํ†ต์‹ (MCP)์ด ์•„๋‹Œ, ์›๊ฒฉ ์—์ด์ „ํŠธ ๊ฐ„์˜ ์œ„์ž„๊ณผ ์ƒํ˜ธ์ž‘์šฉ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํ†ต์‹  ๊ทœ์•ฝ์œผ๋กœ์„œ ๋‹ค์ค‘ ์—์ด์ „ํŠธ ํ•˜๋„ค์Šค ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ๊ณ„์ธต์— ๋Œ€ํ•œ ์ดํ•ด๋ฅผ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - ---- -*Last updated: 2026-05-01* \ No newline at end of file diff --git a/00_Raw/JavaScript Memory Management.md b/00_Raw/JavaScript Memory Management.md deleted file mode 100644 index fd73ce66..00000000 --- a/00_Raw/JavaScript Memory Management.md +++ /dev/null @@ -1,66 +0,0 @@ -# [[JavaScript Memory Management]] - -## ๐Ÿ“Œ Brief Summary -์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋Š” ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š์„ ๋•Œ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ(Garbage Collector)๋ฅผ ํ†ตํ•ด ์ž๋™์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํšŒ์ˆ˜ํ•˜๋Š” ๊ณผ์ •์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค [1]. ๊ทธ๋Ÿฌ๋‚˜ ์ฐธ์กฐ๊ฐ€ ๋‚จ์•„์žˆ์–ด ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•ด์ œ๋˜์ง€ ์•Š์œผ๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜(Memory Leak)๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉฐ, ์ด๋Š” ์ ์ง„์ ์ธ ์„ฑ๋Šฅ ์ €ํ•˜๋‚˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฉˆ์ถค ํ˜„์ƒ์„ ์œ ๋ฐœํ•ฉ๋‹ˆ๋‹ค [1-3]. ํšจ๊ณผ์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด์„œ๋Š” Chrome DevTools์™€ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ถ„๋ฆฌ๋œ DOM ๋…ธ๋“œ๋‚˜ ์ •๋ฆฌ๋˜์ง€ ์•Š์€ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๋“ฑ์„ ์‹๋ณ„ํ•˜๊ณ  ํ•ด๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [4-6]. - -## ๐Ÿ“– Core ์†Œ์Šค Content -- **๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜๊ณผ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜:** ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ž๋™์œผ๋กœ ํšŒ์ˆ˜ํ•˜๋Š” ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๋ฅผ ์ œ๊ณตํ•˜์ง€๋งŒ, ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ฐธ์กฐ(Reference)๊ฐ€ ๋‚จ์•„์žˆ๋Š” ํ•œ ๋ฉ”๋ชจ๋ฆฌ๋Š” ํ•ด์ œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค [1]. ํ•„์š” ์—†๋Š” ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๊ณ„์† ๋ˆ„์ ๋˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ์ง€์†์ ์œผ๋กœ ์ฆ๊ฐ€ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [1, 3]. -- **๋ฉ”๋ชจ๋ฆฌ ๋ฌธ์ œ์˜ 3๊ฐ€์ง€ ์œ ํ˜•:** - 1. **๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜(Memory Leak):** ํŽ˜์ด์ง€์˜ ๋ฒ„๊ทธ๋กœ ์ธํ•ด ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ์ ์ง„์ ์œผ๋กœ ์ฆ๊ฐ€ํ•˜์—ฌ ์„ฑ๋Šฅ์ด ์•…ํ™”๋˜๋Š” ํ˜„์ƒ์ž…๋‹ˆ๋‹ค [2]. - 2. **๋ฉ”๋ชจ๋ฆฌ ํŒฝ์ฐฝ(Memory Bloat):** ์ตœ์ ์˜ ํŽ˜์ด์ง€ ์†๋„๋ฅผ ์œ„ํ•ด ํ•„์š”ํ•œ ๊ฒƒ๋ณด๋‹ค ๋„ˆ๋ฌด ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ผ๊ด€๋˜๊ฒŒ ์„ฑ๋Šฅ์ด ์ €ํ•˜๋˜๋Š” ํ˜„์ƒ์ž…๋‹ˆ๋‹ค [2]. - 3. **์žฆ์€ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜(Frequent Garbage Collections):** ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํšŒ์ˆ˜ํ•˜๊ธฐ ์œ„ํ•ด ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰์„ ์ž์ฃผ ์ผ์‹œ ์ค‘์ง€์‹œํ‚ค๋ฉด์„œ, ์„ฑ๋Šฅ์ด ์ง€์—ฐ๋˜๊ฑฐ๋‚˜ ๋ฉˆ์ถ˜ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ํ˜„์ƒ์ž…๋‹ˆ๋‹ค [2]. -- **์ฃผ์š” ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ํŒจํ„ด:** - - **๋ถ„๋ฆฌ๋œ DOM ๋…ธ๋“œ(Detached DOM Nodes):** ๋ฌธ์„œ(DOM ํŠธ๋ฆฌ)์—์„œ๋Š” ์ œ๊ฑฐ๋˜์—ˆ์ง€๋งŒ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ณ€์ˆ˜์—์„œ ์—ฌ์ „ํžˆ ์ฐธ์กฐํ•˜๊ณ  ์žˆ์–ด ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์˜ ๋Œ€์ƒ์ด ๋˜์ง€ ๋ชปํ•˜๋Š” ๋…ธ๋“œ์ž…๋‹ˆ๋‹ค [4, 6]. - - **์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๋ˆ„์ :** ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ธ๋งˆ์šดํŠธ๋  ๋•Œ ์ ์ ˆํžˆ ์ œ๊ฑฐ๋˜์ง€ ์•Š์€ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋“ค์ด ๋ฉ”๋ชจ๋ฆฌ์— ๊ณ„์† ์ถ•์ ๋˜๋Š” ํ˜„์ƒ์ž…๋‹ˆ๋‹ค [6]. React์—์„œ๋Š” `useEffect`์—์„œ ์ •๋ฆฌ(Cleanup) ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์„ ๋•Œ ํ”ํžˆ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [7, 8]. - - **ํด๋กœ์ €๋กœ ์œ ์ง€๋˜๋Š” ์ฐธ์กฐ(Closure-Retained References):** ํด๋กœ์ €(Closure)๊ฐ€ ๋ถ€๋ชจ ์Šค์ฝ”ํ”„์˜ ๋ณ€์ˆ˜๋ฅผ ๊ณ„์† ์‚ด๋ ค๋‘์–ด ๋Œ€๊ทœ๋ชจ ๊ฐ์ฒด๋ฅผ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ฉ”๋ชจ๋ฆฌ์— ์œ ์ง€ํ•˜๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค [9]. -- **ํƒ์ง€ ๋ฐ ๋””๋ฒ„๊น… ๋„๊ตฌ:** - - **Chrome Task Manager:** DOM ๋…ธ๋“œ๊ฐ€ ์ €์žฅ๋˜๋Š” OS ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” 'Memory footprint'์™€ ๋„๋‹ฌ ๊ฐ€๋Šฅํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” 'JavaScript Memory'์˜ ์‹ค์‹œ๊ฐ„ ์‚ฌ์šฉ๋Ÿ‰์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค [10]. - - **ํž™ ์Šค๋ƒ…์ƒท(Heap Snapshots):** ํŠน์ • ์‹œ์ ์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ถ„์‚ฐ ์ƒํƒœ๋ฅผ ์บก์ฒ˜ํ•ฉ๋‹ˆ๋‹ค [11]. ๋‘ ์Šค๋ƒ…์ƒท์„ ๋น„๊ตํ•˜์—ฌ ํฌ๊ธฐ๊ฐ€ ๊ณ„์† ์ฆ๊ฐ€ํ•˜๋Š”(Delta ๊ฐ’์ด ์–‘์ˆ˜์ธ) ๊ฐ์ฒด๋ฅผ ์ฐพ๊ณ , ํ•ด๋‹น ๊ฐ์ฒด๊ฐ€ ์‚ญ์ œ๋  ๊ฒฝ์šฐ ํ•ด์ œ๋  ๋ฉ”๋ชจ๋ฆฌ ํฌ๊ธฐ(Retained Size)๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5, 12]. - - **ํ• ๋‹น ํƒ€์ž„๋ผ์ธ(Allocation Timeline):** ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ํŒจํ„ด์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ถ„์„ํ•˜์—ฌ ์–ด๋–ค ํ•จ์ˆ˜๋‚˜ ์ž‘์—…์ด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ์œ ๋ฐœํ•˜๋Š”์ง€ ์ถ”์ ํ•ฉ๋‹ˆ๋‹ค [13-15]. -- **์˜ˆ๋ฐฉ ์ „๋žต:** ์บ์‹œ ๊ด€๋ฆฌ ์‹œ ๊ฐ์ฒด ๋Œ€์‹  `WeakMap`์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์ด ์ •์ƒ์ ์œผ๋กœ ์ด๋ฃจ์–ด์ง€๋„๋ก ํ•˜๊ณ , Puppeteer๋ฅผ ์ด์šฉํ•ด CI ํŒŒ์ดํ”„๋ผ์ธ์— ์ž๋™ํ™”๋œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [16]. - -## โš–๏ธ Trade-offs & Caveats -๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์„ ์ˆ˜ํ–‰ํ•  ๋•Œ๋Š” ๋ชจ๋“  ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰์ด ์ผ์‹œ ์ค‘์ง€(Pause)๋œ๋‹ค๋Š” ์ œ์•ฝ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค [2]. ๋”ฐ๋ผ์„œ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์„ ๊ณผ๋„ํ•˜๊ฒŒ ํ•˜๊ฑฐ๋‚˜ ๋ฉ”๋ชจ๋ฆฌ ํŒฝ์ฐฝ์ด ๋ฐœ์ƒํ•˜๋ฉด ์žฆ์€ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์ด ํŠธ๋ฆฌ๊ฑฐ๋˜์–ด ์‚ฌ์šฉ์ž ๊ฒฝํ—˜(UX)์ƒ ์•ฑ์ด ์ž์ฃผ ๋ฉˆ์ถ”๋Š” ๋“ฏํ•œ ์‹ฌ๊ฐํ•œ ๋ถ€์ž‘์šฉ์„ ์ดˆ๋ž˜ํ•ฉ๋‹ˆ๋‹ค [2]. ๋ฐ˜๋ฉด, ์„ฑ๋Šฅ ์ตœ์ ํ™”๋‚˜ ์บ์‹ฑ์„ ๋ชฉ์ ์œผ๋กœ ๊ฐ์ฒด๋‚˜ ๋ฐ์ดํ„ฐ๋ฅผ ํด๋กœ์ € ๋ฉ”๋ชจ๋ฆฌ์— ๊ธธ๊ฒŒ ๋ณด๊ด€ํ•˜๋Š” ๊ธฐ์ˆ ์  ์„ ํƒ์„ ํ•  ๊ฒฝ์šฐ, ์ ์ ˆํ•œ ์‹œ์ ์— ์ฐธ์กฐ๋ฅผ ํ•ด์ œํ•˜๊ฑฐ๋‚˜ `WeakMap`์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ถฉ๋Œ(Crash)์ด๋‚˜ ํƒญ ๋ฉˆ์ถค ํ˜„์ƒ์„ ์œ ๋ฐœํ•˜๋Š” ์น˜๋ช…์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜(Trade-off)๋กœ ์ด์–ด์งˆ ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค [3, 9, 16]. ๋˜ํ•œ ๋ฉ”๋ชจ๋ฆฌ ํ”„๋กœํŒŒ์ผ๋ง์„ ์œ„ํ•œ ํž™ ์Šค๋ƒ…์ƒท ์บก์ฒ˜ ๋ฐ ์ฒ˜๋ฆฌ๋Š” ์ƒ๋‹นํ•œ ๋กœ๋“œ ์‹œ๊ฐ„์ด ์†Œ์š”๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [11]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -#### [์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] -- [[Garbage Collection]] - - ์—ฐ๊ฒฐ ์ด์œ : ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋Š” ๋” ์ด์ƒ ์ฐธ์กฐ๋˜์ง€ ์•Š๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ž๋™์œผ๋กœ ํšŒ์ˆ˜ํ•˜๋Š” ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜์— ์ „์ ์œผ๋กœ ์˜์กดํ•ฉ๋‹ˆ๋‹ค [1]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋„๋‹ฌ ๊ฐ€๋Šฅํ•œ(Reachable) ๊ฐ์ฒด๋ฅผ ํŒ๋‹จํ•˜๋Š” ๊ธฐ์ค€๊ณผ ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰์ด ์ •์ง€๋˜๋Š” ํƒ€์ด๋ฐ์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1, 2, 10]. -- [[Detached DOM Nodes]] - - ์—ฐ๊ฒฐ ์ด์œ : ํ˜„๋Œ€์ ์ธ ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜ UI(์˜ˆ: React, Vue)์—์„œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ์ผ์œผํ‚ค๋Š” ๊ฐ€์žฅ ํ”ํ•œ ์›์ธ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค [4, 6]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: JS ๋ณ€์ˆ˜์˜ ์ฐธ์กฐ๊ฐ€ ์–ด๋–ป๊ฒŒ OS ๋ฉ”๋ชจ๋ฆฌ์— ์œ„์น˜ํ•œ DOM ํŠธ๋ฆฌ์˜ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์„ ๋ฐฉํ•ดํ•˜๋Š”์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [4, 10]. - -#### [๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ] -- [[Heap Snapshot]] - - ์—ฐ๊ฒฐ ์ด์œ : Chrome DevTools์—์„œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜์˜ ์ •ํ™•ํ•œ ์›์ธ(Retainer path)์„ ์ฐพ๊ธฐ ์œ„ํ•ด ํ•„์ˆ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ํ”„๋กœํŒŒ์ผ๋ง ๋„๊ตฌ์ž…๋‹ˆ๋‹ค [5, 11]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Shallow size(๊ฐ์ฒด ์ž์ฒด์˜ ํฌ๊ธฐ)์™€ Retained size(์ฐธ์กฐ๊ฐ€ ๋Š๊ธธ ์‹œ ํšŒ์ˆ˜๋˜๋Š” ํฌ๊ธฐ)์˜ ์ฐจ์ด๋ฅผ ์ดํ•ดํ•˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ ํšจ๊ณผ๋ฅผ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5, 12]. -- [[useEffect Cleanup]] - - ์—ฐ๊ฒฐ ์ด์œ : React ํ”„๋ ˆ์ž„์›Œํฌ ํ™˜๊ฒฝ์—์„œ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋‚˜ ๊ตฌ๋…(Subscription)์œผ๋กœ ์ธํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ์˜ˆ๋ฐฉํ•˜๊ธฐ ์œ„ํ•œ ํ•ต์‹ฌ ๊ตฌํ˜„ ํŒจํ„ด์ž…๋‹ˆ๋‹ค [7, 8, 16]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ปดํฌ๋„ŒํŠธ ์ƒ๋ช…์ฃผ๊ธฐ์™€ ์—ฐ๋™ํ•˜์—ฌ ์ž์›(Resource)์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ•ด์ œํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฒด๋“ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [7, 16]. - -### Deeper Research Questions -- ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ์˜ ๋„๋‹ฌ ๊ฐ€๋Šฅ์„ฑ(Reachability) ํŒ๋‹จ์—์„œ 'GC Roots'๋Š” ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ค ๊ฐ์ฒด๋“ค์„ ํฌํ•จํ•˜๋ฉฐ ์–ด๋–ป๊ฒŒ ํƒ์ƒ‰๋˜๋Š”๊ฐ€? -- Chrome DevTools์˜ Heap Snapshot์—์„œ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š” Shallow size์™€ Retained size์˜ ์ •ํ™•ํ•œ ๊ธฐ์ˆ ์  ์ฐจ์ด์ ๊ณผ ๋ถ„์„ ์‹œ์˜ ํ™œ์šฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? -- Node.js ์„œ๋ฒ„ ํ™˜๊ฒฝ์—์„œ V8 inspector protocol์„ ์ด์šฉํ•œ ๋ฉ”๋ชจ๋ฆฌ ํ”„๋กœํŒŒ์ผ๋ง์€ ๋ธŒ๋ผ์šฐ์ € ํด๋ผ์ด์–ธํŠธ ํ™˜๊ฒฝ์˜ ๋””๋ฒ„๊น…๊ณผ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅด๋ฉฐ ์–ด๋–ค ํŠน์ˆ˜ํ•œ ๋ˆ„์ˆ˜ ํŒจํ„ด์ด ์กด์žฌํ•˜๋Š”๊ฐ€? -- WeakMap์„ ํ™œ์šฉํ•œ ์บ์‹ฑ ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ์ผ๋ฐ˜ Map๊ณผ ๋น„๊ตํ•˜์—ฌ ๋‚ด๋ถ€์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์„ ํ—ˆ์šฉํ•˜๋Š”๊ฐ€? -- React ์ปดํฌ๋„ŒํŠธ ์ตœ์ ํ™”(์˜ˆ: `useMemo`, `useCallback`)๋กœ ์ธํ•ด ๋ฉ”๋ชจ๋ฆฌ์— ์œ ์ง€๋˜๋Š” ๊ฐ์ฒด ์ฐธ์กฐ๊ฐ€ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ์ฃผ๊ธฐ์™€ ์ „์ฒด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฉ”๋ชจ๋ฆฌ ํŒฝ์ฐฝ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์€ ๋ฌด์—‡์ธ๊ฐ€? - -### Practical Application Contexts -- **Implementation:** React ์ปดํฌ๋„ŒํŠธ ๊ฐœ๋ฐœ ์‹œ `useEffect` ํ›… ๋‚ด๋ถ€์—์„œ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ, WebSocket, ํƒ€์ด๋จธ ๋“ฑ์„ ๋“ฑ๋กํ•  ๋•Œ ๋ฐ˜๋“œ์‹œ ํ•ด์ œ(Cleanup) ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ๊ตฌํ˜„ํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ ์–ธ๋งˆ์šดํŠธ ์‹œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค [7, 8, 16]. ์บ์‹œ ๊ฐ์ฒด๊ฐ€ ํ•„์š”ํ•  ๋•Œ๋Š” `WeakMap`์„ ๋„์ž…ํ•˜์—ฌ ์ž๋™ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ์œ ๋„ํ•ฉ๋‹ˆ๋‹ค [16]. -- **System Design:** ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ๋‚˜ ๋ณต์žกํ•œ UI๋ฅผ ๋‹ค๋ฃฐ ๋•Œ, ํด๋กœ์ €๊ฐ€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๊ฑฐ๋Œ€ํ•œ ์ปจํ…์ŠคํŠธ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ์œ ์ง€ํ•˜์ง€ ์•Š๋„๋ก ์ปดํฌ๋„ŒํŠธ ์Šค์ฝ”ํ”„์™€ ์ƒํƒœ ๋ ˆ์ด์–ด ๊ตฌ์กฐ๋ฅผ ์„ค๊ณ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [9]. -- **Operation / Maintenance:** ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ์•ฑ์˜ ์„ฑ๋Šฅ ์ €ํ•˜๋‚˜ ๋ฉˆ์ถค ํ˜„์ƒ์ด ๋ณด๊ณ ๋˜๋ฉด, Chrome Task Manager๋กœ ๋ฉ”๋ชจ๋ฆฌ ๋ฐœ์ž๊ตญ(Memory footprint) ์ฆ๊ฐ€ ์ถ”์ด๋ฅผ ์‹ค์‹œ๊ฐ„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  Heap Snapshot์„ ๋น„๊ต ๋ถ„์„(Delta ๊ฐ’ ํ™•์ธ)ํ•˜์—ฌ ๋ˆ„์ˆ˜ ์ง€์ ์„ ์ฐพ์•„๋ƒ…๋‹ˆ๋‹ค [5, 11, 17]. CI ํŒŒ์ดํ”„๋ผ์ธ์— Puppeteer๋ฅผ ํ†ตํ•œ ์ž๋™ํ™”๋œ ๋ฉ”๋ชจ๋ฆฌ ํ…Œ์ŠคํŠธ๋ฅผ ๊ตฌ์ถ•ํ•ฉ๋‹ˆ๋‹ค [16]. -- **Learning Path:** ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฐธ์กฐ์™€ ํด๋กœ์ €์˜ ๋™์ž‘ ์›๋ฆฌ ์ดํ•ด -> ๋ธŒ๋ผ์šฐ์ €์˜ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜ ํ•™์Šต -> Chrome DevTools๋ฅผ ํ™œ์šฉํ•œ Heap Snapshot ๋ฐ Allocation Timeline ๋ถ„์„ ์‹ค์Šต -> ํ”„๋ ˆ์ž„์›Œํฌ(React) ํŠนํ™” ๋ฉ”๋ชจ๋ฆฌ ์ตœ์ ํ™” ํŒจํ„ด ์ ์šฉ. -- **My Project Relevance:** React ์ฝ”๋“œ๋ฒ ์ด์Šค ๋ฆฌํŒฉํ† ๋ง ๊ณผ์ •์—์„œ ์ž˜๋ชป ๊ตฌํ˜„๋œ ์ปค์Šคํ…€ ํ›…์ด๋‚˜ ์ƒํƒœ ๊ด€๋ฆฌ ๋กœ์ง์œผ๋กœ ์ธํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ์—†๋Š”์ง€ ์ ๊ฒ€ํ•˜๊ณ , ์•ˆ์ •์ ์ด๊ณ  ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ํ”„๋ก ํŠธ์—”๋“œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐ ํ•„์ˆ˜์ ์œผ๋กœ ์ ์šฉ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. - -### Adjacent Topics -- [[React Performance Optimization]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ `React.memo`, `useCallback` ๋“ฑ์„ ํ†ตํ•œ ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง ์ตœ์ ํ™”๊ฐ€ ์–ด๋–ป๊ฒŒ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด์˜ ๋ถˆํ•„์š”ํ•œ ์žฌ์ƒ์„ฑ๊ณผ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์„ ์ค„์ด๋Š” ๋ฐ ๊ธฐ์—ฌํ•˜๋Š”์ง€ ์‚ดํŽด๋ด…๋‹ˆ๋‹ค [18-20]. -- [[Core Web Vitals]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋ฉ”๋ชจ๋ฆฌ ํŒฝ์ฐฝ์ด๋‚˜ ์žฆ์€ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์œผ๋กœ ์ธํ•œ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ ๋ธ”๋กœํ‚น์ด INP(Interaction to Next Paint) ๋ฐ TBT(Total Blocking Time)์™€ ๊ฐ™์€ ์‹ค์ œ ์›น ์„ฑ๋Šฅ ์ง€ํ‘œ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ์กฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค [21-23]. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Large-scale Application Refactoring.md b/00_Raw/Large-scale Application Refactoring.md deleted file mode 100644 index 57dc756e..00000000 --- a/00_Raw/Large-scale Application Refactoring.md +++ /dev/null @@ -1,66 +0,0 @@ -# [[Large-scale Application Refactoring]] - -## ๐Ÿ“Œ Brief Summary -๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฆฌํŒฉํ† ๋ง์€ ์ฝ”๋“œ์˜ ๋™์ž‘ ๋ฐฉ์‹์„ ๋ณด์กดํ•˜๋ฉด์„œ ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ๊ฐœ์„ ํ•˜์—ฌ ์˜ค๋ž˜๋œ ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ํ™•์žฅ์„ฑ์„ ํšŒ๋ณตํ•˜๋Š” ๊ณผ์ •์ด๋‹ค [1]. ์ด๋Š” ๋‹จ์ˆœํžˆ ์ฝ”๋“œ๋ฅผ '์ˆ˜์ •'ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๋ณต์žกํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋ถ„๋ฆฌํ•˜๊ณ  ๊ตฌ์กฐ์  ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•œ๋‹ค [2]. ์„ฑ๊ณต์ ์ธ ๋ฆฌํŒฉํ† ๋ง์„ ์œ„ํ•ด์„œ๋Š” ์ ์ง„์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹, ์—„๊ฒฉํ•œ ์•„ํ‚คํ…์ฒ˜ ์ ์šฉ, ๊ทธ๋ฆฌ๊ณ  ์ฝ”๋“œ ๋ณ€๊ฒฝ์„ ๋’ท๋ฐ›์นจํ•  ์ˆ˜ ์žˆ๋Š” ํ…Œ์ŠคํŠธ ๊ตฌ์ถ•์ด ํ•„์ˆ˜์ ์ด๋‹ค [1, 3]. - -## ๐Ÿ“– Core Content - -* **์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ „๋žต (Incremental Migration):** ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ•œ ๋ฒˆ์— ์ „๋ฉด ์žฌ์ž‘์„ฑ(Rewrite)ํ•˜๋Š” ๊ฒƒ์€ ๋ฆฌ์Šคํฌ๊ฐ€ ๋งค์šฐ ํฌ๊ธฐ ๋•Œ๋ฌธ์—, "์žฌ์ž‘์„ฑ์ด ์•„๋‹Œ ๋ฆฌํŒฉํ† ๋ง" ์ „๋žต์ด ๊ถŒ์žฅ๋œ๋‹ค [1]. ์˜ˆ๋ฅผ ๋“ค์–ด ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ๋ฅผ Context API์—์„œ Zustand๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ๋•Œ, ์•Œ๋ฆผ๊ณผ ๊ฐ™์€ ๋‹จ์ˆœํ•œ ์œ ํ‹ธ๋ฆฌํ‹ฐ ์Šคํ† ์–ด๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด ๊ฒฐ์ œ ํ๋ฆ„๊ณผ ๊ฐ™์€ ๋ณต์žกํ•œ ๋„๋ฉ”์ธ์œผ๋กœ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์Šคํ† ์–ด์”ฉ ์ ์ง„์ ์œผ๋กœ ์ด๋™ํ•ด์•ผ ํ•œ๋‹ค [1]. -* **๊ธฐ๋Šฅ ๋ฐ ๋„๋ฉ”์ธ ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ๋กœ์˜ ๊ฐœํŽธ:** ๋ ˆ๊ฑฐ์‹œ ์•ฑ์—์„œ ํ”ํžˆ ์“ฐ์ด๋Š” ํŒŒ์ผ ํƒ€์ž… ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ(components, hooks ๋“ฑ์„ ๋”ฐ๋กœ ๋ชจ์œผ๋Š” ๋ฐฉ์‹)๋Š” ์•ฑ์ด ์ปค์งˆ์ˆ˜๋ก ํƒ์ƒ‰๊ณผ ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ ๋‹ค [4, 5]. ๋”ฐ๋ผ์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๊ธฐ๋Šฅ๋ณ„๋กœ ์ฝ”๋“œ๋ฅผ ๋ชจ์œผ๋Š” ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ๋‚˜, ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ์„ ๊ฐ•์ œํ•˜๋Š” ์—„๊ฒฉํ•œ ๊ณ„์ธต ๋ชจ๋ธ์ธ Feature-Sliced Design(FSD)์œผ๋กœ ํด๋” ๊ตฌ์กฐ๋ฅผ ์žฌํŽธํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ ์ธ ๋ฆฌํŒฉํ† ๋ง ๋ชฉํ‘œ๊ฐ€ ๋œ๋‹ค [6-8]. -* **์ปค์Šคํ…€ ํ›…์„ ํ†ตํ•œ ๋กœ์ง ์บก์Аํ™”:** ํ˜„๋Œ€ React ๋ฆฌํŒฉํ† ๋ง์˜ ๊ธฐ๋ณธ ๋‹จ์œ„๋Š” ์ปค์Šคํ…€ ํ›…์ด๋‹ค [9]. ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ํŽ˜์นญ์ด๋‚˜ ํผ ํ•ธ๋“ค๋ง ๋กœ์ง์„ ๊ฑฐ๋Œ€ํ•œ UI ์ปดํฌ๋„ŒํŠธ์—์„œ ์ถ”์ถœํ•˜์—ฌ `useFetch`, `useForm` ๋“ฑ์˜ ํ›…์œผ๋กœ ๋ถ„๋ฆฌํ•˜๋ฉด, UI์™€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ๊ฒฉ๋ฆฌ๋˜์–ด ๋” ๋น ๋ฅด๊ณ  ๋…๋ฆฝ์ ์ธ ์œ ๋‹› ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง„๋‹ค [9, 10]. -* **ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•œ ์•ˆ์ „๋ง ํ™•๋ณด:** ์ฝ”๋“œ๋ฅผ ๋ณธ๊ฒฉ์ ์œผ๋กœ ์ˆ˜์ •ํ•˜๊ธฐ ์ „์— ํ…Œ์ŠคํŠธ(Unit Test, UI Test ๋“ฑ)๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ตœ์šฐ์„  ๋ฐฉ์–ด์„ ์ด๋‹ค [3, 11, 12]. ๊ธฐ์กด ๊ธฐ๋Šฅ์ด ๊นจ์ง€์ง€ ์•Š์•˜๋Š”์ง€ ๊ฒ€์ฆํ•  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ณผ์ • ์ž์ฒด๊ฐ€ ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ธฐ์กด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ํ๋ฆ„์„ ๊นŠ์ด ์ดํ•ดํ•˜๋„๋ก ๊ฐ•์ œํ•˜๋Š” ํ•™์Šต ๋„๊ตฌ๊ฐ€ ๋œ๋‹ค [13, 14]. -* **๋ ˆ๊ฑฐ์‹œ ์•ˆํ‹ฐํŒจํ„ด ๋ฐ ์Šคํƒ ์ œ๊ฑฐ:** ํšจ์œจ์ ์ธ ๊ตฌ์กฐ๋ฅผ ์œ„ํ•ด ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ Œ๋”๋ง์„ ์œ ๋ฐœํ•˜๋Š” ๋‹ค์ˆ˜์˜ `useEffect`๋ฅผ ์ œ๊ฑฐํ•˜๊ณ , ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ์ƒํƒœ๋ฅผ ๋ถ„๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด TanStack Query์™€ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ๋„์ž…ํ•ด์•ผ ํ•œ๋‹ค [15]. ๋˜ํ•œ, ๊ฐ€๋Šฅํ•  ๊ฒฝ์šฐ ํด๋ž˜์Šค ๊ธฐ๋ฐ˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์™€ ํ›…์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ , ์ผ๊ด€์„ฑ ์—†๋Š” CSS ์ ์šฉ ๋ฐฉ์‹์„ ํ•˜๋‚˜๋กœ ํ†ต์ผํ•˜๋Š” ์ž‘์—…๋„ ์ˆ˜๋ฐ˜๋œ๋‹ค [15, 16]. - -## โš–๏ธ Trade-offs & Caveats -* **DRY์™€ KISS ์›์น™์˜ ์ถฉ๋Œ:** ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๋ ค๋Š” DRY(Don't Repeat Yourself) ์›์น™์„ ๊ณผ๋„ํ•˜๊ฒŒ ์ ์šฉํ•  ๊ฒฝ์šฐ, ์ถ”์ƒํ™”๊ฐ€ ์ง€๋‚˜์น˜๊ฒŒ ๋ณต์žกํ•ด์ ธ ์ฝ”๋“œ๋ฅผ ๋‹จ์ˆœํ•˜๊ฒŒ ์œ ์ง€ํ•ด์•ผ ํ•˜๋Š” KISS(Keep It Simple, Stupid) ์›์น™์„ ์œ„๋ฐ˜ํ•˜๊ฒŒ ๋œ๋‹ค [17]. ๋”ฐ๋ผ์„œ ํŠน์ • ํŒจํ„ด์ด ์„ธ ๋ฒˆ ๋ฐ˜๋ณต๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ ์ถ”์ƒํ™”๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์กฐ๊ธฐ ์ตœ์ ํ™”๋กœ ์ธํ•œ ๋ถ€์ž‘์šฉ์„ ๋ง‰๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค [17]. -* **์žฌ์ž‘์„ฑ(Rewrite) vs ๋ฆฌํŒฉํ† ๋ง(Refactoring)์˜ ๊ธฐ๋กœ:** ๋ฆฌํŒฉํ† ๋ง ๋Œ€์ƒ์ธ ์•ฑ์˜ ๊ทœ๋ชจ๊ฐ€ ๋น„๊ต์  ์ž‘๋‹ค๋ฉด ์ฒ˜์Œ๋ถ€ํ„ฐ ์ƒˆ๋กœ ์•ฑ์„ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์ด ์˜คํžˆ๋ ค ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ๋‹ค [11]. ๊ทธ๋Ÿฌ๋‚˜ ๋Œ€ํ˜• ์•ฑ์˜ ๊ฒฝ์šฐ ์ „์ฒด ์žฌ์ž‘์„ฑ์€ ์œ„ํ—˜์ด ์ปค์„œ ์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ํ•ด์•ผ ํ•˜๋Š”๋ฐ, ์ด ๊ฒฝ์šฐ ์ „ํ™˜ ๊ธฐ๊ฐ„ ๋™์•ˆ ๋‘ ๊ฐ€์ง€ ๋‹ค๋ฅธ ๊ธฐ์ˆ ์ด๋‚˜ ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด์ด ๊ณต์กดํ•ด์•ผ ํ•˜๋Š” ๊ณผ๋„๊ธฐ์  ๊ธฐ์ˆ  ๋ถ€์ฑ„๋ฅผ ๊ฐ๋‹นํ•ด์•ผ ํ•œ๋‹ค [1]. -* **์ปดํŒŒ์ผ๋Ÿฌ ์ž๋™ํ™” ๋„์ž…์˜ ์žฅ๋ฒฝ:** React Compiler์™€ ๊ฐ™์ด ์„ฑ๋Šฅ ์ตœ์ ํ™”(๋ฉ”๋ชจ์ด์ œ์ด์…˜)๋ฅผ ์ž๋™ํ™”ํ•ด ์ฃผ๋Š” ๋„๊ตฌ๋ฅผ ๋„์ž…ํ•˜๋ฉด ์ˆ˜๋™ ์ตœ์ ํ™” ์ฝ”๋“œ๋ฅผ ์ง€์›Œ ์ฝ”๋“œ๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค [18]. ํ•˜์ง€๋งŒ ๊ธฐ์ˆ  ๋ถ€์ฑ„๊ฐ€ ๋งŽ์€ ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ๊ฒฝ์šฐ, ๊ธฐ์กด ์ฝ”๋“œ๊ฐ€ 'React์˜ ๊ทœ์น™(Rules of React)'์„ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์œ„๋ฐ˜ํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ, ๋„์ž… ์ „ ๋Œ€๋Œ€์ ์ธ ์‚ฌ์ „ ๋ฆฌํŒฉํ† ๋ง์ด ์„ ํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ์ œ์•ฝ์ด ๋”ฐ๋ฅธ๋‹ค [19]. -* **๊ณต์œ (Shared) ๋ชจ๋“ˆ์˜ ๋น„๋Œ€ํ™”:** ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ฒ˜(์˜ˆ: FSD)๋กœ ๋ถ„๋ฆฌํ•  ๋•Œ, ๊ณตํ†ต์œผ๋กœ ์“ฐ์ด๋Š” ์ฝ”๋“œ๋ฅผ ๋ฌด๋ถ„๋ณ„ํ•˜๊ฒŒ 'Shared' ๊ณ„์ธต์— ๋„ฃ์œผ๋ฉด ํ•ด๋‹น ๊ณ„์ธต์ด ๋ณต์žกํ•œ ์ŠคํŒŒ๊ฒŒํ‹ฐ ์ฝ”๋“œ๊ฐ€ ๋˜๊ณ  ๋ณ€๊ฒฝ ์‹œ ์˜ํ–ฅ ๋ฒ”์œ„(Blast Radius)๊ฐ€ ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ์ปค์ง€๋Š” ์œ„ํ—˜์ด ์žˆ๋‹ค [20, 21]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -#### [์•„ํ‚คํ…์ฒ˜ ๋ฐ ๊ธฐ๋ฐ˜ ์›์น™] -- [[Feature-Sliced Design]] - - ์—ฐ๊ฒฐ ์ด์œ : ๋Œ€๊ทœ๋ชจ ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ์ŠคํŒŒ๊ฒŒํ‹ฐํ™”๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ , ๋„๋ฉ”์ธ/๊ธฐ๋Šฅ ์ค‘์‹ฌ์˜ ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ๊ทœ์น™์„ ๋ถ€์—ฌํ•˜์—ฌ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฆฌํŒฉํ† ๋ง์˜ ๊ถ๊ทน์  ๋ชฉํ‘œ ๋ชจ๋ธ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค [7, 22]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ธฐ๋Šฅ(Feature)๊ณผ ๊ณ„์ธต(Layer)์„ ์–ด๋–ป๊ฒŒ ๋‚˜๋ˆ„๊ณ  ์บก์Аํ™”ํ•˜์—ฌ ์„œ๋กœ ๊ฐ„์˜ ์˜์กด์„ฑ ๊ฒฐํ•ฉ์„ ๋Š์–ด๋‚ด๋Š”์ง€์— ๋Œ€ํ•œ ์‹ค๋ฌด์  ์•„ํ‚คํ…์ฒ˜ ๊ตฌ์กฐ [6, 23]. - -- [[SOLID Principles]] - - ์—ฐ๊ฒฐ ์ด์œ : ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP) ๋“ฑ์„ ํ†ตํ•ด ๊ฑฐ๋Œ€ํ•œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ฐ€์ง€๋Š” ์—ฌ๋Ÿฌ ์ฑ…์ž„์„ ๋ถ„๋ฆฌํ•˜๊ณ , ํ•จ์ˆ˜๋‚˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅํ•˜๊ฒŒ ์ž˜๊ฒŒ ์ชผ๊ฐœ๋Š” ๋ฆฌํŒฉํ† ๋ง์˜ ํ•ต์‹ฌ ์ด๋ก ์  ๋ฐฐ๊ฒฝ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค [24, 25]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ธฐ๋Šฅ์  ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ์ธํ„ฐํŽ˜์ด์Šค(Props)๋ฅผ ์–ด๋–ป๊ฒŒ ๋ถ„๋ฆฌํ•˜๊ณ , ํ™•์žฅ์— ์—ด๋ ค์žˆ์œผ๋ฉด์„œ ์ˆ˜์ •์—๋Š” ๋‹ซํžŒ ์ฝ”๋“œ ์ž‘์„ฑ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ• [25, 26]. - -#### [๊ตฌํ˜„ ๋ฐ ํ™œ์šฉ ๋„๊ตฌ] -- [[Unit Testing]] - - ์—ฐ๊ฒฐ ์ด์œ : ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ ๊ตฌ์กฐ๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ ๊ธฐ๋Šฅ์ด ๋ง๊ฐ€์ง€์ง€ ์•Š์•˜์Œ์„ ๋ณด์žฅํ•˜๋Š” ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„์ด์ž ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์•ˆ์ „๋ง ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค [3, 12]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ฝ”๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ๋” ์ž‘๊ณ  ๋…ผ๋ฆฌ์ ์ธ ๋ธ”๋ก ๋‹จ์œ„๋กœ ๋‚˜๋ˆ„์–ด(Triangulation) ์˜์กด์„ฑ ์—†์ด ๋…๋ฆฝ์ ์œผ๋กœ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ๋ฐฉ๋ฒ•๋ก  [9, 12]. - -- [[Custom Hooks]] - - ์—ฐ๊ฒฐ ์ด์œ : ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์— ๋ณต์žกํ•˜๊ฒŒ ์–ฝํžŒ ์ƒํƒœ์™€ ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ ๋กœ์ง์„ ์™ธ๋ถ€๋กœ ์ถ”์ถœํ•˜๋Š” ๋ฆฌํŒฉํ† ๋ง์˜ ์ฃผ๋œ ๋‹จ์œ„์ด์ž ๋„๊ตฌ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค [9]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: UI ๋ Œ๋”๋ง ์ฑ…์ž„๊ณผ ๋น„์ฆˆ๋‹ˆ์Šค ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์ฑ…์ž„์„ ์–ด๋–ป๊ฒŒ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๊ฒฉ๋ฆฌํ•˜์—ฌ ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋Š”์ง€์˜ ์›๋ฆฌ [9, 10]. - -### Deeper Research Questions - -- ๋ฆฌํŒฉํ† ๋ง ๊ณผ์ •์—์„œ Feature-Sliced Design(FSD) ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋„์ž…ํ•  ๋•Œ, ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ(Feature)์—์„œ ๋™์‹œ์— ์š”๊ตฌ๋˜๋Š” ๊ต์ฐจ ๊ด€์‹ฌ์‚ฌ(Cross-cutting concerns) ๋กœ์ง์€ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋Š”๊ฐ€? -- ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ์ „๋ฌดํ•œ ๊ฑฐ๋Œ€ํ•œ ๋ ˆ๊ฑฐ์‹œ React ์•ฑ์„ ๋ฆฌํŒฉํ† ๋งํ•  ๋•Œ, ์–ด๋–ค ๋ถ€๋ถ„(์˜ˆ: ๊ณตํ†ต ์œ ํ‹ธ, UI ์ปดํฌ๋„ŒํŠธ, ์ „์—ญ ์ƒํƒœ ๋“ฑ)๋ถ€ํ„ฐ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋‘๊ณ  ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€๋ฅผ ํ™•๋ณดํ•ด์•ผ ํ•˜๋Š”๊ฐ€? -- ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ Context API ๊ธฐ๋ฐ˜ ์ „์—ญ ์ƒํƒœ๋ฅผ Zustand ๋“ฑ ํ˜„๋Œ€์  ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ๋กœ ์ ์ง„์ ์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์ƒํƒœ ๋™๊ธฐํ™” ๋ฌธ์ œ๋Š” ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? -- ๊ธฐ์กด์˜ ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜(`useMemo`, `useCallback`) ์ฝ”๋“œ๊ฐ€ ๋งŽ์€ ๋ ˆ๊ฑฐ์‹œ ์•ฑ์— React Compiler๋ฅผ ๋„์ž…ํ•˜๊ธฐ ์œ„ํ•ด ์ฝ”๋“œ ๋‚ด์˜ 'Rules of React' ์œ„๋ฐ˜ ์‚ฌํ•ญ์„ ์ถ”์ ํ•˜๊ณ  ๊ฒ€์ฆํ•˜๋Š” ํšจ๊ณผ์ ์ธ ์ž๋™ํ™” ํ”„๋กœ์„ธ์Šค๋Š” ๋ฌด์—‡์ธ๊ฐ€? -- ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์™€ ์ปค์Šคํ…€ ํ›… ๊ตฌ์กฐ๋กœ ๋ฆฌํŒฉํ† ๋งํ•  ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜(Memory Leaks) ํŒจํ„ด์„ ๊ฐ์ง€ํ•˜๊ณ  ๋ฐฉ์ง€ํ•˜๋Š” ๋””๋ฒ„๊น… ์ „๋žต๋ก ์€ ๋ฌด์—‡์ธ๊ฐ€? - -### Practical Application Contexts - -- **Implementation:** ๊ฑฐ๋Œ€ํ•œ ํผ ์ฒ˜๋ฆฌ๋‚˜ API ํŽ˜์นญ ๋กœ์ง์ด ๋ทฐ์™€ ๊ฒฐํ•ฉํ•˜์—ฌ 300์ค„์ด ๋„˜์–ด๊ฐ€๋Š” ๊ธฐ์กด ์ปดํฌ๋„ŒํŠธ๋ฅผ, ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)์— ๋”ฐ๋ผ ์ˆœ์ˆ˜ ๋ทฐ ์ปดํฌ๋„ŒํŠธ์™€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋‹ด์€ ์ปค์Šคํ…€ ํ›…์œผ๋กœ ์ถ”์ถœํ•˜์—ฌ ๋‹ค์‹œ ์—ฐ๊ฒฐํ•œ๋‹ค [9, 25]. -- **System Design:** ํด๋” ๊ตฌ์กฐ๋ฅผ `components/`, `hooks/` ๊ฐ™์€ ํŒŒ์ผ ์œ ํ˜• ๊ตฌ๋ถ„์ด ์•„๋‹Œ, ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ(์˜ˆ: ์ธ์ฆ, ๊ฒฐ์ œ)์„ ์ค‘์‹ฌ์œผ๋กœ ๋ชจ์€ ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ํ˜น์€ FSD ๊ธฐ๋ฐ˜ ํด๋” ๊ณ„์ธต ๊ตฌ์กฐ๋กœ ์ „๋ฉด ์žฌ์„ค๊ณ„ํ•œ๋‹ค [8, 27]. -- **Operation / Maintenance:** ESLint์™€ Husky ๋“ฑ์˜ ๋„๊ตฌ๋ฅผ ํŒŒ์ดํ”„๋ผ์ธ์— ๊ตฌ์ถ•ํ•˜์—ฌ ๋ฆฌํŒฉํ† ๋ง๋œ ์ฝ”๋“œ๊ฐ€ ์ƒ์œ„ ๊ณ„์ธต์„ ์ž˜๋ชป ์ฐธ์กฐํ•˜๋Š” ์—ญ์˜์กด์„ฑ(Reverse dependency)์„ ๋ฐœ์ƒ์‹œํ‚ค๊ฑฐ๋‚˜ ์ฝ”๋“œ ์ปจ๋ฒค์…˜์ด ์–ด๊ธ‹๋‚˜์ง€ ์•Š๋„๋ก ์—„๊ฒฉํžˆ ํ†ต์ œํ•œ๋‹ค [28]. -- **Learning Path:** ๋ฆฌํŒฉํ† ๋งํ•ด์•ผ ํ•  ์ฝ”๋“œ๋ฅผ ํŒŒ์•…ํ•˜๊ธฐ ์ „, ๋จผ์ € ์ž‘์€ ๋นˆ ํ”„๋กœ์ ํŠธ๋‚˜ 'ํ† ์ด ์•ฑ'์„ ๋งŒ๋“ค์–ด ๋ฆฌํŒฉํ† ๋ง์— ๋„์ž…ํ•  ์ƒˆ๋กœ์šด ๊ธฐ์ˆ (React์˜ ์ตœ์‹  ๊ธฐ๋Šฅ ๋“ฑ)์˜ ๊ธฐ์ดˆ๋ฅผ ์‹ค์Šตํ•˜์—ฌ ๊ฐœ๋…์„ ํ™•๋ฆฝํ•œ๋‹ค [29]. -- **My Project Relevance:** ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค์ด ์ž‘์„ฑํ•œ ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฅผ ์ธ๊ณ„๋ฐ›์•„ ๋…ผ๋ฌธ ํ”„๋กœ์ ํŠธ์šฉ์œผ๋กœ ๋ฆฌํŒฉํ† ๋งํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ, ๋จผ์ € ๊ธฐ์กด ๋กœ์ง์„ ํŒŒ์•…ํ•˜๊ธฐ ์œ„ํ•œ ์œ ๋‹› ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•œ ํ›„, ๋ฌด๋ถ„๋ณ„ํ•˜๊ฒŒ ํ˜ผ์šฉ๋œ CSS ์Šคํƒ€์ผ ์ •์ฑ…์„ ํ•˜๋‚˜๋กœ ํ†ต์ผ์‹œํ‚ค๊ณ  ๋ถˆํ•„์š”ํ•œ ์ „์—ญ ์ƒํƒœ๋ฅผ ์ง€์—ญ ์ƒํƒœ๋กœ ์ „ํ™˜ํ•˜๋Š” ์‹ค๋ฌด ํ”„๋กœ์„ธ์Šค๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค [14, 16, 30, 31]. - -### Adjacent Topics - -- [[Web Performance Optimization]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋ฆฌํŒฉํ† ๋ง ์ž‘์—…๊ณผ ๋ณ‘ํ–‰ํ•˜์—ฌ ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ ๊ฐ์†Œ(์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…), ๋ฆฌ๋ Œ๋”๋ง ์ตœ์ ํ™”, ๋ถˆํ•„์š”ํ•œ ๋ Œ๋” ๋ธ”๋กœํ‚น ์ œ๊ฑฐ ๋“ฑ์„ ํ†ตํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋Ÿฐํƒ€์ž„ ๋ฐ ๋กœ๋”ฉ ์†๋„๋ฅผ ํ–ฅ์ƒํ•˜๋Š” ์ „๋žต์  ๊ธฐ๋ฒ•์„ ํƒ๊ตฌํ•œ๋‹ค. -- [[State Management Fragmentation]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋ ˆ๊ฑฐ์‹œ ์•ฑ์˜ ๊ฑฐ๋Œ€ํ•œ ๋‹จ์ผ ์ „์—ญ ์ƒํƒœ๋ฅผ ๋ถ„์„ํ•˜์—ฌ ๋กœ์ปฌ ์ปดํฌ๋„ŒํŠธ ์ƒํƒœ, ์ „์—ญ UI ์ƒํƒœ, ์„œ๋ฒ„ ์บ์‹œ ์ƒํƒœ, URL ์ƒํƒœ ๋“ฑ์œผ๋กœ ํŒŒํŽธํ™” ๋ฐ ์ „๋ฌธํ™”ํ•˜์—ฌ ๊ฐ๊ฐ์— ๋งž๋Š” ๋„๊ตฌ(Zustand, React Query ๋“ฑ)๋กœ ์ด๊ด€ํ•˜๋Š” ์„ค๊ณ„ ๋ฐฉ๋ฒ•๋ก ์„ ์กฐ์‚ฌํ•œ๋‹ค. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Large-scale React Applications.md b/00_Raw/Large-scale React Applications.md deleted file mode 100644 index 135fc56a..00000000 --- a/00_Raw/Large-scale React Applications.md +++ /dev/null @@ -1,84 +0,0 @@ -# [[Large-scale React Applications]] - -## ๐Ÿ“Œ Brief Summary -๋Œ€๊ทœ๋ชจ React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(Large-scale React Applications)์€ ๋‹จ์ˆœํ•œ UI ๋ Œ๋”๋ง์„ ๋„˜์–ด ํ™•์žฅ์„ฑ, ์œ ์ง€๋ณด์ˆ˜์„ฑ, ๊ณ ์„ฑ๋Šฅ์ด ์š”๊ตฌ๋˜๋Š” ๋ณต์žกํ•œ ๋ถ„์‚ฐ ์†Œํ”„ํŠธ์›จ์–ด ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค [1]. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ทœ๋ชจ๊ฐ€ ์ปค์ง์— ๋”ฐ๋ผ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๋ˆ„์ˆ˜, ์ƒํƒœ ์†Œ์œ ๊ถŒ ํ˜ผ๋ž€, ์€์—ฐ์ค‘์˜ ์˜์กด์„ฑ ๊ฒฐํ•ฉ ๋“ฑ์˜ ์•„ํ‚คํ…์ฒ˜ ๋ถ•๊ดด๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2, 3]. ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜์˜ ์—„๊ฒฉํ•œ ํด๋” ๊ตฌ์กฐ(Feature-Sliced Design), ์ฒด๊ณ„์ ์ธ ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ, ์ž๋™ํ™”๋œ ๋นŒ๋“œ ์ตœ์ ํ™” ๋ฐ ์—„๊ฒฉํ•œ ์ฝ”๋“œ ๊ฑฐ๋ฒ„๋„Œ์Šค ์›์น™์˜ ์ ์šฉ์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค [1, 4-6]. - -## ๐Ÿ“– Core Content - -* **๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ฒ˜ ๋ฐ ํด๋” ๊ตฌ์กฐ (Feature-Based Architecture)** - * ๊ธฐ์กด์˜ ๊ธฐ์ˆ ์  ํŒŒ์ผ ์œ ํ˜•(components, hooks ๋“ฑ)๋ณ„ ํด๋” ๊ตฌ์กฐ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ํ™•์žฅ๋ ์ˆ˜๋ก ๋…ผ๋ฆฌ๊ฐ€ ํฉ์–ด์ ธ ์œ ์ง€๋ณด์ˆ˜์„ฑ์— ์น˜๋ช…์ ์ž…๋‹ˆ๋‹ค [7, 8]. 2025๋…„ ๊ธฐ์ค€ ์‚ฐ์—… ํ‘œ์ค€์€ ๋น„์ฆˆ๋‹ˆ์Šค ๊ธฐ๋Šฅ ๋‹จ์œ„๋กœ ์ฝ”๋“œ๋ฅผ ๋ฌถ๋Š” ๊ตฌ์กฐ์ด๋ฉฐ, ํŠนํžˆ **๊ธฐ๋Šฅ ๋ถ„ํ•  ์„ค๊ณ„(Feature-Sliced Design, FSD)**๊ฐ€ ๊ฐ•๋ ฅํ•œ ํ™•์žฅ์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [4, 9, 10]. - * FSD๋Š” `app`, `pages`, `widgets`, `features`, `entities`, `shared` ๊ณ„์ธต์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๊ตฌ๋ถ„ํ•˜๋ฉฐ, ํ•˜์œ„ ๊ณ„์ธต์ด ์ƒ์œ„ ๊ณ„์ธต์„ ์ฐธ์กฐํ•  ์ˆ˜ ์—†๋Š” ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ์„ ๊ฐ•์ œํ•˜์—ฌ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ํ™•์žฅ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค [4]. -* **๊ทœ๋ชจ์— ๋งž๋Š” ์ƒํƒœ ๊ด€๋ฆฌ (State Management at Scale)** - * **Context API**๋Š” ๋ฐ์ดํ„ฐ ์ „์†ก์—๋Š” ์œ ์šฉํ•˜์ง€๋งŒ, ์ƒํƒœ ๋ณ€๊ฒฝ ์‹œ ํ•ด๋‹น ์ปจํ…์ŠคํŠธ๋ฅผ ๊ตฌ๋…ํ•˜๋Š” ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฆฌ๋ Œ๋”๋ง์‹œํ‚ค๋ฏ€๋กœ ์ƒํƒœ๊ฐ€ ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ณ€ํ•˜๋Š” ๋Œ€๊ทœ๋ชจ ์•ฑ์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค [11-13]. - * ํŒ€ ๊ทœ๋ชจ๊ฐ€ 5~15๋ช… ์ˆ˜์ค€์ธ ์ค‘๊ฐ„ ์ด์ƒ์˜ ์•ฑ์—์„œ๋Š” ํ•„์š”ํ•œ ์ƒํƒœ ์กฐ๊ฐ(slice)๋งŒ ๊ตฌ๋…ํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง์„ ๋ฐฉ์ง€ํ•˜๋Š” **Zustand**๊ฐ€ ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค [13-15]. - * 500๊ฐœ ์ด์ƒ์˜ ์ปดํฌ๋„ŒํŠธ์™€ ๋ณต์žกํ•œ ๋น„๋™๊ธฐ ์ž‘์—…, 10๋ช… ์ด์ƒ์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ฐธ์—ฌํ•˜๋Š” ๋Œ€๊ทœ๋ชจ ํ™˜๊ฒฝ์—์„œ๋Š” ์ผ๊ด€๋œ ํŒจํ„ด ๊ฐ•์ œ, ์‹œ๊ณ„์—ด ๋””๋ฒ„๊น…(Time-travel debugging) ๋“ฑ ๊ฐ•๋ ฅํ•œ ๊ตฌ์กฐ๋ฅผ ์ œ๊ณตํ•˜๋Š” **Redux(RTK)**๊ฐ€ ์‚ฐ์—… ํ‘œ์ค€์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค [16-18]. -* **์„ฑ๋Šฅ ์—”์ง€๋‹ˆ์–ด๋ง ์ตœ์ ํ™” (Performance Engineering)** - * ๊ฑฐ๋Œ€ํ•œ JavaScript ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด `React.lazy`์™€ `Suspense`๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ผ์šฐํŠธ(Route) ๋ฐ ๋ฌด๊ฑฐ์šด ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„๋กœ **์ฝ”๋“œ ๋ถ„ํ• (Code Splitting)**์„ ์ ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [19-21]. - * Vite ๊ธฐ๋ฐ˜ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” `manualChunks`๋ฅผ ์„ค์ •ํ•˜์—ฌ React ์ฝ”์–ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๊ฐ™์ด ์ž์ฃผ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ๋ฒค๋” ๋ชจ๋“ˆ์„ ๋ถ„๋ฆฌ, ๋ธŒ๋ผ์šฐ์ € ์บ์‹ฑ ํšจ์œจ์„ ๊ทน๋Œ€ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [22, 23]. - * ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์€ ๋Œ€์šฉ๋Ÿ‰ ๋ชฉ๋ก์€ ์œˆ๋„์ž‰(Windowing/Virtualization) ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ทฐํฌํŠธ์— ๋ณด์ด๋Š” ํ•ญ๋ชฉ๋งŒ ๋ Œ๋”๋งํ•จ์œผ๋กœ์จ DOM ๊ณผ๋ถ€ํ•˜๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค [24, 25]. -* **๋ณต์›๋ ฅ ๋ฐ ๋””๋ฒ„๊น… ์ฒด๊ณ„ (Resilience & Debugging)** - * **์—๋Ÿฌ ๋ฐ”์šด๋”๋ฆฌ(Error Boundaries)**๋ฅผ ๋Œ€์‹œ๋ณด๋“œ๋‚˜ ์„œ๋“œํŒŒํ‹ฐ ์œ„์ ฏ ๋“ฑ ํ•ต์‹ฌ/๋ถˆ์•ˆ์ • ์˜์—ญ์— ๊ฐœ๋ณ„์ ์œผ๋กœ ์”Œ์›Œ, ํ•˜๋‚˜์˜ ์˜ค๋ฅ˜๊ฐ€ ์•ฑ ์ „์ฒด๋ฅผ ๋งˆ๋น„์‹œํ‚ค๋Š” 'ํฐ ํ™”๋ฉด(White screen of death)' ํ˜„์ƒ์„ ๋ฐฉ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [26-29]. - * Chrome DevTools์˜ Heap Snapshot๊ณผ Allocation Timeline์„ ํ†ตํ•ด ๋ถ„๋ฆฌ๋œ DOM ๋…ธ๋“œ(Detached DOM nodes)๋‚˜ ํ•ด์ œ๋˜์ง€ ์•Š์€ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋กœ ์ธํ•œ **๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜(Memory Leak)**๋ฅผ ์ฃผ๊ธฐ์ ์œผ๋กœ ์ ๊ฒ€ํ•ฉ๋‹ˆ๋‹ค [30-32]. -* **ํด๋ฆฐ ์ฝ”๋“œ ๋ฐ ์ฝ”๋“œ ๊ฑฐ๋ฒ„๋„Œ์Šค (Governance & Clean Code)** - * ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)์„ ๋ฐ”ํƒ•์œผ๋กœ ๋น„๋Œ€ํ•ด์ง„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ž˜๊ฒŒ ์ชผ๊ฐœ๊ณ , ESLint ๋ฐ Husky๋ฅผ ์—ฐ๋™ํ•˜์—ฌ ์˜์กด์„ฑ ๊ทœ์น™์ด๋‚˜ ๋ช…๋ช… ๊ทœ์น™(ํŒŒ์ผ์€ `kebab-case`, ์ปดํฌ๋„ŒํŠธ๋Š” `PascalCase`) ์œ„๋ฐ˜์„ ์ž๋™ํ™”๋œ CI/CD ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ์ฐจ๋‹จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [5, 33-36]. - -## โš–๏ธ Trade-offs & Caveats - -* **์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ์˜ ์œ ์—ฐ์„ฑ vs ๊ตฌ์กฐ์  ๊ฐ•์ œ์„ฑ**: Zustand๋Š” ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ๊ฐ€ ์—†์–ด ๊ฐœ๋ฐœ ์†๋„๋ฅผ ๋†’์—ฌ์ฃผ์ง€๋งŒ, ๊ณ ๋„์˜ ์œ ์—ฐ์„ฑ ํƒ“์— ๋Œ€๊ทœ๋ชจ ํŒ€์—์„œ๋Š” ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋กœ์ง์ด๋‚˜ ๋ฏธ๋“ค์›จ์–ด ํŒจํ„ด์ด ์ œ๊ฐ๊ฐ์œผ๋กœ ๋ถ„์—ด๋˜๋Š” ํ˜ผ๋ž€(Store Soup)์„ ์ดˆ๋ž˜ํ•  ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค [37-39]. ๋ฐ˜๋ฉด Redux๋Š” ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ๊ฐ€ ๋น„๋Œ€ํ•˜๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์œผ๋‚˜, ์žฅ๊ธฐ์ ์ธ ๊ด€์ ์—์„œ๋Š” ์ด '๊ตฌ์กฐ' ์ž์ฒด๊ฐ€ ํŒ€์˜ ์ผ๊ด€์„ฑ์„ ๊ฐ•์ œํ•˜์—ฌ ์‹ฌ๊ฐํ•œ ๋ฒ„๊ทธ๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค [17, 18, 40]. -* **์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ์ตœ์ ํ™”์˜ ์˜ค๋ฒ„ํ—ค๋“œ**: `React.memo`, `useCallback`, `useMemo`๋Š” ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง์„ ๋ง‰์•„์ฃผ์ง€๋งŒ ๋น„๊ต ์—ฐ์‚ฐ์ด๋ผ๋Š” ์ถ”๊ฐ€ ๋น„์šฉ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ตœ์ ํ™” ๋Œ€์ƒ ์ปดํฌ๋„ŒํŠธ์˜ ๋ Œ๋”๋ง ๋น„์šฉ์ด ์ €๋ ดํ•˜๊ฑฐ๋‚˜ props๊ฐ€ ์ˆ˜์‹œ๋กœ ๋ณ€ํ•˜๋Š” ๊ฒฝ์šฐ, ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๋น„์šฉ์ด ๋ Œ๋”๋ง ๋น„์šฉ์„ ์ดˆ๊ณผํ•˜์—ฌ ์˜คํžˆ๋ ค ์„ฑ๋Šฅ์ด ํ•˜๋ฝํ•˜๋Š” ์—ญํšจ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [41, 42]. -* **React Compiler ๋„์ž…์˜ ๋งน์ **: React Compiler๋Š” ๋นŒ๋“œ ํƒ€์ž„์— ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์ž๋™ํ™”ํ•˜์—ฌ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ๋Œ€ํญ ๊ฐœ์„ ํ•ฉ๋‹ˆ๋‹ค [43, 44]. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Š” ์–ด๋–ป๊ฒŒ ์ตœ์ ํ™”๋˜์—ˆ๋Š”์ง€ ์•Œ๊ธฐ ํž˜๋“  ๋ธ”๋ž™๋ฐ•์Šค๋กœ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ ๋ฌธ์ œ ๋””๋ฒ„๊น…์„ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค๋ฉฐ, ๋งค๋ฒˆ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ผ๋ถ€ ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(์˜ˆ: React Router, TanStack Query ๋“ฑ)์˜ ํ›…๊ณผ ์ถฉ๋Œํ•˜์—ฌ ์ตœ์ ํ™”๊ฐ€ ๋ฌด๋ ฅํ™”๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [45, 46]. -* **๊ธฐ๋Šฅ ๋ถ„ํ•  ์„ค๊ณ„(FSD)์˜ ์ดˆ๊ธฐ ์˜ค๋ฒ„ํ—ค๋“œ**: FSD ์•„ํ‚คํ…์ฒ˜๋Š” ์ฝ”๋“œ์˜ ๋ชจ๋“ˆํ™”๋ฅผ ๊ทน๋Œ€ํ™”ํ•˜์ง€๋งŒ, ํŠน์ • ๋ชจ๋“ˆ์ด '๊ธฐ๋Šฅ(feature)'์ธ์ง€ '์œ„์ ฏ(widget)'์ธ์ง€ ๋ถ„๋ฅ˜ํ•˜๊ธฐ ์œ„ํ•œ ์˜๋ฏธ๋ก ์  ๋…ผ์˜์— ์‹œ๊ฐ„์ด ์†Œ๋ชจ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํŒ€์› ์ „์ฒด๊ฐ€ ์ด ๋ฐฉ๋ฒ•๋ก ์„ ์˜จ์ „ํžˆ ์ดํ•ดํ•˜์ง€ ๋ชปํ•  ๊ฒฝ์šฐ ์˜คํžˆ๋ ค ๊ณต์œ  ํด๋”(`shared`)์— ์ฝ”๋“œ๊ฐ€ ๋ฌด๋ถ„๋ณ„ํ•˜๊ฒŒ ์Œ“์ด๋Š” ๋ถ€์ž‘์šฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [47, 48]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -#### [์•„ํ‚คํ…์ฒ˜ ๋ฐ ๊ตฌ์กฐ ์„ค๊ณ„] -- [[Feature-Sliced Design]] - - ์—ฐ๊ฒฐ ์ด์œ : ๋Œ€๊ทœ๋ชจ React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํŒŒํŽธํ™”๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ๊ด‘๋ฐ›๋Š” ์ตœ์‹  ๋„๋ฉ”์ธ/๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ฒ˜ ๋ฐฉ๋ฒ•๋ก ์ž…๋‹ˆ๋‹ค [49, 50]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ํ”„๋กœ์ ํŠธ์˜ ํด๋” ๊ตฌ์กฐ์™€ ์ปดํฌ๋„ŒํŠธ ๊ฐ„ ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ๊ทœ์น™์˜ ์‹ค์งˆ์  ์ ์šฉ ๋ฐฉ๋ฒ•์„ ํ•™์Šตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [4]. -- [[SOLID Principles]] - - ์—ฐ๊ฒฐ ์ด์œ : ๊ฐ์ฒด ์ง€ํ–ฅ ์›์น™์ด์ง€๋งŒ React์˜ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ ๋ถ„๋ฆฌ ๋ฐ ํ›…(Hook) ์„ค๊ณ„์— ๋™์ผํ•˜๊ฒŒ ์ ์šฉ๋˜์–ด ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•ฉ๋‹ˆ๋‹ค [51, 52]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ฑฐ๋Œ€ํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์–ธ์ œ, ์–ด๋–ป๊ฒŒ ๋ถ„๋ฆฌํ•ด์•ผ ํ•˜๋Š”์ง€(๋‹จ์ผ ์ฑ…์ž„ ์›์น™)์™€ Props์˜ ์˜ฌ๋ฐ”๋ฅธ ์ „๋‹ฌ ๋ฐฉ์‹(์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›์น™)์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [33, 53]. - -#### [์ƒํƒœ ๊ด€๋ฆฌ ๋ฐ ์„ฑ๋Šฅ ์ตœ์ ํ™”] -- [[Redux]] / [[Zustand]] - - ์—ฐ๊ฒฐ ์ด์œ : ์•ฑ์˜ ๊ทœ๋ชจ, ํŒ€์˜ ํฌ๊ธฐ, ์ƒํƒœ ๋ณ€๊ฒฝ ๋นˆ๋„์— ๋”ฐ๋ผ ์•„ํ‚คํ…์ฒ˜์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ธฐ์ˆ ์  ์„ ํƒ์ง€๊ฐ€ ๋ฉ๋‹ˆ๋‹ค [15, 54, 55]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ฆฌ๋ Œ๋”๋ง ์ตœ์ ํ™”, ์Šคํ† ์–ด ๋ถ„ํ•  ์ „๋žต, ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ์˜ ๊ตฌ์กฐ์  ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ๊ฐ€ ๊ฐ€์ง€๋Š” ์‹ค์ œ ํšจ์šฉ์„ฑ์„ ๋น„๊ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [13, 18, 56]. -- [[Code Splitting]] - - ์—ฐ๊ฒฐ ์ด์œ : ๋Œ€ํ˜• ์•ฑ์—์„œ ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ์ปค์ง€๋Š” JavaScript ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ œ์–ดํ•˜์—ฌ ์ดˆ๊ธฐ ๋กœ๋”ฉ ์„ฑ๋Šฅ(FCP, TTI)์„ ๋ณด์žฅํ•˜๋Š” ํ•ต์‹ฌ ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค [19, 57]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: `React.lazy`์™€ ๋ฒˆ๋“ค๋Ÿฌ(Vite/Webpack)๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ผ์šฐํŠธ๋‚˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์˜จ๋””๋งจ๋“œ๋กœ ์ง€์—ฐ ๋กœ๋”ฉํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [21, 23]. -- [[React Compiler]] - - ์—ฐ๊ฒฐ ์ด์œ : ์ˆ˜๋™์œผ๋กœ ์ž‘์„ฑํ•˜๋˜ `useMemo`, `useCallback` ๋“ฑ์„ ๋นŒ๋“œ ํƒ€์ž„์— ์ž๋™ํ™”ํ•˜์—ฌ ๋Œ€๊ทœ๋ชจ ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ๊ฐ€๋…์„ฑ๊ณผ ์„ฑ๋Šฅ์„ ํ˜์‹ ํ•˜๋Š” ์ตœ์‹  ๋„๊ตฌ์ž…๋‹ˆ๋‹ค [43, 58]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: React์˜ ๋ Œ๋”๋ง ๋™์ž‘ ๋ฐฉ์‹๊ณผ ์•ˆ์ •์  ์ฐธ์กฐ(Stable References)์˜ ์ค‘์š”์„ฑ์„ ๋” ๊นŠ์ด ํ†ต์ฐฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [45, 59]. - -#### [์•ˆ์ •์„ฑ ๋ณด์žฅ ๋ฐ ๋””๋ฒ„๊น…] -- [[Error Boundaries]] - - ์—ฐ๊ฒฐ ์ด์œ : ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜๋กœ๋ถ€ํ„ฐ ์‹œ์Šคํ…œ ์ „์ฒด๊ฐ€ ๋ถ•๊ดดํ•˜๋Š” ๊ฒƒ์„ ๋ง‰๊ณ , ์‚ฌ์šฉ์ž์—๊ฒŒ ์˜ˆ๋น„ UI๋ฅผ ์ œ๊ณตํ•˜๋Š” '๋ฐฉ์–ด์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ'์˜ ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค [26, 60]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: React ์ƒ๋ช…์ฃผ๊ธฐ ๋‚ด ์—๋Ÿฌ ํฌ์ฐฉ ์›๋ฆฌ์™€ ๋น„๋™๊ธฐ ์—๋Ÿฌ์™€์˜ ์ฐจ์ด์ ์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [61, 62]. - -### Deeper Research Questions - -- ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ Feature-Sliced Design์˜ ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ(Unidirectional dependencies) ๊ทœ์น™์ด ๊นจ์ง€์ง€ ์•Š๋„๋ก ESLint๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? -- Redux์˜ ๋ง‰๋Œ€ํ•œ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ๋น„์šฉ์ด Zustand์˜ ์œ ์—ฐ์„ฑ์œผ๋กœ ์ธํ•œ '์œ ์ง€๋ณด์ˆ˜ ํ˜ผ๋ž€' ๋น„์šฉ์„ ์—ญ์ „ํ•˜๋Š” ์ •ํ™•ํ•œ ์กฐ์ง์ , ๊ธฐ์ˆ ์  ์ž„๊ณ„์ ์€ ์–ด๋””์ธ๊ฐ€? -- React Compiler๊ฐ€ ์•ˆ์ •์ ์ธ ๊ฐ์ฒด ์ฐธ์กฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š” ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(TanStack Query, React Router ๋“ฑ)์™€ ๋งŒ๋‚ฌ์„ ๋•Œ ์„ฑ๋Šฅ ์ตœ์ ํ™”๊ฐ€ ๋ฌด๋ ฅํ™”๋˜๋Š” ํ˜„์ƒ์„ ๊ตฌ์กฐ์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ์šฐํšŒํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? -- Chrome DevTools์˜ Heap Snapshot์„ ํ†ตํ•ด ์‹๋ณ„๋˜๋Š” 'Detached DOM nodes' ๊ธฐ๋ฐ˜ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜์˜ ์ฃผ์š” ๋ฐœ์ƒ ํŒจํ„ด๊ณผ, ์ด๋ฅผ React ์ปดํฌ๋„ŒํŠธ ์ƒ๋ช…์ฃผ๊ธฐ ๋‚ด์—์„œ ์™„๋ฒฝํ•˜๊ฒŒ ํ•ด์ œ(Cleanup)ํ•˜๋Š” ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? -- ๊ธฐ์กด์˜ ๋‹จ์ˆœ ๊ธฐ๋Šฅ๋ณ„ ํด๋” ๊ตฌ์กฐ(Flat structure)์—์„œ Feature-Sliced Design ์•„ํ‚คํ…์ฒ˜๋กœ ์•ˆ์ „ํ•˜๊ฒŒ ์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์ ˆ์ฐจ์  ๋ฆฌํŒฉํ† ๋ง ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? - -### Practical Application Contexts - -- **Implementation:** ํŒŒ์ผ๊ณผ ์ปดํฌ๋„ŒํŠธ์˜ ๋ช…๋ช… ๊ทœ์น™(ํŒŒ์ผ์€ `kebab-case`, React ์ปดํฌ๋„ŒํŠธ๋Š” `PascalCase`)์„ ํ†ตํ•ฉํ•˜์—ฌ CI/CD ํŒŒ์ดํ”„๋ผ์ธ์—์„œ OS ๊ฐ„ ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„ ๋ฌธ์ œ๋กœ ์ธํ•œ ๋นŒ๋“œ ์—๋Ÿฌ๋ฅผ ๋ฏธ์—ฐ์— ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค [34-36, 63]. -- **System Design:** ์ดˆ๊ธฐ ๊ธฐํš ๋‹จ๊ณ„์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ™•์žฅ ๊ฐ€๋Šฅ์„ฑ์„ ๊ณ ๋ คํ•˜์—ฌ FSD(Feature-Sliced Design)๋ฅผ ๋„์ž…ํ•ด ์ปดํฌ๋„ŒํŠธ ๊ฐ„์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ณ  ๋„๋ฉ”์ธ๋ณ„ ์‘์ง‘๋„๋ฅผ ๋†’์ธ ์„ค๊ณ„๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค [2, 4]. -- **Operation / Maintenance:** Sentry ๋ฐ LogRocket ๋“ฑ์˜ ํด๋ผ์šฐ๋“œ ๋กœ๊น… ๋„๊ตฌ๋ฅผ ์—ฐ๋™ํ•˜๊ณ  Error Boundaries๋ฅผ ์ „๋žต์ ์œผ๋กœ ๋ฐฐ์น˜ํ•˜์—ฌ, ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์˜ UI ํฌ๋ž˜์‹œ๋ฅผ ๊ฒฉ๋ฆฌํ•˜๊ณ  ๋ฒ„๊ทธ ๋ฐœ์ƒ ๊ฒฝ๋กœ๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ์ถ”์  ๊ฐ€๋Šฅํ•˜๊ฒŒ ์šด์˜ํ•ฉ๋‹ˆ๋‹ค [26, 64, 65]. -- **Learning Path:** ๋‹จ์ˆœ Prop Drilling์„ ๋ง‰๊ธฐ ์œ„ํ•œ Context API ํ•™์Šต์—์„œ ์ถœ๋ฐœํ•ด, ๋ Œ๋”๋ง ์ตœ์ ํ™”๊ฐ€ ํ•„์š”ํ•  ๋•Œ Zustand๋ฅผ ์ตํžˆ๊ณ , ๊ถ๊ทน์ ์œผ๋กœ 10์ธ ์ด์ƒ์˜ ๋Œ€๊ทœ๋ชจ ํŒ€ ํ™˜๊ฒฝ์„ ๊ฐ€์ •ํ•˜์—ฌ Redux ๋ฐ RTK Query๋ฅผ ํ™œ์šฉํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ํ•™์Šต์„ ๊ณ ๋„ํ™”ํ•ฉ๋‹ˆ๋‹ค [66, 67]. -- **My Project Relevance:** ํ˜„์žฌ ์†Œ์†๋œ ํ”„๋ก ํŠธ์—”๋“œ ํ”„๋กœ์ ํŠธ์˜ ๋ณ‘๋ชฉ ํ˜„์ƒ(๋น„๋Œ€ํ•œ ๋ฒˆ๋“ค, ๋ฌด๋ถ„๋ณ„ํ•œ ๋ฆฌ๋ Œ๋”๋ง, ํŒŒ์ผ ๊ตฌ์กฐ์˜ ํŒŒํŽธํ™”)์„ ์ง„๋‹จํ•˜๊ณ , `React.memo` ๋‚จ์šฉ ์ œ๊ฑฐ, Vite `manualChunks` ์ ์šฉ, ๊ธฐ๋Šฅ๋ณ„ ํด๋” ์žฌ๊ตฌ์„ฑ ๋“ฑ ๊ตฌ์ฒด์ ์ธ ๋ฆฌํŒฉํ† ๋ง์˜ ์ง€์นจ์œผ๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [22, 68-70]. - -### Adjacent Topics - -- [[Next.js Server Components]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋Œ€๊ทœ๋ชจ React ์•ฑ์—์„œ ํด๋ผ์ด์–ธํŠธ ์ธก JavaScript ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ๊ทน๋‹จ์ ์œผ๋กœ ์ค„์ด๊ณ , ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ ๊ด€๋ฆฌ์˜ ํ•„์š”์„ฑ์„ ๋ฐ์ดํ„ฐ ํŒจ์นญ ๋‹จ๊ณ„์—์„œ ์„œ๋ฒ„๋กœ ์ด๊ด€ํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜์  ํŒจ๋Ÿฌ๋‹ค์ž„ ์ „ํ™˜์„ ํƒ๊ตฌํ•ฉ๋‹ˆ๋‹ค [71, 72]. -- [[Micro-Frontends]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋‹จ์ผ ๋ชจ๋…ธ๋ฆฌํ‹ฑ(Monolithic) React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ•œ๊ณ„๋ฅผ ๋„˜์–ด, ๋…๋ฆฝ์ ์œผ๋กœ ๋ฐฐํฌ ๋ฐ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์—ฌ๋Ÿฌ ํŒ€์˜ ํ”„๋ก ํŠธ์—”๋“œ ์กฐ๊ฐ๋“ค์„ ํ•˜๋‚˜์˜ ์•ฑ์œผ๋กœ ๊ฒฐํ•ฉํ•˜์—ฌ ์กฐ์ง์˜ ํ™•์žฅ์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์—ฐ๊ตฌํ•ฉ๋‹ˆ๋‹ค [50, 73]. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Lazy Loading.md b/00_Raw/Lazy Loading.md deleted file mode 100644 index 8756a85b..00000000 --- a/00_Raw/Lazy Loading.md +++ /dev/null @@ -1,63 +0,0 @@ -# [[Lazy Loading]] - -## ๐Ÿ“Œ Brief Summary -Lazy Loading์€ ๋ฆฌ์†Œ์Šค๋‚˜ ์ฝ”๋“œ ์ฒญํฌ๋ฅผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ดˆ๊ธฐ ๊ตฌ๋™ ์‹œ ํ•œ ๋ฒˆ์— ๋กœ๋“œํ•˜์ง€ ์•Š๊ณ , ์‚ฌ์šฉ์ž๊ฐ€ ์‹ค์ œ๋กœ ํ•„์š”๋กœ ํ•˜๋Š” ์‹œ์ ์— ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค [1, 2]. ํ”„๋ก ํŠธ์—”๋“œ ํ™˜๊ฒฝ์—์„œ๋Š” ์ดˆ๊ธฐ JavaScript ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ตœ๋Œ€ 20~70%๊นŒ์ง€ ์ค„์—ฌ ์ดˆ๊ธฐ ํŽ˜์ด์ง€ ๋กœ๋“œ ์‹œ๊ฐ„์„ ํš๊ธฐ์ ์œผ๋กœ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค [3]. ์ฃผ๋กœ ๊ฒฝ๋กœ(Route) ๊ธฐ๋ฐ˜ ์ปดํฌ๋„ŒํŠธ, ๋ฌด๊ฑฐ์šด UI ์œ„์ ฏ(์ฐจํŠธ ๋“ฑ), ๋ทฐํฌํŠธ ํ•˜๋‹จ์˜ ์ด๋ฏธ์ง€ ๋“ฑ์— ์ ์šฉ๋˜์–ด ์•ฑ์˜ ์ „๋ฐ˜์ ์ธ ๋ฐ˜์‘์„ฑ๊ณผ Core Web Vitals ์ง€ํ‘œ๋ฅผ ๊ฐœ์„ ํ•ฉ๋‹ˆ๋‹ค [4, 5]. - -## ๐Ÿ“– Core Content -* **JavaScript ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…๊ณผ ๋™์  ์ž„ํฌํŠธ(Dynamic Imports)**: Lazy Loading์€ ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์˜จ๋””๋งจ๋“œ(on-demand)๋กœ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋Š” ๋” ์ž‘์€ ์ฒญํฌ(chunk)๋กœ ๋ถ„ํ• ํ•˜๋Š” ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…(Code Splitting) ๊ธฐ๋ฒ•์˜ ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค [2]. ๋™์  ์ž„ํฌํŠธ๋ฅผ ํ†ตํ•ด Vite๋‚˜ Webpack ๊ฐ™์€ ๋นŒ๋“œ ํˆด์ด ๋ Œ๋”๋ง์— ๋‹น์žฅ ํ•„์š”ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๋ฅผ ๋ฉ”์ธ ๋ฒˆ๋“ค์—์„œ ๋ถ„๋ฆฌํ•˜์—ฌ ๋…๋ฆฝ์ ์ธ ํŒŒ์ผ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค [1, 6, 7]. -* **React ํ™˜๊ฒฝ์—์„œ์˜ ๊ตฌํ˜„ (`React.lazy` ๋ฐ `Suspense`)**: React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” `React.lazy()` ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ปดํฌ๋„ŒํŠธ์˜ ์ง€์—ฐ ๋กœ๋”ฉ์„ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค [8]. ๋ชจ๋“ˆ์ด ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ๋‹ค์šด๋กœ๋“œ๋˜๋Š” ๋™์•ˆ ํ™”๋ฉด์ด ๋ฉˆ์ถ”๊ฑฐ๋‚˜ ๋น„์–ด ๋ณด์ด์ง€ ์•Š๋„๋ก, ``๋ฅผ ๊ฐ์‹ธ์„œ ๋กœ๋”ฉ ์Šคํ”ผ๋„ˆ์™€ ๊ฐ™์€ ๋Œ€์ฒด UI(Fallback UI)๋ฅผ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค [7, 8]. -* **๋ผ์šฐํŠธ ๋ ˆ๋ฒจ ๋ฐ ์ปดํฌ๋„ŒํŠธ ๋ ˆ๋ฒจ ์ง€์—ฐ ๋กœ๋”ฉ**: ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ๋ฐฉ์‹์€ ๋ผ์šฐํŠธ ๋ ˆ๋ฒจ์—์„œ ์ ์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ, ์‚ฌ์šฉ์ž๊ฐ€ ํŠน์ • ํŽ˜์ด์ง€๋กœ ๋„ค๋น„๊ฒŒ์ด์…˜ํ•  ๋•Œ๋งŒ ํ•ด๋‹น ํŽ˜์ด์ง€์˜ JavaScript ์ฒญํฌ๊ฐ€ ๋‹ค์šด๋กœ๋“œ๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค [2, 7]. ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„๋กœ๋Š” ์„œ๋“œํŒŒํ‹ฐ ํ†ตํ•ฉ ๊ธฐ๋Šฅ(๋น„๋””์˜ค ํ”Œ๋ ˆ์ด์–ด, PDF ๋ทฐ์–ด ๋“ฑ)์ด๋‚˜ ์ฐจํŠธ, ๋ฆฌ์น˜ ํ…์ŠคํŠธ ์—๋””ํ„ฐ ๊ฐ™์ด ๋ฌด๊ฑฐ์šด UI ๋ธ”๋ก์— ์ ์šฉํ•˜์—ฌ ๋ฉ”์ธ ๋ฒˆ๋“ค์„ ์ตœ์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค [5, 6]. -* **์ด๋ฏธ์ง€(Media) ์ตœ์ ํ™”**: JavaScript ์ฝ”๋“œ๋ฟ ์•„๋‹ˆ๋ผ ๋ฏธ๋””์–ด ๋ฆฌ์†Œ์Šค์—๋„ Lazy Loading์ด ๋„๋ฆฌ ์“ฐ์ž…๋‹ˆ๋‹ค [4]. HTML `` ํƒœ๊ทธ์— ๋„ค์ดํ‹ฐ๋ธŒ ์†์„ฑ์ธ `loading="lazy"`๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด, ์Šคํฌ๋กค์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž์˜ ๋ทฐํฌํŠธ์— ๋„๋‹ฌํ•˜๊ธฐ ์ „๊นŒ์ง€ ์ด๋ฏธ์ง€๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ดˆ๊ธฐ ํŽ˜์ด์ง€ ๋กœ๋”ฉ์˜ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ค„์ž…๋‹ˆ๋‹ค [4]. - -## โš–๏ธ Trade-offs & Caveats -* **์ดˆ๊ธฐ ๋ทฐํฌํŠธ(Above-the-fold) ์ฝ˜ํ…์ธ  ์ ์šฉ ๊ธˆ์ง€**: ์ง€์—ฐ ๋กœ๋”ฉ์€ ์Šคํฌ๋กค ์—†์ด ์ฒ˜์Œ ํ™”๋ฉด์— ๋ฐ”๋กœ ๋ณด์—ฌ์•ผ ํ•˜๋Š” ํ•ต์‹ฌ ์ฝ˜ํ…์ธ (Above-the-fold)๋‚˜ ์ฆ‰์‹œ ์ƒํ˜ธ์ž‘์šฉํ•ด์•ผ ํ•˜๋Š” ๋ Œ๋”๋ง์ด ๋น ๋ฅธ ์š”์†Œ์—๋Š” ์ ˆ๋Œ€ ์ ์šฉํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค [5]. ์ด๋ฅผ ์ ์šฉํ•  ๊ฒฝ์šฐ ์ดˆ๊ธฐ ํŽ˜์ธํŠธ ์‹œ๊ฐ„์ด ๋А๋ ค์ง€๊ณ  ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์ด ์‹ฌ๊ฐํ•˜๊ฒŒ ์ €ํ•˜๋ฉ๋‹ˆ๋‹ค [5, 9]. -* **์‚ฌ์šฉ์ž ์ธํ„ฐ๋ž™์…˜ ์‹œ ์ผ์‹œ์  ์ง€์—ฐ ๋ฐœ์ƒ**: ์ง€์—ฐ ๋กœ๋”ฉ๋œ ๊ธฐ๋Šฅ์ด๋‚˜ ํŽ˜์ด์ง€์— ์‚ฌ์šฉ์ž๊ฐ€ ์ฒ˜์Œ ์ ‘๊ทผํ•  ๋•Œ, ๋ธŒ๋ผ์šฐ์ €๋Š” ํ•„์š”ํ•œ ์Šคํฌ๋ฆฝํŠธ ์ฒญํฌ๋ฅผ ๊ทธ์ œ์•ผ ๋„คํŠธ์›Œํฌ๋กœ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค [7, 8, 10]. ์ด๋กœ ์ธํ•ด ์•ฝ๊ฐ„์˜ ๋Œ€๊ธฐ ์‹œ๊ฐ„์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ``๋ฅผ ํ†ตํ•œ ํด๋ฐฑ ์ƒํƒœ๋ฅผ ์„ธ์‹ฌํ•˜๊ฒŒ ๋””์ž์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [8, 11]. -* **๊ณผ๋„ํ•œ ํŒŒํŽธํ™”(Over-fragmentation) ์ฃผ์˜**: ํฌ๊ธฐ๊ฐ€ ์ž‘๊ณ  ๊ฐ€๋ฒผ์šด ๊ธฐ๋Šฅ๊นŒ์ง€ ๋ชจ๋‘ ์ง€์—ฐ ๋กœ๋”ฉ์œผ๋กœ ๋ถ„๋ฆฌํ•  ๊ฒฝ์šฐ, ์˜คํžˆ๋ ค ๋ธŒ๋ผ์šฐ์ €์˜ ๋„คํŠธ์›Œํฌ ์š”์ฒญ ํšŸ์ˆ˜๊ฐ€ ๊ธ‰์ฆํ•˜๊ณ  ๊ด€๋ฆฌํ•ด์•ผ ํ•  ๋กœ๋”ฉ ์ƒํƒœ(`Suspense`)๊ฐ€ ๋งŽ์•„์ ธ ์„ฑ๋Šฅ ๋ฐ ๊ฐœ๋ฐœ ํšจ์œจ์„ ๋–จ์–ด๋œจ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5, 12]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -#### [์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] -- [[Code Splitting]] - - ์—ฐ๊ฒฐ ์ด์œ : Lazy Loading์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋‹จ์ผ JavaScript ๋ฒˆ๋“ค์„ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž‘์€ ์ฒญํฌ ๋‹จ์œ„๋กœ ๋‚˜๋ˆ„๋Š” ๊ทผ๋ณธ์ ์ธ ๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [2, 13]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ชจ๋˜ ํ”„๋ก ํŠธ์—”๋“œ ํ™˜๊ฒฝ์—์„œ ๋นŒ๋“œ ํˆด(Vite, Webpack)์ด ๋Ÿฐํƒ€์ž„ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด ์ฝ”๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ๋ถ„ํ• ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [6, 7]. - -- [[Dynamic Imports]] - - ์—ฐ๊ฒฐ ์ด์œ : ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ชจ๋“ˆ์„ ํŒŒ์ผ์˜ ์ตœ์ƒ๋‹จ์—์„œ ์ •์ ์œผ๋กœ ๋ถˆ๋Ÿฌ์˜ค์ง€ ์•Š๊ณ , ์‹คํ–‰ ์ค‘์— ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ์œ„ํ•ด `import()` ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค [1, 7]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ผ์šฐํŠธ ์ „ํ™˜์ด๋‚˜ ํŠน์ • ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ์ ์— ํ•„์š”ํ•œ ์ฝ”๋“œ๋งŒ ๋„คํŠธ์›Œํฌ๋กœ ํ˜ธ์ถœํ•˜๋Š” ๋Ÿฐํƒ€์ž„ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [7]. - -#### [๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ] -- [[React Suspense]] - - ์—ฐ๊ฒฐ ์ด์œ : `React.lazy()`๋ฅผ ์ด์šฉํ•ด ์ง€์—ฐ ๋กœ๋”ฉ์„ ์ˆ˜ํ–‰ํ•  ๋•Œ, ์ฒญํฌ๊ฐ€ ๋กœ๋“œ๋˜๊ธฐ ์ „๊นŒ์ง€ ๋ Œ๋”๋ง์„ ์ผ์‹œ ์ค‘์ง€ํ•˜๊ณ  Fallback UI๋ฅผ ํ™”๋ฉด์— ๊ทธ๋ ค์ฃผ๋Š” ํ•ต์‹ฌ ์ปดํฌ๋„ŒํŠธ์ž…๋‹ˆ๋‹ค [7, 8]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋น„๋™๊ธฐ UI ๋กœ๋”ฉ ์‹œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜(UX)์„ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๋ Œ๋”๋ง ์ œ์–ด ๋ฐ ๋กœ๋”ฉ ์ƒํƒœ ์„ค๊ณ„ ํŒจํ„ด์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [8, 11]. - -- [[Vite manualChunks]] - - ์—ฐ๊ฒฐ ์ด์œ : Vite๋ฅผ ํ†ตํ•ด ๋นŒ๋“œํ•  ๋•Œ, ๋ณ€๊ฒฝ์ด ์žฆ์ง€ ์•Š์€ ๋ฌด๊ฑฐ์šด ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(React ์ฝ”์–ด ๋“ฑ)๋ฅผ Lazy Loading์˜ ์ฒญํฌ ๋ถ„ํ•  ์ „๋žต๊ณผ ๊ฒฐํ•ฉํ•ด ๋ณ„๋„ ํŒŒ์ผ๋กœ ๋…๋ฆฝ์‹œํ‚ค๋Š” ํ™˜๊ฒฝ ์„ค์ •์ž…๋‹ˆ๋‹ค [7, 14]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ธŒ๋ผ์šฐ์ € ์บ์‹ฑ ์ „๋žต์„ ๊ทน๋Œ€ํ™”ํ•˜๊ณ , ์ดˆ๊ธฐ ๋ฒˆ๋“ค ์šฉ๋Ÿ‰ ๊ฒฝ๊ณ ("Large Chunks") ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ๋ฒˆ๋“ค๋Ÿฌ ์ตœ์ ํ™” ๋ฐฉ๋ฒ•์„ ํ•™์Šตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [7, 15]. - -### Deeper Research Questions - -- React 18์˜ ๋™์‹œ์„ฑ ๋ Œ๋”๋ง(Concurrent Rendering) ๊ธฐ๋Šฅ์ธ `useTransition` ๋“ฑ์€ ์ง€์—ฐ ๋กœ๋”ฉ ์‹œ ๋ฐœ์ƒํ•˜๋Š” UI ๋ฉˆ์ถค ํ˜„์ƒ์„ ์–ด๋–ป๊ฒŒ ๋ณด์™„ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? [16, 17] -- ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ์ €ํ•˜๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด ์ง€์—ฐ ๋กœ๋”ฉ๋˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉ์ž๊ฐ€ ํด๋ฆญํ•˜๊ธฐ ์ง์ „์— ๋ฏธ๋ฆฌ ๊ฐ€์ ธ์˜ค๋Š” Prefetching ์ „๋žต์€ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•˜๋Š”๊ฐ€? [18, 19] -- Next.js์˜ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ ์ง€์—ฐ ๋กœ๋”ฉ๊ณผ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ(RSC) ์•„ํ‚คํ…์ฒ˜๋Š” ์ดˆ๊ธฐ ๋ฒˆ๋“ค ์ตœ์ ํ™” ์ธก๋ฉด์—์„œ ์–ด๋–ค ์ฐจ์ด์ ๊ณผ ์‹œ๋„ˆ์ง€๋ฅผ ๊ฐ€์ง€๋Š”๊ฐ€? [5, 20, 21] -- ๋ฌด๊ฑฐ์šด UI ๋ธ”๋ก์„ ์ง€์—ฐ ๋กœ๋”ฉํ•  ๋•Œ, `rollup-plugin-visualizer`์™€ ๊ฐ™์€ ๋ฒˆ๋“ค ๋ถ„์„ ๋„๊ตฌ๋ฅผ ํ†ตํ•ด ์ง€์—ฐ ๋กœ๋”ฉ ๋Œ€์ƒ์„ ์–ด๋–ป๊ฒŒ ํšจ๊ณผ์ ์œผ๋กœ ์‹๋ณ„ํ•˜๊ณ  ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ •ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? [10, 12] -- ๋„ค์ดํ‹ฐ๋ธŒ ๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋Šฅ์ธ `loading="lazy"` ์†์„ฑ๊ณผ JavaScript ๊ธฐ๋ฐ˜์˜ Intersection Observer API๋ฅผ ํ™œ์šฉํ•œ ๋ฏธ๋””์–ด ์ง€์—ฐ ๋กœ๋”ฉ์˜ ์„ฑ๋Šฅ ์ตœ์ ํ™” ํ•œ๊ณ„์ ๊ณผ Trade-off๋Š” ๋ฌด์—‡์ธ๊ฐ€? [4] - -### Practical Application Contexts - -- **Implementation:** React ์ฝ”๋“œ ์ƒ๋‹จ์˜ ๋ฌด๊ฑฐ์šด ์™ธ๋ถ€ ์ปดํฌ๋„ŒํŠธ(์˜ˆ: ์—๋””ํ„ฐ, ์ฐจํŠธ ๋“ฑ) import ๋ฌธ์„ ์ง€์šฐ๊ณ , `const Dashboard = React.lazy(() => import('./Dashboard'));`์™€ ๊ฐ™์ด ๋ณ€๊ฒฝํ•œ ํ›„ ๋ Œ๋”๋ง ์˜์—ญ์„ `}>`๋กœ ๊ฐ์Œ‰๋‹ˆ๋‹ค [1, 6-8]. -- **System Design:** ํ”„๋ก ํŠธ์—”๋“œ ๋ผ์šฐํŒ… ๋ฐ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ ์‹œ๋ถ€ํ„ฐ, ํ•„์ˆ˜ ์ดˆ๊ธฐ ์ง„์ž… ํ™”๋ฉด(Above-the-fold)์€ ์ฆ‰์‹œ ๋กœ๋“œํ•˜๊ณ , ๊ด€๋ฆฌ์ž ํŒจ๋„์ด๋‚˜ ์ž˜ ์“ฐ์ด์ง€ ์•Š๋Š” ๋ผ์šฐํŠธ๋Š” ๋ถ„๋ฆฌํ•˜์—ฌ Code Splitting๋˜๋„๋ก ์‹œ์Šคํ…œ์˜ ๋ฒˆ๋“ค๋ง ์ „๋žต์„ ๊ตฌ์ƒํ•ฉ๋‹ˆ๋‹ค [5, 12, 14]. -- **Operation / Maintenance:** ์šด์˜ ์ค‘์ธ ์„œ๋น„์Šค๊ฐ€ ๋ฌด๊ฑฐ์›Œ์ง€๊ฑฐ๋‚˜ Vite ๋นŒ๋“œ ์‹œ "500 kB ์ดˆ๊ณผ ์ฒญํฌ" ๊ฒฝ๊ณ ๊ฐ€ ๋œฐ ๊ฒฝ์šฐ, ๋ฒˆ๋“ค ๋ถ„์„ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ด ๋ฉ”์ธ ๋ฒˆ๋“ค์—์„œ ๋ถ„๋ฆฌ ๊ฐ€๋Šฅํ•œ ๋ฌด๊ฑฐ์šด ๋ฒค๋”๋‚˜ ํŠน์ • ๋ผ์šฐํŠธ๋ฅผ ์‹๋ณ„ํ•ด ์ ์ง„์ ์œผ๋กœ Lazy Loading์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค [10, 12, 15]. -- **Learning Path:** React ๊ธฐ์ดˆ ๋ Œ๋”๋ง ์‚ฌ์ดํด ํ•™์Šต โž” JavaScript ๋ชจ๋“ˆ ๋ฐ ๋ฒˆ๋“ค๋Ÿฌ ๊ตฌ์กฐ ์ดํ•ด โž” `React.lazy`์™€ `Suspense`๋ฅผ ํ†ตํ•œ ๋ผ์šฐํŠธ ์Šคํ”Œ๋ฆฌํŒ… ์ ์šฉ โž” Chrome ์„ฑ๋Šฅ ํƒญ๊ณผ Web Vitals๋กœ ์‹ค์ œ ๋กœ๋“œ ์†๋„ ์ธก์ • ๋ฐ ๊ฒ€์ฆ [13, 22, 23]. -- **My Project Relevance:** ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ทœ๋ชจ๊ฐ€ ์ปค์ง์— ๋”ฐ๋ผ ํ•„์—ฐ์ ์œผ๋กœ ์ฆ๊ฐ€ํ•˜๋Š” JavaScript ํŽ˜์ด๋กœ๋“œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ , FCP(First Contentful Paint)์™€ TTI(Time to Interactive) ๋“ฑ ํ•ต์‹ฌ ์„ฑ๋Šฅ ์ง€ํ‘œ๋ฅผ ๋ฐฉ์–ดํ•˜๊ธฐ ์œ„ํ•œ ํ•„์ˆ˜์ ์ธ ๋ Œ๋”๋ง ์ตœ์ ํ™” ์ „๋žต์ž…๋‹ˆ๋‹ค [3, 8]. - -### Adjacent Topics - -- [[Core Web Vitals]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ์ง€์—ฐ ๋กœ๋”ฉ์ด ๊ฒ€์ƒ‰ ์—”์ง„ ์ตœ์ ํ™”(SEO) ๋ฐ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ์ง€ํ‘œ์ธ FCP, LCP(Largest Contentful Paint), INP(Interaction to Next Paint) ์ˆ˜์น˜๋ฅผ ์‹ค์ œ๋กœ ์–ผ๋งˆ๋‚˜ ๊ฐœ์„ ํ•˜๋Š”์ง€ ์ธก์ • ๋ฐ ๋ถ„์„ํ•˜๋Š” ๊ด€์ ์œผ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3, 23, 24]. -- [[Server Components (RSC)]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํฌ๊ธฐ๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•œ ๋˜ ๋‹ค๋ฅธ ํ˜„๋Œ€์  ํŒจ๋Ÿฌ๋‹ค์ž„์œผ๋กœ, ํด๋ผ์ด์–ธํŠธ์—์„œ ์‹คํ–‰๋  ์ฝ”๋“œ๋ฅผ ์•„์˜ˆ ์„œ๋ฒ„์—์„œ ๋ Œ๋”๋งํ•˜๊ณ  HTML๋กœ๋งŒ ๋ณด๋‚ด๋Š” ๋ฐฉ์‹๊ณผ Lazy Loading๊ณผ์˜ ์—ญํ• ์„ ๋น„๊ต/๋Œ€์กฐํ•ฉ๋‹ˆ๋‹ค [20, 21]. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Legacy Codebase Refactoring.md b/00_Raw/Legacy Codebase Refactoring.md deleted file mode 100644 index fa8d378d..00000000 --- a/00_Raw/Legacy Codebase Refactoring.md +++ /dev/null @@ -1,70 +0,0 @@ -# [[Legacy Codebase Refactoring]] - -## ๐Ÿ“Œ Brief Summary -Legacy Codebase Refactoring(๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฒ ์ด์Šค ๋ฆฌํŒฉํ„ฐ๋ง)์€ ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ๋…ธํ›„ํ™”๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ฝ”๋“œ๋ฅผ ๋™์ž‘ ๋ณ€ํ™” ์—†์ด ์ ์ง„์ ์œผ๋กœ ๊ฐœ์„ ํ•˜์—ฌ ๊ตฌ์กฐ๋ฅผ ํ˜„๋Œ€ํ™”ํ•˜๋Š” ์ž‘์—…์ž…๋‹ˆ๋‹ค [1]. ๋‹จ์ˆœํžˆ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์— ๊ทธ์น˜์ง€ ์•Š๊ณ  ์‹œ์Šคํ…œ์˜ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์ด๋ฉฐ ๊ธฐ์ˆ  ๋ถ€์ฑ„๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ํ•ต์‹ฌ ๊ณผ์ •์ž…๋‹ˆ๋‹ค [1]. React ์ƒํƒœ๊ณ„์—์„œ๋Š” ์ฃผ๋กœ ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ(Hooks)๋กœ ์ „ํ™˜ํ•˜๊ฑฐ๋‚˜, ๋…ธํ›„ํ™”๋œ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ตœ์‹  ๋„๊ตฌ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋ฉฐ, ์ฝ”๋“œ๋ฒ ์ด์Šค์— ํ…Œ์ŠคํŠธ ๋ฐ ์ •์  ๋ถ„์„ ๋„๊ตฌ๋ฅผ ํ†ตํ•ฉํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค [1-3]. - -## ๐Ÿ“– Core Content -* **์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ „๋žต (Incremental Migration):** - ๋ ˆ๊ฑฐ์‹œ ์‹œ์Šคํ…œ์„ ํ•œ ๋ฒˆ์— ๋ชจ๋‘ ์žฌ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ์œ„ํ—˜์„ฑ์ด ํฝ๋‹ˆ๋‹ค [1]. ๋”ฐ๋ผ์„œ "์žฌ์ž‘์„ฑํ•˜์ง€ ๋ง๊ณ  ๋ฆฌํŒฉํ„ฐ๋งํ•˜๋ผ(refactor, do not rewrite)"๋Š” ์ฒ ํ•™์„ ๋ฐ”ํƒ•์œผ๋กœ, ๊ธฐ์กด์˜ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ์„ ๊ณ„์†ํ•˜๋ฉด์„œ ์ƒํƒœ ๊ด€๋ฆฌ ์Šคํ† ์–ด๋‚˜ ์•„ํ‚คํ…์ฒ˜๋ฅผ ํ•˜๋‚˜์”ฉ ์ ์ง„์ ์œผ๋กœ ์ด๋™ํ•˜๋Š” ์ „๋žต์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค [1]. -* **ํ…Œ์ŠคํŠธ ์ฃผ๋„ ์ ‘๊ทผ ๋ฐ ๋™์ž‘ ๋ณด์žฅ:** - ๋ฆฌํŒฉํ„ฐ๋ง์„ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ๋ฐ˜๋“œ์‹œ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋‚˜ UI ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [4, 5]. ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋Š” ๊ธฐ์กด ์ฝ”๋“œ์˜ ์—ญํ• ์„ ์ดํ•ดํ•˜๊ฒŒ ๋„์™€์ฃผ๋ฉฐ, ๋ฆฌํŒฉํ„ฐ๋ง ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ ํŒŒ์†(regression)์„ ์ฆ‰์‹œ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค [4, 6]. -* **React ํŠนํ™” ๋ฆฌํŒฉํ„ฐ๋ง ์ฒดํฌ๋ฆฌ์ŠคํŠธ:** - * **์ปดํฌ๋„ŒํŠธ ๋ฐ ๋กœ์ง ์ „ํ™˜:** ํด๋ž˜์Šค ๊ธฐ๋ฐ˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์™€ ํ›…(Hooks)์œผ๋กœ ๊ต์ฒดํ•˜๊ณ , TypeScript๋ฅผ ์ ์ง„์ ์œผ๋กœ ๋„์ž…ํ•ฉ๋‹ˆ๋‹ค [2, 7]. - * **์ƒํƒœ ๊ด€๋ฆฌ ํ˜„๋Œ€ํ™”:** ๋ถˆํ•„์š”ํ•œ `useEffect`๋ฅผ ์ œ๊ฑฐํ•˜๊ณ , ๋ณต์žกํ•œ ์ „์—ญ ์Šคํ† ์–ด๋ฅผ ๋Œ€์ฒดํ•˜๊ธฐ ์œ„ํ•ด ์„œ๋ฒ„ ์ƒํƒœ๋Š” Tanstack Query๋กœ, ํด๋ผ์ด์–ธํŠธ ์ „์—ญ ์ƒํƒœ๋Š” Context๋‚˜ Zustand๋กœ ์—ญํ• ์„ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค [2]. - * **์‚ฌ์šฉ์ž ์ •์˜ ํ›… ๋‹จ์œ„์˜ ์ถ”์ถœ:** ๋ณต์žกํ•œ ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์— ํ˜ผ์žฌ๋œ ๋กœ์ง์„ ์‚ฌ์šฉ์ž ์ •์˜ ํ›…(Custom Hooks)์œผ๋กœ ๋ถ„๋ฆฌํ•ด ๋ชจ๋“ˆํ™”์™€ ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•ฉ๋‹ˆ๋‹ค [1, 8]. - * **์ตœ์ ํ™” ๋„๊ตฌ ์ •๋ฆฌ:** React 19์™€ ๊ฐ™์€ ์ตœ์‹  ๋ฒ„์ „์„ ํ™œ์šฉํ•  ๊ฒฝ์šฐ, ์ฝ”๋“œ๋ฅผ ์–ด์ง€๋Ÿฝํžˆ๋Š” ๋ถˆํ•„์š”ํ•œ `useMemo`๋‚˜ `useCallback` ๋“ฑ์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [9]. -* **๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๋ถ„์„ ๋ฐ ์ฝ”๋“œ ํ’ˆ์งˆ ํ‘œ์ค€ํ™”:** - ๋ฆฌํŒฉํ„ฐ๋ง ์ „ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ์ „์—ญ UI ์Šคํ† ์–ด์˜ ์—ญํ• ์„ ์™„์ „ํžˆ ์ดํ•ดํ•˜๊ณ , ์ „์—ญ ๋ ˆ๋ฒจ์—์„œ ๋กœ์ปฌ ๋ ˆ๋ฒจ๋กœ ๋ถ„์„์„ ์ขํ˜€ ๋‚˜๊ฐ€์•ผ ํ•ฉ๋‹ˆ๋‹ค [8, 10]. ๋”๋ถˆ์–ด CSS ์Šคํƒ€์ผ ๋ฐฉ์‹์„ ํ•œ ๊ฐ€์ง€๋กœ ํ†ต์ผํ•˜๊ณ  [11, 12], ESLint(eslint-plugin-react ๋“ฑ)๋ฅผ ์ ์šฉํ•˜์—ฌ ์ฝ”๋“œ ์ปจ๋ฒค์…˜์„ ๊ฐ•์ œํ•จ์œผ๋กœ์จ ์ฝ”๋“œ ์Šค๋ฉœ์„ ๋ฐฉ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [3]. - -## โš–๏ธ Trade-offs & Caveats -* **์ „์ฒด ์žฌ์ž‘์„ฑ(Rewrite) vs ์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜:** - ์ฝ”๋“œ๋ฒ ์ด์Šค๊ฐ€ ๋งค์šฐ ์ž‘์„ ๊ฒฝ์šฐ ์™„์ „ํžˆ ์ฒ˜์Œ๋ถ€ํ„ฐ ์ƒˆ๋กœ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋น ๋ฅด๊ณ  ์‰ฌ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5]. ๊ทธ๋Ÿฌ๋‚˜ ๋ณต์žกํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ์ „์ฒด ์žฌ์ž‘์„ฑ์ด ๋ง‰๋Œ€ํ•œ ์ž์›๊ณผ ์œ„ํ—˜์„ ์ˆ˜๋ฐ˜ํ•˜๋ฏ€๋กœ, ๊ธฐ๋Šฅ ๋ฐฐํฌ๋ฅผ ๋ฉˆ์ถ”์ง€ ์•Š๋Š” ์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์„ ํƒํ•ด์•ผ๋งŒ ํ•˜๋Š” ์ œ์•ฝ์ด ๋”ฐ๋ฆ…๋‹ˆ๋‹ค [1]. -* **TypeScript ๋„์ž…์— ๋”ฐ๋ฅธ ์ธ์ง€์  ์˜ค๋ฒ„ํ—ค๋“œ:** - ๋ฆฌํŒฉํ„ฐ๋ง ์‹œ TypeScript ๋„์ž…์€ ์žฅ๊ธฐ์ ์œผ๋กœ ์˜ค๋ฅ˜๋ฅผ ์ค„์—ฌ์ฃผ์ง€๋งŒ, ๊ฒฝํ—˜์ด ๋ถ€์กฑํ•œ ํŒ€์›์—๊ฒŒ๋Š” ์ƒˆ๋กœ์šด ๋ณต์žก์„ฑ ๋ ˆ์ด์–ด๋กœ ์ž‘์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ƒํ™ฉ์— ๋งž์ถฐ ๋‹จ์ผ ํŒŒ์ผ์”ฉ ์ ์ง„์ ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ํƒ€ํ˜‘(Trade-off)์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค [7]. -* **์‚ฌ์ „ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ์˜ ๋น„์šฉ:** - ๊ธฐ์กด ์ฝ”๋“œ์˜ ํšŒ๊ท€(Regression)๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ์ด ๊ฐ•๋ ฅํžˆ ๊ถŒ์žฅ๋˜์ง€๋งŒ, ์–ฝํ˜€์žˆ๋Š” ๊ธฐ์กด ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ์— ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ์ž‘์—…์€ ์ดˆ๊ธฐ ๋ฆฌํŒฉํ„ฐ๋ง ์‹œ๊ฐ„์„ ํฌ๊ฒŒ ์ง€์—ฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [4-6]. -* **๊ณ„์ธตํ˜• ์•„ํ‚คํ…์ฒ˜์˜ ๋ฆฌํŒฉํ„ฐ๋ง ํ•œ๊ณ„:** - ๊ธฐ์กด ๋ ˆ๊ฑฐ์‹œ๊ฐ€ ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜์ด ์•„๋‹Œ ๊ธฐ์ˆ ์  ์œ ํ˜•(์ปดํฌ๋„ŒํŠธ, ํ›… ๋“ฑ) ๋‹จ์œ„์˜ ํด๋”๋กœ ๋‚˜๋‰œ ๊ณ„์ธตํ˜• ์•„ํ‚คํ…์ฒ˜(Layered Architecture)๋ฅผ ๋”ฐ๋ฅผ ๊ฒฝ์šฐ, ๋‹จ์ผ ๊ธฐ๋Šฅ์„ ๋ฆฌํŒฉํ„ฐ๋งํ•  ๋•Œ ๊ด€๋ จ๋œ ์—ฌ๋Ÿฌ ํŒŒ์ผ์ด ํฉ์–ด์ ธ ์žˆ์–ด ์ถ”์  ๋ฐ ์ˆ˜์ •์ด ๊ทน๋„๋กœ ๋ฒˆ๊ฑฐ๋กœ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [13]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -#### [์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] -* [[Feature-Sliced Design]] - * ์—ฐ๊ฒฐ ์ด์œ : ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ์ŠคํŒŒ๊ฒŒํ‹ฐ ์ฝ”๋“œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ , ์˜์กด์„ฑ์„ ๋‹จ๋ฐฉํ–ฅ์œผ๋กœ ์ œํ•œํ•˜์—ฌ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ๋กœ ์žฌํŽธํ•˜๋Š” ํ˜„๋Œ€์  ์•„ํ‚คํ…์ฒ˜ ๋ฐฉ๋ฒ•๋ก ์ž…๋‹ˆ๋‹ค [14-16]. - * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ฆฌํŒฉํ„ฐ๋ง ์ค‘ ์ปดํฌ๋„ŒํŠธ ๊ฐ„ ๊ฒฐํ•ฉ๋„๋ฅผ ์ค„์ด๊ณ  ์ฝ”๋“œ๋ฅผ ๊ธฐ๋Šฅ ๋ฐ ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ ๋‹จ์œ„๋กœ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ถ„๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ•™์Šตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [15]. -* [[Custom Hooks]] - * ์—ฐ๊ฒฐ ์ด์œ : React ๋ฆฌํŒฉํ„ฐ๋ง์˜ ํ•ต์‹ฌ ๋‹จ์œ„(Primary unit)๋กœ, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ UI์™€ ๋ถ„๋ฆฌํ•˜๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค [1, 17]. - * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: `useFetch`๋‚˜ `useForm`์ฒ˜๋Ÿผ ๊ฑฐ๋Œ€ํ•œ ์ปดํฌ๋„ŒํŠธ ์† ๋ฐ˜๋ณต๋˜๋Š” ๋กœ์ง์„ ์–ด๋–ป๊ฒŒ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“ˆ๋กœ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [17]. - -#### [๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ] -* [[TypeScript]] - * ์—ฐ๊ฒฐ ์ด์œ : ๋…ธํ›„ํ™”๋œ JavaScript ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ํ˜„๋Œ€ํ™”ํ•  ๋•Œ ์ •์  ํƒ€์ž… ๊ฒ€์‚ฌ๋ฅผ ํ†ตํ•ด ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์ˆ˜์ ์œผ๋กœ ๊ถŒ์žฅ๋˜๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค [2, 7]. - * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ฆฌํŒฉํ„ฐ๋ง ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์˜ˆ๊ธฐ์น˜ ๋ชปํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ๋ณ€ํ™”๋‚˜ Props ์ „๋‹ฌ ์˜ค๋ฅ˜๋ฅผ ์–ด๋–ป๊ฒŒ ์ปดํŒŒ์ผ ํƒ€์ž„์— ์ฐจ๋‹จํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -* [[ESLint]] - * ์—ฐ๊ฒฐ ์ด์œ : ๋ฆฌํŒฉํ„ฐ๋ง ์‹œ ํŒ€์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๊ณ , ์ฝ”๋“œ ์Šค๋ฉœ ๋ฐ ์•ˆํ‹ฐ ํŒจํ„ด์„ ์ž๋™์œผ๋กœ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•œ ์ •์  ๋ถ„์„ ๋ฐ ์ปจ๋ฒค์…˜ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค [3, 18]. - * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: `eslint-plugin-react-hooks` ๋“ฑ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ํ™œ์šฉํ•ด ์•„ํ‚คํ…์ฒ˜ ๊ทœ์น™๊ณผ React ๊ถŒ์žฅ ์‚ฌํ•ญ์„ ๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ ์–ด๋–ป๊ฒŒ ์ž๋™ ๊ฐ•์ œํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3, 18]. - -### Deeper Research Questions -* ๋ ˆ๊ฑฐ์‹œ ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์˜ ์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ(์˜ˆ: `componentDidUpdate`, `componentDidMount`)๋ฅผ `useEffect`๋ฅผ ํฌํ•จํ•œ ํ›…(Hooks) ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฆฌํŒฉํ„ฐ๋งํ•  ๋•Œ ๊ฐ€์žฅ ์•ˆ์ „ํ•˜๊ฒŒ ๋ถ€์ž‘์šฉ(Side-effect)์„ ์ œ์–ดํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? -* ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ์ „๋ฌดํ•˜๊ณ  ์ปดํฌ๋„ŒํŠธ ๊ฒฐํ•ฉ๋„๊ฐ€ ๋†’์€ ๋Œ€๊ทœ๋ชจ ๋ ˆ๊ฑฐ์‹œ React ์•ฑ์—์„œ, ๊ฐ€์žฅ ๋จผ์ € ๋„์ž…ํ•ด์•ผ ํ•˜๋Š” ํšจ์œจ์ ์ธ ์ตœ์†Œ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์ „๋žต(์˜ˆ: UI ์Šค๋ƒ…์ƒท ํ…Œ์ŠคํŠธ vs ๊ธฐ๋Šฅ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ)์€ ๋ฌด์—‡์ธ๊ฐ€? -* Context API๋กœ ๋ฌด๊ฒ๊ฒŒ ๊ด€๋ฆฌ๋˜์–ด ๋ฆฌ๋ Œ๋”๋ง ์ด์Šˆ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ „์—ญ ์ƒํƒœ๋ฅผ Zustand๋‚˜ TanStack Query๋กœ ์ ์ง„์ ์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ๋•Œ, ์ „ํ™˜ ๊ณผ์ • ์ค‘ ์ƒํƒœ์˜ ๋™๊ธฐํ™”๋ฅผ ์–ด๋–ป๊ฒŒ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? -* ํ•˜๋‚˜์˜ ์ปดํฌ๋„ŒํŠธ ํŒŒ์ผ์— API ํ†ต์‹ , ์ƒํƒœ ๋ณ€๊ฒฝ, DOM ๋ Œ๋”๋ง ๋กœ์ง์ด ํ˜ผ์žฌ๋œ ์ƒํƒœ์—์„œ ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)์„ ์ค€์ˆ˜ํ•˜๋„๋ก ๋กœ์ง์„ ์ชผ๊ฐค ๋•Œ, ์˜ฌ๋ฐ”๋ฅธ ์ถ”์ƒํ™” ๊ธฐ์ค€์€ ์–ด๋–ป๊ฒŒ ์„ธ์šฐ๋Š”๊ฐ€? -* ์ „์ฒด ์•ฑ์„ ์ค‘๋‹จํ•˜์ง€ ์•Š๊ณ  React ๋ฒ„์ „์„ ์˜ฌ๋ฆฌ๊ฑฐ๋‚˜ ํด๋” ๊ตฌ์กฐ(Feature-Sliced Design ๋“ฑ)๋ฅผ ๋„์ž…ํ•˜๊ธฐ ์œ„ํ•ด, ๊ธฐ์กด ์ฝ”๋“œ์™€ ์ƒˆ๋กœ์šด ์ฝ”๋“œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ํ•œ ํ”„๋กœ์ ํŠธ ๋‚ด์—์„œ ๋ณ‘์กด์‹œํ‚ค๋Š” ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? - -### Practical Application Contexts -* **Implementation:** ๊ธฐ์กด์— ๋ฐฉ์น˜๋œ `useState`์™€ `useEffect`๋ฅผ ํ™œ์šฉํ•œ ๋ฐ์ดํ„ฐ ํŽ˜์นญ ๋กœ์ง์„ Tanstack Query๋กœ ๋ถ„๋ฆฌ ๋ฐ ์ด๊ด€ํ•˜๊ณ , ์ธ๋ผ์ธ ์Šคํƒ€์ผ๋ง์ด๋‚˜ ์ค‘๊ตฌ๋‚œ๋ฐฉ์ธ CSS๋ฅผ ํŠน์ • ํŒจํ„ด ํ•˜๋‚˜๋กœ ํ†ต์ผํ•˜๋Š” ์‹ค์ œ์ ์ธ ์ฝ”๋“œ ์ •๋ฆฌ ์ž‘์—…. -* **System Design:** Redux์— ์˜์กดํ•˜๋˜ ๋ฐฉ๋Œ€ํ•œ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ , ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํƒœ๋ฅผ '์„œ๋ฒ„ ์ƒํƒœ(๋ฐ์ดํ„ฐ ํ†ต์‹ )'์™€ 'ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ(UI ํ† ๊ธ€ ๋“ฑ)'๋กœ ์„ค๊ณ„์ ์œผ๋กœ ๋ถ„๋ฆฌํ•จ. -* **Operation / Maintenance:** ๊ธฐ๋Šฅ ์ถ”๊ฐ€ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ฉˆ์ถ”์ง€ ์•Š๊ณ , ํ•˜๋‚˜์˜ Store๋‚˜ ํ•˜๋‚˜์˜ ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„๋กœ ๋ถ„ํ• ํ•˜์—ฌ ์ ์ง„์ ์œผ๋กœ ์ƒˆ ๋ธŒ๋žœ์น˜๋ฅผ ๋ณ‘ํ•ฉํ•ด๊ฐ€๋Š” Git ๊ธฐ๋ฐ˜์˜ ๋ฌด์ค‘๋‹จ ๋ฆฌํŒฉํ„ฐ๋ง ํŒŒ์ดํ”„๋ผ์ธ. -* **Learning Path:** ๋ ˆ๊ฑฐ์‹œ React์˜ ๋‹จ์  ๋ถ„์„ -> UI ๋ฐ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์ „๋žต ์ˆ˜๋ฆฝ -> Custom Hooks ์ž‘์„ฑ ๋ฐ SOLID ์›์น™ ํ•™์Šต -> ์ƒํƒœ ๊ด€๋ฆฌ ํ˜„๋Œ€ํ™” -> ํด๋”/์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ ์ˆœ์œผ๋กœ ์ ์ง„์ ์ธ ์‹ฌํ™” ํ•™์Šต. -* **My Project Relevance:** ์˜ค๋ž˜์ „์— ๊ฐœ๋ฐœ๋˜์–ด ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ๊ทน๋„๋กœ ๋–จ์–ด์ง€๋Š” ๊ธฐ์กด ํ”„๋กœ์ ํŠธ๋ฅผ ์ด์–ด๋ฐ›์•„ ๊ธฐ๋Šฅ ์ถ”๊ฐ€๋ฅผ ํ•˜๊ฑฐ๋‚˜ ๋ฒ„๊ทธ๋ฅผ ํ”ฝ์Šคํ•ด์•ผ ํ•  ๋•Œ, ์ฝ”๋“œ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ํ•ด์ฒดํ•˜๊ณ  ๋ชจ๋“ˆํ™”ํ•˜๋Š” ์ง€์นจ์œผ๋กœ ํ™œ์šฉ. - -### Adjacent Topics -* [[SOLID Principles]] - * ํ™•์žฅ ๋ฐฉํ–ฅ: ๋ฆฌํŒฉํ„ฐ๋ง ๊ณผ์ •์—์„œ ๊ฐ ์ปดํฌ๋„ŒํŠธ์™€ ๋ชจ๋“ˆ์ด '๋‹จ์ผ ์ฑ…์ž„(SRP)'์ด๋‚˜ '์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ(ISP)' ์›์น™์„ ํ†ตํ•ด ์–ด๋–ป๊ฒŒ ์˜์กด์„ฑ์„ ๋‚ฎ์ถ”๊ณ  ์œ ์—ฐํ•˜๊ฒŒ ๊ตฌ์„ฑ๋  ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ์‹ฌํ™” ์ดํ•ด. -* [[State Management]] - * ํ™•์žฅ ๋ฐฉํ–ฅ: ๋ฆฌํŒฉํ„ฐ๋ง ์‹œ Redux, Context API, Zustand, TanStack Query ๋“ฑ ๊ฐ๊ฐ์˜ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๊ฐ€์ง„ ์„ฑ๋Šฅ ํŠน์ง•(๋ฆฌ๋ Œ๋”๋ง ๋ฌธ์ œ ํ•ด๊ฒฐ ๋“ฑ)์„ ๋น„๊ต ๋ถ„์„ํ•˜์—ฌ ์ตœ์ ์˜ ๊ธฐ์ˆ  ์Šคํƒ์„ ์„ ์ •ํ•˜๋Š” ๊ณผ์ • ํƒ๊ตฌ. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Memoization.md b/00_Raw/Memoization.md deleted file mode 100644 index ae189b17..00000000 --- a/00_Raw/Memoization.md +++ /dev/null @@ -1,61 +0,0 @@ -# [[Memoization]] - -## ๐Ÿ“Œ Brief Summary -Memoization(๋ฉ”๋ชจ์ด์ œ์ด์…˜)์€ ์ž…๋ ฅ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์„ ๋•Œ ๊ณ„์‚ฐ ๊ฒฐ๊ณผ๋‚˜ ์ปดํฌ๋„ŒํŠธ์˜ ๋ Œ๋”๋ง ๊ฒฐ๊ณผ๋ฅผ ์บ์‹ฑํ•˜์—ฌ ์žฌ์‚ฌ์šฉํ•˜๋Š” ์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์ด๋‹ค [1]. React์—์„œ๋Š” `React.memo`, `useMemo`, `useCallback`๊ณผ ๊ฐ™์€ API๋ฅผ ํ†ตํ•ด ์ˆ˜๋™์œผ๋กœ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ฐฉ์ง€ํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฐ˜์‘์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚จ๋‹ค [1, 2]. ์ตœ๊ทผ์—๋Š” React Compiler๋ฅผ ํ†ตํ•ด ๋นŒ๋“œ ํƒ€์ž„์— ์ž๋™์œผ๋กœ ๋” ์„ธ๋ฐ€ํ•œ ๋‹จ์œ„์˜ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์‚ฝ์ž…ํ•˜์—ฌ ์ˆ˜๋™ ๊ด€๋ฆฌ์˜ ๋ณต์žก์„ฑ์„ ์ค„์ด๋Š” ๋ฐฉ์‹๋„ ๋„์ž…๋˜์—ˆ๋‹ค [2-4]. - -## ๐Ÿ“– Core Content -* **์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๊ธฐ๋ฒ•:** ๊ฐœ๋ฐœ์ž๋Š” ์ปดํฌ๋„ŒํŠธ ์ „์ฒด์˜ ๋ Œ๋”๋ง ๊ฒฐ๊ณผ๋ฅผ ์บ์‹ฑํ•˜๊ธฐ ์œ„ํ•ด `React.memo`๋ฅผ, ๊ณ„์‚ฐ ๋น„์šฉ์ด ๋†’์€ ํŒŒ์ƒ ๋ฐ์ดํ„ฐ(derived data)๋ฅผ ์บ์‹ฑํ•˜๊ธฐ ์œ„ํ•ด `useMemo`๋ฅผ, ํ•จ์ˆ˜ ์ฐธ์กฐ๋ฅผ ์บ์‹ฑํ•˜๊ธฐ ์œ„ํ•ด `useCallback`์„ ์‚ฌ์šฉํ•œ๋‹ค [1, 2]. `React.memo()`๋Š” ๊ณ ์ฐจ ์ปดํฌ๋„ŒํŠธ(HOC)๋กœ ์ž‘๋™ํ•˜๋ฉฐ, ์ „๋‹ฌ๋ฐ›๋Š” prop์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์œผ๋ฉด ๋ Œ๋”๋ง์„ ๊ฑด๋„ˆ๋›ฐ๊ณ  ๋งˆ์ง€๋ง‰ ๊ฒฐ๊ณผ๋ฅผ ์žฌ์‚ฌ์šฉํ•œ๋‹ค [5, 6]. -* **์ฐธ์กฐ ์•ˆ์ •์„ฑ(Reference Stability)๊ณผ ์–•์€ ๋น„๊ต(Shallow Comparison):** React๋Š” ๋ฆฌ๋ Œ๋”๋ง ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•  ๋•Œ prop์— ๋Œ€ํ•ด ์–•์€ ๋น„๊ต๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค [7]. ๋‚ด์šฉ์ด ๋™์ผํ•˜๋”๋ผ๋„ ๋งค ๋ Œ๋”๋ง๋งˆ๋‹ค ์ƒˆ๋กญ๊ฒŒ ์ƒ์„ฑ๋˜๋Š” ๊ฐ์ฒด๋‚˜ ์ธ๋ผ์ธ ํ•จ์ˆ˜๋Š” ์ƒˆ๋กœ์šด ์ฐธ์กฐ๋กœ ์ธ์‹๋˜์–ด ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ๋ฌด๋ ฅํ™”ํ•œ๋‹ค [7-9]. ๋”ฐ๋ผ์„œ `useMemo`์™€ `useCallback`์€ ์ด๋Ÿฌํ•œ ๊ฐ’๊ณผ ํ•จ์ˆ˜์˜ ์ฐธ์กฐ๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ์œ ์ง€ํ•˜์—ฌ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์˜ ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐ ํ•ต์‹ฌ์ ์ธ ์—ญํ• ์„ ํ•œ๋‹ค [7, 10]. -* **์ž๋™ํ™”๋œ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ (React Compiler):** React Compiler๋Š” ๋นŒ๋“œ ์‹œ ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•˜๊ณ  ์ž๋™์œผ๋กœ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๋กœ์ง์„ ์‚ฝ์ž…ํ•˜๋Š” ์ตœ์‹  ๋„๊ตฌ์ด๋‹ค [2, 3]. ์ปดํฌ๋„ŒํŠธ ์ „์ฒด๋ฅผ ๋ž˜ํ•‘ํ•˜๋Š” ๊ธฐ์กด ์ˆ˜๋™ ๋ฐฉ์‹๊ณผ ๋‹ฌ๋ฆฌ, ๊ฐœ๋ณ„ JSX ์š”์†Œ์™€ ์—ฐ์‚ฐ์„ ๋…๋ฆฝ์ ์œผ๋กœ ์บ์‹ฑํ•˜๋Š” ๋” ์„ธ๋ฐ€ํ•œ ์ˆ˜์ค€(granular level)์˜ ์ตœ์ ํ™”๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค [4, 11]. ์ด๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๋Š” ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ์ฝ”๋“œ๋กœ ์ธํ•œ ํ˜ผ๋ž€ ์—†์ด ์ง๊ด€์ ์ด๊ณ  ๊น”๋”ํ•œ React ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค [3, 11]. -* **์ ์šฉ ๊ธฐ์ค€:** ๋ฉ”๋ชจ์ด์ œ์ด์…˜์€ ์ˆœ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์ด๊ฑฐ๋‚˜ ๋นˆ๋ฒˆํ•˜๊ณ  ํ”ผํ•  ์ˆ˜ ์—†๋Š” ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ, ๋ณต์žกํ•œ DOM์„ ๋ Œ๋”๋งํ•˜๊ฑฐ๋‚˜ ๊ฐ’๋น„์‹ผ ์—ฐ์‚ฐ(์ •๋ ฌ, ํ•„ํ„ฐ๋ง ๋“ฑ)์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ์ ์šฉํ•ด์•ผ ํ•œ๋‹ค [6, 12]. ์ธก์ • ์—†์ด ๋ฌด๋ถ„๋ณ„ํ•˜๊ฒŒ ์ ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ง€์–‘ํ•ด์•ผ ํ•˜๋ฉฐ, React Profiler ๋“ฑ์„ ํ†ตํ•ด ์‹ค์งˆ์ ์ธ ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ์ฆ๋ช…๋˜์—ˆ์„ ๋•Œ๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค [12, 13]. - -## โš–๏ธ Trade-offs & Caveats -* **๋น„๊ต ์—ฐ์‚ฐ ์˜ค๋ฒ„ํ—ค๋“œ:** ๋ฉ”๋ชจ์ด์ œ์ด์…˜์€ ๊ณต์งœ๊ฐ€ ์•„๋‹ˆ๋‹ค. React๋Š” ์ด์ „ prop์„ ์ €์žฅํ•˜๊ณ , ์ƒˆ๋กœ์šด prop๊ณผ ๋น„๊ตํ•˜๋ฉฐ, ์—…๋ฐ์ดํŠธ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๋ถ€๋‹ดํ•ด์•ผ ํ•œ๋‹ค [14]. ๋ Œ๋”๋ง ์ž์ฒด๊ฐ€ ๋น ๋ฅด๊ณ  prop์ด ์ž์ฃผ ๋ณ€๊ฒฝ๋˜๋Š” ์ปดํฌ๋„ŒํŠธ์˜ ๊ฒฝ์šฐ, ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์œ„ํ•œ ๋น„๊ต ๋‹จ๊ณ„๊ฐ€ ์‹ค์ œ ๋ Œ๋”๋ง๋ณด๋‹ค ๋” ๋งŽ์€ ์ปดํ“จํŒ… ์ž์›์„ ์†Œ๋ชจํ•  ์ˆ˜ ์žˆ๋‹ค [12, 14]. -* **์ˆ˜๋™ ๊ด€๋ฆฌ์˜ ํ•œ๊ณ„:** ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์€ ์ฝ”๋“œ๋ฅผ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ , ์ข…์†์„ฑ ๋ฐฐ์—ด์„ ์ž˜๋ชป ๊ด€๋ฆฌํ•˜๊ฑฐ๋‚˜ ๊ฐ์ฒด ์ฐธ์กฐ๋ฅผ ์‹ค์ˆ˜๋กœ ๊ฐฑ์‹ ํ•˜์—ฌ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ์ฒด์ธ์„ ๊นจ๋œจ๋ฆฌ๋Š” ๋“ฑ์˜ ํœด๋จผ ์—๋Ÿฌ๋ฅผ ์œ ๋ฐœํ•˜๊ธฐ ์‰ฝ๋‹ค [2, 15]. -* **React Compiler์˜ ์ œ์•ฝ ์‚ฌํ•ญ:** - * **React ๊ทœ์น™์˜ ์—„๊ฒฉํ•œ ์ค€์ˆ˜:** ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ตœ์ ํ™”๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด ๋ถˆ๋ณ€์„ฑ ์œ ์ง€, ๋ Œ๋”๋ง ์ค‘ ๋ถ€์ž‘์šฉ(Side effects) ๋ฐฉ์ง€ ๋“ฑ "Rules of React"๋ฅผ ์—„๊ฒฉํžˆ ๋”ฐ๋ผ์•ผ ํ•œ๋‹ค [16, 17]. - * **์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ˜ธํ™˜์„ฑ:** ๋งค ๋ Œ๋”๋ง๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๊ฐ์ฒด ์ฐธ์กฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ปค์Šคํ…€ ํ›…(์˜ˆ: TanStack Query์˜ `useMutation`, React Router์˜ `useLocation` ๋“ฑ)์€ ์ปดํŒŒ์ผ๋Ÿฌ์˜ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ์ฒด์ธ์„ ๋‹จ์ ˆ์‹œํ‚จ๋‹ค [18, 19]. ์ด ๊ฒฝ์šฐ ๊ฒฐ๊ตญ ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ๋‹ค [19, 20]. - * **๋””๋ฒ„๊น… ๊ฐ€์‹œ์„ฑ ์ €ํ•˜:** ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋ธ”๋ž™๋ฐ•์Šค์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์˜ˆ์ƒ์น˜ ์•Š๊ฒŒ ๋ฆฌ๋ Œ๋”๋ง๋  ๋•Œ ์ตœ์ ํ™” ์‹คํŒจ ์›์ธ์„ ์ฝ”๋“œ ์ƒ์—์„œ ์ฆ‰๊ฐ์ ์œผ๋กœ ํŒŒ์•…ํ•˜๊ธฐ ์–ด๋ ต๋‹ค [21]. ๋˜ํ•œ React ๊ฐœ๋ฐœ์ž ๋„๊ตฌ์˜ 'Memo โœจ' ๋ฐฐ์ง€๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ฝ”๋“œ๋ฅผ ์ฒ˜๋ฆฌํ–ˆ์Œ์„ ์˜๋ฏธํ•  ๋ฟ, ๋Ÿฐํƒ€์ž„์— ์‹ค์ œ๋กœ ์ตœ์ ํ™”๊ฐ€ ์„ฑ๊ณตํ•˜์—ฌ ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐฉ์ง€๋˜์—ˆ์Œ์„ ๋ณด์žฅํ•˜์ง€ ์•Š์•„ ํ˜ผ๋™์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค [18]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -#### [์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] -- [[React Compiler]] - - ์—ฐ๊ฒฐ ์ด์œ : ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์˜ ๋ณต์žก์„ฑ์„ ์ค„์ด๊ณ  ๋นŒ๋“œ ํƒ€์ž„์— ์ž๋™์œผ๋กœ ์„ธ๋ฐ€ํ•œ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๋กœ์ง์„ ์‚ฝ์ž…ํ•˜์—ฌ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๋Š” ๋„๊ตฌ์ด๋‹ค [3, 4]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ฐœ๋ฐœ์ž๊ฐ€ ์ˆ˜๋™์œผ๋กœ ์ž‘์„ฑํ•˜๋˜ `useMemo`์™€ `useCallback`์ด ๋นŒ๋“œ ํ”„๋กœ์„ธ์Šค ๋‚ด์—์„œ ์–ด๋–ป๊ฒŒ ์ถ”์ƒํ™”๋˜๊ณ  ์ตœ์ ํ™”๋˜๋Š”์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค [4, 11, 20]. - -- [[Shallow Comparison]] (์–•์€ ๋น„๊ต) - - ์—ฐ๊ฒฐ ์ด์œ : `React.memo`๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•  ๋•Œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ํ‰๊ฐ€ ๋ฐฉ์‹์ด๋‹ค [6, 7]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋‚ด์šฉ์ด ๊ฐ™์€ ๊ฐ์ฒด๋‚˜ ์ธ๋ผ์ธ ํ•จ์ˆ˜๊ฐ€ ์™œ ์ƒˆ๋กœ์šด prop์œผ๋กœ ์ทจ๊ธ‰๋˜์–ด ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์‹คํŒจํ•˜๊ฒŒ ๋งŒ๋“œ๋Š”์ง€ ๊ทธ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค [7-9]. - -#### [๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ] -- [[React Profiler]] & [[why-did-you-render]] - - ์—ฐ๊ฒฐ ์ด์œ : ์ปดํฌ๋„ŒํŠธ์˜ ๋ Œ๋”๋ง ํšŸ์ˆ˜, ์†Œ์š” ์‹œ๊ฐ„, ๊ทธ๋ฆฌ๊ณ  ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ์‹๋ณ„ํ•˜์—ฌ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์ด ํ•„์š”ํ•œ ์ง€์ ์„ ์ฐพ์•„๋‚ด๋Š” ์ง„๋‹จ ๋„๊ตฌ๋“ค์ด๋‹ค [22-25]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋งน๋ชฉ์ ์ธ ์ตœ์ ํ™” ๋Œ€์‹  ๊ฐ๊ด€์  ์ธก์ • ๋ฐ์ดํ„ฐ์— ๊ธฐ๋ฐ˜ํ•œ ์ „๋žต์  ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ์ ์šฉ ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ๋‹ค [13, 26]. - -### Deeper Research Questions -- React Compiler์˜ ์ž๋™ํ™”๋œ ์บ์‹ฑ ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ๊ธฐ์กด์˜ ์ปดํฌ๋„ŒํŠธ ๋ ˆ๋ฒจ ๋ฉ”๋ชจ์ด์ œ์ด์…˜(`React.memo`)๊ณผ ๋น„๊ตํ•  ๋•Œ, ์–ด๋–ป๊ฒŒ ๊ฐœ๋ณ„ JSX ์š”์†Œ ์ˆ˜์ค€์˜ ์„ธ๋ฐ€ํ•จ(granularity)์„ ๋‹ฌ์„ฑํ•˜๋Š”๊ฐ€? -- `React.memo`์— ์‚ฌ์šฉ์ž ์ •์˜ ๋น„๊ต ํ•จ์ˆ˜(Custom Comparison Function)๋ฅผ ์ ์šฉํ•˜๋Š” ๊นŠ์€ ๋น„๊ต ๋ฐฉ์‹์ด ์–•์€ ๋น„๊ต์— ๋”ฐ๋ฅธ ๋ Œ๋”๋ง ๋น„์šฉ ์ ˆ๊ฐ๋ณด๋‹ค ์„ฑ๋Šฅ์ƒ ๋ถˆ๋ฆฌํ•ด์ง€๋Š” ์ž„๊ณ„์ ์€ ์–ด๋””์ธ๊ฐ€? -- TanStack Query๋‚˜ Material UI์™€ ๊ฐ™์ด ๋ถˆ์•ˆ์ •ํ•œ(Unstable) ๊ฐ์ฒด ์ฐธ์กฐ๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ, React Compiler์˜ ํ•œ๊ณ„๋ฅผ ์šฐํšŒํ•˜๊ณ  ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ง‰๋Š” ์ตœ์ ์˜ ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด์€ ๋ฌด์—‡์ธ๊ฐ€? -- `useCallback`๊ณผ `useMemo`๋ฅผ ์˜ค๋‚จ์šฉํ•˜์—ฌ ์„ฑ๋Šฅ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์œ ๋ฐœํ•˜๋Š” ์ฃผ์š” ์•ˆํ‹ฐํŒจํ„ด์€ ๋ฌด์—‡์ด๋ฉฐ, ํ”„๋กœํŒŒ์ผ๋ง์„ ํ†ตํ•ด ๋ฉ”๋ชจ์ด์ œ์ด์…˜์˜ ์†์ต๋ถ„๊ธฐ์ ์„ ์–ด๋–ป๊ฒŒ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? -- React Context API์˜ ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋กœ ๋ฐœ์ƒํ•˜๋Š” ์ „์—ญ์ ์ธ ๋ฆฌ๋ Œ๋”๋ง ํญํฌ(Re-render Cascade) ํ˜„์ƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด, Context ๋ถ„๋ฆฌ(Splitting)์™€ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๊ธฐ๋ฒ•์„ ์–ด๋–ป๊ฒŒ ์กฐํ•ฉํ•ด์•ผ ํ•˜๋Š”๊ฐ€? - -### Practical Application Contexts -- **Implementation:** ๊ณ„์‚ฐ ๋น„์šฉ์ด ๋†’์€ ํ•„ํ„ฐ๋ง ๋กœ์ง์— `useMemo`๋ฅผ ์ ์šฉํ•˜๊ณ , ํ•˜์œ„์˜ ๋ฉ”๋ชจ์ด์ œ์ด์…˜๋œ ์ปดํฌ๋„ŒํŠธ๋กœ ์ „๋‹ฌ๋˜๋Š” ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์—๋Š” `useCallback`์„ ์ ์šฉํ•ด ์ฐธ์กฐ ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•œ๋‹ค [12, 27]. JSX ๋‚ด์˜ ์ต๋ช… ํ•จ์ˆ˜ ์‚ฌ์šฉ์„ ์ง€์–‘ํ•˜์—ฌ ๋ Œ๋”๋ง๋งˆ๋‹ค ์ƒˆ๋กœ์šด ์ฐธ์กฐ๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์„ ๋ง‰๋Š”๋‹ค [9, 28]. -- **System Design:** ํ”„๋กœ์ ํŠธ์— React Compiler๋ฅผ ๋„์ž…ํ•˜๊ธฐ ์ „, ์ฝ”๋“œ๋ฒ ์ด์Šค๊ฐ€ "Rules of React"๋ฅผ ์ค€์ˆ˜ํ•˜๋„๋ก `eslint-plugin-react-hooks`๋ฅผ ์„ค์ •ํ•˜์—ฌ ๋ฆฐํŒ…์„ ํ†ตํ•ด ์ฝ”๋“œ๋ฅผ ํ†ต์ œํ•œ๋‹ค [17]. -- **Operation / Maintenance:** ์ง€์†์ ์ธ ์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์œ„ํ•ด ๊ฐœ๋ฐœ ์ค‘์—๋Š” React Profiler์™€ `why-did-you-render`๋ฅผ ์‚ฌ์šฉํ•ด ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง์„ ์žก๊ณ , ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋Š” INP(Interaction to Next Paint) ๊ฐ™์€ Core Web Vitals ์ง€ํ‘œ๋ฅผ ์ถ”์ ํ•ด ๋ฉ”๋ชจ์ด์ œ์ด์…˜์˜ ์‹ค์งˆ์  ์ด์ ์„ ํ™•์ธํ•œ๋‹ค [22-24, 29]. -- **Learning Path:** ๋ฆฌ๋ Œ๋”๋ง์˜ 4๊ฐ€์ง€ ์ฃผ์š” ์›์ธ(State, Props, Context, Parent Render)์„ ํŒŒ์•…ํ•˜๊ณ  [30], ์–•์€ ๋น„๊ต์˜ ์›๋ฆฌ๋ฅผ ํ•™์Šตํ•œ ๋’ค `React.memo`, `useMemo`์˜ ์ˆ˜๋™ ์ ์šฉ๋ฒ•์„ ๊ฑฐ์ณ React Compiler์˜ ๋™์ž‘ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๋Š” ์ˆœ์„œ๋กœ ํ•™์Šตํ•œ๋‹ค [3, 7, 30]. -- **My Project Relevance:** ๋ณต์žกํ•œ ๋Œ€์‹œ๋ณด๋“œ๋‚˜ ๋ฆฌ์ŠคํŠธ ๋“ฑ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ํ•„ํ„ฐ๋งํ•˜๊ฑฐ๋‚˜ UI์™€ ์ƒํ˜ธ์ž‘์šฉํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์‹ฌ๊ฐํ•œ ํ™”๋ฉด ๋Š๊น€ ํ˜„์ƒ๊ณผ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ด ์›๋ฆฌ๋“ค์„ ๋„์ž…ํ•  ์ˆ˜ ์žˆ๋‹ค [12, 31]. - -### Adjacent Topics -- [[Code Splitting & Lazy Loading]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋ฉ”๋ชจ์ด์ œ์ด์…˜์ด ๋Ÿฐํƒ€์ž„์— ๋ถˆํ•„์š”ํ•œ ์ปดํฌ๋„ŒํŠธ ์žฌ๋ Œ๋”๋ง์„ ๋ฐฉ์ง€ํ•œ๋‹ค๋ฉด, ์ด ๊ธฐ๋ฒ•์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ดˆ๊ธฐ ๋กœ๋“œ ์‹œ JavaScript ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ค„์—ฌ ์„ฑ๋Šฅ์„ ๋Œ์–ด์˜ฌ๋ฆฌ๋Š” ๋ Œ๋”๋ง/๋กœ๋”ฉ ์•„ํ‚คํ…์ฒ˜ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์ด๋‹ค [7, 32, 33]. -- [[State Management Libraries (Zustand/Jotai)]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ์žฆ์€ ์ƒํƒœ ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•œ Context API์˜ ๊ด‘๋ฒ”์œ„ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด, ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๋Œ€์‹  Selector(์„ ํƒ์ž) ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒํƒœ์˜ ํŠน์ • ๋ถ€๋ถ„๋งŒ ๊ตฌ๋…ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๋Œ€์•ˆ์  ์ƒํƒœ ๊ด€๋ฆฌ ๊ธฐ๋ฒ•์ด๋‹ค [34, 35]. -- [[Concurrent Rendering]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋ฉ”๋ชจ์ด์ œ์ด์…˜์œผ๋กœ๋„ ํ•ด๊ฒฐํ•˜๊ธฐ ๋ฒ…์ฐฌ ๋ฌด๊ฑฐ์šด UI ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•  ๋•Œ, `useTransition` ๋ฐ `useDeferredValue`๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ Œ๋”๋ง์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์กฐ์ •ํ•˜๊ณ  UI์˜ ๋ฐ˜์‘์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ์ง„๋ณด๋œ ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ฐฉ๋ฒ•๋ก ์ด๋‹ค [36-38]. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Memory Leak Detection.md b/00_Raw/Memory Leak Detection.md deleted file mode 100644 index 5ebcc2c6..00000000 --- a/00_Raw/Memory Leak Detection.md +++ /dev/null @@ -1,73 +0,0 @@ -# [[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* \ No newline at end of file diff --git a/00_Raw/Memory Leak.md b/00_Raw/Memory Leak.md deleted file mode 100644 index af3ca129..00000000 --- a/00_Raw/Memory Leak.md +++ /dev/null @@ -1,78 +0,0 @@ -# [[Memory Leak]] - -## ๐Ÿ“Œ Brief Summary -๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜(Memory Leak)๋ž€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•œ ํ›„ ๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ด๋ฅผ ํ•ด์ œํ•˜์ง€ ์•Š์•„ ๋ฉ”๋ชจ๋ฆฌ์— ๊ณ„์† ์ถ•์ ๋˜๋Š” ํ˜„์ƒ์ด๋‹ค [1]. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ(Garbage Collector)๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ž๋™์œผ๋กœ ํšŒ์ˆ˜ํ•˜์ง€๋งŒ, ๋ณ€์ˆ˜ ๋“ฑ์— ์ฐธ์กฐ๊ฐ€ ๋‚จ์•„์žˆ์„ ๊ฒฝ์šฐ ์ด๋ฅผ ํšŒ์ˆ˜ํ•  ์ˆ˜ ์—†์–ด ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค [1]. ์ด๋กœ ์ธํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์žฅ์‹œ๊ฐ„ ์‚ฌ์šฉํ• ์ˆ˜๋ก ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ์ ์ง„์ ์œผ๋กœ ์ฆ๊ฐ€ํ•˜๋ฉฐ, ์„ฑ๋Šฅ ์ €ํ•˜, ํƒญ์˜ ๋ฉˆ์ถค ํ˜„์ƒ, ์‹ฌ๊ฐํ•œ ๊ฒฝ์šฐ ์•ฑ ์ถฉ๋Œ(Crash)์„ ์œ ๋ฐœํ•˜๊ฒŒ ๋œ๋‹ค [2-4]. - -## ๐Ÿ“– Core Content -* **๋ฐœ์ƒ ๋ฉ”์ปค๋‹ˆ์ฆ˜๊ณผ ์ฃผ์š” ์›์ธ ํŒจํ„ด** - ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฐ React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋Š” ์ฃผ๋กœ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋‚จ์•„์žˆ๋Š” ์ฐธ์กฐ(Reference) ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•œ๋‹ค [1]. - ๋Œ€ํ‘œ์ ์ธ ํŒจํ„ด์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. - * **๋ถ„๋ฆฌ๋œ DOM ๋…ธ๋“œ(Detached DOM Nodes):** DOM ํŠธ๋ฆฌ์—์„œ๋Š” ์ œ๊ฑฐ๋˜์—ˆ์œผ๋‚˜, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ ๋‚ด์˜ ๋ณ€์ˆ˜ ๋“ฑ์—์„œ ์—ฌ์ „ํžˆ ํ•ด๋‹น ๋…ธ๋“œ๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ์–ด ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ์ด๋‹ค [5, 6]. - * **์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๋ˆ„์ (Event Listener Accumulation):** ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ธ๋งˆ์šดํŠธ(Unmount)๋  ๋•Œ ๋“ฑ๋ก๋˜์—ˆ๋˜ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ์ ์ ˆํžˆ ํ•ด์ œํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฉ”๋ชจ๋ฆฌ์— ๊ณ„์† ์Œ“์ด๊ฒŒ ๋œ๋‹ค [6]. React์˜ ๊ฒฝ์šฐ `useEffect` ๋‚ด์—์„œ ๊ตฌ๋…(Subscription)์ด๋‚˜ ๋ฆฌ์Šค๋„ˆ๋ฅผ ์ƒ์„ฑํ•œ ๋’ค ์ •๋ฆฌ(Cleanup) ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์„ ๋•Œ ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ฐœ์ƒํ•œ๋‹ค [7-9]. - * **ํด๋กœ์ €๋ฅผ ํ†ตํ•œ ์ฐธ์กฐ ์œ ์ง€(Closure-Retained References):** ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํด๋กœ์ €๊ฐ€ ๋ถ€๋ชจ ์Šค์ฝ”ํ”„์˜ ๋ณ€์ˆ˜๋ฅผ ๊ณ„์† ์‚ด๋ ค๋‘์–ด, ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๊ฑฐ๋Œ€ํ•œ ๊ฐ์ฒด๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฐจ์ง€ํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค [10]. - -* **์ง„๋‹จ ๋ฐ ๋ถ„์„ ๋ฐฉ๋ฒ•** - ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ํŒŒ์•…ํ•˜๊ธฐ ์œ„ํ•ด Chrome DevTools์˜ Memory ํŒจ๋„์„ ํ•ต์‹ฌ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค [11]. - * **ํž™ ์Šค๋ƒ…์ƒท(Heap Snapshots):** ํŠน์ • ์‹œ์ ์˜ ๋ฉ”๋ชจ๋ฆฌ ์ƒํƒœ๋ฅผ ์ดฌ์˜ํ•˜์—ฌ ๋น„๊ต(Comparison view)ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‘ ์Šค๋ƒ…์ƒท ์‚ฌ์ด์—์„œ ๊พธ์ค€ํžˆ ์–‘์ˆ˜ ๋ธํƒ€(Delta) ๊ฐ’์„ ๊ฐ–๋Š” ๊ฐ์ฒด๋ฅผ ์ฐพ์•„ ๋ˆ„์ˆ˜๋ฅผ ํŒ๋ณ„ํ•˜๋ฉฐ, 'Detached'๋กœ ๊ฒ€์ƒ‰ํ•˜์—ฌ ๋ถ„๋ฆฌ๋œ DOM ํŠธ๋ฆฌ๋ฅผ ์ฐพ์•„๋‚ธ๋‹ค [11, 12]. ๊ฐ์ฒด๋ฅผ ์„ ํƒํ•œ ํ›„ 'Retainers' ํŒจ๋„์„ ํ†ตํ•ด ์–ด๋–ค ์ฐธ์กฐ๊ฐ€ ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ๋ถ™์žก๊ณ  ์žˆ๋Š”์ง€ ์ถ”์ ํ•  ์ˆ˜ ์žˆ๋‹ค [10, 13]. - * **ํ• ๋‹น ํƒ€์ž„๋ผ์ธ(Allocation Timelines):** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ์ƒํ˜ธ์ž‘์šฉํ•  ๋•Œ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ํŒจํ„ด์„ ํ™•์ธํ•œ๋‹ค. ํŒŒ๋ž€์ƒ‰ ๋ง‰๋Œ€๋กœ ํ‘œ์‹œ๋œ ํ• ๋‹น ๋‚ด์—ญ์ด ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ํ›„์—๋„ ํšŒ์ƒ‰์œผ๋กœ ๋ณ€ํ•˜์ง€ ์•Š๊ณ  ์˜๊ตฌ์ ์œผ๋กœ ๋‚จ๋Š”๋‹ค๋ฉด ๋ˆ„์ˆ˜๋กœ ์˜์‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค [14-16]. - * **์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง:** Chrome ์ž‘์—… ๊ด€๋ฆฌ์ž(Task Manager)๋‚˜ Performance ํŒจ๋„์„ ํ†ตํ•ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํž™(JS heap) ํฌ๊ธฐ๋‚˜ ๋…ธ๋“œ ๊ฐœ์ˆ˜๊ฐ€ ์ž‘์—… ์ดํ›„์—๋„ ์ด์ „๋ณด๋‹ค ์ฆ๊ฐ€๋œ ์ƒํƒœ๋กœ ๋๋‚˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค [17-19]. - -* **ํ•ด๊ฒฐ ๋ฐ ์˜ˆ๋ฐฉ ์ „๋žต** - ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋ถ„๋ฆฌ๋œ ๊ฐ์ฒด๋‚˜ ๋…ธ๋“œ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ณ€์ˆ˜๋ฅผ ์ฐพ์•„, ํ•ด๋‹น ์ฐธ์กฐ๊ฐ€ ๋” ์ด์ƒ ํ•„์š” ์—†์„ ๋•Œ ์ œ๊ฑฐํ•ด์•ผ ํ•œ๋‹ค [13]. ๊ฐ์ฒด ๊ธฐ๋ฐ˜์˜ ์บ์‹œ๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ๋Š” ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์„ ๋ฐฉํ•ดํ•˜์ง€ ์•Š๋Š” `WeakMap`์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋œ๋‹ค [9]. React ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ๋Š” `useEffect` ํ›…์—์„œ ์ •๋ฆฌ(cleanup) ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ•ด์ œํ•˜๋Š” ํŒจํ„ด์„ ๋ฐ˜๋“œ์‹œ ์ง€์ผœ์•ผ ํ•˜๋ฉฐ, CI ํŒŒ์ดํ”„๋ผ์ธ์—์„œ Puppeteer ๋“ฑ์„ ํ™œ์šฉํ•˜์—ฌ ์ž๋™ํ™”๋œ ๋ฉ”๋ชจ๋ฆฌ ํ…Œ์ŠคํŠธ๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์‚ฌ์ „์— ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค [7, 9]. - -## โš–๏ธ Trade-offs & Caveats -์†Œ์Šค์— ๊ด€๋ จ ์ •๋ณด๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -#### [๋ฐœ์ƒ ์›์ธ ๋ฐ ์ฆ์ƒ (Causes & Phenomena)] -- [[Detached DOM Nodes]] - - ์—ฐ๊ฒฐ ์ด์œ : ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ”„๋ก ํŠธ์—”๋“œ ํ™˜๊ฒฝ์—์„œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๊ฐ€์žฅ ํ”ํ•˜๊ณ  ์ฃผ์š”ํ•œ ์›์ธ ์ค‘ ํ•˜๋‚˜๋กœ ์ƒ์„ธํ•˜๊ฒŒ ๋‹ค๋ค„์ง„๋‹ค [5, 6]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: HTML ๋ฌธ์„œ์˜ DOM ํŠธ๋ฆฌ์—์„œ๋Š” ์ œ๊ฑฐ๋˜์—ˆ์œผ๋‚˜, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฉ”๋ชจ๋ฆฌ ์ƒ์—๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฌถ์—ฌ ์žˆ๋Š” ์ƒํƒœ๋ฅผ ํŒŒ์•…ํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ ํ•ด์ œ ์‹œ ์ฐธ์กฐ ๊ด€๋ฆฌ์˜ ์ค‘์š”์„ฑ์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค [5, 13]. - -- [[Closure-Retained References]] - - ์—ฐ๊ฒฐ ์ด์œ : ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์–ธ์–ด์  ํŠน์„ฑ์ธ ํด๋กœ์ €๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ๋ง‰๋Š”์ง€ ์„ค๋ช…ํ•˜๋Š” ์›์ธ ํŒจํ„ด์ด๋‹ค [10]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์Šค์ฝ”ํ”„ ์ฒด์ธ์œผ๋กœ ์ธํ•ด ํ•„์š” ์ด์ƒ์œผ๋กœ ํฐ ๊ฐ์ฒด๋‚˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๋กœ๋ถ€ํ„ฐ ์‚ด์•„๋‚จ๋Š” ๊ตฌ์กฐ์  ๋ˆ„์ˆ˜ ํ˜„์ƒ์„ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ๋‹ค [10]. - -#### [์ง„๋‹จ ๋ฐ ๊ตฌํ˜„ ๋„๊ตฌ (Diagnostics & Tools)] -- [[Chrome DevTools Memory Profiler]] - - ์—ฐ๊ฒฐ ์ด์œ : ํž™ ์Šค๋ƒ…์ƒท(Heap snapshot)๊ณผ ํ• ๋‹น ํƒ€์ž„๋ผ์ธ(Allocation Timeline) ๋“ฑ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ์ง์ ‘์ ์œผ๋กœ ์ฐพ์•„๋‚ด๊ณ  ๋””๋ฒ„๊น…ํ•˜๋Š” ํ•ต์‹ฌ ๋„๊ตฌ์ด๋‹ค [11, 16]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ฐ์ฒด ๊ฐ„์˜ ์ฐธ์กฐ ๊ฒฝ๋กœ(Retainer Path)๋ฅผ ์ถ”์ ํ•˜๊ณ , ์ฆ๊ฐ€ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ์˜ ๊ทผ๋ณธ ์›์ธ์ด ๋˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ณ€์ˆ˜๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ์ฐพ์•„๋‚ด๋Š” ๊ธฐ๋ฒ•์„ ์Šต๋“ํ•  ์ˆ˜ ์žˆ๋‹ค [10, 12, 15]. - -- [[useEffect Cleanup]] - - ์—ฐ๊ฒฐ ์ด์œ : React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๊ตฌ๋…์ด๋‚˜ ์ด๋ฒคํŠธ๋ฅผ ๊ด€๋ฆฌํ•  ๋•Œ ๋ˆ„์ˆ˜๋ฅผ ์˜ˆ๋ฐฉํ•˜๊ธฐ ์œ„ํ•ด ํ”„๋ ˆ์ž„์›Œํฌ ์ฐจ์›์—์„œ ํ•„์ˆ˜์ ์œผ๋กœ ์š”๊ตฌ๋˜๋Š” ํ•ด๊ฒฐ ํŒจํ„ด์ด๋‹ค [7-9]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์˜ ์ƒ๋ช…์ฃผ๊ธฐ์™€ ๋ถ€์ˆ˜ ํšจ๊ณผ(Side effect) ๊ด€๋ฆฌ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๊ณ , ๋ฆฌ์†Œ์Šค ๋ˆ„์ถœ์„ ๋ง‰๋Š” ์•ˆ์ „ํ•œ ์ฝ”๋”ฉ ๋ฐฉ์‹์„ ์ตํž ์ˆ˜ ์žˆ๋‹ค [7, 9]. - -- [[WeakMap]] - - ์—ฐ๊ฒฐ ์ด์œ : ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฐฉ์ง€ ์ „๋žต์œผ๋กœ ๊ฐ์ฒด ์บ์‹œ ๊ตฌ์กฐ๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋„๋ก ์ง์ ‘์ ์œผ๋กœ ๊ถŒ์žฅ๋˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋‚ด์žฅ ๊ฐ์ฒด์ด๋‹ค [9]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ฐ์ฒด์— ๋Œ€ํ•œ ๊ฐ•ํ•œ ์ฐธ์กฐ(Strong Reference)๋ฅผ ๋งŒ๋“ค์ง€ ์•Š์•„ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๊ฐ€ ์›ํ™œํ•˜๊ฒŒ ์ž‘๋™ํ•˜๋„๋ก ๋•๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ตœ์ ํ™” ์ž๋ฃŒ๊ตฌ์กฐ์˜ ์›๋ฆฌ๋ฅผ ๋ฐฐ์šธ ์ˆ˜ ์žˆ๋‹ค [9]. - -### Deeper Research Questions - -- ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ(Garbage Collector)์˜ ์ฐธ์กฐ ์นด์šดํŒ…(Reference Counting)๊ณผ ํ‘œ์‹œ-์“ธ๊ธฐ(Mark-and-Sweep) ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ฐ๊ฐ ์–ด๋–ค ์กฐ๊ฑด ํ•˜์— ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ ๊ฐ€๋Šฅ์„ฑ์„ ํŒ๋‹จํ•˜๋Š”๊ฐ€? -- ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ธ๋งˆ์šดํŠธ๋  ๋•Œ, ์ž์‹ ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์˜ ํด๋กœ์ €(Closure)๊ฐ€ ๋ถ€๋ชจ ์Šค์ฝ”ํ”„์˜ ์ƒํƒœ๋ฅผ ์บก์ฒ˜ํ•˜๊ณ  ์žˆ์„ ๊ฒฝ์šฐ ์ •ํ™•ํžˆ ์–ด๋–ค ๊ฒฝ๋กœ๋ฅผ ํ†ตํ•ด ๋ฉ”๋ชจ๋ฆฌ ๋ฆญ์ด ๋ฐœ์ƒํ•˜๋Š”๊ฐ€? -- ์ผ๋ฐ˜์ ์ธ `Object` ํ˜น์€ `Map`์„ ์‚ฌ์šฉํ•œ ์ƒํƒœ ๋ฐ์ดํ„ฐ ์บ์‹ฑ๊ณผ `WeakMap`์„ ์‚ฌ์šฉํ•œ ์บ์‹ฑ ๊ฐ„์˜ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ํƒ€์ด๋ฐ๊ณผ ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ ์ฐจ์ด๋Š” ์–ด๋– ํ•œ๊ฐ€? -- Chrome DevTools์˜ Retainer ํŒจ๋„์—์„œ ํ‘œ์‹œ๋˜๋Š” 'Distance from GC root'๊ฐ€ ๋””๋ฒ„๊น… ๊ณผ์ •์—์„œ ๊ฐ–๋Š” ์˜๋ฏธ๋Š” ๋ฌด์—‡์ด๋ฉฐ, ์ฐธ์กฐ ํŠธ๋ฆฌ๋ฅผ ์—ญ์ถ”์ ํ•  ๋•Œ ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด์„ํ•ด์•ผ ํ•˜๋Š”๊ฐ€? -- Puppeteer๋ฅผ ํ™œ์šฉํ•œ ์ž๋™ํ™”๋œ ๋ฉ”๋ชจ๋ฆฌ ํ…Œ์ŠคํŠธ(Automated Memory Testing) ํ™˜๊ฒฝ์„ CI/CD์— ๊ตฌ์ถ•ํ•  ๋•Œ, ํ…Œ์ŠคํŠธ ์‹คํŒจ(๋ˆ„์ˆ˜ ๋ฐœ์ƒ)๋ฅผ ํŒ์ •ํ•˜๊ธฐ ์œ„ํ•œ ์ ์ ˆํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ฆ๊ฐ€ ์ž„๊ณ„๊ฐ’(Threshold)์€ ์–ด๋–ป๊ฒŒ ์„ค์ •ํ•˜๋Š”๊ฐ€? - -### Practical Application Contexts - -- **Implementation:** React ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ, `useEffect` ์•ˆ์—์„œ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ๋…ํ•œ ๊ฒฝ์šฐ, ๋ฐ˜๋“œ์‹œ ํ•ด๋‹น ๋ฆฌ์Šค๋„ˆ๋‚˜ ๊ตฌ๋…์„ ์ทจ์†Œํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜(return)ํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํšŒ์ˆ˜๋  ์ˆ˜ ์žˆ๊ฒŒ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค [7, 9]. -- **System Design:** ๋ฐฉ๋Œ€ํ•œ ์–‘์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ž„์‹œ๋กœ ์บ์‹ฑํ•˜๊ฑฐ๋‚˜ DOM ์š”์†Œ์™€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๋งคํ•‘ํ•ด์•ผ ํ•˜๋Š” ์‹œ์Šคํ…œ์„ ์„ค๊ณ„ํ•  ๊ฒฝ์šฐ, ์ผ๋ฐ˜ ๊ฐ์ฒด๊ฐ€ ์•„๋‹Œ `WeakMap`์„ ๋„์ž…ํ•˜์—ฌ ์บ์‹œ๊ฐ€ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์„ ๋ฐฉํ•ดํ•˜์ง€ ์•Š๋„๋ก ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ตฌ์„ฑํ•ด์•ผ ํ•œ๋‹ค [9]. -- **Operation / Maintenance:** ํ”„๋กœ๋•์…˜์— ๋ฐฐํฌ๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‹œ๊ฐ„์ด ์ง€๋‚ ์ˆ˜๋ก ์•ฑ์ด ๋ฒ„๋ฒ…์ด๊ฑฐ๋‚˜ ํฌ๋ž˜์‹œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋Š” ์‚ฌ์šฉ์ž ๋ณด๊ณ ๊ฐ€ ์žˆ๋‹ค๋ฉด, ์ฆ‰์‹œ Chrome DevTools์˜ Memory ํŒจ๋„์„ ์ผœ์„œ Heap Snapshot์˜ Comparison ๋ทฐ๋ฅผ ์ด์šฉํ•ด ์–‘์ˆ˜์˜ ๋ธํƒ€ ๊ฐ’์„ ๊ฐ€์ง„ ๊ฐ์ฒด๋ฅผ ์ถ”์ ํ•ด์•ผ ํ•œ๋‹ค [4, 11]. -- **Learning Path:** ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋ฐ˜ ์•ฑ์˜ ์„ฑ๋Šฅ ํŠœ๋‹์„ ํ•™์Šตํ•  ๋•Œ ๋ Œ๋”๋ง ์ตœ์ ํ™”๋ฅผ ๋„˜์–ด์„œ, "๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์˜ ์ดํ•ด -> Detached DOM๊ณผ ํด๋กœ์ € ๋ˆ„์ˆ˜ ํŒจํ„ด ํŒŒ์•… -> DevTools๋ฅผ ํ™œ์šฉํ•œ ํ”„๋กœํŒŒ์ผ๋ง" ์ˆœ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ๊ธฐ๋ฒ•์„ ์ตํžˆ๋Š” ํ•™์Šต ๊ฒฝ๋กœ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค [1, 5, 11]. -- **My Project Relevance:** ํ˜„์žฌ ์œ ์ง€๋ณด์ˆ˜ ์ค‘์ธ SPA ํ”„๋กœ์ ํŠธ์— ๋ณต์žกํ•œ ๋ผ์šฐํŒ…๊ณผ ๋ฌด๊ฑฐ์šด ์œ„์ ฏ์ด ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋ฉด, ๋ผ์šฐํŠธ ์ด๋™ ํ›„์—๋„ ์ด์ „ ํŽ˜์ด์ง€์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ๋‚จ์•„์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ํ• ๋‹น ํƒ€์ž„๋ผ์ธ(Allocation Timeline) ๋ถ„์„๊ณผ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ์ œ๊ฑฐ ์—ฌ๋ถ€๋ฅผ ์ ๊ฒ€ํ•˜๋Š” ๋ฐ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค [6, 14]. - -### Adjacent Topics - -- [[Garbage Collection in JavaScript]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„ ๋‚ด๋ถ€์—์„œ ๋„๋‹ฌ ๊ฐ€๋Šฅ์„ฑ(Reachability)์„ ๊ธฐ์ค€์œผ๋กœ ๊ฐ์ฒด๋ฅผ ์–ด๋–ป๊ฒŒ ์ˆ˜์ง‘ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๊ธฐ๋ฐ˜ ์ง€์‹ ๋ฐฉํ–ฅ์œผ๋กœ ํ™•์žฅ. -- [[React Hooks Lifecycle]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ์˜ ์‹œ์ ์ด ๋˜๋Š” `useEffect`์˜ ์ •๋ฆฌ(Cleanup) ๋™์ž‘์„ ์ •ํ™•ํžˆ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด, ์ปดํฌ๋„ŒํŠธ์˜ ๋งˆ์šดํŠธ, ์—…๋ฐ์ดํŠธ, ์–ธ๋งˆ์šดํŠธ ์ƒ๋ช…์ฃผ๊ธฐ์™€ ์˜์กด์„ฑ ๋ฐฐ์—ด์˜ ๋™์ž‘ ์›๋ฆฌ ํƒ๊ตฌ. -- [[Web Performance Optimization]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ์™ธ์—๋„ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง ๋ฐฉ์ง€, ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…, ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ ์ถ•์†Œ ๋“ฑ ํ”„๋ก ํŠธ์—”๋“œ ์ „๋ฐ˜์˜ ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ฐ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜(UX) ๊ฐœ์„  ๊ธฐ๋ฒ•์œผ๋กœ ํ™•์žฅ. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Memory Leaks.md b/00_Raw/Memory Leaks.md deleted file mode 100644 index 5e3ce246..00000000 --- a/00_Raw/Memory Leaks.md +++ /dev/null @@ -1,75 +0,0 @@ -# [[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* \ No newline at end of file diff --git a/00_Raw/Next.js App Router.md b/00_Raw/Next.js App Router.md deleted file mode 100644 index 43ddac1f..00000000 --- a/00_Raw/Next.js App Router.md +++ /dev/null @@ -1,54 +0,0 @@ -# [[Next.js App Router]] - -## ๐Ÿ“Œ Brief Summary -Next.js App Router๋Š” Next.js(๋ฒ„์ „ 13 ์ดํ›„)์—์„œ ๋„์ž…๋œ ์ตœ์‹  ๋ผ์šฐํŒ… ๋ฐ ์•„ํ‚คํ…์ฒ˜ ์‹œ์Šคํ…œ์œผ๋กœ, React Server Components(RSC)๋ฅผ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์›ํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ ์ธก ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ „์†ก๋Ÿ‰์„ ์ค„์ด๊ณ  ์ดˆ๊ธฐ ๋กœ๋”ฉ ์†๋„๋ฅผ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค [1, 2]. ์ด ์‹œ์Šคํ…œ์€ `app` ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•˜๋ฉฐ, `page.js`, `layout.js`์™€ ๊ฐ™์€ ํŠน์ˆ˜ ํŒŒ์ผ๋“ค์„ ํ†ตํ•ด ์ง๊ด€์ ์ด๊ณ  ๊ตฌ์กฐํ™”๋œ ๋ผ์šฐํŒ…์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [3, 4]. - -## ๐Ÿ“– Core Content - -* **ํŠน์ˆ˜ ํŒŒ์ผ์„ ํ™œ์šฉํ•œ ๊ตฌ์กฐ์  ๋ผ์šฐํŒ…**: Next.js App Router๋Š” ๋ผ์šฐํŠธ ๊ตฌ์„ฑ ๋ฐ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ํŠน์ˆ˜ ํŒŒ์ผ ๋ช…๋ช… ๊ทœ์น™์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ผ์šฐํŠธ๋Š” `page.js`๋กœ, ๊ณต์œ  ๋ ˆ์ด์•„์›ƒ์€ `layout.js`๋กœ, ์‚ฌ์šฉ์ž ์ •์˜ ์—๋Ÿฌ๋Š” `error.js`๋กœ, ๋กœ๋”ฉ ์ƒํƒœ๋Š” `loading.js`๋กœ ์ •์˜ํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋™์ž‘์„ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค [3]. -* **๋™์  ๋ผ์šฐํŠธ ๋ฐ ๋ผ์šฐํŠธ ๊ทธ๋ฃน**: ๋™์ ์ธ ๊ฒฝ๋กœ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด `[param]`์„ ์‚ฌ์šฉํ•˜๊ณ , ํฌ๊ด„์ (catch-all) ๋ผ์šฐํŠธ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด `[...param]`์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค [3]. ๋˜ํ•œ URL ๊ตฌ์กฐ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ณ  ๋…ผ๋ฆฌ์ ์œผ๋กœ ๋ผ์šฐํŠธ๋ฅผ ๊ทธ๋ฃนํ™”ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ผ์šฐํŠธ ๊ทธ๋ฃน(์˜ˆ: `(folderName)`) ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์—ฌ, ๊ธฐ๋Šฅ๋ณ„ ๋˜๋Š” ํŒ€๋ณ„๋กœ ์ฝ”๋“œ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์กฐ์งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5]. -* **React Server Components (RSC) ํ†ตํ•ฉ**: App Router๋Š” ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ •์ ์ด๊ฑฐ๋‚˜ ๋ฐ์ดํ„ฐ ์ฃผ๋„์ ์ธ(read-only) UI๋Š” ํด๋ผ์ด์–ธํŠธ ์ธก ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—†์ด ์„œ๋ฒ„์—์„œ๋งŒ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ์–ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค ํฌ๊ธฐ์™€ Hydration ์†Œ์š” ์‹œ๊ฐ„์„ ๊ทน๋Œ€ํ™”ํ•˜์—ฌ ์ค„์—ฌ์ค๋‹ˆ๋‹ค [2, 6, 7]. -* **ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„์˜ ์—ญํ•  ๋ถ„๋ฆฌ**: ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” ์ƒํƒœ(state), `useEffect`, ํด๋ผ์ด์–ธํŠธ ์ „์šฉ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค [8]. ๋”ฐ๋ผ์„œ ์ƒํ˜ธ์ž‘์šฉ์ด ์ฆ‰๊ฐ์ ์œผ๋กœ ํ•„์š”ํ•œ UI(๋ชจ๋‹ฌ, ์ž…๋ ฅ์ฐฝ ๋“ฑ)์—๋งŒ ํŒŒ์ผ ์ƒ๋‹จ์— `use client` ์ง€์‹œ์–ด๋ฅผ ์„ ์–ธํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ๋กœ ๋งŒ๋“ค๊ณ , ๋‚˜๋จธ์ง€๋Š” ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค [7, 9]. -* **๋™์‹œ์„ฑ ๋ Œ๋”๋ง(Concurrent Rendering) ์™„๋ฒฝ ์ง€์›**: App Router๋Š” React 18์˜ ๋™์‹œ์„ฑ ๊ธฐ๋Šฅ๊ณผ ์™„๋ฒฝํ•˜๊ฒŒ ํ†ตํ•ฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. `useTransition` ๋ฐ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค์˜ ์‘๋‹ต์„ฑ์„ ๋–จ์–ด๋œจ๋ฆฌ์ง€ ์•Š๊ณ  ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์„ ํšจ๊ณผ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [10]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -- [[React Server Components]] - - ์—ฐ๊ฒฐ ์ด์œ : Next.js App Router ์•„ํ‚คํ…์ฒ˜์˜ ํ•ต์‹ฌ ๊ธฐ๋ฐ˜์œผ๋กœ, ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ค„์ด๊ณ  ๋ฐ์ดํ„ฐ ํŽ˜์นญ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค [1, 2]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํด๋ผ์ด์–ธํŠธ ์ธก ๋ Œ๋”๋ง ์ฝ”๋“œ์™€ ์„œ๋ฒ„ ์ธก ๋ Œ๋”๋ง ์ฝ”๋“œ ๊ฐ„์˜ ๋ช…ํ™•ํ•œ ๊ฒฝ๊ณ„ ๊ตฌ๋ถ„ ๋ฐ Hydration ์ตœ์†Œํ™” ์ „๋žต [6, 7, 9]. - -- [[Route Groups]] - - ์—ฐ๊ฒฐ ์ด์œ : App Router ๋‚ด์—์„œ URL ๊ฒฝ๋กœ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ ๋„ ํด๋” ๊ตฌ์กฐ๋ฅผ ๋…ผ๋ฆฌ์ ์œผ๋กœ ์กฐ์งํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ํ•ต์‹ฌ ํด๋” ๋ผ์šฐํŒ… ํŒจํ„ด์ž…๋‹ˆ๋‹ค [5, 11]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ณต์žกํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ณ„๋„์˜ ๋ ˆ์ด์•„์›ƒ์„ ๊ฐ€์ง„ ์„น์…˜(์˜ˆ: ๋งˆ์ผ€ํŒ… ํŽ˜์ด์ง€์™€ ์ƒ์  ํŽ˜์ด์ง€)์„ ์ถฉ๋Œ ์—†์ด ๋…๋ฆฝ์ ์œผ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ• [5, 11]. - -- [[Concurrent Rendering]] - - ์—ฐ๊ฒฐ ์ด์œ : Next.js App Router๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์™„๋ฒฝํ•˜๊ฒŒ ์ง€์›ํ•˜๋Š” React์˜ ๋ Œ๋”๋ง ๋ฉ”์ปค๋‹ˆ์ฆ˜์œผ๋กœ, ๋ Œ๋”๋ง ์ž‘์—…์„ ์ผ์‹œ ์ค‘์ง€, ์ค‘๋‹จ ๋ฐ ์žฌ๊ฐœํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค [10, 12]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: `useTransition` ๋ฐ `useDeferredValue` ํ›…์„ ํ†ตํ•ด ๋ฌด๊ฑฐ์šด ๋ Œ๋”๋ง ์‹œ์—๋„ ์‚ฌ์šฉ์ž ์ž…๋ ฅ ๋ฐ˜์‘์„ฑ(UX)์„ ๋†’๊ฒŒ ์œ ์ง€ํ•˜๋Š” ์›๋ฆฌ [13, 14]. - -### Deeper Research Questions - -- ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฃจํŠธ ๋ ˆ์ด์•„์›ƒ์„ ๊ฐ€์ง„ Route Groups ํ™˜๊ฒฝ์—์„œ ์ตœ์ƒ์œ„ `layout.js`๊ฐ€ ์—†์„ ๋•Œ, ๋‹ค๋ฅธ ๋ฃจํŠธ ๋ ˆ์ด์•„์›ƒ ๊ฐ„์˜ ๋„ค๋น„๊ฒŒ์ด์…˜ ์‹œ ๋ฐœ์ƒํ•˜๋Š” ์ „์ฒด ํŽ˜์ด์ง€ ๋กœ๋“œ(full page load)์˜ ๋‚ด๋ถ€ ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ๋ฌด์—‡์ธ๊ฐ€? [11] -- App Router์—์„œ `[param]` ํ˜•ํƒœ์˜ ๋™์  ๋ผ์šฐํŠธ์™€ Route Group ๊ฐ„์˜ ๊ฒฝ๋กœ ์ค‘๋ณต(์˜ˆ: `(marketing)/about/page.tsx`์™€ `(shop)/about/page.tsx`) ์ถฉ๋Œ ์‹œ, Next.js์˜ ๋ผ์šฐํŠธ ํ•ด์„ ์šฐ์„ ์ˆœ์œ„๋Š” ์–ด๋–ป๊ฒŒ ๊ฒฐ์ •๋˜๋Š”๊ฐ€? [11] -- ๊ธฐ์กด Pages Router ๋ฐฉ์‹๊ณผ ๋น„๊ตํ•˜์—ฌ App Router์˜ React Server Components๋Š” ๋ฐ์ดํ„ฐ ํŽ˜์นญ ์‹œ ์–ด๋–ป๊ฒŒ 'Double Fetching' ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๋Š”๊ฐ€? [7, 8] -- ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ(`use client`)์™€ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ˜ผํ•ฉ๋œ ํ˜•ํƒœ์˜ ํŠธ๋ฆฌ์—์„œ, ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ๋ฅผ `children`์œผ๋กœ ์ „๋‹ฌํ•˜๊ฑฐ๋‚˜ ์ž„ํฌํŠธํ•  ๋•Œ ์ ์šฉ๋˜๋Š” ์ง๋ ฌํ™” ๊ทœ์น™ ๋ฐ ํ•œ๊ณ„์ ์€ ๋ฌด์—‡์ธ๊ฐ€? [6, 7, 9] -- ํŠน์ˆ˜ ๋ผ์šฐํŒ… ํŒŒ์ผ ์ค‘ `error.js`๊ฐ€ React Error Boundary๋กœ์„œ ๋™์ž‘ํ•  ๋•Œ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ ์˜ค๋ฅ˜์™€ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ ์˜ค๋ฅ˜๋ฅผ ๊ฐ๊ฐ ์ฒ˜๋ฆฌํ•˜๋Š” ํ๋ฆ„์€ ์–ด๋–ป๊ฒŒ ๊ตฌ๋ถ„๋˜๋Š”๊ฐ€? [3] - -### Practical Application Contexts - -- **Implementation:** ๋ผ์šฐํŠธ๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ๋Š” `kebab-case` ๋ช…๋ช… ๊ทœ์น™์„ ์ ์šฉํ•œ ํด๋”(์˜ˆ: `auth-provider.tsx`)๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋ผ์šฐํŒ…ํ•˜๊ณ , ๋Œ€์‹œ๋ณด๋“œ์ฒ˜๋Ÿผ ์ •์ ์ธ ๋ ˆ์ด์•„์›ƒ์€ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋กœ ๋‘๋ฉด์„œ `AddToCartButton` ๊ฐ™์ด ์ƒํ˜ธ์ž‘์šฉ์ด ํ•„์š”ํ•œ ์œ„์ ฏ๋งŒ `use client` ์ปดํฌ๋„ŒํŠธ๋กœ ์ž„ํฌํŠธํ•˜์—ฌ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค [4, 7, 15]. -- **System Design:** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋ฅผ ์กฐ์งํ•  ๋•Œ, ๊ธฐ๋Šฅ๋ณ„(Feature-Based) ํด๋” ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ, ํŽ˜์ด์ง€, ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ํ•œ ๊ธฐ๋Šฅ ํด๋”(์˜ˆ: `features/auth/`)์— ๋ชจ์œผ๊ณ , ์ด๋ฅผ ๋‹ค์‹œ `Route Groups`๋ฅผ ํ†ตํ•ด ๋ชจ๋“ˆํ™”๋œ ์•„ํ‚คํ…์ฒ˜๋กœ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค [5, 16, 17]. -- **Operation / Maintenance:** ์ดˆ๊ธฐ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค ์šฉ๋Ÿ‰์ด ์ปค์ ธ INP(Interaction to Next Paint)์™€ TTI(Time to Interactive) ๋“ฑ ์ฝ”์–ด ์›น ๋ฐ”์ดํƒˆ ์ˆ˜์น˜๊ฐ€ ์ €ํ•˜๋  ๋•Œ, ์–ด๋–ค ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ๋กœ ๋กœ๋“œ๋˜์—ˆ๋Š”์ง€ ํŒŒ์•…ํ•˜์—ฌ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•˜๋Š” ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค [6, 18]. -- **Learning Path:** ์šฐ์„  React์˜ ๋ Œ๋”๋ง ๋ชจ๋ธ ํŠธ๋ฆฌ๊ฑฐ ์š”์ธ๊ณผ ์ƒํƒœ ๋ณ€ํ™” ์›๋ฆฌ๋ฅผ ์ˆ™์ง€ํ•˜๊ณ  [19], ์ดํ›„ React 18์˜ ๋™์‹œ์„ฑ ํ›…(`useTransition`) ๋™์ž‘์„ ์‹ค์Šตํ•œ ๋’ค [12, 13], Next.js App Router์˜ Server Components๋ฅผ ํ†ตํ•œ ์„œ๋ฒ„/ํด๋ผ์ด์–ธํŠธ ๊ฒฝ๊ณ„ ๊ฐœ๋…์„ ๋ฐฐ์šฐ๋Š” ์ˆœ์„œ๋กœ ์ ‘๊ทผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [2, 7]. -- **My Project Relevance:** ์†Œ์Šค์— ๊ด€๋ จ ์ •๋ณด๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. - -### Adjacent Topics - -- [[Code Splitting & Lazy Loading]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: App Router์˜ Server Components๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, `React.lazy`์™€ `Suspense`๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ๋ผ์šฐํŠธ ๋ฐ ๋ฌด๊ฑฐ์šด ์ปดํฌ๋„ŒํŠธ(์ฐจํŠธ, ์—๋””ํ„ฐ ๋“ฑ)๋ฅผ ํ•„์š”ํ•œ ์ˆœ๊ฐ„์—๋งŒ ๋กœ๋“œํ•˜๋„๋ก ์ตœ์ ํ™”ํ•˜๋Š” ๊ธฐ๋ฒ•์œผ๋กœ์˜ ์ดํ•ด ํ™•์žฅ [20, 21]. -- [[React Context API Optimization]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: App Router ํ™˜๊ฒฝ ํ•˜์˜ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ๋ถˆ๊ฐ€ํ”ผํ•˜๊ฒŒ ์ „์—ญ ์ƒํƒœ๋ฅผ ์“ธ ๋•Œ, Context์˜ ๊ด‘๋ฒ”์œ„ํ•œ ๋ฆฌ๋ Œ๋”๋ง ์ด์Šˆ๋ฅผ ํšŒํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์ปจํ…์ŠคํŠธ๋ฅผ ๋ถ„๋ฆฌํ•˜๊ฑฐ๋‚˜ Zustand, Jotai ๋“ฑ์˜ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋„์ž…ํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ํ•™์Šต ํ™•์žฅ [22-24]. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Next.js ๋ฐ Server Components ์ ์šฉ ํ”„๋กœ์ ํŠธ.md b/00_Raw/Next.js ๋ฐ Server Components ์ ์šฉ ํ”„๋กœ์ ํŠธ.md deleted file mode 100644 index 12ae26c5..00000000 --- a/00_Raw/Next.js ๋ฐ Server Components ์ ์šฉ ํ”„๋กœ์ ํŠธ.md +++ /dev/null @@ -1,60 +0,0 @@ -# [[Next.js ๋ฐ Server Components ์ ์šฉ ํ”„๋กœ์ ํŠธ]] - -## ๐Ÿ“Œ Brief Summary -Next.js์˜ App Router์™€ ๊ฒฐํ•ฉ๋œ React Server Components(RSC)๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ ์ธก ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ค„์ด๊ณ  ์ดˆ๊ธฐ ๋กœ๋“œ ์†๋„๋ฅผ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ์•„ํ‚คํ…์ฒ˜ ๋ฐ ์„ฑ๋Šฅ ์ตœ์ ํ™” ์ ‘๊ทผ๋ฒ•์ž…๋‹ˆ๋‹ค [1, 2]. ์ •์ ์ธ UI์™€ ์ƒํ˜ธ์ž‘์šฉ์ด ํ•„์š”ํ•œ UI๋ฅผ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌํ•˜๊ณ , ์„œ๋ฒ„์—์„œ ์ง์ ‘ ๋ฐ์ดํ„ฐ๋ฅผ ํŒจ์นญํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ์„ ๊ทน๋Œ€ํ™”ํ•ฉ๋‹ˆ๋‹ค [2, 3]. - -## ๐Ÿ“– Core Content -* **Next.js ํŒŒ์ผ ๊ธฐ๋ฐ˜ ๋ผ์šฐํŒ… ๋ฐ ํด๋” ๊ตฌ์กฐ**: Next.js๋Š” `page.js`(๋ผ์šฐํŠธ), `layout.js`(๊ณต์œ  ๋ ˆ์ด์•„์›ƒ), `error.js`(์‚ฌ์šฉ์ž ์ •์˜ ์—๋Ÿฌ), `loading.js`(๋กœ๋”ฉ ์ƒํƒœ)์™€ ๊ฐ™์€ ํŠน์ˆ˜ ํŒŒ์ผ ๋ช…๋ช… ๊ทœ์น™์„ ํ†ตํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ผ์šฐํŒ…๊ณผ ๊ตฌ์กฐ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค [4]. ๊ด€๋ จ๋œ ํŒŒ์ผ์„ ๋ชจ์•„๋‘๋Š” ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ํด๋”(Feature-Based Folders)์™€ `(folderName)` ํ˜•ํƒœ์˜ ๋ผ์šฐํŠธ ๊ทธ๋ฃน(Route Groups)์„ ํ™œ์šฉํ•˜๋ฉด, URL ๊ฒฝ๋กœ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์œผ๋ฉด์„œ๋„ ์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ํ™•์žฅ์„ฑ์ด ๋›ฐ์–ด๋‚œ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5-7]. -* **React Server Components (RSC)์˜ ํŠน์ง•**: ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋Š” ์˜ค๋กœ์ง€ ์„œ๋ฒ„์—์„œ๋งŒ ๋ Œ๋”๋ง๋˜๋ฉฐ, ํด๋ผ์ด์–ธํŠธ๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ์ „์†กํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค [2]. ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ์˜ ๋กœ๋”ฉ ๊ณผ์ • ์—†์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋‚˜ API๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ํŒจ์นญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2, 3]. -* **ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ์™€์˜ ๋ถ„๋ฆฌ ๋ฐ ์กฐํ•ฉ**: ์ƒํ˜ธ์ž‘์šฉ์ด ํ•„์š”ํ•œ UI(์˜ˆ: ๋ชจ๋‹ฌ, ์ž…๋ ฅ ํผ, ๋“œ๋กญ๋‹ค์šด ๋“ฑ)๋Š” ํŒŒ์ผ ์ƒ๋‹จ์— `"use client"` ์ง€์‹œ์–ด๋ฅผ ์„ ์–ธํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ช…์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [3, 8]. ๋ชจ๋ฒ” ์‚ฌ๋ก€๋กœ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๋ฅผ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋กœ ์‚ฌ์šฉํ•˜๊ณ , ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ํด๋ผ์ด์–ธํŠธ ๋™์ž‘์„ ์ถ”๊ฐ€(opt-in)ํ•˜๋Š” ๋ฐฉ์‹์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค [8]. -* **์„ฑ๋Šฅ ๋ฐ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ํ–ฅ์ƒ**: ์ƒํ˜ธ์ž‘์šฉ์ด ๋ถˆํ•„์š”ํ•œ ๋ ˆ์ด์•„์›ƒ์ด๋‚˜ ์ •์  ๋ทฐ๋ฅผ ์„œ๋ฒ„์— ๋ Œ๋”๋งํ•จ์œผ๋กœ์จ ํด๋ผ์ด์–ธํŠธ๋กœ ์ „์†ก๋˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ํš๊ธฐ์ ์œผ๋กœ ์ค„์ž…๋‹ˆ๋‹ค [3]. ์ด๋Š” ์ดˆ๊ธฐ ํŽ˜์ธํŠธ(First Paint) ์†๋„์™€ ํ•˜์ด๋“œ๋ ˆ์ด์…˜(Hydration) ์‹œ๊ฐ„์„ ๋‹จ์ถ•์‹œ์ผœ ๋ชจ๋ฐ”์ผ์ด๋‚˜ ์ €์„ฑ๋Šฅ ๊ธฐ๊ธฐ์—์„œ์˜ ์ฒด๊ฐ ์„ฑ๋Šฅ์„ ๋Œ€ํญ ๊ฐœ์„ ํ•ฉ๋‹ˆ๋‹ค [3, 8]. - -## โš–๏ธ Trade-offs & Caveats -* **๋ผ์šฐํ„ฐ ๋ฐ ๋Ÿฐํƒ€์ž„ ์ œ์•ฝ**: Server Components๋Š” Next.js์˜ ๊ธฐ์กด Pages Router์—์„œ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์œผ๋ฉฐ, ๋ฐ˜๋“œ์‹œ App Router ํ™˜๊ฒฝ์—์„œ๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค [9]. ๋˜ํ•œ Node.js๋‚˜ Edge ๋Ÿฐํƒ€์ž„์ด ํ•„์š”ํ•˜๋ฉฐ, ์ •์  ๋‚ด๋ณด๋‚ด๊ธฐ(static export) ํ™˜๊ฒฝ์—์„œ๋Š” ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค [9]. -* **์ƒํƒœ ๋ฐ ์ƒ๋ช…์ฃผ๊ธฐ ํ›… ์‚ฌ์šฉ ๋ถˆ๊ฐ€**: ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ๋Š” `useState`, `useEffect`์™€ ๊ฐ™์€ ๋กœ์ปฌ ์ƒํƒœ ๋ฐ ์ƒ๋ช…์ฃผ๊ธฐ ๊ด€๋ฆฌ ํ›…์ด๋‚˜ ํด๋ผ์ด์–ธํŠธ ์ „์šฉ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค [9]. -* **๊ฒฝ๊ณ„(Boundary) ๊ด€๋ฆฌ์˜ ๋ณต์žก์„ฑ**: ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์™€ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ•จ๊ป˜ ๊ตฌ์„ฑํ•  ๋•Œ ์ด ๋‘˜ ์‚ฌ์ด์˜ ๊ฒฝ๊ณ„๋ฅผ ๋งค์šฐ ์‹ ์ค‘ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [9]. ์„œ๋กœ ๋‹ค๋ฅธ ํŠน์„ฑ์„ ๊ฐ€์ง„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ž˜๋ชป ์ค‘์ฒฉํ•˜๊ฑฐ๋‚˜ ๊ตฌ์„ฑํ•˜๋ฉด ์ตœ์ ํ™” ํšจ๊ณผ๋ฅผ ์žƒ๊ฑฐ๋‚˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์˜๋„๋Œ€๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์ด ๊ฒฝ๊ณ„ ๊ฐ„ ๋ฐ์ดํ„ฐ ์ง๋ ฌํ™” ๋“ฑ ์„ธ๋ถ€์ ์ธ ์ œ์•ฝ์— ๋Œ€ํ•ด์„œ๋Š” ์†Œ์Šค์— ๊ด€๋ จ ์ •๋ณด๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค). - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -#### [๊ด€๊ณ„ ์œ ํ˜• A (์•„ํ‚คํ…์ฒ˜ ๋ฐ ๋ผ์šฐํŒ…)] -- [[Next.js App Router]] - - ์—ฐ๊ฒฐ ์ด์œ : React Server Components๋ฅผ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ™œ์šฉํ•˜๊ณ  ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์š”๊ตฌ๋˜๋Š” Next.js์˜ ์ตœ์‹  ๋ผ์šฐํŒ… ๋ฐ ์•„ํ‚คํ…์ฒ˜ ํ™˜๊ฒฝ์ž…๋‹ˆ๋‹ค [1, 9]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ผ์šฐํŠธ ๋‹จ์œ„์˜ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ… ๋ฐฉ์‹๊ณผ `page.js`, `layout.js` ์ค‘์‹ฌ์˜ ํŒŒ์ผ ๊ธฐ๋ฐ˜ ๋ Œ๋”๋ง ํŒŒ์ดํ”„๋ผ์ธ. -- [[Route Groups]] - - ์—ฐ๊ฒฐ ์ด์œ : URL ๊ตฌ์กฐ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์œผ๋ฉด์„œ ๊ด€๋ จ๋œ ๋ผ์šฐํŠธ๋‚˜ ๋ ˆ์ด์•„์›ƒ์„ ๋ฌถ๊ธฐ ์œ„ํ•ด `(folderName)` ํฌ๋งท์„ ์‚ฌ์šฉํ•˜๋Š” Next.js์˜ ํด๋” ์กฐ์ง ๋ฐฉ๋ฒ•๋ก ์ž…๋‹ˆ๋‹ค [6]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋Œ€๊ทœ๋ชจ Next.js ํ”„๋กœ์ ํŠธ์—์„œ ์„œ๋กœ ๋‹ค๋ฅธ ํŒ€์ด๋‚˜ ๊ธฐ๋Šฅ์˜ ๋ผ์šฐํŠธ ์ถฉ๋Œ ์—†์ด ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ๋…ผ๋ฆฌ์  ๋””๋ ‰ํ† ๋ฆฌ ์„ค๊ณ„ ๋ฐฉ๋ฒ• [7]. - -#### [๊ด€๊ณ„ ์œ ํ˜• B (์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ฐ ๋กœ๋”ฉ)] -- [[Code Splitting ๋ฐ Lazy Loading]] - - ์—ฐ๊ฒฐ ์ด์œ : ์ดˆ๊ธฐ ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ๋ฅผ ์ค„์ด๊ณ  ํ•„์š”ํ•œ ์ฝ”๋“œ๋งŒ ์ง€์—ฐ ๋กœ๋”ฉํ•˜๋Š” ์ตœ์ ํ™” ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค. Server Components ๋˜ํ•œ ๋ถˆํ•„์š”ํ•œ ๋ฒˆ๋“ค์„ ์ œ๊ฑฐํ•œ๋‹ค๋Š” ์ ์—์„œ ๋ชฉ์ ์„ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค [10, 11]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: `React.lazy`์™€ `Suspense`๋ฅผ ํ†ตํ•œ ํด๋ผ์ด์–ธํŠธ ์ธก ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…๊ณผ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ†ตํ•œ ์„œ๋ฒ„ ์ธก ๋ฒˆ๋“ค ์‚ญ๊ฐ์˜ ์ฐจ์ด์  ๋ฐ ์‹œ๋„ˆ์ง€ ํšจ๊ณผ. -- [[Hydration]] - - ์—ฐ๊ฒฐ ์ด์œ : ์„œ๋ฒ„ ์ธก์—์„œ ๋ Œ๋”๋ง๋œ ์ •์  HTML์ด ํด๋ผ์ด์–ธํŠธ์—์„œ ์ƒํ˜ธ์ž‘์šฉ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋กœ ํ™œ์„ฑํ™”๋˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค [3]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Server Components๊ฐ€ ์ •์  ๋งˆํฌ์—…์— ๋Œ€ํ•ด์„œ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ „์†กํ•˜์ง€ ์•Š์Œ์œผ๋กœ์จ ์ด ํ•˜์ด๋“œ๋ ˆ์ด์…˜ ๋น„์šฉ์„ ์–ด๋–ป๊ฒŒ ํ˜์‹ ์ ์œผ๋กœ ์ค„์ด๋Š”์ง€ ๊ทธ ์›๋ฆฌ. - -### Deeper Research Questions -- Next.js์˜ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์™€ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ ๊ฒฝ๊ณ„๋ฅผ ๊ต์ฐจํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ Props๋กœ ์ „๋‹ฌํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์ง๋ ฌํ™”(Serialization) ์ œ์•ฝ์€ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•ด์•ผ ํ•˜๋Š”๊ฐ€? (์†Œ์Šค์— ๊ด€๋ จ ์ •๋ณด๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค.) -- `(folderName)` ํ˜•ํƒœ์˜ ๋ผ์šฐํŠธ ๊ทธ๋ฃน์„ ํ™œ์šฉํ•ด ๋‹ค์ค‘ ๋ฃจํŠธ ๋ ˆ์ด์•„์›ƒ์„ ๊ตฌ์„ฑํ•  ๊ฒฝ์šฐ, ์„œ๋กœ ๋‹ค๋ฅธ ๋ฃจํŠธ ๋ ˆ์ด์•„์›ƒ ๊ฐ„ ๋‚ด๋น„๊ฒŒ์ด์…˜ ์‹œ ๋ธŒ๋ผ์šฐ์ €์˜ ์ „์ฒด ํŽ˜์ด์ง€ ๋กœ๋“œ(Full Page Load) ๋ฌธ์ œ๋ฅผ ํšŒํ”ผํ•  ์ˆ˜ ์žˆ๋Š” ์„ค๊ณ„ ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? [7] -- ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ ๋‚ด๋ถ€์— ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋งํ•ด์•ผ ํ•  ๊ฒฝ์šฐ, ์ปดํฌ๋„ŒํŠธ ํ•ฉ์„ฑ(Composition)๊ณผ `children` prop์„ ํ™œ์šฉํ•˜๋Š” ๊ตฌ์ฒด์ ์ด๊ณ  ์˜ฌ๋ฐ”๋ฅธ ๊ตฌํ˜„ ํŒจํ„ด์€ ๋ฌด์—‡์ธ๊ฐ€? [2] -- ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(Zustand, Redux ๋“ฑ)๋‚˜ React Context๋ฅผ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์™€ ํ˜ผ์šฉํ•ด์•ผ ํ•  ๋•Œ, ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์ตœ์ ์˜ ์•„ํ‚คํ…์ฒ˜๋Š” ๋ฌด์—‡์ธ๊ฐ€? (์†Œ์Šค์— ๊ด€๋ จ ์ •๋ณด๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค.) -- ๊ธฐ์กด Pages Router ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐœ๋ฐœ๋œ ๋ ˆ๊ฑฐ์‹œ ์•ฑ์„ Next.js App Router์™€ Server Components๋กœ ์ ์ง„์ ์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๊ธฐ ์œ„ํ•œ ์•ˆ์ „ํ•œ ์ „ํ™˜ ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? (์†Œ์Šค์— ๊ด€๋ จ ์ •๋ณด๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค.) - -### Practical Application Contexts - -- **Implementation:** ํŽ˜์ด์ง€์˜ ๋Œ€๋ถ€๋ถ„์„ ๊ตฌ์„ฑํ•˜๋Š” ํ—ค๋”, ์ œํ’ˆ ๋ชฉ๋ก, ์„ค๋ช… ๋“ฑ์€ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋กœ ์œ ์ง€ํ•˜๊ณ , ์‚ฌ์šฉ์ž์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” '์žฅ๋ฐ”๊ตฌ๋‹ˆ ์ถ”๊ฐ€(Add To Cart)' ๋ฒ„ํŠผ ๋“ฑ์—๋งŒ `"use client"`๋ฅผ ์„ ์–ธํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค [3]. -- **System Design:** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๊ตฌ์ถ•ํ•  ๋•Œ, ๊ธฐ๋Šฅ(Feature) ๋ณ„๋กœ ํด๋”๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ํ•ด๋‹น ๊ธฐ๋Šฅ์— ๊ด€๋ จ๋œ ๋ผ์šฐํŠธ, ์ปดํฌ๋„ŒํŠธ, ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ํ•œ ๊ณณ์— ์‘์ง‘์‹œํ‚ค๋Š” Feature-Based ๊ตฌ์กฐ๋กœ ๋ผ์šฐํŒ…๊ณผ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ฒฐํ•ฉํ•ฉ๋‹ˆ๋‹ค [5]. -- **Operation / Maintenance:** `(marketing)`, `(shop)`๊ณผ ๊ฐ™์€ Route Groups๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๊ด€๋ จ ๊ฒฝ๋กœ๋“ค์„ ๋…ผ๋ฆฌ์ ์œผ๋กœ ๋ถ„๋ฆฌํ•จ์œผ๋กœ์จ ์—ฌ๋Ÿฌ ํŒ€์ด ํ˜‘์—…ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๊ณ  ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ํƒ์ƒ‰์„ ์šฉ์ดํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค [6, 7]. -- **Learning Path:** Next.js์˜ ํŒŒ์ผ ์‹œ์Šคํ…œ ๊ธฐ๋ฐ˜ ๋ผ์šฐํŒ…(์˜ˆ: `page.tsx`, `layout.tsx` ๊ทœ์น™)์„ ๋จผ์ € ํ•™์Šตํ•œ ๋’ค, ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ํ™˜๊ฒฝ์—์„œ์˜ ์ปดํฌ๋„ŒํŠธ ๋™์ž‘ ์ฐจ์ด(์ œ์•ฝ ์‚ฌํ•ญ๊ณผ ์ด์ )๋ฅผ ๋ถ„์„ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋‚˜์•„๊ฐ‘๋‹ˆ๋‹ค [4, 8, 9]. -- **My Project Relevance:** ๋ณต์žกํ•œ ๋Œ€์‹œ๋ณด๋“œ๋‚˜ ์ด์ปค๋จธ์Šค ๋“ฑ ๋Œ€๊ทœ๋ชจ ๋ Œ๋”๋ง์ด ํ•„์š”ํ•œ ๋ทฐ์—์„œ, ๋ฐ์ดํ„ฐ ์œ„์ฃผ์˜ ์ฝ๊ธฐ ์ „์šฉ UI๋Š” ์„œ๋ฒ„์—์„œ ๋ฏธ๋ฆฌ ์™„์„ฑํ•˜๊ณ  ์‹ค์‹œ๊ฐ„ ํ•„ํ„ฐ๋‚˜ ์ž…๋ ฅ ์š”์†Œ๋งŒ ํด๋ผ์ด์–ธํŠธ๋กœ ๋„˜๊ธฐ๋Š” ๊ตฌ์กฐ๋ฅผ ์ฑ„ํƒํ•˜์—ฌ TTI(Time To Interactive)์™€ ๋กœ๋”ฉ ์„ฑ๋Šฅ์„ ์ง์ ‘์ ์œผ๋กœ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3, 8]. - -### Adjacent Topics - -- [[React Concurrent Features]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: `useTransition` ๋ฐ `useDeferredValue` ๋“ฑ React 18์˜ ๋™์‹œ์„ฑ ๋ Œ๋”๋ง ๊ธฐ๋Šฅ์ด Server Components์™€ ๊ฒฐํ•ฉ๋˜์–ด ์–ด๋–ป๊ฒŒ ๋”์šฑ ๋งค๋„๋Ÿฌ์šด UX์™€ ์ธํ„ฐ๋ž™์…˜์„ ์ œ๊ณตํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์‹ฌ์ธต ํƒ๊ตฌ [12-14]. -- [[Feature-Sliced Design (FSD)]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋ฅผ ๋น„์ฆˆ๋‹ˆ์Šค ๋…ผ๋ฆฌ์— ๋”ฐ๋ผ ๋ช…ํ™•ํžˆ ์Šฌ๋ผ์ด์‹ฑํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜ ๋ฐฉ๋ฒ•๋ก ์œผ๋กœ, Next.js์˜ ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ํด๋” ๊ตฌ์กฐ ๋ฐ App Router์™€ ์–ด๋–ป๊ฒŒ ์กฐํ™”๋กญ๊ฒŒ ํ†ตํ•ฉ๋  ์ˆ˜ ์žˆ๋Š”์ง€ ์กฐ์‚ฌ [5, 15]. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Observability.md b/00_Raw/Observability.md deleted file mode 100644 index 0169202b..00000000 --- a/00_Raw/Observability.md +++ /dev/null @@ -1,66 +0,0 @@ -# [[Observability]] - -## ๐Ÿ“Œ Brief ์‹ค์ „ Summary -Observability(๊ด€์ฐฐ ๊ฐ€๋Šฅ์„ฑ)๋Š” ํ”„๋ก ํŠธ์—”๋“œ๋ถ€ํ„ฐ ๋ฐฑ์—”๋“œ๊นŒ์ง€ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ ์ „๋ฐ˜์— ๊ฑธ์นœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋™์ž‘๊ณผ ์„ฑ๋Šฅ์„ ๊ฐ€์‹œํ™”ํ•˜๊ณ  ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค [1, 2]. ๋‹จ์ˆœํ•œ ์—๋Ÿฌ ๋กœ๊น…์„ ๋„˜์–ด ๋กœ๊ทธ(Logs), ๋ฉ”ํŠธ๋ฆญ(Metrics), ๋ถ„์‚ฐ ํŠธ๋ ˆ์ด์Šค(Traces)๋ฅผ ๋‹จ์ผ ํ”Œ๋žซํผ์œผ๋กœ ํ†ตํ•ฉํ•˜์—ฌ ์‹œ์Šคํ…œ์˜ ์ƒํƒœ๋ฅผ ์ข…ํ•ฉ์ ์œผ๋กœ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค [3]. ์ด๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๋Š” ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ณต์žกํ•œ ๋ฒ„๊ทธ๋‚˜ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ์˜ ๊ทผ๋ณธ ์›์ธ์„ ํŒŒ์•…ํ•˜๊ณ , ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜์—ฌ ์‹œ์Šคํ…œ์˜ ์•ˆ์ •์„ฑ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1, 4]. - -## ๐Ÿ“– Core Content -* **ํ†ตํ•ฉ ๊ฐ€์‹œ์„ฑ(Unified Observability):** ํ˜„๋Œ€์ ์ธ Observability ํ”Œ๋žซํผ์€ ๋กœ๊ทธ, ๋ฉ”ํŠธ๋ฆญ, ํŠธ๋ ˆ์ด์Šค๋ฅผ ํ•œ ๊ณณ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ์ „์ฒด์ ์ธ ๋ชจ๋‹ˆํ„ฐ๋ง(Full-stack visibility)์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [3]. ์˜ˆ๋ฅผ ๋“ค์–ด, SigNoz์™€ ๊ฐ™์€ ๋„๊ตฌ๋Š” OpenTelemetry๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜์—ฌ ์ด๋Ÿฌํ•œ ํ†ตํ•ฉ ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [3, 5]. -* **์—”๋“œํˆฌ์—”๋“œ ํŠธ๋ ˆ์ด์‹ฑ(End-to-end Tracing):** ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ ๊ฐ„์˜ ๋ชจ๋‹ˆํ„ฐ๋ง ๊ฐ„๊ทน์„ ๋ฉ”์›Œ์ฃผ๋Š” ํ•ต์‹ฌ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค [1]. ํ”„๋ก ํŠธ์—”๋“œ์—์„œ ์—๋Ÿฌ๋ฅผ ํด๋ฆญํ•˜๋ฉด ํ•ด๋‹น ์š”์ฒญ์ด ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ์„œ๋“œํŒŒํ‹ฐ API๋ฅผ ํ†ต๊ณผํ•˜๋Š” ์ „์ฒด ๊ณผ์ •์„ ๋ถ„์‚ฐ ํŠธ๋ ˆ์ด์‹ฑ์„ ํ†ตํ•ด ์ถ”์ ํ•  ์ˆ˜ ์žˆ์–ด ๋ณต์žกํ•œ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ ๋””๋ฒ„๊น…์— ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค [1, 5]. -* **ํ”„๋กœ๋•์…˜ ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ๋””๋ฒ„๊น… ๊ธฐ๋Šฅ:** - * **์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด(Session Replay):** LogRocket, Sentry ๋“ฑ์˜ ๋„๊ตฌ๋Š” ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์ „ ์‚ฌ์šฉ์ž์˜ ํ–‰๋™, DOM์˜ ๋ณ€ํ™”, ๋„คํŠธ์›Œํฌ ์š”์ฒญ ๋ฐ ์ƒํƒœ ๋ณ€ํ™” ๋“ฑ์„ ๋…นํ™”ํ•˜์—ฌ ์ผ๋ฐ˜์ ์ธ ์Šคํƒ ํŠธ๋ ˆ์ด์Šค๋งŒ์œผ๋กœ๋Š” ์•Œ ์ˆ˜ ์—†๋Š” ๋งฅ๋ฝ(Context)์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [4, 6, 7]. - * **์ง€๋Šฅํ˜• ์—๋Ÿฌ ๊ทธ๋ฃนํ™”(Intelligent Error Grouping):** ์ค‘๋ณต๋˜๋Š” ์ˆ˜๋งŽ์€ ์—๋Ÿฌ๋“ค์˜ ๋…ธ์ด์ฆˆ๋ฅผ ์ค„์—ฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ณ ์œ ํ•˜๊ณ  ์น˜๋ช…์ ์ธ ์ด์Šˆ์—๋งŒ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•์Šต๋‹ˆ๋‹ค [4, 6]. -* **์˜คํ”ˆ ํ‘œ์ค€ ๊ธฐ๋ฐ˜(Open Standards):** ํŠน์ • ๋ฒค๋”์— ์ข…์†๋˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด OpenTelemetry์™€ ๊ฐ™์€ ๊ฐœ๋ฐฉํ˜• ํ‘œ์ค€์„ ์‚ฌ์šฉํ•˜๋Š” ์ถ”์„ธ์ž…๋‹ˆ๋‹ค [8, 9]. Grafana๋‚˜ SigNoz ๊ฐ™์€ ํˆด์€ ์ด ์˜คํ”ˆ ํ‘œ์ค€์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์ถ•๋˜์–ด ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ์†Œ์Šค์™€ ๊ฒฐํ•ฉํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์—ฐ์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [3, 5, 8]. - -## โš–๏ธ Trade-offs & Caveats -* **๋น„์šฉ๊ณผ ๊ฐ€์‹œ์„ฑ ๊ฐ„์˜ ๊ท ํ˜•(Cost vs. Visibility):** Datadog ๋“ฑ ์ผ๋ถ€ ํ”Œ๋žซํผ์€ ๋กœ๊ทธ์˜ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘(Ingest)๊ณผ ๊ฒ€์ƒ‰์„ ์œ„ํ•œ ์ธ๋ฑ์‹ฑ(Index)์— ๊ฐ๊ฐ ๋ณ„๋„์˜ ๋น„์šฉ์„ ์ฒญ๊ตฌํ•˜๋Š” "์ด์ค‘ ๊ฐ€๊ฒฉ ์ฑ…์ •(Two-part tariff)" ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค [10]. ์ด๋Š” ๋Œ€๊ทœ๋ชจ ํŠธ๋ž˜ํ”ฝ์—์„œ ๋น„์šฉ์„ ๊ธ‰์ฆ์‹œํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋น„์šฉ ์ ˆ๊ฐ์„ ์œ„ํ•ด 20%์˜ ๋กœ๊ทธ๋งŒ ์ธ๋ฑ์‹ฑํ•˜๊ฒŒ ๋˜๋ฉด ์žฅ์•  ๋ฐœ์ƒ ์‹œ 80%์˜ ์ค‘์š”ํ•œ ๋””๋ฒ„๊น… ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฒ€์ƒ‰๋˜์ง€ ์•Š๋Š” ์น˜๋ช…์ ์ธ ์ œ์•ฝ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [11]. -* **์„ฑ๋Šฅ ์ €ํ•˜(Performance Impact):** ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์œ„ํ•ด ์‚ฝ์ž…๋œ ๋กœ๊น… ๋„๊ตฌ๋“ค์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค๊ณ  ์ดˆ๊ธฐ ๋กœ๋”ฉ ์‹œ๊ฐ„์„ ์ตœ๋Œ€ 120ms๊นŒ์ง€ ์ง€์—ฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ์–ด, ์ „์ž์ƒ๊ฑฐ๋ž˜์™€ ๊ฐ™์ด ์„ฑ๋Šฅ์— ๋ฏผ๊ฐํ•œ ์‚ฌ์ดํŠธ์—์„œ๋Š” ๊ฐ€๋ฒผ์šด ์˜ต์…˜์„ ์„ ํƒํ•ด์•ผ ํ•˜๋Š” ๋ฐ˜๋Œ€ ๊ธ‰๋ถ€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค [2, 12, 13]. -* **ํ”„๋ผ์ด๋ฒ„์‹œ ๋ฐ ๋ณด์•ˆ ์ œ์•ฝ(Privacy Concerns):** ์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด์ฒ˜๋Ÿผ "๋ชจ๋“  ๊ฒƒ์„ ๊ธฐ๋ก"ํ•˜๋Š” ์ ‘๊ทผ ๋ฐฉ์‹์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฏผ๊ฐํ•œ ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๊นŒ์ง€ ์ˆ˜์ง‘ํ•  ์ˆ˜ ์žˆ๋Š” ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค [7, 13]. ๋”ฐ๋ผ์„œ ๊ทœ์ œ ์ค€์ˆ˜๋ฅผ ์œ„ํ•ด ๋ฏผ๊ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ ์ €ํžˆ ๋งˆ์Šคํ‚น(Masking)ํ•ด์•ผ ํ•˜๋Š” ์ดˆ๊ธฐ ์„ค์ • ๋ฐ ๊ด€๋ฆฌ์˜ ๋ถ€๋‹ด์ด ๋”ฐ๋ฆ…๋‹ˆ๋‹ค [7, 9, 14]. -* **์„ค์ • ๋ฐ ํ•™์Šต ๊ณก์„ (Setup Complexity):** SaaS ์ œํ’ˆ ๋Œ€์‹  ์˜คํ”ˆ์†Œ์Šค ๊ธฐ๋ฐ˜์ด๋‚˜ ์ž์ฒด ํ˜ธ์ŠคํŒ…(Self-hosted) Observability ๋„๊ตฌ(SigNoz, Grafana ๋“ฑ)๋ฅผ ์„ ํƒํ•  ๊ฒฝ์šฐ, ๋ฐ์ดํ„ฐ ํ†ต์ œ๋ ฅ๊ณผ ํ™•์žฅ์„ฑ์€ ๋†’์•„์ง€์ง€๋งŒ ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ์œ„ํ•œ DevOps ์ „๋ฌธ ์ง€์‹๊ณผ ๋†’์€ ๊ธฐ์ˆ ์  ํ•™์Šต ๊ณก์„ ์ด ์š”๊ตฌ๋ฉ๋‹ˆ๋‹ค [5, 8, 15, 16]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -#### [๊ด€๊ณ„ ์œ ํ˜• A (์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ )] -* [[OpenTelemetry]] - * ์—ฐ๊ฒฐ ์ด์œ : SigNoz, Grafana ๋“ฑ ์ตœ์‹  Observability ๋„๊ตฌ๋“ค์ด ๊ธฐ๋ฐ˜์œผ๋กœ ์‚ผ๊ณ  ์žˆ๋Š” ์˜คํ”ˆ ํ‘œ์ค€ ์•„ํ‚คํ…์ฒ˜์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [3, 8]. - * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํŠน์ • ๋ฒค๋” ์ข…์†์„ฑ(Vendor Lock-in) ์—†์ด ๋กœ๊ทธ, ๋ฉ”ํŠธ๋ฆญ, ๋ถ„์‚ฐ ํŠธ๋ ˆ์ด์Šค๋ฅผ ํ‘œ์ค€ํ™”๋œ ๋ฐฉ์‹์œผ๋กœ ์ˆ˜์ง‘ํ•˜๊ณ  ํ†ตํ•ฉํ•˜๋Š” ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5, 9]. -* [[Distributed Tracing]] - * ์—ฐ๊ฒฐ ์ด์œ : ํ”„๋ก ํŠธ์—”๋“œ ์—๋Ÿฌ์™€ ๋ฐฑ์—”๋“œ ์ฒ˜๋ฆฌ ํ๋ฆ„์„ ์—ฐ๊ฒฐํ•˜๋Š” Observability์˜ ํ•ต์‹ฌ ์š”์†Œ์ž…๋‹ˆ๋‹ค [1, 5]. - * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ถ„์‚ฐ ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜ ๋‚ด์—์„œ ๋‹จ์ผ ์‚ฌ์šฉ์ž ์š”์ฒญ์ด ์–ด๋–ป๊ฒŒ ์—ฌ๋Ÿฌ ์„œ๋น„์Šค์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๊ฑฐ์น˜๋Š”์ง€ ์ถ”์  ์‹๋ณ„์ž(Trace IDs)๋กœ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1, 5]. - -#### [๊ด€๊ณ„ ์œ ํ˜• B (๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ)] -* [[Session Replay]] - * ์—ฐ๊ฒฐ ์ด์œ : Sentry, LogRocket ๋“ฑ์˜ ํˆด์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž์˜ ํ–‰๋™, DOM ๋ณ€ํ™”, Redux/Zustand ์ƒํƒœ๋ฅผ ๋…นํ™”ํ•˜์—ฌ ์‹œ๊ฐ์ ์œผ๋กœ ๋ณด์—ฌ์ฃผ๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค [4, 7, 14]. - * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ผ๋ฐ˜์ ์ธ ์Šคํƒ ํŠธ๋ ˆ์ด์Šค๋งŒ์œผ๋กœ๋Š” ์žฌํ˜„ํ•˜๊ธฐ ํž˜๋“  ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์˜ UI ์—๋Ÿฌ ๋งฅ๋ฝ๊ณผ ์›์ธ์„ ๋ถ„์„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [4]. -* [[Intelligent Error Grouping]] - * ์—ฐ๊ฒฐ ์ด์œ : ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ Observability ํ”Œ๋žซํผ(Sentry ๋“ฑ)์—์„œ ๋กœ๊ทธ ๋…ธ์ด์ฆˆ๋ฅผ ์ค„์ด๋Š” ํ•„์ˆ˜ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค [4, 6]. - * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ˆ˜๋งŽ์€ ์ค‘๋ณต ์—๋Ÿฌ ๋กœ๊ทธ๋ฅผ ๋ถ„์„ ๊ฐ€๋Šฅํ•œ ๋‹จ์œ„๋กœ ๋ฌถ์–ด ๊ณ ์œ ํ•œ ๋ฌธ์ œ๋ฅผ ์‹๋ณ„ํ•˜๊ณ  ํ•ด๊ฒฐ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [4, 6]. - -### Deeper Research Questions - -* Datadog ๋“ฑ์˜ ํ”Œ๋žซํผ์ด ์ง€๋‹Œ Ingest์™€ Index ์ด์ค‘ ๊ณผ๊ธˆ ๋ฌธ์ œ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด, SigNoz์™€ ๊ฐ™์€ ์ž์ฒด ํ˜ธ์ŠคํŒ…(Self-hosted) OpenTelemetry ์ธํ”„๋ผ๋ฅผ ๊ตฌ์ถ•ํ•  ๋•Œ ์ˆ˜๋ฐ˜๋˜๋Š” ์‹ค์ œ ์ธํ”„๋ผ ๋ฐ DevOps ์šด์˜ ๋น„์šฉ์€ ์ƒ์šฉ SaaS์™€ ๋น„๊ตํ•ด ์–ด๋А ์ •๋„์ธ๊ฐ€? [10, 11, 16] -* OpenTelemetry ํ‘œ์ค€์„ ์‚ฌ์šฉํ•  ๋•Œ, ํ”„๋ก ํŠธ์—”๋“œ์˜ ์‚ฌ์šฉ์ž ์ƒํ˜ธ์ž‘์šฉ ๋กœ๊ทธ์™€ ๋ฐฑ์—”๋“œ์˜ ๋ถ„์‚ฐ ํŠธ๋ ˆ์ด์Šค(Trace IDs)๋Š” ๋„คํŠธ์›Œํฌ ๊ณ„์ธต์„ ํ†ตํ•ด ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ์ƒ๊ด€๊ด€๊ณ„(Correlation)๊ฐ€ ํ˜•์„ฑ๋˜๋Š”๊ฐ€? [1, 5] -* LogRocket์˜ ์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด ๊ธฐ๋Šฅ์ด ์ „์ฒด DOM๊ณผ ์ƒํƒœ(State)๋ฅผ ๊ธฐ๋กํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ฒˆ๋“ค ํฌ๊ธฐ ์ฆ๊ฐ€์™€ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ ์„ฑ๋Šฅ ์ €ํ•˜(Performance Impact)๋ฅผ ์™„ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋ก ํŠธ์—”๋“œ ์•„ํ‚คํ…์ฒ˜ ์ฐจ์›์˜ ์ตœ์ ํ™” ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? [2, 9, 13] -* ํ”„๋ก ํŠธ์—”๋“œ ๋กœ๊น… ์‹œ์Šคํ…œ์ด ์‚ฌ์šฉ์ž ํ™”๋ฉด์„ ๊ธฐ๋กํ•  ๋•Œ, ๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ ๊ทœ์ • ๊ฐ•ํ™”๋ฅผ ๋Œ€๋น„ํ•ด ๋ฏผ๊ฐํ•œ ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ(Sensitive Data)๋ฅผ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ์—์„œ ์•ˆ์ „ํ•˜๊ฒŒ ์ž๋™ ๋งˆ์Šคํ‚น(Masking)ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„๋˜๋Š”๊ฐ€? [9, 13, 14] -* Sentry์˜ ์ง€๋Šฅํ˜• ์—๋Ÿฌ ๊ทธ๋ฃนํ™”(Error Grouping) ๊ธฐ๋Šฅ์€ ๋ฐœ์ƒํ•œ ์—๋Ÿฌ์˜ ์Šคํƒ ํŠธ๋ ˆ์ด์Šค์™€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ค ๊ธฐ์ค€์œผ๋กœ ๋น„๊ต ๋ถ„์„ํ•˜์—ฌ ์ˆ˜์ฒœ ๊ฐœ์˜ ๋…ธ์ด์ฆˆ ๋กœ๊ทธ๋ฅผ ๋‹จ์ผ ๊ณ ์œ  ์ด์Šˆ๋กœ ์••์ถ•ํ•ด ๋‚ด๋Š”๊ฐ€? [4, 6] - -### Practical Application Contexts - -* **Implementation:** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•˜๊ธฐ ์ „ Sentry, LogRocket, Datadog RUM, SigNoz ๋“ฑ ์„œ๋น„์Šค ๊ทœ๋ชจ์™€ ๋น„์šฉ์— ๋งž๋Š” ๋กœ๊น… ๋„๊ตฌ๋ฅผ ์—ฐ๋™ํ•˜๊ณ , ์—๋Ÿฌ ๊ทธ๋ฃนํ™” ๋ฐ ์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด๋ฅผ ํ™œ์„ฑํ™”ํ•˜์—ฌ ํŠธ๋ž˜ํ‚น ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•ฉ๋‹ˆ๋‹ค [4, 7, 14, 17]. -* **System Design:** ์‹œ์Šคํ…œ ์ดˆ๊ธฐ ์„ค๊ณ„ ์‹œ ๋ฒค๋” ์ข…์†์„ฑ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด OpenTelemetry ๊ทœ๊ฒฉ์„ ์ฑ„ํƒํ•˜๊ณ , ํ”„๋ก ํŠธ์—”๋“œ์˜ ํŠธ๋ž˜ํ”ฝ ๋กœ๊ทธ๊ฐ€ ๋ฐฑ์—”๋“œ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋กœ ์›ํ™œํžˆ ์ด์–ด์ง€๋„๋ก Trace ID ๊ธฐ๋ฐ˜์˜ ๋กœ๊น… ํŒŒ์ดํ”„๋ผ์ธ์„ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค [3, 8, 9]. -* **Operation / Maintenance:** ์šด์˜ ์ค‘์ธ ์„œ๋น„์Šค์— "White screen of death"๋‚˜ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ ํ˜„์ƒ์ด ๋ฐœ์ƒํ•  ๋•Œ, Observability ๋Œ€์‹œ๋ณด๋“œ์˜ ์—๋Ÿฌ ํŠธ๋ž˜์ปค์™€ Heap Snapshots ๋“ฑ์„ ํ™œ์šฉํ•˜์—ฌ ๊ทผ๋ณธ ์›์ธ(๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜, API ์ง€์—ฐ ๋“ฑ)์„ ์‹๋ณ„ํ•˜๊ณ  ๋ณต๊ตฌํ•ฉ๋‹ˆ๋‹ค [4, 18, 19]. -* **Learning Path:** ์ฝ˜์†” ๋กœ๊ทธ(`console.log`)์— ์˜์กดํ•˜๋Š” ๊ธฐ์ดˆ์ ์ธ ๋””๋ฒ„๊น…์—์„œ ๋ฒ—์–ด๋‚˜, Chrome DevTools๋ฅผ ํ™œ์šฉํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋ถ„์„, Sentry๋ฅผ ํ†ตํ•œ ์—๋Ÿฌ ์บ์นญ, ๊ถ๊ทน์ ์œผ๋กœ ์‹œ์Šคํ…œ ์ „๋ฐ˜์˜ Metrics/Traces/Logs ํ†ตํ•ฉ ๊ด€๋ฆฌ์— ์ด๋ฅด๋Š” ์—ญ๋Ÿ‰ ์„ฑ์žฅ ๊ฒฝ๋กœ๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค [4, 18, 20]. -* **My Project Relevance:** ํ˜„์žฌ ์ž‘์—… ์ค‘์ธ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ํ”„๋ก ํŠธ์—”๋“œ ํ”„๋กœ์ ํŠธ(Scalable Frontend System)์— Observability ์ธํ”„๋ผ๋ฅผ ์ ์šฉํ•  ๋•Œ, ๋น„์šฉ(Pricing)๊ณผ ํ”„๋ผ์ด๋ฒ„์‹œ(Privacy controls), ์„ฑ๋Šฅ(Performance impact)์ด๋ผ๋Š” ํ•ต์‹ฌ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๋ฅผ ๊ณ ๋ คํ•œ ์ตœ์ ์˜ ๋„๊ตฌ ์Šคํƒ์„ ์„ ์ •ํ•˜๋Š” ๋ฐ ๊ธฐ์—ฌํ•ฉ๋‹ˆ๋‹ค [2, 9, 21, 22]. - -### Adjacent Topics - -* [[Core Web Vitals]] - * ํ™•์žฅ ๋ฐฉํ–ฅ: Observability์˜ ์—ฐ์žฅ์„ ์œผ๋กœ, ์‚ฌ์šฉ์ž ๊ฒฝํ—˜๊ณผ ์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง์— ์ง๊ฒฐ๋˜๋Š” ์ง€ํ‘œ์ธ LCP, FID, CLS, INP ์ธก์ • ๋ฐ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์œผ๋กœ ์ง€์‹์„ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค [23-25]. -* [[React Error Boundaries]] - * ํ™•์žฅ ๋ฐฉํ–ฅ: Observability ํˆด์ด ์—๋Ÿฌ๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  ์ˆ˜์ง‘ํ•˜๋Š” ๊ฒƒ์„ ๋„˜์–ด, ํ”„๋ก ํŠธ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ ๋‹จ์—์„œ ์ด๋Ÿฌํ•œ ์—๋Ÿฌ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ฒฉ๋ฆฌํ•˜๊ณ  Fallback UI๋ฅผ ๋ณด์—ฌ์ฃผ์–ด ์•ฑ์˜ ์ „์ฒด ํฌ๋ž˜์‹œ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์„ค๊ณ„ ํŒจํ„ด์„ ์•Œ์•„๋ด…๋‹ˆ๋‹ค [19, 26, 27]. -* [[Memory Management & Garbage Collection]] - * ํ™•์žฅ ๋ฐฉํ–ฅ: ํ”„๋กœ๋•์…˜ ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ๋ฅผ ํ†ตํ•ด ๊ฐ์ง€๋œ '์ ์ง„์  ์„ฑ๋Šฅ ์ €ํ•˜'์˜ ์ฃผ์›์ธ์ธ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜(Memory Leaks)์™€ Detached DOM ๋…ธ๋“œ ์ด์Šˆ๋ฅผ ๊ทผ๋ณธ์ ์œผ๋กœ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์˜ ๋™์ž‘ ์›๋ฆฌ ํ•™์Šต์œผ๋กœ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค [18, 28, 29]. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Production Environment Observability.md b/00_Raw/Production Environment Observability.md deleted file mode 100644 index 193a48de..00000000 --- a/00_Raw/Production Environment Observability.md +++ /dev/null @@ -1,63 +0,0 @@ -# [[Production Environment Observability]] - -## ๐Ÿ“Œ Brief Summary -Production Environment Observability(์šด์˜ ํ™˜๊ฒฝ ๊ด€์ธก์„ฑ)๋Š” ์‹ค์ œ ๋ฐฐํฌ๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ณต์žกํ•œ ๋ฒ„๊ทธ, ์„ฑ๋Šฅ ์ €ํ•˜, ์˜ค๋ฅ˜๋ฅผ ์ถ”์ ํ•˜๊ณ  ๋””๋ฒ„๊น…ํ•˜๊ธฐ ์œ„ํ•ด ์‹œ์Šคํ…œ์˜ ์ƒํƒœ์— ๋Œ€ํ•œ ๊ฐ€์‹œ์„ฑ์„ ํ™•๋ณดํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค [1, 2]. ์ด๋Š” ์ˆ˜์ฒœ ๊ฐ€์ง€์˜ ๋‹ค์–‘ํ•œ ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ๊ณผ ๊ธฐ๊ธฐ์—์„œ ์‹คํ–‰๋˜๋Š” ํ”„๋ก ํŠธ์—”๋“œ ์ฝ”๋“œ์˜ ํ•œ๊ณ„๋ฅผ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด ์—๋Ÿฌ ํŠธ๋ž˜ํ‚น, ์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด, ๋ถ„์‚ฐ ์ถ”์ (Distributed Tracing) ๋“ฑ์˜ ๊ธฐ์ˆ ์„ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค [3-5]. ๋‹จ์ˆœํ•œ ์˜ค๋ฅ˜ ์ˆ˜์ง‘์„ ๋„˜์–ด ํ”„๋ก ํŠธ์—”๋“œ ๋กœ๊ทธ์™€ ๋ฐฑ์—”๋“œ ํŠธ๋ ˆ์ด์Šค๋ฅผ ์—ฐ๊ฒฐํ•˜์—ฌ ์ „์ฒด ์Šคํƒ์˜ ์„ฑ๋Šฅ๊ณผ ๋ฌธ์ œ์˜ ๊ทผ๋ณธ ์›์ธ์„ ํŒŒ์•…ํ•˜๋Š” ๋ฐ ํ•„์ˆ˜์ ์ธ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค [5, 6]. - -## ๐Ÿ“– Core Content -* **์ง€๋Šฅํ˜• ์—๋Ÿฌ ๊ทธ๋ฃนํ™” (Intelligent Error Grouping):** ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋Š” ๋™์ผํ•œ ์—๋Ÿฌ๊ฐ€ ์ˆ˜์—†์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Sentry์™€ ๊ฐ™์€ ๋„๊ตฌ๋Š” ์ค‘๋ณต๋˜๋Š” ์—๋Ÿฌ์˜ ๋…ธ์ด์ฆˆ๋ฅผ ์ค„์ด๊ณ  ์œ ์‚ฌํ•œ ์—๋Ÿฌ๋ฅผ ์ž๋™์œผ๋กœ ๊ทธ๋ฃนํ™”ํ•˜์—ฌ, ๊ฐœ๋ฐœ์ž๊ฐ€ ์‹ค์ œ ์‚ฌ์šฉ์ž์—๊ฒŒ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๊ณ ์œ ํ•œ ๋ฌธ์ œ์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•์Šต๋‹ˆ๋‹ค [2, 7]. -* **์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด (Session Replay):** ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์ „ ์‚ฌ์šฉ์ž๊ฐ€ ์ˆ˜ํ–‰ํ•œ ์ •ํ™•ํ•œ ๋™์ž‘, DOM ํŠธ๋ฆฌ์˜ ์ƒํƒœ ๋ณ€ํ™”, Redux/Vuex ์ƒํƒœ, ๋„คํŠธ์›Œํฌ ์š”์ฒญ ๋ฐ ์ฝ˜์†” ๋กœ๊ทธ ๋“ฑ์„ ๋น„๋””์˜ค์ฒ˜๋Ÿผ ๋…นํ™”ํ•˜์—ฌ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [4, 8]. ์ด๋Š” ์ฝ˜์†” ๋กœ๊ทธ๋‚˜ ์‚ฌ์šฉ์ž ์Šคํฌ๋ฆฐ์ƒท๋งŒ์œผ๋กœ๋Š” ์žฌํ˜„ํ•˜๊ธฐ ํž˜๋“  ์—ฃ์ง€ ์ผ€์ด์Šค๋ฅผ ๋””๋ฒ„๊น…ํ•˜๋Š” ๋ฐ ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค [3, 8]. -* **์—”๋“œํˆฌ์—”๋“œ ๋ถ„์‚ฐ ์ถ”์  (End-to-End Distributed Tracing):** ํ”„๋ก ํŠธ์—”๋“œ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ๋ฐฑ์—”๋“œ APM(Application Performance Monitoring)๊ณผ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ํ”„๋ก ํŠธ์—”๋“œ ์—๋Ÿฌ๋ฅผ ํด๋ฆญํ•˜๋ฉด ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ์„œ๋“œํŒŒํ‹ฐ API๋ฅผ ๊ด€ํ†ตํ•˜๋Š” ์š”์ฒญ์˜ ํ๋ฆ„์„ ์ถ”์ ํ•  ์ˆ˜ ์žˆ์–ด ๋ณต์žกํ•œ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ ๋””๋ฒ„๊น…์— ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค [5, 9]. -* **์˜คํ”ˆ ์Šคํƒ ๋‹ค๋“œ ๋ฐ ํ†ตํ•ฉ ๊ด€์ธก (Open Standards & Unified Observability):** ํŠน์ • ๋ฒค๋”์— ์ข…์†๋˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด OpenTelemetry์™€ ๊ฐ™์€ ์˜คํ”ˆ ์Šคํƒ ๋‹ค๋“œ ๊ธฐ๋ฐ˜์˜ ๋„๊ตฌ(SigNoz, Grafana)๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค [6, 10]. ์ด๋ฅผ ํ†ตํ•ด ํŠธ๋ ˆ์ด์Šค, ๋ฉ”ํŠธ๋ฆญ, ๋กœ๊ทธ๋ฅผ ๋‹จ์ผ ํ”Œ๋žซํผ์—์„œ ๊ด€๋ฆฌํ•˜๊ณ  ๋ฐ์ดํ„ฐ ์†Œ์œ ๊ถŒ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [11]. -* **์‚ฌ์šฉ์ž ๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ (Privacy Controls):** ์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด๋‚˜ ๋กœ๊ทธ ์ˆ˜์ง‘ ์‹œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋‚˜ ๊ฐœ์ธ ์‹๋ณ„ ์ •๋ณด(PII)๊ฐ€ ํ•จ๊ป˜ ์ „์†ก๋  ์œ„ํ—˜์ด ์žˆ์œผ๋ฏ€๋กœ, ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ž๋™์œผ๋กœ ๋งˆ์Šคํ‚นํ•˜๊ณ  ํ•„ํ„ฐ๋งํ•˜๋Š” ๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ ์„ค์ •์ด ํ•„์ˆ˜์ ์œผ๋กœ ์š”๊ตฌ๋ฉ๋‹ˆ๋‹ค [4, 12]. - -## โš–๏ธ Trade-offs & Caveats -* **์„ฑ๋Šฅ ์˜ํ–ฅ (Performance Impact):** ๊ด€์ธก์„ฑ ๋„๊ตฌ์˜ ์—์ด์ „ํŠธ๊ฐ€ ํ”„๋ก ํŠธ์—”๋“œ ๋ฒˆ๋“ค์— ํฌํ•จ๋˜๋ฉด ์ถ”๊ฐ€์ ์ธ ๋กœ๋“œ ํƒ€์ž„(ํ…Œ์ŠคํŠธ ๊ธฐ์ค€ ์ตœ๋Œ€ 120ms ์ถ”๊ฐ€)์ด ๋ฐœ์ƒํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ฑ๋Šฅ ๋ฐ Core Web Vitals์— ์•…์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [13-15]. ๊ฐ€๋ฒผ์šด ๋ชจ๋‹ˆํ„ฐ๋ง๊ณผ ์ƒ์„ธํ•œ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ ์‚ฌ์ด์—์„œ ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ ํƒ€ํ˜‘์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค [12, 15]. -* **ํ”„๋ผ์ด๋ฒ„์‹œ ์œ„ํ—˜ (Privacy Concerns):** LogRocket์ฒ˜๋Ÿผ '๋ชจ๋“  ๊ฒƒ์„ ์บก์ฒ˜'ํ•˜๋Š” ๊ฒƒ์„ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ํ•˜๋Š” ๋„๊ตฌ๋Š” ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ˆ˜์ง‘๋  ์œ„ํ—˜์„ฑ์ด ํฌ๊ธฐ ๋•Œ๋ฌธ์—, ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์„ธ์‹ฌํ•œ ์„ค์ • ์ž‘์—…์— ๋งŽ์€ ์‹œ๊ฐ„์ด ์†Œ์š”๋ฉ๋‹ˆ๋‹ค [8, 14]. -* **๋น„์šฉ ํ™•์žฅ์„ฑ ๋ฌธ์ œ (Pricing Reality & Cost):** ํŠธ๋ž˜ํ”ฝ์ด ๋†’์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฒฝ์šฐ Datadog๊ณผ ๊ฐ™์€ ํ”Œ๋žซํผ์˜ ์š”๊ธˆ ์ฒด๊ณ„(์ˆ˜์ง‘๊ณผ ์ธ๋ฑ์‹ฑ์„ ๋”ฐ๋กœ ๊ณผ๊ธˆํ•˜๋Š” ๊ตฌ์กฐ)๋กœ ์ธํ•ด ๋น„์šฉ์ด ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ์ฆ๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [16, 17]. ๋น„์šฉ ์ ˆ๊ฐ์„ ์œ„ํ•ด ์ „์ฒด ๋กœ๊ทธ์˜ ์ผ๋ถ€(์˜ˆ: 20%)๋งŒ ์ธ๋ฑ์‹ฑํ•˜๊ฒŒ ๋˜๋ฉด, ์žฅ์•  ๋ฐœ์ƒ ์‹œ ํ•„์š”ํ•œ 80%์˜ ๋””๋ฒ„๊น… ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์—†๋Š” ๋ฐ˜๋Œ€๊ธ‰๋ถ€๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [18]. -* **๋Ÿฌ๋‹ ์ปค๋ธŒ ๋ฐ ์„ค์ • ๋ณต์žก๋„ (Setup Complexity):** OpenTelemetry ๊ธฐ๋ฐ˜์˜ ์˜คํ”ˆ์†Œ์Šค(Grafana, SigNoz ๋“ฑ)๋Š” ๋ฒค๋” ์ข…์†(Vendor Lock-in)์„ ๋ฐฉ์ง€ํ•˜๊ณ  ์œ ์—ฐ์„ฑ์ด ๋›ฐ์–ด๋‚˜์ง€๋งŒ, ๋ชฉ์ ์— ๋งž๊ฒŒ ์‚ฌ์ „ ๊ตฌ์ถ•๋œ SaaS์— ๋น„ํ•ด ์ดˆ๊ธฐ ์„ค์ •์ด ๋ณต์žกํ•˜๊ณ  DevOps ์ „๋ฌธ ์ง€์‹์ด ์š”๊ตฌ๋ฉ๋‹ˆ๋‹ค [10, 19, 20]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -#### [์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] -- [[OpenTelemetry]] - - ์—ฐ๊ฒฐ ์ด์œ : ํŠน์ • ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฒค๋”์— ์ข…์†๋˜์ง€ ์•Š๊ณ  ํŠธ๋ ˆ์ด์Šค, ๋ฉ”ํŠธ๋ฆญ, ๋กœ๊ทธ๋ฅผ ์ˆ˜์ง‘ ๋ฐ ํ‘œ์ค€ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ์˜คํ”ˆ ์†Œ์Šค ๊ทœ๊ฒฉ์ž…๋‹ˆ๋‹ค [6, 10]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์„ค๊ณ„ํ•˜๊ณ  SigNoz๋‚˜ Grafana๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ํ†ตํ•ฉํ•˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - -- [[Distributed Tracing]] - - ์—ฐ๊ฒฐ ์ด์œ : ํ”„๋ก ํŠธ์—”๋“œ์˜ ์‚ฌ์šฉ์ž ์ƒํ˜ธ์ž‘์šฉ์—์„œ ์‹œ์ž‘๋œ ์š”์ฒญ์ด ๋ฐฑ์—”๋“œ์˜ ์–ด๋А ์ง€์ ์—์„œ ๋ณ‘๋ชฉ์ด๋‚˜ ์—๋Ÿฌ๋ฅผ ์ผ์œผํ‚ค๋Š”์ง€ ์—ฐ๊ฒฐํ•˜๋Š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค [5, 6]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํ’€์Šคํƒ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์—”๋“œํˆฌ์—”๋“œ ๊ฐ€์‹œ์„ฑ ํ™•๋ณด ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - -#### [๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ] -- [[Session Replay]] - - ์—ฐ๊ฒฐ ์ด์œ : ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์˜ ๋””๋ฒ„๊น…์„ ์œ„ํ•ด ์‚ฌ์šฉ์ž ํ™˜๊ฒฝ์˜ DOM, ๋„คํŠธ์›Œํฌ, ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ๊ทธ๋Œ€๋กœ ๋…นํ™”ํ•˜๋Š” ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค [4, 21]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์žฌํ˜„ ๋ถˆ๊ฐ€๋Šฅํ•œ ํ”„๋กœ๋•์…˜ ์—๋Ÿฌ์˜ ์›์ธ์„ ์‹œ๊ฐ์ ์œผ๋กœ ์—ญ์ถ”์ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - -- [[Error Boundaries]] - - ์—ฐ๊ฒฐ ์ด์œ : React ๋‚ด๋ถ€์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ Œ๋”๋ง ์—๋Ÿฌ๋ฅผ ํฌ์ฐฉ(catch)ํ•˜๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ „์ฒด ํฌ๋ž˜์‹œ๋ฅผ ๋ฐฉ์ง€ํ•˜๋ฉฐ, ํฌ์ฐฉ๋œ ์—๋Ÿฌ๋ฅผ ์™ธ๋ถ€ ๋ชจ๋‹ˆํ„ฐ๋ง ์„œ๋น„์Šค(Sentry ๋“ฑ)๋กœ ์ „์†กํ•  ์ˆ˜ ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ์ž…๋‹ˆ๋‹ค [22, 23]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํด๋ผ์ด์–ธํŠธ ๋‹จ์˜ ์—๋Ÿฌ ํ•ธ๋“ค๋ง๊ณผ ๊ด€์ธก์„ฑ ํˆดํ‚ท ๊ฐ„์˜ ์—ฐ๋™ ๋ฐฉ์‹์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - -### Deeper Research Questions -- ์„ฑ๋Šฅ ์˜ค๋ฒ„ํ—ค๋“œ(๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ ์ฆ๊ฐ€ ๋“ฑ)์™€ ์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด, ๋ถ„์‚ฐ ์ถ”์  ๋“ฑ ๊ณ ํ•ด์ƒ๋„ ๊ด€์ธก์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ ์‚ฌ์ด์˜ ์ตœ์ ์˜ ๊ท ํ˜•์ ์€ ์–ด๋–ป๊ฒŒ ์ฐพ์•„์•ผ ํ•˜๋Š”๊ฐ€? -- Datadog์˜ '์ˆ˜์ง‘ ๋ฐ ์ธ๋ฑ์‹ฑ(Ingest and Index)' ์ด์ค‘ ๊ณผ๊ธˆ ๋ชจ๋ธ๊ณผ ๊ฐ™์€ ๋น„์šฉ ๊ตฌ์กฐ๋ฅผ ํ”ผํ•˜๋ฉด์„œ ๋Œ€๊ทœ๋ชจ ํŠธ๋ž˜ํ”ฝ์—์„œ ๋กœ๊ทธ ๊ฒ€์ƒ‰ ํšจ์œจ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” ์•„ํ‚คํ…์ฒ˜ ๋Œ€์•ˆ์€ ๋ฌด์—‡์ธ๊ฐ€? -- ํ”„๋ก ํŠธ์—”๋“œ ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ์—์„œ ์ˆ˜์ง‘๋˜๋Š” ๋ฏผ๊ฐํ•œ ์‚ฌ์šฉ์ž ์ •๋ณด(PII)์˜ ์œ ์ถœ์„ ์›์ฒœ์ ์œผ๋กœ ์ฐจ๋‹จํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ์ˆ ์  ๊ตฌํ˜„ ๋ฐ ์ž๋™ ๋งˆ์Šคํ‚น ๊ธฐ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? -- OpenTelemetry ํ‘œ์ค€์„ ๊ธฐ์กด ์ƒ์šฉ ์„œ๋น„์Šค(Sentry, LogRocket ๋“ฑ)์˜ ์ƒํƒœ๊ณ„์—์„œ ์ ์šฉํ•˜๊ฑฐ๋‚˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๊ธฐ์ˆ ์  ํ•œ๊ณ„๋Š” ๋ฌด์—‡์ธ๊ฐ€? -- Sentry์™€ ๊ฐ™์€ ๋„๊ตฌ์˜ '์ง€๋Šฅํ˜• ์—๋Ÿฌ ๊ทธ๋ฃนํ™”'๋Š” ๋ธŒ๋ผ์šฐ์ €์™€ OS ํŒŒํŽธํ™” ์†์—์„œ ์–ด๋–ป๊ฒŒ ๊ณ ์œ ํ•œ ์—๋Ÿฌ์™€ ์ค‘๋ณต ์—๋Ÿฌ๋ฅผ ๊ธฐ์ˆ ์ ์œผ๋กœ ํŒ๋ณ„ํ•˜๋Š”๊ฐ€? - -### Practical Application Contexts -- **Implementation:** React ๊ธฐ๋ฐ˜ ํ”„๋กœ์ ํŠธ ๋„์ž… ์‹œ ์—๋Ÿฌ ๋ฐœ์ƒ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์€ ์ปดํฌ๋„ŒํŠธ๋ฅผ `Error Boundaries`๋กœ ๊ฐ์‹ธ๊ณ , Sentry๋‚˜ SigNoz SDK๋ฅผ ์—ฐ๋™ํ•˜์—ฌ ํ”„๋กœ๋•์…˜ ์—๋Ÿฌ ๋กœ๊ทธ ๋ฐ ์Šคํƒ ํŠธ๋ ˆ์ด์Šค๋ฅผ ์ž๋™์œผ๋กœ ์ˆ˜์ง‘ํ•˜๋„๋ก ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค [4, 24]. -- **System Design:** ์ดˆ๊ธฐ์—๋Š” ๋ฌด๋ฃŒ SaaS๋ฅผ ์‚ฌ์šฉํ•˜๋‹ค๊ฐ€ ์„œ๋น„์Šค ์Šค์ผ€์ผ์ด ์ปค์ง€๋ฉด ๋ฒค๋” ์ข…์†์„ฑ๊ณผ ๋น„์šฉ ๋ฌธ์ œ๋ฅผ ๊ณ ๋ คํ•ด OpenTelemetry์™€ SigNoz ๊ธฐ๋ฐ˜์˜ ์ž์ฒด ํ˜ธ์ŠคํŒ… ์ธํ”„๋ผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ์„ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค [6, 12, 25]. -- **Operation / Maintenance:** ์ƒˆ๋ฒฝ 2์‹œ์— ๋ฐœ์ƒํ•˜๋Š” ํ”„๋กœ๋•์…˜ ์žฅ์•  ์‹ ๊ณ ์— ๋Œ€ํ•ด, ์‚ฌ์šฉ์ž์˜ ์Šคํฌ๋ฆฐ์ƒท์— ์˜์กดํ•˜๋Š” ๋Œ€์‹  ๋ชจ๋‹ˆํ„ฐ๋ง ํˆด์˜ ์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด์™€ ๋ฐฑ์—”๋“œ ํŠธ๋ ˆ์ด์Šค ๋ฐ์ดํ„ฐ๋ฅผ ํ†ตํ•ด ์ฆ‰๊ฐ์ ์œผ๋กœ ๊ทผ๋ณธ ์›์ธ์„ ํŒŒ์•…ํ•˜๊ณ  ๋Œ€์‘ํ•ฉ๋‹ˆ๋‹ค [3, 15]. -- **Learning Path:** ๋‹จ์ˆœํ•œ `console.log` ๋””๋ฒ„๊น…์—์„œ ์ถœ๋ฐœํ•˜์—ฌ, ์—๋Ÿฌ ๋ฐ”์šด๋”๋ฆฌ์™€ ๋กœ์ปฌ ๋””๋ฒ„๊น… ํˆด์„ ์ตํžˆ๊ณ , ์ตœ์ข…์ ์œผ๋กœ ํด๋ผ์šฐ๋“œ ๋กœ๊น… ๋„๊ตฌ์™€ ํ’€์Šคํƒ ๋ถ„์‚ฐ ์ถ”์  ์‹œ์Šคํ…œ์˜ ํ™œ์šฉ๋ฒ•์„ ํ•™์Šตํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๋‚˜์•„๊ฐ‘๋‹ˆ๋‹ค [3, 15]. -- **My Project Relevance:** ํ˜„์žฌ ์ง„ํ–‰ ์ค‘์ด๊ฑฐ๋‚˜ ๊ณ„ํš ์ค‘์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌ ์‹œ, ์‚ฌ์šฉ์ž ๊ฒฝํ—˜(UX)์„ ์ €ํ•ดํ•˜๋Š” ๋ณด์ด์ง€ ์•Š๋Š” ์—๋Ÿฌ๋‚˜ ๋ Œ๋”๋ง ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ๋Šฅ๋™์ ์œผ๋กœ ํƒ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๋ชจ๋‹ˆํ„ฐ๋ง ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ•์— ์ง์ ‘์ ์œผ๋กœ ์ ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. - -### Adjacent Topics -- [[Core Web Vitals]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ์šด์˜ ํ™˜๊ฒฝ ๋ชจ๋‹ˆํ„ฐ๋ง์˜ ๋ชฉ์  ์ค‘ ํ•˜๋‚˜๊ฐ€ ์„ฑ๋Šฅ ์ธก์ •์— ์žˆ์œผ๋ฏ€๋กœ, LCP, FID, CLS ๋“ฑ ํ”„๋ก ํŠธ์—”๋“œ ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ ์ง€ํ‘œ๋ฅผ ์–ด๋–ป๊ฒŒ ์ธก์ •ํ•˜๊ณ  ์ตœ์ ํ™”ํ•˜๋Š”์ง€ ํ™•์žฅํ•˜์—ฌ ์กฐ์‚ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [26, 27]. - -- [[Memory Leaks]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ๊ด€์ธก์„ฑ ๋„๊ตฌ๊ฐ€ ์„ฑ๋Šฅ ์ €ํ•˜์˜ ์ง•ํ›„๋ฅผ ๊ฐ์ง€ํ–ˆ์„ ๋•Œ, ํฌ๋กฌ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ์˜ Heap Snapshot ๋“ฑ๊ณผ ์—ฐ๊ณ„ํ•˜์—ฌ ์‹ค์ œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ์ง„๋‹จํ•˜๊ณ  ๋””๋ฒ„๊น…ํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก ์œผ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [28, 29]. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Production Monitoring and Observability.md b/00_Raw/Production Monitoring and Observability.md deleted file mode 100644 index ff946970..00000000 --- a/00_Raw/Production Monitoring and Observability.md +++ /dev/null @@ -1,67 +0,0 @@ -# [[Production Monitoring and Observability]] - -## ๐Ÿ“Œ Brief Summary -**Production Monitoring and Observability(ํ”„๋กœ๋•์…˜ ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ๊ด€์ธก์„ฑ)**๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹ค์ œ ์šด์˜ ํ™˜๊ฒฝ์—์„œ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹๊ณผ ์„ฑ๋Šฅ, ์—๋Ÿฌ๋ฅผ ์ถ”์ ํ•˜๊ณ  ์ดํ•ดํ•˜๋Š” ๊ณผ์ •์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค [1-3]. ์ด๋Š” ๋‹จ์ˆœํ•œ ์˜ค๋ฅ˜ ๋กœ๊น…์„ ๋„˜์–ด, ๋กœ๊ทธ(Logs), ๋ฉ”ํŠธ๋ฆญ(Metrics), ํŠธ๋ ˆ์ด์Šค(Traces)๋ฅผ ํ†ตํ•ฉํ•˜์—ฌ ๋ณต์žกํ•œ ์‹œ์Šคํ…œ์˜ ๋ณ‘๋ชฉ ํ˜„์ƒ๊ณผ ๋ฒ„๊ทธ์˜ ๊ทผ๋ณธ ์›์ธ์„ ํŒŒ์•…ํ•˜๋Š” ๊ฒƒ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค [4]. ๊ฐœ๋ฐœ์ž๋Š” ์ด๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์ €ํ•ดํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ์‚ฌ์ „์— ๋ฐœ๊ฒฌํ•˜๊ณ , ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์„ฑ๋Šฅ ์ตœ์ ํ™”์™€ ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3, 5, 6]. - -## ๐Ÿ“– Core Content - -* **Real User Monitoring (RUM) ๋ฐ ์„ฑ๋Šฅ ์ถ”์ :** - ์‹ค์ œ ์‚ฌ์šฉ์ž์˜ ๋””๋ฐ”์ด์Šค์™€ ๋„คํŠธ์›Œํฌ ํ™˜๊ฒฝ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์„ฑ๋Šฅ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค [6, 7]. ์ข…ํ•ฉ์ ์ธ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์—์„œ๋Š” ๋†“์น˜๊ธฐ ์‰ฌ์šด ์‹ค์ œ ์„ฑ๋Šฅ ๋ฌธ์ œ(์˜ˆ: First Contentful Paint(FCP), Interaction to Next Paint(INP) ๋“ฑ์˜ Core Web Vitals ์ง€ํ‘œ)๋ฅผ ์ถ”์ ํ•˜์—ฌ ์ตœ์ ํ™” ๋Œ€์ƒ์„ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค [6, 7]. -* **์ง€๋Šฅํ˜• ์—๋Ÿฌ ์ถ”์  ๋ฐ ๋กœ๊น…:** - ํ”„๋ก ํŠธ์—”๋“œ ํ™˜๊ฒฝ์€ ๋งค์šฐ ๋‹ค์–‘ํ•œ ๋ธŒ๋ผ์šฐ์ €์™€ ๋””๋ฐ”์ด์Šค ์กฐ๊ฑด์—์„œ ์‹คํ–‰๋˜๋ฏ€๋กœ `console.log`์—๋งŒ ์˜์กดํ•˜๋Š” ๊ฒƒ์€ ํ•œ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค [8]. Sentry์™€ ๊ฐ™์€ ๋„๊ตฌ๋Š” **์ง€๋Šฅํ˜• ์—๋Ÿฌ ๊ทธ๋ฃนํ™”(Intelligent Error Grouping)**๋ฅผ ํ†ตํ•ด ์ค‘๋ณต๋œ ์—๋Ÿฌ์˜ ๋…ธ์ด์ฆˆ๋ฅผ ์ค„์—ฌ์ฃผ๋ฉฐ, ์ฝ˜์†” ๋กœ๊ทธ, ๋„คํŠธ์›Œํฌ ์š”์ฒญ, ์‚ฌ์šฉ์ž ์ƒํ˜ธ์ž‘์šฉ ๋“ฑ์˜ Breadcrumb๋ฅผ ์ œ๊ณตํ•˜์—ฌ ์—๋Ÿฌ์˜ ๊ทผ๋ณธ ์›์ธ ํŒŒ์•…์„ ๋•์Šต๋‹ˆ๋‹ค [2, 9]. React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฒฝ์šฐ **Error Boundaries**๋ฅผ ๊ตฌ์„ฑํ•˜์—ฌ UI ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•จ๊ณผ ๋™์‹œ์— Sentry, LogRocket ๋“ฑ์˜ ํˆด์— ์—๋Ÿฌ์˜ ์ƒ์„ธ ์ •๋ณด๋ฅผ ๋กœ๊น…ํ•ฉ๋‹ˆ๋‹ค [10, 11]. -* **ํ†ตํ•ฉ ๊ด€์ธก์„ฑ(Unified Observability)๊ณผ ๋ถ„์‚ฐ ์ถ”์ (Distributed Tracing):** - Datadog RUM์ด๋‚˜ New Relic, SigNoz ๊ฐ™์€ ๋„๊ตฌ๋“ค์€ ํ”„๋ก ํŠธ์—”๋“œ ์—๋Ÿฌ์™€ ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค ํŠธ๋ ˆ์ด์Šค(Trace)๋ฅผ ์—ฐ๊ฒฐํ•˜์—ฌ ๋ณต์žกํ•œ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์—์„œ์˜ End-to-End ๋””๋ฒ„๊น…์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค [4, 12, 13]. ํŠนํžˆ **OpenTelemetry** ํ‘œ์ค€์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์ถ•๋œ ๋„๊ตฌ๋“ค์€ ํŠน์ • ๋ฒค๋” ์ข…์†(Vendor lock-in) ์—†์ด ํŠธ๋ ˆ์ด์Šค, ๋ฉ”ํŠธ๋ฆญ, ๋กœ๊ทธ๋ฅผ ํ•œ ๊ณณ์—์„œ ์ƒ๊ด€ ๋ถ„์„(Correlate)ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•ฉ๋‹ˆ๋‹ค [4, 14, 15]. -* **์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด (Session Replay):** - LogRocket๊ณผ ๊ฐ™์€ ๋„๊ตฌ๋Š” ์‚ฌ์šฉ์ž์˜ ์„ธ์…˜์„ ๋น„๋””์˜ค์ฒ˜๋Ÿผ ๋…นํ™”ํ•  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, DOM ๋ณ€๊ฒฝ, Redux/Zustand ์ƒํƒœ ๋ณ€ํ™”, ๋„คํŠธ์›Œํฌ ์š”์ฒญ ๋ฐ ์‘๋‹ต ๋“ฑ์„ ํ•จ๊ป˜ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค [2, 16, 17]. ์ด๋Š” ์žฌํ˜„ํ•˜๊ธฐ ์–ด๋ ค์šด ๋ณต์žกํ•œ ์ƒํ˜ธ์ž‘์šฉ ๋ฒ„๊ทธ๋ฅผ ํ•ด๊ฒฐํ•  ๋•Œ ๋งค์šฐ ๊ฐ•๋ ฅํ•œ ๋””๋ฒ„๊น… ์ปจํ…์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [2, 17]. - -## โš–๏ธ Trade-offs & Caveats -* **์„ฑ๋Šฅ ์ €ํ•˜ (Performance Impact):** ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ์˜ ์—์ด์ „ํŠธ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ƒ๋‹นํžˆ ์ฆ๊ฐ€์‹œํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ผ๋ถ€ ๋„๊ตฌ๋Š” ํŽ˜์ด์ง€ ๋กœ๋“œ ์‹œ๊ฐ„์„ ์ตœ๋Œ€ 120ms๊นŒ์ง€ ์ง€์—ฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5, 18, 19]. ๋”ฐ๋ผ์„œ ์„ฑ๋Šฅ์ด ์ค‘์š”ํ•œ ์„œ๋น„์Šค(์˜ˆ: ์ด์ปค๋จธ์Šค)์—์„œ๋Š” ๊ฐ€๋ฒผ์šด ์˜ต์…˜์„ ์„ ํƒํ•˜๊ฑฐ๋‚˜ ์‹ ์ค‘ํ•˜๊ฒŒ ๋„์ž…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [5]. -* **๋ฐ์ดํ„ฐ ์Šค์ผ€์ผ๋ง์— ๋”ฐ๋ฅธ ๋น„์šฉ ๋ฌธ์ œ (Cost at Scale):** SaaS ๊ธฐ๋ฐ˜ ๋ชจ๋‹ˆํ„ฐ๋ง ํˆด์€ ํŠธ๋ž˜ํ”ฝ๊ณผ ๋กœ๊ทธ ๋ณผ๋ฅจ์— ๋”ฐ๋ผ ๋น„์šฉ์ด ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ์ฆ๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [18-20]. ์˜ˆ๋ฅผ ๋“ค์–ด, Datadog์€ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘(Ingest)๊ณผ ๊ฒ€์ƒ‰์„ ์œ„ํ•œ ์ธ๋ฑ์‹ฑ(Index) ์š”๊ธˆ์„ ๋ถ„๋ฆฌํ•˜์—ฌ ๋ถ€๊ณผํ•˜๋ฏ€๋กœ, ๋น„์šฉ ์ ˆ๊ฐ์„ ์œ„ํ•ด ์ฃผ์š” ๋กœ๊ทธ์˜ 80%๋ฅผ ์ธ๋ฑ์‹ฑํ•˜์ง€ ๋ชปํ•ด ์ค‘์š”ํ•œ ๋””๋ฒ„๊น… ๋ฐ์ดํ„ฐ๋ฅผ ๋†“์น˜๋Š” ๋”œ๋ ˆ๋งˆ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [21, 22]. -* **๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ ์œ„ํ—˜ (Privacy Concerns):** Session Replay ๋“ฑ ํ™”๋ฉด ๋ฐ ๋กœ๊ทธ๋ฅผ ๊ธฐ๋กํ•˜๋Š” ๋„๊ตฌ๋“ค์€ ์„ค์ •์ด ์ž˜๋ชป๋  ๊ฒฝ์šฐ ๋น„๋ฐ€๋ฒˆํ˜ธ, ๊ฐœ์ธ์ •๋ณด ๋“ฑ ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [17, 19, 23]. ์„ธ๊ณ„์ ์ธ ๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ ๊ทœ์ • ๊ฐ•ํ™”์— ๋งž์ถฐ ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ž๋™์œผ๋กœ ๋งˆ์Šคํ‚นํ•˜๋Š” ๋„๊ตฌ๋ฅผ ์„ ํƒํ•˜๊ฑฐ๋‚˜ ๊ผผ๊ผผํ•˜๊ฒŒ ํ”„๋ผ์ด๋ฒ„์‹œ ์„ค์ •์„ ๊ตฌ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [17, 24]. -* **๋„์ž… ๋ณต์žก์„ฑ (Setup Complexity):** OpenTelemetry๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” Grafana๋‚˜ SigNoz์™€ ๊ฐ™์€ ๋„๊ตฌ๋Š” ๊ฐ•๋ ฅํ•œ ์œ ์—ฐ์„ฑ์„ ์ œ๊ณตํ•˜๊ณ  ๋ฒค๋” ์ข…์†์„ ํ”ผํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋ชฉ์ ์— ๋งž๊ฒŒ ์ธํ”„๋ผ๋ฅผ ์ง์ ‘ ๊ตฌ์„ฑํ•˜๊ณ  ๋Œ€์‹œ๋ณด๋“œ๋ฅผ ๊ตฌ์ถ•ํ•ด์•ผ ํ•˜๋ฏ€๋กœ SaaS ๋„๊ตฌ์— ๋น„ํ•ด ๋†’์€ ํ•™์Šต ๊ณก์„ ๊ณผ DevOps ์ „๋ฌธ ์ง€์‹์„ ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค [14, 24-26]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -#### [์•„ํ‚คํ…์ฒ˜ ๋ฐ ๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] -* [[OpenTelemetry]] - * ์—ฐ๊ฒฐ ์ด์œ : ์ธก์ • ๋ฐ์ดํ„ฐ(Log, Metric, Trace) ์ˆ˜์ง‘ ๋ฐ ๊ณ„์ธก์„ ์œ„ํ•œ ์˜คํ”ˆ์†Œ์Šค ํ‘œ์ค€ ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค [4, 14]. - * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํŠน์ • ๋ชจ๋‹ˆํ„ฐ๋ง ๊ณต๊ธ‰์ž(SaaS)์— ์ข…์†๋˜์ง€ ์•Š๊ณ  ์œ ์—ฐํ•œ ํ†ตํ•ฉ ๊ด€์ธก์„ฑ ์ƒํƒœ๊ณ„๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ์›๋ฆฌ๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [4, 14, 15, 24]. -* [[Real User Monitoring (RUM)]] - * ์—ฐ๊ฒฐ ์ด์œ : ์‹ค์ œ ์‚ฌ์šฉ์ž๊ฐ€ ๊ฒฝํ—˜ํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ™˜๊ฒฝ์˜ ํ”„๋ก ํŠธ์—”๋“œ ๋กœ๋“œ ์‹œ๊ฐ„๊ณผ ์ƒํ˜ธ์ž‘์šฉ ์ง€์—ฐ ๋“ฑ์„ ์ธก์ •ํ•˜๋Š” ๊ด€์ธก ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค [3, 6, 12]. - * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์‹คํ—˜์‹ค ํ™˜๊ฒฝ(Synthetic Testing)์—์„œ ๋ฐœ๊ฒฌํ•˜๊ธฐ ์–ด๋ ค์šด ๋‹ค์–‘ํ•œ ๋””๋ฐ”์ด์Šค ๋ฐ ๋„คํŠธ์›Œํฌ ํ™˜๊ฒฝ์—์„œ์˜ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ(Core Web Vitals)์„ ์‹๋ณ„ํ•˜๊ณ  ๊ฐœ์„ ํ•˜๋Š” ๊ณผ์ •์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [6, 7]. - -#### [๊ตฌํ˜„ ๋ฐ ํ™œ์šฉ ๋„๊ตฌ] -* [[Error Boundaries]] - * ์—ฐ๊ฒฐ ์ด์œ : React ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ ํ•˜์œ„์—์„œ ๋ฐœ์ƒํ•œ ๋Ÿฐํƒ€์ž„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์˜ค๋ฅ˜๋ฅผ ํฌ์ฐฉํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค [10, 27]. - * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์•ฑ ์ „์ฒด๊ฐ€ ํฌ๋ž˜์‹œ๋˜๋Š” ๊ฒƒ์„ ๋ง‰๋Š” ๋™์‹œ์—, ํฌ์ฐฉ๋œ ์—๋Ÿฌ๋ฅผ Sentry๋‚˜ LogRocket๊ณผ ๊ฐ™์€ ํ”„๋กœ๋•์…˜ ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ์œผ๋กœ ์ „์†กํ•˜์—ฌ ์•ˆ์ •์ ์ธ ์žฅ์•  ์ถ”์  ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [10, 11]. -* [[Session Replay]] - * ์—ฐ๊ฒฐ ์ด์œ : ์‚ฌ์šฉ์ž๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ–‰๋™ํ•œ ์ •ํ™•ํ•œ ์ˆœ์„œ์™€ ํ™”๋ฉด ์ƒํƒœ๋ฅผ ๋‹ค์‹œ ์žฌ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค [16, 23]. - * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋‹จ์ˆœํžˆ ์Šคํƒ ํŠธ๋ ˆ์ด์Šค๋ฅผ ๋ณด๋Š” ๊ฒƒ์„ ๋„˜์–ด Redux/Zustand ๋“ฑ์˜ ์ƒํƒœ ๋ณ€ํ™” ํ๋ฆ„๊ณผ DOM ์ƒํ˜ธ์ž‘์šฉ ์ „์ฒด ์ปจํ…์ŠคํŠธ๋ฅผ ํ™œ์šฉํ•œ ๊ฐ•๋ ฅํ•œ ๋””๋ฒ„๊น… ๊ธฐ๋ฒ•์„ ํ•™์Šตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2, 17]. - -### Deeper Research Questions - -* ๋ชจ๋‹ˆํ„ฐ๋ง SDK๋ฅผ ๋ฒˆ๋“ค์— ํฌํ•จํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์„ฑ๋Šฅ ์˜ค๋ฒ„ํ—ค๋“œ(๋กœ๋”ฉ ํƒ€์ž„, ๋ฒˆ๋“ค ํฌ๊ธฐ ์ฆ๊ฐ€)๋ฅผ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•ด Code Splitting์ด๋‚˜ Web Worker๋ฅผ ํ™œ์šฉํ•ด ์ตœ์ ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? -* Datadog์ด๋‚˜ Sentry์˜ ๋น„์šฉ(Pricing) ๊ธ‰์ฆ ๋ฌธ์ œ๋ฅผ ์™„ํ™”ํ•˜๊ธฐ ์œ„ํ•ด, ๋ถˆํ•„์š”ํ•œ ๋กœ๊ทธ ์ƒ์„ฑ์„ ์ค„์ด๊ฑฐ๋‚˜ ํ”„๋ก ํŠธ์—”๋“œ ํ™˜๊ฒฝ์—์„œ ๋กœ๊ทธ๋ฅผ ๋™์ ์œผ๋กœ ์ƒ˜ํ”Œ๋ง(Sampling)ํ•˜๋Š” ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? -* Session Replay ๋„๊ตฌ๋ฅผ ์ ์šฉํ•  ๋•Œ ๊ธ€๋กœ๋ฒŒ ์ปดํ”Œ๋ผ์ด์–ธ์Šค(GDPR ๋“ฑ)๋ฅผ ์ค€์ˆ˜ํ•˜๊ธฐ ์œ„ํ•˜์—ฌ, DOM์˜ ํ…์ŠคํŠธ์™€ Input ๊ฐ’์„ ์–ด๋–ค ๋ฉ”์ปค๋‹ˆ์ฆ˜์œผ๋กœ ์ž๋™ ์‹๋ณ„ํ•˜๊ณ  ๋งˆ์Šคํ‚น(Redaction) ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š”๊ฐ€? -* ํ”„๋ก ํŠธ์—”๋“œ ํด๋ผ์ด์–ธํŠธ์—์„œ ๋ฐœ์ƒํ•œ API ํ˜ธ์ถœ ์—๋Ÿฌ๋ฅผ ๋ฐฑ์—”๋“œ MSA(Microservices Architecture) ํ™˜๊ฒฝ์˜ Distributed Trace ID์™€ ์–ด๋–ป๊ฒŒ ๊ฒฐํ•ฉํ•˜์—ฌ End-to-End ๊ฐ€์‹œ์„ฑ์„ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? -* OpenTelemetry ํ‘œ์ค€์„ ๋„์ž…ํ•˜์—ฌ ํ”„๋ก ํŠธ์—”๋“œ ๋กœ๊น… ์ธํ”„๋ผ๋ฅผ ์ž๊ฐ€ ํ˜ธ์ŠคํŒ…(Self-hosted)ํ•˜๋Š” ๊ฒฝ์šฐ์™€ SaaS๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, ์‹ค์ œ ์šด์˜ ๋ณต์žก๋„ ๋ฐ TCO(์ด์†Œ์œ ๋น„์šฉ) ์ธก๋ฉด์—์„œ ์–ด๋–ค ์ฐจ์ด๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”๊ฐ€? - -### Practical Application Contexts - -* **Implementation:** React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ ์‹œ Error Boundaries ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ , ์ด ์•ˆ์—์„œ Sentry API ๋˜๋Š” LogRocket ์ดˆ๊ธฐํ™” ์ฝ”๋“œ๋ฅผ ์—ฐ๊ฒฐํ•˜์—ฌ ๋ฏธ์ฒ˜ ์žก์ง€ ๋ชปํ•œ ๋Ÿฐํƒ€์ž„ ์˜ˆ์™ธ๊ฐ€ ํด๋ผ์šฐ๋“œ ๋กœ๊น… ๋„๊ตฌ๋กœ ์ž๋™ ์ „์†ก๋˜๋„๋ก ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค [9, 11]. -* **System Design:** ์‹œ์Šคํ…œ ์„ค๊ณ„ ์ดˆ๊ธฐ ๋‹จ๊ณ„์—์„œ ๊ด€์ธก์„ฑ(Observability) ์ „๋žต์„ ์ˆ˜๋ฆฝํ•  ๋•Œ, ๋ฒค๋” ์ข…์†์„ฑ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ์˜ ๋กœ๊น…/์ถ”์  ๊ทœ๊ฒฉ์„ OpenTelemetry ๊ธฐ๋ฐ˜์œผ๋กœ ํ†ต์ผํ•˜๊ณ , Trace ID๋ฅผ HTTP ํ—ค๋”๋กœ ์ „ํŒŒํ•˜๋Š” ๊ตฌ์กฐ๋ฅผ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค [4, 14, 15]. -* **Operation / Maintenance:** ํ”„๋กœ๋•์…˜ ๋ฐฐํฌ ์ดํ›„ Vercel Analytics, Sentry ๋“ฑ์˜ RUM ๋Œ€์‹œ๋ณด๋“œ๋ฅผ ํ†ตํ•ด LCP, INP, FCP ๋“ฑ Core Web Vitals ๋ฉ”ํŠธ๋ฆญ์„ ์ฃผ๊ธฐ์ ์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋ฉฐ, ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋‚˜ ๋ฌดํ•œ ๋ฆฌ๋ Œ๋”๋ง ๊ฐ™์€ ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ ์ €ํ•˜ ์š”์ธ์„ ๋ฐœ๊ฒฌํ•˜๊ณ  ๊ฐœ์„ ํ•ฉ๋‹ˆ๋‹ค [7, 28]. -* **Learning Path:** ๋กœ์ปฌ ํ™˜๊ฒฝ์—์„œ React DevTools์™€ Chrome Task Manager๋ฅผ ์ด์šฉํ•ด ๋ณ‘๋ชฉ ๋ฐ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ถ„์„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ตํžŒ ๋’ค [29-31], Sentry๋ฅผ ํ™œ์šฉํ•œ ์—๋Ÿฌ ํŠธ๋ž˜ํ‚น, ์ตœ์ข…์ ์œผ๋กœ OpenTelemetry ๊ธฐ๋ฐ˜์˜ ํ’€์Šคํƒ ํŠธ๋ ˆ์ด์‹ฑ ์ƒํƒœ๊ณ„๋ฅผ ํ•™์Šตํ•˜๋Š” ์ˆœ์œผ๋กœ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค. -* **My Project Relevance:** ํ˜„์žฌ ํ”„๋ก ํŠธ์—”๋“œ ํ”„๋กœ์ ํŠธ๋ฅผ ์Šค์ผ€์ผ๋งํ•˜๊ฑฐ๋‚˜ ์ƒ์šฉ ๋ฐฐํฌ๋ฅผ ์ค€๋น„ ์ค‘์ด๋ผ๋ฉด, ๊ธฐ๋Šฅ ๊ณ ๋„ํ™”์™€ ํ•จ๊ป˜ Sentry ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ํ†ตํ•ฉํ•˜์—ฌ ์—๋Ÿฌ ๋Œ€์‘ ์†๋„๋ฅผ ๋†’์ด๊ณ , ๊ฐœ์ธ์ •๋ณด ๋งˆ์Šคํ‚น ์„ค์ •์„ ๋ฐ˜๋“œ์‹œ ๊ฒ€ํ† ํ•˜์—ฌ ํ”„๋กœ๋•์…˜ ์ค€๋น„๋ฅผ ์™„๋ฃŒํ•˜๋Š” ๋ฐ ์ง์ ‘์ ์œผ๋กœ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค [11, 23, 24]. - -### Adjacent Topics - -* [[Core Web Vitals]] - * ํ™•์žฅ ๋ฐฉํ–ฅ: ํ”„๋กœ๋•์…˜ ์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง์˜ ์ฒ™๋„๊ฐ€ ๋˜๋Š” ์ฃผ์š” ์‚ฌ์šฉ์ž ์ค‘์‹ฌ ์„ฑ๋Šฅ ์ง€ํ‘œ(LCP, INP, CLS ๋“ฑ)์˜ ์ •์˜์™€ ์ธก์ • ๋ฐฉ์‹, ์ด๋ฅผ ์ตœ์ ํ™”ํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•๋ก ์œผ๋กœ ์ดํ•ด๋ฅผ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค [7, 32]. -* [[Frontend Performance Optimization]] - * ํ™•์žฅ ๋ฐฉํ–ฅ: RUM ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง์œผ๋กœ ๋ฐœ๊ฒฌ๋œ ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ์‹ค์ œ ์ฝ”๋“œ๋กœ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ React ์ปดํŒŒ์ผ๋Ÿฌ ํ™œ์šฉ, Code Splitting, Lazy Loading ๋ฐ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ์ „๋žต(useMemo, useCallback ๋“ฑ)์œผ๋กœ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค [33-35]. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Production Monitoring.md b/00_Raw/Production Monitoring.md deleted file mode 100644 index 72eacfd2..00000000 --- a/00_Raw/Production Monitoring.md +++ /dev/null @@ -1,64 +0,0 @@ -# [[Production Monitoring]] - -## ๐Ÿ“Œ Brief Summary -Production Monitoring(ํ”„๋กœ๋•์…˜ ๋ชจ๋‹ˆํ„ฐ๋ง)์€ ์‹ค์ œ ์„œ๋น„์Šค๊ฐ€ ๋ฐฐํฌ๋œ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋™์ž‘๊ณผ ์˜ค๋ฅ˜, ๊ทธ๋ฆฌ๊ณ  ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์ถ”์ ํ•˜๊ณ  ์‹œ์Šคํ…œ์˜ ๊ฐ€์‹œ์„ฑ(Observability)์„ ํ™•๋ณดํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค. ๋ชจ๋˜ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ๋ณต์žกํ•œ ๋ถ„์‚ฐ ํ™˜๊ฒฝ๊ณผ ๋‹ค์–‘ํ•œ ์‚ฌ์šฉ์ž ๊ธฐ๊ธฐ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ด์Šˆ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด, ๋‹จ์ˆœํ•œ ๋กœ๊ทธ๋ฅผ ๋„˜์–ด ์˜ค๋ฅ˜ ๊ทธ๋ฃนํ™”, ์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด, ํ’€์Šคํƒ ๋ถ„์‚ฐ ์ถ”์ (Distributed Tracing) ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ํด๋ผ์šฐ๋“œ ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๋ฌธ์ œ๋ฅผ ์‹ ์†ํžˆ ํŒŒ์•…ํ•˜๊ณ , ์„ฑ๋Šฅ ์ €ํ•˜๋‚˜ ์˜ค๋ฅ˜์˜ ๊ทผ๋ณธ ์›์ธ์„ ํšจ๊ณผ์ ์œผ๋กœ ๋””๋ฒ„๊น…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1-3]. - -## ๐Ÿ“– Core Content -* **๊ด€์ธก์„ฑ๊ณผ ์˜ค๋ฅ˜ ์ถ”์ ์˜ ํ•„์š”์„ฑ:** ํ˜„๋Œ€์˜ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋‹ค์–‘ํ•œ ๋ธŒ๋ผ์šฐ์ €์™€ ๋ชจ๋ฐ”์ผ ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰๋˜๋ฉฐ 500KB๊ฐ€ ๋„˜๋Š” ๋ฒˆ๋“ค๋กœ ๊ตฌ์„ฑ๋˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ™˜๊ฒฝ์—์„œ ํŠน์ • ์กฐ๊ฑด(์˜ˆ: Safari ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋‹คํฌ ๋ชจ๋“œ ์‚ฌ์šฉ ์‹œ ๋“ฑ)์—์„œ๋งŒ ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜๋ฅผ ๋‹จ์ˆœํ•œ ์‚ฌ์šฉ์ž ์Šคํฌ๋ฆฐ์ƒท์ด๋‚˜ ๋ฐฑ์—”๋“œ ๋กœ๊ทธ๋งŒ์œผ๋กœ ํŒŒ์•…ํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅ์— ๊ฐ€๊น๊ธฐ ๋•Œ๋ฌธ์— ์ „์šฉ ํ”„๋ก ํŠธ์—”๋“œ ๋กœ๊น… ํ”Œ๋žซํผ์˜ ๋„์ž…์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค [1, 2]. -* **์ฃผ์š” ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ ๋ฐ ํŠน์ง•:** - * **Sentry:** ๊ฐœ๋ฐœ์ž ์นœํ™”์ ์ธ ์—๋Ÿฌ ํŠธ๋ž˜์ปค๋กœ, ์œ ์‚ฌํ•œ ์˜ค๋ฅ˜๋ฅผ ๋ฌถ์–ด์ฃผ๋Š” ์ง€๋Šฅํ˜• ์˜ค๋ฅ˜ ๊ทธ๋ฃนํ™”(Intelligent Error Grouping)์™€ ์˜ค๋ฅ˜ ๋ฐœ์ƒ๊นŒ์ง€์˜ ์ฝ˜์†” ๋กœ๊ทธ, ๋„คํŠธ์›Œํฌ ์š”์ฒญ ๋“ฑ์„ ๋ณด์—ฌ์ฃผ๋Š” ๋นต๋ถ€์Šค๋Ÿฌ๊ธฐ(Breadcrumb trail) ๊ธฐ๋Šฅ์ด ๋›ฐ์–ด๋‚ฉ๋‹ˆ๋‹ค [3-5]. - * **LogRocket:** ์˜ค๋ฅ˜ ๋กœ๊น…์„ ๋„˜์–ด ํ™”๋ฉด์„ ๋…นํ™”ํ•˜๋“ฏ DOM ๋ณ€ํ™”, Redux/Vuex ์ƒํƒœ ๋ณ€๊ฒฝ, ๋„คํŠธ์›Œํฌ ์‘๋‹ต ๋“ฑ์„ ๊ธฐ๋กํ•˜์—ฌ ์‚ฌ์šฉ์ž ํ–‰๋™์„ ์™„๋ฒฝํžˆ ์žฌํ˜„ํ•˜๋Š” ์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด(Session Replay) ๊ธฐ์ˆ ์— ๊ฐ•์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค [3, 6, 7]. - * **Datadog RUM:** ํ”„๋ก ํŠธ์—”๋“œ์˜ ์˜ค๋ฅ˜๋ฅผ ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ์„œ๋“œํŒŒํ‹ฐ API๊นŒ์ง€ ์—ฐ๊ฒฐํ•˜์—ฌ ๋ณด์—ฌ์ฃผ๋Š” ์—”๋“œํˆฌ์—”๋“œ ๋ถ„์‚ฐ ์ถ”์ (Distributed tracing)์„ ํ†ตํ•ด ๋ณต์žกํ•œ ์‹œ์Šคํ…œ์˜ ์—ฐ๊ด€ ๊ด€๊ณ„๋ฅผ ๋ถ„์„ํ•˜๋Š” ๋ฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค [3, 8]. - * **SigNoz & Grafana:** ํŠน์ • ๋ฒค๋”์— ์ข…์†๋˜์ง€ ์•Š๋Š” ๊ฐœ๋ฐฉํ˜• ํ‘œ์ค€์ธ OpenTelemetry๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋ฉฐ, ๋กœ๊ทธ, ๋ฉ”ํŠธ๋ฆญ, ํŠธ๋ ˆ์ด์Šค๋ฅผ ๋‹จ์ผ ํ”Œ๋žซํผ์—์„œ ์ผ๊ด€๋˜๊ฒŒ ์ œ๊ณตํ•˜์—ฌ ์œ ์—ฐ์„ฑ๊ณผ ๋ฐ์ดํ„ฐ ์†Œ์œ ๊ถŒ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค [9-12]. -* **์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง(Performance Monitoring):** ์ด๋“ค ๋„๊ตฌ๋Š” ๋‹จ์ˆœํžˆ ์˜ค๋ฅ˜๋งŒ ์žก๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ Core Web Vitals(LCP, FID, CLS) ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์ง€์›ํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜, ๋А๋ฆฐ ๋ Œ๋”๋ง ๋“ฑ ์•ฑ์˜ ์ „๋ฐ˜์ ์ธ ์„ฑ๋Šฅ ์ƒํƒœ๋ฅผ ์ง€์†์ ์œผ๋กœ ๊ด€์ธกํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋•์Šต๋‹ˆ๋‹ค [13-15]. - -## โš–๏ธ Trade-offs & Caveats -* **๋น„์šฉ(Pricing) ๋ฐ ๊ฐ€์‹œ์„ฑ์˜ ๋”œ๋ ˆ๋งˆ:** ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘๋Ÿ‰์ด ์ฆ๊ฐ€ํ•˜๋ฉด ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ์˜ ๋น„์šฉ์ด ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ Datadog๊ณผ ๊ฐ™์ด ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘(Ingest)๊ณผ ๊ฒ€์ƒ‰์„ ์œ„ํ•œ ์ธ๋ฑ์‹ฑ(Index)์— ๊ฐ๊ฐ ์š”๊ธˆ์„ ๋ถ€๊ณผํ•˜๋Š” ๋ชจ๋ธ์˜ ๊ฒฝ์šฐ, ๋น„์šฉ ์ ˆ๊ฐ์„ ์œ„ํ•ด ์ „์ฒด ๋กœ๊ทธ์˜ ์ผ๋ถ€๋งŒ ์ธ๋ฑ์‹ฑํ•˜๊ฒŒ ๋˜๊ณ , ์ด๋กœ ์ธํ•ด ์ •์ž‘ ์žฅ์•  ๋ฐœ์ƒ ์‹œ ํ•„์š”ํ•œ ์ค‘์š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์—†๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3, 16, 17]. -* **์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ฑ๋Šฅ ์ €ํ•˜(Performance Impact):** ์™„๋ฒฝํ•œ ๋ชจ๋‹ˆํ„ฐ๋ง๊ณผ ์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด๋ฅผ ์œ„ํ•ด ์‚ฝ์ž…๋œ SDK๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค๋ฉฐ, ์ด๋กœ ์ธํ•ด ์ดˆ๊ธฐ ๋กœ๋“œ ์‹œ๊ฐ„์ด ์ตœ๋Œ€ 120ms๊นŒ์ง€ ์ง€์—ฐ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋กœ๋”ฉ ์†๋„๊ฐ€ ์ค‘์š”ํ•œ ์„œ๋น„์Šค(์˜ˆ: ์ด์ปค๋จธ์Šค)์—์„œ๋Š” ๊ฐ€๋ฒผ์šด ๋กœ๊น… ๋„๊ตฌ๋ฅผ ์„ ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [13, 18-20]. -* **๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ ๋ฐ ๋ณด์•ˆ(Privacy Concerns):** LogRocket์ฒ˜๋Ÿผ ์‚ฌ์šฉ์ž ์„ธ์…˜์˜ ๋ชจ๋“  DOM๊ณผ ์ƒํƒœ๋ฅผ ๊ธฐ๋กํ•˜๋Š” ๋„๊ตฌ๋Š”, ์„ค์ •์ด ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์„ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๋‚˜ ๊ธˆ์œต ์ •๋ณด ๊ฐ™์€ ๋ฏผ๊ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋Œ€๋กœ ์บก์ฒ˜ํ•  ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ ์‹œ ๋ฏผ๊ฐ ์ •๋ณด๋ฅผ ์ฒ ์ €ํžˆ ๋งˆ์Šคํ‚นํ•˜๋„๋ก ๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ ์ œ์–ด์— ์ƒ๋‹นํ•œ ๋…ธ๋ ฅ์„ ๊ธฐ์šธ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค [5, 7, 18, 19]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -#### [์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] -- [[OpenTelemetry]] - - ์—ฐ๊ฒฐ ์ด์œ : SigNoz๋‚˜ Grafana ๊ฐ™์€ ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ๋“ค์ด ํŠน์ • ๋ฒค๋”(Vendor lock-in)์— ์ข…์†๋˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด ์ฑ„ํƒํ•˜๊ณ  ์žˆ๋Š” ๊ด€์ธก์„ฑ ๊ด€๋ จ ๊ฐœ๋ฐฉํ˜• ํ‘œ์ค€ ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค [10, 11, 19]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ ๊ตฌ์ถ• ์‹œ ์œ ์—ฐ์„ฑ์„ ๋†’์ด๊ณ  ๋ฐ์ดํ„ฐ ์†Œ์œ ๊ถŒ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ ๋ฐฉ๋ฒ•์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - -- [[Distributed Tracing]] - - ์—ฐ๊ฒฐ ์ด์œ : ํ”„๋ก ํŠธ์—”๋“œ์˜ ์˜ค๋ฅ˜๋‚˜ ์ง€์—ฐ ํ˜„์ƒ์„ ๋ฐฑ์—”๋“œ ์ธํ”„๋ผ์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํŠธ๋žœ์žญ์…˜๊นŒ์ง€ ์ถ”์ ํ•˜์—ฌ ๊ทผ๋ณธ ์›์ธ์„ ํŒŒ์•…ํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค [8, 11, 12]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋‚˜ ํ’€์Šคํƒ ํ™˜๊ฒฝ์—์„œ ๋กœ๊ทธ๊ฐ€ ์–ด๋–ป๊ฒŒ ์—ฐ๊ฒฐ๋˜๊ณ  ์ƒ๊ด€๊ด€๊ณ„(Correlation)๋ฅผ ๊ฐ€์ง€๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - -#### [๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ] -- [[Session Replay]] - - ์—ฐ๊ฒฐ ์ด์œ : ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์ „ํ›„์˜ ์‚ฌ์šฉ์ž ํ™”๋ฉด ์กฐ์ž‘, ๋„คํŠธ์›Œํฌ ์š”์ฒญ, ์ƒํƒœ(State) ๋ณ€ํ™”๋ฅผ ๋น„๋””์˜ค์ฒ˜๋Ÿผ ์žฌํ˜„ํ•˜์—ฌ ์žฌํ˜„ํ•˜๊ธฐ ํž˜๋“  ๋ฒ„๊ทธ๋ฅผ ํŒŒ์•…ํ•˜๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค [3, 5-7]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋‹จ์ˆœํžˆ ์Šคํƒ ํŠธ๋ ˆ์ด์Šค๋งŒ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†๋Š” ์‚ฌ์šฉ์ž ์ธํ„ฐ๋ž™์…˜ ๊ธฐ๋ฐ˜์˜ ๋ฌธ์ œ๋ฅผ ๋””๋ฒ„๊น…ํ•˜๋Š” ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - -- [[Intelligent Error Grouping]] - - ์—ฐ๊ฒฐ ์ด์œ : ์ˆ˜์ฒœ ๊ฐœ์˜ ์˜ค๋ฅ˜ ๋กœ๊ทธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์œ ์‚ฌํ•œ ์˜ค๋ฅ˜๋ฅผ ์ž๋™์œผ๋กœ ํ•˜๋‚˜์˜ ๊ทธ๋ฃน์œผ๋กœ ๋ฌถ์–ด ๊ฐœ๋ฐœ์ž์˜ ํ”ผ๋กœ๋„๋ฅผ ์ค„์—ฌ์ฃผ๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค [3, 4]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋Œ€๊ทœ๋ชจ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์˜ ๋…ธ์ด์ฆˆ ์†์—์„œ ๊ฐ€์žฅ ์‹œ๊ธ‰ํ•œ ๋ฌธ์ œ๋ฅผ ์„ ๋ณ„ํ•˜๊ณ  ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - -### Deeper Research Questions -- OpenTelemetry ํ‘œ์ค€์„ ์ ์šฉํ•œ ๋ชจ๋‹ˆํ„ฐ๋ง ์•„ํ‚คํ…์ฒ˜(SigNoz, Grafana)๋Š” ๊ธฐ์กด ์ƒ์šฉ ๋„๊ตฌ(Datadog, Sentry)์™€ ๋น„๊ตํ•ด ์žฅ๊ธฐ์ ์ธ ๋ฐ์ดํ„ฐ ๋ณด๊ด€ ๋ฐ ์ฟผ๋ฆฌ ๋น„์šฉ์„ ์–ด๋–ป๊ฒŒ ์ ˆ๊ฐํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? -- ์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด ๊ธฐ์ˆ ์„ ํ”„๋กœ๋•์…˜์— ์ ์šฉํ•  ๋•Œ ๋ธŒ๋ผ์šฐ์ €์˜ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ ์ ์œ ์œจ๊ณผ ๋„คํŠธ์›Œํฌ ๋Œ€์—ญํญ ์†Œ๋น„๋ฅผ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•œ ๊ตฌ์ฒด์ ์ธ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? -- Datadog์˜ '์ˆ˜์ง‘(Ingest)'๊ณผ '์ธ๋ฑ์‹ฑ(Index)'์˜ ์ด์ค‘ ๊ณผ๊ธˆ ๊ตฌ์กฐ ํ•˜์—์„œ ํด๋ผ์šฐ๋“œ ์˜ˆ์‚ฐ์„ ํ†ต์ œํ•˜๋ฉด์„œ๋„ ํฌ๋ฆฌํ‹ฐ์ปฌํ•œ ๋กœ๊ทธ์˜ ๊ฐ€์‹œ์„ฑ์„ ํ™•๋ณดํ•˜๋Š” ์ƒ˜ํ”Œ๋ง ์ „๋žต์€ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑํ•ด์•ผ ํ•˜๋Š”๊ฐ€? -- ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ๋ฐœ์ƒํ•œ ํ”„๋ก ํŠธ์—”๋“œ ์ƒํƒœ(์˜ˆ: Redux, Zustand) ์—๋Ÿฌ๋ฅผ Sentry์˜ Breadcrumb trail(์ด๋™ ๊ฒฝ๋กœ)๊ณผ ์–ด๋–ป๊ฒŒ ํ†ตํ•ฉํ•ด์•ผ ์ปดํฌ๋„ŒํŠธ ์žฌ๋ Œ๋”๋ง์˜ ์›์ธ์„ ๊ฐ€์žฅ ์ •ํ™•ํ•˜๊ฒŒ ์—ญ์ถ”์ ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? -- Session Replay ์†”๋ฃจ์…˜ ๋„์ž… ์‹œ GDPR ๋“ฑ ๊ธ€๋กœ๋ฒŒ ๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ ๊ทœ์ œ๋ฅผ ์ค€์ˆ˜ํ•˜๊ธฐ ์œ„ํ•ด ๋ฏผ๊ฐ ๋ฐ์ดํ„ฐ๋ฅผ ํด๋ผ์ด์–ธํŠธ ๋‹จ์—์„œ ๋ˆ„๋ฝ ์—†์ด ๋งˆ์Šคํ‚นํ•  ์ˆ˜ ์žˆ๋Š” ์ž๋™ํ™”๋œ ์•„ํ‚คํ…์ฒ˜๋Š” ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•˜๋Š”๊ฐ€? - -### Practical Application Contexts -- **Implementation:** React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ตœ์ƒ๋‹จ ์˜ค๋ฅ˜ ๋ฐ”์šด๋”๋ฆฌ์— Sentry๋‚˜ LogRocket ๋“ฑ์˜ SDK๋ฅผ ํ†ตํ•ฉํ•˜์—ฌ, ๋น„๋™๊ธฐ ๋กœ์ง์ด๋‚˜ ๋ Œ๋”๋ง ์ค‘ ๋ฐœ์ƒํ•˜๋Š” ์˜ˆ๊ธฐ์น˜ ๋ชปํ•œ ์—๋Ÿฌ๋ฅผ ์บก์ฒ˜ํ•˜๊ณ  ์„œ๋ฒ„๋กœ ์ „์†กํ•˜๋„๋ก ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. [3, 5, 7] -- **System Design:** ํ”„๋ก ํŠธ์—”๋“œ์˜ ๋กœ๊น… ํŠธ๋ž˜ํ”ฝ(RUM)์— ๊ณ ์œ  Trace ID๋ฅผ ๋ถ€์—ฌํ•˜๊ณ , ์ด๋ฅผ ๋ฐฑ์—”๋“œ์˜ APM(Application Performance Monitoring)๊ณผ ์—ฐ๊ฒฐํ•˜์—ฌ ์—”๋“œํˆฌ์—”๋“œ ๋ถ„์‚ฐ ์ถ”์ ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ์ „์ฒด ๊ด€์ธก์„ฑ ํŒŒ์ดํ”„๋ผ์ธ์„ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค. [8, 11, 12] -- **Operation / Maintenance:** ์•ฑ์ด ํ”„๋กœ๋•์…˜์— ๋ฐฐํฌ๋œ ํ›„ ๋ฐœ์ƒํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋‚˜ Core Web Vitals ์ ์ˆ˜ ํ•˜๋ฝ์„ ๋ชจ๋‹ˆํ„ฐ๋ง ๋Œ€์‹œ๋ณด๋“œ์—์„œ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๊ฐ์ง€ํ•˜๊ณ , ์—๋Ÿฌ ๊ทธ๋ฃนํ™” ๋„๊ตฌ๋ฅผ ํ†ตํ•ด ๋นˆ๋„๊ฐ€ ๋†’์€ ์ด์Šˆ๋ถ€ํ„ฐ ์ ์ง„์ ์œผ๋กœ ํ•ด๊ฒฐํ•˜์—ฌ ์‹œ์Šคํ…œ ์•ˆ์ •์„ฑ์„ ๋†’์ž…๋‹ˆ๋‹ค. [1-3, 14] -- **Learning Path:** ์ฒ˜์Œ์—๋Š” ๋ธŒ๋ผ์šฐ์ €์˜ Chrome DevTools ๋ฐ ๋กœ์ปฌ ๋กœ๊น…์œผ๋กœ ์‹œ์ž‘ํ•˜์—ฌ, ์ ์ฐจ React Error Boundaries๋ฅผ ํ†ตํ•œ ์—๋Ÿฌ ๊ฒฉ๋ฆฌ๋ฅผ ์ตํžŒ ๋’ค, Sentry๋‚˜ SigNoz ๊ฐ™์€ ํด๋ผ์šฐ๋“œ ๊ธฐ๋ฐ˜ ํ”„๋กœ๋•์…˜ ๋ชจ๋‹ˆํ„ฐ๋ง ํ”Œ๋žซํผ ์—ฐ๋™์œผ๋กœ ํ•™์Šต ๋ฒ”์œ„๋ฅผ ํ™•์žฅํ•ด ๋‚˜๊ฐ‘๋‹ˆ๋‹ค. [1, 2, 21-42] -- **My Project Relevance:** ํ˜„์žฌ ์ง„ํ–‰ ์ค‘์ธ ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ์™€ ํŒ€์˜ ์˜ˆ์‚ฐ์„ ๊ณ ๋ คํ•˜์—ฌ ์ ํ•ฉํ•œ ๋„๊ตฌ๋ฅผ ์„ ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ดˆ๊ธฐ ๋‹จ๊ณ„๋ผ๋ฉด ๋„‰๋„‰ํ•œ ๋ฌด๋ฃŒ ํ‹ฐ์–ด๋ฅผ ์ œ๊ณตํ•˜๋Š” Sentry๋‚˜ ์˜คํ”ˆ์†Œ์Šค์ธ SigNoz Cloud๊ฐ€ ์ ํ•ฉํ•˜๋ฉฐ, ๋ฏผ๊ฐํ•œ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๋‹ค๋ฃจ๋Š” ์„œ๋น„์Šค๋ผ๋ฉด ๋ฐ์ดํ„ฐ ๋งˆ์Šคํ‚น ์„ค์ •์„ ํ•„์ˆ˜๋กœ ์ ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. [13, 19, 43, 44] - -### Adjacent Topics -- [[Error Boundaries in React]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ๊ฐ€ ์บก์ฒ˜ํ•œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด๊ฐ€ '๋ฐฑ์ง€ ํ™”๋ฉด(White screen of death)'์œผ๋กœ ํฌ๋ž˜์‹œ ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ณ  Fallback UI๋ฅผ ๋ณด์—ฌ์ฃผ์–ด ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๋ณดํ˜ธํ•˜๋Š” React ์ž์ฒด์˜ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๋งค์ปค๋‹ˆ์ฆ˜์„ ์•Œ์•„๋ด…๋‹ˆ๋‹ค [45-47]. - -- [[Core Web Vitals]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ๋‹จ์ˆœํ•œ ์˜ค๋ฅ˜๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ์‚ฌ์šฉ์ž์˜ ์ฒด๊ฐ ์„ฑ๋Šฅ์„ ์ขŒ์šฐํ•˜๋Š” ๋ Œ๋”๋ง ์†๋„์™€ ์‹œ๊ฐ์  ์•ˆ์ •์„ฑ(LCP, FID, CLS ๋“ฑ)์„ ์ธก์ •ํ•˜๊ณ  ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค [14, 15, 48]. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Prop Drilling.md b/00_Raw/Prop Drilling.md deleted file mode 100644 index aea73383..00000000 --- a/00_Raw/Prop Drilling.md +++ /dev/null @@ -1,56 +0,0 @@ -# [[Prop Drilling]] - -## ๐Ÿ“Œ Brief Summary -Prop Drilling์€ ์‹ค์ œ๋กœ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์€ ์—ฌ๋Ÿฌ ์ค‘๊ฐ„ ์ปดํฌ๋„ŒํŠธ๋“ค์„ ๊ฑฐ์ณ ๊ณ„์ธต์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ์•ˆํ‹ฐ ํŒจํ„ด์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค [1]. ์ฃผ๋กœ ๊นŠ๊ฒŒ ์ค‘์ฒฉ๋œ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์— ์ƒํƒœ๋‚˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•  ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [1]. React ์ƒํƒœ๊ณ„์—์„œ๋Š” ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋‚ด์žฅ๋œ Context API๋‚˜ ์™ธ๋ถ€ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค [1, 2]. - -## ๐Ÿ“– Core Content -* **์ž‘๋™ ๋ฐฉ์‹ ๋ฐ ์›์ธ:** Prop Drilling์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ ๊นŠ์ด ์ค‘์ฒฉ๋œ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋กœ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด, ์ค‘๊ฐ„์— ์œ„์น˜ํ•œ ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ์˜ props๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ํ†ต๊ณผ์‹œํ‚ค๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค [1]. -* **๊ตฌ์กฐ์  ๋ฌธ์ œ์ :** ์ด ํŒจํ„ด์€ ์ค‘๊ฐ„ ์ปดํฌ๋„ŒํŠธ๋“ค์ด ์ž์‹ ์—๊ฒŒ ํ•„์š” ์—†๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋‹จ์ง€ ์ „๋‹ฌ(transport)ํ•˜๊ธฐ ์œ„ํ•œ ๋ชฉ์ ์œผ๋กœ ์ทจ๊ธ‰ํ•˜๊ฒŒ ๋งŒ๋“ค๋ฉฐ, ์ด๋Š” ์ฝ”๋“œ์˜ ๋ณต์žก์„ฑ์„ ๋†’์ด๊ณ  ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค [1]. -* **React์˜ ๋‚ด์žฅ ํ•ด๊ฒฐ์ฑ…:** React๋Š” ์ด๋Ÿฌํ•œ ํ˜„์ƒ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด 'Context API'๋ฅผ ๋„์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ์˜ ๋ชจ๋“  ๋ ˆ๋ฒจ์„ ๊ฑฐ์น˜์ง€ ์•Š๊ณ ๋„ ์ „์—ญ ๊ด€์‹ฌ์‚ฌ(global concerns) ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘์ ์œผ๋กœ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์™€ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1, 3, 4]. -* **ํŒŒ์ƒ ์ƒํƒœ ์ฒ˜๋ฆฌ์˜ ํ•œ๊ณ„:** Redux๋‚˜ Zustand๊ฐ€ ํŒŒ์ƒ ์ƒํƒœ๋ฅผ ์œ„ํ•œ ์„ ํƒ์ž(derived selectors)๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒƒ๊ณผ ๋‹ฌ๋ฆฌ, Context๋Š” ํŒŒ์ƒ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•  ๋•Œ ์—ฌ์ „ํžˆ Prop Drilling ๋ฐฉ์‹์— ์˜์กดํ•˜๊ฒŒ ๋˜๊ฑฐ๋‚˜ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ํ”ผํ•˜๊ธฐ ์–ด๋ ค์šด ๊ธฐ๋Šฅ์  ํ•œ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค [5]. - -## โš–๏ธ Trade-offs & Caveats -Prop Drilling์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ€์žฅ ๋จผ์ € ๊ณ ๋ ค๋˜๋Š” Context API๋Š” ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ณ€๊ฒฝ๋˜๋Š” ์ƒํƒœ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ์‹ฌ๊ฐํ•œ ์„ฑ๋Šฅ ์ œ์•ฝ(Trade-off)์„ ๋™๋ฐ˜ํ•ฉ๋‹ˆ๋‹ค [6, 7]. Context ๊ฐ’์˜ ์ผ๋ถ€๋งŒ ๋ณ€๊ฒฝ๋˜์–ด๋„ ํ•ด๋‹น Context๋ฅผ ๊ตฌ๋…ํ•˜๋Š” ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์ „์ฒด ๋ฆฌ๋ Œ๋”๋ง(re-render)์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค [6, 8]. - -๋”ฐ๋ผ์„œ ์žฅ๋ฐ”๊ตฌ๋‹ˆ๋‚˜ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ๋“ฑ ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ณ€๊ฒฝ๋˜๋Š” ์ƒํƒœ์— ๋Œ€ํ•ด Prop Drilling์„ ํ”ผํ•˜๊ฒ ๋‹ค๊ณ  ๋ฌด์ž‘์ • Context API๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ ์ €ํ•˜(Re-render storm)๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [9, 10]. ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ์—๋Š” ์„ ํƒ์ž(Selector) ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ํ•„์š”ํ•œ ์ƒํƒœ ๋ณ€๊ฒฝ ์‹œ์—๋งŒ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ฐœ์ƒ์‹œํ‚ค๋Š” Zustand๋‚˜ Redux๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ตœ์ ํ™” ์ธก๋ฉด์—์„œ ํ•„์ˆ˜์ ์ธ ๋ฐ˜๋Œ€ ๊ธ‰๋ถ€์˜ ํ•ด๊ฒฐ์ฑ…์ด ๋ฉ๋‹ˆ๋‹ค [7, 11]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -#### [๊ธฐ๋ฐ˜ ๊ธฐ์ˆ /ํ•ด๊ฒฐ์ฑ…] -- [[Context API]] - - ์—ฐ๊ฒฐ ์ด์œ : Prop Drilling ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด React์—์„œ ์ž์ฒด์ ์œผ๋กœ ๋„์ž…ํ•œ ๋‚ด์žฅ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [1]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: props๋ฅผ ์ผ์ผ์ด ๋„˜๊ธฐ์ง€ ์•Š๊ณ  ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธํ•˜๋Š” ์›๋ฆฌ์™€ ๊ทธ์— ๋”ฐ๋ฅธ ๋ฆฌ๋ Œ๋”๋ง ํ•œ๊ณ„๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [6, 12]. - -#### [์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ/๋Œ€์•ˆ] -- [[Zustand]] - - ์—ฐ๊ฒฐ ์ด์œ : Prop Drilling์˜ ๋Œ€์•ˆ์ธ Context API๊ฐ€ ๊ฐ–๋Š” ๋ฆฌ๋ Œ๋”๋ง ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ๊ทน๋ณตํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๋Ÿ‰ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [2, 7]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์„ ํƒ์ž(Selector) ํŒจํ„ด์„ ํ™œ์šฉํ•ด ํ•„์š”ํ•œ ์ƒํƒœ์˜ ๋ณ€๊ฒฝ์—๋งŒ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฆฌ๋ Œ๋”๋งํ•˜๋„๋ก ์Šค๋งˆํŠธํ•˜๊ฒŒ ๊ตฌ๋…(subscribe)ํ•˜๋Š” ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [7, 13]. -- [[Redux]] - - ์—ฐ๊ฒฐ ์ด์œ : ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ Prop Drilling์„ ๋ฐฉ์ง€ํ•˜๊ณ  ์ƒํƒœ๋ฅผ ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์‚ฐ์—… ํ‘œ์ค€ ์ƒํƒœ ์ปจํ…Œ์ด๋„ˆ ๋„๊ตฌ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [5, 14]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํŒŒ์ƒ ์„ ํƒ์ž(derived selectors)๊ฐ€ ์กด์žฌํ•จ์œผ๋กœ์จ Prop Drilling ์—†์ด ๋ณต์žกํ•œ ์ƒํƒœ์™€ ๋น„๋™๊ธฐ ๋กœ์ง์„ ์–ด๋–ป๊ฒŒ ํšจ์œจ์ ์œผ๋กœ ๋‹ค๋ฃจ๋Š”์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5, 15]. - -### Deeper Research Questions - -- Prop Drilling์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด Context API๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง(re-renders) ๋ฌธ์ œ๋Š” ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? [6, 8] -- Redux์™€ Zustand๊ฐ€ ์ œ๊ณตํ•˜๋Š” '์„ ํƒ์ž(Selector)' ๊ธฐ๋Šฅ์€ Prop Drilling ๋ฐฉ์‹๊ณผ ๋น„๊ตํ•˜์—ฌ ํŒŒ์ƒ ์ƒํƒœ(derived state)๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ ์–ด๋– ํ•œ ์•„ํ‚คํ…์ฒ˜์  ์ด์ ์„ ์ œ๊ณตํ•˜๋Š”๊ฐ€? [5, 7] -- Context API๊ฐ€ ์•„๋‹Œ Zustand๋‚˜ Redux ๊ฐ™์€ ์ „๋ฌธ์ ์ธ ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ๋ฅผ ๋„์ž…ํ•˜์—ฌ Prop Drilling์„ ํ•ด๊ฒฐํ•ด์•ผ ํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ณต์žก๋„ ๋ฐ ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง ๋นˆ๋„์˜ ์ •ํ™•ํ•œ ๊ธฐ์ค€์ ์€ ๋ฌด์—‡์ธ๊ฐ€? [10, 11] -- Prop Drilling์„ ๋‹จ์ˆœํžˆ ํšŒํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋“  ์ƒํƒœ๋ฅผ ์ „์—ญ ์ปจํ…์ŠคํŠธ(Global Context for Everything)์— ๋„ฃ๋Š” ์•ˆํ‹ฐ ํŒจํ„ด์€ ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜์— ์–ด๋–ค ๋ถ€์ž‘์šฉ์„ ์ผ์œผํ‚ค๋Š”๊ฐ€? [16, 17] -- ์ „์—ญ ์ƒํƒœ๊ฐ€ ์•„๋‹Œ ์ง€์—ญ ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ ๋‚ด์—์„œ ๋ฐœ์ƒํ•˜๋Š” Prop Drilling์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด, ์ปดํฌ๋„ŒํŠธ ํ•ฉ์„ฑ(Component Composition)์ด๋‚˜ ํด๋ฆฐ ์ฝ”๋“œ ์›์น™์„ ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? [18, 19] - -### Practical Application Contexts - -- **Implementation:** ๊นŠ๊ฒŒ ์ค‘์ฒฉ๋œ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ๋•Œ, ์ค‘๊ฐ„ ์ปดํฌ๋„ŒํŠธ๋“ค์ด ๋ถˆํ•„์š”ํ•œ props๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๋„๋ก `React.createContext()`๋ฅผ ํ™œ์šฉํ•ด ๋ฐ์ดํ„ฐ ์ œ๊ณต์ž(Provider)์™€ ์†Œ๋น„์ž(Consumer)๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค [1, 12]. -- **System Design:** ํ…Œ๋งˆ๋‚˜ ์–ธ์–ด ์„ค์ •๊ณผ ๊ฐ™์€ ์ •์ ์ธ ์ „์—ญ ๊ด€์‹ฌ์‚ฌ(global concerns)์— ๋Œ€ํ•œ Prop Drilling์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Context API๋ฅผ ์„ค๊ณ„์— ๋ฐ˜์˜ํ•˜์ง€๋งŒ, ์ƒํƒœ ๋ณ€๊ฒฝ์ด ์žฆ์€ ์˜์—ญ์€ Zustand๋‚˜ Redux ๊ธฐ๋ฐ˜์˜ ์Šค๋งˆํŠธ ์•Œ๋ฆผ ์‹œ์Šคํ…œ(smart notification system) ๊ตฌ์กฐ๋กœ ์„ค๊ณ„ํ•˜์—ฌ ๊ด€์‹ฌ์‚ฌ์™€ ์„ฑ๋Šฅ์„ ๋ชจ๋‘ ์ฑ™๊น๋‹ˆ๋‹ค [4, 13, 20]. -- **Operation / Maintenance:** ์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง ํˆด(์˜ˆ: React DevTools Profiler)์„ ํ†ตํ•ด Prop Drilling์„ ์šฐํšŒํ•˜๊ณ ์ž ๋„์ž…ํ•œ Context๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง ํญํ’(re-render storm)์„ ์ผ์œผํ‚ค๋Š”์ง€ ์ถ”์ ํ•˜๊ณ , ๋ณ‘๋ชฉ ๋ฐœ์ƒ ์‹œ Selector๋ฅผ ์ง€์›ํ•˜๋Š” ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ๋กœ ์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜(Incremental Migration)์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค [8, 9, 21]. -- **Learning Path:** React ์ž…๋ฌธ ์‹œ ๋ฐ์ดํ„ฐ ํ๋ฆ„์˜ ๊ธฐ๋ณธ์ธ Prop Drilling์˜ ๋ถˆํŽธํ•จ์„ ๋จผ์ € ๊ฒฝํ—˜ํ•˜๊ณ , ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” Context API๋ฅผ ํ•™์Šตํ•œ ํ›„, ์ตœ์ข…์ ์œผ๋กœ ๋Œ€๊ทœ๋ชจ ์•ฑ์„ ์œ„ํ•œ Zustand๋‚˜ Redux๋กœ ๋ฐœ์ „ํ•ด ๋‚˜๊ฐ€๋Š” ํ˜•ํƒœ์˜ ํ•™์Šต ๊ฒฝ๋กœ๋ฅผ ๋ฐŸ๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค [22]. -- **My Project Relevance:** ์†Œ์Šค์— ๊ด€๋ จ ์ •๋ณด๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. - -### Adjacent Topics - -- [[Re-renders]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: Prop Drilling์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•œ ์ˆ˜๋‹จ(Context API)์ด ์ดˆ๋ž˜ํ•˜๋Š” ๋ถ€์ž‘์šฉ์ธ ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”๋ชจ์ด์ œ์ด์…˜(`React.memo`, `useMemo`, `useCallback`) ๋“ฑ React ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์œผ๋กœ์˜ ์ดํ•ด ํ™•์žฅ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค [3, 6, 23]. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Re-renders Optimization.md b/00_Raw/Re-renders Optimization.md deleted file mode 100644 index be2c3213..00000000 --- a/00_Raw/Re-renders Optimization.md +++ /dev/null @@ -1,54 +0,0 @@ -# [[Re-renders Optimization]] - -## ๐Ÿ“Œ Brief Summary -Re-renders Optimization์€ React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ถˆํ•„์š”ํ•œ ์ปดํฌ๋„ŒํŠธ ์—…๋ฐ์ดํŠธ๋ฅผ ์ตœ์†Œํ™”ํ•˜์—ฌ ์„ฑ๋Šฅ, ๋ฐ˜์‘์„ฑ ๋ฐ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค [1, 2]. ์ฃผ๋กœ ์ƒํƒœ(state), ์†์„ฑ(props), ์ปจํ…์ŠคํŠธ(context)์˜ ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ๊ณผ๋„ํ•œ ๋ Œ๋”๋ง์„ ํƒ€๊ฒŸ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค [3]. ์ด๋ฅผ ์œ„ํ•ด ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜, ์ƒํƒœ ๊ด€๋ฆฌ ์ตœ์ ํ™”, ๊ฐ€์ƒํ™” ๊ธฐ๋ฒ•, ๊ทธ๋ฆฌ๊ณ  React Compiler์™€ ๊ฐ™์€ ์ตœ์‹  ์ž๋™ํ™” ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค [4-6]. - -## ๐Ÿ“– Core Content -* **๋ฆฌ๋ Œ๋”๋ง์˜ ์›์ธ๊ณผ ์„ฑ๋Šฅ์  ์˜ํ–ฅ:** - React ์ปดํฌ๋„ŒํŠธ๋Š” ๋‚ด๋ถ€ ์ƒํƒœ(state) ๋ณ€๊ฒฝ, ์†์„ฑ(props) ๋ณ€๊ฒฝ, ๊ตฌ๋… ์ค‘์ธ ์ปจํ…์ŠคํŠธ(context) ๊ฐ’ ๋ณ€๊ฒฝ, ํ˜น์€ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง๋  ๋•Œ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค [3]. ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์ด ๋ˆ„์ ๋˜๋ฉด UI ๋ฐ˜์‘์„ฑ ์ €ํ•˜, ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ์ฆ๊ฐ€, ์ƒํ˜ธ์ž‘์šฉ์„ฑ(TTI) ์ง€์—ฐ ๋“ฑ์„ ์ดˆ๋ž˜ํ•˜๋ฉฐ, ๊นŠ์€ ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ์—์„œ๋Š” ์Šคํฌ๋ฆฝํŒ… ์‹œ๊ฐ„์„ 30~60%๊นŒ์ง€ ์ฆ๊ฐ€์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2]. -* **์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ (Manual Memoization):** - `React.memo()`๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด props๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ด์ „ ๋ Œ๋”๋ง ๊ฒฐ๊ณผ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜์—ฌ ๋ Œ๋”๋ง ํšŸ์ˆ˜๋ฅผ 30~50%๊ฐ€๋Ÿ‰ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [7, 8]. ์ด์™€ ํ•จ๊ป˜ `useCallback`๊ณผ `useMemo` ํ›…์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ์ฒด๋‚˜ ํ•จ์ˆ˜์˜ ์ฐธ์กฐ ๋™๋“ฑ์„ฑ(Reference Equality)์„ ์œ ์ง€ํ•ด์•ผ ์ž์‹ ์ปดํฌ๋„ŒํŠธ์˜ ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง์„ ๋ง‰์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [9, 10]. ๋‹จ, ๋ฌด๋ถ„๋ณ„ํ•œ ์‚ฌ์šฉ์€ ๋น„๊ต ์—ฐ์‚ฐ์˜ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋ฏ€๋กœ ํ”„๋กœํŒŒ์ผ๋ง์„ ํ†ตํ•ด ํ™•์ธ๋œ ๋ณ‘๋ชฉ ๊ตฌ๊ฐ„์—๋งŒ ์ ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [11, 12]. -* **์ปจํ…์ŠคํŠธ ์ตœ์ ํ™” (Context Optimization):** - React์˜ ๊ธฐ๋ณธ Context API๋Š” ๊ฐ’์˜ ์ผ๋ถ€๋งŒ ๋ณ€๊ฒฝ๋˜์–ด๋„ ํ•ด๋‹น ์ปจํ…์ŠคํŠธ๋ฅผ ๊ตฌ๋…ํ•˜๋Š” ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฆฌ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค [13, 14]. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ปจํ…์ŠคํŠธ๋ฅผ ์ž‘์€ ๋„๋ฉ”์ธ ๋‹จ์œ„๋กœ ์ชผ๊ฐœ๊ฑฐ๋‚˜ [15], ์„ ํƒ์ž(Selector)๋ฅผ ํ†ตํ•ด ์ƒํƒœ์˜ ํŠน์ • ์กฐ๊ฐ์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งŒ ๋ฆฌ๋ Œ๋”๋ง์„ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š” Zustand, Jotai ๋“ฑ์˜ ์™ธ๋ถ€ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค [16-18]. -* **React Compiler์˜ ๋„์ž…:** - ๋นŒ๋“œ ํƒ€์ž„ ์ตœ์ ํ™” ๋„๊ตฌ์ธ React Compiler๋Š” ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜(`useMemo`, `useCallback`, `React.memo`) ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ ์ปดํŒŒ์ผ ๋‹จ๊ณ„์—์„œ ์ž๋™์œผ๋กœ ์บ์‹ฑ ๋กœ์ง์„ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค [4, 19]. ์ปดํฌ๋„ŒํŠธ ์ „์ฒด๊ฐ€ ์•„๋‹Œ ๊ฐœ๋ณ„ JSX ์š”์†Œ ๋‹จ์œ„๋กœ ์„ธ๋ถ„ํ™”ํ•˜์—ฌ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์ˆ˜ํ–‰ํ•จ์œผ๋กœ์จ, ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ๋†’์ด๊ณ  ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง์„ ์›์ฒœ์ ์œผ๋กœ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค [19, 20]. -* **๋ Œ๋”๋ง ํŒจํ„ด ๋ฐ ๋™์‹œ์„ฑ ์ตœ์ ํ™”:** - ์ˆ˜๋ฐฑ ๊ฐœ ์ด์ƒ์˜ ํ•ญ๋ชฉ์„ ๋ Œ๋”๋งํ•˜๋Š” ๋Œ€๊ทœ๋ชจ ๋ฆฌ์ŠคํŠธ์—์„œ๋Š” ๊ณ ์œ ํ•˜๊ณ  ์•ˆ์ •์ ์ธ `key` ์†์„ฑ์„ ๋ถ€์—ฌํ•˜๊ณ , ํ™”๋ฉด์— ๋ณด์ด๋Š” ํ•ญ๋ชฉ๋งŒ ๋ Œ๋”๋งํ•˜๋Š” ๊ฐ€์ƒํ™”(Windowing) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(์˜ˆ: `react-window`)๋ฅผ ์ ์šฉํ•˜์—ฌ DOM ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ค„์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค [6, 21]. ๋˜ํ•œ JSX ๋‚ด๋ถ€์— ์ต๋ช… ํ•จ์ˆ˜๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•˜๋ฉด ๋งค ๋ Œ๋”๋ง๋งˆ๋‹ค ์ƒˆ๋กœ์šด ์ฐธ์กฐ๊ฐ€ ์ƒ์„ฑ๋˜๋ฏ€๋กœ ์ง€์–‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [22, 23]. ๋ถ€๊ฐ€์ ์œผ๋กœ `useTransition` ๋ฐ `useDeferredValue`์™€ ๊ฐ™์€ ๋™์‹œ์„ฑ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•ด ๋ฌด๊ฑฐ์šด ์—…๋ฐ์ดํŠธ๋ฅผ ์ง€์—ฐ์‹œํ‚ค๊ณ  ์‚ฌ์šฉ์ž ์ž…๋ ฅ์— ๋Œ€ํ•œ UI ๋ฐ˜์‘์„ฑ์„ ์šฐ์„ ์ˆœ์œ„์— ๋‘˜ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [24, 25]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts -- [[React Compiler]] - - ์—ฐ๊ฒฐ ์ด์œ : ๊ฐœ๋ฐœ์ž๊ฐ€ ์ˆ˜๋™์œผ๋กœ ๋ฆฌ๋ Œ๋”๋ง์„ ์ตœ์ ํ™”ํ•˜๋˜ ๊ธฐ์กด ๋ฐฉ์‹์„ ๋Œ€์ฒดํ•˜์—ฌ, ๋นŒ๋“œ ํƒ€์ž„์— ์ž๋™์œผ๋กœ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์ ์šฉํ•˜๋Š” 2025๋…„ ๊ธฐ์ค€ ํ•ต์‹ฌ ๊ธฐ์ˆ ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [4]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ปดํฌ๋„ŒํŠธ ์ „์ฒด๊ฐ€ ์•„๋‹Œ ๊ฐœ๋ณ„ JSX ์š”์†Œ์™€ ์—ฐ์‚ฐ์ด ์–ด๋–ป๊ฒŒ ๋…๋ฆฝ์ ์œผ๋กœ ์บ์‹ฑ๋˜๋Š”์ง€์˜ ์›๋ฆฌ์™€ ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ˜ธํ™˜์„ฑ ํ•œ๊ณ„ [19, 26]. - -- [[State Management (Zustand vs Context)]] - - ์—ฐ๊ฒฐ ์ด์œ : ๋ถˆํ•„์š”ํ•œ ์ „์ฒด ๋ฆฌ๋ Œ๋”๋ง์„ ์œ ๋ฐœํ•˜๋Š” Context API์˜ ๊ตฌ์กฐ์  ํ•œ๊ณ„๋ฅผ Zustand์˜ ์„ ํƒ์ž(Selector) ํŒจํ„ด์ด ์–ด๋–ป๊ฒŒ ๊ทน๋ณตํ•˜์—ฌ ๋ Œ๋”๋ง์„ ์ตœ์ ํ™”ํ•˜๋Š”์ง€ ์„ค๋ช…ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [13, 17]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ž์ฃผ ๋ณ€๊ฒฝ๋˜๋Š” ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ์—์„œ React ๋ Œ๋”๋ง ์‚ฌ์ดํด ์™ธ๋ถ€์˜ ์Šคํ† ์–ด๊ฐ€ ์–ด๋–ป๊ฒŒ ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง์„ ์ •๋ฐ€ํ•˜๊ฒŒ ์ œ์–ดํ•˜๋Š”์ง€ [17, 27]. - -- [[Memoization (useMemo, useCallback)]] - - ์—ฐ๊ฒฐ ์ด์œ : React์˜ ์–•์€ ๋น„๊ต(Shallow comparison) ํŠน์„ฑ์„ ๊ทน๋ณตํ•˜๊ณ  ์ฐธ์กฐ ๋™๋“ฑ์„ฑ์„ ์œ ์ง€ํ•˜์—ฌ `React.memo`์™€ ๊ฒฐํ•ฉํ•œ ๋ฆฌ๋ Œ๋”๋ง ์ตœ์ ํ™”์˜ ๊ธฐ๋ฐ˜์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [10]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ฌด๋ถ„๋ณ„ํ•œ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์ด ์˜คํžˆ๋ ค ๋ Œ๋”๋ง ๋น„์šฉ๋ณด๋‹ค ํฐ ์„ฑ๋Šฅ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์œ ๋ฐœํ•˜๋Š” ์ด์œ ์™€ ์˜ฌ๋ฐ”๋ฅธ ์ ์šฉ ์กฐ๊ฑด [11, 12]. - -### Deeper Research Questions -- React Compiler๊ฐ€ ์ ์šฉ๋œ ํ™˜๊ฒฝ์—์„œ ๊ธฐ์กด `React.memo`, `useMemo`, `useCallback`์œผ๋กœ ์ž‘์„ฑ๋œ ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ์ฝ”๋“œ๋Š” ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๋ฆฌํŒฉํ† ๋ง๋˜๊ฑฐ๋‚˜ ๊ณต์กดํ•ด์•ผ ํ•˜๋Š”๊ฐ€? -- Context API๋ฅผ ๋‹ค์ˆ˜์˜ ์ž‘์€ ๋„๋ฉ”์ธ์œผ๋กœ ๋ถ„ํ• ํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜์™€ Zustand๋ฅผ ๋„์ž…ํ•˜์—ฌ ์„ ํƒ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜ ๊ฐ„์˜ ๋ Œ๋”๋ง ์„ฑ๋Šฅ ๋ฐ ์œ ์ง€๋ณด์ˆ˜์„ฑ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๋Š” ๋ฌด์—‡์ธ๊ฐ€? -- ๋Œ€๊ทœ๋ชจ ๋ฆฌ์ŠคํŠธ์—์„œ ์•ˆ์ •์ ์ธ `key` ์†์„ฑ ๋ถ€์—ฌ์™€ ๊ฐ€์ƒํ™”(Windowing) ๊ธฐ๋ฒ•์„ ํ•จ๊ป˜ ์ ์šฉํ•  ๋•Œ, DOM ๋…ธ๋“œ ๊ด€๋ฆฌ์™€ ๋ฉ”๋ชจ๋ฆฌ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ์ธก๋ฉด์—์„œ ๋‚ด๋ถ€์ ์œผ๋กœ ์–ด๋–ค ์ตœ์ ํ™”๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”๊ฐ€? -- JSX ๋‚ด ์ต๋ช… ํ•จ์ˆ˜ ์‚ฌ์šฉ์ด ์œ ๋ฐœํ•˜๋Š” ์ฐธ์กฐ ๋ณ€๊ฒฝ(Reference change) ๋ฌธ์ œ๋ฅผ `useCallback` ์™ธ์— ์ปดํฌ๋„ŒํŠธ ์™ธ๋ถ€ ์„ ์–ธ ๋ฐฉ์‹ ๋“ฑ์œผ๋กœ ํ•ด๊ฒฐํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์ƒํƒœ ์ ‘๊ทผ์„ฑ ์ œ์•ฝ์€ ์–ด๋–ป๊ฒŒ ๊ทน๋ณตํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? -- `useTransition`๊ณผ `useDeferredValue`๋ฅผ ํ™œ์šฉํ•œ ๋™์‹œ์„ฑ ๋ Œ๋”๋ง(Concurrent rendering)์ด ๋ฆฌ๋ Œ๋”๋ง์„ ์ฐจ๋‹จํ•˜์ง€ ์•Š๊ณ  ์ง€์—ฐ์‹œํ‚ฌ ๋•Œ, ๋ฌด๊ฑฐ์šด ์—ฐ์‚ฐ์ด ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋ฅผ ์ ์œ ํ•˜๋Š” ํ•œ๊ณ„๋Š” ์–ด๋–ป๊ฒŒ ๋ณด์™„ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? - -### Practical Application Contexts -- **Implementation:** ๋ฌด๊ฑฐ์šด ์ปดํฌ๋„ŒํŠธ๋‚˜ ์ž์‹์—๊ฒŒ ์ „๋‹ฌ๋˜๋Š” ํ•จ์ˆ˜/๊ฐ์ฒด prop์— ๋Œ€ํ•ด `React.memo()`, `useCallback`, `useMemo`๋ฅผ ์„ ํƒ์ ์œผ๋กœ ์ ์šฉํ•˜์—ฌ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค [7, 10]. ๋Œ€๊ทœ๋ชจ ๋ฆฌ์ŠคํŠธ ๊ตฌํ˜„ ์‹œ `react-window`๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค [6]. -- **System Design:** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ „์—ญ ์ƒํƒœ๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ, ํ…Œ๋งˆ๋‚˜ ๋‹ค๊ตญ์–ด์ฒ˜๋Ÿผ ๋ณ€๊ฒฝ์ด ์ ์€ ์ •์  ๋ฐ์ดํ„ฐ๋Š” Context API๋ฅผ, ์•Œ๋ฆผ์ด๋‚˜ ์žฅ๋ฐ”๊ตฌ๋‹ˆ์ฒ˜๋Ÿผ ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ณ€๊ฒฝ๋˜๋Š” ๋™์  ๋ฐ์ดํ„ฐ๋Š” ๋ถ€๋ถ„ ๊ตฌ๋…(Selector)์„ ์ง€์›ํ•˜๋Š” ์™ธ๋ถ€ ์ƒํƒœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(Zustand ๋“ฑ)๋กœ ์„ค๊ณ„ํ•˜์—ฌ ๋ Œ๋”๋ง ๋ฒ”์œ„๋ฅผ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค [18, 28, 29]. -- **Operation / Maintenance:** React DevTools Profiler, `why-did-you-render` ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, Chrome DevTools Performance Tab์„ ํ™œ์šฉํ•˜์—ฌ ํ”„๋กœ๋•์…˜ ๋ฐฐํฌ ์ „ ๋ฐ ์šด์˜ ์ค‘์— ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง๊ณผ ๊ทธ ์›์ธ์„ ์ง€์†์ ์œผ๋กœ ์ธก์ •ํ•˜๊ณ  ๊ฐœ์„ ํ•ฉ๋‹ˆ๋‹ค [30-32]. -- **Learning Path:** React์˜ ๊ธฐ๋ณธ ๋ Œ๋”๋ง ๋™์ž‘ ์›๋ฆฌ(์ƒํƒœ, props, ์ฐธ์กฐ ๋™๋“ฑ์„ฑ)๋ฅผ ๋จผ์ € ํ•™์Šตํ•˜๊ณ  ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์˜ ๋น„์šฉ์„ ์ดํ•ดํ•œ ๋’ค, ๋™์‹œ์„ฑ ๊ธฐ๋Šฅ(Concurrent Features)๊ณผ React Compiler๋ฅผ ํ†ตํ•œ ์ž๋™ํ™” ์ตœ์ ํ™” ํŒจ๋Ÿฌ๋‹ค์ž„์œผ๋กœ ์ง€์‹์„ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค [5]. -- **My Project Relevance:** ํ˜„์žฌ ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ฑฐ๋‚˜ ์ƒˆ๋กœ ๊ตฌ์ถ•ํ•˜๋Š” React ํ”„๋กœ์ ํŠธ์—์„œ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ๊ฒช๊ณ  ์žˆ๋‹ค๋ฉด, ์ต๋ช… ํ•จ์ˆ˜ ์ธ๋ผ์ธ ์ž‘์„ฑ ํŒจํ„ด์„ ์ˆ˜์ •ํ•˜๊ณ , ๋ถˆํ•„์š”ํ•œ ๊ฑฐ๋Œ€ Context๋ฅผ ๋ถ„๋ฆฌํ•˜๋ฉฐ, ์‹๋ณ„ ๊ฐ€๋Šฅํ•œ ๋ณ‘๋ชฉ ์ง€์ ์— ํ”„๋กœํŒŒ์ผ๋ง ๊ธฐ๋ฐ˜์˜ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์ ์šฉํ•ด ์ฆ‰๊ฐ์ ์ธ ์„ฑ๋Šฅ ๊ฐœ์„ ์„ ์ด๋ฃฐ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5, 15, 22]. - -### Adjacent Topics -- [[Core Web Vitals (INP, FCP, TTI)]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ํ”„๋ก ํŠธ์—”๋“œ ์ฝ”๋“œ์˜ ๋ฆฌ๋ Œ๋”๋ง ์ตœ์ ํ™”๊ฐ€ ์‹ค์ œ ์‚ฌ์šฉ์ž์˜ ์ฒด๊ฐ ์„ฑ๋Šฅ์„ ์ธก์ •ํ•˜๋Š” ์ง€ํ‘œ(ํŠนํžˆ Interaction to Next Paint)์— ๋ธŒ๋ผ์šฐ์ € ๋ ˆ๋ฒจ์—์„œ ์–ด๋–ค ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”์ง€ ํ™•์žฅํ•˜์—ฌ ์กฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค [2, 33]. -- [[Code Splitting & Lazy Loading]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ์ปดํฌ๋„ŒํŠธ ์—…๋ฐ์ดํŠธ ์‹œ์ (๋ฆฌ๋ Œ๋”๋ง)์˜ ์ตœ์ ํ™”๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ์ปดํฌ๋„ŒํŠธ ์ตœ์ดˆ ๋กœ๋“œ ์‹œ์ ์˜ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ค„์—ฌ ์ดˆ๊ธฐ ๋ Œ๋”๋ง ์„ฑ๋Šฅ์„ ๊ทน๋Œ€ํ™”ํ•˜๋Š” `React.lazy`์™€ ๋™์  ์ž„ํฌํŠธ ๊ธฐ๋ฒ•์„ ํ•จ๊ป˜ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค [34]. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/React 18 Concurrent Features.md b/00_Raw/React 18 Concurrent Features.md deleted file mode 100644 index a5c653e9..00000000 --- a/00_Raw/React 18 Concurrent Features.md +++ /dev/null @@ -1,50 +0,0 @@ -# [[React 18 Concurrent Features]] - -## ๐Ÿ“Œ Brief Summary -React 18 Concurrent Features(๋™์‹œ์„ฑ ๊ธฐ๋Šฅ)๋Š” ์—…๋ฐ์ดํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์‹œ์ ๊ณผ ๋ฐฉ์‹์„ ์ œ์–ดํ•˜์—ฌ ์‘๋‹ต์„ฑ์„ ํฌ์ƒํ•˜์ง€ ์•Š์œผ๋ฉด์„œ๋„ ๋” ๋งค๋„๋Ÿฌ์šด ์•ฑ์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ด๋‹ค [1]. ์ด ๋ Œ๋”๋ง ๋ชจ๋ธ์€ React๊ฐ€ ๋ Œ๋”๋ง ์ž‘์—…์„ ์ผ์‹œ ์ค‘์ง€(pause), ์ค‘๋‹จ(interrupt), ์žฌ๊ฐœ(resume)ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•˜์—ฌ ์ค‘์š”๋„์— ๋”ฐ๋ฅธ ์—…๋ฐ์ดํŠธ ์šฐ์„ ์ˆœ์œ„ ์ง€์ •์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค [2]. ๋Œ€ํ‘œ์ ์ธ ํ›…(Hook)์ธ `useTransition`๊ณผ `useDeferredValue`๋ฅผ ํ†ตํ•ด ๋А๋ฆฐ ๋ Œ๋”๋ง์ด ์ค‘์š”ํ•œ ์‚ฌ์šฉ์ž ์ƒํ˜ธ์ž‘์šฉ์„ ์ฐจ๋‹จํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค [3, 4]. - -## ๐Ÿ“– Core Content -* **๋™์‹œ์„ฑ ๋ Œ๋”๋ง์˜ ์›๋ฆฌ์™€ ์žฅ์ ** - ๋™์‹œ์„ฑ ๋ Œ๋”๋ง์€ ๋ฌด๊ฑฐ์šด ํ•„ํ„ฐ ์—…๋ฐ์ดํŠธ์™€ ๊ฐ™์€ ์ž‘์—…์€ ์ง€์—ฐ์‹œํ‚ค๋ฉด์„œ, ํด๋ฆญ์ด๋‚˜ ํƒ€์ดํ•‘ ๋“ฑ ์ค‘์š”ํ•˜๊ณ  ์ฆ‰๊ฐ์ ์ธ ์ƒํ˜ธ์ž‘์šฉ์„ ์šฐ์„ ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค [2]. ์ตœ์‹  ๋ฒ„์ „์˜ React์—์„œ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ˆ˜๋™์œผ๋กœ ํ™œ์„ฑํ™”ํ•  ํ•„์š” ์—†์ด ๊ธฐ๋ณธ ๋™์ž‘์œผ๋กœ ๋‚ด์žฅ๋˜์–ด ์ž‘๋™ํ•œ๋‹ค [2]. ์ด ๊ธฐ๋Šฅ์€ ์•ฑ์„ ์‹ค์ œ๋กœ ๋” ๋น ๋ฅด๊ฒŒ ๋งŒ๋“ ๋‹ค๊ธฐ๋ณด๋‹ค๋Š”, ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์ด ์ง„ํ–‰๋˜๋Š” ๋™์•ˆ UI์˜ ์‘๋‹ต์„ฑ์„ ์œ ์ง€ํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ๋А๋ผ๋Š” ์ฒด๊ฐ ์†๋„(perceived speed)๋ฅผ ์šฐ์„ ์‹œํ•œ๋‹ค [4]. -* **`useTransition` (UX ์‘๋‹ต์„ฑ ์šฐ์„ ์ˆœ์œ„ ์ง€์ •)** - ์ด ํ›…์€ ํŠน์ • ์—…๋ฐ์ดํŠธ๋ฅผ '๋น„๊ธด๊ธ‰(non-urgent)'์œผ๋กœ ํ‘œ์‹œํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค [3]. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ผ์ด๋ธŒ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋‚˜ ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ๋ฅผ ํ•„ํ„ฐ๋งํ•  ๋•Œ, ๋ Œ๋”๋ง ์ฒ˜๋ฆฌ๊ฐ€ ๋А๋ ค์ง€๋”๋ผ๋„ ์‚ฌ์šฉ์ž์˜ ํƒ€์ดํ•‘์ด๋‚˜ ํด๋ฆญ ๊ฐ™์€ ์ค‘์š”ํ•œ ์ƒํ˜ธ์ž‘์šฉ์ด ์ฐจ๋‹จ๋˜์ง€ ์•Š๋Š”๋‹ค [3]. ์ฒ˜๋ฆฌ ๋Œ€๊ธฐ ์ค‘์ธ ์ƒํƒœ(`isPending`)๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ Œ๋”๋ง์„ ์ฐจ๋‹จํ•˜์ง€ ์•Š๊ณ  ๋กœ๋”ฉ ์Šคํ”ผ๋„ˆ๋‚˜ ์Šค์ผˆ๋ ˆํ†ค ์ƒํƒœ๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๋‹ค [3]. -* **`useDeferredValue` (ํŒŒ์ƒ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์ง€์—ฐ)** - `useTransition`์ด ์—…๋ฐ์ดํŠธ๊ฐ€ ํŠธ๋ฆฌ๊ฑฐ๋˜๋Š” ์‹œ์ ์„ ์ œ์–ดํ•œ๋‹ค๋ฉด, `useDeferredValue`๋Š” ๋ฌด๊ฑฐ์šด ๊ฐ’์„ '์ฝ๋Š”(read)' ์‹œ์ ์„ ์ œ์–ดํ•œ๋‹ค [4]. ์‚ฌ์šฉ์ž์˜ ํƒ€์ดํ•‘๊ณผ ๊ฐ™์€ UI ๋ณ€๊ฒฝ์€ ์ฆ‰๊ฐ์ ์œผ๋กœ ๋ฐ˜์˜ํ•˜๋˜, ํŒŒ์ƒ๋œ ๋ฌด๊ฑฐ์šด ์—ฐ์‚ฐ์ด๋‚˜ ํ•„ํ„ฐ๋ง ๋กœ์ง์€ ์•ฝ๊ฐ„ ์ง€์—ฐ์‹œ์ผœ ์ ์šฉํ•ด์•ผ ํ•  ๋•Œ ์ด์ƒ์ ์ธ ๋ฐฉ๋ฒ•์ด๋‹ค [4]. ์ฃผ๋กœ ๊ฒ€์ƒ‰ ์ƒ์ž, Typeahead ์ž…๋ ฅ๊ธฐ, ์‹ค์‹œ๊ฐ„ ํผ ๋“ฑ์—์„œ ๋Š๊น€ ํ˜„์ƒ(jank)์„ ์ค„์ด๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค [4]. -* **๋ชจ๋ฒ” ์‚ฌ๋ก€ ๋ฐ ํ”„๋ ˆ์ž„์›Œํฌ ์ƒํƒœ๊ณ„ ์ง€์›** - ๋™์‹œ์„ฑ ๊ธฐ๋Šฅ์€ ์•ฑ์˜ ๋ชจ๋“  ๊ณณ์ด ์•„๋‹Œ '์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ๋ทฐ'์— ํ•œ์ •ํ•˜์—ฌ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค [4]. ๋ฐ์ดํ„ฐ๊ฐ€ ๋กœ๋“œ๋˜๋Š” ๋™์•ˆ ๋Œ€์ฒด UI๋ฅผ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด `Suspense`์™€ ๊ฒฐํ•ฉํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋˜๋ฉฐ, ๊ตฌํ˜• ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜ ๋ Œ๋”๋ง์„ ์ฐจ๋‹จํ•˜๋Š” ์•ˆํ‹ฐ ํŒจํ„ด๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ํ”ผํ•ด์•ผ ํ•œ๋‹ค [4]. 2025๋…„ ๊ธฐ์ค€ Next.js(App Router), Remix, Vite ๊ธฐ๋ฐ˜ ํ™˜๊ฒฝ ๋“ฑ ๋Œ€๋‹ค์ˆ˜์˜ ํ’€์Šคํƒ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๋™์‹œ์„ฑ ๋ Œ๋”๋ง์„ ๊ธฐ๋ณธ์ ์œผ๋กœ ์—ฐ๋™ํ•˜๊ณ  ์ง€์›ํ•œ๋‹ค [5]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts -- [[useTransition]] - - ์—ฐ๊ฒฐ ์ด์œ : React 18 ๋™์‹œ์„ฑ ๊ธฐ๋Šฅ์˜ ํ•ต์‹ฌ ํ›…์œผ๋กœ, ๋น„๊ธด๊ธ‰ ์—…๋ฐ์ดํŠธ๋ฅผ ์ง€์—ฐ์‹œํ‚ค๋Š” ๊ตฌ์ฒด์ ์ธ ๊ตฌํ˜„์ฒด์ด๋‹ค [3]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ผ์ด๋ธŒ ๊ฒ€์ƒ‰์ด๋‚˜ ํ•„ํ„ฐ๋ง ์‹œ ๋ Œ๋”๋ง ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ๋ฐฉ์ง€ํ•˜๊ณ , ์–ด๋–ป๊ฒŒ ๋น„๊ธด๊ธ‰ ์ž‘์—…๊ณผ ๊ธด๊ธ‰ ์ƒํ˜ธ์ž‘์šฉ(ํƒ€์ดํ•‘ ๋“ฑ)์„ ๋ถ„๋ฆฌํ•˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค [3]. -- [[useDeferredValue]] - - ์—ฐ๊ฒฐ ์ด์œ : ๊ฐ’์˜ ์ฝ๊ธฐ๋ฅผ ์ง€์—ฐ์‹œ์ผœ UI ์—…๋ฐ์ดํŠธ์™€ ์—ฐ์‚ฐ ๋ถ€ํ•˜๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ๋™์‹œ์„ฑ ๊ธฐ๋Šฅ์˜ ๋˜ ๋‹ค๋ฅธ ํ•ต์‹ฌ ํ›…์ด๋‹ค [4]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ฆ‰๊ฐ์ ์ธ UI ๋ฐ˜์˜์ด ํ•„์š”ํ•œ ๋ถ€๋ถ„๊ณผ ์ง€์—ฐ์‹œ์ผœ๋„ ๋ฌด๋ฐฉํ•œ ๋ฌด๊ฑฐ์šด ๊ณ„์‚ฐ(derived data)์„ ์–ด๋–ป๊ฒŒ ๋‚˜๋ˆ„์–ด ์ฒ˜๋ฆฌํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค [4]. -- [[Suspense]] - - ์—ฐ๊ฒฐ ์ด์œ : ๋™์‹œ์„ฑ ํ›…(`useTransition` ๋“ฑ)๊ณผ ๊ฒฐํ•ฉํ•˜์—ฌ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ๋ Œ๋”๋ง์ด ์ง„ํ–‰๋˜๊ฑฐ๋‚˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋กœ๋“œ๋  ๋•Œ ์Šค์ผˆ๋ ˆํ†ค(fallback UI)์„ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋œ ๊ธฐ๋Šฅ์ด๋‹ค [4]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ง€์—ฐ ์ค‘์ธ ๋ Œ๋”๋ง ์ƒํƒœ์—์„œ ์‚ฌ์šฉ์ž์˜ ๊ฒฝํ—˜(UX)์„ ์–ด๋–ป๊ฒŒ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ์ด์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค [4]. - -### Deeper Research Questions -- `useTransition`๊ณผ `useDeferredValue`๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ React ๋‚ด๋ถ€์ ์œผ๋กœ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์˜ ์œ ํœด ์‹œ๊ฐ„(idle time)์„ ์–ด๋–ป๊ฒŒ ํŒ๋‹จํ•˜์—ฌ ์ž‘์—…์„ ์ค‘๋‹จ ๋ฐ ์žฌ๊ฐœํ•˜๋Š”๊ฐ€? -- ๊ตฌํ˜• ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜ ํด๋ž˜์Šค ๊ธฐ๋ฐ˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋™์‹œ์„ฑ ๊ธฐ๋Šฅ๊ณผ ํ˜ผ์šฉํ–ˆ์„ ๋•Œ ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ค ๋ Œ๋”๋ง ์ฐจ๋‹จ ์ถฉ๋Œ์ด๋‚˜ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”๊ฐ€? -- ๋™์‹œ์„ฑ ๋ Œ๋”๋ง์„ ์ ์šฉํ–ˆ์„ ๋•Œ Interaction to Next Paint (INP)๋‚˜ Total Blocking Time (TBT)๊ณผ ๊ฐ™์€ Core Web Vitals ์ง€ํ‘œ๊ฐ€ ์ˆ˜์น˜์ƒ์œผ๋กœ ์–ด๋–ป๊ฒŒ ๋ณ€ํ™”ํ•˜๋Š”๊ฐ€? -- Next.js์˜ App Router์™€ ๊ฒฐํ•ฉ๋œ ๋™์‹œ์„ฑ ๋ Œ๋”๋ง์—์„œ, ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ(Server Components)์™€ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ ๊ฐ„์˜ ๋ Œ๋”๋ง ์šฐ์„ ์ˆœ์œ„๋Š” ์–ด๋–ป๊ฒŒ ๊ด€๋ฆฌ๋˜๋Š”๊ฐ€? -- `isPending` ์†์„ฑ์„ ํ™œ์šฉํ•ด ๋Œ€์ฒด UI(์Šค์ผˆ๋ ˆํ†ค, ์Šคํ”ผ๋„ˆ)๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ์‹œ๊ฐ์  ๊นœ๋นก์ž„์„ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•œ ์ด์ƒ์ ์ธ ์ง€์—ฐ ์‹œ๊ฐ„ ์„ค๊ณ„ ํŒจํ„ด์€ ๋ฌด์—‡์ธ๊ฐ€? - -### Practical Application Contexts -- **Implementation:** ๋ผ์ด๋ธŒ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ๋ Œ๋”๋ง์ด๋‚˜ ์ˆ˜์ฒœ ๊ฐœ์˜ ํ•ญ๋ชฉ์ด ์žˆ๋Š” ๋ฐ์ดํ„ฐ ๋ชฉ๋ก์„ ํ•„ํ„ฐ๋งํ•  ๋•Œ `useTransition`์„ ๋„์ž…ํ•˜์—ฌ ์ž…๋ ฅ์ฐฝ์˜ ์ž…๋ ฅ์ด ์ง€์—ฐ๋˜์ง€ ์•Š๋„๋ก ๊ตฌํ˜„ํ•œ๋‹ค [3]. -- **System Design:** ๊ฒ€์ƒ‰ ์ƒ์ž, Typeahead ์ž…๋ ฅ๊ธฐ, ๋˜๋Š” ์‹ค์‹œ๊ฐ„ ํผ์„ ์„ค๊ณ„ํ•  ๋•Œ ์ฆ‰๊ฐ์ ์ธ ์ž…๋ ฅ ๋ Œ๋”๋ง๊ณผ ์—ฐ์‚ฐ์ด ๋ฌด๊ฑฐ์šด ๋ฐ์ดํ„ฐ ๋ Œ๋”๋ง ๊ฐ„์˜ ์˜ํ–ฅ์„ ์ฐจ๋‹จํ•˜๊ธฐ ์œ„ํ•ด `useDeferredValue` ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋„์ž…ํ•œ๋‹ค [4]. -- **Operation / Maintenance:** Chrome DevTools์˜ Performance ํƒญ๊ณผ Web Vitals ์ง€ํ‘œ๋ฅผ ํ†ตํ•ด ๊ธด ์ž‘์—…(Long tasks)์ด ๋™์‹œ์„ฑ ๋ Œ๋”๋ง ๋•๋ถ„์— ์„ฑ๊ณต์ ์œผ๋กœ ์ชผ๊ฐœ์ ธ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ ์ฐจ๋‹จ์„ ์ค„์˜€๋Š”์ง€ ์ง€์†์ ์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋งํ•œ๋‹ค [6, 7]. -- **Learning Path:** React์˜ ๊ธฐ๋ณธ ๋ Œ๋”๋ง ๋ชจ๋ธ(props ๋ฐ state ๋ณ€๊ฒฝ์— ๋”ฐ๋ฅธ ๋ฆฌ๋ Œ๋”๋ง ํŠธ๋ฆฌ๊ฑฐ)์„ ๋ช…ํ™•ํžˆ ์ดํ•ดํ•œ ๋‹ค์Œ, ๋™์‹œ์„ฑ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ์ด๋Ÿฌํ•œ ๋ Œ๋”๋ง ์‚ฌ์ดํด์ด ์–ด๋–ป๊ฒŒ ์ผ์‹œ ์ค‘์ง€๋˜๊ณ  ์žฌ๊ฐœ๋  ์ˆ˜ ์žˆ๋Š”์ง€ ํ•™์Šต์„ ํ™•์žฅํ•œ๋‹ค [2, 8]. -- **My Project Relevance:** ํ˜„์žฌ ์ง„ํ–‰ ์ค‘์ธ ํ”„๋กœ์ ํŠธ์—์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์€ ์ฐจํŠธ๋‚˜ ํ…Œ์ด๋ธ” ํ•„ํ„ฐ๋ง ์‹œ UI๊ฐ€ ๋Š๊ธฐ๋Š”(Jank) ํ˜„์ƒ์ด ์žˆ๋‹ค๋ฉด, ์ด ๋™์‹œ์„ฑ ๊ธฐ๋Šฅ ํ›…์„ ๋„์ž…ํ•˜์—ฌ ์ฆ‰๊ฐ์ ์ธ ํด๋ฆญ/์ž…๋ ฅ ์‘๋‹ต์„ฑ์„ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ๋‹ค [3, 4]. - -### Adjacent Topics -- [[React Performance Optimization]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋™์‹œ์„ฑ ๋ Œ๋”๋ง ์™ธ์—๋„ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง ์ž์ฒด๋ฅผ ๋ง‰๋Š” `React.memo`, `useCallback`, `useMemo` ํ™œ์šฉ๋ฒ•๊ณผ ๊ฐ™์€ ๋‹ค์–‘ํ•œ React ์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ธฐ๋ฒ• ์ „๋ฐ˜์œผ๋กœ ์ง€์‹์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋‹ค [9-11]. -- [[Server Components]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: Next.js์—์„œ ๋™์‹œ์„ฑ ๊ธฐ๋Šฅ๊ณผ ํ•จ๊ป˜ ์„ฑ๋Šฅ ํ–ฅ์ƒ์˜ ์–‘๋Œ€ ์ถ•์„ ์ด๋ฃจ๋Š” ๊ธฐ๋Šฅ์œผ๋กœ, ํด๋ผ์ด์–ธํŠธ ์ธก JavaScript๋ฅผ ์ „์†กํ•˜์ง€ ์•Š๊ณ  ์„œ๋ฒ„์—์„œ ๋ Œ๋”๋ง์„ ์™„๋ฃŒํ•˜์—ฌ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ค„์ด๋Š” ์ „๋žต์„ ํ•™์Šตํ•  ์ˆ˜ ์žˆ๋‹ค [12, 13]. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/React App Prototypes and Startups.md b/00_Raw/React App Prototypes and Startups.md deleted file mode 100644 index 6d240716..00000000 --- a/00_Raw/React App Prototypes and Startups.md +++ /dev/null @@ -1,57 +0,0 @@ -# [[React App Prototypes and Startups]] - -## ๐Ÿ“Œ Brief ์‹ Summary -React ์•ฑ ํ”„๋กœํ† ํƒ€์ž… ๋ฐ ์Šคํƒ€ํŠธ์—… ํ™˜๊ฒฝ์—์„œ์˜ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์€ ์‹œ์žฅ์— ๋น ๋ฅด๊ฒŒ ์ตœ์†Œ ๊ธฐ๋Šฅ ์ œํ’ˆ(MVP)์„ ์ถœ์‹œํ•˜๋ฉด์„œ๋„ ํ–ฅํ›„ ํ™•์žฅ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ์œ ์—ฐ์„ฑ๊ณผ ๋‹จ์ˆœ์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค [1, 2]. ์Šคํƒ€ํŠธ์—… ํ”„๋กœ์ ํŠธ๋Š” ์š”๊ตฌ์‚ฌํ•ญ์ด ์ž์ฃผ ๋ณ€๊ฒฝ๋˜๋ฏ€๋กœ ์ดˆ๊ธฐ๋ถ€ํ„ฐ ๊ณผ๋„ํ•œ ์—”์ง€๋‹ˆ์–ด๋ง์ด๋‚˜ ๋ฌด๊ฑฐ์šด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋„์ž…์„ ํ”ผํ•˜๊ณ  ํ•„์š”ํ•œ ๊ธฐ๋Šฅ๋งŒ ๊ตฌํ˜„ํ•˜๋Š” ์ ‘๊ทผ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค [3-5]. ์ดˆ๊ธฐ ํ”„๋กœํ† ํƒ€์ž… ๋‹จ๊ณ„์—์„œ๋Š” ๊ฐ€๋ฒผ์šด ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ์™€ ๋‹จ์ˆœํ•œ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น ๋ฅธ ๊ฐœ๋ฐœ ์†๋„๋ฅผ ํ™•๋ณดํ•˜๊ณ , ์ œํ’ˆ์ด ์„ฑ๊ณตํ•˜์—ฌ ๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ ๋•Œ ์ ์ง„์ ์œผ๋กœ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ณ ๋„ํ™”ํ•˜๋Š” ์ „๋žต์ด ์œ ํšจํ•ฉ๋‹ˆ๋‹ค [2, 4, 6]. - -## ๐Ÿ“– Core Content -- **์ดˆ๊ธฐ ์ƒํƒœ ๊ด€๋ฆฌ ์ „๋žต (State Management for MVPs):** ์Šคํƒ€ํŠธ์—…์ด๋‚˜ ํ”„๋กœํ† ํƒ€์ž… ์ œ์ž‘ ์‹œ ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ์˜ ์„ ํƒ์€ ๊ฐœ๋ฐœ ์†๋„์— ํฐ ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค. ์ˆœ์ˆ˜ React Context API๋Š” ์ดˆ๊ธฐ ์„ค์ •์ด ๋น ๋ฅด๊ณ  ์™ธ๋ถ€ ์˜์กด์„ฑ์ด ์—†์–ด ๊ทน์ดˆ๊ธฐ ํ”„๋กœํ† ํƒ€์ž…์— ์œ ๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋‚˜, ๊ทœ๋ชจ๊ฐ€ ์ปค์ง€๋ฉด ๋ Œ๋”๋ง ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [6, 7]. ์Šคํƒ€ํŠธ์—…์— ๊ฐ€์žฅ ์ถ”์ฒœ๋˜๋Š” ๋„๊ตฌ๋Š” **Zustand**์ž…๋‹ˆ๋‹ค. ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ๊ฐ€ ์ ์–ด ์ˆ˜์ฃผ ๋‚ด์— ์ œํ’ˆ์„ ์ถœ์‹œํ•  ์ˆ˜ ์žˆ๋Š” ๋น ๋ฅธ ๊ฐœ๋ฐœ ์†๋„๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ, ์ดํ›„ ์ œํ’ˆ์ด ์„ฑ๊ณตํ•˜์—ฌ ํ™•์žฅ๋  ๋•Œ๋„ ๋ฌด๋ฆฌ ์—†์ด ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์ ์˜ ์†”๋ฃจ์…˜("Goldilocks solution")์ž…๋‹ˆ๋‹ค [1, 2, 8]. ๋ฐ˜๋ฉด Redux๋Š” ์ดˆ๊ธฐ ๊ตฌ์กฐ ์„ค์ •์— ์‹œ๊ฐ„์ด ๋งŽ์ด ๋“ค์–ด ํ”„๋กœํ† ํƒ€์ž…์—๋Š” ๊ณผ๋„(overkill)ํ•˜๋ฉฐ ์ถœ์‹œ๋ฅผ ์ง€์—ฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3, 4]. -- **๋‹จ์ˆœํ•œ ๊ตฌ์กฐ์™€ YAGNI ์›์น™ ์ ์šฉ:** ์Šคํƒ€ํŠธ์—… ํ”„๋กœ์ ํŠธ๋Š” ์š”๊ตฌ์‚ฌํ•ญ์ด ๋Š์ž„์—†์ด ๋ณ€ํ™”ํ•˜๋Š” ํ™˜๊ฒฝ์ž…๋‹ˆ๋‹ค [5]. ๋”ฐ๋ผ์„œ "You Aren't Gonna Need It"(YAGNI) ์›์น™์„ ์ ์šฉํ•˜์—ฌ ํ˜„์žฌ ๋‹น์žฅ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ๋งŒ ๊ตฌํ˜„ํ•˜๊ณ , ๋ฏธ๋ž˜๋ฅผ ์œ„ํ•ด ๋ฏธ๋ฆฌ ๋ณต์žกํ•œ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค [5]. ๋˜ํ•œ ์†Œ๊ทœ๋ชจ ํ”„๋กœํ† ํƒ€์ž…์˜ ๊ฒฝ์šฐ, ๊ธฐ์ˆ ์  ํŒŒ์ผ ์œ ํ˜• ๊ธฐ๋ฐ˜(Flat Structure ๋“ฑ) ํด๋” ๊ตฌ์กฐ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ์ง๊ด€์ ์ด๊ณ  ๋น ๋ฅด์ง€๋งŒ [9], ๊ธฐ๋Šฅ์ด ํ™•์žฅ๋  ๊ฒฝ์šฐ ๋„๋ฉ”์ธ์ด๋‚˜ ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜(Feature-based) ๊ตฌ์กฐ๋กœ ์ „ํ™˜ํ•˜์—ฌ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ํ™•๋ณดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [10, 11]. -- **์ดˆ๊ธฐ ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ๋กœ๊น… ๊ตฌ์ถ•:** ์ž๊ธˆ์ด ์ œํ•œ์ ์ธ ์Šคํƒ€ํŠธ์—…์˜ ๊ฒฝ์šฐ, Sentry์˜ ๋ฌด๋ฃŒ ํ‹ฐ์–ด(์›” 5๋งŒ ๊ฑด ์˜ค๋ฅ˜ ๋“ฑ)๋‚˜ SigNoz Cloud(์›” $49 ์‹œ์ž‘ ๋“ฑ)์™€ ๊ฐ™์ด ๊ธฐ๋ณธ ๊ธฐ๋Šฅ์ด ์ถฉ์‹คํ•˜๊ณ  ๋น„์šฉ ํšจ์œจ์ ์ธ ํ”„๋ก ํŠธ์—”๋“œ ๋กœ๊น… ๋„๊ตฌ๋ฅผ ์ดˆ๊ธฐ๋ถ€ํ„ฐ ๋„์ž…ํ•˜์—ฌ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์˜ ์ด์Šˆ๋ฅผ ์„ ์ œ์ ์œผ๋กœ ํŒŒ์•…ํ•˜๋ฉฐ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค [12-14]. - -## โš–๏ธ Trade-offs & Caveats -- **๋น ๋ฅธ ๊ฐœ๋ฐœ vs. ๊ธฐ์ˆ  ๋ถ€์ฑ„ (Technical Debt):** ์ดˆ๊ธฐ ํ”„๋กœํ† ํƒ€์ž…์˜ ๊ฐœ๋ฐœ ์†๋„๋ฅผ ๋†’์ด๊ธฐ ์œ„ํ•ด '๋‹จ์ˆœํ•จ'์—๋งŒ ์น˜์ค‘ํ•˜์—ฌ ์•„ํ‚คํ…์ฒ˜ ๊ทœ์น™ ์—†์ด ์ž„์˜์˜ ์œ„์น˜์— ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•˜๋ฉฐ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด, ๋‹จ๊ธฐ์ ์œผ๋กœ๋Š” ๋น ๋ฅผ ์ˆ˜ ์žˆ์œผ๋‚˜ ํ–ฅํ›„ ์ŠคํŒŒ๊ฒŒํ‹ฐ ์ฝ”๋“œ๊ฐ€ ๋˜์–ด ์œ ์ง€๋ณด์ˆ˜์™€ ํ™•์žฅ์— ๊ทน์‹ฌํ•œ ์–ด๋ ค์›€์„ ๊ฒช๋Š” ๊ธฐ์ˆ  ๋ถ€์ฑ„๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [15, 16]. -- **Context API์˜ ํ•œ๊ณ„์™€ ๋ฆฌ๋ Œ๋”๋ง ๋น„์šฉ:** "Zero dependency"๋ผ๋Š” ์žฅ์  ๋•Œ๋ฌธ์— ํ”„๋กœํ† ํƒ€์ž… ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ์— Context API๋ฅผ ์„ฃ๋ถˆ๋ฆฌ ๋„์ž…ํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ๋‚˜ ์ƒํƒœ ๋ณ€๊ฒฝ์ด ์žฆ์•„์งˆ ๊ฒฝ์šฐ, ํ•ด๋‹น Context๋ฅผ ๊ตฌ๋…ํ•˜๋Š” ๋ชจ๋“  ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง ํญํ’(re-render storm)์ด ๋ฐœ์ƒํ•ด ๋Œ€์‹œ๋ณด๋“œ๊ฐ€ ๋ฉˆ์ถ”๋Š” ๋“ฑ ์‹ฌ๊ฐํ•œ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [6, 7, 17]. -- **์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ ์ด์ „์˜ ์œ„ํ—˜์„ฑ:** MVP๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ์ถœ์‹œํ•œ ์ดํ›„ ์Šค์ผ€์ผ์—…(50~500๋ช… ๊ทœ๋ชจ) ๋‹จ๊ณ„์— ๋„๋‹ฌํ–ˆ์„ ๋•Œ, Zustand์—์„œ Redux ๋“ฑ ์—„๊ฒฉํ•œ ํŒจํ„ด์˜ ๋„๊ตฌ๋กœ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ๊ณ ํ†ต์Šค๋Ÿฝ๊ณ (Painful) ํฐ ์œ„ํ—˜์ด ๋”ฐ๋ฆ…๋‹ˆ๋‹ค [2, 18]. ๋„ˆ๋ฌด ์ด๋ฅธ ์ตœ์ ํ™”๋Š” ๋…์ด ๋˜์ง€๋งŒ, ์ „ํ™˜ ํƒ€์ด๋ฐ(window)์„ ๋†“์น˜๋ฉด ๋ฆฌํŒฉํ† ๋ง ๋น„์šฉ์ด ๊ฑท์žก์„ ์ˆ˜ ์—†์ด ์ปค์ง‘๋‹ˆ๋‹ค [2, 19]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -#### [์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] -- [[Context API]] - - ์—ฐ๊ฒฐ ์ด์œ : ๊ฐ€์žฅ ๋น ๋ฅด๊ณ  ์ถ”๊ฐ€ ์˜์กด์„ฑ ์—†์ด ํ”„๋กœํ† ํƒ€์ž…์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ณธ ๋„๊ตฌ์ด์ง€๋งŒ, ๋นˆ๋ฒˆํ•œ ์ƒํƒœ ๋ณ€๊ฒฝ ์‹œ ์Šค์ผ€์ผ์—…์˜ ๋ณ‘๋ชฉ์ด ๋˜๋Š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค [6, 7]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ตฌ๋… ์ค‘์ธ ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง๋˜๋Š” ๋ฌธ์ œ์™€, ์™œ ์ค‘๋Œ€ํ˜• ์•ฑ์—์„œ ๋ณ„๋„์˜ ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ๊ฐ€ ํ•„์š”ํ•œ์ง€ ๊ทผ๋ณธ์ ์ธ ์ด์œ ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [7, 20]. -- [[YAGNI Principle]] - - ์—ฐ๊ฒฐ ์ด์œ : ์š”๊ตฌ์‚ฌํ•ญ์ด ์ˆ˜์‹œ๋กœ ๋ณ€ํ•˜๋Š” ์Šคํƒ€ํŠธ์—… ํ™˜๊ฒฝ์—์„œ ๊ฐœ๋ฐœ ๋‚ญ๋น„๋ฅผ ๋ง‰๊ณ  ๋ฏผ์ฒฉ์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ํ•ต์‹ฌ ์†Œํ”„ํŠธ์›จ์–ด ์„ค๊ณ„ ์›์น™์ž…๋‹ˆ๋‹ค [5]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ดˆ๊ธฐ ํ”„๋กœํ† ํƒ€์ž… ๊ฐœ๋ฐœ ์‹œ ์˜ค๋ฒ„์—”์ง€๋‹ˆ์–ด๋ง์„ ํ”ผํ•˜๊ณ  ํ˜„์žฌ ํ•„์š”ํ•œ ์ตœ์†Œ ๊ธฐ๋Šฅ๋งŒ ์„ค๊ณ„ํ•˜๋Š” ํด๋ฆฐ ์ฝ”๋“œ ์ฒ ํ•™์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5, 21]. - -#### [๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ] -- [[Zustand]] - - ์—ฐ๊ฒฐ ์ด์œ : ์Šคํƒ€ํŠธ์—…๊ณผ MVP ๊ฐœ๋ฐœ์—์„œ ๋น ๋ฅธ ๊ฐœ๋ฐœ ์†๋„๋ฅผ ์ฑ™๊ธฐ๋ฉด์„œ๋„ ํ–ฅํ›„ ์•ฑ ํ™•์žฅ์— ์œ ์—ฐํ•˜๊ฒŒ ๋Œ€์ฒ˜ํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์ ์˜ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์ ๊ทน ์ถ”์ฒœ๋ฉ๋‹ˆ๋‹ค [1, 2, 8]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์—†์ด๋„ ์„ ํƒ์ž(Selector) ํŒจํ„ด์„ ํ†ตํ•ด ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง์„ ๋ฐฉ์ง€ํ•˜๋Š” ์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1, 22]. - -### Deeper Research Questions - -- ์Šคํƒ€ํŠธ์—…์—์„œ Zustand๋กœ MVP๋ฅผ ๊ตฌ์ถ•ํ•œ ์ดํ›„, ์•ฑ์˜ ๊ทœ๋ชจ๊ฐ€ ์ปค์ง์— ๋”ฐ๋ผ Redux๋‚˜ ๋” ์—„๊ฒฉํ•œ ์•„ํ‚คํ…์ฒ˜๋กœ ์ „ํ™˜ํ•ด์•ผ ํ•˜๋Š” ์ •ํ™•ํ•œ ์‹œ์ (Window)๊ณผ ๊ธฐ์ˆ ์  ํ•œ๊ณ„ ์ง€ํ‘œ๋Š” ๋ฌด์—‡์ธ๊ฐ€? -- ๊ทน์ดˆ๊ธฐ ํ”„๋กœํ† ํƒ€์ž… ๊ฐœ๋ฐœ ๋‹จ๊ณ„์—์„œ Flat Structure ๋“ฑ ๋‹จ์ˆœํ•œ ํด๋” ๊ตฌ์กฐ๋ฅผ ์ฑ„ํƒํ–ˆ์„ ๋•Œ, ํ–ฅํ›„ Feature-based ๊ตฌ์กฐ๋กœ ๋ฆฌํŒฉํ† ๋งํ•˜๊ธฐ ๊ฐ€์žฅ ์šฉ์ดํ•˜๊ฒŒ ์ฝ”๋“œ๋ฅผ ๊ฒฐํ•ฉ(Coupling)ํ•˜์ง€ ์•Š๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? -- ํ•œ์ •๋œ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฐ€์ง„ ์Šคํƒ€ํŠธ์—…์ด Sentry์™€ ๊ฐ™์€ ์—๋Ÿฌ ํŠธ๋ž˜ํ‚น ๋„๊ตฌ๋ฅผ ๋„์ž…ํ•  ๋•Œ, ๋น„์šฉ(๋ฌด๋ฃŒ ํ‹ฐ์–ด ํ•œ๋„ ๋“ฑ) ์ดˆ๊ณผ๋ฅผ ๋ง‰์œผ๋ฉด์„œ๋„ ์น˜๋ช…์ ์ธ ํฌ๋ž˜์‹œ๋ฅผ ๋†“์น˜์ง€ ์•Š๊ธฐ ์œ„ํ•œ Error Boundary์˜ ์ „๋žต์  ๋ฐฐ์น˜ ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? -- MVP ๊ฐœ๋ฐœ์—์„œ YAGNI ์›์น™์„ ์ ์šฉํ•˜์—ฌ ๊ธฐ๋Šฅ ํ™•์žฅ์„ ์–ต์ œํ•˜๋ฉด์„œ๋„, ์ปดํฌ๋„ŒํŠธ์˜ ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP) ๊ฐ™์€ ์ตœ์†Œํ•œ์˜ SOLID ์›์น™์„ ์œ„๋ฐฐํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด ์–ด๋–ค ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๊ธฐ์ค€์ด ํ•„์š”ํ•œ๊ฐ€? -- React Context API๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœํ•œ ํ”„๋กœํ† ํƒ€์ž… ๋Œ€์‹œ๋ณด๋“œ์—์„œ ๋ฆฌ๋ Œ๋”๋ง ํญํ’(Re-render storm)์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ, ์ด๋ฅผ Zustand๋กœ ์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜(Incremental Migration)ํ•˜๋Š” ๊ฐ€์žฅ ์•ˆ์ „ํ•œ ๋‹จ๊ณ„๋ณ„ ์ ˆ์ฐจ๋Š” ๋ฌด์—‡์ธ๊ฐ€? - -### Practical Application Contexts - -- **Implementation:** ์Šคํƒ€ํŠธ์—… ์ดˆ๊ธฐ MVP ๊ฐœ๋ฐœ ์‹œ, ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ๊ฐ€ ๋งŽ์€ Redux ๋Œ€์‹  Zustand๋ฅผ ๋„์ž…ํ•˜์—ฌ ๋‹จ๊ธฐ๊ฐ„ ๋‚ด์— ํ•ต์‹ฌ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ณ  ์ œํ’ˆ ์ถœ์‹œ ์†๋„๋ฅผ ๊ทน๋Œ€ํ™”ํ•ฉ๋‹ˆ๋‹ค [2, 4]. -- **System Design:** ์‹œ์Šคํ…œ ์„ค๊ณ„ ์ดˆ๊ธฐ์—๋Š” YAGNI ์›์น™์„ ๋”ฐ๋ผ ๋‹น์žฅ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ๊ณผ ์ƒํƒœ ๊ตฌ์กฐ๋งŒ ์„ค๊ณ„ํ•˜๊ณ , ๋ฏธ๋ž˜๋ฅผ ๋Œ€๋น„ํ•œ ๋ถˆํ•„์š”ํ•œ ์ถ”์ƒํ™”๋‚˜ ๊ณผ๋„ํ•œ ์ „์—ญ ์ƒํƒœ ์ƒ์„ฑ์„ ์ง€์–‘ํ•ฉ๋‹ˆ๋‹ค [5, 21]. -- **Operation / Maintenance:** ํ”„๋กœํ† ํƒ€์ž… ํ”„๋กœ๋•์…˜ ๋ฐฐํฌ ์งํ›„, Sentry์™€ ๊ฐ™์€ ํด๋ผ์šฐ๋“œ ๋กœ๊น… ๋„๊ตฌ๋ฅผ ์„ค์ •ํ•˜์—ฌ ์‚ฌ์šฉ์ž ํ™˜๊ฒฝ์—์„œ ๋ฐœ์ƒํ•˜๋Š” JavaScript ์˜ˆ์™ธ์™€ ํฌ๋ž˜์‹œ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ  ๋ฌธ์ œ๋ฅผ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค [23, 24]. -- **Learning Path:** React ์ž…๋ฌธ ์‹œ Context API๋ฅผ ํ†ตํ•ด ์ „์—ญ ์ƒํƒœ์˜ ๊ธฐ๋ณธ์„ ํ•™์Šตํ•œ ํ›„, ํ”„๋กœํ† ํƒ€์ž…์„ ํ™•์žฅํ•˜๋ฉฐ ์„ฑ๋Šฅ์  ํ•œ๊ณ„(๋ฆฌ๋ Œ๋”๋ง ๋ฌธ์ œ)๋ฅผ ๊ฒฝํ—˜ํ•˜๊ณ  Zustand์™€ ๊ฐ™์€ ์‹ค์šฉ์  ๋„๊ตฌ๋ฅผ ๋„์ž…ํ•˜๋Š” ์ˆœ์„œ๋กœ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค [18, 25]. -- **My Project Relevance:** ๋น ๋ฅธ ์‹œ์žฅ ๋ฐ˜์‘ ๊ฒ€์ฆ์ด ํ•„์š”ํ•œ ์‹ ๊ทœ ์„œ๋น„์Šค๋ฅผ ๊ธฐํš ์ค‘์ผ ๋•Œ, ์œ„ ์ „๋žต๋“ค์„ ์ง€์นจ์œผ๋กœ ์‚ผ์•„ ์ดˆ๊ธฐ ๊ฐœ๋ฐœ ์Šคํƒ(Zustand + ๋‹จ์ˆœ ํด๋” ๊ตฌ์กฐ)์„ ๊ฐ€๋ณ๊ฒŒ ๊ฐ€์ ธ๊ฐ€๋ฉด์„œ๋„ ๋Ÿฐ์นญ ํ›„ ์Šค์ผ€์ผ์—…์„ ์œ„ํ•œ ๊ธฐ์ˆ  ๋ถ€์ฑ„๋ฅผ ํ†ต์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - -### Adjacent Topics - -- [[Feature-Sliced Design (FSD)]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ํ”„๋กœํ† ํƒ€์ž… ๋‹จ๊ณ„๋ฅผ ๋„˜์–ด ์•ฑ๊ณผ ๊ฐœ๋ฐœํŒ€์ด ์„ฑ์žฅํ•  ๋•Œ, ๊ธฐ๋Šฅ๊ณผ ๋„๋ฉ”์ธ ์ค‘์‹ฌ์œผ๋กœ ๋ชจ๋“ˆ ๊ฐ„ ์˜์กด์„ฑ์„ ์—„๊ฒฉํžˆ ๊ฒฉ๋ฆฌํ•˜์—ฌ ๋Œ€๊ทœ๋ชจ ํ”„๋ก ํŠธ์—”๋“œ ์•„ํ‚คํ…์ฒ˜์˜ ๋ณต์žก์„ฑ์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค [26-28]. -- [[Frontend Cloud Logging Tools]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ํ”„๋กœํ† ํƒ€์ž… ์ถœ์‹œ ํ›„ ์‹ค์ œ ์‚ฌ์šฉ์ž์˜ ๋ฒ„๊ทธ๋ฅผ ์ถ”์ ํ•˜๊ธฐ ์œ„ํ•ด Sentry, LogRocket, SigNoz ๋“ฑ ๋‹ค์–‘ํ•œ ํด๋ผ์šฐ๋“œ ๋ชจ๋‹ˆํ„ฐ๋ง ํˆด์˜ ๊ธฐ๋Šฅ(Session Replay ๋“ฑ)๊ณผ ๋น„์šฉ(Pricing Reality) ๊ตฌ์กฐ๋ฅผ ๋น„๊ตํ•˜์—ฌ ์Šคํƒ€ํŠธ์—…์— ์ ํ•ฉํ•œ ๋„๊ตฌ๋ฅผ ์„ ์ •ํ•ฉ๋‹ˆ๋‹ค [12-14, 29]. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/React Application Scaling.md b/00_Raw/React Application Scaling.md deleted file mode 100644 index 3baf9301..00000000 --- a/00_Raw/React Application Scaling.md +++ /dev/null @@ -1,29 +0,0 @@ -# [[React Application Scaling]] - -## ๐Ÿ“Œ Brief Summary -๋ฆฌ์•กํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์Šค์ผ€์ผ๋ง(React Application Scaling)์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํฌ๊ธฐ์™€ ๋ณต์žก์„ฑ์ด ์ฆ๊ฐ€ํ•จ์— ๋”ฐ๋ผ ๋ฐœ์ƒํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜, ์„ฑ๋Šฅ, ์ƒํƒœ ๊ด€๋ฆฌ, ๊ทธ๋ฆฌ๊ณ  ํ˜‘์—… ๋ฌธ์ œ๋ฅผ ์ฒด๊ณ„์ ์œผ๋กœ ํ•ด๊ฒฐํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค [1-3]. ์ด๋Š” ๋‹จ์ˆœํžˆ ๋ Œ๋”๋ง ์†๋„๋ฅผ ๋†’์ด๋Š” ๊ฒƒ์„ ๋„˜์–ด, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ UI์˜ ๊ฒฐํ•ฉ์„ ๋ง‰๊ณ , ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ํด๋” ๊ตฌ์กฐ๋ฅผ ๋„์ž…ํ•˜๋ฉฐ, ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง๊ณผ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ตœ์ ํ™”ํ•˜๋Š” ๊ฒƒ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค [2-5]. ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋Œ€๊ทœ๋ชจ ํŒ€์ด ์•ˆ์ •์ ์ด๊ณ  ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ์‰ฌ์šด ํ”„๋ก ํŠธ์—”๋“œ ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š” ํ•ต์‹ฌ ์—”์ง€๋‹ˆ์–ด๋ง ํŒจ๋Ÿฌ๋‹ค์ž„์ž…๋‹ˆ๋‹ค [3, 6]. - -## ๐Ÿ“– Core Content -* **๊ตฌ์กฐ์  ์•„ํ‚คํ…์ฒ˜ ๋ฐ ํด๋” ๊ตฌ์„ฑ (Architectural Paradigms):** - ์ดˆ๊ธฐ ๋ฆฌ์•กํŠธ ์•ฑ์€ ์ปดํฌ๋„ŒํŠธ๋‚˜ ํ›…์„ ๊ธฐ์ˆ ์  ํŒŒ์ผ ํƒ€์ž…(Type-Based)์œผ๋กœ ๋ถ„๋ฆฌํ•˜์ง€๋งŒ, ์•ฑ์ด ์ปค์ง€๋ฉด ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜(Feature-Based) ๋˜๋Š” ๋„๋ฉ”์ธ ์ฃผ๋„ ๊ตฌ์กฐ๋กœ ์ „ํ™˜ํ•ด์•ผ ํ™•์žฅ์„ฑ์„ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [7, 8]. ํŠนํžˆ **FSD(Feature-Sliced Design)**๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ `app`, `pages`, `widgets`, `features`, `entities`, `shared` ๋“ฑ์˜ ๊ณ„์ธตํ™”๋œ ์Šฌ๋ผ์ด์Šค๋กœ ๋‚˜๋ˆ„๊ณ , ํ•˜์œ„ ๊ณ„์ธต๋งŒ ์ฐธ์กฐํ•˜๋„๋ก ํ•˜๋Š” ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ์„ ๊ฐ•์ œํ•˜์—ฌ ์ฝ”๋“œ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ณ  ๋ฆฌํŒฉํ† ๋ง์„ ์šฉ์ดํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค [9-11]. -* **์ƒํƒœ ๊ด€๋ฆฌ ์•„ํ‚คํ…์ฒ˜ (State Management Evolution):** - ๋‹จ์ผํ•œ ์ „์—ญ ์ƒํƒœ ๋„๊ตฌ์—์„œ ๋ฒ—์–ด๋‚˜ ๋ฐ์ดํ„ฐ ํŠน์„ฑ์— ๋งž๋Š” ๋„๊ตฌ๋ฅผ ์„ ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [12]. ํ…Œ๋งˆ๋‚˜ ๋กœ์ผ€์ผ์ฒ˜๋Ÿผ ์ •์ ์ด๊ณ  ๋ณ€๊ฒฝ์ด ์ ์€ ๋ฐ์ดํ„ฐ๋Š” Context API๊ฐ€ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค [13]. ๋ฐ˜๋ฉด ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ณ€๊ฒฝ๋˜๋Š” ๋™์  ์ƒํƒœ๋Š” ์„ ํƒ์ž(Selector) ํŒจํ„ด์„ ํ†ตํ•ด ๋ฆฌ๋ Œ๋”๋ง์„ ๋ฐฉ์ง€ํ•˜๋Š” Zustand๊ฐ€ ์œ ๋ฆฌํ•˜๋ฉฐ, ๋ณต์žกํ•œ ๋น„๋™๊ธฐ ๋กœ์ง๊ณผ ๋Œ€๊ทœ๋ชจ ํŒ€ ํ˜‘์—…์—๋Š” ๊ตฌ์กฐ๋ฅผ ๊ฐ•์ œํ•˜๋Š” Redux๊ฐ€ ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค [14-17]. ์„œ๋ฒ„ ์ƒํƒœ ์ฒ˜๋ฆฌ๋Š” TanStack Query์™€ ๊ฐ™์€ API ๊ณ„์ธต์šฉ ๋„๊ตฌ๋กœ ์™„์ „ํžˆ ๋ถ„๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [16, 18]. -* **์„ฑ๋Šฅ ๋ฐ ๋ฒˆ๋“ค๋ง ์ตœ์ ํ™” (Performance & Bundling):** - ๋ฆฌ์•กํŠธ๋Š” ์ƒํƒœ๋‚˜ ํ”„๋กญ์Šค๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ํ•˜์œ„ ํŠธ๋ฆฌ๋ฅผ ๋ฆฌ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค [19]. ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด `React.memo`, `useCallback`, `useMemo`๋ฅผ ์ „๋žต์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ์ฐธ์กฐ ์•ˆ์ •์„ฑ(Reference Equality)์„ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [20, 21]. ์ดˆ๊ธฐ ๋กœ๋”ฉ ์†๋„ ๊ฐœ์„ ์„ ์œ„ํ•ด์„œ๋Š” `React.lazy`์™€ ๋ผ์šฐํŠธ ๋ ˆ๋ฒจ์˜ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…์„ ์ ์šฉํ•˜๊ณ , Vite์˜ `manualChunks`๋ฅผ ํ™œ์šฉํ•ด React ์ฝ”์–ด ๋“ฑ ๋ฌด๊ฑฐ์šด ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ณ„๋„ ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ์บ์‹ฑ ํšจ์œจ์„ ๋†’์ž…๋‹ˆ๋‹ค [22-25]. ์ตœ๊ทผ์—๋Š” React Compiler๋ฅผ ๋„์ž…ํ•ด ๋นŒ๋“œ ํƒ€์ž„์— ์ž๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ธฐ๋ฒ•๋„ ํ™œ์šฉ๋ฉ๋‹ˆ๋‹ค [26-29]. -* **์ฝ”๋“œ ํ’ˆ์งˆ ๋ฐ ๋ณต์›๋ ฅ (Quality & Resilience):** - SOLID, DRY, KISS, YAGNI ์›์น™์„ ์ค€์ˆ˜ํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‹จ์ผ ์ฑ…์ž„(SRP)์„ ๊ฐ–๋„๋ก ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค [30-32]. ํŒŒ์ผ๋ช…์€ ์šด์˜์ฒด์ œ ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด `kebab-case`๋ฅผ, ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ๋Š” `PascalCase`๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋“ฑ ๋„ค์ด๋ฐ ์ปจ๋ฒค์…˜์„ ํ†ต์ผํ•ฉ๋‹ˆ๋‹ค [33-36]. ๋˜ํ•œ ํŠน์ • ์ปดํฌ๋„ŒํŠธ์˜ ๋ Œ๋”๋ง ์˜ค๋ฅ˜๊ฐ€ ์ „์ฒด ์•ฑ์„ ๋‹ค์šด์‹œํ‚ค๋Š” ๊ฒƒ์„ ๋ง‰๊ธฐ ์œ„ํ•ด ์—๋Ÿฌ ๋ฐ”์šด๋”๋ฆฌ(Error Boundaries)๋ฅผ ์ค‘์š” UI ์„น์…˜๋งˆ๋‹ค ๋ฐฐ์น˜ํ•˜์—ฌ Fallback UI๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ณต์›๋ ฅ ์žˆ๋Š” ์„ค๊ณ„๊ฐ€ ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค [37-39]. - -## โš–๏ธ Trade-offs & Caveats -* **๊ณผ๋„ํ•œ ์—”์ง€๋‹ˆ์–ด๋ง (Over-Engineering):** FSD๋‚˜ Redux์™€ ๊ฐ™์€ ๊ณ ๋„ํ™”๋œ ์•„ํ‚คํ…์ฒ˜์™€ ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ๋ฅผ ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ๋‚˜ ๊ฒฝํ—˜์ด ์ ์€ ํŒ€์— ๋„์ž…ํ•˜๋ฉด, ํ•™์Šต ๊ณก์„ ์ด ํฌ๊ฒŒ ์ƒ์Šนํ•˜๊ณ  ๋ถˆํ•„์š”ํ•œ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ๊ฐ€ ์–‘์‚ฐ๋˜์–ด ์˜คํžˆ๋ ค ๊ฐœ๋ฐœ ์†๋„๋ฅผ ๋Šฆ์ถœ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [40-43]. -* **๋ฉ”๋ชจ์ด์ œ์ด์…˜์˜ ์˜ค์šฉ์— ๋”ฐ๋ฅธ ์„ฑ๋Šฅ ์ €ํ•˜:** `React.memo`๋‚˜ `useMemo`๋ฅผ ๋ฌด๋ถ„๋ณ„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด, ์ด์ „ props ๋ฐ ์ƒํƒœ๋ฅผ ๋น„๊ตํ•˜๋Š” ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์—ฐ์‚ฐ ๋น„์šฉ์ด ๋ Œ๋”๋ง ๋น„์šฉ ์ž์ฒด๋ฅผ ์ดˆ๊ณผํ•˜์—ฌ ์˜คํžˆ๋ ค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ์„ ์•…ํ™”์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [44, 45]. -* **React Compiler์˜ ๊ฐ€์‹œ์„ฑ ์ €ํ•˜ ๋ฐ ํ˜ธํ™˜์„ฑ ์ œ์•ฝ:** ์ž๋™ํ™”๋œ ์ตœ์ ํ™” ๋„๊ตฌ์ธ React Compiler๋Š” ๋ธ”๋ž™๋ฐ•์Šค์ฒ˜๋Ÿผ ์ž‘๋™ํ•˜๋ฏ€๋กœ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ ๋ฐœ์ƒ ์‹œ ๋””๋ฒ„๊น…์ด ๋” ๊นŒ๋‹ค๋กœ์›Œ์ง‘๋‹ˆ๋‹ค [46]. ๋˜ํ•œ ๋งค ๋ Œ๋”๋ง ์‹œ ์˜๋„์ ์œผ๋กœ ๋ถˆ์•ˆ์ •ํ•œ ์ฐธ์กฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(์˜ˆ: React Router, TanStack Query ์ผ๋ถ€ ํ›…)์™€๋Š” ์ตœ์ ํ™” ํ˜ธํ™˜์ด ๊นจ์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ, React ๊ทœ์น™์„ ์ง€ํ‚ค์ง€ ์•Š์€ ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ๋Š” ์ ์šฉ์ด ์–ด๋ ต์Šต๋‹ˆ๋‹ค [47, 48]. -* **Context API์˜ ๋ฆฌ๋ Œ๋”๋ง ํญํ’ (Re-render Storm):** Context API๋ฅผ ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ณ€ํ•˜๋Š” ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ์— ์‚ฌ์šฉํ•˜๋ฉด, ๋ฐ์ดํ„ฐ ์ค‘ ์ผ๋ถ€๋ถ„๋งŒ ๋ณ€๊ฒฝ๋˜๋”๋ผ๋„ ํ•ด๋‹น ์ปจํ…์ŠคํŠธ๋ฅผ ๊ตฌ๋…ํ•˜๋Š” ๋ชจ๋“  ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ฆฌ๋ Œ๋”๋ง๋˜๋Š” ์น˜๋ช…์ ์ธ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ์œ ๋ฐœํ•ฉ๋‹ˆ๋‹ค [49, 50]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -#### [์•„ํ‚คํ…์ฒ˜ ๋ฐ ํด๋” ๊ตฌ์กฐ (Architecture & Structure)] -- [[Feature-Sliced Design (FSD)]] - - ์—ฐ๊ฒฐ ์ด์œ : ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ๋ฆฌ์•กํŠธ ์•ฑ์„ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•œ ํ•ต์‹ฌ ๋„๋ฉ”์ธ ์ฃผ๋„ ์•„ํ‚คํ…์ฒ˜ ๋ฐฉ๋ฒ•๋ก ์ž…๋‹ˆ๋‹ค. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ธฐ๋Šฅ, ์œ„์ ฏ, ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋ถ„๋ฆฌํ•˜๊ณ  ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ๊ทœ์น™์„ ๊ฐ•์ œํ•˜์—ฌ ๊ฒฐ \ No newline at end of file diff --git a/00_Raw/React DevTools Profiler.md b/00_Raw/React DevTools Profiler.md deleted file mode 100644 index 0ed6a720..00000000 --- a/00_Raw/React DevTools Profiler.md +++ /dev/null @@ -1,52 +0,0 @@ -# [[React DevTools Profiler]] - -## ๐Ÿ“Œ Brief Summary -React DevTools Profiler๋Š” React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ Œ๋”๋ง ์„ฑ๋Šฅ์„ ์ธก์ •ํ•˜๊ณ  ์ตœ์ ํ™” ๋Œ€์ƒ์„ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด React DevTools์— ๋‚ด์žฅ๋œ ํ”„๋กœํŒŒ์ผ๋ง ๋ฐ ๋””๋ฒ„๊น… ๋„๊ตฌ์ด๋‹ค [1]. ์ด ๋„๊ตฌ๋Š” ์–ด๋–ค ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ธ์ œ, ์–ผ๋งˆ๋‚˜ ์˜ค๋ž˜ ๋ Œ๋”๋ง๋˜์—ˆ๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์–ด๋–ค ์š”์ธ(props, state ๋ณ€๊ฒฝ ๋“ฑ)์ด ๋ Œ๋”๋ง์„ ์œ ๋ฐœํ–ˆ๋Š”์ง€ ํŒŒ์•…ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค [1, 2]. ์ฃผ๋กœ ๋กœ์ปฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ์‹๋ณ„ํ•˜๊ณ  ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ์ฐพ์•„๋‚ด๋Š” ๋ฐ ํ•ต์‹ฌ์ ์œผ๋กœ ํ™œ์šฉ๋œ๋‹ค [3]. - -## ๐Ÿ“– Core Content -* **๋ Œ๋”๋ง ์ถ”์  ๋ฐ ์‹œ๊ฐํ™”**: Profiler๋Š” ํŠน์ • props๋‚˜ ์ƒํƒœ(state) ๋ณ€๊ฒฝ ๋“ฑ ์ปดํฌ๋„ŒํŠธ์˜ ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•œ ์ •ํ™•ํ•œ ์›์ธ์„ ์ถ”์ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค [1, 2]. ํ”Œ๋ ˆ์ž„๊ทธ๋ž˜ํ”„(Flamegraph)์™€ ์ˆœ์œ„ ๋ทฐ(Ranked views)๋ฅผ ์ œ๊ณตํ•˜์—ฌ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ ์ง€์ ์„ ์‹œ๊ฐ์ ์œผ๋กœ ์‰ฝ๊ฒŒ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š”๋‹ค [2]. -* **์ตœ์ ํ™” ํ•„์š”์„ฑ ๊ฒ€์ฆ (์ธก์ • ๊ธฐ๋ฐ˜ ์ตœ์ ํ™”)**: `React.memo`์™€ ๊ฐ™์€ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๊ธฐ์ˆ ์„ ์ ์šฉํ•˜๊ธฐ ์ „์—, ์ปดํฌ๋„ŒํŠธ์˜ ๋ฆฌ๋ Œ๋”๋ง ๋น„์šฉ์ด ์ตœ์ ํ™” ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๊ฐ์ˆ˜ํ•  ๋งŒํผ ํฐ์ง€ ์ธก์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค [4]. ๋˜ํ•œ, ๋ฉ”๋ชจ์ด์ œ์ด์…˜๋œ ์ปดํฌ๋„ŒํŠธ ๋‚ด์˜ prop ๋ณ€๊ฒฝ์„ ์ถ”์ ํ•˜์—ฌ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ฆฌ๋ Œ๋”๋ง๋˜๋Š”์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค [5]. "์ธก์ •ํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ์ตœ์ ํ™”ํ•˜์ง€ ๋ง๋ผ"๋Š” ์›์น™์— ๋”ฐ๋ผ, ํ”„๋กœํŒŒ์ผ๋ง์€ ์„ฑ๋Šฅ ํ•ซ์ŠคํŒŸ์—๋งŒ ์ง‘์ค‘ํ•˜๋„๋ก ๋•๋Š”๋‹ค [2, 6]. -* **React Compiler ์‹œ๊ฐํ™”**: React Compiler๊ฐ€ ์ ์šฉ๋œ ํ™˜๊ฒฝ์—์„œ๋Š” Profiler ํƒญ์—์„œ ์ž๋™ ์ตœ์ ํ™”๋œ ์ปดํฌ๋„ŒํŠธ์— `Memo โœจ` ๋ฐฐ์ง€๊ฐ€ ํ‘œ์‹œ๋œ๋‹ค [7, 8]. ์ž…๋ ฅ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•„ ๋ฆฌ๋ Œ๋”๋ง์„ ๊ฑด๋„ˆ๋›ด ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋Š” ํšŒ์ƒ‰์œผ๋กœ ํ‘œ์‹œ๋˜๋ฉฐ, ๋งˆ์šฐ์Šค๋ฅผ ์˜ฌ๋ฆฌ๋ฉด ์ž๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๋ฐ ๋ฆฌ๋ Œ๋”๋ง ์ƒ๋žต ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๋Š” ํˆดํŒ์ด ๋‚˜ํƒ€๋‚œ๋‹ค [8]. -* **๋ธ”๋ž™๋ฐ•์Šค ํ™˜๊ฒฝ์—์„œ์˜ ๋””๋ฒ„๊น… ํ•„์ˆ˜์„ฑ**: React Compiler ๋„์ž… ์‹œ ๊ธฐ์กด์˜ ๋ช…์‹œ์ ์ธ `React.memo`, `useMemo`, `useCallback` ํ˜ธ์ถœ์ด ์ฝ”๋“œ์—์„œ ์‚ฌ๋ผ์ ธ ๋ Œ๋”๋ง ์ œ์–ด๊ฐ€ ๋ธ”๋ž™๋ฐ•์Šค์ฒ˜๋Ÿผ ์ž‘๋™ํ•˜๊ฒŒ ๋œ๋‹ค [9]. ๋”ฐ๋ผ์„œ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ฆฌ๋ Œ๋”๋ง ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ, ์ด๋ฅผ ์ฝ”๋“œ ์ƒ์—์„œ ํ™•์ธํ•˜๋Š” ๋Œ€์‹  Profiler๋ฅผ ํ†ตํ•ด ์ง์ ‘ ์กฐ์‚ฌํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๊ทธ ์ค‘์š”์„ฑ์ด ๋”์šฑ ์ปค์ง„๋‹ค [9]. - -## โš–๏ธ Trade-offs & Caveats -* **ํ•ด์„์ƒ์˜ ์ฃผ์˜์  (`Memo โœจ` ๋ฐฐ์ง€์˜ ํ•จ์ •)**: Profiler ํƒญ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” `Memo โœจ` ๋ฐฐ์ง€๋Š” ๋‹ค์†Œ ์˜คํ•ด๋ฅผ ๋ถˆ๋Ÿฌ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋‹ค [10]. ์ด ๋ฐฐ์ง€๋Š” React Compiler๊ฐ€ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ฒ˜๋ฆฌ(Compile)ํ–ˆ์Œ์„ ๋‚˜ํƒ€๋‚ผ ๋ฟ, ์ตœ์ ํ™”๊ฐ€ ์™„๋ฒฝํ•˜๊ฒŒ ์„ฑ๊ณตํ–ˆ์Œ์„ ์˜๋ฏธํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค [10]. ์ปดํฌ๋„ŒํŠธ์— ๋ฐฐ์ง€๊ฐ€ ํ‘œ์‹œ๋˜์–ด ์žˆ๋”๋ผ๋„, ์ธ๋ผ์ธ ๊ฐ์ฒด๋‚˜ ํ•จ์ˆ˜์™€ ๊ฐ™์€ ๋ถˆ์•ˆ์ •ํ•œ ์ฐธ์กฐ๋ฅผ ๊ฐ€์ง„ props๊ฐ€ ์ „๋‹ฌ๋œ๋‹ค๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ง‰์ง€ ๋ชปํ•ด ์—ฌ์ „ํžˆ ๋งค๋ฒˆ ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค [10]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -#### [๊ด€๊ณ„ ์œ ํ˜• A: ์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] -- [[React Compiler]] - - ์—ฐ๊ฒฐ ์ด์œ : React Compiler๊ฐ€ ๋นŒ๋“œ ํƒ€์ž„์— ์ฃผ์ž…ํ•œ ์ž๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๋กœ์ง์˜ ์„ฑ๊ณต ์—ฌ๋ถ€์™€ ๋ Œ๋”๋ง ์Šคํ‚ต ๊ฒฐ๊ณผ๋ฅผ Profiler๋ฅผ ํ†ตํ•ด ์‹œ๊ฐ์ ์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค [7-9]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ช…์‹œ์ ์ธ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ์ฝ”๋“œ ์—†์ด๋„ ๋ Œ๋”๋ง ์„ฑ๋Šฅ์ด ์ตœ์ ํ™”๋˜๋Š” ์›๋ฆฌ์™€, ๋ธ”๋ž™๋ฐ•์Šคํ™”๋œ ๋ Œ๋”๋ง ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๋””๋ฒ„๊น…ํ•˜๋Š” ๋ฐฉ๋ฒ• [9, 11]. - -#### [๊ด€๊ณ„ ์œ ํ˜• B: ๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ] -- [[React.memo]] - - ์—ฐ๊ฒฐ ์ด์œ : Profiler๋ฅผ ํ†ตํ•ด ํŠน์ • ์ปดํฌ๋„ŒํŠธ์˜ ๋ Œ๋”๋ง ๋นˆ๋„์™€ ๋น„์šฉ์„ ์ธก์ •ํ•œ ๋’ค, ๊ทธ ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ `React.memo` ์ ์šฉ์ด ์„ฑ๋Šฅ ํ–ฅ์ƒ์— ์‹ค์งˆ์ ์ธ ๋„์›€์ด ๋ ์ง€ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๋‹ค [4]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์–•์€ ๋น„๊ต(Shallow comparison)์˜ ์›๋ฆฌ์™€ ํ”„๋กœํŒŒ์ผ๋ง ๋ฐ์ดํ„ฐ์— ๊ธฐ๋ฐ˜ํ•œ ์ „๋žต์  ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๋ฐฉ๋ฒ• [4, 12, 13]. -- [[useCallback & useMemo]] - - ์—ฐ๊ฒฐ ์ด์œ : Profiler์—์„œ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ฐธ์กฐ(Reference) ๋ณ€๊ฒฝ ๋•Œ๋ฌธ์— ๊ณ„์† ๋ฆฌ๋ Œ๋”๋ง๋˜๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ๋‹ค๋ฉด, ์ด ํ›…๋“ค์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฐธ์กฐ ์•ˆ์ •์„ฑ(Reference stability)์„ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ๋‹ค [5, 14]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํ•จ์ˆ˜๋‚˜ ๊ฐ์ฒด์˜ ์ฐธ์กฐ ๋™์ผ์„ฑ์ด ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง ํŠธ๋ฆฌ์— ๋ฏธ์น˜๋Š” ์ง์ ‘์ ์ธ ์˜ํ–ฅ [14]. - -### Deeper Research Questions -- React DevTools Profiler์˜ ํ”Œ๋ ˆ์ž„๊ทธ๋ž˜ํ”„(Flamegraph)์™€ ์ˆœ์œ„ ๋ทฐ(Ranked view)๋ฅผ ์–ด๋–ป๊ฒŒ ๋ถ„์„ํ•ด์•ผ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ๊ฐ€์žฅ ๋น ๋ฅด๊ณ  ์ •ํ™•ํ•˜๊ฒŒ ์ฐพ์•„๋‚ผ ์ˆ˜ ์žˆ๋Š”๊ฐ€? -- ๋ช…์‹œ์ ์ธ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ํ›…์ด ์ œ๊ฑฐ๋˜๋Š” React Compiler ํ™˜๊ฒฝ์—์„œ, Profiler๋ฅผ ํ†ตํ•œ ์„ฑ๋Šฅ ๋””๋ฒ„๊น… ์›Œํฌํ”Œ๋กœ์šฐ๋Š” ๊ธฐ์กด๊ณผ ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ๋‹ฌ๋ผ์ง€๋Š”๊ฐ€? -- Profiler๋ฅผ ํ†ตํ•ด ์‹๋ณ„๋œ ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ๋•Œ, ์–ด๋–ค ์ƒํ™ฉ์—์„œ ๊ตฌ์กฐ ์žฌ์„ค๊ณ„(์˜ˆ: Context API ๋Œ€์‹  Zustand ๋„์ž…)๊ฐ€ ๋‹จ์ˆœํ•œ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ์ ์šฉ๋ณด๋‹ค ๋” ๋‚˜์€ ์„ ํƒ์ด ๋˜๋Š”๊ฐ€? -- ๋กœ์ปฌ ํ™˜๊ฒฝ์˜ Profiler์—์„œ ๊ด€์ฐฐ๋˜๋Š” ๋ Œ๋”๋ง ์‹œ๊ฐ„๊ณผ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์˜ ์‹ค์ œ ์‚ฌ์šฉ์ž ์ฒด๊ฐ ์„ฑ๋Šฅ(Core Web Vitals์˜ INP ๋“ฑ) ๊ฐ„์˜ ์ฐจ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ๋ณด์ •ํ•˜์—ฌ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? - -### Practical Application Contexts -- **Implementation:** ๋ Œ๋”๋ง ์ตœ์ ํ™” ์ฝ”๋“œ๋ฅผ ๋ฌด์ž‘์ • ์ถ”๊ฐ€ํ•˜๊ธฐ ์ „์—, Profiler๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์‹ค์ œ ๋ Œ๋”๋ง ๋นˆ๋„์™€ ์‹คํ–‰ ์‹œ๊ฐ„์„ ์ธก์ •ํ•จ์œผ๋กœ์จ ๋ Œ๋”๋ง์ด ๋ฌด๊ฑฐ์šด(expensive) ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ •ํ™•ํžˆ ์‹๋ณ„ํ•œ๋‹ค [4, 6]. -- **System Design:** Context API์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ Œ๋”๋ง๋˜๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ๊ธ€๋กœ๋ฒŒ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(Zustand ๋“ฑ) ๋„์ž…์ด๋‚˜ ์ƒํƒœ ๋„๋ฉ”์ธ ๋ถ„๋ฆฌ์˜ ๊ธฐ์ˆ ์  ํƒ€๋‹น์„ฑ์„ ๊ฒ€์ฆํ•œ๋‹ค [15-18]. -- **Operation / Maintenance:** ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ฑฐ๋‚˜ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ๋ฆด๋ฆฌ์Šคํ•œ ์งํ›„, ํ”Œ๋ ˆ์ž„๊ทธ๋ž˜ํ”„๋ฅผ ์ •๊ธฐ์ ์œผ๋กœ ๋ฆฌ๋ทฐํ•˜์—ฌ ์˜๋„์น˜ ์•Š์€ ์„ฑ๋Šฅ ํšŒ๊ท€(Regression)๋ฅผ ์‹๋ณ„ํ•˜๊ณ  ๊ด€๋ฆฌํ•œ๋‹ค [19]. -- **Learning Path:** React ์ž…๋ฌธ์ž๋‚˜ ํŒ€์›๋“ค์ด Props, State, Context๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ฐ˜์‘ํ•˜๊ณ  ์žฌ๋ Œ๋”๋ง๋˜๋Š”์ง€๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ๋ณด์—ฌ์คŒ์œผ๋กœ์จ ๋ Œ๋”๋ง ๋ชจ๋ธ์„ ๊นŠ๊ฒŒ ์ดํ•ด์‹œํ‚จ๋‹ค [1, 20]. -- **My Project Relevance:** ํ™”๋ฉด ๋‚ด ๋Œ€์šฉ๋Ÿ‰ ๋ฆฌ์ŠคํŠธ๋‚˜ ๋ณต์žกํ•œ ํ•„ํ„ฐ๋ฅผ ์กฐ์ž‘ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์ง€์—ฐ ํ˜„์ƒ(Jank)์˜ ์›์ธ์ด ๋ Œ๋”๋ง ์‹œ๊ฐ„ ์ž์ฒด์ธ์ง€, ์•„๋‹ˆ๋ฉด ๋ถˆํ•„์š”ํ•œ ์—ฐ์‡„ ๋ฆฌ๋ Œ๋”๋ง ๋•Œ๋ฌธ์ธ์ง€ ์ง„๋‹จํ•˜๊ณ  ํ•ด๊ฒฐ์ฑ…์„ ๋งˆ๋ จํ•œ๋‹ค [21, 22]. - -### Adjacent Topics -- [[why-did-you-render]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: Profiler์™€ ๊ฒฐํ•ฉํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ, ์‹ค์ œ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์ด ์—†์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง๋œ '์ •ํ™•ํ•œ ์ด์œ '๋ฅผ ์ฝ˜์†”์— ๊ฒฝ๊ณ  ํ˜•ํƒœ๋กœ ๋‚จ๊ฒจ์ฃผ์–ด ๋””๋ฒ„๊น…์„ ๋”์šฑ ์‰ฝ๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๋„๊ตฌ์— ๋Œ€ํ•ด ์กฐ์‚ฌํ•œ๋‹ค [3, 23]. -- [[Chrome DevTools Performance Tab]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: Profiler๊ฐ€ ์•Œ๋ ค์ฃผ๋Š” React ๋‚ด๋ถ€์˜ ๋ Œ๋”๋ง ์†๋„ ์ด์™ธ์—, ํ”„๋ ˆ์ž„ ๋“œ๋กญ์ด๋‚˜ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋ฅผ ๋ง‰๋Š” ๋ฌด๊ฑฐ์šด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰, ๋ ˆ์ด์•„์›ƒ ์ด๋™ ๋“ฑ ๋ธŒ๋ผ์šฐ์ € ๋ ˆ๋ฒจ์˜ ์ „์ฒด์ ์ธ ์„ฑ๋Šฅ ๋ถ„์„์œผ๋กœ ์‹œ์•ผ๋ฅผ ํ™•์žฅํ•œ๋‹ค [3, 23]. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/React Development.md b/00_Raw/React Development.md deleted file mode 100644 index 9d1a97fb..00000000 --- a/00_Raw/React Development.md +++ /dev/null @@ -1,71 +0,0 @@ -# [[React Development]] - -## ๐Ÿ“Œ Brief ์†Œ์Šค Summary -React Development๋Š” ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•œ ํšจ์œจ์ ์ด๊ณ  ์œ ์—ฐํ•œ JavaScript ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ™œ์šฉ ๊ธฐ์ˆ ์ด๋‹ค [1]. ์ตœ๊ทผ์˜ ํ”„๋ก ํŠธ์—”๋“œ ์—”์ง€๋‹ˆ์–ด๋ง์—์„œ๋Š” ์ปดํฌ๋„ŒํŠธ ์ตœ์ ํ™”, ์ƒํƒœ ๊ด€๋ฆฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜, ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์•„ํ‚คํ…์ฒ˜(Feature-Sliced Design) ๋ฐ ์ž๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๋„๊ตฌ(React Compiler)๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ๋ณต์žกํ•œ ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๋ฐœ์ „ํ•˜๊ณ  ์žˆ๋‹ค [2-4]. ํšจ๊ณผ์ ์ธ ๊ฐœ๋ฐœ๊ณผ ํ™•์žฅ์„ ์œ„ํ•ด์„œ๋Š” ๊ด€์‹ฌ์‚ฌ์˜ ๋ช…ํ™•ํ•œ ๋ถ„๋ฆฌ, ์—„๊ฒฉํ•œ ๋„ค์ด๋ฐ ๊ทœ์น™, ๊ทธ๋ฆฌ๊ณ  ์„ฑ๋Šฅ ์ตœ์ ํ™”์— ๋Œ€ํ•œ ์ฒด๊ณ„์ ์ธ ์ ‘๊ทผ์ด ํ•„์ˆ˜์ ์ด๋‹ค [5-8]. - -## ๐Ÿ“– Core Content -* **์•„ํ‚คํ…์ฒ˜ ๋ฐ ํด๋” ๊ตฌ์กฐ**: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ทœ๋ชจ๊ฐ€ ์ปค์ง์— ๋”ฐ๋ผ ํŒŒ์ผ ์œ ํ˜•๋ณ„ ๋ถ„๋ฆฌ๋ณด๋‹ค ๋„๋ฉ”์ธ์ด๋‚˜ ๊ธฐ๋Šฅ(Feature) ์ค‘์‹ฌ์œผ๋กœ ํด๋”๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋œ๋‹ค [9, 10]. ํ˜„๋Œ€์ ์ธ ๊ตฌ์กฐ๋ก ์ธ Feature-Sliced Design(FSD)์€ ์•ฑ์„ App, Pages, Widgets, Features, Entities, Shared ๋“ฑ์˜ ๋ ˆ์ด์–ด๋กœ ๋‚˜๋ˆ„๊ณ , ์ƒ์œ„ ๋ ˆ์ด์–ด๊ฐ€ ํ•˜์œ„ ๋ ˆ์ด์–ด์—๋งŒ ์˜์กดํ•˜๋„๋ก ๋‹จ๋ฐฉํ–ฅ ๊ทœ์น™์„ ๊ฐ•์ œํ•œ๋‹ค [11-13]. -* **์ƒํƒœ ๊ด€๋ฆฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜**: ์ƒํƒœ์˜ ๋นˆ๋„์™€ ๋ณต์žก์„ฑ์— ๋”ฐ๋ผ ๋„๊ตฌ๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ถ”์„ธ๋‹ค [14]. ํ…Œ๋งˆ๋‚˜ ๋กœ์ผ€์ผ์ฒ˜๋Ÿผ ์ž์ฃผ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๊ธ€๋กœ๋ฒŒ ์ƒํƒœ๋Š” ๋‚ด์žฅ Context API๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ์ž์ฃผ ๋ณ€๊ฒฝ๋˜์–ด ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ง‰์•„์•ผ ํ•˜๋Š” ์ƒํƒœ๋Š” ์„ ํƒ์ž(selector)๋ฅผ ์ œ๊ณตํ•˜๋Š” Zustand ๊ฐ™์€ ๊ฒฝ๋Ÿ‰ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค [15-18]. ๊ฑฐ๋Œ€ํ•œ ํŒ€๊ณผ ๋ณต์žกํ•œ ๋น„๋™๊ธฐ ๋กœ์ง์ด ์–ฝํ˜€ ์žˆ๋Š” ๊ฒฝ์šฐ Redux๊ฐ€ ๊ตฌ์กฐํ™”๋ฅผ ๋•๊ณ , ์„œ๋ฒ„ API ์ƒํƒœ ๋™๊ธฐํ™”๋Š” TanStack Query(React Query)๊ฐ€ ๋‹ด๋‹นํ•œ๋‹ค [19-21]. -* **์„ฑ๋Šฅ ๋ฐ ๋ Œ๋”๋ง ์ตœ์ ํ™”**: 2025๋…„ ๊ธฐ์ค€ ๋„์ž…๋œ React Compiler๋Š” ๋นŒ๋“œ ํƒ€์ž„์— AST๋ฅผ ๋ถ„์„ํ•˜์—ฌ `useMemo`, `useCallback`, `React.memo` ๋“ฑ ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง์„ ๋ฐฉ์ง€ํ•œ๋‹ค [3, 22, 23]. ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ์„ ์œ„ํ•ด์„œ๋Š” `React.lazy`์™€ `Suspense`๋ฅผ ํ™œ์šฉํ•œ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…์„ ์ ์šฉํ•˜๋ฉฐ, Vite ํ™˜๊ฒฝ์—์„œ๋Š” `manualChunks`๋ฅผ ํ†ตํ•ด ๋ฒค๋”(vendor) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ถ„ํ• ํ•˜์—ฌ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ตœ์ ํ™”ํ•œ๋‹ค [24-26]. -* **์—๋Ÿฌ ์ฒ˜๋ฆฌ์™€ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ**: ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ์˜ ๋ Œ๋”๋ง ์—๋Ÿฌ๋กœ ์ธํ•ด ์•ฑ ์ „์ฒด๊ฐ€ ํ•˜์–—๊ฒŒ ์งˆ๋ฆฌ๋Š” ํ˜„์ƒ์„ ๋ง‰๊ธฐ ์œ„ํ•ด Error Boundary๋ฅผ ์‚ฌ์šฉํ•ด Fallback UI๋ฅผ ๋ณด์—ฌ์ฃผ๊ณ  ๊ฒฉ๋ฆฌํ•œ๋‹ค [27, 28]. ๋Ÿฐํƒ€์ž„ ์ค‘์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜(์˜ˆ: ํด๋กœ์ €์— ๋ฌถ์ธ ์ฐธ์กฐ, ๋ถ„๋ฆฌ๋œ DOM ๋…ธ๋“œ ๋“ฑ)๋Š” Chrome DevTools์˜ Heap Snapshot ๋ฐ Allocation Timeline์„ ํ™œ์šฉํ•ด ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ์ˆ˜์ •ํ•œ๋‹ค [29-31]. -* **์ปจ๋ฒค์…˜ ๋ฐ ์†Œํ”„ํŠธ์›จ์–ด ๊ณตํ•™ ์›์น™**: React ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—๋„ SOLID(ํŠนํžˆ ๋‹จ์ผ ์ฑ…์ž„ ์›์น™, SRP)์™€ DRY, KISS, YAGNI ์›์น™์„ ์ ์šฉํ•ด ๊ฑฐ๋Œ€ํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ถ„๋ฆฌํ•ด์•ผ ํ•œ๋‹ค [32-34]. ํŒŒ์ผ๋ช…์€ OS ํ˜ธํ™˜์„ฑ์„ ๊ณ ๋ คํ•ด `kebab-case`๋ฅผ, ์ปดํฌ๋„ŒํŠธ ์ด๋ฆ„์€ `PascalCase`๋ฅผ, ํ•จ์ˆ˜์™€ ํ›…์€ `camelCase`๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ‘œ์ค€ ๋„ค์ด๋ฐ ์ปจ๋ฒค์…˜์ด๋‹ค [5, 35-37]. - -## โš–๏ธ Trade-offs & Caveats -* **React Compiler์˜ ๋งน์ **: React Compiler๊ฐ€ ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์˜ ์ˆ˜๊ณ ๋ฅผ ๋œ์–ด์ฃผ์ง€๋งŒ, TanStack Query๋‚˜ React Router์™€ ๊ฐ™์ด ๋ Œ๋”๋ง๋งˆ๋‹ค ๋ถˆ์•ˆ์ •ํ•œ ๊ฐ์ฒด ์ฐธ์กฐ๋ฅผ ์˜๋„์ ์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์ตœ์ ํ™” ์ฒด์ธ์ด ๊นจ์ ธ ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค [38, 39]. ๋˜ํ•œ ์ตœ์ ํ™” ๊ณผ์ •์ด ๋ธ”๋ž™๋ฐ•์Šค ํ˜•ํƒœ์ด๋ฏ€๋กœ, ๋ Œ๋”๋ง ์„ฑ๋Šฅ ์ด์Šˆ ๋ฐœ์ƒ ์‹œ ์ฝ”๋“œ์— ๋ช…์‹œ๋œ ํ›…์„ ํ™•์ธํ•˜๋Š” ๋Œ€์‹  React Profiler๋ฅผ ํŒŒํ—ค์ณ์•ผ ํ•˜๋Š” ๋“ฑ ๋””๋ฒ„๊น…์ด ๋” ๊นŒ๋‹ค๋กœ์›Œ์ง„๋‹ค [40]. -* **Context API vs ์™ธ๋ถ€ ์ƒํƒœ ๊ด€๋ฆฌ**: Context API๋Š” React ๋‚ด์žฅ ๊ธฐ๋Šฅ์œผ๋กœ ์˜์กด์„ฑ ์ถ”๊ฐ€ ์—†์ด 'Prop-drilling'์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์œผ๋‚˜, ์ปจํ…์ŠคํŠธ ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฌด์กฐ๊ฑด ๋ฆฌ๋ Œ๋”๋ง์‹œํ‚ค๋Š” ์„ฑ๋Šฅ์  ๋‹จ์ ์ด ์žˆ๋‹ค [16, 18]. ๋ฐ˜๋ฉด Zustand ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋ Œ๋”๋ง ์„ฑ๋Šฅ ์ตœ์ ํ™”์—๋Š” ํƒ์›”ํ•˜์ง€๋งŒ, ์•„ํ‚คํ…์ฒ˜๊ฐ€ ๋„ˆ๋ฌด ์œ ์—ฐํ•˜์—ฌ ๋Œ€๊ทœ๋ชจ ํŒ€์—์„œ๋Š” ํŒจํ„ด์ด ํŒŒํŽธํ™”๋  ์ˆ˜ ์žˆ๋Š” ์œ„ํ—˜์„ฑ์„ ๋™๋ฐ˜ํ•œ๋‹ค [17, 41]. -* **Error Boundary์˜ ํฌ์ฐฉ ํ•œ๊ณ„**: Error Boundary๋Š” ์ปดํฌ๋„ŒํŠธ์˜ ๋ Œ๋”๋ง ๋ฐ ์ƒ๋ช…์ฃผ๊ธฐ ๋‚ด๋ถ€์˜ ์—๋Ÿฌ๋Š” ํ›Œ๋ฅญํ•˜๊ฒŒ ์žก์•„๋‚ด์ง€๋งŒ, ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ(`onClick` ๋“ฑ) ๋‚ด๋ถ€์˜ ๋กœ์ง, ๋น„๋™๊ธฐ ์ฝœ๋ฐฑ(`setTimeout`), ํ˜น์€ ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง(SSR) ์ค‘ ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ๋Š” ํฌ์ฐฉํ•˜์ง€ ๋ชปํ•œ๋‹ค [42, 43]. ๋”ฐ๋ผ์„œ ๋ณ„๋„์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ `try/catch`๊ฐ€ ๋ณ‘ํ–‰๋˜์–ด์•ผ ํ•œ๋‹ค [44]. -* **Feature-Sliced Design ๋„์ž…์˜ ๋ถ€์ž‘์šฉ**: ๋„๋ฉ”์ธ ์ค‘์‹ฌ์œผ๋กœ ํŒŒ์ผ์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์€ ๋Œ€๊ทœ๋ชจ ์‹œ์Šคํ…œ์—์„œ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•˜์ง€๋งŒ, ์ž‘์€ ๊ทœ๋ชจ์˜ ์•ฑ์ด๋‚˜ ํŒ€์—์„œ๋Š” ๋„ˆ๋ฌด ๋งŽ์€ ํด๋” ๋ށ์Šค์™€ ๊ตฌ์กฐ์  ๊ทœ์น™์ด ๊ณผ๋„ํ•œ ์—”์ง€๋‹ˆ์–ด๋ง(Over-engineering)์œผ๋กœ ์ด์–ด์ ธ ์ดˆ๊ธฐ ๊ฐœ๋ฐœ ์†๋„๋ฅผ ๋Šฆ์ถœ ์ˆ˜ ์žˆ๋‹ค [45, 46]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -#### [์•„ํ‚คํ…์ฒ˜ ๋ฐ ํด๋” ์„ค๊ณ„] -- [[Feature-Sliced Design]] - - ์—ฐ๊ฒฐ ์ด์œ : ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‹จ์ˆœ ํŒŒ์ผ ์œ ํ˜•์ด ์•„๋‹Œ ๋„๋ฉ”์ธ/๊ธฐ๋Šฅ ์Šค์ฝ”ํ”„์— ๋”ฐ๋ผ ๋ถ„๋ฆฌํ•˜๊ณ  ๋ ˆ์ด์–ด ๊ฐ„ ์˜์กด์„ฑ ๋ฐฉํ–ฅ์„ ๊ฐ•์ œํ•˜์—ฌ React ์•ฑ์˜ ๋Œ€๊ทœ๋ชจ ํ™•์žฅ์„ฑ์„ ํ™•๋ณดํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜ ๋ฐฉ๋ฒ•๋ก ์ด๊ธฐ ๋•Œ๋ฌธ [11, 47]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ฑฐ๋Œ€ํ•œ ํ”„๋ก ํŠธ์—”๋“œ ์‹œ์Šคํ…œ์—์„œ ์ปดํฌ๋„ŒํŠธ ๊ฐ„ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ณ  ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์˜ ์‘์ง‘๋„๋ฅผ ๋†’์ด๋Š” ์„ค๊ณ„ ์ฒ ํ•™. - -- [[SOLID Principles in React]] - - ์—ฐ๊ฒฐ ์ด์œ : ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)๊ณผ ์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›์น™(ISP) ๋“ฑ ์ „ํ†ต์ ์ธ ๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„ ์›์น™์„ React์˜ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์™€ ํ›…์— ์ ์šฉํ•˜์—ฌ ํด๋ฆฐ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ์‹œํ•˜๊ธฐ ๋•Œ๋ฌธ [32, 33]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋„ˆ๋ฌด ๋งŽ์€ ์ฑ…์ž„์„ ์ง€๋Š” 300์ค„ ์ด์ƒ์˜ ๋น„๋Œ€ํ•ด์ง„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ด€์‹ฌ์‚ฌ๋ณ„๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ธฐ์ค€. - -#### [์ƒํƒœ ๊ด€๋ฆฌ ๋ฐ ์ตœ์ ํ™” ๋„๊ตฌ] -- [[React Compiler]] - - ์—ฐ๊ฒฐ ์ด์œ : `useMemo`, `useCallback`๊ณผ ๊ฐ™์€ ์ˆ˜๋™ ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ ๋นŒ๋“œ ํƒ€์ž„์— AST๋ฅผ ๋ถ„์„ํ•ด ์ž๋™์œผ๋กœ JSX์™€ ๊ณ„์‚ฐ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ํ•˜๋Š” 2025๋…„ ์ฃผ์š” ๋„๊ตฌ์ด๊ธฐ ๋•Œ๋ฌธ [3, 22, 23]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: React์˜ ๋ Œ๋”๋ง ์ฃผ๊ธฐ์—์„œ ๋ถˆํ•„์š”ํ•œ ๊ณ„์‚ฐ์ด ์–ด๋–ป๊ฒŒ ์บ์‹ฑ๋˜๊ณ  ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ์˜ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๋นŒ๋“œ ๋‹จ๊ณ„ ์ตœ์ ํ™” ์›๋ฆฌ. - -- [[Zustand vs Context API]] - - ์—ฐ๊ฒฐ ์ด์œ : Context API๊ฐ€ ์ดˆ๋ž˜ํ•˜๋Š” ๋ถˆํ•„์š”ํ•œ ์ „์—ญ ๋ Œ๋”๋ง(๋ฆฌ๋ Œ๋”๋ง ํญํฌ) ๋ฌธ์ œ๋ฅผ Zustand๊ฐ€ ๋…๋ฆฝ์ ์ธ ์Šคํ† ์–ด์™€ ์ƒํƒœ ์„ ํƒ์ž(Selector)๋ฅผ ํ†ตํ•ด ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•˜๋Š”์ง€๋ฅผ ๋น„๊ตํ•˜๋Š” ํ•ต์‹ฌ ๊ฐœ๋…์ด๊ธฐ ๋•Œ๋ฌธ [16, 48]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ „์—ญ ์ƒํƒœ์˜ ๋ณ€๊ฒฝ ๋นˆ๋„์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ๋ฅผ ์„ ํƒํ•˜๋Š” ๊ธฐ์ค€๊ณผ React ๋ Œ๋”๋ง ๋น„์šฉ์„ ์ค„์ด๋Š” ๋ฐฉ๋ฒ•. - -#### [๋””๋ฒ„๊น… ๋ฐ ์—๋Ÿฌ ์ œ์–ด] -- [[Error Boundaries]] - - ์—ฐ๊ฒฐ ์ด์œ : ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํŠน์ • UI ์š”์†Œ์—์„œ ๋ฐœ์ƒํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๊ฐ€ ์ „์ฒด ํ™”๋ฉด์„ ์ค‘๋‹จ์‹œํ‚ค๋Š” ๊ฒƒ์„ ๋ง‰๊ธฐ ์œ„ํ•œ ๊ฐ€์žฅ ํ•ต์‹ฌ์ ์ธ ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์ด๊ธฐ ๋•Œ๋ฌธ [27, 28]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์„ ์–ธ์  UI ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ์˜ˆ์ธกํ•  ์ˆ˜ ์—†๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ๊ฒฉ๋ฆฌํ•˜๊ณ  Fallback ํ™”๋ฉด์„ ๋„์šธ ๊ฒƒ์ธ๊ฐ€์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ ํŒจํ„ด. - -### Deeper Research Questions - -- React Compiler๊ฐ€ ๋นŒ๋“œ ์‹œ์ ์— ์ฝ”๋“œ๋ฅผ ์ž๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ํ•จ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ , ๊ฐœ๋ฐœ์ž๊ฐ€ `useMemo`๋‚˜ `useCallback`์„ ์˜๋„์ ์œผ๋กœ ์ˆ˜๋™ ๋ฐฐ์น˜ํ•ด์•ผ ํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ์—ฃ์ง€ ์ผ€์ด์Šค๋Š” ๋ฌด์—‡์ธ๊ฐ€? -- ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ Feature-Sliced Design(FSD)์„ ์ ์šฉํ•  ๋•Œ, ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ(Feature) ๋„๋ฉ”์ธ์ด ๊ณตํ†ต์ ์œผ๋กœ ์ƒํ˜ธ์ž‘์šฉํ•ด์•ผ ํ•˜๋Š” ๊ต์ฐจ ๊ด€์‹ฌ์‚ฌ(Cross-cutting Concerns) ๋ฌธ์ œ๋Š” ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•ด์•ผ ํ•˜๋Š”๊ฐ€? -- ์ƒํƒœ ์—…๋ฐ์ดํŠธ ๋นˆ๋„๊ฐ€ ๋†’์€ ๋ฐ์ดํ„ฐ๋Š” Zustand๋กœ, ์ •์  ์„ค์ •์€ Context API๋กœ ๊ด€๋ฆฌํ•  ๋•Œ, ๋‘ ์ƒํƒœ ์‹œ์Šคํ…œ ๊ฐ„์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋™๊ธฐํ™”ํ•˜๊ฑฐ๋‚˜ ๊ฒฐํ•ฉํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ์— ์ฃผ์ž…ํ•˜๋Š” ๋ชจ๋ฒ”์ ์ธ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์•„ํ‚คํ…์ฒ˜๋Š” ๋ฌด์—‡์ธ๊ฐ€? -- ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ์˜ ๋ฏธํ•ด์ œ๋‚˜ ํด๋กœ์ €๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜(Memory Leaks) ํ˜„์ƒ์„ Chrome DevTools์˜ ํž™ ์Šค๋ƒ…์ƒท(Heap Snapshot) ๊ธฐ๋Šฅ์œผ๋กœ ํƒ์ง€ํ•˜๊ณ  ๊ฐœ์„ ํ•˜๋Š” ๊ตฌ์ฒด์  ์ ˆ์ฐจ๋Š” ๋ฌด์—‡์ธ๊ฐ€? -- Vite ๊ธฐ๋ฐ˜์˜ React ํ”„๋กœ์ ํŠธ์—์„œ `manualChunks`๋ฅผ ํ™œ์šฉํ•œ ์˜์กด์„ฑ ๋ถ„ํ• ์ด Core Web Vitals (LCP, INP) ๊ฐœ์„ ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ์ธก์ •ํ•˜๊ณ  ๋ถ„์„ํ•˜๋Š” ์ตœ์ ํ™” ํ”„๋กœ์„ธ์Šค๋Š” ๋ฌด์—‡์ธ๊ฐ€? - -### Practical Application Contexts - -- **Implementation:** React ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์šด์˜์ฒด์ œ ๊ฐ„ ๋นŒ๋“œ ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ํŒŒ์ผ๊ณผ ํด๋”๋ช…์€ `kebab-case`(์˜ˆ: `user-profile.tsx`)๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์ปดํฌ๋„ŒํŠธ์™€ ์ธํ„ฐํŽ˜์ด์Šค ๋ช…์€ `PascalCase`๋ฅผ ๋”ฐ๋ฅธ๋‹ค. ๋„ˆ๋ฌด ๋งŽ์€ ์ฑ…์ž„์„ ๊ฐ–๋Š” ์ปดํฌ๋„ŒํŠธ๋Š” SRP์— ๋”ฐ๋ผ ๋ทฐ์™€ ๋กœ์ง์œผ๋กœ ๋ถ„๋ฆฌํ•œ๋‹ค [5, 33, 35, 36]. -- **System Design:** ์ฝ”๋“œ๋ฅผ ํŒŒ์ผ ์œ ํ˜•(`components`, `hooks`)๋ณ„๋กœ ๋‹จ์ˆœ ๋‚˜์—ดํ•˜์ง€ ์•Š๊ณ  `features/auth/`์™€ ๊ฐ™์ด ๋น„์ฆˆ๋‹ˆ์Šค ๊ธฐ๋Šฅ๋ณ„ ๋ชจ๋“ˆ๋กœ ๋ฌถ์–ด ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๋Š” Feature-Sliced Design ๊ตฌ์กฐ๋ฅผ ์ฑ„ํƒํ•œ๋‹ค. ๊ฐ ๊ธฐ๋Šฅ ํด๋”๋Š” `index.ts`๋ฅผ ํ†ตํ•œ Public API๋งŒ ๋…ธ์ถœํ•ด ์บก์Аํ™”๋ฅผ ๊ฐ•ํ™”ํ•œ๋‹ค [10, 11, 32, 49]. -- **Operation / Maintenance:** ์ปดํฌ๋„ŒํŠธ ํฌ๋ž˜์‹œ๋ฅผ ๋Œ€๋น„ํ•˜์—ฌ ๋…๋ฆฝ์ ์ธ ๋‹จ์œ„(์˜ˆ: ์ฐจํŠธ, ํผ)๋งˆ๋‹ค Error Boundary๋ฅผ ์”Œ์›Œ ์žฅ์• ๋ฅผ ๊ฒฉ๋ฆฌํ•˜๊ณ , ์—๋Ÿฌ ๋ชจ๋‹ˆํ„ฐ๋ง ํ”Œ๋žซํผ(Sentry, LogRocket)์„ ์—ฐ๋™ํ•˜์—ฌ ๋Ÿฐํƒ€์ž„ ์•ˆ์ •์„ฑ์„ ํ™•๋ณดํ•œ๋‹ค. ๋˜ํ•œ ๋ฉ”๋ชจ๋ฆฌ ํ”„๋กœํŒŒ์ผ๋ง์œผ๋กœ Detached DOM Node๊ฐ€ ์žˆ๋Š”์ง€ ์ฃผ๊ธฐ์ ์œผ๋กœ ๊ฐ์‹œํ•œ๋‹ค [29, 50-52]. -- **Learning Path:** React ๊ธฐ์ดˆ ๋™์ž‘๊ณผ ์ปดํฌ๋„ŒํŠธ ๋ถ„๋ฆฌ๋ฅผ ์ดํ•ดํ•œ ๋’ค โ†’ Context API๋ฅผ ์ด์šฉํ•ด ์ „์—ญ ์ƒํƒœ๋ฅผ ๋‹ค๋ฃจ๋‹ค๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๋ฆฌ๋ Œ๋”๋ง ์ด์Šˆ๋ฅผ ์ฒด๊ฐ โ†’ Zustand๋‚˜ Redux ๊ฐ™์€ ์ƒํƒœ ๋„๊ตฌ๋ฅผ ํ•™์Šต โ†’ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋””๋ฒ„๊น… ๋ฐ React Compiler, FSD ๊ฐ™์€ ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜ ์Šค์ผ€์ผ์—… ์ˆœ์œผ๋กœ ์‹ฌํ™” ํ•™์Šตํ•œ๋‹ค [53]. -- **My Project Relevance:** React ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•  ๊ฒฝ์šฐ, ์ œ์ผ ๋จผ์ € ๋ Œ๋”๋ง ๋น„์šฉ์„ ๋†’์ด๋Š” ๊ณผ๋„ํ•œ Context API๋ฅผ Zustand๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๊ณ , ๊ฑฐ๋Œ€ํ•œ ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ๋ฅผ ๋‹จ์ผ ์ฑ…์ž„ ์›์น™์— ๋งž์ถฐ ๋ถ„๋ฆฌํ•˜์—ฌ ํŒ€ ๋‹จ์œ„ ํ˜‘์—…๊ณผ ํ…Œ์ŠคํŠธ๊ฐ€ ์šฉ์ดํ•œ ์•„ํ‚คํ…์ฒ˜๋กœ ํƒˆ๋ฐ”๊ฟˆํ•  ์ˆ˜ ์žˆ๋‹ค. - -### Adjacent Topics - -- [[Core Web Vitals & Web Performance]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ํ”„๋ก ํŠธ์—”๋“œ์˜ ์„ฑ๋Šฅ ์ตœ์ ํ™”(์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…, ๋ ˆ์ด์ง€ ๋กœ๋”ฉ)๊ฐ€ ์‹ค์ œ ์‚ฌ์šฉ์ž์˜ ํ™”๋ฉด ํ‘œ์ถœ ์†๋„(LCP)์™€ ์ƒํ˜ธ์ž‘์šฉ ์†๋„(INP) ๋“ฑ ๋ธŒ๋ผ์šฐ์ € ์ง€ํ‘œ์™€ ์–ด๋–ป๊ฒŒ ์ง๊ฒฐ๋˜๋Š”์ง€ ๋ชจ๋‹ˆํ„ฐ๋ง ๊ธฐ์ˆ ๊ณผ ์—ฐ๊ณ„ํ•˜์—ฌ ํƒ๊ตฌ [54, 55]. - -- [[Vite & Rollup Bundling Strategies]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: React ์ž‘์„ฑ ์ฝ”๋“œ๊ฐ€ ์šด์˜ ํ™˜๊ฒฝ์— ๋ฐฐํฌ๋˜๊ธฐ ์ „ Vite์™€ Rollup์„ ํ†ตํ•ด ์–ด๋–ป๊ฒŒ ES ๋ชจ๋“ˆ ํŒŒ์‹ฑ๊ณผ ์ฒญํฌ ๋ถ„ํ• (`manualChunks`)์ด ์ด๋ฃจ์–ด์ ธ ์บ์‹ฑ ํšจ์œจ์„ ๊ทน๋Œ€ํ™”ํ•˜๋Š”์ง€ ๋นŒ๋“œ ๋„๊ตฌ ๊ด€์ ์—์„œ ํƒ๊ตฌ [22, 25]. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/React Frontend Architecture.md b/00_Raw/React Frontend Architecture.md deleted file mode 100644 index 76200a99..00000000 --- a/00_Raw/React Frontend Architecture.md +++ /dev/null @@ -1,64 +0,0 @@ -# [[React Frontend Architecture]] - -## ๐Ÿ“Œ Brief Summary -React ํ”„๋ก ํŠธ์—”๋“œ ์•„ํ‚คํ…์ฒ˜๋Š” ํ™•์žฅ ๊ฐ€๋Šฅํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ์‰ฌ์šด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•œ ๊ตฌ์กฐ์  ๋ผˆ๋Œ€์ด์ž ์กฐ์งํ™” ๋ฐฉ๋ฒ•๋ก ์ด๋‹ค [1, 2]. ๊ธฐ์กด์˜ ๊ธฐ์ˆ ์  ํŒŒ์ผ ๋‹จ์œ„ ๋ถ„๋ฆฌ์—์„œ ๋ฒ—์–ด๋‚˜, ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ๊ณผ ๊ธฐ๋Šฅ(Feature-Based)์„ ์ค‘์‹ฌ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๊ตฌ์„ฑํ•˜์—ฌ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ณ  ์‘์ง‘๋„๋ฅผ ๋†’์ด๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•œ๋‹ค [3-5]. ์ด๋ฅผ ํ†ตํ•ด ๋ฌด๋ถ„๋ณ„ํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์˜ UI ๋ˆ„์ˆ˜๋ฅผ ๋ง‰๊ณ  ๋ช…ํ™•ํ•œ ์ƒํƒœ ์†Œ์œ ๊ถŒ์„ ํ™•๋ฆฝํ•˜๋ฉฐ, ํŒ€๊ณผ ์ฝ”๋“œ๋ฒ ์ด์Šค๊ฐ€ ์„ฑ์žฅํ•จ์— ๋”ฐ๋ผ ์‹œ์Šคํ…œ์ด ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š”๋‹ค [6-8]. - -## ๐Ÿ“– Core Content - -* **ํด๋” ๊ตฌ์กฐ์™€ ๋ชจ๋“ˆํ™”์˜ ์ง„ํ™”**: ๊ณผ๊ฑฐ์—๋Š” ์ปดํฌ๋„ŒํŠธ, ํ›…, ์Šคํƒ€์ผ ๋“ฑ์„ ํŒŒ์ผ ์œ ํ˜•๋ณ„๋กœ ๊ทธ๋ฃนํ™”ํ–ˆ์œผ๋‚˜, ํ”„๋กœ์ ํŠธ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ๋…ผ๋ฆฌ์  ๊ธฐ๋Šฅ์ด ํŒŒํŽธํ™”๋˜์–ด ํƒ์ƒ‰๊ณผ ํ™•์žฅ์ด ์–ด๋ ค์› ๋‹ค [4, 9]. 2025๋…„ ๊ธฐ์ค€ ํ”„๋ก ํŠธ์—”๋“œ ์—…๊ณ„ ํ‘œ์ค€์€ ๋น„์ฆˆ๋‹ˆ์Šค ๊ธฐ๋Šฅ์„ ์ค‘์‹ฌ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๋ฌถ๋Š” '๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜(Feature-Based)' ๊ตฌ์กฐ๋กœ ์ „ํ™˜๋˜์—ˆ๋‹ค [5, 10]. ํŠน์ • ๊ธฐ๋Šฅ๊ณผ ๊ด€๋ จ๋œ ์ปดํฌ๋„ŒํŠธ, ํ›…, API ๋กœ์ง ๋“ฑ์„ ๋‹จ์ผ ๋””๋ ‰ํ† ๋ฆฌ์— ์บก์Аํ™”ํ•จ์œผ๋กœ์จ ๋ชจ๋“ˆ์˜ ๋…๋ฆฝ์„ฑ๊ณผ ํ™•์žฅ์„ฑ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚จ๋‹ค [11, 12]. -* **๊ธฐ๋Šฅ ๋ถ„ํ•  ์„ค๊ณ„ (Feature-Sliced Design, FSD)**: FSD๋Š” ๋„๋ฉ”์ธ ์ฃผ๋„ ์„ค๊ณ„(DDD)์™€ ๋ชจ๋“ˆํ˜• ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ฒฐํ•ฉํ•œ ํ”„๋ก ํŠธ์—”๋“œ ์ „์šฉ ๋ฐฉ๋ฒ•๋ก ์ด๋‹ค [3, 13]. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ `app`, `pages`, `widgets`, `features`, `entities`, `shared`์˜ ๊ณ„์ธต(Layer)์œผ๋กœ ๋‚˜๋ˆ„๊ณ , ์ƒ์œ„ ๊ณ„์ธต์€ ํ•˜์œ„ ๊ณ„์ธต์—๋งŒ ์˜์กดํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์—„๊ฒฉํ•œ '๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ' ๊ทœ์น™์„ ๊ฐ•์ œํ•œ๋‹ค [11, 14, 15]. ๊ฐ ์Šฌ๋ผ์ด์Šค๋Š” `index.ts` ํ˜•ํƒœ์˜ 'Public API'๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์™ธ๋ถ€์— ๊ธฐ๋Šฅ๊ณผ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋…ธ์ถœํ•˜์—ฌ ๋‚ด๋ถ€ ๊ตฌํ˜„์„ ์•ˆ์ „ํ•˜๊ฒŒ ์บก์Аํ™”ํ•œ๋‹ค [16-18]. -* **์ƒํƒœ ๊ด€๋ฆฌ ์•„ํ‚คํ…์ฒ˜์˜ ์„ธ๋ถ„ํ™”**: ๋‹จ์ผ ๋ชจ๋†€๋ฆฌ์‹ ์Šคํ† ์–ด(์˜ˆ: ๋Œ€๊ทœ๋ชจ Redux)์— ์˜์กดํ•˜๋˜ ๋ฐฉ์‹์—์„œ ๋ฒ—์–ด๋‚˜, ๋ฐ์ดํ„ฐ์˜ ์„ฑ๊ฒฉ์— ๋”ฐ๋ผ ์ตœ์ ์˜ ๋„๊ตฌ๋ฅผ ์„ ํƒํ•˜๋„๋ก ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ํŒŒํŽธํ™”๋˜์—ˆ๋‹ค [19, 20]. ์„œ๋ฒ„์—์„œ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐ์ดํ„ฐ์ธ '์„œ๋ฒ„ ์ƒํƒœ'๋Š” TanStack Query(React Query)๋ฅผ ์ด์šฉํ•ด ์บ์‹ฑ ๋ฐ ๋„คํŠธ์›Œํฌ ๋กœ์ง์„ ๊ฒฉ๋ฆฌํ•˜๊ณ , ํ…Œ๋งˆ๋‚˜ ์„ค์ • ๋“ฑ ์ •์ ์ธ '์ „์—ญ ์ƒํƒœ'๋Š” Context API๋กœ, ์žฅ๋ฐ”๊ตฌ๋‹ˆ๋‚˜ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ์ฒ˜๋Ÿผ ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ณ€ํ•˜๋Š” ์ƒํƒœ๋Š” Zustand๋‚˜ Jotai ๋“ฑ ์„ ํƒ์  ๋ Œ๋”๋ง์„ ์ง€์›ํ•˜๋Š” ๋„๊ตฌ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค [20-24]. -* **์†Œํ”„ํŠธ์›จ์–ด ๊ณตํ•™ ์›์น™์˜ ์ ์šฉ (SOLID & Clean Code)**: React์˜ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ ๊ฐœ๋ฐœ์—๋„ ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)์„ ์ ์šฉํ•˜์—ฌ, ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ปค์ง€๋ฉด ์ƒํƒœ ๊ด€๋ฆฌ, ๋ฐ์ดํ„ฐ ํŽ˜์นญ, ๋ Œ๋”๋ง ๋“ฑ ๊ฐ๊ธฐ ๋‹ค๋ฅธ ์ฑ…์ž„์„ ๊ฐ€์ง„ ์ž‘์€ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ถ„๋ฆฌํ•ด์•ผ ํ•œ๋‹ค [25, 26]. ์ค‘๋ณต์„ ํ”ผํ•˜๋Š” DRY ์›์น™์„ ํ†ตํ•ด ๊ณตํ†ต ๋กœ์ง์„ ์ปค์Šคํ…€ ํ›…์œผ๋กœ ์ถ”์ถœํ•˜๋ฉด์„œ๋„, ์ฝ”๋“œ๋ฅผ ๋‹จ์ˆœํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋Š” KISS ์›์น™๊ณผ ๋ฏธ๋ž˜๋ฅผ ์œ„ํ•œ ๊ณผ๋„ํ•œ ์ตœ์ ํ™”๋ฅผ ํ”ผํ•˜๋Š” YAGNI ์›์น™ ๊ฐ„์˜ ๊ท ํ˜•์„ ๋งž์ถ”๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ด๋‹ค [27, 28]. -* **๋ช…๋ช… ๊ทœ์น™๊ณผ ๊ฑฐ๋ฒ„๋„Œ์Šค ๋„๊ตฌ**: ํด๋”์™€ ํŒŒ์ผ ์‹œ์Šคํ…œ์€ OS ํ™˜๊ฒฝ์— ๋”ฐ๋ฅธ ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด `kebab-case`๋ฅผ, React ์ปดํฌ๋„ŒํŠธ๋Š” `PascalCase`๋ฅผ, ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜๋Š” `camelCase`๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ณดํŽธ์ ์ธ ์ปจ๋ฒค์…˜์ด๋‹ค [29-33]. ์ด๋Ÿฌํ•œ ๊ทœ์น™๊ณผ ์•„ํ‚คํ…์ฒ˜ ์˜์กด์„ฑ ๊ฒฝ๊ณ„๋Š” ESLint๋‚˜ Prettier, Husky์™€ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•ด ๋นŒ๋“œ ํƒ€์ž„ ๋ฐ ์ปค๋ฐ‹ ๋‹จ๊ณ„์—์„œ ์ž๋™์œผ๋กœ ๊ฐ•์ œ(Linting)๋œ๋‹ค [30, 34]. - -## โš–๏ธ Trade-offs & Caveats - -* **FSD ๋ฐ ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ๋ชจ๋“ˆํ™”์˜ ๋ณต์žก์„ฑ ์˜ค๋ฒ„ํ—ค๋“œ**: Feature-Sliced Design์€ ๊ตฌ์กฐ์  ์•ˆ์ •์„ฑ์„ ์ œ๊ณตํ•˜์ง€๋งŒ "๋ฌด์—‡์ด ํ•˜๋‚˜์˜ ๊ธฐ๋Šฅ(Feature)์ธ๊ฐ€?"๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒฝ๊ณ„๋ฅผ ์„ค์ •ํ•˜๊ธฐ ๋งค์šฐ ๊นŒ๋‹ค๋กญ๋‹ค๋Š” ๊ทผ๋ณธ์  ์–ด๋ ค์›€์ด ์žˆ๋‹ค [35]. ์ธ์ฆ(Auth)๊ณผ ๊ฐ™์€ ๊ต์ฐจ ๊ด€์‹ฌ์‚ฌ(Cross-cutting concern)๋Š” ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ์— ๊ฑธ์ณ ์žˆ์–ด ์ ์ ˆํ•œ ๊ณ„์ธต์„ ์ฐพ๊ธฐ ๋ชจํ˜ธํ•˜๋ฉฐ [35, 36], ์—„๊ฒฉํ•œ ๋ถ„ํ•  ๊ทœ์น™์„ ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์— ๋„์ž…ํ•˜๋ฉด ์˜คํžˆ๋ ค ๋ถˆํ•„์š”ํ•œ ํด๋” ๊ตฌ์กฐ์™€ ์˜ค๋ฒ„์—”์ง€๋‹ˆ์–ด๋ง์œผ๋กœ ์ธํ•œ ๊ฐœ๋ฐœ ์†๋„ ์ €ํ•˜๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ๋‹ค [12, 37]. ๋˜ํ•œ, ๊ทœ์น™์„ ์ œ๋Œ€๋กœ ์ˆ™์ง€ํ•˜์ง€ ์•Š์œผ๋ฉด ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ 'Shared' ๊ณ„์ธต์— ์Ÿ์•„๋ถ€์–ด ์ตœ์•…์˜ ํŒŒ๊ธ‰ ํšจ๊ณผ๋ฅผ ๋‚ณ๋Š” ์ŠคํŒŒ๊ฒŒํ‹ฐ ์ฝ”๋“œ๊ฐ€ ๋  ์œ„ํ—˜์ด ์กด์žฌํ•œ๋‹ค [38, 39]. -* **์ถ”์ƒํ™”(DRY)์™€ ๋‹จ์ˆœํ•จ(KISS)์˜ ์ƒ์ถฉ**: DRY ์›์น™์— ์ง‘์ฐฉํ•˜์—ฌ ์ฝ”๋“œ ์ค‘๋ณต์„ ๋ฌด์กฐ๊ฑด ํ”ผํ•˜๋ ค๊ณ  ํ•˜๋ฉด, ์ˆ˜๋งŽ์€ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ์™€ ๋ถ„๊ธฐ๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฑฐ๋Œ€ํ•˜๊ณ  ๋ณต์žกํ•œ ์ปค์Šคํ…€ ํ›…์ด๋‚˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํƒ„์ƒํ•˜๊ฒŒ ๋œ๋‹ค [27]. ์ด๋Ÿฌํ•œ ๊ณผ๋„ํ•œ ์ถ”์ƒํ™”๋Š” ๋‹จ์ˆœํ•œ ์ฝ”๋“œ ๋ฐ˜๋ณต๋ณด๋‹ค ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋–จ์–ด๋œจ๋ ค KISS ์›์น™์„ ์œ„๋ฐ˜ํ•˜๋Š” ๋ฐ˜๋Œ€ ๊ธ‰๋ถ€๋ฅผ ๋‚ณ์œผ๋ฏ€๋กœ, ๋ช…ํ™•ํ•œ ํŒจํ„ด์ด 3๋ฒˆ ์ด์ƒ ๋ฐ˜๋ณต๋  ๋•Œ๊นŒ์ง€๋Š” ์ถ”์ƒํ™”๋ฅผ ๋ฏธ๋ฃจ๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋œ๋‹ค [27, 40, 41]. -* **์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ ์„ ํƒ์— ๋”ฐ๋ฅธ ๋ถ€์ž‘์šฉ**: React ๋‚ด์žฅ Context API๋Š” ์™ธ๋ถ€ ์˜์กด์„ฑ ์—†์ด ์ƒํƒœ๋ฅผ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ƒํƒœ๊ฐ’์˜ ์ผ๋ถ€๋งŒ ๋ณ€๊ฒฝ๋˜์–ด๋„ ํ•ด๋‹น ์ปจํ…์ŠคํŠธ๋ฅผ ๊ตฌ๋…ํ•˜๋Š” ๋ชจ๋“  ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ฐ•์ œ๋กœ ๋ฆฌ๋ Œ๋”๋ง๋œ๋‹ค๋Š” ์น˜๋ช…์ ์ธ ์„ฑ๋Šฅ ์ œ์•ฝ์ด ์žˆ๋‹ค [42, 43]. ๋ฐ˜๋Œ€๋กœ Redux๋Š” ๋ช…ํ™•ํ•œ ๊ตฌ์กฐ์™€ ๊ฐ•๋ ฅํ•œ ๋””๋ฒ„๊น… ํˆด์„ ์ œ๊ณตํ•˜์ง€๋งŒ, ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ์˜ ํญ๋ฐœ์  ์ฆ๊ฐ€๋ฅผ ๋™๋ฐ˜ํ•˜์—ฌ ์†Œ๊ทœ๋ชจ ํŒ€์ด๋‚˜ ๊ฐ„๋‹จํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ๊ณผ๋„ํ•œ ๊ธฐ์ˆ  ๋ถ€์ฑ„๋กœ ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๋‹ค [44, 45]. -* **์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์˜ ์ˆจ์€ ๋น„์šฉ**: `React.memo`, `useMemo`, `useCallback`์€ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ง‰์•„์ฃผ์ง€๋งŒ ๊ทธ ์ž์ฒด๊ฐ€ ๊ณต์งœ๋Š” ์•„๋‹ˆ๋‹ค [46]. ์ด์ „ Props๋‚˜ ์˜์กด์„ฑ ๋ฐฐ์—ด์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜๊ณ  ๋ณ€๊ฒฝ ์—ฌ๋ถ€๋ฅผ ์–•์€ ๋น„๊ต(Shallow compare)ํ•˜๋Š” ์—ฐ์‚ฐ ๋น„์šฉ์ด ์ถ”๊ฐ€๋œ๋‹ค [46]. ๋งŒ์•ฝ ๋ Œ๋”๋ง ๋น„์šฉ์ด ๋งค์šฐ ์‹ผ ์ปดํฌ๋„ŒํŠธ์— ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋ถˆ์•ˆ์ •ํ•œ ์ฐธ์กฐ๊ฐ’(์ธ๋ผ์ธ ํ•จ์ˆ˜, ๊ฐ์ฒด)์„ ์ง€์†์ ์œผ๋กœ ์ „๋‹ฌํ•˜์—ฌ ๋ฆฌ๋ Œ๋”๋ง ์ฐจ๋‹จ์— ์‹คํŒจํ•œ๋‹ค๋ฉด, ์ตœ์ ํ™” ์ฝ”๋“œ ์ž์ฒด๊ฐ€ ์˜คํžˆ๋ ค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋” ๋А๋ฆฌ๊ฒŒ ๋งŒ๋“œ๋Š” ๋ถ€์ž‘์šฉ์ด ๋ฐœ์ƒํ•œ๋‹ค [46, 47]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -#### [์•„ํ‚คํ…์ฒ˜ ๋ฐ ๋””์ž์ธ ํŒจํ„ด] -- [[Feature-Sliced Design]] - - ์—ฐ๊ฒฐ ์ด์œ : ํ˜„๋Œ€ React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ชจ๋“ˆํ™” ๋ฐ ๊ณ„์ธตํ™”๋ฅผ ์œ„ํ•ด ๊ณ ์•ˆ๋œ ๊ฐ€์žฅ ๋Œ€ํ‘œ์ ์ด๊ณ  ๊ตฌ์ฒด์ ์ธ ํ”„๋ก ํŠธ์—”๋“œ ์•„ํ‚คํ…์ฒ˜ ๋ฐฉ๋ฒ•๋ก ์ด๊ธฐ ๋•Œ๋ฌธ [3, 13]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋„๋ฉ”์ธ ๊ธฐ๋ฐ˜ ๋ถ„ํ• , ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ๊ทœ์น™ ์ ์šฉ ๋ฐฉ๋ฒ•, ๊ทธ๋ฆฌ๊ณ  Public API๋ฅผ ํ†ตํ•œ ์ปดํฌ๋„ŒํŠธ์˜ ์บก์Аํ™” ์›๋ฆฌ [14, 16, 17]. -- [[SOLID Principles]] - - ์—ฐ๊ฒฐ ์ด์œ : ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ํ”„๋ก ํŠธ์—”๋“œ ๊ตฌ์กฐ๋ฅผ ์งœ๊ธฐ ์œ„ํ•ด ํด๋ž˜์Šค ๊ธฐ๋ฐ˜ OOP๋ฅผ ๋„˜์–ด React์˜ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—๋„ ์ ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ทผ๋ณธ์ ์ธ ์†Œํ”„ํŠธ์›จ์–ด ์„ค๊ณ„ ์›์น™์ด๊ธฐ ๋•Œ๋ฌธ [17, 48]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)์„ ์ด์šฉํ•œ ๋น„๋Œ€ํ•ด์ง„ ์ปดํฌ๋„ŒํŠธ์˜ ๋ฆฌํŒฉํ† ๋ง ๋ฐฉ์‹ ๋ฐ ๊ฐœ๋ฐฉ-ํ์‡„ ์›์น™(OCP)์„ ํ™œ์šฉํ•œ UI ์ปดํฌ๋„ŒํŠธ ํ•ฉ์„ฑ(Composition) ์ „๋žต [25, 49]. - -#### [์ƒํƒœ ๊ด€๋ฆฌ ๋ฐ ์ตœ์ ํ™” ์ „๋žต] -- [[State Management]] - - ์—ฐ๊ฒฐ ์ด์œ : ์•„ํ‚คํ…์ฒ˜ ๋‚ด์—์„œ ๋ฐ์ดํ„ฐ(์„œ๋ฒ„ ๋ฐ์ดํ„ฐ, ๋กœ์ปฌ ์ƒํƒœ, ์ „์—ญ UI ์ƒํƒœ)์˜ ์„ฑ๊ฒฉ์— ๋”ฐ๋ผ ์ฑ…์ž„๊ณผ ์ €์žฅ์†Œ๋ฅผ ์–ด๋–ป๊ฒŒ ๋‚˜๋ˆŒ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ํ•ต์‹ฌ ๋ถ„์•ผ์ด๊ธฐ ๋•Œ๋ฌธ [20, 50]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Context API์˜ ๋ Œ๋”๋ง ํ•œ๊ณ„๋ฅผ ๋ŒํŒŒํ•˜๊ธฐ ์œ„ํ•œ Zustand/Jotai์˜ Selector ํŒจํ„ด ์ž‘๋™ ์›๋ฆฌ ๋ฐ TanStack Query๋ฅผ ํ™œ์šฉํ•œ ์„œ๋ฒ„ ์ƒํƒœ ๊ฒฉ๋ฆฌ ๊ธฐ๋ฒ• [21, 43, 51]. -- [[Performance Optimization]] - - ์—ฐ๊ฒฐ ์ด์œ : ๋Œ€๊ทœ๋ชจ ์•„ํ‚คํ…์ฒ˜๊ฐ€ ์‹ค์ œ๋กœ ์‚ฌ์šฉ์ž ๋ธŒ๋ผ์šฐ์ €์—์„œ ํšจ์œจ์ ์œผ๋กœ ๋™์ž‘ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์ˆ˜์ ์œผ๋กœ ์ˆ˜๋ฐ˜๋˜์–ด์•ผ ํ•˜๋Š” ์„ฑ๋Šฅ ์ง€ํ‘œ(Web Vitals) ๊ด€๋ฆฌ ๋ฐฉ๋ฒ•์ด๊ธฐ ๋•Œ๋ฌธ [52, 53]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ง€์—ฐ ๋กœ๋”ฉ(Lazy Loading) ๋ฐ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…์„ ํ†ตํ•œ ์ดˆ๊ธฐ ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ ์ตœ์ ํ™”, ๊ทธ๋ฆฌ๊ณ  ๋™์‹œ์„ฑ ๋ Œ๋”๋ง(Concurrent Rendering) ํ›…์˜ ํ™œ์šฉ๋ฒ• [54-56]. - -### Deeper Research Questions -- Feature-Sliced Design(FSD)์—์„œ ์ธ์ฆ(Auth)์ด๋‚˜ ๋ถ„์„(Analytics) ๊ฐ™์€ ๋„๋ฉ”์ธ ๊ฐ„์˜ ๊ต์ฐจ ๊ด€์‹ฌ์‚ฌ(Cross-cutting concerns)๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ, ๊ฒฐํ•ฉ๋„๋ฅผ ๋†’์ด์ง€ ์•Š๊ณ  ์ฃผ์ž…/๊ณต์œ ํ•˜๋Š” ๊ฐ€์žฅ ์ด์ƒ์ ์ธ ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? -- React Compiler๊ฐ€ ํ”„๋กœ์ ํŠธ์— ์„ฑ๊ณต์ ์œผ๋กœ ๋„์ž…๋˜์–ด ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๋กœ์ง(`useMemo`, `useCallback`)์ด ๋Œ€๊ฑฐ ์‚ญ์ œ๋  ๋•Œ, ํ”„๋ก ํŠธ์—”๋“œ ํด๋” ๊ตฌ์กฐ์™€ ์ฝ”๋“œ ์‘์ง‘๋„์— ์–ด๋–ค ํ˜•ํƒœ์˜ ๊ตฌ์กฐ์  ๋ณ€ํ™”๊ฐ€ ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๋Š”๊ฐ€? -- ์„œ๋ฒ„ ์ƒํƒœ(Server State) ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํด๋ผ์ด์–ธํŠธ ๊ธ€๋กœ๋ฒŒ ์ƒํƒœ(Client State) ๋„๊ตฌ๋ฅผ ์™„๋ฒฝํžˆ ๋ถ„๋ฆฌํ•œ ์•„ํ‚คํ…์ฒ˜์—์„œ, ๋‘ ์ƒํƒœ๊ฐ€ ๋ถˆ๊ฐ€ํ”ผํ•˜๊ฒŒ ๋™๊ธฐํ™”๋˜๊ฑฐ๋‚˜ ์ƒํ˜ธ์ž‘์šฉํ•ด์•ผ ํ•˜๋Š” ์—ฃ์ง€ ์ผ€์ด์Šค๋ฅผ ๊นจ๋—ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š” ํŒจํ„ด์€ ๋ฌด์—‡์ธ๊ฐ€? -- ๋Œ€๊ทœ๋ชจ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ํ™˜๊ฒฝ์—์„œ Micro-Frontends ์•„ํ‚คํ…์ฒ˜์™€ Feature-Sliced Design์€ ์–ด๋–ป๊ฒŒ ํ˜ธํ™˜๋˜๋ฉฐ, ๊ฐ ๋…๋ฆฝ ์„œ๋น„์Šค ๊ฐ„์˜ ์ค‘๋ณต ์ฝ”๋“œ(Shared ๋ ˆ์ด์–ด) ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ํ†ต์ œํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? -- ๋ณต์žก๋„ ๋†’์€ ์ˆœ์ˆ˜ ํ•จ์ˆ˜ํ˜• React ์ปดํฌ๋„ŒํŠธ์— ์˜์กด์„ฑ ์—ญ์ „ ์›์น™(DIP)์„ ์ ์šฉํ•  ๋•Œ, ์ปจํ…์ŠคํŠธ(Context API)๋‚˜ ํ”„๋กญ ๋“œ๋ฆด๋ง(Prop Drilling)์„ ํ”ผํ•˜๋ฉด์„œ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ˜„๋Œ€์ ์ธ ์ œ์–ด ์—ญ์ „(IoC) ๊ตฌํ˜„ ํŒจํ„ด์€ ๋ฌด์—‡์ด ์žˆ๋Š”๊ฐ€? - -### Practical Application Contexts - -- **Implementation:** ๊ธฐ์ˆ ์  ํŒŒ์ผ ์œ ํ˜•(์ปดํฌ๋„ŒํŠธ, ํ›…) ์ค‘์‹ฌ์˜ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ์—์„œ ๋ฒ—์–ด๋‚˜, `src/features/` ๋‚ด์— ํŠน์ • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง(์˜ˆ: ์žฅ๋ฐ”๊ตฌ๋‹ˆ, ์œ ์ € ํ”„๋กœํ•„)์— ์—ฐ๊ด€๋œ UI, API ํ†ต์‹ , ๋กœ์ปฌ ํ›…์„ ์บก์Аํ™”ํ•˜์—ฌ ๊ตฌํ˜„ํ•œ๋‹ค [5, 11, 57]. -- **System Design:** ๋ชจ๋†€๋ฆฌ์‹ ๊ธ€๋กœ๋ฒŒ ์Šคํ† ์–ด ์„ค๊ณ„ ์ง€์–‘. API ์บ์‹ฑ ๋ฐ ์„œ๋ฒ„ ๋ฐ์ดํ„ฐ๋Š” TanStack Query๋ฅผ ์‚ฌ์šฉํ•ด ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๊ฒฝ๊ณ„๋กœ ๋ถ„๋ฆฌํ•˜๊ณ , ๋‹คํฌ ๋ชจ๋“œ ๊ฐ™์€ ์•ฑ ์„ค์ •์€ Context API๋กœ, ์‹ค์‹œ๊ฐ„ UI ์ƒํƒœ ๋ณ€๊ฒฝ์€ Zustand ๋“ฑ์œผ๋กœ ์ชผ๊ฐœ์–ด ์‹œ์Šคํ…œ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ์ตœ์ ํ™”ํ•œ๋‹ค [20, 21, 24]. -- **Operation / Maintenance:** ๋Ÿฐํƒ€์ž„ ํฌ๋ž˜์‹œ์— ๋Œ€๋น„ํ•˜๊ธฐ ์œ„ํ•ด Error Boundary ์ปดํฌ๋„ŒํŠธ๋ฅผ ์•ฑ์˜ ์ตœ์ƒ๋‹จ๋ฟ ์•„๋‹ˆ๋ผ ๋ถˆ์•ˆ์ •ํ•œ ์„œ๋“œํŒŒํ‹ฐ ์œ„์ ฏ์ด๋‚˜ ๊ฐœ๋ณ„ ๋ผ์šฐํŠธ ๋‹จ์œ„์— ๊ฐ์‹ธ, ํŠน์ • ๋ชจ๋“ˆ์˜ ์—๋Ÿฌ๊ฐ€ ์•ฑ ์ „์ฒด์˜ "ํ™”์ดํŠธ ์Šคํฌ๋ฆฐ" ์žฅ์• ๋กœ ๋ฒˆ์ง€๋Š” ๊ฒƒ์„ ์ฐจ๋‹จํ•œ๋‹ค [58-60]. -- **Learning Path:** React ๊ธฐ์ดˆ ๋ฌธ๋ฒ• ๋ฐ ๋ Œ๋”๋ง ์›๋ฆฌ ํŒŒ์•… -> ์ปดํฌ๋„ŒํŠธ ์žฌ์‚ฌ์šฉ๊ณผ SRP ์›์น™(SOLID) ํ•™์Šต -> ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ํด๋” ๊ตฌ์กฐ ๋ฐ FSD ์ ์šฉ ๋ฐฉ์‹ ์ดํ•ด -> ๋ฒˆ๋“ค ์ตœ์ ํ™” ๋ฐ ๋ Œ๋”๋ง ๋ฆฌํŒฉํ† ๋ง ์Šคํ‚ฌ ํ–ฅ์ƒ์˜ ํ๋ฆ„์œผ๋กœ ์—ญ๋Ÿ‰์„ ๋ฐœ์ „์‹œํ‚จ๋‹ค [6, 17, 25]. -- **My Project Relevance:** ๊ธฐ์กด ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ `components/` ํด๋”์— ์ˆ˜์‹ญ ๊ฐœ์˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฐฉ์น˜๋˜์–ด ์žˆ๊ฑฐ๋‚˜, `useCallback` ๋“ฑ์ด ๊ณผ๋„ํ•˜๊ฒŒ ์‚ฌ์šฉ๋œ ๊ฒฝ์šฐ, ์ด๋ฅผ ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ ๋‹จ์œ„์˜ ํด๋”๋กœ ์žฌ๋ฐฐ์น˜ํ•˜๊ณ  ํ”„๋กœํŒŒ์ผ๋Ÿฌ(Profiler)๋ฅผ ํ†ตํ•ด ์‹ค์ œ ๋ณ‘๋ชฉ ์ง€์ ์„ ์ธก์ •ํ•œ ๋’ค ์ตœ์ ํ™”๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜ ๋ฆฌํŒฉํ† ๋ง์— ์ง๊ฒฐ๋œ๋‹ค [12, 61, 62]. - -### Adjacent Topics - -- [[Micro-Frontends]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋‹จ์ผ React SPA ์•„ํ‚คํ…์ฒ˜์˜ ํ•œ๊ณ„๋ฅผ ๋„˜์–ด, ๋…๋ฆฝ์ ์œผ๋กœ ๋ฐฐํฌ ๋ฐ ๊ด€๋ฆฌ ๊ฐ€๋Šฅํ•œ ์—ฌ๋Ÿฌ ํ”„๋ก ํŠธ์—”๋“œ ํŒ€๊ณผ ์„œ๋น„์Šค๋ฅผ ํ•˜๋‚˜๋กœ ์กฐ์œจํ•˜๋Š” ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ๊ธ‰ ์ธํ”„๋ผ ํ™•์žฅ ๊ด€์ ์œผ๋กœ ์—ฐ๊ฒฐ [3, 63]. -- [[Observability and Monitoring]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ์„ค๊ณ„ํ•œ ์•„ํ‚คํ…์ฒ˜๊ฐ€ ์‹ค์ œ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๊ณ  ์–ด๋””์„œ ๋ณ‘๋ชฉ์„ ์ผ์œผํ‚ค๋Š”์ง€ ์ธก์ •ํ•˜๊ธฐ ์œ„ํ•œ ๊ตฌ์กฐ์  ๋กœ๊น…, ์„ฑ๋Šฅ ํ”„๋กœํŒŒ์ผ๋ง(Web Vitals), ๊ทธ๋ฆฌ๊ณ  Sentry๋ฅผ ํ™œ์šฉํ•œ ์„ธ์…˜ ๋ชจ๋‹ˆํ„ฐ๋ง ๊ธฐ๋ฒ•์œผ๋กœ ํ™•์žฅ [64-66]. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/React Project Git Governance.md b/00_Raw/React Project Git Governance.md deleted file mode 100644 index 3a65c3c3..00000000 --- a/00_Raw/React Project Git Governance.md +++ /dev/null @@ -1,66 +0,0 @@ -# [[React Project Git Governance]] - -## ๐Ÿ“Œ Brief Summary -React ํ”„๋กœ์ ํŠธ Git ๊ฑฐ๋ฒ„๋„Œ์Šค๋Š” ํ˜‘์—… ํ™˜๊ฒฝ์—์„œ ์ฝ”๋“œ ํ’ˆ์งˆ์„ ์œ ์ง€ํ•˜๊ณ  ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ •์˜๋œ ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ, ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ์ž‘์„ฑ, ํ’€ ๋ฆฌํ€˜์ŠคํŠธ(PR) ๊ด€๋ฆฌ ๋“ฑ์˜ ๊ทœ์น™๊ณผ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์†Œ๊ทœ๋ชจ ๋ฐ ๋Œ€๊ทœ๋ชจ ํŒ€์—์„œ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์˜ ์•ˆ์ •์„ฑ์„ ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋กœ ์ง€์† ์œ ์ง€ํ•˜๋ฉฐ, ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜(Feature Branch) ์šด์šฉ, ํ‹ฐ์ผ“ ID ์—ฐ๋™, Conventional Commits, ๊ทธ๋ฆฌ๊ณ  ์ž๋™ํ™”๋œ ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ(Visual Regression Testing) ๋“ฑ์„ ํ†ตํ•ฉํ•˜์—ฌ ๋น ๋ฅธ ํ”ผ๋“œ๋ฐฑ ๋ฃจํ”„์™€ ๋ช…ํ™•ํ•œ ์ถ”์ ์„ฑ์„ ํ™•๋ณดํ•˜๋Š” ๋ฐ ์ค‘์ ์„ ๋‘ก๋‹ˆ๋‹ค. - -## ๐Ÿ“– Core Content -* **๋ธŒ๋žœ์น˜ ์ „๋žต (Branching Strategies):** ์†Œ๊ทœ๋ชจ ํŒ€(2~5๋ช…)์˜ ๊ฒฝ์šฐ ๋ณต์žกํ•œ Git-Flow ์›Œํฌํ”Œ๋กœ์šฐ๋ณด๋‹ค๋Š” '๋ณดํ˜ธ๋œ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜๋ฅผ ๊ฐ–์ถ˜ ๋‹จ์ˆœ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜ ์›Œํฌํ”Œ๋กœ์šฐ(Feature-branch workflow)' ๋˜๋Š” ๋‹จ๊ธฐ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜๋ฅผ ํ™œ์šฉํ•˜๋Š” 'ํŠธ๋ ํฌ ๊ธฐ๋ฐ˜(Trunk-based) ์›Œํฌํ”Œ๋กœ์šฐ'๊ฐ€ ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค. `main` ๋ธŒ๋žœ์น˜๋Š” ํ•ญ์ƒ ์•ˆ์ •์ ์ด๊ณ  ์ฆ‰์‹œ ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ์—ฌ์•ผ ํ•˜๋ฉฐ, ๊ฐœ๋ฐœ์ž๋Š” ์ ˆ๋Œ€ `main` ๋ธŒ๋žœ์น˜์— ์ง์ ‘ ์ปค๋ฐ‹ํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. -* **๋ธŒ๋žœ์น˜ ๋ช…๋ช… ๊ทœ์น™ (Branch Naming Conventions):** ์„ค๋ช…์ด ๋ช…ํ™•ํ•œ ์งง์€ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋˜, `feature/`, `bugfix/`, `chore/` ๋“ฑ์˜ ์œ ํ˜• ์ ‘๋‘์‚ฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด์Šˆ ์ถ”์ ์„ฑ(Traceability)์„ ์œ„ํ•ด JIRA ๋“ฑ์˜ ํ‹ฐ์ผ“ ID๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค(์˜ˆ: `feature/PROJ-123-user-auth`). ๋‹จ์–ด ๊ตฌ๋ถ„์—๋Š” ์–ธ๋”์Šค์ฝ”์–ด(_) ๋Œ€์‹  ํ•˜์ดํ”ˆ(-)์„ ์‚ฌ์šฉํ•˜๊ณ , ์†Œ๋ฌธ์ž๋กœ ํ†ต์ผํ•ฉ๋‹ˆ๋‹ค. -* **์ปค๋ฐ‹ ๊ทœ์น™ (Commit Rules):** ํ•˜๋‚˜์˜ ์ปค๋ฐ‹์€ ํ•˜๋‚˜์˜ ๋…ผ๋ฆฌ์  ๋ณ€๊ฒฝ์‚ฌํ•ญ๋งŒ ํฌํ•จํ•˜๋Š” ์›์ž์  ์ปค๋ฐ‹(Atomic Commit)์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๋Š” 'Conventional Commits' ์‚ฌ์–‘(`feat:`, `fix:`, `refactor:` ๋“ฑ)์„ ๋”ฐ๋ผ ์ž‘์„ฑํ•˜์—ฌ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ์‰ฝ๊ฒŒ ์Šค์บ”ํ•˜๊ณ  ๋ฆด๋ฆฌ์Šค ๋…ธํŠธ๋ฅผ ์ž๋™ํ™”ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ๋œ ๋‚ด์šฉ(What)๊ณผ ๊ทธ ์ด์œ (Why)๋ฅผ ๋ช…ํ™•ํžˆ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. -* **PR(Pull Request) ๋ฐ ๋ณ‘ํ•ฉ(Merging) ๊ทœ์น™:** ์ฝ”๋“œ๋ฅผ ๋ณ‘ํ•ฉํ•˜๊ธฐ ์ „ ๋ฐ˜๋“œ์‹œ PR์„ ์ƒ์„ฑํ•ด์•ผ ํ•˜๋ฉฐ, ์ตœ์†Œ 1๋ช… ์ด์ƒ์˜ ๋™๋ฃŒ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ์Šน์ธ๊ณผ CI ํ…Œ์ŠคํŠธ ํ†ต๊ณผ๊ฐ€ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค. PR์€ ๋น ๋ฅด๊ณ  ์ฒ ์ €ํ•œ ๋ฆฌ๋ทฐ๋ฅผ ์œ„ํ•ด ๋‹จ์ผ ์ž‘์—…์— ์ง‘์ค‘๋œ ์ž‘์€ ํฌ๊ธฐ๋กœ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ณ‘ํ•ฉ ์‹œ์—๋Š” ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์Šค์ฟผ์‹œ ๋ณ‘ํ•ฉ(Squash Merge)์„ ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋ฉฐ, ๋ณ‘ํ•ฉ ํ›„์—๋Š” ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜๋ฅผ ์ž๋™ ์‚ญ์ œํ•˜์—ฌ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. -* **์‹œ๊ฐ์  ๋ฆฌ๋ทฐ ๋ฐ ์ž๋™ํ™” (Visual Reviews):** ํ”„๋ก ํŠธ์—”๋“œ/React์˜ ํŠน์„ฑ์— ๋งž์ถฐ Storybook๊ณผ Chromatic ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ PR ๋‹จ๊ณ„์—์„œ ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ(Visual Regression Testing)๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์˜๋„์น˜ ์•Š์€ UI ๋ ˆ์ด์•„์›ƒ, ์—ฌ๋ฐฑ, ์ƒ‰์ƒ ๋ณ€๊ฒฝ ๋“ฑ์˜ ์‹œ๊ฐ์  ๊ฒฐํ•จ์ด ํ”„๋กœ๋•์…˜์— ๋ณ‘ํ•ฉ๋˜๋Š” ๊ฒƒ์„ ์„ ์ œ์ ์œผ๋กœ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค. - -## โš–๏ธ Trade-offs & Caveats -* **์—„๊ฒฉํ•œ ๊ทœ์น™ vs ๊ฐœ๋ฐœ ์˜ค๋ฒ„ํ—ค๋“œ:** PR ์ƒ์„ฑ, ํ‹ฐ์ผ“ ID ํ•„์ˆ˜ ํฌํ•จ, ์ตœ์†Œ 1์ธ ๋ฆฌ๋ทฐ ์š”๊ตฌ, CI/CD ๋นŒ๋“œ ๋ฐ ํ…Œ์ŠคํŠธ ํ†ต๊ณผ ๋“ฑ์˜ ์—„๊ฒฉํ•œ ๊ทœ์น™์€ ์ฝ”๋“œ ํ’ˆ์งˆ๊ณผ ์•ˆ์ •์„ฑ์„ ํฌ๊ฒŒ ๋†’์ด์ง€๋งŒ, ์•„์ฃผ ์ž‘๊ณ  ์‚ฌ์†Œํ•œ ์ˆ˜์ •์กฐ์ฐจ ๋™์ผํ•œ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ฑฐ์ณ์•ผ ํ•˜๋ฏ€๋กœ ๊ฐœ๋ฐœ ๋ฐ ๋ฐฐํฌ ์†๋„์— ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -* **์Šค์ฟผ์‹œ ๋ณ‘ํ•ฉ(Squash Merge)์˜ ๋‹จ์ :** ์Šค์ฟผ์‹œ ๋ณ‘ํ•ฉ์€ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์˜ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ํ•œ ์ค„๋กœ ๊น”๋”ํ•˜๊ฒŒ ์œ ์ง€ํ•ด์ฃผ์ง€๋งŒ, ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ฐœ๋ณ„ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜ ๋‚ด์—์„œ ์ž‘์—…ํ•˜๋ฉฐ ๋‚จ๊ฒผ๋˜ ์„ธ์„ธํ•œ ์ปค๋ฐ‹ ๋‹จ์œ„์˜ ๋…ผ๋ฆฌ์  ํ๋ฆ„์ด๋‚˜ ํžˆ์Šคํ† ๋ฆฌ๋Š” ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์—์„œ ์ถ”์ ํ•˜๊ธฐ ์–ด๋ ค์›Œ์ง‘๋‹ˆ๋‹ค. -* **์žฅ๊ธฐ ๋ธŒ๋žœ์น˜(Long-lived Branches)์˜ ์œ„ํ—˜:** ๊ถŒ์žฅ๋˜๋Š” '๋‹จ๊ธฐ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜' ์›์น™์„ ์–ด๊ธฐ๊ณ  ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜๋ฅผ ๋„ˆ๋ฌด ์˜ค๋ž˜ ์œ ์ง€ํ•  ๊ฒฝ์šฐ, ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์™€์˜ ๋™๊ธฐํ™”๊ฐ€ ํฌ๊ฒŒ ํ‹€์–ด์ ธ ์ถ”ํ›„ ๊ฑฐ๋Œ€ํ•œ ๋ณ‘ํ•ฉ ์ถฉ๋Œ(Merge Conflict)์ด ๋ฐœ์ƒํ•˜๋ฉฐ ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๋ง‰๋Œ€ํ•œ ์‹œ๊ฐ„์ด ์†Œ๋ชจ๋ฉ๋‹ˆ๋‹ค. -* **Trunk-based ๊ฐœ๋ฐœ ์ „ํ™˜ ์‹œ์˜ ์š”๊ตฌ์‚ฌํ•ญ:** ๋น ๋ฅธ ํ†ตํ•ฉ์„ ์œ„ํ•ด Trunk-based ๊ฐœ๋ฐœ๋กœ ์ „ํ™˜ํ•˜๋ ค๋ฉด ํŒ€์› ๊ฐ„์˜ ๊ธด๋ฐ€ํ•œ ์กฐ์œจ๊ณผ ๋†’์€ ์ˆ™๋ จ๋„๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์™„๋ฃŒ๋˜์ง€ ์•Š์€ ๊ธฐ๋Šฅ์ด ์‚ฌ์šฉ์ž์—๊ฒŒ ๋…ธ์ถœ๋˜์ง€ ์•Š๋„๋ก ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ(Feature Flags)๋ฅผ ๋„์ž…ํ•˜๊ณ  ๊ฐ•๋ ฅํ•œ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์„ ๊ฐ–์ถ”์–ด์•ผ ํ•˜๋Š” ์ถ”๊ฐ€์ ์ธ ๊ด€๋ฆฌ ๋ถ€๋‹ด์ด ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -#### [๊ด€๊ณ„ ์œ ํ˜• A: ์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] -- [[Feature-branch workflow]] - - ์—ฐ๊ฒฐ ์ด์œ : ์†Œ๊ทœ๋ชจ React ํŒ€์—์„œ ์ฝ”๋“œ ์ถฉ๋Œ์„ ์ค„์ด๊ณ  ๋ฉ”์ธ ๋ธŒ๋žœ์น˜ ์•ˆ์ •์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ€์žฅ ๊ถŒ์žฅ๋˜๋Š” ๊ธฐ๋ณธ Git ๋ธŒ๋žœ์น˜ ์ „๋žต์ž…๋‹ˆ๋‹ค. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋…๋ฆฝ์ ์ธ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ์„ ๊ฒฉ๋ฆฌํ•˜๊ณ  ์•ˆ์ „ํ•˜๊ฒŒ ํ†ตํ•ฉ(Merge)ํ•˜๋Š” ์ „์ฒด ์ˆ˜๋ช… ์ฃผ๊ธฐ ์›๋ฆฌ. -- [[Conventional Commits]] - - ์—ฐ๊ฒฐ ์ด์œ : ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ํ˜•์‹์„ ํ‘œ์ค€ํ™”ํ•˜์—ฌ ์ž๋™ํ™”๋œ ๋ฆด๋ฆฌ์Šค ๋…ธํŠธ ์ž‘์„ฑ๊ณผ ๋ช…ํ™•ํ•œ ์ฝ”๋“œ ํžˆ์Šคํ† ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ํ•ต์‹ฌ ๊ฑฐ๋ฒ„๋„Œ์Šค ๊ทœ์น™์ž…๋‹ˆ๋‹ค. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: `feat`, `fix`, `chore` ๋“ฑ ์ปค๋ฐ‹ ํƒ€์ž…์˜ ์ •ํ™•ํ•œ ์˜๋ฏธ์™€ ๊ธฐ๊ณ„๊ฐ€ ์ฝ์„ ์ˆ˜ ์žˆ๋Š”(machine-readable) ํžˆ์Šคํ† ๋ฆฌ ๊ด€๋ฆฌ ๋ฐฉ๋ฒ•. - -#### [๊ด€๊ณ„ ์œ ํ˜• B: ๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ ๋ฐ ํ”„๋กœ์„ธ์Šค] -- [[Pull Request (PR) Etiquette]] - - ์—ฐ๊ฒฐ ์ด์œ : ์ฝ”๋“œ๊ฐ€ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์— ๋ณ‘ํ•ฉ๋˜๊ธฐ ์ „ ์ฝ”๋“œ ํ’ˆ์งˆ์„ ๊ฒ€์ฆํ•˜๋Š” ์ตœ์ข… ๊ด€๋ฌธ์ด์ž, ํŒ€์› ๊ฐ„์˜ ๋น„๋™๊ธฐ์  ์†Œํ†ต๊ณผ ์ฝ”๋“œ ๋ฆฌ๋ทฐ๊ฐ€ ์ด๋ฃจ์–ด์ง€๋Š” ํ”„๋กœ์„ธ์Šค์ž…๋‹ˆ๋‹ค. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: PR ํฌ๊ธฐ๋ฅผ ์ž‘๊ฒŒ ์œ ์ง€ํ•˜์—ฌ ๋ฆฌ๋ทฐ ์†๋„์™€ ์ •ํ™•์„ฑ์„ ๋†’์ด๋Š” ํ˜‘์—… ์ตœ์ ํ™” ๋ฐฉ๋ฒ•. -- [[Visual Regression Testing]] - - ์—ฐ๊ฒฐ ์ด์œ : React UI ์ปดํฌ๋„ŒํŠธ์˜ ์‹œ๊ฐ์  ๋ณ€๊ฒฝ์‚ฌํ•ญ(๋ ˆ์ด์•„์›ƒ, ์ƒ‰์ƒ ๋“ฑ)์„ PR ๋‹จ๊ณ„์—์„œ ์ž๋™์œผ๋กœ ๊ฐ์ง€ํ•˜๊ณ  ๋ฆฌ๋ทฐํ•˜์—ฌ UI ๊ฒฐํ•จ์„ ๋ฐฉ์ง€ํ•˜๋Š” ํ”„๋ก ํŠธ์—”๋“œ ํŠนํ™” ํ…Œ์ŠคํŠธ์ž…๋‹ˆ๋‹ค. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Storybook๊ณผ Chromatic์„ ์ด์šฉํ•œ ์ž๋™ํ™”๋œ UI ๋ฆฌ๋ทฐ ์›Œํฌํ”Œ๋กœ์šฐ ๋ฐ ์‹œ๊ฐ์  ์ฐจ์ด ๋น„๊ต ์›๋ฆฌ. -- [[Squash Merge]] - - ์—ฐ๊ฒฐ ์ด์œ : ๋ณ‘ํ•ฉ ์‹œ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜์˜ ์—ฌ๋Ÿฌ ์ปค๋ฐ‹์„ ๋‹จ์ผ ์ปค๋ฐ‹์œผ๋กœ ์••์ถ•ํ•˜์—ฌ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ์ •๋ฆฌํ•˜๋Š” ๊ถŒ์žฅ ๋ณ‘ํ•ฉ ์ „๋žต์ž…๋‹ˆ๋‹ค. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ธŒ๋žœ์น˜ ๋ณ‘ํ•ฉ ์ „๋žต์˜ ์ฐจ์ด์ ๊ณผ ๋ฒ„์ „ ๊ธฐ๋ก ๊ฐ€๋…์„ฑ ํ–ฅ์ƒ. - -### Deeper Research Questions - -- Git-Flow, GitHub Flow, Trunk-Based Development ๊ฐ๊ฐ์˜ ์›Œํฌํ”Œ๋กœ์šฐ๋Š” React ํ”„๋กœ์ ํŠธ์˜ ๊ทœ๋ชจ, ๋ฐฐํฌ ์ฃผ๊ธฐ, ํŒ€ ์„ฑ์ˆ™๋„์— ๋”ฐ๋ผ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅด๊ฒŒ ์ ์šฉ๋˜์–ด์•ผ ํ•˜๋Š”๊ฐ€? -- ๋‹จ๊ธฐ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜(Short-lived feature branches)๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๊ฐ€ React ์ปดํฌ๋„ŒํŠธ ๋ฐ ๊ธฐ๋Šฅ ๋‹จ์œ„๋ฅผ ์ž‘๊ฒŒ ๋ถ„ํ• (Task breakdown)ํ•˜๋Š” ๊ฐ€์žฅ ํšจ๊ณผ์ ์ธ ๊ธฐ์ค€์€ ๋ฌด์—‡์ธ๊ฐ€? -- Conventional Commits ์‚ฌ์–‘์„ ํ”„๋ก ํŠธ์—”๋“œ CI/CD ํŒŒ์ดํ”„๋ผ์ธ(์˜ˆ: ๋ฆด๋ฆฌ์Šค ๋ฒ„์ „ ์ž๋™ ํŽŒํ•‘, ์ฒด์ธ์ง€๋กœ๊ทธ ์ž๋™ ์ƒ์„ฑ)๊ณผ ์—ฐ๋™ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๊ธฐ์ˆ ์  ์ด์ ๊ณผ ๊ตฌ์„ฑ ์ƒ์˜ ์ œ์•ฝ ์‚ฌํ•ญ์€ ๋ฌด์—‡์ธ๊ฐ€? -- React UI ์ปดํฌ๋„ŒํŠธ์— ๋Œ€ํ•œ PR ๋ฆฌ๋ทฐ ์‹œ, ์ „ํ†ต์ ์ธ ์ฝ”๋“œ ๋ฆฌ๋ทฐ(Code Review)์™€ Chromatic ๋“ฑ์„ ํ†ตํ•œ ์‹œ๊ฐ์  ๋ฆฌ๋ทฐ(Visual Review)๋Š” ํ”„๋กœ์„ธ์Šค ์ƒ์—์„œ ์–ด๋–ป๊ฒŒ ๊ฒฐํ•ฉํ•˜์—ฌ ์‹œ๋„ˆ์ง€๋ฅผ ๋‚ด๋Š”๊ฐ€? -- ์ง€์†์ ์ธ ํ†ตํ•ฉ ๋ฐ ๋ฐฐํฌ(CI/CD)๋ฅผ ์œ„ํ•ด Trunk-based ๊ฐœ๋ฐœ์„ ๋„์ž…ํ•  ๋•Œ, React ์•„ํ‚คํ…์ฒ˜ ๋‚ด์—์„œ ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ(Feature Flags)๋ฅผ ์–ด๋–ป๊ฒŒ ์„ค๊ณ„ํ•˜๊ณ  ์ ์šฉํ•ด์•ผ ํ•˜๋Š”๊ฐ€? - -### Practical Application Contexts - -- **Implementation:** React ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐ ์„ธํŒ… ์‹œ, Husky ๋“ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ Git ํ”„๋ฆฌ์ปค๋ฐ‹ ํ›…(pre-commit hooks)์„ ์„ค์ •ํ•จ์œผ๋กœ์จ Conventional Commits ํ˜•์‹๊ณผ ๋ธŒ๋žœ์น˜ ๋ช…๋ช… ๊ทœ์น™์„ ํŒ€ ์ „์ฒด์— ๊ฐ•์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -- **System Design:** ์ง€๋ผ(Jira)์™€ ๊ฐ™์€ ํ‹ฐ์ผ“ ๋ฐœํ–‰ ์‹œ์Šคํ…œ๊ณผ GitHub/GitLab์„ ์—ฐ๋™ํ•˜์—ฌ, ์ƒ์„ฑ๋œ ๋ชจ๋“  PR๊ณผ ์ปค๋ฐ‹ ๋‚ด์—ญ์ด ํŠน์ • ๋น„์ฆˆ๋‹ˆ์Šค ์š”๊ตฌ์‚ฌํ•ญ(ํ‹ฐ์ผ“ ID)๊ณผ 1:1๋กœ ๋งคํ•‘ ๋ฐ ์ถ”์  ๊ฐ€๋Šฅํ•˜๋„๋ก ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•ฉ๋‹ˆ๋‹ค. -- **Operation / Maintenance:** ์ €์žฅ์†Œ์˜ `main` ๋ธŒ๋žœ์น˜์— ๋ธŒ๋žœ์น˜ ๋ณดํ˜ธ ๊ทœ์น™(Branch Protection Rule)์„ ์ ์šฉํ•˜์—ฌ, ์ง๋ฐฐํฌ๋ฅผ ์›์ฒœ ์ฐจ๋‹จํ•˜๊ณ  ๋ฐ˜๋“œ์‹œ 1์ธ ์ด์ƒ์˜ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ์Šน์ธ๊ณผ CI ๋นŒ๋“œ/ํ…Œ์ŠคํŠธ(์˜ˆ: ESLint, Storybook ํ…Œ์ŠคํŠธ) ํ†ต๊ณผ๋ฅผ ์š”๊ตฌํ•˜๋„๋ก ์šด์˜ํ•ฉ๋‹ˆ๋‹ค. -- **Learning Path:** ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ์—์„œ๋ถ€ํ„ฐ '์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ -> ์˜๋ฏธ ์žˆ๋Š” ์›์ž์  ์ปค๋ฐ‹ ์ž‘์„ฑ -> PR ์ƒ์„ฑ -> ์ฝ”๋“œ ๋ฆฌ๋ทฐ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ -> ์Šค์ฟผ์‹œ ๋ณ‘ํ•ฉ'์˜ ์ „์ฒด ์‚ฌ์ดํด์„ ์ฒดํ™”ํ•˜๊ณ , ์ ์ฐจ ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ ๋„๊ตฌ๋ฅผ PR ๋ฆฌ๋ทฐ ํŒŒ์ดํ”„๋ผ์ธ์— ํ†ตํ•ฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค. -- **My Project Relevance:** ํ˜„์žฌ ์ง„ํ–‰ ์ค‘์ธ ์†Œ๊ทœ๋ชจ React ํ”„๋กœ์ ํŠธ์— ๋ณต์žกํ•œ Git-Flow ๋Œ€์‹  ์ œ์•ˆ๋œ '๋ณดํ˜ธ๋œ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜๋ฅผ ์ง€๋‹Œ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜ ์›Œํฌํ”Œ๋กœ์šฐ'๋ฅผ ํ”„๋กœ์ ํŠธ ๊ทœ์น™์œผ๋กœ ์ฆ‰๊ฐ ๋„์ž…ํ•˜์—ฌ ๋ธŒ๋žœ์น˜ ๊ด€๋ฆฌ ๋น„์šฉ๊ณผ ๋ณ‘ํ•ฉ ์ถฉ๋Œ์„ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - -### Adjacent Topics - -- [[CI/CD Pipelines in Frontend]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: Git ๊ฑฐ๋ฒ„๋„Œ์Šค๋ฅผ ํ†ตํ•ด ์—„๊ฒฉํžˆ ๊ด€๋ฆฌ๋˜์–ด ๋ณ‘ํ•ฉ๋œ ์ฝ”๋“œ๊ฐ€ ์ดํ›„ ์–ด๋–ป๊ฒŒ ์ž๋™์œผ๋กœ ๋นŒ๋“œ, ํ…Œ์ŠคํŠธ, ๋ฐฐํฌ๋˜๋Š”์ง€ ํ”„๋ก ํŠธ์—”๋“œ ํŒŒ์ดํ”„๋ผ์ธ ์ „์ฒด์˜ ๊ตฌ์ถ• ๋ฐฉ๋ฒ•๋ก ์„ ํƒ๊ตฌํ•ฉ๋‹ˆ๋‹ค. -- [[React Component Testing Strategies]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: PR์„ ๋ณ‘ํ•ฉํ•˜๊ธฐ ์ „ CI์—์„œ ํ•„์ˆ˜์ ์œผ๋กœ ํ†ต๊ณผํ•ด์•ผ ํ•˜๋Š” ํ…Œ์ŠคํŠธ(Unit, Integration, E2E)์˜ ์ข…๋ฅ˜์™€ React ์ƒํƒœ๊ณ„์—์„œ ์ด๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ์ „๋žต์„ ์กฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/React Scalability.md b/00_Raw/React Scalability.md deleted file mode 100644 index 6bd3e18d..00000000 --- a/00_Raw/React Scalability.md +++ /dev/null @@ -1,67 +0,0 @@ -# [[React Scalability]] - -## ๐Ÿ“Œ Brief Summary -React Scalability(React ํ™•์žฅ์„ฑ)๋Š” ๊ธฐ๋Šฅ, ํŒ€ ๊ทœ๋ชจ, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์˜ ๋ณต์žก์„ฑ์ด ์ฆ๊ฐ€ํ•จ์— ๋”ฐ๋ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ, ์œ ์ง€๋ณด์ˆ˜์„ฑ, ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ์„ฑ์žฅ์„ ์œ ์ง€ํ•˜๋Š” ๋Šฅ๋ ฅ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋‹จ์ˆœํžˆ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ๊ฒƒ์„ ๋„˜์–ด, ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ณ  ์‘์ง‘๋„๋ฅผ ๋†’์ด๋Š” ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„, ์ƒํƒœ ๊ด€๋ฆฌ์˜ ์ตœ์ ํ™”, ๊ทธ๋ฆฌ๊ณ  ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…๊ณผ ๋ Œ๋”๋ง ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ํฌ๊ด„ํ•ฉ๋‹ˆ๋‹ค. ํ™•์žฅ ๊ฐ€๋Šฅํ•œ React ์‹œ์Šคํ…œ์€ ๋ช…ํ™•ํ•œ ํด๋” ๊ตฌ์กฐ(์˜ˆ: Feature-Sliced Design)์™€ ์—„๊ฒฉํ•œ ๊ด€์‹ฌ์‚ฌ ๋ถ„๋ฆฌ๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ๋ฒ ์ด์Šค๊ฐ€ ์ž์ฒด์ ์ธ ๋ฌด๊ฒŒ๋กœ ์ธํ•ด ๋ถ•๊ดด๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. [1-4] - -## ๐Ÿ“– Core Content -- **์•„ํ‚คํ…์ฒ˜ ๋ฐ ํด๋” ๊ตฌ์กฐ์˜ ์ง„ํ™”:** React๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ฐ•์ œํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ํ”„๋กœ์ ํŠธ๊ฐ€ ์ปค์ง€๋ฉด ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด UI์— ์Šค๋ฉฐ๋“ค๊ณ  ์˜์กด์„ฑ์ด ์—‰ํ‚ค๋Š” ์•„ํ‚คํ…์ฒ˜ ๋ถ•๊ดด๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค [2]. ๊ณผ๊ฑฐ์˜ ํŒŒ์ผ ์œ ํ˜•๋ณ„ ํด๋” ๊ตฌ์กฐ(components, hooks, styles ๋“ฑ)๋Š” ๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค [5, 6]. ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•ด์„œ๋Š” ๋„๋ฉ”์ธ/๊ธฐ๋Šฅ ์ค‘์‹ฌ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” Feature-Based ๊ตฌ์กฐ ๋˜๋Š” **Feature-Sliced Design(FSD)**๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•๋ก ์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค. FSD๋Š” ์•ฑ์„ layers(app, pages, widgets, features, entities, shared)๋กœ ๋‚˜๋ˆ„๊ณ  ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ๊ทœ์น™๊ณผ ํผ๋ธ”๋ฆญ API ์บก์Аํ™”๋ฅผ ๊ฐ•์ œํ•˜์—ฌ ๋ชจ๋“ˆ์˜ ๋…๋ฆฝ์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค [7-11]. -- **ํด๋ฆฐ ์ฝ”๋“œ์™€ ์†Œํ”„ํŠธ์›จ์–ด ์—”์ง€๋‹ˆ์–ด๋ง ์›์น™:** ๋Œ€๊ทœ๋ชจ React ์‹œ์Šคํ…œ์—์„œ๋Š” SOLID, DRY, KISS, YAGNI์™€ ๊ฐ™์€ ์›์น™์ด ์ ์šฉ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)์— ๋”ฐ๋ผ ๊ฑฐ๋Œ€ํ•œ ์ปดํฌ๋„ŒํŠธ๋Š” ์ž‘๊ณ  ์ง‘์ค‘๋œ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ถ„๋ฆฌ๋˜์–ด์•ผ ํ•˜๋ฉฐ [12], DRY ์›์น™์„ ํ†ตํ•ด ๊ณตํ†ต ๋กœ์ง์€ ์ปค์Šคํ…€ ํ›…์œผ๋กœ ์ถ”์ถœํ•˜์—ฌ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค [13]. ๋”๋ถˆ์–ด ํŒŒ์ผ ๋ฐ ์ปดํฌ๋„ŒํŠธ ๋ช…๋ช… ๊ทœ์น™(์˜ˆ: ํŒŒ์ผ์€ kebab-case, ์ปดํฌ๋„ŒํŠธ๋Š” PascalCase)์„ ์ผ๊ด€๋˜๊ฒŒ ์œ ์ง€ํ•˜๊ณ  ESLint๋ฅผ ํ†ตํ•ด ์•„ํ‚คํ…์ฒ˜ ๊ฒฝ๊ณ„๋ฅผ ๊ฐ•์ œํ•˜๋Š” ๊ฒƒ์ด ๋Œ€๊ทœ๋ชจ ํŒ€ ํ˜‘์—…์— ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค [14, 15]. -- **๊ทœ๋ชจ์— ๋”ฐ๋ฅธ ์ƒํƒœ ๊ด€๋ฆฌ ์ „๋žต:** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ปค์ง€๋ฉด ๋‹จ์ผ ์ „์—ญ ์ƒํƒœ๋งŒ์œผ๋กœ๋Š” ๋ถ€์กฑํ•˜๋ฉฐ ์ƒํƒœ์˜ ์—ญํ• ์— ๋”ฐ๋ผ ๋„๊ตฌ๊ฐ€ ๋ถ„๋ฆฌ๋ฉ๋‹ˆ๋‹ค [16]. React์˜ Context API๋Š” ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ ์ „์ฒด๋ฅผ ๋ฆฌ๋ Œ๋”๋ง์‹œํ‚ค๋ฏ€๋กœ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žฆ์€ ์ƒํƒœ ๊ด€๋ฆฌ์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค [17, 18]. ์ค‘๊ฐ„ ๊ทœ๋ชจ์˜ ์•ฑ์—์„œ๋Š” Selector ํŒจํ„ด์„ ํ†ตํ•ด ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ง‰๋Š” Zustand๊ฐ€ ์œ ์šฉํ•˜๋ฉฐ [19-21], 500๊ฐœ ์ด์ƒ์˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žˆ๋Š” ๋Œ€๊ทœ๋ชจ ์•ฑ์ด๋‚˜ ๋น„๋™๊ธฐ ์ž‘์—…์ด ๋ณต์žกํ•œ ๊ฒฝ์šฐ ์ผ๊ด€๋œ ํŒจํ„ด๊ณผ ๊ฐ•๋ ฅํ•œ ๋””๋ฒ„๊น…์„ ์ œ๊ณตํ•˜๋Š” Redux๊ฐ€ ์‚ฐ์—… ํ‘œ์ค€์œผ๋กœ ์ž‘์šฉํ•ฉ๋‹ˆ๋‹ค [22, 23]. ์„œ๋ฒ„ ์ƒํƒœ ๊ด€๋ฆฌ๋Š” TanStack Query(React Query) ๋“ฑ์œผ๋กœ ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ์™€ ๋ถ„๋ฆฌํ•˜์—ฌ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค [20, 24]. -- **์„ฑ๋Šฅ ์—”์ง€๋‹ˆ์–ด๋ง (Performance Optimization):** ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์•ฑ์€ ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ๊ณผ ๋กœ๋”ฉ ์†๋„ ์ตœ์ ํ™”๊ฐ€ ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค. `React.lazy`์™€ ๋™์  ์ž„ํฌํŠธ(Dynamic Imports)๋ฅผ ํ™œ์šฉํ•œ ๋ผ์šฐํŠธ ๋ฐ ์ปดํฌ๋„ŒํŠธ ๋ ˆ๋ฒจ์˜ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…์€ ์ดˆ๊ธฐ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ํš๊ธฐ์ ์œผ๋กœ ์ค„์—ฌ์ค๋‹ˆ๋‹ค [25-27]. ๋˜ํ•œ Vite์˜ `manualChunks`๋ฅผ ์ด์šฉํ•ด ์ž์ฃผ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” Vendor ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ์บ์‹ฑ ํšจ์œจ์„ ๋†’์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค [28-30]. ๋Ÿฐํƒ€์ž„ ์‹œ์—๋Š” ๋Œ€๊ทœ๋ชจ ๋ฆฌ์ŠคํŠธ๋ฅผ ์œ„ํ•œ Virtualization(๊ฐ€์ƒํ™”) ์ฒ˜๋ฆฌ, ์•ˆ์ •์ ์ธ ์ฐธ์กฐ ์œ ์ง€๋ฅผ ์œ„ํ•œ `useCallback`๊ณผ `useMemo` ์‚ฌ์šฉ, ๊ทธ๋ฆฌ๊ณ  React 18์˜ ๋™์‹œ์„ฑ ๊ธฐ๋Šฅ(`useTransition`, `useDeferredValue`)์„ ํ™œ์šฉํ•ด ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์˜ ์‘๋‹ต์„ฑ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค [31-34]. - -## โš–๏ธ Trade-offs & Caveats -- **์•„ํ‚คํ…์ฒ˜์˜ ์˜ค๋ฒ„ํ—ค๋“œ:** Feature-Sliced Design์ด๋‚˜ ๋„๋ฉ”์ธ ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ๋ฅผ ๋„์ž…ํ•˜๋ฉด ์ปดํฌ๋„ŒํŠธ๊ฐ€ '๊ธฐ๋Šฅ'์ธ์ง€ '์œ„์ ฏ'์ธ์ง€ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•œ ์˜๋ฏธ๋ก ์  ๋…ผ์˜๊ฐ€ ํ•„์š”ํ•ด์ง€๋Š” ๋“ฑ ์ดˆ๊ธฐ ํ•™์Šต ๊ณก์„ ๊ณผ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [35, 36]. ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์ด๋Ÿฌํ•œ ๊ตฌ์กฐ๊ฐ€ ์˜คํžˆ๋ ค ๊ณผ๋„ํ•œ ๋ณต์žก์„ฑ(Overkill)์„ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [37]. -- **๋ฉ”๋ชจ์ด์ œ์ด์…˜์˜ ๋น„์šฉ:** `React.memo`, `useMemo`, `useCallback`์„ ๋‚จ์šฉํ•˜๋ฉด ์˜คํžˆ๋ ค ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. React๊ฐ€ ์ด์ „ props๋ฅผ ์ €์žฅํ•˜๊ณ  ๋น„๊ตํ•˜๋Š” ์ž‘์—…์— ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉฐ, ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง ๋น„์šฉ์ด ๋งค์šฐ ์ž‘์€ ๊ฒฝ์šฐ ์ด ๋น„๊ต ์ž‘์—…์ด ๋ Œ๋”๋ง ์ž์ฒด๋ณด๋‹ค ๋” ๋งŽ์€ ๋น„์šฉ์„ ์†Œ๋ชจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [38, 39]. -- **์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ์˜ ์œ ์—ฐ์„ฑ vs ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ:** Zustand์˜ ๊ทน๋‹จ์ ์ธ ์œ ์—ฐ์„ฑ์€ ๊ทœ์œจ ์—†์ด ์‚ฌ์šฉ๋  ๊ฒฝ์šฐ ํŒ€์›๋งˆ๋‹ค ์„œ๋กœ ๋‹ค๋ฅธ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ํŒจํ„ด์„ ์ž‘์„ฑํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๋“ฑ ํ˜ผ๋ž€์„ ์•ผ๊ธฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [19, 40]. ๋ฐ˜๋ฉด Redux๋Š” ์ดˆ๊ธฐ์— ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š” ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ๊ฐ€ ๋งค์šฐ ๋งŽ์•„ ๊ฐœ๋ฐœ ์†๋„๋ฅผ ๋Šฆ์ถ”์ง€๋งŒ, ๋Œ€๊ทœ๋ชจ ํŒ€์—์„œ๋Š” ์˜คํžˆ๋ ค ์ด ๊ตฌ์กฐ๊ฐ€ ๋ฒ„๊ทธ๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ๊ธฐ๋Šฅ์œผ๋กœ ์ž‘์šฉํ•ฉ๋‹ˆ๋‹ค [22, 41]. -- **React Compiler์™€ ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ˜ธํ™˜์„ฑ:** React Compiler๋ฅผ ๋„์ž…ํ•˜๋ฉด ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์˜ ํ•„์š”์„ฑ์„ ํฌ๊ฒŒ ์ค„์ผ ์ˆ˜ ์žˆ์ง€๋งŒ, `useMutation`์ด๋‚˜ `useLocation`์ฒ˜๋Ÿผ ๋ Œ๋”๋ง ์‹œ๋งˆ๋‹ค ์˜๋„์ ์œผ๋กœ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ›…๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์บ์‹ฑ ์ฒด์ธ์ด ๋Š์–ด์ง€๊ณ  ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•˜๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค [42, 43]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -#### [์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] -- [[Feature-Sliced Design]] - - ์—ฐ๊ฒฐ ์ด์œ : React์˜ ํ•œ๊ณ„์ธ ๊ตฌ์ฒด์ ์ธ ์•„ํ‚คํ…์ฒ˜ ๋ถ€์žฌ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์„ค๊ณ„๋œ ๋Œ€๊ทœ๋ชจ ํ”„๋ก ํŠธ์—”๋“œ ๋ฐฉ๋ฒ•๋ก ์ž…๋‹ˆ๋‹ค. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ ˆ์ด์–ด(Layer) ๊ฐ„์˜ ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ์›์น™๊ณผ Public API๋ฅผ ํ™œ์šฉํ•œ ๋ชจ๋“ˆ์˜ ์บก์Аํ™” ๋ฐ ๊ฒฐํ•ฉ๋„ ์ตœ์†Œํ™” ๋ฐฉ๋ฒ•. -- [[SOLID Principles]] - - ์—ฐ๊ฒฐ ์ด์œ : ํ™•์žฅ ๊ฐ€๋Šฅํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฌ์šด React ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•œ ํ•ต์‹ฌ ์†Œํ”„ํŠธ์›จ์–ด ์—”์ง€๋‹ˆ์–ด๋ง ์›์น™์ž…๋‹ˆ๋‹ค. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ฑฐ๋Œ€ํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)์— ๋”ฐ๋ผ ์ž‘์€ ๊ธฐ๋Šฅ์œผ๋กœ ๋ถ„๋ฆฌํ•˜๊ณ , ์ปค์Šคํ…€ ํ›…์„ ํ™œ์šฉํ•˜์—ฌ ๋กœ์ง์„ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ตฌ์กฐ์  ์‚ฌ๊ณ . - -#### [๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ] -- [[State Management Libraries (Redux, Zustand, Context API)]] - - ์—ฐ๊ฒฐ ์ด์œ : ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํฌ๊ธฐ์™€ ์ƒํƒœ ์—…๋ฐ์ดํŠธ ๋นˆ๋„์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ๋„๊ตฌ๋ฅผ ์„ ํƒํ•˜๋Š” ๊ฒƒ์€ ํ™•์žฅ์„ฑ์— ์ง€๋Œ€ํ•œ ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง ๋ฐฉ์ง€๋ฅผ ์œ„ํ•œ Selector ํŒจํ„ด์˜ ๋™์ž‘ ์›๋ฆฌ์™€, ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ ๊ฐ•์ œ๋˜๋Š” ์ƒํƒœ ๊ด€๋ฆฌ ์•„ํ‚คํ…์ฒ˜์˜ ์ค‘์š”์„ฑ. -- [[Code Splitting & Lazy Loading]] - - ์—ฐ๊ฒฐ ์ด์œ : ์ฝ”๋“œ๊ฐ€ ๋น„๋Œ€ํ•ด์ง์— ๋”ฐ๋ผ ๋ฐœ์ƒํ•˜๋Š” ์„ฑ๋Šฅ ์ €ํ•˜(๋ฒˆ๋“ค ํฌ๊ธฐ ์ฆ๊ฐ€)๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ํ•ต์‹ฌ ๋Ÿฐํƒ€์ž„ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: `React.lazy`์™€ Vite์˜ `manualChunks`๋ฅผ ์ด์šฉํ•œ ๋ฒˆ๋“ค ํฌ๊ธฐ ์ถ•์†Œ ๋ฐ ๋ธŒ๋ผ์šฐ์ € ์บ์‹ฑ ์ „๋žต. -- [[React Error Boundaries]] - - ์—ฐ๊ฒฐ ์ด์œ : ๋Œ€๊ทœ๋ชจ ์•ฑ์—์„œ ํ•˜๋‚˜์˜ ๊ฒฐํ•จ ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ๋กœ ์ธํ•ด ์ „์ฒด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ถ•๊ดด๋˜๋Š” ๊ฒƒ์„ ๋ง‰์•„์ฃผ๋Š” ์•ˆ์ „ ์žฅ์น˜์ž…๋‹ˆ๋‹ค. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋Ÿฐํƒ€์ž„ ๋ Œ๋”๋ง ์—๋Ÿฌ๋ฅผ ๊ฒฉ๋ฆฌ(Isolate)ํ•˜๊ณ  ํด๋ฐฑ(Fallback) UI๋ฅผ ์ œ๊ณตํ•˜์—ฌ ์‹œ์Šคํ…œ ๋ณต์›๋ ฅ์„ ๋†’์ด๋Š” ๋ฐฉ๋ฒ•. - -### Deeper Research Questions - -- ๋Œ€๊ทœ๋ชจ ํŒ€ ํ™˜๊ฒฝ์—์„œ Feature-Sliced Design์„ ์ ์šฉํ•  ๋•Œ, 'Shared' ๋ ˆ์ด์–ด๊ฐ€ ๋น„๋Œ€ํ•ด์ง€๊ณ  ๊ธฐ๋Šฅ ๊ฐ„ ๊ต์ฐจ ๊ด€์‹ฌ์‚ฌ(Cross-cutting concerns)๊ฐ€ ์–ฝํžˆ๋Š” ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋Š”๊ฐ€? -- React Context API์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ฆฌ๋ Œ๋”๋ง ํญํฌ(Re-render storm) ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Zustand์˜ Selector ํŒจํ„ด์€ ๋‚ด๋ถ€์ ์œผ๋กœ ๊ตฌ๋…(Subscription) ๋ชจ๋ธ์„ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š”๊ฐ€? -- React Compiler์˜ ์ž๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๊ธฐ๋Šฅ์ด ๋„์ž…๋จ์— ๋”ฐ๋ผ ๊ธฐ์กด ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ๊ธฐ์ˆ  ๋ถ€์ฑ„(์˜ˆ: Rules of React ์œ„๋ฐ˜ ์‚ฌํ•ญ)๋Š” ์ปดํŒŒ์ผ ์ตœ์ ํ™” ๊ณผ์ •์—์„œ ์–ด๋– ํ•œ ๋ถ€์ž‘์šฉ์„ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋Š”๊ฐ€? -- Vite์˜ `manualChunks`๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฑฐ๋Œ€ํ•œ ๋ฒˆ๋“ค์„ ๋ถ„๋ฆฌํ•  ๋•Œ, ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(React core, UI Kits ๋“ฑ)์˜ ํŠน์„ฑ์— ๋”ฐ๋ฅธ ์ตœ์ ์˜ ์ฒญํฌ ๋ถ„ํ•  ๋ฐ ๋ธŒ๋ผ์šฐ์ € ์บ์‹ฑ ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? -- ๋Œ€๊ทœ๋ชจ ๋ฆฌ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ Œ๋”๋งํ•  ๋•Œ ๊ฐ€์ƒํ™”(Virtualization)๋ฅผ ์ ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ๋ธŒ๋ผ์šฐ์ € ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น(Detached DOM nodes ๋“ฑ) ์ธก๋ฉด์—์„œ ์–ด๋–ค ์น˜๋ช…์ ์ธ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”๊ฐ€? - -### Practical Application Contexts - -- **Implementation:** ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐ ์„ค์ • ์‹œ ๊ธฐ์ˆ  ํŒŒ์ผ ๋‹จ์œ„(components, hooks) ๊ตฌ์กฐ๋ฅผ ํ”ผํ•˜๊ณ , ๋„๋ฉ”์ธ/๊ธฐ๋Šฅ ์ค‘์‹ฌ์˜ ํด๋” ๊ตฌ์กฐ๋ฅผ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ๋ช…์€ ์šด์˜์ฒด์ œ ๊ฐ„ ์ถฉ๋Œ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด kebab-case๋กœ, ์ปดํฌ๋„ŒํŠธ๋Š” PascalCase๋กœ ์ผ๊ด€๋˜๊ฒŒ ๋ช…๋ช…ํ•ฉ๋‹ˆ๋‹ค. -- **System Design:** ์ „์—ญ ์ƒํƒœ(Zustand/Redux), ์„œ๋ฒ„ ์ƒํƒœ(TanStack Query), ๋กœ์ปฌ ์ƒํƒœ(useState)์˜ ์ฑ…์ž„์„ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์žฆ์€ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ƒํƒœ๋Š” ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ์˜ ์ตœ์ƒ๋‹จ Context์— ๋‘๋Š” ๊ฒƒ์„ ํ”ผํ•ฉ๋‹ˆ๋‹ค. -- **Operation / Maintenance:** Sentry๋‚˜ LogRocket๊ณผ ๊ฐ™์€ ํ”„๋ก ํŠธ์—”๋“œ ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ์™€ React Error Boundaries๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ, ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง ์—๋Ÿฌ๋ฅผ ์บก์ฒ˜ํ•˜๊ณ  ์•ฑ์˜ ํฌ๋ž˜์‹œ๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. -- **Learning Path:** ๋‹จ์ˆœํ•œ React ๋ฌธ๋ฒ• ํ•™์Šต์„ ๋„˜์–ด, ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ๋ณ„ ๋ Œ๋”๋ง ์ตœ์ ํ™” ์ฐจ์ด๋ฅผ ๋ถ„์„ํ•˜๊ณ  Chrome DevTools ํ”„๋กœํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ Œ๋”๋ง ๋ณ‘๋ชฉ์„ ํ™•์ธํ•˜๋Š” ์Šต๊ด€์„ ๊ธธ๋Ÿฌ ์•„ํ‚คํ…ํŠธ ์ˆ˜์ค€์œผ๋กœ ์„ฑ์žฅํ•ฉ๋‹ˆ๋‹ค. -- **My Project Relevance:** ํ˜„์žฌ ์œ ์ง€๋ณด์ˆ˜ ์ค‘์ธ React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฌด๊ฑฐ์šด ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์ธํ•ด ๋ฉ”์ธ ๋ฒˆ๋“ค ํฌ๊ธฐ๊ฐ€ ๋น„๋Œ€ํ•ด์ง„ ์ƒํ™ฉ์ด๋ผ๋ฉด, `React.lazy` ๊ธฐ๋ฐ˜์˜ ๋ผ์šฐํŠธ ๋ ˆ๋ฒจ ์Šคํ”Œ๋ฆฌํŒ…๊ณผ Vite `manualChunks` ์ ์šฉ์„ ๊ฒ€ํ† ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - -### Adjacent Topics - -- [[Server Components (Next.js)]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ํด๋ผ์ด์–ธํŠธ ์ธก์œผ๋กœ ์ „์†ก๋˜๋Š” JavaScript ๋ฒˆ๋“ค ์ž์ฒด๋ฅผ ์ œ๊ฑฐํ•˜์—ฌ ํ•˜์ด๋“œ๋ ˆ์ด์…˜(Hydration) ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ค„์ด๊ณ  ํ™•์žฅ์„ฑ๊ณผ ์„ฑ๋Šฅ์„ ๋™์‹œ์— ์žก๋Š” ์ตœ์‹  ๋ Œ๋”๋ง ํŒจ๋Ÿฌ๋‹ค์ž„. -- [[Memory Leak Detection in JavaScript]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์žฅ์‹œ๊ฐ„ ์‚ฌ์šฉ ์‹œ ์„ฑ๋Šฅ์„ ์ €ํ•˜์‹œํ‚ค๋Š” Detached DOM Nodes๋‚˜ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๋ˆ„์ˆ˜ ๋“ฑ์„ Chrome DevTools Heap Snapshot์„ ํ†ตํ•ด ๋””๋ฒ„๊น…ํ•˜๋Š” ๋ฐฉ๋ฒ•. -- [[Git Branching Workflows for Small & Large Teams]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ๊ทœ๋ชจ๊ฐ€ ํ™•์žฅ๋˜๋Š” ํ”„๋ก ํŠธ์—”๋“œ ํŒ€์ด ์ถฉ๋Œ ์—†์ด ์ฝ”๋“œ๋ฅผ ํ†ตํ•ฉํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” GitHub Flow, Trunk-Based Development ๋ฐ PR(Pull Request) ๋ฆฌ๋ทฐ ์—ํ‹ฐ์ผ“. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/React Suspense.md b/00_Raw/React Suspense.md deleted file mode 100644 index 423c968d..00000000 --- a/00_Raw/React Suspense.md +++ /dev/null @@ -1,52 +0,0 @@ -# [[React Suspense]] - -## ๐Ÿ“Œ Brief Summary -[[React Suspense]]๋Š” `React.lazy()`์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜์–ด ๋™์ ์œผ๋กœ ๊ฐ€์ ธ์˜ค๋Š” ์ปดํฌ๋„ŒํŠธ(์ง€์—ฐ ๋กœ๋”ฉ)์˜ ๋กœ๋”ฉ ์ƒํƒœ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” React์˜ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค [1-3]. ๋ชจ๋“ˆ์ด๋‚˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋กœ๋“œ๋˜๋Š” ๋™์•ˆ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ค„ ๋Œ€์ฒด UI(Fallback UI, ์˜ˆ: ๋กœ๋”ฉ ์Šคํ”ผ๋„ˆ๋‚˜ ์Šค์ผˆ๋ ˆํ†ค ํ™”๋ฉด)๋ฅผ ์ •์˜ํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค [2]. ์ด๋ฅผ ํ†ตํ•ด ์ดˆ๊ธฐ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ค„์ด๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋กœ๋”ฉ ์†๋„์™€ ์ธ์ง€๋˜๋Š” ์„ฑ๋Šฅ(Perceived Performance)์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2, 4]. - -## ๐Ÿ“– Core Content -* **์ง€์—ฐ ๋กœ๋”ฉ(Lazy Loading)๊ณผ์˜ ๊ฒฐํ•ฉ**: ๋Œ€์šฉ๋Ÿ‰ JavaScript ๋ฒˆ๋“ค์„ ๋ถ„ํ• ํ•˜๊ธฐ ์œ„ํ•ด `React.lazy()`๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ•„์š”ํ•œ ์‹œ์ ์— ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋ถˆ๋Ÿฌ์˜ฌ ๋•Œ, ๊ทธ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์‹œ๊ฐ„ ๋™์•ˆ ๋ Œ๋”๋ง๋  UI๋ฅผ `` ์ปดํฌ๋„ŒํŠธ์˜ `fallback` ์†์„ฑ์œผ๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค [1, 2]. - * *๊ตฌํ˜„ ์˜ˆ์‹œ:* `const Dashboard = React.lazy(() => import('./Dashboard'));` ํ›„ `}> ` ํ˜•ํƒœ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค [1, 2]. -* **๋ผ์šฐํŠธ ๋ฐ ๋ฌด๊ฑฐ์šด ๊ธฐ๋Šฅ ๋ถ„ํ• **: ๋ผ์šฐํŠธ ์ˆ˜์ค€์˜ ์ปดํฌ๋„ŒํŠธ๋‚˜ ๋ฌด๊ฑฐ์šด UI ๋ธ”๋ก(์˜ˆ: ๋Œ€์‹œ๋ณด๋“œ, ์ฐจํŠธ, PDF ๋ทฐ์–ด ๋“ฑ)์„ ๋™์  ์ž„ํฌํŠธ(Dynamic Import)๋กœ ์ „ํ™˜ํ•œ ๋’ค, ๊ฐ ๋ผ์šฐํŠธ ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ``๋กœ ๊ฐ์‹ธ๋ฉด ๊ฐ ํŽ˜์ด์ง€๊ฐ€ ๋…๋ฆฝ์ ์ธ ์ฒญํฌ(Chunk)๊ฐ€ ๋˜์–ด ์‚ฌ์šฉ์ž๊ฐ€ ํ•ด๋‹น ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•  ๋•Œ๋งŒ ์ฝ”๋“œ๊ฐ€ ๋‹ค์šด๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค [3, 5, 6]. -* **๋™์‹œ์„ฑ ๊ธฐ๋Šฅ(Concurrent Features)๊ณผ์˜ ํ†ตํ•ฉ**: React 18 ์ดํ›„์˜ ๋™์‹œ์„ฑ ํ›…์ธ `useTransition` ๋“ฑ๊ณผ ๊ฒฐํ•ฉํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ฌด๊ฑฐ์šด ๋ฐ์ดํ„ฐ ํ•„ํ„ฐ๋ง ๋“ฑ์˜ ์ž‘์—…์ด ์ง„ํ–‰๋˜๋Š” ๋™์•ˆ ์ฆ‰๊ฐ์ ์ธ ์‚ฌ์šฉ์ž ์ƒํ˜ธ์ž‘์šฉ(์ž…๋ ฅ ๋“ฑ)์„ ์ฐจ๋‹จํ•˜์ง€ ์•Š๊ณ  ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉฐ, ํ•„์š”์— ๋”ฐ๋ผ Suspense์˜ Fallback UI๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [7, 8]. - -## โš–๏ธ Trade-offs & Caveats -* **์ ์šฉ ์œ„์น˜์˜ ์ œํ•œ (Above-the-fold ์ฃผ์˜)**: ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ์— ์ง€์—ฐ ๋กœ๋”ฉ๊ณผ Suspense๋ฅผ ๋ฌด๋ถ„๋ณ„ํ•˜๊ฒŒ ์ ์šฉํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ํŽ˜์ด์ง€ ์ดˆ๊ธฐ ๋กœ๋“œ ์‹œ ์ฆ‰์‹œ ๋ณด์—ฌ์•ผ ํ•˜๋Š” ํ•ต์‹ฌ ์ฝ˜ํ…์ธ (Above-the-fold)๋‚˜ ๋ Œ๋”๋ง ์†๋„๊ฐ€ ๋นจ๋ผ ์ฆ‰๊ฐ์ ์œผ๋กœ ํ‘œ์‹œ๋˜์–ด์•ผ ํ•˜๋Š” ์š”์†Œ์—๋Š” Suspense๋ฅผ ํ†ตํ•œ ์ง€์—ฐ ๋กœ๋”ฉ ์ ์šฉ์„ ํ”ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [5]. -* **๊ธฐํƒ€ ์ œ์•ฝ ์‚ฌํ•ญ**: ์†Œ์Šค์— ๊ด€๋ จ ์ •๋ณด๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. (์ œ๊ณต๋œ ์†Œ์Šค ๋ฐ์ดํ„ฐ ๋‚ด์—์„œ๋Š” Suspense ์ž์ฒด์˜ ๊นŠ์€ ๊ธฐ์ˆ ์  ํ•œ๊ณ„๋‚˜ ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง ์‹œ์˜ ๋ณต์žกํ•œ ๋ถ€์ž‘์šฉ ๋“ฑ์— ๋Œ€ํ•œ ๊ตฌ์ฒด์ ์ธ ์–ธ๊ธ‰์€ ์—†์œผ๋ฉฐ, ์ฃผ๋กœ ๋ฒˆ๋“ค ์ตœ์ ํ™”๋ฅผ ์œ„ํ•œ ๊ธ์ •์ ์ธ ํ™œ์šฉ๋ฒ• ์œ„์ฃผ๋กœ ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.) - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -#### [๊ด€๊ณ„ ์œ ํ˜• A (์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ )] -* [[Code Splitting]] - * ์—ฐ๊ฒฐ ์ด์œ : ๊ฑฐ๋Œ€ํ•œ JavaScript ๋ฒˆ๋“ค์„ ์ž‘์€ ๋‹จ์œ„์˜ ์ฒญํฌ(Chunk)๋กœ ์ชผ๊ฐœ๋Š” ์•„ํ‚คํ…์ฒ˜ ๊ธฐ๋ฒ•์œผ๋กœ, Suspense๋ฅผ ๋„์ž…ํ•˜๋Š” ํ•ต์‹ฌ ๋ชฉ์ ์ž…๋‹ˆ๋‹ค [4, 9]. - * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜์ง€ ์•Š๊ฒŒ ํ•˜์—ฌ FCP(First Contentful Paint) ๋“ฑ์˜ ์„ฑ๋Šฅ ์ง€ํ‘œ๋ฅผ ๊ฐœ์„ ํ•˜๋Š” ์›๋ฆฌ. -* [[Concurrent Rendering]] - * ์—ฐ๊ฒฐ ์ด์œ : Suspense๋Š” ๋™์‹œ์„ฑ ๋ Œ๋”๋ง ๊ธฐ๋Šฅ(`useTransition`, `useDeferredValue`)๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜์–ด ๋ Œ๋”๋ง ์ž‘์—…์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์กฐ์ •ํ•˜๊ณ  UI ์ฐจ๋‹จ(Jank)์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐ ํ™œ์šฉ๋ฉ๋‹ˆ๋‹ค [8, 10]. - * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: React๊ฐ€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๋ Œ๋”๋ง ์ž‘์—…์„ ์ผ์‹œ ์ค‘์ง€, ์ค‘๋‹จ, ์žฌ๊ฐœํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜. - -#### [๊ด€๊ณ„ ์œ ํ˜• B (๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ)] -* [[React.lazy()]] - * ์—ฐ๊ฒฐ ์ด์œ : ์ปดํฌ๋„ŒํŠธ์˜ ๋™์  ์ž„ํฌํŠธ(Dynamic Import)๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ํ•จ์ˆ˜๋กœ, ํ•ญ์ƒ ``์™€ ์ง์„ ์ด๋ฃจ์–ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค [1-3]. - * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋Ÿฐํƒ€์ž„์— ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ฝ”๋“œ๋ฅผ ์˜จ๋””๋งจ๋“œ(On-demand) ๋ฐฉ์‹์œผ๋กœ ์š”์ฒญํ•˜์—ฌ ๋ Œ๋”๋ง ํŠธ๋ฆฌ์— ์ฃผ์ž…ํ•˜๋Š” ๋ฐฉ๋ฒ•. - -### Deeper Research Questions -* React Suspense๋ฅผ ํ™œ์šฉํ•œ ๋ฐ์ดํ„ฐ ํŒจ์นญ(Data Fetching) ๋กœ๋”ฉ ์ฒ˜๋ฆฌ๋Š” ๊ธฐ์กด `useEffect` ๊ธฐ๋ฐ˜์˜ ๋กœ๋”ฉ ์ƒํƒœ(isLoading) ๊ด€๋ฆฌ์™€ ๋น„๊ตํ•˜์—ฌ ๋ Œ๋”๋ง ์„ฑ๋Šฅ ๋ฐ ์ฝ”๋“œ ๋ณต์žก๋„ ๋ฉด์—์„œ ์–ด๋–ค ์ฐจ์ด๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๋Š”๊ฐ€? -* Next.js์˜ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ(Server Components) ์•„ํ‚คํ…์ฒ˜ ํ™˜๊ฒฝ์—์„œ Suspense ๊ฒฝ๊ณ„(Boundaries)๋Š” ์ŠคํŠธ๋ฆฌ๋ฐ(Streaming) ๋ Œ๋”๋ง๊ณผ ์–ด๋–ป๊ฒŒ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š”๊ฐ€? -* ๋‹ค์ˆ˜์˜ `` ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ถ€๋ชจ-์ž์‹ ๊ด€๊ณ„๋กœ ์ค‘์ฒฉ๋˜์–ด ์žˆ์„ ๋•Œ, Fallback UI๊ฐ€ ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚˜๋Š” ์šฐ์„ ์ˆœ์œ„์™€ ๋ Œ๋”๋ง ๋™์ž‘ ๋ฐฉ์‹์€ ์–ด๋–ป๊ฒŒ ๊ฒฐ์ •๋˜๋Š”๊ฐ€? -* Above-the-fold ์ฝ˜ํ…์ธ ์— Suspense๋ฅผ ์ž˜๋ชป ์ ์šฉํ–ˆ์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” LCP(Largest Contentful Paint) ์„ฑ๋Šฅ ์ €ํ•˜์˜ ๊ตฌ์ฒด์ ์ธ ๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ๋ฌด์—‡์ธ๊ฐ€? -* ์—๋Ÿฌ ๊ฒฝ๊ณ„([[Error Boundaries]]) ์ปดํฌ๋„ŒํŠธ์™€ Suspense๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ์ง€์—ฐ ๋กœ๋”ฉ(Lazy Loading) ์ค‘ ๋„คํŠธ์›Œํฌ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ์šฐ์•„ํ•˜๊ฒŒ ๋ณต๊ตฌ(Graceful Degradation)ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? - -### Practical Application Contexts -* **Implementation:** `React.lazy()`๋ฅผ ์ด์šฉํ•ด ๋ผ์šฐํŠธ๋‚˜ ๋ฌด๊ฑฐ์šด ์ฐจํŠธ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ถ„๋ฆฌํ•˜๊ณ , ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ ๋‹จ์— `}>`๋ฅผ ๊ฐ์‹ธ์–ด ๋ชจ๋“ˆ ๋‹ค์šด๋กœ๋“œ ๋Œ€๊ธฐ ์‹œ๊ฐ„์„ ์‹œ๊ฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค [2, 3]. -* **System Design:** Vite๋‚˜ Webpack ๊ฐ™์€ ๋ชจ๋˜ ๋ฒˆ๋“ค๋Ÿฌ ํ™˜๊ฒฝ์—์„œ ๋™์  ์ž„ํฌํŠธ๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ, ๋ผ์šฐํŠธ ๋‹จ์œ„๋ณ„ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…์„ ์•„ํ‚คํ…์ฒ˜์˜ ๊ธฐ๋ณธ ํ‘œ์ค€์œผ๋กœ ์‚ผ์•„ ๋ฉ”์ธ ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ๋ฅผ ์ค„์ž…๋‹ˆ๋‹ค [3, 9, 11]. -* **Operation / Maintenance:** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์šด์˜ ์ค‘ ์›นํŒฉ ๋ฒˆ๋“ค ์•„๋‚ ๋ผ์ด์ €(Webpack Bundle Analyzer)๋‚˜ ๋ธŒ๋ผ์šฐ์ €์˜ Network ํƒญ์„ ํ†ตํ•ด Suspense ์ ์šฉ ์ดํ›„ JS ์ฒญํฌ ๋ถ„ํ• ์ด ์ œ๋Œ€๋กœ ์ด๋ฃจ์–ด์กŒ๋Š”์ง€ ์ง€์†์ ์œผ๋กœ ํ”„๋กœํŒŒ์ผ๋ง ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค [12]. -* **Learning Path:** React ํ›…๊ณผ ์ƒํƒœ ๊ด€๋ฆฌ์— ๋Œ€ํ•œ ์ดํ•ด๋ฅผ ๋งˆ์นœ ํ›„, ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•œ `React.lazy` ํ•™์Šต -> `Suspense`์˜ Fallback ์ฒ˜๋ฆฌ -> React 18 ๋™์‹œ์„ฑ ๊ธฐ๋Šฅ ๋„์ž… ์ˆœ์œผ๋กœ ํ™•์žฅํ•ด ๋‚˜๊ฐ‘๋‹ˆ๋‹ค. -* **My Project Relevance:** ๋ฐฉ๋Œ€ํ•œ React ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•  ๋•Œ, ๊ฐ€์žฅ ๋ฌด๊ฑฐ์šด ๋ผ์šฐํŠธ๋‚˜ ์ž์ฃผ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์–ด๋“œ๋ฏผ ๋ทฐ ๋“ฑ์— Suspense๋ฅผ ๋„์ž…ํ•˜์—ฌ ์ดˆ๊ธฐ ๋กœ๋“œ ์‹œ๊ฐ„ ๋ฐ ๋ฒˆ๋“ค ํฌ๊ธฐ ๊ฒฝ๊ณ (์˜ˆ: 500kB ์ดˆ๊ณผ ๊ฒฝ๊ณ )๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5, 13]. - -### Adjacent Topics -* [[Error Boundaries]] - * ํ™•์žฅ ๋ฐฉํ–ฅ: Suspense๊ฐ€ '๋กœ๋”ฉ ์ค‘' ์ƒํƒœ๋ฅผ ์„ ์–ธ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค๋ฉด, Error Boundaries๋Š” ๋ Œ๋”๋ง ์ค‘ ๋˜๋Š” ์ง€์—ฐ ๋กœ๋”ฉ ์‹œ ๋ฐœ์ƒํ•˜๋Š” '์‹คํŒจ/์—๋Ÿฌ' ์ƒํƒœ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๊ฐœ๋…์„ ๋‚˜๋ž€ํžˆ ์ ์šฉํ•˜์—ฌ ๊ฒฌ๊ณ ํ•œ UI ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ํŒจํ„ด์œผ๋กœ ํ™•์žฅ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค [14-16]. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์˜ˆ์™ธ ๋ฐ ์—๋Ÿฌ ์ฒ˜๋ฆฌ.md b/00_Raw/React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์˜ˆ์™ธ ๋ฐ ์—๋Ÿฌ ์ฒ˜๋ฆฌ.md deleted file mode 100644 index 7dde2e26..00000000 --- a/00_Raw/React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์˜ˆ์™ธ ๋ฐ ์—๋Ÿฌ ์ฒ˜๋ฆฌ.md +++ /dev/null @@ -1,63 +0,0 @@ -# [[React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์˜ˆ์™ธ ๋ฐ ์—๋Ÿฌ ์ฒ˜๋ฆฌ]] - -## ๐Ÿ“Œ Brief Summary -React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์˜ˆ์™ธ ๋ฐ ์—๋Ÿฌ ์ฒ˜๋ฆฌ๋Š” ๋Ÿฐํƒ€์ž„ ์ค‘ ๋ฐœ์ƒํ•˜๋Š” JavaScript ์—๋Ÿฌ๋กœ ์ธํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด๊ฐ€ ๋ฉˆ์ถ”๊ฑฐ๋‚˜ ๋นˆ ํ™”๋ฉด(White screen of death)์ด ํ‘œ์‹œ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค. ํ•ต์‹ฌ์ ์œผ๋กœ 'Error Boundary(์—๋Ÿฌ ๊ฒฝ๊ณ„)' ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ UI์˜ ๋ Œ๋”๋ง ์—๋Ÿฌ๋ฅผ ํฌ์ฐฉํ•˜๊ณ  ์•ˆ์ „ํ•œ ํด๋ฐฑ(Fallback) UI๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ, Sentry ๋“ฑ ํ”„๋ก ํŠธ์—”๋“œ ๋กœ๊น… ๋„๊ตฌ์™€ ๊ฒฐํ•ฉํ•˜์—ฌ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์˜ ์—๋Ÿฌ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ๋ณต์›๋ ฅ์„ ํ™•๋ณดํ•ฉ๋‹ˆ๋‹ค. - -## ๐Ÿ“– Core Content - -* **Error Boundary์˜ ๊ฐœ๋… ๋ฐ ๋™์ž‘ ์›๋ฆฌ:** Error Boundary๋Š” ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ์˜ ๋ Œ๋”๋ง, ์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ ๋ฐ ์ƒ์„ฑ์ž์—์„œ ๋ฐœ์ƒํ•˜๋Š” JavaScript ์—๋Ÿฌ๋ฅผ ํฌ์ฐฉํ•˜๋Š” React์˜ ํŠน์ˆ˜ ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ์ž…๋‹ˆ๋‹ค [1, 2]. `static getDerivedStateFromError()` ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์—๋Ÿฌ ๋ฐœ์ƒ ํ›„ ํด๋ฐฑ UI๋ฅผ ๋ Œ๋”๋งํ•˜๋„๋ก ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋ฉฐ, `componentDidCatch()` ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—๋Ÿฌ ์ •๋ณด๋ฅผ ๋กœ๊น…ํ•ฉ๋‹ˆ๋‹ค [3]. -* **์—๋Ÿฌ ํฌ์ฐฉ์˜ ํ•œ๊ณ„ (์žก์ง€ ๋ชปํ•˜๋Š” ์—๋Ÿฌ):** Error Boundary๋Š” ์ปดํฌ๋„ŒํŠธ์˜ ์„ ์–ธ์  ๋ Œ๋”๋ง ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ๋งŒ ํฌ์ฐฉํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ(Event handlers), ๋น„๋™๊ธฐ ์ฝ”๋“œ(`setTimeout` ๋“ฑ), ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง(SSR), ๊ทธ๋ฆฌ๊ณ  Error Boundary ์ž์ฒด์—์„œ ๋ฐœ์ƒํ•œ ์—๋Ÿฌ๋Š” ํฌ์ฐฉํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค [3, 4]. ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์˜ ๊ฒฝ์šฐ ์ผ๋ฐ˜์ ์ธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ `try / catch` ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์—๋Ÿฌ๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [5, 6]. -* **์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ ๋งˆ์šดํŠธ ํ•ด์ œ ์ •์ฑ…:** React 16๋ถ€ํ„ฐ๋Š” Error Boundary์— ์˜ํ•ด ํฌ์ฐฉ๋˜์ง€ ์•Š์€ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ, ์†์ƒ๋œ UI๋ฅผ ๊ทธ๋Œ€๋กœ ๋…ธ์ถœํ•˜๋Š” ๊ฒƒ(์˜ˆ: ์ž˜๋ชป๋œ ๋Œ€์ƒ์—๊ฒŒ ๋ฉ”์‹œ์ง€๊ฐ€ ๋ณด๋‚ด์ง€๋Š” ํ˜„์ƒ ๋“ฑ)์ด ๋” ํฐ ๋ฌธ์ œ๋ฅผ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํŒ๋‹จํ•˜์—ฌ ์ „์ฒด React ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ๋ฅผ ๋งˆ์šดํŠธ ํ•ด์ œ(unmount)์‹œํ‚ต๋‹ˆ๋‹ค [7, 8]. -* **์ „๋žต์  ๋ฐฐ์น˜ (Granularity):** ๋‹จ์ผ Error Boundary๋กœ ์•ฑ ์ „์ฒด๋ฅผ ๊ฐ์‹ธ๋Š” ๋Œ€์‹ , ์„œ๋“œํŒŒํ‹ฐ ์œ„์ ฏ, ์ฐจํŠธ, ๋ณต์žกํ•œ ํผ ๋“ฑ ๋ถˆ์•ˆ์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์„น์…˜ ๋‹จ์œ„๋กœ ๊ฐœ๋ณ„์ ์ธ Error Boundary๋ฅผ ๋ฐฐ์น˜ํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํŠน์ • ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋‹ค์šด๋˜๋”๋ผ๋„ ๋‚˜๋จธ์ง€ UI ๋ถ€๋ถ„์€ ๊ณ„์† ์ƒํ˜ธ์ž‘์šฉ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [7, 9, 10]. -* **ํด๋ผ์šฐ๋“œ ๋กœ๊น… ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•œ ๋ชจ๋‹ˆํ„ฐ๋ง:** ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋Š” Error Boundary์™€ Sentry, LogRocket, SigNoz ๋“ฑ์˜ ํ”„๋ก ํŠธ์—”๋“œ ๋ชจ๋‹ˆํ„ฐ๋ง ํˆด์„ ๊ฒฐํ•ฉํ•˜์—ฌ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [10-12]. ์ด๋Ÿฌํ•œ ๋„๊ตฌ๋“ค์€ ์ค‘๋ณต ์—๋Ÿฌ๋ฅผ ์ง€๋Šฅ์ ์œผ๋กœ ๊ทธ๋ฃนํ™”ํ•˜๊ณ , ์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด ๊ธฐ๋Šฅ ๋ฐ ์ปดํฌ๋„ŒํŠธ ์Šคํƒ ํŠธ๋ ˆ์ด์Šค๋ฅผ ์ œ๊ณตํ•˜์—ฌ ๋กœ์ปฌ ๋ฐ–์—์„œ ์ผ์–ด๋‚œ ์˜ˆ์™ธ ์ƒํ™ฉ์„ ์ •ํ™•ํ•˜๊ฒŒ ๋””๋ฒ„๊น…ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค [11-14]. - -## โš–๏ธ Trade-offs & Caveats -* **ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ์˜ ๊ฐ•์ œ์„ฑ:** ์ตœ์‹  React ๊ฐœ๋ฐœ์ด ํ›…(Hooks)์„ ํ™œ์šฉํ•œ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ ์œ„์ฃผ๋กœ ์ด๋ฃจ์–ด์ง์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ , Error Boundary ์ž์ฒด๋Š” ๋ฐ˜๋“œ์‹œ ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ๋กœ๋งŒ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ œ์•ฝ์ด ์žˆ์Šต๋‹ˆ๋‹ค [4, 15]. (`react-error-boundary`์™€ ๊ฐ™์€ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ†ตํ•ด ํ›… ๊ธฐ๋ฐ˜ ๋ž˜ํผ๋กœ ์šฐํšŒํ•  ์ˆ˜๋Š” ์žˆ์Šต๋‹ˆ๋‹ค [4]). -* **๋ณด์ด์ง€ ์•Š๋Š” ์—๋Ÿฌ์˜ ์น˜๋ช…์„ฑ vs. ๋นˆ ํ™”๋ฉด์˜ ์œ„ํ—˜์„ฑ:** ํฌ์ฐฉ๋˜์ง€ ์•Š์€ ์—๋Ÿฌ ๋ฐœ์ƒ ์‹œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งˆ์šดํŠธ ํ•ด์ œํ•˜๋Š” ์ •์ฑ…์€ ์‚ฌ์šฉ์ž์—๊ฒŒ '๋นˆ ํ™”๋ฉด'์„ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๋Š” ์œ„ํ—˜(UX ์ €ํ•˜)์„ ๊ฐ์ˆ˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์˜ค์ž‘๋™ํ•˜๋Š” UI๋ฅผ ๋‚จ๊ฒจ๋‘์–ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์‹ฌ๊ฐํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋…ผ๋ฆฌ์  ์˜ค๋ฅ˜๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•œ ๊ธฐ์ˆ ์  ๋ฐ˜๋Œ€ ๊ธ‰๋ถ€(Trade-off)์ž…๋‹ˆ๋‹ค [8]. -* **์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ์˜ ์˜ค๋ฒ„ํ—ค๋“œ:** Sentry๋‚˜ LogRocket๊ณผ ๊ฐ™์ด ์ƒ์„ธํ•œ ์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด์™€ ์—๋Ÿฌ ํŠธ๋ž˜ํ‚น์„ ์ œ๊ณตํ•˜๋Š” ๋„๊ตฌ๋ฅผ ๋„์ž…ํ•˜๋ฉด ๊ฐ•๋ ฅํ•œ ๋””๋ฒ„๊น… ์ปจํ…์ŠคํŠธ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์œผ๋‚˜, ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ ์ฆ๊ฐ€ ๋ฐ ์ผ๋ถ€ ๋„๊ตฌ์˜ ๊ฒฝ์šฐ ์ตœ๋Œ€ 120ms์˜ ์ถ”๊ฐ€ ๋กœ๋”ฉ ์‹œ๊ฐ„์„ ์œ ๋ฐœํ•˜๋Š” ์„ฑ๋Šฅ์  ๋ถ€์ž‘์šฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [16-18]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -#### [์•„ํ‚คํ…์ฒ˜ ๋ฐ ๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] -- [[Error Boundaries]] - - ์—ฐ๊ฒฐ ์ด์œ : React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ ์–ธ์  ์—๋Ÿฌ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ํ•ต์‹ฌ ๋‚ด์žฅ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: `getDerivedStateFromError`์™€ `componentDidCatch`์˜ ๋™์ž‘ ์›๋ฆฌ ๋ฐ ์„ ์–ธํ˜• UI ๋ชจ๋ธ์—์„œ ์˜ˆ์™ธ๊ฐ€ ์ „ํŒŒ๋˜๋Š” ๋ฐฉ์‹. -- [[Fallback UI]] - - ์—ฐ๊ฒฐ ์ด์œ : ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํฌ๋ž˜์‹œ๋ฅผ ์ˆจ๊ธฐ๊ณ  ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๋ณดํ˜ธํ•˜๋Š” ๋Œ€์ฒด ๋ Œ๋”๋ง ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์˜ˆ์™ธ ๋ฐœ์ƒ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ๋„ ์‹œ์Šคํ…œ์˜ ์ผ๋ถ€๋ฅผ ๊ฒฉ๋ฆฌ์‹œ์ผœ ์ •์ƒ์ ์ธ ์„œ๋น„์Šค๋ฅผ ์ด์–ด๊ฐ€๊ฒŒ ๋งŒ๋“œ๋Š” UI/UX ์„ค๊ณ„. - -#### [๊ตฌํ˜„ ๋ฐ ํ™œ์šฉ ๋„๊ตฌ] -- [[Sentry / LogRocket]] - - ์—ฐ๊ฒฐ ์ด์œ : Error Boundary์—์„œ ์žก์•„๋‚ธ ์—๋Ÿฌ ๋ฐ ํฌ์ฐฉํ•˜์ง€ ๋ชปํ•œ ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๋ฅผ ์ค‘์•™ ์„œ๋ฒ„๋กœ ์ˆ˜์ง‘ํ•˜๊ณ  ์‹œ๊ฐํ™”ํ•ด ์ฃผ๋Š” ํด๋ผ์šฐ๋“œ ๊ด€์ธก์„ฑ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์†Œ์Šค ๋งต(Source Map)์„ ํ™œ์šฉํ•œ ์Šคํƒ ํŠธ๋ ˆ์ด์Šค ๋ณต์› ๋ฐ ์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด(Session Replay)๋ฅผ ํ†ตํ•œ ์‹ค์‚ฌ์šฉ์ž ์—๋Ÿฌ ์ปจํ…์ŠคํŠธ ํŒŒ์•…. -- [[Memory Leaks (๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜)]] - - ์—ฐ๊ฒฐ ์ด์œ : ์ง์ ‘์ ์ธ ์—๋Ÿฌ ์Šค๋กœ์šฐ(Throw)๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค์ง„ ์•Š์ง€๋งŒ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํฌ๋ž˜์‹œ๋‚˜ ์„ฑ๋Šฅ ์ €ํ•˜, UI ๋จนํ†ต์„ ์œ ๋ฐœํ•˜๋Š” ์น˜๋ช…์ ์ธ ์˜ˆ์™ธ์  ๊ฒฐํ•จ์ž…๋‹ˆ๋‹ค. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: `useEffect`์˜ ํด๋ฆฐ์—… ๋ˆ„๋ฝ ๋“ฑ์œผ๋กœ ์ธํ•ด ๋ถ„๋ฆฌ๋œ DOM ๋…ธ๋“œ(Detached DOM nodes)๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํšŒ์ˆ˜๋˜์ง€ ์•Š๋Š” ํ˜„์ƒ ๋ฐ ์ด๋ฅผ Chrome DevTools์˜ Heap Snapshot์œผ๋กœ ์ถ”์ ํ•˜๋Š” ๋ฐฉ๋ฒ• [19-22]. - -### Deeper Research Questions - -- React 16์˜ 'ํฌ์ฐฉ๋˜์ง€ ์•Š์€ ์—๋Ÿฌ ์‹œ ์ „์ฒด ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ ๋งˆ์šดํŠธ ํ•ด์ œ'๋ผ๋Š” ์„ค๊ณ„ ๊ฒฐ์ •์ด, ๋ฐ์ดํ„ฐ ์†์‹ค์— ๋ฏผ๊ฐํ•œ ๊ธˆ์œต๊ถŒ ๋“ฑ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‹ค์ œ๋กœ ์–ด๋–ค ์žฅ๋‹จ์ ์„ ๊ฐ€์ง€๋Š”๊ฐ€? -- ๋น„๋™๊ธฐ ์ฝ”๋“œ(Async) ๋ฐ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ(Event Handler)์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ๋ฅผ Error Boundary ํŒจํ„ด๊ณผ ์–ด๋–ป๊ฒŒ ๋‹จ์ผํ™”(Unify)ํ•˜์—ฌ ์ค‘์•™ ์ง‘์ค‘์‹์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? -- LogRocket์ด๋‚˜ Sentry์™€ ๊ฐ™์€ ํ”„๋ก ํŠธ์—”๋“œ ๋กœ๊น… ๋„๊ตฌ๋ฅผ ๋„์ž…ํ•  ๋•Œ, ๋ฏผ๊ฐํ•œ ์‚ฌ์šฉ์ž ๊ฐœ์ธ์ •๋ณด(PII)๊ฐ€ ์บก์ฒ˜๋˜๋Š” ๊ฒƒ์„ ๋ง‰์œผ๋ฉด์„œ๋„ ์œ ํšจํ•œ ์—๋Ÿฌ ์Šคํƒ์„ ์ˆ˜์ง‘ํ•˜๋Š” ์ตœ์ ํ™” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? -- ํ•จ์ˆ˜ํ˜• ํŒจ๋Ÿฌ๋‹ค์ž„์ด ์ •์ฐฉ๋œ ํ˜„์žฌ, React ํŒ€์ด Error Boundary ๊ธฐ๋Šฅ์„ ํ›…(Hook) ์ƒํƒœ๊ณ„์— ์ง์ ‘ ํŽธ์ž…์‹œํ‚ค์ง€ ์•Š๋Š” ๊ตฌ์กฐ์  ์ด์œ ๋Š” ๋ฌด์—‡์ธ๊ฐ€? -- Feature-Sliced Design (FSD) ์•„ํ‚คํ…์ฒ˜๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ, Error Boundary๋ฅผ Feature ๋ ˆ๋ฒจ์— ๋ฐฐ์น˜ํ•  ๊ฒƒ์ธ๊ฐ€ ์•„๋‹ˆ๋ฉด Widget ๋ฐ Pages ๋ ˆ๋ฒจ์— ๋ฐฐ์น˜ํ•  ๊ฒƒ์ธ๊ฐ€์— ๋Œ€ํ•œ ์ „๋žต์  ๊ธฐ์ค€์€ ๋ฌด์—‡์ธ๊ฐ€? - -### Practical Application Contexts - -- **Implementation:** React ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ™œ์šฉํ•ด ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ Error Boundary ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ž‘์„ฑํ•˜๊ณ , ๊ทธ ๋‚ด๋ถ€์— ์ž์‹ ์ปดํฌ๋„ŒํŠธ(`children`)๋ฅผ ๋ Œ๋”๋งํ•˜๋ฉฐ, ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ๋‚ด์—๋Š” ๋ฐ˜๋“œ์‹œ `try/catch` ๊ตฌ๋ฌธ์„ ๋ณ„๋„๋กœ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. -- **System Design:** ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ธฐํš ์‹œ ์ „์ฒด ํ™”๋ฉด์„ ๊ฐ์‹ธ๋Š” ์ „์—ญ ์—๋Ÿฌ ํ•ธ๋“ค๋Ÿฌ์™€ ๋”๋ถˆ์–ด ํƒญ, ๋ชจ๋‹ฌ, ์ฐจํŠธ, ์„œ๋“œํŒŒํ‹ฐ ์œ„์ ฏ ๋“ฑ ๊ฒฉ๋ฆฌ ๊ฐ€๋Šฅํ•œ ์š”์†Œ๋งˆ๋‹ค ์ง€์—ญ์  Error Boundary๋ฅผ ์„ค๊ณ„ํ•˜์—ฌ ์žฅ์•  ์˜ํ–ฅ์„ ์ตœ์†Œํ™”(Blast radius ์ œํ•œ)ํ•ฉ๋‹ˆ๋‹ค. -- **Operation / Maintenance:** ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์— Sentry์™€ ๊ฐ™์€ Observability ํˆด์„ ์—ฐ๋™ํ•˜๊ณ , ์—๋Ÿฌ ๋ฐ”์šด๋”๋ฆฌ ๋‚ด `componentDidCatch`์—์„œ ํ•ด๋‹น ํˆด์˜ ๋กœ๊ฑฐ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์—๋Ÿฌ ๋ฐœ์ƒ ๋นˆ๋„์™€ ์‚ฌ์šฉ์ž ์„ธ์…˜์„ ๋ชจ๋‹ˆํ„ฐ๋ง/์šด์˜ํ•ฉ๋‹ˆ๋‹ค. -- **Learning Path:** ์ปดํฌ๋„ŒํŠธ ์ƒ๋ช…์ฃผ๊ธฐ ๋ฐ ๋ Œ๋”๋ง ํ๋ฆ„ ์ดํ•ด โž” Error Boundary ์ž‘์„ฑ๋ฒ• ์ˆ™์ง€ โž” ์˜ˆ์™ธ ์ƒํ™ฉ(๋ Œ๋”๋ง ์ค‘ ์—๋Ÿฌ vs ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ์ค‘ ์—๋Ÿฌ) ๊ตฌ๋ถ„ ๋ฐฉ๋ฒ• ํ•™์Šต โž” ๋กœ๊น… ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ†ตํ•œ ํ”„๋กœ๋•์…˜ ๋ชจ๋‹ˆํ„ฐ๋ง์œผ๋กœ ํ•™์Šต์„ ์ „๊ฐœํ•ฉ๋‹ˆ๋‹ค. -- **My Project Relevance:** ํ˜„์žฌ ๊ฐœ๋ฐœ ์ค‘์ธ React ์•ฑ์—์„œ ํŠน์ • ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์˜ ์‚ฌ์†Œํ•œ ๋ฐ์ดํ„ฐ ๊ฒฐํ•จ์œผ๋กœ ์ธํ•ด ์•ฑ ์ „์ฒด๊ฐ€ ๋‹ค์šด๋˜๋Š” ํ˜„์ƒ(๋นˆ ํ™”๋ฉด)์„ ๋ฐฉ์ง€ํ•˜๊ณ  ์„œ๋น„์Šค ์•ˆ์ •์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ์ฆ‰์‹œ ์ ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. - -### Adjacent Topics - -- [[Frontend Observability (ํ”„๋ก ํŠธ์—”๋“œ ๊ด€์ธก์„ฑ)]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋‹จ์ˆœ ์—๋Ÿฌ ์บ์น˜๋ฅผ ๋„˜์–ด์„œ Tracing, Metrics ์‹œ๊ฐํ™” ๋“ฑ์„ ํ†ตํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํƒœ์™€ ๋ฐฑ์—”๋“œ์™€์˜ ํ†ตํ•ฉ ํ†ต์‹  ๊ณผ์ • ์ „์ฒด๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋ง(์˜ˆ: Datadog RUM, Grafana ๋“ฑ)ํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜๋กœ ์ง€์‹์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -- [[React Performance Optimization (์„ฑ๋Šฅ ์ตœ์ ํ™”)]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋ Œ๋”๋ง ์ค‘ ๋ฐœ์ƒํ•˜๋Š” ์˜ˆ์™ธ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ๊ณผ๋„ํ•œ ๋ฆฌ๋ Œ๋”๋ง์ด๋‚˜ ์ž˜๋ชป ์‚ฌ์šฉ๋œ React ํ›…(์˜ˆ: ์˜์กด์„ฑ ๋ฐฐ์—ด ์˜ค๋ฅ˜)์œผ๋กœ ์ธํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‘๋‹ต์„ฑ์ด ์ €ํ•˜๋˜๊ณ  ์ตœ์ข…์ ์œผ๋กœ ํฌ๋ž˜์‹œ๋ฅผ ์œ ๋ฐœํ•˜๋Š” ์ด์Šˆ๋ฅผ ๋””๋ฒ„๊น…ํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก ์œผ๋กœ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/React.lazy().md b/00_Raw/React.lazy().md deleted file mode 100644 index afb49c8c..00000000 --- a/00_Raw/React.lazy().md +++ /dev/null @@ -1,65 +0,0 @@ -# [[React.lazy()]] - -## ๐Ÿ“Œ Brief Summary -`React.lazy()`๋Š” ๋ฆฌ์•กํŠธ(React)์—์„œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ•„์š”ํ•œ ์‹œ์ ์— ๋™์ ์œผ๋กœ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋‚ด์žฅ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค [1]. ์ด ๊ธฐ๋Šฅ์„ ๋™์  ์ž„ํฌํŠธ(Dynamic Imports)์™€ ๊ฒฐํ•ฉํ•˜๋ฉด ๊ฑฐ๋Œ€ํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค์„ ๋” ์ž‘์€ ์ฒญํฌ(Chunk)๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2, 3]. ๊ฒฐ๊ณผ์ ์œผ๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ์•ฑ์— ์ฒ˜์Œ ์ ‘๊ทผํ•  ๋•Œ ๋‹ค์šด๋กœ๋“œํ•ด์•ผ ํ•˜๋Š” ์ดˆ๊ธฐ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŽ˜์ด๋กœ๋“œ ํฌ๊ธฐ๋ฅผ ๋Œ€ํญ ์ค„์—ฌ ์•ฑ์˜ ์ดˆ๊ธฐ ๋กœ๋“œ ์†๋„์™€ ์ „๋ฐ˜์ ์ธ ์„ฑ๋Šฅ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค [2-4]. - -## ๐Ÿ“– Core Content -* **์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…(Code Splitting)๊ณผ ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ ๊ฐ์†Œ:** - ์ดˆ๊ธฐ ๋กœ๋“œ ์‹œ ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ํ•œ ๋ฒˆ์— ๋ถˆ๋Ÿฌ์˜ค๋ฉด ๋ฒˆ๋“ค ํฌ๊ธฐ๊ฐ€ ๋น„๋Œ€ํ•ด์ ธ ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [5]. `React.lazy()`๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฑฐ๋Œ€ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋ฅผ ์ž˜๊ฒŒ ์ชผ๊ฐœ์–ด, ํŠน์ • ๋ผ์šฐํŠธ๋‚˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง๋  ๋•Œ๋งŒ ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ๋‹ค์šด๋กœ๋“œํ•˜๋„๋ก ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1, 6, 7]. -* **Suspense์™€์˜ ๊ฒฐํ•ฉ:** - `React.lazy()`๋กœ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ปดํฌ๋„ŒํŠธ๋Š” ๋ฐ˜๋“œ์‹œ `` ์ปดํฌ๋„ŒํŠธ๋กœ ๊ฐ์‹ธ์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [1, 3]. ``๋Š” ๋ชจ๋“ˆ์ด ๋กœ๋“œ๋˜๋Š” ๋™์•ˆ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ค„ ๋Œ€์ฒด UI(์˜ˆ: ๋กœ๋”ฉ ์Šคํ”ผ๋„ˆ)๋ฅผ `fallback` ์†์„ฑ์„ ํ†ตํ•ด ์ •์˜ํ•˜์—ฌ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๋งค๋„๋Ÿฝ๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค [1, 3, 8]. -* **์ ์šฉ ๋Œ€์ƒ(Use Cases):** - * **๋ผ์šฐํŠธ ๊ธฐ๋ฐ˜ ์ปดํฌ๋„ŒํŠธ(Route-based components):** ์‚ฌ์šฉ์ž๊ฐ€ ํŠน์ • ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•  ๋•Œ๋งŒ ํ•ด๋‹น ํŽ˜์ด์ง€ ์ฝ”๋“œ๋ฅผ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค [8, 9]. - * **์‚ฌ์šฉ ๋นˆ๋„๊ฐ€ ๋‚ฎ์€ ๋ทฐ:** ๊ด€๋ฆฌ์ž ํ™”๋ฉด์ด๋‚˜ ์„ค์ • ํŒจ๋„์ฒ˜๋Ÿผ ๋“œ๋ฌผ๊ฒŒ ์‚ฌ์šฉ๋˜๋Š” ํ™”๋ฉด์— ์ ์šฉํ•ฉ๋‹ˆ๋‹ค [9]. - * **๋ฌด๊ฑฐ์šด UI ๋ธ”๋ก ๋ฐ ์„œ๋“œํŒŒํ‹ฐ ํ†ตํ•ฉ ๊ธฐ๋Šฅ:** ์ฐจํŠธ, ์ง€๋„, ๋ฆฌ์น˜ ํ…์ŠคํŠธ ์—๋””ํ„ฐ, ๋น„๋””์˜ค ํ”Œ๋ ˆ์ด์–ด ๋“ฑ ์šฉ๋Ÿ‰์ด ํฐ ์œ„์ ฏ์„ ๋ Œ๋”๋งํ•  ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค [3, 9, 10]. -* **๋นŒ๋“œ ๋„๊ตฌ์™€์˜ ์ž๋™ ํ†ตํ•ฉ:** - Vite๋‚˜ Webpack๊ณผ ๊ฐ™์€ ์ตœ์‹  ๋ฒˆ๋“ค๋Ÿฌ๋Š” `React.lazy(() => import('./Component'))` ๋ฌธ๋ฒ•์„ ์ž๋™์œผ๋กœ ์ธ์‹ํ•˜์—ฌ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ณ„๋„์˜ ํŒŒ์ผ(์ฒญํฌ)๋กœ ๋ถ„๋ฆฌํ•ด ์ปดํŒŒ์ผํ•ฉ๋‹ˆ๋‹ค [2, 3, 8]. - -## โš–๏ธ Trade-offs & Caveats -* **์–ด๋ณด๋ธŒ ๋” ํด๋“œ(Above-the-fold) ์š”์†Œ ์ ์šฉ ๊ธˆ์ง€:** ์‚ฌ์šฉ์ž๊ฐ€ ํŽ˜์ด์ง€์— ์ง„์ž…ํ•˜์ž๋งˆ์ž ์ฆ‰์‹œ ๋ณด์•„์•ผ ํ•˜๋Š” ํ•„์ˆ˜์ ์ธ ์ปดํฌ๋„ŒํŠธ๋‚˜ ๋น ๋ฅด๊ฒŒ ๋ Œ๋”๋ง๋˜์–ด์•ผ ํ•˜๋Š” ์š”์†Œ์— `React.lazy()`๋ฅผ ์ ์šฉํ•˜๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค [9]. ์ด๋ฅผ ์ง€์—ฐ ๋กœ๋”ฉํ•  ๊ฒฝ์šฐ ๋ถˆํ•„์š”ํ•œ ๋„คํŠธ์›Œํฌ ์ง€์—ฐ์ด ๋ฐœ์ƒํ•˜์—ฌ ์˜คํžˆ๋ ค ์ฒด๊ฐ ์„ฑ๋Šฅ๊ณผ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์ด ํ•˜๋ฝํ•ฉ๋‹ˆ๋‹ค [9]. -* **๋ ˆ์ด์•„์›ƒ ์‹œํ”„ํŠธ ๋ฐ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ์ €ํ•˜:** ๋น„๋™๊ธฐ ๋กœ๋”ฉ ์ค‘ ``์˜ `fallback`์ด ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚˜๋ฉด์„œ, ๋กœ๋”ฉ์ด ๋๋‚œ ํ›„ ๋ณธ๋ž˜ ์ปดํฌ๋„ŒํŠธ๋กœ ์ „ํ™˜๋  ๋•Œ ๋ ˆ์ด์•„์›ƒ์ด ๋ฐ€๋ฆฌ๊ฑฐ๋‚˜ ๊นœ๋นก๊ฑฐ๋ฆฌ๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1, 11]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -#### [์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] -- [[Code Splitting]] - - ์—ฐ๊ฒฐ ์ด์œ : `React.lazy()`์˜ ์กด์žฌ ๋ชฉ์ ์ด์ž ๊ทผ๋ณธ์ ์ธ ์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค [6]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ดˆ๊ธฐ ๋ Œ๋”๋ง ์‹œ ๋ถˆํ•„์š”ํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ค„์—ฌ ๋กœ๋”ฉ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ์กฐ ์›๋ฆฌ. -- [[Dynamic Imports]] - - ์—ฐ๊ฒฐ ์ด์œ : `React.lazy()` ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋ชจ๋“ˆ์„ ๋กœ๋“œํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ํ‘œ์ค€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฌธ๋ฒ•(`import()`)์ž…๋‹ˆ๋‹ค [2, 3, 8]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํŠน์ • ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜์–ด์•ผ ํ•  ์‹œ์ ์— ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ์ƒ์„ฑํ•˜์—ฌ ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์˜ค๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜. - -#### [๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ] -- [[Suspense]] - - ์—ฐ๊ฒฐ ์ด์œ : `React.lazy()`๋กœ ๋ถ„๋ฆฌ๋œ ์ฝ”๋“œ๊ฐ€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๋‹ค์šด๋กœ๋“œ๋˜๋Š” ๋™์•ˆ ์•ฑ์ด ๋ฉˆ์ถ”์ง€ ์•Š๋„๋ก ๋กœ๋”ฉ UI๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ํ•„์ˆ˜์ ์œผ๋กœ ๊ฒฐํ•ฉ๋˜๋Š” ๋ฆฌ์•กํŠธ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค [1, 3]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋น„๋™๊ธฐ ๋ Œ๋”๋ง ํ๋ฆ„์—์„œ ๋กœ๋”ฉ ์ƒํƒœ(Loading State)๋ฅผ ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ ์ƒ๋‹จ์—์„œ ์„ ์–ธ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•. -- [[Vite/Rollup]] - - ์—ฐ๊ฒฐ ์ด์œ : ์†Œ์Šค ์ฝ”๋“œ์— ์ž‘์„ฑ๋œ `React.lazy()` ๊ตฌ๋ฌธ์„ ๋ถ„์„ํ•˜์—ฌ ๋นŒ๋“œ ํƒ€์ž„์— ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๊ฐœ๋ณ„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ(์ฒญํฌ)๋กœ ๋ถ„ํ• ํ•ด ๋‚ด๋Š” ๋„๊ตฌ๋“ค์ž…๋‹ˆ๋‹ค [2, 8]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ชจ๋“ˆ ๋ฒˆ๋“ค๋Ÿฌ๊ฐ€ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…์„ ์ธ์‹ํ•˜๊ณ  ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์˜ ์ •์  ์—์…‹์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์บ์‹ฑ ํšจ์œจ์„ ๋†’์ด๋Š” ๊ณผ์ •. - -### Deeper Research Questions -- `React.lazy()`๋ฅผ ํ™œ์šฉํ•œ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…๊ณผ ์„œ๋ฒ„ ์‚ฌ์ด๋“œ์—์„œ ์ด๋ฃจ์–ด์ง€๋Š” [[React Server Components]]์˜ ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ฐฉ์‹์€ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅด๋ฉฐ ์„œ๋กœ ์–ด๋–ป๊ฒŒ ๋ณด์™„๋  ์ˆ˜ ์žˆ๋Š”๊ฐ€? -- ``๋กœ ๊ฐ์‹ธ์ง„ ์ง€์—ฐ ๋กœ๋”ฉ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋กœ๋“œ๋  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” Cumulative Layout Shift (CLS)๋ฅผ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•œ ๊ตฌ์ฒด์ ์ธ UI ํŒจํ„ด๊ณผ ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? -- ๋ชจ๋ฐ”์ผ ํ™˜๊ฒฝ ๋“ฑ ๋„คํŠธ์›Œํฌ ์†๋„๊ฐ€ ๋А๋ฆฐ ๊ณณ์—์„œ `React.lazy()`๋กœ ๋ถ„๋ฆฌ๋œ ์ฒญํฌ๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ๋•Œ, ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ(์˜ˆ: ๋ฐฐํฌ ํ›„ ์ด์ „ ํ•ด์‹œ ์ฒญํฌ ์‚ญ์ œ๋จ) ์ด๋ฅผ Error Boundary๋กœ ์–ด๋–ป๊ฒŒ ์šฐ์•„ํ•˜๊ฒŒ ๋ณต๊ตฌํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? -- ์‚ฌ์šฉ์ž๊ฐ€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์š”์ฒญํ•˜๊ธฐ ์ „(์˜ˆ: ๋งํฌ์— ๋งˆ์šฐ์Šค๋ฅผ ์˜ฌ๋ฆฌ๋Š” ์‹œ์ )์— `React.lazy()`๋กœ ๋ถ„๋ฆฌ๋œ ์ฒญํฌ๋ฅผ ๋ฏธ๋ฆฌ ๊ฐ€์ ธ์˜ค๋Š” ํ”„๋ฆฌํŒจ์น˜(Prefetching/Preloading) ์ „๋žต์€ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•˜๋Š”๊ฐ€? -- Vite์˜ `manualChunks` ์„ค์ •๊ณผ `React.lazy()`๋ฅผ ๋™์‹œ์— ํ™œ์šฉํ•˜์—ฌ, ํ•ต์‹ฌ ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์บ์‹ฑ๊ณผ ํŽ˜์ด์ง€๋ณ„ ์ง€์—ฐ ๋กœ๋”ฉ์„ ๊ฒฐํ•ฉํ•˜๋Š” ์ตœ์ ์˜ ๋นŒ๋“œ ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? - -### Practical Application Contexts -- **Implementation:** React ์ฝ”๋“œ ์ƒ๋‹จ์— ๋ชจ๋“ˆ์„ ์ •์  ์ž„ํฌํŠธํ•˜๋Š” ๋Œ€์‹ , `const LazyComponent = React.lazy(() => import('./LazyComponent'))`๋กœ ์„ ์–ธํ•˜๊ณ , ๋ Œ๋” ํŠธ๋ฆฌ์— ์‚ฌ์šฉํ•  ๋•Œ `}> ` ํ˜•ํƒœ๋กœ ๊ฐ์‹ธ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค [1, 3]. -- **System Design:** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ผ์šฐํŒ… ๋ ˆ์ด์–ด ์„ค๊ณ„ ์‹œ, ๋ชจ๋“  ๋ผ์šฐํŠธ๋ฅผ ์ดˆ๊ธฐ ๋ฒˆ๋“ค์— ๋ฌถ์ง€ ์•Š๊ณ  ๊ฐ ํŽ˜์ด์ง€ ๋˜๋Š” ๋ฌด๊ฑฐ์šด ์ฐจํŠธ/์—๋””ํ„ฐ์™€ ๊ฐ™์€ ๋…๋ฆฝ์  ๋„๋ฉ”์ธ์„ ๋ถ„๋ฆฌํ•˜๋Š” ๊ธฐ์ค€์œผ๋กœ ์„ค๊ณ„ ๊ธฐ์ค€์„ ์ˆ˜๋ฆฝํ•ฉ๋‹ˆ๋‹ค [8, 9]. -- **Operation / Maintenance:** `rollup-plugin-visualizer`๋‚˜ Webpack Bundle Analyzer ๋“ฑ์˜ ๋„๊ตฌ๋ฅผ ์ด์šฉํ•ด ๋นŒ๋“œ ํ›„ 500KB๊ฐ€ ๋„˜์–ด๊ฐ€๋Š” ํฐ ์ฒญํฌ(Large chunks)๊ฐ€ ์žˆ๋Š”์ง€ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ , ๋ฐœ๊ฒฌ ์‹œ `React.lazy()`๋ฅผ ์‚ฌ์šฉํ•ด ์ง€์—ฐ ๋กœ๋”ฉ ๊ฐ€๋Šฅํ•œ ๋ถ€๋ถ„์œผ๋กœ ์ž˜๋ผ๋ƒ…๋‹ˆ๋‹ค [7, 12, 13]. -- **Learning Path:** React ์ปดํฌ๋„ŒํŠธ ์ƒ๋ช…์ฃผ๊ธฐ์™€ ๋ Œ๋”๋ง์— ๋Œ€ํ•œ ์ดํ•ด โ†’ ๋ฒˆ๋“ค ํฌ๊ธฐ๊ฐ€ ์„ฑ๋Šฅ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ ํŒŒ์•… โ†’ `React.lazy`์™€ `Suspense`๋ฅผ ํ†ตํ•œ ํด๋ผ์ด์–ธํŠธ ๋กœ๋”ฉ ์ตœ์ ํ™” โ†’ ๋” ๋‚˜์•„๊ฐ€ ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง(SSR) ๋ฐ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋กœ ํ™•์žฅํ•˜๋Š” ๊ฒฝ๋กœ๋กœ ํ•™์Šต์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค. -- **My Project Relevance:** ํ˜„์žฌ ์œ ์ง€๋ณด์ˆ˜ ์ค‘์ธ ํ”„๋กœ์ ํŠธ์— ๋ชจ๋‹ฌ, ์–ด๋“œ๋ฏผ ์„ค์ • ํŒจ๋„ ๋“ฑ ์ฆ‰์‹œ ๋ณด์ด์ง€ ์•Š๋Š” ์ปดํฌ๋„ŒํŠธ๋“ค์ด ๋ฉ”์ธ ๋ฒˆ๋“ค์— ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋ฉด, ์ด๋ฅผ `React.lazy()`๋กœ ๋ฆฌํŒฉํ† ๋งํ•˜์—ฌ Time To Interactive (TTI) ์ง€ํ‘œ๋ฅผ ๋‹น์žฅ ๊ฐœ์„ ํ•˜๋Š” ๋ฐ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - -### Adjacent Topics -- [[Core Web Vitals]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: `React.lazy()`๋ฅผ ์ ์šฉํ–ˆ์„ ๋•Œ First Contentful Paint (FCP)์™€ Interaction to Next Paint (INP) ๊ฐ™์€ ๊ตฌ๊ธ€์˜ ์›น ์„ฑ๋Šฅ ์ง€ํ‘œ๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ฐœ์„ ๋˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์—ฐ๊ตฌ ํ™•์žฅ [1, 5]. -- [[manualChunks]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: `React.lazy()`์— ์˜ํ•œ ์Šคํ”Œ๋ฆฌํŒ… ์™ธ์—, React ์ฝ”์–ด๋‚˜ ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค(vendor)์„ ๋ณ„๋„ ๋ถ„๋ฆฌํ•ด ๋ธŒ๋ผ์šฐ์ € ์บ์‹ฑ์„ ๊ณ ๋„ํ™”ํ•˜๋Š” ๋นŒ๋“œ ๋„๊ตฌ ์ˆ˜์ค€์˜ ์ˆ˜๋™ ์ œ์–ด ๊ธฐ๋ฒ• ํŒŒ์•… [8, 14]. -- [[React Server Components (RSC)]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ํด๋ผ์ด์–ธํŠธ๋กœ ์•„์˜ˆ ๋ณด๋‚ด์ง€ ์•Š๊ณ  ์„œ๋ฒ„์—์„œ ๋ Œ๋”๋งํ•˜์—ฌ ์„ฑ๋Šฅ์„ ๊ทน๋Œ€ํ™”ํ•˜๋Š” ์ตœ์‹  Next.js ํŒจ๋Ÿฌ๋‹ค์ž„๊ณผ ํด๋ผ์ด์–ธํŠธ ๋‹จ์˜ `React.lazy`๋ฅผ ๋น„๊ต [9, 15]. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Real User Monitoring (RUM).md b/00_Raw/Real User Monitoring (RUM).md deleted file mode 100644 index fafa3074..00000000 --- a/00_Raw/Real User Monitoring (RUM).md +++ /dev/null @@ -1,62 +0,0 @@ -# [[Real User Monitoring (RUM)]] - -## ๐Ÿ“Œ Brief ์‹œ Summary -Real User Monitoring (RUM)์€ ๋‹ค์–‘ํ•œ ๊ธฐ๊ธฐ์™€ ๋„คํŠธ์›Œํฌ ์กฐ๊ฑด์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ๊ฒฝํ—˜ํ•˜๋Š” ์‹ค์ œ ์„ฑ๋Šฅ๊ณผ ์ƒํ˜ธ์ž‘์šฉ์„ ์ถ”์ ํ•˜๋Š” ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค [1]. ํ•ฉ์„ฑ ํ…Œ์ŠคํŠธ(Synthetic testing)๊ฐ€ ๋†“์น  ์ˆ˜ ์žˆ๋Š” ์‹ค์ œ ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ํŒŒ์•…ํ•˜๋Š” ๋ฐ ํ•„์ˆ˜์ ์ด๋ฉฐ [1], ํ”„๋ก ํŠธ์—”๋“œ์˜ ์‚ฌ์šฉ์ž ์•ก์…˜๊ณผ ๋ฐฑ์—”๋“œ์˜ ์ธํ”„๋ผ ํŠธ๋ ˆ์ด์Šค๋ฅผ ์—ฐ๊ฒฐํ•˜์—ฌ ์ „์ฒด ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ๊ฐ€์‹œ์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [2]. - -## ๐Ÿ“– Core Content -* **์‹ค์ œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ์ถ”์ :** RUM์€ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์ด๋‚˜ ์ธ์œ„์ ์ธ ํ•ฉ์„ฑ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์—์„œ๋Š” ํฌ์ฐฉํ•˜๊ธฐ ์–ด๋ ค์šด ๋‹ค์–‘ํ•œ ๊ธฐ๊ธฐ, ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ ๋ฐ ๋„คํŠธ์›Œํฌ ์กฐ๊ฑด์—์„œ์˜ ์‹ค์ œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค [1]. ์ด๋ฅผ ํ†ตํ•ด ํŠน์ • ๊ธฐ๊ธฐ๋‚˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ๋งŒ ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3]. -* **์—”๋“œํˆฌ์—”๋“œ(End-to-End) ํŠธ๋ ˆ์ด์‹ฑ:** Datadog RUM ๋“ฑ์˜ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ ๊ฐ„์˜ ๋ชจ๋‹ˆํ„ฐ๋ง ๊ฒฉ์ฐจ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋ก ํŠธ์—”๋“œ์—์„œ ๋ฐœ์ƒํ•œ ์—๋Ÿฌ๋ฅผ ํด๋ฆญํ•˜๋ฉด, ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฐ ์„œ๋“œํŒŒํ‹ฐ API์— ์ด๋ฅด๋Š” ์ „์ฒด ์š”์ฒญ ๊ณผ์ •์„ ๋ถ„์‚ฐ ํŠธ๋ ˆ์ด์‹ฑ(Distributed tracing)์„ ํ†ตํ•ด ์ถ”์ ํ•  ์ˆ˜ ์žˆ์–ด ๋ณต์žกํ•œ ์‹œ์Šคํ…œ์˜ ๋””๋ฒ„๊น…์„ ๋•์Šต๋‹ˆ๋‹ค [2]. -* **ํ†ตํ•ฉ ๊ด€์ธก์„ฑ(Unified Observability):** ์ตœ์‹  ๋ชจ๋‹ˆํ„ฐ๋ง ํ”Œ๋žซํผ์—์„œ RUM์€ ํ”„๋ก ํŠธ์—”๋“œ์˜ ์˜ค๋ฅ˜ ๋กœ๊ทธ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ธํ”„๋ผ ๋ชจ๋‹ˆํ„ฐ๋ง, ๋ฐฑ์—”๋“œ APM(Application Performance Monitoring) ๋“ฑ๊ณผ ํ•œ๊ณณ์—์„œ ๊ฒฐํ•ฉ๋˜์–ด ํ™œ์šฉ๋ฉ๋‹ˆ๋‹ค [4]. -* **๋น„์šฉ ๋ฐ ๋ผ์ด์„ ์Šค ๋ชจ๋ธ:** 1,000๋ช…์˜ ์œ ์ €๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•  ๋•Œ ๊ธฐ๋ณธ์ ์ธ RUM ๊ธฐ๋Šฅ์€ ์›” $15~$30 ์ˆ˜์ค€์œผ๋กœ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์œผ๋‚˜, ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘๋Ÿ‰์— ๋”ฐ๋ผ ๋น„์šฉ์ด ์ฒญ๊ตฌ๋˜๋Š” ์‚ฌ์šฉ๋Ÿ‰ ๊ธฐ๋ฐ˜ ๊ฐ€๊ฒฉ ์ •์ฑ…์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค [5]. - -## โš–๏ธ Trade-offs & Caveats -* **๋ฐ์ดํ„ฐ ๊ทœ๋ชจ์— ๋”ฐ๋ฅธ ๊ณผ๋„ํ•œ ๋น„์šฉ ์ฒญ๊ตฌ:** RUM ํ”Œ๋žซํผ(์˜ˆ: Datadog)์€ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘(Ingest)๊ณผ ๊ฒ€์ƒ‰์„ ์œ„ํ•œ ์ธ๋ฑ์‹ฑ(Index)์„ ๋ถ„๋ฆฌํ•˜์—ฌ ์š”๊ธˆ์„ ๋ถ€๊ณผํ•˜๋Š” '์ด์ค‘ ์š”๊ธˆ์ œ'๋ฅผ ์ฑ„ํƒํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ํŠธ๋ž˜ํ”ฝ์ด ๋†’์€ ์„œ๋น„์Šค์—์„œ๋Š” ๋น„์šฉ์ด ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ์ฆ๊ฐ€ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋กœ ์ธํ•ด ๋น„์šฉ ์ ˆ๊ฐ์„ ์œ„ํ•ด ๋กœ๊ทธ์˜ 20%๋งŒ ์ธ๋ฑ์‹ฑํ•˜๊ฒŒ ๋˜๋ฉด ์žฅ์•  ๋ฐœ์ƒ ์‹œ 80%์˜ ์ฃผ์š” ๋””๋ฒ„๊น… ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์—†๋Š” ์ƒํ™ฉ์— ๋†“์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5, 6]. -* **ํ”„๋ผ์ด๋ฒ„์‹œ ๋ฐ ๋ณด์•ˆ ๋ฌธ์ œ:** ์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด(Session replay) ๋“ฑ ์‚ฌ์šฉ์ž์˜ ๋ชจ๋“  ํ–‰๋™์„ ๊ธฐ๋กํ•˜๋Š” RUM ๋„๊ตฌ๋Š” ๋ฏผ๊ฐํ•œ ๊ฐœ์ธ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ํ•  ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์—„๊ฒฉํ•ด์ง€๋Š” ๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ ๊ทœ์ œ๋ฅผ ์ค€์ˆ˜ํ•˜๊ธฐ ์œ„ํ•ด ๋ฏผ๊ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ž๋™ ๋งˆ์Šคํ‚นํ•˜๋„๋ก ์„ค์ •ํ•˜๋Š” ๋ฐ ๋งŽ์€ ์‹œ๊ฐ„์ด ์†Œ์š”๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [7-9]. -* **์ดˆ๊ธฐ ๋กœ๋“œ ์„ฑ๋Šฅ ์ €ํ•˜ (์„ฑ๋Šฅ ์˜ค๋ฒ„ํ—ค๋“œ):** ํ”„๋ก ํŠธ์—”๋“œ์— ์‚ฝ์ž…๋˜๋Š” RUM ์ถ”์  ์Šคํฌ๋ฆฝํŠธ๋Š” ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ฆ๊ฐ€์‹œํ‚ต๋‹ˆ๋‹ค. ์ผ๋ถ€ ๋„๊ตฌ์˜ ๊ฒฝ์šฐ ๋กœ๋“œ ์‹œ๊ฐ„์„ ์ตœ๋Œ€ 120ms๊นŒ์ง€ ์ง€์—ฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, 1์ดˆ๊ฐ€ ์ค‘์š”ํ•œ ์ด์ปค๋จธ์Šค ๋“ฑ์˜ ์‚ฌ์ดํŠธ์—์„œ๋Š” ๊ฒฝ๋Ÿ‰ํ™”๋œ ์˜ต์…˜์„ ์‹ ์ค‘ํžˆ ์„ ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [10]. -* **๋„์ž… ๋ฐ ํ•™์Šต ๊ณก์„ :** ํ’€์Šคํƒ ๊ด€์ธก ํ”Œ๋žซํผ๊ณผ ๊ฒฐํ•ฉ๋œ RUM ๋„๊ตฌ๋Š” ๋‹จ์ˆœ ํ”„๋ก ํŠธ์—”๋“œ ๋กœ๊น…๋งŒ ํ•„์š”ํ•œ ์ž‘์€ ํŒ€์—๊ฒŒ๋Š” ์ง€๋‚˜์นœ ์˜ค๋ฒ„์—”์ง€๋‹ˆ์–ด๋ง(Overkill)์ด ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ „์ฒด ํ”Œ๋žซํผ์„ ์ดํ•ดํ•˜๋Š” ๋ฐ ๊ฐ€ํŒŒ๋ฅธ ํ•™์Šต ๊ณก์„ ์ด ์š”๊ตฌ๋ฉ๋‹ˆ๋‹ค [6, 11]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -#### [๊ด€๊ณ„ ์œ ํ˜• A (์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ )] -- [[Synthetic Testing]] - - ์—ฐ๊ฒฐ ์ด์œ : RUM๊ณผ ๋Œ€๋น„๋˜๋Š” ๋ชจ๋‹ˆํ„ฐ๋ง ๊ฐœ๋…์œผ๋กœ, ๊ฐ€์ƒ ํ™˜๊ฒฝ์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜์—ฌ ์ธก์ •ํ•ฉ๋‹ˆ๋‹ค [1]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๋ฐ์ดํ„ฐ์™€ ์‹ค์ œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜(RUM) ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ƒํ˜ธ๋ณด์™„์ ์œผ๋กœ ์ž‘์šฉํ•˜์—ฌ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ์ฐพ์•„๋‚ด๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -- [[Distributed Tracing]] - - ์—ฐ๊ฒฐ ์ด์œ : RUM ๋„๊ตฌ๊ฐ€ ํ”„๋ก ํŠธ์—”๋“œ์˜ ์‚ฌ์šฉ์ž ๋™์ž‘์„ ๋ฐฑ์—”๋“œ์˜ ์„œ๋น„์Šค ์š”์ฒญ๊ณผ ์—ฐ๊ด€ ์ง“๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ํ•ต์‹ฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค [2, 4, 12]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜ ํ™˜๊ฒฝ์—์„œ ํด๋ผ์ด์–ธํŠธ ์—๋Ÿฌ์˜ ๊ทผ๋ณธ ์›์ธ์„ ๋ฐฑ์—”๋“œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋‚˜ ์™ธ๋ถ€ API๊นŒ์ง€ ์–ด๋–ป๊ฒŒ ์ถ”์ ํ•˜๋Š”์ง€ ์›๋ฆฌ๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -- [[Core Web Vitals]] - - ์—ฐ๊ฒฐ ์ด์œ : RUM์„ ํ†ตํ•ด ์ฃผ๋กœ ์ธก์ •ํ•˜๊ณ  ์ตœ์ ํ™”ํ•˜๋ ค๋Š” ๋Œ€์ƒ์ธ ์‹ค์ œ ์‚ฌ์šฉ์ž ์ค‘์‹ฌ์˜ ๋กœ๋”ฉ ์†๋„, ์ƒํ˜ธ์ž‘์šฉ, ์‹œ๊ฐ์  ์•ˆ์ •์„ฑ ์ง€ํ‘œ์ž…๋‹ˆ๋‹ค [13, 14]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: RUM ๋ฐ์ดํ„ฐ๊ฐ€ ์›น ์„ฑ๋Šฅ ์ตœ์ ํ™”์˜ ๊ธฐ์ค€(LCP, FID, CLS, INP)๊ณผ ์–ด๋–ป๊ฒŒ ๋งคํ•‘๋˜์–ด ์‚ฌ์šฉ์ž ๊ฒฝํ—˜(UX)์„ ์ˆ˜์น˜ํ™”ํ•˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - -#### [๊ด€๊ณ„ ์œ ํ˜• B (๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ)] -- [[Datadog RUM]] - - ์—ฐ๊ฒฐ ์ด์œ : ์†Œ์Šค์—์„œ ์—”๋“œํˆฌ์—”๋“œ ํ”„๋ก ํŠธ์—”๋“œ-๋ฐฑ์—”๋“œ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์—ฐ๊ฒฐํ•ด ์ฃผ๋Š” ๋Œ€ํ‘œ์ ์ธ RUM ํ”Œ๋žซํผ์œผ๋กœ ์†Œ๊ฐœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค [2]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋Œ€๊ทœ๋ชจ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์—์„œ RUM์„ ํ™œ์šฉํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ์‚ฌ๋ก€์™€, ์ธ๋ฑ์‹ฑ ๋น„์šฉ ์ตœ์ ํ™”(Trade-off) ์ „๋žต์˜ ์ค‘์š”์„ฑ์„ ํ•™์Šตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -- [[Session Replay]] - - ์—ฐ๊ฒฐ ์ด์œ : ์‚ฌ์šฉ์ž์˜ ์ƒํƒœ ๋ณ€๊ฒฝ, ์ฝ˜์†” ๋กœ๊ทธ, ๋„คํŠธ์›Œํฌ ์š”์ฒญ ๋“ฑ์„ ๋งˆ์น˜ ํ™”๋ฉด ๋…นํ™”์ฒ˜๋Ÿผ ์žฌํ˜„ํ•˜๋Š” RUM์˜ ๊ณ ๊ธ‰ ๋””๋ฒ„๊น… ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค [7, 12, 15]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์Šคํƒ ํŠธ๋ ˆ์ด์Šค๋งŒ์œผ๋กœ ์ฐพ๊ธฐ ํž˜๋“  ๋ณต์žกํ•œ ์‚ฌ์šฉ์ž ์ƒํ˜ธ์ž‘์šฉ ์˜ค๋ฅ˜์˜ ๋””๋ฒ„๊น… ๋ฐฉ๋ฒ•๋ก ๊ณผ ์ด์— ๋”ฐ๋ฅธ ํ”„๋ผ์ด๋ฒ„์‹œ ์„ค์ •์˜ ์ค‘์š”์„ฑ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - -### Deeper Research Questions -- ๊ฐ€์ƒ ํ™˜๊ฒฝ์˜ ์„ฑ๋Šฅ์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜๋Š” ํ•ฉ์„ฑ ํ…Œ์ŠคํŠธ(Synthetic Testing)์™€ ๋น„๊ตํ•  ๋•Œ, RUM๋งŒ์ด ๋…์ ์ ์œผ๋กœ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š” ์‹ค์ œ ๊ธฐ๊ธฐ/๋„คํŠธ์›Œํฌ ๊ธฐ๋ฐ˜์˜ ์„ฑ๋Šฅ ์ด์Šˆ ํŒจํ„ด์€ ๋ฌด์—‡์ธ๊ฐ€? -- Datadog๊ณผ ๊ฐ™์€ RUM ์†”๋ฃจ์…˜์„ ํ™œ์šฉํ•  ๋•Œ, ๋Œ€๊ทœ๋ชจ ํŠธ๋ž˜ํ”ฝ ํ•˜์—์„œ ๊ฐ€์‹œ์„ฑ ์†์‹ค ์—†์ด ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘(Ingest)๊ณผ ์ธ๋ฑ์‹ฑ(Indexing) ๋น„์šฉ์˜ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๋ฅผ ๊ทน๋ณตํ•  ์ˆ˜ ์žˆ๋Š” ๋กœ๊ทธ ํ•„ํ„ฐ๋ง ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? -- RUM ์—์ด์ „ํŠธ์˜ ์‚ฝ์ž…์ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค ํฌ๊ธฐ ๋ฐ ์ดˆ๊ธฐ ํŽ˜์ด์ง€ ๋กœ๋“œ ์†๋„(์ตœ๋Œ€ 120ms ์ถ”๊ฐ€)์— ๋ฏธ์น˜๋Š” ์„ฑ๋Šฅ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ตœ์†Œํ™”ํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? -- ๊ธ€๋กœ๋ฒŒ ํ”„๋ผ์ด๋ฒ„์‹œ ๊ทœ์ œ๋ฅผ ์ค€์ˆ˜ํ•˜๋ฉด์„œ Session Replay๋ฅผ ํฌํ•จํ•œ RUM ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ธฐ ์œ„ํ•ด, ๋ฏผ๊ฐํ•œ DOM ์š”์†Œ๋‚˜ ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ์–ด๋–ป๊ฒŒ ํšจ๊ณผ์ ์œผ๋กœ ๋งˆ์Šคํ‚น(Masking)ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? -- ํ”„๋ก ํŠธ์—”๋“œ React ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฐœ์ƒํ•œ ์—๋Ÿฌ๋ฅผ RUM ๋ฐ์ดํ„ฐ์™€ ๊ฒฐํ•ฉํ•˜๊ณ , ๋ฐฑ์—”๋“œ์˜ OpenTelemetry ๋ถ„์‚ฐ ํŠธ๋ ˆ์ด์Šค์™€ ์—ฐ๊ฒฐ(Trace ID ๊ณต์œ  ๋“ฑ)ํ•˜์—ฌ ์ „์ฒด ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ํ๋ฆ„์—์„œ ๊ทผ๋ณธ ์›์ธ์„ ํŒŒ์•…ํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ• ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? - -### Practical Application Contexts -- **Implementation:** React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์—”ํŠธ๋ฆฌ ํฌ์ธํŠธ์— Datadog์ด๋‚˜ Sentry์™€ ๊ฐ™์€ RUM ๋ชจ๋‹ˆํ„ฐ๋ง SDK๋ฅผ ํ†ตํ•ฉํ•˜๊ณ , Core Web Vitals ๋ฐ ์„ธ์…˜๋ณ„ ์„ฑ๋Šฅ ์ง€ํ‘œ๋ฅผ ์ž๋™์œผ๋กœ ์ˆ˜์ง‘ํ•˜๋„๋ก ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค. -- **System Design:** ์‚ฌ์šฉ์ž์˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ฐœ์ƒํ•œ ํ”„๋ก ํŠธ์—”๋“œ ๋กœ๊ทธ์™€ API ์š”์ฒญ ํ—ค๋”์— ํŠธ๋ ˆ์ด์Šค ID๋ฅผ ์‚ฝ์ž…ํ•˜์—ฌ, ๋ฐฑ์—”๋“œ ๋กœ๊น… ์‹œ์Šคํ…œ๊ณผ ๋งค์นญ์‹œํ‚ค๋Š” '์—”๋“œํˆฌ์—”๋“œ(End-to-End) ๋ชจ๋‹ˆํ„ฐ๋ง ์•„ํ‚คํ…์ฒ˜'๋ฅผ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค. -- **Operation / Maintenance:** ์›”๋ณ„ ๋ชจ๋‹ˆํ„ฐ๋ง ๋น„์šฉ(ํŠนํžˆ ๋ฐ์ดํ„ฐ ์ธ๋ฑ์‹ฑ ๋น„์šฉ)์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ์ด๋ฒคํŠธ๋Š” ์ƒ˜ํ”Œ๋งํ•˜๊ณ , ๋ฐ์ดํ„ฐ ๋งˆ์Šคํ‚น ๊ทœ์น™์„ ์ง€์†์ ์œผ๋กœ ๊ด€๋ฆฌํ•ด GDPR ๋“ฑ์˜ ๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ ์ •์ฑ…์„ ์œ„๋ฐ˜ํ•˜์ง€ ์•Š๋„๋ก ์œ ์ง€๋ณด์ˆ˜ํ•ฉ๋‹ˆ๋‹ค. -- **Learning Path:** ๋จผ์ € React์˜ ๊ธฐ๋ณธ ์—๋Ÿฌ ์ฒ˜๋ฆฌ(Error Boundaries)์™€ ๋ธŒ๋ผ์šฐ์ € DevTools๋ฅผ ์‚ฌ์šฉํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ์ธก์ •์„ ์ตํžŒ ํ›„, ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์˜ ์‹ค์‹œ๊ฐ„ ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๋Š” RUM๊ณผ ๋ฐฑ์—”๋“œ ๋ถ„์‚ฐ ํŠธ๋ ˆ์ด์‹ฑ์„ ํ•™์Šตํ•˜์—ฌ ํ’€์Šคํƒ ๊ด€์ธก์„ฑ(Observability) ์—ญ๋Ÿ‰์„ ๊ธฐ๋ฆ…๋‹ˆ๋‹ค. -- **My Project Relevance:** ํ˜„์žฌ ์ง„ํ–‰ ์ค‘์ธ ํ”„๋ก ํŠธ์—”๋“œ ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉ์ž ์ดํƒˆ๋ฅ ์ด ๋†’์€ ํŠน์ • ํ™”๋ฉด์˜ ๋ณ‘๋ชฉ ์ง€์ ์„ ์ฐพ๊ธฐ ์œ„ํ•ด, RUM์„ ์ ์šฉํ•˜์—ฌ ์‹ค์ œ ๋ชจ๋ฐ”์ผ ๊ธฐ๊ธฐ์™€ 3G/LTE ํ™˜๊ฒฝ์—์„œ์˜ INP(Interaction to Next Paint)์™€ ๋ Œ๋”๋ง ์ง€์—ฐ์„ ์ธก์ • ๋ฐ ๊ฐœ์„ ํ•  ๋•Œ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค. - -### Adjacent Topics -- [[OpenTelemetry]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ํŠน์ • ๋ฒค๋”์— ์ข…์†๋˜์ง€ ์•Š๊ณ (No vendor lock-in) ์˜คํ”ˆ ์Šคํƒ ๋‹ค๋“œ ํ”„๋กœํ† ์ฝœ์„ ์ด์šฉํ•ด RUM, ๋ฉ”ํŠธ๋ฆญ, ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ  ๋ฐฑ์—”๋“œ์™€ ์—ฐ๊ฒฐํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜๋กœ ์ง€์‹์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [16, 17]. -- [[Error Boundaries]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์—์„œ UI ๋ Œ๋”๋ง ์ค‘ ๋ฐœ์ƒํ•˜๋Š” ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๋ฅผ ์บก์ฒ˜ํ•˜์—ฌ ์ „์ฒด ์•ฑ์˜ ํฌ๋ž˜์‹œ๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ๊ฐœ๋…์œผ๋กœ, ์—ฌ๊ธฐ์„œ ํฌ์ฐฉ๋œ ์—๋Ÿฌ๋ฅผ RUM ์‹œ์Šคํ…œ์— ๋ณด๊ณ ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์—ฐ๊ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [18-20]. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Redux.md b/00_Raw/Redux.md deleted file mode 100644 index 332910b5..00000000 --- a/00_Raw/Redux.md +++ /dev/null @@ -1,53 +0,0 @@ -# [[Redux]] - -## ๐Ÿ“Œ Brief Summary -Redux๋Š” ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ์ƒํƒœ ์ปจํ…Œ์ด๋„ˆ๋กœ, ๋ถˆ๋ณ€์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ์—…๋ฐ์ดํŠธ, ์•ก์…˜ ๋””์ŠคํŒจ์น˜(action dispatch), ๊ทธ๋ฆฌ๊ณ  ๋ฆฌ๋“€์„œ(reducer)๋ฅผ ํ†ตํ•ด ์ „์—ญ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์‚ฐ์—… ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค [1]. ์ฃผ๋กœ ๋ณต์žกํ•œ ํŒŒ์ƒ ๋ฐ ๊ณ„์‚ฐ๋œ ์ƒํƒœ๊ฐ€ ์กด์žฌํ•˜๊ฑฐ๋‚˜ 500๊ฐœ ์ด์ƒ์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‹ค๋ฃจ๋Š” ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ผ๊ด€๋œ ๊ฐœ๋ฐœ ํŒจํ„ด์„ ๊ฐ•์ œํ•˜๊ธฐ ์œ„ํ•ด ์ฑ„ํƒ๋œ๋‹ค [2]. RTK Query์™€ Redux DevTools ๊ฐ™์€ ์„ฑ์ˆ™ํ•œ ์ƒํƒœ๊ณ„๋ฅผ ํ†ตํ•ด ๋น„๋™๊ธฐ ์ƒํƒœ ๊ด€๋ฆฌ์˜ ๋ณต์žก์„ฑ์„ ์ค„์ด๊ณ  ๊ฐ•๋ ฅํ•œ ๋””๋ฒ„๊น… ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค [2-4]. - -## ๐Ÿ“– Core ๋Œ€Content -* **์ƒํƒœ ๊ด€๋ฆฌ ์•„ํ‚คํ…์ฒ˜์™€ ๊ตฌ์กฐํ™”**: Redux๋Š” ๋ถˆ๋ณ€์„ฑ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋ฉฐ, ์•ก์…˜๊ณผ ๋ฆฌ๋“€์„œ ํŒจํ„ด์„ ํ†ตํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ณต์žกํ•œ ์ƒํƒœ ๋กœ์ง์„ ์ œ์–ดํ•œ๋‹ค [1]. ๋ชจ๋˜ ํ”„๋ก ํŠธ์—”๋“œ ํด๋” ๊ตฌ์กฐ์—์„œ Redux ์Šฌ๋ผ์ด์Šค(Redux slices)์™€ ๊ธ€๋กœ๋ฒŒ ์ƒํƒœ ๊ด€๋ จ ๋กœ์ง์€ ์ „๋‹ด ๋””๋ ‰ํ† ๋ฆฌ์ธ `store/`์— ๋ฐฐ์น˜๋œ๋‹ค [5-7]. 10๋ช… ์ด์ƒ์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ˜‘์—…ํ•˜๋Š” ์กฐ์ง์ด๋‚˜ ์ด์ปค๋จธ์Šค, ๊ธˆ์œต ์‹œ์Šคํ…œ๊ณผ ๊ฐ™์ด ๋ฏธ์…˜ ํฌ๋ฆฌํ‹ฐ์ปฌํ•œ ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ์ด ์ค‘์š”ํ•œ ํ”„๋กœ์ ํŠธ์—์„œ ์ฝ”๋“œ ์ž‘์„ฑ์˜ ์ผ๊ด€์„ฑ์„ ๊ฐ•์ œํ•˜๋Š” ๋ผˆ๋Œ€ ์—ญํ• ์„ ํ•œ๋‹ค [2]. -* **์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ฐ ์ƒํƒœ ๊ตฌ๋…**: ๋‚ด์žฅ๋œ React Context API๋Š” ์ƒํƒœ์˜ ์ผ๋ถ€๋งŒ ๋ณ€๊ฒฝ๋˜์–ด๋„ ํ•ด๋‹น ์ปจํ…์ŠคํŠธ๋ฅผ ๊ตฌ๋…ํ•˜๋Š” ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ์— ๋ฌด์ฐจ๋ณ„์ ์ธ ๋ฆฌ๋ Œ๋”๋ง์„ ์œ ๋ฐœํ•˜๋Š” ๋ฐ˜๋ฉด, Redux๋Š” ๊ตฌ๋… ๋กœ์ง๊ณผ ๋ Œ๋”๋ง์„ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌํ•œ๋‹ค [3, 8-10]. ์„ ํƒ์ž(Selector)๋ฅผ ์‚ฌ์šฉํ•ด ํ•„์š”ํ•œ ํŒŒ์ƒ ์ƒํƒœ๋งŒ ์ปดํฌ๋„ŒํŠธ์— ๊ณต๊ธ‰ํ•˜์—ฌ ์„ฑ๋Šฅ๊ณผ ์ตœ์ ํ™”๋ฅผ ๋ณด์žฅํ•œ๋‹ค [3]. -* **๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ (RTK Query ๋„์ž…)**: ๊ณผ๊ฑฐ Redux๋Š” ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์— ๋ง‰๋Œ€ํ•œ ์–‘์˜ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ(Thunk, Saga ๋“ฑ)๊ฐ€ ํ•„์š”ํ–ˆ์œผ๋‚˜, ํ˜„์žฌ๋Š” RTK Query๋ฅผ ํ†ตํ•ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ๋‹ค [2, 4]. RTK Query๋Š” ๋ฐ์ดํ„ฐ ์บ์‹ฑ, ์ค‘๋ณต ์š”์ฒญ ์ œ๊ฑฐ, ์ž๋™ ๋ฐ์ดํ„ฐ ์žฌ์š”์ฒญ ๊ธฐ๋Šฅ ๋“ฑ์„ ๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณตํ•˜์—ฌ ๋น„๋™๊ธฐ ์ž‘์—… ์ฝ”๋“œ๋ฅผ ํš๊ธฐ์ ์œผ๋กœ ์ค„์—ฌ์ค€๋‹ค [4]. -* **๋””๋ฒ„๊น…๊ณผ ์ถ”์ ์„ฑ**: Redux์˜ ๊ฐ€์žฅ ํฐ ์ฐจ๋ณ„์ ์€ ๋ธŒ๋ผ์šฐ์ €์˜ Redux DevTools๋ฅผ ํ™œ์šฉํ•œ '์‹œ๊ฐ„ ์—ฌํ–‰ ๋””๋ฒ„๊น…(Time-Travel Debugging)'์ด๋‹ค [2, 3]. ์ƒํƒœ ๋ณ€ํ™” ์ด๋ ฅ์„ ๊ณผ๊ฑฐ๋กœ ๋Œ๋ ค๋ณด๊ฑฐ๋‚˜ ์•ก์…˜์„ ์žฌํ˜„ํ•  ์ˆ˜ ์žˆ์–ด, ์‹ฌ์•ผ์— ๋ฐœ์ƒํ•˜๋Š” ๋ณต์žกํ•œ ์šด์˜ ํ™˜๊ฒฝ์˜ ๋น„๋™๊ธฐ ๋ฒ„๊ทธ๋„ ๋ช‡ ๋ถ„ ๋‚ด์— ์‹œ๊ฐ์ ์œผ๋กœ ํŒŒ์•…ํ•˜๊ฒŒ ํ•ด์ค€๋‹ค [3, 11, 12]. -* **ํ•œ๊ณ„์  ๋ฐ ์ฃผ์˜์‚ฌํ•ญ**: Redux๋Š” ๋„์ž… ์‹œ ๋ง‰๋Œ€ํ•œ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ, ์ •๊ทœํ™”๋œ ์ƒํƒœ ๊ด€๋ฆฌ์˜ ๋‚œํ•ดํ•จ, ๋ฏธ๋“ค์›จ์–ด ์ˆœ์„œ ์˜ค๋ฅ˜, ๊ทธ๋ฆฌ๊ณ  ๊นจ์ง€๊ธฐ ์‰ฌ์šด ์„ ํƒ์ž ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๋“ฑ์˜ ํ•œ๊ณ„๋ฅผ ๊ฐ€์ง„๋‹ค [13]. ๋˜ํ•œ ๋ชจ๋“  ์ƒํƒœ๋ฅผ ํ•˜๋‚˜์˜ ํฐ ๋ฆฌ๋“€์„œ์— ๋ชฐ์•„๋„ฃ๋Š” "God Reducer" ๊ตฌ์กฐ๋‚˜ ํŒ€ ๋‹จ์œ„์˜ ์•ก์…˜ ๊ฒฐํ•ฉ(Action Coupling)์€ ๋Œ€ํ‘œ์ ์ธ ์•ˆํ‹ฐ ํŒจํ„ด์œผ๋กœ ์ง€์ ๋œ๋‹ค [13, 14]. ์ตœ์‹  ํŠธ๋ Œ๋“œ์—์„œ๋Š” ์ด์™€ ๊ฐ™์€ ๋‹จ์ผ(monolithic) ์Šคํ† ์–ด ๊ตฌ์กฐ์˜ ๋ณต์žก์„ฑ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ์™€ ์„œ๋ฒ„ ์ƒํƒœ๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ๋“ฑ ๋ณด๋‹ค ํŒŒํŽธํ™”๋œ ๋ฐฉ์‹์œผ๋กœ ์ง„ํ™”ํ•˜๊ณ  ์žˆ๋‹ค [15]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts -- [[Context API]] - - ์—ฐ๊ฒฐ ์ด์œ : Redux์™€ ์ž์ฃผ ๋น„๊ต๋˜๋Š” React์˜ ๋‚ด์žฅ ์ƒํƒœ ๊ณต์œ  ๊ธฐ๋Šฅ์œผ๋กœ, ์†Œ๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ…Œ๋งˆ๋‚˜ ์–ธ์–ด ์„ค์ • ๋“ฑ์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์ ํ•ฉํ•˜์ง€๋งŒ, ์ƒํƒœ ๋ณ€๊ฒฝ ์‹œ ๋ฐœ์ƒํ•˜๋Š” ๋Œ€๊ทœ๋ชจ ๋ฆฌ๋ Œ๋”๋ง ํญํ’(Re-render Storm)์„ ์œ ๋ฐœํ•˜์—ฌ ๋Œ€๊ทœ๋ชจ ์•ฑ์—์„œ Redux๊ฐ€ ํ•„์š”ํ•œ ๋‹น์œ„์„ฑ์„ ์ œ๊ณตํ•œ๋‹ค [8, 9, 16]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ƒํƒœ ๊ตฌ๋… ์•„ํ‚คํ…์ฒ˜์˜ ์ฐจ์ด๊ฐ€ React ์ปดํฌ๋„ŒํŠธ์˜ ๋ฆฌ๋ Œ๋”๋ง ์„ฑ๋Šฅ์— ๋ฏธ์น˜๋Š” ์น˜๋ช…์ ์ธ ์˜ํ–ฅ์„ฑ [8, 10]. - -- [[Zustand]] - - ์—ฐ๊ฒฐ ์ด์œ : Redux์˜ ๋ฌด๊ฑฐ์šด ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ์™€ Context API์˜ ์„ฑ๋Šฅ ๋ฌธ์ œ ์‚ฌ์ด์—์„œ ์ ์ ˆํ•œ ํƒ€ํ˜‘์ ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒฝ๋Ÿ‰ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค [17-19]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๊ณผ๋„ํ•œ ์œ ์—ฐ์„ฑ(Zustand)์ด ํŒ€ ๋‹จ์œ„ ํ˜‘์—…์—์„œ ์–ด๋–ป๊ฒŒ ๋น„๋™๊ธฐ ํŒจํ„ด์˜ ํŒŒํŽธํ™”์™€ ํ˜ผ๋ž€์„ ์•ผ๊ธฐํ•  ์ˆ˜ ์žˆ๋Š”์ง€, ๋Œ€์กฐ์ ์œผ๋กœ Redux์˜ ์—„๊ฒฉํ•œ ๊ตฌ์กฐ๊ฐ€ ๊ฐ–๋Š” ๋ฐฉ์–ด์  ์ด์  [1, 11, 18, 20]. - -- [[RTK Query]] - - ์—ฐ๊ฒฐ ์ด์œ : Redux Toolkit(RTK) ์ƒํƒœ๊ณ„์— ํฌํ•จ๋œ ๋ฐ์ดํ„ฐ ํŒจ์นญ ๋ฐ ์บ์‹ฑ ๋„๊ตฌ์ด๋‹ค [4]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Redux๊ฐ€ ์–ด๋–ป๊ฒŒ ๋‹จ์ˆœํ•œ ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ๋„˜์–ด ์„œ๋ฒ„ API ์‘๋‹ต(์บ์‹ฑ, ๋ฌดํšจํ™”, ์žฌ์š”์ฒญ)์ด๋ผ๋Š” ํ˜„๋Œ€์ ์ธ ์š”๊ตฌ์‚ฌํ•ญ์„ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์—†์ด ์†Œํ™”ํ•˜๋Š”์ง€ ํŒŒ์•… [4, 21]. - -- [[Time-Travel Debugging]] - - ์—ฐ๊ฒฐ ์ด์œ : Redux DevTools๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ณ ์œ ์˜ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์œผ๋กœ, ์–ธ์ œ ์–ด๋–ค ์•ก์…˜์ด ๋””์ŠคํŒจ์น˜๋˜์–ด ์ƒํƒœ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€ ๊ธฐ๋กํ•˜๊ณ  ๋˜๊ฐ๋Š” ๊ธฐ์ˆ ์ด๋‹ค [2, 3]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: 5๋…„ ์ด์ƒ ์ง€์†๋˜๋Š” ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์•„ํ‚คํ…์ฒ˜์˜ ๋””๋ฒ„๊น… ์—ญ๋Ÿ‰์ด ๊ฐœ๋ฐœ์ž์˜ ์ƒ์‚ฐ์„ฑ ๋ฐ ์žฅ์•  ๋Œ€์‘์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ [11, 12]. - -### Deeper Research Questions -- Redux์˜ ์ƒํƒœ ๊ตฌ๋… ๋ฐ ์„ ํƒ์ž(selector) ํŒจํ„ด์€ ๋‚ด๋ถ€์ ์œผ๋กœ Context API์™€ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅด๊ฒŒ ์„ค๊ณ„๋˜์–ด ๋ถ€๋ถ„ ์ƒํƒœ ๋ณ€๊ฒฝ ์‹œ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ์ฐจ๋‹จํ•˜๋Š”๊ฐ€? -- RTK Query๋ฅผ ํ†ตํ•œ Redux ๋น„๋™๊ธฐ ์ƒํƒœ ๊ด€๋ฆฌ๋Š” Zustand ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๋Š” ๋น„๋™๊ธฐ ์บ์‹ฑ ํŒจํ„ด๊ณผ ๋น„๊ตํ•ด ์–ด๋– ํ•œ ์•„ํ‚คํ…์ฒ˜์  ์•ˆ์ •์„ฑ์„ ๋‹ด๋ณดํ•˜๋Š”๊ฐ€? -- "God Reducer" ์•ˆํ‹ฐ ํŒจํ„ด์ด ๋Œ€๊ทœ๋ชจ React ์ฝ”๋“œ๋ฒ ์ด์Šค ๋‚ด๋น„๊ฒŒ์ด์…˜ ๋ฐ ์„ฑ๋Šฅ ์ตœ์ ํ™”์— ๋ฏธ์น˜๋Š” ์น˜๋ช…์ ์ธ ๋ถ€์ž‘์šฉ์€ ๋ฌด์—‡์ธ๊ฐ€? -- ํ”„๋ก ํŠธ์—”๋“œ ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ๊ณผ๊ฑฐ์˜ ๊ฑฐ๋Œ€ํ•œ ๋‹จ์ผ ์Šคํ† ์–ด ๋ฐฉ์‹์—์„œ '์„œ๋ฒ„ ์ƒํƒœ'์™€ 'ํด๋ผ์ด์–ธํŠธ ๋กœ์ปฌ ์ƒํƒœ'๋กœ ํŒŒํŽธํ™”(Fragmentation)๋˜๋Š” ์ตœ์‹  ํŠธ๋ Œ๋“œ ์†์—์„œ, Redux์˜ ์ ์ • ์‚ฌ์šฉ ๋ฒ”์œ„๋Š” ์–ด๋–ป๊ฒŒ ์žฌ์กฐ์ •๋˜์—ˆ๋Š”๊ฐ€? -- 10๋ช… ์ด์ƒ์˜ ์‹œ๋‹ˆ์–ด ๋ฐ ์ฃผ๋‹ˆ์–ด ๊ฐœ๋ฐœ์ž๊ฐ€ ํ˜ผ์žฌ๋œ ํŒ€์—์„œ Redux์˜ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ๋Š” ๊ฐœ๋ฐœ ์†๋„๋ฅผ ์ €ํ•˜์‹œํ‚ค๋Š” ๋ถ€์ฑ„์ธ๊ฐ€, ์•„๋‹ˆ๋ฉด ๋ฒ„๊ทธ๋ฅผ ์‚ฌ์ „์— ๋ฐฉ์ง€ํ•˜๋Š” ๊ตฌ์กฐ์  ๋ฐฉ์–ด๋ง‰์ธ๊ฐ€? - -### Practical Application Contexts -- **Implementation:** React ํ”„๋กœ์ ํŠธ์˜ `store/` ๋˜๋Š” `features/` ๋””๋ ‰ํ† ๋ฆฌ์— ๋„๋ฉ”์ธ๋ณ„ Redux slice๋ฅผ ๋ฐฐ์น˜ํ•˜์—ฌ ์ „์—ญ ์ƒํƒœ ๋ฐ ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ๋ฅผ ์„ ์–ธํ•˜๊ณ  ์•ก์…˜๊ณผ ๋ณ‘ํ•ฉํ•˜์—ฌ ๊ด€๋ฆฌํ•œ๋‹ค [5-7]. -- **System Design:** ์žฅ๊ธฐ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์š”๊ตฌ๋˜๋Š” ๋Œ€๊ทœ๋ชจ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์‹œ์Šคํ…œ(์ด์ปค๋จธ์Šค ๊ฒฐ์ œ ๋“ฑ ๋ฐ์ดํ„ฐ ํ๋ฆ„์ด ์ค‘์š”ํ•œ 500๊ฐœ ์ปดํฌ๋„ŒํŠธ ์ด์ƒ์˜ ์•ฑ)์—์„œ ํŒŒ์ƒ ์ƒํƒœ ์ฒ˜๋ฆฌ์™€ ํŒ€ ๊ฐœ๋ฐœ ํŒจํ„ด ๊ฐ•์ œํ™” ๋ชฉ์ ์œผ๋กœ ์ฑ„ํƒํ•œ๋‹ค [2, 12, 13, 22]. -- **Operation / Maintenance:** ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์ด๋‚˜ ๋””๋ฒ„๊น… ์‹œ Redux DevTools๋ฅผ ์—ฐ๋™ํ•˜์—ฌ ํŠน์ • UI ๋ฒ„๊ทธ๋‚˜ ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ๊ผฌ์ž„ ํ˜„์ƒ์„ ์‹œ๊ฐ์ ์ธ ์•ก์…˜ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ํ†ตํ•ด ๋‹จ์‹œ๊ฐ„์— ํ•ด๊ฒฐํ•œ๋‹ค [11, 12]. -- **Learning Path:** ํ”„๋ก ํŠธ์—”๋“œ ๊ต์œก ์‹œ, Context API์˜ ๊ทผ๋ณธ ์›๋ฆฌ์™€ ํ•œ๊ณ„๋ฅผ ๋จผ์ € ํ•™์Šตํ•˜๊ณ , Zustand์˜ ์ƒ์‚ฐ์„ฑ์„ ๊ฒฝํ—˜ํ•œ ๋’ค, ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ํ‘œ์ค€์ด์ž ๊ฐ€์žฅ ๋ณต์žก๋„๊ฐ€ ๋†’์€ Redux์˜ ํŒจํ„ด๊ณผ ๊ตฌ์กฐ์  ์ด์ ์„ ์ตœ์ข…์ ์œผ๋กœ ํ•™์Šตํ•˜๋Š” ๋‹จ๊ณ„์  ์ ‘๊ทผ์ด ์š”๊ตฌ๋œ๋‹ค [23]. -- **My Project Relevance:** ๊ธ€๋กœ๋ฒŒ ์ƒํƒœ๊ฐ€ ๋‹ค์ˆ˜์˜ ์ปดํฌ๋„ŒํŠธ์— ๋ณต์žกํ•˜๊ฒŒ ์–ฝํ˜€ ์žˆ๊ฑฐ๋‚˜, ํŒ€์› ๊ฐ„ ๋™์ผํ•œ ๋น„๋™๊ธฐ/์ƒํƒœ ๊ด€๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๊ฐ•์ œํ•˜์—ฌ ํŒŒํŽธํ™”๋ฅผ ๋ง‰์•„์•ผ ํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•  ๋•Œ ํ•ต์‹ฌ์ ์ธ ๊ธฐ์ˆ  ์Šคํƒ์œผ๋กœ ๊ฒ€ํ† ๋  ์ˆ˜ ์žˆ๋‹ค [1, 12]. - -### Adjacent Topics -- [[Server State Management (TanStack Query ๋“ฑ)]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ํด๋ผ์ด์–ธํŠธ ์ „์—ญ ์ƒํƒœ์™€ ๊ตฌ๋ณ„๋˜๋Š” "์„œ๋ฒ„ ๋ฐ์ดํ„ฐ(API ์บ์‹ฑ, ๋™๊ธฐํ™”, ๋กœ๋”ฉ/์—๋Ÿฌ ์‚ฌ์ดํด)"๋งŒ์„ ์ „๋ฌธ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ชจ๋˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ Redux์˜ ์—ญํ•  ๋น„๊ต ๋ฐ ์—ฐ๋™ ๋ฐฉ์•ˆ ํƒ์ƒ‰ [24, 25]. -- [[React Rendering Optimization]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์„ ํƒ๊ณผ ๋ณ„๊ฐœ๋กœ, React ์ปดํฌ๋„ŒํŠธ ์ƒ๋ช…์ฃผ๊ธฐ ๋ฐ ๋ฉ”๋ชจ์ด์ œ์ด์…˜(`useMemo`, `useCallback`, `React.memo`)์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํผํฌ๋จผ์Šค์— ๋ฏธ์น˜๋Š” ์›๋ฆฌ์™€ ํ”„๋กœํŒŒ์ผ๋ง ๋ฐฉ๋ฒ• ํƒ์ƒ‰ [26-28]. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Rollup.md b/00_Raw/Rollup.md deleted file mode 100644 index 5a38f732..00000000 --- a/00_Raw/Rollup.md +++ /dev/null @@ -1,57 +0,0 @@ -# [[Rollup]] - -## ๐Ÿ“Œ Brief Summary -Rollup์€ 2025๋…„ ๊ธฐ์ค€ ์ตœ์‹  ํ”„๋ก ํŠธ์—”๋“œ ๋นŒ๋“œ ๋„๊ตฌ์ธ Vite์˜ ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ๋ฅผ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๋‹ด๋‹นํ•˜๋Š” ๋ชจ๋“ˆ ๋ฒˆ๋“ค๋Ÿฌ์ž…๋‹ˆ๋‹ค [1]. ๊ฐœ๋ฐœ ๋‹จ๊ณ„์—์„œ๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ES ๋ชจ๋“ˆ(ESM)์„ ์‚ฌ์šฉํ•˜๋Š” Vite๊ฐ€ ์‹ค์ œ ๋ฐฐํฌ ์‹œ์ ์—๋Š” Rollup์œผ๋กœ ์ „ํ™˜ํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋ฅผ ๋ณ‘ํ•ฉํ•˜๊ณ  ์ตœ์ ํ™”ํ•ฉ๋‹ˆ๋‹ค [1, 2]. ์ž๋™ ์ฝ”๋“œ ๋ถ„ํ• (Code Splitting)๊ณผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ํŠธ๋ฆฌ ์‰์ดํ‚น(Tree-shaking) ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ๋งค์šฐ ์ตœ์ ํ™”๋œ ์ตœ์ข… ์—์…‹์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ ์—ญํ• ์ž…๋‹ˆ๋‹ค [1]. - -## ๐Ÿ“– Core ๋Œ€Content -* **Vite์™€์˜ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์•„ํ‚คํ…์ฒ˜:** Vite๋Š” ๋กœ์ปฌ ๊ฐœ๋ฐœ ์‹œ์—๋Š” ๋ฒˆ๋“ค๋ง ์—†์ด ๋„ค์ดํ‹ฐ๋ธŒ ESM์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ œ๊ณตํ•˜์—ฌ ๊ทน๋„๋กœ ๋น ๋ฅธ ์‹œ์ž‘๊ณผ HMR(Hot Module Replacement)์„ ์ง€์›ํ•˜์ง€๋งŒ, ํ”„๋กœ๋•์…˜ ๋ฐฐํฌ ์‹œ์—๋Š” Rollup์„ ์‚ฌ์šฉํ•˜์—ฌ ์ตœ์ ํ™”๋œ ๋ฒˆ๋“ค(Bundled build)์„ ์ƒ์„ฑํ•˜๋Š” ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๋ฐฉ์‹์„ ์ทจํ•ฉ๋‹ˆ๋‹ค [1]. -* **๋ฒˆ๋“ค ์ตœ์ ํ™” ๋ฐ ํŠธ๋ฆฌ ์‰์ดํ‚น (Tree-shaking):** Rollup์€ ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ ์‹œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์—์„œ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์ฝ”๋“œ๋ฅผ ์ž๋™์œผ๋กœ ์ œ๊ฑฐ(Tree-shaking)ํ•˜๊ณ  ํšจ์œจ์ ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๋ถ„ํ• ํ•˜์—ฌ ์ตœ์ ํ™”๋œ ์—์…‹์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [1]. -* **์ฒญํฌ ์ˆ˜๋™ ์ œ์–ด (`manualChunks`):** ๊ธฐ๋ณธ ์„ค์ • ์ƒํƒœ์—์„œ Rollup์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ์™€ `node_modules`์˜ ๋ชจ๋“  ์ข…์†์„ฑ์„ ๋‹จ์ผ ํŒŒ์ผ(`index.js`)๋กœ ๋ฌถ์–ด ๊ฑฐ๋Œ€ํ•œ ๋ฒˆ๋“ค์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3]. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” Rollup ์˜ต์…˜ ์ค‘ `manualChunks`๋ฅผ ์„ธ๋ฐ€ํ•˜๊ฒŒ ์„ค์ •ํ•˜์—ฌ, ์ž์ฃผ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ๋ฌด๊ฑฐ์šด ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(React ์ฝ”์–ด, Recharts, Lodash, ์•„์ด์ฝ˜ ๋“ฑ)๋ฅผ ๋ณ„๋„์˜ ์ฒญํฌ ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค [4-6]. -* **์บ์‹œ ํšจ์œจ์„ฑ ๊ฐœ์„ :** `manualChunks`๋ฅผ ํ†ตํ•ด ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ถ„๋ฆฌํ•˜๋ฉด, ํ•ด๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ž์ฃผ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๋Ÿฌ ๋ฒˆ ๋ฐฐํฌํ•˜๋”๋ผ๋„ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ด๋ฅผ ์บ์‹œํ•˜์—ฌ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ดˆ๊ธฐ ๋กœ๋“œ ์„ฑ๋Šฅ์ด ํฌ๊ฒŒ ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค [5-7]. - -## โš–๏ธ Trade-offs & Caveats -* **์ดˆ๊ธฐ ์„ค์ • ๋ถ€์กฑ ์‹œ ๋Œ€์šฉ๋Ÿ‰ ๋ฒˆ๋“ค ๋ฐœ์ƒ:** ๊ธฐ๋ณธ ์„ค์ •์œผ๋กœ ๋‘˜ ๊ฒฝ์šฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ชจ๋“  ์ข…์†์„ฑ์ด ํ•˜๋‚˜์˜ ํŒŒ์ผ์— Eager Import ๋˜์–ด ๊ฒฐํ•ฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3]. ์ด๋Š” ๋ฏธ๋‹ˆํŒŒ์ด(Minification) ํ›„์—๋„ 500kB๋ฅผ ์ดˆ๊ณผํ•˜๋Š” ๋Œ€๊ทœ๋ชจ ์ฒญํฌ(Large Chunks)๋ฅผ ์ƒ์„ฑํ•˜์—ฌ, ๋‹ค์šด๋กœ๋“œ ์‹œ๊ฐ„์„ ์ง€์—ฐ์‹œํ‚ค๊ณ  ์ €์‚ฌ์–‘ ๊ธฐ๊ธฐ์—์„œ ํŒŒ์‹ฑ ๋ฐ ์ปดํŒŒ์ผ์— ๋ฌด๋ฆฌ๋ฅผ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3, 8, 9]. -* **์บ์‹œ ๋ฌดํšจํ™”(Cache Invalidation) ๋ฌธ์ œ:** ๋‹จ์ผ ๊ฑฐ๋Œ€ ๋ฒˆ๋“ค๋กœ ๋นŒ๋“œํ•  ๊ฒฝ์šฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ž‘์€ ์ฝ”๋“œ ํ•˜๋‚˜๋งŒ ์ˆ˜์ •ํ•˜๋”๋ผ๋„ ์ „์ฒด ๋ฒˆ๋“ค์ด ์ƒˆ๋กœ ํ•ด์‹œ(Hash)๋˜์–ด ์‚ฌ์šฉ์ž๋Š” ๋ชจ๋“  JavaScript ํŒŒ์ผ์„ ๋‹ค์‹œ ๋‹ค์šด๋กœ๋“œํ•ด์•ผ ํ•˜๋Š” ๋น„ํšจ์œจ์„ฑ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [9]. ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๋ ค๋ฉด `manualChunks` ์„ค์ •๊ณผ `React.lazy`๋ฅผ ๊ฒฐํ•ฉํ•œ ๋ผ์šฐํŠธ ๊ธฐ๋ฐ˜ ์ฝ”๋“œ ๋ถ„ํ•  ๋“ฑ ์ถ”๊ฐ€์ ์ธ ์ตœ์ ํ™” ์ž‘์—…์ด ๊ฐ•์ œ๋ฉ๋‹ˆ๋‹ค [3, 6]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -#### [์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] -- [[Vite]] - - ์—ฐ๊ฒฐ ์ด์œ : Rollup์€ Vite์˜ ์•„ํ‚คํ…์ฒ˜ ๋‚ด์—์„œ ํ”„๋กœ๋•์…˜ ๋ฐฐํฌ ์‹œ ์ตœ์ ํ™”๋œ ๋นŒ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋‚ด๋ถ€ ์—”์ง„์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค [1]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ฐœ๋ฐœ ๋ชจ๋“œ(ESM)์™€ ๋ฐฐํฌ ๋ชจ๋“œ(Rollup)๋ฅผ ๋‹ค๋ฅด๊ฒŒ ๊ฐ€์ ธ๊ฐ€๋Š” Vite์˜ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๋ฒˆ๋“ค๋ง ์•„ํ‚คํ…์ฒ˜ ์ „๋žต์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1, 2]. -- [[Tree-shaking]] - - ์—ฐ๊ฒฐ ์ด์œ : Rollup์ด ๋ฐฐํฌ์šฉ ์ฝ”๋“œ๋ฅผ ์ตœ์ ํ™”ํ•  ๋•Œ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ๋ฅผ ๋œ์–ด๋‚ด๋Š” ํ•ต์‹ฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค [1]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ES ๋ชจ๋“ˆ ๊ธฐ๋ฐ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ์ด ์™œ ์ตœ์ข… ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ ์ตœ์ ํ™”์— ํ•„์ˆ˜์ ์ธ์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [10]. - -#### [๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ] -- [[manualChunks]] - - ์—ฐ๊ฒฐ ์ด์œ : Rollup์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฑฐ๋Œ€ํ•œ ๋ฉ”์ธ ๋ฒˆ๋“ค์„ ์„ธ๋ถ„ํ™”๋œ ๋ฒค๋” ์ฒญํฌ(Vendor chunk)๋กœ ์ชผ๊ฐค ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ํ•ต์‹ฌ ์„ค์ •์ž…๋‹ˆ๋‹ค [4-6]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ธŒ๋ผ์šฐ์ € ์บ์‹ฑ์„ ๊ทน๋Œ€ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์ฝ”๋“œ๋ฅผ ์„ฑ๊ฒฉ(๋ณ€๊ฒฝ ๋นˆ๋„)์— ๋”ฐ๋ผ ๋ถ„๋ฆฌํ•˜๋Š” ์ตœ์ ํ™” ์ „๋žต์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [6, 7]. -- [[Code Splitting]] - - ์—ฐ๊ฒฐ ์ด์œ : Rollup์˜ ๊ธฐ๋Šฅ๊ณผ React์˜ ์ง€์—ฐ ๋กœ๋”ฉ(`React.lazy`)์„ ๊ฒฐํ•ฉํ•˜์—ฌ ๊ตฌํ˜„๋˜๋Š” ์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค [3, 11]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ดˆ๊ธฐ ํŽ˜์ด๋กœ๋“œ(Payload)๋ฅผ ์ค„์ด๊ณ  Core Web Vitals๋ฅผ ๊ฐœ์„ ํ•˜๋Š” ๋Ÿฐํƒ€์ž„ ์ตœ์ ํ™” ๋ฐฉ๋ฒ•์„ ํ•™์Šตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [9, 12]. - -### Deeper Research Questions -- Vite๋Š” ์™œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋Š” Rollup์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋„ค์ดํ‹ฐ๋ธŒ ESM์„ ์‚ฌ์šฉํ•˜๋ฉฐ, ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ์—์„œ๋งŒ Rollup์„ ๋„์ž…ํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜๋ฅผ ์„ ํƒํ–ˆ๋Š”๊ฐ€? -- Rollup์˜ Tree-shaking ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ๋นŒ๋“œ ์‹œ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๋ฐ๋“œ ์ฝ”๋“œ(Dead code)๋ฅผ ์‹๋ณ„ํ•˜๊ณ  ์ตœ์ข… ๋ฒˆ๋“ค์—์„œ ์ œ์™ธํ•˜๋Š”๊ฐ€? -- `manualChunks`๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฒค๋”(Vendor) ํŒŒ์ผ์„ ๋ถ„ํ• ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ชจ๋“ˆ ๊ฐ„ ์ค‘๋ณต ํฌํ•จ ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ์„ค์ • ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? -- Rollup์ด ์ƒ์„ฑํ•œ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ๋ถ„์„ํ•˜๊ธฐ ์œ„ํ•ด `rollup-plugin-visualizer`๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋ฐ์ดํ„ฐ๋Š” ์‹ค์ œ ์„ฑ๋Šฅ ๊ฐœ์„ ์— ์–ด๋–ป๊ฒŒ ํ™œ์šฉ๋˜๋Š”๊ฐ€? -- Rollup์˜ ๋นŒ๋“œ ์ตœ์ ํ™”๊ฐ€ FCP, LCP, INP ๋“ฑ Core Web Vitals ์ง€ํ‘œ ํ–ฅ์ƒ์— ๋ฏธ์น˜๋Š” ๊ตฌ์ฒด์ ์ธ ์ธ๊ณผ๊ด€๊ณ„๋Š” ๋ฌด์—‡์ธ๊ฐ€? - -### Practical Application Contexts -- **Implementation:** `vite.config.js` ๋‚ด๋ถ€์— `build.rollupOptions.output.manualChunks`๋ฅผ ๊ตฌ์„ฑํ•˜์—ฌ `react`, `react-dom` ๋“ฑ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ณ„๋„์˜ ํŒŒ์ผ๋กœ ๊ฐ•์ œ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค [4, 6]. -- **System Design:** ํ”„๋ก ํŠธ์—”๋“œ ํ”„๋กœ๋•์…˜ ์‹œ์Šคํ…œ ์„ค๊ณ„ ์‹œ, ์ž์ฃผ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋ถ„๋ฆฌํ•˜์—ฌ CDN ์บ์‹œ ํžˆํŠธ์œจ์„ ๋†’์ด๋„๋ก ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค [5, 6]. -- **Operation / Maintenance:** CI/CD ํŒŒ์ดํ”„๋ผ์ธ์—์„œ "500 kB ์ด์ƒ์˜ ์ฒญํฌ" ๊ฒฝ๊ณ ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ, `rollup-plugin-visualizer`๋ฅผ ํ†ตํ•ด ๋ฒˆ๋“ค ์ƒํƒœ๋ฅผ ์ ๊ฒ€ํ•˜๊ณ  ๋ถ„ํ•  ์„ค์ •์„ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค [8, 13, 14]. -- **Learning Path:** React ์ตœ์ ํ™” ํ•™์Šต ์‹œ, ๋‹จ์ˆœํžˆ `React.lazy()`๋งŒ ๋ฐฐ์šฐ๋Š” ๊ฒƒ์„ ๋„˜์–ด ๋ฒˆ๋“ค๋Ÿฌ(Rollup) ๋ ˆ๋ฒจ์—์„œ์˜ ์ฝ”๋“œ ์ฒญํ‚น(Chunking) ์›๋ฆฌ๋ฅผ ํ•จ๊ป˜ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค [3, 6]. -- **My Project Relevance:** Vite ๊ธฐ๋ฐ˜ React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ Vercel์ด๋‚˜ AWS ์„œ๋ฒ„์— ๋ฐฐํฌํ•˜๊ธฐ ์ „์— ๋นŒ๋“œ ์†๋„ ๋ฐ ์ดˆ๊ธฐ ๋‹ค์šด๋กœ๋“œ ์†๋„๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•œ ํ•„์ˆ˜ ์ ๊ฒ€ ๋‹จ๊ณ„๋กœ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค [2, 11]. - -### Adjacent Topics -- [[ES Modules (ESM)]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: Rollup์˜ ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ ์ด์ „, Vite๊ฐ€ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ์ฝ”๋“œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ฆ‰๊ฐ์ ์œผ๋กœ ๋ธŒ๋ผ์šฐ์ €์— ๋ฐ˜์˜ํ•˜๋Š” ์›๋ฆฌ ํŒŒ์•… [1, 15]. -- [[Core Web Vitals]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: Rollup์˜ ๋ฒˆ๋“ค ๋ถ„ํ•  ๋ฐ ๊ฒฝ๋Ÿ‰ํ™” ์ž‘์—…์ด LCP(Largest Contentful Paint)๋‚˜ INP(Interaction to Next Paint)์™€ ๊ฐ™์€ ๋ธŒ๋ผ์šฐ์ € ์„ฑ๋Šฅ ์ธก์ • ์ง€ํ‘œ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ฐœ์„ ํ•˜๋Š”์ง€ ์กฐ์‚ฌ [9, 14]. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Rules of React.md b/00_Raw/Rules of React.md deleted file mode 100644 index e9577971..00000000 --- a/00_Raw/Rules of React.md +++ /dev/null @@ -1,64 +0,0 @@ -# [[Rules of React]] - -## ๐Ÿ“Œ Brief Summary -'Rules of React'๋Š” ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง ์‚ฌ์ดํด์—์„œ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ๋™์ž‘์„ ํ•˜๋„๋ก ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ์ค€์ˆ˜ํ•ด์•ผ ํ•˜๋Š” ์—„๊ฒฉํ•œ ๊ฐ€์ด๋“œ๋ผ์ธ์ž…๋‹ˆ๋‹ค [1]. ์ด ๊ทœ์น™์˜ ํ•ต์‹ฌ์€ ๋ Œ๋”๋ง ์ค‘ ๋ถˆ๋ณ€์„ฑ(immutability)์„ ์œ ์ง€ํ•˜๊ณ  ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ(side effects)๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค [2]. ๋˜ํ•œ ํ›…(Hooks)์„ ์กฐ๊ฑด๋ฌธ ์—†์ด ์ปดํฌ๋„ŒํŠธ ์ตœ์ƒ๋‹จ์—์„œ๋งŒ ํ˜ธ์ถœํ•ด์•ผ ํ•œ๋‹ค๋Š” 'Rules of Hooks'๋ฅผ ํฌ๊ด„ํ•˜๋ฉฐ [3], ์ตœ๊ทผ์˜ React Compiler๊ฐ€ ๋นŒ๋“œ ํƒ€์ž„์— ์ฝ”๋“œ๋ฅผ ์ž๋™์œผ๋กœ ์ตœ์ ํ™”(๋ฉ”๋ชจ์ด์ œ์ด์…˜)ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ด ๊ทœ์น™์˜ ์—„๊ฒฉํ•œ ์ค€์ˆ˜๊ฐ€ ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค [1]. - -## ๐Ÿ“– Core Content -* **๋ Œ๋”๋ง์˜ ์˜ˆ์ธก ๊ฐ€๋Šฅ์„ฑ ๋ณด์žฅ**: ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ๋Š” ๋ชจ๋“  ๋ Œ๋”๋ง์—์„œ ์ผ๊ด€๋˜๊ณ  ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ๋™์ž‘์„ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [1]. ์ด๋ฅผ ์œ„ํ•ด ์ปดํฌ๋„ŒํŠธ์˜ ๋ Œ๋”๋ง ๊ณผ์ •์€ ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ ์—†์ด ์ˆœ์ˆ˜(pure)ํ•ด์•ผ ํ•˜๋ฉฐ, ์ƒํƒœ์™€ ๋ฐ์ดํ„ฐ์˜ ๋ถˆ๋ณ€์„ฑ(immutability)์„ ์ฒ ์ €ํžˆ ์ง€์ผœ์•ผ ํ•ฉ๋‹ˆ๋‹ค [2]. -* **Rules of Hooks (ํ›…์˜ ๊ทœ์น™)**: ๋ฆฌ์•กํŠธ์˜ ์ƒํƒœ์™€ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๋‹ค๋ฃจ๋Š” ํ›… ์‚ฌ์šฉ ์‹œ ๋ฐ˜๋“œ์‹œ ์ง€์ผœ์•ผ ํ•˜๋Š” ํ•ต์‹ฌ ์„ธ๋ถ€ ๊ทœ์น™์ž…๋‹ˆ๋‹ค [3]. - * **์ตœ์ƒ๋‹จ ํ˜ธ์ถœ**: ํ›…์€ ํ•ญ์ƒ ๋ฆฌ์•กํŠธ ํ•จ์ˆ˜์˜ ์ตœ์ƒ๋‹จ(top level)์—์„œ๋งŒ ํ˜ธ์ถœ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [3]. - * **์กฐ๊ฑด๋ถ€ ํ˜ธ์ถœ ๊ธˆ์ง€**: ์กฐ๊ฑด๋ฌธ, ๋ฃจํ”„(loops), ์ค‘์ฒฉ๋œ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ๋ฌด์กฐ๊ฑด์ ์œผ๋กœ ํ›…์ด ํ˜ธ์ถœ๋˜์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค [3]. - * **์˜ฌ๋ฐ”๋ฅธ ํ˜ธ์ถœ ์œ„์น˜**: ์ผ๋ฐ˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ•จ์ˆ˜ ๋‚ด์—์„œ๋Š” ํ›…์„ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†์œผ๋ฉฐ, ๋ฐ˜๋“œ์‹œ ๋ฆฌ์•กํŠธ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋‚˜ ์ปค์Šคํ…€ ํ›…(Custom Hooks) ๋‚ด๋ถ€์—์„œ๋งŒ ํ˜ธ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [3]. - * **์ˆœ์„œ ์ผ๊ด€์„ฑ**: ๋ชจ๋“  ๋ Œ๋”๋ง์—์„œ ํ›…์˜ ์ด๋ฆ„๊ณผ ํ˜ธ์ถœ ์ˆœ์„œ๊ฐ€ ๋™์ผํ•˜๊ฒŒ ์œ ์ง€๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [3]. -* **์ •์  ๋ถ„์„ ๋ฐ ๋ฆฐํŒ…(Linting) ๋„๊ตฌ์˜ ํ™œ์šฉ**: 'Rules of React' ์œ„๋ฐ˜์„ ๋ฐฉ์ง€ํ•˜๊ณ  ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๋ฅผ ๊ฐ•์ œํ•˜๊ธฐ ์œ„ํ•ด ์ •์  ๋ถ„์„ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [1]. ํŠนํžˆ ESLint์˜ `eslint-plugin-react-hooks` ํ”Œ๋Ÿฌ๊ทธ์ธ(`recommended` ๋˜๋Š” `recommended-latest` ํ”„๋ฆฌ์…‹)์„ ์„ค์ •ํ•˜์—ฌ ๋นŒ๋“œ ์ „์— ์˜ค๋ฅ˜๋ฅผ ์žก์•„๋‚ด๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค [1]. -* **React Compiler์™€์˜ ์—ฐ๊ด€์„ฑ**: 2025๋…„ ๊ธฐ์ค€ ์•ˆ์ •ํ™”๋œ React Compiler๋Š” ์ฝ”๋“œ๊ฐ€ 'Rules of React'๋ฅผ ๋”ฐ๋ฅธ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค [1]. ์ •์  ๋ถ„์„์„ ํ†ตํ•ด ๊ทœ์น™์„ ์ค€์ˆ˜ํ•˜๋Š” ์ฝ”๋“œ ์š”์†Œ(JSX, ํ›… ๋“ฑ)์— ์ž๋™์œผ๋กœ ์„ธ๋ฐ€ํ•œ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๋กœ์ง์„ ์ฃผ์ž…ํ•ฉ๋‹ˆ๋‹ค [1, 4]. ๋งŒ์•ฝ ๊ทœ์น™์„ ์œ„๋ฐ˜ํ•œ ์ฝ”๋“œ๊ฐ€ ๋ฐœ๊ฒฌ๋˜๋ฉด, ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ฝ”๋“œ๋ฅผ ๋ง๊ฐ€๋œจ๋ฆฌ์ง€ ์•Š๊ธฐ ์œ„ํ•ด ํ•ด๋‹น ๋ถ€๋ถ„์˜ ์ตœ์ ํ™”(auto-memoization)๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค [1, 5]. - -## โš–๏ธ Trade-offs & Caveats -'Rules of React'๋ฅผ ์‹œ์Šคํ…œ์ ์œผ๋กœ ๊ฐ•์ œํ•  ๋•Œ ์ง๋ฉดํ•˜๋Š” ๊ฐ€์žฅ ํฐ ์ œ์•ฝ์€ ๊ธฐ์ˆ  ๋ถ€์ฑ„๊ฐ€ ์Œ“์ธ ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฒ ์ด์Šค(Legacy Codebases)์—์„œ์˜ ๋„์ž… ๋น„์šฉ์ž…๋‹ˆ๋‹ค [6]. ๊ธฐ์กด์˜ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—๋Š” ์ปดํฌ๋„ŒํŠธ ๋ผ์ดํ”„์‚ฌ์ดํด์ด๋‚˜ ํ›… ์‚ฌ์šฉ ์‹œ 'Rules of React'๋ฅผ ์œ„๋ฐ˜ํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์—ฌ๋Ÿฌ ๊ณณ์— ํฉ์–ด์ ธ ์žˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค [6]. ์ƒˆ๋กœ์šด React Compiler๋ฅผ ๋„์ž…ํ•ด ์ž๋™ ์ตœ์ ํ™” ์ด์ ์„ ์–ป์œผ๋ ค๋ฉด, ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๊ธฐ ์ „์— ์ด๋Ÿฌํ•œ ๊ทœ์น™ ์œ„๋ฐ˜ ์‚ฌํ•ญ์„ ๋ชจ๋‘ ์ฐพ์•„๋‚ด์–ด ์ˆ˜์ •ํ•˜๋Š” ๋Œ€๊ทœ๋ชจ ๋ฆฌํŒฉํ† ๋ง์ด ์š”๊ตฌ๋ฉ๋‹ˆ๋‹ค [6]. -๋˜ํ•œ, ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(์˜ˆ: TanStack Query, Material UI ๋“ฑ)๊ฐ€ ๋ Œ๋”๋ง๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๊ฐ์ฒด ์ฐธ์กฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์„ค๊ณ„๋œ ๊ฒฝ์šฐ, ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๊ทœ์น™์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ ์บ์‹ฑ์„ ์‹œ๋„ํ•˜๋”๋ผ๋„ ์ด๋ฅผ ์šฐํšŒํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์—ฌ์ „ํžˆ ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ํ›…์„ ์กฐํ•ฉํ•ด ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ํ•œ๊ณ„๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค [6, 7]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -#### [์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] -- [[React Compiler]] - - ์—ฐ๊ฒฐ ์ด์œ : React Compiler๋Š” ์†Œ์Šค ์ฝ”๋“œ๊ฐ€ 'Rules of React'๋ฅผ ์ค€์ˆ˜ํ•œ๋‹ค๋Š” ๊ฐ€์ •ํ•˜์— ๋นŒ๋“œ ํƒ€์ž„ ์ž๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค [1]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ทœ์น™์„ ์ค€์ˆ˜ํ•  ๋•Œ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๊ตฌ์ฒด์ ์ธ ์„ฑ๋Šฅ ํ–ฅ์ƒ(INP ๊ฐœ์„  ๋“ฑ)๊ณผ ์ปดํŒŒ์ผ๋Ÿฌ์˜ ์„ธ๋ถ„ํ™”๋œ ์ตœ์ ํ™” ์ž‘๋™ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [4, 8]. -- [[Immutability & Side Effects]] - - ์—ฐ๊ฒฐ ์ด์œ : 'Rules of React'์˜ ๊ฐ€์žฅ ํ•ต์‹ฌ์ ์ธ ๊ทผ๋ณธ ์›์น™์ด ๋ฐ”๋กœ ๋ Œ๋”๋ง ์ค‘ ๋ถˆ๋ณ€์„ฑ ์œ ์ง€์™€ ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ ๋ฐฉ์ง€์ž…๋‹ˆ๋‹ค [2]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์™œ ๋ฆฌ์•กํŠธ๊ฐ€ ๋ Œ๋”๋ง์„ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๊ฒŒ ์œ ์ง€ํ•ด์•ผ ํ•˜๋ฉฐ, ๋ถ€์ˆ˜ ํšจ๊ณผ๊ฐ€ ๋ Œ๋”๋ง ์„ฑ๋Šฅ์— ์–ด๋–ค ์•…์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”์ง€ ์›๋ก ์ ์œผ๋กœ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - -#### [๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ] -- [[eslint-plugin-react-hooks]] - - ์—ฐ๊ฒฐ ์ด์œ : ๊ฐœ๋ฐœ์ž๊ฐ€ ์‹ค์ˆ˜๋กœ 'Rules of React'๋ฅผ ์œ„๋ฐ˜ํ•˜์ง€ ์•Š๋„๋ก ์ •์  ๋ถ„์„์„ ํ†ตํ•ด ๊ฒฝ๊ณ ํ•˜๊ณ  ๊ทœ์น™์„ ๊ฐ•์ œํ•˜๋Š” ํ•„์ˆ˜ ESLint ํ”Œ๋Ÿฌ๊ทธ์ธ์ž…๋‹ˆ๋‹ค [1]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ฆฐํŒ… ๋„๊ตฌ๊ฐ€ ์ปดํŒŒ์ผ ํƒ€์ž„์— ์ฝ”๋“œ์˜ ์ปจํ…์ŠคํŠธ๋ฅผ ์–ด๋–ป๊ฒŒ ๋ถ„์„ํ•˜์—ฌ ํ›…์˜ ํ˜ธ์ถœ ์ˆœ์„œ์™€ ์กฐ๊ฑด๋ถ€ ์‹คํ–‰์„ ๋ง‰๋Š”์ง€ ์‹ค๋ฌด์  ๊ด€์ ์—์„œ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -- [[React Hooks]] - - ์—ฐ๊ฒฐ ์ด์œ : Rules of React์˜ ๊ฐ€์žฅ ๋Œ€ํ‘œ์ ์ธ ํ•˜์œ„ ๊ทœ์น™์ธ 'Rules of Hooks'์˜ ์ง์ ‘์ ์ธ ๋Œ€์ƒ์ž…๋‹ˆ๋‹ค [3]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ์ƒํƒœ(State)์™€ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ์™œ ์ตœ์ƒ๋‹จ ํ˜ธ์ถœ ๋ฐ ๋ฌด์กฐ๊ฑด์  ํ˜ธ์ถœ์ด ํ•„์š”ํ•œ์ง€ ์„ค๊ณ„์  ๊ด€์ ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [3]. - -### Deeper Research Questions - -- React Compiler๋Š” ์ •์  ๋ถ„์„ ๊ณผ์ •์—์„œ 'Rules of React' ์œ„๋ฐ˜ ์—ฌ๋ถ€๋ฅผ ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ํŒ๋ณ„ํ•˜๋ฉฐ, ์œ„๋ฐ˜ ์‹œ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ์–ด๋–ค Fallback ์ „๋žต์„ ์ทจํ•˜๋Š”๊ฐ€? -- ๋ ˆ๊ฑฐ์‹œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํฉ์–ด์ ธ ์žˆ๋Š” 'Rules of React' ์œ„๋ฐ˜ ์ฝ”๋“œ๋ฅผ React Compiler ์นœํ™”์ ์œผ๋กœ ๋ฆฌํŒฉํ† ๋งํ•˜๊ธฐ ์œ„ํ•œ ์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜(Incremental Migration) ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? -- ํ›…(Hooks)์˜ ๋‚ด๋ถ€ ๊ตฌํ˜„์ฒด ๊ตฌ์กฐ์ƒ, ํ˜ธ์ถœ ์ˆœ์„œ๊ฐ€ ๋ณ€๊ฒฝ๋˜๊ฑฐ๋‚˜ ์กฐ๊ฑด๋ถ€๋กœ ํ˜ธ์ถœ๋  ๋•Œ ๋ฆฌ์•กํŠธ ์—”์ง„์—์„œ ์ •ํ™•ํžˆ ์–ด๋–ค ๋ฉ”๋ชจ๋ฆฌ ์ฐธ์กฐ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”๊ฐ€? -- `eslint-plugin-react-hooks` ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ์ •๊ทœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ•จ์ˆ˜์™€ ์ปค์Šคํ…€ ํ›…์„ ๊ตฌ๋ฌธ ๋ถ„์„ ํŠธ๋ฆฌ์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ ์–ด๋–ป๊ฒŒ ์ •ํ™•ํ•˜๊ฒŒ ์‹๋ณ„ํ•ด ๋‚ด๋Š”๊ฐ€? -- ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์œ ๋„ํ•˜๋Š” ๊ทœ์น™ ์œ„๋ฐ˜(์˜๋„์ ์ธ ๋ถˆ์•ˆ์ • ์ฐธ์กฐ ๋ฐ˜ํ™˜)๊ณผ React Compiler ๊ฐ„์˜ ์ถฉ๋Œ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์ตœ์ ์˜ ์šฐํšŒ(workaround) ํŒจํ„ด์€ ๋ฌด์—‡์ธ๊ฐ€? - -### Practical Application Contexts - -- **Implementation:** ๋ฆฌ์•กํŠธ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ, ๋ชจ๋“  `useState`, `useEffect` ๋“ฑ์˜ ํ›…์„ ์กฐ๊ฑด๋ฌธ์ด๋‚˜ ๋ฐ˜๋ณต๋ฌธ ๋‚ด๋ถ€๊ฐ€ ์•„๋‹Œ ์ปดํฌ๋„ŒํŠธ ์ตœ์ƒ๋‹จ ๊ณ„์ธต์— ์„ ์–ธํ•˜์—ฌ ์ƒํƒœ ๊ด€๋ฆฌ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค [3]. -- **System Design:** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ Œ๋” ํŠธ๋ฆฌ ์ „๋ฐ˜์—์„œ ์ˆœ์ˆ˜์„ฑ(purity)์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ์ดํ„ฐ ๊ฐ€๊ณต ๋ฐ ๋ถ€์ˆ˜ ํšจ๊ณผ ๋ฐœ์ƒ ์ง€์ ์„ ๋ Œ๋”๋ง ์‚ฌ์ดํด ๋ฐ–(์˜ˆ: ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋‚˜ ๋ฏธ๋“ค์›จ์–ด)์œผ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜๋ฅผ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค [2]. -- **Operation / Maintenance:** CI/CD ํŒŒ์ดํ”„๋ผ์ธ์— ESLint ์„ค์ •์„ ํ†ตํ•ฉํ•˜์—ฌ `eslint-plugin-react-hooks`๋ฅผ ํ†ตํ•ด 'Rules of React' ์œ„๋ฐ˜ ์ฝ”๋“œ๊ฐ€ ํ”„๋กœ๋•์…˜ ๋ธŒ๋žœ์น˜์— ๋ณ‘ํ•ฉ(merge)๋˜๋Š” ๊ฒƒ์„ ์ž๋™ํ™”๋œ ๋ฐฉ์‹์œผ๋กœ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค [1]. -- **Learning Path:** ๋ฆฌ์•กํŠธ ์ดˆ์‹ฌ์ž๊ฐ€ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ•™์Šตํ•  ๋•Œ, ํ›…์˜ ์‚ฌ์šฉ๋ฒ•๋ณด๋‹ค ๋จผ์ € ๋ Œ๋”๋ง ์›๋ฆฌ์™€ 'Rules of Hooks'๋ฅผ ํ•™์Šตํ•˜์—ฌ ์ถ”ํ›„ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋‚œํ•ดํ•œ ๋ฒ„๊ทธ๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค [3]. -- **My Project Relevance:** React Compiler๋ฅผ ์ ์šฉํ•˜์—ฌ ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๊ธฐ ์ „, ๊ธฐ์กด ์ฝ”๋“œ๋ฒ ์ด์Šค ์ „๋ฐ˜์— ๊ฑธ์นœ 'Rules of React' ์œ„๋ฐ˜ ์‚ฌ๋ก€๋“ค์„ ๋ถ„์„ํ•˜๊ณ  ์ด๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๋ฆฌํŒฉํ† ๋งํ•˜๋Š” ๊ธฐ๋ฐ˜ ์ž‘์—…์— ์ง๊ฒฐ๋ฉ๋‹ˆ๋‹ค [6]. - -### Adjacent Topics - -- [[Automatic Memoization]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: 'Rules of React'๋ฅผ ์ค€์ˆ˜ํ•จ์œผ๋กœ์จ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” React Compiler์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์œผ๋กœ, ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜(`useMemo`, `useCallback`)๊ณผ์˜ ์„ฑ๋Šฅ ์ฐจ์ด ๋ฐ ์ถ”์ƒํ™” ์›๋ฆฌ๋ฅผ ์‹ฌ์ธต์ ์œผ๋กœ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค [4, 8]. -- [[Technical Debt]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ์—์„œ ๊ทœ์น™์„ ์œ„๋ฐ˜ํ•œ ๊ตฌ์กฐ์  ๋ถ€์ฑ„๊ฐ€ ์ƒˆ๋กœ์šด ์ตœ์ ํ™” ๋„๊ตฌ(React Compiler ๋“ฑ)์˜ ๋„์ž…์„ ์–ด๋–ป๊ฒŒ ๊ฐ€๋กœ๋ง‰๊ณ  ์œ ์ง€๋ณด์ˆ˜ ๋น„์šฉ์„ ์ฆ๊ฐ€์‹œํ‚ค๋Š”์ง€ ํƒ๊ตฌํ•ฉ๋‹ˆ๋‹ค [6]. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Scalable Frontend Systems.md b/00_Raw/Scalable Frontend Systems.md deleted file mode 100644 index 57f7da94..00000000 --- a/00_Raw/Scalable Frontend Systems.md +++ /dev/null @@ -1,65 +0,0 @@ -# [[Scalable Frontend Systems]] - -## ๐Ÿ“Œ Brief Summary -๋Œ€๊ทœ๋ชจ ํ”„๋ก ํŠธ์—”๋“œ ์‹œ์Šคํ…œ(Scalable Frontend Systems)์€ ๋†’์€ ์œ ์ง€๋ณด์ˆ˜์„ฑ, ๊ณ ์„ฑ๋Šฅ, ํ™•์žฅ์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ์กด์˜ ๋‹จ์ˆœํ•œ ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰์„ ๋„˜์–ด ์ •๊ตํ•˜๊ฒŒ ๋ถ„์‚ฐ๋œ ์†Œํ”„ํŠธ์›จ์–ด ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋„์ž…ํ•œ ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค [1]. ๊ธฐ๋Šฅ๋ณ„ ๋˜๋Š” ๋„๋ฉ”์ธ ์ค‘์‹ฌ์˜ ๋ชจ๋“ˆํ˜• ํด๋” ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, SOLID์™€ ๊ฐ™์€ ํด๋ฆฐ ์ฝ”๋“œ ์›์น™์„ ์ค€์ˆ˜ํ•˜๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒํƒœ์™€ ์„œ๋ฒ„ ์ƒํƒœ๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค [2-4]. ๋”๋ถˆ์–ด ์ž๋™ํ™”๋œ ๋นŒ๋“œ ์ตœ์ ํ™”, ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ๋ Œ๋”๋ง ์ตœ์ ํ™”, ์ •๊ตํ•œ ์—๋Ÿฌ ์ฒ˜๋ฆฌ ๋ฐ ํ˜‘์—… ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์•ˆ์ •์ ์œผ๋กœ ์„ฑ์žฅํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•ฉ๋‹ˆ๋‹ค [1, 5]. - -## ๐Ÿ“– Core Content - -* **์•„ํ‚คํ…์ฒ˜ ํŒจ๋Ÿฌ๋‹ค์ž„๊ณผ ํด๋” ๊ตฌ์กฐ:** ํ™•์žฅ์„ฑ์„ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํŒŒ์ผ์„ ํŒŒ์ผ์˜ ์œ ํ˜•(components, hooks ๋“ฑ)๋ณ„๋กœ ๋ชจ์•„๋‘๋Š” ๊ตฌ์กฐ์—์„œ ๊ธฐ๋Šฅ(Feature)์ด๋‚˜ ๋„๋ฉ”์ธ ์ค‘์‹ฌ์œผ๋กœ ๊ตฌ์กฐ๋ฅผ ๊ฐœํŽธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [2, 6]. ํŠนํžˆ Feature-Sliced Design (FSD)์€ ์ฝ”๋“œ ๊ณ„์ธต์„ Scope์™€ ์ฑ…์ž„์— ๋”ฐ๋ผ ๋ถ„ํ• (shared, entities, features, widgets, pages, app)ํ•˜๊ณ , ํ•˜์œ„ ๊ณ„์ธต์ด ์ƒ์œ„ ๊ณ„์ธต์„ ์ฐธ์กฐํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ํ•˜๋Š” ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ๊ณผ ์บก์Аํ™”๋œ Public API ๊ทœ์น™์„ ๊ฐ•์ œํ•˜์—ฌ ๊ฒฐํ•ฉ๋„(Coupling)๋ฅผ ๊ทน์ ์œผ๋กœ ๋‚ฎ์ถฅ๋‹ˆ๋‹ค [7-10]. -* **์†Œํ”„ํŠธ์›จ์–ด ์—”์ง€๋‹ˆ์–ด๋ง ์›์น™ ์ ์šฉ:** ํ™•์žฅ ๊ฐ€๋Šฅํ•œ React ์‹œ์Šคํ…œ์€ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ•˜๋‚˜์˜ ์—ญํ• ๋งŒ ํ•˜๋„๋ก ๋ถ„๋ฆฌํ•˜๋Š” ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)์„ ๋น„๋กฏํ•˜์—ฌ ๊ฐœ๋ฐฉ/ํ์‡„ ์›์น™(OCP), DRY, KISS, YAGNI ๋“ฑ์˜ SOLID ๋ฐ ํด๋ฆฐ ์ฝ”๋“œ ์›์น™์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค [3, 11]. ์ด๋กœ ์ธํ•ด ์ฝ”๋“œ์˜ ์˜ˆ์ธก ๊ฐ€๋Šฅ์„ฑ์ด ํ–ฅ์ƒ๋˜๊ณ  ๋ถˆํ•„์š”ํ•œ ์กฐ๊ธฐ ์ตœ์ ํ™”๋‚˜ ๋ณต์žก์„ฑ์ด ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค [12]. -* **์ƒํƒœ ๊ด€๋ฆฌ์˜ ํŒŒํŽธํ™” (State Management):** ํ•˜๋‚˜์˜ ๊ฑฐ๋Œ€ํ•œ Redux ์Šคํ† ์–ด์— ์˜์กดํ•˜๊ธฐ๋ณด๋‹ค, ๋ฐ์ดํ„ฐ์˜ ์„ฑ๊ฒฉ์— ๋งž๋Š” ๋„๊ตฌ๋ฅผ ์„ ํƒํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ง„ํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค [13]. ๋ถˆํ•„์š”ํ•œ ์ „์—ญ ๋ Œ๋”๋ง์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด Context API ๋Œ€์‹  ์„ ํƒ์ž(Selector) ํŒจํ„ด์„ ์ง€์›ํ•˜๋Š” Zustand ๋“ฑ์„ ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ์— ์‚ฌ์šฉํ•˜๋ฉฐ, API์—์„œ ๊ฐ€์ ธ์˜ค๋Š” ์„œ๋ฒ„ ์ƒํƒœ๋Š” ์บ์‹ฑ๊ณผ ๋™๊ธฐํ™”๋ฅผ ์œ„ํ•ด TanStack Query(React Query)๋กœ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค [4, 14]. -* **์„ฑ๋Šฅ ์—”์ง€๋‹ˆ์–ด๋ง ๋ฐ ๋ Œ๋”๋ง ์ตœ์ ํ™”:** ์ดˆ๊ธฐ์˜ ๊ฑฐ๋Œ€ํ•œ JavaScript ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด `React.lazy`์™€ Suspense๋ฅผ ํ™œ์šฉํ•œ ๋ผ์šฐํŠธ ๋ฐ ์ปดํฌ๋„ŒํŠธ ์ˆ˜์ค€์˜ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…(Code Splitting)์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค [15-17]. ์„ฑ๋Šฅ ๋ณ‘๋ชฉ์„ ์ผ์œผํ‚ค๋Š” ๋ฌด์˜๋ฏธํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด `React.memo`, `useCallback`, `useMemo`๋ฅผ ์ ์žฌ์ ์†Œ์— ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, React Compiler์™€ ๊ฐ™์€ ๋นŒ๋“œ ํƒ€์ž„ ๋„๊ตฌ๋ฅผ ๋„์ž…ํ•ด ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์ž๋™ํ™”ํ•ฉ๋‹ˆ๋‹ค [18-21]. ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐฉ๋Œ€ํ•œ ๋ชฉ๋ก์˜ ๊ฒฝ์šฐ ๊ฐ€์ƒํ™”(Virtualization/Windowing)๋ฅผ ๋„์ž…ํ•˜์—ฌ DOM ๋ถ€ํ•˜๋ฅผ ์ค„์ž…๋‹ˆ๋‹ค [22]. -* **๋ณต์›๋ ฅ(Resilience)๊ณผ ๋ชจ๋‹ˆํ„ฐ๋ง:** ์ „์ฒด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ Œ๋”๋ง ํฌ๋ž˜์‹œ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋ถˆ์•ˆ์ •ํ•œ UI ์˜์—ญ(์จ๋“œํŒŒํ‹ฐ ์œ„์ ฏ ๋“ฑ)์„ Error Boundary๋กœ ๊ฐ์‹ธ์„œ ๊ฒฉ๋ฆฌํ•ฉ๋‹ˆ๋‹ค [23, 24]. ๋ธŒ๋ผ์šฐ์ € ๋ฉ”๋ชจ๋ฆฌ ํƒญ์˜ Heap Snapshot์„ ํ†ตํ•ด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋””๋ฒ„๊น…ํ•˜๊ณ , ๋ฐฐํฌ ์ดํ›„์—๋Š” Sentry, LogRocket, Datadog๊ณผ ๊ฐ™์€ ํด๋ผ์šฐ๋“œ ๊ด€์ธก(Observability) ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ด ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์˜ ์‚ฌ์šฉ์ž ์—๋Ÿฌ ๋ฐ ์„ธ์…˜์„ ์‹ค์‹œ๊ฐ„ ๋ชจ๋‹ˆํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค [25-27]. -* **ํŒ€ ํ˜‘์—… ๋ฐ ๊ฑฐ๋ฒ„๋„Œ์Šค ๊ทœ์น™:** ์œˆ๋„์šฐ/๋ฆฌ๋ˆ…์Šค ํ™˜๊ฒฝ ์ฐจ์ด๋กœ ์ธํ•œ CI ๋นŒ๋“œ ์—๋Ÿฌ๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด ํŒŒ์ผ๋ช…์— kebab-case๋ฅผ ๊ฐ•์ œํ•˜๊ฑฐ๋‚˜(์ปดํฌ๋„ŒํŠธ ์ด๋ฆ„์€ PascalCase ์ ์šฉ), ESLint ๋ฐ Git Hooks๋ฅผ ํ†ตํ•ด ์•„ํ‚คํ…์ฒ˜ ๊ทœ์น™ ๋ฐ ์ฝ”๋“œ ํฌ๋งท์„ ์ž๋™ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค [28-30]. Git-flow, GitHub Flow ๋“ฑ ์†Œ๊ทœ๋ชจ/๋Œ€๊ทœ๋ชจ ํŒ€ ๊ทœ๋ชจ์— ๋งž๋Š” ๋ช…ํ™•ํ•œ ๋ธŒ๋žœ์น˜ ์ „๋žต๊ณผ ํ‹ฐ์ผ“ ID ๊ธฐ๋ฐ˜ ์ถ”์  ๊ด€๋ฆฌ๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค [31, 32]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -- [[Feature-Sliced Design (FSD)]] - - ์—ฐ๊ฒฐ ์ด์œ : ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ํ”„๋ก ํŠธ์—”๋“œ ์•„ํ‚คํ…์ฒ˜์—์„œ ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ฐœ์ƒํ•˜๋Š” '๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์–ฝํž˜' ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋„์ž…๋œ ํ•ต์‹ฌ์ ์ธ ์ปดํฌ๋„ŒํŠธ/๋””๋ ‰ํ† ๋ฆฌ ๋ถ„ํ•  ๋ฐฉ๋ฒ•๋ก ์ž…๋‹ˆ๋‹ค [33, 34]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ํ๋ฆ„, ๊ณ„์ธต๋ณ„(Layered) ๋ถ„ํ• , ์บก์Аํ™”๋ฅผ ํ†ตํ•œ Public API ์ธํ„ฐํŽ˜์ด์Šค ์„ค๊ณ„ ์›๋ฆฌ [7, 9]. - -- [[State Management Fragmentation (์ƒํƒœ ๊ด€๋ฆฌ ํŒŒํŽธํ™”)]] - - ์—ฐ๊ฒฐ ์ด์œ : ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋‹จ์ผ ์Šคํ† ์–ด๋‚˜ Context API๋งŒ์œผ๋กœ๋Š” ๋ฆฌ๋ Œ๋”๋ง ์„ฑ๋Šฅ ์ตœ์ ํ™”๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•ด์ง์— ๋”ฐ๋ผ, ์ „์—ญ ์ƒํƒœ(Zustand), ์„œ๋ฒ„ ์ƒํƒœ(React Query), ๋กœ์ปฌ ์ƒํƒœ๋กœ ์—ญํ• ์„ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ด€๋ฆฌํ•˜๋Š” ํŠธ๋ Œ๋“œ์ž…๋‹ˆ๋‹ค [4, 13, 35]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง ๋ฐฉ์ง€ ์›๋ฆฌ(Zustand์˜ ์„ ํƒ์ž ํŒจํ„ด)์™€ ์„œ๋ฒ„/ํด๋ผ์ด์–ธํŠธ ๋ฐ์ดํ„ฐ ๊ฐ„์˜ ์บ์‹ฑ ๋ฐ ๋™๊ธฐํ™” ์ „๋žต [4, 14]. - -- [[React Compiler]] - - ์—ฐ๊ฒฐ ์ด์œ : ๊ฐœ๋ฐœ์ž๊ฐ€ ์ˆ˜๋™์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋˜ `useMemo`, `useCallback`, `React.memo` ๋“ฑ์˜ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ๋นŒ๋“œ ํƒ€์ž„์— ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•ด ์ฃผ์–ด, ๊น”๋”ํ•œ ์ฝ”๋“œ๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ ์„ฑ๋Šฅ ํ™•์žฅ์„ ๊ฐ€๋Šฅ์ผ€ ํ•˜๋Š” ์ตœ์‹  ๋„๊ตฌ์ž…๋‹ˆ๋‹ค [19, 36]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: React์˜ ๋ Œ๋”๋ง ์ตœ์ ํ™” ํ•œ๊ณ„ ๋ฐ Rules of React ์ค€์ˆ˜ ์ค‘์š”์„ฑ, ์จ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€์˜ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ [37, 38]. - -- [[Error Boundaries]] - - ์—ฐ๊ฒฐ ์ด์œ : ์‹œ์Šคํ…œ์˜ ํฌ๊ธฐ๊ฐ€ ์ปค์งˆ ๋•Œ ๋‹จ์ผ ์ปดํฌ๋„ŒํŠธ์˜ ์˜ค๋ฅ˜๊ฐ€ ์ „์ฒด ์•ฑ์˜ 'ํ™”์ดํŠธ ์Šคํฌ๋ฆฐ' ํฌ๋ž˜์‹œ๋กœ ์ด์–ด์ง€์ง€ ์•Š๊ฒŒ UI์˜ ์ผ๋ถ€๋ถ„๋งŒ ๋Œ€์ฒด(Fallback)ํ•˜์—ฌ ์‹œ์Šคํ…œ ๋ณต์›๋ ฅ(Resilience)์„ ๋ณด์žฅํ•˜๋Š” ์žฅ์น˜์ž…๋‹ˆ๋‹ค [23, 24, 39]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ํ™œ์šฉํ•œ ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ ํฌ์ฐฉ ์›๋ฆฌ ๋ฐ ๋Œ€๊ทœ๋ชจ UI ๋ณดํ˜ธ ์ „๋žต [40, 41]. - -- [[Code Splitting & Lazy Loading (์ฝ”๋“œ ๋ถ„ํ• ๊ณผ ์ง€์—ฐ ๋กœ๋”ฉ)]] - - ์—ฐ๊ฒฐ ์ด์œ : ํ”„๋ก ํŠธ์—”๋“œ ์ฝ”๋“œ๊ฐ€ ๋น„๋Œ€ํ•ด์ง€๋ฉด์„œ ์ดˆ๊ธฐ ๋กœ๋”ฉ ์†๋„(TTI, LCP)๋ฅผ ์ตœ์ ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์ˆ˜์ ์œผ๋กœ ์š”๊ตฌ๋˜๋Š” ๊ธฐ์ˆ ๋กœ, Vite๋‚˜ React.lazy๋ฅผ ํ†ตํ•ด ํ•„์š”ํ•œ ์‹œ์ ์—๋งŒ ๋ชจ๋“ˆ์„ ๋‹ค์šด๋กœ๋“œํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค [15, 17, 42]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ชจ๋“ˆ ๋ฒˆ๋“ค๋Ÿฌ์˜ ์ฒญํฌ(Chunk) ๋ถ„๋ฆฌ ์›๋ฆฌ ๋ฐ ๋ธŒ๋ผ์šฐ์ € ์„ฑ๋Šฅ ์ตœ์ ํ™”(Core Web Vitals)์™€ ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ์˜ ์ƒ๊ด€๊ด€๊ณ„ [43, 44]. - -### Deeper Research Questions - -- Feature-Sliced Design (FSD) ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋„์ž…ํ•  ๋•Œ, ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ(Feature)์ด ๊ณต์œ ํ•ด์•ผ ํ•˜๋Š” ๊ต์ฐจ ๊ด€์‹ฌ์‚ฌ(Cross-cutting concerns)๋‚˜ ํ•˜์œ„ ๊ธฐ๋Šฅ ๊ฒฐํ•ฉ ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ณ„์ธต ๋ถ„๋ฆฌ์™€ ์บก์Аํ™”๋ฅผ ํ›ผ์†ํ•˜์ง€ ์•Š๊ณ  ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? [45, 46] -- React Context API๊ฐ€ ์•ผ๊ธฐํ•˜๋Š” ๋ถˆํ•„์š”ํ•œ ๋ Œ๋” ํŠธ๋ฆฌ ๋ฆฌ๋ Œ๋”๋ง ๋ฌธ์ œ๋ฅผ Zustand๋‚˜ Redux ๊ฐ™์€ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์„ ํƒ์ž(Selector) ํŒจํ„ด ๋ฐ ์™ธ๋ถ€ ์Šคํ† ์–ด ๊ตฌ๋… ๋ฐฉ์‹๊ณผ ๋น„๊ตํ–ˆ์„ ๋•Œ, ์„ฑ๋Šฅ๊ณผ ํ™•์žฅ์„ฑ ์ธก๋ฉด์—์„œ ๊ตฌ์ฒด์ ์ธ ์ฐจ์ด๋Š” ๋ฌด์—‡์ธ๊ฐ€? [14, 35, 47] -- Vite ๋นŒ๋“œ ํ™˜๊ฒฝ์—์„œ ๋ฒˆ๋“ค ํฌ๊ธฐ ๊ฒฝ๊ณ ("Large Chunks")๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด `manualChunks`์™€ `React.lazy`๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…์„ ๊ตฌํ˜„ํ•  ๋•Œ, ์ดˆ๊ธฐ ๋ Œ๋”๋ง ์„ฑ๋Šฅ ๊ฐœ์„ ๊ณผ ๋ธŒ๋ผ์šฐ์ € ์บ์‹ฑ ํšจ์œจ์€ ๊ฐ๊ฐ ์–ด๋–ป๊ฒŒ ์ž‘์šฉํ•˜๋Š”๊ฐ€? [42, 48, 49] -- Next.js์˜ React Server Components (RSC)๋ฅผ ์ฑ„ํƒํ•จ์œผ๋กœ์จ ์„œ๋ฒ„์—์„œ ๋ฏธ๋ฆฌ ๋ Œ๋”๋งํ•˜๊ณ  ํด๋ผ์ด์–ธํŠธ ์ธก JavaScript ํŽ˜์ด๋กœ๋“œ๋ฅผ ์ค„์ด๋Š” ์ ‘๊ทผ๋ฒ•์ด, ๊ฑฐ๋Œ€ํ•œ ํ”„๋ก ํŠธ์—”๋“œ ์•ฑ์˜ ํ™•์žฅ์„ฑ์— ์–ด๋–ค ์•„ํ‚คํ…์ฒ˜์  ํŒจ๋Ÿฌ๋‹ค์ž„ ์ „ํ™˜์„ ๊ฐ€์ ธ์˜ค๋Š”๊ฐ€? [50, 51] -- React Compiler์˜ ์ž๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๋กœ์ง์ด ์„œ๋“œํŒŒํ‹ฐ ํ›…(์˜ˆ: ๋ถˆ์•ˆ์ •ํ•œ ์ฐธ์กฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ›…)๊ณผ ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ๊ธฐ์ˆ  ๋ถ€์ฑ„ ํ™˜๊ฒฝ์—์„œ ์–ด๋–ค ์ตœ์ ํ™” ์‹คํŒจ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋ฉฐ, ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๋ฆฌํŒฉํ† ๋ง ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? [38, 52] - -### Practical Application Contexts - -- **Implementation:** ๊ฑฐ๋Œ€ํ•œ React ํ”„๋กœ์ ํŠธ๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•  ๋•Œ ํŒŒ์ผ์„ ํŒŒ์ผ ์†์„ฑ ๋‹จ์œ„๊ฐ€ ์•„๋‹Œ FSD์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ(Feature) ๋ฐ ๋„๋ฉ”์ธ ๊ตฌ์กฐ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•ฉ๋‹ˆ๋‹ค. ์ƒํƒœ๊ฐ€ ์ž์ฃผ ๋ณ€๊ฒฝ๋˜๋Š” ๊ธฐ๋Šฅ์—๋Š” Zustand ์Šคํ† ์–ด๋ฅผ ์ ์šฉํ•˜๊ณ , ์„œ๋ฒ„ API ์š”์ฒญ์—๋Š” TanStack Query๋ฅผ ๋„์ž…ํ•˜์—ฌ ๋กœ์ปฌ ์ƒํƒœ์™€ ์„œ๋ฒ„ ์ƒํƒœ๋ฅผ ์™„๋ฒฝํžˆ ๋ถ„๋ฆฌ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค [2, 10, 53]. -- **System Design:** ์ปดํฌ๋„ŒํŠธ ๊ฐ„์˜ ์ˆœํ™˜ ์ฐธ์กฐ๋‚˜ ๊ฐ•ํ•œ ๊ฒฐํ•ฉ(Coupling)์„ ๋ง‰๊ธฐ ์œ„ํ•ด ์บก์Аํ™”๋œ `index.ts` ํ˜•ํƒœ์˜ Public API ์„ค๊ณ„ ํŒจํ„ด์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ Œ๋”๋ง ๋ถ€ํ•˜๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด ๋ฐ์ดํ„ฐ ๋ฆฌ์ŠคํŠธ์—๋Š” ๊ฐ€์ƒํ™”(Virtualization) ์„ค๊ณ„๋ฅผ ๋„์ž…ํ•ฉ๋‹ˆ๋‹ค [11, 22]. -- **Operation / Maintenance:** ํ”„๋กœ๋•์…˜ ๋ฐฐํฌ ํ›„ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ํฌ๋ž˜์‹œ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด Error Boundary๋ฅผ ์œ„์ ฏ ๋ฐ ์ค‘์š” UI ์„น์…˜๋งˆ๋‹ค ๊ฐ์‹ธ๋ฉฐ, LogRocket ๋˜๋Š” Sentry๋ฅผ ๋„์ž…ํ•ด ์—๋Ÿฌ ์ถ”์  ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ๋ฆญ(Memory Leaks) ์ƒํ™ฉ์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋””๋ฒ„๊น…ํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜ํ•ฉ๋‹ˆ๋‹ค [23, 26, 27]. -- **Learning Path:** ์†Œ๊ทœ๋ชจ ์žฅ๋‚œ๊ฐ ํ”„๋กœ์ ํŠธ๋กœ React์˜ ๊ธฐ์ดˆ๋ฅผ ๋‹ค์ง„ ํ›„, Context API์˜ ํ•œ๊ณ„๋ฅผ ํŒŒ์•…ํ•˜๊ณ  Zustand ๋“ฑ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ๋ฐฐ์›๋‹ˆ๋‹ค. ์ดํ›„ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ, Typescript ์ „ํ™˜, ๊ทธ๋ฆฌ๊ณ  ํด๋ฆฐ ์ฝ”๋“œ ์›์น™(SOLID, DRY) ๊ธฐ๋ฐ˜์˜ ์•„ํ‚คํ…์ฒ˜๋ง(Feature-Sliced Design) ์ตœ์ ํ™”๋กœ ๋‚˜์•„๊ฐ€๋Š” ๋‹จ๊ณ„์  ํ•™์Šต์„ ๊ฑฐ์นฉ๋‹ˆ๋‹ค [54-57]. -- **My Project Relevance:** ์†Œ์Šค์— ๊ด€๋ จ ์ •๋ณด๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. - -### Adjacent Topics - -- [[Frontend Cloud Logging Tools (ํ”„๋ก ํŠธ์—”๋“œ ํด๋ผ์šฐ๋“œ ๋กœ๊น… ๋„๊ตฌ)]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์‹œ์Šคํ…œ์ด ํ”„๋กœ๋•์…˜ ๋‹จ๊ณ„์— ๋“ค์–ด๊ฐ”์„ ๋•Œ, Sentry๋‚˜ Datadog, SigNoz ๊ฐ™์€ ๋ชจ๋‹ˆํ„ฐ๋ง ํˆด์„ ํ™œ์šฉํ•ด ์‚ฌ์šฉ์ž ์„ธ์…˜๊ณผ ์—๋Ÿฌ ๋กœ๊ทธ๋ฅผ ์—ฐ๋™ํ•˜์—ฌ ๊ฐ€์‹œ์„ฑ(Observability)์„ ํ™•๋ณดํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [58-60]. -- [[Storybook Visual Regression Testing (Storybook ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ)]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋Œ€๊ทœ๋ชจ ํŒ€์—์„œ UI ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ, ๊ธฐ์กด ํ™”๋ฉด(baseline)์˜ ๋ ˆ์ด์•„์›ƒ์ด๋‚˜ ํ”ฝ์…€์ด ์˜๋„์น˜ ์•Š๊ฒŒ ๊นจ์ง€๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์ž๋™ํ™”๋œ ์‹œ๊ฐ์  ํšŒ๊ท€ ๊ฒ€์ฆ(Happo, Chromatic) ๋ฐ CI ํŒŒ์ดํ”„๋ผ์ธ ์—ฐ๋™ ๋ฐฉํ–ฅ์œผ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [61-63]. -- [[Git Branching Strategies & Workflows (Git ๋ธŒ๋žœ์น˜ ์ „๋žต ๋ฐ ์›Œํฌํ”Œ๋กœ์šฐ)]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ™•์žฅ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ฐธ์—ฌํ•˜๋Š” ๊ฐœ๋ฐœ์ž ์ˆ˜๊ฐ€ ๋งŽ์•„์งˆ ๋•Œ, Trunk-based ๊ฐœ๋ฐœ์ด๋‚˜ GitHub Flow ๋“ฑ์„ ๋„์ž…ํ•˜์—ฌ ์ถฉ๋Œ์„ ์ค„์ด๊ณ  ํ‹ฐ์ผ“ ๊ธฐ๋ฐ˜ ์ถ”์ ์„ฑ์„ ํ™•๋ณดํ•˜๋Š” ํ˜•์ƒ๊ด€๋ฆฌ ๋ฐฉํ–ฅ์œผ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [31, 64]. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Scalable React Apps.md b/00_Raw/Scalable React Apps.md deleted file mode 100644 index 701fafc8..00000000 --- a/00_Raw/Scalable React Apps.md +++ /dev/null @@ -1,82 +0,0 @@ -# [[Scalable React Apps]] - -## ๐Ÿ“Œ Brief ๋‹จ๊ธฐ Summary -Scalable React Apps(ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ๋ฆฌ์•กํŠธ ์•ฑ)๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ทœ๋ชจ๊ฐ€ ์ปค์ง€๊ณ  ํŒ€ ๋‹จ์œ„์˜ ํ˜‘์—…์ด ์ฆ๊ฐ€ํ•จ์— ๋”ฐ๋ผ ๋ฐœ์ƒํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜ ๋ถ•๊ดด, ์„ฑ๋Šฅ ์ €ํ•˜, ์œ ์ง€๋ณด์ˆ˜์„ฑ ํ•˜๋ฝ ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๊ฒฌ๊ณ ํ•˜๊ฒŒ ์„ค๊ณ„๋œ ์‹œ์Šคํ…œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค [1-3]. ์ด๋ฅผ ์œ„ํ•ด ์ฝ”๋“œ๋ฅผ ๋‹จ์ˆœํžˆ ํŒŒ์ผ ์œ ํ˜•๋ณ„๋กœ ๋ฌถ๋Š” ๋ฐฉ์‹์—์„œ ๋ฒ—์–ด๋‚˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ ๋ฐ ๊ธฐ๋Šฅ(Feature) ์ค‘์‹ฌ์œผ๋กœ ๊ตฌ์กฐํ™”ํ•˜๊ณ  ๋ช…ํ™•ํ•œ ์˜์กด์„ฑ ๊ทœ์น™์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค [4, 5]. ๋˜ํ•œ, ํšจ์œจ์ ์ธ ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ์˜ ๋„์ž…, ๋ Œ๋”๋ง ์ตœ์ ํ™” ๊ธฐ์ˆ , ๊ทธ๋ฆฌ๊ณ  SOLID์™€ ๊ฐ™์€ ํด๋ฆฐ ์ฝ”๋“œ ์›์น™์„ ํ†ตํ•ฉํ•˜์—ฌ ์žฅ๊ธฐ์ ์œผ๋กœ ์œ ์ง€ ๋ฐ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ํ”„๋ก ํŠธ์—”๋“œ ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค [6-9]. - -## ๐Ÿ“– Core Content - -* **์•„ํ‚คํ…์ฒ˜ ๋ฐ ํด๋” ๊ตฌ์กฐ (Architecture & Folder Structure)** - * ์•ฑ ๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ํŒŒ์ผ ์œ ํ˜•(components, hooks ๋“ฑ)์— ๋”ฐ๋ฅธ ํด๋” ๊ตฌ์กฐ๋Š” ์ฝ”๋“œ ํŒŒํŽธํ™”๋ฅผ ์ผ์œผ์ผœ ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค [10-12]. - * ํ™•์žฅ์„ฑ์„ ์œ„ํ•ด ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ UI๋ฅผ ๊ธฐ๋Šฅ(Feature)์ด๋‚˜ ๋„๋ฉ”์ธ ๋‹จ์œ„๋กœ ์บก์Аํ™”ํ•˜๋Š” ๊ตฌ์กฐ(Feature-Based Structure)๊ฐ€ ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค [5, 13]. - * ๋Œ€ํ‘œ์ ์œผ๋กœ **Feature-Sliced Design (FSD)** ๋ฐฉ๋ฒ•๋ก ์ด ์žˆ์œผ๋ฉฐ, ์ด๋Š” `app`, `pages`, `widgets`, `features`, `entities`, `shared`์˜ ๊ณ„์ธต ๋ชจ๋ธ์„ ์ œ๊ณตํ•˜๊ณ , ํ•˜์œ„ ๊ณ„์ธต์ด ์ƒ์œ„ ๊ณ„์ธต์„ ์ฐธ์กฐํ•˜์ง€ ๋ชปํ•˜๋„๋ก '๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ'์„ ๊ฐ•์ œํ•˜์—ฌ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถฅ๋‹ˆ๋‹ค [14, 15]. ๊ฐ ์Šฌ๋ผ์ด์Šค๋Š” `index.ts`๋ฅผ ํ†ตํ•œ ๋‹จ์ผ Public API๋งŒ์„ ๋…ธ์ถœํ•˜์—ฌ ๋‚ด๋ถ€ ๊ตฌํ˜„์„ ์บก์Аํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [7, 16]. -* **ํด๋ฆฐ ์ฝ”๋“œ ๋ฐ ์ฝ”๋”ฉ ํ‘œ์ค€ (Clean Code & Standards)** - * ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ์œ„ํ•ด **SOLID, DRY, KISS, YAGNI** ์›์น™์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค [7, 17]. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)์— ๋”ฐ๋ผ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ๋ฐ์ดํ„ฐ ํŽ˜์นญ(Data fetching)์„ ์ปค์Šคํ…€ ํ›…์œผ๋กœ ๋ถ„๋ฆฌํ•˜๊ณ  ์ปดํฌ๋„ŒํŠธ๋Š” UI ๋ Œ๋”๋ง์—๋งŒ ์ง‘์ค‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [18-20]. - * ํŒ€ ํ˜‘์—…์„ ์œ„ํ•ด ์ผ๊ด€๋œ ๋ช…๋ช… ๊ทœ์น™(Naming Convention)์„ ์ ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ปดํฌ๋„ŒํŠธ๋Š” `PascalCase`, ํด๋”์™€ ํŒŒ์ผ๋ช…์€ OS ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด `kebab-case`, ์ปค์Šคํ…€ ํ›…์ด๋‚˜ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜๋Š” `camelCase`๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค [21-25]. -* **์ƒํƒœ ๊ด€๋ฆฌ ์•„ํ‚คํ…์ฒ˜ (Advanced State Management)** - * ์ƒํƒœ ๊ด€๋ฆฌ๋Š” ํ•˜๋‚˜๋กœ ํ†ตํ•ฉํ•˜๊ธฐ๋ณด๋‹ค ๋ฐ์ดํ„ฐ ์„ฑ๊ฒฉ์— ๋”ฐ๋ผ ํŒŒํŽธํ™”(Fragmentation)ํ•˜์—ฌ ๊ด€๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [8]. - * **Context API:** ๋‹คํฌ ๋ชจ๋“œ, ์–ธ์–ด ์„ค์ • ๋“ฑ ๋ณ€๊ฒฝ์ด ๊ฑฐ์˜ ์—†๋Š” ์ •์  ๊ธ€๋กœ๋ฒŒ ์ƒํƒœ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค [26, 27]. ํ•˜์ง€๋งŒ, ๊ฐ’์ด ๋ณ€ํ•  ๋•Œ๋งˆ๋‹ค ์ด๋ฅผ ๊ตฌ๋…ํ•˜๋Š” ๋ชจ๋“  ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง๋˜๋ฏ€๋กœ, ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ณ€๊ฒฝ๋˜๋Š” ์ƒํƒœ์—๋Š” ๋ถ€์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค [28, 29]. - * **Zustand / Redux:** ์•Œ๋ฆผ, ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๋“ฑ ๋™์  ์ƒํƒœ ๊ด€๋ฆฌ์—๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ•„์š”ํ•œ ์ƒํƒœ ์กฐ๊ฐ(Slice)๋งŒ ์„ ํƒ(Select)ํ•ด ๋ฆฌ๋ Œ๋”๋ง์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” Zustand๊ฐ€ ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค [30-32]. 10๋ช… ์ด์ƒ์˜ ๋Œ€๊ทœ๋ชจ ํŒ€์ด๋‚˜ ๋ณต์žกํ•œ ๋น„๋™๊ธฐ ์ž‘์—…์ด ๋งŽ์€ ๊ฒฝ์šฐ ์—„๊ฒฉํ•œ ํŒจํ„ด๊ณผ ๊ตฌ์กฐ๋ฅผ ๊ฐ•์ œํ•˜๋Š” Redux๊ฐ€ ๋” ๋‚˜์€ ์„ ํƒ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [33-35]. - * **์„œ๋ฒ„ ์ƒํƒœ ๋ถ„๋ฆฌ:** API์—์„œ ๊ฐ€์ ธ์˜จ ์„œ๋ฒ„ ๋ฐ์ดํ„ฐ๋Š” ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ์™€ ๋ถ„๋ฆฌํ•˜์—ฌ TanStack Query (React Query) ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์บ์‹ฑ ๋ฐ ๋™๊ธฐํ™”๋ฅผ ์ „๋‹ดํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค [36, 37]. -* **์„ฑ๋Šฅ ์ตœ์ ํ™” (Performance Engineering)** - * ์ดˆ๊ธฐ ๋กœ๋”ฉ ์†๋„ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด Vite์™€ ๊ฐ™์€ ์ตœ์‹  ๋ฒˆ๋“ค๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , `manualChunks`๋ฅผ ํ†ตํ•ด ๋ฒค๋”(Vendor) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ถ„๋ฆฌํ•˜๊ฑฐ๋‚˜ `React.lazy()`์™€ `Suspense`๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ๋ผ์šฐํŠธ ๋ฐ ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„์˜ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [38-42]. - * ๋Œ€์šฉ๋Ÿ‰ ๋ฆฌ์ŠคํŠธ ๋ Œ๋”๋ง ์‹œ์—๋Š” ๊ณ ์œ ํ•˜๊ณ  ์•ˆ์ •์ ์ธ `key`๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , `react-window` ๋“ฑ์„ ํ™œ์šฉํ•œ ๊ฐ€์ƒํ™”(Virtualization) ๊ธฐ์ˆ ๋กœ DOM ๋…ธ๋“œ ์ˆ˜๋ฅผ ๊ด€๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [40, 43, 44]. - * 2025๋…„ ์ดํ›„ ์•ˆ์ •ํ™”๋œ **React Compiler**๋Š” ๋นŒ๋“œ ํƒ€์ž„์— ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ๋ฅผ ๋ถ„์„ํ•˜์—ฌ ์ž๋™์œผ๋กœ ์„ธ๋ฐ€ํ•œ ๋ฉ”๋ชจ์ด์ œ์ด์…˜(JSX ์š”์†Œ ๋‹จ์œ„)์„ ์ˆ˜ํ–‰ํ•จ์œผ๋กœ์จ, ์ˆ˜๋™์œผ๋กœ ์ž‘์„ฑํ•˜๋˜ `useMemo`, `useCallback`, `React.memo`์˜ ์œ ์ง€๋ณด์ˆ˜ ๋ถ€๋‹ด์„ ์—†์• ๊ณ  ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค [39, 45, 46]. -* **์•ˆ์ •์„ฑ ๋ฐ ๋””๋ฒ„๊น… (Resilience & Debugging)** - * **Error Boundaries:** ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ์˜ ๋ Œ๋”๋ง ์—๋Ÿฌ๋ฅผ ํฌ์ฐฉํ•˜๊ณ  Fallback UI๋ฅผ ๋„์›Œ ์ „์ฒด ์•ฑ์˜ "๋ฐฑ์ง€ํ™”(White screen)"๋ฅผ ๋ง‰๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์‹œ๋ณด๋“œ๋‚˜ ์„œ๋“œํŒŒํ‹ฐ ์œ„์ ฏ์ฒ˜๋Ÿผ ์—๋Ÿฌ ๋ฐœ์ƒ๋ฅ ์ด ๋†’์€ ์„น์…˜์„ ๊ฒฉ๋ฆฌํ•˜๋Š” ๋ฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค [47-49]. - * Sentry, LogRocket, Datadog ๊ฐ™์€ ํด๋ผ์šฐ๋“œ ๋กœ๊น… ํˆด์„ ํ™œ์šฉํ•˜์—ฌ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜์™€ ์—๋Ÿฌ๋ฅผ ์ถ”์ ํ•˜๊ณ  ๋ชจ๋‹ˆํ„ฐ๋งํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [50, 51]. - -## โš–๏ธ Trade-offs & Caveats -* **Feature-Sliced Design (FSD)์˜ ์ดˆ๊ธฐ ์˜ค๋ฒ„ํ—ค๋“œ:** FSD๋Š” ๊ฒฐํ•ฉ๋„๋ฅผ ๊ทน์ ์œผ๋กœ ๋‚ฎ์ถ”์ง€๋งŒ, ์ฒ˜์Œ ๋„์ž… ์‹œ "์ด ๊ธฐ๋Šฅ์€ Feature์ธ๊ฐ€, Widget์ธ๊ฐ€?"๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ์˜๋ฏธ๋ก ์  ํ† ๋ก ์ด ํ•„์š”ํ•˜๋ฉฐ ์ดˆ๊ธฐ ํ•™์Šต ๊ณก์„ ์ด ๊ฐ€ํŒŒ๋ฆ…๋‹ˆ๋‹ค [52, 53]. ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๊ณผ๋„ํ•œ ์—”์ง€๋‹ˆ์–ด๋ง์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [54]. -* **Context API vs ์™ธ๋ถ€ ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ:** Context API๋Š” ์„œ๋“œํŒŒํ‹ฐ ์˜์กด์„ฑ ์—†์ด ์‰ฝ๊ฒŒ ์ ์šฉ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ๋ฐ์ดํ„ฐ์˜ ์ผ๋ถ€๋งŒ ๋ณ€ํ•ด๋„ ๊ตฌ๋…ํ•˜๋Š” ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ฐ•์ œ ๋ฆฌ๋ Œ๋”๋ง๋˜๋Š” ์„ฑ๋Šฅ ๊ฒฐํ•จ(Re-render storm)์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค [28, 29]. ๋ฐ˜๋Œ€๋กœ Zustand๋Š” ๋น ๋ฅด๊ณ  ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ๊ฐ€ ์—†์ง€๋งŒ ์œ ์—ฐ์„ฑ์ด ๋„ˆ๋ฌด ๋›ฐ์–ด๋‚˜ ํŒ€ ๊ทœ์น™์ด ์—†์œผ๋ฉด ์ฝ”๋“œ ํŒŒํŽธํ™”๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ [55], Redux๋Š” ๊ตฌ์กฐ์  ์•ˆ์ •์„ฑ์ด ๋†’์ง€๋งŒ ์ดˆ๊ธฐ ์„ค์ •๊ณผ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ๊ฐ€ ๋ฐฉ๋Œ€ํ•ฉ๋‹ˆ๋‹ค [34, 56]. -* **๋ฉ”๋ชจ์ด์ œ์ด์…˜(`React.memo`, `useMemo`)์˜ ์—ญํšจ๊ณผ:** ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง์„ ๋ง‰๊ธฐ ์œ„ํ•ด ๋ชจ๋“  ๊ณณ์— ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ์€ ์•ˆํ‹ฐํŒจํ„ด์ž…๋‹ˆ๋‹ค. React๊ฐ€ ์ด์ „ Props์™€ ํ˜„์žฌ Props๋ฅผ ๋น„๊ตํ•˜๋Š” ๋ฐ ๋“œ๋Š” ๋น„์šฉ์ด ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‹จ์ˆœํžˆ ๋‹ค์‹œ ๋ Œ๋”๋งํ•˜๋Š” ๋น„์šฉ๋ณด๋‹ค ํด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [57]. ๋ Œ๋”๋ง์ด ๊ฐ€๋ณ๊ณ  ์ž์ฃผ ๋ณ€๊ฒฝ๋˜๋Š” ์ปดํฌ๋„ŒํŠธ์—๋Š” ์˜คํžˆ๋ ค ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์ดˆ๋ž˜ํ•ฉ๋‹ˆ๋‹ค [58, 59]. -* **React Compiler์˜ ํ•œ๊ณ„:** ์ž๋™์œผ๋กœ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ํ•ด์ฃผ๋Š” ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์ง€๋งŒ, ๋‚ด๋ถ€๊ฐ€ ๋ธ”๋ž™๋ฐ•์Šค๋กœ ์ž‘๋™ํ•˜์—ฌ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ฆฌ๋ Œ๋”๋ง ๋ฐœ์ƒ ์‹œ ์›์ธ์„ ํŒŒ์•…ํ•˜๊ธฐ ์–ด๋ ค์›Œ ๋””๋ฒ„๊น…์ด ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [60]. ๋˜ํ•œ ํ•ญ์ƒ ๋ถˆ์•ˆ์ •ํ•œ ์ฐธ์กฐ(์ƒˆ ๊ฐ์ฒด)๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€๋Š” ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ์ฒด์ธ์ด ๊นจ์ง€๋Š” ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค [61]. -* **๊ณผ๋„ํ•œ ์ถ”์ƒํ™”(DRY ์›์น™์˜ ์˜ค์šฉ):** ์ค‘๋ณต์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด(DRY) ์ฝ”๋“œ๋ฅผ ๋ฌด๋ฆฌํ•˜๊ฒŒ ์ถ”์ƒํ™”ํ•˜๋ฉด ์ง๊ด€์„ฑ์„ ์ค‘์‹œํ•˜๋Š” KISS(Keep It Simple, Stupid) ์›์น™์— ์œ„๋ฐฐ๋ฉ๋‹ˆ๋‹ค. ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ถ”์ƒํ™”๊ฐ€ ์›๋ž˜์˜ ๋ฐ˜๋ณต์ ์ธ ์ฝ”๋“œ๋ณด๋‹ค ์ดํ•ดํ•˜๊ธฐ ๋ณต์žกํ•ด์ง„๋‹ค๋ฉด ๊ตฌ์กฐ์ ์œผ๋กœ ์‹คํŒจํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค [62]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -#### [๊ด€๊ณ„ ์œ ํ˜• A: ์•„ํ‚คํ…์ฒ˜ ๋ฐ ์„ค๊ณ„ ๋ฐฉ๋ฒ•๋ก  (Architecture & Design)] -- [[Feature-Sliced Design (FSD)]] - - ์—ฐ๊ฒฐ ์ด์œ : ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ํ”„๋ก ํŠธ์—”๋“œ ์‹œ์Šคํ…œ ๊ตฌ์ถ•์„ ์œ„ํ•ด ๋‹จ์ˆœํžˆ ํŒŒ์ผ ์œ ํ˜•๋ณ„ ๋ถ„๋ฆฌ๊ฐ€ ์•„๋‹Œ, ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ณ„์ธต(Layer)์„ ๋ช…ํ™•ํžˆ ๋‚˜๋ˆ„๋Š” ์ตœ์‹  ์•„ํ‚คํ…์ฒ˜์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [4, 63]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ชจ๋“ˆ ๊ฐ„์˜ ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ๊ทœ์น™, Public API ์บก์Аํ™”, ๊ทธ๋ฆฌ๊ณ  ๋Œ€๊ทœ๋ชจ ํ˜‘์—… ์‹œ ์ฝ”๋“œ์˜ ๊ตฌ์กฐ์  ์ถฉ๋Œ์„ ๋ง‰๋Š” ๋ฐฉ๋ฒ•์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [14-16]. -- [[SOLID Principles]] - - ์—ฐ๊ฒฐ ์ด์œ : ๊ฐ์ฒด์ง€ํ–ฅ์˜ ์›์น™๋“ค์ด์ง€๋งŒ, ์ด๋ฅผ React ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๋งž๊ฒŒ ์žฌํ•ด์„ํ•˜์—ฌ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ํฌ๊ฒŒ ๋†’์ด๋Š” ๊ธฐ์ค€์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [7, 64]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ฑฐ๋Œ€ํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)์— ๋”ฐ๋ผ ์–ด๋–ป๊ฒŒ ์ปค์Šคํ…€ ํ›…๊ณผ ์ž‘์€ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ถ„ํ•ดํ•˜๋Š”์ง€ ํ•™์Šตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [18, 20]. - -#### [๊ด€๊ณ„ ์œ ํ˜• B: ์ตœ์ ํ™” ๋ฐ ์•ˆ์ •์„ฑ ๋„๊ตฌ (Optimization & Resilience Tools)] -- [[React Compiler]] - - ์—ฐ๊ฒฐ ์ด์œ : ๊ฐœ๋ฐœ์ž๊ฐ€ ์ˆ˜๋™์œผ๋กœ ์ง„ํ–‰ํ•˜๋˜ `useMemo`, `useCallback` ๊ธฐ๋ฐ˜์˜ ์ตœ์ ํ™”๋ฅผ ๋นŒ๋“œ ํƒ€์ž„์— ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š” ํ˜์‹ ์ ์ธ ๋„๊ตฌ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [45, 46]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: React ํŠธ๋ฆฌ์˜ ์„ธ๋ฐ€ํ•œ ๋ Œ๋”๋ง ์ตœ์ ํ™” ๊ตฌ์กฐ ๋ฐ ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋ Œ๋”๋ง ์‚ฌ์ดํด์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [46, 61]. -- [[State Management]] - - ์—ฐ๊ฒฐ ์ด์œ : ํ™•์žฅ์„ฑ์„ ํ™•๋ณดํ•˜๋ ค๋ฉด ๋กœ์ปฌ ์ƒํƒœ, ๊ธ€๋กœ๋ฒŒ ์ƒํƒœ, ์„œ๋ฒ„ ์ƒํƒœ์˜ ์„ฑ๊ฒฉ์— ๋งž์ถฐ Zustand, Redux, TanStack Query ๋“ฑ์„ ๋ถ„ํ•  ์ ์šฉํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [8, 65]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Context API์˜ ๋ Œ๋”๋ง ๋ณ‘๋ชฉ ํ˜„์ƒ ์›๋ฆฌ์™€ ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ์ƒํƒœ ์„ ํƒ์ž(Selector) ํŒจํ„ด์„ ๊นŠ๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [29, 32]. -- [[Error Boundaries]] - - ์—ฐ๊ฒฐ ์ด์œ : ์•ฑ ๊ทœ๋ชจ๊ฐ€ ํด์ˆ˜๋ก ๊ฐœ๋ณ„ ์œ„์ ฏ์ด๋‚˜ ์ปดํฌ๋„ŒํŠธ์˜ ์˜ค๋ฅ˜๊ฐ€ ์ „์ฒด ์•ฑ์„ ๋งˆ๋น„์‹œํ‚ค๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ํ•ต์‹ฌ์ ์ธ ์—๋Ÿฌ ํ•ธ๋“ค๋ง ๊ธฐ๋ฒ•์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [47, 48]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ์˜ ๊ฒฉ๋ฆฌ ๋ฐ ๋ณต์›๋ ฅ ์žˆ๋Š” UI ์„ค๊ณ„ ๋ฐฉ๋ฒ•๊ณผ ๋ชจ๋‹ˆํ„ฐ๋ง ํˆด(Sentry ๋“ฑ)์˜ ์—ฐ๋™ ๋ฐฉ์‹์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [49, 66]. - -### Deeper Research Questions - -- Feature-Sliced Design(FSD)์„ ์ ์šฉํ•  ๋•Œ ์ธ์ฆ(Auth)๊ณผ ๊ฐ™์ด ์—ฌ๋Ÿฌ ๋„๋ฉ”์ธ์— ๊ฑธ์ณ ๋ฐœ์ƒํ•˜๋Š” ๊ณตํ†ต ๊ด€์‹ฌ์‚ฌ(Cross-cutting concerns)๋ฅผ ๋ ˆ์ด์–ด ๋‚ด์—์„œ ์–ด๋–ป๊ฒŒ ๋ชจ๋“ˆํ™”ํ•˜๊ณ  ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋Š”๊ฐ€? -- ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ Context API๋ฅผ Zustand๋‚˜ Redux๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ๋•Œ, ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ์„ ๋ฉˆ์ถ”์ง€ ์•Š๊ณ  ์ ์ง„์ ์œผ๋กœ ๋ฆฌํŒฉํ† ๋งํ•˜๋Š” ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? -- React Compiler ์ ์šฉ ํ›„, ์˜๋„์ ์œผ๋กœ ๋งค ๋ Œ๋”๋ง๋งˆ๋‹ค ์ƒˆ๋กœ์šด ์ฐธ์กฐ(Unstable Reference)๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์„œ๋“œํŒŒํ‹ฐ ํ›… ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€์˜ ์ถฉ๋Œ์„ ์–ด๋–ป๊ฒŒ ์‹๋ณ„ํ•˜๊ณ  ์šฐํšŒํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? -- Chrome DevTools์˜ Heap Snapshot ๋ฐ Allocation Timeline์„ ํ™œ์šฉํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ ์–ธ๋งˆ์šดํŠธ ์ดํ›„์—๋„ ๋‚จ์•„์žˆ๋Š” Detached DOM Node์— ์˜ํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ์ถ”์ ํ•˜๋Š” ์ •ํ™•ํ•œ ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? -- ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ณผ์ •์—์„œ Virtualization(๊ฐ€์ƒํ™”) ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•  ๋•Œ, ๋™์  ๋†’์ด๋ฅผ ๊ฐ€์ง„ ์š”์†Œ๋“ค์ด ์Šคํฌ๋กค ์ค‘ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๋ ˆ์ด์•„์›ƒ ์‹œํ”„ํŠธ(CLS)๋ฅผ ์–ด๋–ป๊ฒŒ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? - -### Practical Application Contexts - -- **Implementation:** React ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ๋„ค์ด๋ฐ ์ปจ๋ฒค์…˜์„ ํ™•๋ฆฝ(์ปดํฌ๋„ŒํŠธ๋Š” `PascalCase`, ํŒŒ์ผ์€ `kebab-case`)ํ•˜๊ณ , 300์ค„ ์ด์ƒ์˜ ๋น„๋Œ€ํ•ด์ง„ ์ปดํฌ๋„ŒํŠธ๋Š” ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)์— ๋”ฐ๋ผ ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ๋ณ„ ํ›…๊ณผ ์ˆœ์ˆ˜ UI๋กœ ๋ถ„ํ• ํ•ฉ๋‹ˆ๋‹ค [18, 21, 24]. -- **System Design:** ์ดˆ๊ธฐ ํด๋” ๊ตฌ์กฐ๋ฅผ ์„ธํŒ…ํ•  ๋•Œ ๋‹จ์ˆœํžˆ components, hooks ๋ฌถ์Œ์ด ์•„๋‹ˆ๋ผ, ์ธ์ฆ, ๋Œ€์‹œ๋ณด๋“œ ๋“ฑ์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ ๋‹จ์œ„๋กœ ๊ธฐ๋Šฅ์„ ๊ฒฉ๋ฆฌ(Feature-based)ํ•˜๊ณ  ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ์„ ๋„๊ฒŒ ์„ค๊ณ„ํ•˜์—ฌ ํ–ฅํ›„ ๊ธฐ๋Šฅ ์ถ”๊ฐ€ ์‹œ ํ˜ผ๋ž€์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค [5, 13, 67]. -- **Operation / Maintenance:** ์šด์˜ ์ค‘์ธ ์„œ๋น„์Šค๊ฐ€ ์˜ˆ์ธก ๋ถˆ๊ฐ€๋Šฅํ•œ ๋ Œ๋”๋ง ์˜ค๋ฅ˜๋กœ ์ธํ•ด "ํ•˜์–€ ํ™”๋ฉด(White Screen of Death)"์„ ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ์„ ๋ง‰๊ธฐ ์œ„ํ•ด ์ฃผ์š” ์œ„์ ฏ ๋‹จ์œ„๋งˆ๋‹ค Error Boundary๋ฅผ ๊ฐ์‹ธ ๊ฒฉ๋ฆฌํ•˜๊ณ , ๋ฐœ๊ฒฌ๋œ ์—๋Ÿฌ๋Š” Sentry ๋“ฑ์„ ํ†ตํ•ด ์Šคํƒ ํŠธ๋ ˆ์ด์Šค๋กœ ๋กœ๊น…ํ•ฉ๋‹ˆ๋‹ค [47-49]. -- **Learning Path:** ์šฐ์„  React์˜ ๋ Œ๋”๋ง ๋ฉ”์ปค๋‹ˆ์ฆ˜๊ณผ Hooks์˜ ๋™์ž‘ ์›๋ฆฌ๋ฅผ ๋ช…ํ™•ํžˆ ์ดํ•ดํ•œ ํ›„, Context API์˜ ๋ฆฌ๋ Œ๋”๋ง ํ•œ๊ณ„๋ฅผ ์ฒด๊ฐํ•ด ๋ด…๋‹ˆ๋‹ค. ์ดํ›„ Zustand๋‚˜ TanStack Query ๊ฐ™์€ ํŠนํ™”๋œ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์ „ํ™˜ํ•˜๋Š” ๊ณผ์ •์„ ๊ฑฐ์น˜๋ฉฐ, ์ตœ์ข…์ ์œผ๋กœ FSD ๊ฐ™์€ ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด์„ ํ•™์Šตํ•˜๋Š” ์ˆœ์„œ๊ฐ€ ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค [68, 69]. -- **My Project Relevance:** ํ˜„์žฌ ์ง„ํ–‰ ์ค‘์ด๊ฑฐ๋‚˜ ์•ž์œผ๋กœ ๊ณ„ํš๋œ React ๊ธฐ๋ฐ˜ ํ”„๋กœ๋•ํŠธ๊ฐ€ ๋‹จ์ˆœํžˆ ํ•œ๋‘ ํŽ˜์ด์ง€๊ฐ€ ์•„๋‹ˆ๋ผ ์žฅ๊ธฐ์ ์ธ ํ™•์žฅ์„ ๋ชฉํ‘œ๋กœ ํ•œ๋‹ค๋ฉด, ๋ณธ ๋ฌธ์„œ์˜ FSD ํด๋” ๊ตฌ์กฐ, ์ƒํƒœ ๊ด€๋ฆฌ ๋ถ„ํ•  ์ „๋žต, Vite ๋ฒˆ๋“ค ๋ถ„ํ• (`manualChunks`) ์ง€์นจ์„ ๋ฐ”๋กœ ์‹ค๋ฌด์— ์ ์šฉํ•˜์—ฌ ๋ถ€์ฑ„(Technical Debt)๋ฅผ ์กฐ๊ธฐ์— ์ฐจ๋‹จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [70-72]. - -### Adjacent Topics - -- [[Server Components (Next.js)]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ์—์„œ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค์˜ ํฌ๊ธฐ๋ฅผ ๊ทผ๋ณธ์ ์œผ๋กœ ์ค„์ด๊ธฐ ์œ„ํ•ด, ์„œ๋ฒ„ ์ธก์—์„œ ๋ฐ์ดํ„ฐ ํŽ˜์นญ๊ณผ ๋ Œ๋”๋ง์„ ์™„์ „ํžˆ ๋๋งˆ์นœ ๋’ค ๊ฒฐ๊ณผ๋ฌผ๋งŒ ๋„˜๊ฒจ์ฃผ๋Š” ์ตœ์‹  ํ”„๋ ˆ์ž„์›Œํฌ ์ƒํƒœ๊ณ„๋กœ ์ง€์‹์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [73, 74]. -- [[Micro-Frontends]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋‹จ์ผ ๋ชจ๋†€๋ฆฌ์‹ ๊ตฌ์กฐ(SPA)์กฐ์ฐจ ํ•œ๊ณ„์— ๋ถ€๋”ชํž ์ •๋„์˜ ๋Œ€ํ˜• ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ํ™˜๊ฒฝ์—์„œ, ํ”„๋ก ํŠธ์—”๋“œ ์ž์ฒด๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋…๋ฆฝ์ ์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ๋ถ„๋ฆฌํ•˜๊ณ  ํŒ€๋ณ„ ์ž์œจ์  ๋ฐฐํฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ์•„ํ‚คํ…์ฒ˜ ์ˆ˜์ค€์˜ ์—ฐ๊ตฌ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [4]. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Sentry and LogRocket Integration.md b/00_Raw/Sentry and LogRocket Integration.md deleted file mode 100644 index eaa8644e..00000000 --- a/00_Raw/Sentry and LogRocket Integration.md +++ /dev/null @@ -1,53 +0,0 @@ -# [[Sentry and LogRocket Integration]] - -## ๐Ÿ“Œ Brief Summary -Sentry์™€ LogRocket์€ ํ˜„๋Œ€ ํ”„๋ก ํŠธ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ์˜ค๋ฅ˜๋ฅผ ์ถ”์ ํ•˜๊ณ  ์‚ฌ์šฉ์ž ๊ฒฝํ—˜(UX)์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ธฐ ์œ„ํ•ด ํ™œ์šฉ๋˜๋Š” ๋Œ€ํ‘œ์ ์ธ ํด๋ผ์šฐ๋“œ ๊ธฐ๋ฐ˜ ๋กœ๊น… ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. Sentry๋Š” ์ง€๋Šฅ์ ์ธ ์˜ค๋ฅ˜ ๊ทธ๋ฃนํ™”์™€ ์ด๋ฒคํŠธ ์‹œํ€€์Šค ์บก์ฒ˜์— ํŠนํ™”๋˜์–ด ์žˆ์œผ๋ฉฐ, LogRocket์€ ์ „์ฒด DOM๊ณผ ์ƒํƒœ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋น„๋””์˜ค์ฒ˜๋Ÿผ ๊ธฐ๋กํ•˜๋Š” ๊ณ ํ•ด์ƒ๋„ ์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด์— ์ค‘์ ์„ ๋‘ก๋‹ˆ๋‹ค. React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” Error Boundary ํŒจํ„ด๊ณผ ๊ฒฐํ•ฉํ•˜์—ฌ, ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜ ์‹œ ํฌ๋ž˜์‹œ๋ฅผ ๋ฐฉ์ง€ํ•จ๊ณผ ๋™์‹œ์— ์ƒ์„ธํ•œ ๋””๋ฒ„๊น… ์ปจํ…์ŠคํŠธ๋ฅผ ์บก์ฒ˜ํ•˜๋Š” ์šฉ๋„๋กœ ํ†ตํ•ฉ๋ฉ๋‹ˆ๋‹ค. - -## ๐Ÿ“– Core ๋‹จ๋ฝ Content -* **์˜ค๋ฅ˜ ์ถ”์  ๋ฐ ์ƒํƒœ ๊ธฐ๋ก ๋„๊ตฌ๋กœ์„œ์˜ ํŠน์ง•:** Sentry๋Š” ๊ฐœ๋ฐœ์ž ์ค‘์‹ฌ์˜ ์˜ค๋ฅ˜ ์ถ”์ (Error Tracker) ๋„๊ตฌ๋กœ, ์˜ค๋ฅ˜ ๋ฐœ์ƒ๊นŒ์ง€์˜ ์ฝ˜์†” ๋กœ๊ทธ, ๋„คํŠธ์›Œํฌ ์š”์ฒญ, ์‚ฌ์šฉ์ž ์ƒํ˜ธ ์ž‘์šฉ ๋“ฑ์˜ ์ •ํ™•ํ•œ ์‹œํ€€์Šค๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๋ธŒ๋ ˆ๋“œํฌ๋Ÿผ(Breadcrumb) ํŠธ๋ ˆ์ผ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋ฉฐ ์œ ์‚ฌํ•œ ์˜ค๋ฅ˜๋ฅผ ์ง€๋Šฅ์ ์œผ๋กœ ๊ทธ๋ฃนํ™”ํ•˜์—ฌ ๋…ธ์ด์ฆˆ๋ฅผ ์ค„์—ฌ์ค๋‹ˆ๋‹ค [1-3]. ๋ฐ˜๋ฉด LogRocket์€ ์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด์˜ ๊ฐœ์ฒ™์ž๋กœ์„œ, ๋‹จ์ˆœํ•œ ์˜ค๋ฅ˜ ๋กœ๊น…์„ ๋„˜์–ด Redux๋‚˜ Vuex์˜ ์ƒํƒœ ๋ณ€๊ฒฝ, ๋„คํŠธ์›Œํฌ ์š”์ฒญ ๋ฐ ์ „์ฒด DOM์„ ๊ธฐ๋กํ•˜์—ฌ ๋ณต์žกํ•œ ๋ฒ„๊ทธ ๋””๋ฒ„๊น…์— ํ•„์ˆ˜์ ์ธ ํ’๋ถ€ํ•œ ์ปจํ…์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [3-5]. -* **ํ”„๋กœ๋•์…˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด ํ†ตํ•ฉ:** ์ด๋Ÿฌํ•œ ๋„๊ตฌ๋“ค์€ React์˜ Error Boundary์™€ ํ†ตํ•ฉ๋˜์–ด ์ฃผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ์˜ ํŠน์ • ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์‹คํŒจํ•  ๋•Œ Error Boundary๊ฐ€ ์ด๋ฅผ ์žก์•„๋‚ด์–ด ๋Œ€์ฒด UI๋ฅผ ๋ณด์—ฌ์ฃผ๊ณ , ๋™์‹œ์— ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ Sentry๋‚˜ LogRocket๊ณผ ๊ฐ™์€ ๋„๊ตฌ๊ฐ€ ์˜ค๋ฅ˜ ์„ธ๋ถ€ ์ •๋ณด์™€ ๋‹น์‹œ์˜ ์ƒํ™ฉ์„ ๋กœ๊น…ํ•˜์—ฌ ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ๋กœ ์ „์†กํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค [6]. -* **๋‘ ๋„๊ตฌ ๊ฐ„์˜ ์ง์ ‘์  ํ†ตํ•ฉ์— ๋Œ€ํ•œ ํ•œ๊ณ„:** ์†Œ์Šค์— Sentry์™€ LogRocket ๋‘ ๋„๊ตฌ ์ž์ฒด๋ฅผ ์ƒํ˜ธ ์—ฐ๊ฒฐํ•˜๋Š” ์ง์ ‘์ ์ธ ์—ฐ๋™(Integration) ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๊ตฌ์ฒด์ ์ธ ์ •๋ณด๋Š” ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์‹ , ์ด ๋‘ ๋„๊ตฌ๋Š” ํ”„๋ก ํŠธ์—”๋“œ ์•„ํ‚คํ…์ฒ˜์— ๋ชจ๋‹ˆํ„ฐ๋ง ๊ณ„์ธต์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•œ ๋Œ€์•ˆ ํ˜น์€ ๋ณด์™„์  ๋„๊ตฌ ์„ธํŠธ๋กœ ๋น„๊ต๋˜๋ฉฐ ํ‰๊ฐ€๋ฉ๋‹ˆ๋‹ค [1, 2, 4, 5, 7-10]. - -## โš–๏ธ Trade-offs & Caveats -* **Sentry ๋„์ž…์˜ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„:** Sentry๋Š” ์„ค์น˜์™€ ํ†ตํ•ฉ์ด ๋งค์šฐ ๋น ๋ฅด๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์œผ๋‚˜, ๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ ๊ฒฝ์šฐ(์—๋Ÿฌ ๋ณผ๋ฅจ, ๋ฆฌํ”Œ๋ ˆ์ด, ์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง ๋“ฑ ๋‹ค์ค‘ ์ง€ํ‘œ ์‚ฌ์šฉ ์‹œ) ๊ฐ€๊ฒฉ ๊ตฌ์กฐ๊ฐ€ ๋ณต์žกํ•˜๊ณ  ๋น„์‹ธ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2, 9]. ๋˜ํ•œ, ์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง ๊ธฐ๋Šฅ(Web Vitals ๋“ฑ)์„ ์ถ”๊ฐ€ํ•  ๊ฒฝ์šฐ ๋ฒˆ๋“ค ํฌ๊ธฐ์— ์ƒ๋‹นํ•œ ๋ถ€๋‹ด์„ ์ค„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ „๋ฌธ์ ์ธ ์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด ๊ธฐ๋Šฅ์€ ์•„์ง ๋‹ค๋ฅธ ํŠนํ™” ๋„๊ตฌ์— ๋น„ํ•ด ์„ฑ์ˆ™๋„๊ฐ€ ๋‚ฎ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [9]. -* **LogRocket ๋„์ž…์˜ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„:** LogRocket์€ ์••๋„์ ์ธ ๋””๋ฒ„๊น… ์ปจํ…์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•˜์ง€๋งŒ, ๊ธฐ๋ณธ์ ์œผ๋กœ '๋ชจ๋“  ๊ฒƒ์„ ์บก์ฒ˜'ํ•˜๋Š” ๋ฐฉ์‹์„ ์ทจํ•˜๋ฏ€๋กœ ํ”„๋ผ์ด๋ฒ„์‹œ ์ด์Šˆ์— ๋ฏผ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋…ธ์ถœ๋˜์ง€ ์•Š๋„๋ก ์„ค์ •ํ•˜๋Š” ๋ฐ ์ƒ๋‹นํ•œ ์‹œ๊ฐ„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค [5, 10]. ๋˜ํ•œ, ์œ ๋ฃŒ ํ”Œ๋žœ์˜ ๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ ๋•Œ ์œ ์ง€ ๋น„์šฉ์ด ๋งค์šฐ ๋น„์‹ธ๋ฉฐ ๋ฒˆ๋“ค ํฌ๊ธฐ์™€ ์„ฑ๋Šฅ ์ธก๋ฉด์—์„œ๋„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์ด ํฐ ํŽธ์ž…๋‹ˆ๋‹ค [10]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -#### [ํ”„๋ก ํŠธ์—”๋“œ ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ์˜ต์ €๋ฒ„๋นŒ๋ฆฌํ‹ฐ ๋„๊ตฌ] -- [[Session Replay]] - - ์—ฐ๊ฒฐ ์ด์œ : LogRocket์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์ด์ž Sentry์˜ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜๋กœ, ์‚ฌ์šฉ์ž์˜ ์›น ์ƒํ˜ธ ์ž‘์šฉ์„ ํ™”๋ฉด ๋…นํ™”์ฒ˜๋Ÿผ ์žฌํ˜„ํ•˜๋Š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค [2, 4]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋‹จ์ˆœํžˆ ์—๋Ÿฌ ์Šคํƒ์„ ๋ณด๋Š” ๊ฒƒ์„ ๋„˜์–ด ์‚ฌ์šฉ์ž ํ™”๋ฉด์—์„œ ์–ด๋–ค ๋™์ž‘ ์‹œํ€€์Šค๊ฐ€ ์—๋Ÿฌ๋ฅผ ์œ ๋ฐœํ–ˆ๋Š”์ง€ ์ถ”์ ํ•˜๋Š” ๋งฅ๋ฝ ๊ธฐ๋ฐ˜ ๋””๋ฒ„๊น… ํ”„๋กœ์„ธ์Šค๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -- [[Error Grouping]] - - ์—ฐ๊ฒฐ ์ด์œ : Sentry๊ฐ€ ์ œ๊ณตํ•˜๋Š” ํ•ต์‹ฌ ํ‚ฌ๋Ÿฌ ๊ธฐ๋Šฅ์œผ๋กœ, ์ˆ˜๋งŽ์€ ์—๋Ÿฌ ๋กœ๊ทธ ์†์—์„œ ์œ ์‚ฌํ•œ ๋ฌธ์ œ๋“ค์„ ์ž๋™์œผ๋กœ ๋ฌถ์–ด์ค๋‹ˆ๋‹ค [1, 3]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋Œ€๊ทœ๋ชจ ํŠธ๋ž˜ํ”ฝ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋™์ผํ•œ ๋ฒ„๊ทธ๋กœ ์ธํ•œ ๋กœ๊ทธ ๋…ธ์ด์ฆˆ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ฐ์†Œ์‹œํ‚ค๊ณ  ๊ด€๋ฆฌ ํšจ์œจ์„ฑ์„ ๋†’์ด๋Š”์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - -#### [React ์•„ํ‚คํ…์ฒ˜ ๋ฐ ์˜ค๋ฅ˜ ๊ด€๋ฆฌ] -- [[React Error Boundaries]] - - ์—ฐ๊ฒฐ ์ด์œ : React ์•ฑ์—์„œ ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ(Sentry, LogRocket ๋“ฑ)์™€ ๊ฒฐํ•ฉํ•˜์—ฌ, ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜๋ฅผ ์บ์น˜ํ•˜๊ณ  ์‚ฌ์šฉ์ž์—๊ฒŒ Fallback UI๋ฅผ ๋„์›Œ์ฃผ๋Š” ๋™์‹œ์— ์˜ค๋ฅ˜ ์ •๋ณด๋ฅผ ์›๊ฒฉ ๋กœ๊น…ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค [6, 11]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ฝ”๋“œ๋ฒ ์ด์Šค ๋‚ด์—์„œ ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ๋“ค์ด ์‹ค์ œ ์–ด๋–ป๊ฒŒ ์•ˆ์ „ํ•˜๊ฒŒ ํ†ตํ•ฉ๋˜๊ณ  ํ˜ธ์ถœ๋˜๋Š”์ง€์˜ ์•„ํ‚คํ…์ฒ˜์  ์œ„์น˜๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - -### Deeper Research Questions -- Sentry์˜ ์ง€๋Šฅํ˜• ์˜ค๋ฅ˜ ๊ทธ๋ฃนํ™” ๊ธฐ์ˆ ์€ ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ค ๊ธฐ์ค€๊ณผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ†ตํ•ด ์ˆ˜๋งŽ์€ ์—๋Ÿฌ ๋กœ๊ทธ์˜ ์ค‘๋ณต์„ ํŒ๋ณ„ํ•˜๋Š”๊ฐ€? -- LogRocket์˜ DOM ๋ฐ ์ƒํƒœ ๋ณ€๊ฒฝ '์ „์ฒด ์บก์ฒ˜' ๋ฐฉ์‹์—์„œ, ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ฐ PII(๊ฐœ์ธ์‹๋ณ„์ •๋ณด)์™€ ๊ฐ™์€ ๋ฏผ๊ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ž๋™์œผ๋กœ ๋งˆ์Šคํ‚นํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ํ”„๋ผ์ด๋ฒ„์‹œ ์ œ์–ด ๋งค์ปค๋‹ˆ์ฆ˜์€ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”๊ฐ€? -- Sentry์˜ ์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง ๊ธฐ๋Šฅ๊ณผ LogRocket ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ํ†ตํ•ฉํ–ˆ์„ ๋•Œ, ์ดˆ๊ธฐ ๋กœ๋“œ ์‹œ๊ฐ„๊ณผ ๋ฒˆ๋“ค ํฌ๊ธฐ์— ๋ฏธ์น˜๋Š” ์„ฑ๋Šฅ ํŽ˜๋„ํ‹ฐ๋ฅผ ์ •๋Ÿ‰์ ์œผ๋กœ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์ ํ™” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? -- Datadog RUM๊ณผ ๊ฐ™์€ Full-Stack ์˜ต์ €๋ฒ„๋นŒ๋ฆฌํ‹ฐ ๋„๊ตฌ์™€ ๋น„๊ตํ•  ๋•Œ, ํ”„๋ก ํŠธ์—”๋“œ์— ํŠนํ™”๋œ Sentry์™€ LogRocket์ด ์ œ๊ณตํ•˜๋Š” ๊ธฐ์ˆ ์ , ๊ฒฝ์ œ์  ํ•œ๊ณ„๋Š” ๋ฌด์—‡์ธ๊ฐ€? -- React Error Boundary ๋‚ด๋ถ€์—์„œ ์™ธ๋ถ€ ๋ชจ๋‹ˆํ„ฐ๋ง ์„œ๋น„์Šค๋กœ ์—๋Ÿฌ๋ฅผ ์ „์†กํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋น„๋™๊ธฐ ๋„คํŠธ์›Œํฌ ๋น„์šฉ๊ณผ ์žฅ์• ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๊ฒฉ๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? - -### Practical Application Contexts -- **Implementation:** React ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ์˜ ํ•ต์‹ฌ ๊ฒฝ๊ณ„(์˜ˆ: ๋Œ€์‹œ๋ณด๋“œ, ์„œ๋“œํŒŒํ‹ฐ ์œ„์ ฏ ์˜์—ญ)์— Error Boundary ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฐฐ์น˜ํ•˜๊ณ , `componentDidCatch` ๋“ฑ์˜ ์ƒ๋ช…์ฃผ๊ธฐ ๋‚ด์— Sentry๋‚˜ LogRocket ๋กœ๊น… API๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค [6, 12, 13]. -- **System Design:** ์ดˆ๊ธฐ ์Šคํƒ€ํŠธ์—… ๋‹จ๊ณ„์—์„œ๋Š” ๋„‰๋„‰ํ•œ ๋ฌด๋ฃŒ ํ‹ฐ์–ด๋ฅผ ์ œ๊ณตํ•˜๋Š” Sentry๋กœ ์‹œ์ž‘ํ•˜์—ฌ ์ธํ”„๋ผ ๋น„์šฉ์„ ์ค„์ด๊ณ , ์„œ๋น„์Šค๊ฐ€ ๊ณ ๋„ํ™”๋˜๊ณ  ๋ณต์žกํ•œ ์ƒํƒœ ๋””๋ฒ„๊น…์ด ํ•„์š”ํ•ด์ง€๋ฉด ๊ณ ํ•ด์ƒ๋„ ์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด๋ฅผ ์ง€์›ํ•˜๋Š” LogRocket์˜ ๋„์ž…์„ ๊ฒ€ํ† ํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์‹œ์Šคํ…œ์„ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค [9, 10, 14]. -- **Operation / Maintenance:** ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ์›์ธ์„ ์•Œ ์ˆ˜ ์—†๋Š” 1%์˜ ํŠน์ˆ˜ ๋ธŒ๋ผ์šฐ์ €/๊ธฐ๊ธฐ ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ, Sentry๋กœ ์—๋Ÿฌ๋ฅผ ์•Œ๋ฆผ ๋ฐ›๊ณ  LogRocket์˜ Redux ์ƒํƒœ ์ถ”์  ๋ฐ ๋ฆฌํ”Œ๋ ˆ์ด๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž ํ™˜๊ฒฝ์„ ๊ทธ๋Œ€๋กœ ์žฌํ˜„ํ•˜๋ฉฐ ์šด์˜์ƒ์˜ ์žฅ์• ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค [1, 5, 15]. -- **Learning Path:** ๋‹จ์ˆœํ•œ `console.log` ๋””๋ฒ„๊น… ๋ฐฉ์‹์„ ๋„˜์–ด, ํด๋ผ์šฐ๋“œ ๊ธฐ๋ฐ˜ ํ”„๋ก ํŠธ์—”๋“œ ์—๋Ÿฌ ํŠธ๋ž˜์ปค(Sentry) ํ†ตํ•ฉ ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šฐ๊ณ , ์ดํ›„ ์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด(LogRocket) ๋„๊ตฌ๋ฅผ ๋„์ž…ํ•˜๋ฉด์„œ ํ”„๋ผ์ด๋ฒ„์‹œ ๋ฐ์ดํ„ฐ ๋งˆ์Šคํ‚น๊ณผ ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ ์ตœ์ ํ™”์˜ ์ค‘์š”์„ฑ์„ ๊นจ๋‹ซ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค [7, 16, 17]. -- **My Project Relevance:** ํ”„๋ก ํŠธ์—”๋“œ ์ฝ”๋“œ๋ฒ ์ด์Šค๊ฐ€ ์ ์  ๋ฐฉ๋Œ€ํ•ด์ง์— ๋”ฐ๋ผ ๋ฒ„๊ทธ ์ถ”์ ์ด ์–ด๋ ค์›Œ์ง€๋Š” ํ”„๋กœ์ ํŠธ ํ™˜๊ฒฝ์—์„œ, Sentry๋‚˜ LogRocket ์ค‘ ํŒ€์˜ ์˜ˆ์‚ฐ๊ณผ ์š”๊ตฌ์‚ฌํ•ญ์— ๋งž๋Š” ๋กœ๊น… ๋„๊ตฌ๋ฅผ ์„ ํƒ ๋ฐ ํ†ตํ•ฉํ•˜์—ฌ ์•ˆ์ •์„ฑ๊ณผ ์œ ์ง€ ๋ณด์ˆ˜์„ฑ์„ ๋Œ€ํญ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [7, 14]. - -### Adjacent Topics -- [[Datadog RUM (Real User Monitoring)]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ํ”„๋ก ํŠธ์—”๋“œ ๋กœ๊ทธ๋งŒ ์ˆ˜์ง‘ํ•˜๋Š” ๊ฒƒ์„ ๋„˜์–ด, ๋ฐœ์ƒํ•œ ์˜ค๋ฅ˜๋ฅผ ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค ํŠธ๋ ˆ์ด์Šค, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฟผ๋ฆฌ๊นŒ์ง€ ์ด์–ด์ง€๊ฒŒ ํ•˜๋Š” ์—”๋“œํˆฌ์—”๋“œ ๋ถ„์‚ฐ ํŠธ๋ ˆ์ด์‹ฑ ๊ธฐ์ˆ ๋กœ์˜ ํ™•์žฅ [18, 19]. -- [[SigNoz & OpenTelemetry]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: Sentry๋‚˜ LogRocket๊ณผ ๊ฐ™์€ ์ƒ์šฉ SaaS ํˆด์˜ ํ•œ๊ณ„(๋น„์šฉ ๋ฐ ๋ฒค๋” ์ข…์†์„ฑ)๋ฅผ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด, ์˜คํ”ˆ์†Œ์Šค ํ‘œ์ค€์ธ OpenTelemetry๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ง์ ‘ ํ˜ธ์ŠคํŒ…ํ•˜๋Š” ์˜ต์ €๋ฒ„๋นŒ๋ฆฌํ‹ฐ ๋Œ€์•ˆ ์†”๋ฃจ์…˜์„ ํƒ์ƒ‰ํ•˜๋Š” ๋ฐฉํ–ฅ [16, 20, 21]. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Server State.md b/00_Raw/Server State.md deleted file mode 100644 index f224dedf..00000000 --- a/00_Raw/Server State.md +++ /dev/null @@ -1,57 +0,0 @@ -# [[Server State]] - -## ๐Ÿ“Œ Brief Summary -Server State(์„œ๋ฒ„ ์ƒํƒœ)๋Š” API๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๊ฐ€์ ธ์˜จ ๋ฐ์ดํ„ฐ ์ƒํƒœ๋กœ, ํด๋ผ์ด์–ธํŠธ ์ธก์˜ ์ผ๋ฐ˜์ ์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒํƒœ(Application State)์™€ ๊ทผ๋ณธ์ ์œผ๋กœ ๋‹ค๋ฅธ ํŠน์„ฑ์„ ์ง€๋‹™๋‹ˆ๋‹ค [1]. ์ด๋Ÿฌํ•œ ์ƒํƒœ๋Š” ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋ฉฐ, ๋ฐ์ดํ„ฐ์˜ ์ตœ์‹ ํ™”(์‹ ์„ ๋„ ์œ ์ง€), ๋™๊ธฐํ™”, ์บ์‹ฑ, ๋กœ๋”ฉ ๋ฐ ์—๋Ÿฌ ์ฃผ๊ธฐ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ํ•„์ˆ˜๋กœ ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค [1]. ์ตœ๊ทผ์˜ ํ”„๋ก ํŠธ์—”๋“œ ์•„ํ‚คํ…์ฒ˜์—์„œ๋Š” ์ด ์„œ๋ฒ„ ์ƒํƒœ๋ฅผ ์ „์—ญ ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ์™€ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌํ•˜์—ฌ, ํŠนํ™”๋œ ์ „์šฉ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ด ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ํ‘œ์ค€์œผ๋กœ ์ž๋ฆฌ ์žก์•˜์Šต๋‹ˆ๋‹ค [1, 2]. - -## ๐Ÿ“– Core Content -* **์ƒํƒœ ๋ถ„๋ฆฌ ์•„ํ‚คํ…์ฒ˜:** ๊ณผ๊ฑฐ ๋‹จ์ผ ์Šคํ† ์–ด(์˜ˆ: Redux)์—์„œ ๋ชจ๋“  ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋˜ ํŒจ๋Ÿฌ๋‹ค์ž„์—์„œ ๋ฒ—์–ด๋‚˜, ํ˜„๋Œ€์˜ React ์‹œ์Šคํ…œ์—์„œ๋Š” '์„œ๋ฒ„ ์ƒํƒœ(Server State)'์™€ '์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒํƒœ(Application State)'๋ฅผ ๊ตฌ๋ถ„ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ƒํƒœ ๊ด€๋ฆฌ์˜ ๋ณ€ํ™”๋กœ ๊ผฝํž™๋‹ˆ๋‹ค [1, 3]. -* **Server State์˜ ์ฃผ์š” ์š”๊ตฌ์‚ฌํ•ญ:** ๋ฐ์ดํ„ฐ๊ฐ€ ์™ธ๋ถ€(API)์— ์กด์žฌํ•˜๋ฏ€๋กœ, ์ด๋ฅผ ๋กœ์ปฌ์—์„œ ํšจ์œจ์ ์œผ๋กœ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ค‘๋ณต ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ์ค„์ด๋Š” ์บ์‹ฑ, ์„œ๋ฒ„์™€์˜ ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™”, ๋กœ๋”ฉ ์ค‘์ด๋‚˜ ์—๋Ÿฌ ๋ฐœ์ƒ ์‹œ์˜ UI ์ฒ˜๋ฆฌ ์‚ฌ์ดํด ๊ด€๋ฆฌ๊ฐ€ ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค [1, 4]. -* **์ฃผ์š” ๊ด€๋ฆฌ ๋„๊ตฌ:** TanStack Query(React Query)์™€ RTK Query๊ฐ€ ์„œ๋ฒ„ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ์‚ฌ์‹ค์ƒ์˜ ํ‘œ์ค€(de facto standard) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ํ™œ์šฉ๋ฉ๋‹ˆ๋‹ค [1, 5]. ์ด๋Ÿฌํ•œ ๋„๊ตฌ๋“ค์€ ๋ฌดํ•œ ์Šคํฌ๋กค๋ง, ๋‚™๊ด€์  ์—…๋ฐ์ดํŠธ(optimistic updates)์™€ ๊ฐ™์€ ๋ณต์žกํ•œ ๊ธฐ๋Šฅ์„ ๋‹จ์ˆœํ™”ํ•˜๊ณ , ๊ฐ•๋ ฅํ•œ ์บ์‹ฑ ๋ ˆ์ด์–ด๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ์˜ ์‹ ์„ ๋„๋ฅผ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค [4]. RTK Query์˜ ๊ฒฝ์šฐ ์บ์‹ฑ, ๋ฐ์ดํ„ฐ ์ค‘๋ณต ์ œ๊ฑฐ, ์ž๋™ ๋ฆฌํŒจ์นญ(refetching) ๋ฐ ์บ์‹œ ๋ฌดํšจํ™”๋ฅผ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [5]. -* **์ฝ”๋“œ ๊ตฌ์„ฑ ๋ฐ ๊ฒฝ๊ณ„ ์„ค์ •:** ์„œ๋ฒ„ ์ƒํƒœ๋ฅผ ๋‹ค๋ฃจ๋Š” API ๋ ˆ์ด์–ด๋Š” ํ”„๋กœ์ ํŠธ ๋‚ด์—์„œ ๋šœ๋ ทํ•œ ๊ฒฝ๊ณ„๋กœ ๊ตฌ์„ฑ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์š”์ฒญ ์„ ์–ธ๋ถ€์™€ ์ปค์Šคํ…€ ํ›…(Custom Hooks)์€ ํŠน์ • ๊ธฐ๋Šฅ(feature) ํด๋” ๋‚ด์— ํ•จ๊ป˜ ๋ฐฐ์น˜(colocated)๋˜์–ด, ๋„คํŠธ์›Œํฌ ๋กœ์ง์ด UI ์ปดํฌ๋„ŒํŠธ์™€ ๋ถ„๋ฆฌ๋˜๋„๋ก ์„ค๊ณ„ํ•ด์•ผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ๋†’์•„์ง‘๋‹ˆ๋‹ค [4]. - -## โš–๏ธ Trade-offs & Caveats -* **๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ vs ์ผ๊ด€์„ฑ:** Zustand๋‚˜ Context API์ฒ˜๋Ÿผ ๋งค์šฐ ์œ ์—ฐํ•œ ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ด ์„œ๋ฒ„ ์ƒํƒœ ์ฒ˜๋ฆฌ๋ฅผ ์ง์ ‘ ๊ตฌํ˜„ํ•  ๊ฒฝ์šฐ, ์บ์‹ฑ์ด๋‚˜ ์ค‘๋ณต ์ œ๊ฑฐ ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ์ง์ ‘ ๋งŒ๋“ค์–ด์•ผ ํ•˜๋ฏ€๋กœ ์ˆ˜ ์ฃผ์ผ์˜ ์ž‘์—…์ด ๋‚ญ๋น„๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํŒ€์› ๊ฐ„ ๋น„๋™๊ธฐ ๋กœ์ง ์ฒ˜๋ฆฌ ๋ฐฉ์‹์ด ํŒŒํŽธํ™”๋˜๋Š” ๋ถ€์ž‘์šฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5-8]. ๋ฐ˜๋ฉด, RTK Query์™€ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŒ€ ๋‚ด ์ผ๊ด€์„ฑ์ด ๊ฐ•์ œ๋˜์ง€๋งŒ, ์ดˆ๊ธฐ ํ™˜๊ฒฝ ์„ค์ •์— ๋Œ€ํ•œ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ํญ๋ฐœ ๋ฐ ํ•™์Šต ๊ณก์„ ์ด๋ผ๋Š” ๋น„์šฉ์„ ๊ฐ์ˆ˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [5, 9, 10]. -* **๋ณต์žก์„ฑ ๊ด€๋ฆฌ:** ์ „์šฉ ์„œ๋ฒ„ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋น„๋™๊ธฐ ์ฝ”๋“œ์˜ ๋งŽ์€ ๋ถ€๋ถ„์„ ์ž๋™ํ™”ํ•˜์ง€๋งŒ ๋ณต์žก์„ฑ ์ž์ฒด๋ฅผ ์™„์ „ํžˆ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋ฏ€๋กœ, ์ •๊ทœํ™”๋œ ๋ฐ์ดํ„ฐ ๋“ฑ ์•ฑ์˜ ๊ทœ๋ชจ์™€ ๋ณต์žก์„ฑ์— ์•Œ๋งž์€ ๋„๊ตฌ๋ฅผ ์‹ ์ค‘ํ•˜๊ฒŒ ์„ ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [10]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -#### [๊ด€๊ณ„ ์œ ํ˜• A: ์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] -- [[Application State]] - - ์—ฐ๊ฒฐ ์ด์œ : Server State์™€ ๋Œ€๋น„๋˜๋Š” ํด๋ผ์ด์–ธํŠธ ์ธก ์ „์—ญ/์ง€์—ญ ์ƒํƒœ๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ, ์ด ๋‘ ๊ฐ€์ง€๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ตœ์‹  ํ”„๋ก ํŠธ์—”๋“œ ์ƒํƒœ ๊ด€๋ฆฌ์˜ ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค [1, 2]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ ์„ฑ๊ฒฉ(ํด๋ผ์ด์–ธํŠธ ๋…์ž ๋ฐ์ดํ„ฐ vs ์™ธ๋ถ€ ์‹œ์Šคํ…œ ์ข…์† ๋ฐ์ดํ„ฐ)์— ๋”ฐ๋ผ ์™œ ๋ถ„๋ฆฌํ•ด์„œ ๋‹ค๋ฃจ์–ด์•ผ ํ•˜๋Š”์ง€ ์•„ํ‚คํ…์ฒ˜์  ๊ทผ๊ฑฐ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - -#### [๊ด€๊ณ„ ์œ ํ˜• B: ๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ] -- [[TanStack Query]] - - ์—ฐ๊ฒฐ ์ด์œ : Server State ๊ด€๋ฆฌ์— ํŠนํ™”๋œ ์‚ฌ์‹ค์ƒ์˜ ํ‘œ์ค€(de facto standard) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค [1, 2]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์„œ๋ฒ„ ์ƒํƒœ ์บ์‹ฑ, ๋™๊ธฐํ™”, ๋กœ๋”ฉ/์—๋Ÿฌ ์‚ฌ์ดํด ์ฒ˜๋ฆฌ, ๋‚™๊ด€์  ์—…๋ฐ์ดํŠธ ๋“ฑ์ด ์‹ค์ œ ์ฝ”๋“œ์—์„œ ์–ด๋–ป๊ฒŒ ์ตœ์ ํ™”๋˜์–ด ๊ตฌํ˜„๋˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [4]. -- [[RTK Query]] - - ์—ฐ๊ฒฐ ์ด์œ : Redux ์ƒํƒœ๊ณ„์—์„œ ๋น„๋™๊ธฐ ์„œ๋ฒ„ ์ƒํƒœ์˜ ์บ์‹ฑ, ์ค‘๋ณต ์ œ๊ฑฐ, ์บ์‹œ ๋ฌดํšจํ™” ๋“ฑ์„ ์ฆ‰์‹œ ์ œ๊ณตํ•˜์—ฌ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ๋ฅผ ๋Œ€ํญ ์ค„์—ฌ์ฃผ๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค [5]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: API ํ†ต์‹ ์ด ๋งค์šฐ ๋งŽ๊ณ  ๋ณต์žกํ•œ ์•ฑ ํ™˜๊ฒฝ์—์„œ ๋น„๋™๊ธฐ ๋กœ์ง์˜ ์ผ๊ด€์„ฑ์„ ์–ด๋–ป๊ฒŒ ํ™•๋ณดํ•˜๋Š”์ง€ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5, 9]. -- [[Zustand]] - - ์—ฐ๊ฒฐ ์ด์œ : Server State ์ „์šฉ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋„์ž…ํ•œ ํ›„, ๋‚จ์€ ํด๋ผ์ด์–ธํŠธ ์ „์—ญ ์ƒํƒœ(Application State) ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ํ•จ๊ป˜ ๊ฒฐํ•ฉํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋˜๋Š” ๊ฒฝ๋Ÿ‰ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค [2]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์„œ๋ฒ„ ์ƒํƒœ์™€ ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ๋ฅผ ๊ฐ๊ฐ ์ ํ•ฉํ•œ ๋„๊ตฌ๋กœ ์–ด๋–ป๊ฒŒ ์กฐํ™”๋กญ๊ฒŒ ์šด์˜ํ• ์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - -### Deeper Research Questions -- Server State์™€ Application State๋ฅผ ํ•œ ๊ณณ์—์„œ ๊ด€๋ฆฌํ•  ๋•Œ ์ƒ๊ธฐ๋Š” ์„ฑ๋Šฅ ์ €ํ•˜ ๋ฐ ์œ ์ง€๋ณด์ˆ˜์„ฑ ํ•˜๋ฝ์˜ ๊ตฌ์ฒด์ ์ธ ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ๋ฌด์—‡์ธ๊ฐ€? -- TanStack Query๋‚˜ RTK Query๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ์บ์‹œ๋œ Server State ๋ฐ์ดํ„ฐ์˜ ์‹ ์„ ๋„(freshness)๋ฅผ ์–ด๋–ป๊ฒŒ ํ‰๊ฐ€ํ•˜๊ณ  ๋งŒ๋ฃŒ(invalidate)์‹œํ‚ค๋Š”๊ฐ€? -- Server State ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ด ๋ฌดํ•œ ์Šคํฌ๋กค(Infinite Scrolling)๊ณผ ๋‚™๊ด€์  ์—…๋ฐ์ดํŠธ(Optimistic Updates)๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ์˜ ๋ฐ์ดํ„ฐ ํ๋ฆ„๊ณผ ์˜ค๋ฅ˜ ๋ณต๊ตฌ(Rollback) ์ „๋žต์€ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑ๋˜๋Š”๊ฐ€? -- ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ํ†ต์‹  ์‹œ ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ฐœ์ƒํ•˜๋Š” ๋กœ๋”ฉ ๋ฐ ์—๋Ÿฌ ์ƒํƒœ๋ฅผ React์˜ Error Boundaries ๋ฐ Suspense์™€ ๊ฒฐํ•ฉํ•˜์—ฌ ์–ด๋–ป๊ฒŒ ์šฐ์•„ํ•˜๊ฒŒ(Graceful) ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? -- ์œ ์—ฐํ•œ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(Zustand ๋“ฑ)๋ฅผ ์ด์šฉํ•ด Server State ์บ์‹ฑ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๋ ค ํ•  ๋•Œ ๊ฒช๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฐ ์žฌ๋ Œ๋”๋ง ์ตœ์ ํ™”์˜ ํ•œ๊ณ„๋Š” ๋ฌด์—‡์ธ๊ฐ€? - -### Practical Application Contexts -- **Implementation:** React ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ์ˆ˜๋™์œผ๋กœ `useEffect`์™€ `useState`๋ฅผ ์กฐํ•ฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ํŒจ์นญํ•˜๋˜ ๋ฐฉ์‹์„ ํ๊ธฐํ•˜๊ณ , TanStack Query๋ฅผ ๋„์ž…ํ•ด ๋น„๋™๊ธฐ ์ƒํƒœ์˜ ์บ์‹ฑ ๋ฐ ๋ผ์ดํ”„์‚ฌ์ดํด ๊ด€๋ฆฌ๋ฅผ ์ž๋™ํ™”ํ•ฉ๋‹ˆ๋‹ค [1, 2, 11, 12]. -- **System Design:** Feature-Sliced Design(FSD)๊ณผ ๊ฐ™์€ ๋””๋ ‰ํ† ๋ฆฌ ์•„ํ‚คํ…์ฒ˜์—์„œ, ๋„๋ฉ”์ธ(Feature) ํด๋” ๋‚ด๋ถ€์— `api/` ๋˜๋Š” `hooks/` ํด๋”๋ฅผ ๊ตฌ์„ฑํ•˜์—ฌ ํ•ด๋‹น ๋„๋ฉ”์ธ์— ์†ํ•˜๋Š” Server State ์š”์ฒญ ๋กœ์ง์„ ์บก์Аํ™”ํ•ฉ๋‹ˆ๋‹ค [4, 13]. -- **Operation / Maintenance:** ๋ธŒ๋ผ์šฐ์ € DevTools์™€ ์ „์šฉ ๋„๊ตฌ(์˜ˆ: Redux DevTools)๋ฅผ ํ†ตํ•ด ์–ด๋А ์‹œ์ ์— ์•ก์…˜์ด ๋ฐœ์ƒํ•˜๊ณ  ๋„คํŠธ์›Œํฌ ์š”์ฒญ์ด ์ค‘๋ณต ์ œ๊ฑฐ๋˜์—ˆ๋Š”์ง€ ์‰ฝ๊ฒŒ ์ถ”์  ๋ฐ ๋””๋ฒ„๊น…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [9, 14]. -- **Learning Path:** ํด๋ผ์ด์–ธํŠธ ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ(Context, Zustand)์˜ ํ•œ๊ณ„์™€ ๊ณผ๋„ํ•œ ๋ Œ๋”๋ง ๋ฌธ์ œ๋ฅผ ํ•™์Šตํ•œ ๋’ค, API ํ˜ธ์ถœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ Server State ํŒจ๋Ÿฌ๋‹ค์ž„ ๋ถ„๋ฆฌ ํ•„์š”์„ฑ์„ ์ตํžˆ๊ณ , ์ตœ์ข…์ ์œผ๋กœ TanStack Query ๋“ฑ์˜ ์ตœ์ ํ™” ๋„๊ตฌ๋ฅผ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค [1, 3]. -- **My Project Relevance:** React ์ฝ”๋“œ๋ฒ ์ด์Šค ๋ฆฌํŒฉํ† ๋ง ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ, ๊ธฐ์กด Redux ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ค‘ ๋น„๋™๊ธฐ API ํ˜ธ์ถœ ๋ถ€๋ถ„์„ TanStack Query๋กœ ์ „ํ™˜(Server State)ํ•˜๊ณ , ๋‚จ์€ ํด๋ผ์ด์–ธํŠธ ์ „์—ญ ์ƒํƒœ๋งŒ Zustand๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ์ฝ”๋“œ์˜ ๋ณต์žก์„ฑ์„ ๋‚ฎ์ถ”๋Š” ๊ตฌ์กฐ ๊ฐœ์„ ์— ์ง์ ‘ ํ™œ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค [2]. - -### Adjacent Topics -- [[React Error Boundaries]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: Server State์—์„œ API ์š”์ฒญ ์‹คํŒจ ๋“ฑ ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด๊ฐ€ ์ถฉ๋Œํ•˜์—ฌ ๋นˆ ํ™”๋ฉด์ด ๋‚˜์˜ค์ง€ ์•Š๋„๋ก ํด๋ฐฑ(Fallback) UI๋ฅผ ํ‘œ์‹œํ•˜๊ณ  ๋ณต๊ตฌํ•˜๋Š” ์—๋Ÿฌ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•๋ก ์œผ๋กœ ํ™•์žฅ [15, 16]. -- [[Feature-Sliced Design]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ์บก์Аํ™”๋œ Server State ํ›…๊ณผ API ๋ ˆ์ด์–ด๋ฅผ ํฌํ•จํ•˜์—ฌ ํ”„๋ก ํŠธ์—”๋“œ ํ”„๋กœ์ ํŠธ์˜ ์ „์ฒด ํด๋” ๊ตฌ์กฐ๋ฅผ ์–ด๋–ป๊ฒŒ ๋„๋ฉ”์ธ/๊ธฐ๋Šฅ ์ค‘์‹ฌ์œผ๋กœ ํ™•์žฅ์„ฑ ์žˆ๊ฒŒ ์„ค๊ณ„ํ•  ๊ฒƒ์ธ์ง€์— ๋Œ€ํ•œ ์•„ํ‚คํ…์ฒ˜ ๋…ผ์˜๋กœ ํ™•์žฅ [4, 17]. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Single Page Applications (SPAs).md b/00_Raw/Single Page Applications (SPAs).md deleted file mode 100644 index ed290af1..00000000 --- a/00_Raw/Single Page Applications (SPAs).md +++ /dev/null @@ -1,49 +0,0 @@ -# [[Single Page Applications (SPAs)]] - -## ๐Ÿ“Œ Brief Summary -์†Œ์Šค์— ๊ด€๋ จ ์ •๋ณด๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. (์ œ๊ณต๋œ ์†Œ์Šค์—์„œ๋Š” SPA์˜ ๊ฐœ๋…์„ ์ง์ ‘์ ์œผ๋กœ ์ •์˜ํ•˜๊ฑฐ๋‚˜ ์„ค๋ช…ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ํŠน์ • ์ปดํฌ๋„ŒํŠธ ์ˆ˜๋ช… ์ฃผ๊ธฐ์—์„œ์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฌธ์ œ [1]๋‚˜ React ์•ฑ ๊ตฌ์กฐ์— ๊ด€ํ•œ ์ฐธ์กฐ ๋ฌธ์„œ ์ œ๋ชฉ [2]์œผ๋กœ๋งŒ ๊ฐ„๋žตํžˆ ์–ธ๊ธ‰๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.) - -## ๐Ÿ“– Core Content -์†Œ์Šค์— ๊ด€๋ จ ์ •๋ณด๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. - -## โš–๏ธ Trade-offs & Caveats -์†Œ์Šค์— ๊ด€๋ จ ์ •๋ณด๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -#### [๊ด€๊ณ„ ์œ ํ˜• A (์„ฑ๋Šฅ ๋ฐ ๋””๋ฒ„๊น…)] -- [[Memory Leaks]] - - ์—ฐ๊ฒฐ ์ด์œ : ์†Œ์Šค์—์„œ SPA ํ™˜๊ฒฝ์˜ ํŠน์ • ์‚ฌ์šฉ์ž ์ƒํ˜ธ์ž‘์šฉ ๋ฐ ์ปดํฌ๋„ŒํŠธ ์ˆ˜๋ช… ์ฃผ๊ธฐ ๋™์•ˆ ๋ฐœ์ƒํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ•ต์‹ฌ์ ์ธ ์„ฑ๋Šฅ ๋ฌธ์ œ๋กœ ๋‹ค๋ฃจ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [1]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: SPA ๋‚ด๋ถ€์—์„œ DOM ๋…ธ๋“œ๊ฐ€ ๋ฌธ์„œ์—์„œ ์ œ๊ฑฐ๋˜์—ˆ์Œ์—๋„ JavaScript์—์„œ ์ฐธ์กฐ๋˜์–ด ๋‚จ์•„์žˆ๋Š” ํ˜„์ƒ(Detached DOM Nodes), ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๋ˆ„์ , ํด๋กœ์ € ์ฐธ์กฐ ๋“ฑ SPA๊ฐ€ ์žฅ์‹œ๊ฐ„ ์‹คํ–‰๋  ๋•Œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์†๋„๋ฅผ ๋Šฆ์ถ”๊ณ  ์ถฉ๋Œ์„ ์ผ์œผํ‚ค๋Š” ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1, 3]. - -#### [๊ด€๊ณ„ ์œ ํ˜• B (์•„ํ‚คํ…์ฒ˜ ๋ฐ ๊ธฐ๋ฐ˜ ๊ธฐ์ˆ )] -- [[React Architecture]] - - ์—ฐ๊ฒฐ ์ด์œ : ๋Œ€๊ทœ๋ชจ SPA ๊ตฌ์ถ•์— ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋Š” React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ตฌ์กฐ์  ํ•œ๊ณ„๋ฅผ ๊ทน๋ณตํ•˜๊ณ  ํ™•์žฅ์„ฑ์„ ํ™•๋ณดํ•˜๊ธฐ ์œ„ํ•œ ์„ค๊ณ„ ๋ฐฉ๋ฒ•๋ก ์ด ์†Œ์Šค์˜ ์ฃผ์š” ๋‚ด์šฉ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [4-6]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: SPA ์‹œ์Šคํ…œ์„ ๋‹จ์ˆœํžˆ ๊ธฐ์ˆ ์  ํŒŒ์ผ ํƒ€์ž…(components, hooks ๋“ฑ)์œผ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ๋„˜์–ด, ๋น„์ฆˆ๋‹ˆ์Šค ๊ธฐ๋Šฅ(Features)๊ณผ ๋„๋ฉ”์ธ ์Šค์ฝ”ํ”„๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” Feature-Sliced Design(FSD)๊ณผ ๊ฐ™์€ ํ”„๋ก ํŠธ์—”๋“œ ์„ค๊ณ„ ์›์น™์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5, 7, 8]. - -### Deeper Research Questions -- SPA ์ปดํฌ๋„ŒํŠธ์˜ ์ˆ˜๋ช… ์ฃผ๊ธฐ(lifecycle) ๋™์•ˆ ๋ฐœ์ƒํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜์˜ ๊ตฌ์ฒด์ ์ธ ํŒจํ„ด(์˜ˆ: ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๋ˆ„์ , ํด๋กœ์ € ์ฐธ์กฐ ๋“ฑ)์„ ์–ด๋–ป๊ฒŒ ํšจ๊ณผ์ ์œผ๋กœ ์ถ”์ ํ•˜๊ณ  ํ”„๋ ˆ์ž„์›Œํฌ๋ณ„(React, Vue ๋“ฑ)๋กœ ์–ด๋–ป๊ฒŒ ์˜ˆ๋ฐฉํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? [1, 9] -- ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ๋Œ€๊ทœ๋ชจ SPA๋ฅผ ๊ตฌ์ถ•ํ•  ๋•Œ, ๊ธฐ์ˆ ์  ์—ญํ•  ๊ธฐ๋ฐ˜์˜ ๋ถ„๋ฆฌ(MVC)๊ฐ€ ์•„๋‹Œ ๊ธฐ๋Šฅ(Feature) ๊ธฐ๋ฐ˜์˜ ๊ณ„์ธตํ˜• ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ(FSD)๋ฅผ ์ฑ„ํƒํ•จ์œผ๋กœ์จ ์–ป๋Š” ์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ์˜์กด์„ฑ ๊ด€๋ฆฌ์˜ ์ด์ ์€ ๋ฌด์—‡์ธ๊ฐ€? [5, 8, 10, 11] -- SPA์—์„œ ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ๊ธฐ๋ณธ Context API๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง ๋ฌธ์ œ๋ฅผ Zustand๋‚˜ Redux ๊ฐ™์€ ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•˜๋Š”๊ฐ€? [12, 13] -- SPA์˜ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ค„์ด๊ณ  ์ดˆ๊ธฐ ๋กœ๋”ฉ ์„ฑ๋Šฅ(LCP, FCP ๋“ฑ)์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒฝ๋กœ ๊ธฐ๋ฐ˜์˜ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…(Code Splitting)๊ณผ ์ง€์—ฐ ๋กœ๋”ฉ(Lazy Loading) ์ „๋žต์€ ์‹ค์ œ ๋นŒ๋“œ ๋„๊ตฌ(Vite ๋“ฑ) ํ™˜๊ฒฝ์—์„œ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„๋˜๋Š”๊ฐ€? [14-16] -- SPA์™€ ๋Œ€๋น„๋˜๋Š” SSR(Server Side Rendering) ๋˜๋Š” Native ๋ชจ๋ฐ”์ผ ์•ฑ ๊ตฌ์กฐ๋Š” ์–ด๋– ํ•œ ํ”„๋กœ์ ํŠธ ์š”๊ตฌ์‚ฌํ•ญ์— ๋”ฐ๋ผ ์„ ํƒ๋˜์–ด์•ผ ํ•˜๋Š”๊ฐ€? [2] - -### Practical Application Contexts -- **Implementation:** SPA ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ธ๋งˆ์šดํŠธ(unmount)๋  ๋•Œ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋‚˜ ๊ตฌ๋…(subscription)์ด ์ œ๋Œ€๋กœ ์ œ๊ฑฐ๋˜์ง€ ์•Š์œผ๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ์ง€์†์ ์œผ๋กœ ๋ˆ„์ ๋˜๋ฏ€๋กœ, React์˜ ๊ฒฝ์šฐ `useEffect`์˜ ๋ฐ˜ํ™˜(cleanup) ํ•จ์ˆ˜์—์„œ ์ ์ ˆํ•œ ์ •๋ฆฌ ์ž‘์—…์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [1, 9, 17]. -- **System Design:** ๋Œ€๊ทœ๋ชจ SPA ์‹œ์Šคํ…œ ์„ค๊ณ„ ์‹œ Feature-Sliced Design(FSD) ์›์น™์„ ๋„์ž…ํ•˜์—ฌ, ๊ฐ ๊ธฐ๋Šฅ(Feature)์ด ๋ช…ํ™•ํ•œ ํผ๋ธ”๋ฆญ API(`index.ts`)๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์™ธ๋ถ€ ๋ชจ๋“ˆ๊ณผ ํ†ต์‹ ํ•˜๋„๋ก ์บก์Аํ™”ํ•จ์œผ๋กœ์จ ๋ชจ๋“ˆ ๊ฐ„ ๊ฒฐํ•ฉ๋„(Coupling)๋ฅผ ๋‚ฎ์ถ”๊ณ  ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ์‹œ์Šคํ…œ์„ ์„ค๊ณ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [18-20]. -- **Operation / Maintenance:** ์šด์˜ ์ค‘์ธ SPA์—์„œ ์‚ฌ์šฉ ์‹œ๊ฐ„์ด ๊ธธ์–ด์ง์— ๋”ฐ๋ผ ์„ฑ๋Šฅ์ด ์ง€์†์ ์œผ๋กœ ์ €ํ•˜๋˜๊ฑฐ๋‚˜ ๋ธŒ๋ผ์šฐ์ € ํƒญ์ด ๋ฉˆ์ถ”๋Š” ํ˜„์ƒ์ด ๋ณด๊ณ ๋  ๊ฒฝ์šฐ, Chrome DevTools์˜ Heap Snapshot์ด๋‚˜ Allocation Timeline์„ ํ™œ์šฉํ•ด ์ ์ง„์ ์œผ๋กœ ์ฆ๊ฐ€ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ์ฐพ์•„ ๋””๋ฒ„๊น…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [21-23]. -- **Learning Path:** ์†Œ์Šค์— ๊ด€๋ จ ์ •๋ณด๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. -- **My Project Relevance:** ์†Œ์Šค์— ๊ด€๋ จ ์ •๋ณด๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. - -### Adjacent Topics -- [[Feature-Sliced Design (FSD)]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: SPA๊ฐ€ ๋น„๋Œ€ํ•ด์งˆ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๊ตฌ์กฐ์  ๋ณต์žก์„ฑ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด, ๊ณ„์ธต(Layer), ์Šฌ๋ผ์ด์Šค(Slice), ์„ธ๊ทธ๋จผํŠธ(Segment)๋กœ ์ฝ”๋“œ๋ฅผ ๋‚˜๋ˆ„๊ณ  ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ์„ ๊ฐ•์ œํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก  ํƒ๊ตฌ [5, 7]. -- [[React Performance Optimization]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋Œ€๊ทœ๋ชจ SPA์—์„œ ๋นˆ๋ฒˆํ•˜๊ฒŒ ์ผ์–ด๋‚˜๋Š” ๋ Œ๋”๋ง ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•œ `React.memo`, `useCallback`, ๊ฐ€์ƒํ™”(Virtualization), ๊ทธ๋ฆฌ๊ณ  React Compiler๋ฅผ ํ™œ์šฉํ•œ ๋นŒ๋“œ ํƒ€์ž„ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๊ธฐ๋ฒ• ํ•™์Šต [24-26]. -- [[State Management Libraries]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: SPA ๋‚ด์—์„œ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด Context API, Zustand, Redux์˜ ์•„ํ‚คํ…์ฒ˜์  ์ฐจ์ด์™€ ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ์— ๋”ฐ๋ฅธ ์˜ฌ๋ฐ”๋ฅธ ๋„๊ตฌ ์ฑ„ํƒ ๊ธฐ์ค€ ๋น„๊ต [27-29]. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Small vs Large Frontend Teams.md b/00_Raw/Small vs Large Frontend Teams.md deleted file mode 100644 index f9d83ea7..00000000 --- a/00_Raw/Small vs Large Frontend Teams.md +++ /dev/null @@ -1,68 +0,0 @@ -# [[Small vs Large Frontend Teams]] - -## ๐Ÿ“Œ Brief Summary -ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์—์„œ ํŒ€์˜ ๊ทœ๋ชจ(Small vs Large)๋Š” ์•„ํ‚คํ…์ฒ˜, ์›Œํฌํ”Œ๋กœ์šฐ, ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ, ๊ทธ๋ฆฌ๊ณ  ๊ฑฐ๋ฒ„๋„Œ์Šค์˜ ์„ ํƒ์„ ์ขŒ์šฐํ•˜๋Š” ํ•ต์‹ฌ ๊ธฐ์ค€์ž…๋‹ˆ๋‹ค. ์†Œ๊ทœ๋ชจ ํŒ€์€ ๋น ๋ฅธ ๊ฐœ๋ฐœ ์†๋„์™€ ์œ ์—ฐ์„ฑ์„ ์œ„ํ•ด ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์ ์€ ๋„๊ตฌ์™€ ๋‹จ์ˆœํ•œ ๊ตฌ์กฐ๋ฅผ ์„ ํ˜ธํ•˜๋Š” ๋ฐ˜๋ฉด, ๋Œ€๊ทœ๋ชจ ํŒ€์€ ๋ณต์žก์„ฑ์„ ์ œ์–ดํ•˜๊ณ  ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์—„๊ฒฉํ•œ ํŒจํ„ด, ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์•„ํ‚คํ…์ฒ˜, ๊ทธ๋ฆฌ๊ณ  ์ž๋™ํ™”๋œ ๊ทœ์น™ ๊ฐ•์ œ๋ฅผ ํ•„์š”๋กœ ํ•ฉ๋‹ˆ๋‹ค [1-4]. - -## ๐Ÿ“– Core ์†Œ Content -* **๋ธŒ๋žœ์นญ ์ „๋žต ๋ฐ ์›Œํฌํ”Œ๋กœ์šฐ (Branching & Workflow):** - * **์†Œ๊ทœ๋ชจ ํŒ€ (2~5๋ช…):** ๋ฌด๊ฑฐ์šด Git-Flow ๋Œ€์‹  ๊ฐ€๋ฒผ์šด ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜(Feature-branch) ์›Œํฌํ”Œ๋กœ์šฐ๋‚˜ ์งง์€ ์ˆ˜๋ช…์˜ ํŠธ๋ ํฌ ๊ธฐ๋ฐ˜ ๊ฐœ๋ฐœ(Trunk-based workflow)์ด ๊ฐ€์žฅ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค [5-7]. ์ด๋Š” ํ”„๋กœ์„ธ์Šค ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ตœ์†Œํ™”ํ•˜๊ณ  ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๋ฉฐ ์ฝ”๋“œ์˜ ์•ˆ์ •์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๋ฐ ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค [1, 8, 9]. - * **๋Œ€๊ทœ๋ชจ ํŒ€:** ์†Œ๊ทœ๋ชจ ํŒ€์—๊ฒŒ๋Š” ๋ฌด๊ฒ๊ฒŒ ๋А๊ปด์ง€๋Š” Git-Flow ๊ฐ™์€ ์ „๋žต์ด, ์ •ํ•ด์ง„ ๋ฆด๋ฆฌ์Šค ์ผ์ •์„ ๊ฐ€์ง„ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ๋‚˜ ๋Œ€๊ทœ๋ชจ ํŒ€์—์„œ๋Š” ์œ ์šฉํ•œ ๊ตฌ์กฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [1]. - -* **์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ์˜ ์„ ํƒ (State Management):** - * **์†Œ๊ทœ๋ชจ ๋ฐ ์ค‘๊ทœ๋ชจ ํŒ€ (5~15๋ช…):** Zustand์™€ ๊ฐ™์ด ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ๊ฐ€ ์ ๊ณ  ์œ ์—ฐํ•˜๋ฉฐ ๊ฐ€๋ฒผ์šด ๋„๊ตฌ๊ฐ€ "๊ณจ๋””๋ฝ์Šค(Goldilocks)" ์†”๋ฃจ์…˜์œผ๋กœ ์ž‘์šฉํ•˜์—ฌ ๋น ๋ฅธ ์ œํ’ˆ ์ถœ์‹œ(MVP)๋ฅผ ๋•์Šต๋‹ˆ๋‹ค [10, 11]. - * **๋Œ€๊ทœ๋ชจ ํŒ€ (10๋ช… ์ด์ƒ):** ํŒ€์ด ์ปค์ง€๋ฉด Zustand์˜ ๋†’์€ ์œ ์—ฐ์„ฑ์€ ๊ฐœ๋ฐœ์ž๋งˆ๋‹ค ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋‚˜ ์ƒํƒœ ๊ด€๋ฆฌ ๋ฐฉ์‹์„ ๋‹ค๋ฅด๊ฒŒ ๊ตฌํ˜„ํ•˜๊ฒŒ ๋งŒ๋“ค์–ด 'ํ†ตํ•ฉ์˜ ํ˜ผ๋ž€(integration chaos)'์„ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3, 12]. ๋Œ€๊ทœ๋ชจ ํŒ€์—์„œ๋Š” ๊ฐ•๋ ฅํ•œ ํŒจํ„ด์„ ๊ฐ•์ œํ•˜๋Š” Redux๊ฐ€ ์‚ฐ์—… ํ‘œ์ค€์ด๋ฉฐ, ์ดˆ๊ธฐ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ๊ฐ€ ์˜คํžˆ๋ ค ๋ฒ„๊ทธ๋ฅผ ์žก๊ณ  ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๋Š” '๊ตฌ์กฐ์  ์—ญํ• '์„ ํ•ฉ๋‹ˆ๋‹ค [13-15]. - -* **์•„ํ‚คํ…์ฒ˜ ํ™•์žฅ์„ฑ (Architecture Scalability):** - * **์†Œ๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜:** ํŒŒ์ผ ํƒ€์ž… ๊ธฐ๋ฐ˜(์˜ˆ: components, hooks ๋“ฑ)์˜ ๋‹จ์ˆœํ•œ ๊ณ„์ธตํ˜• ๊ตฌ์กฐ๋‚˜ ํ‰๋ฉด์ (Flat) ๊ตฌ์กฐ๋กœ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [16, 17]. - * **๋Œ€๊ทœ๋ชจ ํŒ€ ๋ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜:** ์ฝ”๋“œ๊ฐ€ ์ปค์ง€๋ฉด ๊ธฐ์กด ๊ตฌ์กฐ๋Š” ์ŠคํŒŒ๊ฒŒํ‹ฐ ์ฝ”๋“œ๋ฅผ ์œ ๋ฐœํ•ฉ๋‹ˆ๋‹ค [18]. ๋Œ€๊ทœ๋ชจ ํŒ€์€ ๊ธฐ๋Šฅ ๋ถ„ํ•  ์„ค๊ณ„(Feature-Sliced Design, FSD)๋ฅผ ํ†ตํ•ด ํŒ€์›๋“ค์ด ์„œ๋กœ ๊ฐ„์„ญํ•˜์ง€ ์•Š๊ณ  ๋…๋ฆฝ์ ์ธ ์Šฌ๋ผ์ด์Šค(Slice) ๋‹จ์œ„๋กœ ๋ณ‘๋ ฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [19, 20]. ๋” ๊ฑฐ๋Œ€ํ•œ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์‹œ์Šคํ…œ์—์„œ๋Š” ํŒ€์˜ ์ž์œจ์„ฑ์„ ์œ„ํ•ด ๋งˆ์ดํฌ๋กœ ํ”„๋ก ํŠธ์—”๋“œ(Micro-Frontends)๋ฅผ ์ฑ„ํƒํ•˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค [21, 22]. - -* **๊ฑฐ๋ฒ„๋„Œ์Šค์™€ ํ˜‘์—… ๊ทœ์น™ (Governance & Standards):** - * ๋Œ€๊ทœ๋ชจ ํŒ€์€ ํ˜‘์—… ์‹œ ํŒŒ์ผ ํƒ์ƒ‰์˜ ํ˜ผ๋ž€์„ ๋ง‰๊ธฐ ์œ„ํ•ด ํŒŒ์ผ/ํด๋” ๋„ค์ด๋ฐ ์ปจ๋ฒค์…˜(์˜ˆ: ์ปดํฌ๋„ŒํŠธ๋Š” PascalCase, ํŒŒ์ผ์€ kebab-case)์„ ์—„๊ฒฉํžˆ ์ค€์ˆ˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [23, 24]. ๋˜ํ•œ, ์•„ํ‚คํ…์ฒ˜ ๊ฒฝ๊ณ„๋ฅผ ์นจ๋ฒ”ํ•˜์ง€ ์•Š๋„๋ก ESLint์™€ Prettier, Husky(Git hooks)๋ฅผ ํ™œ์šฉํ•ด ๊ทœ์น™์„ ์ž๋™ํ™”ํ•˜๊ณ  ๊ฐ•์ œํ•˜๋Š” ๊ฒƒ์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค [24]. - -## โš–๏ธ Trade-offs & Caveats -* **์œ ์—ฐ์„ฑ vs ์ผ๊ด€์„ฑ (Flexibility vs. Consistency):** Zustand์™€ ๊ฐ™์€ ๊ฐ€๋ฒผ์šด ์ƒํƒœ ๊ด€๋ฆฌ๋‚˜ ๋А์Šจํ•œ ํด๋” ๊ตฌ์กฐ๋Š” ์†Œ๊ทœ๋ชจ ํŒ€์—๊ฒŒ ๊ฐœ๋ฐœ ์†๋„๋ฅผ ์ œ๊ณตํ•˜์ง€๋งŒ(์žฅ์ ), ๋Œ€๊ทœ๋ชจ ํŒ€์—์„œ๋Š” ๊ฐ๊ธฐ ๋‹ค๋ฅธ ๊ตฌํ˜„ ๋ฐฉ์‹์œผ๋กœ ์ธํ•ด ์œ ์ง€๋ณด์ˆ˜ ์•…๋ชฝ์„ ์ดˆ๋ž˜ํ•ฉ๋‹ˆ๋‹ค(๋‹จ์ /๋ถ€์ž‘์šฉ) [3, 25]. ๋ฐ˜๋Œ€๋กœ Redux๋‚˜ FSD๋Š” ๋Œ€๊ทœ๋ชจ ํŒ€์˜ ๋””๋ฒ„๊น… ์‹œ๊ฐ„๊ณผ ์ถฉ๋Œ์„ ์ค„์—ฌ์ฃผ์ง€๋งŒ, ์†Œ๊ทœ๋ชจ ํŒ€์—๊ฒŒ๋Š” ๊ณผ๋„ํ•œ ํ•™์Šต ๊ณก์„ ๊ณผ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ(์˜ค๋ฒ„ํ—ค๋“œ)๋กœ ์ž‘์šฉํ•ฉ๋‹ˆ๋‹ค [26-29]. -* **ํ”„๋กœ์„ธ์Šค ์˜ค๋ฒ„ํ—ค๋“œ vs ์•ˆ์ •์„ฑ (Process Overhead vs. Stability):** ์†Œ๊ทœ๋ชจ ํŒ€์€ 1๋ช…์˜ ๋ฆฌ๋ทฐ์–ด์™€ ์Šค์ฟผ์‹œ ๋จธ์ง€(Squash Merge)๋ฅผ ํ™œ์šฉํ•˜๋Š” ๋‹จ์ˆœํ•œ Pull Request ๊ทœ์น™๋งŒ์œผ๋กœ๋„ ์ถฉ๋ถ„ํžˆ ์•ˆ์ •์„ฑ์„ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [30, 31]. ํ•˜์ง€๋งŒ ์กฐ์ง์ด ์ปค์ง€๋ฉด ์ด๋Ÿฌํ•œ ๋‹จ์ˆœํ•œ ๊ทœ์น™๋งŒ์œผ๋กœ๋Š” ๋ณต์žกํ•œ ๋ฆด๋ฆฌ์Šค ๊ด€๋ฆฌ๊ฐ€ ์–ด๋ ค์›Œ์ ธ ๋ฌด๊ฑฐ์šด Git-Flow๋‚˜ ์—„๊ฒฉํ•œ CI/CD ์ œ์•ฝ์ด ํ•„์š”ํ•ด์ง‘๋‹ˆ๋‹ค [1]. -* **์•„ํ‚คํ…์ฒ˜์˜ ๊ณผ๋„ํ•œ ์„ค๊ณ„ (Over-engineering):** ์•„์ฃผ ์ž‘์€ ํ”„๋กœ์ ํŠธ์— FSD๋‚˜ ๋งˆ์ดํฌ๋กœ ํ”„๋ก ํŠธ์—”๋“œ๋ฅผ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์€ ๊ณผ๋„ํ•œ ๋ณต์žก์„ฑ(๋Ÿฐํƒ€์ž„ ์˜ค๋ฒ„ํ—ค๋“œ, ํด๋” ๊ตฌ์กฐ์˜ ์ค‘๋ณต ๋“ฑ)์„ ์œ ๋ฐœํ•˜๋Š” ๋ฐ˜๋ฉด, ์„ฑ์žฅ์ด ์˜ˆ์ƒ๋˜๋Š” ์•ฑ์—์„œ ์ดˆ๊ธฐ ์„ค๊ณ„๋ฅผ ๊ฐ„๊ณผํ•˜๋ฉด ๋‚˜์ค‘์— ๋ฆฌํŒฉํ† ๋ง์ด๋ผ๋Š” ํฐ ๊ธฐ์ˆ  ๋ถ€์ฑ„๋ฅผ ๋– ์•ˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค [21, 29]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -#### [์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] -- [[Feature-Sliced Design]] - - ์—ฐ๊ฒฐ ์ด์œ : ๋Œ€๊ทœ๋ชจ ๋ž™ํŠธ(React) ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ๊ณผ ๊ธฐ๋Šฅ ๋‹จ์œ„๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ๋ถ„ํ• ํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜ ๋ฐฉ๋ฒ•๋ก ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [32, 33]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋Œ€๊ทœ๋ชจ ํŒ€์ด ์–ด๋–ป๊ฒŒ ์„œ๋กœ ์ฝ”๋“œ ์ถฉ๋Œ ์—†์ด ๋…๋ฆฝ์ ์ธ ๊ธฐ๋Šฅ(Slice)์„ ๋ณ‘๋ ฌ๋กœ ๊ฐœ๋ฐœํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [20]. -- [[Micro-Frontends]] - - ์—ฐ๊ฒฐ ์ด์œ : ๋Œ€๊ทœ๋ชจ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์‹œ์Šคํ…œ์—์„œ ํŒ€ ๋‹จ์œ„์˜ ์™„์ „ํ•œ ์ž์œจ์„ฑ๊ณผ ๋…๋ฆฝ์  ๋ฐฐํฌ๋ฅผ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ์•„ํ‚คํ…์ฒ˜์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [21, 22]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋Œ€๊ทœ๋ชจ ์กฐ์ง ํ™•์žฅ์— ๋”ฐ๋ฅธ ์•„ํ‚คํ…์ฒ˜ ์„ ํƒ์˜ ํ•œ๊ณ„์™€, ๊ทธ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ๋Ÿฐํƒ€์ž„ ํ†ตํ•ฉ ๋ฐ ์„ฑ๋Šฅ ์˜ค๋ฒ„ํ—ค๋“œ์˜ Trade-off๋ฅผ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [21]. - -#### [๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ] -- [[Redux]] vs [[Zustand]] - - ์—ฐ๊ฒฐ ์ด์œ : ํŒ€์˜ ๊ทœ๋ชจ(5~15๋ช… vs 10๋ช… ์ด์ƒ)์— ๋”ฐ๋ผ ๊ฐ€์žฅ ๊ทน๋ช…ํ•˜๊ฒŒ ์„ ํƒ์ด ๊ฐˆ๋ฆฌ๋Š” ์ƒํƒœ ๊ด€๋ฆฌ ํŒจ๋Ÿฌ๋‹ค์ž„์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [10, 14]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ๊ฐ€ ์†Œ๊ทœ๋ชจ ํŒ€์—๊ฒŒ๋Š” ์ง์ด ๋˜์ง€๋งŒ, ๋Œ€๊ทœ๋ชจ ํŒ€์—์„œ๋Š” ์–ด๋–ป๊ฒŒ ๋ฒ„๊ทธ๋ฅผ ์˜ˆ๋ฐฉํ•˜๊ณ  ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๋Š” '๊ตฌ์กฐ์  ์•ˆ์ „๋ง'์ด ๋˜๋Š”์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [14, 15]. -- [[Feature Branch Workflow]] - - ์—ฐ๊ฒฐ ์ด์œ : 2~5์ธ ๊ทœ๋ชจ์˜ ์†Œ๊ทœ๋ชจ ํŒ€์—๊ฒŒ ๊ฐ€์žฅ ๊ถŒ์žฅ๋˜๋ฉฐ, ๋ณต์žกํ•œ Git-Flow๋ฅผ ํ”ผํ•˜๋ฉด์„œ๋„ ์ฝ”๋“œ๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” ๋ธŒ๋žœ์นญ ์ „๋žต์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [1, 7, 34]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํŒ€์ด ์ž‘์„ ๋•Œ ํ•„์ˆ˜์ ์ธ ์ตœ์†Œํ•œ์˜ ์ฝ”๋“œ ๋ฆฌ๋ทฐ, ๋ธŒ๋žœ์น˜ ์ƒ๋ช… ์ฃผ๊ธฐ ๊ด€๋ฆฌ, ๊ทธ๋ฆฌ๊ณ  ๋จธ์ง€ ์ „๋žต(Squash Merge)์„ ํ•™์Šตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [30]. - -### Deeper Research Questions -- ์†Œ๊ทœ๋ชจ ํŒ€์—์„œ Zustand๋ฅผ ์‚ฌ์šฉํ•˜๋‹ค๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ํŒ€ ๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ ๋•Œ(Scaleup), Redux๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•ด์•ผ ํ•˜๋Š” ๊ธฐ์ˆ ์  ์ž„๊ณ„์ (Technical Wall)์„ ์–ด๋–ป๊ฒŒ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? -- ๋Œ€๊ทœ๋ชจ ํŒ€ ํ™˜๊ฒฝ์—์„œ Feature-Sliced Design(FSD)์˜ ๊ณ„์ธต(Layer) ๊ฐ„ ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ๊ทœ์น™์„ ์œ„๋ฐ˜ํ•˜์ง€ ์•Š๋„๋ก, ESLint ๋“ฑ ์ž๋™ํ™” ๋„๊ตฌ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌ์ฒด์ ์œผ๋กœ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? -- Git-Flow๊ฐ€ ๋Œ€๊ทœ๋ชจ ํŒ€์— ์ ํ•ฉํ•˜๋‹ค๊ณ  ์•Œ๋ ค์ ธ ์žˆ์œผ๋‚˜, ํŠธ๋ ํฌ ๊ธฐ๋ฐ˜ ๊ฐœ๋ฐœ(Trunk-Based Development)์„ ๋Œ€๊ทœ๋ชจ ํŒ€์— ์•ˆ์ „ํ•˜๊ฒŒ ์ ์šฉํ•˜์—ฌ ํ†ตํ•ฉ ์†๋„๋ฅผ ๋†’์ด๊ธฐ ์œ„ํ•œ CI/CD ํŒŒ์ดํ”„๋ผ์ธ์˜ ํ•„์ˆ˜ ์š”๊ฑด์€ ๋ฌด์—‡์ธ๊ฐ€? -- ๋งˆ์ดํฌ๋กœ ํ”„๋ก ํŠธ์—”๋“œ(Micro-Frontends) ๊ตฌ์กฐ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ํŒ€ ์ž์œจ์„ฑ์˜ ์ด์  ๋Œ€๋น„, ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ ์ €ํ•˜์™€ ํŒŒํŽธํ™”๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋Œ€๊ทœ๋ชจ ํŒ€์ด ๊ฐ–์ถฐ์•ผ ํ•  ์ค‘์•™ ๊ฑฐ๋ฒ„๋„Œ์Šค(Governance) ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? -- ์ƒํƒœ ๊ด€๋ฆฌ ๋กœ์ง(State)๊ณผ UI ์ปดํฌ๋„ŒํŠธ์˜ ๊ฒฐํ•ฉ๋„๊ฐ€ ๋†’์€ ๊ธฐ์กด ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฅผ, ๋Œ€๊ทœ๋ชจ ํŒ€์˜ ํ˜‘์—…์— ์ ํ•ฉํ•œ ๊ตฌ์กฐ(๋‹จ์ผ ์ฑ…์ž„ ์›์น™ ์ค€์ˆ˜)๋กœ ๋ฆฌํŒฉํ† ๋งํ•˜๊ธฐ ์œ„ํ•œ ์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํŒจํ„ด์€ ๋ฌด์—‡์ธ๊ฐ€? - -### Practical Application Contexts -- **Implementation:** ํŒ€์˜ ์ธ์›์ˆ˜์— ๋”ฐ๋ผ ์›Œํฌํ”Œ๋กœ์šฐ์™€ ๋„๊ตฌ๋ฅผ ๋‹ค๋ฅด๊ฒŒ ๋„์ž…ํ•ฉ๋‹ˆ๋‹ค. 3์ธ ํŒ€์ด๋ผ๋ฉด Feature Branch ์›Œํฌํ”Œ๋กœ์šฐ์™€ Zustand๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , 10์ธ ์ด์ƒ์˜ ๋ณต์žกํ•œ ํ”„๋กœ์ ํŠธ๋ผ๋ฉด ์—„๊ฒฉํ•œ ๋„ค์ด๋ฐ ์ปจ๋ฒค์…˜๊ณผ Redux๋ฅผ ๋„์ž…ํ•ฉ๋‹ˆ๋‹ค. -- **System Design:** ์ดˆ๊ธฐ ๋‹จ๊ณ„์˜ ํ”„๋กœ์ ํŠธ๋ผ๋„ ํ–ฅํ›„ ํŒ€์ด ํ™•์žฅ๋  ๊ฒƒ์„ ๊ณ ๋ คํ•˜์—ฌ, ๋‹จ์ˆœํ•œ ํŒŒ์ผ ์œ ํ˜• ๊ธฐ๋ฐ˜ ํด๋” ๊ตฌ์กฐ๋ณด๋‹ค๋Š” ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜(Feature-based) ์กฐ์ง ๊ตฌ์„ฑ์„ ์—ผ๋‘์— ๋‘๊ณ  ์‹œ์Šคํ…œ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์„ค๊ณ„ํ•ด์•ผ ๊ธฐ์ˆ  ๋ถ€์ฑ„๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -- **Operation / Maintenance:** ๋Œ€๊ทœ๋ชจ ํŒ€์—์„œ๋Š” ๊ฐœ๋ฐœ์ž ๊ฐ„ ์ฝ”๋“œ ์Šคํƒ€์ผ ์ถฉ๋Œ๊ณผ ์•„ํ‚คํ…์ฒ˜ ํ›ผ์†์„ ๋ง‰๊ธฐ ์œ„ํ•ด ESLint, Prettier, Husky๋ฅผ ์„ค์ •ํ•˜์—ฌ ์ปค๋ฐ‹ ๋ฐ PR ๋‹จ๊ณ„์—์„œ ์ฝ”๋“œ ํ’ˆ์งˆ ๊ฒ€์ฆ์„ ์ž๋™ํ™”(Operation)ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. -- **Learning Path:** ํ”„๋ก ํŠธ์—”๋“œ ํ•™์Šต์ž๋Š” ๋จผ์ € Context API์™€ ๋‹จ์ˆœํ•œ ํŒŒ์ผ ๊ตฌ์กฐ๋กœ ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์˜ ํ๋ฆ„์„ ์ตํžŒ ๋’ค, ํ˜‘์—… ์‹œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ์ฒด๊ฐํ•˜๋ฉฐ Redux, FSD, CI/CD ์ž๋™ํ™” ๊ฐ™์€ ๋Œ€๊ทœ๋ชจ/์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ํŒจํ„ด์œผ๋กœ ํ•™์Šต์„ ํ™•์žฅํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. -- **My Project Relevance:** ํ˜„์žฌ ์ง„ํ–‰ ์ค‘์ธ, ํ˜น์€ ๊ธฐํš ์ค‘์ธ ํ”„๋กœ์ ํŠธ์˜ ์ฐธ์—ฌ ์ธ์›๊ณผ ํ–ฅํ›„ ์œ ์ง€๋ณด์ˆ˜ ๊ธฐ๊ฐ„์„ ํ‰๊ฐ€ํ•˜์—ฌ ์ดˆ๊ธฐ๋ถ€ํ„ฐ ๋„์ž…ํ•ด์•ผ ํ•  ํˆด(์˜ˆ: ๊ณผ๋„ํ•œ ๊ตฌ์กฐํ™” ๋ฐฉ์ง€ vs ์—„๊ฒฉํ•œ ๊ทœ์น™ ์„ ์ ์šฉ)์„ ๊ฒฐ์ •ํ•˜๋Š” ์ง€ํ‘œ๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - -### Adjacent Topics -- [[Code Governance and Linting]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋Œ€๊ทœ๋ชจ ํŒ€ ํ™˜๊ฒฝ์—์„œ ์‚ฌ๋žŒ์ด ์ผ์ผ์ด ๋ฆฌ๋ทฐํ•˜๊ธฐ ํž˜๋“  ์•„ํ‚คํ…์ฒ˜ ๊ทœ์น™๊ณผ ๋„ค์ด๋ฐ ์ปจ๋ฒค์…˜์„ ์ž๋™ํ™”๋œ ๋„๊ตฌ(ESLint, Git Hooks ๋“ฑ)๋กœ ์–ด๋–ป๊ฒŒ ํ†ต์ œํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š”์ง€ ํƒ๊ตฌํ•ฉ๋‹ˆ๋‹ค. -- [[Technical Debt Management]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ์†Œ๊ทœ๋ชจ ํŒ€ ์‹œ์ ˆ์— ์†๋„๋ฅผ ์œ„ํ•ด ํƒ€ํ˜‘ํ–ˆ๋˜ ์ฝ”๋“œ(์˜ˆ: ์ „์—ญ ์ƒํƒœ์˜ ๋‚จ์šฉ, ๊ฑฐ๋Œ€ํ•œ ์ปดํฌ๋„ŒํŠธ)๋ฅผ ๋Œ€๊ทœ๋ชจ ํŒ€ ๊ตฌ์กฐ์— ๋งž๊ฒŒ ์ ์ง„์ ์œผ๋กœ ๋ฆฌํŒฉํ† ๋งํ•˜๊ณ  ๋ถ„๋ฆฌํ•˜๋Š” ์‹ค๋ฌด์  ์ ‘๊ทผ๋ฒ•์„ ์—ฐ๊ตฌํ•ฉ๋‹ˆ๋‹ค. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/State Management Libraries.md b/00_Raw/State Management Libraries.md deleted file mode 100644 index 15cb2aed..00000000 --- a/00_Raw/State Management Libraries.md +++ /dev/null @@ -1,78 +0,0 @@ -# [[State Management Libraries]] - -## ๐Ÿ“Œ Brief Summary -์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ํ”„๋ก ํŠธ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ปดํฌ๋„ŒํŠธ ๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•˜๊ณ  ๋กœ์ปฌ UI, ๊ธฐ๋Šฅ(Feature), ์—”ํ‹ฐํ‹ฐ ์ƒํƒœ ๋“ฑ ๋‹ค์–‘ํ•œ ํ˜•ํƒœ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒํƒœ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋„๊ตฌ์ด๋‹ค [1, 2]. ๊ณผ๊ฑฐ์˜ ๋‹จ์ผ Redux ์Šคํ† ์–ด ๋ฐฉ์‹์—์„œ ๋ฒ—์–ด๋‚˜, ํ˜„์žฌ๋Š” ๋ชฉ์ ๊ณผ ๋ฐ์ดํ„ฐ ์œ ํ˜•์— ๋”ฐ๋ผ Zustand, Jotai, TanStack Query์™€ ๊ฐ™์ด ํŠนํ™”๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์„ ์กฐํ•ฉํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ํŒŒํŽธํ™”๋œ ์ ‘๊ทผ๋ฒ•์ด ํ‘œ์ค€์œผ๋กœ ์ž๋ฆฌ ์žก๊ณ  ์žˆ๋‹ค [2-4]. ๊ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ํŒ€์˜ ํฌ๊ธฐ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ณต์žก๋„, ๋ Œ๋”๋ง ์„ฑ๋Šฅ ์š”๊ตฌ์‚ฌํ•ญ์— ๋”ฐ๋ผ ๋ช…ํ™•ํ•œ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๋ฅผ ๊ฐ€์ง„๋‹ค [5, 6]. - -## ๐Ÿ“– Core Content - -* **Context API (๋‚ด์žฅ ์ƒํƒœ ๊ณต์œ )** - * React์˜ ๋‚ด์žฅ ์†”๋ฃจ์…˜์œผ๋กœ ์ข…์†์„ฑ์ด ์—†๋Š” ๊ฒƒ์ด ํŠน์ง•์ด๋ฉฐ, 'Prop Drilling' ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋„์ž…๋˜์—ˆ๋‹ค [7, 8]. - * ์ฃผ๋กœ ํ…Œ๋งˆ(๋ผ์ดํŠธ/๋‹คํฌ ๋ชจ๋“œ), ๋กœ์ผ€์ผ, ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ ๋“ฑ ์—…๋ฐ์ดํŠธ ๋นˆ๋„๊ฐ€ ๋‚ฎ๊ณ  ์ •์ ์ธ ์ „์—ญ ์ƒํƒœ๋ฅผ ๊ณต์œ ํ•˜๋Š” ๋ฐ ์ ํ•ฉํ•˜๋‹ค [9, 10]. - * '๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ์‹œ์Šคํ…œ'์ฒ˜๋Ÿผ ์ž‘๋™ํ•˜์—ฌ ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ํ•ด๋‹น ์ปจํ…์ŠคํŠธ๋ฅผ ๊ตฌ๋…ํ•˜๋Š” ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋‹ค์‹œ ๋ Œ๋”๋ง๋˜๋ฏ€๋กœ, ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ณ€๊ฒฝ๋˜๋Š” ์ƒํƒœ ๊ด€๋ฆฌ์—๋Š” ๋ถ€์ ํ•ฉํ•˜๋‹ค [3, 7, 11]. -* **Zustand (๊ฒฝ๋Ÿ‰ ์Šคํ† ์–ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ)** - * Redux์˜ ์žฅ์ ์„ ๊ฐ€์ ธ์˜ค๋ฉด์„œ๋„ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ๋ฅผ ์ค„์ธ ๊ฒฝ๋Ÿ‰ํ™”๋œ ์Šคํ† ์–ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค [12, 13]. - * ์Šคํ† ์–ด๊ฐ€ React ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ ์™ธ๋ถ€์— ๋…๋ฆฝ๋œ ๋ชจ๋“ˆ๋กœ ์กด์žฌํ•˜๋ฉฐ, '์„ ํƒ์ž(Selector) ํŒจํ„ด'์„ ์‚ฌ์šฉํ•ด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ด€์‹ฌ ์žˆ๋Š” ํŠน์ • ์ƒํƒœ ์กฐ๊ฐ์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งŒ ๋ฆฌ๋ Œ๋”๋ง๋˜๋„๋ก ๋ณด์žฅํ•œ๋‹ค [3, 14, 15]. - * ์ปดํฌ๋„ŒํŠธ 50~500๊ฐœ, ๊ฐœ๋ฐœ์ž 5~15๋ช… ๊ทœ๋ชจ์˜ ์ค‘๊ฐ„ ํฌ๊ธฐ ํ”„๋กœ์ ํŠธ์— ๊ฐ€์žฅ ์ ํ•ฉํ•œ ๋„๊ตฌ๋กœ ํ‰๊ฐ€๋ฐ›๋Š”๋‹ค [16]. -* **Redux (์—”ํ„ฐํ”„๋ผ์ด์ฆˆ๊ธ‰ ์ƒํƒœ ์ปจํ…Œ์ด๋„ˆ)** - * ๋ถˆ๋ณ€์„ฑ ์—…๋ฐ์ดํŠธ, ์•ก์…˜ ๋””์ŠคํŒจ์น˜, ๋ฆฌ๋“€์„œ๋ฅผ ๊ฐ–์ถ˜ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ์ƒํƒœ ์ปจํ…Œ์ด๋„ˆ๋กœ, 500๊ฐœ ์ด์ƒ์˜ ์ปดํฌ๋„ŒํŠธ๋‚˜ 10๋ช… ์ด์ƒ์˜ ํŒ€์ด ์ž‘์—…ํ•˜๋Š” ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ํ•„์ˆ˜์ ์ด๋‹ค [17, 18]. - * ๊ณผ๊ฑฐ์—๋Š” ๋ง‰๋Œ€ํ•œ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ๊ฐ€ ๋‹จ์ ์ด์—ˆ์œผ๋‚˜, RTK Query๋ฅผ ํ†ตํ•œ ๊ฐ•๋ ฅํ•œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋„์ž…๊ณผ ํ•จ๊ป˜ ์ผ๊ด€๋œ ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด์„ ๊ฐ•์ œํ•จ์œผ๋กœ์จ ํŒ€ ๋‚ด ํ˜ผ๋ž€์„ ๋ฐฉ์ง€ํ•œ๋‹ค [19, 20]. - * ์ƒํƒœ ์ด๋ ฅ์„ ์ถ”์ ํ•˜๊ณ  ์žฌ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์‹œ๊ฐ„ ์—ฌํ–‰ ๋””๋ฒ„๊น…(Time-travel debugging)์„ ์ง€์›ํ•˜๋Š” ๋“ฑ DevTools ์ƒํƒœ๊ณ„๊ฐ€ ๋งค์šฐ ๊ฐ•๋ ฅํ•˜๋‹ค [19, 21]. -* **์„œ๋ฒ„ ์ƒํƒœ ๊ด€๋ฆฌ (TanStack Query)** - * ์ตœ์‹  ์ƒํƒœ ๊ด€๋ฆฌ ์•„ํ‚คํ…์ฒ˜์—์„œ๋Š” ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ์™€ API์—์„œ ๊ฐ€์ ธ์˜ค๋Š” '์„œ๋ฒ„ ์ƒํƒœ'๋ฅผ ์™„์ „ํžˆ ๋ถ„๋ฆฌํ•œ๋‹ค [3]. - * TanStack Query(React Query)๋Š” ๋„คํŠธ์›Œํฌ ์š”์ฒญ์˜ ์บ์‹ฑ, ๋™๊ธฐํ™”, ๋ฌดํ•œ ์Šคํฌ๋กค, ๋‚™๊ด€์  ์—…๋ฐ์ดํŠธ(Optimistic updates) ๋ฐ ๋กœ๋”ฉ/์—๋Ÿฌ ์‚ฌ์ดํด ์ฒ˜๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•˜์—ฌ ์„œ๋ฒ„ ์ƒํƒœ ๊ด€๋ฆฌ์˜ ์‚ฌ์‹ค์ƒ ํ‘œ์ค€์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค [3, 4, 22]. - -## โš–๏ธ Trade-offs & Caveats -* **Context API์˜ ํ•œ๊ณ„์™€ ๋ฆฌ๋ Œ๋”๋ง ํญํ’ (Re-render Storm)** - * ์ดˆ๊ธฐ ์„ค์ •์ด ์‰ฝ๊ณ  ๋ฒˆ๋“ค ํฌ๊ธฐ๊ฐ€ 0KB๋ผ๋Š” ์ด์ ์ด ์žˆ์œผ๋‚˜, ์ƒํƒœ ๊ฐ์ฒด ๋‚ด์˜ ๋‹จ์ผ ์†์„ฑ๋งŒ ๋ณ€๊ฒฝ๋˜์–ด๋„ ์ด๋ฅผ ๊ตฌ๋…ํ•˜๋Š” **๋ชจ๋“ ** ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ฆฌ๋ Œ๋”๋ง๋˜๋Š” ์น˜๋ช…์ ์ธ ๋ถ€์ž‘์šฉ์ด ์žˆ๋‹ค [7, 11, 23]. ์ด๋กœ ์ธํ•ด ์‹ค์ œ ์ƒ์šฉ ๋Œ€์‹œ๋ณด๋“œ ํ™˜๊ฒฝ์—์„œ ์‹ฌ๊ฐํ•œ ํ™”๋ฉด ๋ฉˆ์ถค ํ˜„์ƒ ๋“ฑ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ๋‹ค [7]. ๋˜ํ•œ ์‹œ๊ฐ„ ์—ฌํ–‰ ๋””๋ฒ„๊น… ๋„๊ตฌ๊ฐ€ ์—†๊ณ  ๋น„๋™๊ธฐ ์ž‘์—… ์‹œ ํด๋กœ์ €(Closure)๊ฐ€ ์˜ค๋ž˜๋œ ์ƒํƒœ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค [21, 24]. -* **Zustand์˜ ์œ ์—ฐ์„ฑ์ด ์ดˆ๋ž˜ํ•˜๋Š” ํŒŒํŽธํ™”** - * ์‚ฌ์šฉ์ด ๋งค์šฐ ์ž์œ ๋กญ๊ณ  ๊ฐ€๋ณ์ง€๋งŒ, Redux์ฒ˜๋Ÿผ ์—„๊ฒฉํ•˜๊ฒŒ ๊ฐ•์ œํ•˜๋Š” ๋ฏธ๋“ค์›จ์–ด ํŒจํ„ด์ด๋‚˜ ์•„ํ‚คํ…์ฒ˜ ๊ทœ์น™์ด ์—†๋‹ค [25, 26]. ํŒ€ ๊ทœ๋ชจ๊ฐ€ ์ปค์ง€๋ฉด ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋‚˜ ์ƒํƒœ ์—…๋ฐ์ดํŠธ ๋ฐฉ์‹์„ ๊ฐœ๋ฐœ์ž๋งˆ๋‹ค ๋‹ค๋ฅด๊ฒŒ ์ž‘์„ฑํ•˜๋Š” 'Store Soup' ํ˜„์ƒ๊ณผ ์ผ๊ด€์„ฑ ๋ถ•๊ดด(Integration Chaos)๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค [25-27]. -* **Redux์˜ ์˜ค๋ฒ„์—”์ง€๋‹ˆ์–ด๋ง** - * ์—„๊ฒฉํ•œ ๊ตฌ์กฐ ๋•๋ถ„์— ๋Œ€๊ทœ๋ชจ ํŒ€์—์„œ ๋ฒ„๊ทธ๋ฅผ ์˜ˆ๋ฐฉํ•˜๊ณ  ์˜ˆ์ธก ๊ฐ€๋Šฅ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์ง€๋งŒ, ์ดˆ๊ธฐ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ์™€ ํ•™์Šต ๊ณก์„ ์ด ๋งค์šฐ ๊ฐ€ํŒŒ๋ฅด๋‹ค [17, 23, 28]. ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ๋‚˜ ๋น ๋ฅธ MVP ๊ฐœ๋ฐœ ๋‹จ๊ณ„์—์„œ ์ฑ„ํƒํ•  ๊ฒฝ์šฐ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๊ฐœ๋ฐœ ์†๋„๋ฅผ ์ €ํ•˜์‹œํ‚ค๋Š” ์˜ค๋ฒ„์—”์ง€๋‹ˆ์–ด๋ง์ด ๋œ๋‹ค [23]. -* **๋ฒˆ๋“ค ํฌ๊ธฐ์— ๋Œ€ํ•œ ์˜คํ•ด** - * ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ ํƒ ์‹œ ๋‹จ์ˆœํžˆ ๋ฒˆ๋“ค ํฌ๊ธฐ(Context 0KB, Zustand 2.2KB, Redux 4.3KB)๋งŒ์„ ๊ธฐ์ค€์œผ๋กœ ์‚ผ๋Š” ๊ฒƒ์€ ์ž˜๋ชป๋œ ์ง€ํ‘œ ์ตœ์ ํ™”์ด๋‹ค [5, 9]. ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์•„๋ผ๋ ค๋‹ค ๋ถ€์ ์ ˆํ•œ ๋„๊ตฌ๋ฅผ ์„ ํƒํ•˜๋ฉด(์˜ˆ: Context๋กœ ๋ณต์žกํ•œ ์ƒํƒœ ๊ด€๋ฆฌ), ์ดํ›„ ๋ฆฌ๋ Œ๋”๋ง ์ตœ์ ํ™”์™€ ๋””๋ฒ„๊น…์— ์ˆ˜์ฃผ์˜ ๊ฐœ๋ฐœ ์‹œ๊ฐ„์„ ๋‚ญ๋น„ํ•˜๊ฒŒ ๋˜๋Š” ์—ญํšจ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค [7, 9]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -#### [๊ด€๊ณ„ ์œ ํ˜• A (์ƒํƒœ ๋ฐ ๋ฐ์ดํ„ฐ ์•„ํ‚คํ…์ฒ˜)] -- [[Server State]] - - ์—ฐ๊ฒฐ ์ด์œ : ํ˜„๋Œ€ ํ”„๋ก ํŠธ์—”๋“œ ์•„ํ‚คํ…์ฒ˜์—์„œ๋Š” ์ „์—ญ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒํƒœ์™€ ์™ธ๋ถ€ API์—์„œ ๊ฐ€์ ธ์˜ค๋Š” ์„œ๋ฒ„ ์ƒํƒœ๋ฅผ ๊ตฌ๋ถ„ํ•˜์—ฌ ๋‹ค๋ฃจ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค [3]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ฐ์ดํ„ฐ๋ฅผ ์บ์‹ฑ, ๋™๊ธฐํ™”, ๋ฌดํšจํ™”ํ•˜๋Š” ๊ณผ์ •์ด ์ˆœ์ˆ˜ ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ ๊ด€๋ฆฌ์™€ ์–ด๋–ป๊ฒŒ ๋ณธ์งˆ์ ์œผ๋กœ ๋‹ค๋ฅธ์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค [3, 22]. -- [[Local State]] - - ์—ฐ๊ฒฐ ์ด์œ : ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋„์ž…ํ•˜๋”๋ผ๋„, ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์— ๊ตญํ•œ๋œ ์ƒํƒœ(์˜ˆ: UI ํ† ๊ธ€, ํผ ์ž…๋ ฅ๊ฐ’ ๋“ฑ)๋Š” ์—ฌ์ „ํžˆ `useState` ๋“ฑ์œผ๋กœ ๊ด€๋ฆฌ๋˜์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค [1, 2]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ์ „์—ญ ์Šคํ† ์–ด์— ๋„ฃ๊ณ  ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ์ปฌ์— ๋‚จ๊ฒจ๋‘์–ด์•ผ ํ•˜๋Š”์ง€(์ƒํƒœ ์†Œ์œ ๊ถŒ ๊ฒฝ๊ณ„)๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ ๋Šฅ๋ ฅ [1, 29]. - -#### [๊ด€๊ณ„ ์œ ํ˜• B (์„ฑ๋Šฅ ๋ฐ ์ตœ์ ํ™” ๋ฉ”์ปค๋‹ˆ์ฆ˜)] -- [[Selector Pattern]] - - ์—ฐ๊ฒฐ ์ด์œ : Zustand์™€ ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ Context API์˜ ๋ฆฌ๋ Œ๋”๋ง ํญํ’ ๋ฌธ์ œ๋ฅผ ๊ทน๋ณตํ•˜๋Š” ํ•ต์‹ฌ ๊ธฐ์ˆ ์  ์›๋ฆฌ์ด๋‹ค [3, 15]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ž์‹ ์ด ํ•„์š”๋กœ ํ•˜๋Š” ํŠน์ • ์ƒํƒœ ์กฐ๊ฐ(Slice)๋งŒ์„ ๋ช…์‹œ์ ์œผ๋กœ ๊ตฌ๋…ํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง์„ ์ฐจ๋‹จํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜ [11, 15]. -- [[Prop Drilling]] - - ์—ฐ๊ฒฐ ์ด์œ : ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ Context API๊ฐ€ ํ”„๋ก ํŠธ์—”๋“œ ์ƒํƒœ๊ณ„์— ๋“ฑ์žฅํ•˜๊ฒŒ ๋œ ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ œ ์ƒํ™ฉ์ด๋‹ค [8]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ƒํƒœ๋ฅผ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š๋Š” ์ค‘๊ฐ„ ์ปดํฌ๋„ŒํŠธ๋“ค์„ ๊ฑฐ์ณ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฐํ•ฉ๋„ ์ฆ๊ฐ€ ๋ฌธ์ œ์™€ ์œ ์ง€๋ณด์ˆ˜์˜ ์–ด๋ ค์›€ [8]. - -### Deeper Research Questions - -- Zustand์˜ ์„ ํƒ์ž(Selector) ํŒจํ„ด์€ ๋‚ด๋ถ€์ ์œผ๋กœ React์˜ ๋ Œ๋”๋ง ์‚ฌ์ดํด๊ณผ ์–ด๋–ป๊ฒŒ ๋ถ„๋ฆฌ๋˜์–ด ๋™์ž‘ํ•˜๋ฉฐ, ์ •ํ™•ํžˆ ์–ด๋–ค ์›๋ฆฌ๋กœ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ์ฐจ๋‹จํ•˜๋Š”๊ฐ€? -- TanStack Query(์„œ๋ฒ„ ์ƒํƒœ)์™€ Zustand/Redux(ํด๋ผ์ด์–ธํŠธ ์ „์—ญ ์ƒํƒœ)๋ฅผ ํ˜ผํ•ฉํ•˜์—ฌ ์‚ฌ์šฉํ•  ๋•Œ, ๋‘ ์ƒํƒœ ์˜์—ญ ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™” ๋ฐ ์˜์กด์„ฑ ๊ด€๋ฆฌ๋Š” ์–ด๋–ค ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด์œผ๋กœ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š”๊ฐ€? -- ๋Œ€๊ทœ๋ชจ ํŒ€์—์„œ Redux์˜ ์—„๊ฒฉํ•œ ๊ตฌ์กฐ(Action, Reducer, RTK Query)๊ฐ€ ๋น„๋™๊ธฐ ๋กœ์ง์˜ ์ผ๊ด€์„ฑ์„ ์–ด๋–ป๊ฒŒ ๊ฐ•์ œํ•˜๋ฉฐ, ์ด๊ฒƒ์ด Zustand์˜ ์ž์œ ๋„์™€ ๋น„๊ตํ•˜์—ฌ ์œ ์ง€๋ณด์ˆ˜์„ฑ ์ธก๋ฉด์—์„œ ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ค ์ด์ ์„ ์ œ๊ณตํ•˜๋Š”๊ฐ€? -- Context API์™€ Zustand๋ฅผ ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์—์„œ ๊ฒฐํ•ฉํ•˜์—ฌ(์˜ˆ: ์ •์  ํ…Œ๋งˆ๋Š” Context, ๋™์  ๋ฐ์ดํ„ฐ๋Š” Zustand) ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ํ˜•ํƒœ๋กœ ๊ตฌ์„ฑํ•  ๋•Œ ๊ณ ๋ คํ•ด์•ผ ํ•  ์ตœ์ ํ™” ๋ฐ ๊ตฌ์กฐ์  ํ•œ๊ณ„๋Š” ๋ฌด์—‡์ธ๊ฐ€? -- ํ”„๋ก ํŠธ์—”๋“œ ์•„ํ‚คํ…์ฒ˜๋ก (์˜ˆ: Feature-Sliced Design)์„ ์ ์šฉํ•  ๋•Œ, ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์Šคํ† ์–ด(Store) ์ฝ”๋“œ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์–ด๋А ๊ณ„์ธต(Layer)์— ๋ฐฐ์น˜ํ•ด์•ผ ๊ธฐ๋Šฅ ๊ฐ„ ๊ฒฐํ•ฉ๋„๋ฅผ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? - -### Practical Application Contexts - -- **Implementation:** ์ •์ ์ธ ์„ค์ •(ํ…Œ๋งˆ, ๋‹ค๊ตญ์–ด ์„ค์ •)์€ ๋ณ„๋„์˜ ์ข…์†์„ฑ์ด ์—†๋Š” Context API๋กœ ๊ตฌํ˜„ํ•˜๊ณ , ์žฅ๋ฐ”๊ตฌ๋‹ˆ๋‚˜ ์•Œ๋ฆผ ์‹œ์Šคํ…œ์ฒ˜๋Ÿผ ๋นˆ๋ฒˆํ•˜๊ฒŒ ์—…๋ฐ์ดํŠธ๋˜๋Š” ๋™์  ๋ฐ์ดํ„ฐ๋Š” ์„ฑ๋Šฅ์„ ์œ„ํ•ด Zustand๋‚˜ Redux๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ๋ถ„๋ฆฌ ์ ์šฉํ•œ๋‹ค [30, 31]. -- **System Design:** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํƒœ๋ฅผ ๋ถ„์„ํ•˜์—ฌ ๋กœ์ปฌ UI ์ƒํƒœ, ๊ธฐ๋Šฅ(Feature) ์ƒํƒœ, ์ „์—ญ ์ธํ”„๋ผ ์ƒํƒœ๋กœ ๋ช…ํ™•ํžˆ ๋ถ„๋ฅ˜ํ•˜๊ณ , ๊ฐ ๋ฐ์ดํ„ฐ์˜ ์„ฑ๊ฒฉ์— ๋งž๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฑ„ํƒํ•˜๋„๋ก ์•„ํ‚คํ…์ฒ˜ ๊ฒฝ๊ณ„๋ฅผ ์„ค๊ณ„ํ•œ๋‹ค [1, 32]. -- **Operation / Maintenance:** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ค‘๊ฐ„ ๊ทœ๋ชจ์ผ ๋•Œ๋Š” Zustand๋กœ ๋น ๋ฅด๊ฒŒ ๊ธฐ๋Šฅ์„ ๋ฐฐํฌ(MVP)ํ•˜๋˜, ํ”„๋กœ์ ํŠธ๊ฐ€ ๋Œ€๊ทœ๋ชจ๋กœ ์„ฑ์žฅํ•˜๊ณ  ๋น„๋™๊ธฐ ์ƒํƒœ๊ฐ€ ๋ณต์žกํ•ด์ ธ ํ•œ๊ณ„์— ๋ถ€๋”ชํžˆ๋ฉด ์œ ์ง€๋ณด์ˆ˜์™€ ๋””๋ฒ„๊น…์„ ์œ„ํ•ด Redux๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ํƒ€์ด๋ฐ์„ ์šด์˜ ์ธก๋ฉด์—์„œ ๊ณ„ํšํ•œ๋‹ค [27, 33]. -- **Learning Path:** React์˜ ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ๋จผ์ € Context API๋ฅผ ํ•™์Šตํ•˜๊ณ  ์ง์ ‘์ ์ธ ํ•œ๊ณ„(๋ฆฌ๋ Œ๋”๋ง ๋ฌธ์ œ)๋ฅผ ๊ฒช์–ด๋ณธ ํ›„, ์™ธ๋ถ€ ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ์ธ Zustand๋‚˜ Redux๋กœ ๋‚˜์•„๊ฐ€๋Š” ์ˆœ์ฐจ์  ํ•™์Šต์ด ๊ฐœ๋… ํŒŒ์•…์— ํšจ๊ณผ์ ์ด๋‹ค [34]. -- **My Project Relevance:** ํ˜„์žฌ ์ง„ํ–‰ ์ค‘์ธ ํ”„๋กœ์ ํŠธ๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•  ๋•Œ, ์„œ๋ฒ„ ํ†ต์‹  ๋ฐ์ดํ„ฐ๋Š” TanStack Query๋ฅผ ๋„์ž…ํ•˜์—ฌ ๋กœ๋”ฉ/์—๋Ÿฌ/์บ์‹ฑ์„ ์œ„์ž„ํ•˜๊ณ , ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ๋Š” ๋ถˆํ•„์š”ํ•œ Context ๋Œ€์‹  Zustand๋ฅผ ๋„์ž…ํ•ด ๋ Œ๋”๋ง ์„ฑ๋Šฅ๊ณผ ์ฝ”๋“œ๋ฅผ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค [4, 35]. - -### Adjacent Topics - -- [[Feature-Sliced Design]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ์ „์—ญ ์ƒํƒœ์˜ ์˜์กด์„ฑ์„ ์ค„์ด๊ณ , ๊ธฐ๋Šฅ(Feature)๊ณผ ๋„๋ฉ”์ธ๋ณ„๋กœ ์ฝ”๋“œ์™€ ์ƒํƒœ ๋กœ์ง์„ ๋ชจ๋“ˆํ™”ํ•˜์—ฌ ํ™•์žฅ์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•˜๋Š” ํ”„๋ก ํŠธ์—”๋“œ ์ „์šฉ ์•„ํ‚คํ…์ฒ˜ ๋ฐฉ๋ฒ•๋ก  ํƒ๊ตฌ [36, 37]. -- [[React Performance Profiling]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ต์ฒด ์ „ํ›„์˜ ๋ฆฌ๋ Œ๋”๋ง ํšŸ์ˆ˜์™€ ๋ Œ๋”๋ง ์‹œ๊ฐ„์„ React DevTools Profiler๋‚˜ why-did-you-render ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ด ์ˆ˜์น˜์ ์œผ๋กœ ์‹œ๊ฐํ™”ํ•˜๊ณ  ์ตœ์ ํ™”ํ•˜๋Š” ๊ธฐ๋ฒ• ํ•™์Šต [7, 38, 39]. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Storybook Component Testing.md b/00_Raw/Storybook Component Testing.md deleted file mode 100644 index 2827c708..00000000 --- a/00_Raw/Storybook Component Testing.md +++ /dev/null @@ -1,66 +0,0 @@ -# [[Storybook Component Testing]] - -## ๐Ÿ“Œ Brief ์‹œ Summary -Storybook ์ปดํฌ๋„ŒํŠธ ํ…Œ์ŠคํŠธ๋Š” ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋…๋ฆฝ์ ์ธ ํ™˜๊ฒฝ์—์„œ ๊ตฌ์ถ•ํ•˜๊ณ  ์‹œ๊ฐ์  ํšŒ๊ท€(Visual Regression) ๋ฐ ์ ‘๊ทผ์„ฑ(Accessibility)์„ ์ž๋™ํ™”ํ•˜์—ฌ ๊ฒ€์ฆํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก ์ž…๋‹ˆ๋‹ค [1-3]. ์‹ค์ œ ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์—์„œ ๋ Œ๋”๋ง๋œ ์ปดํฌ๋„ŒํŠธ์˜ ์Šค๋ƒ…์ƒท์„ ์บก์ฒ˜ํ•˜์—ฌ ๊ธฐ์กด์˜ '์ •์ƒ' ๊ธฐ์ค€์„ (baseline)๊ณผ ๋น„๊ตํ•จ์œผ๋กœ์จ, ์˜๋„์น˜ ์•Š์€ UI ๋ณ€๊ฒฝ์ด๋‚˜ ์ ‘๊ทผ์„ฑ ์œ„๋ฐ˜์„ Pull Request(PR) ๋‹จ๊ณ„์—์„œ ์ฆ‰๊ฐ์ ์œผ๋กœ ์žก์•„๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2-5]. ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ ์Šคํ† ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์‹œ๊ฐ์  ํ”ฝ์…€ ๋ณ€๊ฒฝ์„ ๊ฒ€์ฆํ•˜๋ฏ€๋กœ, ์ฝ”๋“œ ์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ๋ฆฌ๋ทฐ ํšจ์œจ์„ฑ์„ ํฌ๊ฒŒ ๋†’์—ฌ์ค๋‹ˆ๋‹ค [3]. - -## ๐Ÿ“– Core Content -* **์ปดํฌ๋„ŒํŠธ ๊ฒฉ๋ฆฌ ๋ฐ ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ(Visual Testing):** - Storybook์€ ๊ฐœ๋ฐœ์ž๊ฐ€ UI ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค [1]. ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ๋Š” Storybook์˜ ๊ฐ ์Šคํ† ๋ฆฌ๋ฅผ ์‹ค์ œ ๋ธŒ๋ผ์šฐ์ €(Chrome, Safari, Firefox ๋“ฑ)์—์„œ ๋ Œ๋”๋งํ•œ ํ›„ ํ”ฝ์…€ ๋‹จ์œ„๋กœ ์บก์ฒ˜ํ•˜์—ฌ ๊ธฐ์กด ๊ธฐ์ค€์„ ๊ณผ ๋น„๊ตํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค [2, 3]. HTML ๋งˆํฌ์—… ๋ธ”๋กญ(blob)์„ ๋น„๊ตํ•˜๋Š” ๊ธฐ์กด์˜ ์Šค๋ƒ…์ƒท ํ…Œ์ŠคํŠธ(Snapshot testing)์™€ ๋‹ฌ๋ฆฌ, ์‚ฌ์šฉ์ž๊ฐ€ ์‹ค์ œ๋กœ ๊ฒฝํ—˜ํ•˜๋Š” ํ”ฝ์…€์„ ํ…Œ์ŠคํŠธํ•˜๋ฏ€๋กœ ๊ฑฐ์ง“ ์–‘์„ฑ(false positive)์„ ์ค„์ด๊ณ  ๋ณด๋‹ค ์ •ํ™•ํ•œ ๊ฒ€์ฆ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค [6]. -* **์ธํ„ฐ๋ž™์…˜ ํ…Œ์ŠคํŠธ(Interaction Testing)์™€์˜ ๊ฒฐํ•ฉ:** - ์ธํ„ฐ๋ž™์…˜ ํ…Œ์ŠคํŠธ๋Š” ์ด๋ฒคํŠธ, ์ƒํƒœ, ์ ‘๊ทผ์„ฑ ๋“ฑ ์ปดํฌ๋„ŒํŠธ์˜ ๋™์ž‘(behavior)์„ ๊ฒ€์ฆํ•˜๋Š” ๋ฐ˜๋ฉด, ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ๋Š” ๋ ˆ์ด์•„์›ƒ, ์ƒ‰์ƒ, ํƒ€์ดํฌ๊ทธ๋ž˜ํ”ผ ๋“ฑ์˜ ์™ธ๊ด€(appearance)์„ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค [7]. ์ธํ„ฐ๋ž™์…˜ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด ๋กœ๋”ฉ, ์—๋Ÿฌ, ํ˜ธ๋ฒ„ ๋“ฑ์˜ ๋‹ค์–‘ํ•œ UI ์ƒํƒœ๋ฅผ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•œ ํ›„, ๊ฐ ์ƒํƒœ์— ๋Œ€ํ•ด ์‹œ๊ฐ์  ์Šค๋ƒ…์ƒท์„ ์ดฌ์˜ํ•จ์œผ๋กœ์จ ๋™์ž‘๊ณผ ์‹œ๊ฐ์  ๊ฒ€์ฆ์„ ํ•˜๋‚˜์˜ ์›Œํฌํ”Œ๋กœ์šฐ๋กœ ๊ฒฐํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [8, 9]. -* **์ ‘๊ทผ์„ฑ(Accessibility) ํšŒ๊ท€ ํ…Œ์ŠคํŠธ:** - ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ์ถ”๊ฐ€์ ์ธ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ ์—†์ด ์ ‘๊ทผ์„ฑ ํšŒ๊ท€ ํ…Œ์ŠคํŠธ๋ฅผ ํ•จ๊ป˜ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์‹œ๊ฐ์  ๋ณ€๊ฒฝ ์‚ฌํ•ญ๊ณผ ํ•จ๊ป˜ ์ƒˆ๋กœ์šด ์ ‘๊ทผ์„ฑ ์œ„๋ฐ˜ ์‚ฌํ•ญ์„ ๋™์‹œ์— ํฌ์ฐฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [8, 9]. -* **ํ”Œ๋žซํผ ๋ฐ ๋„๊ตฌ ์ƒํƒœ๊ณ„:** - Storybook์€ Chromatic(Storybook ๋ฉ”์ธํ…Œ์ด๋„ˆ๊ฐ€ ๋งŒ๋“  ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค)์ด๋‚˜ Happo์™€ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ํ†ตํ•ด ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ๋ฅผ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค [2, 3]. ์ด๋“ค ๋„๊ตฌ๋Š” ๋ณ‘๋ ฌ ํ…Œ์ŠคํŠธ, ๋‹ค์–‘ํ•œ ๋ทฐํฌํŠธ ํฌ๊ธฐ ์ง€์›, ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ œ๊ฑฐ ๋ฐ ๋น„๋™๊ธฐ ์—์…‹ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์—ฌ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค [2, 4]. - -## โš–๏ธ Trade-offs & Caveats -* **ํ…Œ์ŠคํŠธ์˜ ๋ถˆ์•ˆ์ •์„ฑ(Flakiness) ๋ฐ ๋…ธ์ด์ฆˆ:** - ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ๋Š” ๋ Œ๋”๋ง๋œ ํ”ฝ์…€์„ ๋น„๊ตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฏธ์ง€ ์••์ถ•, ์•ˆํ‹ฐ์•จ๋ฆฌ์–ด์‹ฑ(anti-aliasing), ์• ๋‹ˆ๋ฉ”์ด์…˜, ๋น„๋™๊ธฐ ํฐํŠธ ๋ฐ ์—์…‹ ๋กœ๋”ฉ ๋“ฑ์œผ๋กœ ์ธํ•ด ๋ฏธ์„ธํ•œ ํ”ฝ์…€ ์ฐจ์ด๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [4, 10]. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋„๊ตฌ ์ž์ฒด์—์„œ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์Œ์†Œ๊ฑฐ(silence)ํ•˜๊ฑฐ๋‚˜, ์‹œ๊ฐ์  ๋ณ€๊ฒฝ์— ๋Œ€ํ•œ '์ƒ‰์ƒ-๋ธํƒ€ ํ—ˆ์šฉ ์˜ค์ฐจ(color-delta tolerance)'๋ฅผ ์„ค์ •ํ•˜์—ฌ ์‚ฌ์†Œํ•œ ์ฐจ์ด๋ฅผ ๋ฌด์‹œํ•˜๋„๋ก ๊ตฌ์„ฑํ•ด์•ผ ํ•˜๋Š” ์ œ์•ฝ์ด ์žˆ์Šต๋‹ˆ๋‹ค [4, 9, 10]. -* **ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค ์˜์กด๋„:** - Chromatic์ด๋‚˜ Happo์™€ ๊ฐ™์€ ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ ๋„๊ตฌ๋Š” ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ์—์„œ ์‹ค์ œ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๊ตฌ๋™ํ•˜์—ฌ ์บก์ฒ˜๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฏ€๋กœ, ์ด๋ฅผ ์ž๋™ํ™” ์›Œํฌํ”Œ๋กœ์šฐ(CI/CD)์— ์—ฐ๋™ํ•˜๊ณ  ์ตœ์ ์˜ ์„ฑ๋Šฅ์„ ์–ป๊ธฐ ์œ„ํ•ด ์™ธ๋ถ€ ์„œ๋น„์Šค ๊ฐ€์ž… ๋ฐ ์ธ์ฆ ํ† ํฐ(Environment variables) ๊ด€๋ฆฌ๊ฐ€ ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค [5, 11]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -#### [ํ…Œ์ŠคํŠธ ์œ ํ˜• ๋ฐ ๋ฐฉ๋ฒ•๋ก  (Testing Types & Methodologies)] -- [[Visual Regression Testing]] - - ์—ฐ๊ฒฐ ์ด์œ : Storybook ์ปดํฌ๋„ŒํŠธ ํ…Œ์ŠคํŠธ์˜ ํ•ต์‹ฌ ์›๋ฆฌ๋กœ, ์ฝ”๋“œ ๋ณ€๊ฒฝ ์ „ํ›„์˜ UI ํ”ฝ์…€ ๋ Œ๋”๋ง ๊ฒฐ๊ณผ๋ฅผ ๋น„๊ตํ•˜๋Š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค [2, 6]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: HTML ๋งˆํฌ์—…๋งŒ ๋น„๊ตํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ํ•œ๊ณ„์ ์„ ๊ทน๋ณตํ•˜๊ณ , ์‹ค์ œ ์‚ฌ์šฉ์ž๊ฐ€ ๋ณด๋Š” ํ™”๋ฉด์˜ ๊ฒฐํ•จ์„ ์–ด๋–ป๊ฒŒ ์ถ”์ ํ•˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -- [[Snapshot Testing]] - - ์—ฐ๊ฒฐ ์ด์œ : ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ์™€ ์ž์ฃผ ๋น„๊ต๋˜๋Š” ํ…Œ์ŠคํŠธ ๋ฐฉ์‹์œผ๋กœ, ์ฃผ๋กœ ๋ Œ๋”๋ง๋œ ๋งˆํฌ์—…(HTML ๋ธ”๋กญ)์„ ์ €์žฅํ•˜๊ณ  ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค [6]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์‹œ๊ฐ์ ์œผ๋กœ๋Š” ๋ณ€๊ฒฝ์ด ์—†์ง€๋งŒ ์ฝ”๋“œ ๊ตฌ์กฐ๊ฐ€ ๋ฐ”๋€Œ์—ˆ์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๊ฑฐ์ง“ ์–‘์„ฑ(false positive) ์˜ค๋ฅ˜์˜ ์›์ธ์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -- [[Interaction Testing]] - - ์—ฐ๊ฒฐ ์ด์œ : Storybook ๋‚ด์—์„œ ์ปดํฌ๋„ŒํŠธ์˜ ํŠน์ • ์ด๋ฒคํŠธ๋‚˜ ์ƒํƒœ(์˜ˆ: ํด๋ฆญ, ์ž…๋ ฅ, ํ˜ธ๋ฒ„ ๋“ฑ)๋ฅผ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜๋Š” ํ…Œ์ŠคํŠธ์ž…๋‹ˆ๋‹ค [7, 8]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ปดํฌ๋„ŒํŠธ์˜ ๋ณต์žกํ•œ ๋™์ž‘ ์ƒํƒœ๋ฅผ ๋จผ์ € ๊ตฌํ˜„ํ•œ ๋’ค ๊ทธ ๊ฒฐ๊ด๊ฐ’์— ๋Œ€ํ•œ ์‹œ๊ฐ์  ์Šค๋ƒ…์ƒท์„ ์ฐ๋Š” ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - -#### [ํ…Œ์ŠคํŠธ ๋ฐ ๋ฐฐํฌ ๋„๊ตฌ (Tools & Infrastructure)] -- [[Chromatic]] / [[Happo]] - - ์—ฐ๊ฒฐ ์ด์œ : Storybook์˜ ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ ๋ฐ ์ ‘๊ทผ์„ฑ ๊ฒ€์ฆ์„ ์‹ค์ œ ํฌ๋กœ์Šค ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์—์„œ ์ž๋™ํ™”ํ•ด ์ฃผ๋Š” ๋Œ€ํ‘œ์ ์ธ ์„œ๋น„์Šค ๋ฐ ํ”Œ๋Ÿฌ๊ทธ์ธ์ž…๋‹ˆ๋‹ค [2, 3]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํ—ˆ์šฉ ์˜ค์ฐจ(tolerance) ์„ค์ •, ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ œ์–ด ๋“ฑ ํ…Œ์ŠคํŠธ ๋…ธ์ด์ฆˆ๋ฅผ ์ค„์ด๋Š” ์‹ค๋ฌด์ ์ธ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -- [[CI/CD Integration]] - - ์—ฐ๊ฒฐ ์ด์œ : Storybook ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ๋Š” GitHub, GitLab, CircleCI ๋“ฑ์˜ CI ํŒŒ์ดํ”„๋ผ์ธ์— ํ†ตํ•ฉ๋˜์–ด PR ๋‹จ๊ณ„์—์„œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค [4, 5]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํ”„๋ก ํŠธ์—”๋“œ ํŒ€์ด ์ฝ”๋“œ๋ฅผ ๋ณ‘ํ•ฉํ•˜๊ธฐ ์ „ UI ๋ฒ„๊ทธ๋ฅผ ์ฐจ๋‹จํ•˜๋Š” ์ž๋™ํ™”๋œ ๊ฒŒ์ดํŠธ์›จ์ด ์‹œ์Šคํ…œ์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - -### Deeper Research Questions -- Storybook์˜ ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ(Visual tests)์™€ ๋งˆํฌ์—… ๊ธฐ๋ฐ˜์˜ ์Šค๋ƒ…์ƒท ํ…Œ์ŠคํŠธ(Snapshot tests) ๊ฐ„์˜ ๊ตฌ์ฒด์ ์ธ ์„ฑ๋Šฅ ๋ฐ ์œ ์ง€๋ณด์ˆ˜ ๋น„์šฉ์˜ ์ฐจ์ด๋Š” ๋ฌด์—‡์ธ๊ฐ€? -- Chromatic์ด๋‚˜ Happo ๊ฐ™์€ ๋„๊ตฌ๋Š” ๋™์ ์ธ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด๋‚˜ ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ํ…Œ์ŠคํŠธ ์‹คํŒจ(Flaky tests)๋ฅผ ๊ธฐ์ˆ ์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ๋ฐฉ์ง€ํ•˜๋Š”๊ฐ€? -- ์ƒํ˜ธ์ž‘์šฉ ํ…Œ์ŠคํŠธ(Interaction testing)๋ฅผ ํ†ตํ•ด ๋„์ถœ๋œ ์—ฌ๋Ÿฌ UI ์ƒํƒœ๋ฅผ ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ์™€ ์—ฐ๋™ํ•  ๋•Œ, ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€ ์ธก๋ฉด์—์„œ ์–ด๋–ค ํ•œ๊ณ„์ ์ด ์กด์žฌํ•˜๋Š”๊ฐ€? -- ๋‹ค์ˆ˜์˜ ๋ทฐํฌํŠธ ํฌ๊ธฐ์™€ ํฌ๋กœ์Šค ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์—์„œ Visual Regression Testing์„ ์‹คํ–‰ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” CI ํŒŒ์ดํ”„๋ผ์ธ์˜ ๋ณ‘๋ชฉ ํ˜„์ƒ์€ ์–ด๋–ป๊ฒŒ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? -- ์ ‘๊ทผ์„ฑ ํšŒ๊ท€ ํ…Œ์ŠคํŠธ(Accessibility regression testing)๊ฐ€ ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ ์›Œํฌํ”Œ๋กœ์šฐ์— ํ†ตํ•ฉ๋  ๋•Œ, ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ค ์ ‘๊ทผ์„ฑ ์œ„๋ฐ˜(์˜ˆ: ๋ช…๋„ ๋Œ€๋น„, ARIA ์†์„ฑ ๋“ฑ)์„ ์บก์ฒ˜ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? - -### Practical Application Contexts -- **Implementation:** React ๋“ฑ UI ์ปดํฌ๋„ŒํŠธ ๊ฐœ๋ฐœ ์‹œ, ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„๋กœ Storybook ์Šคํ† ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  `@chromatic-com/storybook` ๋˜๋Š” Happo ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์„ค์น˜ํ•˜์—ฌ `chromatic.config.json` ์„ค์ •์„ ํ†ตํ•ด ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•ฉ๋‹ˆ๋‹ค [2, 11, 12]. -- **System Design:** ํ”„๋ก ํŠธ์—”๋“œ ํŒ€์˜ ํ˜‘์—… ์•„ํ‚คํ…์ฒ˜์— ์‹œ๊ฐ์  ๋ฆฌ๋ทฐ ์‹œ์Šคํ…œ์„ ๋„์ž…ํ•˜์—ฌ, ๋กœ์ปฌ ํ™˜๊ฒฝ์—์„œ๋งŒ์ด ์•„๋‹Œ ํด๋ผ์šฐ๋“œ ๋ธŒ๋ผ์šฐ์ €(ํฌ๋กฌ, ์‚ฌํŒŒ๋ฆฌ ๋“ฑ) ๋ Œ๋”๋ง ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋””์ž์ธ ์‹œ์Šคํ…œ์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๋„๋ก ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค [2, 5]. -- **Operation / Maintenance:** CI ํŒŒ์ดํ”„๋ผ์ธ์—์„œ PR์ด ์ƒ์„ฑ๋  ๋•Œ๋งˆ๋‹ค ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ณ , ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์žˆ์„ ์‹œ ๐ŸŸก(๋…ธ๋ž€์ƒ‰)์œผ๋กœ ํ‘œ์‹œ๋˜๋Š” ํ”ฝ์…€ ์ฐจ์ด๋ฅผ ๋‹ด๋‹น์ž๊ฐ€ ํ™•์ธ ํ›„ โœ…(์Šน์ธ) ์ฒ˜๋ฆฌํ•˜์—ฌ ์ƒˆ๋กœ์šด Baseline์„ ๊ฐฑ์‹ ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์šด์˜ํ•ฉ๋‹ˆ๋‹ค [13, 14]. -- **Learning Path:** ๊ธฐ์ดˆ์ ์ธ Storybook ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง ์ž‘์„ฑ๋ฒ• ์Šต๋“ โ†’ Interaction Testing์„ ํ†ตํ•œ ์ƒํƒœ ์ œ์–ด ํ•™์Šต โ†’ Chromatic/Happo ๋“ฑ์„ ์—ฐ๋™ํ•œ ์ž๋™ํ™” Visual Testing ๋ฐ CI ํ™˜๊ฒฝ ๊ตฌ์ถ• ์ˆœ์œผ๋กœ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค. -- **My Project Relevance:** ํƒ€์ธ์ด ์ž‘์„ฑํ•œ ๋ ˆ๊ฑฐ์‹œ React ์ฝ”๋“œ๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•˜๊ฑฐ๋‚˜(TS ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜, Hooks ๋ณ€ํ™˜, ํŒจํ‚ค์ง€ ์—…๋ฐ์ดํŠธ ๋“ฑ), CSS ๋ฐฉ์‹(Tailwind, CSS Modules ๋“ฑ)์„ ํ‘œ์ค€ํ™”ํ•  ๋•Œ ๊ธฐ์กด UI๊ฐ€ ์˜๋„์น˜ ์•Š๊ฒŒ ๊นจ์ง€๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๋Š” ์•ˆ์ „๋ง(UI test suite)์œผ๋กœ ๋ฐ˜๋“œ์‹œ ํ™œ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [1, 15]. - -### Adjacent Topics -- [[Component-Driven UI]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ํŽ˜์ด์ง€๋‚˜ ํ™”๋ฉด ์ „์ฒด๊ฐ€ ์•„๋‹Œ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ž‘์€ ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„๋ถ€ํ„ฐ ์ƒํ–ฅ์‹(Bottom-up)์œผ๋กœ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฐœ๋…์œผ๋กœ, Storybook์˜ ์กด์žฌ ์ด์œ ์™€ ๋งž๋‹ฟ์•„ ์žˆ์Šต๋‹ˆ๋‹ค. -- [[Pull Request (PR) Code Review]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋กœ์ง ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, CI์™€ ์—ฐ๋™๋œ ์‹œ๊ฐ์  ๋””ํ”„(diff) ๋„๊ตฌ๋ฅผ ํ†ตํ•ด UI ๋ฐ ๋””์ž์ธ ๋ณ€๊ฒฝ์„ ํŒ€์›๋“ค๊ณผ ํšจ๊ณผ์ ์œผ๋กœ ์‹œ๊ฐ์ ์œผ๋กœ ๋ฆฌ๋ทฐํ•˜๋Š” ๋ฌธํ™”๋กœ ํ™•์žฅ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Storybook.md b/00_Raw/Storybook.md deleted file mode 100644 index 6d872c98..00000000 --- a/00_Raw/Storybook.md +++ /dev/null @@ -1,66 +0,0 @@ -# [[Storybook]] - -## ๐Ÿ“Œ Brief ์ฃผSummary -Storybook์€ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ ์‹œ UI ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ฃผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ๊ฒฉ๋ฆฌํ•˜์—ฌ ๊ฐœ๋ฐœํ•˜๊ณ  ๋ฌธ์„œํ™”ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค [1-3]. ํŠนํžˆ ๊ฐœ๋ฐœ๋œ ์ปดํฌ๋„ŒํŠธ์˜ ๋‹ค์–‘ํ•œ ์ƒํƒœ(์Šคํ† ๋ฆฌ)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž๋™ํ™”๋œ ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ(Visual Regression Testing) ๋ฐ ์ƒํ˜ธ์ž‘์šฉ ํ…Œ์ŠคํŠธ(Interaction Testing)๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ ์˜๋„์น˜ ์•Š์€ UI ๋ณ€๊ฒฝ์ด๋‚˜ ์ ‘๊ทผ์„ฑ ์œ„๋ฐ˜์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค [4-6]. Pull Request ๊ณผ์ •์— ๊ฒฐํ•ฉ๋˜์–ด ์•ˆ์ „ํ•œ UI ์—…๋ฐ์ดํŠธ์™€ ๋ฆฌ๋ทฐ๋ฅผ ์ง€์›ํ•˜๋Š” ํ•„์ˆ˜์ ์ธ ํ”Œ๋žซํผ์œผ๋กœ ํ™œ์šฉ๋ฉ๋‹ˆ๋‹ค [1, 7]. - -## ๐Ÿ“– Core Content -* **์ปดํฌ๋„ŒํŠธ์˜ ๊ฒฉ๋ฆฌ๋œ ๊ฐœ๋ฐœ ๋ฐ ๋ฌธ์„œํ™”** - Storybook์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฉ”์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ณต์žกํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด๋‚˜ ์ปจํ…์ŠคํŠธ์—์„œ ๋ฒ—์–ด๋‚˜ UI ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค [1]. ์ด๋Š” ๋ชจ๋…ธ๋ ˆํฌ(Monorepo) ํ™˜๊ฒฝ์ด๋‚˜ ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ฒ˜(Feature-Sliced Design ๋“ฑ)์—์„œ ๊ฐ ๊ธฐ๋Šฅ์„ ๋…๋ฆฝ์ ์œผ๋กœ ๊ฐœ๋ฐœํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•  ๋•Œ ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค [3]. ์ด๋ฏธ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฌธ์„œํ™”ํ•˜๊ณ  ๊ฐœ๋ฐœํ•˜๋Š” ์šฉ๋„๋กœ Storybook์„ ์‚ฌ์šฉ ์ค‘์ด๋ผ๋ฉด, ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ๋ฅผ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ๋น ๋ฅธ UI ๊ฒ€์ฆ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค [2]. - -* **์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ (Visual Regression Testing)** - Storybook์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜๋Š” ๊ฐ ์Šคํ† ๋ฆฌ์˜ ์Šค๋ƒ…์ƒท์„ ์บก์ฒ˜ํ•˜๊ณ  ์ด๋ฅผ ์ด์ „์— ์Šน์ธ๋œ '๋ฒ ์ด์Šค๋ผ์ธ(Baseline)'๊ณผ ๋น„๊ตํ•˜์—ฌ ์‹œ๊ฐ์  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ฐ์ง€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค [8]. ์ „ํ†ต์ ์ธ ์Šค๋ƒ…์ƒท ํ…Œ์ŠคํŠธ๊ฐ€ HTML ๋งˆํฌ์—… ๋ธ”๋กญ์„ ๋น„๊ตํ•˜์—ฌ ์‹œ๊ฐ์  ๋ณ€ํ™”๊ฐ€ ์—†์Œ์—๋„ ์˜คํƒ(false positive)์„ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๊ฒƒ๊ณผ ๋‹ฌ๋ฆฌ, Storybook์˜ ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์‹ค์ œ๋กœ ๊ฒฝํ—˜ํ•˜๋Š” '๋ Œ๋”๋ง๋œ ํ”ฝ์…€'์„ ์ง์ ‘ ๋น„๊ตํ•˜๋ฏ€๋กœ ํ›จ์”ฌ ๋” ํ’๋ถ€ํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค [9]. - -* **์ƒํ˜ธ์ž‘์šฉ ๋ฐ ์ ‘๊ทผ์„ฑ ํ…Œ์ŠคํŠธ (Interaction & Accessibility Tests)** - Storybook์€ ์ปดํฌ๋„ŒํŠธ์˜ ์™ธํ˜•๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋™์ž‘(Behavior)๊นŒ์ง€ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒํ˜ธ์ž‘์šฉ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด ๋กœ๋”ฉ, ์—๋Ÿฌ, ํ˜ธ๋ฒ„, ๋ฉ”๋‰ด ์—ด๋ฆผ ๋“ฑ ๋‹ค์–‘ํ•œ UI ์ƒํƒœ๋ฅผ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ [5], ์ด๋Ÿฌํ•œ ์ƒํƒœ ๋ณ€ํ™”์— ๋งž์ถฐ ์Šคํฌ๋ฆฐ์ƒท์„ ์ฐ์Œ์œผ๋กœ์จ ํ–‰๋™ ํ…Œ์ŠคํŠธ์™€ ์‹œ๊ฐ์  ๊ฒ€์ฆ์„ ๋™์ผํ•œ ์›Œํฌํ”Œ๋กœ์šฐ ๋‚ด์—์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5, 6]. ๋ถ€๊ฐ€์ ์œผ๋กœ ์ถ”๊ฐ€์ ์ธ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ ์—†์ด๋„ ์ ‘๊ทผ์„ฑ ํšŒ๊ท€ ํ…Œ์ŠคํŠธ๋ฅผ ํ•จ๊ป˜ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [4, 10]. - -* **CI/CD ๋ฐ ๋„๊ตฌ ํ†ตํ•ฉ (CI/CD Integrations)** - Storybook์€ Chromatic์ด๋‚˜ Happo ๊ฐ™์€ ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค ๋„๊ตฌ๋“ค๊ณผ ์›ํ™œํ•˜๊ฒŒ ํ†ตํ•ฉ๋ฉ๋‹ˆ๋‹ค [1, 4, 8]. ์ด๋Ÿฌํ•œ ๋„๊ตฌ๋ฅผ CI ํŒŒ์ดํ”„๋ผ์ธ์— ์—ฐ๋™ํ•˜๋ฉด, PR(Pull Request)์ด ์ƒ์„ฑ๋  ๋•Œ๋งˆ๋‹ค Chrome, Firefox, Safari ๋“ฑ ๋‹ค์–‘ํ•œ ์‹ค์ œ ๋ธŒ๋ผ์šฐ์ €์™€ ์—ฌ๋Ÿฌ ๋ทฐํฌํŠธ ํฌ๊ธฐ์—์„œ ์ž๋™์œผ๋กœ ์Šคํฌ๋ฆฐ์ƒท์ด ์บก์ฒ˜๋˜๊ณ  ๋ฒ ์ด์Šค๋ผ์ธ๊ณผ ๋น„๊ต๋ฉ๋‹ˆ๋‹ค [1, 4, 11]. ์ด๋ฅผ ํ†ตํ•ด ๋ฆฌ๋ทฐ์–ด๋Š” ๊ฐ ์ƒํƒœ๋ฅผ ์ˆ˜๋™์œผ๋กœ ํ™•์ธํ•  ํ•„์š” ์—†์ด ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„(Diff)์—๋งŒ ์ง‘์ค‘ํ•˜์—ฌ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์Šน์ธ(Accept)ํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2, 12, 13]. - -## โš–๏ธ Trade-offs & Caveats -* **ํ…Œ์ŠคํŠธ์˜ ๋ถˆ์•ˆ์ •์„ฑ(Flakiness) ๋ฐ ๋…ธ์ด์ฆˆ ๋ฌธ์ œ:** ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜, ๋น„๋™๊ธฐ ์ž์‚ฐ(Asset), ํฐํŠธ ๋กœ๋”ฉ ๋“ฑ์œผ๋กœ ์ธํ•ด ๊นจ์ง€๊ธฐ ์‰ฝ๊ฑฐ๋‚˜ ๋ถˆ์•ˆ์ •ํ•ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [10, 11]. ๋˜ํ•œ ์ด๋ฏธ์ง€ ์••์ถ• ๋…ธ์ด์ฆˆ๋‚˜ ์•ˆํ‹ฐ์•จ๋ฆฌ์–ด์‹ฑ(anti-aliasing)๊ณผ ๊ฐ™์€ ๋ฏธ์„ธํ•œ ์ฐจ์ด๋กœ ์ธํ•ด ์‹คํŒจํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค [10, 14]. ์ด๋ฅผ ์™„ํ™”ํ•˜๊ธฐ ์œ„ํ•ด Happo ๋“ฑ์€ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ž๋™์œผ๋กœ ๋ฌดํšจํ™”ํ•˜๊ณ  ๋น„๋™๊ธฐ ์ž์‚ฐ์„ ๋Œ€๊ธฐํ•˜๋ฉฐ, ์‹œ๊ฐ์  ๋ณ€๊ฒฝ์— ๋Œ€ํ•œ ์ƒ‰์ƒ ํ—ˆ์šฉ ์˜ค์ฐจ(color-delta tolerance)๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•˜๋Š” ์ œ์•ฝ๊ณผ ์„ค์ • ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค [11, 14]. -* **์ถ”๊ฐ€์ ์ธ ๋ฆฌ๋ทฐ ๋ณ‘๋ชฉ ๋ฐ CI ์„ค์ • ์˜ค๋ฒ„ํ—ค๋“œ:** ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ๊ฐ€ ์œ ํšจํ•˜๋ ค๋ฉด ๋ณ€๊ฒฝ๋œ ์Šคํฌ๋ฆฐ์ƒท์ด ์˜๋„๋œ ๊ฒƒ์ธ์ง€(์ƒˆ๋กœ์šด ๋ฒ ์ด์Šค๋ผ์ธ์œผ๋กœ ์ˆ˜๋ฝ) ์•„๋‹ˆ๋ฉด ๋ฒ„๊ทธ์ธ์ง€ ํŒ๋‹จํ•˜๋Š” ํŒ€์›์˜ ์ˆ˜๋™ ๋ฆฌ๋ทฐ ๊ณผ์ •์ด ๋ฐ˜๋“œ์‹œ ์ˆ˜๋ฐ˜๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [12, 13]. ๋˜ํ•œ CI/CD์—์„œ ์›ํ™œํ•˜๊ฒŒ ๋™์ž‘ํ•˜๋„๋ก ํ”„๋กœ์ ํŠธ ํ† ํฐ ๋“ฑ ์ธ์ฆ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ  ํŒŒ์ดํ”„๋ผ์ธ์„ ์„ค์ •ํ•˜๋Š” ์ดˆ๊ธฐ ์ž‘์—…์ด ์š”๊ตฌ๋ฉ๋‹ˆ๋‹ค [7]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -#### [ํ…Œ์ŠคํŠธ ๋ฐ ๊ฒ€์ฆ ๊ธฐ๋ฒ• (Testing Methods)] -- [[Visual Regression Testing]] - - ์—ฐ๊ฒฐ ์ด์œ : Storybook์ด ์ปดํฌ๋„ŒํŠธ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํ”ฝ์…€ ๋‹จ์œ„๋กœ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ํ•ต์‹ฌ ํ…Œ์ŠคํŠธ ๋ฐฉ๋ฒ•๋ก ์ž…๋‹ˆ๋‹ค [4, 8]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: HTML ๋งˆํฌ์—…์„ ๋น„๊ตํ•˜๋Š” Snapshot Test์˜ ํ•œ๊ณ„์ ๊ณผ ์˜คํƒ(False Positive)์˜ ์›๋ฆฌ, ๊ทธ๋ฆฌ๊ณ  ํ”ฝ์…€ ๋ Œ๋”๋ง ๊ธฐ๋ฐ˜ ๋น„๊ต์˜ ์žฅ์ ์„ ๋ช…ํ™•ํžˆ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [9]. - -- [[Interaction Testing]] - - ์—ฐ๊ฒฐ ์ด์œ : ์ปดํฌ๋„ŒํŠธ์˜ ๋‹จ์ˆœํ•œ ๋ Œ๋”๋ง๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์œ ์ €์˜ ํ–‰๋™(์ด๋ฒคํŠธ, ์ƒํƒœ ๋“ฑ)์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜์—ฌ ๋‹ค์–‘ํ•œ UI ์ƒํƒœ(๋กœ๋”ฉ, ํ˜ธ๋ฒ„ ๋“ฑ)๋ฅผ ๊ฒ€์ฆํ•˜๋Š” Storybook์˜ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค [5, 6]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ƒํƒœ ์ „์ด์— ๋”ฐ๋ผ ๋™์ ์œผ๋กœ ๋ณ€ํ•˜๋Š” UI๋ฅผ ์–ด๋–ป๊ฒŒ ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ์™€ ๊ฒฐํ•ฉํ•˜์—ฌ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์›๋ฆฌ๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5]. - -#### [ํ†ตํ•ฉ ๋ฐ ์ž๋™ํ™” ๋„๊ตฌ (Integration Tools)] -- [[Chromatic]] - - ์—ฐ๊ฒฐ ์ด์œ : Storybook ์œ ์ง€๋ณด์ˆ˜ ํŒ€์ด ๋งŒ๋“  ๊ณต์‹ ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค๋กœ, ํฌ๋กœ์Šค ๋ธŒ๋ผ์šฐ์ € ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ์™€ CI ํ†ตํ•ฉ์„ ๋„ค์ดํ‹ฐ๋ธŒ๋กœ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค [8, 15]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ์—์„œ ๋ฒ ์ด์Šค๋ผ์ธ(Baseline) ์ด๋ฏธ์ง€๊ฐ€ ์–ด๋–ป๊ฒŒ ์ €์žฅ, ๋น„๊ต, ๋™๊ธฐํ™”๋˜๋Š”์ง€ CI/CD ํŒŒ์ดํ”„๋ผ์ธ ํ†ตํ•ฉ ๊ณผ์ •์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [7, 13]. - -- [[Happo]] - - ์—ฐ๊ฒฐ ์ด์œ : Storybook๊ณผ ํ†ตํ•ฉ๋˜์–ด ๋‹ค์ค‘ ๋ธŒ๋ผ์šฐ์ € ์Šคํฌ๋ฆฐ์ƒท ํ…Œ์ŠคํŠธ ๋ฐ ์ ‘๊ทผ์„ฑ ํšŒ๊ท€ ํ…Œ์ŠคํŠธ๋ฅผ ๋ณ‘๋ ฌ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค [4]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Flakiness ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ •์ง€ํ•˜๊ฑฐ๋‚˜ ์ƒ‰์ƒ ์˜ค์ฐจ ๋ฒ”์œ„(color-delta tolerance)๋ฅผ ์„ค์ •ํ•˜์—ฌ ์‹œ๊ฐ์  ๋…ธ์ด์ฆˆ๋ฅผ ์ค„์ด๋Š” ๊ตฌ์ฒด์  ์ตœ์ ํ™” ๊ธฐ๋ฒ•์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [11, 14]. - -### Deeper Research Questions -- Storybook์˜ Visual Test์™€ ์ „ํ†ต์ ์ธ HTML Snapshot Test๋ฅผ ๋น„๊ตํ–ˆ์„ ๋•Œ, ์‹ค์ œ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์œ ์ง€๋ณด์ˆ˜ ์˜ค๋ฒ„ํ—ค๋“œ์™€ ์˜คํƒ(false positive) ๋น„์œจ์˜ ์ฐจ์ด๋Š” ์–ด๋– ํ•œ๊ฐ€? -- ์• ๋‹ˆ๋ฉ”์ด์…˜, ๋น„๋™๊ธฐ ํฐํŠธ ๋กœ๋”ฉ ๋“ฑ์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” Visual Test์˜ Flakiness๋ฅผ ์™„์ „ํžˆ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•ด Chromatic์ด๋‚˜ Happo๋Š” ์–ด๋–ค ๋ Œ๋”๋ง ํŒŒ์ดํ”„๋ผ์ธ ์ œ์–ด ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜๋Š”๊ฐ€? -- Storybook์˜ Interaction Test๋กœ ๋ณต์žกํ•œ ์‚ฌ์šฉ์ž ์—ฌ์ •(User Journey)์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•  ๋•Œ, ์ƒํƒœ๋ณ„ ์Šคํฌ๋ฆฐ์ƒท ์บก์ฒ˜๊ฐ€ CI ๋นŒ๋“œ ์‹œ๊ฐ„์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ๊ณผ ์ด๋ฅผ ๋ณ‘๋ ฌํ™”ํ•˜์—ฌ ์ตœ์ ํ™”ํ•˜๋Š” ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? -- ๋ชจ๋…ธ๋ ˆํฌ(Monorepo) ํ™˜๊ฒฝ์ด๋‚˜ Feature-Sliced Design ์•„ํ‚คํ…์ฒ˜์—์„œ ์ˆ˜๋ฐฑ ๊ฐœ์˜ ๊ธฐ๋Šฅ ๋ชจ๋“ˆ์ด ๊ฐ๊ฐ ๋ถ„๋ฆฌ๋œ Storybook์„ ๊ฐ€์งˆ ๋•Œ, ์ด๋ฅผ ํ†ตํ•ฉ์ ์œผ๋กœ ๋นŒ๋“œํ•˜๊ณ  ์‹œ๊ฐ์  ํšŒ๊ท€๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ๋ฒ ์ŠคํŠธ ํ”„๋ž™ํ‹ฐ์Šค๋Š” ๋ฌด์—‡์ธ๊ฐ€? -- Storybook์„ ์‚ฌ์šฉํ•œ ์‹œ๊ฐ์  ์ ‘๊ทผ์„ฑ ํ…Œ์ŠคํŠธ(Accessibility regression testing)๊ฐ€ ์‹ค์ œ DOM ๊ธฐ๋ฐ˜์˜ ์ ‘๊ทผ์„ฑ ๊ฐ์‚ฌ ๋„๊ตฌ(aXe ๋“ฑ)์™€ ๋น„๊ตํ•˜์—ฌ ๊ฐ–๋Š” ํ•œ๊ณ„์ ๊ณผ ๋ณด์™„์ ์€ ๋ฌด์—‡์ธ๊ฐ€? - -### Practical Application Contexts -- **Implementation:** React ๋“ฑ UI ํ”„๋ ˆ์ž„์›Œํฌ ๊ธฐ๋ฐ˜ ํ”„๋กœ์ ํŠธ์—์„œ ๋ณต์žกํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์•ฑ์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ๋ถ„๋ฆฌํ•˜์—ฌ `Button`, `Modal` ๋“ฑ์˜ ์š”์†Œ๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ๋ Œ๋”๋งํ•˜๊ณ , ํ˜ธ๋ฒ„ ๋ฐ ์—๋Ÿฌ ์ƒํƒœ์˜ Story๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. -- **System Design:** Feature-Sliced Design์ฒ˜๋Ÿผ ๋„๋ฉ”์ธ๊ณผ ํ”ผ์ฒ˜๊ฐ€ ๋šœ๋ ทํ•˜๊ฒŒ ๋‚˜๋‰œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋„์ž…ํ•  ๋•Œ, ๊ฐ ํ”ผ์ฒ˜ ํด๋”๋ณ„๋กœ Storybook ํ™˜๊ฒฝ์„ ์„ธํŒ…ํ•˜์—ฌ ๊ฒฉ๋ฆฌ๋œ ๊ฐœ๋ฐœ ๋ฐ ํ…Œ์ŠคํŠธ ๊ตฌ์กฐ๋ฅผ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค. -- **Operation / Maintenance:** CI/CD ์›Œํฌํ”Œ๋กœ์šฐ์— Chromatic ๋˜๋Š” Happo๋ฅผ ์—ฐ๋™ํ•˜์—ฌ, ํŒ€์›์ด PR์„ ์˜ฌ๋ฆด ๋•Œ๋งˆ๋‹ค ์ž๋™์œผ๋กœ ์‹œ๊ฐ์  ๋ณ€๊ฒฝ ์‚ฌํ•ญ(Visual Diff)์ด ์บก์ฒ˜๋˜๊ณ  ์ด๋ฅผ ๋ฆฌ๋ทฐ์–ด๊ฐ€ ์ง์ ‘ ํ™•์ธ ํ›„ ๋ณ‘ํ•ฉ(Merge)ํ•˜๋Š” ์šด์˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ตฌ์ถ•ํ•ฉ๋‹ˆ๋‹ค. -- **Learning Path:** ๊ธฐ๋ณธ UI ์ปดํฌ๋„ŒํŠธ ๊ฒฉ๋ฆฌ ๊ฐœ๋ฐœ -> Story ์ž‘์„ฑ์„ ํ†ตํ•œ ๋ฌธ์„œํ™” -> Interaction Test ์ž‘์„ฑ -> ์ž๋™ํ™”๋œ Visual Regression Test ๊ตฌ์ถ•์œผ๋กœ ์ด์–ด์ง€๋Š” ํ”„๋ก ํŠธ์—”๋“œ ํ’ˆ์งˆ ๋ณด์ฆ ํ•™์Šต ๊ฒฝ๋กœ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. -- **My Project Relevance:** ํ˜„์žฌ ์œ ์ง€๋ณด์ˆ˜ ์ค‘์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฆฌํŒฉํ† ๋ง์ด๋‚˜ ์ƒˆ๋กœ์šด ๋””์ž์ธ ์‹œ์Šคํ…œ(UI ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ) ๊ตฌ์ถ• ์ž‘์—… ์‹œ, ์‹ค์ˆ˜๋กœ ๋ฐœ์ƒํ•˜๋Š” CSS/๋ ˆ์ด์•„์›ƒ ๊นจ์ง์„ ์‚ฌ์ „์— ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์•ˆ์ „์žฅ์น˜๋กœ ๋„์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - -### Adjacent Topics -- [[Pull Request Workflow]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: Storybook ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ์˜ ๊ฒฐ๊ณผ๋ฅผ GitHub, GitLab ๋“ฑ์˜ ๋ฆฌ๋ทฐ ํ”„๋กœ์„ธ์Šค์™€ ๊ฒฐํ•ฉํ•˜์—ฌ, ๋ฒ„๊ทธ ์—†๋Š” UI ์ฝ”๋“œ๋ฅผ ๋ฐฐํฌํ•˜๊ธฐ ์œ„ํ•œ ํ˜‘์—… ๋ฐ ๊ฒ€์ฆ ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ• ์ „๋žต์œผ๋กœ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค. -- [[Feature-Sliced Design]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ํ”„๋ก ํŠธ์—”๋“œ ์ฝ”๋“œ๋ฅผ ๊ธฐ๋Šฅ(Feature) ๋‹จ์œ„๋กœ ๋ถ„๋ฆฌํ•  ๋•Œ, Storybook์„ ์ด์šฉํ•ด ๊ฐ ๊ธฐ๋Šฅ์˜ UI ์ปดํฌ๋„ŒํŠธ๋“ค์„ ๋ฉ”์ธ ์•ฑ์— ์˜์กดํ•˜์ง€ ์•Š๊ณ  ๋…๋ฆฝ์ ์œผ๋กœ ์ž‘๋™ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ์„ค๊ณ„ ์›์น™์œผ๋กœ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Team Collaboration.md b/00_Raw/Team Collaboration.md deleted file mode 100644 index cd5d477d..00000000 --- a/00_Raw/Team Collaboration.md +++ /dev/null @@ -1,70 +0,0 @@ -# [[Team Collaboration]] - -## ๐Ÿ“Œ Brief Summary -ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์—์„œ 'Team Collaboration(ํŒ€ ํ˜‘์—…)'์ด๋ž€ ๋‹ค์ˆ˜์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋™์ผํ•œ ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ํšจ์œจ์ ์œผ๋กœ ํ•จ๊ป˜ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•˜๋Š” ์‹ค์ฒœ ๋ฐฉ์‹, ์•„ํ‚คํ…์ฒ˜, ๊ทธ๋ฆฌ๊ณ  ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์˜๋ฏธํ•œ๋‹ค [1, 2]. ์ด๋Š” ์ผ๊ด€๋œ ํด๋” ๊ตฌ์กฐ, ๋ช…๋ช… ๊ทœ์น™, ์ƒํƒœ ๊ด€๋ฆฌ ํŒจํ„ด ๋ฐ Git ๋ธŒ๋žœ์นญ ์ „๋žต์„ ํ™•๋ฆฝํ•˜์—ฌ ๊ฐœ๋ฐœ์ž ๊ฐ„์˜ ์ถฉ๋Œ๊ณผ ์†Œํ†ต ๋น„์šฉ์„ ์ตœ์†Œํ™”ํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•œ๋‹ค [2-4]. ์„ฑ๊ณต์ ์ธ ํ˜‘์—…์€ ๋ฆฐํŒ…์ด๋‚˜ ํฌ๋งคํŒ…๊ณผ ๊ฐ™์€ ์ž๋™ํ™”๋œ ๋„๊ตฌ๋ฅผ ํ†ตํ•œ ์—„๊ฒฉํ•œ ์ฝ”๋“œ ๊ฑฐ๋ฒ„๋„Œ์Šค์™€ ๋ช…ํ™•ํ•œ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๋ฌธํ™”๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ํŒ€์ด ํ™•์žฅ๋  ๋•Œ ์•ˆ์ •์„ฑ์„ ์œ ์ง€ํ•˜๋„๋ก ๋•๋Š”๋‹ค [5-7]. - -## ๐Ÿ“– Core Content -* **Git ์›Œํฌํ”Œ๋กœ์šฐ ๋ฐ ๋ธŒ๋žœ์นญ ์ „๋žต:** - ์†Œ๊ทœ๋ชจ ํŒ€์—์„œ๋Š” ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์ ์œผ๋ฉด์„œ๋„ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๋Š” '๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜(Feature-branch) ์›Œํฌํ”Œ๋กœ์šฐ'๋‚˜ 'ํŠธ๋ ํฌ ๊ธฐ๋ฐ˜(Trunk-based) ๊ฐœ๋ฐœ'์ด ์ฃผ๋กœ ๊ถŒ์žฅ๋œ๋‹ค [8-10]. ๋ชจ๋“  ์ž‘์—…์€ `main` ๋ธŒ๋žœ์น˜์— ์ง์ ‘ ์ปค๋ฐ‹ํ•˜์ง€ ์•Š๊ณ  ์งง์€ ์ˆ˜๋ช…์˜ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜์—์„œ ์ง„ํ–‰๋˜๋ฉฐ, Pull Request(PR)์™€ ์ตœ์†Œ 1๋ช… ์ด์ƒ์˜ ๋™๋ฃŒ ๋ฆฌ๋ทฐ(Peer review) ๋ฐ ํ…Œ์ŠคํŠธ ํ†ต๊ณผ ํ›„ ๋ณ‘ํ•ฉ๋˜์–ด์•ผ ํ•œ๋‹ค [7, 11, 12]. ๋˜ํ•œ, ๋ธŒ๋žœ์น˜๋ช…๊ณผ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€์— ํ‹ฐ์ผ“ ID(์˜ˆ: `PROJ-123`)๋ฅผ ํฌํ•จํ•˜๋ฉด ์š”๊ตฌ์‚ฌํ•ญ๊ณผ ์ฝ”๋“œ ๋ณ€๊ฒฝ ์ด๋ ฅ ๊ฐ„์˜ ์ถ”์ ์„ฑ(Traceability)์„ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ๋‹ค [13, 14]. -* **์•„ํ‚คํ…์ฒ˜ ๋ฐ ํด๋” ๊ตฌ์กฐ์˜ ํ‘œ์ค€ํ™”:** - ํ‘œ์ค€ํ™”๋œ ํด๋” ๊ตฌ์กฐ(์˜ˆ: ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ ๋˜๋Š” Feature-Sliced Design)๋Š” ํŒŒ์ผ์˜ ์œ„์น˜๋ฅผ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜์—ฌ ํŒ€ ํ˜‘์—…์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚จ๋‹ค [2]. ๊ตฌ์กฐ๊ฐ€ ์ž˜ ์žกํ˜€ ์žˆ์œผ๋ฉด ๊ฐœ๋ฐœ์ž๋“ค์ด ํŒŒ์ผ์„ ์ฐพ๋Š” ์‹œ๊ฐ„์„ ์ค„์ด๊ณ , ํŒ€์› ๊ฐ„ ๋ถˆํ•„์š”ํ•œ ์†Œํ†ต์„ ์ค„์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์‹ ๊ทœ ๊ฐœ๋ฐœ์ž์˜ ์˜จ๋ณด๋”ฉ์ด ๋นจ๋ผ์ง„๋‹ค [2, 15]. ๋˜ํ•œ ๊ฐ ๊ธฐ๋Šฅ์ด ๋…๋ฆฝ๋œ ํด๋”๋กœ ๊ฒฉ๋ฆฌ๋˜์–ด ์žˆ์–ด ์„œ๋กœ์˜ ์ฝ”๋“œ๋ฅผ ๊ฐ„์„ญํ•  ํ™•๋ฅ ์ด ๋‚ฎ์•„์ง„๋‹ค [16]. -* **๋ช…๋ช… ๊ทœ์น™(Naming Conventions) ๋ฐ ์ž๋™ํ™”๋œ ๊ฑฐ๋ฒ„๋„Œ์Šค:** - ์ปดํฌ๋„ŒํŠธ ์ด๋ฆ„์€ ํŒŒ์Šค์นผ ์ผ€์ด์Šค(PascalCase), ํŒŒ์ผ ๋ฐ ํด๋” ์ด๋ฆ„์€ ์ผ€๋ฐฅ ์ผ€์ด์Šค(kebab-case)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋“ฑ ์ผ๊ด€๋œ ๋ช…๋ช… ๊ทœ์น™์€ OS ํ™˜๊ฒฝ ๊ฐ„์˜ ๋นŒ๋“œ ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ  ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์„ ๋†’์ธ๋‹ค [17-19]. ๋” ๋‚˜์•„๊ฐ€ ์ˆ˜๋™ ๊ฒ€์‚ฌ์— ์˜์กดํ•˜๊ธฐ๋ณด๋‹ค ESLint, Prettier, Husky๋ฅผ ํ™œ์šฉํ•ด ์ปค๋ฐ‹ ์ด์ „์— ๋ฆฐํŒ…, ํฌ๋งคํŒ… ๋ฐ ํƒ€์ž… ๊ฒ€์‚ฌ๋ฅผ ์ž๋™์œผ๋กœ ๊ฐ•์ œํ•˜๋Š” ๊ฒƒ์ด ๊ณ ํ’ˆ์งˆ ์ฝ”๋“œ ํ˜‘์—…์˜ ๊ธฐ๋ฐ˜์ด๋‹ค [6, 20, 21]. -* **์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ์™€ ํŒ€ ๊ทœ๋ชจ์˜ ์ƒ๊ด€๊ด€๊ณ„:** - ํŒ€์˜ ๊ทœ๋ชจ๊ฐ€ ํด์ˆ˜๋ก(10๋ช… ์ด์ƒ) ๊ตฌ์กฐ๋ฅผ ๊ฐ•์ œํ•˜๋Š” ๋„๊ตฌ๊ฐ€ ํ˜‘์—…์— ์œ ๋ฆฌํ•˜๋‹ค [5]. Zustand์™€ ๊ฐ™์€ ๋„๊ตฌ๋Š” ์œ ์—ฐํ•˜๊ณ  ๋น ๋ฅด์ง€๋งŒ, ๊ทœ์œจ์ด ๋ถ€์กฑํ•˜๋ฉด ๊ฐœ๋ฐœ์ž๋งˆ๋‹ค ๋น„๋™๊ธฐ ์ž‘์—…์„ ๋‹ค๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•˜์—ฌ ์ฝ”๋“œ๋ฒ ์ด์Šค์— ํ˜ผ๋ž€(integration chaos)์„ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ๋‹ค [22, 23]. ๋ฐ˜๋ฉด Redux๋Š” ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ๊ฐ€ ๋งŽ์ง€๋งŒ, ํŒ€ ์ „์›์ด ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” '๋‹จ์ผ ์ง„์‹ค ๊ณต๊ธ‰์›'๊ณผ ๊ตฌ์กฐ๋ฅผ ์ œ๊ณตํ•˜์—ฌ ๋Œ€๊ทœ๋ชจ ํ˜‘์—…์—์„œ ๋ฒ„๊ทธ๋ฅผ ์ค„์ธ๋‹ค [5, 24, 25]. - -## โš–๏ธ Trade-offs & Caveats -* **์œ ์—ฐ์„ฑ vs. ๊ตฌ์กฐ์  ๊ฐ•์ œ์„ฑ (์ƒํƒœ ๊ด€๋ฆฌ):** Zustand ๊ฐ™์ด ๊ฐ€๋ฒผ์šด ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ๊ฐ€ ์ ์–ด ๋น ๋ฅธ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ(์Šคํƒ€ํŠธ์—… ๋“ฑ)์— ์ ํ•ฉํ•˜์ง€๋งŒ, ์œ ์—ฐ์„ฑ์ด ๋„ˆ๋ฌด ์ปค์„œ ํŒ€์ด ์ปค์งˆ ๊ฒฝ์šฐ ํŒŒํŽธํ™”๋œ ํŒจํ„ด์„ ๋‚ณ์„ ์ˆ˜ ์žˆ๋‹ค [22, 23, 26, 27]. ๋ฐ˜๋ฉด Redux๋Š” ์ผ๊ด€์„ฑ์„ ๊ฐ•์ œํ•˜์—ฌ ๋””๋ฒ„๊น…๊ณผ ํ˜‘์—…์„ ํŽธํ•˜๊ฒŒ ํ•ด์ฃผ์ง€๋งŒ, ์ดˆ๊ธฐ ์„ค์ •๊ณผ ๊ตฌ์กฐํ™”์— ๋“œ๋Š” ์‹œ๊ฐ„์ด ์†Œ๊ทœ๋ชจ ํŒ€์—๊ฒŒ๋Š” ๊ณผ๋„ํ•œ ์˜ค๋ฒ„ํ—ค๋“œ๋กœ ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๋‹ค [5, 24, 28]. -* **๋ธŒ๋žœ์นญ ์›Œํฌํ”Œ๋กœ์šฐ์˜ ๋ฌด๊ฒŒ๊ฐ:** Git Flow๋Š” ์˜ˆ์ •๋œ ๋ฆด๋ฆฌ์Šค๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฑฐ๋Œ€ ํ”„๋กœ์ ํŠธ์—๋Š” ์œ ์šฉํ•˜์ง€๋งŒ, ์†Œ๊ทœ๋ชจ ํŒ€์—๊ฒŒ๋Š” ๋ธŒ๋žœ์น˜ ๊ด€๋ฆฌ ๋น„์šฉ์ด ๋„ˆ๋ฌด ์ปค์„œ ๊ฐœ๋ฐœ ์†๋„๋ฅผ ๋Šฆ์ถœ ์ˆ˜ ์žˆ๋‹ค [8, 29]. ๊ฐ€๋ฒผ์šด Feature-branch ์›Œํฌํ”Œ๋กœ์šฐ๋‚˜ Trunk-based ๊ฐœ๋ฐœ์ด ๋Œ€์•ˆ์ด์ง€๋งŒ, ์ด๋Š” ๊ฐœ๋ฐœ์ž๋“ค์ด ๋ธŒ๋žœ์น˜๋ฅผ ์งง๊ฒŒ ์œ ์ง€ํ•˜๊ณ  ๋นˆ๋ฒˆํžˆ ๋ณ‘ํ•ฉ(Merge)ํ•˜๋Š” ๊ทœ์œจ์„ ์Šค์Šค๋กœ ์ง€์ผœ์•ผ๋งŒ ์„ฑ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค [30, 31]. -* **์ดˆ๊ธฐ ํ•™์Šต ๊ณก์„ ๊ณผ ์˜ค๋ฒ„ํ—ค๋“œ:** Feature-Sliced Design(FSD) ๊ฐ™์€ ์—„๊ฒฉํ•œ ์•„ํ‚คํ…์ฒ˜๋Š” ์ฝ”๋“œ์˜ ๋ชจ๋“ˆํ™”์™€ ๋…๋ฆฝ์  ์ž‘์—…(๋ณ‘๋ ฌ ์ž‘์—…)์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜์ง€๋งŒ, ์ดˆ๊ธฐ ๋„์ž… ์‹œ ํŒ€์› ์ „์ฒด๊ฐ€ ํ•ด๋‹น ๋ฐฉ๋ฒ•๋ก (Layer, Slice ๋“ฑ์˜ ๊ฐœ๋…)์„ ์ดํ•ดํ•˜๊ณ  ๋™์˜ํ•ด์•ผ ํ•˜๋Š” ํ•™์Šต ๋น„์šฉ์ด ๋ฐœ์ƒํ•œ๋‹ค [32, 33]. ๊ทœ์น™์— ๋Œ€ํ•œ ์ง€์‹ ๊ณต์œ ์™€ ๋ฌธ์„œํ™”๊ฐ€ ๋™๋ฐ˜๋˜์ง€ ์•Š์œผ๋ฉด, ๊ฐœ๋ฐœ์ž๋“ค์ด ์ž„์˜๋กœ ํ•˜์œ„ ํด๋”๋‚˜ `/shared` ๋“ฑ์— ์ฝ”๋“œ๋ฅผ ์Ÿ์•„๋ถ€์–ด ์˜คํžˆ๋ ค ์•„ํ‚คํ…์ฒ˜๊ฐ€ ๋ง๊ฐ€์ง€๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋‚ณ์„ ์ˆ˜ ์žˆ๋‹ค [33]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -#### [๊ด€๊ณ„ ์œ ํ˜• A (ํ˜‘์—…/์ฝ”๋“œ ๊ด€๋ฆฌ ํ”„๋กœ์„ธ์Šค)] -- [[Git Branching Strategies]] - - ์—ฐ๊ฒฐ ์ด์œ : ๋‹ค์ˆ˜์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋™์‹œ์— ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๊ณ  ํ†ตํ•ฉ ๊ณผ์ •์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ํ•ต์‹ฌ ๊ทœ์•ฝ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค [3, 34]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Pull Request, ์ฝ”๋“œ ๋ฆฌ๋ทฐ, ๋ธŒ๋žœ์น˜ ๋ช…๋ช… ๊ทœ์น™, Trunk-based ์›Œํฌํ”Œ๋กœ์šฐ ๋“ฑ ์‹ค์ œ ํŒ€ ์šด์˜ ๋ฐฉ์‹ [7, 35]. -- [[Commit Message Conventions]] - - ์—ฐ๊ฒฐ ์ด์œ : ๋ณ€๊ฒฝ ์‚ฌํ•ญ์˜ ์˜๋„์™€ ์ž‘์—… ๋‚ด์—ญ(๋ฒ„๊ทธ ํ”ฝ์Šค, ๊ธฐ๋Šฅ ์ถ”๊ฐ€ ๋“ฑ)์„ ๋‹ค๋ฅธ ํŒ€์›๋“ค์—๊ฒŒ ๋ช…ํ™•ํžˆ ์ „๋‹ฌํ•˜๋Š” ์†Œํ†ต์˜ ๋„๊ตฌ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค [36]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํ‹ฐ์ผ“ ID ํ†ตํ•ฉ, `feat:`, `fix:`์™€ ๊ฐ™์€ ์ ‘๋‘์‚ฌ๋ฅผ ํ†ตํ•œ ๋ณ€๊ฒฝ ์ด๋ ฅ์˜ ์ž๋™ํ™” ๋ฐ ์Šค์บ๋‹ [14, 36, 37]. - -#### [๊ด€๊ณ„ ์œ ํ˜• B (์•„ํ‚คํ…์ฒ˜ ๋ฐ ๊ฑฐ๋ฒ„๋„Œ์Šค ๋„๊ตฌ)] -- [[Feature-Sliced Design]] - - ์—ฐ๊ฒฐ ์ด์œ : ์ฝ”๋“œ๋ฅผ ๊ธฐ์ˆ ์  ๊ณ„์ธต์ด ์•„๋‹Œ ๋น„์ฆˆ๋‹ˆ์Šค ๊ธฐ๋Šฅ(Feature) ์ค‘์‹ฌ์œผ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ, ์—ฌ๋Ÿฌ ํŒ€์ด ์„œ๋กœ ๊ฐ„์„ญ ์—†์ด ๋…๋ฆฝ์ ์œผ๋กœ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ๋Š” ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•œ๋‹ค [16, 38]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋„๋ฉ”์ธ ์ฃผ๋„ ์„ค๊ณ„์˜ ํ”„๋ก ํŠธ์—”๋“œ ์ ์šฉ, ๋ช…์‹œ์  ํผ๋ธ”๋ฆญ API๋ฅผ ํ†ตํ•œ ๋ชจ๋“ˆ ์บก์Аํ™”์™€ ๊ฒฐํ•ฉ๋„ ๋‚ฎ์ถ”๊ธฐ [38-40]. -- [[Automated Governance]] - - ์—ฐ๊ฒฐ ์ด์œ : ์‚ฌ๋žŒ์˜ ์ˆ˜๋™ ํ™•์ธ์— ์˜์กดํ•˜์ง€ ์•Š๊ณ  ESLint, Prettier, Husky ๋“ฑ์œผ๋กœ ์ฝ”๋“œ ์ปจ๋ฒค์…˜๊ณผ ์•„ํ‚คํ…์ฒ˜ ๋ฃฐ(์˜์กด์„ฑ ๋ฐฉํ–ฅ ๋“ฑ)์„ ์‹œ์Šคํ…œ์ ์œผ๋กœ ๊ฐ•์ œํ•œ๋‹ค [6, 20]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: CI/CD ํŒŒ์ดํ”„๋ผ์ธ์—์„œ์˜ ์ฝ”๋“œ ํ’ˆ์งˆ ๋ณด์ฆ ๋ฐ ํŒ€์› ๊ฐ„์˜ ์Šคํƒ€์ผ ๋ถ„์Ÿ ๋ฐฉ์ง€ [20]. -- [[Redux vs Zustand in Teams]] - - ์—ฐ๊ฒฐ ์ด์œ : ํŒ€์˜ ๊ทœ๋ชจ(์†Œ๊ทœ๋ชจ vs ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ)์— ๋”ฐ๋ผ ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ์˜ ์„ ํƒ์ด ํ˜‘์—…์˜ ์ผ๊ด€์„ฑ์— ๊ฒฐ์ •์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค [5, 24, 27]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ฐœ๋ฐœ์ž์˜ ์ž์œจ์„ฑ ๋ถ€์—ฌ์™€ ์ผ๊ด€์„ฑ ๊ฐ•์ œ(Boilerplate) ์‚ฌ์ด์˜ ์•„ํ‚คํ…์ฒ˜์  ํŠธ๋ ˆ์ด๋“œ์˜คํ”„ [22, 41]. - -### Deeper Research Questions - -- ์†Œ๊ทœ๋ชจ ํŒ€(2~5์ธ)์—์„œ ๋Œ€๊ทœ๋ชจ ํŒ€(10์ธ ์ด์ƒ)์œผ๋กœ ํ™•์žฅํ•  ๋•Œ Git ์›Œํฌํ”Œ๋กœ์šฐ์™€ ๋ธŒ๋žœ์นญ ์ „๋žต์€ ์–ด๋–ป๊ฒŒ ์ง„ํ™”ํ•ด์•ผ ํ•˜๋Š”๊ฐ€? -- Feature-Sliced Design(FSD)์„ ํ”„๋กœ์ ํŠธ์— ๋„์ž…ํ•  ๋•Œ, ํŒ€์›๋“ค์ด ๊ณตํ†ต ๋ชจ๋“ˆ์„ `/shared` ํด๋”์— ๋ฌด๋ถ„๋ณ„ํ•˜๊ฒŒ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์ฒด์ ์ธ ๊ฑฐ๋ฒ„๋„Œ์Šค ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? -- ESLint์™€ Husky๋ฅผ ํ™œ์šฉํ•œ ์ž๋™ํ™” ๊ฑฐ๋ฒ„๋„Œ์Šค ์„ค์ • ์‹œ, ๊ฐœ๋ฐœ ์†๋„๋ฅผ ๋Šฆ์ถ”์ง€ ์•Š์œผ๋ฉด์„œ ๋ชจ๋“ˆ ๊ฐ„ ์ž˜๋ชป๋œ ์˜์กด์„ฑ(์ƒ์œ„ ๋ ˆ์ด์–ด ์ฐธ์กฐ ๋“ฑ)์„ ์›์ฒœ ์ฐจ๋‹จํ•˜๋Š” ์ตœ์ ์˜ ๊ทœ์น™ ๊ตฌ์„ฑ์€ ๋ฌด์—‡์ธ๊ฐ€? -- ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(Redux vs Zustand)์˜ ์„ ํƒ์ด ํŒ€์› ๊ฐ„์˜ ๋น„๋™๊ธฐ ๋กœ์ง ๋ฐ ๋ฐ์ดํ„ฐ ํŒจ์นญ(Fetching) ํŒจํ„ด์˜ ํŒŒํŽธํ™”์— ๋ฏธ์น˜๋Š” ์‹ค์ œ ์˜ํ–ฅ์€ ๋ฌด์—‡์ธ๊ฐ€? -- Pull Request ๊ธฐ๋ฐ˜์˜ ํ˜‘์—… ํ™˜๊ฒฝ์—์„œ, ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ ๋„๊ตฌ(์˜ˆ: Storybook, Chromatic)๊ฐ€ ์ฝ”๋“œ ๋ฆฌ๋ทฐ์˜ ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ์–ด๋–ป๊ฒŒ ํ•ด์†Œํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? - -### Practical Application Contexts - -- **Implementation:** ์ฝ”๋“œ๋ฅผ ์ปค๋ฐ‹ํ•˜๊ณ  PR์„ ์ƒ์„ฑํ•  ๋•Œ, ๋ฐ˜๋“œ์‹œ ์ •ํ•ด์ง„ Conventional Commits ๊ทœ์น™์„ ๋”ฐ๋ฅด๊ณ  JIRA ๋“ฑ์˜ ์ด์Šˆ ํ‹ฐ์ผ“ ๋ฒˆํ˜ธ๋ฅผ ๋ธŒ๋žœ์น˜์™€ ์ปค๋ฐ‹์— ๊ธฐ์ž…ํ•˜์—ฌ ์ถ”์ ์„ฑ์„ ๋ณด์žฅํ•œ๋‹ค [14, 37]. -- **System Design:** ํ”„๋กœ์ ํŠธ ํด๋” ๊ตฌ์กฐ ์„ค๊ณ„ ์‹œ ๊ธฐ์ˆ ์  ํŒŒ์ผ ํƒ€์ž…(์ปดํฌ๋„ŒํŠธ, ํ›… ๋“ฑ)์˜ ๋‚˜์—ด์ด ์•„๋‹Œ, ์ธ์ฆ, ๋Œ€์‹œ๋ณด๋“œ ๋“ฑ ๊ธฐ๋Šฅ(Feature) ๋„๋ฉ”์ธ ๋‹จ์œ„๋กœ ๊ฒฉ๋ฆฌ์‹œ์ผœ ๊ฐ ๊ธฐ๋Šฅ๋ณ„๋กœ ์ „๋‹ด ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ณ‘๋ ฌ๋กœ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค [2, 42, 43]. -- **Operation / Maintenance:** CI/CD ํŒŒ์ดํ”„๋ผ์ธ๊ณผ Git Hooks(Husky)๋ฅผ ์„ธํŒ…ํ•˜์—ฌ, ๋ˆ„๊ตฐ๊ฐ€ ์ปจ๋ฒค์…˜์„ ์–ด๊ธด ์ฝ”๋“œ๋ฅผ ํ‘ธ์‹œํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์‚ฌ์ „์— ๋ฆฐํ„ฐ์™€ ํฌ๋งคํ„ฐ๊ฐ€ ์ž‘๋™ํ•ด ์ž˜๋ชป๋œ ์ฝ”๋“œ๊ฐ€ ์›๊ฒฉ ๋ธŒ๋žœ์น˜์— ์˜ฌ๋ผ๊ฐ€๋Š” ๊ฒƒ์„ ์ฐจ๋‹จํ•œ๋‹ค [20]. -- **Learning Path:** ์‹ ๊ทœ ์ž…์‚ฌ์ž๋‚˜ ํŒ€์›์ด ๋ฐฐ์ •๋˜์—ˆ์„ ๋•Œ, `README`์— ๋ช…์‹œ๋œ ํŒ€์˜ ๋ธŒ๋žœ์นญ ์ „๋žต ๊ทœ์น™๊ณผ ํด๋” ๋””๋ ‰ํ† ๋ฆฌ ์„ค๊ณ„ ์˜๋„๋ฅผ ๋จผ์ € ํ•™์Šตํ•˜๊ฒŒ ํ•˜์—ฌ ํ”„๋กœ์ ํŠธ ์˜จ๋ณด๋”ฉ ์‹œ๊ฐ„์„ ๋‹จ์ถ•ํ•œ๋‹ค [2, 44]. -- **My Project Relevance:** ๋‹ค์ˆ˜์˜ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•จ๊ป˜ ์ฐธ์—ฌํ•˜๋Š” ๋ฆฌ์•กํŠธ ํ”„๋กœ์ ํŠธ์—์„œ, ์ฝ”๋“œ ์ถฉ๋Œ๊ณผ ๊ธฐ์ˆ  ๋ถ€์ฑ„๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ  ์ผ๊ด€๋œ ์ œํ’ˆ ํ’ˆ์งˆ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์ˆ˜์ ์œผ๋กœ ์ˆ˜๋ฆฝํ•ด์•ผ ํ•˜๋Š” ํ˜‘์—… ๊ทธ๋ผ์šด๋“œ ๋ฃฐ(Ground Rules)์ด๋‹ค. - -### Adjacent Topics - -- [[Code Review Practices]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ์ž‘์€ ๋‹จ์œ„์˜ Pull Request ์œ ์ง€, ์‹œ๊ฐ์  ๋ฆฌ๋ทฐ ๋„๊ตฌ์˜ ๋„์ž…, ํšจ์œจ์ ์ธ ๋™๋ฃŒ ํ”ผ๋“œ๋ฐฑ ์ œ๊ณต ๋“ฑ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ์ž์ฒด์˜ ํ’ˆ์งˆ๊ณผ ์†๋„๋ฅผ ๋†’์ด๋Š” ๋ฐฉ๋ฒ•๋ก  [37, 45]. -- [[CI/CD Pipelines]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ํŒ€์›์˜ ์ฝ”๋“œ๊ฐ€ `main`์— ๋ณ‘ํ•ฉ๋˜๊ธฐ ์ „, ์ž๋™์œผ๋กœ ํ…Œ์ŠคํŠธ์™€ ๋ฆฐํŒ…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋ฐฐํฌ๊นŒ์ง€ ์ด์–ด์ง€๋Š” ์ธํ”„๋ผ ๋ฐ ๋ฐ๋ธŒ์˜ต์Šค ํ™˜๊ฒฝ [7]. -- [[Visual Regression Testing]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: Storybook ๋ฐ Chromatic์„ ํ™œ์šฉํ•ด UI ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ฆฌ๋ทฐ์–ด๊ฐ€ ์‹œ๊ฐ์ ์œผ๋กœ ์ง์ ‘ ํ™•์ธํ•˜๊ณ , ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๋ ˆ์ด์•„์›ƒ ๊นจ์ง์„ ๋ฐฉ์ง€ํ•˜๋Š” ํ˜‘์—… ๊ธฐ์ˆ  [45, 46]. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Technical Debt Management.md b/00_Raw/Technical Debt Management.md deleted file mode 100644 index 05a3e708..00000000 --- a/00_Raw/Technical Debt Management.md +++ /dev/null @@ -1,63 +0,0 @@ -# [[Technical Debt Management]] - -## ๐Ÿ“Œ Brief Summary -๊ธฐ์ˆ  ๋ถ€์ฑ„ ๊ด€๋ฆฌ(Technical Debt Management)๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์žฅ๊ธฐ์ ์ธ ์ฝ”๋“œ ๊ตฌ์กฐ๋ณด๋‹ค ๋‹จ๊ธฐ์ ์ธ ๊ฐœ๋ฐœ ์†๋„๋ฅผ ์šฐ์„ ์‹œํ•  ๋•Œ ์ถ•์ ๋˜๋Š” ๋น„ํšจ์œจ์ ์ธ ์ฝ”๋“œ๋ฅผ ์˜ˆ๋ฐฉํ•˜๊ณ  ์žฌ๊ตฌ์„ฑํ•˜๋Š” ์ง€์†์ ์ธ ๊ณผ์ •์ž…๋‹ˆ๋‹ค [1]. ์ตœ์‹  ํ”„๋ก ํŠธ์—”๋“œ ํ™˜๊ฒฝ์—์„œ ์ด๋ฅผ ๊ด€๋ฆฌํ•˜๋ ค๋ฉด ์—„๊ฒฉํ•œ ํด๋” ์•„ํ‚คํ…์ฒ˜์™€ ๋ช…๋ช… ๊ทœ์น™์„ ์ ์šฉํ•˜๊ณ , ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ธฐ์กด ๋™์ž‘์„ ์œ ์ง€ํ•˜๋ฉด์„œ ๊ตฌ์กฐ๋ฅผ ๊ฐœ์„ ํ•˜๋Š” ์ ์ง„์ ์ธ ๋ฆฌํŒฉํ† ๋ง ์ „๋žต์„ ์ฑ„ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [1-3]. ๊ถ๊ทน์ ์œผ๋กœ ์ž‘์„ฑ๋œ "๋ชจ๋“  ์ฝ”๋“œ๋Š” ๊ธฐ์ˆ  ๋ถ€์ฑ„"๋ผ๋Š” ์ธ์‹์„ ๋ฐ”ํƒ•์œผ๋กœ, ์ž‰์—ฌ ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ๊ตฌ์กฐ๋ฅผ ํ˜„๋Œ€ํ™”ํ•˜๋Š” ๋ฐ ์ง‘์ค‘ํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค [4]. - -## ๐Ÿ“– Core Content -* **์›์ธ๊ณผ ์˜ˆ๋ฐฉ (Causes and Prevention):** - ๊ธฐ์ˆ  ๋ถ€์ฑ„๋Š” ๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ ๊ตฌ์กฐ์  ์›์น™์„ ๋ฌด์‹œํ•˜๊ณ  ํŒŒ์ผ์„ ๋ฌด๋ถ„๋ณ„ํ•˜๊ฒŒ ๋ฐฐ์น˜ํ•  ๋•Œ ์กฐ์šฉํžˆ ์Šค๋ฉฐ๋“ค๋ฉฐ, ์žฅ๊ธฐ์ ์œผ๋กœ ์œ ์ง€๋ณด์ˆ˜์˜ ํ˜ผ๋ž€์„ ์ดˆ๋ž˜ํ•ฉ๋‹ˆ๋‹ค [1]. ์ด๋ฅผ ์˜ˆ๋ฐฉํ•˜๋ ค๋ฉด ์ผ๊ด€์„ฑ ์žˆ๋Š” ํด๋” ๊ตฌ์กฐ๋ฅผ ๊ฐ–์ถ”์–ด ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๊ทœ์œจ์„ ๋ถ€์—ฌํ•˜๊ณ , ์ผ๊ด€๋œ ๋ช…๋ช… ๊ทœ์น™(Naming Conventions)์„ ์ ์šฉํ•˜์—ฌ ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ์Œ“์ด๋Š” ๊ธฐ์ˆ  ๋ถ€์ฑ„๋ฅผ ์ค„์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค [1, 3]. -* **์ ์ง„์  ๋ฆฌํŒฉํ† ๋ง ์ „๋žต (Incremental Refactoring Strategy):** - ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์˜ค๋ž˜๋ ์ˆ˜๋ก ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ๊ฑด๊ฐ•ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋ฆฌํŒฉํ† ๋ง์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค [2]. ์ „์ฒด ์‹œ์Šคํ…œ์„ ์™„์ „ํžˆ ๋‹ค์‹œ ์ž‘์„ฑ(Complete rewrite)ํ•˜๋Š” ๊ฒƒ์€ ์œ„ํ—˜๋„๊ฐ€ ๋งค์šฐ ๋†’๊ธฐ ๋•Œ๋ฌธ์—, "์žฌ์ž‘์„ฑ์ด ์•„๋‹Œ ๋ฆฌํŒฉํ† ๋ง(refactor, do not rewrite)" ์ฒ ํ•™์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ๋ชจ๋“ˆ์ด๋‚˜ ์Šคํ† ์–ด์”ฉ ๋ณ€๊ฒฝํ•˜๋Š” ์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [2]. -* **์ปค์Šคํ…€ ํ›…์„ ํ†ตํ•œ ๋ชจ๋“ˆํ™” (Custom Hooks as Refactoring Units):** - React ๊ฐœ๋ฐœ์—์„œ ๋ฆฌํŒฉํ† ๋ง์˜ ์ฃผ์š” ๋‹จ์œ„๋Š” ์ปค์Šคํ…€ ํ›…(Custom Hook)์ž…๋‹ˆ๋‹ค [5]. ๋ณต์žกํ•œ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฐ์ดํ„ฐ ํŽ˜์นญ์ด๋‚˜ ํผ ํ•ธ๋“ค๋ง ๋“ฑ์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ถ”์ถœํ•˜์—ฌ ํ›…์œผ๋กœ ๋ถ„๋ฆฌํ•˜๋ฉด, UI์™€ ๋กœ์ง์ด ๋ถ„๋ฆฌ๋˜์–ด ์ฝ”๋“œ๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์‰ฌ์›Œ์ง€๊ณ  ๊ธฐ์ˆ  ๋ถ€์ฑ„๊ฐ€ ์™„ํ™”๋ฉ๋‹ˆ๋‹ค [5]. -* **์•„ํ‚คํ…์ฒ˜ ๋ถ€์ฑ„ ๊ด€๋ฆฌ (Architectural Debt Management):** - ๊ธฐ๋Šฅ ๋ถ„ํ•  ์„ค๊ณ„(Feature-Sliced Design, FSD)์™€ ๊ฐ™์€ ์•„ํ‚คํ…์ฒ˜ ๋ฐฉ๋ฒ•๋ก ์„ ๋„์ž…ํ•˜๋ฉด ๊ฐ ๋ชจ๋“ˆ์„ ๋‹ค๋ฅธ ๋ถ€๋ถ„์— ๋Œ€ํ•œ ๋ถ€์ž‘์šฉ(Side effects) ์—†์ด ๋…๋ฆฝ์ ์œผ๋กœ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ๋ฆฌํŒฉํ† ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [6]. ๋ช…ํ™•ํ•œ ๊ฒฝ๊ณ„์™€ ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ์„ ๊ฐ•์ œํ•จ์œผ๋กœ์จ, ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ์ถ”๊ฐ€๋‚˜ ์„ฑ๋Šฅ ์ตœ์ ํ™” ์ž‘์—… ์‹œ ์•„ํ‚คํ…์ฒ˜ ๋ถ€์ฑ„๊ฐ€ ๋ˆ„์ ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค [6, 7]. - -## โš–๏ธ Trade-offs & Caveats -* **์ „๋ฉด ์žฌ์ž‘์„ฑ(Complete Rewrite)์˜ ์œ„ํ—˜์„ฑ:** ์˜ค๋ž˜๋œ ๊ธฐ์ˆ ์ด๋‚˜ ๊ตฌ์กฐ๋ฅผ ํ•œ ๋ฒˆ์— ๊ต์ฒดํ•˜๋Š” ๊ฒƒ์€ ๋งค๋ ฅ์ ์œผ๋กœ ๋ณด์ผ ์ˆ˜ ์žˆ์œผ๋‚˜, ๊ธฐ์กด์˜ ์•ˆ์ •์„ฑ์„ ํ›ผ์†ํ•  ์œ„ํ—˜์ด ์ปค์„œ ๊ถŒ์žฅ๋˜์ง€ ์•Š์œผ๋ฉฐ ๋А๋ฆฌ๋”๋ผ๋„ ์ ์ง„์ ์œผ๋กœ ๊ฐœ์„ ํ•ด์•ผ ํ•˜๋Š” ์ œ์•ฝ์ด ๋”ฐ๋ฆ…๋‹ˆ๋‹ค [2]. -* **๊ณผ๋„ํ•œ ์ถ”์ƒํ™”์˜ ์—ญํšจ๊ณผ:** ์ฝ”๋“œ์˜ ์ค‘๋ณต์„ ์ค„์ด๊ธฐ ์œ„ํ•œ DRY(Don't Repeat Yourself) ์›์น™์„ ๋„ˆ๋ฌด ์ผ์ฐ ์ ์šฉํ•˜๋ฉด, ์ฝ”๋“œ๊ฐ€ ์ง€๋‚˜์น˜๊ฒŒ ๋ณต์žกํ•ด์ง€๋Š” ๊ณผ๋„ํ•œ ์ถ”์ƒํ™”๋ผ๋Š” ์ƒˆ๋กœ์šด ๊ธฐ์ˆ  ๋ถ€์ฑ„๋ฅผ ๋‚ณ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [8]. ํŒจํ„ด์ด ์„ธ ๋ฒˆ ๋ฐ˜๋ณต๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ ์ถ”์ƒํ™”ํ•˜๋Š” ๊ฒƒ์ด ์กฐ๊ธฐ ์ตœ์ ํ™”๋กœ ์ธํ•œ ๋ถ€์ž‘์šฉ์„ ๋ง‰๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค [9]. -* **๋‹จ์ˆœ์„ฑ(Simplicity) ์ค‘์‹ฌ ์กฐ๊ธฐ ์ตœ์ ํ™”์˜ ํ•จ์ •:** ์ดˆ๊ธฐ ๊ฐœ๋ฐœ ์†๋„์™€ ๋‹จ์ˆœ์„ฑ์„ ์œ„ํ•ด ์†์‰ฌ์šด ๋„๊ตฌ(์˜ˆ: ์ „์—ญ ์ƒํƒœ์— ๋ฌด๋ถ„๋ณ„ํ•œ Context API ์‚ฌ์šฉ)๋ฅผ ์„ ํƒํ•˜๋Š” ๊ฒƒ์€, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ปค์กŒ์„ ๋•Œ ๊ณ ํ†ต์Šค๋Ÿฌ์šด ๋Œ€๊ทœ๋ชจ ๋ฆฌํŒฉํ† ๋ง์„ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [10]. -* **๊ธฐ๋Šฅ ๋ถ„ํ•  ์„ค๊ณ„์˜ ์ดˆ๊ธฐ ๋„์ž… ๋น„์šฉ:** Feature-Sliced Design ๊ฐ™์€ ์—„๊ฒฉํ•œ ๊ตฌ์กฐ๋Š” ๋Œ€๊ทœ๋ชจ ์•ฑ์˜ ๋ถ€์ฑ„๋ฅผ ๋ง‰๋Š” ๋ฐ ํƒ์›”ํ•˜์ง€๋งŒ, ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ๋‚˜ ๊ฒฝํ—˜์ด ์ ์€ ํŒ€์—๊ฒŒ๋Š” ํ•™์Šต ๊ณก์„ ์ด ๊ฐ€ํŒŒ๋ฅด๊ณ  ๋ถˆํ•„์š”ํ•œ ์˜ค๋ฒ„ํ—ค๋“œ๋กœ ์ž‘์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [11, 12]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -#### [์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] -- [[Feature-Sliced Design]] - - ์—ฐ๊ฒฐ ์ด์œ : ํ”„๋กœ์ ํŠธ๋ฅผ ๊ธฐ๋Šฅ๊ณผ ๋„๋ฉ”์ธ ์Šค์ฝ”ํ”„์— ๋”ฐ๋ผ ๋ถ„ํ• ํ•˜์—ฌ, ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ ์‹œ์Šคํ…œ ์ „์ฒด๋กœ ํŒŒ๊ธ‰ ํšจ๊ณผ๊ฐ€ ํผ์ง€๋Š” ๊ฒƒ์„ ๋ง‰๊ณ  ๋ถ€์ฑ„๋ฅผ ๊ตญ์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค [6, 13]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ์˜์กด์„ฑ ๊ฒฝ๊ณ„๋ฅผ ์„ค๊ณ„ํ•˜์—ฌ ์–ด๋–ป๊ฒŒ ๋Œ€๊ทœ๋ชจ ๋ฆฌํŒฉํ† ๋ง์„ ์•ˆ์ „ํ•˜๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -- [[Incremental Migration]] - - ์—ฐ๊ฒฐ ์ด์œ : ๋ ˆ๊ฑฐ์‹œ ๊ธฐ์ˆ ์„ ํ˜„๋Œ€ํ™”ํ•  ๋•Œ ์ „์ฒด๋ฅผ ํ๊ธฐํ•˜๋Š” ๋Œ€์‹  ์ ์ง„์ ์œผ๋กœ ๋ถ€์ฑ„๋ฅผ ์ฒญ์‚ฐํ•ด ๋‚˜๊ฐ€๋Š” ๊ฐ€์žฅ ์‹ค์šฉ์ ์ด๊ณ  ๊ถŒ์žฅ๋˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค [2]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ๊ณผ ๊ธฐ์ˆ  ๋ถ€์ฑ„ ์ƒํ™˜์„ ๋™์‹œ์— ์ง„ํ–‰ํ•˜๋Š” ์‹ค๋ฌด ์ „๋žต์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - -#### [๊ตฌํ˜„/์ฝ”๋“œ ํ’ˆ์งˆ ์›์น™] -- [[DRY (Don't Repeat Yourself)]] - - ์—ฐ๊ฒฐ ์ด์œ : ์ค‘๋ณต ์ฝ”๋“œ ์ œ๊ฑฐ๋Š” ๋ถ€์ฑ„ ๊ด€๋ฆฌ์˜ ๊ธฐ๋ณธ์ด์ง€๋งŒ, ๋งน๋ชฉ์ ์ธ ์ ์šฉ์€ ์ฝ”๋“œ๋ฅผ 'KISS' ์›์น™์—์„œ ๋ฉ€์–ด์ง€๊ฒŒ ํ•˜์—ฌ ์˜คํžˆ๋ ค ์œ ์ง€๋ณด์ˆ˜ ๋ถ€์ฑ„๋ฅผ ์ฆ๊ฐ€์‹œํ‚ต๋‹ˆ๋‹ค [8, 9]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์˜ฌ๋ฐ”๋ฅธ ์ถ”์ƒํ™” ํƒ€์ด๋ฐ๊ณผ ์›์น™ ๊ฐ„์˜ ์ƒ์ถฉ ๊ด€๊ณ„(Trade-off)๋ฅผ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -- [[Custom Hooks]] - - ์—ฐ๊ฒฐ ์ด์œ : ๋šฑ๋šฑํ•ด์ง„ React ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ž‘๊ณ  ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅํ•œ ๋‹จ์œ„๋กœ ์ชผ๊ฐœ๋Š” ํ•ต์‹ฌ์ ์ธ ๋ฆฌํŒฉํ† ๋ง ๋„๊ตฌ์ž…๋‹ˆ๋‹ค [5]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: UI ์ปดํฌ๋„ŒํŠธ์—์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ์‹ค์šฉ์ ์ธ ๊ธฐ๋ฒ•์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - -### Deeper Research Questions -- ์ „์ฒด ์‹œ์Šคํ…œ์„ ์ ์ง„์ ์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜(Incremental Migration)ํ•  ๋•Œ, ์‹ ๊ตฌ ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ(์˜ˆ: Context API์™€ Zustand) ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™” ๋ฐ ํ•˜์œ„ ํ˜ธํ™˜์„ฑ์„ ์–ด๋–ป๊ฒŒ ์œ ์ง€ํ•  ๊ฒƒ์ธ๊ฐ€? -- ๋Œ€๊ทœ๋ชจ ๋ชจ๋†€๋ฆฌ์‹(Monolithic) ํด๋” ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„ ๋ ˆ๊ฑฐ์‹œ ํ”„๋กœ์ ํŠธ์— [[Feature-Sliced Design]]์„ ๋„์ž…ํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ€์žฅ ์•ˆ์ „ํ•˜๊ณ  ํšจ์œจ์ ์ธ ๋‹จ๊ณ„๋ณ„ ์ ˆ์ฐจ๋Š” ๋ฌด์—‡์ธ๊ฐ€? -- "๋ชจ๋“  ์ฝ”๋“œ๋Š” ๊ธฐ์ˆ  ๋ถ€์ฑ„๋‹ค"๋ผ๋Š” ๊ด€์ ์—์„œ, ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋ฐ๋“œ ์ฝ”๋“œ(Dead Code)๋‚˜ ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง ์š”์†Œ๋ฅผ ์ž๋™ ์‹๋ณ„ํ•˜์—ฌ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ค ๋ถ„์„ ๋„๊ตฌ(Profiler ๋“ฑ)๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? -- ์ถ”์ƒํ™”๋ฅผ ์ ์šฉํ•˜๋Š” ๊ธฐ์ค€์ด ๋˜๋Š” 'Rule of Three(์„ธ ๋ฒˆ ๋ฐ˜๋ณต ์‹œ ์ถ”์ƒํ™”)'๋ฅผ ๋ณต์žกํ•œ ํ”„๋ก ํŠธ์—”๋“œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— ์ ์šฉํ•  ๋•Œ ๋งˆ์ฃผ์น˜๋Š” ํ•œ๊ณ„์™€ ์˜ˆ์™ธ ์‚ฌ๋ก€๋Š” ๋ฌด์—‡์ธ๊ฐ€? -- ์ดˆ๊ธฐ ์Šคํƒ€ํŠธ์—… ํ™˜๊ฒฝ์—์„œ ์‹œ์žฅ ์ถœ์‹œ ์†๋„๋ฅผ ๋†’์ด๊ธฐ ์œ„ํ•ด ๋ฐœ์ƒํ•˜๋Š” '์˜๋„์ ์ธ ๊ธฐ์ˆ  ๋ถ€์ฑ„'๋ฅผ ์ถ”ํ›„ ์ƒํ™˜ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐœ๋ฐœํŒ€์ด ๋„์ž…ํ•ด์•ผ ํ•  ํ”„๋กœ์„ธ์Šค๋Š” ๋ฌด์—‡์ธ๊ฐ€? - -### Practical Application Contexts -- **Implementation:** ๋น„๋Œ€ํ•ด์ง„ React ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ ์ƒํƒœ ๊ด€๋ฆฌ๋‚˜ API ํ˜ธ์ถœ ๋กœ์ง์„ ๋ฐœ๊ฒฌํ–ˆ์„ ๋•Œ, ์ด๋ฅผ ๋ณ„๋„์˜ Custom Hook์œผ๋กœ ์ถ”์ถœํ•˜์—ฌ UI ๋กœ์ง์„ ๋‹จ์ˆœํ™”ํ•˜๊ณ  ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ์„ฑ์„ ๋†’์ด๋Š” ๋ฆฌํŒฉํ† ๋ง์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค [4, 5]. -- **System Design:** ํ”„๋กœ์ ํŠธ ์…‹์—… ๋‹จ๊ณ„์—์„œ ๋ฏธ๋ฆฌ ๋ช…๋ช… ๊ทœ์น™(Naming Convention)๊ณผ ๊ธฐ๋Šฅ ๋‹จ์œ„์˜ ํด๋” ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ฐ•์ œํ•˜์—ฌ, ๊ฐœ๋ฐœ์ž๋“ค์ด ์•„๋ฌด ํด๋”์—๋‚˜ ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๋ฐœ์ƒํ•˜๋Š” ๊ตฌ์กฐ์  ๋ถ€์ฑ„๋ฅผ ์‚ฌ์ „์— ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค [1, 3]. -- **Operation / Maintenance:** ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ๋•Œ ์ „์ฒด ์•ฑ์„ ํ•œ ๋ฒˆ์— ๋ฐ”๊พธ์ง€ ์•Š๊ณ  ์•Œ๋ฆผ(Notification) ๊ธฐ๋Šฅ ๋“ฑ ์ž‘์€ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ ๊ฒฐ์ œ ํ๋ฆ„ ๊ฐ™์€ ๋ณต์žกํ•œ ๋„๋ฉ”์ธ์œผ๋กœ ๋‹จ๊ณ„์ ์œผ๋กœ ๋ฆฌํŒฉํ† ๋ง์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค [2]. -- **Learning Path:** ๋ฆฌํŒฉํ† ๋ง์„ ํ•™์Šตํ•  ๋•Œ ๋จผ์ € ์ฝ”๋“œ์— ๋‹จ์œ„ ํ…Œ์ŠคํŠธ(Unit Tests)๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ๊ธฐ์กด์˜ ๋™์ž‘์„ ๋ณด์žฅํ•œ ๋’ค์—, SOLID ์›์น™๊ณผ Clean Code ์›์น™์„ ์—ผ๋‘์— ๋‘๊ณ  ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฅผ ์ž‘๊ฒŒ ๋ถ„ํ• ํ•ด ๋‚˜๊ฐ€๋Š” ๋ฐฉ๋ฒ•์„ ํ›ˆ๋ จํ•ฉ๋‹ˆ๋‹ค [14, 15]. -- **My Project Relevance:** ํ˜„์žฌ ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ฑฐ๋‚˜ ์ธ์ˆ˜๋ฐ›์€ ๋‚ก์€ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ๊ฐœ์„ ํ•ด์•ผ ํ•œ๋‹ค๋ฉด, ์šฐ์„  ๊ธฐ๋Šฅ๋ณ„๋กœ ์ฝ”๋“œ๋ฅผ ๊ทธ๋ฃนํ™”ํ•˜๊ณ  ์ค‘๋ณต ์ฝ”๋“œ๋ฅผ ์ฐพ์•„๋‚ด์–ด ์ ์ง„์ ์œผ๋กœ ๋œ์–ด๋‚ด๋Š” ๋ฐฉํ–ฅ(Remove surplus)์œผ๋กœ ์ž‘์—…์„ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค [4, 16]. - -### Adjacent Topics -- [[Automated Testing]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ๊ธฐ์ˆ  ๋ถ€์ฑ„๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•˜๋Š” ๊ณผ์ •์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋™์ž‘์ด ๊นจ์ง€์ง€ ์•Š์•˜์Œ์„ ์ž๋™์œผ๋กœ ๊ฒ€์ฆํ•˜์—ฌ ๋ฆฌํŒฉํ† ๋ง์˜ ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•. -- [[Static Code Analysis (ESLint/Prettier)]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ์ •์  ๋ถ„์„ ๋„๊ตฌ๋ฅผ CI/CD ํŒŒ์ดํ”„๋ผ์ธ์— ํ†ตํ•ฉํ•˜์—ฌ ์•„ํ‚คํ…์ฒ˜ ๊ทœ์น™๊ณผ ํด๋ฆฐ ์ฝ”๋“œ ์›์น™์„ ์ž๋™ ๊ฐ•์ œํ•จ์œผ๋กœ์จ ๊ธฐ์ˆ  ๋ถ€์ฑ„์˜ ์œ ์ž…์„ ์›์ฒœ ์ฐจ๋‹จํ•˜๋Š” ๋ฐฉ์•ˆ. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Technical Debt.md b/00_Raw/Technical Debt.md deleted file mode 100644 index 12529a8b..00000000 --- a/00_Raw/Technical Debt.md +++ /dev/null @@ -1,57 +0,0 @@ -# [[Technical Debt]] - -## ๐Ÿ“Œ Brief Summary -๊ธฐ์ˆ  ๋ถ€์ฑ„(Technical Debt)๋Š” ๋‹จ๊ธฐ์ ์ธ ๊ฐœ๋ฐœ ์†๋„๋ฅผ ์œ„ํ•ด ๊ตฌ์กฐ๋ฅผ ๋ฌด์‹œํ•˜๊ฑฐ๋‚˜ ์ž„์‹œ๋ฐฉํŽธ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์žฅ๊ธฐ์ ์œผ๋กœ ๋ฐœ์ƒํ•˜๋Š” ์ฝ”๋“œ์˜ ํ˜ผ๋ž€๊ณผ ์œ ์ง€๋ณด์ˆ˜ ๋น„์šฉ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค [1]. ๊ถ๊ทน์ ์œผ๋กœ ์ž‘์„ฑ๋œ "๋ชจ๋“  ์ฝ”๋“œ๋Š” ๊ธฐ์ˆ  ๋ถ€์ฑ„(All code is tech debt)"๋กœ ๊ฐ„์ฃผ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ถˆํ•„์š”ํ•œ ์ž‰์—ฌ ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค [2]. ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ์ผ๊ด€๋œ ๋ช…๋ช… ๊ทœ์น™, ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์•„ํ‚คํ…์ฒ˜ ๋„์ž…, ๊ทธ๋ฆฌ๊ณ  ์ง€์†์ ์ธ ๋ฆฌํŒฉํ† ๋ง์„ ํ†ตํ•ด ๊ธฐ์ˆ  ๋ถ€์ฑ„๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ์ถ•์†Œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1, 3, 4]. - -## ๐Ÿ“– Core Content -* **๊ธฐ์ˆ  ๋ถ€์ฑ„์˜ ๋ฐœ์ƒ ์›์ธ:** ๊ฐœ๋ฐœ์ž๊ฐ€ ํŒŒ์ผ ๊ตฌ์กฐ ์„ค๊ณ„๋ฅผ ๊ฑด๋„ˆ๋›ฐ๊ณ  ๋‹จ๊ธฐ์ ์œผ๋กœ "๊ทธ๋ƒฅ ์ด ํŒŒ์ผ์„ ์—ฌ๊ธฐ์— ๋‘์ž"๋Š” ์‹์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋‹จ๊ธฐ์ ์œผ๋กœ๋Š” ๋น ๋ฅผ ์ˆ˜ ์žˆ์œผ๋‚˜, ์žฅ๊ธฐ์ ์œผ๋กœ๋Š” ์•„ํ‚คํ…์ฒ˜์˜ ๋ถ•๊ดด์™€ ์‹ฌ๊ฐํ•œ ๊ธฐ์ˆ  ๋ถ€์ฑ„๋ฅผ ์ดˆ๋ž˜ํ•ฉ๋‹ˆ๋‹ค [1]. ๋˜ํ•œ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ณผ๋„ํ•œ ๊ธฐ๋Šฅ์ด๋‚˜ ์ฝ”๋“œ๋ฅผ ๋‚จ๊ฒจ๋‘๋Š” ๊ฒƒ๋„ ๋ถ€์ฑ„๊ฐ€ ๋ฉ๋‹ˆ๋‹ค [2]. -* **๊ตฌ์กฐ์  ์ ‘๊ทผ์„ ํ†ตํ•œ ๋ถ€์ฑ„ ๊ด€๋ฆฌ:** - * **Feature-Sliced Design (FSD):** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋„๋ฉ”์ธ๊ณผ ๊ธฐ๋Šฅ ๋ฒ”์œ„์— ๋”ฐ๋ผ ์Šฌ๋ผ์ด์Šคํ•˜์—ฌ ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ์„ ๊ฐ•์ œํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ตฌ์กฐ๋Š” ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์— ๋ถ€์ž‘์šฉ์„ ์ฃผ์ง€ ์•Š๊ณ  ๊ฐ ๋ชจ๋“ˆ์„ ๋…๋ฆฝ์ ์œผ๋กœ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์žฌ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜์—ฌ ์•„ํ‚คํ…์ฒ˜์  ๊ธฐ์ˆ  ๋ถ€์ฑ„๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค [5, 6]. - * **๋ช…๋ช… ๊ทœ์น™ ์ค€์ˆ˜ (Naming Conventions):** ์ผ€๋ฐฅ ์ผ€์ด์Šค(kebab-case)๋‚˜ ํŒŒ์Šค์นผ ์ผ€์ด์Šค(PascalCase) ๋“ฑ ์ผ๊ด€์„ฑ ์žˆ๊ณ  ๋ช…ํ™•ํ•œ ํŒŒ์ผ ๋ช…๋ช… ๊ทœ์น™์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋„ ์žฅ๊ธฐ์ ์œผ๋กœ ๊ธฐ์ˆ  ๋ถ€์ฑ„๋ฅผ ํฌ๊ฒŒ ์ค„์ด๊ณ  ํŒ€์› ๊ฐ„์˜ ํ˜‘์—…์„ ์‰ฝ๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค [4]. -* **๋ฆฌํŒฉํ† ๋ง๊ณผ ๋ถ€์ฑ„ ์ƒํ™˜:** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์˜ค๋ž˜๋จ์— ๋”ฐ๋ผ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ๊ฑด๊ฐ•ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ „๋ฌธ์ ์ธ ๋ฆฌํŒฉํ† ๋ง์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์ฝ”๋“œ๋ฅผ "๊ณ ์น˜๋Š”" ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋™์ž‘์„ ์œ ์ง€ํ•˜๋ฉด์„œ ๊ตฌ์กฐ๋ฅผ ๊ฐœ์„ ํ•˜๋Š” ์ž‘์—…์ž…๋‹ˆ๋‹ค [3]. ํŠนํžˆ ํฐ ์ปดํฌ๋„ŒํŠธ์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ '์ปค์Šคํ…€ ํ›…(Custom Hooks)'์œผ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ํ˜„๋Œ€ React์—์„œ ๋ฆฌํŒฉํ† ๋ง์˜ ์ฃผ์š” ๋‹จ์œ„๊ฐ€ ๋ฉ๋‹ˆ๋‹ค [7]. - -## โš–๏ธ Trade-offs & Caveats -๊ธฐ์ˆ  ๋ถ€์ฑ„๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๊ตฌํ˜• ๊ธฐ์ˆ ์—์„œ ์ƒˆ ๊ธฐ์ˆ ๋กœ ์‹œ์Šคํ…œ์„ ์ด์ „ํ•  ๋•Œ, **์™„์ „ํ•œ ์žฌ์ž‘์„ฑ(Complete rewrite)์„ ์‹œ๋„ํ•˜๋Š” ๊ฒƒ์€ ๋„ˆ๋ฌด ์œ„ํ—˜ํ•œ ์„ ํƒ(too risky)**์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3]. ๋Œ€์‹  ์•„ํ‚คํ…์ฒ˜๋ฅผ ํ˜„๋Œ€ํ™”ํ•˜๋ฉด์„œ๋„ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ์„ ๊ณ„์†ํ•  ์ˆ˜ ์žˆ๋„๋ก ์•Œ๋ฆผ ๊ฐ™์€ ๋‹จ์ˆœํ•œ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด ๋ณต์žกํ•œ ๋„๋ฉ”์ธ์œผ๋กœ ๋‚˜์•„๊ฐ€๋Š” "์žฌ์ž‘์„ฑ์ด ์•„๋‹Œ ๋ฆฌํŒฉํ† ๋ง(refactor, do not rewrite)" ํ˜•ํƒœ์˜ ์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์ฑ„ํƒํ•ด์•ผ ํ•˜๋Š” ์ œ์•ฝ์ด ๋”ฐ๋ฆ…๋‹ˆ๋‹ค [3]. -๋˜ํ•œ, ์ค‘๋ณต ์ฝ”๋“œ๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด(DRY ์›์น™) ์ง€๋‚˜์น˜๊ฒŒ ์ถ”์ƒํ™”ํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ์›๋ž˜์˜ ๋ฐ˜๋ณต๋œ ํ˜•ํƒœ๋ณด๋‹ค ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์›Œ์ ธ KISS(Keep It Simple, Stupid) ์›์น™์„ ์œ„๋ฐฐํ•˜๊ณ  ์ƒˆ๋กœ์šด ํ˜•ํƒœ์˜ ๊ตฌ์กฐ์  ๋ถ€์ฑ„์™€ ๋ณต์žก์„ฑ์„ ๋‚ณ์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ถ€์ž‘์šฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค [8, 9]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -#### [์•„ํ‚คํ…์ฒ˜ ๋ฐ ์„ค๊ณ„ ์›์น™] -- [[Feature-Sliced Design]] - - ์—ฐ๊ฒฐ ์ด์œ : ์•„ํ‚คํ…์ฒ˜์˜ ์ฑ…์ž„์„ ๋ถ„๋ฆฌํ•˜๊ณ  ๋ชจ๋“ˆํ™”๋ฅผ ๊ฐ•์ œํ•˜์—ฌ ์ฝ”๋“œ ์ˆ˜์ • ์‹œ ๋ถ€์ž‘์šฉ์„ ์—†์•ฐ์œผ๋กœ์จ, ๊ธฐ์ˆ  ๋ถ€์ฑ„ ๋ˆ„์ ์„ ์›์ฒœ์ ์œผ๋กœ ์ฐจ๋‹จํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [6, 10]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋Œ€๊ทœ๋ชจ React ์‹œ์Šคํ…œ์—์„œ ๊ธฐ์ˆ  ๋ถ€์ฑ„ ์—†์ด ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ๋ฅผ ์„ค๊ณ„ํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ๋ ˆ์ด์–ด(Layer), ์Šฌ๋ผ์ด์Šค(Slice) ๊ธฐ๋ฐ˜์˜ ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ์›๋ฆฌ [10, 11]. - -- [[KISS and YAGNI]] - - ์—ฐ๊ฒฐ ์ด์œ : ์ฝ”๋“œ๋ฅผ ๋‹จ์ˆœํ•˜๊ฒŒ ์œ ์ง€(KISS)ํ•˜๊ณ , ๋ฏธ๋ž˜์— ํ•„์š”ํ• ์ง€๋„ ๋ชจ๋ฅธ๋‹ค๋Š” ์ด์œ ๋กœ ๋ถˆํ•„์š”ํ•œ ๊ธฐ๋Šฅ(YAGNI)์„ ๋ฏธ๋ฆฌ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์Œ์œผ๋กœ์จ ์œ ์ง€๋ณด์ˆ˜ํ•ด์•ผ ํ•  ๋ถ€์ฑ„ ์ž์ฒด๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [8, 12]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์• ์ž์ผ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์žฅ๋˜๋Š” ์ฝ”๋“œ(Dead code)๋ฅผ ์ค„์ด๊ณ  ์ง€๋‚˜์นœ ์ถ”์ƒํ™”๋ฅผ ํ”ผํ•˜๋Š” ๋ฐฉ๋ฒ• [12]. - -#### [์ฝ”๋“œ ์œ ์ง€๋ณด์ˆ˜ ๋ฐ ๊ด€๋ฆฌ] -- [[Refactoring]] - - ์—ฐ๊ฒฐ ์ด์œ : ๋ˆ„์ ๋œ ๊ธฐ์ˆ  ๋ถ€์ฑ„๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ๊ฑด๊ฐ•ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์ง์ ‘์ ์ด๊ณ  ํ•„์ˆ˜์ ์ธ ์‹ค์ฒœ ๋ฐฉ์‹์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [3]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ปค์Šคํ…€ ํ›…(Custom hook)์„ ๋‹จ์œ„๋กœ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ UI๋ฅผ ๊ฒฉ๋ฆฌํ•˜๋Š” ๊ธฐ์ˆ  ๋ฐ ์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜(Incremental migration) ์ „๋žต [3, 7]. - -### Deeper Research Questions - -- ์™„์ „ํ•œ ์žฌ์ž‘์„ฑ(rewrite)์˜ ์œ„ํ—˜์„ฑ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜(incremental migration)์„ ํ†ตํ•ด ๊ธฐ์ˆ  ๋ถ€์ฑ„๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ์‹ค๋ฌด์  ์ ˆ์ฐจ๋Š” ์–ด๋– ํ•œ๊ฐ€? -- DRY(Don't Repeat Yourself) ์›์น™์˜ ๊ณผ๋„ํ•œ ์ ์šฉ์ด ์˜คํžˆ๋ ค ์ฝ”๋“œ ๋ณต์žก์„ฑ์„ ์ฆ๊ฐ€์‹œํ‚ค๊ณ  ์ƒˆ๋กœ์šด ๊ธฐ์ˆ  ๋ถ€์ฑ„๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒฝ๊ณ„์„ ์€ ์–ด๋””์ธ๊ฐ€? -- ์ปดํฌ๋„ŒํŠธ์˜ ํฌ๊ธฐ๊ฐ€ ์ปค์ง์— ๋”ฐ๋ผ ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)์„ ์ ์šฉํ•ด ๊ธฐ์ˆ  ๋ถ€์ฑ„๋ฅผ ์‹๋ณ„ํ•˜๊ณ  ๋ถ„๋ฆฌํ•˜๋Š” ํšจ๊ณผ์ ์ธ ๊ธฐ์ค€์€ ๋ฌด์—‡์ธ๊ฐ€? -- ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ ์—„๊ฒฉํ•œ ํด๋” ๊ณ„์ธต๊ณผ ํŒŒ์ผ ๋ช…๋ช… ๊ทœ์น™(Naming Conventions)์ด ๊ธฐ์ˆ  ๋ถ€์ฑ„ ๊ฐ์†Œ์— ๊ธฐ์—ฌํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ๋ฌด์—‡์ธ๊ฐ€? -- "๋ชจ๋“  ์ฝ”๋“œ๋Š” ๊ธฐ์ˆ  ๋ถ€์ฑ„๋‹ค"๋ผ๋Š” ๊ด€์ ์—์„œ, ์œ ์ง€๋ณด์ˆ˜ ์ธก๋ฉด์˜ ๋ถ€์ฑ„๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด ์ œ๊ฑฐํ•ด์•ผ ํ•  ์ž‰์—ฌ ์ฝ”๋“œ(Surplus code)๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? - -### Practical Application Contexts - -- **Implementation:** ํŒŒ์ผ์ด๋‚˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค ๋•Œ ๋‹จ๊ธฐ์ ์ธ ๊ฐœ๋ฐœ ์†๋„๋ฅผ ์œ„ํ•ด ๊ตฌ์กฐ ์—†์ด ๋ฐฐ์น˜ํ•˜๋Š” ๊ฒƒ์„ ์ง€์–‘ํ•˜๊ณ , ์ผ๊ด€๋œ ๋ช…๋ช… ๊ทœ์น™๊ณผ ํด๋” ๊ตฌ์กฐ๋ฅผ ์ฒ ์ €ํžˆ ์ง€์ผœ ์ถ”ํ›„ ๋ฐœ์ƒํ•˜๋Š” ๋ถ€์ฑ„๋ฅผ ์˜ˆ๋ฐฉํ•ฉ๋‹ˆ๋‹ค [1, 4]. ์ž‰์—ฌ ์ฝ”๋“œ๋Š” ๋ถ€์ฑ„์ด๋ฏ€๋กœ ์‹๋ณ„ํ•˜์—ฌ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค [2]. -- **System Design:** Feature-Sliced Design๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ/๋„๋ฉ”์ธ ์ค‘์‹ฌ์˜ ๊ณ„์ธตํ˜• ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋„์ž…ํ•˜์—ฌ, ๊ฐ ๊ธฐ๋Šฅ ๋‹จ์œ„๊ฐ€ ์„œ๋กœ ์•”๋ฌต์ ์ธ ๊ฒฐํ•ฉ ์—†์ด ๋…๋ฆฝ์ ์œผ๋กœ ๋ฆฌํŒฉํ† ๋ง๋  ์ˆ˜ ์žˆ๋„๋ก ์‹œ์Šคํ…œ์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค [6, 13]. -- **Operation / Maintenance:** ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฅผ ์ตœ์‹  ์ƒํƒœ๋กœ ๊ด€๋ฆฌํ•  ๋•Œ ์‹œ์Šคํ…œ ์ „์ฒด๋ฅผ ์—Ž๋Š” ๋Œ€์‹ (Rewrite ์ง€์–‘), ๋กœ์ปฌ ์ƒํƒœ๋ถ€ํ„ฐ ๊ธ€๋กœ๋ฒŒ ์ƒํƒœ ๊ด€๋ฆฌ๊นŒ์ง€ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์Šคํ† ์–ด๋‚˜ ๋ชจ๋“ˆ์”ฉ ์ ์ง„์ ์œผ๋กœ ์ด๋™ํ•˜๋Š” ๋ฆฌํŒฉํ† ๋ง์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค [3, 7]. -- **Learning Path:** React๋ฅผ ํ•™์Šตํ•  ๋•Œ ๋‹จ์ˆœํžˆ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ๊ฒƒ์„ ๋„˜์–ด SOLID, DRY, KISS, YAGNI์™€ ๊ฐ™์€ ์†Œํ”„ํŠธ์›จ์–ด ์—”์ง€๋‹ˆ์–ด๋ง ์›์น™์„ ์ ‘๋ชฉํ•˜์—ฌ, ์ฝ๊ธฐ ์‰ฝ๊ณ  ๋ถ€์ฑ„๊ฐ€ ์ ์€ Clean Code ์ž‘์„ฑ๋ฒ•์„ ํ›ˆ๋ จํ•ฉ๋‹ˆ๋‹ค [14, 15]. -- **My Project Relevance:** React ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ๊ด€๋ฆฌํ•˜๊ฑฐ๋‚˜ ๋„˜๊ฒจ๋ฐ›์•„ ๋ฆฌํŒฉํ† ๋งํ•  ๋•Œ, ๊ฐ€์žฅ ๋จผ์ € ๊ฑฐ๋Œ€ํ•œ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ถ”์ถœํ•ด Custom Hooks๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ์„ฑ์„ ๋†’์ด๋Š” ์ž‘์—…๋ถ€ํ„ฐ ์ฐฉ์ˆ˜ํ•ฉ๋‹ˆ๋‹ค [7]. - -### Adjacent Topics - -- [[Automated Governance]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ESLint, Prettier, Husky์™€ ๊ฐ™์€ ์ž๋™ํ™” ํˆด์„ ํ†ตํ•ด ํŒ€์›๋“ค์˜ ์‹ค์ˆ˜๋‚˜ ์ž„์˜์ ์ธ ์ฝ”๋“œ ๊ตฌ์กฐ ๋ณ€๊ฒฝ์„ ๋ง‰์•„ ๊ธฐ์ˆ  ๋ถ€์ฑ„๊ฐ€ ์ถ•์ ๋˜๋Š” ๊ฒƒ์„ ์‹œ์Šคํ…œ์ ์œผ๋กœ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ์ง€์‹์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [16]. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Version Control.md b/00_Raw/Version Control.md deleted file mode 100644 index 2da5260d..00000000 --- a/00_Raw/Version Control.md +++ /dev/null @@ -1,69 +0,0 @@ -# [[Version Control]] - -## ๐Ÿ“Œ Brief Summary -๋ฒ„์ „ ๊ด€๋ฆฌ(Version Control)๋Š” ์†Œ๊ทœ๋ชจ๋ถ€ํ„ฐ ๋Œ€๊ทœ๋ชจ ํŒ€์— ์ด๋ฅด๊ธฐ๊นŒ์ง€ ์ฝ”๋“œ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ถ”์ ํ•˜๊ณ , ๋ณ‘ํ•ฉ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๋ฉฐ ์•ˆ์ •์ ์ธ ๋ฐฐํฌ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ํ•„์ˆ˜์ ์ธ ํ˜‘์—… ๋„๊ตฌ ๋ฐ ๊ฑฐ๋ฒ„๋„Œ์Šค ํ”„๋กœ์„ธ์Šค์ž…๋‹ˆ๋‹ค [1, 2]. ๊ฐœ๋ฐœํŒ€์€ ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ์™€ ํŒ€์˜ ์ˆ™๋ จ๋„์— ๋”ฐ๋ผ Feature-Branch ์›Œํฌํ”Œ๋กœ์šฐ, Trunk-based ๊ฐœ๋ฐœ, Git Flow ๋“ฑ ๋‹ค์–‘ํ•œ ๋ธŒ๋žœ์นญ ์ „๋žต์„ ์„ ํƒํ•˜์—ฌ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค [3, 4]. ํšจ๊ณผ์ ์ธ ๋ฒ„์ „ ๊ด€๋ฆฌ๋Š” ๋ธŒ๋žœ์น˜์™€ ์ปค๋ฐ‹์— ํ‹ฐ์ผ“ ID ์—ฐ๋™, ์˜๋ฏธ ์žˆ๋Š” ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ์ž‘์„ฑ, ์ž‘๊ณ  ๋นˆ๋ฒˆํ•œ ์ปค๋ฐ‹, ๊ทธ๋ฆฌ๊ณ  ์—„๊ฒฉํ•œ ํ’€ ๋ฆฌํ€˜์ŠคํŠธ(PR) ๋ฆฌ๋ทฐ ๋“ฑ์˜ ๋ชจ๋ฒ” ์‚ฌ๋ก€๋ฅผ ์ค€์ˆ˜ํ•˜์—ฌ ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ํ’ˆ์งˆ๊ณผ ์ถ”์ ์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค [2, 5]. - -## ๐Ÿ“– Core Content -* **์ฃผ์š” ๋ธŒ๋žœ์นญ ์ „๋žต (Branching Strategies)** - * **Feature-Branch Workflow**: 2~5์ธ ๊ทœ๋ชจ์˜ ์†Œ๊ทœ๋ชจ ํŒ€์—๊ฒŒ ๊ฐ€์žฅ ๊ถŒ์žฅ๋˜๋Š” ๋‹จ์ˆœํ•˜๊ณ  ์ถฉ๋Œ์ด ์ ์€ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค [6]. `main` ๋ธŒ๋žœ์น˜๋Š” ํ•ญ์ƒ ์•ˆ์ •์ ์ด๊ณ  ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋ฉฐ, ๊ฐ ๊ธฐ๋Šฅ์ด๋‚˜ ๋ฒ„๊ทธ ์ˆ˜์ •์€ `main`์—์„œ ๋ถ„๊ธฐ๋œ ์งง์€ ์ˆ˜๋ช…์˜ ๊ฐœ๋ณ„ ๋ธŒ๋žœ์น˜์—์„œ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค [6, 7]. - * **Trunk-Based Development**: ์งง์€ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜(Trunk)์— ์ฝ”๋“œ๋ฅผ ๋น ๋ฅด๊ณ  ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ณ‘ํ•ฉํ•˜๋Š” ์ „๋žต์œผ๋กœ, ๊ฐ•๋ ฅํ•œ CI/CD ํ™˜๊ฒฝ๊ณผ ๊ฒฝํ—˜์ด ๋งŽ์€ ํŒ€์—๊ฒŒ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค [8, 9]. - * **Git Flow & GitHub Flow**: Git Flow๋Š” ๋ณ„๋„์˜ ๋ฆด๋ฆฌ์Šค ๋ธŒ๋žœ์น˜ ๋“ฑ์„ ๋‘์–ด ์Šค์ผ€์ค„์— ๋”ฐ๋ฅธ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์ข‹์ง€๋งŒ, ์ž‘์€ ํŒ€์—๊ฒŒ๋Š” ์ ˆ์ฐจ๊ฐ€ ๋ฌด๊ฒ์Šต๋‹ˆ๋‹ค [9]. ๋ฐ˜๋ฉด GitHub Flow๋Š” ๋” ๋‹จ์ˆœํ•˜๋ฉฐ ๋น ๋ฅธ ํ†ตํ•ฉ์„ ์ง€ํ–ฅํ•ฉ๋‹ˆ๋‹ค [10]. - -* **๋ช…๋ช… ๊ทœ์น™ ๋ฐ ์ถ”์ ์„ฑ (Naming Conventions & Traceability)** - * **๋ธŒ๋žœ์น˜ ๋ช…๋ช… (Branch Naming)**: ๋ธŒ๋žœ์น˜ ์ด๋ฆ„์—๋Š” ์ž‘์—…์˜ ์œ ํ˜•๊ณผ ํ‹ฐ์ผ“ ID, ์งง์€ ์„ค๋ช…์„ ํฌํ•จํ•˜๋Š” ๊ฒƒ(์˜ˆ: `feature/PROJ-123-user-auth`)์ด ๊ถŒ์žฅ๋˜๋ฉฐ, ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ์†Œ๋ฌธ์ž์™€ ํ•˜์ดํ”ˆ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [11, 12]. - * **์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ (Commit Messages)**: 'Conventional Commits' ์‚ฌ์–‘์„ ๋”ฐ๋ผ `feat:`, `fix:`, `docs:`, `refactor:`, `chore:` ๋“ฑ์˜ ์ ‘๋‘์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€๊ฒฝ ๋ชฉ์ ์„ ๋ช…ํ™•ํžˆ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [5, 13]. ์ปค๋ฐ‹์€ ๋…ผ๋ฆฌ์ ์ธ ๋‹จ์ผ ๋ณ€๊ฒฝ ์‚ฌํ•ญ๋งŒ์„ ํฌํ•จํ•˜๋Š” '์›์ž์  ์ปค๋ฐ‹(Atomic Commits)' ํ˜•ํƒœ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค [14]. - -* **๋ณ‘ํ•ฉ ๋ฐ ๋ฆฌ๋ทฐ ํ”„๋กœ์„ธ์Šค (Merging and Code Review)** - * **Pull Request (PR)**: ์ฝ”๋“œ๋ฅผ `main`์— ๋ณ‘ํ•ฉํ•˜๊ธฐ ์ „ ๋ฐ˜๋“œ์‹œ PR์„ ์—ด์–ด ์ตœ์†Œ 1๋ช… ์ด์ƒ์˜ ๋™๋ฃŒ ๋ฆฌ๋ทฐ๋ฅผ ๊ฑฐ์น˜๊ณ  CI ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [15, 16]. ๋ฆฌ๋ทฐ๊ฐ€ ์‰ฝ๊ฒŒ ์ง„ํ–‰๋˜๋„๋ก PR์€ ์ž‘๊ฒŒ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [13]. - * **์ถฉ๋Œ ์˜ˆ๋ฐฉ ๋ฐ ์ •๋ฆฌ**: ๋ณ‘ํ•ฉ ์ถฉ๋Œ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด `main` ๋ธŒ๋žœ์น˜์˜ ์ตœ์‹  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ž์ฃผ ๊ฐ€์ ธ์™€ ๋™๊ธฐํ™”(pull/rebase)ํ•ด์•ผ ํ•˜๋ฉฐ, ๋ณ‘ํ•ฉํ•  ๋•Œ๋Š” 'Squash & Merge'๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ณ  ๋ณ‘ํ•ฉ ํ›„์—๋Š” ์‚ฌ์šฉํ•œ ๋ธŒ๋žœ์น˜๋ฅผ ์ž๋™ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค [15, 17, 18]. - -## โš–๏ธ Trade-offs & Caveats -* **์˜ค๋ฒ„ํ—ค๋“œ vs. ์ œ์–ด๋ ฅ**: Git Flow์™€ ๊ฐ™์ด ๊ตฌ์กฐํ™”๋˜๊ณ  ๋ฌด๊ฑฐ์šด ํ”„๋กœ์„ธ์Šค๋Š” ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฆด๋ฆฌ์Šค ์ผ์ •์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์ข‹์ง€๋งŒ, ์†Œ๊ทœ๋ชจ ํŒ€์—๊ฒŒ๋Š” ํ”„๋กœ์„ธ์Šค ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋„ˆ๋ฌด ์ปค์„œ ๊ฐœ๋ฐœ ์†๋„๋ฅผ ์ €ํ•˜์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [9, 19]. ๋ฐ˜๋Œ€๋กœ ๋„ˆ๋ฌด ๋‹จ์ˆœํ•œ ์ „๋žต์€ ์—„๊ฒฉํ•œ ์ œ์–ด๊ฐ€ ํ•„์š”ํ•œ ๋Œ€ํ˜• ํ”„๋กœ์ ํŠธ์—์„œ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํŒ€ ๊ทœ๋ชจ์™€ ์š”๊ตฌ์‚ฌํ•ญ์— ๋งž์ถ˜ ์ „๋žต ์„ ํƒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค [20]. -* **Trunk-Based ๊ฐœ๋ฐœ์˜ ์ œ์•ฝ์‚ฌํ•ญ**: ๋ณ‘ํ•ฉ ์ถฉ๋Œ์„ ์ตœ์†Œํ™”ํ•˜๊ณ  ๋น ๋ฅธ ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•˜์ง€๋งŒ, ๊ฐœ๋ฐœํŒ€์˜ ๋†’์€ ์ˆ™๋ จ๋„์™€ ๊ฐ•๋ ฅํ•œ CI ๊ฒ€์ฆ ํŒŒ์ดํ”„๋ผ์ธ์ด ์ „์ œ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [9]. ๋˜ํ•œ, ๋ฏธ์™„์„ฑ๋œ ๊ธฐ๋Šฅ์ด ๋ณ‘ํ•ฉ๋  ์œ„ํ—˜์ด ์žˆ์œผ๋ฏ€๋กœ ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ(Feature flags)๋ฅผ ์ถ”๊ฐ€๋กœ ๋„์ž…ํ•ด์•ผ ํ•˜๋Š” ์ œ์•ฝ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [19]. -* **์žฅ๊ธฐ ๋ธŒ๋žœ์น˜(Long-lived Branches)์˜ ๋ฐ˜๋Œ€๊ธ‰๋ถ€**: ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ์„ ์œ„ํ•ด ๋ธŒ๋žœ์น˜๋ฅผ ๋„ˆ๋ฌด ์˜ค๋ž˜ ์œ ์ง€ํ•˜๋ฉด ๋ณ‘ํ•ฉ ์‹œ์ ์— ์—„์ฒญ๋‚œ ์ฝ”๋“œ ์ถฉ๋Œ(merge conflicts)์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค [12, 21]. ๋”ฐ๋ผ์„œ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ž‘์—…์ž๊ฐ€ ๋งค์ผ `main` ๋ธŒ๋žœ์น˜์™€ ๋™๊ธฐํ™”ํ•˜๋Š” ์ง€์†์ ์ธ ์œ ์ง€๋ณด์ˆ˜ ๋…ธ๋ ฅ์„ ๊ธฐ์šธ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค [18]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -#### [์›Œํฌํ”Œ๋กœ์šฐ ๋ฐ ๋ฐฉ๋ฒ•๋ก  (Workflow Strategies)] -- [[Feature Branch Workflow]] - - ์—ฐ๊ฒฐ ์ด์œ : ๋ฒ„๊ทธ ์ˆ˜์ •์ด๋‚˜ ์ƒˆ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ ์‹œ `main`๊ณผ ๋ถ„๋ฆฌ๋œ ๋…๋ฆฝ์ ์ด๊ณ  ์งง์€ ์ˆ˜๋ช…์˜ ๋ธŒ๋žœ์น˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ „๋žต์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. [6, 7] - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์–ด๋–ป๊ฒŒ `main` ๋ธŒ๋žœ์น˜์˜ ์•ˆ์ •์„ฑ์„ ํ›ผ์†ํ•˜์ง€ ์•Š์œผ๋ฉด์„œ๋„ ๋‹ค์ˆ˜์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -- [[Trunk-Based Development]] - - ์—ฐ๊ฒฐ ์ด์œ : ๋ชจ๋“  ๊ฐœ๋ฐœ์ž๊ฐ€ ๋นˆ๋ฒˆํ•˜๊ฒŒ ์งง์€ ์ฃผ๊ธฐ๋กœ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜(Trunk)์— ์ฝ”๋“œ๋ฅผ ๋ณ‘ํ•ฉํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. [8, 9] - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ง€์†์  ํ†ตํ•ฉ(CI)์„ ์–ด๋–ป๊ฒŒ ๋ณด์žฅํ•˜๋ฉฐ, ์žฅ๊ธฐ ๋ธŒ๋žœ์น˜๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ํšŒํ”ผํ•˜๋Š”์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -- [[Git Flow]] - - ์—ฐ๊ฒฐ ์ด์œ : ๋ฆด๋ฆฌ์Šค์šฉ ๋ธŒ๋žœ์น˜์™€ ๊ฐœ๋ฐœ์šฉ ๋ธŒ๋žœ์น˜๋ฅผ ๋ช…ํ™•ํžˆ ๋‚˜๋ˆ„์–ด ๋ณต์žกํ•œ ํ”„๋กœ์ ํŠธ ๋ฆด๋ฆฌ์Šค๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. [9, 19] - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํŒ€์˜ ๊ทœ๋ชจ์™€ ๋ฐฐํฌ ์Šค์ผ€์ค„์— ๋”ฐ๋ผ ์›Œํฌํ”Œ๋กœ์šฐ์— ์–ด๋–ค ๊ตฌ์กฐ์  ๋ ˆ์ด์–ด๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - -#### [ํ˜‘์—… ๋ฐ ํ’ˆ์งˆ ๊ด€๋ฆฌ (Quality Assurance & Collaboration)] -- [[Pull Request (PR)]] - - ์—ฐ๊ฒฐ ์ด์œ : ์ฝ”๋“œ๋ฅผ ์ฃผ ๋ธŒ๋žœ์น˜์— ๋ณ‘ํ•ฉํ•˜๊ธฐ ์ „, ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋™๋ฃŒ์—๊ฒŒ ๊ฒ€ํ† ๋ฐ›๋Š” ํ•ต์‹ฌ ํ’ˆ์งˆ ํ†ต์ œ ์ ˆ์ฐจ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. [13, 16] - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ฝ”๋“œ ๋ฆฌ๋ทฐ์™€ CI ํ…Œ์ŠคํŠธ ์ž๋™ํ™”๊ฐ€ ์–ด๋–ป๊ฒŒ ์‹ค์ œ ์ฝ”๋“œ ํ’ˆ์งˆ์„ ์œ ์ง€ํ•˜๊ณ  ํŒ€ ๋‚ด ์ง€์‹ ๊ณต์œ ๋ฅผ ๋•๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -- [[Conventional Commits]] - - ์—ฐ๊ฒฐ ์ด์œ : `feat:`, `fix:`์™€ ๊ฐ™์ด ํ‘œ์ค€ํ™”๋œ ์ ‘๋‘์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€์˜ ์˜๋„๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ตฌ๋ฌธ ๊ทœ์น™์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. [5, 13] - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ํ†ตํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์ถ”์ ์„ฑ ํ™•๋ณด์™€ ๋ฆด๋ฆฌ์Šค ๋…ธํŠธ ์ž๋™ํ™”์— ์–ด๋–ป๊ฒŒ ๊ธฐ์—ฌํ•˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - -### Deeper Research Questions -- ์†Œ๊ทœ๋ชจ ํŒ€(2~5๋ช…)์ด ์„ฑ์žฅํ•˜์—ฌ 10๋ช… ์ด์ƒ์˜ ๋Œ€๊ทœ๋ชจ ์กฐ์ง์ด ๋  ๋•Œ, Feature-Branch ์›Œํฌํ”Œ๋กœ์šฐ์—์„œ Git Flow ๋“ฑ ๋” ๋ณต์žกํ•œ ์ „๋žต์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋Š” ๊ตฌ์ฒด์ ์ด๊ณ  ์•ˆ์ „ํ•œ ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? [9, 20] -- Trunk-based ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ๋ถˆ์™„์ „ํ•œ ์ฝ”๋“œ๋ฅผ ๋ฐฐํฌํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ(Feature Flags)๋Š” ๋ฒ„์ „ ๊ด€๋ฆฌ ๋ฐ ๋ธŒ๋žœ์นญ ์ „๋žต์˜ ๋ณต์žก์„ฑ์— ์–ด๋–ค ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”๊ฐ€? [19] -- Pull Request ์™„๋ฃŒ ์‹œ 'Squash & Merge' ๋ฐฉ์‹๊ณผ 'Merge Commit' ๋ฐฉ์‹ ๊ฐ„์˜ ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ ๊ฐ€๋…์„ฑ ๋ฐ ๋กค๋ฐฑ ์šฉ์ด์„ฑ ์ฐจ์ด๋Š” ์–ด๋–ป๊ฒŒ ๋‚˜ํƒ€๋‚˜๋Š”๊ฐ€? [15, 17, 18] -- ๋ธŒ๋žœ์น˜ ์ด๋ฆ„๊ณผ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€์— ํ‹ฐ์ผ“ ID๋ฅผ ์˜๋ฌด์ ์œผ๋กœ ํฌํ•จํ•˜๋Š” ๊ฑฐ๋ฒ„๋„Œ์Šค๋Š”, ์‹ค์ œ ์ด์Šˆ ํŠธ๋ž˜ํ‚น ๋„๊ตฌ(์˜ˆ: JIRA) ๋ฐ CI/CD ํŒŒ์ดํ”„๋ผ์ธ๊ณผ ๊ฒฐํ•ฉ ์‹œ ์–ด๋–ค ์ž๋™ํ™” ํ˜œํƒ์„ ์ œ๊ณตํ•˜๋Š”๊ฐ€? [2, 10] -- ์žฅ๊ธฐ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜(Long-lived feature branches)๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ๊ฑฐ๋Œ€ํ•œ ๋ณ‘ํ•ฉ ์ถฉ๋Œ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ํŒ€์€ ์ผ์ผ ์ž‘์—…์—์„œ ์–ด๋–ค ๋™๊ธฐํ™” ํŒจํ„ด์„ ์Šต๊ด€ํ™”ํ•ด์•ผ ํ•˜๋Š”๊ฐ€? [18, 21] - -### Practical Application Contexts -- **Implementation:** ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ ์‹œ `feature/PROJ-123-user-auth`์ฒ˜๋Ÿผ ํ‹ฐ์ผ“ ID๋ฅผ ํฌํ•จํ•˜๋Š” ๋ช…๋ช… ๊ทœ์น™์„ ์ ์šฉํ•˜๊ณ , `feat: add login form` ๋“ฑ์˜ Conventional Commits ํ˜•์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„ ์ด๋ ฅ์„ ์ฒด๊ณ„์ ์œผ๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค [10, 11]. -- **System Design:** ์ฝ”๋“œ๋ฅผ ํ•˜๋‚˜์˜ ๋…ผ๋ฆฌ์  ๋‹จ์œ„๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ์›์ž์  ์ปค๋ฐ‹(Atomic Commits) ๊ทœ์น™์„ ๋„์ž…ํ•˜๊ณ , CI/CD ์ฒดํฌ๊ฐ€ ํ†ต๊ณผ๋˜๊ณ  1์ธ ์ด์ƒ์ด ์Šน์ธํ•ด์•ผ๋งŒ `main`์— ๋ณ‘ํ•ฉ ๊ฐ€๋Šฅํ•˜๋„๋ก ๋ธŒ๋žœ์น˜ ๋ณดํ˜ธ(Branch Protection) ์‹œ์Šคํ…œ์„ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค [14, 15]. -- **Operation / Maintenance:** `main` ๋ธŒ๋žœ์น˜๋Š” ํ•ญ์ƒ ์•ˆ์ •์ ์ด๊ณ  ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ(deployable) ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋„๋ก ์šด์˜ํ•˜๋ฉฐ, ๋ณ‘ํ•ฉ ์™„๋ฃŒ ํ›„ ์‚ฌ์šฉ์ด ๋๋‚œ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜๋ฅผ ์ž๋™ ์‚ญ์ œ ์„ค์ •ํ•˜์—ฌ ์ €์žฅ์†Œ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค [7, 15, 18]. -- **Learning Path:** ์ฒ˜์Œ์—๋Š” ๋ณต์žกํ•œ ๋ฃฐ ์—†์ด ๋‹จ์ˆœํ•œ Feature-Branch ์›Œํฌํ”Œ๋กœ์šฐ์™€ ๋ช…ํ™•ํ•œ ๋„ค์ด๋ฐ ๊ทœ์น™์„ ์ตํžˆ๊ณ , ์ˆ™๋ จ๋„๊ฐ€ ๋†’์•„์ง€๋ฉด ์ž๋™ํ™”๋œ CI ํ™˜๊ฒฝ ํ•˜์˜ Trunk-Based ๊ฐœ๋ฐœ ๋˜๋Š” ๋ณต์žกํ•œ ๋ฒ„์ „ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ Git Flow๋กœ ํ•™์Šต์„ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค [9, 19, 20]. -- **My Project Relevance:** ํ”„๋ก ํŠธ์—”๋“œ/React ๊ฐœ๋ฐœ ํ”„๋กœ์ ํŠธ ๋“ฑ์˜ ํŒ€ ๋‹จ์œ„ ํ˜‘์—… ์‹œ, ๋ถˆํ•„์š”ํ•œ ์ ˆ์ฐจ ์—†์ด ์ฝ”๋“œ ์ถฉ๋Œ์„ ์ตœ์†Œํ™”ํ•˜๊ณ  ์ถ”์  ๊ฐ€๋Šฅํ•œ ๋ณ€๊ฒฝ ๋‚ด์—ญ์„ ๋ณด์žฅํ•˜๋Š” ํ˜‘์—… ๊ธฐ์ค€์„ ๋งˆ๋ จํ•˜๋Š” ๋ฐ ์ฆ‰๊ฐ์ ์œผ๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1, 22]. - -### Adjacent Topics -- [[Continuous Integration / Continuous Deployment (CI/CD)]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: PR ๋‹จ๊ณ„์—์„œ ์ž๋™ํ™”๋œ ํ…Œ์ŠคํŠธ ๋ฐ ๋ฆฐํŒ…์„ ์‹คํ–‰ํ•˜๊ณ , ๋ฉ”์ธ ๋ธŒ๋žœ์น˜ ๋ณ‘ํ•ฉ ์‹œ ๋ฐฐํฌ๋ฅผ ์ž๋™ํ™”ํ•˜์—ฌ ๋ฒ„์ „ ๊ด€๋ฆฌ ๋„๊ตฌ์™€ ์–ด๋–ป๊ฒŒ ์‹œ๋„ˆ์ง€๋ฅผ ๋‚ด๋Š”์ง€ ์กฐ์‚ฌ. [1, 19] -- [[Issue Tracking Systems]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: JIRA๋‚˜ GitHub Issues ๋“ฑ์˜ ๋„๊ตฌ๊ฐ€ Git์˜ ํ‹ฐ์ผ“ ID ๊ฑฐ๋ฒ„๋„Œ์Šค์™€ ๊ฒฐํ•ฉ๋˜์–ด ์š”๊ตฌ์‚ฌํ•ญ๋ถ€ํ„ฐ ์ฝ”๋“œ ๋ณ€๊ฒฝ๊นŒ์ง€ ์–ด๋–ป๊ฒŒ ์™„๋ฒฝํ•œ ์ถ”์ ์„ฑ(Traceability)์„ ๋ณด์žฅํ•˜๋Š”์ง€ ์กฐ์‚ฌ. [2, 23] - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Visual Regression Testing.md b/00_Raw/Visual Regression Testing.md deleted file mode 100644 index 7711b648..00000000 --- a/00_Raw/Visual Regression Testing.md +++ /dev/null @@ -1,57 +0,0 @@ -# [[Visual Regression Testing]] - -## ๐Ÿ“Œ Brief Summary -์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ(Visual Regression Testing)๋Š” ์Šคํ† ๋ฆฌ๋ถ(Storybook) ๋“ฑ์˜ ๋„๊ตฌ๋กœ ๋ Œ๋”๋ง๋œ ์ปดํฌ๋„ŒํŠธ์˜ ํ”ฝ์…€ ๋‹จ์œ„ ์Šคํฌ๋ฆฐ์ƒท์„ ์บก์ฒ˜ํ•˜์—ฌ ์ด์ „์— ์•Œ๋ ค์ง„ "์ •์ƒ(baseline)" ์ƒํƒœ์˜ ์Šคํฌ๋ฆฐ์ƒท๊ณผ ์ž๋™์œผ๋กœ ๋น„๊ตํ•˜๋Š” ํ…Œ์ŠคํŠธ ๋ฐฉ์‹์ด๋‹ค [1, 2]. ์ด๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๋Š” ํ’€ ๋ฆฌํ€˜์ŠคํŠธ(PR) ๊ณผ์ •์—์„œ ์˜๋„์น˜ ์•Š์€ UI ๋ ˆ์ด์•„์›ƒ, ์ƒ‰์ƒ, ํƒ€์ดํฌ๊ทธ๋ž˜ํ”ผ ๋“ฑ์˜ ์‹œ๊ฐ์  ๋ณ€๊ฒฝ์ด๋‚˜ ๊ฒฐํ•จ์„ ์ฐพ์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค [3-5]. HTML ๋งˆํฌ์—…๋งŒ ๋น„๊ตํ•˜๋Š” ๊ธฐ์กด์˜ ์Šค๋ƒ…์ƒท ํ…Œ์ŠคํŠธ์™€ ๋‹ฌ๋ฆฌ, ์‹ค์ œ ์‚ฌ์šฉ์ž๊ฐ€ ๊ฒฝํ—˜ํ•˜๋Š” ํ™”๋ฉด ํ”ฝ์…€์„ ์ง์ ‘ ๊ฒ€์ฆํ•˜๋ฏ€๋กœ ์ถ”๊ฐ€์ ์ธ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ์ด๋‚˜ ์œ ์ง€๋ณด์ˆ˜ ๋ถ€๋‹ด์„ ์ค„์ด๋ฉด์„œ๋„ ์˜คํƒ(false positive)์„ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ํŠน์ง•์ด๋‹ค [1, 2]. - -## ๐Ÿ“– Core Content -* **์ž‘๋™ ์›๋ฆฌ ๋ฐ ํ”„๋กœ์„ธ์Šค:** ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ๋Š” ์ฝ”๋“œ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ ๋ชจ๋“  ์Šคํ† ๋ฆฌ(story)๋ฅผ ์‹ค์ œ ๋ธŒ๋ผ์šฐ์ €(Chrome, Firefox, Safari ๋“ฑ) ํ™˜๊ฒฝ์—์„œ ๋ Œ๋”๋งํ•˜๊ณ , ํ•ด๋‹น ํ™”๋ฉด์„ ์บก์ฒ˜ํ•˜์—ฌ ๊ธฐ์กด์˜ ๊ธฐ์ค€์„ (baseline)๊ณผ ๋น„๊ตํ•œ๋‹ค [4, 6]. ๋งŒ์•ฝ ๋ ˆ์ด์•„์›ƒ์ด๋‚˜ ์ƒ‰์ƒ ๋“ฑ์— ์˜๋„์น˜ ์•Š์€ ๋ณ€ํ™”๊ฐ€ ๊ฐ์ง€๋˜๋ฉด ํ•ด๋‹น ์ฐจ์ด์ ์„ ๊ฐ•์กฐํ•˜์—ฌ PR์—์„œ ์ˆ˜๋™ ๊ฒ€ํ† ๋ฅผ ๊ฑฐ์น˜๊ฒŒ ํ•จ์œผ๋กœ์จ ์‹œ๊ฐ์  ๊ฒฐํ•จ์ด ํ”„๋กœ๋•์…˜์œผ๋กœ ๋ฐฐํฌ๋˜๋Š” ๊ฒƒ์„ ์ฐจ๋‹จํ•œ๋‹ค [3, 6, 7]. ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์˜๋„๋œ ๊ฒƒ์ด๋ผ๋ฉด ๊ฐœ๋ฐœ์ž๊ฐ€ ์ƒˆ๋กœ์šด ๊ธฐ์ค€์„ ์œผ๋กœ ์Šน์ธ(accept)ํ•˜์—ฌ ๋กœ์ปฌ ๋ฐ CI ํ™˜๊ฒฝ์— ๋™๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค [7, 8]. -* **์Šค๋ƒ…์ƒท ํ…Œ์ŠคํŠธ(Snapshot Testing)์™€์˜ ์ฐจ์ด์ :** ๊ธฐ์กด ์Šค๋ƒ…์ƒท ํ…Œ์ŠคํŠธ๋Š” ๋ Œ๋”๋ง๋œ HTML ๋งˆํฌ์—… ๋ธ”๋ก์„ ๋น„๊ตํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ฝ”๋“œ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์œผ๋‚˜ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์ด๋Š” ์‹ค์ œ ์‹œ๊ฐ์  ๋ณ€๊ฒฝ์ด ์—†๋Š” ๊ฒฝ์šฐ์—๋„ ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ•˜๋Š” ์˜คํƒ(false positive)์ด ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฝ๋‹ค [2]. ๋ฐ˜๋ฉด ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ๋Š” ๋ Œ๋”๋ง๋œ ํ”ฝ์…€ ์ž์ฒด๋ฅผ ๋น„๊ตํ•˜๋ฏ€๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ์‹ค์ œ๋กœ ๊ฒฝํ—˜ํ•˜๋Š” UI์˜ ๋ชจ์–‘, ๊ฐ„๊ฒฉ, ๋ฐ˜์‘ํ˜• ๋™์ž‘ ๋“ฑ์„ ํ›จ์”ฌ ๋” ์ •ํ™•ํ•˜๊ณ  ํ’๋ถ€ํ•˜๊ฒŒ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๋‹ค [2, 5]. -* **์ธํ„ฐ๋ž™์…˜(Interaction) ๊ธฐ๋ฐ˜ ์ƒํƒœ ๊ฒ€์ฆ:** ์ปดํฌ๋„ŒํŠธ์˜ ๋กœ๋”ฉ, ์—๋Ÿฌ, ํ˜ธ๋ฒ„(hover), ๋ฉ”๋‰ด ์—ด๋ฆผ ๋“ฑ์˜ ๋‹ค์–‘ํ•œ UI ์ƒํƒœ๋ฅผ ๊ฒ€์ฆํ•˜๊ธฐ ์œ„ํ•ด ์Šคํ† ๋ฆฌ๋ถ์˜ ์ธํ„ฐ๋ž™์…˜ ํ…Œ์ŠคํŠธ์™€ ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ๋ฅผ ๊ฒฐํ•ฉํ•  ์ˆ˜ ์žˆ๋‹ค [9]. ์ธํ„ฐ๋ž™์…˜ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด ์ปดํฌ๋„ŒํŠธ๋ฅผ ํŠน์ • ์ƒํƒœ๋กœ ๋งŒ๋“  ํ›„ ์Šคํฌ๋ฆฐ์ƒท์„ ์ฐ์Œ์œผ๋กœ์จ ๋™์ ์ธ ํ–‰๋™์— ๋Œ€ํ•œ ์‹œ๊ฐ์  ๊ฒฐํ•จ ์œ ๋ฌด๊นŒ์ง€ ํ•˜๋‚˜์˜ ์›Œํฌํ”Œ๋กœ์šฐ ์•ˆ์—์„œ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค [9, 10]. -* **CI ํŒŒ์ดํ”„๋ผ์ธ ์ž๋™ํ™”:** ์ด ํ…Œ์ŠคํŠธ๋Š” GitHub Actions, GitLab Pipelines ๋“ฑ CI ํ™˜๊ฒฝ๊ณผ ์›ํ™œํ•˜๊ฒŒ ํ†ตํ•ฉ๋˜์–ด ํ’€ ๋ฆฌํ€˜์ŠคํŠธ(PR)๋งˆ๋‹ค ์ž๋™์œผ๋กœ ์‹คํ–‰๋œ๋‹ค [11, 12]. ํ…Œ์ŠคํŠธ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด PR์— UI ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•œ ์•Œ๋ฆผ(badge)์„ ์ œ๊ณตํ•˜์—ฌ, ๋ฆฌ๋ทฐ์–ด๊ฐ€ ๋ชจ๋“  ์ƒํƒœ๋ฅผ ์ผ์ผ์ด ํ™•์ธํ•˜๋Š” ๋Œ€์‹  ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„(diffs)์—๋งŒ ์ง‘์ค‘ํ•ด์„œ ๋ฆฌ๋ทฐํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š”๋‹ค [6, 12]. - -## โš–๏ธ Trade-offs & Caveats -* **๋ฏธ์„ธํ•œ ํ”ฝ์…€ ์ฐจ์ด๋กœ ์ธํ•œ ๋…ธ์ด์ฆˆ(Flakiness):** ๋ธŒ๋ผ์šฐ์ €์˜ ์ด๋ฏธ์ง€ ์••์ถ• ๋…ธ์ด์ฆˆ๋‚˜ ์•ˆํ‹ฐ์•จ๋ฆฌ์–ด์‹ฑ(anti-aliasing) ์ฒ˜๋ฆฌ ๋“ฑ ์•„์ฃผ ๋ฏธ์„ธํ•œ ํ”ฝ์…€ ์ฐจ์ด ๋•Œ๋ฌธ์— ์‹ค์ œ๋กœ๋Š” ๊ฒฐํ•จ์ด ์•„๋‹˜์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์‹œ๊ฐ์  ๋ณ€๊ฒฝ์œผ๋กœ ๊ฐ์ง€๋˜๋Š” ํ…Œ์ŠคํŠธ ๋ถˆ์•ˆ์ •์„ฑ(Flake)์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค [11, 13]. ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ ๋„๊ตฌ์—์„œ๋Š” ์ƒ‰์ƒ ์ฐจ์ด ํ—ˆ์šฉ์น˜(color-delta tolerance) ์ž„๊ณ„๊ฐ’์„ ์„ค์ •ํ•˜์—ฌ ํ•ด๋‹น ๋ฒ”์ฃผ ์•„๋ž˜์˜ ์ฐจ์ด๋Š” ๋…ธ์ด์ฆˆ๋กœ ๋ฌด์‹œํ•˜๋Š” ์ตœ์ ํ™” ์ž‘์—…์ด ์š”๊ตฌ๋œ๋‹ค [10, 13]. -* **๋น„๋™๊ธฐ ์š”์†Œ ๋ฐ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ œ์–ด์˜ ํ•„์š”์„ฑ:** ์ปดํฌ๋„ŒํŠธ์— ํฌํ•จ๋œ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด๋‚˜ ๋น„๋™๊ธฐ ์—์…‹, ํฐํŠธ ๋“ฑ์ด ์™„์ „ํžˆ ๋ Œ๋”๋ง๋˜๊ธฐ ์ „์— ์Šคํฌ๋ฆฐ์ƒท์ด ์บก์ฒ˜๋˜๋ฉด ๋งค๋ฒˆ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์™€ ์ผ๊ด€๋œ ํ…Œ์ŠคํŠธ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•ด์ง„๋‹ค [10, 11]. ๋”ฐ๋ผ์„œ ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ ๋„๊ตฌ(Happo ๋“ฑ)๋Š” ์บก์ฒ˜ ์ „ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ž๋™์œผ๋กœ ์Œ์†Œ๊ฑฐ(silence) ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜ ๋น„๋™๊ธฐ ์š”์†Œ์˜ ๋กœ๋”ฉ์„ ๊ฐ•์ œ๋กœ ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๋Š” ๊ธฐ์ˆ ์  ์ œ์•ฝ๊ณผ ์ถ”๊ฐ€ ์„ค์ •์ด ํ•„์š”ํ•˜๋‹ค [10, 11]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -#### [ํ…Œ์ŠคํŠธ ๋ฐ ๊ฒ€์ฆ ๊ธฐ์ˆ ] -- [[Snapshot Testing]] - - ์—ฐ๊ฒฐ ์ด์œ : ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ์™€ ๋Œ€์กฐ๋˜๋Š” ํ…Œ์ŠคํŠธ ๋ฐฉ์‹์œผ๋กœ, ํ”ฝ์…€์ด ์•„๋‹Œ ๋ Œ๋”๋ง๋œ HTML ๋งˆํฌ์—… ์ฝ”๋“œ ๋ฉ์–ด๋ฆฌ๋ฅผ ๋น„๊ตํ•œ๋‹ค [2]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: HTML ๊ตฌ์กฐ ๋น„๊ต ๋ฐฉ์‹์ด ์™œ ๋นˆ๋ฒˆํ•˜๊ฒŒ ์˜คํƒ(False Positive)์„ ๋ฐœ์ƒ์‹œํ‚ค๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ํ”ฝ์…€ ๊ธฐ๋ฐ˜ ๋น„๊ต๊ฐ€ ์œ ์ง€๋ณด์ˆ˜์— ์™œ ๋” ์œ ๋ฆฌํ•œ์ง€ ๋ช…ํ™•ํ•˜๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค [2]. -- [[Interaction Testing]] - - ์—ฐ๊ฒฐ ์ด์œ : ์‚ฌ์šฉ์ž์˜ ์ƒํ˜ธ์ž‘์šฉ์ด๋‚˜ ์ด๋ฒคํŠธ๋ฅผ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ์˜ ํŠน์ • UI ์ƒํƒœ๋ฅผ ์œ ๋„ํ•˜๋Š” ํ…Œ์ŠคํŠธ ๋ฐฉ์‹์ด๋‹ค [5, 10]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ •์  UI ํ™”๋ฉด๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋กœ๋”ฉ, ์—๋Ÿฌ, ํด๋ฆญ ์‹œ ๋“œ๋กญ๋‹ค์šด ์˜คํ”ˆ ๋“ฑ ๋™์ ์œผ๋กœ ๋ณ€ํ™”ํ•˜๋Š” UI ์ƒํƒœ๋ฅผ ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ๊ฐ€ ์–ด๋–ป๊ฒŒ ์บก์ฒ˜ํ•˜๊ณ  ๊ฒ€์ฆํ•˜๋Š”์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค [9, 10]. - -#### [๊ตฌํ˜„ ๋ฐ ํ™œ์šฉ ๋„๊ตฌ] -- [[Storybook]] - - ์—ฐ๊ฒฐ ์ด์œ : UI ์ปดํฌ๋„ŒํŠธ๋ฅผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ณต์žกํ•œ ๋กœ์ง๊ณผ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ฒฉ๋ฆฌ๋œ ํ™˜๊ฒฝ์—์„œ ์‹œ๊ฐ์ ์œผ๋กœ ๊ฐœ๋ฐœํ•˜๊ณ  ๋ฌธ์„œํ™”ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋„๊ตฌ์ด๋‹ค [3, 6]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ๊ฐ€ ์ „์ฒด ํŽ˜์ด์ง€ ๋‹จ์œ„๊ฐ€ ์•„๋‹Œ ๊ฐœ๋ณ„ ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ(Story) ๋‹จ์œ„๋กœ ๋ Œ๋”๋ง๋˜๊ณ  ๊ธฐ์ค€์„ ๊ณผ ๋น„๊ต๋˜๋Š” ์•„ํ‚คํ…์ฒ˜์  ๊ธฐ๋ฐ˜์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค [1]. -- [[Chromatic]] / [[Happo]] - - ์—ฐ๊ฒฐ ์ด์œ : Storybook๊ณผ ์—ฐ๊ฒฐ๋˜์–ด ์‹ค์ œ ๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋ฐ˜์˜ ์Šคํฌ๋ฆฐ์ƒท ์บก์ฒ˜, ๋ฒ ์ด์Šค๋ผ์ธ ํ”ฝ์…€ ๋น„๊ต, CI/CD ์—ฐ๋™ ๋“ฑ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค(๋„๊ตฌ)์ด๋‹ค [1, 3, 4]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ž๋™ํ™”๋œ ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ๊ฐ€ ๋ธŒ๋ผ์šฐ์ € ๊ฐ„์˜ ๋ Œ๋”๋ง ์ฐจ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ๋ณ‘๋ ฌ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ  ํ’€ ๋ฆฌํ€˜์ŠคํŠธ(PR) ํ”„๋กœ์„ธ์Šค์™€ ์–ด๋–ป๊ฒŒ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค [4, 12]. - -### Deeper Research Questions -- Snapshot Testing์—์„œ Visual Regression Testing์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ๋•Œ, ๋Œ€๊ทœ๋ชจ ์ปดํฌ๋„ŒํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ™˜๊ฒฝ์—์„œ ์ดˆ๊ธฐ ๊ธฐ์ค€์„ (baseline) ๊ตฌ์ถ• ๋ฐ ์Šคํ† ๋ฆฌ์ง€ ์œ ์ง€๋ณด์ˆ˜ ๋น„์šฉ์€ ์–ด๋–ป๊ฒŒ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? -- Chromatic์ด๋‚˜ Happo์™€ ๊ฐ™์€ ๋„๊ตฌ๊ฐ€ ํฌ๋กœ์Šค ๋ธŒ๋ผ์šฐ์ €(Chrome, Safari, Firefox ๋“ฑ)์—์„œ ๋™์ผํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋งํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” OS/๋ธŒ๋ผ์šฐ์ € ์—”์ง„๋ณ„ ๋ฏธ์„ธํ•œ ๋ Œ๋”๋ง ์ฐจ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋ณด์ •ํ•˜๋Š”๊ฐ€? -- ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ ํŒŒ์ดํ”„๋ผ์ธ์„ CI/CD์— ํ†ตํ•ฉํ–ˆ์„ ๋•Œ ๋นŒ๋“œ ์‹œ๊ฐ„ ์ง€์—ฐ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ(Parallelization) ๋ฐ ์ตœ์ ํ™” ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? -- ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋ฐ ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๋ณต์žกํ•œ ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ์ปดํฌ๋„ŒํŠธ์—์„œ ํ…Œ์ŠคํŠธ์˜ ๋ถˆ์•ˆ์ •์„ฑ(Flakiness)์„ ์ฝ”๋“œ ๋ ˆ๋ฒจ์—์„œ ๊ทผ๋ณธ์ ์œผ๋กœ ์ œ๊ฑฐํ•˜๋ ค๋ฉด ์ปดํฌ๋„ŒํŠธ๋ฅผ ์–ด๋–ป๊ฒŒ ์„ค๊ณ„ํ•ด์•ผ ํ•˜๋Š”๊ฐ€? -- Visual Regression Testing๊ณผ Accessibility Regression Testing์„ ํ•˜๋‚˜์˜ ์›Œํฌํ”Œ๋กœ์šฐ๋กœ ๊ฒฐํ•ฉํ–ˆ์„ ๋•Œ, ์ ‘๊ทผ์„ฑ ์œ„๋ฐ˜ ์‚ฌํ•ญ์ด ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ค ์‹œ๊ฐ์  ์ง€ํ‘œ์™€ ํ•จ๊ป˜ ๋ฆฌํฌํŠธ๋˜๋ฉฐ PR ๋ฆฌ๋ทฐ ํ”„๋กœ์„ธ์Šค๋Š” ์–ด๋–ป๊ฒŒ ํšจ์œจํ™”๋˜๋Š”๊ฐ€? - -### Practical Application Contexts -- **Implementation:** Storybook์œผ๋กœ UI ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฐœ๋ฐœํ•œ ํ›„, Chromatic์ด๋‚˜ Happo ๋“ฑ์˜ ์• ๋“œ์˜จ์„ ์„ค์น˜ํ•˜์—ฌ ์ฝ”๋“œ ๋ณ€๊ฒฝ ์‹œ๋งˆ๋‹ค ๊ฐ ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ๋ณ„ ์Šคํฌ๋ฆฐ์ƒท์„ ์ž๋™์œผ๋กœ ์บก์ฒ˜ํ•˜๊ณ  ๊ธฐ์ค€์„ ๊ณผ ๋น„๊ตํ•˜๋„๋ก ์„ค์ •ํ•œ๋‹ค [4, 14]. -- **System Design:** ํ”„๋ก ํŠธ์—”๋“œ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ ์‹œ, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ UI๋ฅผ ์ฒ ์ €ํžˆ ๋ถ„๋ฆฌํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ตฌ์ถ•ํ•˜๊ณ , ์‹œ๊ฐ์  ๊ฒ€์ฆ ์‹œ์Šคํ…œ์„ ๋„์ž…ํ•˜์—ฌ ๋Œ€๊ทœ๋ชจ ํŒ€์ด ๋™์‹œ์— ๊ฐœ๋ฐœํ•˜๋”๋ผ๋„ ์ผ๊ด€๋œ ๋””์ž์ธ ์‹œ์Šคํ…œ์ด ํ›ผ์†๋˜์ง€ ์•Š๋„๋ก ๋ฐฉ์–ด ์ฒด๊ณ„๋ฅผ ๋งˆ๋ จํ•œ๋‹ค [3, 4]. -- **Operation / Maintenance:** CI ํŒŒ์ดํ”„๋ผ์ธ(GitHub Actions ๋“ฑ)์— ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ๋ฅผ ํ•„์ˆ˜ ๋‹จ๊ณ„๋กœ ์ถ”๊ฐ€ํ•˜์—ฌ, ๋ณ€๊ฒฝ๋œ ๋””์ž์ธ ์ฝ”๋“œ๊ฐ€ PR์— ์˜ฌ๋ผ์˜ฌ ๋•Œ๋งˆ๋‹ค ์˜๋„์น˜ ์•Š์€ ๋ ˆ์ด์•„์›ƒ ๊นจ์ง ํ˜„์ƒ์„ ์ž๋™์œผ๋กœ ๊ฐ์ง€ํ•˜๊ณ  ๋ฆฌ๋ทฐ์–ด์—๊ฒŒ ์‹œ๊ฐ์  Diff๋ฅผ ์ œ๊ณตํ•˜์—ฌ ์šด์˜ ์œ ์ง€๋ณด์ˆ˜ ๋ถ€๋‹ด์„ ์ค„์ธ๋‹ค [3, 6, 12]. -- **Learning Path:** React ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜ UI ์ž‘์„ฑ โ†’ Storybook์„ ํ™œ์šฉํ•œ ์ปดํฌ๋„ŒํŠธ ๋ฌธ์„œํ™” ๋ฐ CDD(Component-Driven Development) โ†’ ์ธํ„ฐ๋ž™์…˜(Interaction) ํ…Œ์ŠคํŠธ ์ž‘์„ฑ โ†’ ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ ์ž๋™ํ™” ์ˆœ์œผ๋กœ ํ”„๋ก ํŠธ์—”๋“œ ํ’ˆ์งˆ ๊ฒ€์ฆ ํŒŒ์ดํ”„๋ผ์ธ์„ ํ•™์Šตํ•œ๋‹ค [9, 15]. -- **My Project Relevance:** ํ”„๋ก ํŠธ์—”๋“œ ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•˜๊ฑฐ๋‚˜ ์ˆ˜๋ฐฑ ๊ฐœ์˜ ํ™”๋ฉด์—์„œ ๊ณต์œ ๋˜๋Š” ์ฝ”์–ด UI ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฒ„์ „์„ ์—…๊ทธ๋ ˆ์ด๋“œํ•  ๋•Œ, ๋‹ค๋ฅธ ํŒ€์˜ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์˜๋„์น˜ ์•Š์€ ํŒŒ๊ธ‰ ํšจ๊ณผ(Side Effect) ๋ฐ ์‹œ๊ฐ์  ๊นจ์ง์„ ์•ˆ์ „ํ•˜๊ฒŒ ๊ฐ์ง€ํ•˜๊ณ  ํ™•์‹ ์„ ๊ฐ–๊ณ  ๋ฐฐํฌํ•˜๋Š” ๋ฐ ํ•ต์‹ฌ์ ์ธ ์—ญํ• ์„ ํ•œ๋‹ค [3, 16]. - -### Adjacent Topics -- [[Accessibility Regression Testing]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ ์›Œํฌํ”Œ๋กœ์šฐ์™€ ๊ฒฐํ•ฉํ•˜์—ฌ, ์ƒˆ๋กœ์šด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๋ณ„๋„๋กœ ์ž‘์„ฑํ•  ํ•„์š” ์—†์ด ์Šคํฌ๋ฆฐ์ƒท ์‹คํ–‰ ๋‹จ๊ณ„์—์„œ UI์˜ ์ ‘๊ทผ์„ฑ ์œ„๋ฐ˜(๋ช…๋„ ๋Œ€๋น„ ๋ถ€์กฑ, ํ‚ค๋ณด๋“œ ํฌ์ปค์Šค ๋ˆ„๋ฝ ๋“ฑ)๊นŒ์ง€ ๋™์‹œ์— ์ž๋™ ๊ฒ€์ฆํ•˜๋Š” ์˜์—ญ์œผ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋‹ค [9, 10]. -- [[Continuous Integration (CI) Pipelines]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: GitHub Actions, CircleCI ๋“ฑ์˜ CI ๋„๊ตฌ์—์„œ ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ ์ธํ”„๋ผ๊ฐ€ ์–ด๋–ป๊ฒŒ ์—ฐ๋™๋˜๋ฉฐ, ์ฝ”๋“œ๊ฐ€ ๋ณ‘ํ•ฉ๋˜๊ธฐ ์ „์— PR์˜ ์ƒํƒœ ์ฒดํฌ(Status Check)๋ฅผ ํ•„์ˆ˜๋กœ ์ œ์–ดํ•˜๋Š” ์ž๋™ํ™” ํŒŒ์ดํ”„๋ผ์ธ ๋ฐ DevOps ํ”„๋กœ์„ธ์Šค๋กœ ํ•™์Šต์„ ๋„“ํž ์ˆ˜ ์žˆ๋‹ค [12]. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Vite + React ์„ฑ๋Šฅ ์ตœ์ ํ™”.md b/00_Raw/Vite + React ์„ฑ๋Šฅ ์ตœ์ ํ™”.md deleted file mode 100644 index 5fbe3306..00000000 --- a/00_Raw/Vite + React ์„ฑ๋Šฅ ์ตœ์ ํ™”.md +++ /dev/null @@ -1,75 +0,0 @@ -# [[Vite + React ์„ฑ๋Šฅ ์ตœ์ ํ™”]] - -## ๐Ÿ“Œ Brief Summary -Vite์™€ React ํ™˜๊ฒฝ์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๋Š” ๊ฒƒ์€ ์ดˆ๊ธฐ ๋กœ๋”ฉ ์†๋„๋ฅผ ๋†’์ด๊ณ  ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œ์ผœ ์ „๋ฐ˜์ ์ธ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๊ฐœ์„ ํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋Š” ๊ธฐ๋ณธ ES ๋ชจ๋“ˆ(ESM)์„, ์šด์˜ ํ™˜๊ฒฝ์—์„œ๋Š” Rollup์„ ํ†ตํ•œ ๋ฒˆ๋“ค๋ง์„ ํ™œ์šฉํ•˜๋Š” Vite์˜ ๊ตฌ์กฐ์  ์ด์ ์„ ๊ทน๋Œ€ํ™”ํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค. ์ฃผ์š” ์ตœ์ ํ™” ๊ธฐ๋ฒ•์œผ๋กœ๋Š” ๋น ๋ฅธ ์ปดํŒŒ์ผ์„ ์œ„ํ•œ SWC ๋„์ž…, ๋™์  ์ž„ํฌํŠธ๋ฅผ ํ†ตํ•œ ์ฝ”๋“œ ๋ถ„ํ• , `manualChunks`๋ฅผ ํ™œ์šฉํ•œ ๋ฌด๊ฑฐ์šด ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ถ„๋ฆฌ, ๊ทธ๋ฆฌ๊ณ  ๋ฒˆ๋“ค ์‹œ๊ฐํ™” ๋„๊ตฌ๋ฅผ ํ†ตํ•œ ๋ถˆํ•„์š”ํ•œ ์˜์กด์„ฑ ์ œ๊ฑฐ ๋“ฑ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. - -## ๐Ÿ“– Core Content -* **Vite์˜ ์•„ํ‚คํ…์ฒ˜ ์ดํ•ด ๋ฐ SWC ํ™œ์šฉ** - ๊ฐœ๋ฐœ ์ค‘์—๋Š” ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ๋ฏธ๋ฆฌ ๋ฒˆ๋“ค๋งํ•˜์ง€ ์•Š๊ณ  ๋ธŒ๋ผ์šฐ์ €์— ๋„ค์ดํ‹ฐ๋ธŒ ES ๋ชจ๋“ˆ(ESM)๋กœ ์ง์ ‘ ์ œ๊ณตํ•˜์—ฌ ๋งค์šฐ ๋น ๋ฅธ ์„œ๋ฒ„ ์‹œ์ž‘๊ณผ HMR(Hot Module Replacement)์„ ๋‹ฌ์„ฑํ•ฉ๋‹ˆ๋‹ค [1, 2]. ์ปดํŒŒ์ผ ์†๋„๋ฅผ ๊ทน๋Œ€ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ์กด์˜ Babel ๋Œ€์‹  Rust ๊ธฐ๋ฐ˜ ์ปดํŒŒ์ผ๋Ÿฌ์ธ SWC(`@vitejs/plugin-react-swc`)๋ฅผ ์ฑ„ํƒํ•˜๋ฉด, ์ปค์Šคํ…€ Babel ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ํ•„์š” ์—†๋Š” ๋Œ€๊ทœ๋ชจ React ํ”„๋กœ์ ํŠธ์—์„œ ๋นŒ๋“œ ๋ฐ ์ƒˆ๋กœ๊ณ ์นจ ์‹œ๊ฐ„์„ ํš๊ธฐ์ ์œผ๋กœ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3-5]. -* **์ฝ”๋“œ ๋ถ„ํ• (Code Splitting) ๋ฐ ์ง€์—ฐ ๋กœ๋”ฉ(Lazy Loading)** - ์ดˆ๊ธฐ ๋กœ๋“œ ์†๋„๋ฅผ ๋†’์ด๊ณ  LCP(Largest Contentful Paint)์™€ ๊ฐ™์€ ์›น ์ง€ํ‘œ๋ฅผ ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ๋ฌด๊ฑฐ์šด ๋ฒˆ๋“ค์„ ์—ฌ๋Ÿฌ ์ฒญํฌ๋กœ ๋ถ„ํ• ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [6, 7]. `React.lazy()`์™€ ``๋ฅผ ์‚ฌ์šฉํ•œ ๋™์  ์ž„ํฌํŠธ๋กœ ๋ผ์šฐํŠธ ๋ ˆ๋ฒจ์ด๋‚˜ ์ฐจํŠธ ๋“ฑ ํฐ ์œ„์ ฏ์„ ์‚ฌ์šฉ์ž๊ฐ€ ์ ‘๊ทผํ•  ๋•Œ๋งŒ ๋กœ๋“œํ•˜๋„๋ก ์„ค์ •ํ•˜๋ฉด ๋ฉ”์ธ ๋ฒˆ๋“ค์˜ ํฌ๊ธฐ๋ฅผ ๋Œ€ํญ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [6, 8-13]. -* **`manualChunks`๋ฅผ ํ™œ์šฉํ•œ ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ถ„ํ• ** - ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ ์‹œ 500kB ์ด์ƒ์˜ ๊ฑฐ๋Œ€ํ•œ ์ฒญํฌ ๊ฒฝ๊ณ ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด `vite.config.js`์˜ Rollup ์˜ต์…˜์—์„œ `manualChunks`๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค [12, 14-17]. React ์ฝ”์–ด๋‚˜ Lodash, ์ฐจํŠธ, ์•„์ด์ฝ˜ ๋“ฑ ์žฆ์€ ๋ณ€๊ฒฝ์ด ์—†๋Š” ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์„ ๋ณ„๋„์˜ ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌํ•˜๋ฉด, ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์€ ์ฝ”๋“œ๋ฅผ ์žฅ๊ธฐ๊ฐ„ ์บ์‹ฑ(Long-term caching)ํ•  ์ˆ˜ ์žˆ์–ด ์žฌ๋ฐฉ๋ฌธ ๋ฐ ๋ฐฐํฌ ์‹œ ๋กœ๋”ฉ ํšจ์œจ์ด ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค [12, 15, 18, 19]. -* **์˜์กด์„ฑ ์‚ฌ์ „ ๋ฒˆ๋“ค๋ง(`optimizeDeps`)๊ณผ ํŠธ๋ฆฌ ์‰์ดํ‚น** - ๋Œ€๊ทœ๋ชจ ์•ฑ์ด๋‚˜ ๋น„์ •์ƒ์ ์ธ ์˜์กด์„ฑ ๋กœ๋”ฉ์œผ๋กœ ์ธํ•œ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด `optimizeDeps`๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5, 6]. ๋˜ํ•œ ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ ๋กœ๋“œ๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด `lodash` ๋Œ€์‹  `lodash-es`์ฒ˜๋Ÿผ ํŠธ๋ฆฌ ์‰์ดํ‚น(Tree-shaking)์ด ์ง€์›๋˜๋Š” ์ตœ์‹  ES ๋ชจ๋“ˆ ๊ธฐ๋ฐ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์šฐ์„ ์ ์œผ๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [20]. -* **๋ฒˆ๋“ค ์‹œ๊ฐํ™” ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง** - `rollup-plugin-visualizer` ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์—ฐ๋™ํ•˜์—ฌ ๋นŒ๋“œ ์‹œ ๊ฑฐ๋Œ€ํ•œ ๋ฒˆ๋“ค์˜ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‹œ๊ฐ์ ์ธ ํŠธ๋ฆฌ๋งต ํ˜•ํƒœ๋กœ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค [6, 13, 21]. ์ด๋ฅผ ํ†ตํ•ด ๋ฒˆ๋“ค ๋‚ด ์ฐจ์ง€ํ•˜๋Š” ๋น„์ค‘์ด ๋ถˆํ•„์š”ํ•˜๊ฒŒ ํฐ ์ฝ”๋“œ๋ฅผ ์ฐพ์•„๋‚ด์–ด ์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜ ์ง€์—ฐ ๋กœ๋”ฉ์œผ๋กœ ๋ถ„๋ฆฌํ•  ๊ธฐํšŒ๋ฅผ ์‹ ์†ํ•˜๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [13, 20, 22]. - -## โš–๏ธ Trade-offs & Caveats -* **๊ณผ๋„ํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ ์‚ฌ์šฉ:** Vite๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ ๋„ˆ๋ฌด ๋งŽ์€ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋‚จ์šฉํ•˜๋ฉด ๊ฐœ๋ฐœ ์„œ๋ฒ„์˜ ์„ฑ๋Šฅ์ด ํ˜„์ €ํžˆ ๋А๋ ค์งˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ ์œ„์ฃผ๋กœ ๊ฐ€๋ณ๊ฒŒ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [20]. -* **์บ์‹ฑ ๋ฌดํšจํ™” ์ฃผ์˜:** ๋ชจ๋“ˆ ๋กœ๋”ฉ ์„ฑ๋Šฅ์„ ์œ„ํ•ด Vite๋Š” ๋ธŒ๋ผ์šฐ์ € ์บ์‹ฑ์— ํฌ๊ฒŒ ์˜์กดํ•˜๋ฏ€๋กœ, ๊ฐœ๋ฐœ ์‹œ ๋ธŒ๋ผ์šฐ์ € ๊ฐœ๋ฐœ์ž ๋„๊ตฌ์—์„œ ์บ์‹œ๋ฅผ ๋ฌดํšจํ™”(Disable cache)ํ•˜๋ฉด ์„ฑ๋Šฅ์ด ๊ธ‰๊ฒฉํ•˜๊ฒŒ ์ €ํ•˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [20]. -* **์ง€์—ฐ ๋กœ๋”ฉ์˜ ๊ณผ์šฉ ๋ฐ ์ž˜๋ชป๋œ ๋ฐฐ์น˜:** ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ์— ์ง€์—ฐ ๋กœ๋”ฉ์„ ๋‚จ๋ฐœํ•˜๊ฑฐ๋‚˜, ์Šคํฌ๋กค ์—†์ด ๋ฐ”๋กœ ๋ณด์—ฌ์•ผ ํ•˜๋Š” ํ•ต์‹ฌ(Above-the-fold) ์š”์†Œ๋‚˜ ์ฆ‰์‹œ ๋ Œ๋”๋งํ•ด์•ผ ํ•˜๋Š” UI๊นŒ์ง€ ์ง€์—ฐ ๋กœ๋”ฉ์„ ์ ์šฉํ•˜๋ฉด ์ดˆ๊ธฐ ํ™”๋ฉด ํ‘œ์‹œ๊ฐ€ ์ง€์—ฐ๋˜์–ด ์˜คํžˆ๋ ค ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๋ง์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [23, 24]. -* **๋ฉ”๋ชจ์ด์ œ์ด์…˜(`React.memo`, `useMemo` ๋“ฑ) ์˜ค๋ฒ„ํ—ค๋“œ:** ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ง‰๊ธฐ ์œ„ํ•œ ๋„๊ตฌ์ง€๋งŒ, ๋น„๊ต ์—ฐ์‚ฐ๊ณผ ์ด์ „ ์ƒํƒœ๋ฅผ ์บ์‹ฑํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋น„์šฉ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [25]. ๋ Œ๋”๋ง์ด ์•„์ฃผ ๋น ๋ฅด๊ณ  ๋‹จ์ˆœํ•œ ์ปดํฌ๋„ŒํŠธ๋‚˜, ์ „๋‹ฌ๋˜๋Š” props๊ฐ€ ๋นˆ๋ฒˆํžˆ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒฝ์šฐ(์˜ˆ: ์ธ๋ผ์ธ ๊ฐ์ฒด, ํ•จ์ˆ˜ ์ „๋‹ฌ)์— ์‚ฌ์šฉํ•˜๋ฉด ๋ Œ๋”๋ง ์ž์ฒด๋ณด๋‹ค ์ƒํƒœ ๋น„๊ต ๋น„์šฉ์ด ๋” ์ปค์ ธ ์„ฑ๋Šฅ์ด ์˜คํžˆ๋ ค ์•…ํ™”๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [25-28]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -#### [๊ด€๊ณ„ ์œ ํ˜• A (์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ )] -- [[๋„ค์ดํ‹ฐ๋ธŒ ES ๋ชจ๋“ˆ(ESM)]] - - ์—ฐ๊ฒฐ ์ด์œ : Vite๊ฐ€ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ์ฝ”๋“œ ๋ชจ๋“ˆ์„ ์„œ๋น™ํ•˜๋Š” ๋ฐฉ์‹์˜ ํ•ต์‹ฌ ๊ธฐ๋ฐ˜ ์›๋ฆฌ์ž…๋‹ˆ๋‹ค. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ฒˆ๋“ค๋Ÿฌ๊ฐ€ ์ „์ฒด ์•ฑ์„ ๋งค๋ฒˆ ๋นŒ๋“œํ•˜์ง€ ์•Š๊ณ  ๋ณ€๊ฒฝ๋œ ๋ชจ๋“ˆ๋งŒ ์š”์ฒญ/๋กœ๋“œํ•จ์œผ๋กœ์จ ํ”„๋กœ์ ํŠธ ํฌ๊ธฐ์— ์ƒ๊ด€์—†์ด ๋น ๋ฅธ HMR๊ณผ ์‘๋‹ต์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1, 29, 30]. - -- [[Rollup]] - - ์—ฐ๊ฒฐ ์ด์œ : Vite ํ™˜๊ฒฝ์—์„œ ํ”„๋กœ๋•์…˜ ๋ฐฐํฌ ์‹œ ์ฝ”๋“œ๋ฅผ ํ•˜๋‚˜๋กœ ๋ชจ์œผ๊ณ  ์ตœ์ ํ™”ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋ฒˆ๋“ค๋Ÿฌ์ž…๋‹ˆ๋‹ค. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Vite์˜ ์„ค์ • ํŒŒ์ผ(`vite.config.js`)์—์„œ `manualChunks` ๋“ฑ Rollup ์ „์šฉ ๋นŒ๋“œ ์˜ต์…˜์„ ํ†ตํ•ด ์–ด๋–ป๊ฒŒ ํšจ์œจ์ ์ธ ์ •์  ์• ์…‹(Asset)์„ ์ƒ์„ฑํ•˜๊ณ , ์ฝ”๋“œ ๋ถ„ํ• ๊ณผ ํŠธ๋ฆฌ ์‰์ดํ‚น์„ ์ˆ˜ํ–‰ํ•˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [14, 18, 31, 32]. - -#### [๊ด€๊ณ„ ์œ ํ˜• B (๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ)] -- [[SWC ์ปดํŒŒ์ผ๋Ÿฌ]] - - ์—ฐ๊ฒฐ ์ด์œ : Vite์˜ ๊ธฐ๋ณธ ๊ตฌ์„ฑ์„ ํ™•์žฅํ•ด ์†๋„๋ฅผ ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•œ ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ณผ๊ฑฐ Babel์ด ์ฒ˜๋ฆฌํ•˜๋˜ JSX/TypeScript ๋ณ€ํ™˜ ์ž‘์—…์„ Rust ๊ธฐ๋ฐ˜์˜ ๋น ๋ฅธ ๋„๊ตฌ(`@vitejs/plugin-react-swc`)๋กœ ๊ต์ฒดํ•˜์—ฌ ๋Œ€ํ˜• React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์žฌ๋นŒ๋“œ ์‹œ๊ฐ„์„ ์ฆ‰๊ฐ์ ์œผ๋กœ ๋‹จ์ถ•์‹œํ‚ค๋Š” ๋ฐฉ์‹์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1, 3, 5]. - -- [[React.lazy & Suspense]] - - ์—ฐ๊ฒฐ ์ด์œ : React ๋‚ด๋ถ€์—์„œ ๋™์  ์ž„ํฌํŠธ๋ฅผ ํ†ตํ•œ ์ปดํฌ๋„ŒํŠธ ๋ ˆ๋ฒจ ์ง€์—ฐ ๋กœ๋”ฉ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ API์ž…๋‹ˆ๋‹ค. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ผ์šฐํŠธ๋‚˜ ๋ฌด๊ฑฐ์šด ๋ชจ๋“ˆ์„ ๋ถ„๋ฆฌํ•˜๊ณ , ๋ฒˆ๋“ค์ด ๋กœ๋“œ๋˜๋Š” ๋™์•ˆ ``๋ฅผ ํ†ตํ•ด ํด๋ฐฑ(Fallback) UI๋ฅผ ์ฒ˜๋ฆฌํ•จ์œผ๋กœ์จ ์ดˆ๊ธฐ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŽ˜์ด๋กœ๋“œ ์šฉ๋Ÿ‰์„ ๋Œ€ํญ ์ค„์ด๋Š” ์‹ค๋ฌด ๊ธฐ๋ฒ•์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [6, 9, 11, 12, 33]. - -- [[rollup-plugin-visualizer]] - - ์—ฐ๊ฒฐ ์ด์œ : ์ตœ์ ํ™” ์ž‘์—… ์ „ํ›„๋กœ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์‹œ๊ฐํ™”ํ•˜๊ณ  ๋ฌธ์ œ๋ฅผ ์ง„๋‹จํ•˜๋Š” ํ•„์ˆ˜ ๋ถ„์„ ํ”Œ๋Ÿฌ๊ทธ์ธ์ž…๋‹ˆ๋‹ค. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํฐ ์ฒญํฌ๊ฐ€ ์™œ ๋ฐœ์ƒํ•˜๋Š”์ง€, ์–ด๋–ค ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(๋ฒค๋”)๊ฐ€ ์˜๋„์น˜ ์•Š๊ฒŒ ์šฉ๋Ÿ‰์„ ๊ณผ๋„ํ•˜๊ฒŒ ์ ์œ ํ•˜๋Š”์ง€ ๋ถ„์„ํ•˜์—ฌ `manualChunks`๋‚˜ ์ฝ”๋“œ ๊ต์ฒด๋ฅผ ๊ฒฐ๋‹จํ•˜๋Š” ์ธก์ •/๋””๋ฒ„๊น… ๊ธฐ๋ฐ˜์„ ํ™•๋ฆฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [6, 13, 21]. - -### Deeper Research Questions - -- ๋Œ€๊ทœ๋ชจ ์™ธ๋ถ€ ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ Vite์˜ `optimizeDeps`๋ฅผ ์„ธ๋ฐ€ํ•˜๊ฒŒ ํŠœ๋‹ํ•˜๋ ค๋ฉด ์–ด๋– ํ•œ ๊ธฐ์ค€๊ณผ ์„ค์ • ๋ฐฉ์‹์„ ์ ์šฉํ•ด์•ผ ํ•˜๋Š”๊ฐ€? -- SWC ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋„์ž…ํ•  ๋•Œ ๊ธฐ์กด์— ์‚ฌ์šฉ ์ค‘์ธ ํŠน์ • ์ปค์Šคํ…€ Babel ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์˜จ์ „ํžˆ ๋Œ€์ฒดํ•˜๊ฑฐ๋‚˜ ๋ณ‘ํ–‰ํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์˜ ํ•œ๊ณ„ ๋ฐ ํ•ด๊ฒฐ์ฑ…์€ ๋ฌด์—‡์ธ๊ฐ€? -- Rollup์˜ `manualChunks`๋กœ ๋ฌด๊ฑฐ์šด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ถ„๋ฆฌํ•  ๋•Œ, ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ณ‘๋ ฌ๋กœ ๋‹ค์šด๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋Š” ํ•œ๊ณ„์ ๊ณผ ์žฅ๊ธฐ ์บ์‹ฑ(Long-term caching)์˜ ์ด์ ์„ ๊ณ ๋ คํ•œ ์ตœ์ ์˜ ๋ถ„ํ•  ๋‹จ์œ„(Chunk size)๋Š” ์–ด๋А ์ •๋„์ธ๊ฐ€? -- `React.lazy`์™€ ``๋ฅผ ๋ผ์šฐํŠธ ๋ ˆ๋ฒจ์ด ์•„๋‹Œ ์„ธ๋ถ€ ์ปดํฌ๋„ŒํŠธ ๋ ˆ๋ฒจ(์˜ˆ: ๋ฌด๊ฑฐ์šด ๋ชจ๋‹ฌ ์ฐฝ์ด๋‚˜ ์ฐจํŠธ)์— ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์ ์šฉํ•  ๋•Œ, ๋ถˆํ•„์š”ํ•œ ๋กœ๋”ฉ ์ƒํƒœ ๋‚จ๋ฐœ์„ ๋ง‰๊ณ  ์ž์—ฐ์Šค๋Ÿฌ์šด ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์œ ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? -- ๋ฒˆ๋“ค ์‹œ๊ฐํ™”๋ฅผ ํ†ตํ•ด ๋ฐœ๊ฒฌ๋œ, ํŠธ๋ฆฌ ์‰์ดํ‚น์ด ์ „ํ˜€ ์ ์šฉ๋˜์ง€ ์•Š๋Š” ๋ ˆ๊ฑฐ์‹œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์˜์กด์„ฑ์„ ์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜ ๋ชจ๋˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ๋•Œ ๋”ฐ๋ผ์•ผ ํ•  ๋ฆฌํŒฉํ† ๋ง ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? - -### Practical Application Contexts - -- **Implementation:** `vite.config.ts` ํŒŒ์ผ์—์„œ SWC ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์ • ๋ฐ `rollupOptions` ๋‚ด `manualChunks`๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•˜์—ฌ React ๋Ÿฐํƒ€์ž„, ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ, ์ฐจํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋“ฑ์„ ๊ฐ๊ฐ์˜ ์ฒญํฌ๋กœ ์ถ”์ถœํ•˜๋„๋ก ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. -- **System Design:** ์ดˆ๊ธฐ ์•„ํ‚คํ…์ฒ˜ ์ˆ˜๋ฆฝ ์‹œ, ๋ผ์šฐํŠธ ๋ณ„๋กœ ์ง€์—ฐ ๋กœ๋”ฉ๋  ๊ธฐ๋Šฅ๊ณผ ์•ฑ ๊ตฌ๋™ ์‹œ ์ฆ‰์‹œ ํ•„์š”ํ•œ ์ฝ”์–ด ๋ ˆ์ด์–ด๋ฅผ ์—„๊ฒฉํ•˜๊ฒŒ ๋ถ„๋ฆฌํ•˜์—ฌ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…์„ ์ „์ œ๋กœ ํ•œ ์ปดํฌ๋„ŒํŠธ ๊ณ„์ธต ํŠธ๋ฆฌ๋ฅผ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค. -- **Operation / Maintenance:** CI/CD ํŒŒ์ดํ”„๋ผ์ธ์— `rollup-plugin-visualizer`์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํฌํŠธ๋กœ ๋‚จ๊ธฐ๋„๋ก ๊ตฌ์„ฑํ•˜์—ฌ, ํŒ€์›์ด ์ƒˆ๋กœ์šด ํŒจํ‚ค์ง€๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ ๋ฉ”์ธ ๋ฒˆ๋“ค ํฌ๊ธฐ๊ฐ€ ๋น„์ •์ƒ์ ์œผ๋กœ ์ปค์ง€์ง€ ์•Š๋Š”์ง€ ์ง€์†์ ์œผ๋กœ ๊ฐ์‹œํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜ํ•ฉ๋‹ˆ๋‹ค. -- **Learning Path:** ์šฐ์„  React์˜ ๋ Œ๋”๋ง ์›๋ฆฌ ๋ฐ ํ”„๋กœํŒŒ์ผ๋Ÿฌ ์‚ฌ์šฉ๋ฒ•์„ ํ•™์Šตํ•œ ํ›„, ๋นŒ๋“œ ํˆด(Vite/Rollup)์˜ ๋ฒˆ๋“ค๋ง ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ดํ•ดํ•˜๊ณ , ์ดํ›„ ์ง€์—ฐ ๋กœ๋”ฉ ๊ธฐ๋ฒ• ๋ฐ ๋ฒˆ๋“ค ์ตœ์ ํ™” ํ”Œ๋Ÿฌ๊ทธ์ธ ์‹ค์Šต์œผ๋กœ ์ด์–ด์ง€๋Š” ๋กœ๋“œ๋งต์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. -- **My Project Relevance:** ๊ฑฐ๋Œ€ํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ ์ „์†ก์œผ๋กœ ์ธํ•ด ๋ Œ๋”๋ง์ด ์ง€์—ฐ๋˜๋Š” ํ”„๋กœ์ ํŠธ๋‚˜, ๋นŒ๋“œ ํ›„ "500kB ์ดˆ๊ณผ" ๊ฒฝ๊ณ ๊ฐ€ ๋œจ๋Š” ํ”„๋ก ํŠธ์—”๋“œ ํ™˜๊ฒฝ์—์„œ ์ฆ‰๊ฐ์ ์ธ ํŒŒ์ผ ๋ถ„ํ• ๊ณผ ์บ์‹ฑ ์ „๋žต์„ ์ ์šฉํ•˜์—ฌ ํŽ˜์ด์ง€ ๋กœ๋“œ ์„ฑ๋Šฅ(FCP, LCP)์„ ๊ฐ€์‹œ์ ์œผ๋กœ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - -### Adjacent Topics - -- [[Core Web Vitals]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: Vite์™€ React ์ตœ์ ํ™”๋ฅผ ํ†ตํ•ด ์–ป์–ด๋‚ธ ๋ฉ”์ธ ๋ฒˆ๋“ค ํฌ๊ธฐ ๊ฐ์†Œ ๋ฐ ๋ Œ๋”๋ง ์†๋„ ํ–ฅ์ƒ์ด ์‹ค์ œ ์‚ฌ์šฉ์ž ์ฒด๊ฐ ์„ฑ๋Šฅ ์ง€ํ‘œ(LCP, FID/INP ๋“ฑ)์— ์–ด๋–ค ์ˆ˜์น˜์  ๊ฐœ์„ ์œผ๋กœ ๋‚˜ํƒ€๋‚˜๋Š”์ง€๋ฅผ ๊ตฌ์ฒด์ ์œผ๋กœ ์—ฐ๊ตฌํ•ฉ๋‹ˆ๋‹ค [11, 34, 35]. - -- [[Concurrent Rendering (๋™์‹œ์„ฑ ๋ Œ๋”๋ง)]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋กœ๋”ฉ๊ณผ ๋ฒˆ๋“ค๋ง ์ตœ์ ํ™”๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, `useTransition` ๋ฐ `useDeferredValue` ํ›…์„ ์ด์šฉํ•˜์—ฌ ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ๋ณ€ํ™” ์‹œ์—๋„ ์‚ฌ์šฉ์ž ์ž…๋ ฅ ๋“ฑ์˜ UI ๋ฐ˜์‘์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๋Ÿฐํƒ€์ž„ ์ฐจ์›์˜ ์„ฑ๋Šฅ ํ–ฅ์ƒ ์ „๋žต์œผ๋กœ ์ง€์‹์„ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค [36-38]. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Vite Build System.md b/00_Raw/Vite Build System.md deleted file mode 100644 index 9ee03e7c..00000000 --- a/00_Raw/Vite Build System.md +++ /dev/null @@ -1,52 +0,0 @@ -# [[Vite Build System]] - -## ๐Ÿ“Œ Brief Summary -Vite๋Š” ํ˜„๋Œ€ ํ”„๋ก ํŠธ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(ํŠนํžˆ React) ๊ฐœ๋ฐœ์„ ์œ„ํ•œ ์ƒˆ๋กœ์šด ์‚ฐ์—… ํ‘œ์ค€ ๋นŒ๋“œ ๋„๊ตฌ๋กœ, ๊ฑฐ์˜ ์ฆ‰๊ฐ์ ์ธ ์„œ๋ฒ„ ์‹œ์ž‘๊ณผ ์ดˆ๊ณ ์† HMR(Hot Module Replacement)์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [1, 2]. ๊ธฐ์กด ๋ฒˆ๋“ค๋Ÿฌ์™€ ๋‹ฌ๋ฆฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋Š” ๋ธŒ๋ผ์šฐ์ €์— ๋„ค์ดํ‹ฐ๋ธŒ ES ๋ชจ๋“ˆ ํ˜•ํƒœ๋กœ ์ฝ”๋“œ๋ฅผ ์ œ๊ณตํ•˜๊ณ , ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋Š” Rollup์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ณ ๋„๋กœ ์ตœ์ ํ™”๋œ ๋ฒˆ๋“ค์„ ์ƒ์„ฑํ•˜๋Š” ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค [3, 4]. ๋˜ํ•œ SWC๋‚˜ esbuild์™€ ๊ฐ™์€ Rust ๊ธฐ๋ฐ˜ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ๋„ ๋น ๋ฅด๊ณ  ์›ํ™œํ•œ ๊ฐœ๋ฐœ์ž ๊ฒฝํ—˜์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค [3, 5, 6]. - -## ๐Ÿ“– Core Content -* **ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์•„ํ‚คํ…์ฒ˜ (๊ฐœ๋ฐœ ๋ฐ ํ”„๋กœ๋•์…˜)**: Vite๋Š” ๊ฐœ๋ฐœ ์‹œ ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ์‚ฌ์ „์— ๋ฒˆ๋“ค๋งํ•˜๋Š” ๋Œ€์‹ , ์ฝ”๋“œ๋ฅผ ๋„ค์ดํ‹ฐ๋ธŒ ES ๋ชจ๋“ˆ(ESM) ํ˜•ํƒœ๋กœ ๋ธŒ๋ผ์šฐ์ €์— ์ง์ ‘ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [2, 3]. ์ด ๋ฐฉ์‹์€ ํ•„์š”ํ•  ๋•Œ ํ•„์š”ํ•œ ํŒŒ์ผ๋งŒ ๋กœ๋“œํ•˜๋ฏ€๋กœ ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๊ฐ€ ์ปค์ ธ๋„ ์„œ๋ฒ„ ์‹œ์ž‘ ๋ฐ ๊ฐฑ์‹  ์†๋„๊ฐ€ ๋งค์šฐ ๋น ๋ฆ…๋‹ˆ๋‹ค [3, 7]. ๋ฐ˜๋ฉด, ํ”„๋กœ๋•์…˜ ๋ฐฐํฌ ์‹œ์—๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ Rollup์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž๋™ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…, ๋ฏธ์‚ฌ์šฉ ์ฝ”๋“œ ์ œ๊ฑฐ(Tree-shaking), ์ž์‚ฐ ์ตœ์ ํ™” ๋“ฑ์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ์„ฑ๋Šฅ์ด ๋›ฐ์–ด๋‚œ ๋ฒˆ๋“ค์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค [4, 8]. -* **์ดˆ๊ณ ์† ์ปดํŒŒ์ผ๋Ÿฌ ๋ฐ ํ”Œ๋Ÿฌ๊ทธ์ธ ํ™œ์šฉ**: Vite๋Š” ์ปดํŒŒ์ผ ์†๋„๋ฅผ ๋†’์ด๊ธฐ ์œ„ํ•ด Rust ๊ธฐ๋ฐ˜์˜ ์ปดํŒŒ์ผ๋Ÿฌ์ธ SWC ๋˜๋Š” esbuild๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค [3]. ๊ธฐ์กด Babel ๋Œ€์‹  `@vitejs/plugin-react-swc`๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด JSX ๋ฐ TypeScript ์ปดํŒŒ์ผ ์†๋„๊ฐ€ ๋น„์•ฝ์ ์œผ๋กœ ํ–ฅ์ƒ๋˜์–ด ์žฌ๋นŒ๋“œ ์‹œ๊ฐ„์ด ๋‹จ์ถ•๋ฉ๋‹ˆ๋‹ค [5, 6, 9]. ์ด์™ธ์—๋„ `vite-plugin-svgr`(SVG ์ปดํฌ๋„ŒํŠธํ™”), `vite-plugin-pwa`์™€ ๊ฐ™์€ ์œ ์—ฐํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ƒํƒœ๊ณ„๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค [10]. -* **๊ณ ๊ธ‰ ๊ตฌ์„ฑ (vite.config.js)**: Vite๋Š” `vite.config.js`๋ฅผ ํ†ตํ•ด ๋ณต์žกํ•œ ํ”„๋กœ์ ํŠธ ์„ค์ •์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๊ฒฝ๋กœ ๋ณ„์นญ(Path Aliases)์„ ์„ค์ •ํ•˜์—ฌ ์ž„ํฌํŠธ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•˜๊ฑฐ๋‚˜, `VITE_` ์ ‘๋‘์‚ฌ๊ฐ€ ๋ถ™์€ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋งŒ์„ ์•ˆ์ „ํ•˜๊ฒŒ ๋…ธ์ถœํ•˜๋ฉฐ, ๊ฐœ๋ฐœ ์ค‘ CORS ๋ฌธ์ œ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•œ ๋‚ด์žฅ ํ”„๋ก์‹œ ์„œ๋ฒ„ ์„ค์ •์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค [5, 9, 11]. -* **์„ฑ๋Šฅ ํŠœ๋‹ ๋ฐ ๋Œ€์šฉ๋Ÿ‰ ์ฒญํฌ(Chunk) ๊ด€๋ฆฌ**: ๋Œ€๊ทœ๋ชจ ์•ฑ์—์„œ๋Š” ๋ฌด๊ฑฐ์šด ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์ธํ•ด ๋ฉ”์ธ ๋ฒˆ๋“ค์ด ๊ณผ๋„ํ•˜๊ฒŒ ์ปค์ง€๋Š” ๋ฌธ์ œ("chunks are larger than 500 kB")๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [12-14]. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด `manualChunks`๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ React, ์ฐจํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋“ฑ ์ž์ฃผ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ๋ฒค๋” ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌํ•ด ๋ธŒ๋ผ์šฐ์ € ์บ์‹ฑ์„ ๊ทน๋Œ€ํ™”ํ•ฉ๋‹ˆ๋‹ค [8, 11, 14-16]. ์ด์™€ ํ•จ๊ป˜ `React.lazy`์™€ ``๋ฅผ ์ด์šฉํ•œ ๋ผ์šฐํŠธ ๋ ˆ๋ฒจ์˜ ๋™์  ์ž„ํฌํŠธ(์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…)๋ฅผ ์ ์šฉํ•˜๊ณ , `rollup-plugin-visualizer`๋กœ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ๋ถ„์„ํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ด ๋ชจ๋ฒ” ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค [16-19]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts -- [[Native ES Modules (ESM)]] - - ์—ฐ๊ฒฐ ์ด์œ : Vite๊ฐ€ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ํŒŒ์ผ ์ „์ฒด๋ฅผ ์‚ฌ์ „ ๋ฒˆ๋“ค๋งํ•˜์ง€ ์•Š๊ณ , ํ•„์š”ํ•  ๋•Œ ๋ธŒ๋ผ์šฐ์ €์— ์ฝ”๋“œ๋ฅผ ์ œ๊ณตํ•˜๋Š” ํ•ต์‹ฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [3, 7]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Vite๊ฐ€ ๊ธฐ์กด ๋„๊ตฌ(Webpack ๋“ฑ)์— ๋น„ํ•ด ์–ด๋–ป๊ฒŒ ์ดˆ๊ธฐ ๊ตฌ๋™ ์†๋„์™€ HMR ์‘๋‹ต์„ฑ์„ ๊ทน์ ์œผ๋กœ ๋‹จ์ถ•ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ทธ ์›๋ฆฌ๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2, 3]. - -- [[Rollup]] - - ์—ฐ๊ฒฐ ์ด์œ : Vite๊ฐ€ ํ”„๋กœ๋•์…˜์šฉ ๋นŒ๋“œ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๋‚ด๋ถ€์ ์œผ๋กœ ์ฑ„ํƒํ•˜๊ณ  ์žˆ๋Š” ๋ฒˆ๋“ค๋Ÿฌ ๋„๊ตฌ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [4]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ์ฒญํฌ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋‚˜๋‰˜๋ฉฐ(`manualChunks`), ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…๊ณผ ํŠธ๋ฆฌ ์‰์ดํ‚น์„ ํ†ตํ•ด ์ตœ์ ํ™”๋œ ์ •์  ์ž์‚ฐ์ด ๋งŒ๋“ค์–ด์ง€๋Š” ๊ณผ์ •์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [4, 8, 11]. - -- [[SWC (Speedy Web Compiler)]] - - ์—ฐ๊ฒฐ ์ด์œ : Vite ํ™˜๊ฒฝ์—์„œ ๊ธฐ์กด์˜ Babel์„ ๋Œ€์ฒดํ•˜์—ฌ JSX์™€ TypeScript๋ฅผ ์‹ค์‹œ๊ฐ„์— ๊ฐ€๊น๊ฒŒ ๋ณ€ํ™˜ํ•˜๋Š” Rust ๊ธฐ๋ฐ˜ ์ปดํŒŒ์ผ๋Ÿฌ ๊ธฐ์ˆ ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [3, 5, 6]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋Œ€๊ทœ๋ชจ React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ ์‹œ ์ปดํŒŒ์ผ ์†๋„์™€ ํ•ซ ๋ฆฌ๋กœ๋“œ ์†๋„๋ฅผ ํ–ฅ์ƒํ•˜๋Š” ๊ธฐ์ˆ ์  ๋ฐฐ๊ฒฝ์„ ๊นŠ์ด ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3, 6]. - -- [[Code Splitting & manualChunks]] - - ์—ฐ๊ฒฐ ์ด์œ : ๋Œ€์šฉ๋Ÿ‰ ๋ฉ”์ธ ๋ฒˆ๋“ค ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ , ์ดˆ๊ธฐ ํŽ˜์ด์ง€ ๋กœ๋“œ ์†๋„๋ฅผ ๋†’์ด๊ธฐ ์œ„ํ•œ Vite ์„ฑ๋Šฅ ์ตœ์ ํ™”์˜ ํ•ต์‹ฌ ๊ธฐ๋ฒ•์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [12, 14]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋™์  ์ž„ํฌํŠธ์™€ ๊ฒฐํ•ฉํ•˜์—ฌ ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(์•ˆ์ •์ ์ธ ์ฝ”๋“œ)๋ฅผ ๋ณ„๋„ ํŒŒ์ผ๋กœ ์บ์‹ฑํ•˜๊ณ  ๊ธฐ๋Šฅ ๋‹จ์œ„๋กœ ์ฒญํฌ๋ฅผ ๋‚˜๋ˆ„๋Š” ์ „๋žต์„ ํ•™์Šตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [8, 16]. - -### Deeper Research Questions -- ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์˜ ๋„ค์ดํ‹ฐ๋ธŒ ESM ์ฒ˜๋ฆฌ ๋ฐฉ์‹๊ณผ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์˜ Rollup ๋ฒˆ๋“ค๋ง ๊ฐ„์˜ ์•„ํ‚คํ…์ฒ˜ ์ฐจ์ด๊ฐ€ ๋Ÿฐํƒ€์ž„ ๋™์ž‘์ด๋‚˜ ๋ชจ๋“ˆ ํ•ด์„(Module Resolution)์— ์–ด๋–ค ์ฐจ์ด์™€ ์ž ์žฌ์  ๋ฒ„๊ทธ๋ฅผ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? -- Vite์˜ `optimizeDeps`๋ฅผ ํ†ตํ•œ ์‚ฌ์ „ ๋ฒˆ๋“ค๋ง(Pre-bundling) ํ”„๋กœ์„ธ์Šค๋Š” ๊ฑฐ๋Œ€ํ•œ ์™ธ๋ถ€ ์˜์กด์„ฑ ํŒจํ‚ค์ง€๋ฅผ ๋กœ๋“œํ•  ๋•Œ ๋ธŒ๋ผ์šฐ์ €์˜ ๋„คํŠธ์›Œํฌ ๋ณ‘๋ชฉ์„ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•˜๋Š”๊ฐ€? -- ๋Œ€๊ทœ๋ชจ React ์•ฑ์„ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•  ๋•Œ ์ปค์Šคํ…€ Babel ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉ ์ค‘์ธ ํ™˜๊ฒฝ์—์„œ SWC ์ปดํŒŒ์ผ๋Ÿฌ(`@vitejs/plugin-react-swc`)๋กœ ์ „ํ™˜ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ํ˜ธํ™˜์„ฑ ํ•œ๊ณ„์™€ ๋Œ€์•ˆ์€ ๋ฌด์—‡์ธ๊ฐ€? -- `manualChunks`๋ฅผ ํ™œ์šฉํ•ด ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ธ๋ฐ€ํ•˜๊ฒŒ ๋ถ„ํ• ํ•  ๋•Œ, ์ƒ์„ฑ๋œ ํ•ด์‹œ(hash) ํŒŒ์ผ๋ช… ๊ธฐ๋ฐ˜์˜ ์žฅ๊ธฐ ์บ์‹ฑ(Long-term Caching) ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ์ตœ์ ํ™”๋˜๋Š”๊ฐ€? -- `rollup-plugin-visualizer`๋ฅผ ํ†ตํ•œ ๋ฒˆ๋“ค ์‹œ๊ฐํ™” ์ดํ›„, ์˜๋„์น˜ ์•Š๊ฒŒ ๋ฉ”์ธ ์ฒญํฌ์— ํฌํ•จ๋œ ๊ณผ๋„ํ•œ ํŠธ๋žœ์ง€ํ‹ฐ๋ธŒ ์˜์กด์„ฑ(Transitive Dependencies)์„ ํšจ๊ณผ์ ์œผ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ์ฝ”๋“œ ๋ ˆ๋ฒจ ํŒจํ„ด์€ ๋ฌด์—‡์ธ๊ฐ€? - -### Practical Application Contexts -- **Implementation:** `vite.config.js`๋ฅผ ๊ตฌ์„ฑํ•˜์—ฌ `@vitejs/plugin-react-swc`๋ฅผ ๋„์ž…ํ•˜๊ณ , ์ƒ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•œ ๊ฒฝ๋กœ ๋ณ„์นญ(Path Aliases) ์„ค์ •, `VITE_` ์ ‘๋‘์‚ฌ๋ฅผ ์ด์šฉํ•œ ์•ˆ์ „ํ•œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋ฐ”์ธ๋”ฉ, CORS๋ฅผ ์šฐํšŒํ•˜๊ธฐ ์œ„ํ•œ ํ”„๋ก์‹œ(Proxy) ์„ค์ •์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค [5, 9, 11]. -- **System Design:** ๋Œ€๊ทœ๋ชจ ํ”„๋ก ํŠธ์—”๋“œ ์‹œ์Šคํ…œ ์„ค๊ณ„ ์‹œ, ๋ฌด๊ฑฐ์šด ์ดˆ๊ธฐ ๋ฒˆ๋“ค ํฌ๊ธฐ ์ด์Šˆ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด Webpack ๋Œ€์‹  Vite๋ฅผ ๋„์ž…ํ•˜๊ณ  ๊ฐœ๋ฐœ(๋„ค์ดํ‹ฐ๋ธŒ ESM)๊ณผ ํ”„๋กœ๋•์…˜(Rollup ์ตœ์ ํ™”)์˜ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๋นŒ๋“œ ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌ์ถ•ํ•ฉ๋‹ˆ๋‹ค [2-4, 8]. -- **Operation / Maintenance:** `rollup-plugin-visualizer`๋ฅผ ๋นŒ๋“œ ํ”„๋กœ์„ธ์Šค์— ์—ฐ๋™ํ•ด ์ •๊ธฐ์ ์œผ๋กœ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ , `manualChunks`๋ฅผ ์œ ์ง€๋ณด์ˆ˜ํ•˜์—ฌ React ์ฝ”์–ด ๊ฐ™์€ ๋ฒค๋” ํŒจํ‚ค์ง€์˜ ๋ธŒ๋ผ์šฐ์ € ์บ์‹ฑ ์ด์ ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค [16-19]. -- **Learning Path:** ์šฐ์„  Vite์˜ ๊ณต์‹ ์Šค์บํด๋“œ ํˆด๋กœ React ์•ฑ์„ ์ƒ์„ฑํ•˜์—ฌ ๊ธฐ์กด CRA(Create React App) ๊ตฌ์กฐ์™€์˜ ์ฐจ์ด๋ฅผ ์ฒดํ—˜ํ•œ ํ›„, ๋™์  ์ž„ํฌํŠธ(`React.lazy`)์™€ `optimizeDeps` ๋“ฑ์˜ ๊ณ ๊ธ‰ ์„ค์ • ๋ฐ ํ”Œ๋Ÿฌ๊ทธ์ธ ํ™•์žฅ์„ ์ ์ง„์ ์œผ๋กœ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค [6, 7, 10, 16, 20]. -- **My Project Relevance:** ์†Œ์Šค์— ๊ด€๋ จ ์ •๋ณด๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. (๊ฐœ์ธ์˜ ํ˜„์žฌ ์ง„ํ–‰ ์ค‘์ธ ํŠน์ • ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ์†Œ์Šค ํ…์ŠคํŠธ์— ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.) - -### Adjacent Topics -- [[React Server Components (RSC) & Next.js App Router]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: Vite๋ฅผ ์ด์šฉํ•œ ๋นŒ๋“œ ํˆด ์ฒด์ธ ์ตœ์ ํ™”(CSR/SPA ์„ฑ๋Šฅ ์ตœ์ ํ™”)๋ฅผ ๋„˜์–ด, ํด๋ผ์ด์–ธํŠธ ์ธก ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค ์ž์ฒด๋ฅผ ์ „์†กํ•˜์ง€ ์•Š๊ณ  ์„œ๋ฒ„์—์„œ ๋ฏธ๋ฆฌ ๋ Œ๋”๋งํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜ ์ˆ˜์ค€์˜ ์„ฑ๋Šฅ ์ตœ์ ํ™” ํŒจ๋Ÿฌ๋‹ค์ž„์œผ๋กœ ์ดํ•ด๋ฅผ ๋„“ํž™๋‹ˆ๋‹ค [21-23]. -- [[Performance Metrics (Core Web Vitals)]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: Vite์˜ ์ฒญํฌ ์ตœ์ ํ™”์™€ ๋ ˆ์ด์ง€ ๋กœ๋”ฉ ๊ธฐ๋ฒ•์ด ์‹ค์ œ ์‚ฌ์šฉ์ž ์ฒด๊ฐ ์„ฑ๋Šฅ ์ง€ํ‘œ์ธ FCP(First Contentful Paint), LCP(Largest Contentful Paint), INP(Interaction to Next Paint)์— ์–ด๋–ค ์ง์ ‘์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”์ง€ ์—ฐ๊ฒฐํ•˜์—ฌ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค [13, 24, 25]. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Vite Build Tool.md b/00_Raw/Vite Build Tool.md deleted file mode 100644 index de593fe3..00000000 --- a/00_Raw/Vite Build Tool.md +++ /dev/null @@ -1,72 +0,0 @@ -# [[Vite Build Tool]] - -## ๐Ÿ“Œ Brief ์ž„๋ฌด -Vite๋Š” ํ˜„๋Œ€ ํ”„๋ก ํŠธ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(์ฃผ๋กœ React)์„ ์œ„ํ•œ ํ‘œ์ค€ ๋นŒ๋“œ ๋„๊ตฌ๋กœ, ๊ธฐ์กด Webpack ๋ฐ Create React App(CRA)์„ ๋Œ€์ฒดํ•˜๋ฉฐ ๋น ๋ฅด๊ฒŒ ์ž๋ฆฌ ์žก์•˜์Šต๋‹ˆ๋‹ค [1, 2]. ์ด ๋„๊ตฌ๋Š” ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋Š” ๋ธŒ๋ผ์šฐ์ €์˜ ๋„ค์ดํ‹ฐ๋ธŒ ES ๋ชจ๋“ˆ(ESM)์„ ํ™œ์šฉํ•ด ์ฆ‰๊ฐ์ ์ธ ์„œ๋ฒ„ ์‹œ์ž‘๊ณผ ์ดˆ๊ณ ์† HMR(Hot Module Replacement)์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [2-4]. ํ”„๋กœ๋•์…˜ ๋ฐฐํฌ ์‹œ์—๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ Rollup์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…๊ณผ ํŠธ๋ฆฌ ์‰์ดํ‚น์ด ์ ์šฉ๋œ ๊ณ ๋„๋กœ ์ตœ์ ํ™”๋œ ๋ฒˆ๋“ค์„ ์ƒ์„ฑํ•˜๋Š” ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ํŠน์ง•์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค [5, 6]. - -## ๐Ÿ“– Core Content -* **ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์•„ํ‚คํ…์ฒ˜ (Hybrid Architecture)** - * **๊ฐœ๋ฐœ ํ™˜๊ฒฝ:** ์ฝ”๋“œ๋ฅผ ์‚ฌ์ „์— ์ „์ฒด ๋ฒˆ๋“ค๋งํ•˜์ง€ ์•Š๊ณ  ๋ธŒ๋ผ์šฐ์ €์— ๋„ค์ดํ‹ฐ๋ธŒ ES ๋ชจ๋“ˆ(ESM)๋กœ ์ง์ ‘ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ํŒŒ์ผ๋งŒ ๋กœ๋“œ๋˜๋ฏ€๋กœ ํ”„๋กœ์ ํŠธ ํฌ๊ธฐ๊ฐ€ ์ปค์ ธ๋„ ๊ฐœ๋ฐœ ์„œ๋ฒ„๊ฐ€ ์ฆ‰๊ฐ์ ์œผ๋กœ ๋ฐ˜์‘ํ•ฉ๋‹ˆ๋‹ค [2-4]. - * **ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ:** ๋ฐฐํฌ ์‹œ์—๋Š” Rollup์„ ์‚ฌ์šฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฒˆ๋“ค๋งํ•˜๋ฉฐ, ์ž๋™ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ… ๋ฐ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ํŠธ๋ฆฌ ์‰์ดํ‚น(Tree-shaking)์„ ํ†ตํ•ด ์ตœ์ ํ™”๋œ ์ •์  ์—์…‹์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [5, 6]. -* **์ดˆ๊ณ ์† ์ปดํŒŒ์ผ ๋ฐ ์‚ฌ์ „ ๋ฒˆ๋“ค๋ง (Fast Compilation & Pre-bundling)** - * Vite๋Š” esbuild๋‚˜ ์ตœ์‹  Rust ๊ธฐ๋ฐ˜ ํŠธ๋žœ์Šคํฌ๋จธ์ธ SWC(Speedy Web Compiler)๋ฅผ ํ™œ์šฉํ•˜์—ฌ JSX ๋ฐ TypeScript ํŒŒ์ผ์„ ์‚ฌ์‹ค์ƒ ์ฆ‰์‹œ ์ปดํŒŒ์ผํ•ฉ๋‹ˆ๋‹ค [4, 7]. ๊ธฐ์กด Babel์„ SWC๋กœ ๋Œ€์ฒดํ•˜๋ฉด ํ•ซ ๋ชจ๋“ˆ ๋ฆฌ๋กœ๋“œ ์‹œ๊ฐ„์ด ํฌ๊ฒŒ ๋‹จ์ถ•๋ฉ๋‹ˆ๋‹ค [8]. - * ๊ฐœ๋ฐœ ์ค‘ ์ƒˆ๋กœ๊ณ ์นจ ์†๋„๋ฅผ ์ตœ์ ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์ข…์†์„ฑ์„ ์‚ฌ์ „ ๋ฒˆ๋“ค๋ง(Pre-bundling, `optimizeDeps`)ํ•ฉ๋‹ˆ๋‹ค [8]. -* **์„ค์ • ๋ฐ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ƒํƒœ๊ณ„ (Configuration & Plugins)** - * `vite.config.js`๋ฅผ ํ†ตํ•ด ๊ฒฝ๋กœ ๋ณ„์นญ(Path Aliases), CORS ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ๊ฐœ๋ฐœ ์„œ๋ฒ„ ํ”„๋ก์‹œ, `VITE_` ์ ‘๋‘์‚ฌ๊ฐ€ ๋ถ™์€ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋“ฑ์„ ์œ ์—ฐํ•˜๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [7, 9, 10]. - * SVG๋ฅผ React ์ปดํฌ๋„ŒํŠธ๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•œ `vite-plugin-svgr`, ์˜คํ”„๋ผ์ธ PWA ์ง€์›์„ ์œ„ํ•œ `vite-plugin-pwa`, ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ๋ถ„์„ํ•˜๋Š” `rollup-plugin-visualizer` ๋“ฑ ๊ฐ•๋ ฅํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ƒํƒœ๊ณ„๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค [11-13]. -* **๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ ์ตœ์ ํ™” (Bundle Optimization)** - * ๊ธฐ๋ณธ์ ์œผ๋กœ Vite๋Š” ์•ฑ ์ฝ”๋“œ์™€ ๋ชจ๋“  ์ข…์†์„ฑ(node_modules)์„ ํ•˜๋‚˜์˜ `index.js`์— ๋‹ด์•„ ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด `vite.config.ts`์˜ Rollup ์˜ต์…˜์—์„œ `manualChunks`๋ฅผ ์„ค์ •ํ•˜์—ฌ React ์ฝ”์–ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋“ฑ ๋ฌด๊ฑฐ์šด ๋ฒค๋”๋ฅผ ๋ถ„๋ฆฌํ•˜๊ณ  ๋ธŒ๋ผ์šฐ์ € ์บ์‹ฑ ํšจ์œจ์„ ๋†’์ž…๋‹ˆ๋‹ค [6, 14, 15]. - * `React.lazy()`์™€ ``๋ฅผ ๊ฒฐํ•ฉํ•œ ๋ผ์šฐํŠธ ๋ ˆ๋ฒจ ๋™์  ์ž„ํฌํŠธ๋ฅผ ํ†ตํ•ด ์ดˆ๊ธฐ ๋ฉ”์ธ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ๊ทน์ ์œผ๋กœ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [11, 14, 15]. - -## โš–๏ธ Trade-offs & Caveats -* **๋Œ€ํ˜• ์ฒญํฌ ๊ฒฝ๊ณ  ๋ฐ ์ดˆ๊ธฐ ๋ฒˆ๋“ค ๋น„๋Œ€ํ™” (Large Chunks Warning):** Vite๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ์ข…์†์„ฑ์„ ๋‹จ์ผ ํŒŒ์ผ๋กœ ๋นŒ๋“œํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ˆ˜๋™์œผ๋กœ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…์„ ํ•˜์ง€ ์•Š์œผ๋ฉด ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ ์‹œ "500kB ์ดˆ๊ณผ" ๊ฒฝ๊ณ ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋‹ค์šด๋กœ๋“œ ์‹œ๊ฐ„์„ ์ง€์—ฐ์‹œํ‚ค๊ณ  ๋‚ฎ์€ ์„ฑ๋Šฅ์˜ ๋ชจ๋ฐ”์ผ ๊ธฐ๊ธฐ์—์„œ ํŒŒ์‹ฑ ๋ฐ ์ปดํŒŒ์ผ์— ๋ฌด๋ฆฌ๋ฅผ ์ฃผ์–ด FCP, LCP, INP์™€ ๊ฐ™์€ Core Web Vitals ์ง€ํ‘œ๋ฅผ ์•…ํ™”์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [14, 16, 17]. -* **๊ฐœ๋ฐœ์ž ๋„๊ตฌ ์บ์‹ฑ ์˜์กด์„ฑ:** Vite๋Š” ๋ชจ๋“ˆ ๋กœ๋”ฉ ์„ฑ๋Šฅ์„ ์œ„ํ•ด ๋ธŒ๋ผ์šฐ์ €์˜ ์บ์‹ฑ์— ํฌ๊ฒŒ ์˜์กดํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐœ๋ฐœ ์ค‘ ๋ธŒ๋ผ์šฐ์ € ๊ฐœ๋ฐœ์ž ๋„๊ตฌ์—์„œ "์บ์‹œ ์‚ฌ์šฉ ์•ˆ ํ•จ(Disable cache)"์„ ์„ค์ •ํ•˜๋ฉด ๊ฐœ๋ฐœ ์„œ๋ฒ„๊ฐ€ ๋А๋ ค์ง€๋Š” ๋ถ€์ž‘์šฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [18]. -* **ํ”Œ๋Ÿฌ๊ทธ์ธ ๋‚จ์šฉ์œผ๋กœ ์ธํ•œ ์„ฑ๋Šฅ ์ €ํ•˜:** ๊ณผ๋„ํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ ์‚ฌ์šฉ์€ ๊ฐœ๋ฐœ ์„œ๋ฒ„์˜ ์†๋„๋ฅผ ์ €ํ•˜์‹œํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๊ตฌ์„ฑ์„ ์ตœ์†Œํ™”ํ•˜๊ณ  ํ•„์š”ํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ๋งŒ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [18]. -* **์‚ฌ์ „ ๋ฒˆ๋“ค๋ง ๊ด€๋ฆฌ ํ•„์š”์„ฑ:** ๊ทœ๋ชจ๊ฐ€ ํฌ๊ฑฐ๋‚˜ ํŠน์ดํ•œ ์™ธ๋ถ€ ์ข…์†์„ฑ์˜ ๊ฒฝ์šฐ, `optimizeDeps` ์„ค์ •์„ ์ˆ˜๋™์œผ๋กœ ์ œ์–ดํ•˜์ง€ ์•Š์œผ๋ฉด ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์ „ ๋ฒˆ๋“ค๋ง์œผ๋กœ ์ธํ•œ ์†๋„ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [8, 11]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -#### [์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] -- [[Native ES Modules (ESM)]] - - ์—ฐ๊ฒฐ ์ด์œ : Vite๊ฐ€ ๊ฐœ๋ฐœ ๋‹จ๊ณ„์—์„œ ๋น ๋ฅธ ๊ตฌ๋™ ์†๋„๋ฅผ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ํ™œ์šฉํ•˜๋Š” ๋ธŒ๋ผ์šฐ์ €์˜ ๊ธฐ๋ณธ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค [2, 4]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ณผ๊ฑฐ ๋„๊ตฌ(Webpack)์˜ ๋ฌด๊ฑฐ์šด ์‚ฌ์ „ ๋ฒˆ๋“ค๋ง ๋ฐฉ์‹๊ณผ ๋Œ€๋น„๋˜๋Š” Vite์˜ '์š”์ฒญ ์‹œ ์ œ๊ณต(On-demand serving)' ๋ฉ”์ปค๋‹ˆ์ฆ˜์˜ ์›๋ฆฌ. - -- [[Rollup]] - - ์—ฐ๊ฒฐ ์ด์œ : Vite์˜ ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ๋‚ด๋ถ€ ๋ฒˆ๋“ค๋Ÿฌ์ž…๋‹ˆ๋‹ค [5, 6]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ฐฐํฌ ํ™˜๊ฒฝ์—์„œ ์–ด๋–ป๊ฒŒ `manualChunks`๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฒˆ๋“ค์„ ๋ถ„ํ• ํ•˜๊ณ , ํŠธ๋ฆฌ ์‰์ดํ‚น์„ ํ†ตํ•ด ์ตœ์ ํ™”๋œ ๊ฒฐ๊ณผ๋ฌผ์„ ๋„์ถœํ•˜๋Š”์ง€ ๊ทธ ๊ณผ์ • [10, 16]. - -- [[SWC]] - - ์—ฐ๊ฒฐ ์ด์œ : ๊ธฐ์กด์˜ Babel์„ ๋Œ€์ฒดํ•˜์—ฌ JSX์™€ TypeScript ์ปดํŒŒ์ผ์„ ์—„์ฒญ๋‚˜๊ฒŒ ๋น ๋ฅธ ์†๋„๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” Rust ๊ธฐ๋ฐ˜ ํŠธ๋žœ์Šคํฌ๋จธ์ž…๋‹ˆ๋‹ค [4, 7, 8]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Vite ํ™˜๊ฒฝ์—์„œ React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ•ซ ๋ฆฌ๋กœ๋“œ์™€ ๋นŒ๋“œ ํผํฌ๋จผ์Šค๋ฅผ ํ•œ ์ฐจ์› ๋Œ์–ด์˜ฌ๋ฆฌ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ์˜ ์—ญํ• . - -#### [์ตœ์ ํ™” ๊ธฐ๋ฒ•] -- [[Code Splitting & manualChunks]] - - ์—ฐ๊ฒฐ ์ด์œ : 500kB ์ด์ƒ์˜ ๊ฑฐ๋Œ€ํ•œ ๋ฉ”์ธ ๋ฒˆ๋“ค ๊ฒฝ๊ณ  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Vite/Rollup ํ™˜๊ฒฝ์—์„œ ๋ฒค๋” ์ฝ”๋“œ์™€ ์•ฑ ์ฝ”๋“œ๋ฅผ ๋‚˜๋ˆ„๋Š” ํ•ต์‹ฌ ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค [6, 14, 15]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ธŒ๋ผ์šฐ์ € ๋ณ‘๋ ฌ ๋‹ค์šด๋กœ๋“œ์™€ ํšจ์œจ์ ์ธ ์บ์‹œ ๋ฌดํšจํ™” ์ „๋žต, ์ดˆ๊ธฐ ํŽ˜์ด๋กœ๋“œ ์ตœ์†Œํ™” ๋ฐฉ๋ฒ• [17, 19]. - -### Deeper Research Questions - -- Vite์˜ ๋„ค์ดํ‹ฐ๋ธŒ ESM ๊ธฐ๋ฐ˜ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ๊ณผ Rollup ๊ธฐ๋ฐ˜ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ ์‚ฌ์ด์˜ ์ฐจ์ด๋กœ ์ธํ•ด, ๋Ÿฐํƒ€์ž„ ๋˜๋Š” ๋นŒ๋“œ ํƒ€์ž„์— ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๋‚˜ ์˜ˆ์™ธ ์ผ€์ด์Šค๋Š” ๋ฌด์—‡์ธ๊ฐ€? -- ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ `optimizeDeps`๋ฅผ ํ†ตํ•œ ์‚ฌ์ „ ๋ฒˆ๋“ค๋ง ๋ฉ”์ปค๋‹ˆ์ฆ˜ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ค ๊ธฐ์ค€์„ ๊ฐ€์ง€๊ณ  ์ข…์†์„ฑ์„ ๋ถ„๋ฆฌ/ํฌํ•จํ•ด์•ผ ํ•˜๋Š”๊ฐ€? -- `@vitejs/plugin-react-swc` ์‚ฌ์šฉ ์‹œ, ๊ธฐ์กด Babel ์ƒํƒœ๊ณ„์˜ ์ปค์Šคํ…€ ํ”Œ๋Ÿฌ๊ทธ์ธ๋“ค์„ ์–ด๋–ป๊ฒŒ ์ด๊ด€ํ•˜๊ฑฐ๋‚˜ ๋Œ€์ฒดํ•ด์•ผ ํ•˜๋Š”๊ฐ€? -- `manualChunks`๋ฅผ ์„ธ๋ฐ€ํ•˜๊ฒŒ ์„ค์ •ํ•  ๋•Œ ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ค‘๋ณต ํฌํ•จ์„ ๋ง‰๊ณ  ๊ฐ€์žฅ ์ด์ƒ์ ์ธ ์ฒญํฌ ํฌ๊ธฐ๋ฅผ ์œ ์ง€ํ•˜๋Š” ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? -- Vite ํ™˜๊ฒฝ์—์„œ ๋ผ์šฐํŠธ ๋ ˆ๋ฒจ ์ง€์—ฐ ๋กœ๋”ฉ(`React.lazy`) ์ ์šฉ ์‹œ ๋ฐœ์ƒํ•˜๋Š” ์›Œํ„ฐํด(Waterfall) ๋„คํŠธ์›Œํฌ ์š”์ฒญ ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด `preload` ๋˜๋Š” `prefetch` ํžŒํŠธ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ฒฐํ•ฉํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? - -### Practical Application Contexts - -- **Implementation:** `npm create vite@latest`๋ฅผ ์‚ฌ์šฉํ•ด ๋ถˆํ•„์š”ํ•œ ์„ค์ • ์—†๋Š” ๊ฐ€๋ฒผ์šด ์ดˆ๊ธฐ ๊ตฌ์กฐ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , `vite.config.js`์— `@vitejs/plugin-react-swc`์™€ ๊ฐ™์€ ํ”Œ๋Ÿฌ๊ทธ์ธ, ๊ฒฝ๋กœ ๋ณ„์นญ(`@/components` ๋“ฑ), ๋ฐฑ์—”๋“œ API ์—ฐ๋™์„ ์œ„ํ•œ proxy ์„ค์ •์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค [3, 7, 9, 10]. -- **System Design:** ํ”„๋ก ํŠธ์—”๋“œ ์‹œ์Šคํ…œ ์„ค๊ณ„ ์‹œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ(๋น ๋ฅธ ํ”ผ๋“œ๋ฐฑ ๋ฃจํ”„ ๋ณด์žฅ)๊ณผ ๋ฐฐํฌ ํ™˜๊ฒฝ(๊ณ ๋„์˜ ์••์ถ• ๋ฐ ๋ณ‘๋ ฌ ๋กœ๋“œ๋ฅผ ์œ„ํ•œ ๋ชจ๋“ˆํ™” ๋ณด์žฅ)์— ๋‹ค๋ฅธ ์ „๋žต์„ ์ทจํ•˜๋Š” Vite์˜ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์ฒ ํ•™์„ ์•„ํ‚คํ…์ฒ˜์— ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค [5]. -- **Operation / Maintenance:** CI/CD ํŒŒ์ดํ”„๋ผ์ธ์ด๋‚˜ ๋กœ์ปฌ ๋นŒ๋“œ ํ›„ `rollup-plugin-visualizer` ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ํ™œ์šฉํ•˜์—ฌ ์–ด๋–ค ํŒจํ‚ค์ง€๊ฐ€ ๋ฉ”์ธ ๋ฒˆ๋“ค ์šฉ๋Ÿ‰์„ ์ฐจ์ง€ํ•˜๋Š”์ง€ ์‹œ๊ฐ์  ํŠธ๋ฆฌ๋งต์œผ๋กœ ์ •๊ธฐ ์ ๊ฒ€ํ•˜๊ณ  ์ตœ์ ํ™”ํ•ฉ๋‹ˆ๋‹ค [11, 13, 18]. -- **Learning Path:** ๋ชจ๋“ˆ ๋ฒˆ๋“ค๋Ÿฌ์˜ ๋ฐœ์ „ ๊ณผ์ •(Webpack -> ES Modules ๋„ค์ดํ‹ฐ๋ธŒ ๋„์ž… -> Vite)์„ ํ•™์Šตํ•œ ํ›„, ๋นŒ๋“œ ๋„๊ตฌ ์ฐจ์›์˜ ์ตœ์ ํ™”(`manualChunks`)์™€ React ํ”„๋ ˆ์ž„์›Œํฌ ์ฐจ์›์˜ ์ตœ์ ํ™”(`React.lazy`)๊ฐ€ ๊ฒฐํ•ฉ๋˜์—ˆ์„ ๋•Œ์˜ ์‹œ๋„ˆ์ง€๋ฅผ ์ดํ•ดํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ํ•™์Šต์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค [2, 6, 15]. -- **My Project Relevance:** Vite ๋นŒ๋“œ ์‹œ "Some chunks are larger than 500 kB" ๊ฒฝ๊ณ ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ๋‹นํ™ฉํ•˜์ง€ ์•Š๊ณ , ์ž์ฃผ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ๋ฒค๋” ์ฝ”๋“œ(React ์ฝ”์–ด, ์ฐจํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋“ฑ)๋ฅผ ๋ถ„๋ฆฌํ•˜๊ณ  ๋ผ์šฐํ„ฐ ๋ ˆ๋ฒจ์—์„œ ์ง€์—ฐ ๋กœ๋”ฉ์„ ๋„์ž…ํ•˜์—ฌ ๋‹ค์šด๋กœ๋“œ ์†๋„ ๋ฐ FCP, LCP๋ฅผ ๊ฐœ์„ ํ•˜๋Š” ๋ฐ ์ง์ ‘์ ์œผ๋กœ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค [14-16]. - -### Adjacent Topics - -- [[Webpack]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: Vite๊ฐ€ ๋“ฑ์žฅํ•˜๊ธฐ ์ „ ์—…๊ณ„ ํ‘œ์ค€์ด์—ˆ์œผ๋‚˜ ์‹œ์ž‘ ์ „ ์ „์ฒด ๋ฒˆ๋“ค๋ง ๊ณผ์ •์œผ๋กœ ์ธํ•ด ๋ฌด๊ฑฐ์šด ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„ Webpack์˜ ํ•œ๊ณ„์™€ Vite์™€์˜ ์•„ํ‚คํ…์ฒ˜ ๋น„๊ต [1, 2]. -- [[Core Web Vitals]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: Vite์˜ ์ฒญํฌ ๋ถ„ํ•  ๋ฐ ์ง€์—ฐ ๋กœ๋”ฉ ๊ธฐ๋ฒ•์ด ์‹ค์ œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ์ง€ํ‘œ์ธ FCP(First Contentful Paint), LCP(Largest Contentful Paint), INP(Interaction to Next Paint)์— ์–ด๋–ป๊ฒŒ ์ง๊ฒฐ๋˜๋Š”์ง€ ํƒ๊ตฌ [17, 20]. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Vite and Bundling.md b/00_Raw/Vite and Bundling.md deleted file mode 100644 index 39e67535..00000000 --- a/00_Raw/Vite and Bundling.md +++ /dev/null @@ -1,63 +0,0 @@ -# [[Vite and Bundling]] - -## ๐Ÿ“Œ Brief Summary -Vite๋Š” Webpack์„ ๋Œ€์ฒดํ•˜๋ฉฐ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์˜ ์ƒˆ๋กœ์šด ํ‘œ์ค€์œผ๋กœ ์ž๋ฆฌ ์žก์€ ๋ชจ๋˜ ๋นŒ๋“œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค [1, 2]. ๊ฐœ๋ฐœ ๋‹จ๊ณ„์—์„œ๋Š” ๋ธŒ๋ผ์šฐ์ €์— ๋„ค์ดํ‹ฐ๋ธŒ ES ๋ชจ๋“ˆ(ESM) ํ˜•ํƒœ๋กœ ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ์ œ๊ณตํ•˜์—ฌ ์ฆ‰๊ฐ์ ์ธ ์„œ๋ฒ„ ์‹œ์ž‘๊ณผ ๋น ๋ฅธ ํ•ซ ๋ชจ๋“ˆ ๊ต์ฒด(HMR)๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค [2-4]. ํ”„๋กœ๋•์…˜ ๋ฐฐํฌ ์‹œ์—๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ Rollup์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ๋ถ„ํ• ํ•˜๊ณ  ์ตœ์ ํ™”๋œ ๋ฒˆ๋“ค์„ ์ƒ์„ฑํ•จ์œผ๋กœ์จ ์ดˆ๊ธฐ ๋กœ๋”ฉ ์†๋„๋ฅผ ๋†’์ด๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•ฉ๋‹ˆ๋‹ค [5-7]. - -## ๐Ÿ“– Core Content -* **ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์•„ํ‚คํ…์ฒ˜:** Vite๋Š” ๊ฐœ๋ฐœ ๋‹จ๊ณ„์—์„œ ์ „์ฒด ์ฝ”๋“œ๋ฅผ ๋ฏธ๋ฆฌ ๋ฒˆ๋“ค๋งํ•˜์ง€ ์•Š๊ณ  ๋„ค์ดํ‹ฐ๋ธŒ ES ๋ชจ๋“ˆ(ESM)์„ ๋ธŒ๋ผ์šฐ์ €์— ๋ฐ”๋กœ ์„œ๋น™ํ•ฉ๋‹ˆ๋‹ค [4]. ์ด ๊ณผ์ •์—์„œ esbuild๋‚˜ SWC(Rust ๊ธฐ๋ฐ˜ ์ปดํŒŒ์ผ๋Ÿฌ)๋ฅผ ์‚ฌ์šฉํ•ด JSX์™€ TypeScript๋ฅผ ๊ฑฐ์˜ ์ฆ‰์‹œ ์ปดํŒŒ์ผํ•ฉ๋‹ˆ๋‹ค [2, 4]. ๋ฐ˜๋ฉด, ๋ฐฐํฌํ•  ๋•Œ๋Š” Rollup์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž๋™ ์ฝ”๋“œ ๋ถ„ํ• ๊ณผ ๋ฏธ์‚ฌ์šฉ ์ฝ”๋“œ ์ œ๊ฑฐ(Tree-shaking)๊ฐ€ ์ ์šฉ๋œ ๊ฐ€๋ณ๊ณ  ์ตœ์ ํ™”๋œ ํ”„๋กœ๋•์…˜ ๋ฒˆ๋“ค์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค [5, 6]. -* **๊ฑฐ๋Œ€ํ•œ ์ฒญํฌ(Large Chunks) ๋ฌธ์ œ:** ๊ธฐ๋ณธ ์„ค์ •์—์„œ Vite๋Š” ์•ฑ ์ฝ”๋“œ์™€ ๋ชจ๋“  `node_modules` ์ข…์†์„ฑ(React, ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋“ฑ)์„ ํ•˜๋‚˜์˜ ๊ฑฐ๋Œ€ํ•œ `index.js` ํŒŒ์ผ๋กœ ๋ฌถ์–ด ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [8]. ์ด๋Š” ๋ชจ๋ฐ”์ผ ๊ธฐ๊ธฐ์—์„œ์˜ ํŒŒ์‹ฑ ์ง€์—ฐ๊ณผ ๋น„ํšจ์œจ์ ์ธ ์บ์‹œ ๋ฌดํšจํ™” ๋“ฑ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์ดˆ๋ž˜ํ•˜๋ฉฐ, ์ข…์ข… ๋นŒ๋“œ ์‹œ "500 kB ์ดˆ๊ณผ" ๊ฒฝ๊ณ ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค [7, 9]. -* **์ˆ˜๋™ ์ฒญํฌ ๋ถ„ํ•  (manualChunks):** ์œ„ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด `vite.config.js`์˜ Rollup ์˜ต์…˜ ์ค‘ `manualChunks`๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [10, 11]. React ํ•ต์‹ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜ ์ฐจํŠธ ๋„๊ตฌ ๋“ฑ ๋ฌด๊ฑฐ์šด ๋ฒค๋”(Vendor) ํŒจํ‚ค์ง€๋ฅผ ๋ณ„๋„์˜ ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌํ•˜๋ฉด, ํ•ด๋‹น ์ฝ”๋“œ๋Š” ์ž์ฃผ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์žฅ๊ธฐ ์บ์‹ฑ์„ ํ•  ์ˆ˜ ์žˆ์–ด ๋‹ค์šด๋กœ๋“œ ํšจ์œจ์ด ๊ทน๋Œ€ํ™”๋ฉ๋‹ˆ๋‹ค [6, 11, 12]. -* **๋™์  ์ž„ํฌํŠธ์™€ ์ง€์—ฐ ๋กœ๋”ฉ (Code Splitting & Lazy Loading):** `React.lazy`์™€ ``๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ๋ผ์šฐํŠธ ์ˆ˜์ค€์—์„œ ์ฝ”๋“œ๋ฅผ ๋ถ„ํ• (Code Splitting)ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [11, 13]. ์ด ๊ธฐ๋ฒ•์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž๊ฐ€ ํŠน์ • ๋ผ์šฐํŠธ๋‚˜ ๊ธฐ๋Šฅ์— ์ ‘๊ทผํ•  ๋•Œ๋งŒ ํ•ด๋‹น ์ฒญํฌ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ์ดˆ๊ธฐ ๋กœ๋”ฉ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ํš๊ธฐ์ ์œผ๋กœ ์ค„์—ฌ์ค๋‹ˆ๋‹ค [13-16]. -* **๋ฒˆ๋“ค ํฌ๊ธฐ ๋ถ„์„:** ํ”„๋กœ์ ํŠธ์˜ ๋ฒˆ๋“ค ๊ตฌ์„ฑ์„ ์‹œ๊ฐ์ ์œผ๋กœ ๋ถ„์„ํ•˜๊ธฐ ์œ„ํ•ด `rollup-plugin-visualizer`๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [13, 16]. ๋นŒ๋“œ ํ›„ ์‹œ๊ฐํ™”๋œ ํŠธ๋ฆฌ๋งต์„ ํ†ตํ•ด ํ•„์š” ์ด์ƒ์œผ๋กœ ํฐ ํŒจํ‚ค์ง€๋‚˜ ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ๋ฅผ ์‹๋ณ„ํ•˜์—ฌ ์ตœ์ ํ™” ๊ธฐํšŒ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [16, 17]. - -## โš–๏ธ Trade-offs & Caveats -* **๊ณผ๋„ํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ ์‚ฌ์šฉ ์‹œ์˜ ์„ฑ๋Šฅ ์ €ํ•˜:** Vite์—์„œ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ง€๋‚˜์น˜๊ฒŒ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋ฉด ๊ฐœ๋ฐœ ์„œ๋ฒ„์˜ ์†๋„๊ฐ€ ๋А๋ ค์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ™˜๊ฒฝ์„ ์พŒ์ ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋ ค๋ฉด ์„ค์ •์„ ๊ฐ€๋ณ๊ณ  ํ•„์ˆ˜์ ์œผ๋กœ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [17]. -* **๋ธŒ๋ผ์šฐ์ € ์บ์‹ฑ ์˜์กด๋„:** ๊ฐœ๋ฐœ ๋ชจ๋“œ์—์„œ ๋ชจ๋“ˆ ๋กœ๋”ฉ ์„ฑ๋Šฅ์„ ์œ„ํ•ด ๋ธŒ๋ผ์šฐ์ € ์บ์‹ฑ์— ํฌ๊ฒŒ ์˜์กดํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž ๋„๊ตฌ์—์„œ ์บ์‹œ๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๋ฉด Vite์˜ ์„ฑ๋Šฅ ์ด์ ์„ ์žƒ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [17]. -* **์ง€์—ฐ ๋กœ๋”ฉ(Lazy Loading) ๋‚จ์šฉ์˜ ๋ถ€์ž‘์šฉ:** ์ฝ”๋“œ ๋ถ„ํ• ์€ ์œ ์šฉํ•˜์ง€๋งŒ ๋‚จ์šฉํ•  ๊ฒฝ์šฐ ์˜คํžˆ๋ ค ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ํ•ด์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์ ‘์†ํ•˜์ž๋งˆ์ž ์ฆ‰์‹œ ๋ด์•ผ ํ•˜๋Š” 'Above-the-fold(์Šคํฌ๋กค ์—†์ด ๋ณผ ์ˆ˜ ์žˆ๋Š” ์ƒ๋‹จ ์˜์—ญ)'์˜ ํ•„์ˆ˜ ์ปดํฌ๋„ŒํŠธ๋Š” ์ง€์—ฐ ๋กœ๋”ฉ์„ ํ”ผํ•˜๊ณ  ์ดˆ๊ธฐ ๋ฒˆ๋“ค์— ํฌํ•จ์‹œ์ผœ์•ผ ํ•ฉ๋‹ˆ๋‹ค [18]. -* **์‚ฌ์ „ ๋ฒˆ๋“ค๋ง ์ œ์–ด์˜ ํ•„์š”์„ฑ:** Vite๋Š” ๊ฐœ๋ฐœ ์†๋„๋ฅผ ์œ„ํ•ด ์™ธ๋ถ€ ์ข…์†์„ฑ์„ ์‚ฌ์ „์— ๋ฒˆ๋“ค๋ง(Pre-bundling)ํ•˜์ง€๋งŒ, ๋Œ€๊ทœ๋ชจ ์•ฑ์ด๋‚˜ ํŠน์ดํ•œ ๊ตฌ์กฐ์˜ ํŒจํ‚ค์ง€๊ฐ€ ์„ž์—ฌ ์žˆ์„ ๊ฒฝ์šฐ ์†๋„ ์ €ํ•˜๊ฐ€ ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ `optimizeDeps`๋ฅผ ์„ธ์‹ฌํ•˜๊ฒŒ ์ œ์–ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [13, 19]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -#### [์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] -- [[Rollup]] - - ์—ฐ๊ฒฐ ์ด์œ : Vite๊ฐ€ ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ์™€ ๋ฒˆ๋“ค๋ง์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ๋ฐฑ์—”๋“œ ์—”์ง„์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฒˆ๋“ค๋Ÿฌ์ž…๋‹ˆ๋‹ค [5, 6]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Vite์˜ `manualChunks` ๊ธฐ๋Šฅ์ด ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€, ์บ์‹œ ํšจ์œจ์„ฑ์„ ์œ„ํ•œ ์ฒญํฌ ๋ถ„ํ•  ๊ธฐ๋ฒ•์˜ ์›๋ฆฌ๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [6, 10, 11]. -- [[Native ES Modules (ESM)]] - - ์—ฐ๊ฒฐ ์ด์œ : Vite๊ฐ€ ๊ฐœ๋ฐœ ๋ชจ๋“œ์—์„œ ํ”„๋กœ์ ํŠธ ํŒŒ์ผ๋“ค์„ ๋ฒˆ๋“ค๋งํ•˜์ง€ ์•Š๊ณ  ๋ธŒ๋ผ์šฐ์ €์— ๋ฐ”๋กœ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค [2-4]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ธฐ์กด์˜ Webpack๊ณผ ๋‹ฌ๋ฆฌ Vite๊ฐ€ ์•ฑ ๊ทœ๋ชจ์— ์ƒ๊ด€์—†์ด ์ฆ‰๊ฐ์ ์ธ HMR(Hot Module Replacement)๊ณผ ๋น ๋ฅธ ๊ตฌ๋™ ์†๋„๋ฅผ ๋‹ฌ์„ฑํ•˜๋Š” ํ•ต์‹ฌ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3, 4]. -- [[SWC]] - - ์—ฐ๊ฒฐ ์ด์œ : Babel์„ ๋Œ€์ฒดํ•˜์—ฌ Vite์˜ React ํ”Œ๋Ÿฌ๊ทธ์ธ ๋‚ด์—์„œ ์ฝ”๋“œ๋ฅผ ๊ณ ์†์œผ๋กœ ์ปดํŒŒ์ผํ•˜๋Š” Rust ๊ธฐ๋ฐ˜ ์ปดํŒŒ์ผ๋Ÿฌ์ž…๋‹ˆ๋‹ค [4, 20]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ ๊ฐœ๋ฐœ ๋นŒ๋“œ์™€ ๋ฆฌํ”„๋ ˆ์‹œ ์‹œ๊ฐ„์„ ํš๊ธฐ์ ์œผ๋กœ ์ค„์ด๋Š” ์ตœ์‹  ์ปดํŒŒ์ผ ์„ฑ๋Šฅ ์ตœ์ ํ™”์˜ ๊ธฐ์ˆ ์  ๊ธฐ๋ฐ˜์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [19-21]. - -#### [๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ] -- [[Code Splitting]] - - ์—ฐ๊ฒฐ ์ด์œ : ๋ฌด๊ฑฐ์šด ๋ฉ”์ธ ๋ฒˆ๋“ค์„ ์ž‘์€ ์ฒญํฌ ๋‹จ์œ„๋กœ ๋‚˜๋ˆ„๋Š” ์ตœ์ ํ™” ์ „๋žต์˜ ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค [8, 13, 14]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: `React.lazy`์™€ ๊ฒฐํ•ฉํ•ด ์ฝ”๋“œ๋ฅผ ์˜จ๋””๋งจ๋“œ(On-demand)๋กœ ๋ถˆ๋Ÿฌ์˜ค๋ฉฐ, ์ดˆ๊ธฐ ๋กœ๋”ฉ ์†๋„์™€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŽ˜์ด๋กœ๋“œ ํฌ๊ธฐ๋ฅผ ๊ฐœ์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [11, 13, 15, 22]. - -### Deeper Research Questions - -- ๊ฐœ๋ฐœ ๋‹จ๊ณ„์—์„œ Native ESM์œผ๋กœ ์„œ๋น™ํ•˜๋Š” ๋ฐฉ์‹๊ณผ ํ”„๋กœ๋•์…˜์—์„œ Rollup์œผ๋กœ ๋ฒˆ๋“ค๋งํ•˜๋Š” ๋ฐฉ์‹์˜ ์•„ํ‚คํ…์ฒ˜์  ์ฐจ์ด๋กœ ์ธํ•ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋นŒ๋“œ ๋ถˆ์ผ์น˜(Build Inconsistency) ๋ฌธ์ œ์™€ ๊ทธ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? -- `manualChunks`๋ฅผ ์„ค์ •ํ•  ๋•Œ, ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ•˜๋‚˜๋กœ ๋ฌถ๋Š” ๊ฒƒ๊ณผ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ฒญํฌ๋กœ ์ž˜๊ฒŒ ์ชผ๊ฐœ๋Š” ๊ฒƒ ์ค‘ ๋ธŒ๋ผ์šฐ์ € ํŒŒ์‹ฑ ๋ฐ ์บ์‹œ ํšจ์œจ ์ธก๋ฉด์—์„œ ์ด์ƒ์ ์ธ ๊ธฐ์ค€(Threshold)์€ ์–ด๋–ป๊ฒŒ ๊ฒฐ์ •ํ•ด์•ผ ํ•˜๋Š”๊ฐ€? [7, 11] -- ๋ผ์šฐํŠธ ๋ ˆ๋ฒจ์˜ ์ง€์—ฐ ๋กœ๋”ฉ(Lazy Loading)์„ ๊ตฌํ˜„ํ•  ๋•Œ, ๋‹ค์Œ ๋ผ์šฐํŠธ ์ด๋™ ์‹œ ๋กœ๋”ฉ ์ง€์—ฐ์„ ๋ง‰๊ธฐ ์œ„ํ•ด ๋ธŒ๋ผ์šฐ์ €์˜ `preload` ๋˜๋Š” `prefetch` ํžŒํŠธ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ฒฐํ•ฉํ•˜๋Š” ๊ฒƒ์ด ํšจ์œจ์ ์ธ๊ฐ€? [23, 24] -- Vite ํ™˜๊ฒฝ์—์„œ ๋Œ€์šฉ๋Ÿ‰ ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ๋ฅผ ์™„์ „ํžˆ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด, ํŠธ๋ฆฌ ์‰์ดํ‚น(Tree-shaking)์„ ๊ทน๋Œ€ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“ˆ ์ž„ํฌํŠธ ํŒจํ„ด์€ ๋ฌด์—‡์ธ๊ฐ€? [17] -- `optimizeDeps`๋ฅผ ํ†ตํ•œ ์‚ฌ์ „ ๋ฒˆ๋“ค๋ง ์ฒ˜๋ฆฌ ๊ณผ์ •์—์„œ, ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์†๋„๋ฅผ ์‹ฌ๊ฐํ•˜๊ฒŒ ๋–จ์–ด๋œจ๋ฆด ์ˆ˜ ์žˆ๋Š” 'ํŠน์ดํ•œ ํŒจํ‚ค์ง€(Unusual Dependencies)'์˜ ๊ธฐ์ˆ ์  ํŠน์ง•์€ ๋ฌด์—‡์ธ๊ฐ€? [13, 19] - -### Practical Application Contexts - -- **Implementation:** React + Vite ํ”„๋กœ์ ํŠธ ์‹œ์ž‘ ์‹œ `vite.config.js`์— `@vitejs/plugin-react-swc`๋ฅผ ๋„์ž…ํ•˜์—ฌ ๋น ๋ฅธ ๋นŒ๋“œ ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•˜๊ณ , ์ ˆ๋Œ€ ๊ฒฝ๋กœ ํŒจ์Šค ๋ณ„์นญ(Path Aliases)์„ ์„ค์ •ํ•˜์—ฌ ๋ชจ๋“ˆ ๊ด€๋ฆฌ ํšจ์œจ์„ ๋†’์ž…๋‹ˆ๋‹ค [20, 21]. `rollup-plugin-visualizer`๋ฅผ ์ถ”๊ฐ€ํ•ด ๋นŒ๋“œ ๊ฒฐ๊ณผ๋ฌผ์˜ ์‚ฌ์ด์ฆˆ๋ฅผ ์ •๊ธฐ์ ์œผ๋กœ ์ฒดํฌํ•ฉ๋‹ˆ๋‹ค [13, 25]. -- **System Design:** ์ดˆ๊ธฐ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ ์‹œ๋ถ€ํ„ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋ฅผ ๋„๋ฉ”์ธ ๋ฐ ๋ผ์šฐํŠธ๋ณ„๋กœ ๋ถ„๋ฆฌํ•˜๊ณ , `manualChunks`๋ฅผ ๊ตฌ์„ฑํ•ด React ์—”์ง„ ๋“ฑ ๋ฌด๊ฑฐ์šด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ๋…๋ฆฝ๋œ ํŒŒ์ผ๋กœ ๋ฒˆ๋“ค๋ง ๋˜๋„๋ก ๋ธŒ๋ผ์šฐ์ € ์บ์‹ฑ ์ „๋žต์„ ์„ธ์›๋‹ˆ๋‹ค [6, 10, 11]. -- **Operation / Maintenance:** ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ ํŒŒ์ดํ”„๋ผ์ธ์—์„œ "Some chunks are larger than 500 kB" ๊ฒฝ๊ณ ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋ง ์ฒด๊ณ„์— ํ†ตํ•ฉํ•ฉ๋‹ˆ๋‹ค. ๊ฒฝ๊ณ  ๋ฐœ์ƒ ์‹œ `stats.html` ํŒŒ์ผ์„ ๋ถ„์„ํ•˜์—ฌ ์–ด๋–ค ํŒจํ‚ค์ง€๊ฐ€ ๋ฉ”์ธ ๋ฒˆ๋“ค์„ ๋น„๋Œ€ํ™”์‹œํ‚ค๋Š”์ง€ ํŒŒ์•…ํ•˜๊ณ  ๋™์  ์ž„ํฌํŠธ๋กœ ๋ฆฌํŒฉํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค [8, 9, 16]. -- **Learning Path:** ์šฐ์„  ๋ธŒ๋ผ์šฐ์ €์˜ ES ๋ชจ๋“ˆ ์ฒ˜๋ฆฌ ๋ฐฉ์‹๊ณผ Vite์˜ ํ•ต์‹ฌ ๊ฐœ๋ฐœ ์ฒ ํ•™์„ ๋ฐฐ์šด ๋’ค, Rollup์˜ ๋ฒˆ๋“ค๋ง ๊ฐœ๋…์„ ์ตํž™๋‹ˆ๋‹ค. ์ดํ›„ React์˜ `Suspense` ๋ฐ `React.lazy`๋ฅผ ํ†ตํ•œ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ… ํŒจํ„ด์„ ํ”„๋กœ์ ํŠธ์— ์ง์ ‘ ์ ์šฉํ•˜๋Š” ์ˆœ์„œ๋กœ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค [3, 4, 13]. -- **My Project Relevance:** ๊ฑฐ๋Œ€ํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค์ด ์‚ฌ์šฉ์ž ๊ธฐ๊ธฐ์— ๋ถ€๋‹ด์„ ์ฃผ๋Š” ๋Œ€์‹œ๋ณด๋“œ๋‚˜ ์Šคํ† ์–ดํ”„๋ก ํŠธ ๊ตฌ์ถ• ์‹œ, Vite ๋ฒˆ๋“ค๋ง ์ตœ์ ํ™”๋ฅผ ์ ์šฉํ•˜์—ฌ ์ดˆ๊ธฐ ๋‹ค์šด๋กœ๋“œ ์‹œ๊ฐ„์„ ์ค„์ด๊ณ  ์„ฑ๋Šฅ ์ ์ˆ˜(LCP, INP ๋“ฑ)๋ฅผ ๊ทน๋Œ€ํ™”ํ•˜๋Š” ์ง์ ‘์ ์ธ ํ•ด๊ฒฐ์ฑ…์œผ๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [7, 22, 26]. - -### Adjacent Topics - -- [[Core Web Vitals]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋ฒˆ๋“ค ์ตœ์ ํ™” ๋ฐ ์ง€์—ฐ ๋กœ๋”ฉ์ด FCP(First Contentful Paint), LCP(Largest Contentful Paint), INP(Interaction to Next Paint)์™€ ๊ฐ™์€ ๊ตฌ์ฒด์  ์„ฑ๋Šฅ ์ง€ํ‘œ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ฐœ์„ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์ธก์ • ๋ฐฉ๋ฒ• ๋ฐ ์—ฐ๊ด€์„ฑ ํƒ๊ตฌ [7, 14, 22, 26]. -- [[Micro-Frontends]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋ฒˆ๋“ค๋ง ์ตœ์ ํ™”์˜ ์—ฐ์žฅ์„ ์œผ๋กœ ๋‹จ์ผ ๊ฑฐ๋Œ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(Monolith)์„ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋…๋ฆฝ๋œ ๋นŒ๋“œ/๋ฐฐํฌ ๋‹จ์œ„๋กœ ์ชผ๊ฐœ๋Š” ์•„ํ‚คํ…์ฒ˜์  ์ง„ํ™” ๋ฐฉํ–ฅ์— ๋Œ€ํ•œ ์‹ฌ์ธต ์—ฐ๊ตฌ [27]. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/agent harness engineering.md b/00_Raw/agent harness engineering.md deleted file mode 100644 index f886b495..00000000 --- a/00_Raw/agent harness engineering.md +++ /dev/null @@ -1,89 +0,0 @@ -# [[agent harness engineering]] - -## ๐Ÿ“Œ Brief Summary -์—์ด์ „ํŠธ ํ•˜๋„ค์Šค ์—”์ง€๋‹ˆ์–ด๋ง(Agent Harness Engineering)์€ AI ์—์ด์ „ํŠธ๊ฐ€ ๋Œ€๊ทœ๋ชจ๋กœ ์‹ ๋ขฐ์„ฑ ์žˆ๊ฒŒ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋„๋ก ์‹คํ–‰ ํ™˜๊ฒฝ, ์ œ์•ฝ ์กฐ๊ฑด ๋ฐ ํ”ผ๋“œ๋ฐฑ ๋ฃจํ”„๋ฅผ ์„ค๊ณ„ํ•˜๋Š” ๊ทœ์œจ์ด์ž ์ธํ”„๋ผ ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค [1]. ์ด๋Š” ํ”„๋กฌํ”„ํŠธ์™€ ์ปจํ…์ŠคํŠธ ๊ด€๋ฆฌ๋ฅผ ๋„˜์–ด ์—์ด์ „ํŠธ์˜ ์„ธ์…˜, ๋„๊ตฌ, ๋ณด์•ˆ, ์˜ค๋ฅ˜ ๋ณต๊ตฌ, ์ˆ˜๋ช…์ฃผ๊ธฐ ๋“ฑ์„ ์ œ์–ดํ•˜๋Š” ๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค [2, 3]. "์—์ด์ „ํŠธ = ๋ชจ๋ธ + ํ•˜๋„ค์Šค"๋ผ๋Š” ๊ณต์‹์œผ๋กœ ์š”์•ฝ๋˜๋ฉฐ, ํ™•๋ฅ ์ ์ธ ์–ธ์–ด ๋ชจ๋ธ์„ ๊ฒฐ์ •๋ก ์ ์ธ ๋น„์ฆˆ๋‹ˆ์Šค ๋ฐ ์†Œํ”„ํŠธ์›จ์–ด ํ™˜๊ฒฝ์—์„œ ์•ˆ์ „ํ•˜๊ฒŒ ์‹คํ–‰์‹œํ‚ค๋Š” ํ•ต์‹ฌ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค [4-6]. - -## ๐Ÿ“– Core Content - -* **ํŒจ๋Ÿฌ๋‹ค์ž„์˜ ์ง„ํ™” (Evolution of Engineering Paradigms)**: - AI ์—”์ง€๋‹ˆ์–ด๋ง์€ ๋ชจ๋ธ์—๊ฒŒ "๋ฌด์—‡์„ ๋งํ• ์ง€"๋ฅผ ๊ณ ๋ฏผํ•˜๋Š” **ํ”„๋กฌํ”„ํŠธ ์—”์ง€๋‹ˆ์–ด๋ง(Prompt Engineering)**์—์„œ, "์–ด๋–ค ์ •๋ณด๋ฅผ ๋ณด์—ฌ์ค„์ง€"๋ฅผ ๊ณ ๋ฏผํ•˜๋Š” **์ปจํ…์ŠคํŠธ ์—”์ง€๋‹ˆ์–ด๋ง(Context Engineering)**์„ ๊ฑฐ์ณ ๋ฐœ์ „ํ•ด ์™”์Šต๋‹ˆ๋‹ค [2, 3, 7]. ํ˜„์žฌ์˜ **ํ•˜๋„ค์Šค ์—”์ง€๋‹ˆ์–ด๋ง(Harness Engineering)**์€ ๋ชจ๋ธ์ด "์–ด๋–ค ์„ธ๊ณ„(ํ™˜๊ฒฝ)๋ฅผ ํ†ตํ•ด ์›€์ง์ด๊ณ  ์ œ์–ด๋  ๊ฒƒ์ธ์ง€"๋ฅผ ์„ค๊ณ„ํ•˜๋Š” ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค [3]. ์ฆ‰, ๋‹จ์ˆœํžˆ ํ”„๋กฌํ”„ํŠธ๋ฅผ ๋„˜๊ฒจ์ฃผ๋Š” ๊ฒƒ์„ ๋„˜์–ด ๊ฐ€๋“œ๋ ˆ์ผ, ์‹ ํ˜ธ๋“ฑ, ๋น„์ƒ ์ •์ง€ ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•˜์—ฌ ์—์ด์ „ํŠธ์˜ ํ–‰๋™์„ ํ†ต์ œํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค [3]. - -* **ํ•˜๋„ค์Šค์˜ 6๋Œ€ ํ•ต์‹ฌ ๊ตฌ์„ฑ ์š”์†Œ (The Six Core Components)**: - ์™„์ „ํ•œ ํ˜•ํƒœ์˜ ์—์ด์ „ํŠธ ํ•˜๋„ค์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ 6๊ฐ€์ง€ ๋Ÿฐํƒ€์ž„ ๊ฑฐ๋ฒ„๋„Œ์Šค ๊ธฐ๋Šฅ์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค [8, 9]. - 1. **์‹คํ–‰ ๋ฃจํ”„ (Execution Loop, E)**: ์—์ด์ „ํŠธ์˜ ๊ด€์ฐฐ-์‚ฌ๊ณ -ํ–‰๋™ ์ฃผ๊ธฐ๋ฅผ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ํ•˜๊ณ  ์˜ค๋ฅ˜ ๋ณต๊ตฌ์™€ ์ข…๋ฃŒ ์กฐ๊ฑด์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. - 2. **๋„๊ตฌ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ (Tool Registry, T)**: ์—์ด์ „ํŠธ๊ฐ€ ์™ธ๋ถ€ ์„ธ๊ณ„์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ๋ชจ๋“  ํ–‰๋™์„ ์Šคํ‚ค๋งˆ๋ฅผ ํ†ตํ•ด ๊ฒ€์ฆํ•˜๊ณ  ๋ผ์šฐํŒ…ํ•ฉ๋‹ˆ๋‹ค. - 3. **์ปจํ…์ŠคํŠธ ๊ด€๋ฆฌ์ž (Context Manager, C)**: ๋ชจ๋ธ์˜ ์ปจํ…์ŠคํŠธ ์ฐฝ์— ๋“ค์–ด๊ฐ€๋Š” ์ •๋ณด๋ฅผ ์ œ์–ดํ•˜๋ฉฐ, ์ •๋ณด์˜ ์••์ถ•, ๊ฒ€์ƒ‰, ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. - 4. **์ƒํƒœ ์ €์žฅ์†Œ (State Store, S)**: ํ„ด(Turn) ๋ฐ ์„ธ์…˜ ์ „๋ฐ˜์— ๊ฑธ์ณ ์ž‘์—… ๊ด€๋ จ ์ƒํƒœ๋ฅผ ์˜๊ตฌ์ ์œผ๋กœ ์œ ์ง€ํ•˜๊ณ  ๋ถ€๋ถ„์ ์ธ ์‹คํŒจ ์‹œ ๋ณต๊ตฌ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. - 5. **์ˆ˜๋ช…์ฃผ๊ธฐ ํ›… (Lifecycle Hooks, L)**: ์ •์ฑ… ์ง‘ํ–‰, ์ธ์ฆ, ๋กœ๊น…์„ ์œ„ํ•ด ํ˜ธ์ถœ ์ „ํ›„์˜ ๊ฐ€๋กœ์ฑ„๊ธฐ(Interception) ์ง€์ ์„ ํ˜•์„ฑํ•ฉ๋‹ˆ๋‹ค. - 6. **ํ‰๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค (Evaluation Interface, V)**: ๋ฒค์น˜๋งˆํฌ๋‚˜ ํ‰๊ฐ€ ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์‹คํ–‰ ๊ถค์ , ์ค‘๊ฐ„ ์ƒํƒœ, ์„ฑ๊ณต ์‹ ํ˜ธ๋ฅผ ํ‘œ์ค€ํ™”๋œ ํ˜•์‹์œผ๋กœ ์บก์ฒ˜ํ•ฉ๋‹ˆ๋‹ค. - -* **์ œ์–ด ๋ฉ”์ปค๋‹ˆ์ฆ˜๊ณผ ์•ˆ์ „ ์•„ํ‚คํ…์ฒ˜ (Control Mechanisms & Safety)**: - ํ•˜๋„ค์Šค๋Š” **ํ”ผ๋“œํฌ์›Œ๋“œ(๊ฐ€์ด๋“œ)**์™€ **ํ”ผ๋“œ๋ฐฑ(์„ผ์„œ)**์ด๋ผ๋Š” ์‚ฌ์ด๋ฒ„๋„คํ‹ฑ ์ œ์–ด ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค [10]. ๊ทœ์น™ ํŒŒ์ผ(์˜ˆ: `AGENTS.md`)์ด๋‚˜ ์•„ํ‚คํ…์ฒ˜ ์ œ์•ฝ ์กฐ๊ฑด์„ ํ†ตํ•ด ์—์ด์ „ํŠธ์˜ ์†”๋ฃจ์…˜ ๊ณต๊ฐ„์„ ์‚ฌ์ „์— ์ค„์ด๊ณ (ํ”ผ๋“œํฌ์›Œ๋“œ), ๋ฆฐํ„ฐ(Linter) ์˜ค๋ฅ˜์™€ ๊ฐ™์€ ๊ตฌ์กฐํ™”๋œ ์‹ ํ˜ธ๋ฅผ ๋ฃจํ”„์— ์ฃผ์ž…ํ•˜์—ฌ ์Šค์Šค๋กœ ๊ถค๋„๋ฅผ ์ˆ˜์ •ํ•˜๋„๋ก ์œ ๋„ํ•ฉ๋‹ˆ๋‹ค(ํ”ผ๋“œ๋ฐฑ) [1, 11, 12]. ๋˜ํ•œ ์ƒŒ๋“œ๋ฐ•์Šค๋‚˜ ๋งˆ์ดํฌ๋กœ VM(MicroVM)์„ ํ™œ์šฉํ•˜์—ฌ ์ฝ”๋“œ ์‹คํ–‰ ํ™˜๊ฒฝ์„ ๋ถ„๋ฆฌํ•จ์œผ๋กœ์จ, ์—์ด์ „ํŠธ๊ฐ€ ์‹œ์Šคํ…œ์˜ ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๋‚˜ ์ž์›์— ํ•จ๋ถ€๋กœ ์ ‘๊ทผํ•˜์ง€ ๋ชปํ•˜๋„๋ก ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•ฉ๋‹ˆ๋‹ค [13-16]. - -* **๋ชจ๋ธ ๋Šฅ๋ ฅ๊ณผ ์ธํ”„๋ผ์˜ ๊ด€๊ณ„ (Model Capability vs. Infrastructure)**: - ๋ชจ๋ธ ์ž์ฒด์˜ ์—ญ๋Ÿ‰๋งŒ์œผ๋กœ๋Š” ์‹ค์ œ ๋ฐฐํฌ ํ™˜๊ฒฝ์—์„œ์˜ ์‹ ๋ขฐ์„ฑ์„ ๋ณด์žฅํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค [17, 18]. ํ•˜๋„ค์Šค์˜ ์„ค๊ณ„ ๋ฐฉ์‹์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋„ ๋ชจ๋ธ์˜ ์ˆ˜์ • ์—†์ด ์ฝ”๋”ฉ ๋ฒค์น˜๋งˆํฌ์—์„œ ์ตœ๋Œ€ 10๋ฐฐ์˜ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์ด๋Œ์–ด๋‚ผ ์ˆ˜ ์žˆ์Œ์ด ์‹ค์ฆ์ ์œผ๋กœ ์ฆ๋ช…๋˜์—ˆ์Šต๋‹ˆ๋‹ค [19, 20]. ์ด๋Š” ์žฅ๊ธฐ ์‹คํ–‰(Long-running) ์ž‘์—…์ผ์ˆ˜๋ก ์—์ด์ „ํŠธ์˜ ์„ฑ๋Šฅ ํ•œ๊ณ„๊ฐ€ ๋ชจ๋ธ์ด ์•„๋‹Œ **์ธํ”„๋ผ(ํ•˜๋„ค์Šค)์— ์˜ํ•ด ๊ฒฐ์ •๋จ**์„ ์‹œ์‚ฌํ•ฉ๋‹ˆ๋‹ค [21-23]. - -## โš–๏ธ Trade-offs & Caveats - -* **๊ธฐ๋Šฅ์„ฑ๊ณผ ๊ฒฉ๋ฆฌ ๊ฐ„์˜ ์ƒ์ถฉ ๊ด€๊ณ„ (Capability vs. Isolation)**: - ์—์ด์ „ํŠธ๊ฐ€ ๋ณต์žกํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ๋„๊ตฌ ๊ถŒํ•œ๊ณผ ์™ธ๋ถ€ ์‹œ์Šคํ…œ ์ ‘๊ทผ์„ฑ์„ ๋†’์ด๋ฉด ํ•„์—ฐ์ ์œผ๋กœ ๋ณด์•ˆ ๊ณต๊ฒฉ ํ‘œ๋ฉด(์˜ˆ: ๊ฐ„์ ‘ ํ”„๋กฌํ”„ํŠธ ์ธ์ ์…˜ ๋“ฑ)์ด ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค [24, 25]. ๋ฐ˜๋Œ€๋กœ ๊ฐ•๋ ฅํ•œ ๋ณด์•ˆ ๊ฒฉ๋ฆฌ๋ฅผ ์œ„ํ•ด ๋งˆ์ดํฌ๋กœ VM, ์ƒŒ๋“œ๋ฐ•์Šค, ๋„คํŠธ์›Œํฌ ์ œํ•œ ๋“ฑ์„ ๋„์ž…ํ•˜๋ฉด ์‹คํ–‰ ์ง€์—ฐ ์‹œ๊ฐ„(Latency)์ด ๋Š˜์–ด๋‚˜๊ณ  ์ธํ”„๋ผ ์šด์˜ ๋ณต์žก์„ฑ์ด ํฌ๊ฒŒ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค [24, 26]. -* **๊ณผ๋„ํ•œ ์ œ์•ฝ์˜ ์œ„ํ—˜ (Over-constraining)**: - ๊ฒฐ์ •๋ก ์ ์ธ ์•ˆ์ „์„ ํ™•๋ณดํ•˜๊ธฐ ์œ„ํ•ด ํ•˜๋„ค์Šค์˜ ์ œ์•ฝ์„ ๋„ˆ๋ฌด ๋นก๋นกํ•˜๊ฒŒ ์„ค์ •ํ•˜๋ฉด, ์œ ํšจํ•œ ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง์ด๋‚˜ ์ •์ƒ์ ์ธ ์ž‘์—… ํŒจํ„ด๋งˆ์ € ์ฐจ๋‹จ๋˜๋Š” ๋ถ€์ž‘์šฉ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [11]. ๋ฆฐํŠธ(Lint) ๊ทœ์น™์ด ์ž˜๋ชป ๊ตฌ์„ฑ๋˜๋ฉด ์—์ด์ „ํŠธ์˜ ์†๋„๋งŒ ๋Šฆ์ถœ ๋ฟ ์ถœ๋ ฅ ํ’ˆ์งˆ์„ ํ–ฅ์ƒ์‹œํ‚ค์ง€ ๋ชปํ•˜๋ฏ€๋กœ ์ œ์•ฝ์˜ ๋ฒ”์œ„๋ฅผ ์ข๊ฒŒ ์‹œ์ž‘ํ•˜์—ฌ ์ ์ง„์ ์œผ๋กœ ํ™•์žฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [11]. -* **์ปจํ…์ŠคํŠธ ๋น„์šฉ๊ณผ ๊ฒ€์ƒ‰ ์ง€์—ฐ (Context Cost vs. Retrieval Latency)**: - ์—์ด์ „ํŠธ์˜ ๋ชจ๋“  ์ƒํ˜ธ์ž‘์šฉ ์ด๋ ฅ์„ ์ปจํ…์ŠคํŠธ์— ๋ˆ„์ ํ•˜๋ฉด ํ† ํฐ ๋น„์šฉ์ด 2์ฐจ ํ•จ์ˆ˜์ ์œผ๋กœ ํญ์ฆํ•˜๋ฉฐ, '์ปจํ…์ŠคํŠธ ๋ถ€ํŒจ(Context Rot)' ํ˜„์ƒ์ด ๋ฐœ์ƒํ•ด ๋ชจ๋ธ์˜ ์ถ”๋ก  ๋Šฅ๋ ฅ์ด ์ €ํ•˜๋ฉ๋‹ˆ๋‹ค [27-29]. ์ด๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด ์ •๋ณด๋ฅผ ์š”์•ฝํ•˜๊ฑฐ๋‚˜ ์™ธ๋ถ€ ์Šคํ† ๋ฆฌ์ง€๋กœ ์˜คํ”„๋กœ๋”ฉ(RAG ๋“ฑ)ํ•˜๋ฉด ์ •๋ณด ์†์‹ค๊ณผ ๊ฒ€์ƒ‰ ๋Œ€๊ธฐ ์‹œ๊ฐ„ ์ฆ๊ฐ€๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉฐ, ์—์ด์ „ํŠธ๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ๋ชปํ•  ๊ฒฝ์šฐ ํ•„์ˆ˜์ ์ธ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ๋†“์น  ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค [30, 31]. -* **๋‹ค์ค‘ ์—์ด์ „ํŠธ ์กฐ์ • ์˜ค๋ฒ„ํ—ค๋“œ (Multi-Agent Coordination Overhead)**: - ํŠนํ™”๋œ ํ•˜์œ„ ์—์ด์ „ํŠธ(Sub-agent)๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋‹ค์ค‘ ์—์ด์ „ํŠธ ์•„ํ‚คํ…์ฒ˜๋Š” ๋‹จ์ผ ์—์ด์ „ํŠธ ์›Œํฌํ”Œ๋กœ์šฐ์— ๋น„ํ•ด ํ† ํฐ์„ ์ตœ๋Œ€ 15๋ฐฐ ๋” ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [32, 33]. ๋˜ํ•œ ์ƒํƒœ ์ผ๊ด€์„ฑ ๊ด€๋ฆฌ, ๋ฉ”์‹œ์ง€ ๋ผ์šฐํŒ…, ์ปจํ…์ŠคํŠธ ๋ถ„๋ฆฌ ๋“ฑ์˜ ์กฐ์ • ๋น„์šฉ์ด ์ถ”๊ฐ€๋˜๋ฏ€๋กœ, ๋ณต์žกํ•œ ๋ณ‘๋ ฌ ์ž‘์—…์ด ์•„๋‹Œ ๊ฒฝ์šฐ ์ตœ์ ํ™”๋œ ๋‹จ์ผ ์—์ด์ „ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์˜คํžˆ๋ ค ๋น„ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [33-35]. -* **ํ‘œ์ค€ํ™” ๋Œ€ ํŠน์ˆ˜์„ฑ (Standardization vs. Specialization)**: - MCP๋‚˜ A2A์™€ ๊ฐ™์€ ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•œ ํ‘œ์ค€ํ™”๋Š” ์ƒํƒœ๊ณ„์˜ ํ˜ธํ™˜์„ฑ์„ ๋†’์—ฌ์ฃผ์ง€๋งŒ, ํŠน์ • ๋ชจ๋ธ์ด๋‚˜ ๋„๊ตฌ์— ์™„๋ฒฝํžˆ ์ตœ์ ํ™”๋˜์ง€ ์•Š์€ ๊ตฌ์กฐ์  ํƒ€ํ˜‘์„ ๊ฐ•์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [36]. ์„ฑ๊ธ‰ํ•œ ํ‘œ์ค€ํ™”๋Š” ๋น„ํšจ์œจ์ ์ธ ๋ชจ๋ธ-ํ•˜๋„ค์Šค ๊ฒฐํ•ฉ์„ ๊ณ ์ฐฉ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ๋ฐ˜๋ฉด, ํ‘œ์ค€ํ™”๋ฅผ ํ”ผํ•˜๋ฉด ๋‹ค์ค‘ ์—์ด์ „ํŠธ ํ™˜๊ฒฝ์—์„œ ์‹œ์Šคํ…œ์ด ํŒŒํŽธํ™”๋˜๋Š” ๋ฌธ์ œ๋ฅผ ๊ฒช๊ฒŒ ๋ฉ๋‹ˆ๋‹ค [36]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -#### [๊ด€๊ณ„ ์œ ํ˜• A: ์•„ํ‚คํ…์ฒ˜ ๋ฐ ๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] -- [[Model Context Protocol (MCP)]] - - ์—ฐ๊ฒฐ ์ด์œ : AI ์—์ด์ „ํŠธ๊ฐ€ ์™ธ๋ถ€ ๋„๊ตฌ, ์‹œ์Šคํ…œ, ๋ฐ์ดํ„ฐ ์†Œ์Šค์™€ ํ†ต์‹ ํ•˜๊ธฐ ์œ„ํ•œ ๊ฐœ๋ฐฉํ˜• ํ‘œ์ค€ ํ”„๋กœํ† ์ฝœ๋กœ, ํ•˜๋„ค์Šค์˜ ๋„๊ตฌ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ(T ์ปดํฌ๋„ŒํŠธ)๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํ•ต์‹ฌ ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค [37, 38]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํ•˜๋„ค์Šค๊ฐ€ ์—์ด์ „ํŠธ์™€ ๋„๊ตฌ๋ฅผ ๊ฒฐํ•ฉํ•  ๋•Œ, ๊ฐ ๋„๊ตฌ์˜ API ๋ช…์„ธ๋‚˜ ์ธ์ฆ์„ ํ•˜๋“œ์ฝ”๋”ฉํ•˜์ง€ ์•Š๊ณ  ์–ด๋–ป๊ฒŒ ๋ฒ”์šฉ์ ์ด๊ณ  ์•ˆ์ „ํ•˜๊ฒŒ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [39, 40]. - -- [[Agent-to-Agent (A2A)]] - - ์—ฐ๊ฒฐ ์ด์œ : ๋‹ค์ค‘ ์—์ด์ „ํŠธ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ํ™˜๊ฒฝ์—์„œ ์—์ด์ „ํŠธ ๊ฐ„์˜ ์›๊ฒฉ ํ†ต์‹ ๊ณผ ์œ„์ž„(Delegation)์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํ‘œ์ค€ ํ”„๋กœํ† ์ฝœ์ž…๋‹ˆ๋‹ค [41, 42]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์—์ด์ „ํŠธ ์‹คํ–‰ ๋ฃจํ”„(E ์ปดํฌ๋„ŒํŠธ)๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ถ„์‚ฐ๋œ ์™ธ๋ถ€ ์—์ด์ „ํŠธ๋“ค๊ณผ ์ž‘์—…, ์ƒํƒœ, ํ‰๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์œผ๋ฉฐ ํ˜‘์—…ํ•˜๋Š”์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [41, 43]. - -- [[Agent State Store]] - - ์—ฐ๊ฒฐ ์ด์œ : ๋‹จ์ผ ์„ธ์…˜์„ ๋„˜์–ด ์—์ด์ „ํŠธ์˜ ์ง„ํ–‰ ์ƒํ™ฉ, ์ฒดํฌํฌ์ธํŠธ, ๊ณผ๊ฑฐ์˜ ๊ฒฝํ—˜(๊ธฐ์–ต)์„ ์ง€์†์ ์œผ๋กœ ์ €์žฅํ•˜๋Š” ํ•˜๋„ค์Šค ์ธํ”„๋ผ(S ์ปดํฌ๋„ŒํŠธ)์ž…๋‹ˆ๋‹ค [8, 44]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ธด ์ง€ํ‰(Long-horizon)์„ ๊ฐ–๋Š” ์ž‘์—…์—์„œ ์—์ด์ „ํŠธ๊ฐ€ ์žฅ์• ๋ฅผ ๋ณต๊ตฌํ•˜๊ณ  ์˜๊ตฌ์ ์ธ ๊ธฐ์–ต ์žฅ์น˜๋ฅผ ํ†ตํ•ด ๊ฒฝํ—˜์„ ์ถ•์ ํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [45, 46]. - -#### [๊ด€๊ณ„ ์œ ํ˜• B: ์„ค๊ณ„ ์ฒ ํ•™ ๋ฐ ์šด์˜ ๋ฐฉ๋ฒ•๋ก ] -- [[Context Engineering]] - - ์—ฐ๊ฒฐ ์ด์œ : ๋ชจ๋ธ์— ๋‹จ์ˆœ ํ”„๋กฌํ”„ํŠธ๋ฅผ ๋„˜๊ธฐ๋Š” ๊ฒƒ์„ ๋„˜์–ด, ํŒŒ์ผ ์‹œ์Šคํ…œ, ๋„๊ตฌ ์ถœ๋ ฅ ๋“ฑ ๊ฑฐ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์••์ถ•ํ•˜๊ณ , ํ•„ํ„ฐ๋งํ•˜๋ฉฐ ๋ฐฐ์น˜ํ•˜์—ฌ ์—์ด์ „ํŠธ์˜ ์ฃผ์˜๋ ฅ์„ ํ†ต์ œํ•˜๋Š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค [47, 48]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํ•˜๋„ค์Šค์˜ ์ปจํ…์ŠคํŠธ ๊ด€๋ฆฌ์ž(C ์ปดํฌ๋„ŒํŠธ)๊ฐ€ ํ† ํฐ ์˜ˆ์‚ฐ๊ณผ ์ •๋ณด ์œ ์‹ค ์‚ฌ์ด์—์„œ ์–ด๋–ป๊ฒŒ ๊ท ํ˜•์„ ์žก๋Š”์ง€ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์„ ์‹ฌ๋„ ์žˆ๊ฒŒ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [27, 49]. - -- [[Plan-Execute-Verify (PEV) Loop]] - - ์—ฐ๊ฒฐ ์ด์œ : ์ž‘์—…์„ ํ•œ ๋ฒˆ์— ๋ชจ๋ธ์—๊ฒŒ ๋งก๊ธฐ์ง€ ์•Š๊ณ , ๊ณ„ํš ์ƒ์„ฑ โ†’ ๊ณ„ํš ๋‚ด์—์„œ์˜ ๋„๊ตฌ ์‹คํ–‰ โ†’ ์™ธ๋ถ€ ๊ธฐ์ค€์„ ํ†ตํ•œ ๊ฒ€์ฆ์œผ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ์‹คํŒจ๋ฅผ ๋ง‰๋Š” ํ•˜๋„ค์Šค์˜ ํ•ต์‹ฌ ์‹คํ–‰ ํŒจํ„ด์ž…๋‹ˆ๋‹ค [50, 51]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํ™•๋ฅ ์ ์ธ AI ๋ชจ๋ธ์„ ์–ด๋–ป๊ฒŒ ๊ฒฐ์ •๋ก ์ ์ด๊ณ  ์•ˆ์ •์ ์ธ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์›Œํฌํ”Œ๋กœ์šฐ๋กœ ๋ฌถ์–ด๋‚ผ ์ˆ˜ ์žˆ๋Š”์ง€ ๊ตฌ์ฒด์ ์ธ ํ†ต์ œ ๋‹จ๊ณ„๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [50, 51]. - -### Deeper Research Questions - -- ์—์ด์ „ํŠธ ํ•˜๋„ค์Šค์˜ 6๋Œ€ ๊ตฌ์„ฑ ์š”์†Œ(E, T, C, S, L, V) ๊ฐ„์˜ ๊ต์ฐจ ๊ฒฐํ•ฉ(Cross-component coupling)์ด ์‹œ์Šคํ…œ์˜ ์˜ค์ž‘๋™ ๋ฐ ๋ณด์•ˆ ์ทจ์•ฝ์„ฑ์œผ๋กœ ์ด์–ด์ง€๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ๋ฌด์—‡์ธ๊ฐ€? -- ๋Œ€๊ทœ๋ชจ ์ปจํ…์ŠคํŠธ ์ฐฝ์„ ์ง€์›ํ•˜๋Š” ์ตœ์‹  ๋ชจ๋ธ์—์„œ๋„ ์—ฌ์ „ํžˆ ํ•˜๋„ค์Šค ๊ธฐ๋ฐ˜์˜ ๋งฅ๋ฝ ์••์ถ• ๋ฐ ๊ฒ€์ƒ‰(Retrieval)์ด ํ•„์š”ํ•œ ์ด์œ ๋Š” ๋ฌด์—‡์ด๋ฉฐ, ์ตœ์ ์˜ ์ปจํ…์ŠคํŠธ ๊ต์ฒด ์ž„๊ณ„๊ฐ’์€ ์–ด๋–ป๊ฒŒ ์„ค์ •๋˜๋Š”๊ฐ€? -- ํ•˜๋„ค์Šค์˜ ๋„๊ตฌ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ๋ถ€์—ฌ๋œ ์ ‘๊ทผ ๊ถŒํ•œ์ด ๊ฐ„์ ‘ ํ”„๋กฌํ”„ํŠธ ์ธ์ ์…˜(Indirect Prompt Injection)์„ ๋งŒ๋‚˜๋ฉด ์–ด๋–ป๊ฒŒ ๊ถŒํ•œ ํƒˆ์ทจ๋กœ ์ด์–ด์ง€๋ฉฐ, ์ด๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•œ ํ•˜๋„ค์Šค ๋Ÿฐํƒ€์ž„์˜ ์ตœ์  ์ฐจ๋‹จ ๋กœ์ง์€ ๋ฌด์—‡์ธ๊ฐ€? -- ์ธ๊ฐ„์˜ ์Šน์ธ์„ ์š”๊ตฌํ•˜๋Š” ์ˆ˜๋ช…์ฃผ๊ธฐ ํ›…(Lifecycle Hooks)์ด ๋‚จ์šฉ๋  ๊ฒฝ์šฐ ๋ฐœ์ƒํ•˜๋Š” '์Šน์ธ ํ”ผ๋กœ๋„(Approval Fatigue)'๋ฅผ ํšŒํ”ผํ•˜๋ฉด์„œ๋„ ๊ฒฐ์ •๋ก ์  ์•ˆ์ „์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” ํ‰๊ฐ€ ๋ชจ๋ธ ์•„ํ‚คํ…์ฒ˜๋Š” ์–ด๋–ป๊ฒŒ ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? -- ํ‰๊ฐ€ ํŒŒ์ดํ”„๋ผ์ธ(Evaluation Harness) ์ž์ฒด๊ฐ€ ๋ชจ๋ธ์˜ ์„ฑ๋Šฅ ์ธก์ •์— ํŽธํ–ฅ์„ ์œ ๋ฐœํ•˜๋Š” 'ํ•˜๋„ค์Šค-๋ชจ๋ธ ๊ฒฐํ•ฉ(Harness-Model Coupling)' ๋ฌธ์ œ๋ฅผ ๊ณ„๋Ÿ‰ํ™”ํ•˜๊ณ  ํ†ต์ œํ•˜๊ธฐ ์œ„ํ•œ ์‹คํ—˜ ์„ค๊ณ„ ๋ฐฉ๋ฒ•๋ก ์€ ๋ฌด์—‡์ธ๊ฐ€? - -### Practical Application Contexts - -- **Implementation:** ์ฝ”๋“œ๋ฅผ ์ž์œจ์ ์œผ๋กœ ์‹คํ–‰ํ•˜๋Š” ์—์ด์ „ํŠธ๋ฅผ ๊ตฌ์ถ•ํ•  ๋•Œ, ๋„์ปค(Docker) ์ปจํ…Œ์ด๋„ˆ๋‚˜ ๋งˆ์ดํฌ๋กœ VM์„ ์ด์šฉํ•ด ์šด์˜์ฒด์ œ ๋ ˆ๋ฒจ์˜ ์ƒŒ๋“œ๋ฐ•์Šค๋ฅผ ๊ตฌ์ถ•ํ•˜๊ณ  ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ์ฐจ๋‹จํ•˜๋Š” ๋Ÿฐํƒ€์ž„ ํ•˜๋„ค์Šค๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค [16, 52]. -- **System Design:** ์†Œํ”„ํŠธ์›จ์–ด ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ, LLM์„ ๋‹จ์ˆœํžˆ API ํ˜ธ์ถœ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋„˜์–ด '์ œ์–ด ํ‰๋ฉด(Control Plane)' ์—ญํ• ์„ ํ•˜๋Š” ํ•˜๋„ค์Šค ์„œ๋ฒ„๋ฅผ ๋‘๊ณ , ๋ชจ๋ธ ์ถ”๋ก  ์˜์—ญ(Brain)๊ณผ ๋„๊ตฌ ์‹คํ–‰ ์˜์—ญ(Hands)์„ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค [53, 54]. -- **Operation / Maintenance:** ์šด์˜ ํ™˜๊ฒฝ์—์„œ๋Š” AgentOps, Langfuse, OpenLLMetry ๊ฐ™์€ ๊ด€์ธก ๊ฐ€๋Šฅ์„ฑ(Observability) ๋„๊ตฌ๋ฅผ ํ•˜๋„ค์Šค์— ์—ฐ๋™ํ•ด, ์ˆ˜๋งŽ์€ ํ„ด๊ณผ ์„ธ์…˜์— ๊ฑธ์นœ ์—์ด์ „ํŠธ์˜ ๊ฒฐ์ • ํ๋ฆ„, ์ง€์—ฐ ์‹œ๊ฐ„, ํ† ํฐ ๋น„์šฉ, ๊ทธ๋ฆฌ๊ณ  ํˆด ์‹คํŒจ์˜ ๊ทผ๋ณธ ์›์ธ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค [55, 56]. -- **Learning Path:** AI ๊ฐœ๋ฐœ์ž๋กœ์„œ ํ”„๋กฌํ”„ํŠธ์˜ ํ…์ŠคํŠธ๋ฅผ ๋‹ค๋“ฌ๋Š” ํ”„๋กฌํ”„ํŠธ ์—”์ง€๋‹ˆ์–ด๋ง์„ ์Šต๋“ํ•œ ํ›„, RAG๋ฅผ ํ†ตํ•œ ์ •๋ณด ์ฃผ์ž… ์ฒด๊ณ„์ธ ์ปจํ…์ŠคํŠธ ์—”์ง€๋‹ˆ์–ด๋ง์„ ๊ฑฐ์ณ, ๊ถ๊ทน์ ์œผ๋กœ ์—์ด์ „ํŠธ์˜ ์•ˆ์ „๋ง๊ณผ ์‹คํ–‰ ์‚ฌ์ดํด ์ „๋ฐ˜์„ ํ†ต์ œํ•˜๋Š” ํ•˜๋„ค์Šค ์—”์ง€๋‹ˆ์–ด๋ง์œผ๋กœ ํ•™์Šต ๋ฒ”์œ„๋ฅผ ํ™•์žฅํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค [7, 57]. -- **My Project Relevance:** ์ž์‹ ์˜ ์ฝ”๋“œ ์ €์žฅ์†Œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ AI ์ฝ”๋”ฉ ์–ด์‹œ์Šคํ„ดํŠธ๋ฅผ ๋„์ž…ํ•  ๋•Œ, ๋ฆฐํŠธ(Lint) ๊ทœ์น™๊ณผ ํƒ€์ž… ์ฒด์ปค, CI ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๋ฅผ ํ•˜๋„ค์Šค์˜ ํ•˜๋“œ ๊ฒŒ์ดํŠธ(Hard gate)๋กœ ์—ฐ๊ฒฐํ•˜์—ฌ, AI๊ฐ€ ์ง  ์ฝ”๋“œ๊ฐ€ ์‚ฌ๋žŒ์˜ ๋ฆฌ๋ทฐ๋กœ ๋„˜์–ด์˜ค๊ธฐ ์ „์— ์•„ํ‚คํ…์ฒ˜ ๊ธฐ์ค€์— ๋งž๊ฒŒ ์ž๊ฐ€ ์ˆ˜์ •ํ•˜๋„๋ก ์ž๋™ํ™” ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1, 58]. - -### Adjacent Topics - -- [[Agentic Software Engineering]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ํ•˜๋„ค์Šค ์ธํ”„๋ผ ์œ„์—์„œ ์—์ด์ „ํŠธ๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ธฐํš, ์ฝ”๋”ฉ, ํ…Œ์ŠคํŠธ, ๋ฆฌ๋ทฐ์˜ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ ์ „์ฒด ์ˆ˜๋ช…์ฃผ๊ธฐ(SDLC)๋ฅผ ์ž์œจ์ ์œผ๋กœ ๋˜๋Š” ์‚ฌ๋žŒ๊ณผ ํ˜‘๋ ฅํ•˜์—ฌ ์ˆ˜ํ–‰ํ•˜๋Š”์ง€ ์—ฐ๊ตฌ๋ฅผ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [59, 60]. -- [[Agent-Computer Interfaces (ACI)]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ํ•˜๋„ค์Šค๊ฐ€ ์—์ด์ „ํŠธ์—๊ฒŒ ์ œ๊ณตํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค(๋ช…๋ น์–ด, ์˜ค๋ฅ˜ ๋ฐ˜ํ™˜ ํ˜•์‹, ์ƒํƒœ ํ‘œํ˜„ ๋“ฑ)์˜ ์„ค๊ณ„๊ฐ€ ๋ชจ๋ธ์˜ ์ถ”๋ก  ๋ฐ ๊ณ„ํš ํ’ˆ์งˆ์— ๋ฏธ์น˜๋Š” ์ง์ ‘์ ์ธ ์˜ํ–ฅ์„ ์—ฐ๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [61]. - ---- -*Last updated: 2026-05-01* \ No newline at end of file diff --git a/00_Raw/useEffect.md b/00_Raw/useEffect.md deleted file mode 100644 index 62b77e7f..00000000 --- a/00_Raw/useEffect.md +++ /dev/null @@ -1,58 +0,0 @@ -# [[useEffect]] - -## ๐Ÿ“Œ Brief Summary -`useEffect`๋Š” ๋ฆฌ์•กํŠธ(React) ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ(side effects)๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ํ•ต์‹ฌ ํ›…(Hook)์ž…๋‹ˆ๋‹ค [1, 2]. ์ด ํ›…์„ ํšจ๊ณผ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์‹คํ–‰ ํƒ€์ด๋ฐ์„ ์ œ์–ดํ•˜๋Š” ์˜์กด์„ฑ ๋ฐฐ์—ด(dependency array)๊ณผ ๋ฆฌ์†Œ์Šค ํ•ด์ œ๋ฅผ ์œ„ํ•œ ํด๋ฆฐ์—…(cleanup) ํ•จ์ˆ˜๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ด€๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [2, 3]. ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ๋‚จ์šฉํ•˜๊ฑฐ๋‚˜ ๊ด€๋ฆฌ๋ฅผ ์†Œํ™€ํžˆ ํ•˜๋ฉด ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๋ฆฌ๋ Œ๋”๋ง๊ณผ ์„ฑ๋Šฅ ์ €ํ•˜, ์‹ฌ๊ฐํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3, 4]. - -## ๐Ÿ“– Core Content -- **์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ ๊ด€๋ฆฌ**: `useEffect`๋Š” ์ฃผ๋กœ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ๋ฐ์ดํ„ฐ ๊ตฌ๋…, ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๋“ฑ๋ก ๋“ฑ์˜ ์™ธ๋ถ€ ์‹œ์Šคํ…œ๊ณผ์˜ ๋™๊ธฐํ™” ๋ฐ ๋ถ€์ˆ˜ ํšจ๊ณผ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค [2]. -- **์˜์กด์„ฑ ๋ฐฐ์—ด(Dependency Array)์˜ ์ค‘์š”์„ฑ**: `useEffect`๊ฐ€ ์–ธ์ œ ์‹คํ–‰๋ ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ์˜์กด์„ฑ ๋ฐฐ์—ด์„ ์ •ํ™•ํ•˜๊ฒŒ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฐฐ์—ด์ด ์ž˜๋ชป ์ œ๊ณต๋˜๋ฉด ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๋™์ž‘, ์ปดํฌ๋„ŒํŠธ์˜ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง, ํ˜น์€ ๊ผญ ํ•„์š”ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋ˆ„๋ฝ๋˜๋Š” ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2]. ๋งŒ์•ฝ JSX ๋‚ด๋ถ€๋‚˜ ๋ Œ๋”๋ง ๋„์ค‘ ์„ ์–ธ๋œ ์ต๋ช… ํ•จ์ˆ˜๋ฅผ `useEffect`์˜ ์˜์กด์„ฑ์œผ๋กœ ์ „๋‹ฌํ•˜๋ฉด, ๋งค ๋ Œ๋”๋ง๋งˆ๋‹ค ํ•จ์ˆ˜ ์ฐธ์กฐ๊ฐ€ ์ƒˆ๋กœ ์ƒ์„ฑ๋˜์–ด `useEffect`๊ฐ€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์žฌ์‹คํ–‰๋˜๋Š” ์›์ธ์ด ๋ฉ๋‹ˆ๋‹ค [5]. -- **ํด๋ฆฐ์—…(Cleanup) ํŒจํ„ด**: ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋‚˜ ๊ตฌ๋…์ฒ˜๋Ÿผ ์ข…๋ฃŒ ์‹œ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ๋Š” `useEffect` ๋‚ด๋ถ€์—์„œ ๋ฐ˜๋“œ์‹œ ํด๋ฆฐ์—… ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [3]. ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ธ๋งˆ์šดํŠธ(unmount)๋  ๋•Œ ์ด ํด๋ฆฐ์—… ํ•จ์ˆ˜๊ฐ€ ๋ฆฌ์†Œ์Šค๋ฅผ ํ•ด์ œํ•˜์ง€ ์•Š์œผ๋ฉด, ์ฐธ์กฐ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ๊ณ„์† ๋‚จ์•„ ์ ์ง„์ ์ธ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์œ ๋ฐœํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜(Memory Leak)๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [3, 6]. -- **์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ(Server Components) ํ™˜๊ฒฝ์—์„œ์˜ ์ œํ•œ**: Next.js 13 ์ด์ƒ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ฆฌ์•กํŠธ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ(RSC)์—์„œ๋Š” ์ƒํƒœ๋‚˜ ๋ผ์ดํ”„์‚ฌ์ดํด์„ ๊ฐ€์งˆ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ `useEffect`๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค [7]. ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋Š” ํด๋ผ์ด์–ธํŠธ ์ธก ์Šคํฌ๋ฆฝํŠธ ์—†์ด ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ํŽ˜์นญ(fetching)ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ์–ด, ์ „ํ†ต์ ์ธ `useEffect` ๊ธฐ๋ฐ˜ ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ ํŒจํ„ด์„ ์ƒ๋‹น ๋ถ€๋ถ„ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค [8]. - -## โš–๏ธ Trade-offs & Caveats -- **์„ฑ๋Šฅ ์˜ค๋ฒ„ํ—ค๋“œ์™€ ๋ Œ๋”๋ง ์•…์ˆœํ™˜**: `useEffect`๋ฅผ ๋‚จ์šฉํ•˜์—ฌ ๋„ˆ๋ฌด ๋งŽ์€ ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋˜๋ฉด ์žฆ์€ ์ปดํฌ๋„ŒํŠธ ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ „๋ฐ˜์ ์ธ ์„ฑ๋Šฅ๊ณผ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์ด ํฌ๊ฒŒ ์ €ํ•˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [4]. -- **๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ์ œ์•ฝ**: ๊ฐœ๋ฐœ์ž์˜ ๋ถ€์ฃผ์˜๋กœ ์ธํ•ด ํด๋ฆฐ์—… ํ•จ์ˆ˜๊ฐ€ ๋ˆ„๋ฝ๋˜๊ฑฐ๋‚˜ ์˜์กด์„ฑ ๋ฐฐ์—ด ๊ด€๋ฆฌ๊ฐ€ ์ž˜๋ชป๋˜๋ฉด, ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ™”๋ฉด์—์„œ ์‚ฌ๋ผ์ง„ ํ›„์—๋„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์—ฐ์‚ฐ์ด ๊ณ„์† ์ง„ํ–‰๋˜๊ฑฐ๋‚˜ DOM ์ฐธ์กฐ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ๋‚จ์•„(Detached DOM nodes) ์น˜๋ช…์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ์ œ์•ฝ ์ƒํ™ฉ์„ ์ดˆ๋ž˜ํ•ฉ๋‹ˆ๋‹ค [3, 4, 6]. -- **์ฝ”๋“œ ๋ณต์žก๋„ ์ฆ๊ฐ€**: ๋ ˆ๊ฑฐ์‹œ ๋ฆฌ์•กํŠธ ์ฝ”๋“œ๋ฒ ์ด์Šค ๋ฆฌํŒฉํ† ๋ง ์‹œ, ๋ถˆํ•„์š”ํ•œ `useEffect` ์ œ๊ฑฐ๊ฐ€ ํ•ต์‹ฌ ๊ณผ์ œ๋กœ ๊ผฝํž™๋‹ˆ๋‹ค [9]. ์ƒํƒœ(state) ๋„์ถœ์ด๋‚˜ ํŒŒ์ƒ ๋ฐ์ดํ„ฐ ์ƒ์„ฑ์— `useEffect`๋ฅผ ์˜ค์šฉํ•˜๋ฉด ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ๋–จ์–ด์ง€๋ฉฐ, ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋กœ์ง์„ ๊ฑท์–ด๋‚ด๊ณ  `useMemo`๋‚˜ `useCallback` ๋“ฑ์œผ๋กœ ๊ตฌ์กฐ๋ฅผ ๋‹ค์‹œ ์„ค๊ณ„ํ•ด์•ผ ํ•˜๋Š” ๋ถ€๋‹ด์ด ์ƒ๊น๋‹ˆ๋‹ค [4, 9]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -#### [์ตœ์ ํ™” ๋ฐ ๋Œ€์•ˆ ๊ธฐ์ˆ ] -- [[useMemo]] - - ์—ฐ๊ฒฐ ์ด์œ : `useEffect`๋ฅผ ๋‚จ์šฉํ•˜์—ฌ ํŒŒ์ƒ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๋Œ€์‹ , ๊ณ„์‚ฐ ๋น„์šฉ์ด ๋†’์€ ๊ฐ’์„ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ํ•  ๋•Œ ์ ํ•ฉํ•œ ๋Œ€์•ˆ์œผ๋กœ ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค [4]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ถˆํ•„์š”ํ•œ ์—ฐ์‚ฐ๊ณผ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ฐฉ์ง€ํ•˜๊ณ  ์ƒํƒœ ํŒŒ์ƒ ์ตœ์ ํ™”๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•. - -- [[useCallback]] - - ์—ฐ๊ฒฐ ์ด์œ : `useEffect`์˜ ์˜์กด์„ฑ ๋ฐฐ์—ด์— ๋“ค์–ด๊ฐ€๋Š” ํ•จ์ˆ˜์˜ ์ฐธ์กฐ(Reference Identity)๋ฅผ ๋ Œ๋”๋ง ๊ฐ„์— ์•ˆ์ •์ ์œผ๋กœ ์œ ์ง€์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค [4, 5]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์ฐธ์กฐ ๋™๋“ฑ์„ฑ(Reference Equality)์ด ๋ฆฌ์•กํŠธ ๋ Œ๋”๋ง ์‚ฌ์ดํด ๋ฐ ์ดํŽ™ํŠธ ์‹คํ–‰ ๋นˆ๋„์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ. - -#### [์•„ํ‚คํ…์ฒ˜ ๋ฐ ๋””๋ฒ„๊น… ๋„๊ตฌ] -- [[React Server Components]] - - ์—ฐ๊ฒฐ ์ด์œ : ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ ํ™˜๊ฒฝ์—์„œ๋Š” `useEffect`์˜ ์‚ฌ์šฉ์ด ์›์ฒœ์ ์œผ๋กœ ์ฐจ๋‹จ๋˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด `useEffect`์— ์˜์กดํ•˜๋˜ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ๋ฐ์ดํ„ฐ ํŽ˜์นญ ๊ตฌ์กฐ๋ฅผ ์„œ๋ฒ„๋กœ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [7, 8]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ(Client State)์™€ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์˜ ์—ญํ•  ๋ถ„๋ฆฌ ๋ฐ ํ•˜์ด๋“œ๋ ˆ์ด์…˜(Hydration) ์ตœ์ ํ™” ๋ฐฉ์‹. - -- [[Memory Leaks]] - - ์—ฐ๊ฒฐ ์ด์œ : `useEffect`์—์„œ ํด๋ฆฐ์—…์„ ๋ˆ„๋ฝํ•˜๋Š” ๊ฒƒ์ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ™˜๊ฒฝ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜์˜ ๋Œ€ํ‘œ์ ์ธ ์›์ธ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค [3, 6]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Chrome DevTools์˜ Heap Snapshot ๋“ฑ์„ ํ™œ์šฉํ•˜์—ฌ ๋ถ„๋ฆฌ๋œ DOM ๋…ธ๋“œ ๋ฐ ์ •๋ฆฌ๋˜์ง€ ์•Š์€ ๊ตฌ๋…์„ ์ถ”์ ํ•˜๊ณ  ๋””๋ฒ„๊น…ํ•˜๋Š” ์›๋ฆฌ. - -### Deeper Research Questions -- `useEffect`์˜ ์˜์กด์„ฑ ๋ฐฐ์—ด ๋‚ด๋ถ€์—์„œ ์–•์€ ๋น„๊ต(Shallow Comparison)๊ฐ€ ๋™์ž‘ํ•˜๋Š” ๋ฐฉ์‹์€ ๊ฐ์ฒด๋‚˜ ๋ฐฐ์—ด ๊ฐ™์€ ์ฐธ์กฐ ํƒ€์ž… ๋ฐ์ดํ„ฐ์— ์–ด๋–ค ๋ถ€์ž‘์šฉ์„ ์ผ์œผํ‚ค๋Š”๊ฐ€? -- `useEffect`๋ฅผ ์ด์šฉํ•œ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ๋ฐ์ดํ„ฐ ํŽ˜์นญ์„ TanStack Query (React Query)๋‚˜ Server Components๋กœ ๋Œ€์ฒดํ–ˆ์„ ๋•Œ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์•„ํ‚คํ…์ฒ˜์  ์ด์ ๊ณผ ์„ฑ๋Šฅ ์ฐจ์ด๋Š” ๋ฌด์—‡์ธ๊ฐ€? -- ๋ถˆํ•„์š”ํ•œ `useEffect`๋ฅผ ์‹๋ณ„ํ•˜๊ณ  ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด `why-did-you-render`๋‚˜ React Profiler์™€ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•˜์—ฌ ์„ฑ๋Šฅ ์ธก์ •์˜ ์ง€ํ‘œ๋กœ ์‚ผ์„ ์ˆ˜ ์žˆ๋Š”๊ฐ€? -- ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ธ๋งˆ์šดํŠธ๋˜๋Š” ์‹œ์ ์— `useEffect`์˜ ํด๋ฆฐ์—… ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋Š” ๊ณผ์ •์€ ๋ธŒ๋ผ์šฐ์ €์˜ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜(Garbage Collection)๊ณผ ์–ด๋–ป๊ฒŒ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š”๊ฐ€? -- `useEffect` ํ›… ๋‚ด๋ถ€์˜ ๋กœ์ง์„ `useTransition`์ด๋‚˜ `useDeferredValue` ๋“ฑ ๋™์‹œ์„ฑ(Concurrent) ๊ธฐ๋Šฅ๊ณผ ๊ฒฐํ•ฉํ•  ๋•Œ ๊ณ ๋ คํ•ด์•ผ ํ•  ๋™๊ธฐํ™” ๋ฌธ์ œ๋Š” ๋ฌด์—‡์ธ๊ฐ€? - -### Practical Application Contexts -- **Implementation:** ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ(์˜ˆ: ์Šคํฌ๋กค, ๋ฆฌ์‚ฌ์ด์ฆˆ)๋ฅผ ๋ถ™์ด๊ฑฐ๋‚˜ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งˆ์šดํŠธํ•  ๋•Œ ํ™œ์šฉํ•˜๋ฉฐ, ๋ฐ˜ํ™˜ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋ช…์‹œ์ ์ธ ํด๋ฆฐ์—…(removeEventListener ๋“ฑ)์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [2, 3]. -- **System Design:** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ Œ๋”๋ง ์„ฑ๋Šฅ์„ ์„ค๊ณ„ํ•  ๋•Œ, ์ž์ฃผ ๋ณ€๊ฒฝ๋˜๋Š” ์ƒํƒœ์˜ ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ๋Š” ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ์˜ ์ตœํ•˜๋‹จ์œผ๋กœ ๊ฒฉ๋ฆฌํ•˜๊ฑฐ๋‚˜ Context API ๋Œ€์‹  Zustand์™€ ๊ฐ™์€ ์ƒํƒœ ๊ด€๋ฆฌ์ž๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฆฌ๋ Œ๋”๋ง ๋ฒ”์œ„๋ฅผ ์ œํ•œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [10, 11]. -- **Operation / Maintenance:** ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ์•ฑ์ด ๋А๋ ค์ง€๊ฑฐ๋‚˜ ๋ฉˆ์ถ”๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ, Chrome DevTools์˜ Memory ํƒญ์„ ํ†ตํ•ด `useEffect`์˜ ๊ตฌ๋… ํ•ด์ œ ๋ˆ„๋ฝ ์—ฌ๋ถ€๋ฅผ ํ”„๋กœํŒŒ์ผ๋งํ•˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋””๋ฒ„๊น…ํ•ฉ๋‹ˆ๋‹ค [6, 12]. -- **Learning Path:** ๋ฆฌ์•กํŠธ๋ฅผ ์ฒ˜์Œ ๋ฐฐ์šฐ๋Š” ๋‹จ๊ณ„์—์„œ ํ›…์˜ ๊ทœ์น™(Rules of Hooks)์„ ์ดํ•ดํ•˜๊ณ , ์ƒ๋ช…์ฃผ๊ธฐ(Lifecycle) ๋ฉ”์„œ๋“œ๊ฐ€ ํ•จ์ˆ˜ํ˜•์˜ `useEffect`๋กœ ์–ด๋–ป๊ฒŒ ๋Œ€์ฒด๋˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์˜์กด์„ฑ ๋ฐฐ์—ด ๊ด€๋ฆฌ๊ฐ€ ์™œ ์ค‘์š”ํ•œ์ง€๋ฅผ ํŒŒ์•…ํ•˜๋Š” ํ•ต์‹ฌ ํ•™์Šต ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค [2, 13]. -- **My Project Relevance:** ๋ ˆ๊ฑฐ์‹œ ๋ฆฌ์•กํŠธ ํ”„๋กœ์ ํŠธ๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•˜๊ฑฐ๋‚˜ ํด๋ž˜์Šค ๊ธฐ๋ฐ˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ๋•Œ, ๋ถˆํ•„์š”ํ•œ `useEffect` ์ฒด์ธ์„ ์ œ๊ฑฐํ•˜๊ณ  ์˜์กด์„ฑ ๋ฐฐ์—ด์„ ๊ต์ •ํ•˜์—ฌ ์ฝ”๋“œ ์Šค๋ฉœ(Code Smell)์„ ์—†์• ๊ณ  ํ™•์žฅ์„ฑ์„ ๋†’์ด๋Š” ์‹ค๋ฌด ๊ณผ์ œ์™€ ์ง๊ฒฐ๋ฉ๋‹ˆ๋‹ค [9]. - -### Adjacent Topics -- [[Rules of Hooks]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: `useEffect`๋ฅผ ํฌํ•จํ•œ ๋ชจ๋“  ๋ฆฌ์•กํŠธ ํ›…์ด ๋ฐ˜๋ณต๋ฌธ, ์กฐ๊ฑด๋ฌธ ๋‚ด๋ถ€๊ฐ€ ์•„๋‹Œ ์ปดํฌ๋„ŒํŠธ์˜ ์ตœ์ƒ์œ„์—์„œ๋งŒ ์ผ๊ด€๋˜๊ฒŒ ํ˜ธ์ถœ๋˜์–ด์•ผ ํ•˜๋Š” ๊ตฌ์กฐ์  ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ค๋‹ˆ๋‹ค [13]. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/๋Œ€๊ทœ๋ชจ React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์•„ํ‚คํ…์ฒ˜ ๊ตฌ์„ฑ.md b/00_Raw/๋Œ€๊ทœ๋ชจ React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์•„ํ‚คํ…์ฒ˜ ๊ตฌ์„ฑ.md deleted file mode 100644 index ac95b55f..00000000 --- a/00_Raw/๋Œ€๊ทœ๋ชจ React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์•„ํ‚คํ…์ฒ˜ ๊ตฌ์„ฑ.md +++ /dev/null @@ -1,79 +0,0 @@ -# [[๋Œ€๊ทœ๋ชจ React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์•„ํ‚คํ…์ฒ˜ ๊ตฌ์„ฑ]] - -## ๐Ÿ“Œ Brief ์†Œ์Šค Summary -๋Œ€๊ทœ๋ชจ React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์•„ํ‚คํ…์ฒ˜ ๊ตฌ์„ฑ์€ ์ฝ”๋“œ, ์ƒํƒœ ๊ด€๋ฆฌ, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด UI ์ปดํฌ๋„ŒํŠธ๋กœ ์œ ์ถœ๋˜๋Š” ๊ฒƒ์„ ๋ง‰๊ณ  ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ์„ฑ์žฅ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ์—„๊ฒฉํ•œ ์„ค๊ณ„ ๋ฐฉ๋ฒ•๋ก ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค [1, 2]. ํ”„๋กœ์ ํŠธ๊ฐ€ ์ปค์ง์— ๋”ฐ๋ผ ๋‹จ์ˆœํžˆ ํŒŒ์ผ ์œ ํ˜•๋ณ„(์ปดํฌ๋„ŒํŠธ, ํ›… ๋“ฑ)๋กœ ํด๋”๋ฅผ ๋‚˜๋ˆ„๋Š” ๋ฐฉ์‹ ๋Œ€์‹ , ๊ธฐ๋Šฅ(Feature)์ด๋‚˜ ๋„๋ฉ”์ธ ์ค‘์‹ฌ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์กฐ์งํ•˜๋Š” ๋ฐฉ์‹์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค [3, 4]. ์„ฑ๊ณต์ ์ธ ์•„ํ‚คํ…์ฒ˜๋Š” ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ๊ทœ์น™์„ ๊ฐ•์ œํ•˜๋Š” Feature-Sliced Design(FSD)๊ณผ ๊ฐ™์€ ํŒจํ„ด์„ ์ฑ„ํƒํ•˜๊ณ , SOLID ์›์น™์— ์ž…๊ฐํ•œ ํด๋ฆฐ ์ฝ”๋“œ ์ž‘์„ฑ, ๊ทธ๋ฆฌ๊ณ  ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ ์ „๋žต์„ ๊ฒฐํ•ฉํ•˜์—ฌ ๊ฐœ๋ฐœํŒ€์˜ ํ˜‘์—… ํšจ์œจ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•ฉ๋‹ˆ๋‹ค [5-7]. - -## ๐Ÿ“– Core Content - -* **๊ธฐ๋Šฅ(Feature) ๊ธฐ๋ฐ˜ ๋ชจ๋“ˆํ™” ๋ฐ Feature-Sliced Design (FSD):** - * ๊ณผ๊ฑฐ์˜ React ์•ฑ์€ ์ปดํฌ๋„ŒํŠธ, ํ›…, ์Šคํƒ€์ผ ๋“ฑ ๊ธฐ์ˆ ์  ์—ญํ• ์— ๋”ฐ๋ผ ํด๋”๋ฅผ ๋ถ„๋ฆฌ(Type-Based)ํ–ˆ์ง€๋งŒ, ์ด๋Š” ์•ฑ์ด ํ™•์žฅ๋ ์ˆ˜๋ก ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ํŒŒํŽธํ™”๋˜๋Š” ๋ฌธ์ œ๋ฅผ ๋‚ณ์•˜์Šต๋‹ˆ๋‹ค [3, 8]. ๋Œ€๊ทœ๋ชจ ์•ฑ์—์„œ๋Š” ๋„๋ฉ”์ธ ๊ธฐ๋Šฅ๋ณ„๋กœ ์ฝ”๋“œ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ํŠน์ง• ๊ธฐ๋ฐ˜(Feature-based) ํด๋” ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [4, 9]. - * ์ด๋ฅผ ์ฒด๊ณ„ํ™”ํ•œ ๋ฐฉ๋ฒ•๋ก ์ด Feature-Sliced Design(FSD)์ž…๋‹ˆ๋‹ค [10]. FSD๋Š” ์ฝ”๋“œ์˜ ์Šค์ฝ”ํ”„์™€ ์ฑ…์ž„์— ๋”ฐ๋ผ `app`, `pages`, `widgets`, `features`, `entities`, `shared`๋ผ๋Š” ๊ณ ์ •๋œ ๋ ˆ์ด์–ด๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค [5]. - * ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ทœ์น™์€ ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ(Unidirectional dependencies)์œผ๋กœ, ์ƒ์œ„ ๋ ˆ์ด์–ด๋Š” ํ•˜์œ„ ๋ ˆ์ด์–ด๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ฐ˜๋Œ€๋Š” ๋ถˆ๊ฐ€๋Šฅํ•˜์—ฌ ์ˆœํ™˜ ์ฐธ์กฐ๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค [5, 11]. ๋˜ํ•œ ๊ฐ ์Šฌ๋ผ์ด์Šค๋Š” `index.ts`๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์™ธ๋ถ€๋กœ ๋…ธ์ถœ๋˜๋Š” Public API ๊ทœ์น™์„ ๋”ฐ๋ผ์•ผ ์บก์Аํ™”๊ฐ€ ๋ณด์žฅ๋ฉ๋‹ˆ๋‹ค [7, 12]. -* **์ปดํฌ๋„ŒํŠธ ์„ค๊ณ„์™€ ํด๋ฆฐ ์ฝ”๋“œ ์›์น™:** - * React์˜ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—๋„ SOLID ์›์น™์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)์— ๋”ฐ๋ผ ํ•˜๋‚˜์˜ ์ปดํฌ๋„ŒํŠธ๋Š” ํ•œ ๊ฐ€์ง€ ์ผ๋งŒ ํ•ด์•ผ ํ•˜๋ฉฐ, 300์ค„์ด ๋„˜์–ด๊ฐ€๋Š” ์ปดํฌ๋„ŒํŠธ๋Š” ๋” ์ž‘์€ ๋‹จ์œ„๋กœ ๋ถ„๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [13, 14]. - * KISS ์›์น™์— ๋”ฐ๋ผ ๋ณต์žก์„ฑ๋ณด๋‹ค ๋‹จ์ˆœํ•จ์„ ์ถ”๊ตฌํ•˜๋˜, DRY ์›์น™์„ ์ง€ํ‚ค๊ธฐ ์œ„ํ•ด ์ค‘๋ณต๋˜๋Š” ๋กœ์ง์€ ์ปค์Šคํ…€ ํ›…์œผ๋กœ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค [15, 16]. ๋‹จ, ๋„ˆ๋ฌด ์ด๋ฅธ ์ถ”์ƒํ™”๋Š” ์ฝ”๋“œ๋ฅผ ๋” ์ฝ๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํŒจํ„ด์ด 3๋ฒˆ ์ด์ƒ ๋ฐ˜๋ณต๋  ๋•Œ ์ถ”์ƒํ™”ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค [15]. -* **ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ ๊ด€๋ฆฌ ์ „๋žต:** - * ์ƒํƒœ๋Š” ๋กœ์ปฌ UI ์ƒํƒœ, ์ „์—ญ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒํƒœ, ์„œ๋ฒ„ ์บ์‹œ ์ƒํƒœ, URL ์ƒํƒœ๋กœ ์—„๊ฒฉํžˆ ํŒŒํŽธํ™”ํ•˜์—ฌ ๊ด€๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [17, 18]. ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ Redux์™€ ๊ฐ™์€ ๋‹จ์ผ ์Šคํ† ์–ด์— ๋„ฃ๋Š” ๊ณผ๊ฑฐ ๋ฐฉ์‹์—์„œ ๋ฒ—์–ด๋‚˜, ์„œ๋ฒ„ ๋ฐ์ดํ„ฐ๋Š” TanStack Query๋ฅผ ํ†ตํ•ด ์บ์‹ฑํ•˜๊ณ  UI ์ƒํƒœ๋Š” Zustand ๋“ฑ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค [17, 18]. - * React์˜ ๋‚ด์žฅ Context API๋Š” ๊ฐ’์ด ๋ฐ”๋€” ๋•Œ๋งˆ๋‹ค ํ•ด๋‹น ์ปจํ…์ŠคํŠธ๋ฅผ ๊ตฌ๋…ํ•˜๋Š” ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง๋˜๋Š” ๋ฌธ์ œ(Re-render storm)๊ฐ€ ์žˆ์–ด ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ณ€ํ•˜๋Š” ์ƒํƒœ์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค [19, 20]. - * ๋Œ€๊ทœ๋ชจ ํŒ€(10๋ช… ์ด์ƒ)์ด๋‚˜ ๋ณต์žกํ•œ ๋น„๋™๊ธฐ ์ž‘์—…์ด ๋งŽ์€ ํ™˜๊ฒฝ์—์„œ๋Š” ์ผ๊ด€๋œ ํŒจํ„ด์„ ๊ฐ•์ œํ•˜๋Š” Redux(RTK)๊ฐ€ ์—ฌ์ „ํžˆ ๊ฐ•๋ ฅํ•˜๋ฉฐ, ์ค‘์†Œ๊ทœ๋ชจ ํŒ€์—์„œ๋Š” ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ๊ฐ€ ์ ๊ณ  ์…€๋ ‰ํ„ฐ(Selector)๋ฅผ ํ†ตํ•ด ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง์„ ๋ง‰์•„์ฃผ๋Š” Zustand๊ฐ€ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค [6, 21, 22]. -* **์ผ๊ด€๋œ ๋ช…๋ช… ๊ทœ์น™(Naming Conventions):** - * ์šด์˜์ฒด์ œ(Windows, macOS, Linux) ๊ฐ„ ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„ ์ฐจ์ด๋กœ ์ธํ•œ CI/CD ๋นŒ๋“œ ์‹คํŒจ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ํŒŒ์ผ ๋ฐ ํด๋” ์ด๋ฆ„์€ ์ฃผ๋กœ `kebab-case`๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค [23-25]. - * React ์ปดํฌ๋„ŒํŠธ๋Š” `PascalCase`๋กœ ์ž‘์„ฑํ•˜๋ฉฐ, ๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜, ์ปค์Šคํ…€ ํ›…์€ `camelCase`๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค [26, 27]. -* **์„ฑ๋Šฅ ์ตœ์ ํ™”์™€ ์•ˆ์ •์„ฑ:** - * ๋Œ€๊ทœ๋ชจ ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด Vite์˜ `manualChunks`๋ฅผ ์ด์šฉํ•œ ๋ฒค๋” ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…๊ณผ, `React.lazy` ๋ฐ Suspense๋ฅผ ํ™œ์šฉํ•œ ๋ผ์šฐํŠธ ๊ธฐ๋ฐ˜ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค [28-32]. - * ์ „์ฒด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ถฉ๋Œํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด Error Boundary๋ฅผ ์œ„์ ฏ์ด๋‚˜ ๊ธฐ๋Šฅ ๋‹จ์œ„๋กœ ์„ ๋ณ„์ ์œผ๋กœ ๋ฐฐ์น˜ํ•˜์—ฌ ์•ˆ์ „ํ•œ Fallback UI๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [33, 34]. - -## โš–๏ธ Trade-offs & Caveats -* **FSD ๋“ฑ ์—„๊ฒฉํ•œ ์•„ํ‚คํ…์ฒ˜ ๋„์ž…์˜ ์˜ค๋ฒ„ํ—ค๋“œ:** Feature-Sliced Design์€ ๊ตฌ์กฐ์  ์•ˆ์ •์„ฑ์„ ์ฃผ์ง€๋งŒ ์ง„์ž… ์žฅ๋ฒฝ์ด ๋†’์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” ํŠน์ • ๋ชจ๋“ˆ์ด 'feature'์— ์†ํ•˜๋Š”์ง€ 'widget'์— ์†ํ•˜๋Š”์ง€ ๋ถ„๋ฅ˜ํ•˜๋Š” ์˜๋ฏธ๋ก ์  ๊ณ ๋ฏผ์— ๋งŽ์€ ์‹œ๊ฐ„์„ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [35]. ๋ฌด์ž‘์ • ์ดˆ๊ธฐ๋ถ€ํ„ฐ ์ชผ๊ฐœ๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด 3๊ฐœ๋ฉด ์ถฉ๋ถ„ํ–ˆ์„ ์Šฌ๋ผ์ด์Šค๊ฐ€ ์ˆ˜๋ฐฑ ๊ฐœ๋กœ ๋ถˆ์–ด๋‚˜๋Š” ๊ณผ์ž‰ ์—”์ง€๋‹ˆ์–ด๋ง์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [36]. -* **Barrel Files(`index.ts`)์˜ ํ•œ๊ณ„:** FSD์—์„œ ์บก์Аํ™”๋ฅผ ์œ„ํ•ด ๊ถŒ์žฅํ•˜๋Š” Barrel ํŒŒ์ผ ํŒจํ„ด์€ ๋‚ด๋ถ€ ๋ฆฌํŒฉํ† ๋ง์„ ์‰ฝ๊ฒŒ ๋งŒ๋“ค์ง€๋งŒ, ๋ฒˆ๋“ค๋ง ๊ณผ์ •์—์„œ ํŠธ๋ฆฌ ์‰์ดํ‚น(Tree-shaking) ์„ฑ๋Šฅ์„ ๋–จ์–ด๋œจ๋ฆฌ๊ฑฐ๋‚˜ ์ˆœํ™˜ ์ฐธ์กฐ ๋””๋ฒ„๊น…์„ ์–ด๋ ต๊ฒŒ ๋งŒ๋“œ๋Š” ๋‹จ์ ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค [35]. -* **์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ์˜ ๋”œ๋ ˆ๋งˆ:** Context API๋Š” ์„œ๋“œํŒŒํ‹ฐ ์ข…์†์„ฑ์ด ์—†๋Š”('Zero cost') ์žฅ์ ์ด ์žˆ์ง€๋งŒ ์„ฑ๋Šฅ ์ €ํ•˜์˜ ์ฃผ๋ฒ”์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [19, 37]. ๋ฐ˜๋ฉด Zustand๋Š” ์œ ์—ฐํ•˜๊ณ  ๊ฐ€๋ฒผ์šฐ๋‚˜ ๋ช…ํ™•ํ•œ ์ปจ๋ฒค์…˜์„ ๊ฐ•์ œํ•˜์ง€ ์•Š์•„ ๋Œ€๊ทœ๋ชจ ํŒ€์—์„œ๋Š” ์ฝ”๋“œ๊ฐ€ ์ค‘๊ตฌ๋‚œ๋ฐฉ(Store soup)์ด ๋  ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค [21, 38]. Redux๋Š” ๋””๋ฒ„๊น…(Time-travel)๊ณผ ํŒ€ ์ปจ๋ฒค์…˜ ํ†ต์ผ์— ํƒ์›”ํ•˜์ง€๋งŒ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ๋กœ ์ธํ•œ ๊ฐœ๋ฐœ ์†๋„ ์ €ํ•˜๋ฅผ ๊ฐ์ˆ˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [6, 39, 40]. -* **๋ฉ”๋ชจ์ด์ œ์ด์…˜์˜ ๋น„์šฉ:** `React.memo`, `useCallback`, `useMemo`๋ฅผ ์‚ฌ์šฉํ•œ ๋ Œ๋”๋ง ์ตœ์ ํ™”๋Š” ๊ณต์งœ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ด์ „ props์™€ ์ƒˆ๋กœ์šด props๋ฅผ ๋น„๊ตํ•˜๋Š” ๊ณผ์ • ์ž์ฒด์— ๋น„์šฉ์ด ๋“ค๋ฉฐ, ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง ์†๋„๋ณด๋‹ค ๋น„๊ต ์—ฐ์‚ฐ์ด ๋” ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๊ฑฐ๋‚˜ ์–•์€ ๋น„๊ต(Shallow comparison)์˜ ํ•œ๊ณ„๋กœ ์ธํ•ด ์˜คํžˆ๋ ค ์„ฑ๋Šฅ์ด ์•…ํ™”๋˜๋Š” ๋ถ€์ž‘์šฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [41-43]. React Compiler๊ฐ€ ์ด ๊ณผ์ •์„ ์ž๋™ํ™”ํ•ด ์ฃผ์ง€๋งŒ, ๋ธ”๋ž™๋ฐ•์Šค๋กœ ๋™์ž‘ํ•˜์—ฌ ์„ฑ๋Šฅ ๋””๋ฒ„๊น…์ด ๋” ์–ด๋ ค์›Œ์ง€๋ฉฐ ์ผ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(๋ถˆ์•ˆ์ •ํ•œ ์ฐธ์กฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ›… ๋“ฑ)์™€์˜ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๊ฐ€ ์ƒ๊น๋‹ˆ๋‹ค [44, 45]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -#### [์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] -- [[Feature-Sliced Design]] - - ์—ฐ๊ฒฐ ์ด์œ : ๋Œ€๊ทœ๋ชจ React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ณต์žก์„ฑ์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ํ˜„๋Œ€์ ์ธ ํ”„๋ก ํŠธ์—”๋“œ ์•„ํ‚คํ…์ฒ˜ ๋ฐฉ๋ฒ•๋ก ์ž…๋‹ˆ๋‹ค [10, 46]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ชจ๋“ˆ์˜ ์Šค์ฝ”ํ”„๋ฅผ ๋‚˜๋ˆ„๋Š” ๋ฐฉ๋ฒ•, ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ๊ทœ์น™, ๊ทธ๋ฆฌ๊ณ  ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ ๋‹จ์œ„๋กœ ์บก์Аํ™”ํ•˜๋Š” ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5, 11]. -- [[SOLID ์›์น™]] - - ์—ฐ๊ฒฐ ์ด์œ : OOP์˜ ์›์น™์ด์ง€๋งŒ React ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๋งž๊ฒŒ ๋ณ€ํ˜• ์ ์šฉ๋˜์–ด ์ปดํฌ๋„ŒํŠธ์˜ ์ฑ…์ž„๊ณผ ๋ถ„๋ฆฌ ๊ธฐ์ค€์„ ์ œ์‹œํ•ฉ๋‹ˆ๋‹ค [7, 47]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ฑฐ๋Œ€ํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ชผ๊ฐœ๋Š” ๊ธฐ์ค€(SRP)๊ณผ ๋ถˆํ•„์š”ํ•œ prop ์ „๋‹ฌ์„ ํ”ผํ•˜๋Š” ๋ฐฉ๋ฒ•(ISP) ๋“ฑ์„ ํ•™์Šตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [13, 48]. - -#### [๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ] -- [[Zustand]] - - ์—ฐ๊ฒฐ ์ด์œ : Context API์˜ ๋ฆฌ๋ Œ๋”๋ง ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ฉด์„œ๋„ Redux๋ณด๋‹ค ๋‚ฎ์€ ๋„์ž… ๋น„์šฉ์œผ๋กœ ์ „์—ญ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค [39, 49]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Selector ํŒจํ„ด์„ ํ†ตํ•ด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ตฌ๋…ํ•˜๋Š” ์ƒํƒœ ์Šฌ๋ผ์ด์Šค๋งŒ ๋ณ€๊ฒฝ๋  ๋•Œ ๋ Œ๋”๋ง์„ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š” ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [18, 22]. -- [[TanStack Query]] - - ์—ฐ๊ฒฐ ์ด์œ : UI ์•ฑ ์ƒํƒœ์™€ ์„œ๋ฒ„ ๋ฐ์ดํ„ฐ ์ƒํƒœ๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ๋ชจ๋˜ ํ”„๋ก ํŠธ์—”๋“œ ์•„ํ‚คํ…์ฒ˜์˜ ํ•ต์‹ฌ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค [18, 50]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ฐ์ดํ„ฐ ์บ์‹ฑ, ์ค‘๋ณต ์š”์ฒญ ์ œ๊ฑฐ, ๋ฌดํ•œ ์Šคํฌ๋กค ๋ฐ ๋‚™๊ด€์  ์—…๋ฐ์ดํŠธ ๋“ฑ ๋น„๋™๊ธฐ ์„œ๋ฒ„ ์ƒํƒœ๋ฅผ ๋ณ„๋„๋กœ ๊ด€๋ฆฌํ•˜๋Š” ์ „๋žต์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [18, 50]. -- [[Code Splitting]] - - ์—ฐ๊ฒฐ ์ด์œ : ๊ฑฐ๋Œ€ํ•œ JavaScript ๋ฒˆ๋“ค๋กœ ์ธํ•ด ์ดˆ๊ธฐ ๋กœ๋”ฉ ์†๋„๊ฐ€ ๋А๋ ค์ง€๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ํ•ต์‹ฌ ์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค [29, 51]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: `React.lazy`์™€ Suspense๋ฅผ ํ†ตํ•œ ๋ผ์šฐํŠธ๋ณ„ ๋กœ๋”ฉ ์ฒ˜๋ฆฌ ๋ฐ Vite์˜ `manualChunks`๋ฅผ ํ™œ์šฉํ•œ ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์บ์‹ฑ ์ „๋žต์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [30-32]. - -### Deeper Research Questions - -- Feature-Sliced Design(FSD)์—์„œ Feature์™€ Widget์˜ ๊ฒฝ๊ณ„๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ช…ํ™•ํ•œ ๊ธฐ์ค€์€ ๋ฌด์—‡์ด๋ฉฐ, ์ธ์ฆ(Auth)๊ณผ ๊ฐ™์ด ์—ฌ๋Ÿฌ ๋„๋ฉ”์ธ์— ๊ฑธ์นœ ๊ต์ฐจ ์ ˆ๋‹จ ๊ด€์‹ฌ์‚ฌ(Cross-cutting concerns)๋Š” ์–ด๋А ๋ ˆ์ด์–ด์— ๋ฐฐ์น˜ํ•ด์•ผ ํ•˜๋Š”๊ฐ€? -- React์˜ ๋‚ด์žฅ Context API๊ฐ€ ์•ผ๊ธฐํ•˜๋Š” ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง ๋ฌธ์ œ๋ฅผ Zustand์˜ ์…€๋ ‰ํ„ฐ(Selector) ํŒจํ„ด์€ ๋‚ด๋ถ€์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ๊ฐ์ง€ํ•˜๊ณ  ํ•ด๊ฒฐํ•˜๋Š”๊ฐ€? -- React Compiler๊ฐ€ ๋„์ž…๋จ์— ๋”ฐ๋ผ ๊ธฐ์กด์˜ ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜(`useMemo`, `useCallback`, `React.memo`)์— ์˜์กดํ•˜๋˜ ์„ฑ๋Šฅ ์ตœ์ ํ™” ํŒจ๋Ÿฌ๋‹ค์ž„์€ ์–ด๋–ป๊ฒŒ ๋ณ€ํ™”ํ•˜๋ฉฐ, ๋ ˆ๊ฑฐ์‹œ ํ”„๋กœ์ ํŠธ ๋ฆฌํŒฉํ† ๋ง ์‹œ ์–ด๋–ค ์ œ์•ฝ ์‚ฌํ•ญ์ด ์žˆ๋Š”๊ฐ€? -- 10๋ช… ์ด์ƒ์˜ ๋Œ€๊ทœ๋ชจ ๊ฐœ๋ฐœํŒ€์—์„œ ์ƒํƒœ ๊ด€๋ฆฌ ์•„ํ‚คํ…์ฒ˜(Zustand vs Redux)๋ฅผ ์„ ํƒํ•  ๋•Œ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ณต์žก๋„์™€ ๋””๋ฒ„๊น… ์š”๊ตฌ์‚ฌํ•ญ์€ ์–ด๋– ํ•œ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”๊ฐ€? -- Vite ๊ธฐ๋ฐ˜์˜ ๋ฒˆ๋“ค๋ง ํ™˜๊ฒฝ์—์„œ `manualChunks`๋ฅผ ํ™œ์šฉํ•œ ์ฝ”๋“œ ๋ถ„ํ•  ์‹œ, ์ดˆ๊ธฐ ๋ Œ๋”๋ง ์„ฑ๋Šฅ(Core Web Vitals)์— ๋ฏธ์น˜๋Š” ๊ตฌ์ฒด์ ์ธ ์˜ํ–ฅ๊ณผ ์บ์‹ฑ ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? - -### Practical Application Contexts - -- **Implementation:** ๊ฑฐ๋Œ€ํ•œ `components/` ํด๋” ๋Œ€์‹  `features/auth/`, `features/checkout/`๊ณผ ๊ฐ™์ด ํด๋”๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ , ํ•ด๋‹น ๊ธฐ๋Šฅ์— ํ•„์š”ํ•œ UI ์ปดํฌ๋„ŒํŠธ, API ํ˜ธ์ถœ ํ›…, ํƒ€์ž…์„ ํด๋” ๋‚ด๋ถ€์— ์บก์Аํ™”ํ•˜์—ฌ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. -- **System Design:** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ณ„์ธต์„ `app`, `pages`, `features`, `entities`, `shared`๋กœ ๋‚˜๋ˆ„๊ณ , ์ƒ์œ„ ๊ณ„์ธต๋งŒ ํ•˜์œ„ ๊ณ„์ธต์„ import ํ•  ์ˆ˜ ์žˆ๋„๋ก ESLint ๊ทœ์น™์„ ์„ค์ •ํ•˜์—ฌ ์ˆœํ™˜ ์ฐธ์กฐ๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ์‹œ์Šคํ…œ์„ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค. -- **Operation / Maintenance:** ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋Š” Error Boundary๋ฅผ ํผ์ด๋‚˜ ์„œ๋“œํŒŒํ‹ฐ ์œ„์ ฏ ๋“ฑ์— ์”Œ์›Œ ํŠน์ • ๊ธฐ๋Šฅ์ด ๋‹ค์šด๋˜์–ด๋„ ์ „์ฒด ํ™”๋ฉด์ด ๋ฐฑํ™”๋˜๋Š” ๊ฒƒ์„ ๋ง‰๊ณ , Sentry๋‚˜ LogRocket๊ณผ ์—ฐ๋™ํ•˜์—ฌ ์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด ๋ฐ ์—๋Ÿฌ ๋กœ๊ทธ๋ฅผ ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค. -- **Learning Path:** ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ React Context API๋กœ ์‹œ์ž‘ํ•˜์—ฌ ํ•œ๊ณ„(๋ฆฌ๋ Œ๋”๋ง ํญํƒ„)๋ฅผ ๊ฒฝํ—˜ํ•œ ํ›„, Zustand๋ฅผ ํ•™์Šตํ•˜๊ณ , ๊ถ๊ทน์ ์œผ๋กœ ๋ณต์žกํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ์š”๊ฑด์„ ๋‹ค๋ฃฐ ๋•Œ Redux์™€ ๊ตฌ์กฐ์  ํŒจํ„ด, ๊ทธ๋ฆฌ๊ณ  FSD๋ฅผ ๋„์ž…ํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์•„ํ‚คํ…์ฒ˜ ํ•™์Šต์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค. -- **My Project Relevance:** ์ฝ”๋“œ๋ฒ ์ด์Šค๊ฐ€ ๊ฑฐ๋Œ€ํ•ด์ ธ ์ปดํฌ๋„ŒํŠธ์™€ ํ›…์„ ์ฐพ๊ธฐ ์–ด๋ ค์›Œ์กŒ์„ ๋•Œ, ๊ธฐ์กด์˜ ๊ธฐ์ˆ  ์Šคํƒ ์ค‘์‹ฌ ํด๋”๋ฅผ ๊ธฐ๋Šฅ(Feature) ๋„๋ฉ”์ธ ๊ตฌ์กฐ๋กœ ๋ฆฌํŒฉํ† ๋งํ•˜๊ณ  `index.ts`๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ชจ๋“ˆ ๊ฐ„ ๊ฐ•๊ฒฐํ•ฉ์„ ๋Š์–ด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - -### Adjacent Topics - -- [[Micro-Frontends]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋‹จ์ผ ํŽ˜์ด์ง€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(SPA)์˜ ๊ทœ๋ชจ๊ฐ€ ์ง€๋‚˜์น˜๊ฒŒ ์ปค์กŒ์„ ๋•Œ, ๋„๋ฉ”์ธ๋ณ„๋กœ ์™„์ „ํžˆ ๋…๋ฆฝ๋œ ํŒ€ ๋‹จ์œ„ ์ €์žฅ์†Œ์™€ ๋ฐฐํฌ ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌ์ถ•ํ•˜๋Š” ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ๊ธ‰ ํ™•์žฅ ์•„ํ‚คํ…์ฒ˜๋กœ ์—ฐ๊ตฌ๋ฅผ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -- [[React Compiler]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ๊ตฌ์กฐ์  ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋„˜์–ด, ๊ฐœ๋ฐœ์ž๊ฐ€ ์ˆ˜๋™์œผ๋กœ ์ ์šฉํ•˜๋˜ ๋ Œ๋”๋ง ์ตœ์ ํ™” ๋กœ์ง์„ ๋นŒ๋“œ ํƒ€์ž„์— ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ž๋™ ์บ์‹ฑ(Memoization)ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๋™์ž‘ ์›๋ฆฌ์™€ ํ•œ๊ณ„์ ์„ ํƒ๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/๋Œ€๊ทœ๋ชจ ํ”„๋ก ํŠธ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜.md b/00_Raw/๋Œ€๊ทœ๋ชจ ํ”„๋ก ํŠธ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜.md deleted file mode 100644 index b3e02b9e..00000000 --- a/00_Raw/๋Œ€๊ทœ๋ชจ ํ”„๋ก ํŠธ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜.md +++ /dev/null @@ -1,64 +0,0 @@ -# [[๋Œ€๊ทœ๋ชจ ํ”„๋ก ํŠธ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜]] - -## ๐Ÿ“Œ Brief Summary -๋Œ€๊ทœ๋ชจ ํ”„๋ก ํŠธ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋‹จ์ˆœํ•œ ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰์„ ๋„˜์–ด ํ™•์žฅ์„ฑ, ์œ ์ง€๋ณด์ˆ˜์„ฑ, ๊ณ ์„ฑ๋Šฅ์„ ์š”๊ตฌํ•˜๋Š” ๊ณ ๋„๋กœ ์ •๊ตํ•œ ๋ถ„์‚ฐ ์†Œํ”„ํŠธ์›จ์–ด ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค. ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ UI์˜ ๋ถ„๋ฆฌ, ๋ช…ํ™•ํ•œ ์ƒํƒœ ์†Œ์œ ๊ถŒ, ์—„๊ฒฉํ•œ ํด๋” ๊ตฌ์กฐ(Feature-Sliced Design ๋“ฑ)๋ฅผ ํ†ตํ•ด ์•„ํ‚คํ…์ฒ˜์˜ ๋ถ•๊ดด๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…, ์ž๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜, ์„ธ๋ถ„ํ™”๋œ ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ตœ์ ์˜ ๋ Œ๋”๋ง ์„ฑ๋Šฅ๊ณผ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค. - -## ๐Ÿ“– Core Content - -* **์•„ํ‚คํ…์ฒ˜ ๋ฐ ํด๋” ๊ตฌ์กฐ (Architecture & Folder Structure)** - * ๊ณผ๊ฑฐ์˜ ํŒŒ์ผ ํƒ€์ž… ๊ธฐ๋ฐ˜(MVC ๋“ฑ) ํด๋” ๊ตฌ์กฐ๋Š” ๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ๋กœ์ง์ด ํŒŒํŽธํ™”๋˜๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€๊ทœ๋ชจ ์•ฑ์—์„œ๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๊ธฐ๋Šฅ๋ณ„๋กœ ์ฝ”๋“œ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” **๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜(Feature-based)** ๋˜๋Š” **FSD(Feature-Sliced Design)** ์•„ํ‚คํ…์ฒ˜๊ฐ€ ํ‘œ์ค€์œผ๋กœ ์ž๋ฆฌ ์žก์•˜์Šต๋‹ˆ๋‹ค [1-13]. - * FSD๋Š” ์•ฑ์„ ๊ณต์œ (shared), ์—”ํ‹ฐํ‹ฐ(entities), ๊ธฐ๋Šฅ(features), ์œ„์ ฏ(widgets), ํŽ˜์ด์ง€(pages), ์•ฑ(app) ๋“ฑ์˜ ๊ณ„์ธต์œผ๋กœ ๋‚˜๋ˆ„๊ณ , **๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ๊ทœ์น™**(ํ•˜์œ„ ๊ณ„์ธต๋งŒ ์ฐธ์กฐ ๊ฐ€๋Šฅ)๊ณผ **Public API ๊ทœ์น™**(index.ts๋ฅผ ํ†ตํ•œ ์บก์Аํ™”)์„ ๊ฐ•์ œํ•˜์—ฌ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถฅ๋‹ˆ๋‹ค [6, 9, 10, 14, 15]. -* **์ƒํƒœ ๊ด€๋ฆฌ์˜ ํŒŒํŽธํ™” (Fragmentation of Global State)** - * ๊ฑฐ๋Œ€ํ•œ ๋‹จ์ผ ์Šคํ† ์–ด(Monolithic Redux) ๋Œ€์‹ , ๋ฐ์ดํ„ฐ ์œ ํ˜•์— ๋”ฐ๋ผ ์ตœ์ ์˜ ๋„๊ตฌ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๋กœ์ปฌ ์ƒํƒœ๋Š” `useState`, ์ „์—ญ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒํƒœ๋Š” `Zustand`๋‚˜ `Jotai`, ์„œ๋ฒ„(API) ์ƒํƒœ๋Š” `TanStack Query`๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์บ์‹ฑ ๋ฐ ๋™๊ธฐํ™”๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค [16-24]. - * ํŠนํžˆ Context API๋Š” ๊ฐ’์ด ๋ณ€ํ•  ๋•Œ๋งˆ๋‹ค ๋ชจ๋“  ๊ตฌ๋… ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฆฌ๋ Œ๋”๋งํ•˜๋Š” '๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ' ๋ฐฉ์‹์ด๋ฏ€๋กœ ์ •์  ๋ฐ์ดํ„ฐ(ํ…Œ๋งˆ ๋“ฑ)์— ์ ํ•ฉํ•˜๋ฉฐ, ์ž์ฃผ ๋ณ€๊ฒฝ๋˜๋Š” ๋™์  ์ƒํƒœ๋Š” ์„ ํƒ์ž(Selector) ํŒจํ„ด์œผ๋กœ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ฐฉ์ง€ํ•˜๋Š” Zustand ๋“ฑ์ด ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค [16, 17, 25-28]. -* **์„ฑ๋Šฅ ์ตœ์ ํ™” (Performance Optimization)** - * **๋นŒ๋“œ/๋Ÿฐํƒ€์ž„ ์ตœ์ ํ™”:** Vite์™€ Rollup์„ ํ™œ์šฉํ•˜์—ฌ ์ž์ฃผ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(React ๋“ฑ)๋ฅผ `manualChunks`๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ์บ์‹œ ํšจ์œจ์„ ๋†’์ด๊ณ , `React.lazy`์™€ `Suspense`๋ฅผ ํ†ตํ•ด ๋ผ์šฐํŠธ ๋˜๋Š” ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„์˜ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค [29-37]. - * **๋ Œ๋”๋ง ์„ฑ๋Šฅ:** React 19/2025 ์ƒํƒœ๊ณ„์—์„œ๋Š” ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜(React.memo, useMemo)์˜ ํ•œ๊ณ„๋ฅผ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด **React Compiler**๋ฅผ ๋„์ž…ํ•˜์—ฌ ๋นŒ๋“œ ํƒ€์ž„์— ์ž๋™์œผ๋กœ ๋ Œ๋”๋ง ์ตœ์ ํ™”๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๋Ÿ‰์˜ ๋ฆฌ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋Š” ๊ฐ€์ƒํ™”(Virtualization) ๊ธฐ์ˆ ์„ ํ†ตํ•ด DOM ๋น„๋Œ€ํ™”๋ฅผ ๋ง‰์Šต๋‹ˆ๋‹ค [30-32, 38-44]. -* **๋ณต์›๋ ฅ ๋ฐ ๋””๋ฒ„๊น… (Resilience & Debugging)** - * ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๋กœ ์ธํ•œ '๋ฐฑ์ง€ ํ™”๋ฉด(White screen of death)'์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด **์—๋Ÿฌ ๋ฐ”์šด๋”๋ฆฌ(Error Boundaries)**๋ฅผ ๋Œ€์‹œ๋ณด๋“œ๋‚˜ ์„œ๋“œํŒŒํ‹ฐ ์œ„์ ฏ ๋“ฑ ๋ถˆ์•ˆ์ •ํ•œ UI ์„น์…˜์— ์ „๋žต์ ์œผ๋กœ ๋ฐฐ์น˜ํ•˜์—ฌ Fallback UI๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [45-53]. - * ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜(Detached DOM nodes ๋“ฑ)๋Š” ์„ฑ๋Šฅ ์ €ํ•˜์˜ ์ฃผ์›์ธ์ด๋ฏ€๋กœ Chrome DevTools์˜ Heap Snapshot ๋ฐ Allocation Timeline์„ ํ†ตํ•ด ์ถ”์ ํ•˜๋ฉฐ, ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋Š” Sentry, LogRocket, Datadog ๋“ฑ์˜ ๊ฐ€์‹œ์„ฑ(Observability) ๋„๊ตฌ๋กœ ๋ชจ๋‹ˆํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค [54-63]. -* **ํด๋ฆฐ ์ฝ”๋“œ ๋ฐ ๊ฑฐ๋ฒ„๋„Œ์Šค (Clean Code & Governance)** - * React์˜ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—๋„ SOLID ์›์น™(๋‹จ์ผ ์ฑ…์ž„ ์›์น™, ๊ฐœ๋ฐฉ-ํ์‡„ ์›์น™ ๋“ฑ), DRY, KISS, YAGNI ์›์น™์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ปดํฌ๋„ŒํŠธ๋Š” ๋‹จ์ผ ์ฑ…์ž„์„ ๊ฐ€์ ธ์•ผ ํ•˜๋ฉฐ ๊ณผ๋„ํ•œ ์ถ”์ƒํ™”๋Š” ์ง€์–‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [64-69]. - * ์šด์˜์ฒด์ œ ๊ฐ„ ํ˜ธํ™˜์„ฑ ๋ฐ ๋นŒ๋“œ ์˜ค๋ฅ˜ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด ํŒŒ์ผ ๋ฐ ํด๋”๋ช…์€ `kebab-case`, ์ปดํฌ๋„ŒํŠธ๋Š” `PascalCase` ์‚ฌ์šฉ์„ ํ‘œ์ค€ํ™”ํ•˜๋ฉฐ, ESLint, Prettier, Husky๋ฅผ ํ†ตํ•ด CI/CD ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ์•„ํ‚คํ…์ฒ˜ ๊ฒฝ๊ณ„์™€ ์ฝ”๋“œ ํ’ˆ์งˆ์„ ์ž๋™ ๊ฐ•์ œํ•ฉ๋‹ˆ๋‹ค [70-73]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts -- [[Feature-Sliced Design (FSD)]] - - ์—ฐ๊ฒฐ ์ด์œ : ๋Œ€๊ทœ๋ชจ ํ”„๋ก ํŠธ์—”๋“œ ํ”„๋กœ์ ํŠธ์˜ ํด๋” ๊ตฌ์กฐ์™€ ๋ชจ๋“ˆ ์˜์กด์„ฑ์„ ํ†ต์ œํ•˜๋Š” ํ•ต์‹ฌ ์•„ํ‚คํ…์ฒ˜ ๋ฐฉ๋ฒ•๋ก ์ž…๋‹ˆ๋‹ค. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ๊ณผ UI๋ฅผ ์–ด๋–ป๊ฒŒ ๊ณ„์ธต์ ์œผ๋กœ ๋ถ„๋ฆฌํ•˜๊ณ , ์ˆœํ™˜ ์ฐธ์กฐ ๋ฐ ๊ฐ•ํ•œ ๊ฒฐํ•ฉ์„ ์–ด๋–ป๊ฒŒ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -- [[์ƒํƒœ ๊ด€๋ฆฌ (State Management)]] - - ์—ฐ๊ฒฐ ์ด์œ : ๋Œ€๊ทœ๋ชจ ์•ฑ์—์„œ๋Š” ์ „์—ญ ์ƒํƒœ, ์„œ๋ฒ„ ์ƒํƒœ, ๋กœ์ปฌ ์ƒํƒœ๋ฅผ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌํ•ด์•ผ ํ™•์žฅ ๋ฐ ์„ฑ๋Šฅ ์œ ์ง€๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Context API์˜ ์„ฑ๋Šฅ์  ํ•œ๊ณ„(๋ฆฌ๋ Œ๋”๋ง ํญํ’)์™€ Zustand์˜ Selector ํŒจํ„ด, TanStack Query๋ฅผ ํ†ตํ•œ ์„œ๋ฒ„ ์ƒํƒœ ์บ์‹ฑ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -- [[์„ฑ๋Šฅ ์ตœ์ ํ™” (Performance Optimization)]] - - ์—ฐ๊ฒฐ ์ด์œ : ๋Œ€๊ทœ๋ชจ ์ฝ”๋“œ๋ฒ ์ด์Šค๋Š” ํ•„์—ฐ์ ์œผ๋กœ ๋ฒˆ๋“ค ํฌ๊ธฐ ์ฆ๊ฐ€์™€ ๋ Œ๋”๋ง ๋ณ‘๋ชฉ์„ ์ดˆ๋ž˜ํ•˜๋ฏ€๋กœ ์ด๋ฅผ ์ œ์–ดํ•˜๋Š” ๊ธฐ์ˆ ์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: React Compiler์˜ ์ž๋™ํ™”๋œ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ์›๋ฆฌ, Vite์˜ manualChunks๋ฅผ ํ†ตํ•œ ๋ฒˆ๋“ค ๋ถ„ํ• , React.lazy ๊ธฐ๋ฐ˜์˜ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ… ์ ์šฉ ๋ฐฉ์‹์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -- [[์—๋Ÿฌ ๋ฐ”์šด๋”๋ฆฌ (Error Boundaries)]] - - ์—ฐ๊ฒฐ ์ด์œ : ์ปดํฌ๋„ŒํŠธ ํ•˜๋‚˜์˜ ์˜ค๋ฅ˜๊ฐ€ ์ „์ฒด ์•ฑ์˜ ํฌ๋ž˜์‹œ๋กœ ์ด์–ด์ง€์ง€ ์•Š๊ฒŒ ๋ง‰์•„์ฃผ๋Š” ๋Œ€๊ทœ๋ชจ ์‹œ์Šคํ…œ์˜ ํ•„์ˆ˜ ์•ˆ์ „๋ง์ž…๋‹ˆ๋‹ค. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ ๋‚ด์—์„œ ์—๋Ÿฌ๋ฅผ ๊ฒฉ๋ฆฌํ•˜๋Š” ์›๋ฆฌ์™€ ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๋ฅผ ์šฐ์•„ํ•˜๊ฒŒ ์ฒ˜๋ฆฌ(Graceful degradation)ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -- [[๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ (Memory Leaks)]] - - ์—ฐ๊ฒฐ ์ด์œ : ์•ฑ ์‚ฌ์šฉ ์‹œ๊ฐ„์ด ๊ธธ์–ด์งˆ์ˆ˜๋ก ์„ฑ๋Šฅ์„ ์‹ฌ๊ฐํ•˜๊ฒŒ ์ €ํ•˜์‹œํ‚ค๋Š” ์ˆจ์€ ์›์ธ์ž…๋‹ˆ๋‹ค. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํด๋กœ์ €(Closure)๋‚˜ Detached DOM์— ์˜ํ•ด ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํšŒ์ˆ˜ํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ตฌ์กฐ์  ์›์ธ๊ณผ DevTools๋ฅผ ํ™œ์šฉํ•œ ๋””๋ฒ„๊น… ๊ธฐ๋ฒ•์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - -### Deeper Research Questions -- FSD(Feature-Sliced Design) ๋„์ž… ์‹œ '์ธ์ฆ(Auth)'์ด๋‚˜ '๋ผ์šฐํŒ…'๊ณผ ๊ฐ™์€ Cross-cutting concern(๊ณตํ†ต ๊ด€์‹ฌ์‚ฌ)์€ ๊ณ„์ธต(Layer) ๊ตฌ์กฐ์˜ ์–ด๋А ๋ถ€๋ถ„์— ๋ฐฐ์น˜ํ•˜๊ณ  ์–ด๋–ป๊ฒŒ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ ํ•ฉํ•œ๊ฐ€? -- React Compiler๊ฐ€ ์ž๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์ˆ˜ํ–‰ํ•  ๋•Œ, ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(์˜ˆ: ๋ถˆ์•ˆ์ •ํ•œ ๊ฐ์ฒด ์ฐธ์กฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ปค์Šคํ…€ ํ›…)์™€์˜ ํ˜ธํ™˜์„ฑ ์ถฉ๋Œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๊ตฌ์ฒด์  ๋ฐฉ์•ˆ์€ ๋ฌด์—‡์ธ๊ฐ€? -- ๋Œ€๊ทœ๋ชจ ๋ฆฌ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ Œ๋”๋งํ•  ๋•Œ Virtualization(์œˆ๋„์œ™) ๊ธฐ์ˆ ์ด DOM ๋…ธ๋“œ ์ฆ๊ฐ€๋ฅผ ๋ง‰๋Š” ์›๋ฆฌ๋Š” ๋ฌด์—‡์ด๋ฉฐ, ์ด ๊ณผ์ •์—์„œ `key` ํ”„๋กญ(prop)์ด ์„ฑ๋Šฅ์— ๋ฏธ์น˜๋Š” ์ •ํ™•ํ•œ ์˜ํ–ฅ์€ ๋ฌด์—‡์ธ๊ฐ€? -- ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์˜ ํ”„๋ก ํŠธ์—”๋“œ ๋ชจ๋‹ˆํ„ฐ๋ง(Sentry, Datadog ๋“ฑ)์ด ์ œ๊ณตํ•˜๋Š” ์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด(Session Replay) ๊ธฐ๋Šฅ์ด ๊ฐœ๋ฐœ์ž์˜ ๋””๋ฒ„๊น…์— ์–ด๋–ป๊ฒŒ ๊ธฐ์—ฌํ•˜๋ฉฐ, ์ด๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฏผ๊ฐ ๋ฐ์ดํ„ฐ ์œ ์ถœ ๋ฐ ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ ์ฆ๊ฐ€๋ผ๋Š” ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๋Š” ์–ด๋–ป๊ฒŒ ๊ทน๋ณตํ•˜๋Š”๊ฐ€? -- Zustand, Jotai์™€ ๊ฐ™์€ ์ตœ์‹  ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๊ธฐ์กด์˜ Redux๋‚˜ Context API์™€ ๋น„๊ตํ•˜์—ฌ ๋™์ /์‹ค์‹œ๊ฐ„ ๋ Œ๋”๋ง ์ตœ์ ํ™”(์˜ˆ: ๋ฆฌ๋ Œ๋”๋ง ์Šคํ‚ต)๋ฅผ ๋‚ด๋ถ€์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ๋Š”๊ฐ€? - -### Practical Application Contexts -- **Implementation:** ํŒŒ์ผ๊ณผ ํด๋” ๋„ค์ด๋ฐ ๊ทœ์น™(ํŒŒ์ผ: kebab-case, ์ปดํฌ๋„ŒํŠธ: PascalCase)์„ ํ†ต์ผํ•˜๊ณ , 300์ค„์ด ๋„˜์–ด๊ฐ€๋Š” ์ปดํฌ๋„ŒํŠธ๋Š” ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)์— ๋”ฐ๋ผ ๋” ์ž‘์€ ํ›…(Hook)๊ณผ ์„œ๋ธŒ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ฆฌํŒฉํ† ๋งํ•ฉ๋‹ˆ๋‹ค. -- **System Design:** ํ”„๋กœ์ ํŠธ ์„ค๊ณ„ ์‹œ ํด๋” ๊ตฌ์กฐ๋ฅผ ๊ธฐ์ˆ  ์Šคํƒ(components, hooks) ๊ธฐ๋ฐ˜์ด ์•„๋‹Œ ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ(features/auth, features/dashboard ๋“ฑ) ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์„ฑํ•˜์—ฌ ๊ฐ ๋ชจ๋“ˆ์˜ ์บก์Аํ™”๋ฅผ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. -- **Operation / Maintenance:** ๊ฐœ๋ณ„ ์„œ๋“œํŒŒํ‹ฐ ์œ„์ ฏ์ด๋‚˜ ๋ถˆ์•ˆ์ •ํ•œ UI ํŒŒํŠธ์— Error Boundary๋ฅผ ์”Œ์›Œ ๋ฉ”์ธ ์„œ๋น„์Šค์˜ ๋™์ž‘์„ ๋ณด์žฅํ•˜๋ฉฐ, Memory Profiler๋ฅผ ์‚ฌ์šฉํ•ด Detached DOM node ๋“ฑ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ์š”์ธ์„ ์ •๊ธฐ์ ์œผ๋กœ ๊ฐ์‚ฌ(Audit)ํ•ฉ๋‹ˆ๋‹ค. -- **Learning Path:** ๋ฆฌ์•กํŠธ ํ•ต์‹ฌ ์›๋ฆฌ(๋ Œ๋”๋ง ํŠธ๋ฆฌ๊ฑฐ ์ดํ•ด) โ†’ ํด๋” ๊ตฌ์กฐ/์•„ํ‚คํ…์ฒ˜(FSD) ์„ค๊ณ„ โ†’ ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ ๋น„๊ต ๋ฐ ๋„์ž… โ†’ ์›น ์„ฑ๋Šฅ ์ง€ํ‘œ(Core Web Vitals) ๋ฐ ๋ฒˆ๋“ค๋Ÿฌ(Vite) ์ตœ์ ํ™” ๋„๊ตฌ ์ฒด๋“์˜ ์ˆœ์„œ๋กœ ํ•™์Šต์„ ๊ณ ๋„ํ™”ํ•ฉ๋‹ˆ๋‹ค. -- **My Project Relevance:** ํŒ€ ๋‹จ์œ„์˜ ํ˜‘์—… ์‹œ ESLint, Prettier, Husky๋ฅผ ๋„์ž…ํ•ด ์•„ํ‚คํ…์ฒ˜ ๊ทœ์น™(๋‹ค๋ฅธ Feature์— ์ง์ ‘ ์ ‘๊ทผ ๊ธˆ์ง€ ๋“ฑ)์„ ์ž๋™ ๊ฐ•์ œํ•˜๊ณ , ์ฝ”๋“œ ๋ฆฌ๋ทฐ ์‹œ ์ผ๊ด€๋œ ์•„ํ‚คํ…์ฒ˜ ์›์น™์„ ๊ธฐ์ค€์œผ๋กœ ์‚ผ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - -### Adjacent Topics -- [[๋งˆ์ดํฌ๋กœ ํ”„๋ก ํŠธ์—”๋“œ (Micro-Frontends)]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋‹จ์ผ ์ €์žฅ์†Œ(Monorepo) ๋ฐ ๋ชจ๋“ˆํ™”์˜ ํ•œ๊ณ„๋ฅผ ๋„˜์–ด, ์ดˆ๋Œ€ํ˜• ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ํ™˜๊ฒฝ์—์„œ ์—ฌ๋Ÿฌ ํŒ€์ด ํ”„๋ก ํŠธ์—”๋“œ๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ๋ฐฐํฌํ•˜๊ณ  ์šด์˜ํ•˜๊ธฐ ์œ„ํ•œ ๋Ÿฐํƒ€์ž„ ํ†ตํ•ฉ ์•„ํ‚คํ…์ฒ˜๋กœ ์ง€์‹์„ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค. -- [[์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ (Visual Regression Testing)]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: Storybook์„ ํ™œ์šฉํ•œ ์ปดํฌ๋„ŒํŠธ ๊ณ ๋ฆฝ ๊ฐœ๋ฐœ์„ ๋„˜์–ด์„œ, Happo, Chromatic ๋“ฑ์˜ ๋„๊ตฌ๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ ๋ณ€๊ฒฝ์ด UI๋‚˜ ์ ‘๊ทผ์„ฑ(Accessibility)์— ์˜๋„์น˜ ์•Š์€ ํŒŒ๊ดด์  ์˜ํ–ฅ์„ ๋ฏธ์ณค๋Š”์ง€ ์ž๋™ ๊ฒ€์ฆํ•˜๋Š” QA ๊ณ ๋„ํ™” ์˜์—ญ์œผ๋กœ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ.md b/00_Raw/๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ.md deleted file mode 100644 index a26dcf51..00000000 --- a/00_Raw/๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ.md +++ /dev/null @@ -1,63 +0,0 @@ -# [[๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ]] - -## ๐Ÿ“Œ Brief Summary -๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ(์„œ๋ฒ„ ์ƒํƒœ ๊ด€๋ฆฌ)๋Š” API์—์„œ ๊ฐ€์ ธ์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ํด๋ผ์ด์–ธํŠธ ์ธก ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒํƒœ์™€ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌํ•˜์—ฌ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค [1]. ์ด๋Š” ๋„คํŠธ์›Œํฌ ์š”์ฒญ์— ๋”ฐ๋ฅธ ๋ฐ์ดํ„ฐ ์บ์‹ฑ, ๋™๊ธฐํ™”, ๋กœ๋”ฉ ๋ฐ ์—๋Ÿฌ ์‚ฌ์ดํด ๊ด€๋ฆฌ๋ฅผ ํฌํ•จํ•˜๋ฉฐ, ํ˜„๋Œ€ ํ”„๋ก ํŠธ์—”๋“œ ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜์˜ ํ•ต์‹ฌ ์š”์†Œ์ž…๋‹ˆ๋‹ค [1, 2]. ๋Œ€๊ทœ๋ชจ ์•ฑ์—์„œ๋Š” RTK Query๋‚˜ TanStack Query(React Query)์™€ ๊ฐ™์€ ํŠนํ™”๋œ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ๋ฅผ ์ค„์ด๊ณ  ํšจ์œจ์ ์ธ ์บ์‹œ ๊ด€๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค [1, 3, 4]. - -## ๐Ÿ“– Core Content - -* **์„œ๋ฒ„ ์ƒํƒœ์™€ ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ์˜ ๋ถ„๋ฆฌ:** - ์ตœ๊ทผ ํ”„๋ก ํŠธ์—”๋“œ ์•„ํ‚คํ…์ฒ˜์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ณ€ํ™” ์ค‘ ํ•˜๋‚˜๋Š” "์„œ๋ฒ„ ์ƒํƒœ(Server State)"๋ฅผ "์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒํƒœ"์™€ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. API์—์„œ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐ์ดํ„ฐ๋Š” ํด๋ผ์ด์–ธํŠธ ๋ฐ์ดํ„ฐ์™€ ๊ทผ๋ณธ์ ์œผ๋กœ ๋‹ค๋ฅด๋ฉฐ, ์บ์‹ฑ, ๋™๊ธฐํ™”, ๋กœ๋”ฉ ๋ฐ ์—๋Ÿฌ ์ฒ˜๋ฆฌ๊ฐ€ ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค [1]. Zustand์™€ ๊ฐ™์ด ์œ ์—ฐํ•œ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋น„๋™๊ธฐ(Async) ์ž‘์—…์„ ์ง์ ‘ ๋‹ค๋ฃจ๊ฒŒ ๋˜๋ฉด, ํŒ€์›๋งˆ๋‹ค ์ฝœ๋ฐฑ, ํ”„๋กœ๋ฏธ์Šค, ๋ฏธ๋“ค์›จ์–ด ๋“ฑ ์„œ๋กœ ๋‹ค๋ฅธ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์—ฌ ์ผ๊ด€์„ฑ์ด ๋–จ์–ด์ง€๊ณ  ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ค์›Œ์ง€๋Š” ํ•œ๊ณ„๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3, 5]. - -* **๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ ์ตœ์ ํ™” ๋„๊ตฌ:** - ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด TanStack Query(React Query)์™€ RTK Query ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์‚ฌ์‹ค์ƒ์˜ ํ‘œ์ค€์œผ๋กœ ์ž๋ฆฌ ์žก์•˜์Šต๋‹ˆ๋‹ค [1]. - * **TanStack Query:** ๊ฐ•๋ ฅํ•œ ์บ์‹ฑ ๋ ˆ์ด์–ด๋ฅผ ์ œ๊ณตํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ๋„คํŠธ์›Œํฌ ์ค‘๋ณต ์š”์ฒญ์„ ์ค„์ด๊ณ  ๋ฐ์ดํ„ฐ์˜ ์ตœ์‹  ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๋ฌดํ•œ ์Šคํฌ๋กค(infinite scrolling)์ด๋‚˜ ๋‚™๊ด€์  ์—…๋ฐ์ดํŠธ(optimistic updates)์™€ ๊ฐ™์€ ๋ณต์žกํ•œ ๋น„๋™๊ธฐ ๊ธฐ๋Šฅ์„ ๋‹จ์ˆœํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2]. - * **RTK Query:** Redux ์ƒํƒœ๊ณ„์—์„œ ๋น„๋™๊ธฐ ์ž‘์—…์ด ๋งŽ์€ ์•ฑ์„ ์œ„ํ•ด ์บ์‹ฑ, ์ค‘๋ณต ์ œ๊ฑฐ, ์ž๋™ ๋ฐ์ดํ„ฐ ์žฌ์š”์ฒญ(refetching), ์บ์‹œ ๋ฌดํšจํ™” ๊ธฐ๋Šฅ์„ ๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณตํ•˜์—ฌ ๋น„๋™๊ธฐ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ๋ฅผ ์‚ฌ์‹ค์ƒ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค [3, 4]. - -* **๊ตฌ์กฐ์  ๋ถ„๋ฆฌ์™€ ์•„ํ‚คํ…์ฒ˜:** - API ๊ณ„์ธต์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋…๋ฆฝ์ ์ธ ๊ฒฝ๊ณ„๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ, ์š”์ฒญ ์„ ์–ธ๋ถ€์™€ ์ปค์Šคํ…€ ํ›…(Custom Hooks)์€ ํŠน์ • ๊ธฐ๋Šฅ(feature) ํด๋” ๋‚ด์— ํ•จ๊ป˜ ๋ฐฐ์น˜(colocate)๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋„คํŠธ์›Œํฌ ๊ด€๋ จ ๋น„๋™๊ธฐ ๋กœ์ง์„ UI ์ปดํฌ๋„ŒํŠธ์™€ ์™„๋ฒฝํžˆ ๋””์ปคํ”Œ๋ง(decoupling)ํ•˜์—ฌ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค [2]. - -* **์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ฐ ์•ˆ์ •์„ฑ:** - * **๋””๋ฐ”์šด์‹ฑ๊ณผ ์“ฐ๋กœํ‹€๋ง:** ์‚ฌ์šฉ์ž ์ž…๋ ฅ(์˜ˆ: ๊ฒ€์ƒ‰)์— ์˜ํ•ด ํŠธ๋ฆฌ๊ฑฐ๋˜๋Š” ๊ฐ’๋น„์‹ผ ๋น„๋™๊ธฐ API ํ˜ธ์ถœ์€ ๋””๋ฐ”์šด์‹ฑ(debouncing)์ด๋‚˜ ์“ฐ๋กœํ‹€๋ง(throttling)์„ ํ†ตํ•ด ํšŸ์ˆ˜๋ฅผ ์ œํ•œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ณผ๋„ํ•œ API ํ˜ธ์ถœ์„ ๋ฐฉ์ง€ํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ณ  ์„œ๋ฒ„ ๋ถ€ํ•˜๋ฅผ ์ค„์—ฌ์ค๋‹ˆ๋‹ค [6, 7]. - * **๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฐฉ์ง€:** ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋‚˜ ๊ตฌ๋…(subscriptions) ๋“ฑ ์ •๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๋น„๋™๊ธฐ ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ์˜ ๊ฒฝ์šฐ, ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ธ๋งˆ์šดํŠธ๋  ๋•Œ ๋ฆฌ์†Œ์Šค๋ฅผ ํ•ด์ œํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜(memory leaks)๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด ๋ฐ˜๋“œ์‹œ `useEffect`์—์„œ ํด๋ฆฐ์—…(cleanup) ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [8, 9]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts -- [[TanStack Query ๋ฐ RTK Query]] - - ์—ฐ๊ฒฐ ์ด์œ : ์„œ๋ฒ„ ์ƒํƒœ(API ๋ฐ์ดํ„ฐ) ๊ด€๋ฆฌ์— ์žˆ์–ด ์บ์‹ฑ, ์ค‘๋ณต ์š”์ฒญ ์ œ๊ฑฐ, ์ž๋™ ์žฌ์š”์ฒญ ๋“ฑ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ํ˜„๋Œ€์ ์ธ ํ•„์ˆ˜ ํ‘œ์ค€ ๋„๊ตฌ๋กœ ์†Œ์Šค์—์„œ ๊ฐ•์กฐ๋˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [1, 2, 4]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ๊ฐ์†Œ ์›๋ฆฌ์™€ ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™” ๋ฉ”์ปค๋‹ˆ์ฆ˜. - -- [[์„œ๋ฒ„ ์ƒํƒœ (Server State)]] - - ์—ฐ๊ฒฐ ์ด์œ : API๋กœ๋ถ€ํ„ฐ ํŒจ์น˜(fetch)๋˜๋Š” ๋ฐ์ดํ„ฐ๋Š” ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ์™€ ์„ฑ๊ฒฉ์ด ์™„์ „ํžˆ ๋‹ฌ๋ผ ๋ณ„๋„์˜ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ๋น„๋™๊ธฐ ๊ด€๋ฆฌ์˜ ํ•ต์‹ฌ ์ „์ œ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [1]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์บ์‹ฑ ๋กœ๋”ฉ, ์—๋Ÿฌ ์‚ฌ์ดํด, ์„œ๋ฒ„ ๋ฐ์ดํ„ฐ ์ตœ์‹ ํ™” ๊ธฐ๋ฒ•. - -- [[๋””๋ฐ”์šด์‹ฑ(Debouncing) ๋ฐ ์“ฐ๋กœํ‹€๋ง(Throttling)]] - - ์—ฐ๊ฒฐ ์ด์œ : ์žฆ์€ ์‚ฌ์šฉ์ž ์ด๋ฒคํŠธ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ๋ฌด๋ถ„๋ณ„ํ•œ ๋น„๋™๊ธฐ API ํ˜ธ์ถœ์„ ์ œ์–ดํ•˜์—ฌ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ์ „๋žต์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [6, 7]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํ”„๋ก ํŠธ์—”๋“œ์—์„œ์˜ ๋„คํŠธ์›Œํฌ ์ตœ์ ํ™” ๋ฐ ๋Ÿฐํƒ€์ž„ ๋ณ‘๋ชฉ ํ˜„์ƒ ๋ฐฉ์ง€. - -- [[ํด๋ฆฐ์—… (Cleanup) ํ•จ์ˆ˜์™€ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜]] - - ์—ฐ๊ฒฐ ์ด์œ : ๋น„๋™๊ธฐ ์ž‘์—… ์™„๋ฃŒ ์ „ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ธ๋งˆ์šดํŠธ๋˜์—ˆ์„ ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์ž์› ๋‚ญ๋น„์™€ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋ง‰๋Š” ํ•„์ˆ˜ ๊ทœ์น™์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [8, 9]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: React ์ƒ๋ช…์ฃผ๊ธฐ(Lifecycle)์™€ ๊ฒฐํ•ฉ๋œ ์•ˆ์ „ํ•œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•. - -### Deeper Research Questions -- Zustand์™€ ๊ฐ™์€ ๊ฐ€๋ฒผ์šด ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋Œ€๊ทœ๋ชจ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜์  ํ•œ๊ณ„์™€ ํŒŒํŽธํ™” ๋ฌธ์ œ๋Š” ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ๋‚˜ํƒ€๋‚˜๋Š”๊ฐ€? [3, 5] -- RTK Query๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์บ์‹œ ๋ฌดํšจํ™”(cache invalidation) ๋ฐ ์ž๋™ ๋ฐ์ดํ„ฐ ์žฌ์š”์ฒญ ๊ธฐ๋Šฅ์˜ ๋‚ด๋ถ€ ์ž‘๋™ ๋ฐฉ์‹์€ ๋ฌด์—‡์ธ๊ฐ€? [4] -- TanStack Query๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฌดํ•œ ์Šคํฌ๋กค ๋ฐ ๋‚™๊ด€์  ์—…๋ฐ์ดํŠธ๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ, ์บ์‹œ ๋ ˆ์ด์–ด๋Š” ์–ด๋–ป๊ฒŒ ๋ฌด๊ฒฐ์„ฑ์„ ๋ณด์žฅํ•˜๋Š”๊ฐ€? [2] -- Feature-Sliced Design ๊ฐ™์€ ๋ชจ๋“ˆํ™”๋œ ํด๋” ๊ตฌ์กฐ์—์„œ API ์„ ์–ธ๊ณผ ๋น„๋™๊ธฐ ์ปค์Šคํ…€ ํ›…์€ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์บก์Аํ™”๋˜๊ณ  ํ˜ธ์ถœ๋˜๋Š”๊ฐ€? [2] -- `useEffect` ๋‚ด์˜ ๋น„๋™๊ธฐ ํ˜ธ์ถœ ์‹œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ์žก๊ธฐ ์œ„ํ•œ DevTools Heap Snapshot ๋ถ„์„ ๋ฐฉ๋ฒ•์€ ์–ด๋–ป๊ฒŒ ์ ์šฉ๋˜๋Š”๊ฐ€? [9] - -### Practical Application Contexts -- **Implementation:** UI ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ ๋น„๋™๊ธฐ ๋กœ์ง์„ ์ง์ ‘ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๊ณ , API ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋„คํŠธ์›Œํฌ ๋กœ์ง์„ ์ปค์Šคํ…€ ํ›…์œผ๋กœ ์ถ”์ถœํ•˜์—ฌ `features/` ํด๋” ํ•˜์œ„์— ๊ฒฉ๋ฆฌํ•˜์—ฌ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค [2, 10]. ๋˜ํ•œ `useEffect`๋ฅผ ํ†ตํ•œ ๊ตฌ๋… ์‹œ ํด๋ฆฐ์—… ํ•จ์ˆ˜๋ฅผ ๋ฐ˜๋“œ์‹œ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค [8]. -- **System Design:** ํ”„๋กœ์ ํŠธ ์„ค๊ณ„ ์‹œ ํด๋ผ์ด์–ธํŠธ ์ „์—ญ ์ƒํƒœ(์˜ˆ: UI ํ…Œ๋งˆ, ์–ธ์–ด)์™€ ์„œ๋ฒ„์—์„œ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋น„๋™๊ธฐ ์ƒํƒœ(์˜ˆ: ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ, ์•Œ๋ฆผ)๋ฅผ ์™„์ „ํžˆ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ฐ๊ธฐ ๋‹ค๋ฅธ ๋„๊ตฌ(Zustand + TanStack Query)๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค [1, 11]. -- **Operation / Maintenance:** Redux DevTools์™€ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ ์•ก์…˜์ด ์–ธ์ œ ํ˜ธ์ถœ๋˜์—ˆ๊ณ  ์„œ๋ฒ„ ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋–ป๊ฒŒ ์—…๋ฐ์ดํŠธ๋˜์—ˆ๋Š”์ง€ ํƒ€์ž„ํŠธ๋ž˜๋ธ” ๋””๋ฒ„๊น…(Time-travel debugging)์„ ์ง„ํ–‰ํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ์‹ ์†ํžˆ ํŒŒ์•…ํ•ฉ๋‹ˆ๋‹ค [12, 13]. -- **Learning Path:** ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„์˜ `useState`/`useEffect`๋ฅผ ํ†ตํ•œ ๋ฐ์ดํ„ฐ ํŒจ์นญ์˜ ํ•œ๊ณ„ ํ•™์Šต โ†’ ๋””๋ฐ”์šด์‹ฑ/๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฐฉ์ง€ ์›๋ฆฌ ์ดํ•ด โ†’ ์„œ๋ฒ„ ์ƒํƒœ์™€ ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ์˜ ์ฐจ์ด ์ธ์ง€ โ†’ TanStack Query/RTK Query๋ฅผ ํ†ตํ•œ ์ „๋ฌธ์ ์ธ ๋น„๋™๊ธฐ ์ƒํƒœ ๊ด€๋ฆฌ ๋งˆ์Šคํ„ฐ๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค [1, 3, 7, 8]. -- **My Project Relevance:** ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ, ๋ฐฉ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ์˜ ๋ฌดํ•œ ์Šคํฌ๋กค, ์‚ฌ์šฉ์ž ๊ฒ€์ƒ‰ ์‹œ์˜ ์ž๋™์™„์„ฑ(๋””๋ฐ”์šด์Šค ์ ์šฉ) ๊ธฐ๋Šฅ ๋“ฑ ๋ณต์žกํ•œ API ๊ธฐ๋ฐ˜ ๊ธฐ๋Šฅ์ด ์žˆ๋Š” ํ”„๋กœ์ ํŠธ์˜ ์„ฑ๋Šฅ ๋ฐ ์•„ํ‚คํ…์ฒ˜ ๊ฐœ์„ ์— ์ง์ ‘ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค [2, 6, 7]. - -### Adjacent Topics -- [[์ƒํƒœ ๊ด€๋ฆฌ ์•„ํ‚คํ…์ฒ˜ (State Management Architecture)]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ(์„œ๋ฒ„ ์ƒํƒœ)์™€ ๋กœ์ปฌ ์ƒํƒœ, ์ „์—ญ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒํƒœ๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์—์„œ ์–ด๋–ป๊ฒŒ ์ƒํ˜ธ์ž‘์šฉํ•˜๊ณ  ์กฐํ™”๋กญ๊ฒŒ ๊ตฌ์„ฑ๋˜๋Š”์ง€ ํ™•์žฅํ•ด์„œ ์•Œ์•„๋ด…๋‹ˆ๋‹ค [1, 14]. -- [[์„ฑ๋Šฅ ํ”„๋กœํŒŒ์ผ๋ง ๋ฐ ๋ Œ๋”๋ง ์ตœ์ ํ™” (Performance Profiling & Rendering Optimization)]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ์ž˜๋ชป๋œ ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง ํญํ’(re-render storm)์ด๋‚˜ ๋ณ‘๋ชฉ์„ ์ผ์œผํ‚ค๋Š”์ง€ ํŒŒ์•…ํ•˜๊ณ , React Profiler๋ฅผ ํ†ตํ•ด ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ํƒ์ง€ํ•˜๋Š”์ง€ ์•Œ์•„๋ด…๋‹ˆ๋‹ค [15-17]. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/์›น ์„ฑ๋Šฅ ์ตœ์ ํ™”(Core Web Vitals) ๊ฐœ์„  ์ž‘์—….md b/00_Raw/์›น ์„ฑ๋Šฅ ์ตœ์ ํ™”(Core Web Vitals) ๊ฐœ์„  ์ž‘์—….md deleted file mode 100644 index a40df2ec..00000000 --- a/00_Raw/์›น ์„ฑ๋Šฅ ์ตœ์ ํ™”(Core Web Vitals) ๊ฐœ์„  ์ž‘์—….md +++ /dev/null @@ -1,80 +0,0 @@ -# [[์›น ์„ฑ๋Šฅ ์ตœ์ ํ™”(Core Web Vitals) ๊ฐœ์„  ์ž‘์—…]] - -## ๐Ÿ“Œ Brief Summary -์›น ์„ฑ๋Šฅ ์ตœ์ ํ™”(Core Web Vitals) ๊ฐœ์„  ์ž‘์—…์€ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋น ๋ฅด๊ณ  ์•ˆ์ •์ ์ธ ์›น ๊ฒฝํ—˜์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ฒด๊ฐ ์†๋„์™€ ์•ˆ์ •์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค [1-3]. ์ฃผ๋กœ ์ตœ๋Œ€ ์ฝ˜ํ…์ธ  ํ’€ ํŽ˜์ธํŠธ(LCP), ๋‹ค์Œ ํŽ˜์ธํŠธ์— ๋Œ€ํ•œ ์ƒํ˜ธ์ž‘์šฉ(INP), ๋ˆ„์  ๋ ˆ์ด์•„์›ƒ ์ด๋™(CLS), ์ตœ์ดˆ ์ž…๋ ฅ ์ง€์—ฐ(FID)๊ณผ ๊ฐ™์€ ํ‘œ์ค€ ์„ฑ๋Šฅ ์ง€ํ‘œ๋ฅผ ์ธก์ •ํ•˜๊ณ  ์ตœ์ ํ™”ํ•ฉ๋‹ˆ๋‹ค [1-3]. ์ด๋ฅผ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค ํฌ๊ธฐ ์ถ•์†Œ, ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง ๋ฐฉ์ง€, ๋ฆฌ์†Œ์Šค ๋กœ๋”ฉ ์šฐ์„ ์ˆœ์œ„ ์ง€์ • ๋ฐ ์„œ๋ฒ„ ์ธก ๋ Œ๋”๋ง ๋„์ž… ๋“ฑ์˜ ๊ธฐ์ˆ ์ด ํ™œ์šฉ๋ฉ๋‹ˆ๋‹ค [4-6]. - -## ๐Ÿ“– Core Content -* **ํ•ต์‹ฌ ์„ฑ๋Šฅ ์ง€ํ‘œ (Core Web Vitals) ์ดํ•ด ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง:** - ์„ฑ๋Šฅ ์ตœ์ ํ™”๋Š” ์ธก์ •์—์„œ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๋‚˜ํƒ€๋‚ด๋Š” ํ•ต์‹ฌ ์ง€ํ‘œ๋กœ๋Š” LCP(์‹œ๊ฐ์  ๋กœ๋”ฉ ์™„๋ฃŒ ์‹œ๊ฐ„), FID ๋ฐ INP(์ž…๋ ฅ ๋ฐ˜์‘์„ฑ), CLS(์‹œ๊ฐ์  ์•ˆ์ •์„ฑ), FCP(์ตœ์ดˆ ์ฝ˜ํ…์ธ  ํ’€ ํŽ˜์ธํŠธ), TBT(์ด ์ฐจ๋‹จ ์‹œ๊ฐ„) ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค [2, 3]. ์ด๋Ÿฌํ•œ ์ง€ํ‘œ๋“ค์€ Lighthouse, Web Vitals JS, SigNoz, DebugBear ๊ฐ™์€ ์‹ค์ œ ์‚ฌ์šฉ์ž ๋ชจ๋‹ˆํ„ฐ๋ง(RUM) ๋„๊ตฌ์™€ Chrome DevTools๋ฅผ ํ†ตํ•ด ์ง€์†์ ์œผ๋กœ ์ถ”์ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [2, 7-10]. -* **๋ฒˆ๋“ค ํฌ๊ธฐ ์ถ•์†Œ ๋ฐ ์ฝ”๋“œ ๋ถ„ํ•  (Code Splitting):** - ๋Œ€๊ทœ๋ชจ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŽ˜์ด๋กœ๋“œ๋Š” LCP์™€ INP ์ง€ํ‘œ๋ฅผ ์•…ํ™”์‹œํ‚ต๋‹ˆ๋‹ค [11, 12]. Vite์˜ `manualChunks`๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ React ์ฝ”์–ด์™€ ๊ฐ™์€ ๋ฌด๊ฑฐ์šด ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์บ์‹ฑ ๊ฐ€๋Šฅํ•œ ๊ฐœ๋ณ„ ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [13-15]. ๋˜ํ•œ, `React.lazy()`์™€ `Suspense`๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ผ์šฐํŠธ(Route) ๋˜๋Š” ๋ฌด๊ฑฐ์šด ์ปดํฌ๋„ŒํŠธ(์ฐจํŠธ ๋“ฑ)๋ฅผ ์‚ฌ์šฉ์ž๊ฐ€ ํ•„์š”๋กœ ํ•  ๋•Œ๋งŒ ๋™์ ์œผ๋กœ ๋กœ๋“œ(Lazy Loading)ํ•จ์œผ๋กœ์จ ์ดˆ๊ธฐ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ 20~70%๊นŒ์ง€ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [12, 15-18]. -* **๋ Œ๋”๋ง ์„ฑ๋Šฅ ์ตœ์ ํ™” (๋ฉ”๋ชจ์ด์ œ์ด์…˜):** - ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์€ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋ฅผ ์ฐจ๋‹จํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋А๋ฆฌ๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค [19]. ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด `React.memo()`, `useCallback`, `useMemo`๋ฅผ ์ „๋žต์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ์ฐธ์กฐ ์•ˆ์ •์„ฑ์„ ํ™•๋ณดํ•˜๊ณ  ๋ Œ๋”๋ง ๋น„์šฉ์„ ์ค„์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค [20-22]. ์ตœ์‹  React ํ™˜๊ฒฝ์—์„œ๋Š” ๋นŒ๋“œ ์‹œ์ ์— ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•˜์—ฌ ์ž๋™์œผ๋กœ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์ถ”๊ฐ€ํ•˜๋Š” 'React Compiler'๋ฅผ ๋„์ž…ํ•˜๋ฉด ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์˜ ๋ณต์žก์„ฑ ์—†์ด INP ์ง€ํ‘œ๋ฅผ ํฌ๊ฒŒ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [13, 23-25]. JSX ๋‚ด์—์„œ ์ต๋ช… ํ•จ์ˆ˜ ์‚ฌ์šฉ์„ ์ง€์–‘ํ•˜๋Š” ๊ฒƒ๋„ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ง‰๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค [26, 27]. -* **๋ฆฌ์ŠคํŠธ ๊ฐ€์ƒํ™” (Virtualization):** - ์ˆ˜์ฒœ ๊ฐœ์˜ ํ•ญ๋ชฉ์„ ๋ Œ๋”๋งํ•ด์•ผ ํ•˜๋Š” ๋ชฉ๋ก์€ DOM ๋น„๋Œ€ํ™”๋ฅผ ์œ ๋ฐœํ•˜์—ฌ ์Šคํฌ๋กค๋ง ์‹œ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋ฅผ ์ง€์—ฐ์‹œํ‚ต๋‹ˆ๋‹ค(INP ์ €ํ•˜) [28, 29]. `react-window`์™€ ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ทฐํฌํŠธ์— ๋ณด์ด๋Š” ํ•ญ๋ชฉ๋งŒ ๋ Œ๋”๋งํ•˜๋Š” '๊ฐ€์ƒํ™”(Windowing)' ๊ธฐ๋ฒ•์„ ์ ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [29-31]. -* **๋™์‹œ์„ฑ ๋ Œ๋”๋ง ๋ฐ ๋น„๋™๊ธฐ UI ์ œ์–ด (Concurrent Features):** - React 18 ์ด์ƒ์—์„œ๋Š” `useTransition`์„ ์‚ฌ์šฉํ•ด ๋ฌด๊ฑฐ์šด ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋ฅผ ์ง€์—ฐ์‹œํ‚ค๊ณ  ๊ธด๊ธ‰ํ•œ ์‚ฌ์šฉ์ž ์ƒํ˜ธ์ž‘์šฉ(ํƒ€์ดํ•‘, ํด๋ฆญ ๋“ฑ)์„ ์šฐ์„  ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [32-34]. ๋˜ํ•œ, `useDeferredValue`๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ Œ๋”๋ง ๋น„์šฉ์ด ๋†’์€ ๋ฐ์ดํ„ฐ์˜ ๋ฐ˜์˜์„ ์ง€์—ฐ์‹œํ‚ด์œผ๋กœ์จ UI์˜ ๋ฐ˜์‘์„ฑ์„ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [35]. -* **Next.js React ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ (RSC) ํ™œ์šฉ:** - Next.js ํ™˜๊ฒฝ์—์„œ๋Š” ์ƒํ˜ธ์ž‘์šฉ์ด ํ•„์š” ์—†๋Š” ์ •์  UI๋ฅผ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ์„œ๋ฒ„์—์„œ ๋ Œ๋”๋งํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [20, 36, 37]. ์ด๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ๋กœ ์ „์†ก๋˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํฌ๊ธฐ๋ฅผ ์ค„์ด๊ณ , ํ•˜์ด๋“œ๋ ˆ์ด์…˜(Hydration) ์‹œ๊ฐ„์„ ๋‹จ์ถ•ํ•˜์—ฌ ์ดˆ๊ธฐ ํŽ˜์ธํŠธ(FCP) ๋ฐ ์ƒํ˜ธ์ž‘์šฉ ๋„๋‹ฌ ์‹œ๊ฐ„(TTI) ์„ฑ๋Šฅ์„ ๋Œ€ํญ ๋Œ์–ด์˜ฌ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [37, 38]. -* **๋ฆฌ์†Œ์Šค ๋กœ๋”ฉ ์šฐ์„ ์ˆœ์œ„ ๋ฐ ์ด๋ฏธ์ง€ ์ตœ์ ํ™”:** - ์ค‘์š”ํ•œ ๋ Œ๋”๋ง ๊ฒฝ๋กœ(Critical Rendering Path)๋ฅผ ์ตœ์ ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๋น„๋™๊ธฐ์ ์œผ๋กœ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋กœ๋“œ(`async`, `defer`)ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [5, 16]. ์ด๋ฏธ์ง€๋Š” WebP๋‚˜ AVIF ๊ฐ™์€ ์ตœ์‹  ์••์ถ• ํฌ๋งท์„ ์‚ฌ์šฉํ•˜๊ณ , ์Šคํฌ๋กค ์•„๋ž˜์— ์žˆ๋Š” ์ด๋ฏธ์ง€๋Š” `loading="lazy"` ์†์„ฑ์„ ํ†ตํ•ด ์ง€์—ฐ ๋กœ๋”ฉํ•˜๋ฉฐ, ํ•ต์‹ฌ ์ด๋ฏธ์ง€๋Š” `fetchpriority`๋‚˜ `preload`๋ฅผ ์‚ฌ์šฉํ•ด ๋น ๋ฅด๊ฒŒ ๋กœ๋“œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [8, 39, 40]. - -## โš–๏ธ Trade-offs & Caveats -* **๋ฉ”๋ชจ์ด์ œ์ด์…˜์˜ ์˜ค๋ฒ„ํ—ค๋“œ:** `React.memo()`, `useCallback`, `useMemo`๋Š” ์ด์ „ ์ƒํƒœ์™€ ์ƒˆ๋กœ์šด ์ƒํƒœ๋ฅผ ๋น„๊ตํ•˜๋Š” ๊ณผ์ •์„ ์ˆ˜๋ฐ˜ํ•ฉ๋‹ˆ๋‹ค. ๋ Œ๋”๋ง ๋น„์šฉ์ด ๋งค์šฐ ๋‚ฎ๊ณ  ์ž์ฃผ ์—…๋ฐ์ดํŠธ๋˜๋Š” ์ปดํฌ๋„ŒํŠธ์— ์ด๋ฅผ ๋‚จ์šฉํ•  ๊ฒฝ์šฐ, ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๋น„๊ต ๋น„์šฉ์ด ์‹ค์ œ ๋ Œ๋”๋ง ๋น„์šฉ๋ณด๋‹ค ์ปค์ ธ ์˜คํžˆ๋ ค ์„ฑ๋Šฅ์„ ์ €ํ•˜์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [41, 42]. -* **์ฝ”๋“œ ๋ถ„ํ• (Code Splitting)์˜ ํ•œ๊ณ„:** ์ฝ”๋“œ๋ฅผ ๋„ˆ๋ฌด ์ž‘๊ฒŒ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ฒญํฌ(Chunk)๋กœ ๋‚˜๋ˆ„๋ฉด, ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ˆ˜๋งŽ์€ ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋˜ ๋‹ค๋ฅธ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์บ์‹ฑ๊ณผ ์ดˆ๊ธฐ ๋กœ๋“œ ์†๋„ ์‚ฌ์ด์˜ ๊ท ํ˜•์„ ๋งž์ถ”๋Š” ์ •๊ตํ•œ `manualChunks` ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค [13-15, 43, 44]. -* **React Compiler์˜ ๋””๋ฒ„๊น… ๋ณต์žก์„ฑ:** React Compiler๋Š” ์ฝ”๋“œ๋ฅผ ์ž๋™์œผ๋กœ ์ตœ์ ํ™”ํ•ด ์ฃผ์ง€๋งŒ ๋ธ”๋ž™๋ฐ•์Šค ํ˜•ํƒœ๋กœ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์˜๋„์น˜ ์•Š์€ ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์›์ธ์„ ์ถ”์ ํ•˜๊ณ  ๋””๋ฒ„๊น…ํ•˜๊ธฐ๊ฐ€ ํ›จ์”ฌ ๋” ์–ด๋ ค์›Œ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [45]. ๋˜ํ•œ ๋ถˆ์•ˆ์ •ํ•œ ์ฐธ์กฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(`useMutation`, `useLocation` ๋“ฑ)์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [46, 47]. -* **์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ(Server Components)์˜ ์ œ์•ฝ:** ํด๋ผ์ด์–ธํŠธ ์ธก JavaScript ํŽ˜์ด๋กœ๋“œ๋ฅผ ์ค„์ด๋Š” ๋ฐ ๋งค์šฐ ํšจ๊ณผ์ ์ด์ง€๋งŒ, ์ƒํƒœ(State), ์ƒ๋ช…์ฃผ๊ธฐ ํ›…(`useEffect`), ๋ธŒ๋ผ์šฐ์ € ์ „์šฉ API๋ฅผ ์ „ํ˜€ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค [48]. ๋”ฐ๋ผ์„œ ์ƒํ˜ธ์ž‘์šฉ์ด ํ•„์š”ํ•œ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ์™€ ์ •์  ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ ๊ฐ„์˜ ๊ฒฝ๊ณ„๋ฅผ ์‹ ์ค‘ํ•˜๊ฒŒ ์„ค๊ณ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [48]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -#### [๊ตฌํ˜„/์ตœ์ ํ™” ๊ธฐ๋ฒ•] -- [[Code Splitting & Lazy Loading]] - - ์—ฐ๊ฒฐ ์ด์œ : ๋Œ€์šฉ๋Ÿ‰์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค์„ ์‚ฌ์šฉ์ž๊ฐ€ ํ•„์š”๋กœ ํ•˜๋Š” ์‹œ์ ์ด๋‚˜ ๋ผ์šฐํŠธ์— ๋”ฐ๋ผ ๋ถ„ํ• ํ•˜์—ฌ ๋กœ๋“œํ•˜๋Š” ํ•ต์‹ฌ ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค [16, 18, 28]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ดˆ๊ธฐ ํŽ˜์ด์ง€ ๋กœ๋”ฉ ์‹œ๊ฐ„ ๋‹จ์ถ• ์›๋ฆฌ์™€ Vite/Webpack์˜ ๋ฒˆ๋“ค๋ง ๊ตฌ์กฐ, LCP ์ง€ํ‘œ ํ–ฅ์ƒ ๋ฐฉ๋ฒ•. -- [[Virtualization (Windowing)]] - - ์—ฐ๊ฒฐ ์ด์œ : ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ ๋ฆฌ์ŠคํŠธ ๋ Œ๋”๋ง ์‹œ ๋ธŒ๋ผ์šฐ์ €์˜ DOM ๋…ธ๋“œ ์ƒ์„ฑ ๋ถ€๋‹ด์„ ์ค„์—ฌ์ค๋‹ˆ๋‹ค [29-31]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ฉ”๋ชจ๋ฆฌ ์†Œ๋น„ ์ตœ์†Œํ™” ๋ฐ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ ์ฐจ๋‹จ ๋ฐฉ์ง€๋ฅผ ํ†ตํ•œ INP(Interaction to Next Paint) ์„ฑ๋Šฅ ๊ฐœ์„  ํšจ๊ณผ. -- [[Memoization]] - - ์—ฐ๊ฒฐ ์ด์œ : React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์˜ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง ์—ฐ์‚ฐ์„ ๋ฐฉ์ง€ํ•˜์—ฌ ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ์„ ์œ ์ง€ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค [20, 21, 24]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ฐ์ฒด ์ฐธ์กฐ์˜ ์•ˆ์ •์„ฑ(Reference Equality)๊ณผ React์˜ ๊ฐ€์ƒ DOM ๋ Œ๋”๋ง ์‚ฌ์ดํด, React Compiler์˜ ์ž‘๋™ ์›๋ฆฌ. - -#### [์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] -- [[React Server Components]] - - ์—ฐ๊ฒฐ ์ด์œ : ํด๋ผ์ด์–ธํŠธ ์ธก JS ํŽ˜์ด๋กœ๋“œ ํฌ๊ธฐ๋ฅผ ์›์ฒœ์ ์œผ๋กœ ์ค„์—ฌ ํ•˜์ด๋“œ๋ ˆ์ด์…˜ ๋ณ‘๋ชฉ์„ ํ•ด๊ฒฐํ•˜๋Š” ํ˜„๋Œ€ ํ”„๋ก ํŠธ์—”๋“œ ์ตœ์ ํ™” ์•„ํ‚คํ…์ฒ˜์ž…๋‹ˆ๋‹ค [36, 37]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ํŽ˜์นญ, ์ƒํ˜ธ์ž‘์šฉ ๋ถ„๋ฆฌ ์„ค๊ณ„ ๋ฐ TTI(Time to Interactive) ๊ฐœ์„  ๊ณผ์ •. -- [[Concurrent Rendering]] - - ์—ฐ๊ฒฐ ์ด์œ : `useTransition`, `useDeferredValue`๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌด๊ฑฐ์šด ๋ Œ๋”๋ง ์ž‘์—…์„ ์ง€์—ฐ์‹œํ‚ค๊ณ  ์ค‘์š”ํ•œ ์‚ฌ์šฉ์ž ์ธํ„ฐ๋ž™์…˜์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [32-34]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ธŒ๋ผ์šฐ์ € ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์˜ ์ž‘์—… ํ(Queue) ๊ด€๋ฆฌ์™€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ฒด๊ฐ ๋ฐ˜์‘์„ฑ ๊ฐœ์„ . - -#### [์ธก์ •/๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ] -- [[Real User Monitoring (RUM)]] - - ์—ฐ๊ฒฐ ์ด์œ : ํ•ฉ์„ฑ ํ™˜๊ฒฝ(Synthetic)์ด ์•„๋‹Œ ์‹ค์ œ ์‚ฌ์šฉ์ž์˜ ๋””๋ฐ”์ด์Šค์™€ ๋„คํŠธ์›Œํฌ ํ™˜๊ฒฝ์—์„œ ๋ฐœ์ƒํ•˜๋Š” Core Web Vitals ์ง€ํ‘œ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ  ๋ถ„์„ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค [3, 8]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ฐ์ดํ„ฐ ๊ธฐ๋ฐ˜ ์ตœ์ ํ™” ์˜์‚ฌ ๊ฒฐ์ • ๊ณผ์ • ๋ฐ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ์˜ ์„ฑ๋Šฅ ํ‡ดํ–‰(Regression) ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐฉ์‹. - -### Deeper Research Questions - -- React Compiler์˜ ์ž๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์€ ๊ธฐ์กด `useMemo`/`useCallback`์„ ํ™œ์šฉํ•œ ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๋ฐฉ์‹๊ณผ ๋น„๊ตํ•˜์—ฌ ๋ Œ๋”๋ง ์ตœ์ ํ™” ๋กœ์ง์˜ ์„ธ๋ถ„ํ™”(Granularity) ์ธก๋ฉด์—์„œ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๋Š”๊ฐ€? -- Next.js์˜ React ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ(RSC)๋ฅผ ๋„์ž…ํ•  ๋•Œ, ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ(Global State Management) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํด๋ผ์ด์–ธํŠธ์˜ ๊ณ ๋„ํ™”๋œ ์ƒํ˜ธ์ž‘์šฉ์„ ํ†ตํ•ฉํ•˜๋Š” ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜์  ์ œ์•ฝ์€ ๋ฌด์—‡์ธ๊ฐ€? -- Vite์˜ `manualChunks` ์„ค์ •์„ ํ†ตํ•ด ๋™์  ์ž„ํฌํŠธ๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ, ๋ธŒ๋ผ์šฐ์ €์˜ ์บ์‹ฑ ์ „๋žต๊ณผ ์—ฐ๊ณ„ํ•˜์—ฌ LCP ๋ฐ FCP๋ฅผ ๊ทน๋Œ€ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ์ฒญํฌ ๋ถ„ํ•  ๋‹จ์œ„์˜ ์ตœ์  ์ž„๊ณ„์ ์€ ์–ด๋–ป๊ฒŒ ์„ค์ •ํ•˜๋Š”๊ฐ€? -- Chrome DevTools์˜ Heap Snapshots ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜์—ฌ ๋ถ„๋ฆฌ๋œ DOM ๋…ธ๋“œ(Detached DOM nodes)๋‚˜ ๋ˆ„์ˆ˜๋œ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ์ฐพ์•„๋‚ด๊ณ , ์ด๊ฒƒ์ด ์žฅ๊ธฐ์ ์ธ ๋ Œ๋”๋ง ์„ฑ๋Šฅ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ํ•ด๊ฒฐํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ํ”„๋กœ์„ธ์Šค๋Š” ๋ฌด์—‡์ธ๊ฐ€? -- ์ƒํƒœ ์˜์กด์„ฑ์ด ์–ฝํ˜€ ์žˆ๋Š” ๋ณต์žกํ•œ ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ์—์„œ React Context API์˜ ๊ณผ๋„ํ•œ ๋ฆฌ๋ Œ๋”๋ง ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด Zustand์˜ ์„ ํƒ๊ธฐ(Selector) ํŒจํ„ด์ด ์„ฑ๋Šฅ ์ตœ์ ํ™”์— ๊ธฐ์—ฌํ•˜๋Š” ์›๋ฆฌ๋Š” ๋ฌด์—‡์ธ๊ฐ€? - -### Practical Application Contexts - -- **Implementation:** React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ผ์šฐํŒ… ๊ตฌ์กฐ๋ฅผ ๋ถ„์„ํ•˜์—ฌ `React.lazy()`์™€ `Suspense`๋ฅผ ํ†ตํ•ด ๋ผ์šฐํŠธ๋ณ„ ์ฝ”๋“œ ๋ถ„ํ• ์„ ์ ์šฉํ•˜๊ณ , ์ด๋ฏธ์ง€ ๋“ฑ ์ •์  ๋ฆฌ์†Œ์Šค์— `loading="lazy"` ๋ฐ `fetchpriority` ์†์„ฑ์„ ๋„์ž…ํ•˜์—ฌ ์ดˆ๊ธฐ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ค„์ž…๋‹ˆ๋‹ค. -- **System Design:** ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ ๋‹จ๊ณ„๋ถ€ํ„ฐ ์ƒํ˜ธ์ž‘์šฉ์ด ์—†๋Š” ์ •์  ๋ฐ์ดํ„ฐ ์˜์—ญ(์˜ˆ: ์ƒํ’ˆ ๋ชฉ๋ก, ์•„ํ‹ฐํด ๋ณธ๋ฌธ ๋“ฑ)์€ Next.js์˜ Server Components๋กœ ๊ตฌ์„ฑํ•˜๊ณ , ์ƒํ˜ธ์ž‘์šฉ์ด ํ•„์ˆ˜์ ์ธ ๋ถ€๋ถ„(์˜ˆ: ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๋ฒ„ํŠผ, ํ•„ํ„ฐ)๋งŒ Client Components๋กœ ์„ค๊ณ„ํ•˜์—ฌ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ „์†ก๋Ÿ‰์„ ์ตœ์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค. -- **Operation / Maintenance:** ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ ๋ฐฐํฌ ์ดํ›„ SigNoz, DebugBear, Sentry ๋“ฑ์˜ ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ๋ฅผ ์—ฐ๋™ํ•˜์—ฌ ์‹ค์ œ ์‚ฌ์šฉ์ž๋“ค์˜ LCP, INP, CLS ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ , ์„ฑ๋Šฅ ์˜ˆ์‚ฐ(Performance Budgets)์„ ์„ค์ •ํ•˜์—ฌ ์„ฑ๋Šฅ ์ €ํ•˜ ์—ฌ๋ถ€๋ฅผ ์ง€์†ํ•ด์„œ ๊ฐ์‹œํ•ฉ๋‹ˆ๋‹ค. -- **Learning Path:** ๋จผ์ € ๋ธŒ๋ผ์šฐ์ €์˜ ์ค‘์š” ๋ Œ๋”๋ง ๊ฒฝ๋กœ(Critical Rendering Path)๋ฅผ ์ดํ•ดํ•œ ํ›„, React์˜ ์ƒ๋ช…์ฃผ๊ธฐ์™€ ๋ฆฌ๋ Œ๋”๋ง ์œ ๋ฐœ ์›์ธ์„ ํ•™์Šตํ•˜๊ณ , ๋งˆ์ง€๋ง‰์œผ๋กœ ๋™์‹œ์„ฑ ๋ Œ๋”๋ง(Concurrent Features)๊ณผ ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์„ ์ˆ™์ง€ํ•˜๋Š” ์ˆœ์„œ๋กœ ์ง€์‹์„ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค. -- **My Project Relevance:** ๊ณผ๋„ํ•˜๊ฒŒ ํฐ ๋ฉ”์ธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฒญํฌ๋กœ ์ธํ•ด ๋กœ๋”ฉ์ด ๋А๋ ค์ง€๊ฑฐ๋‚˜ ์‚ฌ์šฉ์ž ์ธํ„ฐ๋ž™์…˜ ์‹œ ๋ฒ„๋ฒ…๊ฑฐ๋ฆผ(Jank)์ด ๋ฐœ์ƒํ•˜๋Š” ํ˜„์žฌ์˜ ํ”„๋กœ์ ํŠธ์— ์ฆ‰๊ฐ ์ ์šฉํ•˜์—ฌ SEO ์ ์ˆ˜๋ฅผ ๊ฐœ์„ ํ•˜๊ณ  ์‚ฌ์šฉ์ž ์ดํƒˆ๋ฅ ์„ ๋ฐฉ์ง€ํ•˜๋Š” ์‹ค์งˆ์ ์ธ ๋ฌธ์ œ ํ•ด๊ฒฐ ์ง€์นจ์œผ๋กœ ์ž‘์šฉํ•ฉ๋‹ˆ๋‹ค. - -### Adjacent Topics - -- [[Memory Management & Leak Debugging]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํž™(Heap) ๋ฉ”๋ชจ๋ฆฌ์™€ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜(GC)์˜ ๋™์ž‘ ์›๋ฆฌ๋ฅผ ํŒŒ์•…ํ•˜์—ฌ, ๋ถ„๋ฆฌ๋œ DOM ๋…ธ๋“œ๋‚˜ ํด๋กœ์ €๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ํ•ด๊ฒฐํ•จ์œผ๋กœ์จ ์žฅ๊ธฐ์ ์ธ ํŽ˜์ด์ง€ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์—ฐ๊ตฌ [49-51]. -- [[State Management Architecture]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: Context API๊ฐ€ ์ดˆ๋ž˜ํ•˜๋Š” ๋ถˆํ•„์š”ํ•œ ์ „์—ญ ๋ฆฌ๋ Œ๋”๋ง์˜ ํ•œ๊ณ„๋ฅผ ํŒŒ์•…ํ•˜๊ณ , Zustand๋‚˜ Jotai ๋“ฑ ํ•„์š”ํ•œ ์ƒํƒœ ์Šฌ๋ผ์ด์Šค๋งŒ ๊ตฌ๋…(Subscribe)ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋ฒผ์šด ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•œ ์„ฑ๋Šฅ ๋ณดํ˜ธ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ [52-55]. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/ํ”„๋ก ํŠธ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ Œ๋”๋ง ๋ณ‘๋ชฉ ๊ฐœ์„ .md b/00_Raw/ํ”„๋ก ํŠธ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ Œ๋”๋ง ๋ณ‘๋ชฉ ๊ฐœ์„ .md deleted file mode 100644 index 600727cc..00000000 --- a/00_Raw/ํ”„๋ก ํŠธ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ Œ๋”๋ง ๋ณ‘๋ชฉ ๊ฐœ์„ .md +++ /dev/null @@ -1,70 +0,0 @@ -# [[ํ”„๋ก ํŠธ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ Œ๋”๋ง ๋ณ‘๋ชฉ ๊ฐœ์„ ]] - -## ๐Ÿ“Œ Brief Summary -ํ”„๋ก ํŠธ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ Œ๋”๋ง ๋ณ‘๋ชฉ์€ ๋ถˆํ•„์š”ํ•˜๊ฑฐ๋‚˜ ๊ณผ๋„ํ•œ ์ปดํฌ๋„ŒํŠธ ๋ฆฌ๋ Œ๋”๋ง์œผ๋กœ ์ธํ•ด UI ๋ฐ˜์‘์„ฑ์ด ๋–จ์–ด์ง€๊ณ  ์ƒํ˜ธ์ž‘์šฉ ์†๋„๊ฐ€ ์ง€์—ฐ๋˜๋Š” ํ˜„์ƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค [1, 2]. ์ด๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ Œ๋”๋ง ํŠธ๋ฆฌ๊ฑฐ(์ƒํƒœ, Props, Context ๋“ฑ)๋ฅผ ์‹๋ณ„ํ•˜๊ณ  ๋ฉ”๋ชจ์ด์ œ์ด์…˜, ๋ฆฌ์ŠคํŠธ ๊ฐ€์ƒํ™”, ์ƒํƒœ ๋ถ„๋ฆฌ, ๋™์‹œ์„ฑ ๋ Œ๋”๋ง(Concurrent Rendering) ๊ธฐ๋Šฅ ๋“ฑ์„ ํ™œ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [3, 4]. ์ง€์†์ ์ธ ํ”„๋กœํŒŒ์ผ๋ง์„ ํ†ตํ•ด ๋ Œ๋”๋ง ๋น„์šฉ์ด ๋†’์€ ๋ถ€๋ถ„์„ ์ธก์ •ํ•˜๊ณ  ์ „๋žต์ ์œผ๋กœ ์ตœ์ ํ™”๋ฅผ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค [5, 6]. - -## ๐Ÿ“– Core Content -* **๋ Œ๋”๋ง ๋ฐœ์ƒ ์›์ธ ํŒŒ์•… ๋ฐ ํ”„๋กœํŒŒ์ผ๋ง** - React ์ปดํฌ๋„ŒํŠธ๋Š” ์ƒํƒœ(State), Props, Context์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๊ฑฐ๋‚˜ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง๋  ๋•Œ ๋ฆฌ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค [4]. ์ด๋Ÿฌํ•œ ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํŠธ๋ฆฌ๊ฐ€ ๊นŠ์„ ๊ฒฝ์šฐ ์Šคํฌ๋ฆฝํŒ… ์‹œ๊ฐ„์„ 30~60% ์ฆ๊ฐ€์‹œ์ผœ ์„ฑ๋Šฅ์„ ์ €ํ•˜์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2]. ๋”ฐ๋ผ์„œ React DevTools Profiler๋‚˜ `why-did-you-render` ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ด ๋ Œ๋”๋ง ๋นˆ๋„์™€ ๋น„์šฉ์„ ์ธก์ •ํ•œ ๋’ค ์ตœ์ ํ™”๋ฅผ ์ง„ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [5, 7, 8]. -* **๋ฉ”๋ชจ์ด์ œ์ด์…˜(Memoization)๊ณผ ์ฐธ์กฐ ์•ˆ์ •์„ฑ** - `React.memo()`, `useCallback`, `useMemo`๋ฅผ ์ ์ ˆํžˆ ํ™œ์šฉํ•˜๋ฉด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์€ ์ปดํฌ๋„ŒํŠธ์˜ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ง‰์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [9, 10]. ๋‹จ, JSX ๋‚ด๋ถ€์— ์ต๋ช… ํ•จ์ˆ˜๋‚˜ ์ธ๋ผ์ธ ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์ •์˜ํ•˜์—ฌ Props๋กœ ๋„˜๊ธฐ๋ฉด ์–•์€ ๋น„๊ต(Shallow comparison) ํŠน์„ฑ์ƒ ๋งค ๋ Œ๋”๋ง๋งˆ๋‹ค ์ƒˆ๋กœ์šด ์ฐธ์กฐ๊ฐ€ ์ƒ์„ฑ๋˜์–ด ๋ฉ”๋ชจ์ด์ œ์ด์…˜์ด ๋ฌด๋ ฅํ™”๋˜๋ฏ€๋กœ ์ฐธ์กฐ๋ฅผ ์•ˆ์ •ํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [10-12]. -* **React Compiler๋ฅผ ํ†ตํ•œ ์ž๋™ํ™”** - 2025๋…„ ๊ธฐ์ค€ React Compiler๋Š” ๋นŒ๋“œ ํƒ€์ž„์— ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ •์ ์œผ๋กœ ๋ถ„์„ํ•˜์—ฌ JSX ์š”์†Œ ๋‹จ์œ„๊นŒ์ง€ ์„ธ๋ฐ€ํ•˜๊ฒŒ ์ž๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค [13, 14]. ์ด๋ฅผ ํ†ตํ•ด ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์˜ ๋ฒˆ๊ฑฐ๋กœ์›€์„ ์ค„์ด๊ณ  ๋ Œ๋”๋ง ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [15]. -* **Context API ์ตœ์ ํ™”์™€ ๊ธ€๋กœ๋ฒŒ ์ƒํƒœ ๋ถ„๋ฆฌ** - Context API๋Š” ๊ฐ’์ด ๋ณ€ํ•  ๋•Œ ํ•ด๋‹น ์ปจํ…์ŠคํŠธ๋ฅผ ๊ตฌ๋…ํ•˜๋Š” ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” "๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ์‹œ์Šคํ…œ"์œผ๋กœ ์ž‘๋™ํ•˜์—ฌ ํฐ ๋ณ‘๋ชฉ์„ ์œ ๋ฐœํ•ฉ๋‹ˆ๋‹ค [16, 17]. ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ปจํ…์ŠคํŠธ๋ฅผ ์ž‘์€ ๋„๋ฉ”์ธ ๋‹จ์œ„๋กœ ์ชผ๊ฐœ๊ฑฐ๋‚˜, Zustand ๋“ฑ ํŠน์ • ์ƒํƒœ ์Šฌ๋ผ์ด์Šค(Slice)๋งŒ ์„ ํƒ์ ์œผ๋กœ ๊ตฌ๋…(Selector)ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋ฒผ์šด ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฆฌ๋ Œ๋”๋ง์„ ์ œ์–ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [16, 18-20]. -* **๋™์‹œ์„ฑ ๊ธฐ๋Šฅ(Concurrent Features)์˜ ํ™œ์šฉ** - `useTransition`์„ ์‚ฌ์šฉํ•ด ์ค‘์š”ํ•˜์ง€ ์•Š์€ ์—…๋ฐ์ดํŠธ๋ฅผ ์ง€์—ฐ์‹œํ‚ด์œผ๋กœ์จ ํƒ€์ดํ•‘๊ณผ ๊ฐ™์€ ์ฆ‰๊ฐ์ ์ธ ์ƒํ˜ธ์ž‘์šฉ์ด ์ฐจ๋‹จ๋˜์ง€ ์•Š๊ฒŒ ํ•˜๊ณ , `useDeferredValue`๋กœ ๋ฌด๊ฑฐ์šด ํŒŒ์ƒ ๋ฐ์ดํ„ฐ์˜ ๋ Œ๋”๋ง์„ ๋ฏธ๋ฃจ์–ด UI์˜ ๋ฐ˜์‘์„ฑ์„ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [21-23]. -* **๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ ๊ฐ€์ƒํ™”(Virtualization) ๋ฐ ๋ฆฌ์ŠคํŠธ ์ตœ์ ํ™”** - 50~100๊ฐœ ์ด์ƒ์˜ ํ•ญ๋ชฉ์ด ์žˆ๋Š” ๊ธด ๋ชฉ๋ก์€ ๋‹ค์ˆ˜์˜ DOM ๋…ธ๋“œ ๋ Œ๋”๋ง์„ ์œ ๋ฐœํ•˜์—ฌ ๋ณ‘๋ชฉ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค [24, 25]. `react-window` ๋“ฑ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ™œ์šฉํ•ด ๋ทฐํฌํŠธ์— ๋ณด์ด๋Š” ํ•ญ๋ชฉ๋งŒ ๋ Œ๋”๋งํ•˜๋Š” ์œˆ๋„์œ™(Windowing) ๊ธฐ๋ฒ•์„ ์ ์šฉํ•˜๊ณ , ์•ˆ์ •์ ์ด๊ณ  ๊ณ ์œ ํ•œ `key`๋ฅผ ๋ถ€์—ฌํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ DOM ์žฌ์ƒ์„ฑ์„ ๋ง‰์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค [25-27]. - -## โš–๏ธ Trade-offs & Caveats -* **๋ฉ”๋ชจ์ด์ œ์ด์…˜ ์˜ค๋ฒ„ํ—ค๋“œ:** `React.memo()`, `useCallback`, `useMemo`๋Š” ๋‚จ์šฉ๋  ๊ฒฝ์šฐ ์„ฑ๋Šฅ์„ ์˜คํžˆ๋ ค ์•…ํ™”์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [28, 29]. ์ด์ „ Props์™€ ์ƒˆ Props๋ฅผ ๋น„๊ตํ•˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๋Š” ๊ณผ์ •์— ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋ Œ๋”๋ง ๋น„์šฉ์ด ์ €๋ ดํ•œ ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” ๋ Œ๋”๋ง ์ž์ฒด๋ณด๋‹ค ๋น„๊ต ์—ฐ์‚ฐ์˜ ๋น„์šฉ์ด ๋” ํด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [29]. -* **React Compiler์˜ ์ œ์•ฝ ์‚ฌํ•ญ:** React Compiler๋Š” ์ž๋™ ์ตœ์ ํ™”๋ฅผ ์ œ๊ณตํ•˜์ง€๋งŒ, 'Rules of React'๋ฅผ ์—„๊ฒฉํžˆ ์ค€์ˆ˜ํ•ด์•ผ ์ •์ƒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค [30, 31]. ๋˜ํ•œ ๋งค ๋ Œ๋”๋ง๋งˆ๋‹ค ์ƒˆ๋กœ์šด ์ฐธ์กฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ผ๋ถ€ ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ›…(์˜ˆ: TanStack Query์˜ `useMutation` ๋“ฑ)๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ์ฒด์ธ์ด ๋Š์–ด์ง€๋Š” ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [32, 33]. -* **Context API vs ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋„์ž…:** Context API๋Š” ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ถ”๊ฐ€ ์—†์ด ํ…Œ๋งˆ, ๋‹ค๊ตญ์–ด ๋“ฑ ์ •์  ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ์— ์šฉ์ดํ•˜์ง€๋งŒ [34], ์žฆ์€ ์ƒํƒœ ๋ณ€๊ฒฝ์—๋Š” ์„ฑ๋Šฅ ์ทจ์•ฝ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค [35]. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์™ธ๋ถ€ ์ƒํƒœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(Zustand ๋“ฑ)๋ฅผ ๋ฌด์กฐ๊ฑด ๋„์ž…ํ•˜๋ฉด ์ถ”๊ฐ€์ ์ธ ๋ฒˆ๋“ค ์šฉ๋Ÿ‰ ์ฆ๊ฐ€ ๋ฐ ํŒ€์˜ ํ•™์Šต ๊ณก์„ ์ด ์ˆ˜๋ฐ˜๋œ๋‹ค๋Š” ๋ฐ˜๋Œ€ ๊ธ‰๋ถ€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค [36, 37]. -* **์ต๋ช… ํ•จ์ˆ˜ ์ œ๊ฑฐ์— ๋”ฐ๋ฅธ ์ฝ”๋“œ ๋ณต์žก๋„ ์ฆ๊ฐ€:** ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ง‰๊ณ ์ž ๋ชจ๋“  ์ธ๋ผ์ธ ํ•จ์ˆ˜๋ฅผ ์™ธ๋ถ€๋กœ ๋นผ๊ฑฐ๋‚˜ `useCallback`์œผ๋กœ ๊ฐ์‹ธ๋ฉด ์ฝ”๋“œ๊ฐ€ ๊ธธ์–ด์ง€๊ณ  ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [38]. ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ž‘๊ณ  ์„ฑ๋Šฅ ์˜ํ–ฅ์ด ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” ์ต๋ช… ํ•จ์ˆ˜ ์‚ฌ์šฉ์ด ์‹ค์šฉ์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [38]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -#### [์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] -- [[Context API]] - - ์—ฐ๊ฒฐ ์ด์œ : ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ ๊นŠ์€ ๊ณณ๊นŒ์ง€ ์ƒํƒœ๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์œผ๋‚˜ ๊ตฌ๋… ์ค‘์ธ ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฆฌ๋ Œ๋”๋ง์‹œํ‚ค๋Š” ํŠน์„ฑ์ƒ ๋ Œ๋”๋ง ๋ณ‘๋ชฉ์˜ ์ฃผ์š” ์›์ธ์ด ๋ฉ๋‹ˆ๋‹ค [17]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ๊ธฐ๋ฐ˜ ์ƒํƒœ ๊ด€๋ฆฌ์˜ ํ•œ๊ณ„์™€ ๋ฆฌ๋ Œ๋”๋ง ๋ฐœ์ƒ ๋ฒ”์œ„๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -- [[Concurrent Rendering]] - - ์—ฐ๊ฒฐ ์ด์œ : ๋ Œ๋”๋ง ์ž‘์—…์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋ถ€์—ฌํ•˜๊ณ  ์ค‘๋‹จ/์žฌ๊ฐœํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ์ˆ ๋กœ, `useTransition` ๋“ฑ์„ ํ†ตํ•ด ๋ฌด๊ฑฐ์šด ๋ Œ๋”๋ง์ด ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋ฅผ ๋ง‰๋Š” ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค [21]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ฐ˜์‘์„ฑ ์ง€ํ‘œ(INP ๋“ฑ)๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•œ ๋ Œ๋”๋ง ์Šค์ผ€์ค„๋ง ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -- [[React Compiler]] - - ์—ฐ๊ฒฐ ์ด์œ : ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์˜ ํ•œ๊ณ„๋ฅผ ๊ทน๋ณตํ•˜๊ณ  ๋นŒ๋“œ ํƒ€์ž„์— ์ž๋™์œผ๋กœ JSX ์š”์†Œ ๋‹จ์œ„์˜ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์ ์šฉํ•˜์—ฌ ๋ Œ๋”๋ง ์ตœ์ ํ™”๋ฅผ ๋‹ฌ์„ฑํ•ฉ๋‹ˆ๋‹ค [13, 14]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ตœ์‹  React์˜ ๋ Œ๋”๋ง ์ตœ์ ํ™”๊ฐ€ ๋Ÿฐํƒ€์ž„ ์ œ์–ด์—์„œ ์ปดํŒŒ์ผ๋Ÿฌ ๊ธฐ๋ฐ˜ ์ •์  ๋ถ„์„์œผ๋กœ ๋„˜์–ด๊ฐ€๋Š” ๊ธฐ์ˆ ์  ์ง„ํ™”๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - -#### [๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ] -- [[Zustand]] - - ์—ฐ๊ฒฐ ์ด์œ : ์…€๋ ‰ํ„ฐ(Selector) ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•ด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ž์‹ ์ด ํ•„์š”ํ•œ ์ƒํƒœ ์กฐ๊ฐ(Slice)์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งŒ ๋ฆฌ๋ Œ๋”๋ง๋˜๋„๋ก ๋ณด์žฅํ•˜์—ฌ ๋ณ‘๋ชฉ์„ ์ค„์ด๋Š” ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค [18]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ „์—ญ ์ƒํƒœ์˜ ํŒŒํŽธํ™” ๊ด€๋ฆฌ์™€ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ์ฐจ๋‹จํ•˜๋Š” ๊ตฌ๋… ์ตœ์ ํ™” ํŒจํ„ด์„ ํ•™์Šตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -- [[List Virtualization (Windowing)]] - - ์—ฐ๊ฒฐ ์ด์œ : ๋Œ€๊ทœ๋ชจ ๋ฆฌ์ŠคํŠธ์—์„œ ์‚ฌ์šฉ์ž์˜ ํ™”๋ฉด ๋ทฐํฌํŠธ์— ์กด์žฌํ•˜๋Š” DOM ๋…ธ๋“œ๋งŒ ์ œํ•œ์ ์œผ๋กœ ๋ Œ๋”๋งํ•˜์—ฌ DOM ํŠธ๋ฆฌ ๋น„๋Œ€ํ™”๋ฅผ ๋ง‰์Šต๋‹ˆ๋‹ค [25, 26]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋‹ค์ˆ˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ Œ๋”๋งํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ฐ ๋ ˆ์ด์•„์›ƒ ํŽ˜์ธํŒ… ๋ณ‘๋ชฉ์„ ์ œ์–ดํ•˜๋Š” ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - -### Deeper Research Questions -- React Compiler๋Š” ๋นŒ๋“œ ํƒ€์ž„์— ๋ช…์‹œ์ ์ธ ์˜์กด์„ฑ ๋ฐฐ์—ด ์—†์ด ์–ด๋–ป๊ฒŒ ๋‚ด๋ถ€ JSX ๋…ธ๋“œ๋ณ„ ์บ์‹ฑ ๋ฐ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๋‹จ์œ„๋ฅผ ๊ฒฐ์ •ํ•˜๋Š”๊ฐ€? -- Context API์˜ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ๋ฆฌ๋ Œ๋”๋ง ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” `use-context-selector`์˜ ์›๋ฆฌ๋Š” ๋ฌด์—‡์ด๋ฉฐ, Zustand์˜ ๊ตฌ๋… ์ตœ์ ํ™” ๋ฐฉ์‹๊ณผ ๊ตฌ์กฐ์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ๊ฐ€? -- `useTransition`๊ณผ `useDeferredValue`๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ์‚ฌ์šฉํ•  ๋•Œ, ๋ธŒ๋ผ์šฐ์ €์˜ ํŽ˜์ธํŠธ ์ฃผ๊ธฐ(Paint Cycle) ๊ด€์ ์—์„œ ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง์€ ์–ด๋–ป๊ฒŒ ์Šค์ผ€์ค„๋ง ๋ฐ ์ง€์—ฐ๋˜๋Š”๊ฐ€? -- ๋Œ€ํ˜• ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ List Virtualization๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ์Šคํฌ๋กค ์ด๋ฒคํŠธ ๋””๋ฐ”์šด์‹ฑ(Debouncing) ํ˜น์€ ์“ฐ๋กœํ‹€๋ง(Throttling) ์ตœ์ ํ™”์˜ ๊ธฐ์ˆ ์  ํ•œ๊ณ„์ ์€ ๋ฌด์—‡์ธ๊ฐ€? -- ์ƒํƒœ ๊ด€๋ฆฌ ์•„ํ‚คํ…์ฒ˜ ๊ด€์ ์—์„œ, Feature-Sliced Design(FSD)๊ณผ ๊ฐ™์ด ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ํด๋” ๋ฐ ๊ตฌ์กฐ์  ์„ค๊ณ„๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฆฌ๋ Œ๋”๋ง ๋ฒ”์œ„๋ฅผ ์ œํ•œํ•˜๋Š” ๋ฐ ์–ด๋–ป๊ฒŒ ๊ธฐ์—ฌํ•˜๋Š”๊ฐ€? - -### Practical Application Contexts -- **Implementation:** Props๋กœ ์ „๋‹ฌํ•˜๋Š” ํ•จ์ˆ˜๋‚˜ ๊ฐ์ฒด๋Š” ์ต๋ช… ์ƒ์„ฑ(์ธ๋ผ์ธ)์„ ์ง€์–‘ํ•˜๊ณ  `useCallback`์ด๋‚˜ ์™ธ๋ถ€ ์„ ์–ธ์œผ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ์ฐธ์กฐ ๋ฌด๊ฒฐ์„ฑ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜๋ฐฑ ๊ฐœ ์ด์ƒ์˜ ํ•ญ๋ชฉ์„ ๋ Œ๋”๋งํ•  ๊ฒฝ์šฐ `react-window`์™€ ๊ฐ™์€ ๊ฐ€์ƒํ™” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์˜๋ฌด์ ์œผ๋กœ ๋„์ž…ํ•ฉ๋‹ˆ๋‹ค. -- **System Design:** ๋นˆ๋ฒˆํžˆ ์—…๋ฐ์ดํŠธ๋˜๋Š” ์ƒํƒœ(์˜ˆ: ์•Œ๋ฆผ ๊ฐœ์ˆ˜, ์žฅ๋ฐ”๊ตฌ๋‹ˆ)๋Š” Context API ๋Œ€์‹  Zustand ๋“ฑ์˜ ์„ ํƒ์  ๊ตฌ๋…์ด ๊ฐ€๋Šฅํ•œ ์Šคํ† ์–ด์— ๋ฐฐ์น˜ํ•˜๊ณ , ์ •์  ๋ฐ์ดํ„ฐ(ํ…Œ๋งˆ ๋“ฑ)๋Š” Context๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ Œ๋”๋ง ์ „ํŒŒ ๋ฒ”์œ„๋ฅผ ์‹œ์Šคํ…œ ๋ ˆ๋ฒจ์—์„œ ๊ฒฉ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. -- **Operation / Maintenance:** `why-did-you-render` ํŒจํ‚ค์ง€์™€ React DevTools์˜ Profiler ํŒจ๋„์„ ์ด์šฉํ•ด ๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ฐ˜๋ณต ๋ Œ๋”๋ง๋˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ฐพ์•„๋‚ด๊ณ , ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋Š” Core Web Vitals(INP, FCP ๋“ฑ)๋ฅผ ์ถ”์ ํ•˜์—ฌ ์ƒํ˜ธ์ž‘์šฉ ์ง€์—ฐ์ด ์žˆ๋Š”์ง€ ๋ชจ๋‹ˆํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค. -- **Learning Path:** React์˜ ๋ Œ๋”๋ง ์กฐ๊ฑด(State, Props, Parent) ์ดํ•ด -> ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๋„๊ตฌ ์ˆ™๋‹ฌ -> Context API์˜ ์„ฑ๋Šฅ ํ•œ๊ณ„ ์ฒด๊ฐ ๋ฐ Zustand ํ™œ์šฉ -> Concurrent Features ์ ์šฉ -> React Compiler๋ฅผ ์ด์šฉํ•œ ์ž๋™ํ™” ํ๋ฆ„์œผ๋กœ ๋ Œ๋”๋ง ์ตœ์ ํ™” ์ง€์‹์„ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค. -- **My Project Relevance:** ํ˜„์žฌ ์œ ์ง€ ๋ณด์ˆ˜ํ•˜๊ฑฐ๋‚˜ ์‹ ๊ทœ ๊ตฌ์ถ•ํ•˜๋Š” React ์›น ์•ฑ์—์„œ ์Šคํฌ๋กค ๋Š๊น€์ด๋‚˜ ํด๋ฆญ ์‹œ ๋ฐ˜์‘ ์ง€์—ฐ์ด ๋ฐœ์ƒํ•  ๋•Œ, ํ•ด๋‹น ๊ฐœ๋…์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ณ‘๋ชฉ์ด ๋˜๋Š” ์ปดํฌ๋„ŒํŠธ์˜ ๋ Œ๋”๋ง ํšŸ์ˆ˜๋ฅผ ์ธก์ •ํ•˜๊ณ  ์ ์ ˆํ•œ ์ตœ์ ํ™” ๋„๊ตฌ๋ฅผ ์ฆ‰๊ฐ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - -### Adjacent Topics -- [[Server Components (Next.js)]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋ธŒ๋ผ์šฐ์ €์—์„œ์˜ ๋ Œ๋”๋ง ๋ถ€ํ•˜๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด ํด๋ผ์ด์–ธํŠธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค์„ ์ตœ์†Œํ™”ํ•˜๊ณ  ์„œ๋ฒ„์—์„œ ์ •์  UI๋ฅผ ๋ Œ๋”๋งํ•˜์—ฌ ๋„˜๊ฒจ์ฃผ๋Š” ์•„ํ‚คํ…์ฒ˜์  ์ตœ์ ํ™”์— ๋Œ€ํ•ด ์‹ฌ๋„ ์žˆ๊ฒŒ ์กฐ์‚ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [39-41]. -- [[JavaScript Memory Leaks]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ๊ณผ๋„ํ•œ ๋ Œ๋”๋ง ์™ธ์—๋„ ํด๋กœ์ €๋‚˜ ๋ถ„๋ฆฌ๋œ DOM ๋…ธ๋“œ์— ์˜ํ•ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•ด์ œ๋˜์ง€ ์•Š๊ณ  ๋ˆ„์ ๋˜์–ด ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์ผ์œผํ‚ค๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ์‹๋ณ„ ๋ฐ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์œผ๋กœ ์ดํ•ด๋ฅผ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค [42-44]. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/ํ”„๋ก ํŠธ์—”๋“œ ํด๋ผ์šฐ๋“œ ๋กœ๊น… ๋„๊ตฌ ๋„์ž… ๋ฐ ํ”„๋กœ๋•์…˜ ๋ชจ๋‹ˆํ„ฐ๋ง.md b/00_Raw/ํ”„๋ก ํŠธ์—”๋“œ ํด๋ผ์šฐ๋“œ ๋กœ๊น… ๋„๊ตฌ ๋„์ž… ๋ฐ ํ”„๋กœ๋•์…˜ ๋ชจ๋‹ˆํ„ฐ๋ง.md deleted file mode 100644 index a60b2510..00000000 --- a/00_Raw/ํ”„๋ก ํŠธ์—”๋“œ ํด๋ผ์šฐ๋“œ ๋กœ๊น… ๋„๊ตฌ ๋„์ž… ๋ฐ ํ”„๋กœ๋•์…˜ ๋ชจ๋‹ˆํ„ฐ๋ง.md +++ /dev/null @@ -1,69 +0,0 @@ -# [[ํ”„๋ก ํŠธ์—”๋“œ ํด๋ผ์šฐ๋“œ ๋กœ๊น… ๋„๊ตฌ ๋„์ž… ๋ฐ ํ”„๋กœ๋•์…˜ ๋ชจ๋‹ˆํ„ฐ๋ง]] - -## ๐Ÿ“Œ Brief ์ •๋Ÿ‰ Summary -ํ”„๋ก ํŠธ์—”๋“œ ํด๋ผ์šฐ๋“œ ๋กœ๊น… ๋ฐ ํ”„๋กœ๋•์…˜ ๋ชจ๋‹ˆํ„ฐ๋ง์€ ์‹ค์ œ ์‚ฌ์šฉ์ž์˜ ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ, ์„ฑ๋Šฅ ๋ฌธ์ œ, ์‚ฌ์šฉ์ž ์ƒํ˜ธ์ž‘์šฉ์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ถ”์ ํ•˜๊ณ  ๋ถ„์„ํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค [1], [2], [3]. ๋‹จ์ˆœํ•œ `console.log`๋กœ๋Š” ํŒŒ์•…ํ•˜๊ธฐ ํž˜๋“  ๋‹ค์–‘ํ•œ ๋””๋ฐ”์ด์Šค์™€ ๋„คํŠธ์›Œํฌ ์กฐ๊ฑด์˜ ๋ฒ„๊ทธ๋ฅผ ์ง€๋Šฅํ˜• ์—๋Ÿฌ ๊ทธ๋ฃนํ™”, ์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด, ์—”๋“œํˆฌ์—”๋“œ ํŠธ๋ ˆ์ด์‹ฑ ๋“ฑ์˜ ๊ธฐ๋Šฅ์œผ๋กœ ๊ฐ€์‹œํ™”ํ•ฉ๋‹ˆ๋‹ค [2], [4], [5]. Sentry, LogRocket, Datadog, SigNoz ๋“ฑ์˜ ๋„๊ตฌ๋ฅผ ํ†ตํ•ด ํ”„๋ก ํŠธ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ณต์›๋ ฅ์„ ๋†’์ด๊ณ  ์žฅ์• ๋ฅผ ์‹ ์†ํ•˜๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [6], [7], [3]. - -## ๐Ÿ“– Core Content -* **ํ”„๋ก ํŠธ์—”๋“œ ๋กœ๊น…์˜ ํ•„์š”์„ฑ ํ–ฅ์ƒ** - ์ตœ์‹ ์˜ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋ฐฉ๋Œ€ํ•œ ํ™˜๊ฒฝ(๋ธŒ๋ผ์šฐ์ €, ๋””๋ฐ”์ด์Šค, ๋„คํŠธ์›Œํฌ ๋“ฑ)์—์„œ ์‹คํ–‰๋˜๋ฏ€๋กœ, ๋‹จ์ˆœํ•œ `console.log`๋‚˜ ์‚ฌ์šฉ์ž์˜ ์Šคํฌ๋ฆฐ์ƒท๋งŒ์œผ๋กœ๋Š” ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์˜ ์—๋Ÿฌ ๊ทผ๋ณธ ์›์ธ์„ ํŒŒ์•…ํ•˜๊ธฐ ๋ถˆ๊ฐ€๋Šฅ์— ๊ฐ€๊น์Šต๋‹ˆ๋‹ค [1], [2]. -* **์ฃผ์š” ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ ๋ฐ ํŠน์ง•** - * **Sentry:** ๊ฐœ๋ฐœ์ž ์นœํ™”์ ์ธ ์—๋Ÿฌ ์ถ”์  ๋„๊ตฌ๋กœ, ์ง€๋Šฅํ˜• ์—๋Ÿฌ ๊ทธ๋ฃนํ™”(Intelligent error grouping)๋ฅผ ํ†ตํ•ด ์ค‘๋ณต ์—๋Ÿฌ ๋…ธ์ด์ฆˆ๋ฅผ ์ค„์—ฌ์ค๋‹ˆ๋‹ค [4], [3]. ์—๋Ÿฌ ๋ฐœ์ƒ ์ „๊นŒ์ง€์˜ ์ฝ˜์†” ๋กœ๊ทธ, ๋„คํŠธ์›Œํฌ ์š”์ฒญ, ์‚ฌ์šฉ์ž ์ƒํ˜ธ์ž‘์šฉ์„ ๋ณด์—ฌ์ฃผ๋Š” '๋ธŒ๋ ˆ๋“œํฌ๋Ÿผ(Breadcrumb)'์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [4]. - * **LogRocket:** ์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด(Session Replay) ๊ธฐ๋Šฅ์˜ ์„ ๊ตฌ์ž๋กœ, DOM, Redux/Vuex ์ƒํƒœ ๋ณ€ํ™”, ๋„คํŠธ์›Œํฌ ์š”์ฒญ ๋ฐ ์„ฑ๋Šฅ ์ง€ํ‘œ ๋“ฑ ์‚ฌ์šฉ์ž์˜ ์ „์ฒด ์„ธ์…˜์„ ๋…นํ™”ํ•˜๋“ฏ ์บก์ฒ˜ํ•˜์—ฌ ๋ณต์žกํ•œ ๋””๋ฒ„๊น…์— ํƒ์›”ํ•œ ์ปจํ…์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [8], [9]. - * **Datadog RUM:** ํ”„๋ก ํŠธ์—”๋“œ ์—๋Ÿฌ๋ฅผ ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ์„œ๋“œํŒŒํ‹ฐ API๊นŒ์ง€ ์—ฐ๊ฒฐํ•˜์—ฌ ์ถ”์ ํ•  ์ˆ˜ ์žˆ๋Š” ์—”๋“œํˆฌ์—”๋“œ(End-to-End) ๋ถ„์‚ฐ ํŠธ๋ ˆ์ด์‹ฑ์„ ์ œ๊ณตํ•˜์—ฌ, ๋ณต์žกํ•œ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ ๋””๋ฒ„๊น…์— ๊ฐ•๋ ฅํ•ฉ๋‹ˆ๋‹ค [5]. - * **New Relic Browser:** ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ๊ธ‰ ์˜ฌ์ธ์› ๋ชจ๋‹ˆํ„ฐ๋ง ํ”Œ๋žซํผ์œผ๋กœ ํ”„๋ก ํŠธ์—”๋“œ, ๋ฐฑ์—”๋“œ APM, ์ธํ”„๋ผ ๋กœ๊น…์„ ํ•œ ๊ณณ์—์„œ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค [10]. - * **Grafana Frontend Observability & SigNoz:** ๋ฒค๋” ์ข…์†์„ฑ์ด ์—†๋Š” OpenTelemetry ๊ฐœ๋ฐฉํ˜• ํ‘œ์ค€์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค [11], [12]. ํŠนํžˆ SigNoz๋Š” ํ”„๋ก ํŠธ์—”๋“œ ๋กœ๊ทธ์™€ ๋ฐฑ์—”๋“œ ํŠธ๋ ˆ์ด์Šค๋ฅผ ์—ฐ๊ฒฐํ•˜์—ฌ ํ†ตํ•ฉ๋œ ์˜ต์ €๋ฒ„๋นŒ๋ฆฌํ‹ฐ(Unified Observability)๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [12], [13]. -* **์—๋Ÿฌ ๋ฐ”์šด๋”๋ฆฌ์™€์˜ ๊ฒฐํ•ฉ์„ ํ†ตํ•œ ๋ณต์›๋ ฅ ํ™•๋ณด** - ์„ฑ๊ณต์ ์ธ ํ”„๋กœ๋•์…˜ ๋ชจ๋‹ˆํ„ฐ๋ง์€ ์‚ฌํ›„ ๋ถ„์„๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋Ÿฐํƒ€์ž„ ์‹คํŒจ์— ๋Œ€ํ•œ ์‚ฌ์ „ ๋ฐฉ์–ด์™€ ๊ฒฐํ•ฉ๋ฉ๋‹ˆ๋‹ค. React์˜ Error Boundaries๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹จ์ผ ์ปดํฌ๋„ŒํŠธ์˜ ๊ฒฐํ•จ์œผ๋กœ ์ „์ฒด ์•ฑ์ด ํฌ๋ž˜์‹œ๋˜๋Š” ๊ฒƒ์„ ๋ง‰๊ณ , Sentry ๋“ฑ๊ณผ ์—ฐ๋™ํ•˜์—ฌ ์—๋Ÿฌ๋ฅผ ์ฆ‰๊ฐ์ ์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ์— ๋ณด๊ณ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [14], [3], [15], [16]. - -## โš–๏ธ Trade-offs & Caveats -* **์„ฑ๋Šฅ ์˜ํ–ฅ (Performance Impact):** ํ”„๋ก ํŠธ์—”๋“œ ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ์˜ SDK๋Š” ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ๋ฅผ ์ฆ๊ฐ€์‹œ์ผœ ๋กœ๋“œ ์‹œ๊ฐ„์— ์˜ํ–ฅ์„ ์ค๋‹ˆ๋‹ค [17], [18]. ์ผ๋ถ€ ๋„๊ตฌ๋Š” ์ตœ๋Œ€ 120ms์˜ ์ถ”๊ฐ€ ๋กœ๋”ฉ ์‹œ๊ฐ„์„ ๋ฐœ์ƒ์‹œํ‚ค๋ฏ€๋กœ, ๋งค์ดˆ๊ฐ€ ์ค‘์š”ํ•œ e-์ปค๋จธ์Šค ์‚ฌ์ดํŠธ ๋“ฑ์—์„œ๋Š” ๊ฐ€๋ฒผ์šด ๋„๊ตฌ ์„ ํƒ์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค [7]. -* **๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ ๋ฌธ์ œ (Privacy Concerns):** LogRocket๊ณผ ๊ฐ™์ด ์‚ฌ์šฉ์ž์˜ ๋ชจ๋“  ํ™”๋ฉด๊ณผ ์ƒํƒœ๋ฅผ ๊ธฐ๋กํ•˜๋Š” "์ „์ฒด ์บก์ฒ˜(capture everything)" ๋ฐฉ์‹์€ ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•  ์œ„ํ—˜์ด ๋งค์šฐ ํฝ๋‹ˆ๋‹ค [9], [18]. ๋”ฐ๋ผ์„œ ๋ฏผ๊ฐ ์ •๋ณด๋ฅผ ๋งˆ์Šคํ‚นํ•˜๊ธฐ ์œ„ํ•œ ๋ณด์•ˆ/ํ”„๋ผ์ด๋ฒ„์‹œ ์„ค์ •์— ์ƒ๋‹นํ•œ ์‹œ๊ฐ„์ด ์†Œ์š”๋ฉ๋‹ˆ๋‹ค [9], [19]. -* **๋น„์šฉ ๋ฐ ์Šค์ผ€์ผ๋ง (Pricing Reality Check):** ๋‹ค์ˆ˜์˜ SaaS ๋„๊ตฌ๋“ค์€ ํŠธ๋ž˜ํ”ฝ ๊ทœ๋ชจ์— ๋”ฐ๋ผ ๋น„์šฉ์ด ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ Datadog์€ ๋กœ๊ทธ '์ˆ˜์ง‘(Ingest)'๊ณผ '์ƒ‰์ธ(Index)'์„ ๋ณ„๋„๋กœ ์ฒญ๊ตฌํ•˜๋Š” '์ด์ค‘ ์š”๊ธˆ์ œ(two-part tariff)'๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ, ๋น„์šฉ ์ ˆ๊ฐ์„ ์œ„ํ•ด ์ผ๋ถ€ ๋กœ๊ทธ๋งŒ ์ƒ‰์ธํ™”ํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  ์ •์ž‘ ์ค‘์š”ํ•  ๋•Œ ๋””๋ฒ„๊น… ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์ง€ ๋ชปํ•˜๊ฒŒ ํ•˜๋Š” ๋”œ๋ ˆ๋งˆ๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [20], [21]. -* **๋„์ž… ๋ฐ ์„ค์ • ๋ณต์žก์„ฑ:** OpenTelemetry ๊ธฐ๋ฐ˜ ๋„๊ตฌ(Grafana, SigNoz)๋Š” ์žฅ๊ธฐ์ ์ธ ์œ ์—ฐ์„ฑ๊ณผ ๋ฒค๋” ์ข…์†์„ฑ ํƒˆํ”ผ์˜ ์žฅ์ ์ด ์žˆ์œผ๋‚˜, Sentry ๋“ฑ ๋ชฉ์  ๊ธฐ๋ฐ˜ ํŠนํ™” ๋„๊ตฌ์— ๋น„ํ•ด ์ดˆ๊ธฐ ํ•™์Šต ๊ณก์„ ์ด ๊ฐ€ํŒŒ๋ฅด๊ณ  ์ž์ฒด ํ˜ธ์ŠคํŒ… ์‹œ DevOps ์ „๋ฌธ ์ง€์‹์ด ์š”๊ตฌ๋ฉ๋‹ˆ๋‹ค [22], [23], [19]. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -#### [๊ด€๊ณ„ ์œ ํ˜• A (์•„ํ‚คํ…์ฒ˜ ๋ฐ ์›๋ฆฌ)] -- [[Session Replay]] - - ์—ฐ๊ฒฐ ์ด์œ : ๋‹จ์ˆœํ•œ ์—๋Ÿฌ ๋กœ๊ทธ๋ฅผ ๋„˜์–ด DOM, ์ƒํƒœ ๋ณ€๊ฒฝ, ๋„คํŠธ์›Œํฌ ์š”์ฒญ ๋“ฑ ์‚ฌ์šฉ์ž์˜ ์ „์ฒด ์ƒํ˜ธ์ž‘์šฉ์„ ๋…นํ™”ํ•˜์—ฌ ์‹œ๊ฐ์ ์œผ๋กœ ๋ฒ„๊ทธ ๋ฐœ์ƒ ์ˆœ๊ฐ„์„ ์ œ๊ณตํ•˜๋Š” ํ•ต์‹ฌ ๋ชจ๋‹ˆํ„ฐ๋ง ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค [24], [8], [9], [3]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํ”„๋ก ํŠธ์—”๋“œ ๋กœ๊น…์ด ์‚ฌ์šฉ์ž์˜ UI/UX์™€ ์ปดํฌ๋„ŒํŠธ ์ƒ๋ช…์ฃผ๊ธฐ(Lifecycle) ์ƒ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์บก์ฒ˜ํ•˜๊ณ  ํ™œ์šฉํ•˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [24], [9]. -- [[End-to-End Tracing]] - - ์—ฐ๊ฒฐ ์ด์œ : ํ”„๋ก ํŠธ์—”๋“œ์˜ ํŠน์ • ์—๋Ÿฌ๊ฐ€ ๋‹จ์ˆœ ํด๋ผ์ด์–ธํŠธ ๋ฌธ์ œ๊ฐ€ ์•„๋‹Œ ๋ฐฑ์—”๋“œ API, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋“ฑ๊ณผ ์–ด๋–ป๊ฒŒ ์—ฐ๊ด€๋˜๋Š”์ง€ ์‹๋ณ„ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค [5], [25], [12]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Datadog์ด๋‚˜ SigNoz์™€ ๊ฐ™์€ ํ’€์Šคํƒ ์˜ต์ €๋ฒ„๋นŒ๋ฆฌํ‹ฐ ๋„๊ตฌ๊ฐ€ ์‹œ์Šคํ…œ ์ „์ฒด์˜ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ์„ ์–ด๋–ป๊ฒŒ ์ง„๋‹จํ•˜๋Š”์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5], [12]. -- [[OpenTelemetry]] - - ์—ฐ๊ฒฐ ์ด์œ : ํŠน์ • ๋ฒค๋”์— ์ข…์†๋˜์ง€ ์•Š๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ…”๋ ˆ๋ฉ”ํŠธ๋ฆฌ(๋กœ๊ทธ, ๋ฉ”ํŠธ๋ฆญ, ํŠธ๋ ˆ์ด์Šค)๋ฅผ ํ‘œ์ค€ํ™”๋œ ๋ฐฉ์‹์œผ๋กœ ์ˆ˜์ง‘ํ•˜๋Š” ์˜คํ”ˆ ์•„ํ‚คํ…์ฒ˜์ž…๋‹ˆ๋‹ค [11], [12], [13]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ตœ์‹  ํ”„๋ก ํŠธ์—”๋“œ ๋ชจ๋‹ˆํ„ฐ๋ง ์ƒํƒœ๊ณ„์—์„œ ์œ ์—ฐ์„ฑ(Flexibility)์„ ์œ ์ง€ํ•˜๋ฉด์„œ ํ™•์žฅ์„ฑ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌ์ถ•ํ•˜๋Š” ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [11], [13]. - -#### [๊ด€๊ณ„ ์œ ํ˜• B (์˜ค๋ฅ˜ ์ œ์–ด ๋ฐ ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋„๊ตฌ)] -- [[Error Boundaries]] - - ์—ฐ๊ฒฐ ์ด์œ : ๋กœ๊น… ๋„๊ตฌ๊ฐ€ ์—๋Ÿฌ๋ฅผ '์ˆ˜์ง‘'ํ•˜๋Š” ์—ญํ• ์ด๋ผ๋ฉด, Error Boundaries๋Š” ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ ๋ฐœ์ƒ ์‹œ UI ์ „์ฒด์˜ ํฌ๋ž˜์‹œ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ  fallback UI๋ฅผ ๋„์šฐ๋Š” '๋ฐฉ์–ด' ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค [14], [26], [15]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Sentry ๋“ฑ๊ณผ ๊ฒฐํ•ฉํ•˜์—ฌ ํ”„๋กœ๋•์…˜์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํƒ„๋ ฅ์„ฑ(Resilience)๊ณผ ์•ˆ์ •์„ฑ์„ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์žฅํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3], [15], [16]. -- [[JavaScript Memory Leaks]] - - ์—ฐ๊ฒฐ ์ด์œ : ๋กœ๊น… ๋„๊ตฌ๋‚˜ ์„ฑ๋Šฅ ํ”„๋กœํŒŒ์ผ๋Ÿฌ(Chrome DevTools Memory Profiler ๋“ฑ)๋ฅผ ํ†ตํ•ด ์ถ”์ ํ•ด์•ผ ํ•˜๋Š” ๋Œ€ํ‘œ์ ์ธ ํ”„๋ก ํŠธ์—”๋“œ ์„ฑ๋Šฅ ์ €ํ•˜์˜ ์›์ธ์ž…๋‹ˆ๋‹ค [27], [28], [29]. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ฉ”๋ชจ๋ฆฌ ํŒฝ์ฐฝ, ๋ถ„๋ฆฌ๋œ DOM ๋…ธ๋“œ(Detached DOM nodes)์™€ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์‚ฌ์šฉ์ž ํ™˜๊ฒฝ์—์„œ ์–ด๋–ป๊ฒŒ ์„ฑ๋Šฅ ์ง€์—ฐ์ด๋‚˜ ๋ธŒ๋ผ์šฐ์ € ๋ฉˆ์ถค์œผ๋กœ ์ด์–ด์ง€๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [28], [30], [31]. - -### Deeper Research Questions - -- ํ”„๋ก ํŠธ์—”๋“œ ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ์˜ SDK๋ฅผ ๋ฒˆ๋“ค์— ํฌํ•จํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์„ฑ๋Šฅ ์ €ํ•˜(๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ ์ฆ๊ฐ€ ๋ฐ ๋กœ๋”ฉ ์‹œ๊ฐ„ ์ง€์—ฐ)๋ฅผ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•œ Code Splitting ๋ฐ ์ง€์—ฐ ๋กœ๋”ฉ ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? -- Datadog๊ณผ ๊ฐ™์€ ๋ณต์žกํ•œ '์ˆ˜์ง‘/์ƒ‰์ธ ๋ถ„๋ฆฌ(two-part tariff)' ๊ณผ๊ธˆ ๋ชจ๋ธ ํ•˜์—์„œ, ๊ธ‰์ฆํ•˜๋Š” ํ”„๋ก ํŠธ์—”๋“œ ๋กœ๊ทธ ๋น„์šฉ์„ ๊ด€๋ฆฌํ•˜๋ฉด์„œ๋„ ํ•„์ˆ˜ ๊ฐ€์‹œ์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์ตœ์ ์˜ ๋กœ๊ทธ ์ƒ˜ํ”Œ๋ง(Sampling) ๊ธฐ๋ฒ•์€ ์–ด๋–ป๊ฒŒ ์„ค๊ณ„ํ•ด์•ผ ํ•˜๋Š”๊ฐ€? -- Session Replay ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ๋•Œ, ์ „ ์„ธ๊ณ„์ ์ธ ๋ฐ์ดํ„ฐ ํ”„๋ผ์ด๋ฒ„์‹œ ๊ทœ์ œ(์˜ˆ: GDPR)์— ๋Œ€์‘ํ•˜๊ธฐ ์œ„ํ•ด DOM ์š”์†Œ ๋‚ด์˜ ๋ฏผ๊ฐํ•œ ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๋ฅผ ํ”„๋ก ํŠธ์—”๋“œ๋‹จ์—์„œ ์–ด๋–ป๊ฒŒ ํšจ์œจ์ ์œผ๋กœ ๋งˆ์Šคํ‚น(Masking)ํ•˜๋Š”๊ฐ€? -- OpenTelemetry ํ‘œ์ค€์„ ํ”„๋ก ํŠธ์—”๋“œ์— ์ ์šฉํ•˜์—ฌ ์ƒ์„ฑ๋œ Trace ID๋Š” ๋ฐฑ์—”๋“œ์˜ ๋ถ„์‚ฐ ํŠธ๋ ˆ์ด์Šค(Distributed Trace) ๋ฐ์ดํ„ฐ์™€ ๋„คํŠธ์›Œํฌ ๊ณ„์ธต์—์„œ ์–ด๋–ป๊ฒŒ ์ƒํ˜ธ ์—ฐ๊ฒฐ ๋ฐ ๋™๊ธฐํ™”๋˜๋Š”๊ฐ€? -- React Error Boundary ๋‚ด๋ถ€์—์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†๋Š” ๋น„๋™๊ธฐ ํ†ต์‹ (Promise)์ด๋‚˜ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ๋‚ด๋ถ€์˜ ์—๋Ÿฌ๋Š” Sentry ๋“ฑ์˜ ๊ธ€๋กœ๋ฒŒ ๋กœ๊น… ๋„๊ตฌ๋กœ ์–ด๋–ป๊ฒŒ ์šฐํšŒํ•˜์—ฌ ํฌ์ฐฉ(Catch)ํ•˜๋Š”๊ฐ€? - -### Practical Application Contexts - -- **Implementation:** Next.js ๋“ฑ์˜ ํ”„๋ก ํŠธ์—”๋“œ ํ”„๋กœ์ ํŠธ์— Sentry๋‚˜ LogRocket SDK๋ฅผ ํ†ตํ•ฉ ์ดˆ๊ธฐํ™”ํ•˜๊ณ , React ํŠธ๋ฆฌ์— Error Boundary ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฐ์‹ธ ์—๋Ÿฌ ์บ์น˜ ์‹œ ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ๋กœ ์ž๋™ ์ „์†ก๋˜๋„๋ก ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค [24], [9], [14], [16]. -- **System Design:** ๋‹จ์ผ ์„œ๋น„์Šค๊ฐ€ ์•„๋‹Œ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜(MSA) ๊ตฌ์กฐ์ธ ๊ฒฝ์šฐ, ๋‹จ์ˆœ ์—๋Ÿฌ ๋กœ๊น…(Sentry)๋ณด๋‹ค๋Š” SigNoz๋‚˜ Datadog RUM์„ ์ฑ„ํƒํ•ด ํ”„๋ก ํŠธ์—”๋“œ ์•ก์…˜๋ถ€ํ„ฐ ๋ฐฑ์—”๋“œ DB ์ฟผ๋ฆฌ๊นŒ์ง€ ์ด์–ด์ง€๋Š” ์—”๋“œํˆฌ์—”๋“œ ํŠธ๋ ˆ์ด์‹ฑ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค [5], [13]. -- **Operation / Maintenance:** ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ ์šด์˜ ์‹œ Sentry์˜ ์ง€๋Šฅํ˜• ์—๋Ÿฌ ๊ทธ๋ฃนํ™”๋ฅผ ํ†ตํ•ด ์Šฌ๋ž™(Slack) ์•Œ๋žŒ์˜ ๋…ธ์ด์ฆˆ๋ฅผ ์ค„์ด๊ณ , ์„ฑ๋Šฅ ์ด์Šˆ ๋ฆฌํฌํŠธ ์ ‘์ˆ˜ ์‹œ LogRocket์˜ ์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด๋กœ ์‚ฌ์šฉ์ž ํ–‰๋™์„ ์žฌํ˜„ํ•ด ์›์ธ์„ ํŒŒ์•…ํ•ฉ๋‹ˆ๋‹ค [4], [8], [3]. -- **Learning Path:** ์ฒ˜์Œ์—” Chrome DevTools์˜ Console๊ณผ Memory ํƒญ์„ ํ™œ์šฉํ•ด ๋กœ์ปฌ ๋””๋ฒ„๊น… ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ [32], [29] ์›๋ฆฌ๋ฅผ ํ•™์Šตํ•˜๊ณ , ์ดํ›„ React์˜ Error Boundaries๋ฅผ ํ™œ์šฉํ•œ ์žฅ์•  ๊ฒฉ๋ฆฌ [26], ์ตœ์ข…์ ์œผ๋กœ SaaS ๊ธฐ๋ฐ˜ ํด๋ผ์šฐ๋“œ ๋กœ๊น… ๋„๊ตฌ ํ†ตํ•ฉ์œผ๋กœ ๋‚˜์•„๊ฐ‘๋‹ˆ๋‹ค. -- **My Project Relevance:** ํŒ€์˜ ์˜ˆ์‚ฐ๊ณผ ๊ฐœ๋ฐœ ์—ฌ๋ ฅ์— ๋”ฐ๋ผ ๋กœ๊น… ํˆด์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์ดˆ๊ธฐ ์Šคํƒ€ํŠธ์—…์ด๋‚˜ ์†Œ๊ทœ๋ชจ ํŒ€์€ Sentry์˜ ๋„‰๋„‰ํ•œ ๋ฌด๋ฃŒ ํ‹ฐ์–ด(์›” 5๋งŒ ๊ฐœ ์—๋Ÿฌ)๋ฅผ ์ฑ„ํƒํ•˜๊ณ , ๋น„์šฉ ํ†ต์ œ์™€ ๋ฐ์ดํ„ฐ ์†Œ์œ ๊ฐ€ ์ค‘์š”ํ•˜๋‹ค๋ฉด SigNoz ๋“ฑ OpenTelemetry ์ž๊ฐ€ ํ˜ธ์ŠคํŒ… ์˜ต์…˜์„ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [17], [12], [33]. - -### Adjacent Topics - -- [[Core Web Vitals]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ํ”„๋ก ํŠธ์—”๋“œ ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ๋“ค์ด ๋‹จ์ˆœ ์—๋Ÿฌ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ์ง€ํ‘œ์ธ LCP, FID, CLS ๋“ฑ์„ ์–ด๋–ป๊ฒŒ ์ธก์ •ํ•˜๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ ์ตœ์ ํ™”(Performance Optimization)๋กœ ์—ฐ๊ฒฐํ•˜๋Š”์ง€ ํ•™์Šตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [34], [35], [36]. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/ํ™•์žฅ ๊ฐ€๋Šฅํ•œ React ์•„ํ‚คํ…์ฒ˜ ๋ฐ ํด๋” ๊ตฌ์กฐ ์„ค๊ณ„.md b/00_Raw/ํ™•์žฅ ๊ฐ€๋Šฅํ•œ React ์•„ํ‚คํ…์ฒ˜ ๋ฐ ํด๋” ๊ตฌ์กฐ ์„ค๊ณ„.md deleted file mode 100644 index 358b60e0..00000000 --- a/00_Raw/ํ™•์žฅ ๊ฐ€๋Šฅํ•œ React ์•„ํ‚คํ…์ฒ˜ ๋ฐ ํด๋” ๊ตฌ์กฐ ์„ค๊ณ„.md +++ /dev/null @@ -1,73 +0,0 @@ -# [[ํ™•์žฅ ๊ฐ€๋Šฅํ•œ React ์•„ํ‚คํ…์ฒ˜ ๋ฐ ํด๋” ๊ตฌ์กฐ ์„ค๊ณ„]] - -## ๐Ÿ“Œ Brief Summary -ํ™•์žฅ ๊ฐ€๋Šฅํ•œ React ์•„ํ‚คํ…์ฒ˜ ๋ฐ ํด๋” ๊ตฌ์กฐ ์„ค๊ณ„๋ž€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์„ฑ์žฅํ•จ์— ๋”ฐ๋ผ ๋ฐœ์ƒํ•˜๋Š” ๋ณต์žก์„ฑ์„ ์ œ์–ดํ•˜๊ณ , ์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ํŒ€ ํ˜‘์—… ํšจ์œจ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ์ฝ”๋“œ๋ฅผ ๋…ผ๋ฆฌ์ ์ด๊ณ  ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๊ฒŒ ์กฐ์งํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๊ธฐ์กด์˜ ํŒŒ์ผ ์œ ํ˜•๋ณ„ ๋ถ„๋ฅ˜๋ฅผ ๋„˜์–ด, ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ์„ ์ค‘์‹ฌ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๊ทธ๋ฃนํ™”ํ•˜๋Š” '๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜(Feature-Based)' ๊ตฌ์กฐ์™€ ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ์„ ๊ฐ•์ œํ•˜๋Š” 'Feature-Sliced Design (FSD)' ๊ฐ™์€ ๊ณ„์ธต์  ๋ชจ๋ธ์ด ๋„๋ฆฌ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ปดํฌ๋„ŒํŠธ ๊ฐ„์˜ ๊ฐ•ํ•œ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ณ , ๊ฐ ๊ธฐ๋Šฅ์˜ ๋…๋ฆฝ์ ์ธ ๊ฐœ๋ฐœ๊ณผ ์•ˆ์ „ํ•œ ๋ฆฌํŒฉํ† ๋ง์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - -## ๐Ÿ“– Core ์†Œ์Šค์— ๊ธฐ๋ฐ˜ํ•œ Core Content -* **ํด๋” ๊ตฌ์กฐ์˜ ์ง„ํ™”์™€ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ/๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ์ ‘๊ทผ** - ์ดˆ๊ธฐ React ํ”„๋กœ์ ํŠธ๋Š” `components`, `hooks`, `styles`์™€ ๊ฐ™์ด ๊ธฐ์ˆ ์  ํŒŒ์ผ ์œ ํ˜•์— ๋”ฐ๋ผ ํด๋”๋ฅผ ๋‚˜๋ˆ„๋Š” ๋ฐฉ์‹์ด ํ”ํ–ˆ์œผ๋‚˜, ์•ฑ์ด ํ™•์žฅ๋˜๋ฉด ๊ด€๋ จ๋œ ๊ธฐ๋Šฅ ๋กœ์ง์ด ์—ฌ๋Ÿฌ ํด๋”์— ํŒŒํŽธํ™”๋˜์–ด ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ๋งค์šฐ ์–ด๋ ค์›Œ์ง‘๋‹ˆ๋‹ค. 2025๋…„ ๊ธฐ์ค€ ๊ถŒ์žฅ๋˜๋Š” ๋ฐฉ์‹์€ ๊ธฐ๋Šฅ(Feature)์ด๋‚˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ์„ ์ค‘์‹ฌ์œผ๋กœ ์กฐ์งํ•˜๋Š” ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ํ˜น์€ ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด `/features/auth` ํด๋” ๋‚ด๋ถ€์— ํ•ด๋‹น ๊ธฐ๋Šฅ์˜ ์ปดํฌ๋„ŒํŠธ, ํ›…, API ๋กœ์ง, ํƒ€์ž… ์ •์˜ ๋“ฑ์„ ์‘์ง‘์‹œ์ผœ ๋…๋ฆฝ์ ์ธ ๋ชจ๋“ˆ์ฒ˜๋Ÿผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ณต์œ ๋˜๋Š” UI ์ปดํฌ๋„ŒํŠธ๋‚˜ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋Š” `/components`, `/utils` ๋“ฑ์— ๋ณ„๋„๋กœ ๋‘ก๋‹ˆ๋‹ค. -* **Feature-Sliced Design (FSD) ๋ฐฉ๋ฒ•๋ก ** - FSD๋Š” ํ”„๋ก ํŠธ์—”๋“œ ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•œ ๋ช…ํ™•ํ•˜๊ณ  ๊ฐ•์ œ๋ ฅ ์žˆ๋Š” ๊ณ„์ธตํ˜• ์•„ํ‚คํ…์ฒ˜์ž…๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ๋ฒ”์œ„์™€ ์ฑ…์ž„์— ๋”ฐ๋ผ `app`(๊ธ€๋กœ๋ฒŒ ์„ค์ •), `pages`(๋ผ์šฐํŒ…), `widgets`(๋…๋ฆฝ์  UI ๋ธ”๋ก), `features`(์‚ฌ์šฉ์ž ์ƒํ˜ธ์ž‘์šฉ ๋ฐ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง), `entities`(ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋ชจ๋ธ), `shared`(์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์œ ํ‹ธ๋ฆฌํ‹ฐ) ๋“ฑ 6๊ฐ€์ง€ ๋ ˆ์ด์–ด๋กœ ๋‚˜๋ˆ•๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ทœ์น™์€ '๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ'์œผ๋กœ, ์ƒ์œ„ ๋ ˆ์ด์–ด๋Š” ํ•˜์œ„ ๋ ˆ์ด์–ด๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํ•˜์œ„ ๋ ˆ์ด์–ด๋Š” ์ƒ์œ„ ๋ ˆ์ด์–ด๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ฐ ์Šฌ๋ผ์ด์Šค๋Š” `index.ts`๋ฅผ ํ†ตํ•œ 'Public API'๋งŒ์„ ๋…ธ์ถœํ•˜์—ฌ ๋‚ด๋ถ€ ๊ตฌํ˜„์„ ์บก์Аํ™”ํ•ฉ๋‹ˆ๋‹ค. -* **๊ด€์‹ฌ์‚ฌ ๋ถ„๋ฆฌ์™€ ์ƒํƒœ ๋ฐ ์„ฑ๋Šฅ ๊ด€๋ฆฌ** - ๊ทœ๋ชจ๊ฐ€ ํฐ ์‹œ์Šคํ…œ์—์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ UI๋ฅผ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค. ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ์— ์žˆ์–ด์„œ, ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ณ€๊ฒฝ๋˜๋Š” ์ƒํƒœ(์˜ˆ: ์žฅ๋ฐ”๊ตฌ๋‹ˆ, ์•Œ๋ฆผ)๋ฅผ ๋‹ค๋ฃฐ ๋•Œ React์˜ ๋‚ด์žฅ Context API๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ตฌ๋… ์ค‘์ธ ๋ชจ๋“  ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ฆฌ๋ Œ๋”๋ง๋˜๋Š” ์„ฑ๋Šฅ ๋ณ‘๋ชฉ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด Zustand๋‚˜ Redux ๊ฐ™์€ ํŠนํ™”๋œ ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•ด ์„ ํƒ์  ๋ฆฌ๋ Œ๋”๋ง(Selector Pattern)์„ ์ ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„์—์„œ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐ์ดํ„ฐ ์ƒํƒœ์˜ ๊ฒฝ์šฐ, TanStack Query์™€ ๊ฐ™์€ ์ „์šฉ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ์™€ ์—„๊ฒฉํžˆ ๋ถ„๋ฆฌํ•˜์—ฌ `/features` ๋‚ด๋ถ€์— ์œ„์น˜์‹œํ‚ต๋‹ˆ๋‹ค. -* **๋ช…๋ช… ๊ทœ์น™(Naming Conventions)๊ณผ ๊ฑฐ๋ฒ„๋„Œ์Šค** - ํŒŒ์ผ ๋ฐ ํด๋” ์ด๋ฆ„์„ ์ผ๊ด€๋˜๊ฒŒ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ํ˜‘์—… ์‹œ ํ˜ผ๋ž€์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. React ์ปดํฌ๋„ŒํŠธ ํŒŒ์ผ์€ `PascalCase`(`UserProfile.tsx`)๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ, ์ผ๋ฐ˜ ํŒŒ์ผ๊ณผ ํด๋”๋ช…์€ OS ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด `kebab-case`(`user-profile`)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ชจ๋ฒ” ์‚ฌ๋ก€๋กœ ๊ผฝํž™๋‹ˆ๋‹ค. ์ปค์Šคํ…€ ํ›…๊ณผ ๋ณ€์ˆ˜๋Š” `camelCase`(`useAuth`)๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ทœ์น™๊ณผ ์˜์กด์„ฑ ๊ทœ์น™์€ ์ˆ˜๋™์ด ์•„๋‹Œ ESLint ๋“ฑ ๋ฆฐํŒ… ๋„๊ตฌ๋ฅผ ํ†ตํ•ด ์ž๋™ํ™”ํ•˜์—ฌ ๊ฑฐ๋ฒ„๋„Œ์Šค๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. -* **ํด๋ฆฐ ์ฝ”๋“œ์™€ ์†Œํ”„ํŠธ์›จ์–ด ์—”์ง€๋‹ˆ์–ด๋ง ์›์น™ (SOLID ๋“ฑ)** - React ์ฝ”๋“œ์— ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)์„ ์ ์šฉํ•˜์—ฌ 300์ค„์ด ๋„˜์–ด๊ฐ€๋Š” ๋‹ค๊ธฐ๋Šฅ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ž‘๊ฒŒ ์ชผ๊ฐœ๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ณต๋˜๋Š” ๋กœ์ง์€ DRY ์›์น™์„ ํ†ตํ•ด ์ปค์Šคํ…€ ํ›…์œผ๋กœ ์ถ”์ถœํ•˜๋˜, ๊ณผ๋„ํ•œ ์ถ”์ƒํ™”๊ฐ€ ์˜คํžˆ๋ ค ์ฝ”๋“œ์˜ ์ง๊ด€์„ฑ์„ ํ•ด์น˜์ง€ ์•Š๋„๋ก KISS ์›์น™์„ ์ค€์ˆ˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, YAGNI ์›์น™์— ๋”ฐ๋ผ ๋ฏธ๋ž˜๋ฅผ ๋Œ€๋น„ํ•œ ๋ถˆํ•„์š”ํ•œ ํ™•์žฅ ๊ธฐ๋Šฅ ๊ตฌํ˜„์„ ํ”ผํ•˜์—ฌ ์ฝ”๋“œ ๋ณต์žก๋„๋ฅผ ๋‚ฎ์ถฐ์•ผ ํ•ฉ๋‹ˆ๋‹ค. - -## โš–๏ธ Trade-offs & Caveats -* **๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ(FSD ๋“ฑ)์˜ ๋„์ž… ์˜ค๋ฒ„ํ—ค๋“œ** - FSD๋‚˜ ๊ธฐ๋Šฅ ์ค‘์‹ฌ์˜ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ๋Š” ๋ชจ๋“ˆ์„ฑ ์ธก๋ฉด์—์„œ ๊ฐ•๋ ฅํ•˜์ง€๋งŒ, ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๊ณผ๋„ํ•œ ์„ค์ •(Overkill)๊ณผ ๋ถˆํ•„์š”ํ•œ ๊ณ„์ธต ๋ถ„๋ฆฌ๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ๋ชจ๋“ˆ์ด "๊ธฐ๋Šฅ(Feature)"์ธ์ง€ "์œ„์ ฏ(Widget)"์ธ์ง€ ๊ตฌ๋ณ„ํ•˜๋Š” ๋“ฑ ๊ฒฝ๊ณ„๋ฅผ ๋‚˜๋ˆ„๊ธฐ ๋ชจํ˜ธํ•œ ๊ต์ฐจ ๊ด€์‹ฌ์‚ฌ(Cross-cutting concerns) ์ฒ˜๋ฆฌ์—์„œ ํŒ€ ๋‚ด ๋…ผ์Ÿ๊ณผ ์˜๋ฏธ๋ก ์  ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒ€ ์ „์ฒด๊ฐ€ ์•„ํ‚คํ…์ฒ˜ ๊ทœ์น™์„ ์™„๋ฒฝํžˆ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๋ฉด, ๊ฒฐ๊ตญ ๊ทœ์น™์„ ์šฐํšŒํ•˜๊ธฐ ์œ„ํ•ด `/shared` ๋””๋ ‰ํ† ๋ฆฌ์— ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ๋คํ”„ํ•ด๋ฒ„๋ฆฌ๋Š” ํ˜ผ๋ž€์ด ๋ฐœ์ƒํ•  ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. -* **์ถ”์ƒํ™”์˜ ๋”œ๋ ˆ๋งˆ (DRY vs KISS)** - ์ฝ”๋“œ์˜ ์ค‘๋ณต์„ ์—†์• ๊ธฐ ์œ„ํ•ด(DRY) ๋ฌด์กฐ๊ฑด์ ์œผ๋กœ ์ปค์Šคํ…€ ํ›…์ด๋‚˜ ๊ณ ์ฐจ ์ปดํฌ๋„ŒํŠธ(HOC)๋กœ ๋กœ์ง์„ ์ถ”์ถœํ•˜๋‹ค ๋ณด๋ฉด, ์˜คํžˆ๋ ค ๋กœ์ง์„ ์ถ”์ ํ•˜๊ธฐ ์–ด๋ ค์›Œ์ง€๊ณ  ์ดํ•ดํ•˜๊ธฐ ๋ณต์žกํ•ด์ ธ์„œ "๊ฐ„๊ฒฐํ•จ์„ ์œ ์ง€ํ•˜๋ผ(KISS)"๋Š” ์›์น™์„ ์œ„๋ฐ˜ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ „๋ฌธ๊ฐ€๋“ค์€ ์ถ”์ƒํ™”๋ฅผ ์„œ๋‘๋ฅด์ง€ ๋ง๊ณ  ๋™์ผํ•œ ํŒจํ„ด์ด ์ตœ์†Œ 3๋ฒˆ ์ด์ƒ ๋ฐ˜๋ณต๋  ๋•Œ ์ถ”์ถœํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. -* **์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ ๋„์ž…์— ๋”ฐ๋ฅธ ๋ณต์žก์„ฑ ์ฆ๊ฐ€** - 0KB์˜ ๋‚ด์žฅ ๋„๊ตฌ์ธ Context API๋Š” ์ž‘๊ณ  ์ •์ ์ธ ์ƒํƒœ(ํ…Œ๋งˆ ๋“ฑ) ๊ด€๋ฆฌ์— ๊ฐ„ํŽธํ•˜์ง€๋งŒ, ๋ Œ๋”๋ง ์„ฑ๋Šฅ ์ตœ์ ํ™”๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Zustand๋‚˜ Redux ๊ฐ™์€ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ”„๋กœ์ ํŠธ ํด๋”(`store/`)์— ๋„์ž…ํ•˜๋ฉด ์„ฑ๋Šฅ ๋ฌธ์ œ๋Š” ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์œผ๋‚˜, ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ์˜์กด์„ฑ์ด ์ƒ๊ธฐ๋ฉฐ ์ƒํƒœ ์Šฌ๋ผ์ด์Šค์˜ ๋ชจ๋“ˆํ™”, ์„ ํƒ์ž(Selector) ์ž‘์„ฑ ๋“ฑ์—์„œ ํŒ€์˜ ๊ฐœ๋ฐœ ๊ทœ์œจ(ํ•™์Šต ๊ณก์„  ๋ฐ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ)์ด ๋ถ€๊ฐ€์ ์œผ๋กœ ์š”๊ตฌ๋ฉ๋‹ˆ๋‹ค. - -## ๐Ÿ”— Knowledge Connections - -### Related Concepts - -#### [๊ด€๊ณ„ ์œ ํ˜•: ์•„ํ‚คํ…์ฒ˜ ๋ฐฉ๋ฒ•๋ก ] -- [[Feature-Sliced Design (FSD)]] - - ์—ฐ๊ฒฐ ์ด์œ : ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ํ”„๋ก ํŠธ์—”๋“œ๋ฅผ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•ด ๊ณ ์•ˆ๋œ ๊ตฌ์ฒด์ ์ด๊ณ  ์ตœ์‹ ํ™”๋œ ๋””๋ ‰ํ† ๋ฆฌ ์•„ํ‚คํ…์ฒ˜ ํŒจ๋Ÿฌ๋‹ค์ž„์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ ˆ์ด์–ด(Layers), ์Šฌ๋ผ์ด์Šค(Slices), ์„ธ๊ทธ๋จผํŠธ(Segments)์˜ ๊ตฌ๋ถ„, ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ๊ฐ•์ œ, Public API ์บก์Аํ™”๋ฅผ ํ†ตํ•œ ๋„๋ฉ”์ธ ๋ถ„๋ฆฌ ์ „๋žต. - -#### [๊ด€๊ณ„ ์œ ํ˜•: ์†Œํ”„ํŠธ์›จ์–ด ์„ค๊ณ„ ๋ฐ ์ตœ์ ํ™” ์›์น™] -- [[SOLID ๋ฐ Clean Code ์›์น™]] - - ์—ฐ๊ฒฐ ์ด์œ : ์ปดํฌ๋„ŒํŠธ๋ฅผ ์„ค๊ณ„ํ•˜๊ณ  ๋ฆฌํŒฉํ† ๋งํ•  ๋•Œ ํด๋”์™€ ํŒŒ์ผ์˜ ์ฑ…์ž„์„ ๋‚˜๋ˆ„๋Š” ๊ธฐ๋ฐ˜ ์ง€์นจ์ด ๋ฉ๋‹ˆ๋‹ค. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)์„ ํ†ตํ•œ ๋Œ€ํ˜• ์ปดํฌ๋„ŒํŠธ์˜ ๋ถ„ํ•ด, DRY/KISS ์›์น™์„ ํ†ตํ•œ ์ ์ ˆํ•œ ํ›… ์ถ”์ƒํ™”์˜ ๊ท ํ˜•์ . - -- [[์ž๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ (React Compiler)]] - - ์—ฐ๊ฒฐ ์ด์œ : ์ž˜ ์„ค๊ณ„๋œ ์•„ํ‚คํ…์ฒ˜ ๋‚ด์—์„œ๋„ ๋ Œ๋”๋ง ํญํฌ๋ฅผ ๋ง‰๋Š” ๊ฒƒ์€ ํ•„์ˆ˜์ ์ธ๋ฐ, ์ด๋ฅผ ์‹œ์Šคํ…œ์ ์œผ๋กœ ์ตœ์ ํ™”ํ•˜๋Š” 2025๋…„ ์ฃผ์š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜(`useMemo`, `useCallback`)์˜ ํ•œ๊ณ„ ๋ฐ ์ฝ”๋“œ ๋ณต์žก์„ฑ ๋ฌธ์ œ, ์ปดํฌ๋„ŒํŠธ๊ฐ€ React ๊ทœ์น™(Rules of React)์„ ์—„๊ฒฉํžˆ ์ค€์ˆ˜ํ•ด์•ผ ํ•˜๋Š” ์ด์œ . - -#### [๊ด€๊ณ„ ์œ ํ˜•: ์ƒํƒœ ๋ฐ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ ๋„๊ตฌ] -- [[Zustand ๋ฐ Redux]] - - ์—ฐ๊ฒฐ ์ด์œ : ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ๋Š” ๋ฆฌ์•กํŠธ ์•„ํ‚คํ…์ฒ˜์—์„œ `/store` ๋˜๋Š” ๊ฐ ๋„๋ฉ”์ธ ๊ธฐ๋Šฅ ๋‚ด์˜ ํ•ต์‹ฌ ๋ ˆ์ด์–ด๋ฅผ ๊ตฌ์„ฑํ•˜๋ฉฐ, ์‹œ์Šคํ…œ ๊ฒฐํ•ฉ๋„๋ฅผ ๊ฒฐ์ •์ง“๋Š” ์š”์†Œ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. - - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Context API์˜ ์ „์ฒด ๋ฆฌ๋ Œ๋”๋ง ๋ฌธ์ œ ํ•ด๊ฒฐ ๋ฐฉ์‹, ์ปดํฌ๋„ŒํŠธ ์™ธ๋ถ€์—์„œ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜์—ฌ ์•„ํ‚คํ…์ฒ˜ ์„ฑ๋Šฅ์„ ์œ ์ง€ํ•˜๋Š” ๊ตฌ์ฒด์  ๋ฐฉ๋ฒ•. - -### Deeper Research Questions - -- ๋‹จ์ผ ํ”„๋ก ํŠธ์—”๋“œ ๋ชจ๋…ธ๋ ˆํฌ์—์„œ FSD(Feature-Sliced Design)๋ฅผ ๋„์ž…ํ•  ๋•Œ, ๊ธฐ๋Šฅ ๊ฐ„ '๊ณต์œ  ๊ด€์‹ฌ์‚ฌ(Cross-cutting concerns)'๋ฅผ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌํ•˜๊ณ  ๋ ˆ์ด์–ด ์—ญ์ฐธ์กฐ๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด ESLint ๊ทœ์น™์„ ์–ด๋–ป๊ฒŒ ๊ตฌ์ฒด์ ์œผ๋กœ ์„ธํŒ…ํ•ด์•ผ ํ•˜๋Š”๊ฐ€? -- ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ(Context API, Zustand, Redux)์˜ ์„ ํƒ์ด ํ”„๋กœ์ ํŠธ์˜ ์‹ค์ œ ํด๋” ํŠธ๋ฆฌ ๊ตฌ์„ฑ(์˜ˆ: ๋‹จ์ผ `/store` ํด๋” ์‚ฌ์šฉ vs `/features/auth` ๋‚ด ์Šฌ๋ผ์ด์Šค๋กœ ๋ถ„์‚ฐ ๋ฐฐ์น˜)์— ์–ด๋– ํ•œ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋ฉฐ, ๋Œ€๊ทœ๋ชจ ์•ฑ์—์„œ์˜ ๋ชจ๋ฒ” ์‚ฌ๋ก€๋Š” ๋ฌด์—‡์ธ๊ฐ€? -- ํ™•์žฅ์„ฑ์ด ํฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ผ์šฐํŠธ ๋ ˆ๋ฒจ์˜ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…(Code Splitting)๊ณผ `React.lazy`๋ฅผ ์ ์šฉํ•  ๋•Œ, Vite์˜ `manualChunks`๋ฅผ ํ™œ์šฉํ•ด ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(Vendor)๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ๋นŒ๋“œ ์ตœ์ ํ™” ์„ค์ • ๋ฐฉ๋ฒ•๋ก ์€ ๋ฌด์—‡์ธ๊ฐ€? -- ์ปดํฌ๋„ŒํŠธ์˜ ์ฑ…์ž„์„ ๋ถ„๋ฆฌ(SRP)ํ•˜๊ธฐ ์œ„ํ•ด ๊ฑฐ๋Œ€ํ•œ ๋กœ์ง์„ Custom Hooks๋กœ ์ถ”์ถœํ•  ๋•Œ, ๊ณผ๋„ํ•œ ์ถ”์ƒํ™”(DRY)์™€ ์ฝ”๋“œ์˜ ์ง๊ด€์„ฑ(KISS) ๊ฐ„์˜ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๋ฅผ ํ‰๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์ฒด์  ์ฝ”๋“œ ์ง€ํ‘œ๋Š” ๋ฌด์—‡์ธ๊ฐ€? -- ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์•ˆ์ •์„ฑ์„ ํ™•๋ณดํ•˜๊ธฐ ์œ„ํ•ด React Error Boundaries๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ, ์•ฑ ์ „์ฒด๋ฅผ ๋‹จ์ผ๋กœ ๊ฐ์‹ธ๋Š” ๋ฐฉ์‹๊ณผ ๊ฐ ๊ธฐ๋Šฅ๋ณ„(์œ„์ ฏ/๋ผ์šฐํŠธ ๋“ฑ)๋กœ ์ชผ๊ฐœ์–ด ๊ฐ์‹ธ๋Š” ๋ฐฉ์‹์ด ์•„ํ‚คํ…์ฒ˜ ๊ตฌ์กฐ ์„ค๊ณ„์— ์–ด๋–ป๊ฒŒ ๋ฐ˜์˜๋˜์–ด์•ผ ํ•˜๋Š”๊ฐ€? - -### Practical Application Contexts - -- **Implementation:** React ์ปดํฌ๋„ŒํŠธ๋ช…์€ `PascalCase`๋กœ ์ง“๊ณ , ํด๋”์™€ ํŒŒ์ผ๋ช…์€ ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด `kebab-case`๋กœ ๋ช…๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋Šฅ ๋กœ์ง์€ `features` ํด๋” ๋‚ด์— ๋ฐฐ์น˜ํ•˜๊ฑฐ๋‚˜ `hooks` ํด๋”์— ๋ถ„๋ฆฌํ•˜์—ฌ ๋ฐ˜๋ณต์„ ์ค„์ด๊ณ  ์ฝ”๋“œ ์‘์ง‘๋ ฅ์„ ๋†’์ด๋„๋ก ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. -- **System Design:** ์ฝ”๋“œ๋ฅผ ํŒŒ์ผ ์œ ํ˜•(์ปดํฌ๋„ŒํŠธ, ํ›… ๋“ฑ)์ด ์•„๋‹Œ ๋น„์ฆˆ๋‹ˆ์Šค ํ๋ฆ„๊ณผ ๋„๋ฉ”์ธ(Auth, Dashboard ๋“ฑ)์— ๋งž์ถ”์–ด ์„ค๊ณ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ ๊ณ„์ธต์€ ํ•˜์œ„ ์ธํ”„๋ผ/๋„๋ฉ”์ธ ๊ณ„์ธต์—๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ์˜์กด์„ฑ ํ๋ฆ„์„ ์„ค๊ณ„์— ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค. -- **Operation / Maintenance:** ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ถ„ํ• ๋œ ํด๋” ๊ตฌ์กฐ๋Š” ํŠน์ • ๊ธฐ๋Šฅ(์˜ˆ: ๊ฒฐ์ œ ํ”„๋กœ์„ธ์Šค)์— ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฑฐ๋‚˜ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ํ•„์š”ํ•  ๋•Œ, ํ•ด๋‹น ๋„๋ฉ”์ธ ํด๋” ํ•˜๋‚˜๋งŒ ์ง‘์ค‘ ๋ถ„์„ํ•˜๋ฉด ๋˜๋ฏ€๋กœ ๋ณ€๊ฒฝ์— ๋”ฐ๋ฅธ ๋ถ€์ž‘์šฉ(Side Effect) ์ถ”์  ๋ฐ ๋””๋ฒ„๊น… ์šด์˜์ด ํ›จ์”ฌ ์ˆ˜์›”ํ•ด์ง‘๋‹ˆ๋‹ค. -- **Learning Path:** ๋ฆฌ์•กํŠธ๋ฅผ ์ฒ˜์Œ ๋ฐฐ์šธ ๋•Œ๋Š” Flat ๊ตฌ์กฐ๋‚˜ `components`, `hooks`๋ฅผ ๋‚˜๋ˆ„๋Š” ํŒŒ์ผ ์œ ํ˜• ๊ธฐ๋ฐ˜์œผ๋กœ ์‹œ์ž‘ํ•˜์ง€๋งŒ, ์ดํ›„ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์ด๋‚˜ ๋ณต์žก์„ฑ ๋ฌธ์ œ์— ์ง๋ฉดํ•˜๋ฉด FSD ์•„ํ‚คํ…์ฒ˜๋‚˜ Zustand ๊ฐ™์€ ์ „์—ญ ์ƒํƒœ์˜ ์—ญํ•  ๋ฒ”์œ„๋ฅผ ์ œํ•œํ•˜๋Š” ๊ณ ๋„ํ™”๋œ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„๋กœ ๋ฐœ์ „์‹œ์ผœ ๋‚˜๊ฐ€๋Š” ๊ฒฝ๋กœ๊ฐ€ ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค. -- **My Project Relevance:** ์†Œ์Šค์— ๊ด€๋ จ ์ •๋ณด๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. (์งˆ๋ฌธ์ž์˜ ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ์™€ ๊ด€๋ จ๋œ ๋ช…์‹œ์  ๋งฅ๋ฝ์ด ์†Œ์Šค ๋ฐ์ดํ„ฐ์— ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.) - -### Adjacent Topics - -- [[๋งˆ์ดํฌ๋กœ ํ”„๋ก ํŠธ์—”๋“œ (Micro-Frontends)]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋‹จ์ผ ๋ฆฌ์•กํŠธ ์•ฑ์˜ ํด๋” ๊ตฌ์กฐ ๋ถ„๋ฆฌ๋ฅผ ๋„˜์–ด์„œ, ๋Œ€ํ˜• ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ํ™˜๊ฒฝ์—์„œ ์—ฌ๋Ÿฌ ํŒ€์ด ๋…๋ฆฝ์ ์œผ๋กœ ๊ฐœ๋ฐœํ•˜๊ณ  ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ”„๋ก ํŠธ์—”๋“œ ์ž์ฒด๋ฅผ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๋ถ„ํ•  ๋ฐ ๋Ÿฐํƒ€์ž„์— ํ†ตํ•ฉํ•˜๋Š” ์„ค๊ณ„ ๋ฐฉ๋ฒ•๋ก ์œผ๋กœ ํ™•์žฅ. -- [[์„œ๋ฒ„ ์ƒํƒœ ๊ด€๋ฆฌ (Server State Management)]] - - ํ™•์žฅ ๋ฐฉํ–ฅ: ํด๋ผ์ด์–ธํŠธ ๋กœ์ปฌ ์ƒํƒœ์™€ ๊ตฌ๋ณ„ํ•˜์—ฌ, API ๋ฐ์ดํ„ฐ๋ฅผ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ณ  ์บ์‹ฑ ๋ฐ ์žฌ๊ฒ€์ฆ์„ ์ฒ˜๋ฆฌํ•˜๋Š” TanStack Query(React Query) ๊ธฐ๋ฐ˜์˜ ๊ณ„์ธต ์„ค๊ณ„ ๋ฐ ๋ฐ์ดํ„ฐ ํŒจ์นญ ์ตœ์ ํ™”๋กœ ์ง€์‹ ํ™•์žฅ. - ---- -*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Topics/Development/Agile_and_Team_Collaboration.md b/10_Wiki/Topics/Development/Agile_and_Team_Collaboration.md new file mode 100644 index 00000000..f898a28e --- /dev/null +++ b/10_Wiki/Topics/Development/Agile_and_Team_Collaboration.md @@ -0,0 +1,42 @@ +--- +id: a1g2i3l4-e5t6-4e8a-m9c0-1o2l3l4a5b6c +category: "[[10_Wiki/Topics/Development]]" +confidence_score: 0.95 +tags: [agile, collaboration, team, project-management, small-teams, code-review] +last_reinforced: 2026-05-01 +github_commit: "wikification-agile-collaboration" +--- + +# [[Agile Development & Team Collaboration]] + +## ๐Ÿ“Œ ํ•œ ์ค„ ํ†ต์ฐฐ (The Karpathy Summary) +> ์• ์ž์ผ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์€ ์™„๋ฒฝํ•œ ๊ณ„ํš๋ณด๋‹ค ๋น ๋ฅธ ํ”ผ๋“œ๋ฐฑ๊ณผ ์ ์ง„์  ๊ฐœ์„ ์„ ์ค‘์‹œํ•˜๋ฉฐ, ํŒ€ ๊ทœ๋ชจ์— ์ตœ์ ํ™”๋œ ํ˜‘์—… ๋„๊ตฌ์™€ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๋ฌธํ™”๋ฅผ ํ†ตํ•ด ์ง€์‹์˜ ํŒŒํŽธํ™”๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ  ์ œํ’ˆ์˜ ํ’ˆ์งˆ์„ ์ƒ์‹œ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. + +## ๐Ÿ“– ๊ตฌ์กฐํ™”๋œ ์ง€์‹ (Synthesized Content) + +### 1. ์†Œ๊ทœ๋ชจ ํŒ€์„ ์œ„ํ•œ ์• ์ž์ผ +- **Lean ์ ‘๊ทผ**: ๋ถˆํ•„์š”ํ•œ ๋ฏธํŒ…๊ณผ ๋ฌธ์„œ๋ฅผ ์ตœ์†Œํ™”ํ•˜๊ณ  ์‹ค์ œ ์ž‘๋™ํ•˜๋Š” ์ฝ”๋“œ์™€ ๊ธฐ๋Šฅ์„ ์šฐ์„ ํ•œ๋‹ค. +- **๋‹ค๊ธฐ๋Šฅ ํ˜‘์—… (Cross-functional)**: ๊ธฐํš, ๋””์ž์ธ, ๊ฐœ๋ฐœ ๊ฒฝ๊ณ„๋ฅผ ํ—ˆ๋ฌผ๊ณ  ๊ณต๋™์˜ ๋ชฉํ‘œ ๋‹ฌ์„ฑ์— ์ง‘์ค‘ํ•œ๋‹ค. +- **๋น ๋ฅธ ์ดํ„ฐ๋ ˆ์ด์…˜**: ์งง์€ ์Šคํ”„๋ฆฐํŠธ์™€ ๋ฐ์ผ๋ฆฌ ์Šคํฌ๋Ÿผ์„ ํ†ตํ•ด ๋ณ‘๋ชฉ ์ง€์ ์„ ์กฐ๊ธฐ์— ๋ฐœ๊ฒฌํ•˜๊ณ  ํ•ด๊ฒฐํ•œ๋‹ค. + +### 2. ํšจ์œจ์ ์ธ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๋ฐ ์ง€์‹ ๊ณต์œ  +- **์ฝ”๋“œ ๋ฆฌ๋ทฐ**: ๋‹จ์ˆœํžˆ ์˜คํƒ€๋ฅผ ์ฐพ๋Š” ๊ณผ์ •์ด ์•„๋‹ˆ๋ผ, ์„ค๊ณ„ ์˜๋„๋ฅผ ๊ณต์œ ํ•˜๊ณ  ํŒ€์˜ ๊ธฐ์ˆ ์  ์ƒํ–ฅ ํ‰์ค€ํ™”๋ฅผ ๋„๋ชจํ•˜๋Š” ์‹œ๊ฐ„์ด๋‹ค. +- **Context Sharing**: ์ž‘์—… ๋ฐฐ๊ฒฝ๊ณผ ์˜์‚ฌ ๊ฒฐ์ • ๊ณผ์ •์„ ๊ธฐ๋กํ•˜์—ฌ ๋ถ€์žฌ ์‹œ์—๋„ ์—…๋ฌด ์—ฐ์†์„ฑ์„ ์œ ์ง€ํ•œ๋‹ค. + +### 3. ๊ทœ๋ชจ๋ณ„ ํŒ€ ์—ญํ•™ (Small vs Large) +- **Small Teams**: ์˜์‚ฌ์†Œํ†ต ์†๋„๊ฐ€ ๋น ๋ฅด๋ฉฐ ๋†’์€ ์ž์œจ์„ฑ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์œ ์—ฐํ•˜๊ฒŒ ๋Œ€์ฒ˜ํ•œ๋‹ค. +- **Large Teams**: ์—ญํ•  ๋ถ„๋‹ด์ด ๋ช…ํ™•ํ•˜๋ฉฐ, ์‹œ์Šคํ…œ์  ๊ฑฐ๋ฒ„๋„Œ์Šค์™€ ๋ฌธ์„œํ™”๋œ ํ‘œ์ค€์ด ํ˜‘์—…์˜ ํ•ต์‹ฌ์ด ๋œ๋‹ค. + +## โš ๏ธ ๋ชจ์ˆœ ๋ฐ ์—…๋ฐ์ดํŠธ (Contradictions & RL Update) +- **Agile์˜ ํ˜•์‹ํ™”**: ๋‹จ์ˆœํžˆ ์Šคํฌ๋Ÿผ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ(Doing Agile)๊ณผ ์• ์ž์ผ ๊ฐ€์น˜๋ฅผ ๋‚ด์žฌํ™”ํ•˜๋Š” ๊ฒƒ(Being Agile)์€ ๋‹ค๋ฅด๋‹ค. ํ˜•์‹์— ์น˜์šฐ์นœ ์• ์ž์ผ์€ ์˜คํžˆ๋ ค ์ƒ์‚ฐ์„ฑ์„ ์ €ํ•ดํ•œ๋‹ค. +- **๋ฆฌ๋ทฐ ์ง€์—ฐ**: ๊ณผ๋„ํ•˜๊ฒŒ ๊ผผ๊ผผํ•œ ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋Š” ๋ฆด๋ฆฌ์ฆˆ ์†๋„๋ฅผ ๋Šฆ์ถœ ์ˆ˜ ์žˆ๋‹ค. ์ž๋™ํ™”๋œ ํˆด(Lint, Test)๋กœ ๊ฑธ๋Ÿฌ๋‚ผ ๋ถ€๋ถ„๊ณผ ์ธ๊ฐ„์ด ํŒ๋‹จํ•  ๋ถ€๋ถ„์„ ๋ช…ํ™•ํžˆ ๊ตฌ๋ถ„ํ•ด์•ผ ํ•œ๋‹ค. + +## ๐Ÿ”— ์ง€์‹ ์—ฐ๊ฒฐ (Graph) +- **Parent**: [[10_Wiki/Topics/Development]] +- **Related**: [[Engineering Principles (SOLID, DRY, KISS, YAGNI)]], [[Git Workflows]] +- **Raw Source**: [[00_Raw/Agile Software Development in Small Teams]], [[00_Raw/Agile Environments]], [[00_Raw/Team Collaboration]], [[00_Raw/Code Review]], [[00_Raw/Small vs Large Frontend Teams]] + +## ๐Ÿ’ป GitHub ๋™๊ธฐํ™” ์ž๋™ํ™” ์›Œํฌํ”Œ๋กœ์šฐ +1. Stage: git add . +2. Commit: `git commit -m "[P-Reinforce] Wikify Agile Development and Team Collaboration Standard"` +3. Push: `git push origin main` diff --git a/10_Wiki/Topics/Development/Error_Handling_and_Stability.md b/10_Wiki/Topics/Development/Error_Handling_and_Stability.md new file mode 100644 index 00000000..219ff20c --- /dev/null +++ b/10_Wiki/Topics/Development/Error_Handling_and_Stability.md @@ -0,0 +1,41 @@ +--- +id: e1r2r3o4-h5a6-4n7d-l8i9-n0g1s2t3a4b5 +category: "[[10_Wiki/Topics/Development]]" +confidence_score: 0.99 +tags: [react, error-handling, stability, error-boundary, monitoring, resilience] +last_reinforced: 2026-05-01 +github_commit: "wikification-error-handling" +--- + +# [[Frontend Error Handling & Application Stability]] + +## ๐Ÿ“Œ ํ•œ ์ค„ ํ†ต์ฐฐ (The Karpathy Summary) +> ํ”„๋ก ํŠธ์—”๋“œ ์•ˆ์ •์„ฑ์€ ๋ชจ๋“  ์—๋Ÿฌ๋ฅผ ๋ง‰๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๋ฐœ์ƒํ•œ ์—๋Ÿฌ๊ฐ€ ์ „์ฒด ์•ฑ์˜ ํ™”์ดํŠธ ์Šคํฌ๋ฆฐ์œผ๋กœ ๋ฒˆ์ง€์ง€ ์•Š๋„๋ก ๊ตฌํš์„ ๋‚˜๋ˆ„๊ณ (Error Boundary), ์‹ค์‹œ๊ฐ„ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ํ†ตํ•ด ๋น ๋ฅด๊ฒŒ ์ธ์ง€ํ•˜๊ณ  ๋ณต๊ตฌํ•˜๋Š” ํšŒ๋ณต ํƒ„๋ ฅ์„ฑ(Resilience)์— ์žˆ๋‹ค. + +## ๐Ÿ“– ๊ตฌ์กฐํ™”๋œ ์ง€์‹ (Synthesized Content) + +### 1. ๊ณ„์ธต์  ์—๋Ÿฌ ์ฒ˜๋ฆฌ ์ „๋žต +- **Error Boundaries**: React ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ ์ƒ์œ„์—์„œ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์˜ ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๋ฅผ ์บก์ฒ˜ํ•˜์—ฌ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋Œ€์ฒด UI๋ฅผ ๋ณด์—ฌ์ค€๋‹ค. ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ์˜์—ญ๋ณ„๋กœ ์•ˆ์ „์žฅ์น˜๋ฅผ ๋ฐฐ์น˜ํ•œ๋‹ค. +- **Global Error Handling**: `window.onerror`, `unhandledrejection` ์ด๋ฒคํŠธ๋ฅผ ๊ตฌ๋…ํ•˜์—ฌ ์˜ˆ๊ธฐ์น˜ ๋ชปํ•œ ๋น„๋™๊ธฐ ์—๋Ÿฌ๋ฅผ ์ „์—ญ์—์„œ ์บก์ฒ˜ํ•˜๊ณ  ์„œ๋ฒ„๋กœ ์ „์†กํ•œ๋‹ค. +- **Local Error Handling**: `try-catch` ๋ธ”๋ก๊ณผ API ์š”์ฒญ ๊ณ„์ธต์˜ ์ธํ„ฐ์…‰ํ„ฐ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ฆ‰๊ฐ์ ์ธ ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•œ๋‹ค. + +### 2. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์•ˆ์ •์„ฑ ํ™•๋ณด +- **Fallback UI**: ์—๋Ÿฌ ๋ฐœ์ƒ ์‹œ ๋‹จ์ˆœํžˆ ์•ฑ์„ ์ค‘๋‹จ์‹œํ‚ค๋Š” ๋Œ€์‹ , ์ƒˆ๋กœ๊ณ ์นจ ๋ฒ„ํŠผ์ด๋‚˜ ๊ณ ๊ฐ์„ผํ„ฐ ์—ฐ๊ฒฐ ๋“ฑ ๋‹ค์Œ ํ–‰๋™์„ ์œ ๋„ํ•˜๋Š” UI๋ฅผ ์ œ๊ณตํ•œ๋‹ค. +- **Graceful Degradation**: ์ผ๋ถ€ ๊ธฐ๋Šฅ(์˜ˆ: ์ถ”์ฒœ ๋ชฉ๋ก)์ด ์‹คํŒจํ•˜๋”๋ผ๋„ ํ•ต์‹ฌ ๊ธฐ๋Šฅ(์˜ˆ: ๊ฒฐ์ œ)์€ ์œ ์ง€๋  ์ˆ˜ ์žˆ๋„๋ก ๋ชจ๋“ˆ ๊ฐ„ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ˜๋‹ค. + +### 3. ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ๋ถ„์„ +- **Sentry ํ†ตํ•ฉ**: ์—๋Ÿฌ ๋ฐœ์ƒ ์‹œ์ ์˜ ์‚ฌ์šฉ์ž ์„ธ์…˜, ๊ธฐ๊ธฐ ์ •๋ณด, ์Šคํƒ ํŠธ๋ ˆ์ด์Šค๋ฅผ ์ˆ˜์ง‘ํ•˜์—ฌ ์žฌํ˜„ ๋ฐ ์ˆ˜์ •์„ ์šฉ์ดํ•˜๊ฒŒ ํ•œ๋‹ค. + +## โš ๏ธ ๋ชจ์ˆœ ๋ฐ ์—…๋ฐ์ดํŠธ (Contradictions & RL Update) +- **๊ณผ๋„ํ•œ ์—๋Ÿฌ ๋ฌด์‹œ**: ๋ชจ๋“  ์—๋Ÿฌ๋ฅผ ๋ฌต๋ฌตํžˆ ์ฒ˜๋ฆฌํ•˜๋ฉด ์‹ค์ œ ์‹ฌ๊ฐํ•œ ๋…ผ๋ฆฌ ์˜ค๋ฅ˜๋ฅผ ๋†“์น  ์ˆ˜ ์žˆ๋‹ค. ๋กœ๊ทธ ์ˆ˜์ง‘๊ณผ ๊ฒฝ๊ณ  ์•Œ๋ฆผ(Alerting) ์ฒด๊ณ„๊ฐ€ ๋ณ‘ํ–‰๋˜์–ด์•ผ ํ•œ๋‹ค. +- **์—๋Ÿฌ ๋ฐ”์šด๋”๋ฆฌ์˜ ํ•œ๊ณ„**: ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋‚˜ ๋น„๋™๊ธฐ ์ฝ”๋“œ ๋‚ด๋ถ€์˜ ์—๋Ÿฌ๋Š” Error Boundary๊ฐ€ ์ง์ ‘ ์บก์ฒ˜ํ•˜์ง€ ๋ชปํ•˜๋ฏ€๋กœ ๋ณ„๋„์˜ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค. + +## ๐Ÿ”— ์ง€์‹ ์—ฐ๊ฒฐ (Graph) +- **Parent**: [[10_Wiki/Topics/Development]] +- **Related**: [[Frontend Governance & Observability]], [[Sentry and LogRocket Integration]] +- **Raw Source**: [[00_Raw/Error Handling]], [[00_Raw/Frontend Application Stability]], [[00_Raw/React แ„‹แ…ขแ„‘แ…ณแ†ฏแ„…แ…ตแ„แ…ฆแ„‹แ…ตแ„‰แ…งแ†ซ แ„‹แ…จ\354\231\270 \353\260\217 \354\227\220\353\237\254 \354\262\230\353\246\254]] + +## ๐Ÿ’ป GitHub ๋™๊ธฐํ™” ์ž๋™ํ™” ์›Œํฌํ”Œ๋กœ์šฐ +1. Stage: git add . +2. Commit: `git commit -m "[P-Reinforce] Wikify Frontend Error Handling and Application Stability Standard"` +3. Push: `git push origin main` diff --git a/10_Wiki/Topics/Development/Frontend_Governance_and_Observability.md b/10_Wiki/Topics/Development/Frontend_Governance_and_Observability.md new file mode 100644 index 00000000..b67959aa --- /dev/null +++ b/10_Wiki/Topics/Development/Frontend_Governance_and_Observability.md @@ -0,0 +1,42 @@ +--- +id: g1o2v3e4-r5n6-4a7b-8c9d-0e1f2a3b4c5d +category: "[[10_Wiki/Topics/Development]]" +confidence_score: 0.99 +tags: [governance, observability, monitoring, sentry, ci-cd, logging, rum, frontend-ops] +last_reinforced: 2026-05-01 +github_commit: "wikification-governance-obs" +--- + +# [[Frontend Governance & Observability]] + +## ๐Ÿ“Œ ํ•œ ์ค„ ํ†ต์ฐฐ (The Karpathy Summary) +> ํ”„๋ก ํŠธ์—”๋“œ ์šด์˜์˜ ํ•ต์‹ฌ์€ '๋ณด์ด์ง€ ์•Š๋Š” ์—๋Ÿฌ'๋ฅผ ๊ฐ€์‹œํ™”ํ•˜๋Š” ๊ฒƒ์ด๋ฉฐ, ์—„๊ฒฉํ•œ CI/CD ๊ฑฐ๋ฒ„๋„Œ์Šค์™€ ์‹ค์‹œ๊ฐ„ ๋ชจ๋‹ˆํ„ฐ๋ง(Sentry, RUM)์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์˜ ์‹ ๋ขฐ์„ฑ์„ ์ •๋Ÿ‰์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค. + +## ๐Ÿ“– ๊ตฌ์กฐํ™”๋œ ์ง€์‹ (Synthesized Content) + +### 1. ํ”„๋ก ํŠธ์—”๋“œ ๊ฑฐ๋ฒ„๋„Œ์Šค (Governance) +- **์ž๋™ํ™”๋œ ๊ทœ์น™ ๊ฐ•์ œ**: ESLint, Prettier, Husky๋ฅผ ํ†ตํ•ด ์ปค๋ฐ‹ ์ „ ์ฝ”๋“œ ํ’ˆ์งˆ๊ณผ ์•„ํ‚คํ…์ฒ˜ ๊ฒฝ๊ณ„ ์œ„๋ฐ˜์„ ์ž๋™์œผ๋กœ ๊ฒ€์‚ฌํ•œ๋‹ค. +- **ํ‘œ์ค€ํ™”๋œ ์›Œํฌํ”Œ๋กœ์šฐ**: Conventional Commits์™€ ์—„๊ฒฉํ•œ PR ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€๊ฒฝ ์ด๋ ฅ์„ ํˆฌ๋ช…ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•œ๋‹ค. + +### 2. ๊ฐ€์‹œ์„ฑ ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง (Observability) +- **์—๋Ÿฌ ํŠธ๋ž˜ํ‚น (Sentry)**: ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ์˜ ์Šคํƒ ํŠธ๋ ˆ์ด์Šค์™€ ์‚ฌ์šฉ์ž ์„ธ์…˜ ๋ฌธ๋งฅ์„ ์บก์ฒ˜ํ•˜์—ฌ ๋””๋ฒ„๊น… ์†๋„๋ฅผ ๊ทน๋Œ€ํ™”ํ•œ๋‹ค. +- **์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด (LogRocket)**: ์‹ค์ œ ์‚ฌ์šฉ์ž์˜ ํ™”๋ฉด ์กฐ์ž‘ ๊ณผ์ •์„ ์‹œ๊ฐ์ ์œผ๋กœ ์žฌํ˜„ํ•˜์—ฌ ์žฌํ˜„ํ•˜๊ธฐ ์–ด๋ ค์šด ๋ฒ„๊ทธ๋ฅผ ์‹๋ณ„ํ•œ๋‹ค. +- **RUM (Real User Monitoring)**: ์‹ค์ œ ์‚ฌ์šฉ์ž์˜ ํ™˜๊ฒฝ(๊ธฐ๊ธฐ, ๋„คํŠธ์›Œํฌ ๋“ฑ)์—์„œ ์ธก์ •๋œ Core Web Vitals ์ง€ํ‘œ๋ฅผ ์ˆ˜์ง‘ํ•˜์—ฌ ์ตœ์ ํ™” ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ •ํ•œ๋‹ค. + +### 3. CI/CD ํŒŒ์ดํ”„๋ผ์ธ ํ†ตํ•ฉ +- **์•ˆ์ „ํ•œ ๋ฐฐํฌ**: ๋‹จ์œ„ ํ…Œ์ŠคํŠธ, ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ, ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ๋ฅผ ํŒŒ์ดํ”„๋ผ์ธ์— ํ†ตํ•ฉํ•˜์—ฌ ๋ฐฐํฌ ๋ฆฌ์Šคํฌ๋ฅผ ์ตœ์†Œํ™”ํ•œ๋‹ค. +- **Cloud Logging**: ํด๋ผ์ด์–ธํŠธ ์ธก ๋กœ๊ทธ๋ฅผ ์ค‘์•™ ์ง‘์ค‘ํ™”ํ•˜์—ฌ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์˜ ์ด์ƒ ์ง•ํ›„๋ฅผ ์กฐ๊ธฐ์— ๊ฐ์ง€ํ•œ๋‹ค. + +## โš ๏ธ ๋ชจ์ˆœ ๋ฐ ์—…๋ฐ์ดํŠธ (Contradictions & RL Update) +- **๋กœ๊น… ์˜ค๋ฒ„ํ—ค๋“œ**: ๊ณผ๋„ํ•œ ๋กœ๊น…์€ ๋„คํŠธ์›Œํฌ ๋Œ€์—ญํญ์„ ์ ์œ ํ•˜๊ณ  ์‚ฌ์šฉ์ž ๋น„์šฉ(๋ฐ์ดํ„ฐ)์„ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค. ์ƒ˜ํ”Œ๋ง ์ „๋žต์ด ํ•„์š”ํ•˜๋‹ค. +- **ํ”„๋ผ์ด๋ฒ„์‹œ**: ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ ๋ฏผ๊ฐ ์ •๋ณด(PII)๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š๋„๋ก ๋งˆ์Šคํ‚น ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์ˆ˜์ ์ด๋‹ค. + +## ๐Ÿ”— ์ง€์‹ ์—ฐ๊ฒฐ (Graph) +- **Parent**: [[10_Wiki/Topics/Development]] +- **Related**: [[Engineering Principles (SOLID, DRY, KISS, YAGNI)]], [[Performance & Memory Management]] +- **Raw Source**: [[00_Raw/Frontend Engineering Governance]], [[00_Raw/Automated Governance]], [[00_Raw/CI-CD Pipeline Integration]], [[00_Raw/Observability]], [[00_Raw/Production Monitoring and Observability]], [[00_Raw/Sentry and LogRocket Integration]], [[00_Raw/แ„‘แ…ณแ„…แ…ฉแ†ซแ„แ…ณแ„‹แ…ฆแ†ซแ„ƒแ…ณ แ„แ…ณแ†ฏแ„…แ…กแ„‹แ…ฎแ„ƒแ…ณ แ„…แ…ฉแ„€แ…ตแ†ผ แ„ƒแ…ฉแ„€แ…ฎ แ„ƒแ…ฉแ„‹แ…ตแ†ธ แ„†แ…ตแ†พ แ„‘แ…ณแ„…แ…ฉแ„ƒแ…ฅแ†จแ„‰แ…งแ†ซ แ„†แ…ฉแ„‚แ…ตแ„แ…ฅแ„…แ…ตแ†ผ]] + +## ๐Ÿ’ป GitHub ๋™๊ธฐํ™” ์ž๋™ํ™” ์›Œํฌํ”Œ๋กœ์šฐ +1. Stage: git add . +2. Commit: `git commit -m "[P-Reinforce] Wikify Frontend Governance and Observability Standard"` +3. Push: `git push origin main` diff --git a/10_Wiki/Topics/Development/Nextjs_and_Modern_React_Patterns.md b/10_Wiki/Topics/Development/Nextjs_and_Modern_React_Patterns.md new file mode 100644 index 00000000..8e4e5d41 --- /dev/null +++ b/10_Wiki/Topics/Development/Nextjs_and_Modern_React_Patterns.md @@ -0,0 +1,41 @@ +--- +id: n1e2x3t4-j5s6-4a7b-8c9d-0e1f2a3b4c5d +category: "[[10_Wiki/Topics/Development]]" +confidence_score: 0.98 +tags: [nextjs, app-router, server-components, react, functional-programming, modern-web] +last_reinforced: 2026-05-01 +github_commit: "wikification-nextjs-modern-react" +--- + +# [[Next.js & Modern React Design Patterns]] + +## ๐Ÿ“Œ ํ•œ ์ค„ ํ†ต์ฐฐ (The Karpathy Summary) +> ํ˜„๋Œ€ React ๊ฐœ๋ฐœ์€ Next.js์˜ App Router์™€ Server Components๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ๊ฒฝ๊ณ„๋ฅผ ์žฌ์ •์˜ํ•˜๋ฉฐ, ์„ ์–ธ์  UI์™€ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„์„ ๊ฒฐํ•ฉํ•˜์—ฌ ์„ฑ๋Šฅ๊ณผ ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ์„ ๋™์‹œ์— ๊ทน๋Œ€ํ™”ํ•˜๊ณ  ์žˆ๋‹ค. + +## ๐Ÿ“– ๊ตฌ์กฐํ™”๋œ ์ง€์‹ (Synthesized Content) + +### 1. Next.js App Router ๋ฐ RSC +- **React Server Components (RSC)**: ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ํŽ˜์นญํ•˜๊ณ  ๋ Œ๋”๋งํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ๋กœ ์ „์†กํ•จ์œผ๋กœ์จ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ค„์ด๊ณ  ์ดˆ๊ธฐ ๋กœ๋”ฉ ์†๋„๋ฅผ ํ–ฅ์ƒ์‹œํ‚จ๋‹ค. +- **App Router**: ํŒŒ์ผ ์‹œ์Šคํ…œ ๊ธฐ๋ฐ˜ ๋ผ์šฐํŒ…์„ ๋„˜์–ด ๋ ˆ์ด์•„์›ƒ, ์—๋Ÿฌ ํ•ธ๋“ค๋ง, ๋กœ๋”ฉ ์ƒํƒœ๋ฅผ ์„ ์–ธ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜๋ฅผ ์ œ๊ณตํ•œ๋‹ค. + +### 2. ํ˜„๋Œ€์  React ํŒจํ„ด +- **ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ ์šฐ์„ **: ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ์™€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ํ•จ์ˆ˜ํ˜•์œผ๋กœ ์ž‘์„ฑํ•˜๋ฉฐ, ๊ณ ์ฐจ ์ปดํฌ๋„ŒํŠธ(HOC) ๋Œ€์‹  ์ปค์Šคํ…€ ํ›…๊ณผ ํ•ฉ์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์ธ๋‹ค. +- **Props Drilling ๋ฐฉ์ง€**: ์ปดํฌ๋„ŒํŠธ ํ•ฉ์„ฑ(Composition)๊ณผ Context API, ๋˜๋Š” ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ์ตœ์ ํ™”ํ•œ๋‹ค. +- **Rules of React**: ํ›…์˜ ํ˜ธ์ถœ ์ˆœ์„œ ์ค€์ˆ˜ ๋“ฑ React์˜ ๊ธฐ๋ณธ ์›์น™์„ ์—„๊ฒฉํžˆ ์ง€์ผœ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ์ƒํƒœ ์ „์ด๋ฅผ ๋ณด์žฅํ•œ๋‹ค. + +### 3. ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ +- **Server Actions**: ๋ณ„๋„์˜ API ์—”๋“œํฌ์ธํŠธ ์—†์ด ์„œ๋ฒ„ ์ธก ํ•จ์ˆ˜๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜์—ฌ ๋ฐ์ดํ„ฐ ๋ณ€์กฐ(Mutation) ๋ฐ ํผ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค. + +## โš ๏ธ ๋ชจ์ˆœ ๋ฐ ์—…๋ฐ์ดํŠธ (Contradictions & RL Update) +- **ํด๋ผ์ด์–ธํŠธ vs ์„œ๋ฒ„ ๊ฒฝ๊ณ„**: ๋ชจ๋“  ๊ฒƒ์„ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋กœ ๋งŒ๋“ค ์ˆ˜๋Š” ์—†๋‹ค. ์ƒํ˜ธ์ž‘์šฉ(Event, State)์ด ํ•„์š”ํ•œ ๋ถ€๋ถ„์€ 'use client' ์ง€์‹œ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌํ•ด์•ผ ํ•œ๋‹ค. +- **์ถ”์ƒํ™” ์˜ค๋ฒ„ํ—ค๋“œ**: ํ•จ์ˆ˜ํ˜• ํŒจํ„ด๊ณผ ํ•ฉ์„ฑ์€ ๊ฐ•๋ ฅํ•˜์ง€๋งŒ, ๊ณผ๋„ํ•˜๊ฒŒ ๋ณต์žกํ•œ ํ•ฉ์„ฑ์€ ์ปดํฌ๋„ŒํŠธ ๊ตฌ์กฐ๋ฅผ ํŒŒ์•…ํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ ๋‹ค. + +## ๐Ÿ”— ์ง€์‹ ์—ฐ๊ฒฐ (Graph) +- **Parent**: [[10_Wiki/Topics/Development]] +- **Related**: [[Modern React & Frontend Engineering Standard (2025)]], [[Scalable Frontend Architecture]] +- **Raw Source**: [[00_Raw/Next.js App Router]], [[00_Raw/Next.js แ„†แ…ตแ†พ Server Components แ„Œแ…ฅแ†จแ„‹แ…ญแ†ผ แ„‘แ…ณแ„…แ…ฉแ„Œแ…ฆแ†จแ„แ…ณ]], [[00_Raw/Functional Components]], [[00_Raw/Functional Programming in React]] + +## ๐Ÿ’ป GitHub ๋™๊ธฐํ™” ์ž๋™ํ™” ์›Œํฌํ”Œ๋กœ์šฐ +1. Stage: git add . +2. Commit: `git commit -m "[P-Reinforce] Wikify Next.js and Modern React Design Patterns"` +3. Push: `git push origin main` diff --git a/10_Wiki/Topics/Development/Performance_and_Memory_Management.md b/10_Wiki/Topics/Development/Performance_and_Memory_Management.md new file mode 100644 index 00000000..8a5c28ad --- /dev/null +++ b/10_Wiki/Topics/Development/Performance_and_Memory_Management.md @@ -0,0 +1,42 @@ +--- +id: p5e4r3f2-a1b2-4c3d-8e9f-0a1b2c3d4e5f +category: "[[10_Wiki/Topics/Development]]" +confidence_score: 0.99 +tags: [performance, memory-leak, debugging, optimization, react, devtools, core-web-vitals] +last_reinforced: 2026-05-01 +github_commit: "wikification-performance-memory" +--- + +# [[Frontend Performance & Memory Management]] + +## ๐Ÿ“Œ ํ•œ ์ค„ ํ†ต์ฐฐ (The Karpathy Summary) +> ํ”„๋ก ํŠธ์—”๋“œ ์„ฑ๋Šฅ ์ตœ์ ํ™”๋Š” ๋‹จ์ˆœํžˆ ๋ Œ๋”๋ง์„ ์ค„์ด๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์‚ฌ์šฉ์ž ์ฒด๊ฐ ์„ฑ๋Šฅ(LCP, CLS, FID)์„ ๊ฐœ์„ ํ•˜๊ณ  ํฌ๋กฌ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ ๋ฐ ํ”„๋กœํŒŒ์ผ๋Ÿฌ๋ฅผ ํ†ตํ•ด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜์™€ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ ์ ์œ ์œจ์„ ์ •๋ฐ€ํ•˜๊ฒŒ ํƒ€๊ฒฉํ•˜๋Š” ์—”์ง€๋‹ˆ์–ด๋ง์ด๋‹ค. + +## ๐Ÿ“– ๊ตฌ์กฐํ™”๋œ ์ง€์‹ (Synthesized Content) + +### 1. ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ ๋ฐ ๋ฆฌ๋ Œ๋”๋ง ์ตœ์ ํ™” +- **๋ฉ”๋ชจ์ด์ œ์ด์…˜**: `React.memo`, `useMemo`, `useCallback`์„ ์ ์žฌ์ ์†Œ์— ๋ฐฐ์น˜ํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ๊ฐ€์ƒ DOM ์—ฐ์‚ฐ์„ ๋ฐฉ์ง€ํ•œ๋‹ค. +- **Concurrent Mode**: React 18์˜ `useTransition`, `useDeferredValue`๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋‚ฎ์€ ์—…๋ฐ์ดํŠธ๋ฅผ ๋’ค๋กœ ๋ฏธ๋ฃธ์œผ๋กœ์จ UI ๋ฐ˜์‘์„ฑ์„ ์œ ์ง€ํ•œ๋‹ค. +- **Code Splitting**: `React.lazy`์™€ ๋™์  ์ž„ํฌํŠธ๋ฅผ ํ†ตํ•ด ์ดˆ๊ธฐ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ค„์ด๊ณ  ํ•„์š”ํ•œ ์‹œ์ ์— ์ฝ”๋“œ๋ฅผ ๋กœ๋“œํ•œ๋‹ค. + +### 2. ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ๋ฐ ๋ˆ„์ˆ˜ ํƒ์ง€ +- **๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ์œ ํ˜•**: ์ „์—ญ ๋ณ€์ˆ˜ ๋‚จ์šฉ, ํ•ด์ œ๋˜์ง€ ์•Š์€ ํƒ€์ด๋จธ/์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ, ํด๋กœ์ €์— ์˜ํ•œ ์ฐธ์กฐ ์œ ์ง€, **Detached DOM Nodes** ๋“ฑ์ด ์ฃผ์š” ์›์ธ์ด๋‹ค. +- **Heap Snapshot**: ํฌ๋กฌ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ์˜ Memory ํƒญ์„ ํ†ตํ•ด ํž™ ์Šค๋ƒ…์ƒท์„ ๋น„๊ตํ•˜๊ณ , ๊ฐ์ฒด๊ฐ€ ์˜๋„์น˜ ์•Š๊ฒŒ ๋ฉ”๋ชจ๋ฆฌ์— ๋‚จ์•„ ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. + +### 3. ๋””๋ฒ„๊น… ๋ฐ ๋ถ„์„ ๋„๊ตฌ +- **React DevTools Profiler**: ์ปดํฌ๋„ŒํŠธ๋ณ„ ๋ Œ๋”๋ง ์‹œ๊ฐ„๊ณผ ์›์ธ์„ ํŒŒ์•…ํ•˜์—ฌ ๋ณ‘๋ชฉ ์ง€์ ์„ ์ฐพ๋Š”๋‹ค. +- **Lighthouse & Core Web Vitals**: LCP(์ตœ๋Œ€ ์ฝ˜ํ…์ธ  ํŽ˜์ธํŠธ), CLS(๋ˆ„์  ๋ ˆ์ด์•„์›ƒ ์ด๋™), INP(๋‹ค์Œ ์ƒํ˜ธ์ž‘์šฉ์— ๋Œ€ํ•œ ์‘๋‹ต) ์ง€ํ‘œ๋ฅผ ์ธก์ •ํ•˜๊ณ  ์ตœ์ ํ™”ํ•œ๋‹ค. + +## โš ๏ธ ๋ชจ์ˆœ ๋ฐ ์—…๋ฐ์ดํŠธ (Contradictions & RL Update) +- **๋ฌด๋ถ„๋ณ„ํ•œ ๋ฉ”๋ชจ์ด์ œ์ด์…˜**: ๋ชจ๋“  ๊ณณ์— `useMemo`๋ฅผ ์“ฐ๋Š” ๊ฒƒ์€ ์˜คํžˆ๋ ค ๋ฉ”๋ชจ๋ฆฌ ์ ์œ ์œจ์„ ๋†’์ด๊ณ  ์–•์€ ๋น„๊ต ๋น„์šฉ์„ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค. ์ธก์ •(Profiling) ํ›„ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ์›์น™์ด๋‹ค. +- **๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์˜ ํ•œ๊ณ„**: JS๋Š” ์ž๋™ GC๋ฅผ ์ง€์›ํ•˜์ง€๋งŒ, ๊ฐœ๋ฐœ์ž๊ฐ€ ์ฐธ์กฐ ๊ณ ๋ฆฌ(Reference chain)๋ฅผ ๋Š์–ด์ฃผ์ง€ ์•Š์œผ๋ฉด GC๋Š” ์ด๋ฅผ ํšŒ์ˆ˜ํ•  ์ˆ˜ ์—†๋‹ค. + +## ๐Ÿ”— ์ง€์‹ ์—ฐ๊ฒฐ (Graph) +- **Parent**: [[10_Wiki/Topics/Development]] +- **Related**: [[Vite Build System]], [[Zustand]], [[React Compiler]] +- **Raw Source**: [[00_Raw/แ„‹แ…ฐแ†ธ แ„‰แ…ฅแ†ผแ„‚แ…ณแ†ผ แ„Žแ…ฌแ„Œแ…ฅแ†จแ„’แ…ช(Core Web Vitals) แ„€แ…ขแ„‰แ…ฅแ†ซ แ„Œแ…กแ†จแ„‹แ…ฅแ†ธ]], [[00_Raw/Vite + React แ„‰แ…ฅแ†ผแ„‚แ…ณแ†ผ แ„Žแ…ฌแ„Œแ…ฅแ†จแ„’แ…ช]], [[00_Raw/Frontend Performance Debugging]], [[00_Raw/JavaScript Memory Management]], [[00_Raw/Memory Leak Detection]], [[00_Raw/Detached DOM Nodes]] + +## ๐Ÿ’ป GitHub ๋™๊ธฐํ™” ์ž๋™ํ™” ์›Œํฌํ”Œ๋กœ์šฐ +1. Stage: git add . +2. Commit: `git commit -m "[P-Reinforce] Wikify Frontend Performance and Memory Management Guide"` +3. Push: `git push origin main` diff --git a/10_Wiki/Topics/Development/Scalable_Frontend_Architecture.md b/10_Wiki/Topics/Development/Scalable_Frontend_Architecture.md new file mode 100644 index 00000000..8655aa3f --- /dev/null +++ b/10_Wiki/Topics/Development/Scalable_Frontend_Architecture.md @@ -0,0 +1,42 @@ +--- +id: s1c2a3l4-e5f6-4a7b-8c9d-0e1f2a3b4c5d +category: "[[10_Wiki/Topics/Development]]" +confidence_score: 0.99 +tags: [react, architecture, scalability, large-scale, fsd, folder-structure] +last_reinforced: 2026-05-01 +github_commit: "wikification-scalable-architecture" +--- + +# [[Scalable Frontend Architecture & System Design]] + +## ๐Ÿ“Œ ํ•œ ์ค„ ํ†ต์ฐฐ (The Karpathy Summary) +> ๋Œ€๊ทœ๋ชจ ํ”„๋ก ํŠธ์—”๋“œ ์‹œ์Šคํ…œ์˜ ํ™•์žฅ์€ ๋‹จ์ˆœํžˆ ์ฝ”๋“œ ์–‘์„ ๋Š˜๋ฆฌ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, Feature-Sliced Design(FSD)๊ณผ ๊ฐ™์€ ๊ณ„์ธต์  ๊ด€์‹ฌ์‚ฌ ๋ถ„๋ฆฌ๋ฅผ ํ†ตํ•ด ๋ชจ๋“ˆ ๊ฐ„ ๊ฒฐํ•ฉ๋„๋ฅผ ์ œ์–ดํ•˜๊ณ  ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ์„ ๊ฐ•์ œํ•จ์œผ๋กœ์จ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ํ™•๋ณดํ•˜๋Š” ๊ฒƒ์ด๋‹ค. + +## ๐Ÿ“– ๊ตฌ์กฐํ™”๋œ ์ง€์‹ (Synthesized Content) + +### 1. ๊ณ„์ธต์  ๊ด€์‹ฌ์‚ฌ ๋ถ„๋ฆฌ (FSD ๋„์ž…) +- **Layered Architecture**: `app` (์„ค์ •), `pages` (๋ผ์šฐํŠธ), `widgets` (์กฐํ•ฉ), `features` (๋น„์ฆˆ๋‹ˆ์Šค ๊ฐ€์น˜), `entities` (๋ฐ์ดํ„ฐ ๋ชจ๋ธ), `shared` (๊ณตํ†ต ์œ ํ‹ธ)๋กœ ๊ณ„์ธต์„ ๋‚˜๋ˆˆ๋‹ค. +- **๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ**: ์ƒ์œ„ ๊ณ„์ธต์€ ํ•˜์œ„ ๊ณ„์ธต๋งŒ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œํ•œํ•˜์—ฌ ์ˆœํ™˜ ์ฐธ์กฐ๋ฅผ ์ฐจ๋‹จํ•œ๋‹ค. +- **Public API**: ๊ฐ ์Šฌ๋ผ์ด์Šค๋Š” `index.ts`๋ฅผ ํ†ตํ•ด์„œ๋งŒ ๋‚ด๋ถ€ ๋กœ์ง์„ ๋…ธ์ถœํ•˜์—ฌ ์บก์Аํ™”๋ฅผ ์‹คํ˜„ํ•œ๋‹ค. + +### 2. ํด๋” ๊ตฌ์กฐ ๋ฐ ๋ชจ๋“ˆํ™” +- **๊ธฐ๋Šฅ ์ค‘์‹ฌ ๋ถ„๋ฆฌ (Feature-based)**: ๊ธฐ์ˆ ์  ์œ ํ˜•(components, hooks)์ด ์•„๋‹Œ ๋„๋ฉ”์ธ๊ณผ ๊ธฐ๋Šฅ ๋‹จ์œ„๋กœ ํด๋”๋ฅผ ๊ตฌ์„ฑํ•˜์—ฌ ์‘์ง‘๋„๋ฅผ ๋†’์ธ๋‹ค. +- **๋งˆ์ดํฌ๋กœ ํ”„๋ก ํŠธ์—”๋“œ ๋Œ€๋น„**: ์‹œ์Šคํ…œ์ด ๊ทน๋„๋กœ ๋น„๋Œ€ํ•ด์งˆ ๊ฒฝ์šฐ ๋ชจ๋…ธ๋ ˆํฌ(Nx, Turborepo)๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ชจ๋“ˆ๋ณ„ ๋…๋ฆฝ ๋ฐฐํฌ ๋ฐ ๋นŒ๋“œ๋ฅผ ์ค€๋น„ํ•œ๋‹ค. + +### 3. ๊ธฐ์ˆ  ๋ถ€์ฑ„ ๋ฐ ํ™•์žฅ์„ฑ ๊ด€๋ฆฌ +- **์ถ”์ƒํ™” ๊ฒŒ์ดํŠธ**: ์„ฑ๊ธ‰ํ•œ ๊ณตํ†ตํ™”(Over-generalization)๋ฅผ ๊ฒฝ๊ณ„ํ•˜๊ณ , ๋„๋ฉ”์ธ ๋กœ์ง์ด ์œ ์ถœ๋˜์ง€ ์•Š๋„๋ก ๊ฒฝ๊ณ„๋ฅผ ์—„๊ฒฉํžˆ ๊ด€๋ฆฌํ•œ๋‹ค. +- **๊ฑฐ๋ฒ„๋„Œ์Šค ์ž๋™ํ™”**: ESLint ๊ทœ์น™(์˜ˆ: `eslint-plugin-import`)์„ ํ†ตํ•ด ๊ณ„์ธต ์œ„๋ฐ˜์„ ๋นŒ๋“œ ํƒ€์ž„์— ๊ฐ์ง€ํ•œ๋‹ค. + +## โš ๏ธ ๋ชจ์ˆœ ๋ฐ ์—…๋ฐ์ดํŠธ (Contradictions & RL Update) +- **์˜ค๋ฒ„์—”์ง€๋‹ˆ์–ด๋ง**: ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” FSD๊ฐ€ ๋ถˆํ•„์š”ํ•œ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ์™€ ์ธ์ง€ ๋ถ€ํ•˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค. ํ”„๋กœ์ ํŠธ ์„ฑ์ˆ™๋„์— ๋”ฐ๋ฅธ ๋‹จ๊ณ„์  ๋„์ž…์ด ํ•„์š”ํ•˜๋‹ค. +- **Shared ๊ณ„์ธต์˜ ๋น„๋Œ€ํ™”**: ๋ชจ๋“  ๊ฒƒ์„ `shared`์— ๋„ฃ์œผ๋ ค๋Š” ์œ ํ˜น์„ ๋ฟŒ๋ฆฌ์ณ์•ผ ํ•œ๋‹ค. ์ตœ๋Œ€ํ•œ ํ•˜์œ„ ์—”ํ‹ฐํ‹ฐ๋‚˜ ๊ธฐ๋Šฅ์œผ๋กœ ๋ถ„์‚ฐ์‹œ์ผœ์•ผ ํ•œ๋‹ค. + +## ๐Ÿ”— ์ง€์‹ ์—ฐ๊ฒฐ (Graph) +- **Parent**: [[10_Wiki/Topics/Development]] +- **Related**: [[Legacy React Migration & Refactoring Standard]], [[Feature-Sliced Design]] +- **Raw Source**: [[00_Raw/Scalable React Apps]], [[00_Raw/Frontend Scalable Architecture]], [[00_Raw/Large-scale React Applications]], [[00_Raw/แ„ƒแ…ขแ„€แ…ฒแ„†แ…ฉ React แ„‹แ…ขแ„‘แ…ณแ†ฏแ„…แ…ตแ„แ…ฆแ„‹แ…ตแ„‰แ…งแ†ซ แ„‹แ…กแ„แ…ตแ„แ…ฆแ†จแ„Žแ…ฅ แ„€แ…ฎแ„‰แ…ฅแ†ผ]], [[00_Raw/แ„’แ…ชแ†จแ„Œแ…กแ†ผ แ„€แ…กแ„‚แ…ณแ†ผแ„’แ…กแ†ซ React แ„‹แ…กแ„แ…ตแ„แ…ฆแ†จแ„Žแ…ฅ แ„†แ…ตแ†พ แ„‘แ…ฉแ†ฏ\353\215\224 \352\265\254\354\241\260 \354\204\244\352\263\204]] + +## ๐Ÿ’ป GitHub ๋™๊ธฐํ™” ์ž๋™ํ™” ์›Œํฌํ”Œ๋กœ์šฐ +1. Stage: git add . +2. Commit: `git commit -m "[P-Reinforce] Wikify Scalable Frontend Architecture and System Design"` +3. Push: `git push origin main` diff --git a/10_Wiki/Topics/Development/State_Management_and_Concurrent_React.md b/10_Wiki/Topics/Development/State_Management_and_Concurrent_React.md new file mode 100644 index 00000000..6ed02128 --- /dev/null +++ b/10_Wiki/Topics/Development/State_Management_and_Concurrent_React.md @@ -0,0 +1,42 @@ +--- +id: m1a2n3a4-g5e6-4a7b-8c9d-0e1f2a3b4c5d +category: "[[10_Wiki/Topics/Development]]" +confidence_score: 0.99 +tags: [react, state-management, zustand, redux, context-api, concurrent-mode, suspense, server-state] +last_reinforced: 2026-05-01 +github_commit: "wikification-state-concurrent" +--- + +# [[Modern State Management & Concurrent React]] + +## ๐Ÿ“Œ ํ•œ ์ค„ ํ†ต์ฐฐ (The Karpathy Summary) +> ํ˜„๋Œ€ React ์ƒํƒœ ๊ด€๋ฆฌ๋Š” ๋ชฉ์ ์— ๋”ฐ๋ฅธ ํŒŒํŽธํ™”(์ „์—ญ/์„œ๋ฒ„/URL)๊ฐ€ ํ•ต์‹ฌ์ด๋ฉฐ, Concurrent Features์™€ Suspense๋ฅผ ํ†ตํ•ด ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ์„ ์–ธ์ ์œผ๋กœ ์ œ์–ดํ•˜์—ฌ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์˜ ๋Š๊น€์„ ์ตœ์†Œํ™”ํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์ง„ํ™”ํ–ˆ๋‹ค. + +## ๐Ÿ“– ๊ตฌ์กฐํ™”๋œ ์ง€์‹ (Synthesized Content) + +### 1. ์ƒํƒœ ๊ด€๋ฆฌ์˜ ์ „๋ฌธํ™” +- **์„œ๋ฒ„ ์ƒํƒœ (Server State)**: TanStack Query๋ฅผ ํ†ตํ•ด ์บ์‹ฑ, ๋™๊ธฐํ™”, ๋‚™๊ด€์  ์—…๋ฐ์ดํŠธ๋ฅผ ๊ด€๋ฆฌํ•˜๋ฉฐ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ๋ฅผ ํš๊ธฐ์ ์œผ๋กœ ์ค„์ธ๋‹ค. +- **์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์—ญ ์ƒํƒœ**: Zustand๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๊ฐ€๋ฒผ์šฐ๋ฉด์„œ๋„ ์„ธ๋ฐ€ํ•œ ๋ฆฌ๋ Œ๋”๋ง ์ œ์–ด๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค. Redux๋Š” ๋ณต์žก๋„๊ฐ€ ๋งค์šฐ ๋†’์€ ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ ํ๋ฆ„์— ํ•œํ•ด ์ฑ„ํƒํ•œ๋‹ค. +- **Context API**: ์ฃผ๋กœ ์ •์ ์ธ ์„ค์ •๊ฐ’์ด๋‚˜ ํ…Œ๋งˆ ์ „๋‹ฌ์— ์‚ฌ์šฉํ•˜๋ฉฐ, ์žฆ์€ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ƒํƒœ์—๋Š” ์„ฑ๋Šฅ ์ด์Šˆ๋กœ ์ธํ•ด ์ง€์–‘ํ•œ๋‹ค. + +### 2. Concurrent React ๋ฐ ์„ ์–ธ์  UI +- **Suspense**: ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง ์ค€๋น„๊ฐ€ ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ ๋Œ€์ฒด UI(Skeleton ๋“ฑ)๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ์„ ์–ธ์  ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์ด๋‹ค. +- **Concurrent Rendering**: ์šฐ์„ ์ˆœ์œ„ ๊ธฐ๋ฐ˜ ๋ Œ๋”๋ง(Interruptible Rendering)์„ ํ†ตํ•ด ๋ฉ”์ธ ์Šค๋ ˆ๋“œ ์ฐจ๋‹จ์„ ๋ฐฉ์ง€ํ•˜๊ณ  ์ž…๋ ฅ ๋ฐ˜์‘์„ฑ์„ ๋ณด์žฅํ•œ๋‹ค. +- **Transitions**: `startTransition`์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒํƒœ ์—…๋ฐ์ดํŠธ์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋‚ฎ์ถค์œผ๋กœ์จ ๊ธด๊ธ‰ํ•œ UI ์ƒํ˜ธ์ž‘์šฉ(ํƒ€์ดํ•‘ ๋“ฑ)์„ ๋ณดํ˜ธํ•œ๋‹ค. + +### 3. ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ „๋žต +- **Context to Zustand**: ๋ถˆํ•„์š”ํ•œ ์ „์ฒด ๋ฆฌ๋ Œ๋”๋ง์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด Context์—์„œ Zustand์˜ Selector ๊ธฐ๋ฐ˜ ์‹œ์Šคํ…œ์œผ๋กœ ์ ์ง„์ ์œผ๋กœ ์ „ํ™˜ํ•œ๋‹ค. + +## โš ๏ธ ๋ชจ์ˆœ ๋ฐ ์—…๋ฐ์ดํŠธ (Contradictions & RL Update) +- **๊ณผ๋„ํ•œ ์ƒํƒœ ๋ถ„๋ฆฌ**: ์ƒํƒœ๋ฅผ ๋„ˆ๋ฌด ์ž˜๊ฒŒ ์ชผ๊ฐœ๋ฉด ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ ์œ ์ง€๊ฐ€ ์–ด๋ ค์›Œ์งˆ ์ˆ˜ ์žˆ๋‹ค. ๋„๋ฉ”์ธ ๋‹จ์œ„์˜ ์ ์ ˆํ•œ ์‘์ง‘๋„๊ฐ€ ํ•„์š”ํ•˜๋‹ค. +- **Suspense Waterfall**: ์ค‘์ฒฉ๋œ Suspense๋Š” ๋„คํŠธ์›Œํฌ ์›Œํ„ฐํด ํ˜„์ƒ์„ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๋ฐ์ดํ„ฐ ํŽ˜์นญ์„ ์ƒ์œ„๋กœ ๋Œ์–ด์˜ฌ๋ฆฌ๊ฑฐ๋‚˜(Fetch-then-render) ๋ณ‘๋ ฌ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค. + +## ๐Ÿ”— ์ง€์‹ ์—ฐ๊ฒฐ (Graph) +- **Parent**: [[10_Wiki/Topics/Development]] +- **Related**: [[TanStack Query]], [[Zustand]], [[Performance & Memory Management]] +- **Raw Source**: [[00_Raw/State Management Libraries]], [[00_Raw/Context API to Zustand Migration]], [[00_Raw/Concurrent Rendering in React 18+]], [[00_Raw/React Suspense]], [[00_Raw/Server State]] + +## ๐Ÿ’ป GitHub ๋™๊ธฐํ™” ์ž๋™ํ™” ์›Œํฌํ”Œ๋กœ์šฐ +1. Stage: git add . +2. Commit: `git commit -m "[P-Reinforce] Wikify Modern State Management and Concurrent React Features"` +3. Push: `git push origin main`