diff --git a/00_Raw/A2A (Agent-to-Agent).md b/00_Raw/A2A (Agent-to-Agent).md new file mode 100644 index 00000000..2fcef8a8 --- /dev/null +++ b/00_Raw/A2A (Agent-to-Agent).md @@ -0,0 +1,62 @@ +# [[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 Harness.md b/00_Raw/Agent Harness.md new file mode 100644 index 00000000..8a602ef4 --- /dev/null +++ b/00_Raw/Agent Harness.md @@ -0,0 +1,84 @@ +# [[Agent Harness]] + +## ๐Ÿ“Œ Brief Summary +**AI ์—์ด์ „ํŠธ ํ•˜๋„ค์Šค(Agent Harness)**๋Š” ๋Œ€๊ทœ๋ชจ ์–ธ์–ด ๋ชจ๋ธ(LLM)์„ ๊ฐ์‹ธ์„œ ์™ธ๋ถ€ ์„ธ๊ณ„์™€ ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ†ต์ œํ•˜๊ณ  ์ง€์›ํ•˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด ์ธํ”„๋ผ์ŠคํŠธ๋Ÿญ์ฒ˜์ด์ž ๋Ÿฐํƒ€์ž„ ์ œ์–ด ๊ณ„์ธต์ž…๋‹ˆ๋‹ค. ๋‹จ์ˆœํžˆ ๋ชจ๋ธ์„ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์„ ๋„˜์–ด ์‹คํ–‰ ๋ฃจํ”„, ๋„๊ตฌ ๊ด€๋ฆฌ, ์ปจํ…์ŠคํŠธ ์œ ์ง€, ์ƒํƒœ ๊ด€๋ฆฌ, ๋ณด์•ˆ ๋ฐ ํ‰๊ฐ€ ๊ธฐ๋Šฅ์„ ํ†ตํ•ฉํ•˜์—ฌ ์—์ด์ „ํŠธ๊ฐ€ ์žฅ๊ธฐ์ ์ด๊ณ  ๋ณต์žกํ•œ ์ž‘์—…์„ ์ž์œจ์ ์ด๊ณ  ์‹ ๋ขฐ์„ฑ ์žˆ๊ฒŒ ์ˆ˜ํ–‰ํ•˜๋„๋ก ๋•์Šต๋‹ˆ๋‹ค. ๋ชจ๋ธ์ด ๋…ผ๋ฆฌ์  ์ถ”๋ก ์„ ๋‹ด๋‹นํ•˜๋Š” '๋‘๋‡Œ'๋ผ๋ฉด, ํ•˜๋„ค์Šค๋Š” ๋ชจ๋ธ์ด ํ™˜๊ฒฝ๊ณผ ์†Œํ†ตํ•˜๊ณ  ์•ˆ์ „ํ•œ ์ œ์•ฝ ๋‚ด์—์„œ ํ–‰๋™ํ•˜๋„๋ก ๋•๋Š” '์‹ ์ฒด ๋ฐ ํ™˜๊ฒฝ ์ธํ”„๋ผ'๋กœ ๊ธฐ๋Šฅํ•˜๋ฉฐ, ์ตœ๊ทผ AI ๊ฐœ๋ฐœ์˜ ์ดˆ์ ์ด ํ”„๋กฌํ”„ํŠธ ์ตœ์ ํ™”์—์„œ ํ•˜๋„ค์Šค ์„ค๊ณ„(Harness Engineering)๋กœ ์ด๋™ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. + +## ๐Ÿ“– Core Content +์†Œ์Šค ๋ฐ์ดํ„ฐ์— ๋”ฐ๋ฅด๋ฉด, ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ์—์ด์ „ํŠธ ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•ด ์—์ด์ „ํŠธ ํ•˜๋„ค์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ•ต์‹ฌ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. + +- **ํ•˜๋„ค์Šค์˜ ๊ณต์‹์  ์ •์˜ (The 6-Component Framework)** + ์—ฐ๊ตฌ ๋ฐ ์‚ฐ์—…๊ณ„์—์„œ๋Š” ์—์ด์ „ํŠธ ํ•˜๋„ค์Šค๋ฅผ **H = (E, T, C, S, L, V)**์˜ 6๊ฐ€์ง€ ๋Ÿฐํƒ€์ž„ ๊ฑฐ๋ฒ„๋„Œ์Šค ๊ตฌ์„ฑ ์š”์†Œ๋กœ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. + - **E (Execution Loop, ์‹คํ–‰ ๋ฃจํ”„):** ๊ด€์ฐฐ-์ƒ๊ฐ-ํ–‰๋™(observe-think-act) ์ฃผ๊ธฐ๋ฅผ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ํ•˜๋ฉฐ ๋‹ค์ค‘ ํ„ด์˜ ์‹คํ–‰ ํ๋ฆ„, ์—๋Ÿฌ ๋ณต๊ตฌ ๋ฐ ์ข…๋ฃŒ ์กฐ๊ฑด์„ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค. + - **T (Tool Registry, ๋„๊ตฌ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ):** ์—์ด์ „ํŠธ๊ฐ€ ์™ธ๋ถ€ ์„ธ๊ณ„์— ๊ฐœ์ž…ํ•  ์ˆ˜ ์žˆ๋„๋ก ํƒ€์ž…์ด ์ง€์ •๋˜๊ณ  ๊ฒ€์ฆ๋œ ๋„๊ตฌ ์นดํƒˆ๋กœ๊ทธ(API, ํŒŒ์ผ ์ œ์–ด ๋“ฑ)๋ฅผ ์œ ์ง€ํ•˜๊ณ  ๋„๊ตฌ ํ˜ธ์ถœ์„ ๋ผ์šฐํŒ…/๋ชจ๋‹ˆํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค. + - **C (Context Manager, ์ปจํ…์ŠคํŠธ ๊ด€๋ฆฌ์ž):** ์ปจํ…์ŠคํŠธ ์œˆ๋„์šฐ๋กœ ๋“ค์–ด๊ฐ€๋Š” ์ •๋ณด๋ฅผ ํ•„ํ„ฐ๋งํ•˜๊ณ  ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ •ํ•˜๋ฉฐ, ๋ฉ”๋ชจ๋ฆฌ ์••์ถ•(Compaction) ๋ฐ ๊ฒ€์ƒ‰ ์ „๋žต์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. + - **S (State Store, ์ƒํƒœ ์ €์žฅ์†Œ):** ์—์ด์ „ํŠธ์˜ ์‹คํ–‰ ํ„ด(Turn) ๋ฐ ์„ธ์…˜ ๊ฐ„์˜ ์ž‘์—… ๊ด€๋ จ ์ƒํƒœ๋ฅผ ์˜์†์ ์œผ๋กœ ์ €์žฅํ•˜๊ณ  ๋ถ€๋ถ„์  ์‹คํŒจ ์‹œ ๋ณต๊ตฌ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. + - **L (Lifecycle Hooks, ์ˆ˜๋ช…์ฃผ๊ธฐ ํ›…):** ์ธ์ฆ, ๋กœ๊น…, ์ •์ฑ… ์‹œํ–‰ ๋ฐ ๊ด€์ฐฐ์„ ์œ„ํ•ด ์—์ด์ „ํŠธ ํ˜ธ์ถœ ์ „ํ›„๋ฅผ ๊ฐ€๋กœ์ฑ„๋Š”(Intercept) ์ œ์–ด ์ง€์ ์ž…๋‹ˆ๋‹ค. + - **V (Evaluation Interface, ํ‰๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค):** ๋ฒค์น˜๋งˆํฌ ๋ฐ ์˜คํ”„๋ผ์ธ ๋ถ„์„์„ ์œ„ํ•ด ์‹คํ–‰ ๊ถค์ (Trajectory), ์ค‘๊ฐ„ ์ƒํƒœ, ์„ฑ๊ณต ์‹ ํ˜ธ๋ฅผ ํ‘œ์ค€ํ™”๋œ ํ˜•ํƒœ๋กœ ์บก์ฒ˜ํ•ฉ๋‹ˆ๋‹ค. + +- **ํ•˜๋„ค์Šค ์—”์ง€๋‹ˆ์–ด๋ง ํŒจ๋Ÿฌ๋‹ค์ž„์˜ ์ง„ํ™”** + AI ์—”์ง€๋‹ˆ์–ด๋ง์€ 'ํ”„๋กฌํ”„ํŠธ ์—”์ง€๋‹ˆ์–ด๋ง(2022-2024)'์—์„œ ๋ชจ๋ธ์ด ๋ณด๋Š” ์ •๋ณด๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” '์ปจํ…์ŠคํŠธ ์—”์ง€๋‹ˆ์–ด๋ง(2025)'์„ ๊ฑฐ์ณ, ์—์ด์ „ํŠธ์˜ ์ „์ฒด ์‹คํ–‰ ํ™˜๊ฒฝ ๋ฐ ์ œ์–ด ์ธํ”„๋ผ๋ฅผ ์„ค๊ณ„ํ•˜๋Š” **'ํ•˜๋„ค์Šค ์—”์ง€๋‹ˆ์–ด๋ง(2026)'**์œผ๋กœ ์ง„ํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์„ ๋„์ ์ธ AI ์‹œ์Šคํ…œ์˜ ์‹ ๋ขฐ์„ฑ์€ ๋ชจ๋ธ์˜ ์ง€๋Šฅ(Model Capability)๋งŒ์œผ๋กœ ๊ฒฐ์ •๋˜์ง€ ์•Š์œผ๋ฉฐ, ๋ชจ๋ธ๊ณผ ํ•˜๋„ค์Šค๊ฐ€ ๊ฒฐํ•ฉ๋œ ํ’ˆ์งˆ์ด ์„ฑ๋Šฅ์˜ ์ƒํ•œ์„ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. + +- **๋ณด์•ˆ ๋ฐ ๋Ÿฐํƒ€์ž„ ์ œ์–ด ๋ฉ”์ปค๋‹ˆ์ฆ˜** + ํ•˜๋„ค์Šค๋Š” ๋ณธ์งˆ์ ์œผ๋กœ ๋ถˆํ™•์‹ค์„ฑ์„ ๊ฐ€์ง„ LLM์˜ ์ถœ๋ ฅ์„ ๊ฒฐ์ •๋ก ์ (Deterministic) ํ™˜๊ฒฝ์—์„œ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด **์ƒŒ๋“œ๋ฐ•์‹ฑ(Sandboxing)**์„ ํ†ตํ•ด ์ฝ”๋“œ ์‹คํ–‰ ํ™˜๊ฒฝ์„ ๋…ผ๋ฆฌ์ /๋ฌผ๋ฆฌ์ ์œผ๋กœ ๊ฒฉ๋ฆฌํ•˜๊ณ , ์—์ด์ „ํŠธ์˜ '๊ณผ๋„ํ•œ ๊ถŒํ•œ(Excessive Agency)'๊ณผ '๊ฐ„์ ‘ ํ”„๋กฌํ”„ํŠธ ์ธ์ ์…˜(Indirect Prompt Injection)'๊ณผ ๊ฐ™์€ ๋ณด์•ˆ ์œ„ํ˜‘์„ ์ˆ˜๋ช…์ฃผ๊ธฐ ํ›…(L) ๋ฐ ๋„๊ตฌ ์Šน์ธ ํŒŒ์ดํ”„๋ผ์ธ(Human-in-the-loop)์„ ํ†ตํ•ด ๋ฐฉ์–ดํ•ฉ๋‹ˆ๋‹ค. + +## โš–๏ธ Trade-offs & Caveats + +- **๋„๊ตฌ ์ ‘๊ทผ์„ฑ(Capability) vs ๋ณด์•ˆ ๋ฐ ๊ฒฉ๋ฆฌ(Security):** + ์—์ด์ „ํŠธ ํ•˜๋„ค์Šค์— ํญ๋„“์€ ๋„๊ตฌ(๋„คํŠธ์›Œํฌ, ํŒŒ์ผ์‹œ์Šคํ…œ ์“ฐ๊ธฐ ๋“ฑ)๋ฅผ ์ œ๊ณตํ•˜๋ฉด ์œ ์šฉ์„ฑ์€ ๊ทน๋Œ€ํ™”๋˜์ง€๋งŒ, ๋™์‹œ์— ๊ฐ„์ ‘ ํ”„๋กฌํ”„ํŠธ ์ธ์ ์…˜์ด๋‚˜ ์˜ˆ๊ธฐ์น˜ ์•Š์€ ์‹œ์Šคํ…œ ํŒŒ๊ดด์™€ ๊ฐ™์€ ๊ณต๊ฒฉ ํ‘œ๋ฉด์ด ๊ธ‰์ฆํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด, ์—„๊ฒฉํ•œ ๋งˆ์ดํฌ๋กœVM ์ƒŒ๋“œ๋ฐ•์‹ฑ์ด๋‚˜ ๊ถŒํ•œ ์ตœ์†Œํ™” ์›์น™์„ ๊ฐ•์ œํ•˜๋ฉด ๋ณด์•ˆ์„ฑ์€ ๋†’์•„์ง€์ง€๋งŒ, ์—์ด์ „ํŠธ์˜ ์ž‘์—… ์ง€์—ฐ ์‹œ๊ฐ„(Latency)์ด ์ฆ๊ฐ€ํ•˜๊ณ  ์šด์˜ ์ธํ”„๋ผ์˜ ๋ณต์žก์„ฑ์ด ์ปค์ง€๋Š” ๋ฐ˜๋Œ€ ๊ธ‰๋ถ€๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. +- **์ปจํ…์ŠคํŠธ ์œ ์ง€(Retention) vs ๋น„์šฉ ๋ฐ ๋ถ€ํŒจ(Context Rot):** + ๊ธด ์ž‘์—… ์„ธ์…˜ ๋™์•ˆ ๋ชจ๋“  ์‹คํ–‰ ๊ธฐ๋ก๊ณผ ๋„๊ตฌ ๊ฒฐ๊ณผ๋ฅผ ์ปจํ…์ŠคํŠธ์— ์œ ์ง€ํ•˜๋ฉด ๋ชจ๋ธ์˜ ์žฅ๊ธฐ์  ์ถ”๋ก ์— ์œ ๋ฆฌํ•ด ๋ณด์ด์ง€๋งŒ, ์‹ค์ œ๋กœ๋Š” ์ปจํ…์ŠคํŠธ ์œˆ๋„์šฐ ํฌ์„ ํ˜„์ƒ(Attention Dilution)๊ณผ ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์ธ ํ† ํฐ ๋น„์šฉ ์ฆ๊ฐ€๋ฅผ ์œ ๋ฐœํ•˜๋Š” **'์ปจํ…์ŠคํŠธ ๋ถ€ํŒจ(Context Rot)'**๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋Œ€๋กœ ๋ฉ”๋ชจ๋ฆฌ ์••์ถ•(Compaction)์ด๋‚˜ ๋ถ€๋ถ„ ์š”์•ฝ์„ ๊ณต๊ฒฉ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋ฉด, ์ดํ›„ ์—์ด์ „ํŠธ๊ฐ€ ์ž‘์—…์„ ์žฌ๊ฐœํ•  ๋•Œ ํ•„์ˆ˜์ ์ธ ์„ธ๋ถ€ ์ •๋ณด๋‚˜ ๋ฐ์ดํ„ฐ ์ถœ์ฒ˜(Provenance)๋ฅผ ์ƒ์‹คํ•  ์œ„ํ—˜์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. +- **๋‹ค์ค‘ ์—์ด์ „ํŠธ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜(Multi-Agent) ์˜ค๋ฒ„ํ—ค๋“œ:** + ์—ญํ• ์ด ๋ถ„๋ฆฌ๋œ ์—ฌ๋Ÿฌ ํ•˜์œ„ ์—์ด์ „ํŠธ(Subagents)๋ฅผ ํ•˜๋„ค์Šค๋กœ ์—ฐ๊ฒฐ(Orchestrator-Worker ํŒจํ„ด ๋“ฑ)ํ•˜๋ฉด ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ์™€ ์ปจํ…์ŠคํŠธ ๊ฒฉ๋ฆฌ์— ๋งค์šฐ ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜, ์—์ด์ „ํŠธ ๊ฐ„์˜ ํ†ต์‹ (๋ฉ”์‹œ์ง€ ๋ผ์šฐํŒ…), ์ƒํƒœ ๊ณต์œ  ์ผ๊ด€์„ฑ, ๊ถŒํ•œ ์œ„์ž„ ๊ด€๋ฆฌ ๋“ฑ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ ์ˆ˜์ค€์˜ ๋ณต์žก์„ฑ์ด ์ถ”๊ฐ€๋˜๋ฉฐ, ๋‹จ์ผ ์—์ด์ „ํŠธ ๊ตฌ์„ฑ๋ณด๋‹ค ํ† ํฐ ์†Œ๋น„๋Ÿ‰์ด ์ตœ๋Œ€ 15๋ฐฐ ์ด์ƒ ์ฆ๊ฐ€ํ•  ์ˆ˜ ์žˆ์–ด ๋น„์šฉ ๋Œ€๋น„ ํšจ์œจ์„ฑ์„ ์ฒ ์ €ํžˆ ๊ณ„์‚ฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [๊ด€๊ณ„ ์œ ํ˜• A: ์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] +- [[Model Context Protocol (MCP)]] + - ์—ฐ๊ฒฐ ์ด์œ : ํ•˜๋„ค์Šค์˜ ๋„๊ตฌ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ(T-component)๊ฐ€ ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ ์†Œ์Šค ๋ฐ ๋„๊ตฌ์™€ ํ†ต์‹ ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” Anthropic ์ฃผ๋„์˜ ํ‘œ์ค€ ๊ฐœ๋ฐฉํ˜• ํ”„๋กœํ† ์ฝœ์ž…๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํ•˜๋„ค์Šค๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ชจ๋ธ๊ณผ ์ข…์†์„ฑ์„ ๋ถ„๋ฆฌํ•˜์—ฌ ์ˆ˜๋งŽ์€ API์™€ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ๋„๊ตฌ๋ฅผ ์•ˆ์ „ํ•˜๊ณ  ๊ทœ๊ฒฉํ™”๋œ ๋ฐฉ์‹(JSON-RPC ๊ธฐ๋ฐ˜)์œผ๋กœ ํƒ์ƒ‰ํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š”์ง€ ๊ตฌ์ฒด์ ์œผ๋กœ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +- [[Agent-to-Agent Protocol (A2A)]] + - ์—ฐ๊ฒฐ ์ด์œ : MCP๊ฐ€ '์—์ด์ „ํŠธ-๋„๊ตฌ' ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ๋‹ด๋‹นํ•œ๋‹ค๋ฉด, A2A๋Š” ๋‹ค์ค‘ ์—์ด์ „ํŠธ ํ•˜๋„ค์Šค์—์„œ '์—์ด์ „ํŠธ-์—์ด์ „ํŠธ' ๊ฐ„์˜ ์ž‘์—… ์œ„์ž„ ๋ฐ ์›๊ฒฉ ํ†ต์‹ ์„ ํ‘œ์ค€ํ™”ํ•˜๋Š” Google ์ฃผ๋„์˜ ํ”„๋กœํ† ์ฝœ์ž…๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํ•˜๋„ค์Šค์˜ ์‹คํ–‰ ๋ฃจํ”„(E-component)๊ฐ€ ๋‹จ์ผ ์ปจํ…์ŠคํŠธ๋ฅผ ๋„˜์–ด ์™ธ๋ถ€ ๋˜๋Š” ์›๊ฒฉ์˜ ํŠนํ™” ์—์ด์ „ํŠธ๋“ค์—๊ฒŒ ํ•˜์œ„ ์ž‘์—…์„ ์–ด๋–ป๊ฒŒ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ํ•˜๋Š”์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +- [[Context Engineering]] + - ์—ฐ๊ฒฐ ์ด์œ : ํ”„๋กฌํ”„ํŠธ ์—”์ง€๋‹ˆ์–ด๋ง์˜ ๋‹ค์Œ ๋‹จ๊ณ„๋กœ, ํ•˜๋„ค์Šค๊ฐ€ ์—์ด์ „ํŠธ์˜ ์ปจํ…์ŠคํŠธ ์œˆ๋„์šฐ์— ์ง„์ž…ํ•˜๋Š” ์ •๋ณด๋ฅผ ํ•„ํ„ฐ๋ง, ์••์ถ•, ์šฐ์„ ์ˆœ์œ„ํ™”ํ•˜๋Š”(C-component) ํ•ต์‹ฌ ์„ค๊ณ„ ์ฒ ํ•™์ž…๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ธด ์‹œ๊ฐ„ ์‹คํ–‰๋˜๋Š” ์ž‘์—…์—์„œ ๋ฐœ์ƒํ•˜๋Š” '์ปจํ…์ŠคํŠธ ๋ถ€ํŒจ'๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ , ๊ฒ€์ƒ‰ ์ฆ๊ฐ•(RAG)๊ณผ ๊ฐ€์ƒ ํŽ˜์ด์ง•(Virtual Paging)์„ ํ†ตํ•ด ํ† ํฐ ๋น„์šฉ์„ ์–ด๋–ป๊ฒŒ ์–ต์ œํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +#### [๊ด€๊ณ„ ์œ ํ˜• B: ๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ] +- [[Sandboxing (MicroVMs/Containers)]] + - ์—ฐ๊ฒฐ ์ด์œ : ํ•˜๋„ค์Šค ๋‚ด๋ถ€์—์„œ ์—์ด์ „ํŠธ๊ฐ€ ์ƒ์„ฑํ•œ ์ฝ”๋“œ๋‚˜ ๋„๊ตฌ ํ˜ธ์ถœ์„ ๊ฒฉ๋ฆฌ๋œ ์ƒํƒœ๋กœ ์‹คํ–‰ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ์ธํ”„๋ผ ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์—์ด์ „ํŠธ์˜ ์ž์œจ์  ์‹คํ–‰์ด ํ˜ธ์ŠคํŠธ ์‹œ์Šคํ…œ์„ ํŒŒ๊ดดํ•˜๊ฑฐ๋‚˜ ๋ณด์•ˆ์„ ์นจํ•ดํ•˜์ง€ ์•Š๋„๋ก ๋ฐฉ์–ดํ•˜๋Š” ์‹คํ–‰ ๊ณ„์ธต(Docker, E2B ๋“ฑ)์˜ ์ค‘์š”์„ฑ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +- [[Plan-Execute-Verify (PEV) Loop]] + - ์—ฐ๊ฒฐ ์ด์œ : ํ•˜๋„ค์Šค ๋‚ด๋ถ€์—์„œ ์—์ด์ „ํŠธ์˜ ์ž‘์—…์„ ํ†ต์ œํ•˜๋Š” ํ•ต์‹ฌ ์‹คํ–‰ ํŒŒ์ดํ”„๋ผ์ธ ํŒจํ„ด์ž…๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์—์ด์ „ํŠธ๊ฐ€ ๋‹จ์ˆœํžˆ ์ƒ์„ฑํ•˜๊ณ  ํ™•์ธ(Generate-and-check)ํ•˜๋Š” ๊ฒƒ์„ ๋„˜์–ด, ํ•˜๋„ค์Šค๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ช…์‹œ์ ์ธ ๊ณ„ํš ๋‹จ๊ณ„์™€ ์‹คํ–‰, ๊ทธ๋ฆฌ๊ณ  ์ž๋™ํ™”๋œ ๊ฒ€์ฆ(Verification) ์‚ฌ์ด์— ํ•˜๋“œ ๊ฒŒ์ดํŠธ(Hard gates)๋ฅผ ๋‘์–ด ์‹ ๋ขฐ์„ฑ์„ ๋†’์ด๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### Deeper Research Questions + +- ๋‹ค์ค‘ ์—์ด์ „ํŠธ ํ•˜๋„ค์Šค(Multi-Agent Harness) ์•„ํ‚คํ…์ฒ˜์—์„œ ์—์ด์ „ํŠธ ๊ฐ„ ๊ณต์œ  ์ƒํƒœ(Shared State)์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๊ณ , ์†์ƒ๋œ ์—์ด์ „ํŠธ(Byzantine fault)๋กœ ์ธํ•œ ์—ฐ์‡„ ์˜ค๋ฅ˜(Cascade failure)๋ฅผ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ ์ˆ˜์ค€์—์„œ ์–ด๋–ป๊ฒŒ ๋ฐฉ์–ดํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- '์ปจํ…์ŠคํŠธ ๋ถ€ํŒจ(Context Rot)' ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ํ•˜๋„ค์Šค์˜ ์ปจํ…์ŠคํŠธ ๊ด€๋ฆฌ์ž(C-component)๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” '์ ์‘ํ˜• ์••์ถ•(Adaptive Context Compaction)' ๊ธฐ๋ฒ•์€ ์‹ค์ œ ํ† ํฐ ๋น„์šฉ ์ ˆ๊ฐ ๋ฐ ์ •๋ณด ์†์‹ค๋ฅ  ์ธก๋ฉด์—์„œ ๊ฒ€์ƒ‰ ์ฆ๊ฐ•(RAG)๊ณผ ๋น„๊ตํ•˜์—ฌ ์–ด๋– ํ•œ ์ •๋Ÿ‰์  ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๋ฅผ ๊ฐ–๋Š”๊ฐ€? +- MCP(Model Context Protocol)๋ฅผ T-component์— ์ ์šฉํ•˜๊ณ  A2A(Agent-to-Agent)๋ฅผ E-component์— ์ ์šฉํ•˜๋Š” ์ด์ค‘ ํ”„๋กœํ† ์ฝœ ์Šคํƒ ์•„ํ‚คํ…์ฒ˜์—์„œ, ๋‘ ํ”„๋กœํ† ์ฝœ ๊ฐ„์˜ ๊ต์ฐจ ์ธ์ฆ(Authentication) ๋ฐ ๋ณด์•ˆ ๊ฒฝ๊ณ„๋Š” ์–ด๋–ป๊ฒŒ ์„ค๊ณ„๋˜์–ด์•ผ ํ•˜๋Š”๊ฐ€? +- ํ•˜๋„ค์Šค ๋‚ด๋ถ€์—์„œ ์‹คํ–‰๋˜๋Š” ์ƒŒ๋“œ๋ฐ•์‹ฑ ํ™˜๊ฒฝ(์˜ˆ: MicroVM ๊ธฐ๋ฐ˜ ์ฝ”๋“œ ์‹คํ–‰)๊ณผ ์™ธ๋ถ€ API๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ์‹ ์ค‘, ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜ ๋ฐ ๊ฒ€์ฆ ๊ณผ์ œ์—์„œ ์—์ด์ „ํŠธ ์„ฑ๋Šฅ(Pass@1)๊ณผ ์ง€์—ฐ ์‹œ๊ฐ„(Latency)์— ๊ฐ๊ฐ ์–ด๋–ค ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”๊ฐ€? +- 'ํ•˜๋„ค์Šค-๋ชจ๋ธ ๊ฒฐํ•ฉ(Harness-Model Coupling)' ํ˜„์ƒ, ์ฆ‰ ํŠน์ • ๋ชจ๋ธ์ด ํŠน์ • ํ•˜๋„ค์Šค ์ƒํƒœ๊ณ„(์˜ˆ: Native SDK)์—์„œ๋งŒ ์›”๋“ฑํ•œ ์„ฑ๋Šฅ์„ ๋ฐœํœ˜ํ•˜๋Š” ํ˜„์ƒ์„ ๊ฐ๊ด€์ ์œผ๋กœ ์ธก์ •ํ•˜๊ณ  ํ‰๊ฐ€ํ•˜๊ธฐ ์œ„ํ•œ ๊ต์ฐจ ํ•˜๋„ค์Šค ๋ฒค์น˜๋งˆํฌ(Cross-Harness Evaluation)์˜ ํ‘œ์ค€ํ™” ์กฐ๊ฑด์€ ๋ฌด์—‡์ธ๊ฐ€? +- ์ฝ”๋“œ ๊ธฐ๋ฐ˜์˜ ๊ฒฐ์ •๋ก ์  ํ•˜๋„ค์Šค์™€ ๋น„๊ตํ•˜์—ฌ, ์ž์—ฐ์–ด๋กœ ์ œ์–ด ๊ทœ์น™์„ ๋ช…์„ธํ•˜๋Š” '์ž์—ฐ์–ด ๊ธฐ๋ฐ˜ ์—์ด์ „ํŠธ ํ•˜๋„ค์Šค(Natural-Language Agent Harnesses, NLAH)'๋Š” ์ด์‹์„ฑ๊ณผ ํ˜•์‹์  ๊ฒ€์ฆ(Formal Verification) ์ธก๋ฉด์—์„œ ์‹œ์Šคํ…œ ์‹ ๋ขฐ์„ฑ์„ ์–ด๋–ป๊ฒŒ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? + +### Practical Application Contexts + +- **Implementation:** LangGraph, CrewAI, AutoGen ๋“ฑ์˜ ํ”„๋ ˆ์ž„์›Œํฌ๋‚˜ OpenClaw, DeepAgents ๊ฐ™์€ ํ’€์Šคํƒ ํ•˜๋„ค์Šค ํ™˜๊ฒฝ์„ ๊ตฌํ˜„ํ•  ๋•Œ, ๋„๊ตฌ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์„ค์ •, ํŒŒ์ผ ์‹œ์Šคํ…œ ์ƒํƒœ ์—ฐ๊ฒฐ, ๋ฉ”๋ชจ๋ฆฌ ์ €์žฅ์†Œ ์—ฐ๋™ ๋“ฑ์„ ์‹ค์ œ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•˜๊ณ  ํ†ตํ•ฉํ•˜๋Š” ๊ณผ์ •์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. +- **System Design:** ์†Œํ”„ํŠธ์›จ์–ด ์•„ํ‚คํ…ํŠธ๋Š” AI ๊ธฐ๋ฐ˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ค๊ณ„ ์‹œ, ๋‹จ์ˆœํžˆ ํ”„๋กฌํ”„ํŠธ๋ฅผ ๊ฐœ์„ ํ•˜๋Š” ๊ฒƒ์— ์˜์กดํ•˜์ง€ ์•Š๊ณ  E, T, C, S, L, V์˜ 6๋Œ€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋Ÿฐํƒ€์ž„ ์ œ์–ด, ์ƒํƒœ ์˜์†์„ฑ, ๋ฉ€ํ‹ฐ ์—์ด์ „ํŠธ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ํ† ํด๋กœ์ง€ ๋“ฑ ์ „์ฒด ์ธํ”„๋ผ ์ŠคํŠธ๋Ÿญ์ฒ˜์˜ ๊ฑฐ์‹œ์  ๊ตฌ์กฐ๋ฅผ ๊ธฐํšํ•ฉ๋‹ˆ๋‹ค. +- **Operation / Maintenance:** ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋Š” AgentOps, Langfuse์™€ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ํ†ตํ•ด L-component์™€ V-component๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋ฉฐ ์„ธ์…˜ ํ† ํฐ ๋น„์šฉ, ์‹คํ–‰ ๊ถค์ (Trace), ๋ฌดํ•œ ๋ฃจํ”„, ์ปจํ…์ŠคํŠธ ์ƒํƒœ๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ถ”์ ํ•˜๊ณ  ์‚ฌํ›„ ๋””๋ฒ„๊น… ๋ฐ ๊ฐ์‚ฌ(Auditing)๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. +- **Learning Path:** LLM ํ”„๋กฌํ”„ํŠธ ์ž‘์„ฑ๊ณผ RAG(๊ฒ€์ƒ‰ ์ฆ๊ฐ• ์ƒ์„ฑ)์— ์ต์ˆ™ํ•ด์ง„ ์—”์ง€๋‹ˆ์–ด๊ฐ€ ์—์ด์ „ํŠธ์˜ ์•ˆ์ •์„ฑ์„ ํ™•๋ณดํ•˜๊ธฐ ์œ„ํ•ด ํ•„์ˆ˜์ ์œผ๋กœ ํ•™์Šตํ•ด์•ผ ํ•˜๋Š” ์ƒ์œ„ ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค. ์šด์˜์ฒด์ œ(OS)์˜ ์ปค๋„๊ณผ ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ์ดํ•ดํ•˜๋“ฏ AI ์—์ด์ „ํŠธ์˜ ํ†ต์ œ ํ™˜๊ฒฝ ๊ตฌ์ถ•์„ ํ•™์Šตํ•˜๋Š” ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค. +- **My Project Relevance:** ํ˜„์žฌ ์ž์œจ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ์ฝ”๋”ฉ ์—์ด์ „ํŠธ๋‚˜ ๋น„์ฆˆ๋‹ˆ์Šค ์ž๋™ํ™” ๋ด‡์„ ๊ฐœ๋ฐœ ์ค‘์ด๋ผ๋ฉด, ๋ชจ๋ธ์˜ ์˜ค๋ฅ˜๋กœ ์ธํ•œ ์‹œ์Šคํ…œ ํŒŒ๊ดด๋ฅผ ๋ง‰๋Š” ์ƒŒ๋“œ๋ฐ•์‹ฑ ์ ์šฉ, MCP๋ฅผ ํ†ตํ•œ ํ™•์žฅ์„ฑ ๋†’์€ ์‚ฌ๋‚ด API ์—ฐ๋™, ๊ทธ๋ฆฌ๊ณ  ํœด๋จผ-์ธ-๋”-๋ฃจํ”„(HITL) ๊ธฐ๋ฐ˜์˜ ์Šน์ธ ๊ฒŒ์ดํŠธ์›จ์ด ๋„์ž… ๋“ฑ ํ”„๋กœ์ ํŠธ์˜ ์‹ ๋ขฐ์„ฑ๊ณผ ๊ธฐ์—… ๋ณด์•ˆ ์ปดํ”Œ๋ผ์ด์–ธ์Šค๋ฅผ ํ™•๋ณดํ•˜๋Š” ๋ฐ ์ง๊ฒฐ๋ฉ๋‹ˆ๋‹ค. + +### Adjacent Topics + +- [[LLM Evaluation Frameworks]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋‹จ์ˆœํžˆ ํ•˜๋„ค์Šค ์ธํ”„๋ผ๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์„ ๋„˜์–ด, SWE-bench, HAL, AgencyBench ๋“ฑ ํ•˜๋„ค์Šค ๋‚ด๋ถ€์—์„œ ์—์ด์ „ํŠธ์˜ ๋ณต์žกํ•œ ์‹คํ–‰ ๊ถค์ (Trajectory)์„ ๊ฐ๊ด€์ ์ด๊ณ  ์žฌํ˜„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ‰๊ฐ€ํ•˜๊ณ  ์ธก์ •ํ•˜๋Š” ๋ฒค์น˜๋งˆํ‚น ๋ฐฉ๋ฒ•๋ก ์œผ๋กœ์˜ ํ™•์žฅ. +- [[Agentic Cybersecurity]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๊ฐ„์ ‘ ํ”„๋กฌํ”„ํŠธ ์ธ์ ์…˜ ๋ฐฉ์–ด, ๋ฉ”๋ชจ๋ฆฌ ํฌ์ด์ฆˆ๋‹ ๋ฐฉ์ง€, ์ตœ์†Œ ๊ถŒํ•œ ์›์น™ ๊ธฐ๋ฐ˜์˜ ๋„๊ตฌ ์ ‘๊ทผ ์ œ์–ด ๋“ฑ ์ž์œจ์  ์—์ด์ „ํŠธ๊ฐ€ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ๋Š” ์ƒˆ๋กœ์šด ํ˜•ํƒœ์˜ ์‚ฌ์ด๋ฒ„ ๋ณด์•ˆ ์œ„ํ˜‘๊ณผ ๋ฐฉ์–ด ์•„ํ‚คํ…์ฒ˜(์˜ˆ: OpenClaw PRISM, OAP) ์—ฐ๊ตฌ๋กœ์˜ ํ™•์žฅ. + +--- +*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 new file mode 100644 index 00000000..b62a41f5 --- /dev/null +++ b/00_Raw/Agent Skills (Anthropic).md @@ -0,0 +1,61 @@ +# [[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/Agent State Store.md b/00_Raw/Agent State Store.md new file mode 100644 index 00000000..44b552ec --- /dev/null +++ b/00_Raw/Agent State Store.md @@ -0,0 +1,64 @@ +# [[Agent State Store]] + +## ๐Ÿ“Œ Brief Summary +Agent State Store(S-component)๋Š” ์—์ด์ „ํŠธ ํ•˜๋„ค์Šค(Agent Harness) ์•„ํ‚คํ…์ฒ˜์˜ 6๋Œ€ ํ•ต์‹ฌ ๊ตฌ์„ฑ ์š”์†Œ ์ค‘ ํ•˜๋‚˜๋กœ, ์—์ด์ „ํŠธ์˜ ๋‹ค์ค‘ ํ„ด(multi-turn) ๋ฐ ์„ธ์…˜ ๊ฐ„ ์ƒํƒœ ์ง€์†์„ฑ์„ ๊ด€๋ฆฌํ•˜๋Š” ์‹œ์Šคํ…œ์ด๋‹ค [1, 2]. ์ด๋Š” ์ž‘์—… ๊ด€๋ จ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜์—ฌ ์‹คํ–‰ ๋ฃจํ”„๊ฐ€ ๋ถ€๋ถ„์ ์ธ ์‹คํŒจ(partial failures)๋กœ๋ถ€ํ„ฐ ๋ณต๊ตฌํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•œ๋‹ค [2, 3]. ๋‹จ์ˆœํ•œ ๋‹จ๊ธฐ ๋กœ๊ทธ ์ €์žฅ์„ ๋„˜์–ด, ์—์ด์ „ํŠธ๊ฐ€ ๊ฒฝํ—˜์„ ์ถ”์ƒํ™”ํ•˜์—ฌ ์ ˆ์ฐจ์ ยท์—ํ”ผ์†Œ๋“œ์  ์ง€์‹์œผ๋กœ ์ €์žฅํ•˜๊ณ  ํ›„์† ์ž‘์—…์— ์•ˆ์ „ํ•˜๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ†ต์ œํ•˜๋Š” ์ธํ”„๋ผ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค [4-6]. + +## ๐Ÿ“– Core Content +* **์—ญํ• ๊ณผ ๊ธฐ๋Šฅ:** ์ƒํƒœ ์ €์žฅ์†Œ๋Š” ๋ชจ๋ธ์˜ ์ œํ•œ๋œ ์ปจํ…์ŠคํŠธ ์œˆ๋„์šฐ๋ฅผ ๋„˜์–ด ์—์ด์ „ํŠธ๊ฐ€ ์žฅ๊ธฐ์ ์ธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•˜๋Š” ๊ธฐ๋ฐ˜์ด๋‹ค [5, 6]. ์ด๋Š” ์ดˆ๊ธฐ LLM ์—์ด์ „ํŠธ ํ”„๋ ˆ์ž„์›Œํฌ(์˜ˆ: AutoGPT, BabyAGI)๋“ค์ด ๋‹ค์ค‘ ๋‹จ๊ณ„ ์ž‘์—… ์ค‘๋‹จ์„ ๊ฒช์„ ๋•Œ ๋ฐœ์ƒํ•˜๋˜ '์ƒํƒœ ์ƒ์‹ค(state loss)' ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ํ•„์ˆ˜์ ์ธ ๋Ÿฐํƒ€์ž„ ๊ฑฐ๋ฒ„๋„Œ์Šค(runtime governance)์ด๋‹ค [7, 8]. +* **๋ฉ”๋ชจ๋ฆฌ ๊ณ„์ธต ๋ฐ ๊ตฌ์กฐ:** ํ˜„๋Œ€ ํ•˜๋„ค์Šค๋Š” ์ž‘์—… ๋ฉ”๋ชจ๋ฆฌ(working memory), ์—ํ”ผ์†Œ๋“œ ๋ฉ”๋ชจ๋ฆฌ(episodic memory), ์‹œ๋งจํ‹ฑ ๋ฉ”๋ชจ๋ฆฌ(semantic memory), ์ ˆ์ฐจ์  ๋ฉ”๋ชจ๋ฆฌ(procedural memory) ๋“ฑ์˜ ํ˜•ํƒœ๋กœ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค [9-11]. ์˜ˆ๋ฅผ ๋“ค์–ด Voyager์˜ ์Šคํ‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ฒ˜๋Ÿผ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ ˆ์ฐจ์  ๋Šฅ๋ ฅ์„ ์ €์žฅํ•˜๊ฑฐ๋‚˜, Reflexion์ฒ˜๋Ÿผ ์‹คํŒจํ•œ ์‹คํ–‰ ์ถ”์ ์—์„œ ์–ป์€ ์ž๊ธฐ ๋น„ํŒ(self-critiques)์„ ์—ํ”ผ์†Œ๋“œ ๋ฒ„ํผ์— ์ €์žฅํ•˜์—ฌ ์ž๊ฐ€ ๊ฐœ์„ ์„ ๋•๋Š”๋‹ค [4, 12-14]. +* **ํŒŒ์ผ ์‹œ์Šคํ…œ ๋ฐ ์•„ํ‹ฐํŒฉํŠธ(Artifact) ์ €์žฅ:** ํ”„๋กœ๋•์…˜๊ธ‰ ํ•˜๋„ค์Šค ์‹œ์Šคํ…œ(์˜ˆ: DeepAgents)์—์„œ๋Š” ํŒŒ์ผ ์‹œ์Šคํ…œ์ด๋‚˜ ๊ฐ€์ƒ ์•„ํ‹ฐํŒฉํŠธ ์ €์žฅ์†Œ๋ฅผ ๊ธฐ๋ณธ ์ž‘์—… ๋ฉ”๋ชจ๋ฆฌ ๊ธฐํŒ(working-memory substrate)์œผ๋กœ ์ทจ๊ธ‰ํ•œ๋‹ค [15, 16]. ๋Œ€๊ทœ๋ชจ ๋„๊ตฌ ์ถœ๋ ฅ๊ฐ’์ด๋‚˜ ์ค‘๊ฐ„ ์ž‘์—… ๊ฒฐ๊ณผ๋ฌผ์„ ํ”„๋กฌํ”„ํŠธ ์ปจํ…์ŠคํŠธ์—์„œ ์ œ์™ธํ•˜์—ฌ ์•„ํ‹ฐํŒฉํŠธ๋กœ ์˜คํ”„๋กœ๋“œ(offload)ํ•˜๊ณ , ๋‹ค์ค‘ ์—์ด์ „ํŠธ ๊ฐ„์˜ ์ƒํƒœ๋ฅผ ๊ณต์œ ํ•˜๊ฑฐ๋‚˜ ๋ณต๊ตฌํ•˜๋Š” ๋ฐ ํ™œ์šฉํ•œ๋‹ค [15, 16]. +* **์ถ”๋ก  ๊ฒฐํ•ฉ ์ง€์†์„ฑ(Inference-Coupled Persistence):** S-component์— ๊ธฐ๋ก๋˜๋Š” ๋‚ด์šฉ์€ ์ข…์ข… ๋ชจ๋ธ์˜ ์ถ”๋ก ์„ ํ†ตํ•ด ์ƒ์„ฑ๋œ ๋Šฅ๋™์  ๊ฒฐ๊ณผ๋ฌผ(์˜ˆ: ์ž๊ธฐ ๋ฐ˜์„ฑ ํ‰๊ฐ€, ์œ ๋„๋œ ์›Œํฌํ”Œ๋กœ ์Šคํ‚ฌ ๋“ฑ)์ด๋‹ค [17, 18]. ์ด๋กœ ์ธํ•ด ํ•˜๋„ค์Šค๋Š” ์ €์žฅ ๋ฐฉ์‹ ๋ฉ”์ปค๋‹ˆ์ฆ˜๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ์˜ค์—ผ๋˜๊ฑฐ๋‚˜ ์ž˜๋ชป๋œ ์ง€์‹์ด ์˜๊ตฌ ์ €์žฅ์†Œ์— ๊ธฐ๋ก๋˜์ง€ ์•Š๋„๋ก ์ €์žฅ ๋‚ด์šฉ์˜ ํ’ˆ์งˆ(quality)๋„ ์ง์ ‘ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋Š” ์˜๋ฌด๋ฅผ ์ง€๋‹Œ๋‹ค [17, 18]. + +## โš–๏ธ Trade-offs & Caveats +* **๋ฉ”๋ชจ๋ฆฌ ์˜ค์—ผ(Memory Poisoning) ๋ฐ ๋ณด์•ˆ ์ทจ์•ฝ์ :** ์—์ด์ „ํŠธ๊ฐ€ ์˜๊ตฌ ์ €์žฅ์†Œ(S-component)์— ์ฝ˜ํ…์ธ ๋ฅผ ๊ธฐ๋กํ•  ๊ถŒํ•œ์„ ๊ฐ€์งˆ ๋•Œ, ๊ณต๊ฒฉ์ž๊ฐ€ ์•…์˜์ ์ธ ํ”„๋กฌํ”„ํŠธ๋‚˜ ์ž˜๋ชป๋œ ์‹ ๋…์„ ์ฃผ์ž…ํ•˜๋ฉด ์„ธ์…˜ ๊ฒฝ๊ณ„๋ฅผ ๋„˜์–ด ์ง€์†๋˜๋Š” ์น˜๋ช…์ ์ธ ๋ณด์•ˆ ๋ฒกํ„ฐ๊ฐ€ ํ˜•์„ฑ๋œ๋‹ค [19-22]. ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๋ ค๋ฉด L-component(Lifecycle Hooks)๋ฅผ ํ†ตํ•ด ์“ฐ๊ธฐ ์‹œ์ ์— ์—„๊ฒฉํ•œ ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ์ด ์ด๋ฃจ์–ด์ ธ์•ผ ํ•˜์ง€๋งŒ, ํ˜„์žฌ ๋Œ€๋ถ€๋ถ„์˜ ํ”„๋กœ๋•์…˜ ํ•˜๋„ค์Šค๋Š” ์ด๋ฅผ ์ œ๋Œ€๋กœ ๊ตฌํ˜„ํ•˜์ง€ ๋ชปํ•˜๊ณ  ์žˆ๋‹ค [20, 23, 24]. +* **๋ฉ”๋ชจ๋ฆฌ ํŒฝ์ฐฝ(Memory Bloat)๊ณผ ๊ฒ€์ƒ‰ ํ’ˆ์งˆ ์ €ํ•˜:** ์žฅ๊ธฐ ์‹คํ–‰ ์—์ด์ „ํŠธ์˜ ๊ฒฝ์šฐ, ๊ด€๋ จ์„ฑ์ด ๋–จ์–ด์ง€๋Š” ์ •๋ณด๊ฐ€ S-component์— ๋ฌด๋ถ„๋ณ„ํ•˜๊ฒŒ ์ถ•์ ๋˜๋ฉด ํ–ฅํ›„ ๊ฒ€์ƒ‰ ์‹œ ์‹ ํ˜ธ ๋Œ€๋น„ ์žก์Œ๋น„(signal-to-noise ratio)๊ฐ€ ํ•˜๋ฝํ•œ๋‹ค [25, 26]. Ebbinghaus ๋ง๊ฐ ๊ณก์„ ์ด๋‚˜ ์ ์ ˆํ•œ ์Šค์ผ€์ค„๋ง ์ •์ฑ…์— ์˜ํ•œ ์š”์•ฝ ๋ฐ ์ถ•์ถœ(eviction)์ด ์—†์œผ๋ฉด '์ปจํ…์ŠคํŠธ ๋ถ€ํŒจ(Context Rot)'๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ํ† ํฐ ๋น„์šฉ์ด ๋น„์„ ํ˜•์ ์œผ๋กœ ์ฆ๊ฐ€ํ•˜๊ณ  ์ถ”๋ก  ๋Šฅ๋ ฅ์ด ์ €ํ•˜๋œ๋‹ค [27-30]. +* **ํ‘œ์ค€ํ™”๋œ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ถ€์žฌ ๋ฐ ๋‹ค์ค‘ ์—์ด์ „ํŠธ ์ผ๊ด€์„ฑ ๋ฌธ์ œ:** MCP(Model Context Protocol)๋ฅผ ํ†ตํ•ด ๋„๊ตฌ(T-component) ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ํ‘œ์ค€ํ™”๋˜๋Š” ์ถ”์„ธ์™€ ๋‹ฌ๋ฆฌ, S-component๋Š” ๊ฐ ํ•˜๋„ค์Šค๋งˆ๋‹ค ๋…๋ฆฝ์ ์œผ๋กœ ์žฌ๊ตฌํ˜„๋˜์–ด ์ด์‹์„ฑ(portability)์ด ์—†๋‹ค [31, 32]. ์ด๋กœ ์ธํ•ด ๋‹ค์ค‘ ์—์ด์ „ํŠธ ํ™˜๊ฒฝ์—์„œ ์›์ž์  ๋ฌธ์„œ ์ „๋‹ฌ(atomic document handoffs), ์—์ด์ „ํŠธ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ๊ฐ€์šฉ์„ฑ, ๋™์‹œ ์“ฐ๊ธฐ๋กœ ์ธํ•œ ์ƒํƒœ ์ถฉ๋Œ ํ•ด๊ฒฐ ๋“ฑ์˜ ์ผ๊ด€์„ฑ(Consistency) ๋ณด์žฅ์ด ๋งค์šฐ ์ทจ์•ฝํ•˜๋‹ค [33-36]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [๊ด€๊ณ„ ์œ ํ˜• A (์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ )] +- [[Execution Loop (E-component)]] + - ์—ฐ๊ฒฐ ์ด์œ : ์ƒํƒœ ์ „์ด์™€ ๋ฃจํ”„ ์ œ์–ด๋ฅผ ๋‹ด๋‹นํ•˜๋Š” E-component๋Š” ๊ฐ ๋‹จ๊ณ„๋งˆ๋‹ค ์ƒํƒœ๋ฅผ S-component์— ์–ธ์ œ ๊ธฐ๋ก(commit)ํ• ์ง€ ๊ฒฐ์ •ํ•˜๋ฉฐ, ์‹คํ–‰ ์˜ค๋ฅ˜ ์‹œ S-component๋กœ๋ถ€ํ„ฐ ๋ณต๊ตฌ ์ƒํƒœ๋ฅผ ์ฝ์–ด์˜จ๋‹ค [1, 37]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํ•˜๋„ค์Šค์˜ ์ƒํƒœ ์ „์ด(State Transition) ์˜๋ฏธ๋ก ๊ณผ ๋ถ€๋ถ„์  ์‹คํŒจ ๋ณต๊ตฌ(Rollback/Recovery) ๋ฉ”์ปค๋‹ˆ์ฆ˜. +- [[Context Manager (C-component)]] + - ์—ฐ๊ฒฐ ์ด์œ : S-component์— ์ €์žฅ๋œ ๋Œ€๊ทœ๋ชจ ์žฅ๊ธฐ ์ƒํƒœ๋‚˜ ๊ณผ๊ฑฐ ์ถ”์  ๋ฐ์ดํ„ฐ ์ค‘์—์„œ ๋ชจ๋ธ์— ์ง€๊ธˆ ๋‹น์žฅ ํ•„์š”ํ•œ ์ •๋ณด๋งŒ ํ•„ํ„ฐ๋งํ•˜์—ฌ ์ปจํ…์ŠคํŠธ ์œˆ๋„์šฐ์— ์ฃผ์ž…(Injection)ํ•˜๋Š” ์ •์ฑ…์„ ๊ด€์žฅํ•œ๋‹ค [1, 38, 39]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ฉ”๋ชจ๋ฆฌ ๊ฒ€์ƒ‰ ์ง€์—ฐ ์‹œ๊ฐ„ ๋ฌธ์ œ ๋ฐ ์ปจํ…์ŠคํŠธ ์••์ถ•(Compaction)๊ณผ ์ƒํƒœ ๋ณด์กด ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ. +- [[Lifecycle Hooks (L-component)]] + - ์—ฐ๊ฒฐ ์ด์œ : S-component์˜ ์“ฐ๊ธฐ ๊ฒฝ๊ณ„(Write boundary)์—์„œ ์•…์˜์  ์ฝ˜ํ…์ธ ๋‚˜ ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜์ง€ ์•Š๋„๋ก ๊ฒ€์ฆํ•˜๊ณ , ์ ‘๊ทผ ์ œ์–ด๋ฅผ ์‹œํ–‰ํ•˜๋Š” ์ •์ฑ… ์ ์šฉ ๊ณ„์ธต์ด๋‹ค [1, 20]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ƒํƒœ ๊ด€๋ฆฌ์—์„œ์˜ ๋ณด์•ˆ ๊ฒฉ๋ฆฌ(Security Isolation) ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ์˜ค์—ผ ๋ฐฉ์ง€ ์ „๋žต. + +#### [๊ด€๊ณ„ ์œ ํ˜• B (๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ)] +- [[Filesystem/Artifact Store]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋งŽ์€ ํ˜„๋Œ€ ํ•˜๋„ค์Šค ์‹œ์Šคํ…œ(์˜ˆ: DeepAgents)์ด ํ† ํฐ ์˜ˆ์‚ฐ์„ ์ง€ํ‚ค๊ธฐ ์œ„ํ•ด ๋Œ€์šฉ๋Ÿ‰ ๋„๊ตฌ ์ถœ๋ ฅ์ด๋‚˜ ์ž‘์—… ์ด๋ ฅ์„ ์ปจํ…์ŠคํŠธ์— ์ง์ ‘ ๋„ฃ๋Š” ๋Œ€์‹ , ํŒŒ์ผ ์‹œ์Šคํ…œ์ด๋‚˜ ๊ฐ€์ƒ ์•„ํ‹ฐํŒฉํŠธ ์ €์žฅ์†Œ๋ฅผ S-component ๊ธฐํŒ์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค [15, 16]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ปจํ…์ŠคํŠธ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ๊ด€๋ฆฌ ๋ฐ ์˜คํ”„๋ณด๋”ฉ(Offloading)์„ ํ†ตํ•œ ๋ณต๊ตฌ ๊ฐ€๋Šฅ์„ฑ ํ™•๋ณด. +- [[Agent Workflow Memory (AWM)]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋‹จ์ˆœํžˆ ๊ณผ๊ฑฐ์˜ ์‚ฌ๊ฑด(Episodic)์„ ์ €์žฅํ•˜๋Š” ๊ฒƒ์„ ๋„˜์–ด, ์™„๋ฃŒ๋œ ์ž‘์—… ๊ถค์ ์—์„œ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์›Œํฌํ”Œ๋กœ ์ถ”์ƒํ™”๋ฅผ ์œ ๋„ํ•˜์—ฌ ์ €์žฅํ•˜๋Š” ๋ฐœ์ „๋œ ์ ˆ์ฐจ์  ์ƒํƒœ ์ €์žฅ(Procedural memory) ํ˜•ํƒœ์ด๋‹ค [27, 40, 41]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์žฅ๊ธฐ ์‹คํ–‰ ์—์ด์ „ํŠธ์˜ ์›Œํฌํ”Œ๋กœ ์ตœ์ ํ™” ๋ฐ ์ง€์†์  ํ•™์Šต(Continual learning). + +### Deeper Research Questions + +- ์—์ด์ „ํŠธ๊ฐ€ S-component์— ๋ฐ์ดํ„ฐ๋ฅผ ์“ธ ๋•Œ, ์•…์˜์ ์ธ ํ”„๋กฌํ”„ํŠธ ์ฃผ์ž…์ด๋‚˜ ๋ฐ์ดํ„ฐ ์œ ์ถœ์„ ์œ ๋„ํ•˜๋Š” '๋ฉ”๋ชจ๋ฆฌ ์˜ค์—ผ(Memory Poisoning)'์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด L-hook ์ˆ˜์ค€์—์„œ ์–ด๋–ค ๊ฒ€์ฆ ๊ตฌ์กฐ๋ฅผ ์„ค๊ณ„ํ•ด์•ผ ํ•˜๋Š”๊ฐ€? +- ๋‹ค์ค‘ ์—์ด์ „ํŠธ ์•™์ƒ๋ธ”์—์„œ ๊ณต์œ  ์ƒํƒœ(Shared State)์— ๋Œ€ํ•œ ๋™์‹œ ์“ฐ๊ธฐ(Concurrent writes)๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ, S-component๋Š” ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์˜ ์–ด๋–ค ์ผ๊ด€์„ฑ ๋ชจ๋ธ(Consistency model, ์˜ˆ: ์„ ํ˜•๊ฐ€๋Šฅ์„ฑ)์„ ์ฑ„ํƒํ•ด์•ผ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- ๋ชจ๋ธ์˜ ์ถ”๋ก  ๊ณผ์ •์„ ๊ฑฐ์ณ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ƒ์„ฑ๋˜๋Š” '์ถ”๋ก  ๊ฒฐํ•ฉ ์ง€์†์„ฑ(Inference-Coupled Persistence)' ๊ตฌ์กฐ์—์„œ, ๋ชจ๋ธ์˜ ์˜ค๋ฅ˜๋‚˜ ํ™˜๊ฐ์ด ์ ˆ์ฐจ์ /์—ํ”ผ์†Œ๋“œ์  ์˜๊ตฌ ์ €์žฅ์†Œ์— ์ „์ด๋˜์ง€ ์•Š๋„๋ก ๋ณด์žฅํ•˜๋Š” ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ(Quality-gate)๋Š” ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑํ•ด์•ผ ํ•˜๋Š”๊ฐ€? +- MCP(Model Context Protocol)๊ฐ€ ๋„๊ตฌ(Tool) ํ†ตํ•ฉ์„ ํ‘œ์ค€ํ™”ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ, S-component์˜ ์ƒํƒœ ์œ ์ง€ ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ API๋ฅผ ํ‘œ์ค€ํ™”ํ•˜์—ฌ ์—ฌ๋Ÿฌ ํ”„๋ ˆ์ž„์›Œํฌ ๊ฐ„์— ์—์ด์ „ํŠธ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ด์‹(Portability)ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์•ˆ์€ ๋ฌด์—‡์ธ๊ฐ€? +- 100๋งŒ ๊ฐœ ์ด์ƒ์˜ ํ† ํฐ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฑฐ๋Œ€ ์ปจํ…์ŠคํŠธ ์ฐฝ ๋ชจ๋ธ ํ™˜๊ฒฝ์—์„œ, S-component์˜ ์—ญํ• ์€ ๋‹จ์ˆœํ•œ '์ •๋ณด ๋ณด์กด ๋ฐ ์••์ถ•'์—์„œ '์ฃผ๋ชฉ๋„ ์Šค์ผ€์ค„๋ง(Attention/Salience Scheduling)'์œผ๋กœ ์–ด๋–ป๊ฒŒ ์ง„ํ™”ํ•ด์•ผ ํ•˜๋Š”๊ฐ€? + +### Practical Application Contexts + +- **Implementation:** ์ฝ”๋”ฉ ์—์ด์ „ํŠธ๋‚˜ ์—ฐ๊ตฌ ์—์ด์ „ํŠธ๋ฅผ ๊ฐœ๋ฐœํ•  ๋•Œ, ๋ฉ”๋ชจ๋ฆฌ ๋‚ด ์ƒํƒœ(in-memory state)์— ์˜์กดํ•˜์ง€ ์•Š๊ณ  JSONL ํŒŒ์ผ ๋กœ๊ทธ, SQLite ๊ธฐ๋ฐ˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋˜๋Š” Git ๋ถ„๊ธฐ(branch)๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ž‘์—… ์ด๋ ฅ์„ ์ฒดํฌํฌ์ธํŠธ ๋‹จ์œ„๋กœ ์˜๊ตฌ ๊ธฐ๋กํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ๋‹ค. +- **System Design:** ์žฅ๊ธฐ ์‹คํ–‰ ์ž‘์—… ๋„์ค‘ ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜, ๋„คํŠธ์›Œํฌ ํƒ€์ž„์•„์›ƒ, ์˜ˆ๊ธฐ์น˜ ์•Š์€ ์ปจํ…Œ์ด๋„ˆ ์ข…๋ฃŒ๊ฐ€ ๋ฐœ์ƒํ•˜๋”๋ผ๋„, S-component์— ์ €์žฅ๋œ ์„ธ์…˜ ์ƒํƒœ๋ฅผ ๋ณต์›(Wake & Resume)ํ•˜์—ฌ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๋‚ด๊ฒฐํ•จ์„ฑ(Fault-tolerance) ์•„ํ‚คํ…์ฒ˜๋ฅผ ์„ค๊ณ„ํ•œ๋‹ค. +- **Operation / Maintenance:** ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ์—์ด์ „ํŠธ๊ฐ€ ์ง€์† ์ž‘๋™ํ•จ์— ๋”ฐ๋ผ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์Œ“์ด๋Š” '์ข€๋น„ ๋ฉ”๋ชจ๋ฆฌ'๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด, Ebbinghaus ๋ง๊ฐ ๊ณก์„ ์ด๋‚˜ ์ตœ์‹ ์„ฑ(Recency)/๊ด€๋ จ์„ฑ(Relevance)์— ๊ธฐ๋ฐ˜ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์š”์•ฝ ๋ฐ ์ถ•์ถœ(Eviction) ํŒŒ์ดํ”„๋ผ์ธ์„ ์šด์˜ํ•œ๋‹ค. +- **Learning Path:** ๋‹จ์ˆœ ์ฑ—๋ด‡์˜ ๋Œ€ํ™” ์ปจํ…์ŠคํŠธ ์œ ์ง€(Conversation History)๋ฅผ ๋„˜์–ด์„œ์„œ, ์—์ด์ „ํŠธ ์šด์˜ ์ฒด์ œ(Agent OS) ๋ชจ๋ธ์—์„œ ์ œ์•ˆํ•˜๋Š” ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ ํŽ˜์ด์ง•(Virtual Paging) ๋ฉ”์ปค๋‹ˆ์ฆ˜๊ณผ ์˜๊ตฌ ์ €์žฅ์†Œ ๊ตฌ์กฐ ์„ค๊ณ„๋ก ์„ ํ•™์Šตํ•œ๋‹ค. +- **My Project Relevance:** ๋ณต์žกํ•œ ๋‹ค์ค‘ ๋‹จ๊ณ„ ๋ชฉํ‘œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์—์ด์ „ํŠธ ์‹œ์Šคํ…œ ๋„์ž… ์‹œ, ํ† ํฐ ์ดˆ๊ณผ๋กœ ์ธํ•œ '์ปจํ…์ŠคํŠธ ๋ถ€ํŒจ(Context Rot)' ๋ฌธ์ œ๋ฅผ ์„ ์ œ์ ์œผ๋กœ ํ•ด๊ฒฐํ•˜๊ณ  ๋ชจ๋ธ์˜ ์ด์ „ ๊ฒฐ์ • ๋…ผ๋ฆฌ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ €์žฅยท์žฌ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” ์ธํ”„๋ผ ๋ ˆ์ด์–ด๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐ ์ง์ ‘์ ์œผ๋กœ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. + +### Adjacent Topics + +- [[Vector Database / Semantic Search]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: S-component์— ๋ˆ„์ ๋œ ๋ฐฉ๋Œ€ํ•œ ์ƒํƒœ ๋กœ๊ทธ๋‚˜ ์—ํ”ผ์†Œ๋“œ ์ค‘, ํ˜„์žฌ ์ง๋ฉดํ•œ ๋ฌธ์ œ ํ•ด๊ฒฐ์— ๊ฐ€์žฅ ๊ด€๋ จ์„ฑ์ด ๋†’์€ ๊ณผ๊ฑฐ ๊ฒฝํ—˜(๋ฉ”๋ชจ๋ฆฌ)์„ ๋น ๋ฅด๊ณ  ์˜๋ฏธ๋ก ์ ์œผ๋กœ ๊ฒ€์ƒ‰ํ•˜์—ฌ ์ปจํ…์ŠคํŠธ์— ์ฃผ์ž…ํ•˜๋Š” ๊ธฐ์ˆ ๋กœ ํ™•์žฅ. +- [[Model Context Protocol (MCP)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ์™ธ๋ถ€ ๋„๊ตฌ ๋ฐ ์‹œ์Šคํ…œ๊ณผ์˜ ์—ฐ๊ฒฐ์„ ํ‘œ์ค€ํ™”ํ•˜๋Š” MCP์˜ ๋ฐœ์ „ ์–‘์ƒ์„ ์ฐธ๊ณ ํ•˜์—ฌ, ํ–ฅํ›„ ๋ถ„์‚ฐ ํ•˜๋„ค์Šค ๊ฐ„์˜ S-component ์ƒํƒœ ์ƒ์† ๋ฐ ๊ถŒํ•œ ์ „ํŒŒ ํ”„๋กœํ† ์ฝœ์˜ ํ‘œ์ค€ํ™” ๋…ผ์˜๋กœ ํ™•์žฅ. + +--- +*Last updated: 2026-05-01* \ No newline at end of file diff --git a/00_Raw/Agent-Computer Interfaces (ACI).md b/00_Raw/Agent-Computer Interfaces (ACI).md new file mode 100644 index 00000000..1fa97c72 --- /dev/null +++ b/00_Raw/Agent-Computer Interfaces (ACI).md @@ -0,0 +1,67 @@ +# [[Agent-Computer Interfaces (ACI)]] + +## ๐Ÿ“Œ Brief Summary +**Agent-Computer Interface (ACI)**๋Š” AI ์—์ด์ „ํŠธ๊ฐ€ ์‹คํ–‰ ํ™˜๊ฒฝ๊ณผ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ๋ฐฉ์‹์„ ๊ทœ์ •ํ•˜๊ธฐ ์œ„ํ•ด ์—์ด์ „ํŠธ ํ•˜๋„ค์Šค(Agent Harness)๊ฐ€ ์„ค๊ณ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค ๊ณ„์ธต์ž…๋‹ˆ๋‹ค [1, 2]. ์ด ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์—์ด์ „ํŠธ๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ช…๋ น์–ด ์„ธํŠธ, ์ˆ˜์‹ ํ•˜๋Š” ์ƒํƒœ ํ‘œํ˜„, ํŒŒ์‹ฑํ•ด์•ผ ํ•˜๋Š” ์—๋Ÿฌ ํฌ๋งท ๋“ฑ์„ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค [2]. ACI์˜ ์„ค๊ณ„๋Š” ๊ธฐ์ดˆ ๋ชจ๋ธ(Underlying model)์˜ ํ’ˆ์งˆ๊ณผ ๋…๋ฆฝ์ ์œผ๋กœ ์—์ด์ „ํŠธ์˜ ๊ณ„ํš ์„ฑ๋Šฅ๊ณผ ์—ญ๋Ÿ‰์„ ๊ฒฐ์ •์ง“๋Š” ํ•ต์‹ฌ ์š”์†Œ๋กœ ์ž‘์šฉํ•ฉ๋‹ˆ๋‹ค [1, 2]. + +## ๐Ÿ“– Core Content + +* **ํ•˜๋„ค์Šค์˜ ๊ณ ์œ  ๊ถŒํ•œ ๋ฐ ์ฑ…์ž„:** ACI๋Š” ์ „์ ์œผ๋กœ ์—์ด์ „ํŠธ ํ•˜๋„ค์Šค์— ์˜ํ•ด ์„ค๊ณ„ ๋ฐ ํ†ต์ œ๋ฉ๋‹ˆ๋‹ค [2]. ์—์ด์ „ํŠธ ๋ชจ๋ธ ์ž์ฒด๋Š” ์ž์‹ ์—๊ฒŒ ์ฃผ์–ด์ง„ ๋ช…๋ น์–ด ์„ธํŠธ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜, ์ˆ˜์‹ ํ•˜๋Š” ์ƒํƒœ ํ‘œํ˜„์„ ์žฌ์„ค๊ณ„ํ•˜๊ฑฐ๋‚˜, ์—๋Ÿฌ ํฌ๋งท์„ ๋ฐ”๊ฟ€ ๊ถŒํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค [2]. ๋”ฐ๋ผ์„œ, ACI๋ฅผ ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์€ ๋ชจ๋ธ ์ž์ฒด์˜ ๊ธฐ๋Šฅ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ ํ•˜๋„ค์Šค ์—”์ง€๋‹ˆ์–ด๋ง์˜ ์ฃผ์š” ์ฑ…์ž„์œผ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค [2, 3]. +* **์„ฑ๋Šฅ์— ๋ฏธ์น˜๋Š” ๊ฒฐ์ •์  ์˜ํ–ฅ:** SWE-agent์˜ ์—ฐ๊ตฌ ๋“ฑ์—์„œ ์ž…์ฆ๋˜์—ˆ๋“ฏ, ACI ์„ค๊ณ„๋Š” ์—์ด์ „ํŠธ ์—ญ๋Ÿ‰์˜ '1์ฐจ ๊ฒฐ์ • ์š”์ธ(first-order determinant)'์ž…๋‹ˆ๋‹ค [1]. ๋ถ€์‹คํ•˜๊ฒŒ ์„ค๊ณ„๋œ ACI๋Š” ๋ชจ๋ธ์˜ ์ถ”๋ก  ์‹คํŒจ๊ฐ€ ์•„๋‹ˆ๋ผ, ์˜ฌ๋ฐ”๋ฅธ ์ถ”๋ก ์„ ๊ตฌ์กฐ์ ์œผ๋กœ ํ‘œํ˜„ํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ฆ์œผ๋กœ์จ ๋†’์€ ์—๋Ÿฌ์œจ์„ ์œ ๋ฐœํ•ฉ๋‹ˆ๋‹ค [1, 4]. ์ฆ‰, ACI์˜ ๊ตฌ์กฐ์  ์„ค๊ณ„๊ฐ€ ๋ชจ๋ธ ์ž์ฒด์˜ ์—ญ๋Ÿ‰๋ณด๋‹ค ๊ณ„ํš ์„ฑ๋Šฅ์— ๋” ํฐ ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค [2]. +* **ํ•„์ˆ˜ ์„ค๊ณ„ ์š”๊ตฌ์‚ฌํ•ญ:** ํšจ๊ณผ์ ์ธ ACI๊ฐ€ ๋˜๊ธฐ ์œ„ํ•ด ํ•˜๋„ค์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์š”์†Œ๋“ค์„ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [3]. + * ๊ฐ ํ–‰๋™ ์ดํ›„์˜ **๋ชจํ˜ธํ•˜์ง€ ์•Š์€ ๋ช…ํ™•ํ•œ ์ƒํƒœ ํ‘œํ˜„(unambiguous state representations)** ์ œ๊ณต. + * ๋ณต๊ตฌ ๊ฐ€๋Šฅํ•œ ์‹คํŒจ์™€ ๋ณต๊ตฌ ๋ถˆ๊ฐ€๋Šฅํ•œ ์‹คํŒจ๋ฅผ ๊ตฌ๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š” **๊ตฌ์กฐํ™”๋˜๊ณ  ํŒŒ์‹ฑ ๊ฐ€๋Šฅํ•œ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€(structured, parseable error messages)** ๋ฐ˜ํ™˜. + * ๋ชจ๋ธ์ด ์œ ํšจํ•œ ํ–‰๋™ ์ˆœ์„œ๋ฅผ ์ถ”์ธกํ•  ํ•„์š”๊ฐ€ ์—†๋„๋ก ํ•˜๋Š” **์ตœ์†Œํ•œ์ด๋˜ ์™„์ „ํ•œ ๋ช…๋ น์–ด ์–ดํœ˜(minimal but complete command vocabulary)** ๋…ธ์ถœ. + * ๋Œ์ดํ‚ฌ ์ˆ˜ ์—†๋Š” ํ–‰๋™์ด ์‹คํ–‰๋˜๊ธฐ ์ „์—, ๊ณ„ํš ์Šน์ธ ๊ฒŒ์ดํŠธ(plan approval gate)๋ฅผ ํ†ตํ•ด ์ ๊ฒ€๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” **๊ฒ€์ฆ ๊ฐ€๋Šฅํ•œ ๊ณ„ํš ํฌ๋งท(checkable plan formats)** ์ œ์‹œ. +* **๋„๋ฉ”์ธ ํŠนํ™” ๋ฐ ๊ถŒํ•œ ์ œ์–ด:** ACI๋Š” ๋ชจ๋ธ์— ๋ฒ”์šฉ์ ์ธ bash ์…ธ์„ ๊ทธ๋Œ€๋กœ ์ œ๊ณตํ•˜๋Š” ๋Œ€์‹ , ๋ชฉ์ ์— ๋งž๊ฒŒ ํŠนํ™”๋œ(purpose-built) ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5]. ์˜ˆ๋ฅผ ๋“ค์–ด SWE-agent์˜ ACIface ๋ชจ๋ธ์€ ์†Œํ”„ํŠธ์›จ์–ด ์—”์ง€๋‹ˆ์–ด๋ง ์ž‘์—…์— ์ ์ ˆํ•˜๋„๋ก ํŒŒ์ผ ๋ทฐ์–ด, ๊ฒ€์ƒ‰, ํŽธ์ง‘ ๋„๊ตฌ๋ฅผ ๋ช…์‹œ์  ์ƒํƒœ ์ œ์•ฝ๊ณผ ํ•จ๊ป˜ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [5, 6]. ์ด๋Š” ์—์ด์ „ํŠธ๊ฐ€ ์ „์ฒด ๋„๊ตฌ ์นดํƒˆ๋กœ๊ทธ์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์„ ๋ง‰๊ณ , ์‹คํ–‰ ์ „ ์—ญ๋Ÿ‰์„ ์ œํ•œ(pre-execution capability restriction)ํ•˜์—ฌ ์•ˆ์ „์„ฑ์„ ๋†’์ด๋Š” ํŒจํ„ด์ž…๋‹ˆ๋‹ค [6, 7]. + +## โš–๏ธ Trade-offs & Caveats + +* **์ธํ„ฐํŽ˜์ด์Šค ์„ธ๊ธˆ(Interface Tax)์˜ ๋ฐœ์ƒ ์œ„ํ—˜:** ACI๊ฐ€ ๋ชจํ˜ธํ•œ ์ƒํƒœ ํ‘œํ˜„์ด๋‚˜ ๋ถˆ์ถฉ๋ถ„ํ•œ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์ž˜๋ชป ์„ค๊ณ„๋  ๊ฒฝ์šฐ, ๋ชจ๋ธ์˜ ๊ณ„ํš ์˜ˆ์‚ฐ(planning budget)์— ์ด๋ฅธ๋ฐ” '์ธํ„ฐํŽ˜์ด์Šค ์„ธ๊ธˆ'์ด ๋ถ€๊ณผ๋ฉ๋‹ˆ๋‹ค [2]. ๋ชจ๋ธ์€ ์‹ค์ œ ๋‹น๋ฉดํ•œ ์ž‘์—…์— ๋Œ€ํ•ด ์ถ”๋ก ํ•˜๋Š” ๋Œ€์‹ , ํ•˜๋„ค์Šค๊ฐ€ ์–ด๋–ค ์˜๋ฏธ๋กœ ์ด๋Ÿฌํ•œ ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ–ˆ๋Š”์ง€ ์œ ์ถ”ํ•˜๋Š” ๋ฐ ์œ ํ•œํ•œ ํ† ํฐ๊ณผ ์—ฐ์‚ฐ ์ž์›์„ ๋‚ญ๋น„ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค [2]. +* **ํŠนํ™”(Specialization) vs. ๋ฒ”์šฉ์„ฑ(Generality)์˜ ๊ท ํ˜•:** ๋„๋ฉ”์ธ์— ํŠนํ™”๋œ ์ œํ•œ์  ์…ธ ์ธํ„ฐํŽ˜์ด์Šค(์˜ˆ: ACIface)๋ฅผ ๋…ธ์ถœํ•˜๋ฉด ๋ณด์•ˆ๊ณผ ์ •ํ™•๋„๋Š” ๋†’์•„์ง€์ง€๋งŒ, ๋ชจ๋ธ์ด ์›๋ž˜ ํ•˜๋„ค์Šค์— ์กด์žฌํ•˜๋Š” ์ „์ฒด ๋„๊ตฌ ์นดํƒˆ๋กœ๊ทธ๋ฅผ ํ™œ์šฉํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ๋˜๋Š” ์ œ์•ฝ์ด ๋”ฐ๋ฆ…๋‹ˆ๋‹ค [6]. ๋”ฐ๋ผ์„œ ACI๋Š” ์—์ด์ „ํŠธ์˜ ์ž ์žฌ๋ ฅ์„ ์ œํ•œํ•˜์ง€ ์•Š๋„๋ก "์ตœ์†Œํ•œ์ด๋˜ ์™„์ „ํ•œ(minimal but complete)" ๋ช…๋ น์–ด ์„ธํŠธ๋ฅผ ๊ตฌ์„ฑํ•ด์•ผ ํ•˜๋Š” ๊นŒ๋‹ค๋กœ์šด ์„ค๊ณ„ ๊ท ํ˜•์„ ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค [3]. +* **ํ•˜๋„ค์Šค์— ๋Œ€ํ•œ ์™„๋ฒฝํ•œ ์ข…์†:** ๋ชจ๋ธ์€ ACI์˜ ๊ฒฐํ•จ(์˜ˆ: ์ž˜๋ชป๋œ ์—๋Ÿฌ ํ”ผ๋“œ๋ฐฑ ํ˜•์‹, ๋ˆ„๋ฝ๋œ ๋„๊ตฌ ๋ช…๋ น์–ด)์„ ์Šค์Šค๋กœ ์šฐํšŒํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค [2]. ์ด๋Š” ์—์ด์ „ํŠธ์˜ ์„ฑ๊ณต ์—ฌ๋ถ€๊ฐ€ ์ „์ ์œผ๋กœ ํ•˜๋„ค์Šค๋ฅผ ๊ฐœ๋ฐœํ•œ ์—”์ง€๋‹ˆ์–ด์˜ ์ธํ„ฐํŽ˜์ด์Šค ์„ค๊ณ„ ์—ญ๋Ÿ‰์— ์ข…์†๋œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค [2]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [๊ด€๊ณ„ ์œ ํ˜• A: ์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] +* [[Agent Harness]] + * ์—ฐ๊ฒฐ ์ด์œ : ACI๋Š” ์—์ด์ „ํŠธ ํ•˜๋„ค์Šค๊ฐ€ ์ „์ ์œผ๋กœ ์„ค๊ณ„ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ด๋ฏ€๋กœ ํ•˜๋„ค์Šค์˜ ํ•ต์‹ฌ ์ฑ…์ž„ ์˜์—ญ์— ์†ํ•ฉ๋‹ˆ๋‹ค [2]. + * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ง€๋Šฅํ˜• ๋ชจ๋ธ์ด ์•„๋‹Œ ํ•˜๋„ค์Šค ์ธํ”„๋ผ๊ฐ€ ์–ด๋–ป๊ฒŒ ์—์ด์ „ํŠธ์˜ ์‹คํ–‰ ํ™˜๊ฒฝ๊ณผ ํ–‰๋™์„ ์ œ์–ดํ•˜๊ณ  ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌ์„ฑํ•˜๋Š”์ง€ ๊ทผ๋ณธ์ ์ธ ์›๋ฆฌ๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1, 2]. +* [[Execution Environment]] + * ์—ฐ๊ฒฐ ์ด์œ : ACI๋Š” ์—์ด์ „ํŠธ๊ฐ€ ์‹คํ–‰ ํ™˜๊ฒฝ๊ณผ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ๋ฐฉ์‹์„ ๊ทœ์ •ํ•˜๋Š” ์ ‘์ (Interface)์ž…๋‹ˆ๋‹ค [1]. + * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ธํ„ฐํŽ˜์ด์Šค ์„ค๊ณ„๊ฐ€ ์‹ค์ œ ์ปจํ…Œ์ด๋„ˆ๋‚˜ ์ƒŒ๋“œ๋ฐ•์Šค ๊ฐ™์€ ์‹คํ–‰ ํ™˜๊ฒฝ์—์„œ ์—์ด์ „ํŠธ์˜ ์„ฑ๋Šฅ ๋ฐ ์—๋Ÿฌ์œจ์— ๋ฏธ์น˜๋Š” ๋…๋ฆฝ์ ์ธ ์˜ํ–ฅ์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1]. + +#### [๊ด€๊ณ„ ์œ ํ˜• B: ์„ค๊ณ„ ์›์น™ ๋ฐ ์ œ์•ฝ] +* [[Interface Tax]] + * ์—ฐ๊ฒฐ ์ด์œ : ๋ชจํ˜ธํ•˜๊ฑฐ๋‚˜ ๋ถˆ์ถฉ๋ถ„ํ•œ ACI ์„ค๊ณ„๋Š” ์—์ด์ „ํŠธ์˜ ๊ณ„ํš ์˜ˆ์‚ฐ(planning budget)์„ ๋‚ญ๋น„ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” '์ธํ„ฐํŽ˜์ด์Šค ์„ธ๊ธˆ'์„ ๋ถ€๊ณผํ•ฉ๋‹ˆ๋‹ค [2]. + * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ธํ„ฐํŽ˜์ด์Šค ์„ค๊ณ„์˜ ๊ฒฐํ•จ์ด ์–ด๋–ป๊ฒŒ ์—์ด์ „ํŠธ์˜ ์ถ”๋ก  ํ† ํฐ๊ณผ ์‹œ์Šคํ…œ ์ž์›(์˜ˆ์‚ฐ)์„ ๊ณ ๊ฐˆ์‹œํ‚ค๋Š”์ง€ ๊ฒฝ์ œ์ , ์„ฑ๋Šฅ์  ์ธก๋ฉด์—์„œ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2]. +* [[Capability Restriction]] + * ์—ฐ๊ฒฐ ์ด์œ : ACI ์„ค๊ณ„(์˜ˆ: SWE-agent์˜ ACIface)๋Š” ์—์ด์ „ํŠธ๊ฐ€ ์ „์ฒด ๋„๊ตฌ๋ฅผ ๋‹ค ๋ณด๋„๋ก ๋‘๋Š” ๋Œ€์‹  ์ž‘์—…์— ์ ํ•ฉํ•œ ์ œํ•œ๋œ ์…ธ ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ๋…ธ์ถœํ•˜๋„๋ก ์ œ์•ฝ์„ ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค [6]. + * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํ•˜๋„ค์Šค๊ฐ€ ์‹คํ–‰ ์ „ ๋‹จ๊ณ„(pre-execution)์—์„œ ์–ด๋–ป๊ฒŒ ์—์ด์ „ํŠธ์˜ ํ–‰๋™ ๋ฐ˜๊ฒฝ์„ ์ขํ˜€ ์˜ค๋ฅ˜๋ฅผ ์ค„์ด๊ณ  ์‹œ์Šคํ…œ์„ ๋ณดํ˜ธํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [6, 7]. + +### Deeper Research Questions + +* ๋ฒ”์šฉ bash ์…ธ ๋Œ€์‹  ๋„๋ฉ”์ธ์— ํŠนํ™”๋œ ACI๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ, "์ตœ์†Œํ•œ์ด๋˜ ์™„์ „ํ•œ(minimal but complete)" ๋ช…๋ น์–ด ์–ดํœ˜๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ์ •๋Ÿ‰์  ํ‰๊ฐ€ ๊ธฐ์ค€์ด๋‚˜ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๋ฌด์—‡์ธ๊ฐ€? +* ๋ชจํ˜ธํ•œ ์ƒํƒœ ํ‘œํ˜„๊ณผ ๋ถˆ์ถฉ๋ถ„ํ•œ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๊ฐ€ ๋ถ€๊ณผํ•˜๋Š” '์ธํ„ฐํŽ˜์ด์Šค ์„ธ๊ธˆ(Interface Tax)'์„ ๋ชจ๋ธ์˜ ์ถ”๋ก  ํ† ํฐ ๋ฐ ์‹œ๊ฐ„ ๋น„์šฉ ์ธก๋ฉด์—์„œ ์–ด๋–ป๊ฒŒ ์ •๋Ÿ‰์ ์œผ๋กœ ์ธก์ •ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? +* ACI์˜ ๊ฐ•๋ ฅํ•œ ๊ถŒํ•œ ๋ฐ ๋„๊ตฌ ๋…ธ์ถœ ์ œ์•ฝ(์˜ˆ: ACIface ๋ชจ๋ธ)์ด ์—์ด์ „ํŠธ์˜ ์ž์œจ์  ํƒ์ƒ‰(Autonomous exploration) ๋ฐ ๋ฌธ์ œ ํ•ด๊ฒฐ ์ฐฝ์˜์„ฑ์— ๋ฏธ์น˜๋Š” ๋ถ€์ •์ ์ธ ์˜ํ–ฅ์„ ์–ด๋–ป๊ฒŒ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? +* ๋ณต๊ตฌ ๊ฐ€๋Šฅํ•œ ์‹คํŒจ(recoverable)์™€ ๋ณต๊ตฌ ๋ถˆ๊ฐ€๋Šฅํ•œ ์‹คํŒจ(unrecoverable)๋ฅผ ๊ตฌ๋ถ„ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•˜๋Š” ACI์˜ ์—๋Ÿฌ ํฌ๋งท ์„ค๊ณ„๊ฐ€ ์—์ด์ „ํŠธ์˜ ์ž์ฒด ์ˆ˜์ •(Self-correction) ์‚ฌ์ดํด ์†๋„์— ๋ฏธ์น˜๋Š” ๊ตฌ์ฒด์ ์ธ ์˜ํ–ฅ์€ ๋ฌด์—‡์ธ๊ฐ€? +* ๋‹ค์–‘ํ•œ ๋ชจ๋ธ ์ œ๊ณต์ž(OpenAI, Anthropic ๋“ฑ)์˜ ์ƒ์ดํ•œ ๊ธฐ๋Šฅ, ์ปจํ…์ŠคํŠธ ์ œํ•œ, ํ•จ์ˆ˜ ํ˜ธ์ถœ ๊ทœ๊ฒฉ์„ ๋ชจ๋‘ ์ˆ˜์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ”์šฉ ACI ์„ค๊ณ„๋Š” ์–ด๋–ป๊ฒŒ ๊ฐ€๋Šฅํ•œ๊ฐ€? + +### Practical Application Contexts + +* **Implementation:** SWE-agent์™€ ๊ฐ™์€ ์‹œ์Šคํ…œ์„ ๊ตฌํ˜„ํ•  ๋•Œ, ๋ชจ๋ธ์ด ์ž„์˜์˜ ์‹œ์Šคํ…œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋‘์ง€ ์•Š๊ณ , ํŒŒ์ผ ๋ทฐ์–ด๋‚˜ ๊ฒ€์ƒ‰ ๋„๊ตฌ ๋“ฑ ๋ชฉ์ ์— ๋งž๊ฒŒ ํŠนํ™”๋œ(purpose-built) ์ œํ•œ์  ์…ธ ์ธํ„ฐํŽ˜์ด์Šค(ACI)๋ฅผ ๊ตฌ์ถ•ํ•˜์—ฌ ์—์ด์ „ํŠธ๋ฅผ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค [5, 6]. +* **System Design:** ์—์ด์ „ํŠธ๊ฐ€ ๋Œ์ดํ‚ฌ ์ˆ˜ ์—†๋Š” ํŒŒ๊ดด์ ์ธ ํ–‰๋™์„ ์‹คํ–‰ํ•˜๊ธฐ ์ „์—, ์ธ๊ฐ„์ด๋‚˜ ์ •์ฑ… ๊ฒŒ์ดํŠธ๊ฐ€ ๊ณ„ํš์„ ๊ฒ€ํ† ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ช…ํ™•ํ•˜๊ณ  ๊ฒ€์ฆ ๊ฐ€๋Šฅํ•œ ๊ณ„ํš ํฌ๋งท(checkable plan formats)์„ ์ƒ์„ฑํ•˜๋„๋ก ACI๋ฅผ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค [3]. +* **Operation / Maintenance:** ๋ชจ๋ธ์ด ์ž‘์—… ์‹คํŒจ ์ด์œ ๋ฅผ ๋ช…ํ™•ํžˆ ์ธ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก, ์‹œ์Šคํ…œ ๋กœ๊ทธ์—์„œ ๋‹จ์ˆœํžˆ ์›์‹œ ์˜ค๋ฅ˜๋ฅผ ๋˜์ง€๋Š” ๋Œ€์‹  ๋ณต๊ตฌ ๊ฐ€๋Šฅํ•œ ์—๋Ÿฌ์™€ ๋ถˆ๊ฐ€๋Šฅํ•œ ์—๋Ÿฌ๋ฅผ ๊ตฌ๋ถ„ํ•ด ํŒŒ์‹ฑ ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐํ™”๋œ ํ˜•ํƒœ์˜ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ๋กœ๊น… ์‹œ์Šคํ…œ์„ ์œ ์ง€๋ณด์ˆ˜ํ•ฉ๋‹ˆ๋‹ค [3]. +* **Learning Path:** ์—์ด์ „ํŠธ๋ฅผ ๊ฐœ๋ฐœํ•  ๋•Œ ๋ชจ๋ธ์˜ ํ”„๋กฌํ”„ํŠธ๋‚˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๊ฐœ์„ ํ•˜๋Š” ๋ฐ๋งŒ ๋ชฐ๋‘ํ•˜์ง€ ์•Š๊ณ , ๋ชจ๋ธ์ด ํ™˜๊ฒฝ๊ณผ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” '์ ‘์ (Interface)'์˜ ์„ค๊ณ„๊ฐ€ ์—์ด์ „ํŠธ์˜ ์„ฑ๋Šฅ๊ณผ ์—๋Ÿฌ์œจ์„ ๊ฒฐ์ •ํ•˜๋Š” ํ•ต์‹ฌ ๋ณ€์ˆ˜์ž„์„ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค [1, 2]. +* **My Project Relevance:** ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ์—์„œ ์—์ด์ „ํŠธ์— ์ž์œจ์„ฑ์„ ๋ถ€์—ฌํ•  ๋•Œ, ๋ฒ”์šฉ ํ„ฐ๋ฏธ๋„ ํ™˜๊ฒฝ์„ ๊ทธ๋Œ€๋กœ ๋…ธ์ถœํ•˜๋Š” ๋Œ€์‹  ์—„๊ฒฉํ•œ ์ œ์•ฝ๊ณผ ์ƒํƒœ ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•˜๋Š” ACI ๊ณ„์ธต์„ ๋„์ž…ํ•˜์—ฌ ์—์ด์ „ํŠธ์˜ ๋ฌดํ•œ ๋ฃจํ”„, ํ™˜๊ฐ, ๊ถŒํ•œ ๋‚จ์šฉ์„ ๋ฐฉ์ง€ํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2, 3, 5]. + +### Adjacent Topics + +* [[Context Engineering]] + * ํ™•์žฅ ๋ฐฉํ–ฅ: ACI๊ฐ€ ์—์ด์ „ํŠธ์—๊ฒŒ ์ œ๊ณตํ•˜๋Š” ์ƒํƒœ ํ‘œํ˜„์ด๋‚˜ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๊ฐ€ ๊ฒฐ๊ตญ ์—์ด์ „ํŠธ์˜ ์ปจํ…์ŠคํŠธ ์œˆ๋„์šฐ๋กœ ์œ ์ž…๋˜๋ฏ€๋กœ, ์ด ์ •๋ณด๋ฅผ ์–ด๋–ป๊ฒŒ ํšจ์œจ์ ์œผ๋กœ ์••์ถ•ํ•˜๊ณ  ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋งค๊ธธ ๊ฒƒ์ธ์ง€ ์ปจํ…์ŠคํŠธ ๊ด€๋ฆฌ ๊ธฐ๋ฒ•์œผ๋กœ ์กฐ์‚ฌ ๋ฒ”์œ„๋ฅผ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +* [[Agent Harness Security]] + * ํ™•์žฅ ๋ฐฉํ–ฅ: ACIface ๋ชจ๋ธ์ด ๋„๊ตฌ ๋…ธ์ถœ์„ ์ œ์•ฝํ•˜์—ฌ ๋ณด์•ˆ์„ ๋†’์ด๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, ํ•˜๋„ค์Šค ์ˆ˜์ค€์—์„œ์˜ ์ƒŒ๋“œ๋ฐ•์‹ฑ ๊ตฌ์กฐ, ๊ถŒํ•œ ์ œ์–ด, ํŒŒ๊ดด์  ํ–‰๋™์— ๋Œ€ํ•œ ๊ฐ€๋“œ๋ ˆ์ผ ์„ค๊ณ„ ๊ธฐ์ˆ  ์ „๋ฐ˜์œผ๋กœ ํ™•์žฅ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. + +--- +*Last updated: 2026-05-01* \ No newline at end of file diff --git a/00_Raw/Agent-to-Agent (A2A).md b/00_Raw/Agent-to-Agent (A2A).md new file mode 100644 index 00000000..1e3a8850 --- /dev/null +++ b/00_Raw/Agent-to-Agent (A2A).md @@ -0,0 +1,53 @@ +# [[Agent-to-Agent (A2A)]] + +## ๐Ÿ“Œ Brief Summary +Agent-to-Agent (A2A)๋Š” ๋‹ค์ค‘ ์—์ด์ „ํŠธ ์‹œ์Šคํ…œ์—์„œ ์„œ๋กœ ๋‹ค๋ฅธ ์—์ด์ „ํŠธ๋‚˜ ํ•˜๋„ค์Šค ๊ฐ„์˜ ์ž‘์—… ์œ„์ž„ ๋ฐ ์ƒํ˜ธ ํ†ต์‹ ์„ ํ‘œ์ค€ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์„ค๊ณ„๋œ ์˜คํ”ˆ ํ”„๋กœํ† ์ฝœ์ž…๋‹ˆ๋‹ค [1-3]. ์ฃผ๋กœ HTTPS, JSON-RPC, Server-Sent Events(SSE)๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ƒํƒœ ๊ธฐ๋ฐ˜์˜ ์ž‘์—… ๊ด€๋ฆฌ์™€ ์‹ค์‹œ๊ฐ„ ์ŠคํŠธ๋ฆฌ๋ฐ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค [3-6]. ์—์ด์ „ํŠธ ํ•˜๋„ค์Šค ์—”์ง€๋‹ˆ์–ด๋ง ๊ด€์ ์—์„œ A2A๋Š” ๊ฐœ๋ณ„ ๋„๊ตฌ ํ˜ธ์ถœ(MCP)์„ ๋„˜์–ด ์—์ด์ „ํŠธ ๊ฐ„์˜ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ๋ฐ ์กฐ์ • ๊ฒฝ๊ณ„(E-์ปดํฌ๋„ŒํŠธ)๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ํ•ต์‹ฌ ์ธํ”„๋ผ ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค [7, 8]. + +## ๐Ÿ“– Core ์†Œ Content +* **๋น„๋Œ€์นญ์  ๊ณ„์ธต ์œ„์ž„ ๊ตฌ์กฐ**: A2A ํ”„๋กœํ† ์ฝœ์€ ๋ณธ์งˆ์ ์œผ๋กœ ๋น„๋Œ€์นญ์ (asymmetric) ํŠน์„ฑ์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ์œ„์ž„ํ•˜๋Š” ํ•˜๋„ค์Šค์™€ ์œ„์ž„๋ฐ›๋Š” ํ•˜๋„ค์Šค๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, ์ด๋Š” ๋‹ค์ค‘ ํ•˜๋„ค์Šค ํ™˜๊ฒฝ์—์„œ ์ฃผ(Main) ์—์ด์ „ํŠธ๊ฐ€ ํ•˜์œ„ ์ž‘์—…์„ ์›๊ฒฉ ์—์ด์ „ํŠธ์—๊ฒŒ ์œ„์ž„ํ•˜๋Š” ๊ณ„์ธต์ (hierarchical) ๊ตฌ์กฐ์— ์ตœ์ ํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค [9, 10]. +* **์—์ด์ „ํŠธ ๊ฒ€์ƒ‰(Discovery) ๋ฉ”์ปค๋‹ˆ์ฆ˜**: ๊ฐ ํ•˜๋„ค์Šค๋Š” ์ž์‹ ์ด ํ˜ธ์ŠคํŒ…ํ•˜๋Š” ์—์ด์ „ํŠธ์˜ ๊ธฐ๋Šฅ(capability)๊ณผ ํ†ต์‹  ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ช…์‹œํ•˜๋Š” **'์—์ด์ „ํŠธ ์นด๋“œ(Agent Card)'**๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ์‹œ์Šคํ…œ์€ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง„ ๋‹ค๋ฅธ ์—์ด์ „ํŠธ๋ฅผ ๋™์ ์œผ๋กœ ํƒ์ƒ‰ํ•˜๊ณ  ์ž‘์—…์„ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [9-11]. +* **๋ฉ”์‹œ์ง€์™€ ์•„ํ‹ฐํŒฉํŠธ์˜ ๋ถ„๋ฆฌ**: A2A ํ”„๋กœํ† ์ฝœ์€ ํ†ต์‹  ๊ณผ์ •์—์„œ ๋‹จ์ˆœํ•œ ๋ฉ”์‹œ์ง€(messages)์™€ ๊ฒฐ๊ณผ๋ฌผ์ธ ์•„ํ‹ฐํŒฉํŠธ(artifacts)๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ž‘์—…์˜ ๊ฒฐ๊ณผ๋Š” ์ฑ„ํŒ… ๋ฉ”์‹œ์ง€ ํ˜•ํƒœ๊ฐ€ ์•„๋‹ˆ๋ผ ๋ช…ํ™•ํ•œ ํ˜•ํƒœ์˜ ์ž‘์—… ์•„ํ‹ฐํŒฉํŠธ๋กœ ๋ฐ˜ํ™˜๋˜๋Š” ๊ฒƒ์„ ์›์น™์œผ๋กœ ์‚ผ์•„ ํ•˜๋„ค์Šค ๋‚ด๋ถ€์˜ ์•„ํ‹ฐํŒฉํŠธ ์šฐ์„ (artifact-first) ์„ค๊ณ„์™€ ๊ฐ•๋ ฅํ•œ ํ˜ธํ™˜์„ฑ์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค [11]. +* **ํ”„๋กœํ† ์ฝœ ์Šคํƒ์—์„œ์˜ ์—ญํ• **: ์—์ด์ „ํŠธ๊ฐ€ ๊ณ ์ˆ˜์ค€์˜ ์˜๋„๋ฅผ ๊ตํ™˜ํ•˜๋Š” ๋ฐ๋Š” ACP(Agent Communication Protocol)๊ฐ€, ๊ตฌ์ฒด์ ์ธ ๋„๊ตฌ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๋Š” MCP(Model Context Protocol)๊ฐ€ ์‚ฌ์šฉ๋˜๋ฉฐ, **A2A๋Š” ๊ทธ ์ค‘๊ฐ„์—์„œ ์ž‘์—… ์œ„์ž„(task delegation)์„ ๊ด€์žฅ**ํ•˜์—ฌ ์ผ๊ด€๋œ ํ•˜๋„ค์Šค ํ†ต์‹  ์Šคํƒ์„ ํ˜•์„ฑํ•ฉ๋‹ˆ๋‹ค [12, 13]. + +## โš–๏ธ Trade-offs & Caveats +* **๋„คํŠธ์›Œํฌ ์ง€์—ฐ(Latency)์˜ ํ•œ๊ณ„**: A2A๋Š” ์ธํ„ฐ๋„ท ๊ทœ๋ชจ์˜ ์กฐ์ง ๊ฐ„ ํ†ต์‹ ์„ ์ „์ œ๋กœ ์„ค๊ณ„๋˜์–ด ์›๊ฒฉ ์—์ด์ „ํŠธ ์œ„์ž„ ์‹œ ์•ฝ **50-200ms์˜ ๋„คํŠธ์›Œํฌ ์ง€์—ฐ ์‹œ๊ฐ„**์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋กœ์ปฌ ํ”„๋กœ์„ธ์Šค์—์„œ 2-15ms ๋งŒ์— ์ฒ˜๋ฆฌ๋˜๋Š” MCP ๊ธฐ๋ฐ˜ ๋„๊ตฌ ํ˜ธ์ถœ์— ๋น„ํ•ด ํ›จ์”ฌ ๋А๋ฆฌ๋ฏ€๋กœ, ๊ธด๋ฐ€ํ•˜๊ณ  ๋นˆ๋ฒˆํ•œ ์ƒํ˜ธ์ž‘์šฉ์ด ํ•„์š”ํ•œ ๋ฃจํ”„๋ณด๋‹ค๋Š” ๊ทœ๋ชจ๊ฐ€ ํฐ ์ž‘์—…์˜ ์›๊ฒฉ ์œ„์ž„์— ์ œํ•œ์ ์œผ๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [5, 6]. +* **๊ถŒํ•œ ๋ณ€ํ™˜์˜ ํ‘œ์ค€ํ™” ๋ถ€์žฌ**: A2A๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ๋œ ์›๊ฒฉ ์ž‘์—… ์ง€์‹œ๊ฐ€ ๋กœ์ปฌ ํ™˜๊ฒฝ์˜ MCP ๋„๊ตฌ ๊ถŒํ•œ(permission grants)์œผ๋กœ ์–ด๋–ป๊ฒŒ ์•ˆ์ „ํ•˜๊ฒŒ ๋งตํ•‘๋˜์–ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ **๋ช…์‹œ์ ์ธ ํ†ตํ•ฉ ๊ฒฝ๊ณ„๊ฐ€ ์•„์ง ํ”„๋กœํ† ์ฝœ ์ˆ˜์ค€์—์„œ ์ •์˜๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค**. ์ด๋กœ ์ธํ•ด ํ˜„์žฌ ๋ฐฐํฌ์ž๋“ค์€ A2A์™€ MCP ์‚ฌ์ด์˜ ๊ถŒํ•œ ๋ณ€ํ™˜ ๋กœ์ง์„ ์ž„์‹œ๋ฐฉํŽธ(ad-hoc)์œผ๋กœ ์ง์ ‘ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ๋ณด์•ˆ ๋ฐ ์œ ์ง€๋ณด์ˆ˜์˜ ๋ถ€๋‹ด์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค [14, 15]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [ํ†ต์‹  ๋ฐ ํ†ตํ•ฉ ํ”„๋กœํ† ์ฝœ] +* **[[MCP (Model Context Protocol)]]** + * ์—ฐ๊ฒฐ ์ด์œ : A2A๊ฐ€ ์—์ด์ „ํŠธ ๊ฐ„์˜ ํ†ต์‹ ์„ ๋‹ด๋‹นํ•œ๋‹ค๋ฉด, MCP๋Š” ์—์ด์ „ํŠธ ํ•˜๋„ค์Šค์™€ ์™ธ๋ถ€ ๋„๊ตฌ ๊ฐ„์˜ ํ˜ธ์ถœ ๊ฒฝ๊ณ„๋ฅผ ํ‘œ์ค€ํ™”ํ•˜์—ฌ ์ƒํ˜ธ ๋ณด์™„์ ์ธ ํ†ต์‹  ์Šคํƒ์„ ๊ตฌ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [7, 8, 16, 17]. + * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํ•˜๋„ค์Šค ๋‚ด๋ถ€์˜ ๋กœ์ปฌ ๋„๊ตฌ ์ ‘๊ทผ(MCP)๊ณผ ํ•˜๋„ค์Šค ์™ธ๋ถ€๋กœ์˜ ์ž‘์—… ์œ„์ž„(A2A)์ด ์–ด๋–ป๊ฒŒ ๋ถ„๋ฆฌ๋˜์–ด ๋™์ž‘ํ•˜๋Š”์ง€ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [14, 15]. + +* **[[ACP (Agent Communication Protocol)]]** + * ์—ฐ๊ฒฐ ์ด์œ : IBM์—์„œ ์ œ์•ˆํ•œ ํ”„๋กœํ† ์ฝœ๋กœ, ํ•˜๋„ค์Šค ๊ฐ„์˜ ๊ณ ์ˆ˜์ค€ ์˜๋„(intent) ํ†ต์‹ ์— ์ดˆ์ ์„ ๋งž์ถ”๋ฉฐ, ํ–ฅํ›„ A2A์™€ ํ•˜๋‚˜์˜ ํ‘œ์ค€์œผ๋กœ ํ†ตํ•ฉ(merge)๋˜๋Š” ์ƒํƒœ๊ณ„์  ์—ฐ๊ด€์„ฑ์„ ๊ฐ€์ง€๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [12, 13, 18]. + * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํ•˜์œ„ ์ž‘์—… ์ง€์‹œ(A2A)๋ฅผ ๋„˜์–ด ์—์ด์ „ํŠธ ๊ฐ„ ๊ณ ์ˆ˜์ค€์˜ ์ž์œจ์  ๋ชฉํ‘œ ์ „๋‹ฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [12, 13]. + +#### [ํ•˜๋„ค์Šค ์•„ํ‚คํ…์ฒ˜ ๊ตฌ์„ฑ ์š”์†Œ] +* **[[Execution Loop (E-component)]]** + * ์—ฐ๊ฒฐ ์ด์œ : ๋‹ค์ค‘ ์—์ด์ „ํŠธ ์‹œ์Šคํ…œ์—์„œ A2A ํ”„๋กœํ† ์ฝœ์€ ์—์ด์ „ํŠธ ๊ฐ„์˜ ์‹คํ–‰ ๋ฃจํ”„๋ฅผ ์กฐ์œจํ•˜๊ณ  ์กฐ์ •ํ•˜๋Š” E-์ปดํฌ๋„ŒํŠธ์˜ ๋‹ค์ค‘ ์—์ด์ „ํŠธ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ๊ธฐ๋Šฅ์„ ์™ธ๋ถ€ ๋„คํŠธ์›Œํฌ๋กœ ํ™•์žฅํ•œ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [7-10]. + * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋‹จ์ผ ์—์ด์ „ํŠธ์˜ ๊ด€์ฐฐ-์ƒ๊ฐ-ํ–‰๋™ ๋ฃจํ”„๊ฐ€ A2A ์œ„์ž„ ํ˜ธ์ถœ์„ ํ†ตํ•ด ์–ด๋–ป๊ฒŒ ๋ณ‘๋ ฌ ๋˜๋Š” ์›๊ฒฉ ์„œ๋ธŒ ์—์ด์ „ํŠธ๋กœ ๋ถ„๊ธฐ(fan-out)๋˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [9, 10]. + +### Deeper Research Questions +* A2A์˜ 50-200ms ๋„คํŠธ์›Œํฌ ์ง€์—ฐ ์‹œ๊ฐ„์ด ์žฆ์€ ํ”ผ๋“œ๋ฐฑ๊ณผ ์ƒํƒœ ๊ณต์œ ๋ฅผ ์š”๊ตฌํ•˜๋Š” ๋‹ค์ค‘ ์—์ด์ „ํŠธ ๊ธฐ๋ฐ˜ ํ˜‘์—… ์›Œํฌํ”Œ๋กœ์šฐ ์„ฑ๋Šฅ์— ์–ด๋– ํ•œ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”๊ฐ€? [5, 6] +* A2A ํ”„๋กœํ† ์ฝœ์„ ํ†ตํ•ด ํ•˜๋„ค์Šค ๊ฐ„ ์ž‘์—… ์œ„์ž„ ์‹œ ์ˆ˜์‹  ์ธก ํ•˜๋„ค์Šค๊ฐ€ A2A์˜ ์ž‘์—… ์Šน์ธ ์ •๋ณด๋ฅผ ๋กœ์ปฌ MCP ์„œ๋ฒ„์˜ ์•ˆ์ „ํ•œ ๊ถŒํ•œ ์ •์ฑ…์œผ๋กœ ๋ณ€ํ™˜(Translation)ํ•˜๊ธฐ ์œ„ํ•œ ํ‘œ์ค€ ์•„ํ‚คํ…์ฒ˜๋Š” ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑ๋˜์–ด์•ผ ํ•˜๋Š”๊ฐ€? [14, 15] +* A2A์™€ ๊ฐ™์€ ์‹ ๋ขฐ๋œ ์—์ด์ „ํŠธ ๊ฐ„ ๋ฉ”์‹œ์ง€ ์ฑ„๋„์„ ์•…์šฉํ•œ ๊ต์ฐจ ์—์ด์ „ํŠธ ํ”„๋กฌํ”„ํŠธ ์ธ์ ์…˜(Cross-agent prompt injection) ๊ณต๊ฒฉ์„ ํ•˜๋„ค์Šค์˜ ๊ฑฐ๋ฒ„๋„Œ์Šค ๊ณ„์ธต์—์„œ ์–ด๋–ป๊ฒŒ ์‹๋ณ„ํ•˜๊ณ  ์ฐจ๋‹จํ•  ๊ฒƒ์ธ๊ฐ€? [19, 20] +* ๋Œ€๊ทœ๋ชจ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ํ™˜๊ฒฝ์—์„œ Agent Card๋ฅผ ์ด์šฉํ•œ ๋ถ„์‚ฐ ์—์ด์ „ํŠธ ๊ฒ€์ƒ‰(Discovery) ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ๋ณด์•ˆ๊ณผ ์ƒํƒœ ๊ฐ€์šฉ์„ฑ์„ ์œ ์ง€ํ•˜๋ฉฐ ์–ด๋–ป๊ฒŒ ๋™์ ์œผ๋กœ ์Šค์ผ€์ผ๋ง๋  ์ˆ˜ ์žˆ๋Š”๊ฐ€? [9-11] +* A2A์˜ ๋น„๋Œ€์นญ์ (Asymmetric) ํ†ต์‹  ๋ชจ๋ธ์ด ์ž์œจ์ ์ธ P2P ํ˜‘๋ ฅ ํ† ํด๋กœ์ง€์™€ ๋น„๊ตํ•  ๋•Œ, ๊ณ„์ธตํ˜• ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ-์›Œ์ปค ํŒจํ„ด์—์„œ ๊ฐ€์ ธ์˜ค๋Š” ์ œ์–ด ์—ญํ•™(Control dynamics)์˜ ๊ตฌ์ฒด์ ์ธ ์žฅ์ ๊ณผ ํ•œ๊ณ„๋Š” ๋ฌด์—‡์ธ๊ฐ€? [9, 10] + +### Practical Application Contexts +* **Implementation:** HTTPS ๋ฐ Server-Sent Events(SSE) ๊ธฐ์ˆ ์„ ๊ธฐ๋ฐ˜์œผ๋กœ A2A ์–ด๋Œ‘ํ„ฐ๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ์›๊ฒฉ ์—์ด์ „ํŠธ ๊ฐ„์— ์ž‘์—…(Task) ๊ตฌ์กฐ์ฒด์™€ ์ง„ํ–‰ ์ƒํƒœ, ๊ทธ๋ฆฌ๊ณ  ๊ฒฐ๊ณผ ์•„ํ‹ฐํŒฉํŠธ๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ŠคํŠธ๋ฆฌ๋ฐํ•˜๋Š” ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•ฉ๋‹ˆ๋‹ค [3, 4, 11]. +* **System Design:** ์ฃผ(Main) ์—์ด์ „ํŠธ์˜ ํ•˜๋„ค์Šค๊ฐ€ ๋กœ์ปฌ ๊ธฐ๋Šฅ์€ ๋‚ด๋ถ€์˜ MCP ์ปค๋„ฅํ„ฐ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ , ์กฐ์ง ์™ธ๋ถ€์˜ ์›๊ฒฉ ํŠนํ™” ์—์ด์ „ํŠธ์—๊ฒŒ๋Š” A2A ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ํ•˜์œ„ ์ž‘์—…์„ ์œ„์ž„ํ•˜๋„๋ก ์ฑ…์ž„์„ ์ฒ ์ €ํžˆ ๋ถ„๋ฆฌํ•˜๋Š” ๋ฉ€ํ‹ฐ ํ”„๋กœํ† ์ฝœ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค [9, 10, 16, 17, 21]. +* **Operation / Maintenance:** ํ•˜๋„ค์Šค ๊ฐ„ ๋ถ„์‚ฐ ํ˜ธ์ถœ์ด ์ด๋ฃจ์–ด์ง€๋Š” ๊ตฌ์กฐ์ด๋ฏ€๋กœ, A2A ๊ฒฝ๊ณ„๋ฅผ ๋„˜์–ด๊ฐ€๋Š” ๊ถŒํ•œ ์œ„์ž„ ์ฒด์ธ์— ๋Œ€ํ•œ ๊ฐ์‚ฌ ๋กœ๊ทธ(Audit log)๋ฅผ ๋‚จ๊ธฐ๊ณ , 50-200ms ์ง€์—ฐ ์‹œ๊ฐ„์— ๋Œ€์‘ํ•˜๊ธฐ ์œ„ํ•œ ์žฌ์‹œ๋„ ๋ฐ ์ค‘๋‹จ(Cancellation) ์ •์ฑ… ๋“ฑ ์žฅ์•  ๋ณต๊ตฌ ๋Ÿฐํƒ€์ž„์„ ์œ ์ง€๋ณด์ˆ˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [5, 6, 11, 22]. +* **Learning Path:** ์—์ด์ „ํŠธ ํ•˜๋„ค์Šค ์—”์ง€๋‹ˆ์–ด๋ง ํ•™์Šต ์‹œ, ๋‹จ์ผ ์—์ด์ „ํŠธ์˜ ๋„๊ตฌ ์—ฐ๋™(MCP)์„ ๋จผ์ € ์ตํžŒ ๋’ค ์‹œ์Šคํ…œ์ด ์ˆ˜ํ‰์ ์œผ๋กœ ํ™•์žฅ๋˜๋Š” ๋‹จ๊ณ„์—์„œ ์›๊ฒฉ ์—์ด์ „ํŠธ ๊ฐ„ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜(A2A) ๋ฐ ์˜๋„ ๊ตํ™˜(ACP) ์Šคํƒ์„ ํ•™์Šตํ•˜๋Š” ๋กœ๋“œ๋งต์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค [12, 13]. +* **My Project Relevance:** ์†Œ์Šค์— ํŠน์ • ์‚ฌ์šฉ์ž ํ”„๋กœ์ ํŠธ์™€ ๊ด€๋ จ๋œ ์ •๋ณด๊ฐ€ ๋ถ€์กฑํ•˜๋ฏ€๋กœ ์ผ๋ฐ˜์ ์ธ ์ ์šฉ ๋งฅ๋ฝ์„ ์„œ์ˆ ํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๋‹ค์ค‘ ๋ชจ๋ธ์ด๋‚˜ ํƒ€ ์กฐ์ง์˜ ์ž์œจ ์—์ด์ „ํŠธ์™€ ์—ฐ๋™ํ•ด์•ผ ํ•˜๋Š” ๋Œ€๊ทœ๋ชจ ์‹œ์Šคํ…œ์„ ๊ธฐํšํ•œ๋‹ค๋ฉด, ํ•˜๋„ค์Šค ๋‚ด๋ถ€์— A2A ์–ด๋Œ‘ํ„ฐ(Adapter)๋ฅผ ์ฑ„ํƒํ•˜์—ฌ ๋ฒค๋” ์ข…์†์„ฑ ์—†์ด ์™ธ๋ถ€ ์—์ด์ „ํŠธ๋ฅผ ์œ ์—ฐํ•˜๊ฒŒ ํ˜ธ์ถœํ•˜๊ณ  ํ†ต์ œํ•˜๋Š” ๊ธฐ๋ฐ˜์œผ๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [11, 23]. + +### Adjacent Topics +* **[[Distributed Systems]]** + * ํ™•์žฅ ๋ฐฉํ–ฅ: ๋‹ค์ค‘ ์—์ด์ „ํŠธ ์‹œ์Šคํ…œ์ด A2A๋ฅผ ํ†ตํ•ด ์„œ๋กœ ํ†ต์‹ ํ•˜๊ฒŒ ๋˜๋ฉด ๋ณธ์งˆ์ ์œผ๋กœ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ๊ณผ ๋™์ผํ•œ ๊ณผ์ œ(๋™์‹œ์„ฑ ์ œ์–ด, ๊ณต์œ  ์ƒํƒœ ์ผ๊ด€์„ฑ, ๋ฉ”์‹œ์ง€ ๋ผ์šฐํŒ…, ๋น„์ž”ํ‹ด ๊ฒฐํ•จ ํ—ˆ์šฉ ๋“ฑ)๋ฅผ ์ง๋ฉดํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ, ์ด๋ฅผ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ ์„ค๊ณ„ ํŒจํ„ด ๊ด€์ ์œผ๋กœ ํ™•์žฅํ•˜์—ฌ ์—ฐ๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [24-27]. + +--- +*Last updated: 2026-05-01* \ No newline at end of file diff --git a/00_Raw/Agentic Software Engineering.md b/00_Raw/Agentic Software Engineering.md new file mode 100644 index 00000000..5236ab38 --- /dev/null +++ b/00_Raw/Agentic Software Engineering.md @@ -0,0 +1,63 @@ +# [[Agentic Software Engineering]] + +## ๐Ÿ“Œ Brief Summary +์—์ด์ „ํ‹ฑ ์†Œํ”„ํŠธ์›จ์–ด ์—”์ง€๋‹ˆ์–ด๋ง(Agentic Software Engineering)์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์—ญํ• ์—์„œ ์ฝ”๋“œ๋ฅผ ์ž์œจ์ ์œผ๋กœ ์ž‘์„ฑํ•˜๋Š” AI ์—์ด์ „ํŠธ๋ฅผ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ํ•˜๊ณ  ๋ฐฉํ–ฅ์„ ์„ค์ •ํ•˜๋Š” ์—ญํ• ๋กœ ์ง„ํ™”ํ•˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ ํŒจ๋Ÿฌ๋‹ค์ž„์ž…๋‹ˆ๋‹ค [1-3]. ์ด ํ™˜๊ฒฝ์—์„œ ๋Œ€ํ˜• ์–ธ์–ด ๋ชจ๋ธ(LLM)์€ ๋‹จ์ผ ์‘๋‹ต์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์„ ๋„˜์–ด ์ž์œจ์ ์œผ๋กœ ๊ณ„ํš์„ ์„ธ์šฐ๊ณ  ์ฝ”๋“œ๋ฅผ ๋””๋ฒ„๊น…ํ•˜๋ฉฐ ์†Œํ”„ํŠธ์›จ์–ด ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•˜๋Š” ์—์ด์ „ํŠธ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค [4, 5]. ์ด๋Ÿฌํ•œ ์—์ด์ „ํŠธ๊ฐ€ ํ™˜๊ฐ์ด๋‚˜ ํƒˆ์„  ์—†์ด ์‹ ๋ขฐ์„ฑ ์žˆ๊ฒŒ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ์‹คํ–‰ ํ™˜๊ฒฝ, ๋„๊ตฌ ์ œ์–ด, ๋ฉ”๋ชจ๋ฆฌ, ์•ˆ์ „์žฅ์น˜ ๋“ฑ์„ ์ œ๊ณตํ•˜๋Š” '์—์ด์ „ํŠธ ํ•˜๋„ค์Šค ์—”์ง€๋‹ˆ์–ด๋ง(Agent Harness Engineering)'์ด ์ด ํŒจ๋Ÿฌ๋‹ค์ž„์˜ ํ•ต์‹ฌ ์ธํ”„๋ผ ๊ธฐ๋ฐ˜์„ ํ˜•์„ฑํ•ฉ๋‹ˆ๋‹ค [6-8]. + +## ๐Ÿ“– Core Content + +* **๊ฐœ๋ฐœ์ž ์—ญํ• ์˜ ๋ณ€ํ™” (From Implementer to Orchestrator)**: 2026๋…„ ์ดํ›„ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์˜ ํ•ต์‹ฌ์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ(syntax)์—์„œ AI ์—์ด์ „ํŠธ๊ฐ€ ์•ˆ์ „ํ•˜๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ์•„ํ‚คํ…์ฒ˜์™€ ์ œ์–ด ์‹œ์Šคํ…œ์„ ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณ€ํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค [1-3]. ์ธ๊ฐ„์€ ๊ณ ์ฐจ์›์ ์ธ ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„์™€ ๊ฒฐ๊ณผ๋ฌผ ๊ฒ€์ฆ ๋ฐ ์ „๋žต์  ๋ฐฉํ–ฅ ์ง€์‹œ์— ์ง‘์ค‘ํ•˜๊ณ , ์—์ด์ „ํŠธ๋Š” ๋ฐ˜๋ณต์ ์ด๊ณ  ์ „์ˆ ์ ์ธ ๊ตฌํ˜„์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค [1, 2]. +* **์—์ด์ „ํŠธ ํ•˜๋„ค์Šค์˜ ํ•„์ˆ˜์„ฑ (The Necessity of Agent Harnesses)**: LLM ์ž์ฒด๋Š” ์ƒํƒœ(State)๋ฅผ ์œ ์ง€ํ•˜๊ฑฐ๋‚˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜ ์™ธ๋ถ€ API๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†๋Š” ๋‹จ์ˆœํ•œ ํ™•๋ฅ ์  ์ถ”๋ก  ์—”์ง„์— ๋ถˆ๊ณผํ•ฉ๋‹ˆ๋‹ค [6, 9, 10]. ์ด๋ฅผ ์ž์œจ์ ์ธ ์ฝ”๋”ฉ ์—์ด์ „ํŠธ๋กœ ๋ณ€ํ™˜ํ•˜๋ ค๋ฉด ์‹คํ–‰ ๋ฃจํ”„(E), ๋„๊ตฌ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ(T), ์ปจํ…์ŠคํŠธ ๊ด€๋ฆฌ์ž(C), ์ƒํƒœ ์ €์žฅ์†Œ(S), ์ˆ˜๋ช…์ฃผ๊ธฐ ํ›…(L), ํ‰๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค(V) ๋“ฑ 6๊ฐ€์ง€ ๊ฑฐ๋ฒ„๋„Œ์Šค ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ œ๊ณตํ•˜๋Š” 'ํ•˜๋„ค์Šค(Harness)' ์ธํ”„๋ผ๊ฐ€ ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค [7, 8, 11, 12]. +* **๋‹ค์ค‘ ์—์ด์ „ํŠธ ๋ฐ PEV ๋ฃจํ”„ (Multi-agent & PEV Loop)**: ๋ณต์žกํ•œ ์ฝ”๋“œ ์ž‘์„ฑ ์ž‘์—…์€ ๊ณ„ํš(Plan), ์‹คํ–‰(Execute), ๊ฒ€์ฆ(Verify)์œผ๋กœ ์—ญํ• ์„ ๋ถ„๋ฆฌํ•˜๋Š” PEV ๋ฃจํ”„๋‚˜ ๋‹ค์ค‘ ์—์ด์ „ํŠธ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜(Orchestrator-worker ํŒจํ„ด ๋“ฑ)์„ ํ†ตํ•ด ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค [13-15]. ์ด๋ฅผ ํ†ตํ•ด ์—์ด์ „ํŠธ๋Š” ํ™˜๊ฐ์ด๋‚˜ ์ž‘์—… ์ดํƒˆ ์—†์ด ๋ช…์‹œ์ ์ธ ๊ณ„ํš๊ณผ ๋ฆฐํ„ฐ(Linter), CI ๊ฒ€์‚ฌ์™€ ๊ฐ™์€ ๊ธฐ๊ณ„์ ์ธ ์Šน์ธ ์ ˆ์ฐจ ๋‚ด์—์„œ๋งŒ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค [13, 14, 16]. +* **์‹คํ–‰ ํ™˜๊ฒฝ ๋ฐ ์ƒŒ๋“œ๋ฐ•์Šค (Execution Environments & Sandboxing)**: ์ฝ”๋”ฉ ์—์ด์ „ํŠธ๋Š” ์ปจํ…Œ์ด๋„ˆ๋‚˜ ๋งˆ์ดํฌ๋กœ VM๊ณผ ๊ฐ™์€ ๊ฒฉ๋ฆฌ๋œ ์ƒŒ๋“œ๋ฐ•์Šค ํ™˜๊ฒฝ์—์„œ ํŒŒ์ผ ์ฝ๊ธฐ/์“ฐ๊ธฐ, ์…ธ ๋ช…๋ น์–ด ์‹คํ–‰, LSP(Language Server Protocol)๋ฅผ ํ†ตํ•œ ์‹œ๋งจํ‹ฑ ์ฝ”๋“œ ๋ถ„์„ ๋“ฑ์˜ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค [17-19]. ๋˜ํ•œ, ๋ฆฌ์†Œ์Šค ์†Œ๋ชจ๊ฐ€ ํฐ ๋ฌผ๋ฆฌ์  Docker ํ™˜๊ฒฝ ๋Œ€์‹ , LLM์„ ํ™œ์šฉํ•˜์—ฌ ์ฝ”๋“œ ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜๊ณ  ๊ฒ€์ฆํ•˜๋Š” 'SWE-World'์™€ ๊ฐ™์€ ๋„์ปค ํ”„๋ฆฌ(Docker-Free) ๊ฐ€์ƒ ํ•˜๋„ค์Šค ํ™˜๊ฒฝ๋„ ์—์ด์ „ํŠธ ํ›ˆ๋ จ ๋ฐ ํ‰๊ฐ€์— ์ ๊ทน ํ™œ์šฉ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค [20-22]. + +## โš–๏ธ Trade-offs & Caveats + +* **์ž์œจ์„ฑ(Capability)๊ณผ ๊ฒฉ๋ฆฌ/๋ณด์•ˆ(Security/Isolation) ๊ฐ„์˜ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„**: ์ฝ”๋”ฉ ์—์ด์ „ํŠธ๊ฐ€ ํ˜„์‹ค์ ์ธ ์—”์ง€๋‹ˆ์–ด๋ง ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ์…ธ ๋ช…๋ น์–ด ์‹คํ–‰์ด๋‚˜ ํŒŒ์ผ ์‹œ์Šคํ…œ ์ ‘๊ทผ๊ณผ ๊ฐ™์€ ๊ด‘๋ฒ”์œ„ํ•œ ๋„๊ตฌ ๊ถŒํ•œ์ด ํ•„์š”ํ•˜์ง€๋งŒ, ์ด๋Š” ๊ฐ„์ ‘ ํ”„๋กฌํ”„ํŠธ ์ธ์ ์…˜(Indirect Prompt Injection)์ด๋‚˜ ์ƒŒ๋“œ๋ฐ•์Šค ํƒˆ์ถœ๊ณผ ๊ฐ™์€ ์‹ฌ๊ฐํ•œ ์‹œ์Šคํ…œ ๋ณด์•ˆ ์ทจ์•ฝ์ ์„ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค [23, 24]. ๋ฐ˜๋Œ€๋กœ ๊ฐ•๋ ฅํ•œ ๋ณด์•ˆ ๋ฐ ๊ฒฉ๋ฆฌ ์กฐ์น˜(์˜ˆ: ์—„๊ฒฉํ•œ ๋งˆ์ดํฌ๋กœ VM ํ™˜๊ฒฝ ์ ์šฉ)๋ฅผ ๊ฐ•์ œํ•˜๋ฉด ์—์ด์ „ํŠธ์˜ ์ง€์—ฐ ์‹œ๊ฐ„๊ณผ ์šด์˜ ๋น„์šฉ์ด ํฌ๊ฒŒ ์ฆ๊ฐ€ํ•˜์—ฌ ์™„๋ฒฝํ•œ ํŒŒ๋ ˆํ†  ์ตœ์ ์ (Pareto-optimal point)์„ ์ฐพ๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค [23, 24]. +* **์ปจํ…์ŠคํŠธ ๋ณด์กด(Context Retention)๊ณผ ์ปดํ“จํŒ… ๊ฒฝ์ œ์„ฑ(Compute Economics)์˜ ์ƒ์ถฉ**: ์žฅ๊ธฐ ์‹คํ–‰ ์—์ด์ „ํŠธ(Long-running agents)๊ฐ€ ๊ณผ๊ฑฐ์˜ ์ฝ”๋“œ ์ˆ˜์ • ๋‚ด์—ญ๊ณผ ๋„๊ตฌ ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ๋ชจ๋‘ ์ปจํ…์ŠคํŠธ ์œˆ๋„์šฐ์— ๋ณด์กดํ•˜๋„๋ก ํ•˜๋ฉด ํ† ํฐ ์†Œ๋น„๋Ÿ‰์ด ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ๋Š˜์–ด๋‚˜ '์ปจํ…์ŠคํŠธ ๋ถ€ํŒจ(Context rot)'๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉฐ ์ถ”๋ก  ๋Šฅ๋ ฅ์ด ํฌ์„๋ฉ๋‹ˆ๋‹ค [25-27]. ๋ฐ˜๋Œ€๋กœ ํ† ํฐ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด ์ปจํ…์ŠคํŠธ๋ฅผ ๋„ˆ๋ฌด ๊ณต๊ฒฉ์ ์œผ๋กœ ์š”์•ฝ(Compaction)ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•˜๋ฉด ์—์ด์ „ํŠธ๊ฐ€ ์ด์ „์˜ ๊ฒฐ์ • ๋งฅ๋ฝ์ด๋‚˜ ์ค‘์š”ํ•œ ์ฝ”๋“œ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ์ƒ์‹คํ•˜๋Š” ์ •๋ณด ์†์‹ค์˜ ๋ถ€์ž‘์šฉ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [28, 29]. +* **ํ•˜๋„ค์Šค-๋ชจ๋ธ ๊ฒฐํ•ฉ(Harness-Model Coupling) ํŽธํ–ฅ์„ฑ**: ์—์ด์ „ํŠธ ์‹œ์Šคํ…œ์˜ ์‹ค์ œ ์‹ ๋ขฐ์„ฑ์ด๋‚˜ ์ฝ”๋“œ ๋ฒค์น˜๋งˆํฌ ํ‰๊ฐ€ ์ ์ˆ˜๋Š” ๋ชจ๋ธ ๋‹จ๋…์˜ ์ง€๋Šฅ์ด ์•„๋‹ˆ๋ผ ๋ชจ๋ธ๊ณผ ํ•˜๋„ค์Šค ๊ฐ„์˜ ์ƒํ˜ธ์ž‘์šฉ ํ’ˆ์งˆ์— ์˜ํ•ด ํฌ๊ฒŒ ์ขŒ์šฐ๋ฉ๋‹ˆ๋‹ค [30, 31]. ๋™์ผํ•œ ์„ฑ๋Šฅ์˜ ๋ชจ๋ธ์ด๋ผ๋„ ํ•˜๋„ค์Šค์˜ ํ™˜๊ฒฝ ์„ค์ •, ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ๋ž˜ํ•‘ ๋ฐฉ์‹, ๋„๊ตฌ ์ œ๊ณต ์„ค๊ณ„๊ฐ€ ๋ฏธํกํ•  ๊ฒฝ์šฐ ์ž‘์—…์— ์‹คํŒจํ•  ํ™•๋ฅ ์ด ๋งค์šฐ ๋†’์œผ๋ฉฐ, ์ด๋Š” ํ‰๊ฐ€ ๊ณผ์ •์—์„œ ๋ชจ๋ธ ์ž์ฒด์˜ ๋Šฅ๋ ฅ ๋ถ€์กฑ์œผ๋กœ ์˜ค์ธ๋  ์œ„ํ—˜์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค [32, 33]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [๊ด€๊ณ„ ์œ ํ˜• A (์•„ํ‚คํ…์ฒ˜ ๋ฐ ์ธํ”„๋ผ ๊ธฐ๋ฐ˜ ๊ธฐ์ˆ )] +- [[Agent Execution Harness]] + - ์—ฐ๊ฒฐ ์ด์œ : ํ…์ŠคํŠธ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ์–ธ์–ด ๋ชจ๋ธ์„ ์ž์œจ์ ์œผ๋กœ ํ–‰๋™ํ•˜๋Š” ์—์ด์ „ํŠธ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ํ•ต์‹ฌ ๋Ÿฐํƒ€์ž„ ์ œ์–ด ์ธํ”„๋ผ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [11, 12, 34]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ƒํƒœ ๋ณด์กด, ์‹คํ–‰ ๋ฃจํ”„ ๊ด€๋ฆฌ, ์ปจํ…์ŠคํŠธ ์ œ์–ด, ๋ณด์•ˆ ๊ฐ•์ œ ๋“ฑ ํ•˜๋„ค์Šค์˜ 6๋Œ€ ๊ฑฐ๋ฒ„๋„Œ์Šค๊ฐ€ ๋ชจ๋ธ ์„ฑ๋Šฅ๊ณผ ์‹ ๋ขฐ์„ฑ์„ ์–ด๋–ป๊ฒŒ ๊ฒฐ์ •์ง“๋Š”์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [11, 12, 35]. +- [[Model Context Protocol (MCP)]] + - ์—ฐ๊ฒฐ ์ด์œ : ์—์ด์ „ํŠธ ํ•˜๋„ค์Šค๊ฐ€ ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ํŒŒ์ผ ์‹œ์Šคํ…œ, ์„œ๋“œํŒŒํ‹ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋“ฑ ์™ธ๋ถ€ ๋„๊ตฌ์™€ ํ†ต์‹ ํ•˜๋Š” ๋ฐฉ์‹์„ ํ‘œ์ค€ํ™”ํ•˜๋Š” ๊ฐœ๋ฐฉํ˜• ํ”„๋กœํ† ์ฝœ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [36-38]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: AI๊ฐ€ ์™ธ๋ถ€ ์‹œ์Šคํ…œ๊ณผ ํˆด์„ ํ˜ธ์ถœํ•˜๋Š” ๋ณต์žกํ•œ ๊ถŒํ•œ ๋ฐ ๋„๊ตฌ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ๊ด€๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ƒํ˜ธ ์šด์šฉ ๊ฐ€๋Šฅํ•œ ํ˜•ํƒœ๋กœ ๋‹จ์ˆœํ™”ํ•˜๋Š” ํ†ตํ•ฉ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [39, 40]. + +#### [๊ด€๊ณ„ ์œ ํ˜• B (์‹คํ–‰ ์ œ์–ด ๋ฐ ํ‰๊ฐ€ ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด)] +- [[Plan-Execute-Verify (PEV) Loop]] + - ์—ฐ๊ฒฐ ์ด์œ : ์ฝ”๋”ฉ ์—์ด์ „ํŠธ๊ฐ€ ๋‹จ์ผ ํ”„๋กฌํ”„ํŠธ๊ฐ€ ์•„๋‹Œ ๊ตฌ์กฐํ™”๋œ ๊ณ„ํš ์ˆ˜๋ฆฝ, ์ œํ•œ๋œ ์‹คํ–‰, ์—„๊ฒฉํ•œ ์ฝ”๋“œ ๊ฒ€์ฆ์„ ๊ฑฐ์น˜๋„๋ก ๊ฐ•์ œํ•˜๋Š” ํ•ต์‹ฌ ํ•˜๋„ค์Šค ์†Œํ”„ํŠธ์›จ์–ด ํŒจํ„ด์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [13, 14]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋‹จ์ˆœํžˆ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ํ™•์ธํ•˜๋Š”(Generate-and-check) ๋ฐฉ์‹์˜ ํ•œ๊ณ„๋ฅผ ๊ทน๋ณตํ•˜๊ณ , ์ž๋™ํ™”๋œ ํ”ผ๋“œ๋ฐฑ ๋ฃจํ”„๋ฅผ ํ†ตํ•ด ์—์ด์ „ํŠธ์˜ ์‹คํŒจ๋ฅผ ๋ณต๊ตฌํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [14]. +- [[SWE-World]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋ฆฌ์†Œ์Šค๊ฐ€ ๋งŽ์ด ์†Œ๋ชจ๋˜๋Š” ๋ฌด๊ฑฐ์šด ๋ฌผ๋ฆฌ์  Docker ์‹คํ–‰ ํ™˜๊ฒฝ ๋Œ€์‹ , LLM ๋ชจ๋ธ์„ ํ™œ์šฉํ•˜์—ฌ ์ฝ”๋“œ ํƒ์ƒ‰ ๋ฐ ์œ ๋‹› ํ…Œ์ŠคํŠธ ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜๋Š” ๋„์ปค ํ”„๋ฆฌ(Docker-Free) ์—์ด์ „ํŠธ ํ›ˆ๋ จ ํ”„๋ ˆ์ž„์›Œํฌ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [20, 22]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋น„์šฉ๊ณผ ์ธํ”„๋ผ์˜ ํ•œ๊ณ„๋กœ ์ธํ•ด ๋Œ€๊ทœ๋ชจ ์—์ด์ „ํŠธ ๊ฐ•ํ™”ํ•™์Šต(RL)์ด๋‚˜ ํ‰๊ฐ€๊ฐ€ ์–ด๋ ค์› ๋˜ ๋ฌธ์ œ๋ฅผ, ๊ฐ€์ƒ ํ”ผ๋“œ๋ฐฑ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์„ ํ†ตํ•ด ํ™•์žฅ์„ฑ ์žˆ๊ฒŒ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [22, 41]. + +### Deeper Research Questions + +- ๋Œ€๊ทœ๋ชจ ๋‹ค์ค‘ ์—์ด์ „ํŠธ(Multi-agent) ์‹œ์Šคํ…œ ํ™˜๊ฒฝ์—์„œ ์—์ด์ „ํŠธ ๊ฐ„์˜ ๊ณต์œ  ์ƒํƒœ(Shared state) ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๊ณ , ํ•œ ์—์ด์ „ํŠธ์˜ ๊ฒฐํ•จ์ด๋‚˜ ์˜ค๋ฅ˜๊ฐ€ ๋‹ค๋ฅธ ์—์ด์ „ํŠธ๋กœ ์—ฐ์‡„ ์ „ํŒŒ(Cascading failures)๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ํ•˜๋„ค์Šค ๊ณ„์ธต์˜ ๊ฒฉ๋ฆฌ ์•„ํ‚คํ…์ฒ˜๋Š” ์–ด๋–ป๊ฒŒ ์„ค๊ณ„๋˜์–ด์•ผ ํ•˜๋Š”๊ฐ€? [42-44] +- 100๋งŒ ํ† ํฐ ์ด์ƒ์˜ ์ดˆ์žฅ๊ธฐ ๋ฌธ๋งฅ(Ultra-long-context) LLM์ด ๋“ฑ์žฅํ–ˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ , ์ปจํ…์ŠคํŠธ ์••์ถ•(Compaction)๊ณผ ์ •๋ณด์˜ ํ˜„์ €์„ฑ(Salience) ๊ด€๋ฆฌ๊ฐ€ ์—ฌ์ „ํžˆ ์—์ด์ „ํŠธ ํ•˜๋„ค์Šค ์„ค๊ณ„์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ œ์•ฝ ์กฐ๊ฑด์ด์ž ํ•„์ˆ˜ ์—”์ง€๋‹ˆ์–ด๋ง ์˜์—ญ์œผ๋กœ ์ž‘์šฉํ•˜๋Š” ์‹ค์ฆ์  ์›๋ฆฌ๋Š” ๋ฌด์—‡์ธ๊ฐ€? [45, 46] +- ์†Œํ”„ํŠธ์›จ์–ด ์—”์ง€๋‹ˆ์–ด๋ง ์—์ด์ „ํŠธ๋ฅผ ์œ„ํ•œ ์ฝ”๋“œ ์‹คํ–‰ ์ƒŒ๋“œ๋ฐ•์Šค์—์„œ ์„ฑ๋Šฅ(์ง€์—ฐ ์‹œ๊ฐ„ ์ตœ์†Œํ™” ๋ฐ ์บ์‹œ ์ตœ์ ํ™”)๊ณผ ๋ณด์•ˆ(๋งˆ์ดํฌ๋กœVM ์ˆ˜์ค€์˜ ์ปค๋„ ์ ‘๊ทผ ์ œ์–ด ๋“ฑ) ๊ฐ„์˜ ๊ทน๋‹จ์ ์ธ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๋ฅผ ๊ฐ€์žฅ ํšจ์œจ์ ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋Ÿฐํƒ€์ž„ ์ธํ”„๋ผ ๊ตฌ์„ฑ ๋ฐฉ์•ˆ์€ ๋ฌด์—‡์ธ๊ฐ€? [23, 24] +- SWE-bench์™€ ๊ฐ™์€ ์ฝ”๋“œ ํ•ด๊ฒฐ ๋ฒค์น˜๋งˆํฌ ํ‰๊ฐ€ ์‹œ, ๋ชจ๋ธ ์ž์ฒด์˜ ์ง€๋Šฅ์  ์ถ”๋ก  ๋Šฅ๋ ฅ๊ณผ ํ•˜๋„ค์Šค์˜ ๋ฌผ๋ฆฌ์  ํ™˜๊ฒฝ(์‹คํ–‰ ํ™˜๋ฉด ๋ž˜ํ•‘, ๋„๊ตฌ ์Šคํ‚ค๋งˆ ์ตœ์ ํ™” ๋“ฑ)์ด ์„ฑ๋Šฅ ๊ฒฐ๊ณผ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ์ •๋Ÿ‰์ ์œผ๋กœ ์™„์ „ํžˆ ๋ถ„๋ฆฌํ•˜์—ฌ ์ธก์ •ํ•  ์ˆ˜ ์žˆ๋Š” ํ‘œ์ค€ํ™”๋œ ๋ฐฉ๋ฒ•๋ก ์€ ๋ฌด์—‡์ธ๊ฐ€? [32, 33] +- ๋Ÿฐํƒ€์ž„์— ๋™์ ์œผ๋กœ ์ƒˆ๋กœ์šด ๋„๊ตฌ๋ฅผ ํƒ์ƒ‰ํ•˜๊ณ  ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” MCP(Model Context Protocol) ํ™˜๊ฒฝ์—์„œ, ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋„๊ตฌ ๊ถŒํ•œ์˜ ์กฐํ•ฉ(Capability escalation)์œผ๋กœ ๋ฐœ์ƒํ•˜๋Š” ๊ฐ„์ ‘ ํ”„๋กฌํ”„ํŠธ ์ธ์ ์…˜ ๋“ฑ์˜ ๋ณด์•ˆ ์ทจ์•ฝ์ ์„ ์‚ฌ์ „์— ์ฐจ๋‹จํ•˜๊ธฐ ์œ„ํ•œ ํ•˜๋„ค์Šค ์ˆ˜์ค€์˜ ๊ถŒํ•œ ์ œ์–ด ๋ชจ๋ธ์€ ์–ด๋–ป๊ฒŒ ๊ตฌ์ถ•ํ•ด์•ผ ํ•˜๋Š”๊ฐ€? [47, 48] + +### Practical Application Contexts + +- **Implementation:** ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ช…๋ น์ค„(CLI) ์ธํ„ฐํŽ˜์ด์Šค๋‚˜ IDE์— ํ†ตํ•ฉ๋œ ์—์ด์ „ํŠธ ํ™˜๊ฒฝ(์˜ˆ: OpenDev)์„ ๊ตฌ์ถ•ํ•˜์—ฌ, ์ž์œจ ์ฝ”๋”ฉ ์—์ด์ „ํŠธ๊ฐ€ ๊ฒฉ๋ฆฌ๋œ ์ƒŒ๋“œ๋ฐ•์Šค ๋‚ด์—์„œ ํŒŒ์ผ ํŽธ์ง‘, ๊ตฌ์กฐ์  ๋ฆฐํŒ…, ํ…Œ์ŠคํŠธ ์‹คํ–‰์„ ์•ˆ์ „ํ•˜๊ฒŒ ๋ฐ˜๋ณตํ•˜๋„๋ก ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค [49, 50]. +- **System Design:** ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ ์‹œ ๊ธฐํš์„ ๋‹ด๋‹นํ•˜๋Š” Planner ์—์ด์ „ํŠธ, ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” Generator ์—์ด์ „ํŠธ, ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ๋ฐ ๊ฒ€์ฆ์„ ์ˆ˜ํ–‰ํ•˜๋Š” Evaluator ์—์ด์ „ํŠธ๋กœ ์—ญํ• ์„ ์ฒ ์ €ํžˆ ๋ถ„๋ฆฌํ•œ ๋‹ค์ค‘ ์—์ด์ „ํŠธ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ํŒŒ์ดํ”„๋ผ์ธ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค [51-53]. +- **Operation / Maintenance:** LangSmith, AgentOps ๋“ฑ์˜ ์ „๋ฌธ ์˜ต์ €๋ฒ„๋นŒ๋ฆฌํ‹ฐ(Observability) ๋ฐ ํ‰๊ฐ€ ๋„๊ตฌ๋ฅผ ์ ์šฉํ•˜์—ฌ ๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ์—์„œ ์žฅ๊ธฐ๊ฐ„ ์‹คํ–‰๋˜๋Š” ์—์ด์ „ํŠธ์˜ ์ปจํ…์ŠคํŠธ ์ดˆ๊ณผ ์ƒํƒœ, ๋„๊ตฌ ํ˜ธ์ถœ ์‹คํŒจ์œจ, ๋ฃจํ”„ ์ค‘๋‹จ ์ง€์  ๋“ฑ์„ ํˆฌ๋ช…ํ•˜๊ฒŒ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ์ถ”์ ํ•ฉ๋‹ˆ๋‹ค [54, 55]. +- **Learning Path:** ๋‹จ์ˆœํ•œ ์ผํšŒ์„ฑ ํ”„๋กฌํ”„ํŠธ ํŠœ๋‹(Prompt Engineering)์—์„œ ๋ฒ—์–ด๋‚˜, ์—์ด์ „ํŠธ๊ฐ€ ๋ฌธ๋งฅ์„ ์œ ์ง€ํ•˜๋„๋ก ๋•๋Š” ์ปจํ…์ŠคํŠธ ์—”์ง€๋‹ˆ์–ด๋ง(Context Engineering)๊ณผ, ์ตœ์ข…์ ์œผ๋กœ ๋ฆฐํ„ฐ ๊ฐ•์ œ, ๋ฉ”๋ชจ๋ฆฌ ์ง€์†์„ฑ ๋“ฑ์„ ํ†ตํ•ฉํ•ด ์—์ด์ „ํŠธ๋ฅผ ํ†ต์ œํ•˜๋Š” ํ•˜๋„ค์Šค ์—”์ง€๋‹ˆ์–ด๋ง(Harness Engineering)์œผ๋กœ ๊ธฐ์ˆ  ์Šคํƒ๊ณผ ํ•™์Šต ํŒจ๋Ÿฌ๋‹ค์ž„์„ ์ง„ํ™”์‹œํ‚ต๋‹ˆ๋‹ค [56, 57]. +- **My Project Relevance:** ์†Œ์Šค์— ๊ด€๋ จ ์ •๋ณด๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. (๊ฐœ์ธ์˜ ํŠน์ • ํ”„๋กœ์ ํŠธ๋‚˜ ์‚ฌ์  ๋งฅ๋ฝ์— ์—ฐ๊ด€๋œ ๋‚ด์šฉ์€ ์ œ๊ณต๋œ ์†Œ์Šค ๋ฐ์ดํ„ฐ ๋‚ด์— ๊ธฐ์ˆ ๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค). + +### Adjacent Topics + +- [[Retrieval-Augmented Generation (RAG)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: RAG๋Š” ๋‹จ์ˆœํžˆ ์ •์ ์ธ ๋ฌธ์„œ์—์„œ ํ…์ŠคํŠธ๋ฅผ ๊ฒ€์ƒ‰ํ•˜์—ฌ ๋ชจ๋ธ์— ์ง€์‹์„ ์ฃผ์ž…ํ•˜๋Š” ์ˆ˜๋™์ ์ธ ๋ฐฉ์‹์ด์—ˆ๋‹ค๋ฉด, ์ด๋ฅผ ๋„˜์–ด ์—์ด์ „ํŠธ๊ฐ€ ์ฝ”๋“œ๋ฒ ์ด์Šค ๊ตฌ์กฐ๋ฅผ ํŒŒ์•…ํ•˜๊ณ  ์—ฌ๋Ÿฌ ๊ฒ€์ƒ‰ ๋„๊ตฌ๋ฅผ ๊ฑฐ์ณ ๋™์ ์œผ๋กœ ์ •๋ณด๋ฅผ ์ง์ ‘ ํš๋“ํ•ด๋‚˜๊ฐ€๋Š” 'Agentic Search(์—์ด์ „ํŠธ์  ํƒ์ƒ‰)' ๋ฐ ์—ฐ์†์  ์ง€์‹ ํ†ตํ•ฉ ์•„ํ‚คํ…์ฒ˜๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [58-60]. +- [[Agent-to-Agent (A2A) Protocol]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: MCP๊ฐ€ ๊ฐœ๋ณ„ ์—์ด์ „ํŠธ์™€ ์™ธ๋ถ€ ๋„๊ตฌ/๋ฐ์ดํ„ฐ ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ๋•๋Š” ํ‘œ์ค€์ด๋ผ๋ฉด, A2A ํ”„๋กœํ† ์ฝœ์€ ์„œ๋กœ ๋‹ค๋ฅธ ํ•˜๋„ค์Šค์— ์†ํ•˜๊ฑฐ๋‚˜ ์›๊ฒฉ์œผ๋กœ ๋ถ„์‚ฐ๋œ ๋‹ค์ˆ˜์˜ ์—์ด์ „ํŠธ ์ธ์Šคํ„ด์Šค ๊ฐ„์— ์ž‘์—…์„ ์œ„์ž„ํ•˜๊ณ  ์ƒํƒœ๋ฅผ ๋™๊ธฐํ™”ํ•˜๋ฉฐ ํ†ต์‹ ํ•˜๊ธฐ ์œ„ํ•œ ์ƒํ˜ธ์šด์šฉ์„ฑ ๋„คํŠธ์›Œํฌ ํ‘œ์ค€ ๊ธฐ์ˆ ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [37, 61]. + +--- +*Last updated: 2026-05-01* \ 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 new file mode 100644 index 00000000..b8fce13b --- /dev/null +++ b/00_Raw/Agile Software Development in Small Teams.md @@ -0,0 +1,70 @@ +# [[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/Atomic Commits.md b/00_Raw/Atomic Commits.md new file mode 100644 index 00000000..b96104e2 --- /dev/null +++ b/00_Raw/Atomic Commits.md @@ -0,0 +1,53 @@ +# [[Atomic Commits]] + +## ๐Ÿ“Œ Brief Summary +Atomic Commits(์›์ž์  ์ปค๋ฐ‹)๋Š” ํ•œ ๋ฒˆ์˜ ์ปค๋ฐ‹์— ์˜ค์ง ํ•˜๋‚˜์˜ ๋…ผ๋ฆฌ์  ๋ณ€๊ฒฝ ์‚ฌํ•ญ(logical change)๋งŒ์„ ํฌํ•จ์‹œํ‚ค๋Š” ์ฝ”๋“œ ๊ธฐ๋ก ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค [1]. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ์„ ์ถ”๊ฐ€ํ•˜๋Š” ์ž‘์—…๊ณผ ๋กœ๊ทธ์•„์›ƒ ๋ฒ„ํŠผ์„ ์ถ”๊ฐ€ํ•˜๋Š” ์ž‘์—…์„ ํ•˜๋‚˜์˜ ์ปค๋ฐ‹์— ๋ฌถ์ง€ ์•Š๊ณ  ๋ณ„๋„์˜ ์ปค๋ฐ‹์œผ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค [1]. ์ด๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๊ณผ์ •์„ ๋‹จ์ˆœํ™”ํ•˜๊ณ  ํ”„๋กœ์ ํŠธ์˜ ์ˆ˜์ • ๋‚ด์—ญ(history)์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1]. + +## ๐Ÿ“– Core ๋‹จ๋ฝ Content +* **๋‹จ์ผ ์ฑ…์ž„ ์›์น™ ์ ์šฉ**: ํ•œ ๋ฒˆ์˜ ์ปค๋ฐ‹์€ ์˜ค์ง ํ•˜๋‚˜์˜ ๋…ผ๋ฆฌ์ ์ธ ๋ณ€๊ฒฝ ์‚ฌํ•ญ๋งŒ์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [1, 2]. ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ์„ ์ˆ˜์ •ํ•˜๋ฉด์„œ ๋™์‹œ์— ์—ฐ๊ด€ ์—†๋Š” ๋‹ค๋ฅธ ๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ์‹์˜ ์ž‘์—…์„ ์ง€์–‘ํ•ฉ๋‹ˆ๋‹ค [1]. +* **๋ฆฌ๋ทฐ ๋ฐ ํžˆ์Šคํ† ๋ฆฌ ๊ด€๋ฆฌ์˜ ์ด์ **: ์ปค๋ฐ‹์„ ์ž‘๊ณ  ์˜๋ฏธ ์žˆ๋Š”(small and meaningful) ๋‹จ์œ„๋กœ ์œ ์ง€ํ•˜๋ฉด, ๋™๋ฃŒ๊ฐ€ ์ฝ”๋“œ๋ฅผ ๋ฆฌ๋ทฐํ•  ๋•Œ ๋ณ€๊ฒฝ๋œ ์˜๋„๋ฅผ ์‰ฝ๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์–ด ์ฝ”๋“œ ๋ฆฌ๋ทฐ๊ฐ€ ๋‹จ์ˆœํ•ด์ง‘๋‹ˆ๋‹ค [1, 3]. ๋˜ํ•œ, ์ถ”ํ›„ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ๋ณ€๊ฒฝ ์ด๋ ฅ์„ ์ถ”์ ํ•˜๊ฑฐ๋‚˜ ๋˜๋Œ๋ฆฌ๊ธฐ ์ˆ˜์›”ํ•ด์ง‘๋‹ˆ๋‹ค [1]. +* **์›Œํฌํ”Œ๋กœ์šฐ ๋‚ด์˜ ์—ญํ• **: ์†Œ๊ทœ๋ชจ ํŒ€์—์„œ Feature Branch ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ, ์ตœ์‹  ๋ฉ”์ธ ๋ธŒ๋žœ์น˜๋ฅผ ๊ฐ€์ ธ์˜จ ํ›„ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜ ๋‚ด์—์„œ ๋นˆ๋ฒˆํ•˜๊ณ  ์›์ž์ ์ธ ์ปค๋ฐ‹(Make atomic commits)์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ ๊ทœ์น™์œผ๋กœ ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค [2, 4]. + +## โš–๏ธ Trade-offs & Caveats +์†Œ์Šค์— ๊ด€๋ จ ์ •๋ณด๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. (์ œ๊ณต๋œ ์†Œ์Šค์—์„œ๋Š” ์›์ž์  ์ปค๋ฐ‹์ด ์ฝ”๋“œ ๋ฆฌ๋ทฐ์™€ ํžˆ์Šคํ† ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ๋‹จ์ˆœํ™”ํ•œ๋‹ค๋Š” ์žฅ์ ๋งŒ ์–ธ๊ธ‰๋˜์–ด ์žˆ์„ ๋ฟ, ์ด๋กœ ์ธํ•ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€์ž‘์šฉ, ์ œ์•ฝ ์‚ฌํ•ญ ๋˜๋Š” ๋ฐ˜๋Œ€ ๊ธ‰๋ถ€์— ๋Œ€ํ•œ ์„ค๋ช…์€ ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค [1].) + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [ํ˜‘์—… ๋ฐ ๋ธŒ๋žœ์นญ ์ „๋žต] +- [[Feature Branching]] + - ์—ฐ๊ฒฐ ์ด์œ : ์›์ž์  ์ปค๋ฐ‹์€ ์ฃผ๋กœ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์—์„œ ๋ถ„๊ธฐ๋œ '๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜(Feature branch)' ๋‚ด์—์„œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์ ์šฉ๋˜๋Š” ํ•ต์‹ฌ ๊ทœ์น™์ž…๋‹ˆ๋‹ค [1, 4]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด๋‚˜ ๋ฒ„๊ทธ ์ˆ˜์ •์„ ๋…๋ฆฝ๋œ ๋ธŒ๋žœ์น˜์—์„œ ๊ฐœ๋ฐœํ•  ๋•Œ, ์–ด๋–ป๊ฒŒ ์ž‘์—…์„ ๋‹จ์ผ ๋…ผ๋ฆฌ ๋‹จ์œ„๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ์ปค๋ฐ‹ํ• ์ง€ ๊ตฌ์กฐ์ ์ธ ํ๋ฆ„์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1, 5]. + +- [[Pull Request (PR)]] + - ์—ฐ๊ฒฐ ์ด์œ : ์›์ž์  ์ปค๋ฐ‹๋“ค์„ ๋ชจ์•„ ํ•˜๋‚˜์˜ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜๋ฅผ ์™„์„ฑํ•œ ํ›„, ์ด๋ฅผ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์— ๋ณ‘ํ•ฉํ•˜๊ธฐ ์œ„ํ•ด PR์„ ์ƒ์„ฑํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค [1-3]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์›์ž์  ์ปค๋ฐ‹์ด ์‹ค์ œ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๊ณผ์ •์—์„œ ํŒ€์›์˜ ๋น ๋ฅธ ํ”ผ๋“œ๋ฐฑ๊ณผ ์Šน์ธ์„ ์–ป๋Š” ๋ฐ ์–ด๋–ป๊ฒŒ ๊ธฐ์—ฌํ•˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1-3]. + +#### [์ปค๋ฐ‹ ๋ฐ ๋ณ‘ํ•ฉ ๊ธฐ๋ฒ•] +- [[Squash Merge]] + - ์—ฐ๊ฒฐ ์ด์œ : ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์›์ž์  ์ปค๋ฐ‹์ด ์Œ“์ธ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜๋ฅผ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜๋กœ ๋ณ‘ํ•ฉํ•  ๋•Œ, ์ „์ฒด ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด Squash Merge ์ „๋žต์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค [3, 4, 6]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์›์ž์  ์ปค๋ฐ‹์œผ๋กœ ์ƒ์„ธํ•˜๊ฒŒ ์ชผ๊ฐœ์ง„ ์ž‘์—… ๋‚ด์—ญ์„ ์ตœ์ข…์ ์œผ๋กœ ๋ณ‘ํ•ฉํ•  ๋•Œ ์–ด๋–ป๊ฒŒ ๋‹จ์ผ ๊ธฐ๋Šฅ ๋‹จ์œ„๋กœ ๋‹ค์‹œ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3, 6]. + +### Deeper Research Questions +- ๋‹จ์ผ ๋…ผ๋ฆฌ์  ๋ณ€๊ฒฝ(Logical change)์˜ ๊ฒฝ๊ณ„๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ณ  ์›์ž์  ์ปค๋ฐ‹์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ช…ํ™•ํ•œ ๊ธฐ์ค€์€ ๋ฌด์—‡์ธ๊ฐ€? [1, 2] +- ์žฆ์€ ์›์ž์  ์ปค๋ฐ‹(Commit frequently)์ด ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜(Feature branch)์˜ ๋ฆฌ๋ทฐ ๊ณผ์ •์— ๋ฏธ์น˜๋Š” ๊ตฌ์ฒด์ ์ธ ์˜ํ–ฅ์€ ๋ฌด์—‡์ธ๊ฐ€? [1, 2] +- ์›์ž์  ์ปค๋ฐ‹๊ณผ Conventional Commits (์˜ˆ: `feat:`, `fix:`) ์ž‘์„ฑ ๊ทœ์น™์€ ์–ด๋–ป๊ฒŒ ์ƒํ˜ธ ์ž‘์šฉํ•˜์—ฌ ์ปค๋ฐ‹์˜ ์˜๋ฏธ๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ํ•˜๋Š”๊ฐ€? [2, 7] +- ์›์ž์  ์ปค๋ฐ‹๋“ค๋กœ ๊ตฌ์„ฑ๋œ ๋ธŒ๋žœ์น˜๋ฅผ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์— ๋ณ‘ํ•ฉํ•  ๋•Œ, ์ผ๋ฐ˜ Merge์™€ Squash Merge ์ค‘ ์–ด๋–ค ๊ฒƒ์ด ํžˆ์Šคํ† ๋ฆฌ ๊ด€๋ฆฌ์— ๋” ์ ํ•ฉํ•œ๊ฐ€? [3, 4, 6] +- ์ž‘๊ณ  ๋…๋ฆฝ์ ์ธ ์›์ž์  ์ปค๋ฐ‹์„ ์ง€์†์ ์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์—ฌ๋Ÿฌ ๊ฐœ๋ฐœ์ž์˜ ๋™์‹œ ์ž‘์—… ์‹œ ์ถฉ๋Œ(Conflict) ์˜ˆ๋ฐฉ์— ์–ด๋–ค ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”๊ฐ€? [8, 9] + +### Practical Application Contexts + +- **Implementation:** ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ ์ถ”๊ฐ€์™€ ๋กœ๊ทธ์•„์›ƒ ๋ฒ„ํŠผ ์ถ”๊ฐ€๋ฅผ ํ•œ ๋ฒˆ์— ์ปค๋ฐ‹ํ•˜์ง€ ์•Š๊ณ , ๊ฐ๊ฐ ๋ถ„๋ฆฌํ•˜์—ฌ ๋ณ„๊ฐœ์˜ ์ปค๋ฐ‹์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ €์žฅํ•  ๋•Œ ์ง์ ‘์ ์œผ๋กœ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค [1]. +- **System Design:** ์†Œ์Šค์— ๊ด€๋ จ ์ •๋ณด๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. +- **Operation / Maintenance:** ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌ๋œ ์ปค๋ฐ‹ ๋‚ด์—ญ์„ ํ†ตํ•ด ํ”„๋กœ์ ํŠธ์˜ ์ˆ˜์ • ์ด๋ ฅ์„ ์‰ฝ๊ฒŒ ์ถ”์ ํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜ ์ค‘ ๋ฐœ์ƒํ•˜๋Š” ์ฝ”๋“œ ๋ฆฌ๋ทฐ์˜ ๋ณต์žก์„ฑ์„ ์ค„์ด๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค [1]. +- **Learning Path:** ์†Œ๊ทœ๋ชจ ๊ฐœ๋ฐœ ํŒ€์— ์ ํ•ฉํ•œ ๊ฐ€๋ณ๊ณ  ์ถฉ๋Œ ์—†๋Š” Git ๋ธŒ๋žœ์นญ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ํ•™์Šตํ•˜๋Š” ๊ณผ์ •์—์„œ ํ•„์ˆ˜์ ์ธ ๊ธฐ๋ณธ ์ˆ˜์น™์œผ๋กœ ํ•™์Šต๋ฉ๋‹ˆ๋‹ค [1, 8]. +- **My Project Relevance:** ํŒ€ ํ”„๋กœ์ ํŠธ์—์„œ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ž‘์—…ํ•  ๋•Œ, `fix: handle null response in login API`์™€ ๊ฐ™์ด ์ž‘๊ณ  ์˜๋ฏธ ์žˆ๋Š” ์ปค๋ฐ‹ ๋‹จ์œ„๋ฅผ ์œ ์ง€ํ•จ์œผ๋กœ์จ ํŒ€์›๋“ค์˜ ๋น ๋ฅด๊ณ  ํšจ๊ณผ์ ์ธ ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3, 7]. + +### Adjacent Topics + +- [[Conventional Commits]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ์›์ž์  ์ปค๋ฐ‹์˜ ๋ชฉ์ ์„ ๋”์šฑ ๋ช…ํ™•ํžˆ ํ•˜๊ธฐ ์œ„ํ•ด `feat:`, `fix:`, `chore:` ๋“ฑ์˜ ์ ‘๋‘์‚ฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๋ฅผ ๊ตฌ์กฐํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ•จ๊ป˜ ์กฐ์‚ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2, 7, 10]. + +--- +*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 new file mode 100644 index 00000000..630c4289 --- /dev/null +++ b/00_Raw/Automated Governance.md @@ -0,0 +1,59 @@ +# [[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 new file mode 100644 index 00000000..60367a24 --- /dev/null +++ b/00_Raw/CI-CD Pipeline Integration.md @@ -0,0 +1,61 @@ +# [[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 new file mode 100644 index 00000000..46995bbb --- /dev/null +++ b/00_Raw/Chrome DevTools.md @@ -0,0 +1,65 @@ +# [[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/Clean Code and SOLID Principles.md b/00_Raw/Clean Code and SOLID Principles.md new file mode 100644 index 00000000..36c11673 --- /dev/null +++ b/00_Raw/Clean Code and SOLID Principles.md @@ -0,0 +1,68 @@ +# [[Clean Code and SOLID Principles]] + +## ๐Ÿ“Œ Brief Summary +Clean Code์™€ SOLID ์›์น™์€ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์—์„œ ์œ ์ง€๋ณด์ˆ˜์„ฑ, ๊ฐ€๋…์„ฑ, ํ™•์žฅ์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ํ•ต์‹ฌ ์„ค๊ณ„ ์›์น™์ด๋‹ค [1]. SOLID๋Š” SRP, OCP, LSP, ISP, DIP์˜ 5๊ฐ€์ง€ ์›์น™์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ๋ช…ํ™•ํ•˜๊ณ  ์ž˜ ์กฐ์ง๋œ ์†Œํ”„ํŠธ์›จ์–ด ๊ตฌ์กฐ๋ฅผ ์•ˆ๋‚ดํ•˜๋ฉฐ, ๊ฐ์ฒด ์ง€ํ–ฅ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ React์˜ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—๋„ ์œ ํšจํ•˜๊ฒŒ ์ ์šฉ๋œ๋‹ค [1, 2]. ๋”๋ถˆ์–ด DRY, KISS, YAGNI์™€ ๊ฐ™์€ Clean Code ์›์น™๋“ค์€ ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ ์ค‘๋ณต๊ณผ ๋ณต์žก์„ฑ์„ ์ค„์—ฌ, ์ฝ”๋“œ๋ฅผ ๋‹จ์ˆœํ•˜๊ณ  ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๋ฉฐ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ค์–ด์ค€๋‹ค [3, 4]. + +## ๐Ÿ“– Core Content + +**SOLID ์›์น™์˜ React ์ ์šฉ** +* **๋‹จ์ผ ์ฑ…์ž„ ์›์น™ (SRP - Single Responsibility Principle):** ์ปดํฌ๋„ŒํŠธ๋‚˜ ์ปค์Šคํ…€ ํ›…์€ ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•  ์ด์œ ๊ฐ€ ๋‹จ ํ•˜๋‚˜์—ฌ์•ผ ํ•œ๋‹ค [5]. ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์€ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๊ฑฐ๋‚˜ ํฌ๊ธฐ๊ฐ€ 300์ค„์„ ๋„˜์–ด๊ฐˆ ๊ฒฝ์šฐ, UI ์ปดํฌ๋„ŒํŠธ(์˜ˆ: UserProfile, UserPosts)๋‚˜ ์ปค์Šคํ…€ ํ›…์œผ๋กœ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋ถ„๋ฆฌํ•ด์•ผ ํ•œ๋‹ค [2, 5]. +* **๊ฐœ๋ฐฉ-ํ์‡„ ์›์น™ (OCP - Open/Closed Principle):** ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ ๋„ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค [6]. React์—์„œ๋Š” ์ปดํฌ๋„ŒํŠธ ํ•ฉ์„ฑ(Composition), `children` prop, ํ˜น์€ ๋ Œ๋” ํ”„๋กญ์Šค(render-props)๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๊ธฐ์กด ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๊ณ  ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋‹ค [2, 7, 8]. +* **๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™ (LSP - Liskov Substitution Principle):** ํ•˜์œ„ ํƒ€์ž…์€ ์ƒ์œ„ ํƒ€์ž…์„ ๋ฌด๋ฆฌ ์—†์ด ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค [6]. ํ˜„๋Œ€ React๋Š” ํด๋ž˜์Šค ์ƒ์†์„ ๊ฑฐ์˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š์ง€๋งŒ, ์„œ๋ธŒ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ธฐ๋ณธ ์ปดํฌ๋„ŒํŠธ์˜ ์ž๋ฆฌ๋ฅผ ๋งค๋„๋Ÿฝ๊ฒŒ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ด ์›์น™์„ ์ ์šฉํ•œ๋‹ค [2, 8]. +* **์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›์น™ (ISP - Interface Segregation Principle):** ์ปดํฌ๋„ŒํŠธ๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” props์— ์˜์กดํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค [2, 7]. ๊ฑฐ๋Œ€ํ•œ ๊ฐ์ฒด๋ฅผ ํ†ต์งธ๋กœ props๋กœ ๋„˜๊ธฐ๊ธฐ๋ณด๋‹ค๋Š”, ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ช…ํ™•ํ•˜๊ณ  ์ž‘์€ ๋‹จ์œ„์˜ ๋ฐ์ดํ„ฐ๋งŒ ์ „๋‹ฌํ•ด์•ผ ํ•œ๋‹ค [7, 8]. +* **์˜์กด์„ฑ ์—ญ์ „ ์›์น™ (DIP - Dependency Inversion Principle):** ๊ตฌ์ฒด์ ์ธ ๊ตฌํ˜„(Concretions)์ด ์•„๋‹Œ ์ถ”์ƒํ™”์— ์˜์กดํ•ด์•ผ ํ•œ๋‹ค [2]. ์ปดํฌ๋„ŒํŠธ ๊ฐ„ ์ง์ ‘์ ์ธ ๊ฒฐํ•ฉ์„ ํ”ผํ•˜๊ณ , props๋‚˜ Context๋ฅผ ํ†ตํ•ด ์˜์กด์„ฑ์„ ์ฃผ์ž…๋ฐ›์•„ ์‚ฌ์šฉํ•œ๋‹ค [2, 8]. + +**์ถ”๊ฐ€์ ์ธ Clean Code ์›์น™** +* **DRY (Don't Repeat Yourself):** ๋™์ผํ•œ ์ฝ”๋“œ๋ฅผ ๋‘ ๋ฒˆ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ  ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋กœ์ง์„ ์ปค์Šคํ…€ ํ›…์ด๋‚˜ ๊ณ ์ฐจ ์ปดํฌ๋„ŒํŠธ(HOC)๋กœ ์ถ”์ถœํ•œ๋‹ค [4, 9]. ๋‹จ, ์„ฑ๊ธ‰ํ•œ ์ถ”์ƒํ™”๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ํŒจํ„ด์ด ์ตœ์†Œ ์„ธ ๋ฒˆ ์ด์ƒ ๋ฐ˜๋ณต๋  ๋•Œ ์ถ”์ถœํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋œ๋‹ค [10]. +* **KISS (Keep It Simple, Stupid):** ๋ณต์žก์„ฑ๋ณด๋‹ค ๋‹จ์ˆœ์„ฑ์„ ์ตœ์šฐ์„ ์œผ๋กœ ํ•ด์•ผ ํ•œ๋‹ค [4]. ์ปดํฌ๋„ŒํŠธ์™€ ํ•จ์ˆ˜๋ฅผ '๋‹จ์ˆœํ•˜๊ณ  ๋ฐ”๋ณด๊ฐ™์ด(simple and dumb)' ์œ ์ง€ํ•˜๋ฉฐ, ๋ถˆํ•„์š”ํ•œ ์กฐ๊ธฐ ์ตœ์ ํ™”๋ฅผ ํ”ผํ•ด์•ผ ํ•œ๋‹ค [9, 11]. +* **YAGNI (You Aren't Gonna Need It):** ๋ฏธ๋ž˜์— ์‚ฌ์šฉ๋ ์ง€๋„ ๋ชจ๋ฅธ๋‹ค๋Š” ์ด์œ ๋กœ ๊ธฐ๋Šฅ์„ ๋ฏธ๋ฆฌ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋Š”๋‹ค [4, 12]. ํ˜„์žฌ ์ปดํฌ๋„ŒํŠธ๋‚˜ ์š”๊ตฌ์‚ฌํ•ญ์— ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ๋งŒ ๊ตฌํ˜„ํ•˜์—ฌ ์œ ์ง€๋ณด์ˆ˜ํ•ด์•ผ ํ•  ์ฃฝ์€ ์ฝ”๋“œ(dead code)๋ฅผ ๋ฐฉ์ง€ํ•œ๋‹ค [9, 13]. + +## โš–๏ธ Trade-offs & Caveats +* **SOLID ๋„์ž…์˜ ๋ณต์žก์„ฑ:** SOLID ์›์น™์„ ๋„์ž…ํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ๊ณ ๋„๋กœ ์ฒด๊ณ„ํ™”๋˜๊ณ  ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ํ–ฅ์ƒ๋˜์ง€๋งŒ, ์ดˆ๊ธฐ ์„ค๊ณ„ ๋‹จ๊ณ„์—์„œ๋Š” ๊ตฌ์กฐ๊ฐ€ ์ง€๋‚˜์น˜๊ฒŒ ๋ณต์žกํ•˜๊ฒŒ ๋А๊ปด์งˆ ์ˆ˜ ์žˆ๋‹ค [14]. +* **DRY ์›์น™๊ณผ ๊ณผ๋„ํ•œ ์ถ”์ƒํ™”:** ์ฝ”๋“œ์˜ ์ค‘๋ณต์„ ์ค„์—ฌ์ฃผ์ง€๋งŒ, ๋ฌด๋ถ„๋ณ„ํ•˜๊ฒŒ ์ ์šฉํ•  ๊ฒฝ์šฐ ์ง€๋‚˜์น˜๊ฒŒ ๋ณต์žกํ•œ ์ถ”์ƒํ™”(overly complex abstractions)๋ฅผ ์ดˆ๋ž˜ํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ๋” ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค [10, 14]. +* **KISS ์›์น™์˜ ์ง€๋‚˜์นœ ๋‹จ์ˆœํ™”:** ๋””๋ฒ„๊น…์„ ์‰ฝ๊ฒŒ ํ•˜๊ณ  ์ง๊ด€์ ์ธ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์œผ๋‚˜, ๋•Œ๋กœ๋Š” ๋ณต์žกํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ์š”๊ตฌ์‚ฌํ•ญ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์„ ๋„ˆ๋ฌด ๋‹จ์ˆœํ™”(oversimplify)ํ•  ์œ„ํ—˜์ด ์กด์žฌํ•œ๋‹ค [14]. +* **YAGNI์™€ ํ™•์žฅ์„ฑ ๊ฐ„๊ณผ:** ๋‚ญ๋น„๋˜๋Š” ๋…ธ๋ ฅ์„ ์ค„์ด๊ณ  ๊ธฐ๋ฏผํ•˜๊ฒŒ ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•์ง€๋งŒ, ํ˜„์žฌ์—๋งŒ ๋„ˆ๋ฌด ์ง‘์ค‘ํ•œ ๋‚˜๋จธ์ง€ ๋ฏธ๋ž˜์˜ ํ™•์žฅ์„ฑ(future scalability)์„ ๊ฐ„๊ณผํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค [14]. +* **Clean Code ์œ ์ง€๋ฅผ ์œ„ํ•œ ๊ทœ์œจ:** ์ฝ๊ณ  ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ ค๋ฉด ํŒ€ ์ „์ฒด์˜ ์ง€์†์ ์ธ ๋…ธ๋ ฅ๊ณผ ๊ฐ•๋ ฅํ•œ ๊ทœ์œจ(discipline)์ด ์š”๊ตฌ๋œ๋‹ค [14]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [์†Œํ”„ํŠธ์›จ์–ด ์—”์ง€๋‹ˆ์–ด๋ง ์•„ํ‚คํ…์ฒ˜ ์›์น™] +- [[Feature-Sliced Design]] + - ์—ฐ๊ฒฐ ์ด์œ : ์ฝ”๋“œ๋ฅผ ๊ธฐ์ˆ ์ ์ธ ํŒŒ์ผ ๋‹จ์œ„๊ฐ€ ์•„๋‹ˆ๋ผ ๋น„์ฆˆ๋‹ˆ์Šค ๊ธฐ๋Šฅ(Feature)์ด๋‚˜ ๋„๋ฉ”์ธ ์ค‘์‹ฌ์œผ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ SRP(๋‹จ์ผ ์ฑ…์ž„ ์›์น™) ๋ฐ ๊ด€์‹ฌ์‚ฌ ๋ถ„๋ฆฌ๋ฅผ ์•„ํ‚คํ…์ฒ˜ ์ˆ˜์ค€์—์„œ ์‹คํ˜„ํ•œ๋‹ค [15-17]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ฑฐ๋Œ€ํ•œ ํ”„๋ก ํŠธ์—”๋“œ ํ”„๋กœ์ ํŠธ์—์„œ ํ•˜์œ„ ๋ ˆ์ด์–ด๋งŒ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋„๋ก ์˜์กด์„ฑ์„ ์ œ์–ด(DIP์™€ ์œ ์‚ฌ)ํ•˜์—ฌ, ๋…๋ฆฝ์ ์ธ ์ฝ”๋“œ ๋ชจ๋“ˆํ™”๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ๋‹ค [16, 17]. + +#### [React ๊ตฌํ˜„ ํŒจํ„ด ๋ฐ ๊ธฐ์ˆ ] +- [[Custom Hooks]] + - ์—ฐ๊ฒฐ ์ด์œ : React์—์„œ DRY ์›์น™์„ ์‹คํ˜„ํ•˜๊ณ  ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ UI์™€ ๋ถ„๋ฆฌํ•˜์—ฌ SRP๋ฅผ ์ถฉ์กฑ์‹œํ‚ค๋Š” ๊ฐ€์žฅ ํšจ๊ณผ์ ์ธ ๋ฆฌํŒฉํ† ๋ง ๋‹จ์œ„์ด์ž ๋„๊ตฌ์ด๋‹ค [10, 18]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ฐ์ดํ„ฐ ํŽ˜์นญ, ํผ(Form) ์ฒ˜๋ฆฌ ๋“ฑ์˜ ๋ณต์žกํ•œ ๋…ผ๋ฆฌ๋ฅผ ์ปค์Šคํ…€ ํ›…์œผ๋กœ ๋ถ„๋ฆฌํ•จ์œผ๋กœ์จ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‹จ์ˆœํ•˜๊ฒŒ(KISS) ์œ ์ง€ํ•˜๋Š” ํŒจํ„ด์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค [9]. +- [[Component Composition]] + - ์—ฐ๊ฒฐ ์ด์œ : OCP(๊ฐœ๋ฐฉ-ํ์‡„ ์›์น™)๋ฅผ React์—์„œ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ํ•ต์‹ฌ ํŒจํ„ด์œผ๋กœ, ๊ธฐ์กด ์ปดํฌ๋„ŒํŠธ์˜ ๋‚ด๋ถ€ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  `children`์„ ํ†ตํ•ด ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์กฐํ•ฉ ๋ฐ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค [7, 8]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: React ํ™˜๊ฒฝ์—์„œ ์ƒ์† ์—†์ด ํ•ฉ์„ฑ๋งŒ์„ ์‚ฌ์šฉํ•˜์—ฌ ์œ ์—ฐํ•˜๊ณ  ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ UI ๊ตฌ์กฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์„ค๊ณ„ํ•˜๋Š”์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค. + +### Deeper Research Questions + +- React์˜ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„์—์„œ ํด๋ž˜์Šค ์ƒ์†์„ ์ „์ œ๋กœ ํ•œ LSP(๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™)๋Š” ์ปดํฌ๋„ŒํŠธ ์„ค๊ณ„ ์‹œ ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ์žฌํ•ด์„๋˜๊ณ  ์ ์šฉ๋˜์–ด์•ผ ํ•˜๋Š”๊ฐ€? +- DRY ์›์น™์„ ์ง€ํ‚ค๊ธฐ ์œ„ํ•ด ๊ณตํ†ต ๋กœ์ง์„ ์ถ”์ƒํ™”ํ•  ๋•Œ, ์ง€๋‚˜์นœ ์ถ”์ƒํ™”๋ฅผ ๊ฒฝ๊ณ„ํ•˜๋Š” KISS ์›์น™๊ณผ ์ถฉ๋Œํ•œ๋‹ค๋ฉด ์ด๋ฅผ ์กฐ์œจํ•˜๊ธฐ ์œ„ํ•œ ์‹ค๋ฌด์ ์ธ ๊ธฐ์ค€(์˜ˆ: Rule of three) ์™ธ์— ์–ด๋–ค ์ฒ™๋„๊ฐ€ ์žˆ๋Š”๊ฐ€? +- ISP(์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›์น™)๋ฅผ ์œ„๋ฐฐํ•˜์—ฌ ๊ฑฐ๋Œ€ํ•œ Props ๊ฐ์ฒด๋ฅผ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋กœ ์ „๋‹ฌํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง ๋ฌธ์ œ๋ฅผ React ์ตœ์ ํ™” ๊ธฐ๋ฒ•์œผ๋กœ ์–ด๋–ป๊ฒŒ ๊ทน๋ณตํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- Feature-Sliced Design(FSD)๊ณผ ๊ฐ™์ด ๊ณ„์ธต๊ณผ ๊ทœ์น™์ด ์—„๊ฒฉํ•œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋„์ž…ํ•  ๋•Œ, YAGNI ์›์น™์„ ํ•จ๊ป˜ ์ ์šฉํ•˜์—ฌ ์˜ค๋ฒ„์—”์ง€๋‹ˆ์–ด๋ง์„ ํ”ผํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? +- SRP๋ฅผ ์ค€์ˆ˜ํ•˜๊ธฐ ์œ„ํ•ด 300์ค„ ์ด์ƒ์˜ React ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‹ค์ˆ˜์˜ ์ž‘์€ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ถ„๋ฆฌํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” Props ๋“œ๋ฆด๋ง(Prop Drilling) ๋ฌธ์ œ๋ฅผ ์•„ํ‚คํ…์ฒ˜ ์ธก๋ฉด์—์„œ ์–ด๋–ป๊ฒŒ ํšจ์œจ์ ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? + +### Practical Application Contexts + +- **Implementation:** 300์ค„์ด ๋„˜๋Š” ๋น„๋Œ€ํ•ด์ง„ React ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•  ๋•Œ, ์ƒํƒœ ๊ด€๋ฆฌ๋‚˜ API ํ˜ธ์ถœ ๋กœ์ง์€ ์ปค์Šคํ…€ ํ›…์œผ๋กœ, ๋…๋ฆฝ์ ์ธ UI ์š”์†Œ๋Š” ๊ฐœ๋ณ„ ์ปดํฌ๋„ŒํŠธ๋กœ ์ชผ๊ฐœ์–ด SRP์™€ Clean Code๋ฅผ ์‹คํ˜„ํ•œ๋‹ค [5, 18]. +- **System Design:** ์†Œํ”„ํŠธ์›จ์–ด ์„ค๊ณ„ ์ดˆ๊ธฐ ๋‹จ๊ณ„์—์„œ๋Š” ๋‹น์žฅ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๋ฏธ๋ž˜ ๊ธฐ๋Šฅ๊นŒ์ง€ ํฌํ•จํ•˜์ง€ ์•Š๊ณ (YAGNI), ๋Œ€์‹  ์ƒˆ๋กœ์šด ์š”๊ตฌ์‚ฌํ•ญ์ด ์ƒ๊ฒผ์„ ๋•Œ ์‰ฝ๊ฒŒ ๋ง๋ถ™์ผ ์ˆ˜ ์žˆ๋„๋ก ์ปดํฌ๋„ŒํŠธ ํ•ฉ์„ฑ์„ ํ™œ์šฉํ•œ OCP ๊ตฌ์กฐ๋ฅผ ์„ค๊ณ„ํ•œ๋‹ค [7, 9]. +- **Operation / Maintenance:** ESLint ๋ฐ Prettier์™€ ๊ฐ™์€ ๋„๊ตฌ์™€ Husky๋ฅผ ์—ฐ๋™ํ•˜์—ฌ CI/CD ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ์ฝ”๋“œ๊ฐ€ ์ปค๋ฐ‹๋˜๊ธฐ ์ „ Clean Code ๊ทœ์น™๊ณผ ํŒŒ์ผ ๋ช…๋ช… ๊ทœ์น™์ด ์ž๋™ ์ค€์ˆ˜๋˜๋„๋ก ๊ฐ•์ œํ•œ๋‹ค [19]. +- **Learning Path:** ์ฒ˜์Œ React๋ฅผ ๋ฐฐ์šธ ๋•Œ๋Š” KISS ์›์น™์— ์ž…๊ฐํ•œ ๋‹จ์ˆœํ•œ ์ปดํฌ๋„ŒํŠธ ์ž‘์„ฑ์„ ์—ฐ์Šตํ•˜๊ณ , ์ ์ฐจ DRY๋ฅผ ์œ„ํ•œ ์ปค์Šคํ…€ ํ›… ๋ถ„๋ฆฌ๋ฅผ ๊ฑฐ์ณ SOLID ์›์น™์ด ๊ฒฐํ•ฉ๋œ ๋Œ€๊ทœ๋ชจ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„๋กœ ํ•™์Šต์„ ํ™•์žฅํ•œ๋‹ค. +- **My Project Relevance:** ํ˜„์žฌ ์ž‘์—… ์ค‘์ธ ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋ฐฉ๋Œ€ํ•œ ๊ฐ์ฒด ์†์„ฑ์ด props๋กœ ์ „๋‹ฌ๋˜๊ณ  ์žˆ์ง€ ์•Š์€์ง€ ์ ๊ฒ€ํ•˜์—ฌ(ISP ์ ์šฉ), ์ฝ”๋“œ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ณ  ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•˜๋Š” ๋ฆฌํŒฉํ† ๋ง ์ž‘์—…์— ์ฆ‰์‹œ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. + +### Adjacent Topics + +- [[State Management Architecture]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ์ปดํฌ๋„ŒํŠธ ๋ ˆ๋ฒจ์—์„œ์˜ ์ฑ…์ž„ ๋ถ„๋ฆฌ๋ฅผ ๋„˜์–ด, Context API, Zustand, Redux ๋“ฑ ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ™œ์šฉํ•  ๋•Œ ๊ฐ ๋„๋ฉ”์ธ์˜ ์ƒํƒœ์™€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์–ด๋–ป๊ฒŒ ๋ถ„๋ฆฌ(SRP)ํ•˜๊ณ  ์˜์กด์„ฑ์„ ๊ด€๋ฆฌํ• ์ง€ ํƒ๊ตฌํ•œ๋‹ค. +- [[Frontend Performance Optimization]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: Clean Code์™€ ๋ชจ๋“ˆ ๋ถ„๋ฆฌ(์˜ˆ: ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…, ์ง€์—ฐ ๋กœ๋”ฉ)๊ฐ€ React ์ปดํฌ๋„ŒํŠธ์˜ ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง์„ ๋ฐฉ์ง€ํ•˜๊ณ  ํ”„๋ก ํŠธ์—”๋“œ ์„ฑ๋Šฅ(Core Web Vitals)์„ ์–ด๋–ป๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ค๋Š”์ง€ ์—ฐ๊ณ„ํ•˜์—ฌ ์กฐ์‚ฌํ•œ๋‹ค. + +--- +*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 new file mode 100644 index 00000000..d21786f7 --- /dev/null +++ b/00_Raw/Context API to Zustand Migration.md @@ -0,0 +1,54 @@ +# [[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 Engineering.md b/00_Raw/Context Engineering.md new file mode 100644 index 00000000..fed671a9 --- /dev/null +++ b/00_Raw/Context Engineering.md @@ -0,0 +1,73 @@ +# [[Context Engineering]] + +## ๐Ÿ“Œ Brief Summary +Context Engineering(์ปจํ…์ŠคํŠธ ์—”์ง€๋‹ˆ์–ด๋ง)์€ ๋Œ€๊ทœ๋ชจ ์–ธ์–ด ๋ชจ๋ธ(LLM) ๊ธฐ๋ฐ˜ ์—์ด์ „ํŠธ๊ฐ€ ๊ธด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ์ปจํ…์ŠคํŠธ ์œˆ๋„์šฐ์— ์ง„์ž…ํ•˜๋Š” ์ •๋ณด๋ฅผ ๋Šฅ๋™์ ์œผ๋กœ ํ๋ ˆ์ด์…˜ํ•˜๊ณ  ๊ตฌ์กฐํ™”ํ•˜๋Š” ์‹œ์Šคํ…œ ์„ค๊ณ„ ํŒจ๋Ÿฌ๋‹ค์ž„์ด๋‹ค [1-3]. ์ด๋Š” ๋‹จ์ผ ํ„ด์˜ ์ง€์‹œ๋ฌธ์„ ์ตœ์ ํ™”ํ•˜๋Š” ํ”„๋กฌํ”„ํŠธ ์—”์ง€๋‹ˆ์–ด๋ง(Prompt Engineering)์„ ๋„˜์–ด, ๋‹ค์ค‘ ํ„ด์— ๊ฑธ์ณ ์–ด๋– ํ•œ ์ •๋ณด๋ฅผ ๋ณด์กด, ์••์ถ•, ๊ฒ€์ƒ‰ ๋ฐ ์ฃผ์ž…ํ• ์ง€๋ฅผ ๊ฒฐ์ •ํ•˜์—ฌ ๋ชจ๋ธ์˜ ์ถ”๋ก  ํ™˜๊ฒฝ์„ ๊ด€๋ฆฌํ•œ๋‹ค [1, 2]. ์—์ด์ „ํŠธ ํ•˜๋„ค์Šค ์—”์ง€๋‹ˆ์–ด๋ง(Agent Harness Engineering)์˜ ํ•ต์‹ฌ ํ•˜์œ„ ๋ ˆ์ด์–ด์ธ ์ปจํ…์ŠคํŠธ ๊ด€๋ฆฌ์ž(C-component)๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„๋˜๋ฉฐ, ์—์ด์ „ํŠธ์˜ ์‹ ๋ขฐ์„ฑ ํ–ฅ์ƒ๊ณผ ํ† ํฐ ๋น„์šฉ ์ตœ์ ํ™”, ๊ทธ๋ฆฌ๊ณ  ๋ณด์•ˆ ์œ ์ง€์— ๊ฒฐ์ •์ ์ธ ์—ญํ• ์„ ํ•œ๋‹ค [4-6]. + +## ๐Ÿ“– Core Content + +* **ํ”„๋กฌํ”„ํŠธ ์—”์ง€๋‹ˆ์–ด๋ง์—์„œ์˜ ์ง„ํ™”:** AI ์—์ด์ „ํŠธ ์‹œ์Šคํ…œ์˜ ๋ฐœ์ „์€ '๋ฌด์—‡์„ ๋งํ•  ๊ฒƒ์ธ๊ฐ€(Prompt Engineering)'์—์„œ '์–ด๋–ค ์ •๋ณด๋ฅผ ๋ณด์—ฌ์ค„ ๊ฒƒ์ธ๊ฐ€(Context Engineering)'๋ฅผ ๊ฑฐ์ณ, '์–ด๋–ค ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•  ๊ฒƒ์ธ๊ฐ€(Harness Engineering)'๋กœ ์ง„ํ™”ํ–ˆ๋‹ค [1, 3, 7-10]. Context Engineering์€ ์—์ด์ „ํŠธ์˜ ์ž‘์—… ๊ธฐ๊ฐ„์ด ๊ธธ์–ด์ง€๋ฉด์„œ ๋ฐœ์ƒํ•˜๋Š” ์ง€์‹œ ์‚ฌํ•ญ์˜ ํ‘œ๋ฅ˜(instruction drift)์™€ ์ปจํ…์ŠคํŠธ ๋ถ€ํŒจ(context rot)๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ–ˆ๋‹ค [3, 9]. +* **๋Šฅ๋™์  ์ง€์‹ ํ•„ํ„ฐ๋กœ์„œ์˜ ์—ญํ• :** Context Engineering์€ ๋‹จ์ˆœํ•œ ์ •๋ณด์˜ ์ˆ˜๋™์  ์ „๋‹ฌ ๊ฒฝ๋กœ๊ฐ€ ์•„๋‹ˆ๋ผ, ๋ชจ๋ธ์ด ์„ฑ์ทจํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ”๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋Šฅ๋™์  ์ธ์‹ ํ•„ํ„ฐ(active epistemic filter)๋กœ ์ž‘๋™ํ•œ๋‹ค [11, 12]. ํ•˜๋„ค์Šค๋Š” ์ž˜๋ฆผ(Truncation), ์š”์•ฝ(Summarization), ๊ฒ€์ƒ‰ ์ฆ๊ฐ•(Retrieval-augmented), ์ง€์‹ ๊ทธ๋ž˜ํ”„(Knowledge graph), ํ–‰๋™์œผ๋กœ์„œ์˜ ๋ฉ”๋ชจ๋ฆฌ(Memory-as-action) ๋“ฑ์˜ ์ „๋žต์„ ํ†ตํ•ด ์ปจํ…์ŠคํŠธ๋ฅผ ์Šค์ผ€์ค„๋งํ•œ๋‹ค [13-17]. +* **์ดˆ์žฅ๋ฌธ ์ปจํ…์ŠคํŠธ ๋ชจ๋ธ(Ultra-long-context models) ๋Œ€์‘:** 100๋งŒ ํ† ํฐ ์ด์ƒ์˜ ์œˆ๋„์šฐ๋ฅผ ๊ฐ€์ง„ ๋ชจ๋ธ์ด ๋“ฑ์žฅํ–ˆ์Œ์—๋„, ์‹œํ€€์Šค ๊ธธ์ด๊ฐ€ ๊ธธ์–ด์ง€๋ฉด ์ดˆ๊ธฐ๋‚˜ ์ค‘๊ฐ„์— ์œ„์น˜ํ•œ ์ •๋ณด์— ๋Œ€ํ•œ ์ฃผ์˜๋ ฅ์ด ๋–จ์–ด์ง€๋Š” '์ฃผ์˜๋ ฅ ํฌ์„(attention dilution)' ํ˜„์ƒ์ด ๋ฐœ์ƒํ•œ๋‹ค [18, 19]. ๋”ฐ๋ผ์„œ Context Engineering์˜ ์ฃผ์š” ๊ณผ์ œ๋Š” ๋‹จ์ˆœํžˆ '๋ฌด์—‡์„ ๋‚จ๊ธธ ๊ฒƒ์ธ๊ฐ€(retention)'์—์„œ '๋ฌด์—‡์„ ๋‹๋ณด์ด๊ฒŒ ํ•  ๊ฒƒ์ธ๊ฐ€(salience)'๋กœ ์ด๋™ํ–ˆ์œผ๋ฉฐ, ๋ชจ๋ธ์˜ ์ฃผ์˜๋ ฅ์ด ๊ฐ€์žฅ ๊ฐ•ํ•œ ์œ„์น˜์— ์ค‘์š” ์ •๋ณด๋ฅผ ๋ฐฐ์น˜ํ•˜๋Š” ๊ตฌ์กฐ์  ๋‹ป(attention anchors)์ด๋‚˜ ๊ณ„์ธต์  ์ •๋ณด ๊ตฌ์„ฑ์ด ํ•„์š”ํ•˜๋‹ค [18, 19]. +* **์ ์‘ํ˜• ์ปจํ…์ŠคํŠธ ์••์ถ•(Adaptive Context Compaction):** ํ† ํฐ ์˜ˆ์‚ฐ์ด ๊ณ ๊ฐˆ๋  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์‹œ์Šคํ…œ ์ถฉ๋Œ์„ ๋ง‰๊ธฐ ์œ„ํ•ด, ์ปจํ…์ŠคํŠธ ์••๋ ฅ์— ๋”ฐ๋ผ 5๋‹จ๊ณ„(70% ๊ฒฝ๊ณ , 80% ๊ด€์ฐฐ ๋งˆ์Šคํ‚น, 85% ๋น ๋ฅธ ๊ฐ€์ง€์น˜๊ธฐ, 90% ๊ณต๊ฒฉ์  ๋งˆ์Šคํ‚น, 99% ์ „์ฒด ์š”์•ฝ)์˜ ์ ์ง„์ ์ธ ์••์ถ• ํŒŒ์ดํ”„๋ผ์ธ์„ ์šด์˜ํ•œ๋‹ค [20-22]. ๋Œ€๊ทœ๋ชจ ๋„๊ตฌ ์ถœ๋ ฅ(์˜ˆ: ์ˆ˜์ฒœ ์ค„์˜ ์ฝ”๋“œ๋‚˜ ๋กœ๊ทธ)์€ ์ปจํ…์ŠคํŠธ๋ฅผ ๊ณผ๋„ํ•˜๊ฒŒ ์ ์œ ํ•˜๋ฏ€๋กœ, ์ด๋ฅผ ํŒŒ์ผ ์‹œ์Šคํ…œ์ด๋‚˜ ์Šคํฌ๋ž˜์น˜ ํŒŒ์ผ๋กœ ์˜คํ”„๋กœ๋”ฉ(offloading)ํ•˜๊ณ  ๋ชจ๋ธ์—๋Š” ์งง์€ ์š”์•ฝ๊ณผ ํŒŒ์ผ ์ฐธ์กฐ(reference)๋งŒ ๋‚จ๊ธด๋‹ค [22-25]. +* **์ด์ค‘ ๋ฉ”๋ชจ๋ฆฌ ์•„ํ‚คํ…์ฒ˜(Dual-Memory Architecture):** ์ „๋žต์  ์‚ฌ๊ณ ๋ฅผ ์œ„ํ•œ ์ปจํ…์ŠคํŠธ์™€ ๋‹จ๊ธฐ ์‹คํ–‰์„ ์œ„ํ•œ ์ปจํ…์ŠคํŠธ์˜ ์ถฉ๋Œ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด, ์ „์ฒด ๋Œ€ํ™” ์ด๋ ฅ์„ ์š”์•ฝํ•œ ์ผํ™”์  ๋ฉ”๋ชจ๋ฆฌ(Episodic memory)์™€ ์ตœ๊ทผ ๋ช‡ ๋ฒˆ์˜ ์ƒ์„ธ ๊ตํ™˜ ๊ธฐ๋ก์„ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜๋Š” ์ž‘์—… ๋ฉ”๋ชจ๋ฆฌ(Working memory)๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ํ•จ๊ป˜ ์ฃผ์ž…(Combined injection)ํ•œ๋‹ค [26-28]. +* **๋Ÿฐํƒ€์ž„ ๋งฅ๋ฝ ์ฃผ์ž…(Context-Injected Recovery & Reminders):** ๊ธด ์„ธ์…˜์—์„œ ์—์ด์ „ํŠธ๊ฐ€ ์ดˆ๊ธฐ ์ง€์‹œ๋ฅผ ์žŠ๋Š” ๊ฒƒ์„ ๋ง‰๊ธฐ ์œ„ํ•ด, ๋„๊ตฌ ์‹คํ–‰์˜ ์‹คํŒจ๋‚˜ ํŠน์ • ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ ์ ์ ˆํ•œ ์‹œ์Šคํ…œ ์•Œ๋ฆผ(System Reminders) ๋ฐ ์˜ค๋ฅ˜ ๋ณต๊ตฌ ์ง€์นจ์„ ์ปจํ…์ŠคํŠธ์— ์ฆ‰์‹œ ์ฃผ์ž…ํ•˜์—ฌ ํ–‰๋™์„ ๊ต์ •ํ•œ๋‹ค [29-31]. + +## โš–๏ธ Trade-offs & Caveats + +* **์ •๋ณด ๋ณด์กด๊ณผ ๋ณด์•ˆ์˜ ์ƒ์ถฉ ๊ด€๊ณ„ (Retention-Security Coupling):** ์ปจํ…์ŠคํŠธ ์œˆ๋„์šฐ๋ฅผ ๊ธธ๊ฒŒ ์œ ์ง€ํ•˜๋ฉด ์—์ด์ „ํŠธ์˜ ์ž‘์—… ์—ฐ์†์„ฑ๊ณผ ์„ฑ๋Šฅ์€ ํ–ฅ์ƒ๋˜์ง€๋งŒ, ์™ธ๋ถ€์—์„œ ์ฃผ์ž…๋œ ์•…์˜์  ํŽ˜์ด๋กœ๋“œ(๊ฐ„์ ‘ ํ”„๋กฌํ”„ํŠธ ์ฃผ์ž…)๊ฐ€ ์‹œ์Šคํ…œ ๋‚ด์— ๋” ์˜ค๋ž˜ ์ฒด๋ฅ˜ํ•˜๊ฒŒ ๋˜์–ด ๋ณด์•ˆ ์œ„ํ—˜์ด ํฌ๊ฒŒ ์ฆ๊ฐ€ํ•œ๋‹ค. ๋ฐ˜๋ฉด ๋ณด์•ˆ์„ ์œ„ํ•ด ์งง๊ฒŒ ์œ ์ง€ํ•˜๋ฉด ์ž‘์—… ์„ฑ๋Šฅ์ด ์ €ํ•˜๋˜๋Š” ๋”œ๋ ˆ๋งˆ๊ฐ€ ์žˆ๋‹ค [32-34]. +* **์ปจํ…์ŠคํŠธ ๋ถ€ํŒจ (Context Rot) ๋ฐ ํ† ํฐ ๋น„์šฉ:** ๋ฌด๋ถ„๋ณ„ํ•˜๊ฒŒ ์ปจํ…์ŠคํŠธ๋ฅผ ๋ˆ„์ ํ•˜๋ฉด ๋ชจ๋ธ์˜ ์ •ํ™•๋„๊ฐ€ ๋–จ์–ด์งˆ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ† ํฐ ์†Œ๋น„๋Ÿ‰์ด ์ž‘์—… ๋ณต์žก๋„์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ ์ดˆ์„ ํ˜•์ (superlinear)์œผ๋กœ ์ฆ๊ฐ€ํ•˜์—ฌ ๊ฒฝ์ œ์  ๋น„์šฉ์ด ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ์ปค์ง„๋‹ค [35-37]. +* **๊ฒ€์ƒ‰ ์ง€์—ฐ (Retrieval Latency Injection):** ๋ชจ๋“  ๊ธฐ๋ก์„ ์ €์žฅํ•˜๊ณ  ํ•„์š”ํ•  ๋•Œ ๊ฒ€์ƒ‰ํ•˜๋Š” RAG ๋ฐฉ์‹์€ ์ •๋ณด ์†์‹ค์„ ํ”ผํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ธด ์ˆ˜ํ‰์„ ์˜ ์ž‘์—…์—์„œ๋Š” ๊ฐ ๋‹จ๊ณ„๋งˆ๋‹ค ๊ฒ€์ƒ‰ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์„ ํ˜•์ ์œผ๋กœ ๋ˆ„์ ๋˜๋Š” ์‹ฌ๊ฐํ•œ ์ง€์—ฐ ์‹œ๊ฐ„(Latency)์„ ์ดˆ๋ž˜ํ•œ๋‹ค [38, 39]. +* **์••์ถ• ์‹œ ๋ฐ์ดํ„ฐ ์ถœ์ฒ˜(Provenance) ์ƒ์‹ค:** ์ปจํ…์ŠคํŠธ์˜ ์š”์•ฝ ๋ฐ ์••์ถ•์€ ์ •๋ณด์˜ ๋ฐ€๋„๋ฅผ ๋†’์ด์ง€๋งŒ, ํ•ด๋‹น ์ •๋ณด๊ฐ€ ์–ด๋””์—์„œ ์™”๋Š”์ง€์— ๋Œ€ํ•œ ์ถœ์ฒ˜ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์šฉํžˆ ํ๊ธฐํ•  ์œ„ํ—˜์ด ์žˆ๋‹ค [40, 41]. ์ด๋ฅผ ๋ณด์™„ํ•˜์ง€ ์•Š์œผ๋ฉด ํ™˜๊ฐ์ด๋‚˜ ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ ๋””๋ฒ„๊น…์ด ๋ถˆ๊ฐ€๋Šฅํ•ด์ง„๋‹ค [42]. +* **์ ๋Œ€์  ์ฝ˜ํ…์ธ ์˜ ๊ฒ€์ƒ‰ ๊ฒŒ์ž„ํ™” (Retrieval gaming):** ์™ธ๋ถ€ ์ฝ˜ํ…์ธ ๋ฅผ ๊ฒ€์ƒ‰ํ•ด ์ปจํ…์ŠคํŠธ๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ, ๊ณต๊ฒฉ์ž๊ฐ€ ์˜ˆ์ƒ๋˜๋Š” ๋ฏธ๋ž˜ ์ฟผ๋ฆฌ์™€ ์˜๋ฏธ์  ์œ ์‚ฌ์„ฑ์ด ๋†’๋„๋ก ์•…์˜์  ์ง€์‹œ์‚ฌํ•ญ์„ ์กฐ์ž‘ํ•˜๋ฉด, ํ•˜๋„ค์Šค๊ฐ€ ์ด๋ฅผ ๊ฐ€์žฅ ๊ด€๋ จ์„ฑ ๋†’์€ ์ •๋ณด๋กœ ์ฐฉ๊ฐํ•˜์—ฌ ์šฐ์„ ์ ์œผ๋กœ ์ปจํ…์ŠคํŠธ์— ์ฃผ์ž…ํ•  ์œ„ํ—˜์ด ์žˆ๋‹ค [43, 44]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [๊ด€๊ณ„ ์œ ํ˜• A: ์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] +- [[Agent Harness (์—์ด์ „ํŠธ ํ•˜๋„ค์Šค)]] + - ์—ฐ๊ฒฐ ์ด์œ : Context Engineering์ด ์‹ค์ œ๋กœ ์ž‘๋™ํ•˜๊ณ  ๊ด€๋ฆฌ๋˜๋Š” ์ƒ์œ„ ์ธํ”„๋ผ ๊ตฌ์กฐ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค [8, 10, 45]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ปจํ…์ŠคํŠธ ๊ด€๋ฆฌ๊ฐ€ ๋‹จ์ˆœํžˆ ํ”„๋กฌํ”„ํŠธ๋ฅผ ๋‹ค๋“ฌ๋Š” ๊ฒƒ์„ ๋„˜์–ด, ์–ด๋–ป๊ฒŒ ์‹คํ–‰ ๋ฃจํ”„, ๋„๊ตฌ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ, ๋ฉ”๋ชจ๋ฆฌ ์Šคํ† ์–ด์™€ ๊ฒฐํ•ฉํ•˜์—ฌ ์•ˆ์ „ํ•˜๊ณ  ํ†ต์ œ๋œ ์ž์œจ ์—์ด์ „ํŠธ ํ™˜๊ฒฝ์„ ๊ตฌ์„ฑํ•˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค [4, 46]. + +- [[C-component (Context Manager)]] + - ์—ฐ๊ฒฐ ์ด์œ : ์—์ด์ „ํŠธ ํ•˜๋„ค์Šค ๊ตฌ์กฐ ๋‚ด์—์„œ Context Engineering ์ •์ฑ…(์••์ถ•, ๊ฒ€์ƒ‰, ์šฐ์„ ์ˆœ์œ„ ํ• ๋‹น ๋“ฑ)์„ ์ „๋‹ดํ•˜์—ฌ ์ง‘ํ–‰ํ•˜๋Š” ํ•ต์‹ฌ ๊ฑฐ๋ฒ„๋„Œ์Šค ๋ชจ๋“ˆ์ด๋‹ค [46, 47]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋งค ํ„ด๋งˆ๋‹ค ๋ชจ๋ธ์˜ ์ปจํ…์ŠคํŠธ ์œˆ๋„์šฐ์— ์–ด๋–ค ์ •๋ณด๊ฐ€ ์–ด๋–ป๊ฒŒ ํ•„ํ„ฐ๋ง๋˜์–ด ๋“ค์–ด๊ฐ€๋Š”์ง€ ๊ตฌ์ฒด์ ์ธ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค [4, 47]. + +- [[Adaptive Context Compaction (์ ์‘ํ˜• ์ปจํ…์ŠคํŠธ ์••์ถ•)]] + - ์—ฐ๊ฒฐ ์ด์œ : Context Engineering์ด ํ† ํฐ ์˜ˆ์‚ฐ ์ดˆ๊ณผ(OOM)๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ฑ„ํƒํ•˜๋Š” ํ•„์ˆ˜์ ์ธ ์„ธ๋ถ€ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์ด๋‹ค [21, 22]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: 70%๋ถ€ํ„ฐ 99%๊นŒ์ง€์˜ ์ ์ง„์  ์••๋ ฅ ํ•œ๊ณ„์น˜์— ๋”ฐ๋ผ ๊ด€์ฐฐ ๋‚ด์šฉ ๋งˆ์Šคํ‚น, ๋น ๋ฅธ ๊ฐ€์ง€์น˜๊ธฐ, ์ „์ฒด ์š”์•ฝ ๋“ฑ์ด ์–ด๋–ป๊ฒŒ ๋‹จ๊ณ„์ ์œผ๋กœ ์ ์šฉ๋˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค [22, 48]. + +#### [๊ด€๊ณ„ ์œ ํ˜• B: ์ตœ์ ํ™” ๋ฐ ๋ฌธ์ œ ํ˜„์ƒ] +- [[Context Rot (์ปจํ…์ŠคํŠธ ๋ถ€ํŒจ)]] + - ์—ฐ๊ฒฐ ์ด์œ : ํšจ์œจ์ ์ธ Context Engineering์ด ๋ถ€์žฌํ•  ๋•Œ ์žฅ๊ธฐ ์‹คํ–‰ ์—์ด์ „ํŠธ๊ฐ€ ๊ฒช๊ฒŒ ๋˜๋Š” ํ•ต์‹ฌ ์‹คํŒจ ๋ชจ๋“œ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค [35-37]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํ•˜๋„ค์Šค๊ฐ€ ์™œ ์ ๊ทน์ ์ธ ํ‡ด๊ฑฐ(eviction) ์ •์ฑ…๊ณผ ์ •๋ณด ์••์ถ•์„ ์Šค์ผ€์ค„๋งํ•ด์•ผ๋งŒ ์ดˆ์„ ํ˜•์ ์ธ ๋น„์šฉ ์ฆ๊ฐ€์™€ ๋ชจ๋ธ์˜ ์ง€์‹œ ๋ง๊ฐ์„ ๋ง‰์„ ์ˆ˜ ์žˆ๋Š”์ง€ ๊ทผ๋ณธ์ ์ธ ์ด์œ ๋ฅผ ๋ฐฐ์šธ ์ˆ˜ ์žˆ๋‹ค [36, 37, 49]. + +- [[Indirect Prompt Injection (๊ฐ„์ ‘ ํ”„๋กฌํ”„ํŠธ ์ฃผ์ž…)]] + - ์—ฐ๊ฒฐ ์ด์œ : ์—์ด์ „ํŠธ๊ฐ€ ์™ธ๋ถ€ ๋ฌธ์„œ๋ฅผ ๊ฒ€์ƒ‰ํ•ด ์ปจํ…์ŠคํŠธ์— ํฌํ•จ์‹œํ‚ค๋Š” ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์น˜๋ช…์ ์ธ ์‹œ์Šคํ…œ ๋ณด์•ˆ ์ทจ์•ฝ์ ์ด๋‹ค [50, 51]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Context Engineering ์„ค๊ณ„ ์‹œ ์ง€์‹œ(instruction) ๋ฐ์ดํ„ฐ์™€ ์ •๋ณด(data) ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ๋ถ„๋ฆฌํ•˜๊ณ  ์ถœ์ฒ˜(provenance)๋ฅผ ์ถ”์ ํ•ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๋ณด์•ˆ์  ํ•„์š”์„ฑ์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค [50, 51]. + +### Deeper Research Questions + +- 100๋งŒ ํ† ํฐ ์ด์ƒ์˜ ์ดˆ์žฅ๋ฌธ ์ปจํ…์ŠคํŠธ๋ฅผ ์ง€์›ํ•˜๋Š” ๋ชจ๋ธ์—์„œ '์ฃผ์˜๋ ฅ ํฌ์„(Attention Dilution)'์„ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•ด ํ•˜๋„ค์Šค ๋ ˆ๋ฒจ์—์„œ ๊ตฌ์กฐ์  ๋‹ป(Attention Anchors)์„ ์–ด๋–ป๊ฒŒ ํšจ์œจ์ ์œผ๋กœ ๋ฐฐ์น˜ํ•˜๊ณ  ์Šค์ผ€์ค„๋งํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- ์ปจํ…์ŠคํŠธ ๋ณด์กด ๊ธฐ๊ฐ„์ด ๊ธธ์–ด์งˆ์ˆ˜๋ก ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋˜์ง€๋งŒ ๋™์‹œ์— ์•…์˜์  ํ”„๋กฌํ”„ํŠธ์˜ ์ฒด๋ฅ˜ ์‹œ๊ฐ„์ด ์ฆ๊ฐ€ํ•˜๋Š” ์ƒ์ถฉ ๊ด€๊ณ„(Retention-Security Coupling)๋ฅผ ์ˆ˜ํ•™์ ์œผ๋กœ ๋ชจ๋ธ๋งํ•˜๊ณ  ๊ณต๋™ ์ตœ์ ํ™”(Joint Optimization)ํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ์–ด๋–ป๊ฒŒ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- ์—์ด์ „ํŠธ๊ฐ€ ์ž์ฒด์ ์œผ๋กœ ์ปจํ…์ŠคํŠธ๋ฅผ ํŽธ์ง‘ํ•˜๊ณ  ์••์ถ•ํ•˜๋Š” 'ํ–‰๋™์œผ๋กœ์„œ์˜ ๋ฉ”๋ชจ๋ฆฌ(Memory-as-action)' ๋ฐฉ์‹์€ ํ•˜๋„ค์Šค๊ฐ€ ์ค‘์•™์—์„œ ๊ฐ•์ œํ•˜๋Š” ๊ทœ์น™ ๊ธฐ๋ฐ˜ ์š”์•ฝ(Rule-based Summarization) ๋ฐฉ์‹๊ณผ ๋น„๊ตํ•˜์—ฌ ๊ฒฝ์ œ์„ฑ ๋ฐ ์ •ํ™•๋„ ๋ฉด์—์„œ ์–ด๋–ค ์ฐจ์ด๋ฅผ ๋ณด์ด๋Š”๊ฐ€? +- ๋Œ€๊ทœ๋ชจ ๋„๊ตฌ ์‹คํ–‰ ๊ฒฐ๊ณผ๋‚˜ ๋กœ๊ทธ๋ฅผ ํŒŒ์ผ ์‹œ์Šคํ…œ ๋“ฑ ์™ธ๋ถ€ ์•„ํ‹ฐํŒฉํŠธ ์ €์žฅ์†Œ๋กœ ์˜คํ”„๋กœ๋”ฉ(offloading)ํ•  ๋•Œ, ๋ชจ๋ธ์ด ํ•„์š”์‹œ ์ง€์—ฐ ์—†์ด ๋‹ค์‹œ ํ•ด๋‹น ์ •๋ณด๋ฅผ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ์˜๋ฏธ์  ํฌ์ธํ„ฐ(semantic pointer)๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑํ•ด์•ผ ํ•˜๋Š”๊ฐ€? +- ์ปจํ…์ŠคํŠธ ์••์ถ•(Compaction) ๊ณผ์ •์—์„œ ๋ถˆ๊ฐ€ํ”ผํ•˜๊ฒŒ ๋ฐœ์ƒํ•˜๋Š” ๋ฐ์ดํ„ฐ ์ถœ์ฒ˜(Provenance)์˜ ์†์‹ค์„ ๋ฐฉ์ง€ํ•˜๊ณ , ์—์ด์ „ํŠธ๊ฐ€ ์š”์•ฝ๋œ ์ปจํ…์ŠคํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ถ”๋ก ํ•  ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ํ™˜๊ฐ์„ ์–ด๋–ป๊ฒŒ ๊ต์ •ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? + +### Practical Application Contexts + +- **Implementation:** LangChain์˜ DeepAgents ํ”„๋ ˆ์ž„์›Œํฌ์ฒ˜๋Ÿผ ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ๋ฅผ ๋‹จ์ผ ๊ฑฐ๋Œ€ ํŒŒ์ผ๋กœ ์ œ๊ณตํ•˜์ง€ ์•Š๊ณ  ๋ฏธ๋“ค์›จ์–ด ์•„ํ‚คํ…์ฒ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์กฐ๊ฑด๋ณ„(์šฐ์„ ์ˆœ์œ„, ๋ชจ๋ธ ๋ฒค๋”๋ณ„)๋กœ ๋ชจ๋“ˆํ™”ํ•˜์—ฌ ๋™์  ์ฃผ์ž… ๋ฐ ๊ฒ€์ฆ ๋ฃจํ”„๋ฅผ ๊ตฌ์„ฑํ•œ๋‹ค [52-54]. +- **System Design:** ๋„๊ตฌ ์ถœ๋ ฅ ๊ฒฐ๊ณผ(์˜ˆ: ์ˆ˜์ฒœ ์ค„์˜ ์ฝ”๋“œ ๋ถ„์„ ๊ฒฐ๊ณผ)๋ฅผ ์ปจํ…์ŠคํŠธ์— ๊ทธ๋Œ€๋กœ ๋„ฃ์ง€ ์•Š๊ณ , 8,000์ž ์ด์ƒ์˜ ์ถœ๋ ฅ์€ ์Šคํฌ๋ž˜์น˜ ํŒŒ์ผ์— ์ €์žฅํ•œ ํ›„ ๋ชจ๋ธ์—๋Š” ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ(์˜ˆ: "ํŒŒ์ผ ์ฝ๊ธฐ ์™„๋ฃŒ, 142์ค„, 4,831์ž")์™€ ์ฐธ์กฐ ํ•ธ๋“ค๋งŒ ์ œ๊ณตํ•˜๋„๋ก ๋„๊ตฌ ๊ฒฐ๊ณผ ์ตœ์ ํ™”(Tool Result Optimization) ํŒŒ์ดํ”„๋ผ์ธ์„ ์„ค๊ณ„ํ•œ๋‹ค [23-25, 55]. +- **Operation / Maintenance:** ๋ชจ๋ธ API๊ฐ€ ๋ณด๊ณ ํ•˜๋Š” ์‹ค์ œ ํ”„๋กฌํ”„ํŠธ ํ† ํฐ ์‚ฌ์šฉ๋Ÿ‰(prompt_tokens)์„ ๊ธฐ์ค€์œผ๋กœ, ํ˜„์žฌ ์‚ฌ์šฉ๋Ÿ‰์ด 80%์— ๋„๋‹ฌํ•˜๋ฉด ๊ณผ๊ฑฐ ๋„๊ตฌ ์ถœ๋ ฅ๊ฒฐ๊ณผ๋ฅผ ์ฐธ์กฐ๋กœ ๋Œ€์ฒด(๋งˆ์Šคํ‚น)ํ•˜๊ณ  99% ๋„๋‹ฌ ์‹œ LLM์„ ์‚ฌ์šฉํ•ด ์ „์ฒด ๋Œ€ํ™” ์ด๋ ฅ์„ ์š”์•ฝํ•˜๋Š” ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ์„ ์šด์˜ํ•œ๋‹ค [20-22]. +- **Learning Path:** ์ฒ˜์Œ์—๋Š” ๋‹จ์ผ ํ”„๋กฌํ”„ํŠธ ์ตœ์ ํ™”(Prompt Engineering)๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ, ์—์ด์ „ํŠธ๊ฐ€ ์—ฌ๋Ÿฌ ์„ธ์…˜์„ ๋„˜๋‚˜๋“ค๋ฉฐ ์ž‘์—…ํ•  ๋•Œ ์–ด๋–ค ๊ธฐ์–ต์„ ๋‚จ๊ธฐ๊ณ  ๋ฒ„๋ฆด์ง€ ์„ค๊ณ„ํ•˜๋Š” Context Engineering์„ ์ตํžˆ๊ณ , ์ตœ์ข…์ ์œผ๋กœ ์ด๋ฅผ ์ธํ”„๋ผ ๋ ˆ๋ฒจ์˜ ๊ฐ•์ œ ๊ทœ์น™์œผ๋กœ ์Šน๊ฒฉ์‹œํ‚ค๋Š” Harness Engineering์œผ๋กœ ํ•™์Šต์„ ํ™•์žฅํ•œ๋‹ค [1, 3, 7, 8, 56]. +- **My Project Relevance:** ๋ณต์žกํ•œ ์†Œํ”„ํŠธ์›จ์–ด ์—”์ง€๋‹ˆ์–ด๋ง ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ์ฝ”๋”ฉ ์—์ด์ „ํŠธ๋ฅผ ๊ตฌ์ถ•ํ•  ๋•Œ, ํ† ํฐ ํ•œ๋„ ์ดˆ๊ณผ(OOM) ๋ฐฉ์ง€์™€ ์ง€์†์ ์ธ ๋ชฉํ‘œ ์ธ์ง€๋ฅผ ์œ„ํ•ด ์—ํ”ผ์†Œ๋“œ ๋ฉ”๋ชจ๋ฆฌ(Episodic Memory) ์š”์•ฝ๊ณผ ์ž‘์—… ๋ฉ”๋ชจ๋ฆฌ(Working Memory) ์œ ์ง€๋ฅผ ๋ถ„๋ฆฌ ์ ์šฉํ•˜๋Š” ๋ฐ ์ง์ ‘์ ์œผ๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค [26-28]. + +### Adjacent Topics + +- [[Prompt Engineering]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋‹จ์ผ ํ„ด ์ƒํ˜ธ์ž‘์šฉ์—์„œ ์–ด๋–ป๊ฒŒ ์ง€์‹œ๋ฅผ ์ „๋‹ฌํ•  ๊ฒƒ์ธ๊ฐ€์— ๋Œ€ํ•œ ๋ชจ๋ธ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์œผ๋กœ, ๋‹ค์ค‘ ํ„ด์—์„œ ๊ตฌ์กฐ์  ์ •๋ณด ๋ฐฐ์น˜๋ฅผ ๋‹ค๋ฃจ๋Š” Context Engineering ์ด์ „ ๋‹จ๊ณ„์˜ ๊ธฐ๋ฐ˜ ์ง€์‹์œผ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋‹ค [1, 6, 7]. +- [[Retrieval-Augmented Generation (RAG)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ์ œํ•œ๋œ ์ปจํ…์ŠคํŠธ ์˜ˆ์‚ฐ ๋‚ด์—์„œ ์™ธ๋ถ€ ์ง€์‹์„ ์–ธ์ œ, ์–ด๋–ป๊ฒŒ ์ฟผ๋ฆฌํ•˜๊ณ  ์ฃผ์ž…ํ•  ๊ฒƒ์ธ์ง€์— ๋Œ€ํ•œ ๊ตฌ์ฒด์ ์ธ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ํƒ๊ตฌํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์‹ฌํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค [57, 58]. + +--- +*Last updated: 2026-05-01* \ No newline at end of file diff --git a/00_Raw/DRY.md b/00_Raw/DRY.md new file mode 100644 index 00000000..c6381252 --- /dev/null +++ b/00_Raw/DRY.md @@ -0,0 +1,60 @@ +# [[DRY]] + +## ๐Ÿ“Œ Brief Summary +DRY(Don't Repeat Yourself)๋Š” ๋™์ผํ•œ ์ฝ”๋“œ๋ฅผ ๋‘ ๋ฒˆ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ  ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ์žฌ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋Š” ํ•ต์‹ฌ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ ์›์น™์ž…๋‹ˆ๋‹ค [1]. ์ฝ”๋“œ์˜ ์ค‘๋ณต์„ ํ”ผํ•˜๊ณ  ์ด๋ฅผ ๋ณ„๋„์˜ ์ปดํฌ๋„ŒํŠธ๋‚˜ ํ•จ์ˆ˜๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ํ–ฅํ›„ ์ฝ”๋“œ์˜ ์œ ์ง€๋ณด์ˆ˜์™€ ์ˆ˜์ •์„ ์šฉ์ดํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค [2]. React ํ™˜๊ฒฝ์—์„œ๋Š” ์ฃผ๋กœ ๊ณตํ†ต ๋กœ์ง์„ ์ปค์Šคํ…€ ํ›…(Custom Hooks)์ด๋‚˜ ๊ณ ์ฐจ ์ปดํฌ๋„ŒํŠธ(Higher-Order Components)๋กœ ์ถ”์ถœํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค [3, 4]. + +## ๐Ÿ“– Core Content +* **์ค‘๋ณต ์ œ๊ฑฐ์˜ ์ด์ **: ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์ค‘๋ณต์„ ํ”ผํ•˜๋ฉด ํ–ฅํ›„ ์š”๊ตฌ์‚ฌํ•ญ ๋ณ€๊ฒฝ ์‹œ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ํ›จ์”ฌ ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค [2]. ์ค‘๋ณต๋œ ์ฝ”๋“œ๊ฐ€ ๋งŽ์œผ๋ฉด ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ ์—ฌ๋Ÿฌ ๊ณณ์„ ์ฐพ์•„ ์ˆ˜์ •ํ•ด์•ผ ํ•˜์ง€๋งŒ, DRY ์›์น™์„ ์ง€ํ‚ค๋ฉด ๋‹จ์ผ ์œ„์น˜(one place)์—์„œ๋งŒ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ ์šฉํ•˜๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [2]. +* **React์—์„œ์˜ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•**: ๋ฐ˜๋ณต์ ์ธ ๋กœ์ง์ด ์กด์žฌํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋กœ์ง์„ ์ถ”์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [4]. React์—์„œ๋Š” ์ด๋ฅผ ์ฃผ๋กœ ์ปค์Šคํ…€ ํ›…(Custom Hooks)์ด๋‚˜ ๊ณ ์ฐจ ์ปดํฌ๋„ŒํŠธ(Higher-Order Components, HOC)๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค [3, 4]. +* **์ ์ ˆํ•œ ์ถ”์ƒํ™” ํƒ€์ด๋ฐ**: ์„ฑ๊ธ‰ํ•œ ์ตœ์ ํ™”๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ  ์ฝ”๋“œ๋ฅผ ๋‹จ์ˆœํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด, ํŠน์ • ์ฝ”๋“œ ํŒจํ„ด์ด ์ตœ์†Œ '3๋ฒˆ' ๋ฐ˜๋ณต๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ ์ถ”์ƒํ™”(abstraction)๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋˜๋Š” ๊ฐ€์ด๋“œ๋ผ์ธ์ž…๋‹ˆ๋‹ค [3]. + +## โš–๏ธ Trade-offs & Caveats +* **๊ณผ๋„ํ•œ ์ถ”์ƒํ™”์˜ ์œ„ํ—˜์„ฑ**: ์ค‘๋ณต์„ ์ค„์ด๋ ค๋Š” ๋…ธ๋ ฅ์œผ๋กœ ์ธํ•ด ์ถ”์ƒํ™”๊ฐ€ ์ง€๋‚˜์น˜๊ฒŒ ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ๋Š” ๋ถ€์ž‘์šฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค [5]. +* **KISS ์›์น™๊ณผ์˜ ์ถฉ๋Œ**: ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ถ”์ƒํ™”๋ฅผ ๋งŒ๋“ค์—ˆ์ง€๋งŒ, ๊ทธ ๊ฒฐ๊ณผ๋ฌผ์ด ์›๋ž˜์˜ ๋ฐ˜๋ณต๋œ ์ฝ”๋“œ๋ณด๋‹ค ์ดํ•ดํ•˜๊ธฐ ๋” ์–ด๋ ค์›Œ์ง„๋‹ค๋ฉด ์ด๋Š” ์ถ”์ƒํ™”์˜ ๋ชฉ์ ์„ ์ƒ์‹คํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค [3]. ์ด ๊ฒฝ์šฐ ์ฝ”๋“œ๋ฅผ ๋‹จ์ˆœํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋ผ๋Š” "KISS (Keep It Simple, Stupid)" ์›์น™์„ ์œ„๋ฐ˜ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค [3]. +* **์œ ์—ฐ์„ฑ ์ €ํ•˜ ์šฐ๋ ค**: Feature-Sliced Design๊ณผ ๊ฐ™์€ ์ตœ์‹  ํ”„๋ก ํŠธ์—”๋“œ ์•„ํ‚คํ…์ฒ˜์—์„œ๋Š” DRY ์›์น™์˜ ์ค€์ˆ˜์™€ ํŠน์ • ๊ธฐ๋Šฅ์— ๋งž์ถ˜ ๋กœ์ปฌ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•(local customization) ์‚ฌ์ด์—์„œ ์ ์ ˆํ•œ ๊ท ํ˜•์„ ์œ ์ง€ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๊ฐ•์กฐํ•ฉ๋‹ˆ๋‹ค [6]. ์ฆ‰ ๋ฌด์กฐ๊ฑด์ ์ธ ์ค‘๋ณต ์ œ๊ฑฐ๊ฐ€ ๋Šฅ์‚ฌ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [์†Œํ”„ํŠธ์›จ์–ด ์—”์ง€๋‹ˆ์–ด๋ง ์›์น™] +- [[KISS]] + - ์—ฐ๊ฒฐ ์ด์œ : DRY ์›์น™์„ ๊ฐ•๋ฐ•์ ์œผ๋กœ ์ ์šฉํ•˜์—ฌ ์ถ”์ƒํ™”๋ฅผ ์ง„ํ–‰ํ•˜๋‹ค ๋ณด๋ฉด ์ฝ”๋“œ๊ฐ€ ์ง€๋‚˜์น˜๊ฒŒ ๋ณต์žกํ•ด์ ธ ์ด KISS(Keep It Simple, Stupid) ์›์น™์— ์œ„๋ฐฐ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํšจ์œจ์ ์ธ ์ฝ”๋“œ ์ž‘์„ฑ์— ์žˆ์–ด ์ค‘๋ณต ์ œ๊ฑฐ(DRY)์™€ ์ฝ”๋“œ์˜ ๋‹จ์ˆœ์„ฑ(KISS) ์‚ฌ์ด์˜ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„์™€ ๊ท ํ˜•์ ์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[YAGNI]] + - ์—ฐ๊ฒฐ ์ด์œ : DRY ์›์น™๊ณผ ํ•จ๊ป˜ ์–ธ๊ธ‰๋˜๋ฉฐ(You Aren't Gonna Need It), ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง ์‹œ ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ๋ฅผ ์ค„์ด๋Š” ๊ธฐ์ค€์ด ๋ฉ๋‹ˆ๋‹ค [7, 8]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋‹น์žฅ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๋ฏธ๋ž˜๋ฅผ ๋Œ€๋น„ํ•ด ๋ฏธ๋ฆฌ ์ถ”์ƒํ™”ํ•˜์ง€ ๋ง๋ผ๋Š” ๊ฐœ๋…์„ ํ†ตํ•ด '3๋ฒˆ ๋ฐ˜๋ณต ์‹œ ์ถ”์ƒํ™”'๋ผ๋Š” DRY ์ ์šฉ ์‹œ์ ์„ ๋ช…ํ™•ํžˆ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3]. + +#### [React ๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ] +- [[Custom Hooks]] + - ์—ฐ๊ฒฐ ์ด์œ : React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ฝ”๋“œ ์ค‘๋ณต์„ ํ”ผํ•˜๊ณ  ๊ณตํ†ต ๋กœ์ง์„ ์ถ”์ถœํ•  ๋•Œ ๊ฐ€์žฅ ๋„๋ฆฌ ๊ถŒ์žฅ๋˜๋Š” ์ˆ˜๋‹จ์ž…๋‹ˆ๋‹ค [3, 4]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ƒํƒœ ๊ด€๋ฆฌ๋‚˜ ๋ผ์ดํ”„์‚ฌ์ดํด๊ณผ ๊ฐ™์€ React ๊ณ ์œ ์˜ ๋กœ์ง์„ ์–ด๋–ป๊ฒŒ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ˜•ํƒœ๋กœ ๋ถ„๋ฆฌ(DRY)ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[Higher-Order Components]] + - ์—ฐ๊ฒฐ ์ด์œ : ์ปค์Šคํ…€ ํ›…๊ณผ ํ•จ๊ป˜ React ๋‚ด์—์„œ ๋ฐ˜๋ณต๋˜๋Š” ์ปดํฌ๋„ŒํŠธ ๋กœ์ง์„ ์žฌ์‚ฌ์šฉํ•˜๊ณ  DRY ์›์น™์„ ์ค€์ˆ˜ํ•˜๊ธฐ ์œ„ํ•œ ๊ตฌํ˜„ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค [4]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: UI ๋ Œ๋”๋ง ์ธก๋ฉด์—์„œ ์ปดํฌ๋„ŒํŠธ์˜ ์ค‘๋ณต ์ฝ”๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ์ถ”์ƒํ™”ํ•˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### Deeper Research Questions + +- React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ DRY ์›์น™์„ ์ง€ํ‚ค๊ธฐ ์œ„ํ•ด ๋กœ์ง์„ ๋ฌด๋ถ„๋ณ„ํ•˜๊ฒŒ ์ปค์Šคํ…€ ํ›…์œผ๋กœ ๋ถ„๋ฆฌํ–ˆ์„ ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ Œ๋”๋ง ์„ฑ๋Šฅ ์ด์Šˆ๋Š” ๋ฌด์—‡์ธ๊ฐ€? +- '3๋ฒˆ ๋ฐ˜๋ณต๋˜๋ฉด ์ถ”์ƒํ™”ํ•˜๋ผ'๋Š” ๊ฐ€์ด๋“œ๋ผ์ธ ์™ธ์—, ๊ณผ๋„ํ•œ ์ถ”์ƒํ™”(Over-abstraction)๋ฅผ ์ง„๋‹จํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ ๋ฆฌ๋ทฐ ์ƒ์˜ ์ง€ํ‘œ๋Š” ๋ฌด์—‡์ด ์žˆ๋Š”๊ฐ€? +- Feature-Sliced Design๊ณผ ๊ฐ™์ด ๋„๋ฉ”์ธ ๋‹จ์œ„๋กœ ๊ธฐ๋Šฅ์„ ๊ฒฉ๋ฆฌํ•˜๋Š” ๊ตฌ์กฐ์—์„œ, ์ „์—ญ์ ์ธ DRY ์›์น™ ์ค€์ˆ˜์™€ ๋„๋ฉ”์ธ ๊ฐ„ ๊ฒฐํ•ฉ๋„(Coupling) ์ตœ์†Œํ™” ๋ชฉํ‘œ๋Š” ์–ด๋–ป๊ฒŒ ์ƒ์ถฉํ•˜๋ฉฐ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- ์ปดํฌ๋„ŒํŠธ์˜ UI ๊ตฌ์กฐ์  ์ค‘๋ณต๊ณผ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์  ์ค‘๋ณต์„ ํ•ด์†Œํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ React ํŒจํ„ด(Render Props, HOC, Custom Hooks)์€ ๊ฐ๊ฐ ์–ด๋А ์ƒํ™ฉ์— ์ตœ์ ํ™”๋˜์–ด ์žˆ๋Š”๊ฐ€? +- DRY ์›์น™์— ๋”ฐ๋ผ ํ•˜๋‚˜์˜ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜๋‚˜ ๊ณต์œ  ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ณ€๊ฒฝํ–ˆ์„ ๋•Œ, ์ด๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋‹ค๋ฅธ ๋ชจ๋“ˆ๋“ค(Blast Radius)์— ๋ฏธ์น˜๋Š” ๋ถ€์ž‘์šฉ์„ ์‚ฌ์ „์— ํ…Œ์ŠคํŠธํ•˜๊ณ  ์ œ์–ดํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก ์€ ๋ฌด์—‡์ธ๊ฐ€? + +### Practical Application Contexts + +- **Implementation:** React๋กœ ํ™”๋ฉด์„ ๊ตฌํ˜„ํ•  ๋•Œ, ์„œ๋กœ ๋‹ค๋ฅธ ํŽ˜์ด์ง€์—์„œ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ ํŽ˜์นญ ๋ฐฉ์‹์ด๋‚˜ ํผ ์ฒ˜๋ฆฌ ๋กœ์ง์„ ์‚ฌ์šฉ ์ค‘์ด๋ผ๋ฉด ์ด๋ฅผ `useFetch`๋‚˜ `useForm`๊ณผ ๊ฐ™์€ ์ปค์Šคํ…€ ํ›…์œผ๋กœ ๋นผ๋‚ด์–ด ์ฝ”๋“œ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค [3, 4]. +- **System Design:** ํ”„๋กœ์ ํŠธ์˜ ํด๋” ๊ตฌ์กฐ๋ฅผ ์žก์„ ๋•Œ ๊ณตํ†ต ๋กœ์ง์„ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก `shared` ๋˜๋Š” `utils` ๊ฐ™์€ ์ „์—ญ์ ์ธ ๋ ˆ์ด์–ด๋ฅผ ๋‘์–ด ์ค‘๋ณต ์ฝ”๋“œ๋ฅผ ์ตœ์†Œํ™”ํ•˜๊ณ  ์žฌ์‚ฌ์šฉ์„ฑ์„ ์ด‰์ง„ํ•ฉ๋‹ˆ๋‹ค [6, 9]. +- **Operation / Maintenance:** ์ค‘๋ณต ๋กœ์ง์„ ๋ณ„๋„์˜ ํ•จ์ˆ˜๋‚˜ ์ปดํฌ๋„ŒํŠธ๋กœ ๊ด€๋ฆฌํ•˜๋ฉด ํŠน์ • API ์ŠคํŽ™์ด๋‚˜ UI ์ •์ฑ…์ด ๋ณ€๊ฒฝ๋  ๋•Œ ์ˆ˜์‹ญ ๊ฐœ์˜ ํŒŒ์ผ์„ ์ˆ˜์ •ํ•  ํ•„์š” ์—†์ด ๋‹จ ํ•œ ๊ณณ๋งŒ ์ˆ˜์ •ํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด์— ๋ฐ˜์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2]. +- **Learning Path:** ์ฒ˜์Œ๋ถ€ํ„ฐ ์™„๋ฒฝํ•˜๊ฒŒ ์ค‘๋ณต์ด ์—†๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ ค ํ•˜๊ธฐ๋ณด๋‹ค๋Š” ์ผ๋‹จ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ ๋’ค, ๊ฐ™์€ ํŒจํ„ด์ด 3๋ฒˆ ์ด์ƒ ๋ฐ˜๋ณต๋˜๋Š” ๊ฒƒ์„ ๋ชฉ๊ฒฉํ–ˆ์„ ๋•Œ ๋ฆฌํŒฉํ† ๋ง์„ ํ†ตํ•ด ์ถ”์ƒํ™”ํ•˜๋Š” ํ›ˆ๋ จ์„ ํ•ฉ๋‹ˆ๋‹ค [3]. +- **My Project Relevance:** React ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ๋ฆฌํŒฉํ† ๋ง(refactoring)ํ•˜๋Š” ๊ณผ์ œ ์ˆ˜ํ–‰ ์‹œ, DRY ๋ฐ YAGNI ์›์น™์„ ์ฒ™๋„๋กœ ์‚ผ์•„ Lint๋ฅผ ์„ค์ •ํ•˜๊ณ , ํฉ์–ด์ง„ ์œ ์‚ฌ ํ•จ์ˆ˜๋“ค์„ ์ž‘๊ณ  ๋ช…ํ™•ํ•œ ์žฌ์‚ฌ์šฉ ๋ชจ๋“ˆ๋กœ ํ†ตํ•ฉํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [7]. + +### Adjacent Topics + +- [[SOLID]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๊ฐ์ฒด ์ง€ํ–ฅ ๋ฐ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ์ฝ”๋“œ ํ’ˆ์งˆ์„ ๋†’์ด๋Š” 5๋Œ€ ์›์น™์œผ๋กœ, DRY์™€ ํ•จ๊ป˜ React ์ปดํฌ๋„ŒํŠธ ๊ตฌ์กฐํ™”(๋‹จ์ผ ์ฑ…์ž„ ์›์น™ ๋“ฑ)๋ฅผ ํ•™์Šตํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค [10, 11]. +- [[Clean Code]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ์ค‘๋ณต ์ œ๊ฑฐ(DRY)๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ช…ํ™•ํ•œ ๋„ค์ด๋ฐ, ํ•จ์ˆ˜ ํฌ๊ธฐ ์ถ•์†Œ ๋“ฑ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ์ด์ฒด์ ์œผ๋กœ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ์›์น™์„ ๋” ๋„“๊ฒŒ ํฌ๊ด„ํ•ฉ๋‹ˆ๋‹ค [1, 4]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Debugging.md b/00_Raw/Debugging.md new file mode 100644 index 00000000..b28d7147 --- /dev/null +++ b/00_Raw/Debugging.md @@ -0,0 +1,70 @@ +# [[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 new file mode 100644 index 00000000..72778d9f --- /dev/null +++ b/00_Raw/Detached DOM Nodes.md @@ -0,0 +1,63 @@ +# [[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/Error Handling.md b/00_Raw/Error Handling.md new file mode 100644 index 00000000..416792da --- /dev/null +++ b/00_Raw/Error Handling.md @@ -0,0 +1,64 @@ +# [[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/Feature Branch Workflow.md b/00_Raw/Feature Branch Workflow.md new file mode 100644 index 00000000..7d0a438a --- /dev/null +++ b/00_Raw/Feature Branch Workflow.md @@ -0,0 +1,73 @@ +# [[Feature Branch Workflow]] + +## ๐Ÿ“Œ Brief Summary +Feature Branch Workflow๋Š” ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ์ถ”๊ฐ€๋‚˜ ๋ฒ„๊ทธ ์ˆ˜์ •๊ณผ ๊ฐ™์€ ๋ชจ๋“  ๋‹จ์ผ ์ž‘์—…์„ ๋ฉ”์ธ(`main`) ๋ธŒ๋žœ์น˜์—์„œ ํŒŒ์ƒ๋œ ๋…๋ฆฝ์ ์ธ ๋‹จ๊ธฐ(short-lived) ๋ธŒ๋žœ์น˜์—์„œ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฒ„์ „ ๊ด€๋ฆฌ ์ „๋žต์ž…๋‹ˆ๋‹ค [1, 2]. ์ด ์ ‘๊ทผ ๋ฐฉ์‹์€ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์˜ ์ฝ”๋“œ๊ฐ€ ํ•ญ์ƒ ๋ฐฐํฌ ๊ฐ€๋Šฅํ•˜๊ณ  ์•ˆ์ •์ ์ธ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค [1-3]. ์ฝ”๋“œ๋ฅผ ๋ณ‘ํ•ฉํ•˜๊ธฐ ์ „์—๋Š” ๋ฐ˜๋“œ์‹œ Pull Request(PR)์™€ ๋™๋ฃŒ์˜ ์ฝ”๋“œ ๋ฆฌ๋ทฐ, ๊ทธ๋ฆฌ๊ณ  ์ž๋™ํ™”๋œ ํ…Œ์ŠคํŠธ๋ฅผ ๊ฑฐ์น˜๋„๋ก ์š”๊ตฌํ•˜์—ฌ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๊ณ  ์ฝ”๋“œ ํ’ˆ์งˆ์„ ์œ ์ง€ํ•˜๋Š” ๋ฐ ์ดˆ์ ์„ ๋งž์ถฅ๋‹ˆ๋‹ค [4, 5]. + +## ๐Ÿ“– Core Content +* **๋ธŒ๋žœ์น˜ ์šด์˜ ๋ฐ ์—ญํ• :** + * `main` ๋ธŒ๋žœ์น˜๋Š” ํ•ญ์ƒ ์•ˆ์ •์ ์ด๊ณ  ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•ด์•ผ ํ•˜๋ฉฐ, ๊ฐœ๋ฐœ์ž๊ฐ€ `main`์— ์ง์ ‘ ์ปค๋ฐ‹ํ•˜๋Š” ๊ฒƒ์€ ์—„๊ฒฉํžˆ ๊ธˆ์ง€๋ฉ๋‹ˆ๋‹ค [1-3, 6]. + * ์ƒˆ๋กœ์šด ์ž‘์—…(๊ธฐ๋Šฅ, ๋ฒ„๊ทธ ์ˆ˜์ • ๋“ฑ)์„ ์‹œ์ž‘ํ•  ๋•Œ๋งˆ๋‹ค `main`์—์„œ ํŒŒ์ƒ๋œ ์ „์šฉ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜(Feature Branch)๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ž‘์—…์„ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค [1, 2]. + * ๊ฐ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜๋Š” ์ˆ˜๋ช…์ด ์งง์•„์•ผ ํ•˜๋ฉฐ, ํ•˜๋‚˜์˜ ๋ธŒ๋žœ์น˜์—์„œ๋Š” ์˜ค์ง ํ•˜๋‚˜์˜ ๋…ผ๋ฆฌ์  ๋ณ€๊ฒฝ ์‚ฌํ•ญ(Atomic Commits)๋งŒ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [4, 5, 7]. + +* **๋ณ‘ํ•ฉ ํ”„๋กœ์„ธ์Šค์™€ ํ’ˆ์งˆ ๊ด€๋ฆฌ:** + * ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ์ด ์™„๋ฃŒ๋˜๋ฉด `main` ๋ธŒ๋žœ์น˜๋ฅผ ํ–ฅํ•ด Pull Request(PR)๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [4, 5]. + * ์ฝ”๋“œ๋ฅผ ๋ณ‘ํ•ฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ตœ์†Œ 1๋ช…์˜ ๋™๋ฃŒ ๋ฆฌ๋ทฐ(Peer Review) ์Šน์ธ๊ณผ CI(Continuous Integration) ํ…Œ์ŠคํŠธ ํ†ต๊ณผ๊ฐ€ ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค [4, 5, 8, 9]. + * ๋ณ‘ํ•ฉ ์‹œ์—๋Š” ์ „์ฒด ์ปค๋ฐ‹ ์ด๋ ฅ์„ ๊น”๋”ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด "์Šค์ฟผ์‹œ ๋จธ์ง€(Squash and merge)" ์ „๋žต์„ ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋ฉฐ, ๋ณ‘ํ•ฉ ํ›„์—๋Š” ํ•ด๋‹น ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜๋ฅผ ์ž๋™์œผ๋กœ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค [5, 6, 8, 9]. + +* **๋ช…๋ช… ๊ทœ์น™ ๋ฐ ์ถ”์ ์„ฑ(Traceability):** + * ๋ธŒ๋žœ์น˜ ์ด๋ฆ„์€ ์ˆ˜ํ–‰ํ•  ์ž‘์—…์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋„๋ก `feature/` ๋˜๋Š” `bugfix/`๊ณผ ๊ฐ™์ด ์งง๊ณ  ๋ชฉ์ ์ด ๋“œ๋Ÿฌ๋‚˜๋Š” ํ˜•์‹์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [2, 4, 7]. + * ์ด์Šˆ ํŠธ๋ž˜์ปค(JIRA, GitHub Issues ๋“ฑ)๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ, `feature/PROJ-123-user-auth`์ฒ˜๋Ÿผ ํ‹ฐ์ผ“ ID๋ฅผ ๋ธŒ๋žœ์น˜ ์ด๋ฆ„๊ณผ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€์— ํฌํ•จ์‹œ์ผœ ์ฝ”๋“œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ๊ณผ ๋น„์ฆˆ๋‹ˆ์Šค ์š”๊ตฌ์‚ฌํ•ญ ๊ฐ„์˜ ์–‘๋ฐฉํ–ฅ ์ถ”์ ์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [10-12]. + +## โš–๏ธ Trade-offs & Caveats +* **๋ถ€์ž‘์šฉ ๋ฐ ์ œ์•ฝ ์‚ฌํ•ญ (Trade-offs):** + * `main` ๋ธŒ๋žœ์น˜์— ์ง์ ‘ ์ปค๋ฐ‹ํ•˜๋Š” ๋ฐฉ์‹์— ๋น„ํ•ด์„œ๋Š” PR์„ ์ƒ์„ฑํ•˜๊ณ  ๋ฆฌ๋ทฐ๋ฅผ ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๋Š” ์ตœ์†Œํ•œ์˜ ํ”„๋กœ์„ธ์Šค ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [3, 13, 14]. +* **๋ฐ˜๋Œ€ ๊ธ‰๋ถ€ ๋ฐ ์•ˆํ‹ฐ ํŒจํ„ด (Caveats & Anti-patterns):** + * **์ˆ˜๋ช…์ด ๊ธด ๋ธŒ๋žœ์น˜(Long-lived branches):** ๋ธŒ๋žœ์น˜๋ฅผ ์ˆ˜ ์ฃผ ๋™์•ˆ ์—ด์–ด๋‘๋Š” ๊ฒƒ์€ ์ด ์›Œํฌํ”Œ๋กœ์šฐ์˜ ๊ฐ€์žฅ ํฐ ์•ˆํ‹ฐ ํŒจํ„ด์ด๋ฉฐ, ์‹ฌ๊ฐํ•œ ๋จธ์ง€ ์ถฉ๋Œ์„ ์œ ๋ฐœํ•ฉ๋‹ˆ๋‹ค [13, 15, 16]. + * **๋™๊ธฐํ™” ์‹คํŒจ:** ๋Œ€๊ทœ๋ชจ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐœ๋ฐœ์ž๋Š” ๋งค์ผ ์ž‘์—… ์‹œ์ž‘ ์ „๊ณผ ์ž‘์—… ๋„์ค‘์— ์ˆ˜์‹œ๋กœ `main` ๋ธŒ๋žœ์น˜์˜ ์ตœ์‹  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ž์‹ ์˜ ๋ธŒ๋žœ์น˜๋กœ ๊ฐ€์ ธ์™€(Pull/Rebase) ์ ์ง„์ ์œผ๋กœ ์ถฉ๋Œ์„ ํ•ด๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [5, 14, 15]. + * **๊ฑฐ๋Œ€ํ•œ PR:** ํ•œ ๋ฒˆ์— ๋„ˆ๋ฌด ๋งŽ์€ ๋ณ€๊ฒฝ์„ ํฌํ•จํ•˜๋Š” ๊ฑฐ๋Œ€ํ•œ ์ปค๋ฐ‹๊ณผ PR์€ ๋น ๋ฅธ ํ”ผ๋“œ๋ฐฑ์„ ๋ฐฉํ•ดํ•˜๋ฏ€๋กœ, PR ํฌ๊ธฐ๋ฅผ ๊ฐ€๊ธ‰์  ์ž‘๊ฒŒ(์˜ˆ: 200์ค„ ์ดํ•˜) ์œ ์ง€ํ•˜๋Š” ๊ทœ์œจ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค [8, 17]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] +- [[Trunk-Based Development]] + - ์—ฐ๊ฒฐ ์ด์œ : Feature Branch Workflow๋ณด๋‹ค ๋น ๋ฅธ ์ฝ”๋“œ ํ†ตํ•ฉ์„ ๋ชฉํ‘œ๋กœ ํ•  ๋•Œ ๋„์ž…ํ•  ์ˆ˜ ์žˆ๋Š” ๋Œ€์•ˆ์  ๋ธŒ๋žœ์นญ ์ „๋žต์ž…๋‹ˆ๋‹ค [18, 19]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ˆ™๋ จ๋œ ํŒ€์ด ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ(Feature Flags)๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์— ์ง์ ‘ ์ž‘์€ ๋ณ€๊ฒฝ์„ ์ง€์†์ ์œผ๋กœ ์ปค๋ฐ‹ํ•˜๋Š” ๋ฐฉ์‹๊ณผ Feature Branch Workflow์˜ ์†๋„ ๋ฐ ์•ˆ์ •์„ฑ ์ฐจ์ด๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [19]. + +- [[Git Flow]] + - ์—ฐ๊ฒฐ ์ด์œ : ์†Œ๊ทœ๋ชจ ํŒ€์— ์ ํ•ฉํ•œ Feature Branch Workflow์™€ ๋Œ€์กฐ๋˜๋Š”, ํ›จ์”ฌ ๋ฌด๊ฒ๊ณ  ๋ณต์žกํ•œ ๊ธฐ์กด์˜ ๋Œ€๊ทœ๋ชจ ๋ธŒ๋žœ์นญ ์ „๋žต์ž…๋‹ˆ๋‹ค [14, 18]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์˜ˆ์ •๋œ ๋ฆด๋ฆฌ์Šค ์ผ์ •์ด ์žˆ๊ฑฐ๋‚˜ ๊ทœ๋ชจ๊ฐ€ ํฐ ํ”„๋กœ์ ํŠธ์—์„œ ์™œ `develop` ๋ฐ `release` ๋ธŒ๋žœ์น˜๊ฐ€ ์ถ”๊ฐ€๋กœ ์š”๊ตฌ๋˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์ž‘์€ ํŒ€์—๊ฒŒ๋Š” ์™œ ์ด๊ฒƒ์ด ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [18, 20]. + +#### [๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ] +- [[Pull Request (PR)]] + - ์—ฐ๊ฒฐ ์ด์œ : Feature Branch Workflow์—์„œ ๊ฒฉ๋ฆฌ๋œ ์ฝ”๋“œ๋ฅผ `main`์œผ๋กœ ๋ณ‘ํ•ฉํ•˜๊ธฐ ์ „ ๋ฐ˜๋“œ์‹œ ๊ฑฐ์ณ์•ผ ํ•˜๋Š” ํ•ต์‹ฌ ๊ฒŒ์ดํŠธ์›จ์ด์ž…๋‹ˆ๋‹ค [4, 5, 7]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ์Šต๊ด€ํ™”ํ•˜๊ณ , ๋‹จ๋… ๋ณ‘ํ•ฉ์„ ๋ฐฉ์ง€ํ•˜๋ฉฐ, CI ๋„๊ตฌ์™€ ๊ฒฐํ•ฉํ•˜์—ฌ ์–ด๋–ป๊ฒŒ ์ฝ”๋“œ ํ’ˆ์งˆ์„ ๋ฐฉ์–ดํ•˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5, 7, 21]. + +- [[Conventional Commits]] + - ์—ฐ๊ฒฐ ์ด์œ : ํ”ผ์ฒ˜ ๋ธŒ๋žœ์น˜์—์„œ ์ˆ˜ํ–‰ํ•˜๋Š” ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€์˜ ๋ช…ํ™•์„ฑ๊ณผ ์ผ๊ด€์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•œ ์—…๊ณ„ ํ‘œ์ค€ ๊ทœ์น™์ž…๋‹ˆ๋‹ค [4, 21]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: `feat:`, `fix:`, `chore:` ๋“ฑ์˜ ์ ‘๋‘์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปค๋ฐ‹์˜ ์˜๋„๋ฅผ ๋ช…ํ™•ํžˆ ํ•˜๊ณ , ๋ธŒ๋žœ์น˜์˜ ์ž‘์—… ๋‚ด์—ญ์„ ๋น ๋ฅด๊ณ  ์‰ฝ๊ฒŒ ํŒŒ์•…ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [21, 22]. + +### Deeper Research Questions +- Feature Branch Workflow์—์„œ ๋ธŒ๋žœ์น˜ ์ˆ˜๋ช…์ด ๊ธธ์–ด์งˆ ๋•Œ ํ•„์—ฐ์ ์œผ๋กœ ๋ฐœ์ƒํ•˜๋Š” ๋จธ์ง€ ์ถฉ๋Œ์„ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•œ ๊ตฌ์ฒด์ ์ธ ๋ธŒ๋žœ์น˜ ๋™๊ธฐํ™”(Sync) ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? +- ํŒ€์˜ ๊ทœ๋ชจ๊ฐ€ 3-5๋ช…์—์„œ 10๋ช… ์ด์ƒ์˜ ๋‹ค์ˆ˜ ํŒ€์œผ๋กœ ์ปค์งˆ ๋•Œ, Feature Branch Workflow๋Š” ์–ด๋–ป๊ฒŒ ํ™•์žฅ๋˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์ „๋žต(์˜ˆ: Git Flow, GitLab Flow)์œผ๋กœ ์ „ํ™˜๋˜์–ด์•ผ ํ•˜๋Š”๊ฐ€? +- Pull Request์˜ ์ฝ”๋“œ ํฌ๊ธฐ๊ฐ€ ๊ณผ๋„ํ•˜๊ฒŒ ์ปค์ง€๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ณ , ์ด๋ฅผ "์›์ž์  ์ปค๋ฐ‹(Atomic Commits)" ๋‹จ์œ„๋กœ ์œ ์ง€ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ์‹ค๋ฌด์ ์ธ ๊ฐ€์ด๋“œ๋ผ์ธ์€ ๋ฌด์—‡์ธ๊ฐ€? +- CI/CD ํŒŒ์ดํ”„๋ผ์ธ์—์„œ Feature Branch Workflow๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด, PR ์ƒ์„ฑ ์‹œ ๋ณ‘๋ชฉ์„ ์ผ์œผํ‚ค์ง€ ์•Š์œผ๋ฉด์„œ ํ•„์ˆ˜์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ์ž๋™ํ™”๋œ ๊ฒ€์‚ฌ(lint, test ๋“ฑ)์˜ ์ ์ •์„ ์€ ์–ด๋””์ธ๊ฐ€? +- ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ธŒ๋žœ์น˜๋ช…๊ณผ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€์— ํ‹ฐ์ผ“ ID(JIRA ๋“ฑ)๋ฅผ ๋ˆ„๋ฝํ•˜์ง€ ์•Š๋„๋ก Git Hooks๋‚˜ ํ”Œ๋žซํผ(GitHub, GitLab) ์„ค์ •์„ ํ†ตํ•ด ์–ด๋–ป๊ฒŒ ๊ฐ•์ œํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? + +### Practical Application Contexts + +- **Implementation:** ์†Œ๊ทœ๋ชจ ํŒ€(2~5๋ช…) ํ”„๋กœ์ ํŠธ ์‹œ์ž‘ ์‹œ, ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ์„ค์ •์—์„œ `main` ๋ธŒ๋žœ์น˜์— ์ง์ ‘ ํ‘ธ์‹œํ•˜์ง€ ๋ชปํ•˜๋„๋ก ๋ณดํ˜ธ(Branch Protection)๋ฅผ ๊ฑธ๊ณ , ๋ชจ๋“  ์ž‘์—…์„ `feature/` ๋˜๋Š” `bugfix/`๋กœ ๋ช…๋ช…๋œ ๋ธŒ๋žœ์น˜์—์„œ ์‹œ์ž‘ํ•˜๋„๋ก ์„ธํŒ…ํ•ฉ๋‹ˆ๋‹ค [2]. +- **System Design:** ๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ(GitHub)๊ณผ ์ด์Šˆ ํŠธ๋ž˜์ปค(JIRA, Linear)๋ฅผ ์—ฐ๋™ํ•˜๋„๋ก ์„ค๊ณ„ํ•˜์—ฌ, ๊ฐœ๋ฐœ์ž๊ฐ€ `feature/PROJ-123` ํ˜•ํƒœ์˜ ๋ธŒ๋žœ์น˜๋ช…์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์˜ฌ๋ฆฌ๋ฉด ์ด์Šˆ ํŠธ๋ž˜์ปค์— PR ์ƒํƒœ์™€ ์ปค๋ฐ‹ ๋‚ด์—ญ์ด ์ž๋™์œผ๋กœ ์ถ”์ ๋˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค [11, 23, 24]. +- **Operation / Maintenance:** ๊ด€๋ฆฌ์˜ ํšจ์œจ์„ฑ์„ ์œ„ํ•ด, ๋ฉ”์ธ ๋ธŒ๋žœ์น˜๋กœ PR์ด ์„ฑ๊ณต์ ์œผ๋กœ ๋ณ‘ํ•ฉ๋œ ์ดํ›„์—๋Š” ํ•ด๋‹น ํ”ผ์ฒ˜ ๋ธŒ๋žœ์น˜๊ฐ€ ์ž๋™์œผ๋กœ ์‚ญ์ œ(Auto-delete merged branches)๋˜๋„๋ก ์ €์žฅ์†Œ ์„ค์ •์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค [6-8]. +- **Learning Path:** ์ฒ˜์Œ ํŒ€ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ฒฝํ—˜ํ•˜๋Š” ์ดˆ๋ณด ๊ฐœ๋ฐœ์ž๋“ค์€ ๋กœ์ปฌ ํ™˜๊ฒฝ์—์„œ์˜ ๋‹จ๋… ์ž‘์—…์„ ๋„˜์–ด, ๊ธฐ๋Šฅ๋ณ„๋กœ ๋ธŒ๋žœ์น˜๋ฅผ ๋ถ„๋ฆฌํ•˜๊ณ  PR์„ ํ†ตํ•ด ๋™๋ฃŒ์˜ ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ›๋Š” ๊ณผ์ •์„ ํ†ตํ•ด ์˜ฌ๋ฐ”๋ฅธ ํ˜‘์—…์˜ ๊ธฐ์ดˆ๋ฅผ ๋‹ค์ง‘๋‹ˆ๋‹ค [18, 25]. +- **My Project Relevance:** ํ˜„์žฌ ์ง„ํ–‰ ์ค‘์ธ ํ”„๋กœ์ ํŠธ์—์„œ ๊ธฐ๋Šฅ ๋ณ‘ํ•ฉ ์‹œ ์ฝ”๋“œ ์ถฉ๋Œ์ด ์žฆ๊ฑฐ๋‚˜ ๋ฐฐํฌ ๋ธŒ๋žœ์น˜๊ฐ€ ์ž์ฃผ ๊ณ ์žฅ๋‚œ๋‹ค๋ฉด, ์ด ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์ฑ„ํƒํ•˜์—ฌ ์ฝ”๋“œ๊ฐ€ ์•ˆ์ •์„ฑ์„ ํ™•๋ณดํ•œ ์ƒํƒœ์—์„œ๋งŒ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์— ํ•ฉ๋ฅ˜ํ•˜๋„๋ก ๊ทœ์น™์„ ์ •๋ฆฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1, 2, 14]. + +### Adjacent Topics +- [[Continuous Integration (CI)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ํ”ผ์ฒ˜ ๋ธŒ๋žœ์น˜์˜ PR์ด ์ƒ์„ฑ๋  ๋•Œ๋งˆ๋‹ค ํ•ด๋‹น ์ฝ”๋“œ๊ฐ€ ์•ˆ์ •์ ์ธ์ง€ ์ž๋™์œผ๋กœ ํ…Œ์ŠคํŠธํ•˜๊ณ  ๋นŒ๋“œํ•˜์—ฌ ๋ณ‘ํ•ฉ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋ฅผ ์‹œ์Šคํ…œ์ ์œผ๋กœ ๊ฒ€์ฆํ•˜๋Š” ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ• ๋ฐฉ๋ฒ•์œผ๋กœ ์ดํ•ด๋ฅผ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค. +- [[GitHub Flow]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: Feature Branch Workflow์™€ ๋งค์šฐ ์œ ์‚ฌํ•˜์ง€๋งŒ, GitHub ํ™˜๊ฒฝ๊ณผ ์ง€์†์  ๋ฐฐํฌ(Continuous Deployment)์— ๋” ์ตœ์ ํ™”๋œ ๋‹จ์ˆœํ•œ ํ˜•ํƒœ์˜ ์›Œํฌํ”Œ๋กœ์šฐ๋กœ ๊ฐœ๋…์„ ํ™•์žฅํ•˜์—ฌ ๋น„๊ตํ•ด ๋ด…๋‹ˆ๋‹ค. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Feature-Branch Workflow.md b/00_Raw/Feature-Branch Workflow.md new file mode 100644 index 00000000..5800692c --- /dev/null +++ b/00_Raw/Feature-Branch Workflow.md @@ -0,0 +1,70 @@ +# [[Feature-Branch Workflow]] + +## ๐Ÿ“Œ Brief Summary +`Feature-Branch Workflow`๋Š” ๋ฉ”์ธ ๋ธŒ๋žœ์น˜(main/master)๋ฅผ ํ•ญ์ƒ ์•ˆ์ •์ ์ด๊ณ  ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜๋ฉฐ, ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ ๋ฐ ๋ฒ„๊ทธ ์ˆ˜์ • ๋“ฑ์˜ ๋ชจ๋“  ์ž‘์—…์„ ์งง์€ ์ˆ˜๋ช…์„ ๊ฐ€์ง„ ๋…๋ฆฝ์ ์ธ ํ”ผ์ฒ˜ ๋ธŒ๋žœ์น˜(feature branch)์—์„œ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฒ„์ „ ๊ด€๋ฆฌ ํ˜‘์—… ๋ฐฉ์‹์ด๋‹ค [1-4]. ๊ฐœ๋ฐœ์ด ์™„๋ฃŒ๋œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ํ’€ ๋ฆฌํ€˜์ŠคํŠธ(Pull Request)๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ ๋ฆฌ๋ทฐ์™€ ํ…Œ์ŠคํŠธ๋ฅผ ๊ฑฐ์นœ ํ›„ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜๋กœ ๋ณ‘ํ•ฉ๋œ๋‹ค [5-7]. ์ด ์›Œํฌํ”Œ๋กœ์šฐ๋Š” ์†Œ๊ทœ๋ชจ ํŒ€์— ๋งค์šฐ ์ ํ•ฉํ•˜๋ฉฐ, ์ฝ”๋“œ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๊ณ  ํ’ˆ์งˆ์„ ์œ ์ง€ํ•˜๋ฉด์„œ๋„ Git-Flow์™€ ๊ฐ™์€ ๋ฌด๊ฑฐ์šด ํ”„๋กœ์„ธ์Šค์˜ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ํ”ผํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค [1, 8, 9]. + +## ๐Ÿ“– Core Content +- **๊ธฐ๋ณธ ๊ตฌ์กฐ ๋ฐ ์›์น™:** + ํ•ญ์ƒ ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ์ธ `main` ๋ธŒ๋žœ์น˜๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ์ž‘๋™ํ•œ๋‹ค [2-4]. ๊ฐœ๋ฐœ์ž๋Š” ์ƒˆ๋กœ์šด ์ž‘์—…(๊ธฐ๋Šฅ ์ถ”๊ฐ€, ๋ฒ„๊ทธ ์ˆ˜์ • ๋“ฑ)์„ ์‹œ์ž‘ํ•  ๋•Œ๋งˆ๋‹ค `main`์—์„œ ์ƒˆ๋กœ์šด ๋ธŒ๋žœ์น˜๋ฅผ ์ƒ์„ฑํ•˜๋ฉฐ, `main` ๋ธŒ๋žœ์น˜์— ์ง์ ‘ ์ปค๋ฐ‹(Direct push)ํ•˜๋Š” ๊ฒƒ์€ ์—„๊ฒฉํžˆ ๊ธˆ์ง€๋œ๋‹ค [4, 5, 10]. +- **๋ธŒ๋žœ์น˜ ๋ช…๋ช… ๊ทœ์น™ (Naming Conventions):** + ๋ธŒ๋žœ์น˜์˜ ๋ชฉ์ ์„ ๋ช…ํ™•ํžˆ ์•Œ ์ˆ˜ ์žˆ๋„๋ก ์งง๊ณ  ์„œ์ˆ ์ ์ธ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•œ๋‹ค. ๊ตฌ์กฐ์  ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ์ ‘๋‘์‚ฌ(`feature/`, `bugfix/`, `chore/` ๋“ฑ)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ [6, 11, 12], ์ถ”์ ์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด JIRA๋‚˜ GitHub์˜ ํ‹ฐ์ผ“ ID๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋œ๋‹ค (์˜ˆ: `feature/PROJ-123-user-auth`, `bugfix/GH-456-login-fix`) [13, 14]. +- **์ปค๋ฐ‹ ๋ฐ ํ†ตํ•ฉ (Commits & Merging):** + ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ๋…ผ๋ฆฌ์  ๋ณ€๊ฒฝ์‚ฌํ•ญ๋งŒ ์ปค๋ฐ‹ํ•˜๋Š” ์›์ž์  ์ปค๋ฐ‹(Atomic Commits)์„ ์ง€ํ–ฅํ•˜๋ฉฐ, ์ปค๋ฐ‹์„ ์ž‘๊ณ  ๋นˆ๋ฒˆํ•˜๊ฒŒ ์ˆ˜ํ–‰ํ•œ๋‹ค [6, 11, 15]. ๊ธฐ๋Šฅ ๊ตฌํ˜„์ด ์™„๋ฃŒ๋˜๋ฉด ํ’€ ๋ฆฌํ€˜์ŠคํŠธ(PR)๋ฅผ ์—ด์–ด ์ตœ์†Œ 1๋ช… ์ด์ƒ์˜ ํŒ€์›์—๊ฒŒ ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ›์•„์•ผ ํ•˜๋ฉฐ, CI ํ…Œ์ŠคํŠธ ํ†ต๊ณผ ํ›„ ๋ณ‘ํ•ฉํ•œ๋‹ค [4-7]. ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด '์Šค์ฟผ์‹œ ๋ณ‘ํ•ฉ(Squash Merge)' ๋ฐฉ์‹์„ ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋ฉฐ, ๋ณ‘ํ•ฉ ์™„๋ฃŒ ํ›„ ํ”ผ์ฒ˜ ๋ธŒ๋žœ์น˜๋Š” ์ฆ‰์‹œ ์‚ญ์ œํ•œ๋‹ค [5, 7, 16]. +- **์ถฉ๋Œ ๋ฐฉ์ง€ (Conflict Prevention):** + ๋Œ€๊ทœ๋ชจ ๋ณ‘ํ•ฉ ์ถฉ๋Œ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์ž‘์—… ์ค‘์ธ ํ”ผ์ฒ˜ ๋ธŒ๋žœ์น˜์— `main` ๋ธŒ๋žœ์น˜์˜ ์ตœ์‹  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ž์ฃผ ๊ฐ€์ ธ์™€(pull ๋˜๋Š” rebase) ๋™๊ธฐํ™”ํ•˜๋ฉฐ, ์ถฉ๋Œ์„ ์ ์ง„์ ์œผ๋กœ ํ•ด๊ฒฐํ•œ๋‹ค [7, 8]. +- **ํ’€ ๋ฆฌํ€˜์ŠคํŠธ(PR) ์—ํ‹ฐ์ผ“:** + PR์€ ๋ฆฌ๋ทฐ๊ฐ€ ์šฉ์ดํ•˜๋„๋ก ์ž‘๊ฒŒ ์œ ์ง€ํ•ด์•ผ ํ•œ๋‹ค (๊ฐ€๋Šฅํ•˜๋ฉด 200์ค„ ๋ฏธ๋งŒ). PR ๋‚ด์šฉ์—๋Š” ๋ฌด์—‡์ด ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€, ์™œ ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  UI ๋ณ€๊ฒฝ ์‹œ ์Šคํฌ๋ฆฐ์ƒท ๋“ฑ์„ ํฌํ•จํ•˜์—ฌ ๋ฆฌ๋ทฐ์–ด์—๊ฒŒ ์ถฉ๋ถ„ํ•œ ๋งฅ๋ฝ์„ ์ œ๊ณตํ•ด์•ผ ํ•œ๋‹ค [5, 17]. + +## โš–๏ธ Trade-offs & Caveats +- **๋ธŒ๋žœ์น˜ ์ˆ˜๋ช… ๊ด€๋ฆฌ์˜ ์ค‘์š”์„ฑ:** ํ”ผ์ฒ˜ ๋ธŒ๋žœ์น˜๊ฐ€ ์˜ค๋žซ๋™์•ˆ ๋ณ‘ํ•ฉ๋˜์ง€ ์•Š๊ณ  ์œ ์ง€๋  ๊ฒฝ์šฐ(Long-lived feature branches), ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์™€์˜ ์ฝ”๋“œ ์ฐจ์ด๊ฐ€ ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ์ปค์ ธ ์‹ฌ๊ฐํ•œ ๋Œ€๊ทœ๋ชจ ๋ณ‘ํ•ฉ ์ถฉ๋Œ(Merge conflicts)์ด ๋ฐœ์ƒํ•  ์œ„ํ—˜์ด ์žˆ๋‹ค [10, 18]. ๋”ฐ๋ผ์„œ ํ”ผ์ฒ˜ ๋ธŒ๋žœ์น˜๋Š” ๋‹จ์ผ ๋…ผ๋ฆฌ์  ๋ณ€๊ฒฝ์—๋งŒ ์ง‘์ค‘ํ•˜์—ฌ ๊ฐ€๊ธ‰์  ์งง์€ ์ˆ˜๋ช…(Short-lived)์„ ์œ ์ง€ํ•ด์•ผ ํ•œ๋‹ค [2, 19, 20]. +- **๋ณ‘ํ•ฉ ์ „ ์ ˆ์ฐจ๋กœ ์ธํ•œ ๋ณ‘๋ชฉ ํ˜„์ƒ:** ์•„๋ฌด๋ฆฌ ์ž‘๊ณ  ๊ฐ„๋‹จํ•œ ๋ณ€๊ฒฝ์ด๋ผ๋„ ํ’€ ๋ฆฌํ€˜์ŠคํŠธ ์ƒ์„ฑ, ๋™๋ฃŒ ๋ฆฌ๋ทฐ, CI/CD ์ฒดํฌ๋ฅผ ๊ฑฐ์ณ์•ผ ํ•œ๋‹ค [10, 11]. ์ด๋Š” ์ฝ”๋“œ ํ’ˆ์งˆ์„ ๋ณด์žฅํ•˜์ง€๋งŒ, ์•„์ฃผ ์‚ฌ์†Œํ•œ ์ˆ˜์ •์กฐ์ฐจ๋„ ์ฆ‰๊ฐ์ ์ธ ์ ์šฉ์ด ์ง€์—ฐ๋˜๋Š” ๋ณ‘๋ชฉ์ด ๋  ์ˆ˜ ์žˆ๋‹ค (ํŒ€์— ๋”ฐ๋ผ ์‚ฌ์†Œํ•œ ์ˆ˜์ •์€ `main`์— ์ง์ ‘ ์ปค๋ฐ‹ํ•˜๋Š” ์˜ˆ์™ธ๋ฅผ ๋‘๊ธฐ๋„ ํ•œ๋‹ค [8]). +- **๋ณต์žกํ•œ ๋ฆด๋ฆฌ์Šค ๊ด€๋ฆฌ์˜ ํ•œ๊ณ„:** ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ์ด ํ•˜๋‚˜๋กœ ๋ฌถ์—ฌ ํŠน์ • ์Šค์ผ€์ค„์— ๋”ฐ๋ผ ๋ฐฐํฌ๋˜์–ด์•ผ ํ•˜๋Š” ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ์šฐ, `main` ๋ธŒ๋žœ์น˜ ํ•˜๋‚˜๋งŒ ์šด์˜ํ•˜๋Š” ๋‹จ์ˆœ ํ”ผ์ฒ˜ ๋ธŒ๋žœ์น˜ ์›Œํฌํ”Œ๋กœ์šฐ๋Š” ๊ด€๋ฆฌ๊ฐ€ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ๋‹ค. ์ด ๊ฒฝ์šฐ Git-Flow ๊ฐ™์€ ๋” ๋ฌด๊ฑฐ์šด ๊ตฌ์กฐ๊ฐ€ ์š”๊ตฌ๋œ๋‹ค [9]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [๋ฒ„์ „ ๊ด€๋ฆฌ / ํ†ตํ•ฉ ์•„ํ‚คํ…์ฒ˜] +- [[Pull Request (PR)]] + - ์—ฐ๊ฒฐ ์ด์œ : ํ”ผ์ฒ˜ ๋ธŒ๋žœ์น˜์—์„œ์˜ ์ž‘์—…๋ฌผ์„ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜๋กœ ๋ณ‘ํ•ฉํ•˜๊ธฐ ์ „, ์ฝ”๋“œ ๋ฆฌ๋ทฐ์™€ ์ž๋™ํ™”๋œ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ํ•ต์‹ฌ ๊ด€๋ฌธ์ด๋‹ค [6, 11]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํŒ€ ๋‚ด ํ”ผ๋“œ๋ฐฑ ๋ฃจํ”„ ์ž‘๋™ ๋ฐฉ์‹, ์ฝ”๋“œ ํ’ˆ์งˆ ์œ ์ง€ ๋งค์ปค๋‹ˆ์ฆ˜, ๊ทธ๋ฆฌ๊ณ  ์•ˆ์ „ํ•œ ์ฝ”๋“œ ํ†ตํ•ฉ ์ ˆ์ฐจ. +- [[Squash Merge]] + - ์—ฐ๊ฒฐ ์ด์œ : ํ”ผ์ฒ˜ ๋ธŒ๋žœ์น˜์—์„œ ๋ฐœ์ƒํ•œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž์ž˜ํ•œ ์ปค๋ฐ‹์„ ํ•˜๋‚˜์˜ ์˜๋ฏธ ์žˆ๋Š” ์ปค๋ฐ‹์œผ๋กœ ์••์ถ•ํ•˜์—ฌ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์— ๋ณ‘ํ•ฉํ•˜๋Š” ์ „๋žต์ด๋‹ค [5, 7]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์˜ ๊นƒ ํžˆ์Šคํ† ๋ฆฌ(Git history)๋ฅผ ๊น”๋”ํ•˜๊ณ  ๊ฐ€๋…์„ฑ ๋†’๊ฒŒ ์œ ์ง€ํ•˜๋Š” ์›๋ฆฌ. +- [[Continuous Integration (CI)]] + - ์—ฐ๊ฒฐ ์ด์œ : PR์ด ์ƒ์„ฑ๋˜์—ˆ์„ ๋•Œ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์— ๋ณ‘ํ•ฉ๋˜๊ธฐ ์ „ ์ž๋™ํ™”๋œ ํ…Œ์ŠคํŠธ(์˜ˆ: ๋ฆฐํŒ…, ๋นŒ๋“œ ๊ฒ€์ฆ)๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ ์ฝ”๋“œ๊ฐ€ ์•ˆ์ „ํ•œ์ง€ ํ™•์ธํ•˜๋Š” ๋ฐฉ์–ด ์‹œ์Šคํ…œ์ด๋‹ค [4, 5]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: `main` ๋ธŒ๋žœ์น˜์˜ ์ƒํƒœ๋ฅผ 'ํ•ญ์ƒ ๋ฐฐํฌ ๊ฐ€๋Šฅ(Always stable)'ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋Š” ๊ธฐ์ˆ ์  ๋ณด์žฅ ๋ฐฉ๋ฒ•. + +#### [๊ฐœ๋ฐœ ๋ฐฉ๋ฒ•๋ก  / ๊ทœ์•ฝ] +- [[Ticket IDs Traceability]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋ธŒ๋žœ์น˜ ์ด๋ฆ„๊ณผ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€์— JIRA๋‚˜ GitHub Issues์™€ ๊ฐ™์€ ํ‹ฐ์ผ“ ID(์˜ˆ: PROJ-123)๋ฅผ ํฌํ•จ์‹œ์ผœ ์ฝ”๋“œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋น„์ฆˆ๋‹ˆ์Šค ์š”๊ตฌ์‚ฌํ•ญ๊ณผ ์ง์ ‘์ ์œผ๋กœ ์—ฐ๊ฒฐํ•œ๋‹ค [13, 16]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ฝ”๋“œ ๋ณ€๊ฒฝ์˜ ๋ฐฐ๊ฒฝ ํŒŒ์•…, ๋ฆฌ๋ทฐ์–ด์˜ ๋งฅ๋ฝ ์ดํ•ด ์ง€์›, ์š”๊ตฌ์‚ฌํ•ญ ๊ตฌํ˜„ ์ถ”์ ์„ฑ ํ™•๋ณด. +- [[Conventional Commits]] + - ์—ฐ๊ฒฐ ์ด์œ : `feat:`, `fix:`, `chore:` ๋“ฑ ํ‘œ์ค€ํ™”๋œ ํ˜•์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ทœ์น™์œผ๋กœ, ํ”ผ์ฒ˜ ๋ธŒ๋žœ์น˜์˜ ๋ณ€๊ฒฝ ๋‚ด์—ญ์„ ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ์†Œํ†ตํ•œ๋‹ค [6, 17, 21]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ์˜ ๊ฐ€๋…์„ฑ ํ–ฅ์ƒ ๋ฐ ์ž๋™ํ™”๋œ ๋ฆด๋ฆฌ์Šค ๋…ธํŠธ ์ƒ์„ฑ์˜ ๊ธฐ๋ฐ˜. + +### Deeper Research Questions + +- ๋Œ€๊ทœ๋ชจ ๋ณ‘ํ•ฉ ์ถฉ๋Œ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด, ํ”ผ์ฒ˜ ๋ธŒ๋žœ์น˜ ์›Œํฌํ”Œ๋กœ์šฐ ๋‚ด์—์„œ ๋ธŒ๋žœ์น˜์˜ ์ˆ˜๋ช…(Lifetime)์„ ๊ธฐ์ˆ ์ /์ ˆ์ฐจ์ ์œผ๋กœ ์งง๊ฒŒ ๊ฐ•์ œํ•˜๋ ค๋ฉด ์–ด๋–ค ๋ฐฉ๋ฒ•๋“ค์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- ๋‹จ์ˆœํ•œ ํ”ผ์ฒ˜ ๋ธŒ๋žœ์น˜ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์‚ฌ์šฉํ•˜๋‹ค๊ฐ€, ํŒ€ ๊ทœ๋ชจ๊ฐ€ ์ปค์ง€๊ณ  ์Šค์ผ€์ค„๋ง๋œ ์ •๊ธฐ ๋ฆด๋ฆฌ์Šค๊ฐ€ ํ•„์š”ํ•ด์งˆ ๋•Œ Git-Flow ๋“ฑ์œผ๋กœ์˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์–ด๋–ป๊ฒŒ ์ ์ง„์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- ๋กœ์ปฌ ํ”ผ์ฒ˜ ๋ธŒ๋žœ์น˜์—์„œ `main` ๋ธŒ๋žœ์น˜์˜ ์ตœ์‹  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋™๊ธฐํ™”ํ•  ๋•Œ, `git merge main`๊ณผ `git rebase main`์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์˜ ์‹ค์งˆ์ ์ธ ์žฅ๋‹จ์  ๋ฐ ๊ถŒ์žฅ ์‚ฌ๋ก€๋Š” ๋ฌด์—‡์ธ๊ฐ€? +- ์›์ž์  ์ปค๋ฐ‹(Atomic Commits) ๊ทœ์น™์„ ๊ฐœ๋ฐœ ํŒ€ ๋‚ด์—์„œ ํšจ๊ณผ์ ์œผ๋กœ ์ •์ฐฉ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๊ณผ์ •์ด๋‚˜ CI ๋„๊ตฌ์—์„œ ์–ด๋–ค ๊ฒ€์ฆ ๊ธฐ์ค€์„ ์„ธ์šธ ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- ๊ธด๊ธ‰ํ•˜๊ฒŒ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์˜ ๋ฒ„๊ทธ(Hotfix)๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•  ๊ฒฝ์šฐ, ํ”ผ์ฒ˜ ๋ธŒ๋žœ์น˜ ์›Œํฌํ”Œ๋กœ์šฐ ๋‚ด์—์„œ `main`์˜ ์•ˆ์ •์„ฑ์„ ํ•ด์น˜์ง€ ์•Š์œผ๋ฉด์„œ ๊ฐ€์žฅ ๋น ๋ฅด๊ณ  ์•ˆ์ „ํ•˜๊ฒŒ ๋ฐฐํฌํ•˜๋Š” ํ๋ฆ„์€ ๋ฌด์—‡์ธ๊ฐ€? + +### Practical Application Contexts + +- **Implementation:** GitHub ๋ ˆํฌ์ง€ํ† ๋ฆฌ ์„ค์ •์—์„œ `main` ๋ธŒ๋žœ์น˜์— ์ง์ ‘ ์ปค๋ฐ‹์„ ๋ง‰๋Š” ๋ณดํ˜ธ ๊ธฐ๋Šฅ(Branch protection)์„ ํ™œ์„ฑํ™”ํ•˜๊ณ , ์ตœ์†Œ 1๋ช…์˜ ๋ฆฌ๋ทฐ์™€ CI ํ†ต๊ณผ๋ฅผ ํ•„์ˆ˜๋กœ ์„ค์ •ํ•˜์—ฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ฐ•์ œํ•œ๋‹ค [5]. ๋ธŒ๋žœ์น˜ ์ด๋ฆ„์€ `{type}/{ticket-id}-{description}` ํ˜•์‹์„ ์‚ฌ์šฉํ•œ๋‹ค [14]. +- **System Design:** ๋ณ€๊ฒฝ๋œ UI ์ฝ”๋“œ๊ฐ€ ์‹œ์Šคํ…œ ๋””์ž์ธ์— ์•…์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋„๋ก, PR ๋ฆฌ๋ทฐ ๋‹จ๊ณ„์—์„œ Storybook ๋ฐ Chromatic๊ณผ ๊ฐ™์€ ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ(Visual regression testing) ๋„๊ตฌ๋ฅผ ์—ฐ๋™ํ•˜์—ฌ ๊ฒ€์ฆ์„ ์ž๋™ํ™”ํ•œ๋‹ค [22]. +- **Operation / Maintenance:** ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ๋ฌธ์ œ์˜ ์›์ธ์ด ๋˜๋Š” ์ปค๋ฐ‹์„ ๋กค๋ฐฑ(Revert)ํ•˜๊ฑฐ๋‚˜ ์ถ”์ ํ•˜๊ธฐ ์‰ฝ๋„๋ก, Squash Merge ์˜ต์…˜๋งŒ์„ ํ—ˆ์šฉํ•˜์—ฌ ์ปค๋ฐ‹ ๋‹จ์œ„๋ฅผ ๊ธฐ๋Šฅ๋ณ„๋กœ ์ •๋ฆฌํ•˜๊ณ  ๋ณ‘ํ•ฉ๋œ ๋ธŒ๋žœ์น˜๋Š” ์ž๋™ ์‚ญ์ œ(Auto-delete) ์˜ต์…˜์„ ์ผœ๋‘”๋‹ค [5, 7, 11]. +- **Learning Path:** 2~5์ธ ๊ทœ๋ชจ์˜ ์†Œ๊ทœ๋ชจ ํ•™์ƒ ํŒ€์ด๋‚˜ ์Šคํƒ€ํŠธ์—… ํ”„๋กœ์ ํŠธ์—์„œ ๋ฒ„์ „ ๊ด€๋ฆฌ๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ ๊ฐ€์žฅ ๋จผ์ € ๋„์ž…ํ•˜์—ฌ Git ํ˜‘์—…์˜ ๊ธฐ์ดˆ(๋ธŒ๋žœ์น˜ ์ƒ์„ฑ, ์ปค๋ฐ‹, PR, ๋ฆฌ๋ทฐ, ๋จธ์ง€)๋ฅผ ํ•™์Šตํ•˜๋Š” ์šฉ๋„๋กœ ์ ํ•ฉํ•˜๋‹ค [3, 9]. +- **My Project Relevance:** ํŒ€์›๋“ค์ด ๊ฒน์น˜๋Š” ํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜๋‹ค ์ฝ”๋“œ๊ฐ€ ์œ ์‹ค๋˜๋Š” ๊ฒƒ์„ ๋ง‰๊ณ , PR์„ ํ†ตํ•œ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๋ฌธํ™” ์ •์ฐฉ์œผ๋กœ ์ „์ฒด์ ์ธ ์ฝ”๋“œ ํ’ˆ์งˆ๊ณผ ํŒ€์›์˜ ์ดํ•ด๋„๋ฅผ ์ƒํ–ฅ ํ‰์ค€ํ™”ํ•˜๋Š” ๊ธฐ๋ณธ ํ˜‘์—… ๋ชจ๋ธ๋กœ ๋„์ž…ํ•  ์ˆ˜ ์žˆ๋‹ค. + +### Adjacent Topics + +- [[Trunk-Based Development]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ํ”ผ์ฒ˜ ๋ธŒ๋žœ์น˜์˜ ์ˆ˜๋ช…์„ ์ˆ˜ ์‹œ๊ฐ„ ์ด๋‚ด๋กœ ๊ทน๋‹จ์ ์œผ๋กœ ์ค„์ด๊ณ , ๋ฉ”์ธ ๋ธŒ๋žœ์น˜(Trunk)๋กœ ์•„์ฃผ ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ณ‘ํ•ฉํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค [9]. ๊ฐ•๋ ฅํ•œ CI์™€ ๊ธฐ๋Šฅ ํ† ๊ธ€(Feature flags)์ด ๋’ท๋ฐ›์นจ๋˜๋Š” ์‹œ๋‹ˆ์–ด ํŒ€์„ ์œ„ํ•œ ์‹ฌํ™” ํ˜‘์—… ์›Œํฌํ”Œ๋กœ์šฐ๋กœ ๋น„๊ต ํ•™์Šตํ•  ์ˆ˜ ์žˆ๋‹ค [9, 20]. +- [[Git-Flow]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: `develop`, `release`, `hotfix` ๋“ฑ ๋” ๋ณต์žกํ•˜๊ณ  ๋ถ„๋ฆฌ๋œ ๋ธŒ๋žœ์น˜ ๊ณ„์ธต์„ ๊ฐ€์ง€๋Š” ์ „๋žต์ด๋‹ค [9]. ์†Œ๊ทœ๋ชจ ํŒ€์˜ ๋‹จ์ˆœํ•œ ํ”ผ์ฒ˜ ๋ธŒ๋žœ์น˜ ์›Œํฌํ”Œ๋กœ์šฐ๊ฐ€ ๋Œ€๊ทœ๋ชจ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ํ™˜๊ฒฝ ๋ฐ ์ •๊ธฐ ๋ฐฐํฌ ํ™˜๊ฒฝ์œผ๋กœ ํ™•์žฅ๋  ๋•Œ ์–ด๋–ป๊ฒŒ ๋ณ€๋ชจํ•˜๋Š”์ง€ ํ•™์Šตํ•  ์ˆ˜ ์žˆ๋‹ค [9, 23]. + +--- +*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 new file mode 100644 index 00000000..2d165975 --- /dev/null +++ b/00_Raw/Folder Structure.md @@ -0,0 +1,74 @@ +# [[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 new file mode 100644 index 00000000..038d3a71 --- /dev/null +++ b/00_Raw/Frontend Application Stability.md @@ -0,0 +1,68 @@ +# [[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 new file mode 100644 index 00000000..713f17b3 --- /dev/null +++ b/00_Raw/Frontend Engineering Governance.md @@ -0,0 +1,60 @@ +# [[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 Scalable Architecture.md b/00_Raw/Frontend Scalable Architecture.md new file mode 100644 index 00000000..561d0034 --- /dev/null +++ b/00_Raw/Frontend Scalable Architecture.md @@ -0,0 +1,75 @@ +# [[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 new file mode 100644 index 00000000..d4cdfc2e --- /dev/null +++ b/00_Raw/Functional Components.md @@ -0,0 +1,72 @@ +# [[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 new file mode 100644 index 00000000..14f6dac9 --- /dev/null +++ b/00_Raw/Functional Programming in React.md @@ -0,0 +1,65 @@ +# [[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/Git Flow.md b/00_Raw/Git Flow.md new file mode 100644 index 00000000..e2fb0b11 --- /dev/null +++ b/00_Raw/Git Flow.md @@ -0,0 +1,63 @@ +# [[Git Flow]] + +## ๐Ÿ“Œ Brief Summary +Git Flow๋Š” ์ฃผ๋กœ ์ •๊ธฐ์ ์ธ ๋ฆด๋ฆฌ์Šค(scheduled releases) ์ผ์ •์ด ์žˆ๋Š” ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์— ์œ ์šฉํ•œ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ ๋ธŒ๋žœ์นญ ์ „๋žต์ž…๋‹ˆ๋‹ค. ์ด ์›Œํฌํ”Œ๋กœ์šฐ๋Š” ์ฝ”๋“œ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ํ†ตํ•ฉํ•˜๊ณ  ๋ฐฐํฌํ•˜๊ธฐ ์œ„ํ•ด `main` ๋ธŒ๋žœ์น˜ ์™ธ์— `develop`, `release` ๋“ฑ ๋ช…ํ™•ํ•œ ๋ชฉ์ ์„ ๊ฐ€์ง„ ์—ฌ๋Ÿฌ ๋ธŒ๋žœ์น˜๋ฅผ ๊ตฌ์กฐ์ ์œผ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ณต์žก๋„๊ฐ€ ๋†’๊ธฐ ๋•Œ๋ฌธ์— ์†Œ๊ทœ๋ชจ ํŒ€์ด๋‚˜ ๋น ๋ฅธ ํ†ตํ•ฉ์ด ํ•„์š”ํ•œ ํ™˜๊ฒฝ์—์„œ๋Š” ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +## ๐Ÿ“– Core Content +* **Git Flow์˜ ํ•ต์‹ฌ ๊ตฌ์กฐ:** Git Flow๋Š” `main` ๋ธŒ๋žœ์น˜ ์™ธ์— ์ƒˆ๋กœ์šด ํ†ตํ•ฉ(integration) ๋ธŒ๋žœ์น˜์ธ `develop` ๋ธŒ๋žœ์น˜๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ(Feature)์„ ๊ฐœ๋ฐœํ•  ๋•Œ๋Š” ์ด `develop` ๋ธŒ๋žœ์น˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘์—…ํ•˜๋ฉฐ, ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ์ด ์™„๋ฃŒ๋˜๋ฉด ๋‹ค์‹œ `develop` ๋ธŒ๋žœ์น˜์— ๋ณ‘ํ•ฉ(Merge)ํ•ฉ๋‹ˆ๋‹ค [1]. +* **๋ฆด๋ฆฌ์Šค ๊ด€๋ฆฌ:** ๋ฐฐํฌ ์ค€๋น„๋ฅผ ์œ„ํ•ด ๋ณ„๋„์˜ `release` ๋ธŒ๋žœ์น˜๋ฅผ ์ถ”๊ฐ€๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค [1, 2]. ์ด๋ฅผ ํ†ตํ•ด ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ ์ •ํ•ด์ง„ ์ผ์ •์— ๋”ฐ๋ฅธ ๋ฆด๋ฆฌ์Šค๋ฅผ ์ฒด๊ณ„์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ณ , ์ตœ์ข… ํ…Œ์ŠคํŠธ ๋ฐ ๋ฐฐํฌ ์ค€๋น„ ๊ณผ์ •์„ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ๊ณผ ๊ฒฉ๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1, 3]. +* **๋‹ค๋ฅธ ๋ธŒ๋žœ์นญ ์ „๋žต๊ณผ์˜ ๋น„๊ต ๋ฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜:** Git Flow๋Š” GitHub Flow, GitLab Flow, Trunk-Based Development, Feature Branch Workflow ๋“ฑ๊ณผ ํ•จ๊ป˜ ๋„๋ฆฌ ์“ฐ์ด๋Š” ์ฃผ์š” ๋ธŒ๋žœ์นญ ์ „๋žต ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค [4]. ํŒ€์˜ ์š”๊ตฌ์‚ฌํ•ญ์ด ๋ณ€ํ•จ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์ „๋žต์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋” ๋‹จ์ˆœํ•œ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋ฉด ๋ฆด๋ฆฌ์Šค ๋ธŒ๋žœ์น˜๋ฅผ ์—†์• ๊ณ  `develop`์„ `main`์— ํ†ตํ•ฉํ•˜์—ฌ GitHub Flow๋กœ ๋„˜์–ด๊ฐ€๊ฑฐ๋‚˜, ๋ฐ˜๋Œ€๋กœ ์ฒด๊ณ„์ ์ธ ๊ตฌ์กฐ๊ฐ€ ํ•„์š”ํ•  ๊ฒฝ์šฐ `develop`๊ณผ `release` ๋ธŒ๋žœ์น˜๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ Git Flow๋กœ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1, 2]. +* **๋ชจ๋ฒ” ์‚ฌ๋ก€์˜ ์ ์šฉ:** Git Flow๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋„ ๋ณดํŽธ์ ์ธ Git ์›Œํฌํ”Œ๋กœ์šฐ ๋ชจ๋ฒ” ์‚ฌ๋ก€(Best Practices)๋ฅผ ๋”ฐ๋ผ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜๋ฏธ ์žˆ๋Š” ์งง์€ ๋ธŒ๋žœ์น˜๋ช… ์‚ฌ์šฉ, ํ‹ฐ์ผ“ ID(์˜ˆ: PROJ-123) ํฌํ•จ, Pull Request(PR)๋ฅผ ํ†ตํ•œ ์ฝ”๋“œ ๋ฆฌ๋ทฐ, ๊ทธ๋ฆฌ๊ณ  ๋ธŒ๋žœ์น˜ ๋ณ‘ํ•ฉ ํ›„ ์‚ญ์ œ ๋“ฑ์„ ์ฒ ์ €ํžˆ ์ง€์ผœ์•ผ ํ•ฉ๋‹ˆ๋‹ค [5-8]. + +## โš–๏ธ Trade-offs & Caveats +* **์˜ค๋ฒ„ํ—ค๋“œ์™€ ๋ณต์žก์„ฑ:** Git Flow๋Š” ๊ด€๋ฆฌํ•ด์•ผ ํ•  ๋ธŒ๋žœ์น˜์˜ ์ข…๋ฅ˜๊ฐ€ ๋งŽ๊ณ  ๊ทœ์น™์ด ์—„๊ฒฉํ•˜์—ฌ ํ”„๋กœ์„ธ์Šค ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค [9, 10]. 2~5๋ช… ๊ทœ๋ชจ์˜ ์†Œ๊ทœ๋ชจ ํŒ€์ด๋‚˜ ์ดˆ๋ณด์ž์—๊ฒŒ๋Š” ๋„ˆ๋ฌด ๋ฌด๊ฑฐ์šด(heavy) ์ „๋žต์ด๋ฉฐ, ์˜คํžˆ๋ ค ๊ฐœ๋ฐœ ์†๋„๋ฅผ ๋Šฆ์ถœ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3, 11, 12]. +* **ํ†ตํ•ฉ ์†๋„ ๋ฐ ์ถฉ๋Œ ๋ฌธ์ œ:** ์—ฌ๋Ÿฌ ๋ธŒ๋žœ์น˜ ๊ณ„์ธต(`feature` -> `develop` -> `release` -> `main`)์„ ๊ฑฐ์ณ์•ผ ํ•˜๋ฏ€๋กœ ์ฝ”๋“œ ๋ณ‘ํ•ฉ๊ณผ ๋ฐฐํฌ ์†๋„๊ฐ€ Trunk-Based Development๋‚˜ ๋‹จ์ˆœํ•œ Feature Branch ์›Œํฌํ”Œ๋กœ์šฐ์— ๋น„ํ•ด ๋А๋ ค์ง‘๋‹ˆ๋‹ค [2, 3]. ์ˆ˜๋ช…์ด ๊ธด ๋ธŒ๋žœ์น˜๊ฐ€ ๋ฐœ์ƒํ•  ํ™•๋ฅ ์ด ๋†’์•„ ํฐ ๋จธ์ง€ ์ถฉ๋Œ(Merge Conflict)์„ ๊ฒช์„ ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค [10, 13]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [๊ด€๊ณ„ ์œ ํ˜• A (์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ์ „๋žต)] +- [[GitHub Flow]] + - ์—ฐ๊ฒฐ ์ด์œ : Git Flow๋ณด๋‹ค ๋” ๋‹จ์ˆœํ•œ ๋Œ€์•ˆ์œผ๋กœ ์ž์ฃผ ๋น„๊ต๋˜๋ฉฐ, Git Flow์—์„œ ๋ฆด๋ฆฌ์Šค ๋ธŒ๋žœ์น˜์™€ `develop` ๋ธŒ๋žœ์น˜๋ฅผ ์ œ๊ฑฐํ•˜์—ฌ `main`์œผ๋กœ ์ง์ ‘ ๋ณ‘ํ•ฉํ•˜๋Š” ํ˜•ํƒœ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ธŒ๋žœ์นญ ์ „๋žต์˜ ๋ณต์žก๋„๋ฅผ ๋‚ฎ์ถ”๊ณ  ๋ฐฐํฌ ์ฃผ๊ธฐ๋ฅผ ๋‹จ์ถ•ํ•˜์—ฌ ๋ณด๋‹ค ๋ฏผ์ฒฉํ•œ ๊ฐœ๋ฐœ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•. +- [[Trunk-Based Development]] + - ์—ฐ๊ฒฐ ์ด์œ : ๊ฐ•๋ ฅํ•œ CI์™€ ์งง์€ ์ˆ˜๋ช…์˜ ๋ธŒ๋žœ์น˜๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋งค์šฐ ๋น ๋ฅธ ํ†ตํ•ฉ์„ ์ถ”๊ตฌํ•˜๋Š” ์ „๋žต์œผ๋กœ, ๋ณต์žกํ•˜๊ณ  ๋ฌด๊ฑฐ์šด Git Flow์™€ ๊ทน๋ช…ํ•˜๊ฒŒ ๋Œ€๋น„๋ฉ๋‹ˆ๋‹ค [2, 3]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ธŒ๋žœ์น˜ ๊ณ„์ธต์„ ์ตœ์†Œํ™”ํ•˜์—ฌ ํ†ตํ•ฉ ์ถฉ๋Œ์„ ์ค„์ด๊ณ , ๋น ๋ฅธ ์ฃผ๊ธฐ๋กœ ์ฝ”๋“œ๋ฅผ ๋ฐฐํฌํ•˜๋Š” ๋ฐฉ์‹. +- [[Feature Branch Workflow]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋ชจ๋“  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ `main`์ด ์•„๋‹Œ ํŠน์ • ๊ธฐ๋Šฅ(Feature)์„ ์œ„ํ•œ ์ „์šฉ ๋ธŒ๋žœ์น˜์—์„œ ์ž‘์—…ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ, Git Flow๋ฅผ ํฌํ•จํ•œ ๋Œ€๋ถ€๋ถ„์˜ ๋ธŒ๋žœ์นญ ์ „๋žต์˜ ๊ธฐ๋ฐ˜์ด ๋˜๋Š” ํ•ต์‹ฌ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค [5, 12, 14]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋…ผ๋ฆฌ์  ๋‹จ์œ„๋กœ ์ฝ”๋“œ๋ฅผ ๊ฒฉ๋ฆฌํ•˜๊ณ  ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๋ฉฐ ์ž‘์—… ๋‚ด์—ญ์„ ๋ช…ํ™•ํžˆ ํ•˜๋Š” ์›๋ฆฌ. + +#### [๊ด€๊ณ„ ์œ ํ˜• B (๊ตฌํ˜„/๊ฑฐ๋ฒ„๋„Œ์Šค ๋„๊ตฌ)] +- [[Pull Request (PR)]] + - ์—ฐ๊ฒฐ ์ด์œ : Git Flow์˜ ๋ณต์žกํ•œ ๋ธŒ๋žœ์น˜ ํ™˜๊ฒฝ(์˜ˆ: feature์—์„œ develop์œผ๋กœ ๋ณ‘ํ•ฉ)์—์„œ ์ฝ”๋“œ๋ฅผ ๋ณ‘ํ•ฉํ•˜๊ธฐ ์ „์— ๋™๋ฃŒ ๋ฆฌ๋ทฐ๋ฅผ ๊ฑฐ์น˜๊ฒŒ ํ•˜๋Š” ํ•„์ˆ˜์ ์ธ ํ’ˆ์งˆ ํ†ต์ œ ๊ด€๋ฌธ์ž…๋‹ˆ๋‹ค [7, 15]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํŒ€ ๋‚ด ์ฝ”๋“œ ํ’ˆ์งˆ ์œ ์ง€, ์ง€์‹ ๊ณต์œ  ๋ฐ ๋ณ‘ํ•ฉ ์ „ ๊ฒฐํ•จ ์ฐจ๋‹จ ๋ฉ”์ปค๋‹ˆ์ฆ˜. +- [[Conventional Commits]] + - ์—ฐ๊ฒฐ ์ด์œ : ์ˆ˜๋งŽ์€ ๋ธŒ๋žœ์น˜์™€ ์ปค๋ฐ‹์ด ์–ฝํžˆ๋Š” Git Flow์—์„œ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๋ฅผ ๊ทœ๊ฒฉํ™”(`feat:`, `fix:`, `chore:` ๋“ฑ)ํ•˜์—ฌ ๊ธฐ๋ก์„ ๋ช…ํ™•ํžˆ ํ•˜๊ณ  ๋ฆด๋ฆฌ์Šค ๊ด€๋ฆฌ๋ฅผ ์šฉ์ดํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค [15, 16]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ ์ฝ”๋“œ ๋ณ€๊ฒฝ ์ด๋ ฅ์„ ์ผ๊ด€๋˜๊ฒŒ ์ถ”์ ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๊ทœ์•ฝ. + +### Deeper Research Questions + +- Git Flow์˜ `develop` ๋ธŒ๋žœ์น˜์™€ `main` ๋ธŒ๋žœ์น˜๋ฅผ ์žฅ๊ธฐ๊ฐ„ ๋ถ„๋ฆฌํ•˜์—ฌ ์šด์˜ํ•  ๋•Œ ํ•„์—ฐ์ ์œผ๋กœ ๋ฐœ์ƒํ•˜๋Š” ๋จธ์ง€ ์ถฉ๋Œ(Merge Conflict)์„ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•œ ๊ตฌ์ฒด์ ์ธ ๋™๊ธฐํ™” ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? +- ์†Œ๊ทœ๋ชจ ํŒ€์ด ๋‹จ์ผ ๋ธŒ๋žœ์น˜ ๋˜๋Š” ๋‹จ์ˆœ Feature Branch Workflow์—์„œ Git Flow๋กœ ์ „ํ™˜(Migration)ํ•ด์•ผ ํ•˜๋Š” ๊ฐ€์žฅ ์ ์ ˆํ•œ ์กฐ์ง์ , ๋น„์ฆˆ๋‹ˆ์Šค์  ํƒ€์ด๋ฐ๊ณผ ๊ธฐ์ค€์€ ๋ฌด์—‡์ธ๊ฐ€? +- Git Flow ํ™˜๊ฒฝ์—์„œ ๊ธด๊ธ‰ํ•œ ์šด์˜ ์„œ๋ฒ„ ๋ฒ„๊ทธ ์ˆ˜์ •(Hotfix)์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ, `main`๊ณผ `develop` ๋ธŒ๋žœ์น˜ ์–‘์ชฝ์— ์•ˆ์ „ํ•˜๊ณ  ์‹ ์†ํ•˜๊ฒŒ ๋ฐ˜์˜ํ•˜๊ธฐ ์œ„ํ•œ ์ ˆ์ฐจ๋Š” ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑ๋˜๋Š”๊ฐ€? +- Git Flow์™€ Trunk-Based Development์˜ ๋ธŒ๋žœ์น˜ ์ˆ˜๋ช…(Lifetime) ์ฐจ์ด๊ฐ€ CI/CD ํŒŒ์ดํ”„๋ผ์ธ์˜ ๊ตฌ์ถ• ๋ฐ ์ž๋™ํ™” ํ…Œ์ŠคํŠธ ํšŸ์ˆ˜์— ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ค ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”๊ฐ€? +- ์ถ”์ ์„ฑ์„ ์œ„ํ•ด ํ‹ฐ์ผ“ ID(์˜ˆ: JIRA)๋ฅผ ๋ธŒ๋žœ์น˜์™€ ์ปค๋ฐ‹์— ์‚ฌ์šฉํ•  ๋•Œ, ๋ณต์žกํ•œ ๋ฆด๋ฆฌ์Šค ๋ธŒ๋žœ์น˜(Release Branch) ๋‹จ๊ณ„์—์„œ ์—ฌ๋Ÿฌ ํ‹ฐ์ผ“์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ๋ˆ„๋ฝ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋ชจ๋ฒ” ๊ด€ํ–‰์€ ๋ฌด์—‡์ธ๊ฐ€? + +### Practical Application Contexts + +- **Implementation:** ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ `main` ๋ธŒ๋žœ์น˜๋Š” ํ•ญ์ƒ ์•ˆ์ •์ ์ด๊ณ  ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋กœ ๋ณดํ˜ธํ•˜๋ฉฐ, ์‹ค์งˆ์ ์ธ ๊ฐœ๋ฐœ ํ†ตํ•ฉ์€ `develop` ๋ธŒ๋žœ์น˜๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค [1, 12]. ๋ชจ๋“  ์ปค๋ฐ‹๊ณผ ๋ธŒ๋žœ์น˜๋ช…์—๋Š” ํ‹ฐ์ผ“ ID๋ฅผ ํฌํ•จ์‹œ์ผœ ์š”๊ตฌ์‚ฌํ•ญ๊ณผ์˜ ์ถ”์ ์„ฑ์„ ํ™•๋ณดํ•ฉ๋‹ˆ๋‹ค [7]. +- **System Design:** ์˜ˆ์•ฝ๋œ ๋ฆด๋ฆฌ์Šค ์Šค์ผ€์ค„์„ ์ง€์›ํ•˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด ์•„ํ‚คํ…์ฒ˜์— ์ ํ•ฉํ•˜๋ฉฐ, ๋ฐฐํฌ ์ „์— `release` ๋ธŒ๋žœ์น˜๋ฅผ ํ†ตํ•ด ์ตœ์ข… QA์™€ ๋ฒ„์ „ ํƒœ๊น…(Tagging)์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํŒŒ์ดํ”„๋ผ์ธ์„ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค [1, 3, 7]. +- **Operation / Maintenance:** ๋ธŒ๋žœ์น˜ ๋ณดํ˜ธ(Branch Protection), ๋ฆฌ๋ทฐ์–ด ํ•„์ˆ˜ ์ง€์ •, CI ์ƒํƒœ ์ฒดํฌ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜์—ฌ `develop` ๋ธŒ๋žœ์น˜์˜ ์ฝ”๋“œ ํ’ˆ์งˆ์„ ๋ณด์žฅํ•˜๋ฉฐ, ๋จธ์ง€ ํ›„์—๋Š” ์ž‘์—…์ด ๋๋‚œ ๋ธŒ๋žœ์น˜๋ฅผ ์ž๋™ ์‚ญ์ œํ•˜์—ฌ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค [5, 13]. +- **Learning Path:** ์ฒ˜์Œ๋ถ€ํ„ฐ Git Flow๋ฅผ ๋„์ž…ํ•˜๊ธฐ๋ณด๋‹ค๋Š”, ๊ฐ€๋ฒผ์šด Feature Branch Workflow ๋˜๋Š” GitHub Flow๋กœ ๊ธฐ๋ณธ๊ธฐ๋ฅผ ๋‹ค์ง„ ํ›„, ๋ฆด๋ฆฌ์Šค ๊ด€๋ฆฌ์˜ ๋ณต์žก์„ฑ์ด ์ฆ๊ฐ€ํ•จ์— ๋”ฐ๋ผ ์ ์ง„์ ์œผ๋กœ `develop`๊ณผ `release` ๋ธŒ๋žœ์น˜ ๊ฐœ๋…์„ ํ•™์Šตํ•˜๊ณ  ๋„์ž…ํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค [1-3]. +- **My Project Relevance:** ํ˜„์žฌ ์ง„ํ–‰ ์ค‘์ธ ํ”„๋กœ์ ํŠธ์˜ ํŒ€ ๊ทœ๋ชจ์™€ ๋ฐฐํฌ ์ฃผ๊ธฐ์— ๋”ฐ๋ผ ์ฑ„ํƒ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํŒ€์›์ด 3~5๋ช…์ธ ์†Œ๊ทœ๋ชจ ํ™˜๊ฒฝ์ด๋ผ๋ฉด ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ํฐ Git Flow๋ณด๋‹ค๋Š” ์งง์€ ์ˆ˜๋ช…์˜ Feature ๋ธŒ๋žœ์น˜์™€ ๊ฒฐํ•ฉ๋œ ๋” ๋‹จ์ˆœํ•œ ์›Œํฌํ”Œ๋กœ์šฐ๊ฐ€ ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค [3, 10, 14]. + +### Adjacent Topics + +- [[CI/CD (Continuous Integration/Continuous Deployment)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: Git Flow์˜ ์—ฌ๋Ÿฌ ๋ธŒ๋žœ์น˜(`develop`, `release`, `main`) ํ™˜๊ฒฝ์— ๋งž์ถฐ ๋‹จ๊ณ„๋ณ„๋กœ ์ž๋™ํ™”๋œ ํ…Œ์ŠคํŠธ ๋ฐ ๋ฐฐํฌ ํŒŒ์ดํ”„๋ผ์ธ์„ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅด๊ฒŒ ๊ตฌ์ถ•ํ•˜๋Š”์ง€ ํƒ๊ตฌ. +- [[Agile Methodology]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: Git Flow์˜ ๋ฆด๋ฆฌ์Šค ๋ธŒ๋žœ์น˜ ์šด์šฉ์ด ์• ์ž์ผ์˜ ์Šคํ”„๋ฆฐํŠธ(Sprint) ์ฃผ๊ธฐ ๋ฐ ์ด์Šˆ ํŠธ๋ž˜์ปค(Issue Tracker)์™€ ์–ด๋–ป๊ฒŒ ํ†ตํ•ฉ๋˜์–ด ์†Œํ”„ํŠธ์›จ์–ด ๋ฆด๋ฆฌ์Šค ํ”„๋กœ์„ธ์Šค๋ฅผ ํ˜•์„ฑํ•˜๋Š”์ง€ ๋ถ„์„. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Git Workflow for Frontend Teams.md b/00_Raw/Git Workflow for Frontend Teams.md new file mode 100644 index 00000000..f51a735a --- /dev/null +++ b/00_Raw/Git Workflow for Frontend Teams.md @@ -0,0 +1,68 @@ +# [[Git Workflow for Frontend Teams]] + +## ๐Ÿ“Œ Brief Summary +ํ”„๋ก ํŠธ์—”๋“œ ํŒ€์„ ์œ„ํ•œ Git ์›Œํฌํ”Œ๋กœ์šฐ๋Š” ์ฝ”๋“œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ฒด๊ณ„์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜์—ฌ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๊ณ  ํ˜‘์—…์„ ์ด‰์ง„ํ•˜๋ฉฐ ์•ˆ์ •์ ์ธ ๋ฐฐํฌ ํ™˜๊ฒฝ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๊ตฌ์กฐํ™”๋œ ์ ‘๊ทผ ๋ฐฉ์‹์ด๋‹ค [1-3]. ์ฃผ์š” ์ „๋žต์œผ๋กœ๋Š” ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜(Feature-branch), ๊นƒํ—ˆ๋ธŒ ํ”Œ๋กœ์šฐ(GitHub Flow), ํŠธ๋ ํฌ ๊ธฐ๋ฐ˜(Trunk-based) ๊ฐœ๋ฐœ ๋“ฑ์ด ์žˆ์œผ๋ฉฐ, ์ด๋“ค์€ ์งง์€ ์ˆ˜๋ช…์˜ ๋ธŒ๋žœ์น˜, ๋ช…ํ™•ํ•œ ๋ช…๋ช… ๊ทœ์น™ ๋ฐ ์ปค๋ฐ‹ ์ปจ๋ฒค์…˜, ๋™๋ฃŒ ๋ฆฌ๋ทฐ๊ฐ€ ํฌํ•จ๋œ ํ’€ ๋ฆฌํ€˜์ŠคํŠธ(PR)๋ฅผ ๊ณตํ†ต์œผ๋กœ ๊ฐ•์กฐํ•œ๋‹ค [2, 4, 5]. ์ž˜ ๊ตฌํ˜„๋œ ์›Œํฌํ”Œ๋กœ์šฐ๋Š” ์ž ์žฌ์ ์ธ ํ˜ผ๋ž€์„ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ๊ณ ํ’ˆ์งˆ ์—…๋ฐ์ดํŠธ์˜ ํ๋ฆ„์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ํ•ต์‹ฌ ์—ญํ• ์„ ํ•œ๋‹ค [2]. + +## ๐Ÿ“– Core Content +* **๋ธŒ๋žœ์นญ ์ „๋žต (Branching Strategies)**: 2~5๋ช… ๊ทœ๋ชจ์˜ ์†Œ๊ทœ๋ชจ ํŒ€์€ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ํฐ Git Flow ๋Œ€์‹  ์‹ฌํ”Œํ•œ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜(Feature-branch) ์›Œํฌํ”Œ๋กœ์šฐ๋‚˜ ํŠธ๋ ํฌ ๊ธฐ๋ฐ˜ ๊ฐœ๋ฐœ์„ ์ฃผ๋กœ ์ฑ„ํƒํ•œ๋‹ค [6-8]. ์ด๋Ÿฌํ•œ ์›Œํฌํ”Œ๋กœ์šฐ๋Š” ํ•ญ์ƒ ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ ์•ˆ์ •์ ์ธ `main` ๋ธŒ๋žœ์น˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋ฉฐ, `main`์œผ๋กœ์˜ ์ง์ ‘์ ์ธ ์ปค๋ฐ‹์€ ์—„๊ฒฉํžˆ ์ œํ•œ๋œ๋‹ค [9, 10]. +* **๋ธŒ๋žœ์น˜ ๊ด€๋ฆฌ ๋ฐ ๋ช…๋ช… ๊ทœ์น™ (Branch Management & Naming)**: ๋ธŒ๋žœ์น˜๋Š” ์ˆ˜๋ช…์ด ์งง์•„์•ผ ํ•˜๊ณ , ๋‹จ์ผ ๋…ผ๋ฆฌ์  ๋ณ€๊ฒฝ์—๋งŒ ์ง‘์ค‘ํ•ด์•ผ ํ•˜๋ฉฐ, ๋ณ‘ํ•ฉ ํ›„์—๋Š” ์ž๋™์œผ๋กœ ์‚ญ์ œ๋˜์–ด์•ผ ํ•œ๋‹ค [9, 11]. ๋ธŒ๋žœ์น˜ ์ด๋ฆ„์€ ์„œ์ˆ ์ ์ด์–ด์•ผ ํ•˜๋ฉฐ, ๋ณ€๊ฒฝ ์‚ฌํ•ญ์˜ ์ถ”์ ์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ์ด์Šˆ/ํ‹ฐ์ผ“ ID(์˜ˆ: `feature/PROJ-123-user-auth`, `bugfix/GH-456-login-fix`)๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋œ๋‹ค [12, 13]. +* **์ปค๋ฐ‹ ๊ทœ์น™ (Commits)**: ๊ฐ ์ปค๋ฐ‹์€ ํ•˜๋‚˜์˜ ๋…ผ๋ฆฌ์  ๋ณ€๊ฒฝ ์‚ฌํ•ญ๋งŒ ํฌํ•จํ•˜๋Š” ์›์ž์  ์ปค๋ฐ‹(Atomic Commits) ํ˜•ํƒœ์—ฌ์•ผ ํ•œ๋‹ค [14]. ๊ฐ€๋…์„ฑ ๋†’์€ ํžˆ์Šคํ† ๋ฆฌ ์œ ์ง€์™€ ๋ฆด๋ฆฌ์Šค ๋…ธํŠธ ์ž๋™ํ™”๋ฅผ ์œ„ํ•ด `feat:`, `fix:`, `docs:`, `refactor:`, `chore:` ๋“ฑ์„ ์‚ฌ์šฉํ•˜๋Š” 'Conventional Commits' ํฌ๋งท์„ ๋”ฐ๋ฅธ๋‹ค [11, 15, 16]. +* **ํ’€ ๋ฆฌํ€˜์ŠคํŠธ ๋ฐ ๋ณ‘ํ•ฉ (PR & Merging)**: ์ฒ ์ €ํ•œ ๋ฆฌ๋ทฐ๋ฅผ ์œ„ํ•ด PR์€ ๊ฐ€๊ธ‰์  ์ž‘์€ ํฌ๊ธฐ(์˜ˆ: 200์ค„ ์ดํ•˜)๋กœ ์œ ์ง€ํ•ด์•ผ ํ•œ๋‹ค [9]. ๋ณ‘ํ•ฉ ์ „์—๋Š” ์ตœ์†Œ ํ•œ ๋ช…์˜ ๋™๋ฃŒ ๋ฆฌ๋ทฐ์–ด ์Šน์ธ๊ณผ CI/CD ํ…Œ์ŠคํŠธ ํ†ต๊ณผ๊ฐ€ ํ•„์ˆ˜์ ์œผ๋กœ ์š”๊ตฌ๋œ๋‹ค [9, 10]. ๊น”๋”ํ•œ `main` ๋ธŒ๋žœ์น˜ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์Šค์ฟผ์‹œ ๋ณ‘ํ•ฉ(Squash merge)์ด ๋„๋ฆฌ ๊ถŒ์žฅ๋œ๋‹ค [9, 17]. ๋˜ํ•œ, Storybook์ด๋‚˜ Chromatic๊ณผ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹œ๊ฐ์  ํšŒ๊ท€(Visual regression) ๊ฒ€ํ† ๋ฅผ PR ๊ณผ์ •์— ์—ฐ๋™ํ•  ์ˆ˜ ์žˆ๋‹ค [18]. +* **์ถฉ๋Œ ๋ฐฉ์ง€ (Conflict Prevention)**: ๊ฐœ๋ฐœ์ž๋Š” ๋Œ€๊ทœ๋ชจ ๋ณ‘ํ•ฉ ์ถฉ๋Œ์ด ๋ˆ„์ ๋˜๋Š” ๊ฒƒ์„ ๋ง‰๊ธฐ ์œ„ํ•ด `main` ๋ธŒ๋žœ์น˜์˜ ์ตœ์‹  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ž์ฃผ ๊ฐ€์ ธ์™€(pull/rebase) ์ž์‹ ์˜ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜๋ฅผ ๋™๊ธฐํ™”ํ•˜๊ณ , ์ถฉ๋Œ์„ ์ ์ง„์ ์œผ๋กœ ํ•ด๊ฒฐํ•ด์•ผ ํ•œ๋‹ค [7, 17]. + +## โš–๏ธ Trade-offs & Caveats +* **ํŠธ๋ ํฌ ๊ธฐ๋ฐ˜ vs Git Flow**: ํŠธ๋ ํฌ ๊ธฐ๋ฐ˜ ๊ฐœ๋ฐœ์€ ๋น ๋ฅธ ํ”ผ๋“œ๋ฐฑ๊ณผ ํ†ตํ•ฉ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜์ง€๋งŒ, ์ง€์†์ ์ธ ํ†ตํ•ฉ(CI)์„ ์™„๋ฒฝํžˆ ๊ตฌ์ถ•ํ•œ ๊ฒฝํ—˜ ๋งŽ์€ ํŒ€์—๊ฒŒ ์ ํ•ฉํ•˜๋‹ค [8]. ๋ฐ˜๋ฉด, Git Flow๋Š” ์ •๊ธฐ์ ์ธ ๋ฆด๋ฆฌ์Šค๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์— ๊ฐ•๋ ฅํ•œ ๊ตฌ์กฐ๋ฅผ ์ œ๊ณตํ•˜์ง€๋งŒ, ์†Œ๊ทœ๋ชจ ํŒ€์ด ๋„์ž…ํ•˜๊ธฐ์—๋Š” ๋ณต์žก์„ฑ๊ณผ ์ ˆ์ฐจ์  ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์ปค์„œ ์ง„ํ–‰ ์†๋„๋ฅผ ๋Šฆ์ถ”๋Š” ๋ถ€์ž‘์šฉ(Trade-off)์ด ์žˆ๋‹ค [6, 8]. +* **๋ธŒ๋žœ์น˜ ์ˆ˜๋ช… (Branch Lifespan)**: ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜๊ฐ€ ๋ถ„๋ฆฌ๋˜์–ด ์˜ค๋ž˜ ์œ ์ง€๋ ์ˆ˜๋ก ๋ณ‘ํ•ฉ ์ถฉ๋Œ์˜ ์œ„ํ—˜์ด ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ์ปค์ง„๋‹ค. ์ด๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด ์งง์€ ์ˆ˜๋ช…์˜ ๋ธŒ๋žœ์น˜๋ฅผ ์œ ์ง€ํ•˜๋ฉด ๋นˆ๋ฒˆํ•œ PR ์ƒ์„ฑ๊ณผ ์ฝ”๋“œ ๋™๊ธฐํ™”๋กœ ์ธํ•œ ๋ฌธ๋งฅ ์ „ํ™˜(Context switching) ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€๋งŒ, ์žฅ๊ธฐ์ ์œผ๋กœ ํŒŒ๊ดด์ ์ธ ์ถฉ๋Œ๊ณผ ๋ฆฌํŒฉํ† ๋ง ๋น„์šฉ์„ ์˜ˆ๋ฐฉํ•˜๋Š” ๋ฐ˜๋Œ€ ๊ธ‰๋ถ€๊ฐ€ ์žˆ๋‹ค [7, 19]. +* **์—„๊ฒฉํ•œ ๊ทœ์น™ vs ์œ ์—ฐ์„ฑ**: ๋ชจ๋“  ๋ธŒ๋žœ์น˜์™€ ์ปค๋ฐ‹์— ํ‹ฐ์ผ“ ID๋ฅผ ๊ฐ•์ œํ•˜๊ณ  Conventional Commits๋ฅผ ๋”ฐ๋ฅด๊ฒŒ ํ•˜๋ฉด ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๊ทœ์œจ์„ ์š”๊ตฌํ•˜์ง€๋งŒ, ์ด๋ฅผ ๊ฐ„๊ณผํ•  ๊ฒฝ์šฐ ์ฝ”๋“œ ๋ณ€๊ฒฝ์˜ ๋งฅ๋ฝ๊ณผ ์š”๊ตฌ ์‚ฌํ•ญ์˜ ์ถ”์ ์„ฑ(Traceability)์„ ์™„์ „ํžˆ ์ƒ์‹คํ•˜๊ฒŒ ๋˜๋Š” ํ•œ๊ณ„์ ์ด ์กด์žฌํ•œ๋‹ค [20]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] +- [[Trunk-Based Development]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋ฌด๊ฑฐ์šด Git Flow์— ๋Œ€๋น„๋˜๋Š” ๊ฒฝ๋Ÿ‰ํ™” ์ „๋žต์˜ ๋Œ€ํ‘œ์  ์‚ฌ๋ก€์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค [6, 8]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์— ์ฝ”๋“œ๋ฅผ ์ž์ฃผ, ์ž‘๊ฒŒ ๋ฐ€์–ด ๋„ฃ์Œ์œผ๋กœ์จ ๋Œ€๊ทœ๋ชจ ๋ณ‘ํ•ฉ ์ถฉ๋Œ์„ ํ”ผํ•˜๊ณ  ๋น ๋ฅธ ์ฝ”๋“œ ํ†ตํ•ฉ์„ ์ด๋ฃจ๋Š” ์›๋ฆฌ. +- [[Git Flow]] + - ์—ฐ๊ฒฐ ์ด์œ : ๊ฐœ๋ฐœ ๋ธŒ๋žœ์น˜, ๋ฆด๋ฆฌ์Šค ๋ธŒ๋žœ์น˜ ๋“ฑ์„ ๋‘๋Š” ์ „ํ†ต์ ์ด๊ณ  ๋ณต์žกํ•œ ๋ธŒ๋žœ์นญ ๋ชจ๋ธ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค [6, 8, 21]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋‹จ์ˆœํ•œ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ๋„˜์–ด ํŠน์ • ์Šค์ผ€์ค„๊ณผ ๋ฒ„์ „์— ๋”ฐ๋ฅธ ๋ณต์žกํ•œ ๋ฐฐํฌ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•  ๋•Œ ์š”๊ตฌ๋˜๋Š” ๊ตฌ์กฐ์  ์ ‘๊ทผ. +- [[GitHub Flow]] + - ์—ฐ๊ฒฐ ์ด์œ : ์•ˆ์ •์ ์ธ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์™€ PR ๊ธฐ๋ฐ˜์˜ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์ค‘์ ์ธ ์ „๋žต์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค [5, 22]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ถ”๊ฐ€์ ์ธ ํ†ตํ•ฉ ๋ธŒ๋žœ์น˜(develop ๋“ฑ) ์—†์ด ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜์—์„œ ๋ฐ”๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ๊ฑฐ์ณ `main`์œผ๋กœ ๋ณ‘ํ•ฉ๋˜๋Š” ์ง€์†์  ๋ฐฐํฌ์˜ ํ๋ฆ„. + +#### [๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ] +- [[Conventional Commits]] + - ์—ฐ๊ฒฐ ์ด์œ : ํ”„๋กœ์ ํŠธ์˜ ์ปค๋ฐ‹ ์ด๋ ฅ์„ ์ง๊ด€์ ์œผ๋กœ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋•๋Š” ํ‘œ์ค€ํ™”๋œ ํฌ๋งท์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค [11, 15]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ผ๊ด€๋œ ์ปค๋ฐ‹ ํ˜•์‹์ด ์–ด๋–ป๊ฒŒ ๋ฆด๋ฆฌ์Šค ๋…ธํŠธ ์ž๋™ํ™” ๋ฐ ์ฝ”๋“œ ํžˆ์Šคํ† ๋ฆฌ ์Šค์บ๋‹์œผ๋กœ ์ด์–ด์ง€๋Š”์ง€์— ๋Œ€ํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜. +- [[Pull Requests (PR)]] + - ์—ฐ๊ฒฐ ์ด์œ : ์ฝ”๋“œ๊ฐ€ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜๋กœ ํ†ตํ•ฉ๋˜๊ธฐ ์ „ ๊ฒ€์ฆ์„ ๊ฑฐ์น˜๋Š” ํ•ต์‹ฌ ๊ด€๋ฌธ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค [14, 15]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํŒ€ ๋‚ด ์ฝ”๋“œ ๋ฆฌ๋ทฐ, ์ž๋™ํ™”๋œ ํ…Œ์ŠคํŠธ(CI) ํ™•์ธ ๋“ฑ ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ(Quality Gate)๋กœ์„œ์˜ ์ž‘๋™ ๋ฐฉ์‹. +- [[Visual Regression Testing]] + - ์—ฐ๊ฒฐ ์ด์œ : ํ”„๋ก ํŠธ์—”๋“œ ํ™˜๊ฒฝ์˜ ํŠน์„ฑ์ƒ PR ๋‹จ๊ณ„์—์„œ UI ์‹œ๊ฐ์  ๊ฒ€์ฆ ๋„๊ตฌ ์—ฐ๋™์ด ์ค‘์š”ํ•˜๊ฒŒ ๋‹ค๋ค„์ง€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค [18]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Chromatic๊ณผ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ํ†ตํ•ด CSS, ๋ ˆ์ด์•„์›ƒ ๋ณ€๊ฒฝ์ด ์˜ˆ๊ธฐ์น˜ ์•Š๊ฒŒ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ PR ๋‹จ๊ณ„์—์„œ ๊ฐ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•. + +### Deeper Research Questions + +- ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜(Feature-branch) ์›Œํฌํ”Œ๋กœ์šฐ์—์„œ ํŠธ๋ ํฌ ๊ธฐ๋ฐ˜(Trunk-based) ๊ฐœ๋ฐœ๋กœ ์›ํ™œํ•˜๊ฒŒ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๊ธฐ ์œ„ํ•ด ํŒ€์€ ์–ด๋–ค ๋‹จ๊ณ„์  ์ ˆ์ฐจ๋ฅผ ๊ฑฐ์ณ์•ผ ํ•˜๋Š”๊ฐ€? +- ์งง์€ ์ˆ˜๋ช…์˜ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ž๋™ ๋ณ‘ํ•ฉ(Auto-merge)ํ•˜๋„๋ก ์ง€์›ํ•˜๋ ค๋ฉด CI/CD ํŒŒ์ดํ”„๋ผ์ธ๊ณผ ํ…Œ์ŠคํŠธ ์ž๋™ํ™”๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑํ•ด์•ผ ํ•˜๋Š”๊ฐ€? +- ์Šคํ† ๋ฆฌ๋ถ ๋ฐ Chromatic์„ ํ™œ์šฉํ•œ ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ(Visual Regression Testing) ๋„๊ตฌ๋ฅผ PR ๋ฆฌ๋ทฐ ์ฃผ๊ธฐ์— ๋ณ‘๋ชฉ ํ˜„์ƒ ์—†์ด ์ตœ์ ์œผ๋กœ ํ†ตํ•ฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? +- ์—ฌ๋Ÿฌ ์ปค๋ฐ‹์ด ํ•˜๋‚˜๋กœ ์••์ถ•๋˜๋Š” ์Šค์ฟผ์‹œ ๋ณ‘ํ•ฉ(Squash Merge)์„ ์‚ฌ์šฉํ•  ๋•Œ, ํŠน์ • ์„ธ๋ถ€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ฐ์‚ฌ(Audit)ํ•˜๊ฑฐ๋‚˜ ์ถ”์ ํ•˜๋Š” ๋ฐ ๋ฐœ์ƒํ•˜๋Š” ๊ตฌ์กฐ์  ํ•œ๊ณ„์ ์€ ๋ฌด์—‡์ธ๊ฐ€? +- ๋ฉ”์ธ ๋ธŒ๋žœ์น˜๋ฅผ ํ•ญ์ƒ ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ(Feature Flags)๋Š” ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜ ์›Œํฌํ”Œ๋กœ์šฐ์™€ ์–ด๋–ป๊ฒŒ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋Š”๊ฐ€? + +### Practical Application Contexts + +- **Implementation:** ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด๋‚˜ ๋ฒ„๊ทธ ์ˆ˜์ •์„ ์ง„ํ–‰ํ•  ๋•Œ ํ‹ฐ์ผ“ ID๊ฐ€ ํฌํ•จ๋œ ์งง์€ ์ˆ˜๋ช…์˜ ๋ธŒ๋žœ์น˜๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์˜๋ฏธ ์žˆ๋Š” ๋‹จ์œ„๋กœ ์›์ž์  ์ปค๋ฐ‹์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, ์žฆ์€ `pull`์„ ํ†ตํ•ด `main`๊ณผ์˜ ์ถฉ๋Œ์„ ์„ ์ œ์ ์œผ๋กœ ์˜ˆ๋ฐฉํ•œ๋‹ค. +- **System Design:** GitHub, GitLab ๋“ฑ์˜ ์ €์žฅ์†Œ ์„ค์ •์—์„œ `main` ๋ธŒ๋žœ์น˜ ๋ณดํ˜ธ ๊ทœ์น™(Branch protection)์„ ์„ค์ •ํ•˜์—ฌ ์ง์ ‘ ์ปค๋ฐ‹์„ ์ฐจ๋‹จํ•˜๊ณ , ๋ณ‘ํ•ฉ ์ „ ์ตœ์†Œ 1๋ช…์˜ ์ฝ”๋“œ ๋ฆฌ๋ทฐ์™€ CI ํ†ต๊ณผ๋ฅผ ๊ฐ•์ œํ•˜๋Š” ๊ตฌ์กฐ๋ฅผ ์„ค๊ณ„ํ•œ๋‹ค. +- **Operation / Maintenance:** PR ๋ณ‘ํ•ฉ(Merge) ์‹œ ์ž๋™์œผ๋กœ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜๊ฐ€ ์‚ญ์ œ๋˜๋„๋ก ์‹œ์Šคํ…œ์„ ๊ตฌ์„ฑํ•˜๊ณ , ์Šค์ฟผ์‹œ ๋ณ‘ํ•ฉ(Squash merge)์„ ํ†ตํ•ด ํ”„๋กœ์ ํŠธ์˜ ์ปค๋ฐ‹ ํŠธ๋ฆฌ๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์œ ์ง€ํ•œ๋‹ค. +- **Learning Path:** ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ๋‚˜ ํ”„๋ก ํŠธ์—”๋“œ ์ž…๋ฌธ์ž๋Š” ๋ณต์žกํ•œ Git Flow ๋Œ€์‹ , `main` ๋ธŒ๋žœ์น˜์™€ ๋‹จ์ผ `feature` ๋ธŒ๋žœ์น˜๋ฅผ ํ™œ์šฉํ•˜๋Š” ๋‹จ์ˆœํ•œ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜ ์›Œํฌํ”Œ๋กœ์šฐ๋ถ€ํ„ฐ ํ•™์Šตํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋œ๋‹ค. +- **My Project Relevance:** ํŒ€ ๋‚ด ์ฝ”๋“œ ๋ฆฌ๋ทฐ ์—ํ‹ฐ์ผ“์„ ์ •๋ฆฝํ•˜๊ณ , JIRA ๋“ฑ ์ด์Šˆ ํŠธ๋ž˜์ปค์˜ ํ‹ฐ์ผ“ ๋ฒˆํ˜ธ๋ฅผ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€์™€ ์—ฐ๋™ํ•˜๋ฉฐ, Storybook์„ PR ๊ฒ€ํ†  ๊ณผ์ •์— ์—ฐ๋™ํ•˜์—ฌ UI ๋ฒ„๊ทธ๋ฅผ ์‚ฌ์ „์— ์ฐจ๋‹จํ•˜๋Š” ๊ทœ์น™์„ ์ˆ˜๋ฆฝํ•˜๋Š” ๋ฐ ์ง์ ‘์ ์œผ๋กœ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. + +### Adjacent Topics + +- [[Continuous Integration / Continuous Deployment (CI/CD)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: PR ์ƒ์„ฑ, ์ปค๋ฐ‹ ํ‘ธ์‹œ์™€ ๊ฐ™์€ Git ์ด๋ฒคํŠธ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋นŒ๋“œ, ํ…Œ์ŠคํŠธ, ๋ฐฐํฌ ํŒŒ์ดํ”„๋ผ์ธ์„ ์ž๋™์œผ๋กœ ํŠธ๋ฆฌ๊ฑฐํ•˜๊ณ  ๊ฐœ๋ฐœ ํ”ผ๋“œ๋ฐฑ ๋ฃจํ”„๋ฅผ ๋‹จ์ถ•ํ•˜๋Š”์ง€ ์กฐ์‚ฌ. +- [[Storybook & Component-Driven Development]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๊ฒฉ๋ฆฌ๋œ ์ปดํฌ๋„ŒํŠธ ํ™˜๊ฒฝ์ด ์–ด๋–ป๊ฒŒ ๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ(Git)๊ณผ ์—ฐ๋™๋˜์–ด PR ๋ฆฌ๋ทฐ์–ด์—๊ฒŒ ์‹œ๊ฐ์  ์ปจํ…์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๊ตฌ์ฒด์  ์‚ฌ๋ก€ ํƒ๊ตฌ. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/GitHub Flow in Small Teams.md b/00_Raw/GitHub Flow in Small Teams.md new file mode 100644 index 00000000..9958d9ca --- /dev/null +++ b/00_Raw/GitHub Flow in Small Teams.md @@ -0,0 +1,61 @@ +# [[GitHub Flow in Small Teams]] + +## ๐Ÿ“Œ Brief Summary +GitHub Flow in Small Teams(์†Œ๊ทœ๋ชจ ํŒ€์„ ์œ„ํ•œ GitHub Flow)๋Š” ๋ฌด๊ฑฐ์šด ํ”„๋กœ์„ธ์Šค ์˜ค๋ฒ„ํ—ค๋“œ ์—†์ด ์ฝ”๋“œ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๊ณ  ๋น ๋ฅธ ํ”ผ๋“œ๋ฐฑ์„ ์ด‰์ง„ํ•˜๋Š” ๊ฒฝ๋Ÿ‰ํ™”๋œ ๋ธŒ๋žœ์นญ ์ „๋žต์ด๋‹ค [1-3]. ์ด ์›Œํฌํ”Œ๋กœ์šฐ๋Š” ํ•ญ์ƒ ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋Š” `main` ๋ธŒ๋žœ์น˜์™€ ํŠน์ • ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ์ด๋‚˜ ๋ฒ„๊ทธ ์ˆ˜์ •์„ ์œ„ํ•ด ์ƒ์„ฑ๋˜๋Š” ์ˆ˜๋ช…์ด ์งง์€ ํ”ผ์ฒ˜ ๋ธŒ๋žœ์น˜(Feature Branch)๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ์šด์˜๋œ๋‹ค [2, 4]. ๊ฐœ๋ฐœ๋œ ์ฝ”๋“œ๋Š” ๋ฐ˜๋“œ์‹œ Pull Request(PR)์™€ ์ตœ์†Œ 1๋ช… ์ด์ƒ์˜ ๋™๋ฃŒ ๋ฆฌ๋ทฐ(Peer Review)๋ฅผ ๊ฑฐ์นœ ํ›„ ์Šค์ฟผ์‹œ(Squash) ๋“ฑ์˜ ๋ฐฉ์‹์œผ๋กœ ๋ณ‘ํ•ฉ๋˜์–ด ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ์•ˆ์ •์„ฑ๊ณผ ๊น”๋”ํ•œ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๋ณด์žฅํ•œ๋‹ค [5-7]. + +## ๐Ÿ“– Core Content +* **๋ฉ”์ธ ๋ธŒ๋žœ์น˜ ๋ณดํ˜ธ (Main Branch Protection)**: `main` (๋˜๋Š” `master`) ๋ธŒ๋žœ์น˜๋Š” ํ•ญ์ƒ ์•ˆ์ •์ ์ด๊ณ  ์ฆ‰์‹œ ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•ด์•ผ ํ•˜๋ฉฐ, ์ด ๋ธŒ๋žœ์น˜๋กœ์˜ ์ง์ ‘์ ์ธ ํ‘ธ์‹œ(Push)๋‚˜ ์ปค๋ฐ‹์€ ๊ธˆ์ง€๋œ๋‹ค [2, 4-6]. ์ด๋ฅผ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด GitHub ์„ค์ •์—์„œ `main` ๋ธŒ๋žœ์น˜ ๋ณดํ˜ธ ๊ทœ์น™์„ ํ™œ์„ฑํ™”ํ•˜์—ฌ, ๋ณ‘ํ•ฉ ์ „ ํ•„์ˆ˜ ๋ฆฌ๋ทฐ์™€ ์ตœ์‹  ์ƒํƒœ ์œ ์ง€๋ฅผ ๊ฐ•์ œํ•ด์•ผ ํ•œ๋‹ค [5]. +* **๋‹จ๊ธฐ ํ”ผ์ฒ˜ ๋ธŒ๋žœ์น˜ (Short-lived Feature Branches)**: ์ƒˆ๋กœ์šด ์ž‘์—…, ๊ธฐ๋Šฅ ์ถ”๊ฐ€, ๋˜๋Š” ๋ฒ„๊ทธ ์ˆ˜์ • ์‹œ ๋ฌด์กฐ๊ฑด `main`์—์„œ ํŒŒ์ƒ๋œ ๊ฐœ๋ณ„ ํ”ผ์ฒ˜ ๋ธŒ๋žœ์น˜๋ฅผ ์ƒ์„ฑํ•œ๋‹ค [4, 6, 8]. ๋ธŒ๋žœ์น˜ ์ด๋ฆ„์€ `feature/`, `bugfix/`, `chore/` ๋“ฑ์˜ ๋ช…ํ™•ํ•œ ์ ‘๋‘์‚ฌ์™€ ์งง์€ ์„ค๋ช…, ๊ทธ๋ฆฌ๊ณ  ์ด์Šˆ ์ถ”์ ์„ ์œ„ํ•œ ํ‹ฐ์ผ“ ID(์˜ˆ: `feature/PROJ-123-login`)๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ์ž‘์„ฑํ•œ๋‹ค [9-11]. +* **์›์ž์  ์ปค๋ฐ‹๊ณผ ๊ทœ๊ฒฉํ™” (Atomic & Conventional Commits)**: ์ปค๋ฐ‹์€ ์ž์ฃผ ์ด๋ฃจ์–ด์ ธ์•ผ ํ•˜๋ฉฐ, ํ•˜๋‚˜์˜ ์ปค๋ฐ‹์—๋Š” ๋‹จ ํ•˜๋‚˜์˜ ๋…ผ๋ฆฌ์  ๋ณ€๊ฒฝ ์‚ฌํ•ญ๋งŒ ๋‹ด์•„์•ผ ํ•œ๋‹ค [5, 8, 9]. `feat:`, `fix:`, `docs:` ๋“ฑ์„ ์‚ฌ์šฉํ•˜๋Š” Conventional Commits ํ˜•์‹์„ ์ ์šฉํ•ด ๋ณ€๊ฒฝ ๋‚ด์šฉ๊ณผ ๊ทธ ์ด์œ ๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ๊ธฐ๋กํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋œ๋‹ค [9, 12]. +* **Pull Request (PR)์™€ ๋™๋ฃŒ ๋ฆฌ๋ทฐ (Peer Review)**: ๊ธฐ๋Šฅ ๊ตฌํ˜„์ด ์™„๋ฃŒ๋˜๋ฉด `main`์„ ํ–ฅํ•ด PR์„ ์ƒ์„ฑํ•œ๋‹ค [7, 9]. PR์˜ ํฌ๊ธฐ๋Š” ๊ฐ€๊ธ‰์  ์ž‘๊ฒŒ(์˜ˆ: 200์ค„ ์ดํ•˜) ์œ ์ง€ํ•˜์—ฌ ๋ฆฌ๋ทฐ ์†๋„์™€ ์งˆ์„ ๋†’์ธ๋‹ค [5]. ๋ณ‘ํ•ฉ์„ ์œ„ํ•ด์„œ๋Š” ํŒ€์› ์ค‘ ์ตœ์†Œ 1๋ช… ์ด์ƒ์˜ ๋ฆฌ๋ทฐ ๋ฐ ์Šน์ธ์ด ํ•„์ˆ˜์ ์ด๋ฉฐ, ์ž๋™ํ™”๋œ CI ํ…Œ์ŠคํŠธ๋ฅผ ๋ชจ๋‘ ํ†ต๊ณผํ•ด์•ผ ํ•œ๋‹ค [5, 7, 9]. +* **๋™๊ธฐํ™”์™€ ์ถฉ๋Œ ๋ฐฉ์ง€ (Syncing & Conflict Prevention)**: ๋Œ€๊ทœ๋ชจ ๋ณ‘ํ•ฉ ์ถฉ๋Œ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๊ฐœ๋ฐœ์ž๋Š” ์ž‘์—… ์‹œ์ž‘ ์ „ ํ•ญ์ƒ `main`์˜ ์ตœ์‹  ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ (Pull), ์ž‘์—… ์ค‘์ธ ํ”ผ์ฒ˜ ๋ธŒ๋žœ์น˜์— ์ž์ฃผ `rebase` ๋˜๋Š” ๋ณ‘ํ•ฉํ•˜์—ฌ ๋™๊ธฐํ™”๋œ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•ด์•ผ ํ•œ๋‹ค [3, 7]. +* **๋ณ‘ํ•ฉ ๋ฐ ์ •๋ฆฌ (Merge and Cleanup)**: ๋ณ‘ํ•ฉ ์‹œ์—๋Š” ์Šค์ฟผ์‹œ ๋ณ‘ํ•ฉ(Squash merge)์„ ์‚ฌ์šฉํ•˜์—ฌ `main`์˜ ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ํ•œ ์ค„๋กœ ๊น”๋”ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋Š” ์ „๋žต์ด ์„ ํ˜ธ๋œ๋‹ค [5, 7, 13]. ๋ณ‘ํ•ฉ์ด ์™„๋ฃŒ๋œ ํ”ผ์ฒ˜ ๋ธŒ๋žœ์น˜๋Š” ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ์ •๋ˆํ•˜๊ธฐ ์œ„ํ•ด ์ž๋™์œผ๋กœ ์‚ญ์ œ๋˜๋„๋ก ์„ค์ •ํ•œ๋‹ค [5, 8]. + +## โš–๏ธ Trade-offs & Caveats +์ด ์ „๋žต์€ ๊ฑฐ๋Œ€ํ•œ Git Flow ๋ฐฉ์‹์ด ๊ฐ€์ง€๋Š” ๋ณต์žก์„ฑ์„ ์ œ๊ฑฐํ•˜๊ณ  ํ˜‘์—…์˜ ์†๋„์™€ ์œ ์—ฐ์„ฑ์„ ํฌ๊ฒŒ ๋†’์ธ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค [3, 14]. ํ•˜์ง€๋งŒ ํ”ผ์ฒ˜ ๋ธŒ๋žœ์น˜๊ฐ€ ์žฅ๊ธฐํ™”(Long-lived)๋  ๊ฒฝ์šฐ ๋‚˜์ค‘์— ๋ณ‘ํ•ฉํ•  ๋•Œ ๊ทน์‹ฌํ•œ ์ฝ”๋“œ ์ถฉ๋Œ์„ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๋ธŒ๋žœ์น˜์˜ ์ˆ˜๋ช…์„ ๋ฉฐ์น  ์ด๋‚ด๋กœ ์งง๊ฒŒ ์œ ์ง€ํ•˜๋Š” ๊ทœ์œจ์ด ํ•„์ˆ˜์ ์ด๋‹ค [15]. ๋˜ํ•œ, ๋น ๋ฅธ ์†๋„์— ์น˜์ค‘ํ•˜์—ฌ ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ๊ฑด๋„ˆ๋›ฐ๊ฑฐ๋‚˜ ํ…Œ์ŠคํŠธ๊ฐ€ ๊นจ์ง„ ์ฝ”๋“œ๋ฅผ ๋ณ‘ํ•ฉํ•˜๋Š” ๋“ฑ์˜ ์•ˆํ‹ฐ ํŒจํ„ด์„ ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค [15, 16]. ์ž‘์€ ํŒ€์—์„œ๋Š” ๋งค์šฐ ํšจ์œจ์ ์ด์ง€๋งŒ ์ •๊ธฐ์ ์ธ ๋ฆด๋ฆฌ์Šค ์ผ์ •์ด ์—„๊ฒฉํ•˜๊ฑฐ๋‚˜ ํŒ€ ๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ ๊ฒฝ์šฐ ๊ด€๋ฆฌ์— ํ•œ๊ณ„๊ฐ€ ์˜ฌ ์ˆ˜ ์žˆ์œผ๋ฉฐ [14], ๋งค์šฐ ์‚ฌ์†Œํ•˜๊ณ  ์ž‘์€ ์ˆ˜์ • ์‚ฌํ•ญ์˜ ๊ฒฝ์šฐ ๋งค๋ฒˆ PR์„ ๊ฑฐ์น˜๋Š” ๊ฒƒ์ด ๊ณผ๋„ํ•œ ์˜ค๋ฒ„ํ—ค๋“œ๋กœ ๋А๊ปด์งˆ ์—ฌ์ง€๋„ ์žˆ๋‹ค [3]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] +- [[Short-Lived Feature Branches]] + - ์—ฐ๊ฒฐ ์ด์œ : GitHub Flow์—์„œ ์ž‘์—…์„ ๊ฒฉ๋ฆฌํ•˜๋Š” ํ•ต์‹ฌ ๋‹จ์œ„์ด๋‹ค [2, 4]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ธŒ๋žœ์น˜๊ฐ€ ์˜ค๋ž˜ ์œ ์ง€๋  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ํ†ตํ•ฉ์˜ ๊ณ ํ†ต์„ ํ”ผํ•˜๊ณ , ์ž‘์€ ๋‹จ์œ„์˜ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ๊ณผ ๋น ๋ฅธ ๋ฐฐํฌ ์‚ฌ์ดํด์„ ๋‹ฌ์„ฑํ•˜๋Š” ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค. + +#### [๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ] +- [[Pull Request (PR)]] + - ์—ฐ๊ฒฐ ์ด์œ : ์ฝ”๋“œ๊ฐ€ `main`์œผ๋กœ ๋ณ‘ํ•ฉ๋˜๊ธฐ ์ „ ๊ฑฐ์ณ์•ผ ํ•˜๋Š” ํ•„์ˆ˜ ๊ด€๋ฌธ์ด์ž ์†Œํ†ต์˜ ์žฅ์ด๋‹ค [5, 8]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์†Œ๊ทœ๋ชจ ํŒ€์—์„œ ๋™๋ฃŒ ๋ฆฌ๋ทฐ(Peer Review)์™€ CI(์ง€์†์  ํ†ตํ•ฉ) ์ž๋™ํ™”๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ์ฝ”๋“œ ํ’ˆ์งˆ์„ ๋ฐฉ์–ดํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค. +- [[Conventional Commits]] + - ์—ฐ๊ฒฐ ์ด์œ : ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๋ฅผ ๋ช…ํ™•ํžˆ ๊ทœ๊ฒฉํ™”ํ•˜์—ฌ PR ๋ฆฌ๋ทฐ์™€ ์ฝ”๋“œ ๊ด€๋ฆฌ๋ฅผ ๋•๋Š” ๊ด€๋ก€์ด๋‹ค [9, 12]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: `feat:`, `fix:` ๋“ฑ์˜ ์ ‘๋‘์‚ฌ๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ ๋ณ€๊ฒฝ์˜ ์˜๋„๋ฅผ ๋ช…ํ™•ํžˆ ์†Œํ†ตํ•˜๊ณ , ๋‚˜์•„๊ฐ€ ์ž๋™ํ™”๋œ ๋ฆด๋ฆฌ์Šค ๋…ธํŠธ ์ƒ์„ฑ์˜ ๊ธฐ๋ฐ˜์„ ๋งˆ๋ จํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ๋‹ค. +- [[Squash Merge]] + - ์—ฐ๊ฒฐ ์ด์œ : PR์„ `main`์— ๋ณ‘ํ•ฉํ•  ๋•Œ ์„ ํ˜ธ๋˜๋Š” ์ „๋žต์ด๋‹ค [5, 7, 13]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํ”ผ์ฒ˜ ๋ธŒ๋žœ์น˜์—์„œ ๋ฐœ์ƒํ•œ ์—ฌ๋Ÿฌ ์ž์ž˜ํ•œ ์ปค๋ฐ‹๋“ค์„ ํ•˜๋‚˜์˜ ์˜๋ฏธ ์žˆ๋Š” ์ปค๋ฐ‹์œผ๋กœ ์••์ถ•ํ•˜์—ฌ `main` ๋ธŒ๋žœ์น˜์˜ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๊นจ๋—ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. +- [[Ticket ID Traceability]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋ธŒ๋žœ์น˜ ์ด๋ฆ„๊ณผ ์ปค๋ฐ‹์— ์ด์Šˆ ํŠธ๋ž˜์ปค(JIRA, GitHub Issues ๋“ฑ)์˜ ID๋ฅผ ํฌํ•จ์‹œํ‚ค๋Š” ๋ชจ๋ฒ” ์‚ฌ๋ก€์ด๋‹ค [17, 18]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ฝ”๋“œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์–ด๋–ค ๋น„์ฆˆ๋‹ˆ์Šค ์š”๊ตฌ์‚ฌํ•ญ์ด๋‚˜ ๋ฒ„๊ทธ ๋ฆฌํฌํŠธ์™€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š”์ง€ ๋น„์ฆˆ๋‹ˆ์Šค์  ๋ฌธ๋งฅ(Context)์„ ์‰ฝ๊ฒŒ ์ถ”์ ํ•˜๋Š” ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค. + +### Deeper Research Questions +- ์†Œ๊ทœ๋ชจ ํŒ€(2~5๋ช…)์ด ์ค‘๋Œ€ํ˜• ํŒ€(10๋ช… ์ด์ƒ)์œผ๋กœ ์Šค์ผ€์ผ์—…ํ•  ๋•Œ, GitHub Flow์˜ ์–ด๋–ค ์ง€์ ์—์„œ ๋ณ‘๋ชฉ(์˜ˆ: ๋ฆฌ๋ทฐ ์ ์ฒด, ์ถฉ๋Œ ๋นˆ๋„ ์ฆ๊ฐ€)์ด ๋ฐœ์ƒํ•˜๋ฉฐ ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ๊ทน๋ณตํ•ด์•ผ ํ•˜๋Š”๊ฐ€? +- Pull Request์˜ ํฌ๊ธฐ๋ฅผ ๋ฆฌ๋ทฐ๊ฐ€ ์šฉ์ดํ•œ 200์ค„ ์ดํ•˜๋กœ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด, ๊ฐœ๋ฐœ ์ดˆ๊ธฐ ๋‹จ๊ณ„์—์„œ ์ž‘์—…์„ ์–ด๋–ป๊ฒŒ ๋ถ„ํ• (Task Breakdown)ํ•ด์•ผ ํšจ๊ณผ์ ์ธ๊ฐ€? +- CI/CD ํŒŒ์ดํ”„๋ผ์ธ๊ณผ GitHub Flow๋ฅผ ์—ฐ๋™ํ•  ๋•Œ, `main` ๋ธŒ๋žœ์น˜์˜ 'ํ•ญ์ƒ ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ(Always Deployable)'๋ฅผ ๊ธฐ์ˆ ์ ์œผ๋กœ ์™„๋ฒฝํžˆ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ค ํ…Œ์ŠคํŠธ ๋ฐ ์ž๋™ํ™” ์ „๋žต์ด ํ•„์š”ํ•œ๊ฐ€? +- ์žฅ๊ธฐ ์‹คํ–‰ ๋ธŒ๋žœ์น˜(Long-running branches)๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๋Œ€์•ˆ์œผ๋กœ ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ(Feature Flags)๋ฅผ ๋„์ž…ํ•  ๊ฒฝ์šฐ, ๊ธฐ์กด GitHub Flow ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์–ด๋–ป๊ฒŒ ๋ณ€๊ฒฝํ•ด์•ผ ํ•˜๋Š”๊ฐ€? +- ๋ฆฌ๋ทฐ ์ธ๋ ฅ์ด ๋ถ€์กฑํ•œ ์†Œ๊ทœ๋ชจ ํŒ€์—์„œ ๋™๋ฃŒ ๋ฆฌ๋ทฐ์˜ ๋ณ‘๋ชฉ์„ ์ค„์ด๊ณ  ๋น ๋ฅธ ํ”ผ๋“œ๋ฐฑ ๋ฃจํ”„๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋„์ž…ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธํ™”์  ๋˜๋Š” ๋„๊ตฌ์  ํ•ด๊ฒฐ์ฑ…์€ ๋ฌด์—‡์ธ๊ฐ€? + +### Practical Application Contexts +- **Implementation:** 3~5์ธ ๊ทœ๋ชจ์˜ ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐ ์„ธํŒ… ์‹œ, ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ์„ค์ •์—์„œ `main` ๋ธŒ๋žœ์น˜ ๋ณดํ˜ธ ์˜ต์…˜์„ ์ผœ๊ณ , ์ง์ ‘ ํ‘ธ์‹œ๋ฅผ ์ œํ•œํ•˜๋ฉฐ, ์ตœ์†Œ 1๋ช…์˜ Approve์™€ CI ํ†ต๊ณผ๋ฅผ ๊ฐ•์ œํ•˜๋Š” ๋ฃฐ์„ ์ ์šฉํ•˜์—ฌ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๋‹ค [5, 7]. +- **System Design:** GitHub Actions ๋“ฑ์˜ CI ํ™˜๊ฒฝ์„ ๊ตฌ์„ฑํ•˜์—ฌ PR์ด ์—ด๋ ธ์„ ๋•Œ ์ž๋™์œผ๋กœ ๋ฆฐํŒ…, ํฌ๋งทํŒ…, ์œ ๋‹› ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•ด ๋ฆฌ๋ทฐ์–ด์˜ ๋ถ€๋‹ด์„ ๋œ์–ด์ฃผ๋„๋ก ์‹œ์Šคํ…œ์„ ์„ค๊ณ„ํ•œ๋‹ค [19, 20]. +- **Operation / Maintenance:** PR ๋ณ‘ํ•ฉ์ด ์™„๋ฃŒ๋œ ๋ธŒ๋žœ์น˜๋ฅผ GitHub์˜ 'Auto-delete merged branches' ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ์ž๋™์œผ๋กœ ์‚ญ์ œํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ๋ธŒ๋žœ์น˜๊ฐ€ ์Œ“์ด๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ณ  ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ์ฒญ๊ฒฐํ•˜๊ฒŒ ์œ ์ง€ํ•œ๋‹ค [5, 8]. +- **Learning Path:** Git ๊ธฐ์ดˆ (๋ธŒ๋žœ์น˜ ์ƒ์„ฑ, ์ปค๋ฐ‹) -> GitHub Flow ์‚ฌ์ดํด ์ดํ•ด (๋ธŒ๋žœ์น˜ ํŒŒ์ƒ -> ์›์ž์  ์ปค๋ฐ‹ -> PR -> ๋ฆฌ๋ทฐ -> ๋ณ‘ํ•ฉ) -> ํŒ€ ๋‚ด ๋ช…๋ช… ๊ทœ์น™ ๋ฐ Conventional Commits ์ˆ™๋‹ฌ -> CI/CD ์ž๋™ํ™” ์—ฐ๋™ ์ˆœ์œผ๋กœ ํ•™์Šต์„ ์ง„ํ–‰ํ•œ๋‹ค. +- **My Project Relevance:** ํ˜„์žฌ ์ฐธ์—ฌ ์ค‘์ธ ํ”„๋ก ํŠธ์—”๋“œ/๋ฐฑ์—”๋“œ ํ˜‘์—… ํ”„๋กœ์ ํŠธ์—์„œ ์ฝ”๋“œ ํ†ตํ•ฉ ์‹œ ๋ฐœ์ƒํ•˜๋Š” ์ถฉ๋Œ์„ ์ตœ์†Œํ™”ํ•˜๊ณ , ์„œ๋กœ์˜ ์ฝ”๋“œ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๋ฆฌ๋ทฐํ•˜๋ฉฐ ์•ˆ์ •์ ์ธ ํ”„๋กœ๋•์…˜ ๋ฒ„์ „์„ ์œ ์ง€ํ•˜๋Š” ํ•ต์‹ฌ ํ”„๋กœ์„ธ์Šค๋กœ ์ฆ‰์‹œ ๋„์ž…ํ•  ์ˆ˜ ์žˆ๋‹ค [14, 20]. + +### Adjacent Topics +- [[Git Flow]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ์ •๊ธฐ์ ์ด๊ณ  ๊ณ„ํš์ ์ธ ๋ฆด๋ฆฌ์Šค ์ผ์ •์ด ์กด์žฌํ•˜๊ฑฐ๋‚˜, ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๊ฐ€ ์ปค์„œ `develop` ๋ฐ `release` ๋ธŒ๋žœ์น˜ ๋“ฑ ๋” ์—„๊ฒฉํ•˜๊ณ  ์„ธ๋ถ„ํ™”๋œ ๋ธŒ๋žœ์นญ ๋ชจ๋ธ์ด ํ•„์š”ํ•  ๋•Œ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋Œ€์•ˆ ์ „๋žต ๋น„๊ต [14, 21]. +- [[Trunk-Based Development]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: CI/CD ์„ฑ์ˆ™๋„๊ฐ€ ๋†’๊ณ  ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ(Feature Flag)๋ฅผ ์ ๊ทน ์‚ฌ์šฉํ•˜๋Š” ํŒ€์—์„œ, ํ”ผ์ฒ˜ ๋ธŒ๋žœ์น˜์˜ ์ˆ˜๋ช…์„ ๊ทน๋‹จ์ ์œผ๋กœ ์ค„์ด๊ฑฐ๋‚˜ ์•„์˜ˆ ์—†์ด ๋ฉ”์ธ๋ผ์ธ์— ํ•˜๋ฃจ์—๋„ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ณ‘ํ•ฉํ•˜๋Š” ๊ฐ€์žฅ ๋น ๋ฅธ ํ†ตํ•ฉ ๋ฐฉ์‹ ํƒ์ƒ‰ [14, 22]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Incremental Migration.md b/00_Raw/Incremental Migration.md new file mode 100644 index 00000000..3dc8ce3c --- /dev/null +++ b/00_Raw/Incremental Migration.md @@ -0,0 +1,53 @@ +# [[Incremental Migration]] + +## ๐Ÿ“Œ Brief ์‹œ Summary +**Incremental Migration(์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜)**์€ ์˜ค๋ž˜๋œ ๊ธฐ์ˆ ์ด๋‚˜ ์•„ํ‚คํ…์ฒ˜์—์„œ ์ƒˆ๋กœ์šด ๊ธฐ์ˆ ๋กœ ์ „ํ™˜ํ•  ๋•Œ, ์ „์ฒด ์‹œ์Šคํ…œ์„ ํ•œ ๋ฒˆ์— ์žฌ์ž‘์„ฑ(complete rewrite)ํ•˜๋Š” ๋Œ€์‹  ๋‹จ๊ณ„์ ์œผ๋กœ ์ด๋™ํ•˜๋Š” ์ „๋žต์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค [1]. ํ•œ ๋ฒˆ์— ๋ชจ๋“  ๊ฒƒ์„ ๋ณ€๊ฒฝํ•˜๋Š” ์œ„ํ—˜์„ ์ตœ์†Œํ™”ํ•˜๊ณ , ์•„ํ‚คํ…์ฒ˜๋ฅผ ํ˜„๋Œ€ํ™”ํ•˜๋Š” ๋™์•ˆ์—๋„ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ์„ ์ง€์†ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” **"์žฌ์ž‘์„ฑ(rewrite)์ด ์•„๋‹Œ ๋ฆฌํŒฉํ† ๋ง(refactor)"** ์ฒ ํ•™์— ๊ธฐ๋ฐ˜ํ•ฉ๋‹ˆ๋‹ค [1]. ๋Œ€ํ‘œ์ ์ธ ์˜ˆ๋กœ, Context API์—์„œ Zustand๋กœ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ์ „ํ™˜ํ•  ๋•Œ ์•Œ๋ฆผ๊ณผ ๊ฐ™์€ ๋‹จ์ˆœํ•œ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ ๊ฒฐ์ œ ํ๋ฆ„๊ณผ ๊ฐ™์€ ๋ณต์žกํ•œ ๋„๋ฉ”์ธ์œผ๋กœ ์ ์ง„์ ์œผ๋กœ ์˜์—ญ์„ ๋„“ํ˜€๊ฐ€๋Š” ๋ฐฉ์‹์ด ์žˆ์Šต๋‹ˆ๋‹ค [1]. + +## ๐Ÿ“– Core Content +* **์ „๋ฉด ์žฌ์ž‘์„ฑ์˜ ์œ„ํ—˜์„ฑ ํšŒํ”ผ:** ๊ธฐ์กด ๊ธฐ์ˆ ์—์„œ ์ƒˆ๋กœ์šด ๊ธฐ์ˆ ๋กœ ์ „ํ™˜ํ•  ๋•Œ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด๋ฅผ ํ•œ ๋ฒˆ์— ๊ฐˆ์•„์—Ž๋Š” ์ „๋ฉด ์žฌ์ž‘์„ฑ(complete rewrite)์€ ๋„ˆ๋ฌด ๋†’์€ ์œ„ํ—˜์„ ์ˆ˜๋ฐ˜ํ•ฉ๋‹ˆ๋‹ค. ์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์€ ์ด ๋ฆฌ์Šคํฌ๋ฅผ ์šฐํšŒํ•˜๋Š” ๊ถŒ์žฅ ์ ‘๊ทผ๋ฒ•์ž…๋‹ˆ๋‹ค [1]. +* **๋‹จ๊ณ„์  ์ „ํ™˜ (์Šคํ† ์–ด ๋‹จ์œ„ ์ด๋™):** ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์Šคํ† ์–ด(store)์”ฉ ์ด๋™ํ•˜๋Š” ๋ฐฉ์‹์ด ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค [1]. ์•Œ๋ฆผ(notifications)๊ณผ ๊ฐ™์€ ์ƒ๋Œ€์ ์œผ๋กœ ๋‹จ์ˆœํ•˜๊ณ  ๋…๋ฆฝ์ ์ธ ์œ ํ‹ธ๋ฆฌํ‹ฐ์„ฑ ์ƒํƒœ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ, ์ ์ง„์ ์œผ๋กœ ์žฅ๋ฐ”๊ตฌ๋‹ˆ๋‚˜ ์ฒดํฌ์•„์›ƒ ํ๋ฆ„(checkout flow) ๊ฐ™์€ ๋ณต์žกํ•œ ํ•ต์‹ฌ ๋„๋ฉ”์ธ์œผ๋กœ ์ „ํ™˜์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค [1]. +* **๊ธฐ๋Šฅ ๊ฐœ๋ฐœ๊ณผ ์•„ํ‚คํ…์ฒ˜ ํ˜„๋Œ€ํ™”์˜ ๋ณ‘ํ–‰:** ์ด ์ ‘๊ทผ๋ฒ•์˜ ํ•ต์‹ฌ์ ์ธ ์ด์ ์€ ๋ฆฌํŒฉํ† ๋ง ์ฒ ํ•™์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์‹œ์Šคํ…œ ๊ตฌ์กฐ๋ฅผ ํ˜„๋Œ€ํ™”ํ•˜๋Š” ์ค‘์—๋„ ๋น„์ฆˆ๋‹ˆ์Šค ์š”๊ตฌ์‚ฌํ•ญ์— ๋งž์ถ˜ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ์„ ์ค‘๋‹จ ์—†์ด ๊ณ„์†ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค [1]. +* **์ปค์Šคํ…€ ํ›…(Custom Hook)์„ ํ™œ์šฉํ•œ ๋ฆฌํŒฉํ† ๋ง ๋‹จ์œ„ํ™”:** ๋ชจ๋˜ React ํ™˜๊ฒฝ์—์„œ ๋ฆฌํŒฉํ† ๋ง์˜ ์ฃผ์š” ๋‹จ์œ„๋Š” ์ปค์Šคํ…€ ํ›…์ž…๋‹ˆ๋‹ค [2]. ๊ฑฐ๋Œ€ํ•œ ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ ๋กœ์ง์„ ์ถ”์ถœํ•ด ํ›…์œผ๋กœ ๋ถ„๋ฆฌํ•จ์œผ๋กœ์จ ๋ชจ๋“ˆ์„ฑ๊ณผ ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ์„ฑ์„ ๋†’์ด๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ์ ์ง„์ ์ธ ๊ตฌ์กฐ ๊ฐœ์„  ๋ฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์•ˆ์ „ํ•˜๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2]. + +## โš–๏ธ Trade-offs & Caveats +์†Œ์Šค ๋‚ด์—์„œ ์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ž์ฒด์˜ ์‹ฌ๊ฐํ•œ ๋ถ€์ž‘์šฉ์„ ๋ช…์‹œํ•˜๊ณ  ์žˆ์ง€๋Š” ์•Š์œผ๋‚˜, ์ „ํ™˜์„ ์‹œ๋„ํ•˜๋Š” ๊ธฐ์ˆ ๊ณผ ์กฐ์ง ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ฒฝ๋กœ(Migration Paths)๋ณ„ ๋‚œ์ด๋„์™€ ํ•œ๊ณ„๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค [3]. +* **๊ธฐ์ˆ  ์Šคํƒ๋ณ„ ์ „ํ™˜ ๋‚œ์ด๋„์˜ ์ฐจ์ด:** Context API์—์„œ Zustand๋กœ์˜ ์ „ํ™˜์€ ๋น„๊ต์  ์‰ฝ๋‹ค(Easy)๊ณ  ํ‰๊ฐ€๋˜์ง€๋งŒ, Zustand์—์„œ Redux๋กœ์˜ ์ ์ง„์  ์ „ํ™˜์€ ๊ณ ํ†ต์Šค๋Ÿฌ์šธ ์ˆ˜ ์žˆ์œผ๋ฉฐ(Painful), Redux์—์„œ Zustand๋กœ ์ „ํ™˜ํ•˜๋Š” ๊ฒƒ์€ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ์œ„ํ—˜(Possible but risky)์ด ๋”ฐ๋ฆ…๋‹ˆ๋‹ค [3]. +* **๊ธฐ์ˆ  ๋ณ€๊ฒฝ ์‹œ์ ์˜ ๋ชจํ˜ธํ•จ:** ๊ทœ๋ชจ ํ™•์žฅ ๋‹จ๊ณ„(Scaleup, 50-500๋ช…)์˜ ๊ธฐ์—…์—์„œ๋Š” Zustand ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋‹ค๊ฐ€ ํ•œ๊ณ„์— ๋ถ€๋”ชํž ๋•Œ Redux๋กœ์˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ๊ณ„ํšํ•ด์•ผ ํ•˜๋Š”๋ฐ [4], ์ด์ฒ˜๋Ÿผ ์–ธ์ œ ์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ๊ฒฐ๋‹จํ•˜๊ณ  ์‹œ์ž‘ํ•ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๊ตฌ์กฐ์  ๊ณ ๋ฏผ๊ณผ ์ „ํ™˜ ๋ถ€ํ•˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [๊ด€๊ณ„ ์œ ํ˜• A: ์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] +- [[Context API]] + - ์—ฐ๊ฒฐ ์ด์œ : ์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์˜ ์ฃผ์š” ์ถœ๋ฐœ์ (๋ ˆ๊ฑฐ์‹œ ๊ธฐ์ˆ ) ์‚ฌ๋ก€๋กœ ์†Œ์Šค์—์„œ ์–ธ๊ธ‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค [1]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ด์ „์˜ ๋ ˆ๊ฑฐ์‹œ ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ์–ด๋–ค ๋ฌธ์ œ๋ฅผ ๊ฒช๋Š”์ง€ ํŒŒ์•…ํ•˜๊ณ , ์™œ ๋‹จ์ˆœํ•œ ๋„๋ฉ”์ธ๋ถ€ํ„ฐ ์ „ํ™˜์„ ์‹œ์ž‘ํ•ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๋‹น์œ„์„ฑ์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[Zustand]] / [[Redux]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์˜ ๋ชฉ์ ์ง€ ๋˜๋Š” ์ „ํ™˜ ๊ฒฝ๋กœ์— ํ•ด๋‹นํ•˜๋Š” ์ƒํƒœ ๊ด€๋ฆฌ ๊ธฐ์ˆ ๋“ค์ž…๋‹ˆ๋‹ค [1, 3, 4]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ฐ ๊ธฐ์ˆ  ๊ฐ„์˜ ์ „ํ™˜์ด ์‰ฌ์šด์ง€(Easy), ๊ณ ํ†ต์Šค๋Ÿฌ์šด์ง€(Painful) ํŒŒ์•…ํ•˜์—ฌ ์กฐ์ง ๊ทœ๋ชจ์— ๋งž๋Š” ๋ชฉํ‘œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์–ด๋–ป๊ฒŒ ์„ค์ •ํ•˜๊ณ  ์ด๋™ํ•  ๊ฒƒ์ธ์ง€ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +#### [๊ด€๊ณ„ ์œ ํ˜• B: ๊ตฌํ˜„/๋ฆฌํŒฉํ† ๋ง ๋„๊ตฌ] +- [[Custom Hooks]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋ชจ๋˜ React์—์„œ ๊ตฌ์กฐ๋ฅผ ์ ์ง„์ ์œผ๋กœ ๋ณ€๊ฒฝํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” '๋ฆฌํŒฉํ† ๋ง์˜ ํ•ต์‹ฌ ๋‹จ์œ„(primary unit)'์ž…๋‹ˆ๋‹ค [2]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ฑฐ๋Œ€ํ•œ ์ปดํฌ๋„ŒํŠธ์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ UI์™€ ์–ด๋–ป๊ฒŒ ๋ถ„๋ฆฌํ•˜์—ฌ ๋ชจ๋“ˆ์„ฑ๊ณผ ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ์„ ํ™•๋ณดํ•˜๋Š”์ง€ ์‹ค๋ฌด์ ์ธ ๊ตฌํ˜„ ๊ด€์ ์—์„œ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### Deeper Research Questions +- ๊ธฐ์กด ์ƒํƒœ ๊ด€๋ฆฌ(์˜ˆ: Context API)์™€ ์‹ ๊ทœ ์ƒํƒœ ๊ด€๋ฆฌ(์˜ˆ: Zustand)๊ฐ€ ๊ณต์กดํ•˜๋Š” ์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ณผ์ •์—์„œ, ๋‘ ์ƒํƒœ ๊ฐ„์˜ ๋™๊ธฐํ™”๋‚˜ ์˜์กด์„ฑ์€ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•ด์•ผ ์•ˆ์ „ํ•œ๊ฐ€? +- Zustand์—์„œ Redux๋กœ์˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์ด ํŠนํžˆ "๊ณ ํ†ต์Šค๋Ÿฝ๋‹ค(Painful)"๊ณ  ํ‰๊ฐ€๋˜๋Š” ์•„ํ‚คํ…์ฒ˜์ , ๊ตฌํ˜„์  ์ฐจ์ด์ ์€ ๋ฌด์—‡์ธ๊ฐ€? +- ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜๊ณผ ์‹ ๊ทœ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ์„ ๋ณ‘ํ–‰ํ•  ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ธŒ๋žœ์น˜(Branch) ์ถฉ๋Œ์ด๋‚˜ ํ†ตํ•ฉ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ Git Workflow๋Š” ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑ๋˜์–ด์•ผ ํ•˜๋Š”๊ฐ€? +- ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ปค์Šคํ…€ ํ›… ๋‹จ์œ„๋กœ ๋กœ์ง์„ ๋ถ„๋ฆฌํ•˜๋Š” ๋ฆฌํŒฉํ† ๋ง์„ ์ง„ํ–‰ํ•  ๋•Œ ์„ฑ๋Šฅ ์ €ํ•˜(์˜ค๋ฒ„ํ—ค๋“œ)๋ฅผ ์œ ๋ฐœํ•˜์ง€ ์•Š๋Š” ์ตœ์ ํ™” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? +- ์‹œ์Šคํ…œ์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด, ํ•œ ๊ธฐ์ˆ ์—์„œ ๋‹ค๋ฅธ ๊ธฐ์ˆ ๋กœ์˜ '์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜'์ด ์ตœ์ข… ์™„๋ฃŒ๋˜์—ˆ๋‹ค๊ณ  ํŒ๋‹จํ•˜๋Š” ๊ธฐ์ค€(Definition of Done)์€ ์–ด๋–ป๊ฒŒ ์ •์˜ํ•ด์•ผ ํ•˜๋Š”๊ฐ€? + +### Practical Application Contexts +- **Implementation:** React ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ์ƒˆ๋กœ์šด ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋„์ž…ํ•  ๋•Œ, ์ „์ฒด๋ฅผ ๊ต์ฒดํ•˜์ง€ ์•Š๊ณ  ์—๋Ÿฌ ์•Œ๋ฆผ ๋“ฑ ์•„์ฃผ ๋…๋ฆฝ์ ์ธ ๋‹จ์œ„ ๊ธฐ๋Šฅ๋ถ€ํ„ฐ ์ƒˆ๋กœ์šด ์Šคํ† ์–ด์— ์—ฐ๊ฒฐํ•ด ๋‚˜๊ฐ€๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค [1]. +- **System Design:** ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ํ˜„๋Œ€ํ™”ํ•  ๋•Œ, ๋น…๋ฑ…(Big Bang) ๋ฐฉ์‹์ด ์•„๋‹ˆ๋ผ ๊ธฐ์กด ์„œ๋น„์Šค๊ฐ€ ์ง€์†์ ์œผ๋กœ ์šด์˜ ๋ฐ ํ™•์žฅ๋˜๋ฉด์„œ ๋ ˆ๊ฑฐ์‹œ์™€ ์‹ ๊ทœ ์•„ํ‚คํ…์ฒ˜๊ฐ€ ๊ณต์กดํ•  ์ˆ˜ ์žˆ๋Š” ์„ค๊ณ„ ์›์น™์„ ์ˆ˜๋ฆฝํ•ฉ๋‹ˆ๋‹ค [1]. +- **Operation / Maintenance:** ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ ๋ถ€์„œ์™€ ์•„ํ‚คํ…์ฒ˜ ๊ฐœ์„  ๋ถ€์„œ๊ฐ€ ๋ถ„๋ฆฌ๋˜์ง€ ์•Š๊ณ , ์œ ์ง€๋ณด์ˆ˜ ์ผ์ • ๋‚ด์—์„œ ๊ธฐ๋Šฅ ๋ฐฐํฌ์™€ ๊ธฐ์ˆ  ๋ถ€์ฑ„(Technical Debt) ๊ฐ์†Œ๋ฅผ ๋™์‹œ์— ์ด๋ค„๋‚ด๋„๋ก ์šด์˜ํ•ฉ๋‹ˆ๋‹ค [1]. +- **Learning Path:** ํฐ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ถ„ํ•ดํ•˜์—ฌ Custom Hook์œผ๋กœ ๋…๋ฆฝ์‹œํ‚ค๋Š” ์—ฐ์Šต์„ ํ†ตํ•ด, ํ–ฅํ›„ ์ฝ”๋“œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์— ํ•„์š”ํ•œ ๋ชจ๋“ˆํ™” ์—ญ๋Ÿ‰์„ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค [2]. +- **My Project Relevance:** ํ˜„์žฌ ์ง„ํ–‰ ์ค‘์ธ ํ”„๋กœ์ ํŠธ์—์„œ ๊ตฌํ˜• ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(๋˜๋Š” ํŒจํ„ด)๋ฅผ ์ตœ์‹  ๊ธฐ์ˆ ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•ด์•ผ ํ•˜๋Š” ํƒœ์Šคํฌ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ๋น„์ฆˆ๋‹ˆ์Šค ์˜ํ–ฅ์„ ์ตœ์†Œํ™”ํ•˜๋Š” ์ ์ง„์  ์ ์šฉ ๋กœ๋“œ๋งต์„ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### Adjacent Topics +- [[Technical Debt Management (๊ธฐ์ˆ  ๋ถ€์ฑ„ ๊ด€๋ฆฌ)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์€ ๊ฒฐ๊ณผ์ ์œผ๋กœ ๊ธฐ์ˆ  ๋ถ€์ฑ„๋ฅผ ํ†ต์ œํ•˜๊ณ  ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์—ฌ๋Ÿฌ ์ „๋žต ์ค‘ ํ•˜๋‚˜์ด๋ฏ€๋กœ, ์‹œ์Šคํ…œ์ด ๋…ธํ›„ํ™”๋จ์— ๋”ฐ๋ผ ๊ธฐ์ˆ  ๋ถ€์ฑ„๋ฅผ ์–ด๋–ป๊ฒŒ ์ธก์ •, ๊ด€๋ฆฌ, ์ƒํ™˜ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๋„“์€ ๊ด€์ ์˜ ์—”์ง€๋‹ˆ์–ด๋ง ์ „๋žต์œผ๋กœ ํ•™์Šต์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1]. + +--- +*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 new file mode 100644 index 00000000..83c8ea59 --- /dev/null +++ b/00_Raw/JSON-RPC 2.0.md @@ -0,0 +1,56 @@ +# [[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 new file mode 100644 index 00000000..fd73ce66 --- /dev/null +++ b/00_Raw/JavaScript Memory Management.md @@ -0,0 +1,66 @@ +# [[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/KISS.md b/00_Raw/KISS.md new file mode 100644 index 00000000..e1252ceb --- /dev/null +++ b/00_Raw/KISS.md @@ -0,0 +1,58 @@ +# [[KISS]] + +## ๐Ÿ“Œ Brief Summary +KISS("Keep It Simple, Stupid" ๋˜๋Š” "leave the code simple and dumb")๋Š” ๋ณต์žก์„ฑ๋ณด๋‹ค ๋‹จ์ˆœ์„ฑ์„ ํ•ญ์ƒ ์šฐ์„ ์‹œํ•ด์•ผ ํ•œ๋‹ค๋Š” ์†Œํ”„ํŠธ์›จ์–ด ์—”์ง€๋‹ˆ์–ด๋ง ์›์น™์ž…๋‹ˆ๋‹ค [1-3]. ๊ณผ๋„ํ•œ ์ถ”์ƒํ™”๋‚˜ ๋ถˆํ•„์š”ํ•œ ๋ณต์žก์„ฑ์„ ํ”ผํ•˜๊ณ , ์ฝ”๋“œ๋ฅผ ์ง๊ด€์ ์ด๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ณ  ๊ฐ„๋‹จํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์„ ํ•ต์‹ฌ ๋ชฉํ‘œ๋กœ ์‚ผ์Šต๋‹ˆ๋‹ค [2-4]. ์ด ์›์น™์€ ํŠนํžˆ ๋น ๋ฅธ ํ”„๋กœํ† ํƒ€์ดํ•‘(Quick prototyping)์ด๋‚˜ ๋‹จ์ˆœํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์— ์ ํ•ฉํ•˜๋ฉฐ, React ์ปดํฌ๋„ŒํŠธ ๊ฐœ๋ฐœ ์‹œ ์กฐ๊ธฐ ์ตœ์ ํ™”(premature optimization)๋ฅผ ํ”ผํ•˜๊ณ  ์˜ˆ์ธก ๊ฐ€๋Šฅ์„ฑ์„ ๋†’์ด๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค [1, 5]. + +## ๐Ÿ“– Core ์†Œ์Šค +* **๋‹จ์ˆœ์„ฑ ์ถ”๊ตฌ:** KISS ์›์น™์€ ์ฝ”๋“œ๋ฅผ "๋‹จ์ˆœํ•˜๊ณ  ๋ฉ์ฒญํ•˜๊ฒŒ(simple and dumb)" ๋‚จ๊ฒจ๋‘๋ผ๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค [3]. ์ฝ”๋“œ๋ฅผ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ค์ง€ ๋ง๊ณ , ํŠน์ • ํ•จ์ˆ˜๋‚˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋„ˆ๋ฌด ์ปค์งˆ ๊ฒฝ์šฐ ๋” ์ž‘๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ๋…ผ๋ฆฌ์ ์ธ ๋‹จ์œ„๋กœ ๋ถ„ํ• ํ•  ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค [3]. +* **๊ณผ๋„ํ•œ ์ถ”์ƒํ™” ๊ฒฝ๊ณ„:** ์ฝ”๋“œ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์ถ”์ƒํ™”๊ฐ€ ์›๋ž˜์˜ ์ค‘๋ณต ์ฝ”๋“œ๋ณด๋‹ค ์˜คํžˆ๋ ค ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์šธ ์ •๋„๋กœ ๋ณต์žกํ•ด์ง„๋‹ค๋ฉด, ์ด๋Š” ๋ชฉ์ ์„ ์žƒ๊ณ  KISS ์›์น™์„ ์œ„๋ฐ˜ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค [4]. +* **React์—์„œ์˜ ํ™œ์šฉ:** React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ปดํฌ๋„ŒํŠธ ๋กœ์ง์„ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๊ผฌ์ง€ ์•Š๊ณ  ๋ช…ํ™•ํžˆ ๊ตฌํ˜„ํ•จ์œผ๋กœ์จ, ์ฝ”๋“œ๊ฐ€ ์ƒํ˜ธ ๊ฐ„์— ๊ฒฐํ•ฉ๋˜์ง€ ์•Š๊ณ (decoupled) ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๋„๋ก(predictable) ์œ ์ง€ํ•˜๋Š” ๋ฐ ํ•„์ˆ˜์ ์ธ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค [1, 5]. + +## โš–๏ธ Trade-offs & Caveats +KISS ์›์น™์„ ์ค€์ˆ˜ํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ๊ฐ„๋‹จํ•˜๊ณ  ์ง์„ ์ ์ด์–ด์„œ ๋””๋ฒ„๊น…์ด ์‰ฌ์›Œ์ง„๋‹ค๋Š” ๊ฐ•๋ ฅํ•œ ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค [6]. + +๊ทธ๋Ÿฌ๋‚˜ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ•œ๊ณ„์™€ ์ œ์•ฝ ์‚ฌํ•ญ(Trade-offs)์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค: +* **๊ณผ๋„ํ•œ ๋‹จ์ˆœํ™”์˜ ์œ„ํ—˜:** ์ด ์›์น™์—๋งŒ ์ง€๋‚˜์น˜๊ฒŒ ๋ชฐ๋‘ํ•  ๊ฒฝ์šฐ ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ… ์ž์ฒด๋ฅผ ๋„ˆ๋ฌด ๋‹จ์ˆœํ™”(oversimplify)ํ•˜์—ฌ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑ์‹œํ‚ค์ง€ ๋ชปํ•˜๊ฑฐ๋‚˜ ๋ฏธ๋ž˜์˜ ํ™•์žฅ์„ฑ์„ ๋–จ์–ด๋œจ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [6]. +* **DRY ์›์น™๊ณผ์˜ ์ถฉ๋Œ:** "์ž์‹ ์„ ๋ฐ˜๋ณตํ•˜์ง€ ๋ง๋ผ"๋Š” DRY(Don't Repeat Yourself) ์›์น™๊ณผ ์ข…์ข… ๊ท ํ˜•์„ ์ด๋ฃจ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ค‘๋ณต์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์ฝ”๋“œ๋ฅผ ๊ณ„์† ์ถ”์ƒํ™”ํ•˜๋‹ค ๋ณด๋ฉด ๋ณต์žก์„ฑ์ด ์ฆ๊ฐ€ํ•˜์—ฌ ๊ฒฐ๊ตญ KISS ์›์น™์„ ์–ด๊ธฐ๊ฒŒ ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์ ์ ˆํ•œ ์„ ์—์„œ ๋‹จ์ˆœ์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ํ†ต์ฐฐ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค [4]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [์†Œํ”„ํŠธ์›จ์–ด ์„ค๊ณ„ ์›์น™ (Software Design Principles)] +- [[DRY (Don't Repeat Yourself)]] + - ์—ฐ๊ฒฐ ์ด์œ : ์ฝ”๋“œ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด KISS์™€ ํ•จ๊ป˜ ์–ธ๊ธ‰๋˜๋Š” ํ•ต์‹ฌ ์›์น™์ž…๋‹ˆ๋‹ค. ๊ณผ๋„ํ•œ DRY ์ ์šฉ์€ KISS ์œ„๋ฐ˜์œผ๋กœ ์ด์–ด์ง€๋ฏ€๋กœ ์ƒํ˜ธ ๋ณด์™„์ ์ธ ๊ด€๊ณ„์— ์žˆ์Šต๋‹ˆ๋‹ค [2, 4]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ฝ”๋“œ ์ค‘๋ณต ์ œ๊ฑฐ์™€ ์ถ”์ƒํ™”์˜ ๋ณต์žก์„ฑ ์‚ฌ์ด์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๊ธฐ์ˆ ์  ํŠธ๋ ˆ์ด๋“œ์˜คํ”„ [4]. + +- [[YAGNI (You Aren't Gonna Need It)]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋‹น์žฅ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ธฐ๋Šฅ์€ ์ถ”๊ฐ€ํ•˜์ง€ ๋ง๋ผ๋Š” ์›์น™์œผ๋กœ, ๋ถˆํ•„์š”ํ•œ ๋กœ์ง์„ ๋ฐฐ์ œํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ๋‹จ์ˆœํ•˜๊ฒŒ ์œ ์ง€ํ•œ๋‹ค๋Š” ์ ์—์„œ KISS ์›์น™์˜ ์ฒ ํ•™๊ณผ ๊นŠ์ด ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค [2, 7]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์• ์ž์ผ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์ด๋‚˜ ์š”๊ตฌ ์‚ฌํ•ญ์ด ๋ณ€ํ•˜๋Š” ์Šคํƒ€ํŠธ์—… ํ”„๋กœ์ ํŠธ์—์„œ ๋ถˆํ•„์š”ํ•œ ์ž‘์—…๊ณผ ์กฐ๊ธฐ ์ตœ์ ํ™”๋ฅผ ํ”ผํ•˜๋Š” ๋ฐฉ๋ฒ• [2, 5]. + +#### [React ๊ตฌํ˜„ ๋ฐ ์ฝ”๋“œ ํ’ˆ์งˆ (Implementation & Code Quality)] +- [[Clean Code]] + - ์—ฐ๊ฒฐ ์ด์œ : KISS ์›์น™์„ ์ ์šฉํ•˜๋Š” ๊ถ๊ทน์ ์ธ ๋ชฉ์ ์€ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฝ๊ณ  ๊ฐ€๋…์„ฑ์ด ๋†’์€ ํด๋ฆฐ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [2]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ณต์žก์„ฑ์„ ๋ฐฐ์ œํ•˜๊ณ  ์ค‘์ฒฉ ๊ตฌ์กฐ๋ฅผ ํ”ผํ•˜๋ฉฐ ๋ช…ํ™•ํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์‹ค๋ฌด์ ์ธ ๊ฐ€์ด๋“œ๋ผ์ธ [2, 8]. + +### Deeper Research Questions + +- React ์ปดํฌ๋„ŒํŠธ๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ KISS ์›์น™์„ ์œ„๋ฐ˜ํ•˜๋Š” '๊ณผ๋„ํ•œ ์ถ”์ƒํ™”'์˜ ๊ตฌ์ฒด์ ์ธ ํŒ๋‹จ ๊ธฐ์ค€์€ ๋ฌด์—‡์ธ๊ฐ€? [4] +- KISS ์›์น™๊ณผ DRY ์›์น™์ด ์ถฉ๋Œํ•  ๋•Œ, ์–ด๋А ์‹œ์ ์— ์ถ”์ƒํ™”๋ฅผ ๋ฉˆ์ถ”๊ณ  ์ฝ”๋“œ ์ค‘๋ณต์„ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์ด ์œ ์ง€๋ณด์ˆ˜์— ๋” ์œ ๋ฆฌํ•œ๊ฐ€? [4] +- KISS ์›์น™์„ ๊ณ ์ˆ˜ํ•˜์—ฌ ํ•ด๊ฒฐ์ฑ…์„ '๊ณผ๋„ํ•˜๊ฒŒ ๋‹จ์ˆœํ™”(oversimplify)'ํ–ˆ์„ ๋•Œ, ํ”„๋กœ์ ํŠธ์˜ ํ™•์žฅ์„ฑ(Scalability) ์ธก๋ฉด์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์ฒด์ ์ธ ํ•œ๊ณ„๋Š” ๋ฌด์—‡์ธ๊ฐ€? [6] +- ๋น ๋ฅด๊ณ  ๋‹จ์ˆœํ•œ ํ”„๋กœํ† ํƒ€์ดํ•‘์„ ์œ„ํ•ด KISS ์›์น™์„ ์ฃผ๋กœ ์ ์šฉํ•œ ์ดํ›„, ๋Œ€๊ทœ๋ชจ ์•„ํ‚คํ…์ฒ˜๋กœ ์ ์ง„์ ์œผ๋กœ ํ™•์žฅํ•˜๋ ค๋ฉด ์–ด๋–ค ๊ตฌ์กฐ์  ๋ณ€ํ™”๊ฐ€ ํ•„์š”ํ•œ๊ฐ€? [5] +- ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋น„๋Œ€ํ•ด์งˆ ๋•Œ KISS ์›์น™์— ๋”ฐ๋ผ "์ž‘๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ๋…ผ๋ฆฌ์  ๋ถ€๋ถ„"์œผ๋กœ ๋ถ„ํ• ํ•˜๊ธฐ ์œ„ํ•œ React ์ƒํƒœ๊ณ„์˜ ์ตœ์ ์˜ ํŒจํ„ด์€ ๋ฌด์—‡์ธ๊ฐ€? [3] + +### Practical Application Contexts + +- **Implementation:** React ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ, ๋กœ์ง์„ ๋‹จ์ˆœํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ณ  ์กฐ๊ธฐ ์ตœ์ ํ™”๋ฅผ ์ง€์–‘ํ•ฉ๋‹ˆ๋‹ค. ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋„ˆ๋ฌด ์ปค์ง€๋ฉด ๋” ์ž‘๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ํ•จ์ˆ˜๋‚˜ ๋‹จ์œ„๋กœ ๋‚˜๋ˆ•๋‹ˆ๋‹ค [3, 5]. +- **System Design:** ๋น ๋ฅด๊ณ  ๊ฐ„๋‹จํ•œ ํ”„๋กœํ† ํƒ€์ดํ•‘(Quick prototyping)์ด๋‚˜ ๊ตฌ์กฐ๊ฐ€ ๋‹จ์ˆœํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์„ค๊ณ„ํ•  ๋•Œ ์ฃผ๋œ ์›์น™์œผ๋กœ ์ฑ„ํƒ๋ฉ๋‹ˆ๋‹ค [5]. +- **Operation / Maintenance:** ์ฝ”๋“œ๋ฅผ ์ง์„ ์ ์ด๊ณ  ๋ฐ”๋ณด ๊ฐ™์„ ์ •๋„๋กœ ๋‹จ์ˆœํ•˜๊ฒŒ ์œ ์ง€ํ•˜์—ฌ, ๋ฒ„๊ทธ ๋ฐœ์ƒ ์‹œ ๋น ๋ฅด๊ณ  ์‰ฝ๊ฒŒ ๋””๋ฒ„๊น…ํ•  ์ˆ˜ ์žˆ๋„๋ก ์šด์˜ ํ™˜๊ฒฝ์„ ๊ฐœ์„ ํ•ฉ๋‹ˆ๋‹ค [3, 6]. +- **Learning Path:** ๋ณต์žก์„ฑ์„ ๋œ์–ด๋‚ด๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šฐ๊ธฐ ์œ„ํ•ด SOLID, DRY, YAGNI ๋“ฑ๊ณผ ํ•จ๊ป˜ ํ”„๋ก ํŠธ์—”๋“œ ์—”์ง€๋‹ˆ์–ด๋ง์˜ ํ•„์ˆ˜ ๊ธฐ์ดˆ ์„ค๊ณ„ ์›์น™์œผ๋กœ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค [1, 9]. +- **My Project Relevance:** React ํ”„๋กœ์ ํŠธ์—์„œ ์ฝ”๋“œ๋ฅผ ๋ฆฌํŒฉํ„ฐ๋งํ•  ๋•Œ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ณต์žกํ•ด์ง„ ๊ณตํ†ต ํ›…(Hook)์ด๋‚˜ ์œ ํ‹ธ๋ฆฌํ‹ฐ๊ฐ€ ์—†๋Š”์ง€ ์ ๊ฒ€ํ•˜๊ณ , ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์šด ์ฝ”๋“œ๋Š” ์ง๊ด€์ ์œผ๋กœ ์žฌ์ž‘์„ฑํ•˜๋Š” ๋ฐ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [4, 5]. + +### Adjacent Topics + +- [[SOLID Principles]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋‹จ์ˆœ์„ฑ์„ ๋„˜์–ด์„œ, ํฌ๊ณ  ๋ณต์žกํ•œ ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์š”๊ตฌํ•˜๋Š” ๊ตฌ์กฐํ™” ๋ฐ ํ™•์žฅ์„ฑ์„ ์ถฉ์กฑํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ์ฒด์ง€ํ–ฅ/ํ•จ์ˆ˜ํ˜• ์„ค๊ณ„ ์›์น™(๋‹จ์ผ ์ฑ…์ž„ ์›์น™, ์˜์กด์„ฑ ์—ญ์ „ ๋“ฑ)์ด ์–ด๋–ป๊ฒŒ ํ•จ๊ป˜ ์กฐํ™”๋ฅผ ์ด๋ฃจ๋Š”์ง€ ํƒ๊ตฌํ•ฉ๋‹ˆ๋‹ค [5, 9, 10]. + +--- +*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 new file mode 100644 index 00000000..135fc56a --- /dev/null +++ b/00_Raw/Large-scale React Applications.md @@ -0,0 +1,84 @@ +# [[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/Legacy Codebase Refactoring.md b/00_Raw/Legacy Codebase Refactoring.md new file mode 100644 index 00000000..fa8d378d --- /dev/null +++ b/00_Raw/Legacy Codebase Refactoring.md @@ -0,0 +1,70 @@ +# [[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/Legacy React Codebase Modernization.md b/00_Raw/Legacy React Codebase Modernization.md new file mode 100644 index 00000000..4001bf46 --- /dev/null +++ b/00_Raw/Legacy React Codebase Modernization.md @@ -0,0 +1,70 @@ +# [[Legacy React Codebase Modernization]] + +## ๐Ÿ“Œ Brief Summary +๋ ˆ๊ฑฐ์‹œ ๋ฆฌ์•กํŠธ ์ฝ”๋“œ๋ฒ ์ด์Šค ํ˜„๋Œ€ํ™”(Legacy React Codebase Modernization)๋Š” ์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ํ™•์žฅ์„ฑ์„ ํ™•๋ณดํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ์กด์˜ ๋‚ก์€ ์ฝ”๋“œ๋ฅผ ์ตœ์‹  ๋ฆฌ์•กํŠธ ํ‘œ์ค€๊ณผ ์•„ํ‚คํ…์ฒ˜๋กœ ๊ฐœ์„ ํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค. ์ด ์ž‘์—…์€ ์•ˆ์ „ํ•œ ๋ณ€๊ฒฝ์„ ์œ„ํ•œ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ์„ ์‹œ์ž‘์œผ๋กœ, ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์˜ ํ•จ์ˆ˜ํ˜• ์ „ํ™˜, ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ(TypeScript) ๋„์ž…, ๊ทธ๋ฆฌ๊ณ  ์„œ๋ฒ„ ๋ฐ ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ์˜ ์ตœ์ ํ™”๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ํ•œ ๋ฒˆ์— ๋ชจ๋“  ๊ฒƒ์„ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๋Š” ์œ„ํ—˜์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์ปค์Šคํ…€ ํ›…์„ ํ™œ์šฉํ•˜์—ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋ถ„๋ฆฌํ•˜๋Š” ๋“ฑ ์ ์ง„์ ์ธ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜(Incremental Migration) ๋ฐฉ์‹์„ ์ฑ„ํƒํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค. [1-3] + +## ๐Ÿ“– Core Content +* **ํ…Œ์ŠคํŠธ ๊ธฐ๋ฐ˜ ์ ‘๊ทผ (Test-Driven Approach)**: + ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฅผ ํ˜„๋Œ€ํ™”ํ•˜๊ธฐ ์ „์— ๊ฐ€์žฅ ๋จผ์ € ํ•ด์•ผ ํ•  ์ผ์€ ์œ ๋‹› ํ…Œ์ŠคํŠธ(Unit Test)๋‚˜ UI ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์ฝ”๋“œ ๊ตฌ์กฐ ๋ณ€๊ฒฝ ์ค‘ ๊ธฐ์กด ๊ธฐ๋Šฅ์ด ๋ง๊ฐ€์ง€๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ณ , ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ธฐ์กด ์ฝ”๋“œ์˜ ๋™์ž‘ ๋ฐฉ์‹์„ ์ •ํ™•ํžˆ ์ดํ•ดํ•˜๋„๋ก ๋•๋Š” ๋ฐฉ์–ด์„  ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค [2, 4, 5]. +* **์ตœ์‹  ๋ฆฌ์•กํŠธ ํŒจํ„ด ์ ์šฉ**: + ๊ณผ๊ฑฐ์˜ ํด๋ž˜์Šค ๊ธฐ๋ฐ˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์™€ ํ›…(Hooks)์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋ฐ˜์ด๋ผ๋ฉด ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ(TypeScript)๋ฅผ ๋„์ž…ํ•˜์—ฌ ํƒ€์ž… ์•ˆ์ •์„ฑ์„ ํ™•๋ณดํ•˜๊ณ , ๋ถˆํ•„์š”ํ•œ `useEffect` ์‚ฌ์šฉ์„ ์ œ๊ฑฐํ•˜์—ฌ ์ตœ์‹  ๋ฆฌ์•กํŠธ ๋ฐ ๊ด€๋ จ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฒ„์ „์œผ๋กœ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [3]. +* **์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ์˜ ๋ถ„๋ฆฌ ๋ฐ ํ˜„๋Œ€ํ™”**: + ์ „์—ญ ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ์™€ ์„œ๋ฒ„ ์ƒํƒœ๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค. ๋ฌด๊ฑฐ์šด Redux ๊ตฌํ˜„์ฒด๋ฅผ ์ œ๊ฑฐํ•˜๊ณ , ์„œ๋ฒ„ ์ƒํƒœ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด TanStack Query (React Query)๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค [3]. ๋‚จ์€ ํด๋ผ์ด์–ธํŠธ์˜ ๋กœ์ปฌ/์ „์—ญ ์ƒํƒœ๋Š” Context API๋‚˜ Zustand๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๊ด€๋ฆฌ ๋ฒ”์œ„๋ฅผ ๋ช…ํ™•ํžˆ ํ•ฉ๋‹ˆ๋‹ค [3]. +* **์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ (Incremental Migration)**: + ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด๋ฅผ ํ•œ ๋ฒˆ์— ์žฌ์ž‘์„ฑ(Rewrite)ํ•˜๋Š” ๊ฒƒ์€ ์œ„ํ—˜ํ•˜๋ฏ€๋กœ, ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์ƒํƒœ ์Šคํ† ์–ด๋‚˜ ๋ชจ๋“ˆ์”ฉ ์ „ํ™˜ํ•˜๋Š” ์ ์ง„์  ๋ฐฉ์‹์ด ์„ ํ˜ธ๋ฉ๋‹ˆ๋‹ค [1]. ์ด๋ฅผ ์œ„ํ•ด ๊ฑฐ๋Œ€ํ•œ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋ถ„๋ฆฌํ•˜์—ฌ ์ปค์Šคํ…€ ํ›…(Custom Hooks)์œผ๋กœ ์ถ”์ถœํ•˜๋Š” ๊ฒƒ์ด ๋ฆฌํŒฉํ„ฐ๋ง์˜ ์ฃผ์š” ๋‹จ์œ„๊ฐ€ ๋ฉ๋‹ˆ๋‹ค [6, 7]. +* **์ฝ”๋“œ ํ’ˆ์งˆ ๋„๊ตฌ์˜ ๋„์ž… ๋ฐ ํ‘œ์ค€ํ™”**: + ์ผ๊ด€์„ฑ ์—†๋Š” ์ฝ”๋“œ๋ฅผ ์ •๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ESLint์™€ ๊ฐ™์€ ์ •์  ๋ถ„์„ ๋„๊ตฌ(์˜ˆ: `eslint-plugin-react`, `eslint-plugin-react-hooks`)๋ฅผ ๋„์ž…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [8]. ์ด์™€ ํ•จ๊ป˜ ์ผ๊ด€์„ฑ ์—†์ด ์ž‘์„ฑ๋œ CSS ๊ทœ์น™(์™ธ๋ถ€ CSS, ์ปดํฌ๋„ŒํŠธ CSS ๋“ฑ)์„ ๋‹จ์ผํ•œ ํ‘œ์ค€ ๋ฐฉ์‹์œผ๋กœ ํ†ต์ผํ•˜์—ฌ ์˜ˆ์ธก ๊ฐ€๋Šฅ์„ฑ์„ ๋†’์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค [9-11]. + +## โš–๏ธ Trade-offs & Caveats +* **์ ์ง„์  ๊ฐœ์„  vs ์ „๋ฉด ์žฌ์ž‘์„ฑ (Incremental Refactoring vs. Full Rewrite)**: + ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ์˜ ๊ทœ๋ชจ๊ฐ€ ์ž‘๋‹ค๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ฒ˜์Œ๋ถ€ํ„ฐ ์™„์ „ํžˆ ์ƒˆ๋กœ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฌ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [4]. ๊ทธ๋Ÿฌ๋‚˜ ๊ทœ๋ชจ๊ฐ€ ํฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์™„์ „ํ•œ ์žฌ์ž‘์„ฑ์„ ์‹œ๋„ํ•˜๋Š” ๊ฒƒ์€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๋ˆ„๋ฝ ๋ฐ ์‹ฌ๊ฐํ•œ ์œ„ํ—˜์„ ์ˆ˜๋ฐ˜ํ•˜๋ฏ€๋กœ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ๊ณผ ๋ณ‘ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ ์ง„์  ๊ฐœ์„ ์„ ์„ ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [1]. +* **TypeScript ๋„์ž…์˜ ๋ณต์žก์„ฑ ์ฆ๊ฐ€**: + ์•ˆ์ •์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด TypeScript๋ฅผ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์€ ๊ฐ•๋ ฅํžˆ ๊ถŒ์žฅ๋˜์ง€๋งŒ, ์ต์ˆ™ํ•˜์ง€ ์•Š์€ ๊ฐœ๋ฐœ์ž์—๊ฒŒ๋Š” ์ธ์ง€์  ์˜ค๋ฒ„ํ—ค๋“œ์™€ ๋ณต์žก์„ฑ์˜ ์ƒˆ๋กœ์šด ์ธต์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ „์ฒด ์ ์šฉ๋ณด๋‹ค๋Š” ํŒŒ์ผ ๋‹จ์œ„๋กœ ์ ์ฐจ์ ์œผ๋กœ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์ด ๋” ์•ˆ์ „ํ•œ ์„ ํƒ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [12]. +* **์ƒํƒœ ๊ด€๋ฆฌ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋น„์šฉ**: + Context API์—์„œ Zustand๋กœ์˜ ์ „ํ™˜์€ ๋น„๊ต์  ์ˆ˜์›”ํ•˜์ง€๋งŒ, ๋ณต์žก๋„๊ฐ€ ์ฆ๊ฐ€ํ•ด Zustand์—์„œ Redux๋กœ ๋„˜์–ด๊ฐ€๊ฑฐ๋‚˜, ๋ฐ˜๋Œ€๋กœ Redux์—์„œ Zustand๋กœ ์ „ํ™˜ํ•˜๋Š” ๊ณผ์ •์€ ์ฝ”๋“œ๋ฒ ์ด์Šค ์ „์ฒด์˜ ์•„ํ‚คํ…์ฒ˜์— ๊นŠ๊ฒŒ ๊ด€์—ฌํ•˜๋ฏ€๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์ด ๋งค์šฐ ๊ณ ํ†ต์Šค๋Ÿฝ๊ฑฐ๋‚˜(Painful) ์œ„ํ—˜(Risky)ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [13]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [๊ด€๊ณ„ ์œ ํ˜• A: ์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] +- [[Incremental Migration]] + - ์—ฐ๊ฒฐ ์ด์œ : ์ฝ”๋“œ๋ฅผ ๋ฆฌํŒฉํ„ฐ๋งํ•  ๋•Œ ๋ฐ˜๋“œ์‹œ ๋”ฐ๋ผ์•ผ ํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก ์ด์ž ์ฒ ํ•™์ž…๋‹ˆ๋‹ค. [1] + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ธฐ์กด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋™์ž‘์„ ๋ง๊ฐ€๋œจ๋ฆฌ์ง€ ์•Š๊ณ , ๋‹จ์ผ ์ปค์Šคํ…€ ํ›…์ด๋‚˜ ์Šคํ† ์–ด ๋‹จ์œ„๋กœ ์ฝ”๋“œ๋ฅผ ๋ถ„๋ฆฌํ•˜๋ฉฐ ์•ˆ์ „ํ•˜๊ฒŒ ํ˜„๋Œ€ํ™”ํ•˜๋Š” ์ „๋žต์„ ํ•™์Šตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[Single Responsibility Principle (SRP)]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋ ˆ๊ฑฐ์‹œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ฐ€์ง€๋Š” ๋ณตํ•ฉ์ ์ธ ์ฑ…์ž„(์ƒํƒœ ๊ด€๋ฆฌ, ๋ Œ๋”๋ง, ๋ฐ์ดํ„ฐ ํŽ˜์นญ ๋“ฑ)์„ ์ชผ๊ฐœ๋Š” ํ•ต์‹ฌ ์ฒ™๋„์ž…๋‹ˆ๋‹ค. [14] + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ณต์žกํ•˜๊ณ  ๊ฑฐ๋Œ€ํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์™œ ์ž‘๊ณ  ๋…๋ฆฝ์ ์ธ ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ๋‚˜ ํ›…์œผ๋กœ ๋‚˜๋ˆ„์–ด์•ผ ํ•˜๋Š”์ง€ ๊ทธ ๊ทผ๋ณธ์ ์ธ ์ด์œ ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +#### [๊ด€๊ณ„ ์œ ํ˜• B: ๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ] +- [[Unit Testing]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋ฆฌํŒฉํ„ฐ๋ง ์ž‘์—… ์ „์— ๊ธฐ์กด ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋ณดํ˜ธํ•˜๊ธฐ ์œ„ํ•ด ์„ ํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค. [2, 5] + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์•ˆ์ „ํ•œ ์ฝ”๋“œ ๋ฆฌํŒฉํ„ฐ๋ง ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•˜๊ณ , ์ฝ”๋“œ๊ฐ€ ์˜ˆ์ƒ๋Œ€๋กœ ๋™์ž‘ํ•˜๋Š”์ง€ ๊ฒ€์ฆํ•˜์—ฌ ํšŒ๊ท€ ๋ฒ„๊ทธ(Regression)๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[TanStack Query]] + - ์—ฐ๊ฒฐ ์ด์œ : ๊ธฐ์กด์˜ ๋น„ํšจ์œจ์ ์ธ ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ(์˜ˆ: Redux)์—์„œ ์„œ๋ฒ„ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ๋œ์–ด๋‚ด์–ด ๊ตฌ์กฐ๋ฅผ ์ตœ์‹ ํ™”ํ•˜๋Š” ํ•ต์‹ฌ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. [3, 15] + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ์™€ ์„œ๋ฒ„ API ์ƒํƒœ๋ฅผ ์ฒ ์ €ํ•˜๊ฒŒ ๋ถ„๋ฆฌํ•จ์œผ๋กœ์จ ์ปดํฌ๋„ŒํŠธ ๋ฐ ๋กœ์ง์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๋Š” ๋ฐฉ์‹์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[ESLint]] + - ์—ฐ๊ฒฐ ์ด์œ : ์ฝ”๋“œ ํ’ˆ์งˆ๊ณผ ๋ฆฌ์•กํŠธ์˜ ๊ถŒ์žฅ ์‚ฌํ•ญ(Hooks ๊ทœ์น™ ๋“ฑ)์„ ์ž๋™์œผ๋กœ ๊ฐ•์ œํ•˜์—ฌ ๊ธฐ์ˆ  ๋ถ€์ฑ„๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. [8, 16] + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ž๋™ํ™”๋œ ์ •์  ๋ถ„์„์„ ํ†ตํ•ด ๋‹ค์ˆ˜์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ํ˜„๋Œ€ํ™”๋œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋„๋ก ๊ด€๋ฆฌํ•˜๋Š” ๊ฑฐ๋ฒ„๋„Œ์Šค ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### Deeper Research Questions +- ๋ ˆ๊ฑฐ์‹œ ํด๋ž˜์Šค ๊ธฐ๋ฐ˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์™€ ํ›…(Hooks)์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ๋•Œ, ๋ถ€์ž‘์šฉ์„ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ์•ˆ์ „ํ•œ ๋””์ž์ธ ํŒจํ„ด๊ณผ ์ ์ง„์  ์ ์šฉ ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? +- ๊ธฐ์กด์˜ ๋ณต์žกํ•œ Context API ๋˜๋Š” Redux ์ƒํƒœ๋ฅผ ์„œ๋ฒ„ ์ƒํƒœ(TanStack Query)์™€ ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ(Zustand ๋“ฑ)๋กœ ๋ถ„ํ• ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๊ฐ€์žฅ ํ”ํ•œ ์ถฉ๋Œ ํฌ์ธํŠธ์™€ ํ•ด๊ฒฐ์ฑ…์€ ๋ฌด์—‡์ธ๊ฐ€? +- ๋Œ€๊ทœ๋ชจ JavaScript ๊ธฐ๋ฐ˜ React ํ”„๋กœ์ ํŠธ์— TypeScript๋ฅผ ์ ์ง„์ ์œผ๋กœ ๋„์ž…ํ•  ๋•Œ, ํŒŒ์ผ ๊ฐ„ ์˜์กด์„ฑ์— ๋”ฐ๋ฅธ ํƒ€์ž… ์˜ค๋ฅ˜ ํญํฌ(Type Error Cascade) ํ˜„์ƒ์„ ์–ด๋–ป๊ฒŒ ์–ต์ œํ•  ๊ฒƒ์ธ๊ฐ€? +- ๋‹จ์œ„ ํ…Œ์ŠคํŠธ(Unit Testing) ์ปค๋ฒ„๋ฆฌ์ง€๊ฐ€ ๋งค์šฐ ๋‚ฎ๊ฑฐ๋‚˜ ์ „๋ฌดํ•œ ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ, ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ํŒŒ์•…ํ•˜๊ณ  ์ตœ์šฐ์„ ์ ์œผ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š” ๊ธฐ์ค€์€ ์–ด๋–ป๊ฒŒ ์„ค์ •ํ•ด์•ผ ํ•˜๋Š”๊ฐ€? +- ๋น„๋Œ€ํ•œ ๋‹จ์ผ ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ถ„๋ฆฌํ•  ๋•Œ, 'KISS'์™€ 'DRY' ์›์น™ ๊ฐ„์˜ ์ถฉ๋Œ(์ง€๋‚˜์นœ ์ถ”์ƒํ™”๋กœ ์ธํ•œ ๋ณต์žก๋„ ์ฆ๊ฐ€)์„ ์˜ˆ๋ฐฉํ•˜๊ธฐ ์œ„ํ•œ ๊ตฌ์ฒด์ ์ธ ๊ฐ€์ด๋“œ๋ผ์ธ์€ ๋ฌด์—‡์ธ๊ฐ€? + +### Practical Application Contexts +- **Implementation:** ๋น„๋Œ€ํ•ด์ง„ ๊ธฐ์กด ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ถ„์„ํ•˜์—ฌ UI ํŒŒํŠธ์™€ ๋กœ์ง ํŒŒํŠธ๋ฅผ ๋ถ„๋ฆฌํ•˜๊ณ , ๋ถˆํ•„์š”ํ•œ `useEffect`๋ฅผ ๊ฑท์–ด๋‚ธ ๋’ค `useMemo`, `useCallback`๊ณผ ์ปค์Šคํ…€ ํ›…์„ ํ™œ์šฉํ•˜์—ฌ ๊ธฐ๋Šฅ๋ณ„๋กœ ์žฌ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. [3, 6] +- **System Design:** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํƒœ๋ฅผ ๋„๋ฉ”์ธ์— ๋”ฐ๋ผ ๋ถ„๋ฆฌ ๊ธฐํšํ•ฉ๋‹ˆ๋‹ค. UI ํ† ๊ธ€์ด๋‚˜ ํ…Œ๋งˆ ๊ฐ™์€ ๋‹จ์ˆœ ์ƒํƒœ๋Š” Context API๋ฅผ, ๋‹ค์ด๋‚˜๋ฏนํ•œ ์ƒํƒœ๋Š” Zustand๋ฅผ, API ์‘๋‹ต ๋ฐ์ดํ„ฐ๋Š” TanStack Query๋กœ ๋ถ„์‚ฐ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค. [3, 17, 18] +- **Operation / Maintenance:** ESLint(eslint-plugin-react ๋“ฑ)๋ฅผ ํŒŒ์ดํ”„๋ผ์ธ์— ๊ตฌ์ถ•ํ•˜์—ฌ ๊ฐœ๋ฐœ์ž๋“ค์ด ๊ธฐ์กด ์Šคํƒ€์ผ์ด ์•„๋‹Œ ์ƒˆ๋กœ์šด React Hooks์˜ ๊ทœ์น™์„ ๊ฐ•์ œ์ ์œผ๋กœ ์ค€์ˆ˜ํ•˜๋„๋ก ์šด์˜ํ•ฉ๋‹ˆ๋‹ค. [8] +- **Learning Path:** ๋ฆฌ์•กํŠธ์˜ ๊ธฐ๋ณธ ์›๋ฆฌ ํ•™์Šต ํ›„ -> ์†Œํ˜• ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ ๋ฐฉ๋ฒ• -> TypeScript ์ ์šฉ๋ฒ• -> ํด๋ผ์ด์–ธํŠธ/์„œ๋ฒ„ ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ ํŒจ๋Ÿฌ๋‹ค์ž„ ์ฐจ์ด๋กœ ํ™•์žฅํ•ด ๋‚˜๊ฐ€๋Š” ์ˆœ์„œ๋กœ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค. [2, 3, 12] +- **My Project Relevance:** ํ˜„์žฌ ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ณ  ์žˆ๋Š” ๋ณต์žกํ•œ ๊ธฐ์กด React ์‹œ์Šคํ…œ์˜ ๊ฐœํŽธ ์ž‘์—…์—์„œ 'ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€ ํ™•๋ณด -> TS ๋„์ž… -> ์ƒํƒœ ๋„๊ตฌ ๋ถ„๋ฆฌ -> ์ปค์Šคํ…€ ํ›… ์ถ”์ƒํ™”' ์ˆœ์˜ ์•ˆ์ •์ ์ธ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋กœ๋“œ๋งต์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### Adjacent Topics +- [[Feature-Sliced Design]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ํด๋” ๋ฐ ํŒŒ์ผ ๊ตฌ์กฐ๋ฅผ ๊ธฐ๋Šฅ(Feature)๊ณผ ๋„๋ฉ”์ธ ์ค‘์‹ฌ์œผ๋กœ ์ฒ ์ €ํžˆ ๋ถ„๋ฆฌํ•˜์—ฌ, ๋ฆฌํŒฉํ„ฐ๋ง ์ดํ›„์˜ ์ง€์† ๊ฐ€๋Šฅํ•œ ํด๋” ๊ตฌ์กฐ ์•„ํ‚คํ…์ฒ˜๋กœ ํ™•์žฅ ํ•™์Šตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[React Compiler]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: React 19์˜ ๋“ฑ์žฅ๊ณผ ํ•จ๊ป˜, ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ์— ์ˆ˜๋™์œผ๋กœ ์ž‘์„ฑ๋œ ๋ฉ”๋ชจ์ด์ œ์ด์…˜(`React.memo`, `useMemo`)์„ ์ž๋™์œผ๋กœ ์ตœ์ ํ™”ํ•˜๋Š” ํˆด๋ง์ด ์–ด๋–ป๊ฒŒ ์ ์šฉ๋  ์ˆ˜ ์žˆ๋Š”์ง€ ์„ฑ๋Šฅ ๊ด€์ ์—์„œ ํƒ๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Legacy React Codebase Refactoring.md b/00_Raw/Legacy React Codebase Refactoring.md new file mode 100644 index 00000000..5d383037 --- /dev/null +++ b/00_Raw/Legacy React Codebase Refactoring.md @@ -0,0 +1,70 @@ +# [[Legacy React Codebase Refactoring]] + +## ๐Ÿ“Œ Brief Summary +๋ ˆ๊ฑฐ์‹œ React ์ฝ”๋“œ๋ฒ ์ด์Šค ๋ฆฌํŒฉํ† ๋ง์€ ๊ธฐ์กด ์†Œํ”„ํŠธ์›จ์–ด์˜ ๋™์ž‘์„ ์˜จ์ „ํžˆ ๋ณด์กดํ•˜๋ฉด์„œ, ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ, ์œ ์ง€๋ณด์ˆ˜์„ฑ, ํ™•์žฅ์„ฑ์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ์žฌ์„ค๊ณ„ํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค [1]. ์ด ๊ณผ์ •์€ ํšŒ๊ท€ ์˜ค๋ฅ˜๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•œ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ(Unit Test) ์ž‘์„ฑ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ, ํด๋ž˜์Šค ๊ธฐ๋ฐ˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ•จ์ˆ˜ํ˜• ๋ฐ ํ›…(Hooks)์œผ๋กœ ์ „ํ™˜ํ•˜๊ณ , ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ๋ฅผ ํ˜„๋Œ€ํ™”(์˜ˆ: Redux์—์„œ TanStack Query๋‚˜ Zustand๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜)ํ•˜๋Š” ์ž‘์—…์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค [2, 3]. ์„ฑ๊ณต์ ์ธ ๋ฆฌํŒฉํ† ๋ง์€ ์ „์ฒด๋ฅผ ํ•œ ๋ฒˆ์— ๊ฐˆ์•„์—Ž๋Š” ์žฌ์ž‘์„ฑ(Rewrite)์„ ํ”ผํ•˜๊ณ , ์ปค์Šคํ…€ ํ›…์„ ํ†ตํ•ด UI์™€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋ถ„๋ฆฌํ•˜๋Š” ๋“ฑ ์ ์ง„์ (Incremental)์ธ ์ตœ์ ํ™”๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ์ดˆ์ ์„ ๋งž์ถฅ๋‹ˆ๋‹ค [1, 4]. + +## ๐Ÿ“– Core Content +* **๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ํŒŒ์•… ๋ฐ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์„ ํ–‰:** + ๋ ˆ๊ฑฐ์‹œ ๋ฆฌํŒฉํ† ๋ง์˜ ์ฒซ๊ฑธ์Œ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ์ „์—ญ UI ์Šคํ† ์–ด์— ๋ณด๊ด€๋œ ๋ฐ์ดํ„ฐ๋ฅผ ํŒŒ์•…ํ•˜์—ฌ ๋ฉ˜ํƒˆ ๋ชจ๋ธ(Mental model)์„ ๊ทธ๋ฆฌ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค [5]. ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๊ธฐ ์ „ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ(Unit tests)๋‚˜ UI ํ…Œ์ŠคํŠธ ์ œํ’ˆ๊ตฐ์„ ๋จผ์ € ์ž‘์„ฑํ•˜์—ฌ, ๋ฆฌํŒฉํ† ๋ง ๊ณผ์ •(TS ๋ณ€ํ™˜, ํ›… ์ „ํ™˜, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์—…๊ทธ๋ ˆ์ด๋“œ ๋“ฑ)์—์„œ ๊ธฐ์กด ๊ธฐ๋Šฅ์ด ์†์ƒ๋˜์ง€ ์•Š์•˜์Œ์„ ๊ฒ€์ฆํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [2, 6, 7]. +* **๋ชจ๋˜ React ํŒจ๋Ÿฌ๋‹ค์ž„์œผ๋กœ์˜ ์ „ํ™˜:** + ๊ธฐ์กด ์ฝ”๋“œ๋ฒ ์ด์Šค์— ์กด์žฌํ•˜๋Š” ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์™€ ํ›…์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•ฉ๋‹ˆ๋‹ค [3]. ํ”„๋กœ์ ํŠธ๊ฐ€ JavaScript๋กœ๋งŒ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค๋ฉด TypeScript๋กœ ์ ์ง„์ ์œผ๋กœ ์ „ํ™˜ํ•˜๊ณ , ์˜ค๋ž˜๋˜๊ฑฐ๋‚˜ ์‚ฌ์šฉ ์ค‘๋‹จ(deprecated)๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค [3]. ๋˜ํ•œ, ๋ถˆํ•„์š”ํ•œ `useEffect` ์‚ฌ์šฉ์„ ๋ชจ๋‘ ์ œ๊ฑฐํ•˜๊ณ , ์ฝ”๋“œ์— ํ˜ผ์žฌ๋˜์–ด ์žˆ๋Š” CSS ์Šคํƒ€์ผ๋ง ๋ฐฉ์‹(์™ธ๋ถ€ CSS, ์ธ๋ผ์ธ style, sx ๋“ฑ)์„ ํ•œ๋‘ ๊ฐ€์ง€์˜ ํ‘œ์ค€ ๋ฐฉ์‹(์˜ˆ: CSS modules)์œผ๋กœ ํ†ต์ผํ•ฉ๋‹ˆ๋‹ค [3, 8, 9]. +* **์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ์˜ ์ฑ…์ž„ ๋ถ„๋ฆฌ:** + ๊ณผ๊ฑฐ ๋‹จ์ผ ์ „์—ญ ์Šคํ† ์–ด(์˜ˆ: Redux)์— ๋ญ‰์ณ์žˆ๋˜ ์ƒํƒœ๋“ค์„ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„ ์ƒํƒœ(Server state) ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด์„œ๋Š” TanStack Query๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ Redux ์˜์กด๋„๋ฅผ ์ค„์ด๊ณ , ํด๋ผ์ด์–ธํŠธ ์ธก ์ „์—ญ ์ƒํƒœ๋Š” Context API๋‚˜ Zustand๋กœ ๊ด€๋ฆฌํ•˜๋ฉฐ, ์ง€์—ญ ์ƒํƒœ(Local state)๋Š” ๊ฐ€๊ธ‰์  ๊ฐ ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€๋กœ ๊ฒฉ๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๋ชจ๋ฒ” ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค [3]. +* **์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜(Incremental Migration)๊ณผ ์ปค์Šคํ…€ ํ›…:** + ๋ฆฌํŒฉํ† ๋ง ์‹œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด๋ฅผ ํ•œ ๋ฒˆ์— ์žฌ์ž‘์„ฑ(rewrite)ํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์œ„ํ—˜ํ•ฉ๋‹ˆ๋‹ค. "์žฌ์ž‘์„ฑ์ด ์•„๋‹Œ ๋ฆฌํŒฉํ† ๋ง(refactor, do not rewrite)" ์ฒ ํ•™์— ๋”ฐ๋ผ, ํ•˜๋‚˜์˜ ์Šคํ† ์–ด๋‚˜ ๋‹จ์ˆœํ•œ ๊ธฐ๋Šฅ(์˜ˆ: ์•Œ๋ฆผ)๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด ๊ฒฐ์ œ ํ๋ฆ„๊ณผ ๊ฐ™์€ ๋ณต์žกํ•œ ๋„๋ฉ”์ธ์œผ๋กœ ํ•˜๋‚˜์”ฉ ์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์ง„ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [1]. ์ด ๊ณผ์ •์—์„œ '์ปค์Šคํ…€ ํ›…'์„ ์ฃผ์š” ๋ฆฌํŒฉํ† ๋ง ๋‹จ์œ„๋กœ ์‚ฌ์šฉํ•˜์—ฌ, ๊ฑฐ๋Œ€ํ•œ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฐ์ดํ„ฐ ํŽ˜์นญ์ด๋‚˜ ํผ ์ฒ˜๋ฆฌ์™€ ๊ฐ™์€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋ถ„๋ฆฌํ•ด ๋ชจ๋“ˆ์„ฑ๊ณผ ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ์„ ๋†’์ž…๋‹ˆ๋‹ค [4]. +* **๊ทœ์น™ ๊ธฐ๋ฐ˜์˜ ๊ด€๋ฆฌ ๋ฐ ์ž๋™ํ™”:** + ESLint(eslint-plugin-react, eslint-plugin-react-hooks ๋“ฑ)๋ฅผ ๋„์ž…ํ•˜์—ฌ ์ฝ”๋“œ ์Šคํƒ€์ผ๊ณผ ๋ชจ๋ฒ” ์‚ฌ๋ก€๋ฅผ ๊ฐ•์ œํ•˜๊ณ , ํŒ€ ์ฐจ์›์˜ ์ผ๊ด€๋œ ์ฝ”๋“œ ํ’ˆ์งˆ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค [10]. ๋” ๋‚˜์•„๊ฐ€ Claude Code ๊ฐ™์€ AI ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•ด ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ํ‰๊ฐ€๋ฐ›๊ณ  ์ž‘์€ ๋‹จ์œ„์˜ PR(Pull Request)์„ ์ƒ์„ฑํ•˜๊ฒŒ ํ•จ์œผ๋กœ์จ ๋ฆฌํŒฉํ† ๋ง ์‹œ๊ฐ„์„ ๋‹จ์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [11, 12]. + +## โš–๏ธ Trade-offs & Caveats +* **์ „๋ฉด ์žฌ์ž‘์„ฑ(Rewrite) vs ์ ์ง„์  ๋ฆฌํŒฉํ† ๋ง:** + ๊ธฐ์กด ์•ฑ์˜ ๊ทœ๋ชจ๊ฐ€ ๋งค์šฐ ์ž‘๋‹ค๋ฉด ์˜คํžˆ๋ ค ๋ฐ”๋‹ฅ๋ถ€ํ„ฐ ์ƒˆ ์•ฑ์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋ฆฌํŒฉํ† ๋ง๋ณด๋‹ค ์‰ฝ๊ณ  ๋น ๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [6]. ๊ทธ๋Ÿฌ๋‚˜ ๊ทœ๋ชจ๊ฐ€ ํฐ ์•ฑ์˜ ๊ฒฝ์šฐ ์žฌ์ž‘์„ฑ์€ ๋ฆฌ์Šคํฌ๊ฐ€ ๋„ˆ๋ฌด ํฌ๋ฏ€๋กœ, ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ์„ ๋ฉˆ์ถ”์ง€ ์•Š์€ ์ƒํƒœ์—์„œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ํ˜„๋Œ€ํ™”ํ•˜๋Š” '์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜' ๋ฐฉ์‹์„ ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [1]. +* **์ถ”์ƒํ™”์™€ ๋‹จ์ˆœ์„ฑ์˜ ์ถฉ๋Œ (DRY vs KISS):** + DRY(Don't Repeat Yourself) ์›์น™์— ๋”ฐ๋ผ ์ค‘๋ณต ์ฝ”๋“œ๋ฅผ ์ถ”์ถœํ•˜๋Š” ๊ฒƒ์€ ์ข‹์ง€๋งŒ, ๊ณผ๋„ํ•œ ์ถ”์ƒํ™”๋Š” ์›๋ณธ ์ฝ”๋“œ๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ฐ˜๋ณตํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์˜คํžˆ๋ ค ๋””๋ฒ„๊น…๊ณผ ์ดํ•ด๋ฅผ ๋” ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค์–ด KISS(Keep It Simple, Stupid) ์›์น™์„ ์œ„๋ฐฐํ•˜๊ฒŒ ๋  ๋ถ€์ž‘์šฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค [13]. ๋”ฐ๋ผ์„œ ํŒจํ„ด์ด ์ตœ์†Œ ์„ธ ๋ฒˆ ์ด์ƒ ๋ฐ˜๋ณต๋˜๊ธฐ ์ „๊นŒ์ง€๋Š” ์กฐ๊ธฐ ์ตœ์ ํ™”๋‚˜ ๋ณต์žกํ•œ ์ถ”์ƒํ™”๋ฅผ ํ”ผํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค [13]. +* **์ƒˆ๋กœ์šด ๋„๊ตฌ(TypeScript ๋“ฑ) ๋„์ž…์˜ ์˜ค๋ฒ„ํ—ค๋“œ:** + ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ƒˆ๋กœ์šด ์ƒํƒœ ๊ด€๋ฆฌ ํŒจํ„ด์„ ์ž…ํžˆ๋Š” ๊ฒƒ์€ ์•ˆ์ „์„ฑ์„ ๋†’์ด์ง€๋งŒ, ์ฝ”๋“œ๋ฒ ์ด์Šค์— ๋ณต์žก์„ฑ์„ ๋”ํ•˜๊ณ  ํŒ€์›๋“ค์—๊ฒŒ ์ธ์ง€์  ๋ถ€ํ•˜๋ฅผ ์ค๋‹ˆ๋‹ค [14]. ๋”ฐ๋ผ์„œ ๊ฐœ๋ฐœ์ž๋“ค์˜ ์ˆ™๋ จ๋„๋ฅผ ๊ณ ๋ คํ•˜์—ฌ JS ํŒŒ์ผ์„ TS ํŒŒ์ผ๋กœ ํ•œ ๊ฐœ์”ฉ ์ ์ง„์ ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์‹์˜ ์ ‘๊ทผ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค [14]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [๊ด€๊ณ„ ์œ ํ˜• A (์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ )] +- [[Feature-Sliced Design]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ์˜ ๋‚œํ•ดํ•œ ํด๋” ๊ตฌ์กฐ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด, ์ฝ”๋“œ๋ฅผ ๊ธฐ์ˆ ์  ๊ณ„์ธต์ด ์•„๋‹Œ ๋น„์ฆˆ๋‹ˆ์Šค ๊ธฐ๋Šฅ(Feature)๊ณผ ์ฑ…์ž„ ๋ฒ”์œ„์— ๋”ฐ๋ผ ๋ถ„ํ• ํ•˜๋Š” ์ตœ์‹  ์•„ํ‚คํ…์ฒ˜ ๋ฐฉ๋ฒ•๋ก ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [15, 16]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ฑฐ๋Œ€ํ•˜๊ณ  ๊ฐ•ํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋œ ์ปดํฌ๋„ŒํŠธ๋“ค์„ ์‘์ง‘๋„ ๋†’์€ ๋ชจ๋“ˆ๋กœ ์ชผ๊ฐœ๋Š” ๊ธฐ์ค€๊ณผ ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ๊ตฌ์กฐ๋ฅผ ์„ค๊ณ„ํ•˜๋Š” ๋ฐฉ๋ฒ• [16]. +- [[SOLID Principles]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP) ๋“ฑ์€ ๋ณต์žกํ•˜๊ฒŒ ์–ฝํžŒ ์ปดํฌ๋„ŒํŠธ ๋กœ์ง์„ ๋” ์ž‘๊ณ  ํ•œ ๊ฐ€์ง€ ์ผ๋งŒ ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋กœ ๋ฆฌํŒฉํ† ๋งํ•˜๋Š” ๋ฐ ํ•ต์‹ฌ์ ์ธ ๊ฐ€์ด๋“œ๋ผ์ธ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [17]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ฑฐ๋Œ€ํ•œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ธ์ œ, ๊ทธ๋ฆฌ๊ณ  ์™œ ํ›…๊ณผ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ถ„๋ฆฌ๋˜์–ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๊ฐ๊ด€์  ํŒ๋‹จ ๊ธฐ์ค€ [11, 17]. + +#### [๊ด€๊ณ„ ์œ ํ˜• B (๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ)] +- [[Unit Testing]] + - ์—ฐ๊ฒฐ ์ด์œ : ์ฝ”๋“œ๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•  ๋•Œ ๊ธฐ์กด ๋กœ์ง์ด ๋ง๊ฐ€์ง€์ง€ ์•Š์•˜์Œ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ์„ ํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์‹ค๋ฌด ๋„๊ตฌ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [2, 7]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ํ•ด์ฒดํ•˜๊ณ  ๋ชจ๋“ˆํ™”ํ•˜๊ธฐ ์œ„ํ•œ ํ…Œ์ŠคํŠธ ๊ธฐ๋ฐ˜ ์ ‘๊ทผ๋ฒ•๊ณผ ํšŒ๊ท€ ๋ฒ„๊ทธ ๋ฐฉ์–ด ์ „๋žต [7]. +- [[Zustand]] + - ์—ฐ๊ฒฐ ์ด์œ : ๊ธฐ์กด ๋ ˆ๊ฑฐ์‹œ ์•ฑ์—์„œ ํ”ํžˆ ๋ฐœ์ƒํ•˜๋Š” Context API์˜ ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง ๋ฌธ์ œ๋‚˜, ๋ฌด๊ฒ๊ณ  ๋ณต์žกํ•œ Redux ์ฝ”๋“œ๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•  ๋•Œ ๊ฐ€์žฅ ๊ถŒ์žฅ๋˜๋Š” ๊ฒฝ๋Ÿ‰ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [3, 18, 19]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ƒํƒœ๋ฅผ ๋ถ„๋ฆฌํ•˜๊ณ  ์…€๋ ‰ํ„ฐ(Selector) ํŒจํ„ด์„ ์ ์šฉํ•˜์—ฌ ๊ธ€๋กœ๋ฒŒ ์ƒํƒœ ๋ณ€๊ฒฝ ์‹œ ๋ฐœ์ƒํ•˜๋Š” ์„ฑ๋Šฅ ๋ณ‘๋ชฉ์„ ํ•ด๊ฒฐํ•˜๋Š” ์›๋ฆฌ [20, 21]. + +### Deeper Research Questions + +- ๋ ˆ๊ฑฐ์‹œ ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์˜ ๋ผ์ดํ”„์‚ฌ์ดํด ๋ฉ”์„œ๋“œ(`componentDidMount`, `componentDidUpdate` ๋“ฑ)๋ฅผ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์˜ ํ›…(`useEffect` ๋“ฑ)์œผ๋กœ ๋ณ€ํ™˜ํ•  ๋•Œ, ๋…ผ๋ฆฌ์  ์˜ค๋ฅ˜ ์—†์ด 1:1๋กœ ๋งคํ•‘ํ•˜๊ฑฐ๋‚˜ ๊ตฌ์กฐ๋ฅผ ๊ฐœ์„ ํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ํŒจํ„ด์€ ๋ฌด์—‡์ธ๊ฐ€? +- ์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์ง„ํ–‰ํ•  ๋•Œ, ๋ ˆ๊ฑฐ์‹œ ์‹œ์Šคํ…œ์˜ Redux ์Šคํ† ์–ด์™€ ์ƒˆ๋กœ์šด ์‹œ์Šคํ…œ์˜ Zustand/TanStack Query ์ƒํƒœ๋ฅผ ์‹œ์Šคํ…œ ์žฅ์• ๋‚˜ ์ถฉ๋Œ ์—†์ด ๊ณต์กด์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? +- UI ๋ฆฌํŒฉํ† ๋ง ๊ณผ์ •์—์„œ ๋ ˆ์ด์•„์›ƒ์ด๋‚˜ ์ƒ‰์ƒ ๋“ฑ ์˜๋„์น˜ ์•Š์€ ์‹œ๊ฐ์  ํšŒ๊ท€(Visual regression)๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด Storybook ๋ฐ Chromatic๊ณผ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์–ด๋–ป๊ฒŒ CI ํŒŒ์ดํ”„๋ผ์ธ์— ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- FSD(Feature-Sliced Design) ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ธฐ์กด ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฒ ์ด์Šค์— ์ ์šฉํ•˜๋ ค ํ•  ๋•Œ, ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ(Feature) ๊ฐ„์— ๊ต์ฐจํ•˜์—ฌ ์‚ฌ์šฉ๋˜๋Š” ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ(Cross-cutting concerns)๋Š” ์–ด๋””์— ์–ด๋–ป๊ฒŒ ๋ฐฐ์น˜ํ•ด์•ผ ํ•˜๋Š”๊ฐ€? +- React ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ `useEffect`์˜ ์˜ค์šฉ์ด ๋Œ€ํ‘œ์ ์ธ ์•ˆํ‹ฐํŒจํ„ด์œผ๋กœ ๊ผฝํžˆ๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ด๋ฉฐ, ์ด๋ฅผ ์‹๋ณ„ํ•ด ๋‚ด๊ณ  ๋Œ€์ฒด ํŒจํ„ด(ํŒŒ์ƒ ์ƒํƒœ, ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ๋“ฑ)์œผ๋กœ ๋ฆฌํŒฉํ† ๋งํ•˜๋Š” ๊ธฐ์ค€์€ ๋ฌด์—‡์ธ๊ฐ€? + +### Practical Application Contexts + +- **Implementation:** ๊ฑฐ๋Œ€ํ•œ ๋‹จ์ผ ํŒŒ์ผ๋กœ ์ž‘์„ฑ๋œ ์ปดํฌ๋„ŒํŠธ(300์ค„ ์ด์ƒ)๋‚˜ ํ˜ผ์žฌ๋œ ์Šคํƒ€์ผ(์ธ๋ผ์ธ, ์™ธ๋ถ€ ํŒŒ์ผ)์„ ๊ฐ€์ง„ ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฅผ ์‹๋ณ„ํ•œ ํ›„, ESLint ๋ฆฐํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•ด ๊ทœ์น™์„ ์„ธ์šฐ๊ณ  ๊ณตํ†ต ๋กœ์ง์„ ์ปค์Šคํ…€ ํ›…์œผ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ์ž‘์—…์— ์ฆ‰์‹œ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- **System Design:** ํ”„๋กœ์ ํŠธ์˜ ํด๋” ๊ตฌ์กฐ๋ฅผ ๊ธฐ์กด์˜ ๊ธฐ์ˆ  ์ค‘์‹ฌ(components, hooks, styles) ๊ตฌ์กฐ์—์„œ ๋„๋ฉ”์ธ ๋ฐ ๊ธฐ๋Šฅ ์ค‘์‹ฌ(features ๋‚ด๋ถ€์— ๊ฐ ๋„๋ฉ”์ธ ๋ฐฐ์น˜) ๊ตฌ์กฐ๋กœ ์žฌํŽธ์„ฑํ•˜์—ฌ ํ™•์žฅ์„ฑ์„ ๊ฐ–์ถ˜ ์•„ํ‚คํ…์ฒ˜๋กœ ํƒˆ๋ฐ”๊ฟˆ์‹œํ‚ต๋‹ˆ๋‹ค. +- **Operation / Maintenance:** ๊ธฐ๋Šฅ ๋ฐฐํฌ๋ฅผ ์ค‘๋‹จํ•˜์ง€ ์•Š๊ณ  ์šด์˜ ์ค‘์ธ ์‹œ์Šคํ…œ์—์„œ "ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์Šคํ† ์–ด" ๋‹จ์œ„๋กœ ์ฝ”๋“œ๋ฅผ ์ ์ง„์ ์œผ๋กœ ๋ฆฌํŒฉํ† ๋งํ•˜๋ฉฐ, ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•ด CI/CD ํ™˜๊ฒฝ์—์„œ ํ…Œ์ŠคํŠธ ํ†ต๊ณผ ์—ฌ๋ถ€๋ฅผ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค. +- **Learning Path:** React ๊ธฐ์ดˆ ์žฅ๋‚œ๊ฐ ์•ฑ(Toy app)์„ ์ง์ ‘ ๋งŒ๋“ค์–ด ์ƒํƒœ๊ณ„๋ฅผ ์ดํ•ดํ•œ ๋’ค, SOLID ๋ฐ DRY ์›์น™์„ ํ•™์Šตํ•˜๊ณ , ์ปค์Šคํ…€ ํ›…๊ณผ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ๋ฒ•์„ ์ตํžŒ ํ›„ ์‹ค์ œ ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฅผ ๊ฐœ์„ ํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ํ•™์Šต ๋กœ๋“œ๋งต์„ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค. +- **My Project Relevance:** ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค์ด ์ž‘์„ฑํ•œ ์˜ค๋ž˜๋œ ์ฝ”๋“œ๋ฅผ ์ธ์ˆ˜๋ฐ›์•„ ์œ ์ง€๋ณด์ˆ˜ํ•ด์•ผ ํ•  ๋•Œ, ์ฝ”๋“œ๋ฅผ ๋ฌด์ž‘์ • ๋œฏ์–ด๊ณ ์น˜๋Š” ๋Œ€์‹  ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์šฐ์„  ๋งคํ•‘ํ•˜๊ณ  ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์งœ๋ฉฐ AI ๋„๊ตฌ์˜ ๋„์›€์„ ๋ฐ›์•„ ์ ์ง„์ ์œผ๋กœ ๊ตฌ์กฐ๋ฅผ ์ •๋ˆํ•˜๋Š” ์‹ค๋ฌด ์ง€์นจ์œผ๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### Adjacent Topics + +- [[TanStack Query (React Query)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๊ธฐ์กด์˜ ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ(Redux)์—์„œ ๊ด€๋ฆฌํ•˜๋˜ '์„œ๋ฒ„ ์ƒํƒœ'๋ฅผ ๋–ผ์–ด๋‚ด์–ด, ์–ด๋–ป๊ฒŒ ํšจ์œจ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ ํŽ˜์นญ(fetching), ์บ์‹ฑ, ๊ทธ๋ฆฌ๊ณ  ๋™๊ธฐํ™” ์ฒ˜๋ฆฌ๋ฅผ ์ž๋™ํ™”ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํƒ๊ตฌํ•ฉ๋‹ˆ๋‹ค. +- [[React Performance Optimization]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ์ฝ”๋“œ๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•˜๋Š” ๊ณผ์ •์—์„œ `React.memo`, `useMemo`, `useCallback`๊ณผ ๊ฐ™์€ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๊ธฐ๋ฒ•์„ ์ ์žฌ์ ์†Œ์— ๋ฐฐ์น˜ํ•ด ์ปดํฌ๋„ŒํŠธ์˜ ๋ Œ๋”๋ง ์„ฑ๋Šฅ์„ ๊ทน๋Œ€ํ™”ํ•˜๋Š” ๋ฐฉ์•ˆ์œผ๋กœ ์ดํ•ด๋ฅผ ๋„“ํž™๋‹ˆ๋‹ค. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Memoization.md b/00_Raw/Memoization.md new file mode 100644 index 00000000..ae189b17 --- /dev/null +++ b/00_Raw/Memoization.md @@ -0,0 +1,61 @@ +# [[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 new file mode 100644 index 00000000..5ebcc2c6 --- /dev/null +++ b/00_Raw/Memory Leak Detection.md @@ -0,0 +1,73 @@ +# [[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 new file mode 100644 index 00000000..af3ca129 --- /dev/null +++ b/00_Raw/Memory Leak.md @@ -0,0 +1,78 @@ +# [[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 new file mode 100644 index 00000000..5e3ce246 --- /dev/null +++ b/00_Raw/Memory Leaks.md @@ -0,0 +1,75 @@ +# [[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/Model Context Protocol (MCP).md b/00_Raw/Model Context Protocol (MCP).md new file mode 100644 index 00000000..ec3d1bd8 --- /dev/null +++ b/00_Raw/Model Context Protocol (MCP).md @@ -0,0 +1,78 @@ +# [[Model Context Protocol (MCP)]] + +## ๐Ÿ“Œ Brief Summary +Model Context Protocol(MCP)์€ 2024๋…„ 11์›” Anthropic์ด ๋„์ž…ํ•œ ์˜คํ”ˆ ์†Œ์Šค ํ‘œ์ค€ ํ”„๋กœํ† ์ฝœ๋กœ, LLM ๊ธฐ๋ฐ˜ AI ์‹œ์Šคํ…œ์ด ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ ์†Œ์Šค, ๋„๊ตฌ, ์‹œ์Šคํ…œ๊ณผ ํ†ตํ•ฉ๋˜๋Š” ๋ฐฉ์‹์„ ํ‘œ์ค€ํ™”ํ•ฉ๋‹ˆ๋‹ค[1]. ์ด ํ”„๋กœํ† ์ฝœ์€ AI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ "USB-C ํฌํŠธ" ์—ญํ• ์„ ํ•˜์—ฌ, ๊ฐ ์‹œ์Šคํ…œ๋งˆ๋‹ค ๋งž์ถคํ˜• ์ปค๋„ฅํ„ฐ๋ฅผ ๊ตฌ์ถ•ํ•ด์•ผ ํ–ˆ๋˜ ๊ธฐ์กด์˜ "Nร—M" ๋ฐ์ดํ„ฐ ํ†ตํ•ฉ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค[2-4]. ์—์ด์ „ํŠธ ํ•˜๋„ค์Šค ์—”์ง€๋‹ˆ์–ด๋ง ๊ด€์ ์—์„œ MCP๋Š” ํ•˜๋„ค์Šค์˜ ๋„๊ตฌ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ(T-์ปดํฌ๋„ŒํŠธ)๋ฅผ ์™ธ๋ถ€ ์ƒํ˜ธ์šด์šฉ์„ฑ ๊ณ„์ธต์œผ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ, ๋งž์ถคํ˜• ํ†ตํ•ฉ ์ฝ”๋“œ ์—†์ด๋„ ์—์ด์ „ํŠธ๊ฐ€ ๋™์ ์œผ๋กœ ๋„๊ตฌ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ  ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ํ‘œ์ค€ ์ธํ”„๋ผ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค[5-7]. + +## ๐Ÿ“– Core Content + +* **์•„ํ‚คํ…์ฒ˜ ๋ฐ ๊ตฌ์„ฑ ์š”์†Œ** + MCP๋Š” ๋ช…ํ™•ํ•œ ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค[8]. + * **MCP Host:** AI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(์˜ˆ: Claude Code, IDE) ์ž์ฒด๋กœ, LLM์ด ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉฐ ์—ฌ๋Ÿฌ MCP ํด๋ผ์ด์–ธํŠธ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค[9, 10]. + * **MCP Client:** Host ๋‚ด๋ถ€์— ์œ„์น˜ํ•˜์—ฌ LLM์˜ ์š”์ฒญ์„ MCP ์„œ๋ฒ„๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฒˆ์—ญํ•˜๊ณ  ํ†ต์‹ ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค[9, 10]. + * **MCP Server:** ๋กœ์ปฌ ๋˜๋Š” ์›๊ฒฉ์œผ๋กœ ์‹คํ–‰๋˜๋ฉฐ, LLM์—๊ฒŒ ์ปจํ…์ŠคํŠธ์™€ ๋ฐ์ดํ„ฐ, ๋„๊ตฌ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ์™ธ๋ถ€ ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค[11, 12]. + ์ด๋“ค์€ JSON-RPC 2.0์„ ์ „์†ก ๊ณ„์ธต์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ํ†ต์‹ ํ•˜๋ฉฐ, ๋กœ์ปฌ ํ™˜๊ฒฝ์—์„œ๋Š” ํ‘œ์ค€ ์ž…์ถœ๋ ฅ(stdio)์„, ์›๊ฒฉ ํ™˜๊ฒฝ์—์„œ๋Š” Server-Sent Events(SSE)๋ฅผ ํฌํ•จํ•œ Streamable HTTP๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค[12-14]. + +* **์—์ด์ „ํŠธ ํ•˜๋„ค์Šค์—์„œ์˜ ์—ญํ•  (T-์ปดํฌ๋„ŒํŠธ ํ‘œ์ค€ํ™”)** + MCP๋Š” ์—์ด์ „ํŠธ ํ•˜๋„ค์Šค ์„ค๊ณ„์—์„œ ์ค‘๋Œ€ํ•œ ์•„ํ‚คํ…์ฒ˜์  ์ „ํ™˜์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด ํ•˜๋„ค์Šค ๋‚ด๋ถ€์˜ ์‚ฌ์œ  ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์˜€๋˜ ๋„๊ตฌ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋ฅผ ํ‘œ์ค€ํ™”๋œ ์ƒํ˜ธ์šด์šฉ ๊ณ„์ธต์œผ๋กœ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค[6, 15]. ํ•˜๋„ค์Šค๋Š” MCP ํด๋ผ์ด์–ธํŠธ๋กœ ์ž‘๋™ํ•˜๊ณ  ๋„๊ตฌ ์ œ๊ณต์ž๋Š” MCP ์„œ๋ฒ„๋กœ ์ž‘๋™ํ•จ์œผ๋กœ์จ, ํ•˜๋„ค์Šค๋Š” ๊ฐœ๋ณ„ ๋„๊ตฌ์˜ ๊ตฌํ˜„ ์„ธ๋ถ€ ์‚ฌํ•ญ์— ๊ฒฐํ•ฉ(coupling)๋˜์ง€ ์•Š๊ณ  ๋„๊ตฌ์˜ ๋ฐœ๊ฒฌ(capability negotiation), ์Šคํ‚ค๋งˆ ๊ฒ€์ฆ, ํ˜ธ์ถœ(dispatch)์„ ํ‘œ์ค€ํ™”๋œ ๋ฐฉ์‹์œผ๋กœ ๊ฑฐ๋ฒ„๋„Œ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค[5, 7]. + +* **๊ธฐ๋ณธ ๊ธฐ๋Šฅ (Primitives)** + MCP๋Š” ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋Š” ์„ธ ๊ฐ€์ง€ ํ•ต์‹ฌ ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค[16, 17]. + 1. **Tools (๋„๊ตฌ):** AI๊ฐ€ ์™ธ๋ถ€ ์‹œ์Šคํ…œ์—์„œ ์กฐ์น˜๋ฅผ ์ทจํ•  ์ˆ˜ ์žˆ๋Š” ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ํ•จ์ˆ˜ (์˜ˆ: ํŒŒ์ผ ์กฐ์ž‘, API ํ˜ธ์ถœ). + 2. **Resources (๋ฆฌ์†Œ์Šค):** AI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ปจํ…์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ฐ์ดํ„ฐ ์†Œ์Šค. + 3. **Prompts (ํ”„๋กฌํ”„ํŠธ):** LLM๊ณผ์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ๊ตฌ์กฐํ™”ํ•˜๋Š” ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ…œํ”Œ๋ฆฟ. + ๋ฐ˜๋Œ€๋กœ ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ๋„ ์„œ๋ฒ„๊ฐ€ ํ˜ธ์ŠคํŠธ LLM์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜(Sampling), ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ์š”์ฒญ(Elicitation)ํ•˜๊ฑฐ๋‚˜, ๋””๋ฒ„๊น… ๋ฉ”์‹œ์ง€๋ฅผ ๋กœ๊น…(Logging)ํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค[18]. + +* **A2A(Agent-to-Agent) ํ”„๋กœํ† ์ฝœ๊ณผ์˜ ์ƒํ˜ธ ๋ณด์™„์„ฑ** + MCP๋Š” ๋„๊ตฌ ํ†ตํ•ฉ(Agent-to-Tool)์— ์ตœ์ ํ™”๋˜์–ด ํ•˜๋„ค์Šค์˜ T-์ปดํฌ๋„ŒํŠธ ๊ฒฝ๊ณ„๋ฅผ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด Google์ด ๊ฐœ๋ฐœํ•œ A2A ํ”„๋กœํ† ์ฝœ์€ ํ•˜๋„ค์Šค ๊ฐ„์˜ ์—์ด์ „ํŠธ ์œ„์ž„ ๋ฐ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜(E-์ปดํฌ๋„ŒํŠธ)์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค[5, 7, 19, 20]. ๋‘ ํ”„๋กœํ† ์ฝœ์€ ๊ฒฝ์Ÿ ๊ด€๊ณ„๊ฐ€ ์•„๋‹Œ ๋ณด์™„์  ๊ณ„์ธต์œผ๋กœ ์ž‘์šฉํ•˜์—ฌ ์™„์ „ํ•œ ํ˜•ํƒœ์˜ ์—์ด์ „ํŠธ ํ†ต์‹  ์Šคํƒ์„ ํ˜•์„ฑํ•ฉ๋‹ˆ๋‹ค[5, 7]. + +## โš–๏ธ Trade-offs & Caveats + +* **๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ถฉ๋Œ ๋ฐ ๋„๊ตฌ ์Šคํ‘ธํ•‘(Spoofing) ์œ„ํ˜‘** + MCP ์‚ฌ์–‘์—๋Š” ํ˜„์žฌ ๊ฐ•๋ ฅํ•œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๊ฒฉ๋ฆฌ ๊ธฐ๋Šฅ์ด ์—†์Šต๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ์„œ๋กœ ๋‹ค๋ฅธ ์ œ๊ณต์ž์˜ ๋™์ผํ•œ ์ด๋ฆ„์„ ๊ฐ€์ง„ ๋„๊ตฌ๊ฐ€ ๊ธฐ์กด์˜ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ๋ฅผ ์†Œ๋ฆฌ ์—†์ด ๋ฎ์–ด์“ฐ๋Š”(shadowing) ์Šคํ‘ธํ•‘ ๊ณต๊ฒฉ ์„ฑ๊ณต๋ฅ ์ด 100%์— ๋‹ฌํ•œ๋‹ค๋Š” ๋ถ„์„ ๊ฒฐ๊ณผ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋„ค์Šค๊ฐ€ MCP๋ฅผ ์ฑ„ํƒํ•  ๋•Œ๋Š” ํ”„๋กœํ† ์ฝœ ์ˆ˜์ค€์—์„œ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†๋Š” ์ด ์ทจ์•ฝ์ ์„ ํ•˜๋„ค์Šค ์ž์ฒด์˜ ๋ณด์•ˆ ๊ณ„์ธต(L-์ปดํฌ๋„ŒํŠธ)์—์„œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๊ฒฉ๋ฆฌ๋ฅผ ํ†ตํ•ด ๋ณด์™„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค[21-23]. +* **๋ณด์•ˆ ๊ฒฝ๊ณ„ ๋ฐ '๊ฐ„์ ‘ ํ”„๋กฌํ”„ํŠธ ์ธ์ ์…˜' ์œ„ํ—˜** + MCP๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ์˜ ์ถœ๋ ฅ์„ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๊ธฐ๋ณธ ๊ฐ€์ •ํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค[24, 25]. ์•…์˜์ ์ธ ์›นํŽ˜์ด์ง€๋‚˜ ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์˜ฌ ๋•Œ ์ˆจ๊ฒจ์ง„ ์ง€์‹œ์–ด๊ฐ€ ํฌํ•จ๋˜์–ด ์—์ด์ „ํŠธ์˜ ๋ชฉํ‘œ๋ฅผ ํ•˜์ด์žฌํ‚นํ•˜๋Š” '๊ฐ„์ ‘ ํ”„๋กฌํ”„ํŠธ ์ธ์ ์…˜' ๊ณต๊ฒฉ์˜ ์ฃผ์š” ํ‘œ์ ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค[26, 27]. ํ•˜๋„ค์Šค๋Š” ๋„๊ตฌ ์ถœ๋ ฅ์ด LLM ์ปจํ…์ŠคํŠธ์— ์ฃผ์ž…๋˜๊ธฐ ์ „์— ๋ฐ˜๋“œ์‹œ ์ถœ๋ ฅ์„ ๊ฒ€์ฆํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. +* **๋ฌด์ƒํƒœ(Stateless) ์„ธ์…˜ ๋ฐ ๊ถŒํ•œ ๋ถ€์—ฌ์˜ ํ•œ๊ณ„ (2026๋…„ ๊ธฐ์ค€)** + MCP๋Š” ์„œ๋ฒ„ ์ธ์ฆ์„ ์œ„ํ•ด OAuth๋ฅผ ์ง€์›ํ•˜์ง€๋งŒ, ํ˜„์žฌ ๋„๊ตฌ ํ˜ธ์ถœ ์ „๋ฐ˜์— ๊ฑธ์นœ ์ƒํƒœ ์ €์žฅ ์„ธ์…˜(Stateful Session) ๊ด€๋ฆฌ๋‚˜, ํŠน์ • ๋„๊ตฌ ์ ‘๊ทผ์— ๋Œ€ํ•œ ์„ธ๋ฐ€ํ•œ ๋‹จ์œ„์˜ ๊ถŒํ•œ ๋ถ€์—ฌ(authorization) ๊ณ„์ธต์ด ํ”„๋กœํ† ์ฝœ ๋‚ด์— ํ‘œ์ค€ํ™”๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค[28, 29]. ๋˜ํ•œ ์›๊ฒฉ ๋ฐฐํฌ๋ฅผ ์œ„ํ•œ Streamable HTTP ์‚ฌ์šฉ ์‹œ ์ƒํƒœ ๊ธฐ๋ฐ˜ ํ—ค๋”๊ฐ€ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ์™€ ์ถฉ๋Œํ•˜๋Š” ๋“ฑ ์„ธ์…˜ ๊ด€๋ฆฌ์˜ ๋ณต์žก์„ฑ์ด ์ฆ๊ฐ€ํ•˜๋Š” ์ œ์•ฝ์ด ์žˆ์Šต๋‹ˆ๋‹ค[14]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [๊ด€๊ณ„ ์œ ํ˜• A: ์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] +* `[[Agent Harness]]` + * ์—ฐ๊ฒฐ ์ด์œ : MCP ํด๋ผ์ด์–ธํŠธ๋ฅผ ํƒ‘์žฌํ•˜์—ฌ ๋„๊ตฌ์™€ ์—์ด์ „ํŠธ(LLM) ์‚ฌ์ด์˜ ํ†ต์‹ ์„ ์‹ค์งˆ์ ์œผ๋กœ ์ œ์–ดํ•˜๊ณ  ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋Š” ํ•ต์‹ฌ ๋Ÿฐํƒ€์ž„ ์ธํ”„๋ผ. + * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: MCP๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋„๊ตฌ๋ฅผ ์—์ด์ „ํŠธ๊ฐ€ ๋‚จ์šฉํ•˜์ง€ ์•Š๋„๋ก ์ œ์–ดํ•˜๋Š” ์‹คํ–‰ ๋ฃจํ”„(E-์ปดํฌ๋„ŒํŠธ)์™€ ๋ผ์ดํ”„์‚ฌ์ดํด ํ›…(L-์ปดํฌ๋„ŒํŠธ) ๋“ฑ ์ „๋ฐ˜์ ์ธ ๊ฑฐ๋ฒ„๋„Œ์Šค ๋ฉ”์ปค๋‹ˆ์ฆ˜ [5, 30, 31]. +* `[[A2A (Agent-to-Agent)]]` + * ์—ฐ๊ฒฐ ์ด์œ : MCP๊ฐ€ ๋„๊ตฌ/๋ฐ์ดํ„ฐ๋ฅผ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ผ๋ฉด, A2A๋Š” ์—์ด์ „ํŠธ ๊ฐ„์˜ ์ž‘์—… ์œ„์ž„ ๋ฐ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜์„ ์œ„ํ•œ ํ”„๋กœํ† ์ฝœ๋กœ MCP์™€ ํ†ต์‹  ์Šคํƒ์„ ๊ตฌ์„ฑํ•จ. + * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋‹จ์ผ ํ•˜๋„ค์Šค๋ฅผ ๋„˜์–ด ๋ฉ€ํ‹ฐ ์—์ด์ „ํŠธ ํ™˜๊ฒฝ์—์„œ ์—์ด์ „ํŠธ๊ฐ€ ๋‹ค๋ฅธ ํ•˜๋„ค์Šค์˜ ์—์ด์ „ํŠธ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ํ”„๋กœํ† ์ฝœ ์„ค๊ณ„ ๋ฐ ๋น„๋Œ€์นญ์  ์—ญํ•  ๋ชจ๋ธ [5, 7, 19, 20, 32-35]. + +#### [๊ด€๊ณ„ ์œ ํ˜• B: ๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ] +* `[[JSON-RPC 2.0]]` + * ์—ฐ๊ฒฐ ์ด์œ : MCP์˜ ๋ฐ์ดํ„ฐ ๊ณ„์ธต์—์„œ ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ๊ฐ„ ๋ฉ”์‹œ์ง€ ๊ตฌ์กฐ์™€ ํ†ต์‹  ์˜๋ฏธ(semantics)๋ฅผ ์ •์˜ํ•˜๋Š” ๊ธฐ๋ณธ ๊ธฐ๋ฐ˜ ํ”„๋กœํ† ์ฝœ. + * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋™๊ธฐ์  ์‘๋‹ต๊ณผ ๋น„๋™๊ธฐ์  ์•Œ๋ฆผ(Notifications)์ด MCP ๋ฐ์ดํ„ฐ ์ „์†ก์—์„œ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌ๋˜๋Š”์ง€ [12, 13, 36, 37]. +* `[[Agent Skills (Anthropic)]]` + * ์—ฐ๊ฒฐ ์ด์œ : MCP๊ฐ€ ๊ฐœ๋ณ„ ์›์ž์ (atomic) ๋„๊ตฌ ์‹คํ–‰์„ ์ฒ˜๋ฆฌํ•œ๋‹ค๋ฉด, Agent Skills๋Š” ๋‹ค๋‹จ๊ณ„ ๋„๊ตฌ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ํฌ์žฅํ•˜๋Š” ํ‘œ์ค€. + * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: MCP์˜ ์ €์ˆ˜์ค€(low-level) ํ†ตํ•ฉ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋„ค์Šค์˜ L-์ปดํฌ๋„ŒํŠธ(๋ผ์ดํ”„์‚ฌ์ดํด) ์ˆ˜์ค€์—์„œ ๋„๊ตฌ๋“ค์„ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑํ•˜๊ณ  ํœด๋Œ€ ๊ฐ€๋Šฅํ•œ ํ˜•ํƒœ๋กœ ๋ฐฐํฌํ•˜๋Š”์ง€ [38-41]. + +### Deeper Research Questions +* MCP์™€ ๊ฐ™์€ ํ‘œ์ค€ํ™”๋œ ๋„๊ตฌ ํ†ตํ•ฉ ํ”„๋กœํ† ์ฝœ ํ™˜๊ฒฝ์—์„œ, ์ƒ์ดํ•œ ์‹ ๋ขฐ ์ˆ˜์ค€์„ ๊ฐ€์ง„ ์—ฌ๋Ÿฌ MCP ์„œ๋ฒ„๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ปจํ…์ŠคํŠธ ์œˆ๋„์šฐ ๋‚ด์—์„œ ์•ˆ์ „ํ•˜๊ฒŒ ๊ฒฉ๋ฆฌํ•˜๊ณ  ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๋Š” ํ•˜๋„ค์Šค ๋ ˆ๋ฒจ์˜ ๋ณด์•ˆ ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ๋ฌด์—‡์ธ๊ฐ€? +* ๋ฌด์ƒํƒœ(stateless)๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ํ•˜๋Š” MCP ์„œ๋ฒ„์˜ ๋„๊ตฌ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋ฌผ๋“ค์„ ์—์ด์ „ํŠธ๊ฐ€ ์—ฌ๋Ÿฌ ํ„ด์— ๊ฑธ์ณ ๊ธฐ์–ตํ•˜๋„๋ก ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด, ํ•˜๋„ค์Šค์˜ ์ƒํƒœ ์ €์žฅ์†Œ(S-์ปดํฌ๋„ŒํŠธ)์™€ MCP๋ฅผ ์–ด๋–ป๊ฒŒ ๊ฒฐํ•ฉํ•ด์•ผ ํ•˜๋Š”๊ฐ€? +* ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ถฉ๋Œ์„ ์•…์šฉํ•œ MCP์˜ ๋„๊ตฌ ์Šคํ‘ธํ•‘(Tool spoofing) ์ทจ์•ฝ์ ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์—์ด์ „ํŠธ ํ•˜๋„ค์Šค๋Š” ๋„๊ตฌ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ๋‹จ๊ณ„์—์„œ ์–ด๋–ค ์ถ”๊ฐ€์ ์ธ ์‹๋ณ„ ๋ฐ ์„œ๋ช… ๊ฒ€์ฆ ๊ณผ์ •์„ ๊ฑฐ์ณ์•ผ ํ•˜๋Š”๊ฐ€? +* MCP(Agent-to-Tool)์™€ A2A(Agent-to-Agent) ์‚ฌ์ด์˜ ํ†ตํ•ฉ ๊ฒฝ๊ณ„์—์„œ, A2A๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ๋ฐ›์€ ์ž‘์—… ๊ถŒํ•œ(Authorization) ์ •๋ณด๋ฅผ MCP ์„œ๋ฒ„์˜ ๋„๊ตฌ ์‹คํ–‰ ๊ถŒํ•œ์œผ๋กœ ์–ด๋–ป๊ฒŒ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณ€ํ™˜ํ•˜์—ฌ ๋งคํ•‘ํ•  ๊ฒƒ์ธ๊ฐ€? +* ๋กœ์ปฌ ํ†ต์‹ (stdio)๊ณผ ์›๊ฒฉ ํ†ต์‹ (Streamable HTTP) ์‚ฌ์ด์—์„œ, ์—์ด์ „ํŠธ ํ•˜๋„ค์Šค์˜ ๋„๊ตฌ ์‹คํ–‰ ์ง€์—ฐ ์‹œ๊ฐ„(latency) ์ฐจ์ด๊ฐ€ LLM์˜ ์˜์‚ฌ ๊ฒฐ์ • ๋ฐ ๊ณ„ํš ๋ฃจํ”„(E-์ปดํฌ๋„ŒํŠธ) ์„ฑ๋Šฅ์— ์–ด๋–ค ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”๊ฐ€? + +### Practical Application Contexts +* **Implementation:** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ ์‹œ, ๊ฐ ๋ฒค๋”๋ณ„(API๋งˆ๋‹ค) ๋งž์ถคํ˜• ์ปค๋„ฅํ„ฐ๋ฅผ ์ผ์ผ์ด ์ž‘์„ฑํ•  ํ•„์š” ์—†์ด, ํ‘œ์ค€ํ™”๋œ JSON-RPC ๊ธฐ๋ฐ˜์˜ ๋‹จ์ผ MCP ํด๋ผ์ด์–ธํŠธ๋งŒ ๊ตฌํ˜„ํ•˜๋ฉด Google Calendar, Notion ๋“ฑ ๋‹ค์–‘ํ•œ ์™ธ๋ถ€ ์„œ๋ฒ„์™€ ์ฆ‰์‹œ ์—ฐ๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [4, 42, 43]. +* **System Design:** ์—์ด์ „ํŠธ ์‹œ์Šคํ…œ์„ ์„ค๊ณ„ํ•  ๋•Œ ๋„๊ตฌ์™€ ๋ฐ์ดํ„ฐ์˜ ๋ชฉ๋ก์„ ํ•˜๋„ค์Šค ๋‚ด๋ถ€์— ์ •์ ์œผ๋กœ ์œ ์ง€ํ•˜์ง€ ์•Š๊ณ , ๋Ÿฐํƒ€์ž„์— ์™ธ๋ถ€ MCP ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋™์ ์œผ๋กœ ๋ฐœ๊ฒฌ(Discovery)ํ•˜๊ณ  ์Šคํ‚ค๋งˆ๋ฅผ ๋ Œ๋”๋งํ•˜๋„๋ก ๋ถ„๋ฆฌํ•˜์—ฌ ํ™•์žฅ์„ฑ๊ณผ ๋ชจ๋ธ ๋ถˆ๊ฐ€์ง€๋ก (agnostic)์„ ํ™•๋ณดํ•ฉ๋‹ˆ๋‹ค [5, 6]. +* **Operation / Maintenance:** ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ๋‚˜ API ๋„๊ตฌ๊ฐ€ ์ถ”๊ฐ€๋  ๋•Œ ํ•ต์‹ฌ ์—์ด์ „ํŠธ ์ฝ”๋“œ๋ฅผ ์žฌ๋ฐฐํฌํ•  ํ•„์š” ์—†์ด ๋…๋ฆฝ์ ์ธ MCP ์„œ๋ฒ„๋งŒ ๋ฐฐํฌ ๋ฐ ์—ฐ๊ฒฐํ•˜๋ฉด ๋˜๋ฏ€๋กœ ์ธํ”„๋ผ ๊ด€๋ฆฌ์˜ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ํฌ๊ฒŒ ์ค„์–ด๋“ญ๋‹ˆ๋‹ค [6, 44]. +* **Learning Path:** ๋‹จ์ˆœํ•œ ํ•จ์ˆ˜ ํ˜ธ์ถœ(Function Calling)์—์„œ๋ถ€ํ„ฐ ํŠน์ • ๋„๋ฉ”์ธ RAG, ๋Œ€๊ทœ๋ชจ API ํ†ตํ•ฉ(ToolLLM)์„ ๊ฑฐ์ณ ์ตœ์ข…์ ์œผ๋กœ ๊ฐœ๋ฐฉํ˜• ํ‘œ์ค€ ํ”„๋กœํ† ์ฝœ(MCP)๋กœ ๋„๊ตฌ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์ธํ”„๋ผ๊ฐ€ ์ง„ํ™”ํ•˜๋Š” ๊ณผ์ •์„ ํ•™์Šตํ•˜๋Š” ์ง€ํ‘œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค [45]. +* **My Project Relevance:** ์†Œ์Šค์— ๊ด€๋ จ ์ •๋ณด๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. + +### Adjacent Topics +* `[[RAG (Retrieval-Augmented Generation)]]` + * ํ™•์žฅ ๋ฐฉํ–ฅ: ๋‹จ์ˆœํ•œ ๋ฌธ๋งฅ ๊ฒ€์ƒ‰ ๋ฐ ํ…์ŠคํŠธ ์ฆ๊ฐ•์„ ๋ชฉํ‘œ๋กœ ํ•˜๋Š” ์ˆ˜๋™์  RAG ์‹œ์Šคํ…œ์—์„œ ๋‚˜์•„๊ฐ€, MCP๋ฅผ ํ†ตํ•œ ์™ธ๋ถ€ ์‹œ์Šคํ…œ ๋‚ด ์ž‘์—… '์‹คํ–‰(Execution)' ๋ฐ ์–‘๋ฐฉํ–ฅ ์ƒํ˜ธ์ž‘์šฉ์œผ๋กœ ํ™•์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก ์˜ ๋น„๊ต ์—ฐ๊ตฌ [46-50]. +* `[[Agent-Computer Interface (ACI)]]` + * ํ™•์žฅ ๋ฐฉํ–ฅ: ๋„๊ตฌ ๋ฐ ํ„ฐ๋ฏธ๋„ ํ™˜๊ฒฝ์— ์ ‘๊ทผํ•˜๋Š” ์–ธ์–ด ๋ชจ๋ธ์„ ์œ„ํ•ด ์ธํ„ฐํŽ˜์ด์Šค(์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ, ์ƒํƒœ ํ‘œํ˜„, ๋ฐ˜ํ™˜ ํ˜•์‹)๋ฅผ ํ•˜๋„ค์Šค๊ฐ€ ์–ด๋–ป๊ฒŒ ์ตœ์ ํ™”ํ•ด์•ผ ํ•˜๋Š”์ง€๋ฅผ ๋‹ค๋ฃจ๋Š” ์„ค๊ณ„ ์›์น™ [51, 52]. + +--- +*Last updated: 2026-05-01* \ No newline at end of file diff --git a/00_Raw/Next.js ๋ฐ Server Components ์ ์šฉ ํ”„๋กœ์ ํŠธ.md b/00_Raw/Next.js ๋ฐ Server Components ์ ์šฉ ํ”„๋กœ์ ํŠธ.md new file mode 100644 index 00000000..12ae26c5 --- /dev/null +++ b/00_Raw/Next.js ๋ฐ Server Components ์ ์šฉ ํ”„๋กœ์ ํŠธ.md @@ -0,0 +1,60 @@ +# [[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 new file mode 100644 index 00000000..0169202b --- /dev/null +++ b/00_Raw/Observability.md @@ -0,0 +1,66 @@ +# [[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/Plan-Execute-Verify (PEV) Loop.md b/00_Raw/Plan-Execute-Verify (PEV) Loop.md new file mode 100644 index 00000000..8261937c --- /dev/null +++ b/00_Raw/Plan-Execute-Verify (PEV) Loop.md @@ -0,0 +1,70 @@ +# [[Plan-Execute-Verify (PEV) Loop]] + +## ๐Ÿ“Œ Brief Summary +PEV(Plan-Execute-Verify) ๋ฃจํ”„๋Š” ์—์ด์ „ํŠธ์˜ ๊ณ„ํš ์ˆ˜๋ฆฝ๊ณผ ์‹คํ–‰์„ ๋ถ„๋ฆฌํ•˜๊ณ , ๊ฒ€์ฆ์„ ๊ตฌ์กฐํ™”๋œ ํ”ผ๋“œ๋ฐฑ ๋ฃจํ”„๋กœ ๊ฐ•์ œํ•˜๋Š” 3๋‹จ๊ณ„ ์—์ด์ „ํŠธ ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด์ด๋‹ค [1]. ์ด ํŒจํ„ด์€ ๋Œ€ํ˜• ์–ธ์–ด ๋ชจ๋ธ(LLM)์ด ๋ณต์žกํ•œ ๋‹ค๋‹จ๊ณ„ ๋ฌธ์ œ๋ฅผ ๋‹จ ํ•œ ๋ฒˆ์˜ ์‹œ๋„๋กœ ํ•ด๊ฒฐํ•˜๋„๋ก ์š”๊ตฌํ•˜๋Š” ๋Œ€์‹ , ์ž‘์—…์„ ๋ช…์‹œ์ ์ธ ๊ณ„ํš์œผ๋กœ ๋ถ„ํ•ด(Plan)ํ•˜๊ณ , ๊ทธ ๊ณ„ํš์˜ ๊ฒฝ๊ณ„ ๋‚ด์—์„œ ์‹คํ–‰(Execute)ํ•˜๋ฉฐ, ๊ฒฐ๊ณผ๋ฌผ์„ ๊ณ„ํš ๋ฐ ์™ธ๋ถ€ ํ’ˆ์งˆ ๊ธฐ์ค€๊ณผ ๋Œ€์กฐํ•˜์—ฌ ๊ฒ€์ฆ(Verify)ํ•˜๋„๋ก ์ง€์‹œํ•œ๋‹ค [1]. ์ด๋ฅผ ํ†ตํ•ด ์—์ด์ „ํŠธ์˜ ์ž์œจ์  ๋น„๊ฒฐ์ •์„ฑ(non-determinism)์„ ํ†ต์ œํ•˜๊ณ  ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์žฅํ•œ๋‹ค [2]. + +## ๐Ÿ“– Core Content +PEV ๋ฃจํ”„๋Š” ์ „ํ†ต์ ์ธ '์ƒ์„ฑ ํ›„ ๊ฒ€์‚ฌ(Generate-and-Check)' ๋ฐฉ์‹๊ณผ ๊ตฌ์กฐ์ ์œผ๋กœ ๊ตฌ๋ณ„๋˜๋Š” ํŠน์„ฑ์„ ๊ฐ€์ง€๋ฉฐ, ๊ฐ ๋‹จ๊ณ„์—์„œ ์—์ด์ „ํŠธ์˜ ์ž์œจ์„ฑ์„ ์ œํ•œํ•˜๊ณ  ๊ฒ€์ฆ์„ ๊ฐ•์ œํ•œ๋‹ค [3]. + +* **Plan (๊ณ„ํš ๋‹จ๊ณ„)**: + * ์—์ด์ „ํŠธ๊ฐ€ ์ฆ‰์‹œ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ํ–‰๋™ํ•˜๋Š” ๋Œ€์‹ , ๋ฌธ์ œ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ๋ถ„ํ•ดํ•˜๊ณ  ์ˆ˜์šฉ ๊ธฐ์ค€(acceptance criteria)์„ ํฌํ•จํ•œ ๊ณ„ํš์„ ์ˆ˜๋ฆฝํ•œ๋‹ค [1, 3]. + * ๊ณ„ํš ๋‹จ๊ณ„์—์„œ ์ž์œ ๋„(degrees of freedom)๋ฅผ ์ค„์ž„์œผ๋กœ์จ, ๋™์ผํ•œ ์ž‘์—…์— ๋Œ€ํ•ด ๋งค๋ฒˆ ๋‹ค๋ฅธ ์ถ”๋ก  ๊ฒฝ๋กœ๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ๋น„๊ฒฐ์ •์„ฑ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ๋‹ค [2]. +* **Execute (์‹คํ–‰ ๋‹จ๊ณ„)**: + * ์—์ด์ „ํŠธ์˜ ์‹คํ–‰ ๋ฒ”์œ„๋Š” ์ˆ˜๋ฆฝ๋œ ๊ณ„ํš์— ์˜ํ•ด ์—„๊ฒฉํ•˜๊ฒŒ ์ œํ•œ๋œ๋‹ค [3]. + * ๋ชจ๋“  ๋„๊ตฌ ํ˜ธ์ถœ(tool call) ์‹œ๋งˆ๋‹ค ํ•˜๋„ค์Šค ๊ฒŒ์ดํŠธ๊ฐ€ ์ž‘๋™ํ•œ๋‹ค. ์‹คํ–‰ ์ „ ๊ฒŒ์ดํŠธ(Pre-execution gates)๋Š” ๋„๊ตฌ ํ˜ธ์ถœ์ด ์ด๋ฃจ์–ด์ง€๊ธฐ ์ „์— ๊ฐœ์ž…ํ•˜์—ฌ ํ•ด๋‹น ๋„๊ตฌ๊ฐ€ ์•Œ๋ ค์ง„ ๋„๊ตฌ์ธ์ง€, ์ธ์ž๊ฐ€ ์œ ํšจํ•œ์ง€, ์‚ฌ์šฉ์ž ์Šน์ธ์ด ํ•„์š”ํ•œ์ง€, ์š”์ฒญ๋œ ์ž‘์—… ๋ฒ”์œ„๊ฐ€ ์ž‘์—… ๊ณต๊ฐ„ ๋‚ด์— ์žˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•˜๊ณ  ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚œ ํ˜ธ์ถœ์„ ์ฐจ๋‹จํ•œ๋‹ค [2, 3]. +* **Verify (๊ฒ€์ฆ ๋‹จ๊ณ„)**: + * ์‚ฌํ›„ ๊ฒ€์ฆ(Post-hoc only)์— ๊ทธ์น˜์ง€ ์•Š๊ณ , ์‹คํ–‰ ์ „, ๋Ÿฐํƒ€์ž„, ์‹คํ–‰ ํ›„ ๋ฐ ๊ณ„ํš ์ผ์น˜์„ฑ(plan alignment) ์ „๋ฐ˜์— ๊ฑธ์ณ ๊ฒ€์ฆ์ด ์ด๋ฃจ์–ด์ง„๋‹ค [3]. + * ๋‹จ์ˆœํ•œ ์ด์ง„ ํ•ฉ๊ฒฉ/์‹คํŒจ(binary pass/fail)๊ฐ€ ์•„๋‹ˆ๋ผ, ์ปจํ…์ŠคํŠธ๊ฐ€ ํฌํ•จ๋œ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ์—์ด์ „ํŠธ์˜ ์ถ”๋ก  ๊ณผ์ •์œผ๋กœ ๋‹ค์‹œ ํ”ผ๋“œ๋ฐฑ(feedback)ํ•˜์—ฌ ์ž๊ธฐ ์ˆ˜์ •์„ ๋•๋Š”๋‹ค [3]. + * ํ‘œ์ค€ ํ…Œ์ŠคํŠธ ๋Ÿฌ๋„ˆ(test runner)๋กœ๋Š” ํŒŒ์•…ํ•  ์ˆ˜ ์—†๋Š” ์•„ํ‚คํ…์ฒ˜์  ์งˆ๋ฌธ๋“ค(์˜ˆ: ๊ธฐ์กด ์ธ์ฆ ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์‚ฌ์šฉํ–ˆ๋Š”๊ฐ€, ์•„๋‹ˆ๋ฉด ์ƒˆ๋กœ ๋งŒ๋“ค์—ˆ๋Š”๊ฐ€? ์‘๋‹ต ํ˜•์‹ ๊ทœ์น™์„ ๋”ฐ๋ž๋Š”๊ฐ€?)์„ ํ‰๊ฐ€ํ•˜๋Š” '๊ณ„ํš ์ผ์น˜์„ฑ(plan alignment)' ๊ฒ€์ฆ ๊ฒŒ์ดํŠธ๊ฐ€ ์กด์žฌํ•œ๋‹ค [2]. + +## โš–๏ธ Trade-offs & Caveats +PEV ๋ฃจํ”„ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋„์ž…ํ•  ๋•Œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ œ์•ฝ ์‚ฌํ•ญ ๋ฐ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๊ฐ€ ์กด์žฌํ•œ๋‹ค. + +* **์‹คํ–‰ ์˜ค๋ฒ„ํ—ค๋“œ ์ฆ๊ฐ€**: ์—์ด์ „ํŠธ๊ฐ€ ๋‹จ์ผ ํŒจ์Šค๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์„ ๋ช…์‹œ์ ์œผ๋กœ ์ฐจ๋‹จํ•˜๊ณ  ๊ณ„ํš-์‹คํ–‰-๊ฒ€์ฆ์˜ 3๋‹จ๊ณ„๋ฅผ ๊ฐ•์ œํ•˜๋ฏ€๋กœ, ๊ฐ„๋‹จํ•œ ์ž‘์—…์—์„œ๋„ ์‹œ์Šคํ…œ์˜ ๋ณต์žก๋„์™€ ์ฒ˜๋ฆฌ ๋Œ€๊ธฐ ์‹œ๊ฐ„(Latency)์ด ์ฆ๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค [1, 3]. +* **ํ•˜๋„ค์Šค ์œ ์ง€๋ณด์ˆ˜ ๋ถ€๋‹ด**: PEV ๋ฃจํ”„๊ฐ€ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋Ÿฐํƒ€์ž„ ๋ฐ ์‹คํ–‰ ์ „ํ›„์˜ ์—ฌ๋Ÿฌ ๋‹จ๊ณ„์—์„œ ๋„๊ตฌ ํ˜ธ์ถœ์„ ์ฐจ๋‹จํ•˜๊ฑฐ๋‚˜ ํ—ˆ์šฉํ•˜๋Š” ๊ฒŒ์ดํŠธ(gates)๋ฅผ ์ด˜์ด˜ํ•˜๊ฒŒ ์„ค๊ณ„ํ•ด์•ผ ํ•œ๋‹ค. ์ธ๊ฐ„์€ ๊ฒฐ๊ณผ๋ฌผ ์ž์ฒด๋ฅผ ๋ฆฌ๋ทฐํ•˜๋Š” ๋Œ€์‹  ํ•˜๋„ค์Šค๋ฅผ ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ณ  ์˜ํ–ฅ๋ ฅ์ด ํฐ ๊ฒฐ์ • ์ง€์ ์—์„œ ์Šน์ธํ•˜๋Š” ์—ญํ• ์„ ๋งก๊ฒŒ ๋˜์–ด, ์ดˆ๊ธฐ ์ธํ”„๋ผ(ํ•˜๋„ค์Šค) ๊ตฌ์ถ• ๋ฐ ๊ด€๋ฆฌ ๋น„์šฉ์ด ํฌ๊ฒŒ ์ฆ๊ฐ€ํ•œ๋‹ค [3]. +* **๊ฒ€์ฆ ๋กœ์ง ๊ตฌํ˜„์˜ ์–ด๋ ค์›€**: ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•˜๋Š” ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ ์™ธ์—๋„, ์—์ด์ „ํŠธ๊ฐ€ ์ˆ˜๋ฆฝ๋œ ๊ณ„ํš๊ณผ ๊ธฐ์กด ์•„ํ‚คํ…์ฒ˜ ๊ทœ์น™์„ ์ค€์ˆ˜ํ–ˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” '๊ณ„ํš ์ผ์น˜์„ฑ(plan alignment)' ๊ฒ€์ฆ ๋กœ์ง์„ ํ•˜๋„ค์Šค์— ๋ณ„๋„๋กœ ๊ตฌ์ถ•ํ•ด์•ผ ํ•˜๋Š” ๊ธฐ์ˆ ์  ์–ด๋ ค์›€์ด ๋”ฐ๋ฅธ๋‹ค [2]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [์•„ํ‚คํ…์ฒ˜/ํŒจํ„ด (Architecture / Pattern)] +- [[Generate-and-Check]] + - ์—ฐ๊ฒฐ ์ด์œ : PEV ํŒจํ„ด๊ณผ ๋Œ€๋น„๋˜๋Š” ์ „ํ†ต์ ์ธ ์—์ด์ „ํŠธ ์‹คํ–‰ ๋ฐฉ์‹์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ณ„ํš ์—†์ด ์ž์œ ๋กญ๊ฒŒ ์‹คํ–‰ํ•œ ํ›„ ์‚ฌํ›„ ๊ฒ€์ฆ(Post-hoc)๊ณผ ์ด์ง„ ํ”ผ๋“œ๋ฐฑ(binary pass/fail)๋งŒ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ์‹์ด ๊ฐ€์ง„ ํ•œ๊ณ„๋ฅผ ์ดํ•ดํ•˜๊ณ , PEV ๋ฃจํ”„์˜ ๊ตฌ์กฐ์  ํ•„์š”์„ฑ์„ ๋ช…ํ™•ํžˆ ํ•  ์ˆ˜ ์žˆ๋‹ค [3]. + +- [[Agent Harness]] + - ์—ฐ๊ฒฐ ์ด์œ : PEV ๋ฃจํ”„๋Š” ์—์ด์ „ํŠธ ํ•˜๋„ค์Šค๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ฒฐ์ •๋ก ์  ์ œ์–ด(๊ฒŒ์ดํŠธ, ํ”ผ๋“œ๋ฐฑ ๋ฃจํ”„) ์œ„์—์„œ ์ž‘๋™ํ•˜๋Š” ํ•˜๋„ค์Šค ์„ค๊ณ„ ํŒจํ„ด์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์–ธ์–ด ๋ชจ๋ธ(LLM) ์ž์ฒด์˜ ์ง€๋Šฅ์„ ๋„˜์–ด, ์ฃผ๋ณ€์„ ๋‘˜๋Ÿฌ์‹ผ ์‹คํ–‰ ํ™˜๊ฒฝ๊ณผ ๊ทœ์น™(ํ•˜๋„ค์Šค)์ด ์—์ด์ „ํŠธ์˜ ์‹ ๋ขฐ์„ฑ์„ ์–ด๋–ป๊ฒŒ ๋ณด์žฅํ•˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค [1]. + +#### [๊ฒ€์ฆ ๋ฐ ์ œ์–ด ๋ฉ”์ปค๋‹ˆ์ฆ˜ (Verification & Control Mechanisms)] +- [[Pre-execution gates]] + - ์—ฐ๊ฒฐ ์ด์œ : PEV ๋ฃจํ”„์˜ ์‹คํ–‰(Execute) ๋‹จ๊ณ„์—์„œ ์—์ด์ „ํŠธ์˜ ๋„๊ตฌ ํ˜ธ์ถœ์„ ์‹ค์ œ๋กœ ํ†ต์ œํ•˜๋Š” ํ•ต์‹ฌ ํ•˜๋„ค์Šค ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์—์ด์ „ํŠธ๊ฐ€ ์Šน์ธ๋˜์ง€ ์•Š์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ž‘์—… ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚œ ํ–‰๋™์„ ์‹œ๋„ํ•  ๋•Œ, ์‹œ์Šคํ…œ์ด ์ด๋ฅผ ์‹คํ–‰ ์ „์— ๊ฒฐ์ •๋ก ์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ์ฐจ๋‹จํ•˜๋Š”์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค [2]. + +- [[Plan alignment]] + - ์—ฐ๊ฒฐ ์ด์œ : PEV ๋ฃจํ”„์˜ ๊ฒ€์ฆ(Verify) ๋‹จ๊ณ„์—์„œ ์ค‘์š”ํ•˜๊ฒŒ ๋‹ค๋ฃจ์–ด์ง€๋Š” ํ‰๊ฐ€ ๊ธฐ์ค€์œผ๋กœ, ์—์ด์ „ํŠธ ์‚ฐ์ถœ๋ฌผ์˜ ์•„ํ‚คํ…์ฒ˜์  ์ผ๊ด€์„ฑ์„ ์˜๋ฏธํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋‹จ์ˆœํžˆ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•˜๋Š” ๊ฒƒ์„ ๋„˜์–ด, ๊ธฐ์กด ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ๊ทœ์น™์ด๋‚˜ ๊ตฌ์กฐ(์˜ˆ: ๋ฏธ๋“ค์›จ์–ด ์žฌ์‚ฌ์šฉ, ์‘๋‹ต ํฌ๋งท)๋ฅผ ์ค€์ˆ˜ํ–ˆ๋Š”์ง€ ๊ฒ€์ฆํ•˜๋Š” ์‹ฌ์ธต์ ์ธ ํ‰๊ฐ€ ๋ฐฉ์‹์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค [2]. + +### Deeper Research Questions +- ๋‹จ์ˆœํ•œ Generate-and-Check ํŒจํ„ด๊ณผ ๋น„๊ตํ•˜์—ฌ, PEV ๋ฃจํ”„ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ํ•„์—ฐ์ ์œผ๋กœ ์ฆ๊ฐ€ํ•˜๋Š” API ํ˜ธ์ถœ ํšŸ์ˆ˜ ๋ฐ ํ† ํฐ ์†Œ๋ชจ ๋น„์šฉ์„ ํ•˜๋„ค์Šค ๋ ˆ๋ฒจ์—์„œ ์–ด๋–ป๊ฒŒ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- ์‹คํ–‰ ์ „ ๊ฒŒ์ดํŠธ(Pre-execution gates)๋Š” ์—์ด์ „ํŠธ์˜ ๋„๊ตฌ ์ธ์ž(argument) ๋ฐ ์ ‘๊ทผ ๊ถŒํ•œ์˜ ์œ ํšจ์„ฑ์„ ์–ด๋– ํ•œ ๊ฒฐ์ •๋ก ์ (deterministic) ๋ฐฉ์‹์œผ๋กœ ํ‰๊ฐ€ํ•˜๋Š”๊ฐ€? +- ์ฝ”๋“œ ํ…Œ์ŠคํŠธ ๋Ÿฌ๋„ˆ(test runner)๋กœ๋Š” ํ™•์ธ ๋ถˆ๊ฐ€๋Šฅํ•œ '๊ณ„ํš ์ผ์น˜์„ฑ(Plan alignment)' ๋ฐ ์•„ํ‚คํ…์ฒ˜ ์ค€์ˆ˜ ์—ฌ๋ถ€๋ฅผ ์ž๋™ํ™”๋œ ํ•˜๋„ค์Šค ๊ฒŒ์ดํŠธ๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ค ๊ธฐ์ˆ ์  ์ ‘๊ทผ์ด ํ•„์š”ํ•œ๊ฐ€? +- PEV ๋ฃจํ”„๋ฅผ ํ†ตํ•ด ์—์ด์ „ํŠธ์—๊ฒŒ ์ œ๊ณต๋˜๋Š” '์ปจํ…์ŠคํŠธ๊ฐ€ ํฌํ•จ๋œ ์—๋Ÿฌ ํ”ผ๋“œ๋ฐฑ'์€ ์—์ด์ „ํŠธ์˜ ์ž๊ฐ€ ์ˆ˜์ •(self-correction) ์„ฑ๊ณต๋ฅ ์„ ์–ผ๋งˆ๋‚˜ ํ–ฅ์ƒ์‹œํ‚ค๋Š”๊ฐ€? +- ๊ณ„ํš ๋‹จ๊ณ„(Plan)์—์„œ ์ž์œ ๋„๋ฅผ ์˜๋„์ ์œผ๋กœ ์ œํ•œํ•˜๋Š” ๊ฒƒ์ด, ์˜ˆ๊ธฐ์น˜ ์•Š์€ ์ฐฝ์˜์  ํ•ด๋ฒ•์„ ๋„์ถœํ•  ์ˆ˜ ์žˆ๋Š” ์—์ด์ „ํŠธ์˜ ๋Šฅ๋ ฅ์„ ์ €ํ•ดํ•˜๋Š” ๋ถ€์ž‘์šฉ(Trade-off)์€ ์—†๋Š”๊ฐ€? + +### Practical Application Contexts +- **Implementation:** ๋ณต์žกํ•œ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ ์ž‘์—…์„ ์ž์œจ ์—์ด์ „ํŠธ์—๊ฒŒ ์œ„์ž„ํ•  ๋•Œ, ํ•œ ๋ฒˆ์˜ ํ”„๋กฌํ”„ํŠธ๋กœ ์ „์ฒด ์ฝ”๋“œ๋ฅผ ์งœ๊ฒŒ ํ•˜์ง€ ์•Š๊ณ  ์š”๊ตฌ์‚ฌํ•ญ ๋ถ„์„ ๋ฐ ๊ณ„ํš์„œ ์ž‘์„ฑ, ์Šน์ธ, ์‹คํ–‰, ๊ฒ€์ฆ์˜ ๋‹ค๋‹จ๊ณ„ ์›Œํฌํ”Œ๋กœ์šฐ๋กœ ๋‚˜๋ˆ„์–ด ๊ตฌํ˜„ํ•  ๋•Œ ์ ์šฉ๋œ๋‹ค. +- **System Design:** ์—์ด์ „ํŠธ๊ฐ€ ํ˜ธ์ŠคํŠธ ์‹œ์Šคํ…œ์—์„œ ํŒŒ๊ดด์ ์ธ ๋„๊ตฌ(์˜ˆ: ์…ธ ๋ช…๋ น์–ด, ํŒŒ์ผ ๋ฎ์–ด์“ฐ๊ธฐ)๋ฅผ ๋ฌด๋ถ„๋ณ„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋ง‰๊ธฐ ์œ„ํ•ด ํˆด ํ˜ธ์ถœ ์ธํ„ฐ์…‰ํ„ฐ(Pre-execution gates)๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ ํ™œ์šฉ๋œ๋‹ค. +- **Operation / Maintenance:** ์ธ๊ฐ„ ์ž‘์—…์ž๊ฐ€ ์—์ด์ „ํŠธ๊ฐ€ ๋งŒ๋“  ์ฝ”๋“œ๋ฅผ ์ผ์ผ์ด ๋ฆฌ๋ทฐํ•˜๋Š” ๋ฐฉ์‹์—์„œ ๋ฒ—์–ด๋‚˜, ์—์ด์ „ํŠธ์˜ ๊ณ„ํš์„ ์Šน์ธํ•˜๊ณ  ํ•˜๋„ค์Šค ๊ฒ€์ฆ ๊ทœ์น™์„ ์œ ์ง€๋ณด์ˆ˜ํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์šด์˜ ๋ชจ๋ธ์„ ์ „ํ™˜ํ•  ๋•Œ ํ•ต์‹ฌ์ ์ธ ๊ธฐ์ค€์ด ๋œ๋‹ค. +- **Learning Path:** LLM์„ ๋‹จ์ˆœํ•œ ์ถ”๋ก  ์—”์ง„์„ ๋„˜์–ด, ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ํ™˜๊ฒฝ์—์„œ ์•ˆ์ „ํ•˜๊ฒŒ ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ '์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ์›Œํฌ์—”์ง„'์œผ๋กœ ๊ฒฉ์ƒ์‹œํ‚ค๋Š” ํ•˜๋„ค์Šค ์—”์ง€๋‹ˆ์–ด๋ง์˜ ํ•ต์‹ฌ ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด์„ ํ•™์Šตํ•  ๋•Œ ํ•„์ˆ˜์ ์ด๋‹ค. +- **My Project Relevance:** ๋‹ค์ค‘ ์—์ด์ „ํŠธ ์‹œ์Šคํ…œ์ด๋‚˜ ์ž์œจ ์ฝ”๋”ฉ ์—์ด์ „ํŠธ๋ฅผ ๊ฐœ๋ฐœํ•  ๋•Œ, ์—์ด์ „ํŠธ๊ฐ€ ๋ฌดํ•œ ๋ฃจํ”„์— ๋น ์ง€๊ฑฐ๋‚˜ ์—‰๋šฑํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ž„์˜๋กœ ์ƒ์„ฑํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๋ฌธ์ œ(ํ™˜๊ฐ)๋ฅผ ํ†ต์ œํ•˜๊ธฐ ์œ„ํ•œ ํŒŒ์ดํ”„๋ผ์ธ ์„ค๊ณ„์— ์ง์ ‘์ ์œผ๋กœ ์ ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค. + +### Adjacent Topics +- [[Self-verification]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ์—์ด์ „ํŠธ๊ฐ€ ์™ธ๋ถ€์˜ ํ•˜๋„ค์Šค ํ”ผ๋“œ๋ฐฑ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์Šค์Šค๋กœ ์ž์‹ ์˜ ์‚ฐ์ถœ๋ฌผ์„ ํ‰๊ฐ€ํ•˜๊ณ  ๋น„ํŒ(critique)ํ•˜์—ฌ ์ˆ˜์ •ํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด PEV์˜ ๊ฒ€์ฆ ๋‹จ๊ณ„์™€ ์–ด๋–ป๊ฒŒ ํ†ตํ•ฉ๋˜๋Š”์ง€ ํƒ๊ตฌ. +- [[Human-in-the-Loop (HITL)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: PEV ๋ฃจํ”„ ๋‚ด์—์„œ ์ธ๊ฐ„์ด ๊ฐœ์ž…ํ•ด์•ผ ํ•˜๋Š” ์˜ํ–ฅ๋ ฅ์ด ํฐ ๊ฒฐ์ • ์ง€์ (high-leverage decision points)์„ ์–ด๋–ป๊ฒŒ ์‹๋ณ„ํ•˜๊ณ  ์Šน์ธ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์„ค๊ณ„ํ• ์ง€์— ๋Œ€ํ•œ ์—ฐ๊ตฌ. + +--- +*Last updated: 2026-05-01* \ No newline at end of file diff --git a/00_Raw/Production Environment Observability.md b/00_Raw/Production Environment Observability.md new file mode 100644 index 00000000..193a48de --- /dev/null +++ b/00_Raw/Production Environment Observability.md @@ -0,0 +1,63 @@ +# [[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 new file mode 100644 index 00000000..ff946970 --- /dev/null +++ b/00_Raw/Production Monitoring and Observability.md @@ -0,0 +1,67 @@ +# [[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 new file mode 100644 index 00000000..72eacfd2 --- /dev/null +++ b/00_Raw/Production Monitoring.md @@ -0,0 +1,64 @@ +# [[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/Pull Request (PR).md b/00_Raw/Pull Request (PR).md new file mode 100644 index 00000000..37673484 --- /dev/null +++ b/00_Raw/Pull Request (PR).md @@ -0,0 +1,56 @@ +# [[Pull Request (PR)]] + +## ๐Ÿ“Œ Brief Summary +Pull Request(PR)๋Š” ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜(Feature Branch)์—์„œ ์ž‘์—…ํ•œ ์ฝ”๋“œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜(`main`)๋กœ ๋ณ‘ํ•ฉํ•˜๊ธฐ ์ „์— ํŒ€์›๋“ค์˜ ์ฝ”๋“œ ๋ฆฌ๋ทฐ์™€ ํ’ˆ์งˆ ๊ฒ€์ฆ์„ ๊ฑฐ์น˜๋„๋ก ํ•˜๋Š” ํ•ต์‹ฌ ํ˜‘์—… ํ”„๋กœ์„ธ์Šค์ž…๋‹ˆ๋‹ค [1-3]. PR์€ ๋‹จ์ˆœํ•œ ์ฝ”๋“œ ๋ณ‘ํ•ฉ ์š”์ฒญ์„ ๋„˜์–ด, ๋™๋ฃŒ์˜ ๊ฒ€ํ† ๋ฅผ ์ด‰์ง„ํ•˜๊ณ  ๋ฒ„๊ทธ๋‚˜ UI ํšŒ๊ท€(regression)๊ฐ€ ์šด์˜ ํ™˜๊ฒฝ์— ๋„๋‹ฌํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๋Š” ํ’ˆ์งˆ ๊ด€๋ฆฌ์˜ ์ตœ์ข… ๊ด€๋ฌธ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค [3-5]. ์•„์ฃผ ์ž‘์€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด๋ผ๋„ ์ผ๊ด€๋˜๊ฒŒ PR์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์€ ํŒ€ ๋‚ด ๊ฑด์ „ํ•œ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ์Šต๊ด€๊ณผ ๊ทœ์œจ์„ ํ˜•์„ฑํ•˜๋Š” ๋ฐ ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค [4]. + +## ๐Ÿ“– Core Content +* **PR์˜ ํ•ต์‹ฌ ๋ชฉ์ ๊ณผ ๊ตฌ์„ฑ:** PR์€ ์ฝ”๋“œ ๋ฆฌ๋ทฐ์™€ ํ˜‘์—…์ด ์ด๋ฃจ์–ด์ง€๋Š” ์ค‘์‹ฌ ๊ณต๊ฐ„์ž…๋‹ˆ๋‹ค. ์˜ฌ๋ฐ”๋ฅธ PR์€ ๋‹จ์ˆœํžˆ ์ฝ”๋“œ๋งŒ ์˜ฌ๋ฆฌ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ '๋ฌด์—‡์ด ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€', '์™œ ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€' ๋ช…ํ™•ํžˆ ์„œ์ˆ ํ•ด์•ผ ํ•˜๋ฉฐ, UI์— ๋ณ€ํ™”๊ฐ€ ์žˆ๋‹ค๋ฉด ์Šคํฌ๋ฆฐ์ƒท์„ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [1]. ๋˜ํ•œ, PR ์ด๋ฆ„์ด๋‚˜ ์„ค๋ช…์— JIRA ๋“ฑ์˜ ํ‹ฐ์ผ“ ID(์˜ˆ: PROJ-123)๋ฅผ ํฌํ•จ์‹œํ‚ค๋ฉด ์ฝ”๋“œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ๊ณผ ๋น„์ฆˆ๋‹ˆ์Šค ์š”๊ตฌ์‚ฌํ•ญ์„ ์—ฐ๊ฒฐํ•˜๋Š” ์ถ”์ ์„ฑ(Traceability)์„ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ์–ด, ๋ฆฌ๋ทฐ์–ด๊ฐ€ ๋ณ€๊ฒฝ์˜ ๋งฅ๋ฝ์„ ๋น ๋ฅด๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [6, 7]. +* **PR ํฌ๊ธฐ ๊ด€๋ฆฌ:** PR์€ ๊ฐ€๊ธ‰์  200์ค„ ์ดํ•˜์˜ ์ž‘์€ ํฌ๊ธฐ๋กœ ์œ ์ง€ํ•˜๊ณ , ํ•˜๋‚˜์˜ ๋…ผ๋ฆฌ์  ๋ณ€๊ฒฝ ์‚ฌํ•ญ(Atomic commit)์—๋งŒ ์ง‘์ค‘ํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค [1, 2, 4]. ๋ฆฌ๋ทฐ์–ด๊ฐ€ ํ•œ ๋ฒˆ์— 2,000์ค„์ด ๋„˜๋Š” ์ฝ”๋“œ๋ฅผ ๊ฐ์‚ฌ(Audit)ํ•˜๋Š” ๊ฒƒ์€ ๋น„ํšจ์œจ์ ์ด๋ฉฐ, ํฌ๊ธฐ๊ฐ€ ์ž‘์€ PR์ผ์ˆ˜๋ก ๋น ๋ฅด๊ณ  ์ฒ ์ €ํ•œ ๊ฒ€ํ† ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค [3]. +* **๋ณ‘ํ•ฉ ์ „ ํ•„์ˆ˜ ์กฐ๊ฑด (Safeguards):** PR์„ `main` ๋ธŒ๋žœ์น˜์— ๋ณ‘ํ•ฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ช‡ ๊ฐ€์ง€ ์•ˆ์ „์žฅ์น˜๋ฅผ ๊ฑฐ์ณ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋ธŒ๋žœ์น˜ ๋ณดํ˜ธ(Branch protection) ์„ค์ •์„ ํ†ตํ•ด ์ตœ์†Œ 1๋ช… ์ด์ƒ์˜ ๋™๋ฃŒ ์Šน์ธ(Peer Review)์„ ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค [1, 2, 4, 8]. ๋˜ํ•œ, ๋ณ‘ํ•ฉ ์ „ CI ํŒŒ์ดํ”„๋ผ์ธ์˜ ๋ชจ๋“  ์ž๋™ํ™”๋œ ํ…Œ์ŠคํŠธ๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ํ†ต๊ณผํ•ด์•ผ๋งŒ ํ•ฉ๋‹ˆ๋‹ค [1, 2, 9]. +* **์‹œ๊ฐ์  ๋ฆฌ๋ทฐ (Visual Review):** ํ”„๋ก ํŠธ์—”๋“œ ํ™˜๊ฒฝ์—์„œ๋Š” ์ผ๋ฐ˜์ ์ธ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ์™ธ์— ์‹œ๊ฐ์  ๋ฆฌ๋ทฐ๊ฐ€ ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค. Storybook, Chromatic, Happo์™€ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ CI ํŒŒ์ดํ”„๋ผ์ธ์— ํ†ตํ•ฉํ•˜์—ฌ PR ์ƒ์„ฑ ์‹œ ์ž๋™์œผ๋กœ ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ(Visual Regression Testing) ๋ฐ ์ ‘๊ทผ์„ฑ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5, 10-12]. ์˜๋„์น˜ ์•Š์€ ๋ ˆ์ด์•„์›ƒ ๋ณ€ํ™”๋‚˜ ์ƒ‰์ƒ ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ•˜๋ฉด PR์— ๊ฒฝ๊ณ (Badge)๊ฐ€ ํ‘œ์‹œ๋˜์–ด ๋ณ‘ํ•ฉ์„ ๋ง‰๊ณ  ์ˆ˜๋™ ๊ฒ€ํ† ๋ฅผ ์œ ๋„ํ•ฉ๋‹ˆ๋‹ค [5, 13]. +* **๋ณ‘ํ•ฉ ์ „๋žต๊ณผ ์‚ฌํ›„ ์ฒ˜๋ฆฌ:** PR ๋ฆฌ๋ทฐ๊ฐ€ ์™„๋ฃŒ๋˜์–ด ๋ณ‘ํ•ฉํ•  ๋•Œ๋Š” ์ „์ฒด ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์Šค์ฟผ์‹œ ๋ณ‘ํ•ฉ(Squash Merge)์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค [1, 8, 14]. ๋ณ‘ํ•ฉ์ด ๋๋‚œ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜๋Š” ์ €์žฅ์†Œ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ฆ‰์‹œ(๋˜๋Š” ์ž๋™) ์‚ญ์ œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [1, 4, 8, 14]. + +## โš–๏ธ Trade-offs & Caveats +* **์ž‘์—… ์˜ค๋ฒ„ํ—ค๋“œ ์ฆ๊ฐ€:** ๋ชจ๋“  ์ฝ”๋“œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ(์‹ฌ์ง€์–ด ์•„์ฃผ ๋‹จ์ˆœํ•œ ์˜คํƒ€ ์ˆ˜์ • ๋“ฑ)์— ๋Œ€ํ•ด์„œ๋„ PR์„ ์ƒ์„ฑํ•˜๊ณ  ๋™๋ฃŒ์˜ ๋ฆฌ๋ทฐ ๋ฐ CI ๊ฒ€์‚ฌ๋ฅผ ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๋ฏ€๋กœ, ๊ทน๋„๋กœ ๋น ๋ฅธ ๊ฐœ๋ฐœ๊ณผ ๋ฐฐํฌ๊ฐ€ ํ•„์š”ํ•œ ์ƒํ™ฉ์—์„œ๋Š” ์ด๋Ÿฌํ•œ ์ ˆ์ฐจ๊ฐ€ ํ”„๋กœ์„ธ์Šค ์˜ค๋ฒ„ํ—ค๋“œ๋กœ ์ž‘์šฉํ•˜์—ฌ ๊ฐœ๋ฐœ ์†๋„๋ฅผ ๋Šฆ์ถœ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [4, 15]. +* **๋ฆฌ๋ทฐ ์ง€์—ฐ ๋ณ‘๋ชฉ ํ˜„์ƒ:** PR์˜ ํฌ๊ธฐ๋ฅผ ์ž‘๊ฒŒ ์ชผ๊ฐœ์ง€ ์•Š๊ณ  ๋ฐฉ์น˜ํ•˜์—ฌ ๊ฑฐ๋Œ€ํ•œ PR์ด ์ƒ์„ฑ๋  ๊ฒฝ์šฐ, ๋ฆฌ๋ทฐ์–ด๊ฐ€ ์ฝ”๋“œ๋ฅผ ํŒŒ์•…ํ•˜๊ณ  ์Šน์ธํ•˜๋Š” ๋ฐ ๋„ˆ๋ฌด ๋งŽ์€ ์‹œ๊ฐ„์ด ์†Œ์š”๋˜๋ฉฐ ๋ฆฌ๋ทฐ์˜ ์งˆ์ด ํ•˜๋ฝํ•ฉ๋‹ˆ๋‹ค [3]. +* **๋ณ‘ํ•ฉ ์ถฉ๋Œ(Merge Conflicts) ์œ„ํ—˜:** ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜๋ฅผ ์งง๊ฒŒ ์œ ์ง€(Short-lived)ํ•˜์ง€ ์•Š๊ณ  ์˜ค๋žซ๋™์•ˆ ์ž‘์—…ํ•œ ๋’ค ๋’ค๋Šฆ๊ฒŒ PR์„ ์—ด๊ฒŒ ๋˜๋ฉด, ๊ทธ ์‚ฌ์ด `main` ๋ธŒ๋žœ์น˜์— ์Œ“์ธ ๋‹ค๋ฅธ ํŒ€์›๋“ค์˜ ์ฝ”๋“œ์™€ ํฌ๊ฒŒ ์—‡๊ฐˆ๋ฆฌ๊ฒŒ ๋˜์–ด ํ•ด๊ฒฐํ•˜๊ธฐ ์–ด๋ ค์šด ๋Œ€๊ทœ๋ชจ ๋ณ‘ํ•ฉ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [8, 14-16]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [ํ˜‘์—… ๋ฐ ๋ธŒ๋žœ์นญ ์ „๋žต] +- [[Feature Branch Workflow]] + - ์—ฐ๊ฒฐ ์ด์œ : PR์€ ๋…๋ฆฝ๋œ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜์—์„œ ์•ˆ์ „ํ•˜๊ฒŒ ์ž‘์—…์„ ๋งˆ์นœ ํ›„ `main` ๋ธŒ๋žœ์น˜๋กœ ํ†ตํ•ฉํ•˜๊ธฐ ์œ„ํ•ด ํ•„์ˆ˜์ ์œผ๋กœ ๊ฑฐ์น˜๋Š” ํ”„๋กœ์„ธ์Šค์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [2, 17, 18]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ธŒ๋žœ์น˜๋ฅผ ๋…ผ๋ฆฌ์ ์ธ ๋‹จ์œ„๋กœ ๋ถ„๋ฆฌํ•˜๊ณ  ์งง์€ ์ฃผ๊ธฐ๋กœ ๊ด€๋ฆฌํ•˜์—ฌ ์–ด๋–ป๊ฒŒ PR ๊ณผ์ •์—์„œ์˜ ์ถฉ๋Œ์„ ์ค„์ด๊ณ  ํ˜‘์—… ํšจ์œจ์„ ๋†’์ด๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [8, 15, 18]. + +#### [์ฝ”๋“œ ํ’ˆ์งˆ ๋ฐ ๊ฒ€์ฆ ๋„๊ตฌ] +- [[Visual Regression Testing]] + - ์—ฐ๊ฒฐ ์ด์œ : ํ”„๋ก ํŠธ์—”๋“œ ์ฝ”๋“œ์˜ PR ๋ณ‘ํ•ฉ ์ „ ๋‹จ๊ณ„์—์„œ UI ๋ณ€๊ฒฝ์ด๋‚˜ ๋ ˆ์ด์•„์›ƒ ๋ถ•๊ดด๋ฅผ ์žก์•„๋‚ด๋Š” ํ•ต์‹ฌ์ ์ธ ์ž๋™ํ™” ํ…Œ์ŠคํŠธ ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค [5, 10]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Happo๋‚˜ Chromatic์ด ์–ด๋–ป๊ฒŒ PR ์›Œํฌํ”Œ๋กœ์šฐ์— ๊ฒฐํ•ฉ๋˜์–ด ๋ฆฌ๋ทฐ์–ด์˜ ๋ถ€๋‹ด์„ ๋œ๊ณ  ์‹œ๊ฐ์  ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•˜๋Š”์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5, 11]. +- [[Squash Merge]] + - ์—ฐ๊ฒฐ ์ด์œ : PR์„ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์— ์Šน์ธ ๋ฐ ๋ณ‘ํ•ฉํ•  ๋•Œ ๋ณต์žกํ•œ ์ค‘๊ฐ„ ์ปค๋ฐ‹ ๋‚ด์—ญ์„ ํ•˜๋‚˜๋กœ ์ •๋ฆฌํ•˜์—ฌ Git ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•˜๋Š” ๋ณ‘ํ•ฉ ์ „๋žต์ž…๋‹ˆ๋‹ค [1, 8, 14]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์—ฌ๋Ÿฌ ๋ฒˆ์˜ ์ž์ž˜ํ•œ ์ปค๋ฐ‹์ด PR ๋‹จ์œ„๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์–ด๋–ป๊ฒŒ ํ•˜๋‚˜์˜ ์˜๋ฏธ ์žˆ๋Š” ๋‹จ์œ„๋กœ ์••์ถ•๋˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1, 8]. + +### Deeper Research Questions +- ๋Œ€๊ทœ๋ชจ ํŒ€์—์„œ PR ๋ฆฌ๋ทฐ์˜ ์ฒ ์ €ํ•จ์„ ์œ ์ง€ํ•˜๋ฉด์„œ๋„ ๋ณ‘ํ•ฉ ์ง€์—ฐ ์‹œ๊ฐ„(Lead Time)์„ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ์›Œํฌํ”Œ๋กœ์šฐ ์ž๋™ํ™” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? +- ๊ทนํžˆ ์‚ฌ์†Œํ•œ ๋ณ€๊ฒฝ(์˜คํƒ€ ์ˆ˜์ • ๋“ฑ)์— ๋Œ€ํ•ด PR ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ฑด๋„ˆ๋›ฐ๊ณ  ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์— ์ง์ ‘ ์ปค๋ฐ‹(Direct push)ํ•˜๋Š” ์˜ˆ์™ธ๋ฅผ ๋‘๋Š” ๊ฒƒ์ด ์žฅ๊ธฐ์ ์œผ๋กœ ์ฝ”๋“œ๋ฒ ์ด์Šค ์•ˆ์ •์„ฑ์— ์–ด๋–ค ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”๊ฐ€? +- Happo๋‚˜ Chromatic ๊ฐ™์€ ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ ๋„๊ตฌ๋“ค์„ CI ํŒŒ์ดํ”„๋ผ์ธ์˜ PR ์ฒดํฌ์— ์—ฐ๋™ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ํ…Œ์ŠคํŠธ ์‹คํ–‰ ์‹œ๊ฐ„ ์ฆ๊ฐ€์™€ ๋น„์šฉ ๋ฌธ์ œ๋Š” ์–ด๋–ป๊ฒŒ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- PR ๋‹จ๊ณ„์—์„œ ์‹ฌ๊ฐํ•œ ๋ณ‘ํ•ฉ ์ถฉ๋Œ(Merge Conflict)์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ, ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ๋ฆฌ๋ทฐ์–ด์—๊ฒŒ ๋ณ€๊ฒฝ ์ด๋ ฅ์„ ๋ช…ํ™•ํžˆ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•œ ํšจ๊ณผ์ ์ธ Git Rebase ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? +- PR ์ด๋ฆ„๊ณผ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€์— Ticket ID(์˜ˆ: JIRA) ์ž‘์„ฑ์„ ๊ฐ•์ œํ•˜๋Š” ์ •์ฑ…์ด ์žฅ์•  ๋ฐœ์ƒ ์‹œ ์›์ธ ์ถ”์ ๊ณผ ๋กค๋ฐฑ ํ”„๋กœ์„ธ์Šค์— ์–ด๋–ป๊ฒŒ ๊ธฐ์—ฌํ•˜๋Š”๊ฐ€? + +### Practical Application Contexts +- **Implementation:** ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด๋‚˜ ๋ฒ„๊ทธ ํ”ฝ์Šค ์ž‘์—… ์‹œ `main` ๋ธŒ๋žœ์น˜์— ์ง์ ‘ ์ฝ”๋“œ๋ฅผ ํ‘ธ์‹œํ•˜์ง€ ์•Š๊ณ , ์ƒˆ ๋ธŒ๋žœ์น˜๋ฅผ ๋งŒ๋“ค์–ด ์ž‘์—…์„ ์™„๋ฃŒํ•œ ํ›„ PR์„ ์—ด์–ด ๋ฌด์—‡์„ ๋ฐ”๊ฟจ๋Š”์ง€ ์Šคํฌ๋ฆฐ์ƒท๊ณผ ํ•จ๊ป˜ ์ƒ์„ธํžˆ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค [1, 14]. +- **System Design:** GitHub ๋“ฑ์— Branch Protection Rule์„ ์„ค์ •ํ•˜์—ฌ, PR์ด 1๋ช… ์ด์ƒ์˜ ์Šน์ธ์„ ๋ฐ›๊ณ  ๋ชจ๋“  ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ๋ฐ CI ๋ฆฐํŠธ ๊ฒ€์‚ฌ๋ฅผ ํ†ต๊ณผํ•ด์•ผ๋งŒ ๋ณ‘ํ•ฉ(Merge) ๋ฒ„ํŠผ์ด ํ™œ์„ฑํ™”๋˜๋„๋ก ์‹œ์Šคํ…œ์„ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค [1, 19]. +- **Operation / Maintenance:** ์šด์˜ ์ค‘ ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๊ณผ๊ฑฐ PR ๊ธฐ๋ก๊ณผ ํฌํ•จ๋œ Ticket ID๋ฅผ ๊ฒ€์ƒ‰ํ•˜์—ฌ, ํ•ด๋‹น ์ฝ”๋“œ๊ฐ€ ์–ด๋–ค ๋น„์ฆˆ๋‹ˆ์Šค ์š”๊ตฌ์‚ฌํ•ญ์— ์˜ํ•ด ์ถ”๊ฐ€๋˜์—ˆ๊ณ  ๋ˆ„๊ฐ€ ๋ฆฌ๋ทฐํ–ˆ๋Š”์ง€ ์‹ ์†ํžˆ ๋งฅ๋ฝ์„ ํŒŒ์•…ํ•ฉ๋‹ˆ๋‹ค [6, 7]. +- **Learning Path:** Git์„ ํ•™์Šตํ•˜๋Š” ์ฃผ๋‹ˆ์–ด ๊ฐœ๋ฐœ์ž๋“ค์€ ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•  ๋•Œ๋„ `main` ๋ธŒ๋žœ์น˜์— ์ง์ ‘ ์ปค๋ฐ‹ํ•˜๋Š” ๋Œ€์‹  PR์„ ์—ด๊ณ  ์Šค์Šค๋กœ ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ๋ฐฉ์‹์„ ์—ฐ์Šตํ•˜์—ฌ ์‹ค๋ฌด ํ˜‘์—… ํ‘œ์ค€์— ์ต์ˆ™ํ•ด์ง‘๋‹ˆ๋‹ค [4, 18]. +- **My Project Relevance:** ํ˜„์žฌ ์ง„ํ–‰ ์ค‘์ธ ์†Œ๊ทœ๋ชจ ํŒ€ ํ”„๋กœ์ ํŠธ์— Feature Branch์™€ ๊ฒฐํ•ฉ๋œ ๊ฐ€๋ฒผ์šด PR ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ๋„์ž…ํ•˜๊ณ , '์ž‘์€ PR ํฌ๊ธฐ ์œ ์ง€', 'Squash Merge ์‚ฌ์šฉ', '๋ณ‘ํ•ฉ ํ›„ ๋ธŒ๋žœ์น˜ ์‚ญ์ œ' ๊ทœ์œจ์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค [8, 15, 16]. + +### Adjacent Topics +- [[Continuous Integration (CI)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: PR์ด ์ƒ์„ฑ๋˜๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธ๋  ๋•Œ๋งˆ๋‹ค ์ž๋™์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๋นŒ๋“œํ•˜๊ณ  ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ, ๋ฆฌ๋ทฐ์–ด๊ฐ€ ๋กœ์ง ๊ฒ€ํ† ์—๋งŒ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š” ์ž๋™ํ™” ์ธํ”„๋ผ๋กœ ํ™•์žฅ ํ•™์Šต. +- [[Code Review]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: PR์ด๋ผ๋Š” ๊ณต๊ฐ„ ๋‚ด์—์„œ ํŒ€์› ๊ฐ„์— ํšจ๊ณผ์ ์ด๊ณ  ๊ฑด์„ค์ ์ธ ํ”ผ๋“œ๋ฐฑ์„ ์ฃผ๊ณ ๋ฐ›๋Š” ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜ ๊ธฐ์ˆ ๊ณผ ๋ฆฌ๋ทฐ ๋ฌธํ™”๋ฅผ ์กฐ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ํ™•์žฅ ํ•™์Šต. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/RAG (Retrieval-Augmented Generation).md b/00_Raw/RAG (Retrieval-Augmented Generation).md new file mode 100644 index 00000000..bb1e4f4d --- /dev/null +++ b/00_Raw/RAG (Retrieval-Augmented Generation).md @@ -0,0 +1,56 @@ +# [[RAG (Retrieval-Augmented Generation)]] + +## ๐Ÿ“Œ Brief Summary +RAG(Retrieval-Augmented Generation)๋Š” AI ๋ชจ๋ธ์ด ํ…์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์ „์— ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ์™ธ๋ถ€ ์ง€์‹ ๊ธฐ๋ฐ˜์ด๋‚˜ ๋ฐ์ดํ„ฐ ์†Œ์Šค์—์„œ ๊ด€๋ จ ์ •๋ณด๋ฅผ ๊ฒ€์ƒ‰ํ•˜์—ฌ ํ”„๋กฌํ”„ํŠธ๋ฅผ ์ฆ๊ฐ•ํ•˜๋Š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค. ์—์ด์ „ํŠธ ์‹œ์Šคํ…œ์—์„œ๋Š” ํ™˜๊ฐ(hallucination)์„ ํฌ๊ฒŒ ์ค„์ด๊ณ  ๋‹ต๋ณ€์„ ์‚ฌ์‹ค์  ์ •๋ณด๋กœ ๋ณด๊ฐ•ํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ํ˜„๋Œ€์˜ ์—์ด์ „ํŠธ ํ•˜๋„ค์Šค ์—”์ง€๋‹ˆ์–ด๋ง(Agent Harness Engineering) ๋งฅ๋ฝ์—์„œ๋Š” RAG๊ฐ€ ๋‹จ์ˆœํ•œ ์ „์ฒ˜๋ฆฌ ๋‹จ๊ณ„๋ฅผ ๋„˜์–ด, ์—์ด์ „ํŠธ๊ฐ€ ์ž์œจ์ ์œผ๋กœ ํ•„์š”ํ•  ๋•Œ ์ •๋ณด๋ฅผ ์ ์ง„์ ์œผ๋กœ ๊ฐ€์ ธ์˜ค๋Š” ๋™์ ์ธ ๋„๊ตฌ ํ˜ธ์ถœ(Tool Call) ๋ฐ ์ปจํ…์ŠคํŠธ ๊ด€๋ฆฌ ์ „๋žต์œผ๋กœ ์ง„ํ™”ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. + +## ๐Ÿ“– Core Content +* **์ˆ˜๋™์  ๊ฒ€์ƒ‰์—์„œ ์ž์œจ์  ๋„๊ตฌ ํ˜ธ์ถœ๋กœ์˜ ์ง„ํ™” (Agentic RAG):** + ๊ณผ๊ฑฐ์˜ RAG๋Š” ์‚ฌ์šฉ์ž ์ฟผ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฌธ์„œ ์ „์ฒด๋ฅผ ํ•œ ๋ฒˆ์— ์ฃผ์ž…ํ•˜๋Š” ์ •๋ณด ๊ฒ€์ƒ‰ ์ปดํฌ๋„ŒํŠธ์— ๊ฐ€๊นŒ์› ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์—์ด์ „ํŠธ ํ™˜๊ฒฝ(์˜ˆ: A-RAG)์—์„œ๋Š” RAG๋ฅผ ํ•˜๋„ค์Šค ๋„๊ตฌ ์„ค๊ณ„ ๋ฌธ์ œ๋กœ ์žฌ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ฒ€์ƒ‰๋œ ๋ฌธ์„œ๋ฅผ ํŒŒ์ดํ”„๋ผ์ธ ์‹œ์ž‘ ์‹œ์ ์— ์ผ๊ด„ ์ฃผ์ž…ํ•˜๋Š” ๋Œ€์‹ , ํ•˜๋„ค์Šค๋Š” ํ‚ค์›Œ๋“œ ๊ฒ€์ƒ‰, ์˜๋ฏธ๋ก ์  ๊ฒ€์ƒ‰, ์ฒญํฌ ์ฝ๊ธฐ ๋“ฑ์˜ ๊ฒ€์ƒ‰ ๋„๊ตฌ๋ฅผ ์—์ด์ „ํŠธ์—๊ฒŒ ๋…ธ์ถœํ•˜์—ฌ, ์—์ด์ „ํŠธ๊ฐ€ ๊ฐ ์ถ”๋ก  ๋‹จ๊ณ„์—์„œ ํ•„์š”ํ•œ ์ •๋ณด๋งŒ ์ ์ง„์ ์ด๊ณ  ๋Šฅ๋™์ ์œผ๋กœ ๊ฐ€์ ธ์˜ค๋„๋ก ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค. +* **๊ฒ€์ƒ‰ ์ฆ๊ฐ• ์ปจํ…์ŠคํŠธ ๊ด€๋ฆฌ (Retrieval-Augmented Context Management):** + ์žฅ๊ธฐ ์‹คํ–‰(Long-horizon) ์—์ด์ „ํŠธ๋ฅผ ์œ„ํ•œ ์ง€๋ฐฐ์ ์ธ ์ปจํ…์ŠคํŠธ ๊ด€๋ฆฌ ์ ‘๊ทผ๋ฒ•์ž…๋‹ˆ๋‹ค. ํ•˜๋„ค์Šค๋Š” ์—์ด์ „ํŠธ์˜ ์ „์ฒด ์ƒํ˜ธ์ž‘์šฉ ๊ธฐ๋ก์„ ์š”์•ฝํ•˜์—ฌ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์ •๋ณด ์†์‹ค์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด, ๋ชจ๋“  ์ƒํ˜ธ์ž‘์šฉ์„ ์ €์žฅํ•˜๊ณ  ๊ฐ ๋‹จ๊ณ„์—์„œ ๊ด€๋ จ๋œ ํ•˜์œ„ ์ง‘ํ•ฉ(subset)๋งŒ์„ ๊ฒ€์ƒ‰ํ•ด ์ปจํ…์ŠคํŠธ ์œˆ๋„์šฐ์— ์ฃผ์ž…ํ•ฉ๋‹ˆ๋‹ค. ํ•˜๋„ค์Šค๋Š” ๋ฌธ์„œ์˜ ๋‹จ์ˆœ ์ €์žฅ์„ ๋„˜์–ด ์••์ถ• ๋ฐ ์ถ”์ถœ ๊ณผ์ •์„ ๋ถ„๋ฆฌํ•˜๋Š” ํŒŒ์ดํ”„๋ผ์ธ(์˜ˆ: Haystack ํ”„๋ ˆ์ž„์›Œํฌ ๋“ฑ)์„ ํ†ตํ•ด ์—์ด์ „ํŠธ์˜ ์ธ์ง€ ๋ถ€ํ•˜๋ฅผ ์ค„์ž…๋‹ˆ๋‹ค. +* **๊ทธ๋ž˜ํ”„ ๊ตฌ์กฐ์™€์˜ ๊ฒฐํ•ฉ (GraphRAG):** + ๊ธฐ๋ณธ์ ์ธ RAG(Baseline RAG)๋Š” ์—ฌ๋Ÿฌ ์ •๋ณด ์กฐ๊ฐ์˜ ๊ณตํ†ต ์†์„ฑ์„ ๊ฐ€๋กœ์งˆ๋Ÿฌ ์ ๋“ค์„ ์—ฐ๊ฒฐํ•ด์•ผ ํ•˜๋Š” ๋ณต์žกํ•œ ์งˆ๋ฌธ์— ๋‹ตํ•˜๊ฑฐ๋‚˜, ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ์—์„œ ์š”์•ฝ๋œ ์˜๋ฏธ๋ก ์  ๊ฐœ๋…์„ ์ „์ฒด์ ์œผ๋กœ ์ดํ•ดํ•˜๋Š” ๋ฐ ํ•œ๊ณ„๋ฅผ ๋ณด์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ตœ์‹  ํ•˜๋„ค์Šค ์„ค๊ณ„์—์„œ๋Š” ์˜๋ฏธ๋ก ์  ํšŒ์ƒ(Semantic recall)์„ ์œ„ํ•œ ๋ฒกํ„ฐ ๊ฒ€์ƒ‰๊ณผ ๊ด€๊ณ„ ์ถ”๋ก ์„ ์œ„ํ•œ ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰(Graph traversal), ๊ทธ๋ฆฌ๊ณ  ์ง„์‹ค ๋ฐ์ดํ„ฐ๋ฅผ ์œ„ํ•œ ๊ตฌ์กฐํ™”๋œ ์ฟผ๋ฆฌ(SQL/API)๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. +* **MCP์™€์˜ ์ƒํ˜ธ ๋ณด์™„์  ์—ญํ• :** + RAG๊ฐ€ ์ •๋ณด์˜ '์ˆ˜๋™์  ๊ฒ€์ƒ‰(Passive Retrieval)'์„ ํ†ตํ•ด ํ…์ŠคํŠธ ์ƒ์„ฑ ์ „ ์‚ฌ์‹ค์  ์ •ํ™•์„ฑ์„ ๋†’์ด๋Š” ๋ฐ ์ฃผ๋ ฅํ•œ๋‹ค๋ฉด, MCP(Model Context Protocol)๋Š” ์—์ด์ „ํŠธ๊ฐ€ ์™ธ๋ถ€ ์‹œ์Šคํ…œ์—์„œ ์ž‘์—…์„ '์‹คํ–‰(Action)'ํ•˜๊ณ  ๋™์ ์œผ๋กœ ์–‘๋ฐฉํ–ฅ ์ƒํ˜ธ์ž‘์šฉ์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ํ‘œ์ค€์ž…๋‹ˆ๋‹ค. ํ•˜๋„ค์Šค๋Š” ์ด ๋‘ ๊ฐ€์ง€๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ์ •๋ณด ๊ฒ€์ƒ‰๊ณผ ์ž‘์—… ์‹คํ–‰ ๋Šฅ๋ ฅ์„ ๋ชจ๋‘ ๊ฐ–์ถ˜ ์—์ด์ „ํŠธ ์ธํ”„๋ผ๋ฅผ ๊ตฌ์ถ•ํ•ฉ๋‹ˆ๋‹ค. + +## โš–๏ธ Trade-offs & Caveats +* **๊ฒ€์ƒ‰ ์ง€์—ฐ ์‹œ๊ฐ„์˜ ๋ˆ„์  (Retrieval Latency Injection):** ์žฅ๊ธฐ ์‹คํ–‰ ์ž‘์—…์˜ ๊ฒฝ์šฐ ๋งค ๋‹จ๊ณ„๋งˆ๋‹ค ๋ชจ๋ธ ์ถ”๋ก  ์ „ ์ €์žฅ๋œ ๊ธฐ๋ก์— ๋Œ€ํ•œ ๊ฒ€์ƒ‰ ์ฟผ๋ฆฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๊ทœ๋ชจ ๋ฒกํ„ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ฝœ๋“œ ์Šคํƒ€ํŠธ๋‚˜ ์‹œ๋งจํ‹ฑ ๊ฒ€์ƒ‰ ์ง€์—ฐ ์‹œ๊ฐ„์ด ์„ ํ˜•์ ์œผ๋กœ ๋ˆ„์ ๋˜๋ฉด ์ „์ฒด ์ž‘์—… ์‹œ๊ฐ„์— ์‹ฌ๊ฐํ•œ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ํ•˜๋„ค์Šค๋Š” ์ธ๋ฑ์Šค ์˜ˆ์—ด(pre-warming)์ด๋‚˜ ์ค‘๋ณต ์ฟผ๋ฆฌ ๋ฐฉ์ง€ ์บ์‹ฑ์„ ํ†ตํ•ด ์ด๋ฅผ ๊ด€๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. +* **์ ๋Œ€์  ์ฝ˜ํ…์ธ ์— ์˜ํ•œ ๊ฒ€์ƒ‰ ๊ฒŒ์ž„ํ™” (Retrieval Gaming by Adversarial Content):** ์—์ด์ „ํŠธ์˜ ์ €์žฅ์†Œ์— ์™ธ๋ถ€ ์ฝ˜ํ…์ธ ๊ฐ€ ์ฃผ์ž…๋  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ, ๊ณต๊ฒฉ์ž๋Š” ํ–ฅํ›„ ๊ฒ€์ƒ‰ ์ฟผ๋ฆฌ์™€ ์˜๋ฏธ๋ก ์  ์œ ์‚ฌ์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•˜๋„๋ก ์กฐ์ž‘๋œ ์ฝ˜ํ…์ธ ๋ฅผ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์—์ด์ „ํŠธ์˜ ๊ฒฐ์ •์ ์ธ ์ž‘์—… ์ˆœ๊ฐ„์— ์•…์˜์  ์ง€์‹œ๋ฌธ์ด ์ตœ์šฐ์„ ์œผ๋กœ ๊ฒ€์ƒ‰๋˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๋ ค๋ฉด ํ•˜๋„ค์Šค๋Š” ์˜๋ฏธ๋ก ์  ์œ ์‚ฌ์„ฑ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ •๋ณด ์ถœ์ฒ˜(Provenance)์˜ ์‹ ๋ขฐ๋„์— ๋”ฐ๋ฅธ ๊ฐ€์ค‘์น˜๋ฅผ ๋ถ€์—ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. +* **ํ† ํฐ ๋น„์šฉ ์ ˆ๊ฐ vs ๊ฒ€์ƒ‰ ํ’ˆ์งˆ ๋ถ„์‚ฐ (Token Cost vs Retrieval Variance):** ์ดˆ์žฅ๊ธฐ ์ปจํ…์ŠคํŠธ(Ultra-long-context) ๋ชจ๋ธ์— ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋Œ€๋กœ ์ฃผ์ž…ํ•˜๋Š” ๋ฐฉ์‹์€ ์ถฉ์‹ค๋„(Fidelity)๋Š” ๋†’์œผ๋‚˜ ๋ง‰๋Œ€ํ•œ ํ† ํฐ ๋น„์šฉ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด RAG๋Š” ํ† ํฐ ๋น„์šฉ์„ ํฌ๊ฒŒ ์ค„์ด๋Š” ๋Œ€์‹  ์ฟผ๋ฆฌ ๊ณต์‹ํ™”(Query formulation)์™€ ๊ฒ€์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ํ’ˆ์งˆ์— ์—์ด์ „ํŠธ์˜ ์„ฑ๋Šฅ์ด ๊ทน๋„๋กœ ์˜์กดํ•˜๊ฒŒ ๋˜๋Š” ์œ„ํ—˜์„ ์•ˆ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [๊ด€๊ณ„ ์œ ํ˜• A: ์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] +* [[Context Engineering]] + * ์—ฐ๊ฒฐ ์ด์œ : RAG๋Š” ์—์ด์ „ํŠธ์˜ ์ œํ•œ๋œ ์ปจํ…์ŠคํŠธ ์œˆ๋„์šฐ์— ํ•„์š”ํ•œ ์ •๋ณด๋งŒ์„ ์„ ๋ณ„ํ•˜์—ฌ ์ฃผ์ž…ํ•˜๊ธฐ ์œ„ํ•œ ํ•ต์‹ฌ์ ์ธ ์ปจํ…์ŠคํŠธ ์—”์ง€๋‹ˆ์–ด๋ง ์ „๋žต์ž…๋‹ˆ๋‹ค. + * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํ•˜๋„ค์Šค๊ฐ€ ์—์ด์ „ํŠธ์˜ ํ† ํฐ ์˜ˆ์‚ฐ์„ ์–ด๋–ป๊ฒŒ ๊ด€๋ฆฌํ•˜๊ณ , ๋ฌด๋ถ„๋ณ„ํ•œ ์ปจํ…์ŠคํŠธ ๋ถ€ํŒจ(Context Rot)๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด ๊ฒ€์ƒ‰๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์–ธ์ œ ์–ด๋–ป๊ฒŒ ์ฃผ์ž…ํ•˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +* [[Agentic Search]] + * ์—ฐ๊ฒฐ ์ด์œ : ๊ณ ์ •๋œ RAG ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ๋ฒ—์–ด๋‚˜, ์—์ด์ „ํŠธ๊ฐ€ ์ง์ ‘ ๋‹ค๋‹จ๊ณ„ ๊ฒ€์ƒ‰์„ ๊ณ„ํšํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š” ๋Šฅ๋™์  ๊ฒ€์ƒ‰ ๊ณผ์ •์ž…๋‹ˆ๋‹ค. + * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: RAG๊ฐ€ ๋‹จ์ˆœ ์ „์ฒ˜๋ฆฌ ๊ณผ์ •์ด ์•„๋‹ˆ๋ผ, ์—์ด์ „ํŠธ ํ•˜๋„ค์Šค์˜ ์‹คํ–‰ ๋ฃจํ”„(Execution Loop) ๋‚ด์—์„œ ๋„๊ตฌ ํ˜ธ์ถœ(Tool Call) ํ˜•ํƒœ๋กœ ํ†ตํ•ฉ๋˜๋Š” ๋ฐฉ์‹์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +#### [๊ด€๊ณ„ ์œ ํ˜• B: ๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ] +* [[Model Context Protocol (MCP)]] + * ์—ฐ๊ฒฐ ์ด์œ : RAG๊ฐ€ ์ฃผ๋กœ ์ง€์‹ ๊ธฐ๋ฐ˜์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ '๊ฒ€์ƒ‰'ํ•˜๋Š” ๋ชฉ์ ์ด๋ผ๋ฉด, MCP๋Š” ์—์ด์ „ํŠธ๊ฐ€ ์™ธ๋ถ€ ์‹œ์Šคํ…œ๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๊ฑฐ๋‚˜ '์ž‘์—…์„ ์ˆ˜ํ–‰'ํ•˜๊ธฐ ์œ„ํ•œ ์–‘๋ฐฉํ–ฅ ํ”„๋กœํ† ์ฝœ ํ†ต์‹  ํ‘œ์ค€์ž…๋‹ˆ๋‹ค. + * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์—์ด์ „ํŠธ ํ•˜๋„ค์Šค์—์„œ ์ •๋ณด ๊ฒ€์ƒ‰(RAG)๊ณผ ์™ธ๋ถ€ ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ์‹œ์Šคํ…œ ํ†ตํ•ฉ/์‹คํ–‰(MCP)์ด ๊ฐ๊ฐ ์–ด๋–ค ๊ฒฝ๊ณ„๋ฅผ ๊ฐ€์ง€๊ณ  ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š”์ง€ ๋ช…ํ™•ํžˆ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### Deeper Research Questions +* ์—์ด์ „ํŠธ๊ฐ€ ์ž์ฒด์ ์œผ๋กœ ์ƒ์„ฑํ•œ ์žฅ๊ธฐ ์ƒํ˜ธ์ž‘์šฉ ๊ธฐ๋ก์„ RAG๋กœ ๊ฒ€์ƒ‰ํ•  ๋•Œ, ํ•˜๋„ค์Šค๋Š” ๋ชจ๋ธ์˜ ํ˜„์žฌ ์ •๋ณด ์š”๊ตฌ๋ฅผ ์ •ํ™•ํžˆ ๋ฐ˜์˜ํ•˜๊ธฐ ์œ„ํ•ด ์ฟผ๋ฆฌ ๊ณต์‹ํ™”(Query Formulation)๋ฅผ ๋ชจ๋ธ์— ์œ„์ž„ํ•  ๊ฒƒ์ธ๊ฐ€, ์•„๋‹ˆ๋ฉด ์ž์ฒด์ ์ธ ์ •์ฑ…์œผ๋กœ ์ œ์–ดํ•  ๊ฒƒ์ธ๊ฐ€? +* ์•…์˜์ ์ธ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฒ€์ƒ‰์„ ํ†ตํ•ด ์—์ด์ „ํŠธ์˜ ์ปจํ…์ŠคํŠธ ์œˆ๋„์šฐ์— ์ฃผ์ž…๋˜๋Š” '๊ฒ€์ƒ‰ ๊ฒŒ์ž„ํ™”(Retrieval Gaming)'๋ฅผ ๋ฐฉ์–ดํ•˜๊ธฐ ์œ„ํ•ด, ํ•˜๋„ค์Šค๋Š” ์ถœ์ฒ˜ ๊ธฐ๋ฐ˜(Provenance-weighted) ๊ฒ€์ƒ‰ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š”๊ฐ€? +* ์ˆ˜๋ฐฑ๋งŒ ํ† ํฐ์˜ ์ปจํ…์ŠคํŠธ ์œˆ๋„์šฐ๋ฅผ ์ง€์›ํ•˜๋Š” ๋ชจ๋ธ(Long-context models)์˜ ๋“ฑ์žฅ ์ƒํ™ฉ์—์„œ, RAG ๊ธฐ๋ฐ˜ ํ•˜๋„ค์Šค๋Š” ๊ฒ€์ƒ‰ ์ง€์—ฐ ์‹œ๊ฐ„ ์˜ค๋ฒ„ํ—ค๋“œ์™€ ์žฅ๋ฌธ ์ปจํ…์ŠคํŠธ ์ง์ ‘ ์ฃผ์ž…์˜ ์ปดํ“จํŒ… ๋น„์šฉ ๊ฐ„์˜ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๋ฅผ ์–ด๋–ป๊ฒŒ ์ตœ์ ํ™”ํ•ด์•ผ ํ•˜๋Š”๊ฐ€? +* ๊ฒ€์ƒ‰(Retrieval) ํ–‰์œ„๊ฐ€ ์—์ด์ „ํŠธ์˜ ์ถ”๋ก  ํ๋ฆ„์„ ๋ฐฉํ•ดํ•˜์ง€ ์•Š๊ณ  ๋…๋ฆฝ์ ์œผ๋กœ ์ž‘๋™ํ•˜๋„๋ก ์„œ๋ธŒ ์—์ด์ „ํŠธ(Subagent)์—๊ฒŒ RAG ์—ญํ• ์„ ์œ„์ž„ํ•˜๋Š” ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ์„ค๊ณ„๋Š” ์‹œ์Šคํ…œ ์•ˆ์ •์„ฑ์— ์–ด๋– ํ•œ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”๊ฐ€? + +### Practical Application Contexts +* **Implementation:** ๋ฐฉ๋Œ€ํ•œ ๋ฌธ์„œ ์ €์žฅ์†Œ๋‚˜ ์ง€์‹ ๊ธฐ๋ฐ˜ ์œ„์—์„œ ์ž‘๋™ํ•˜๋Š” ์—์ด์ „ํŠธ๋ฅผ ๊ตฌ์ถ•ํ•  ๋•Œ, Haystack๊ณผ ๊ฐ™์€ ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ ํ”„๋ ˆ์ž„์›Œํฌ๋‚˜ ๋ฒกํ„ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ํ•˜๋„ค์Šค์˜ RAG ์ปดํฌ๋„ŒํŠธ๋กœ ํ†ตํ•ฉํ•˜์—ฌ ๊ตฌ์ถ•ํ•ฉ๋‹ˆ๋‹ค. +* **System Design:** ์—์ด์ „ํŠธ์˜ ์‹คํ–‰ ๋ฃจํ”„ ๋‚ด์—์„œ, RAG๋ฅผ ์ •์ ์ธ ํŒŒ์ดํ”„๋ผ์ธ์ด ์•„๋‹Œ ํ‚ค์›Œ๋“œ ๊ฒ€์ƒ‰, ์˜๋ฏธ๋ก ์  ๊ฒ€์ƒ‰ ๋„๊ตฌ ๋“ฑ์˜ ์ง‘ํ•ฉ์œผ๋กœ ์ถ”์ƒํ™”ํ•˜์—ฌ ๋ชจ๋ธ์ด ํ•„์š”์— ๋งž๊ฒŒ ๋Šฅ๋™์ ์œผ๋กœ ๋„๊ตฌ(Tool)๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค. +* **Operation / Maintenance:** ์šด์˜ ํ™˜๊ฒฝ์—์„œ๋Š” RAG ๊ฒ€์ƒ‰ ์‹œ ๋ฐœ์ƒํ•˜๋Š” ์ง€์—ฐ ์‹œ๊ฐ„(Latency)์ด ์ „์ฒด ์—์ด์ „ํŠธ ์ž‘์—… ์‹œ๊ฐ„์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ , ๊ฒ€์ƒ‰ ์ธ๋ฑ์Šค ์˜ˆ์—ด(Pre-warming) ๋ฐ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ์บ์‹ฑ ์ตœ์ ํ™”๋ฅผ ์ง€์†์ ์œผ๋กœ ๊ด€๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. +* **Learning Path:** ๊ธฐ๋ณธ RAG ํŒŒ์ดํ”„๋ผ์ธ ๋ฉ”์ปค๋‹ˆ์ฆ˜ ํ•™์Šต โž” ์ง€์‹ ๊ทธ๋ž˜ํ”„๋ฅผ ํ™œ์šฉํ•œ GraphRAG ์ ‘๊ทผ๋ฒ• ์ดํ•ด โž” ์—์ด์ „ํŠธ๊ฐ€ ์Šค์Šค๋กœ ๊ฒ€์ƒ‰์„ ์ œ์–ดํ•˜๋Š” ์—์ด์ „ํ‹ฑ RAG(Agentic RAG) ์„ค๊ณ„ ํŒจํ„ด์œผ๋กœ์˜ ํ™•์žฅ. +* **My Project Relevance:** ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์‚ฌ๋‚ด ์ง€์‹ ๊ธฐ๋ฐ˜ ์ฑ—๋ด‡์ด๋‚˜ ๋ณต์žกํ•œ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ์ž์œจ ์ฝ”๋”ฉ ์—์ด์ „ํŠธ(Autonomous Coding Agent)๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ, ์žฅ๊ธฐ ๋ฉ”๋ชจ๋ฆฌ ์†Œ์‹ค์„ ๋ง‰๊ณ  ์ •ํ™•ํ•œ ์ฐธ์กฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ํ•˜๋„ค์Šค ์ธต์œ„์— RAG ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๋‚ด์žฌํ™”ํ•˜๋Š” ๋ฐ ํ•ต์‹ฌ์ ์œผ๋กœ ํ™œ์šฉ๋ฉ๋‹ˆ๋‹ค. + +### Adjacent Topics +* [[GraphRAG]] + * ํ™•์žฅ ๋ฐฉํ–ฅ: ๋‹จ์ˆœํ•œ ๋ฒกํ„ฐ ์œ ์‚ฌ๋„ ๊ฒ€์ƒ‰์˜ ํ•œ๊ณ„๋ฅผ ๊ทน๋ณตํ•˜๊ณ , ๋ณต์žกํ•œ ๋ฌธ์„œ ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๋งคํ•‘ํ•˜์—ฌ ๋‹ค๋‹จ๊ณ„(Multi-hop) ์ถ”๋ก ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ์ง€์‹ ๊ทธ๋ž˜ํ”„ ๊ธฐ๋ฐ˜์˜ ๊ฒ€์ƒ‰ ์ฆ๊ฐ• ๋ชจ๋ธ๋กœ ์ดํ•ด๋ฅผ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค. + +--- +*Last updated: 2026-05-01* \ 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 new file mode 100644 index 00000000..6d240716 --- /dev/null +++ b/00_Raw/React App Prototypes and Startups.md @@ -0,0 +1,57 @@ +# [[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 Development.md b/00_Raw/React Development.md new file mode 100644 index 00000000..9d1a97fb --- /dev/null +++ b/00_Raw/React Development.md @@ -0,0 +1,71 @@ +# [[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 Project Git Governance.md b/00_Raw/React Project Git Governance.md new file mode 100644 index 00000000..3a65c3c3 --- /dev/null +++ b/00_Raw/React Project Git Governance.md @@ -0,0 +1,66 @@ +# [[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 Suspense.md b/00_Raw/React Suspense.md new file mode 100644 index 00000000..423c968d --- /dev/null +++ b/00_Raw/React Suspense.md @@ -0,0 +1,52 @@ +# [[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 new file mode 100644 index 00000000..7dde2e26 --- /dev/null +++ b/00_Raw/React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์˜ˆ์™ธ ๋ฐ ์—๋Ÿฌ ์ฒ˜๋ฆฌ.md @@ -0,0 +1,63 @@ +# [[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/Rules of React.md b/00_Raw/Rules of React.md new file mode 100644 index 00000000..e9577971 --- /dev/null +++ b/00_Raw/Rules of React.md @@ -0,0 +1,64 @@ +# [[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 React Apps.md b/00_Raw/Scalable React Apps.md new file mode 100644 index 00000000..701fafc8 --- /dev/null +++ b/00_Raw/Scalable React Apps.md @@ -0,0 +1,82 @@ +# [[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 new file mode 100644 index 00000000..eaa8644e --- /dev/null +++ b/00_Raw/Sentry and LogRocket Integration.md @@ -0,0 +1,53 @@ +# [[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/Single Page Applications (SPAs).md b/00_Raw/Single Page Applications (SPAs).md new file mode 100644 index 00000000..ed290af1 --- /dev/null +++ b/00_Raw/Single Page Applications (SPAs).md @@ -0,0 +1,49 @@ +# [[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/Single Responsibility Principle.md b/00_Raw/Single Responsibility Principle.md new file mode 100644 index 00000000..84df9046 --- /dev/null +++ b/00_Raw/Single Responsibility Principle.md @@ -0,0 +1,62 @@ +# [[Single Responsibility Principle]] + +## ๐Ÿ“Œ Brief Summary +SRP(๋‹จ์ผ ์ฑ…์ž„ ์›์น™)๋Š” ์ปดํฌ๋„ŒํŠธ, ํ•จ์ˆ˜ ๋˜๋Š” ๋ชจ๋“ˆ์ด ๋‹จ ํ•˜๋‚˜์˜ ์ฑ…์ž„์ด๋‚˜ ๋ชฉ์ ๋งŒ์„ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค๋Š” ์†Œํ”„ํŠธ์›จ์–ด ์„ค๊ณ„ ์›์น™์ž…๋‹ˆ๋‹ค [1-3]. ๋ณธ๋ž˜ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ํด๋ž˜์Šค ์„ค๊ณ„๋ฅผ ์œ„ํ•œ ์›์น™์ด์ง€๋งŒ, React์™€ ๊ฐ™์€ ํ•จ์ˆ˜ํ˜• ์ฝ”๋“œ์—์„œ๋„ 'ํ•˜๋‚˜์˜ ์ฝ”๋“œ๋Š” ์˜ค์ง ํ•˜๋‚˜์˜ ์ž‘์—…๋งŒ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค'๋Š” ๊ฐœ๋…์œผ๋กœ ๋ฒˆ์—ญ๋˜์–ด ๋„๋ฆฌ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค [3]. ์ฝ”๋“œ๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•˜๋Š” ์ด์œ ๋Š” ๋‹จ ํ•˜๋‚˜๋ฟ์ด์–ด์•ผ ํ•˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ์˜ ํ’ˆ์งˆ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ํฌ๊ฒŒ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3, 4]. + +## ๐Ÿ“– Core Content +* **๊ฐœ๋…๊ณผ ์ ์šฉ์˜ ํ•ต์‹ฌ:** SRP๋Š” ์žฅ๋‚œ๊ฐ ์ƒ์ž์—์„œ ๊ฐ ์žฅ๋‚œ๊ฐ์ด ์ž์‹ ๋งŒ์˜ ํŠน๋ณ„ํ•œ ์œ„์น˜๋ฅผ ๊ฐ€์ง€๋“ฏ, ์ฝ”๋“œ์˜ ๊ฐ ๋ถ€๋ถ„์ด ์˜ค์ง ํ•œ ๊ฐ€์ง€์˜ ํŠน์ •ํ•œ ์ผ๋งŒ ์ˆ˜ํ–‰ํ•˜๋„๋ก ์ œํ•œํ•˜๋Š” ์›์น™์ž…๋‹ˆ๋‹ค [1]. React ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋Š” ์ปดํฌ๋„ŒํŠธ๋‚˜ ํ›…(hook)์ด ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•  ์ด์œ ๊ฐ€ ๋ช…ํ™•ํžˆ ํ•˜๋‚˜๋งŒ ์กด์žฌํ•˜๋„๋ก ์„ค๊ณ„ํ•ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค [2, 4]. +* **์‹๋ณ„ ๋ฐฉ๋ฒ• (์ฝ”๋“œ ์Šค๋ฉœ):** ์ปดํฌ๋„ŒํŠธ๊ฐ€ 300์ค„์„ ๋„˜์–ด๊ฐ€๋Š” ๋“ฑ ๊ณผ๋„ํ•˜๊ฒŒ ์ปค์ง„๋‹ค๋ฉด, ์ด๋Š” ์ƒํƒœ ๊ด€๋ฆฌ(managing state), ๋ฐ์ดํ„ฐ ํŽ˜์นญ(fetching data), ๋ณต์žกํ•œ JSX ๋ Œ๋”๋ง ๋“ฑ ๋„ˆ๋ฌด ๋งŽ์€ ์ž‘์—…์„ ๋™์‹œ์— ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์‹ ํ˜ธ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [4]. ๋ชจ๋“  ๊ฒƒ์„ ํ•œ ๊ณณ์—์„œ ์ฒ˜๋ฆฌํ•˜๋ ค๋Š” ๊ฑฐ๋Œ€ํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ํ”ํ•œ ์„ค๊ณ„ ํ•จ์ •์ž…๋‹ˆ๋‹ค [5]. +* **React์—์„œ์˜ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•:** + * **์ปดํฌ๋„ŒํŠธ ๋ถ„ํ• :** ๊ฑฐ๋Œ€ํ•œ ๋กœ์ง์„ ๊ฐ€์ง„ ํฐ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋” ์ž‘๊ณ  ๋ช…ํ™•ํ•œ ๋ชฉ์ ์„ ๊ฐ€์ง„ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, `UserDashboard` ์ปดํฌ๋„ŒํŠธ๋ฅผ `UserProfile`, `UserPosts`, `UserNotifications`๋กœ ๋‚˜๋ˆ„๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค [3, 4]. + * **ํ•จ์ˆ˜ ์ถ”์ถœ:** ํŠน์ • ์ž‘์—…์„ ๋ณ„๋„์˜ ๋ฒ”์šฉ ํ•จ์ˆ˜(general-purpose functions)๋กœ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค [3]. + * **Custom Hook ํ™œ์šฉ:** ์ปดํฌ๋„ŒํŠธ ๋‚ด์— ํ˜ผ์žฌ๋œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด๋‚˜ ์ƒํƒœ ๊ด€๋ฆฌ ๋กœ์ง์„ ์‚ฌ์šฉ์ž ์ •์˜ ํ›…(custom hooks)์œผ๋กœ ์ด๋™์‹œํ‚ต๋‹ˆ๋‹ค [3]. ๋ฒ”์šฉ์ ์ด๊ณ  ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ปดํฌ๋„ŒํŠธ๋Š” ๊ณต์œ  ํด๋”์—, ๊ธฐ๋Šฅ๋ณ„ ์ปดํฌ๋„ŒํŠธ๋Š” ํ•ด๋‹น ๊ธฐ๋Šฅ ๋””๋ ‰ํ† ๋ฆฌ์— ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค [5]. +* **๊ธฐ๋Œ€ ํšจ๊ณผ:** ์ฝ”๋“œ๋ฅผ ์ž‘๊ณ  ์ง‘์ค‘๋œ ํ˜•ํƒœ์˜ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ฆฌํŒฉํ† ๋งํ•˜๋ฉด ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ์„ฑ(testability)๊ณผ ์ฝ”๋“œ์˜ ๋ช…ํ™•์„ฑ์ด ํฌ๊ฒŒ ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค [4]. ๋˜ํ•œ, ๋‹จ์ผ ๋ชฉ์ ์„ ๊ฐ€์ง„ ์ž‘์€ ์ปดํฌ๋„ŒํŠธ๋“ค์€ ํ”„๋กœ๊ทธ๋žจ์˜ ์—ฌ๋Ÿฌ ์˜์—ญ์—์„œ ์žฌ์‚ฌ์šฉํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ๊ฐ€ ํ›จ์”ฌ ์‰ฝ์Šต๋‹ˆ๋‹ค [5]. + +## โš–๏ธ Trade-offs & Caveats +์†Œ์Šค์— ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP) ์ž์ฒด์— ๋Œ€ํ•œ ๊ตฌ์ฒด์ ์ธ ๋ถ€์ž‘์šฉ์ด๋‚˜ ์ œ์•ฝ ์‚ฌํ•ญ(Trade-offs)์— ๋Œ€ํ•œ ๊ด€๋ จ ์ •๋ณด๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋งŒ SRP๊ฐ€ ํฌํ•จ๋œ ์ „์ฒด SOLID ์›์น™์— ๋Œ€ํ•ด์„œ๋Š”, ์ฝ”๋“œ๋ฅผ ๊ณ ๋„๋กœ ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ์‰ฝ๊ณ  ์กฐ์ง์ ์œผ๋กœ ๋งŒ๋“ค์–ด์ฃผ์ง€๋งŒ ์ดˆ๊ธฐ์—๋Š” ์ ์šฉํ•˜๊ธฐ ๋ณต์žกํ•˜๊ฒŒ ๋А๊ปด์งˆ ์ˆ˜ ์žˆ๋‹ค(May initially feel complex)๋Š” ์ ์ด ์ œ์•ฝ ์‚ฌํ•ญ์œผ๋กœ ์–ธ๊ธ‰๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค [6]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [์†Œํ”„ํŠธ์›จ์–ด ์„ค๊ณ„ ๋ฐ ๊ธฐ๋ฐ˜ ์›์น™] +- [[SOLID Principles]] + - ์—ฐ๊ฒฐ ์ด์œ : SRP๋Š” SOLID๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” 5๊ฐ€์ง€ ์„ค๊ณ„ ์›์น™ ์ค‘ ์ฒซ ๋ฒˆ์งธ ํ•ต์‹ฌ ์š”์†Œ์ž…๋‹ˆ๋‹ค [7]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ์‹œ์ž‘๋œ ์ด ์›์น™๋“ค์ด ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ตฌ์กฐํ™”์™€ ํ™•์žฅ์„ฑ์— ์–ด๋–ป๊ฒŒ ์ข…ํ•ฉ์ ์œผ๋กœ ๊ธฐ์—ฌํ•˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [8]. +- [[Clean Code]] + - ์—ฐ๊ฒฐ ์ด์œ : ์ฝ๊ธฐ ์‰ฝ๊ณ  ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•œ ์›์น™์œผ๋กœ, ์ฝ”๋“œ๋ฅผ ๋ช…ํ™•ํ•˜๊ณ  ๋‹จ์ˆœํ•˜๊ฒŒ ์ž‘์„ฑํ•  ๊ฒƒ์„ ๊ฐ•์กฐํ•˜๋Š” SRP์™€ ๊ธด๋ฐ€ํ•˜๊ฒŒ ์—ฐ๊ด€๋ฉ๋‹ˆ๋‹ค [2, 9]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋‹จ์ผ ์ฑ…์ž„์„ ์ง€ํ‚ค๋ฉด์„œ๋„ ์–ด๋–ป๊ฒŒ ๋ณ€์ˆ˜๋ช…, ์ปดํฌ๋„ŒํŠธ ๊ตฌ์กฐ ๋“ฑ์„ ์ฝ๊ธฐ ์‰ฝ๊ฒŒ ๋‹ค๋“ฌ์„ ์ˆ˜ ์žˆ๋Š”์ง€ ์‹ค์ฒœ์  ๋ฐฉ๋ฒ•์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [9]. + +#### [React ํŒจํ„ด ๋ฐ ํ™œ์šฉ ๋„๊ตฌ] +- [[Custom Hooks]] + - ์—ฐ๊ฒฐ ์ด์œ : React์—์„œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์€ ์ฑ…์ž„์„ ๊ฐ€์งˆ ๋•Œ ๋ฐ์ดํ„ฐ ํŽ˜์นญ์ด๋‚˜ ์ƒํƒœ ๊ด€๋ฆฌ ๋กœ์ง์„ UI๋กœ๋ถ€ํ„ฐ ๋ถ„๋ฆฌํ•ด๋‚ด๋Š” ํ•ต์‹ฌ ์ˆ˜๋‹จ์ž…๋‹ˆ๋‹ค [3]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: SRP๋ฅผ ์‹ค์ œ React ํ™˜๊ฒฝ์—์„œ ์ ์šฉํ•˜์—ฌ UI ๋ Œ๋”๋ง ๋กœ์ง๊ณผ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋ถ„๋ฆฌํ•˜๋Š” ๊ตฌํ˜„ ํŒจํ„ด์„ ๊นŠ๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3]. +- [[Component Composition]] + - ์—ฐ๊ฒฐ ์ด์œ : ํ•˜๋‚˜์˜ ํฐ ์—ญํ• ์„ ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋…๋ฆฝ๋œ ์ฑ…์ž„์„ ๊ฐ€์ง„ ์„œ๋ธŒ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ถ„ํ• ํ•˜๊ณ  ์กฐํ•ฉํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค [4, 5]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: OCP(๊ฐœ๋ฐฉ-ํ์‡„ ์›์น™)์™€ SRP๋ฅผ ๋™์‹œ์— ๋งŒ์กฑ์‹œํ‚ค๋ฉฐ, ๋ ˆ๊ณ  ๋ธ”๋ก์ฒ˜๋Ÿผ ์œ ์—ฐํ•˜๊ฒŒ UI๋ฅผ ์กฐ๋ฆฝํ•˜๊ณ  ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์ด๋Š” ๋ฐฉ๋ฒ•์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2, 4]. + +### Deeper Research Questions + +- ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์—ฌ๋Ÿฌ ์ฑ…์ž„์„ ์ˆ˜ํ–‰ํ•˜๋Š”์ง€(์˜ˆ: 300์ค„ ์ดˆ๊ณผ) ํŒ๋‹จํ•  ๋•Œ, '๋‹จ์ผ ์ฑ…์ž„'์˜ ๊ฒฝ๊ณ„(Boundary)๋ฅผ ์–ด๋–ป๊ฒŒ ์ •์˜ํ•˜๊ณ  ํ‰๊ฐ€ํ•ด์•ผ ํ•˜๋Š”๊ฐ€? +- React ์ปดํฌ๋„ŒํŠธ์—์„œ ์ƒํƒœ ๊ด€๋ฆฌ ์ฑ…์ž„์„ ๋ถ„๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด Custom Hook์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ์™ธ์—, ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(Zustand, Context API ๋“ฑ)๋ฅผ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์ด SRP ๊ด€์ ์—์„œ ์–ด๋–ค ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”๊ฐ€? +- Feature-Sliced Design (FSD)์™€ ๊ฐ™์€ ๋ชจ๋“ˆํ˜• ์•„ํ‚คํ…์ฒ˜์—์„œ SRP๋Š” ๊ฐ Layer(๊ณต์œ , ์—”ํ‹ฐํ‹ฐ, ๊ธฐ๋Šฅ ๋“ฑ)์— ์–ด๋–ป๊ฒŒ ์ ์šฉ๋˜๋ฉฐ, ๋ชจ๋“ˆ ๊ฐ„ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๋Š” ๋ฐ ์–ด๋–ค ์—ญํ• ์„ ํ•˜๋Š”๊ฐ€? +- ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ๊ฐ•ํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋œ ๊ฑฐ๋Œ€ํ•œ ๋ ˆ๊ฑฐ์‹œ React ์ปดํฌ๋„ŒํŠธ๋ฅผ SRP ์›์น™์— ๋”ฐ๋ผ ๋ถ„๋ฆฌํ•  ๋•Œ, ํšŒ๊ท€(Regression)๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ€์žฅ ์•ˆ์ „ํ•œ ๋ฆฌํŒฉํ† ๋ง ๋ฐ ํ…Œ์ŠคํŠธ ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? +- SRP๋ฅผ ๊ทน๋‹จ์ ์œผ๋กœ ์ ์šฉํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ์™€ ํ›…์„ ๋„ˆ๋ฌด ์ž˜๊ฒŒ ๋ถ„ํ•ดํ–ˆ์„ ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ํŒŒ์ผ ๊ตฌ์กฐ ๋ฐ Props ์ „๋‹ฌ์˜ ๋ณต์žก์„ฑ์€ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? + +### Practical Application Contexts + +- **Implementation:** React ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์ฝ”๋“œ ๋ผ์ธ ์ˆ˜๊ฐ€ ์ง€๋‚˜์น˜๊ฒŒ ๊ธธ์–ด์ง€๊ฑฐ๋‚˜(์˜ˆ: 300์ค„ ์ดˆ๊ณผ) ๋กœ์ง์ด ๋ณต์žกํ•ด์ง€๋ฉด, ๋ฐ์ดํ„ฐ ํŽ˜์นญ, ์ƒํƒœ ๊ด€๋ฆฌ ๋กœ์ง์„ Custom Hooks๋กœ ์ถ”์ถœํ•˜๊ณ  UI ๋ Œ๋”๋ง์„ ์ชผ๊ฐœ์–ด ๋‹จ์ผ ์ฑ…์ž„๋งŒ ๊ฐ–๋„๋ก ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค [3, 4]. +- **System Design:** ํด๋” ๊ตฌ์กฐ๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ชจ๋“  ๊ฒƒ์„ ์ฒ˜๋ฆฌํ•˜๋„๋ก ๋‘์ง€ ์•Š๊ณ , ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ณตํ†ต ์ปดํฌ๋„ŒํŠธ๋Š” ๊ณต์œ (Shared) ํด๋”์—, ํŠน์ • ๊ธฐ๋Šฅ์— ์ข…์†๋œ ์ปดํฌ๋„ŒํŠธ๋Š” Feature ๋””๋ ‰ํ† ๋ฆฌ์— ๋ช…ํ™•ํžˆ ๊ฒฉ๋ฆฌํ•˜์—ฌ ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค [5]. +- **Operation / Maintenance:** ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์ฝ”๋“œ๊ฐ€ ๋‹จ์ผ ์ฑ…์ž„ ์›์น™์— ๋”ฐ๋ผ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ๋‹ค๋ฉด, ๋ฌธ์ œ๊ฐ€ UI ๋ Œ๋”๋ง์— ์žˆ๋Š”์ง€ ์ƒํƒœ ๊ด€๋ฆฌ์— ์žˆ๋Š”์ง€ ์ถ”์ ํ•˜๊ธฐ ์‰ฌ์›Œ์ ธ ์œ ์ง€๋ณด์ˆ˜ ์†๋„์™€ ์ •ํ™•์„ฑ์„ ํฌ๊ฒŒ ๋†’์ž…๋‹ˆ๋‹ค [4-6]. +- **Learning Path:** React์˜ ๊ธฐ๋ณธ ๊ฐœ๋…(State, Props, JSX)์„ ์ตํžŒ ํ›„, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ทœ๋ชจ๊ฐ€ ์ปค์ง์— ๋”ฐ๋ผ ๋ฐœ์ƒํ•˜๋Š” ์ŠคํŒŒ๊ฒŒํ‹ฐ ์ฝ”๋“œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Clean Code์™€ SOLID ์›์น™(ํŠนํžˆ SRP)์„ ํ•™์Šตํ•˜๊ณ  ์ด๋ฅผ ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง์— ์ ์šฉํ•ด ๋ณด๋Š” ๋ฐฉ์‹์œผ๋กœ ๋‚˜์•„๊ฐ‘๋‹ˆ๋‹ค [7-9]. +- **My Project Relevance:** ๊ฑฐ๋Œ€ํ•œ ๋Œ€์‹œ๋ณด๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋“ฑ์„ ๊ตฌ์ถ•ํ•  ๋•Œ, ์ „์ฒด๋ฅผ ํ•˜๋‚˜์˜ ํŽ˜์ด์ง€๋‚˜ ์ปดํฌ๋„ŒํŠธ๋กœ ์งœ์ง€ ์•Š๊ณ  `UserProfile`, `UserPosts`, `UserNotifications` ๋“ฑ ๋…๋ฆฝ์ ์ธ ๋ชฉ์ ์„ ๊ฐ€์ง„ ์ปดํฌ๋„ŒํŠธ๋“ค๋กœ ์„ธ๋ถ„ํ™”ํ•˜์—ฌ ํ…Œ์ŠคํŠธ์™€ ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์šฉ์ดํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค [4]. + +### Adjacent Topics + +- [[DRY (Don't Repeat Yourself)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ์ฝ”๋“œ๋ฅผ ๋‹จ์ผ ์ฑ…์ž„์œผ๋กœ ์ชผ๊ฐ  ํ›„, ์ค‘๋ณต๋˜๋Š” ๋กœ์ง(์˜ˆ: ๋™์ผํ•œ ๋ฐ์ดํ„ฐ ํŽ˜์นญ ๋ฐฉ์‹ ๋“ฑ)์„ ์‹๋ณ„ํ•˜๊ณ  ์ด๋ฅผ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ•จ์ˆ˜๋‚˜ ํ›…์œผ๋กœ ํ†ตํ•ฉํ•˜๋Š” ์ตœ์ ํ™” ๋ฐฉํ–ฅ์œผ๋กœ ์ดํ•ด๋ฅผ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [9, 10]. +- [[KISS (Keep It Simple, Stupid)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋‹จ์ผ ์ฑ…์ž„ ์›์น™์„ ์ง€ํ‚ค๊ธฐ ์œ„ํ•ด ์ฝ”๋“œ๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ๊ณผ์ •์—์„œ, ์ง€๋‚˜์นœ ์ถ”์ƒํ™”๋กœ ์ธํ•ด ๊ตฌ์กฐ๊ฐ€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ณต์žกํ•ด์ง€์ง€ ์•Š๋„๋ก(๋‹จ์ˆœํ•จ์„ ์œ ์ง€ํ•˜๋„๋ก) ๋•๋Š” ๋ณด์™„์ ์ธ ์„ค๊ณ„ ์›์น™์œผ๋กœ ํ•™์Šต์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [9, 10]. + +--- +*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 new file mode 100644 index 00000000..f9d83ea7 --- /dev/null +++ b/00_Raw/Small vs Large Frontend Teams.md @@ -0,0 +1,68 @@ +# [[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 new file mode 100644 index 00000000..15cb2aed --- /dev/null +++ b/00_Raw/State Management Libraries.md @@ -0,0 +1,78 @@ +# [[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 new file mode 100644 index 00000000..2827c708 --- /dev/null +++ b/00_Raw/Storybook Component Testing.md @@ -0,0 +1,66 @@ +# [[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/Technical Debt Management.md b/00_Raw/Technical Debt Management.md new file mode 100644 index 00000000..05a3e708 --- /dev/null +++ b/00_Raw/Technical Debt Management.md @@ -0,0 +1,63 @@ +# [[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 new file mode 100644 index 00000000..12529a8b --- /dev/null +++ b/00_Raw/Technical Debt.md @@ -0,0 +1,57 @@ +# [[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/Trunk-based Development.md b/00_Raw/Trunk-based Development.md new file mode 100644 index 00000000..50d564cc --- /dev/null +++ b/00_Raw/Trunk-based Development.md @@ -0,0 +1,56 @@ +# [[Trunk-based Development]] + +## ๐Ÿ“Œ Brief Summary +Trunk-based Development๋Š” ๊ฐœ๋ฐœ์ž๋“ค์ด ์งง์€ ์ฃผ๊ธฐ๋กœ ์ž‘์€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ค‘์•™์˜ ์ฃผ ๋ธŒ๋žœ์น˜(์ฃผ๋กœ `main` ๋ธŒ๋žœ์น˜)์— ์ง€์†์ ์œผ๋กœ ๋ณ‘ํ•ฉํ•˜๋Š” ๊ฒฝ๋Ÿ‰ํ™”๋œ ๋ธŒ๋žœ์นญ ์›Œํฌํ”Œ๋กœ์šฐ์ž…๋‹ˆ๋‹ค [1, 2]. ์ด ์ „๋žต์€ ์ฝ”๋“œ์˜ ๋Œ€๊ทœ๋ชจ ๋ณ‘ํ•ฉ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๊ณ  ์ฝ”๋“œ์˜ ๋น ๋ฅธ ํ†ตํ•ฉ(fast integration)์„ ๋‹ฌ์„ฑํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค [3, 4]. ์ฃผ๋กœ ๊ฐ•๋ ฅํ•œ ์ง€์†์  ํ†ตํ•ฉ(CI) ํ™˜๊ฒฝ์„ ๊ฐ–์ถ˜ ๊ฒฝํ—˜ ๋งŽ์€ ๊ฐœ๋ฐœ ํŒ€์—๊ฒŒ ๊ฐ€์žฅ ์ ํ•ฉํ•œ ๋ฐฉ์‹์ด๋ฉฐ, Git Flow์™€ ๊ฐ™์€ ๋ฌด๊ฑฐ์šด ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ํ”ผํ•˜๊ณ ์ž ํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค [5]. + +## ๐Ÿ“– Core Content +- **ํ•ต์‹ฌ ์›์น™**: ๋ฉ”์ธ ๋ธŒ๋žœ์น˜(`main`)๋Š” ์ง์ ‘์ ์ธ ํ‘ธ์‹œ(direct push)๊ฐ€ ๊ธˆ์ง€๋˜๋ฉฐ, ์–ธ์ œ๋‚˜ ์•ˆ์ •์ ์ด๊ณ  ์ฆ‰์‹œ ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ(always stable, deployable)๋ฅผ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [1, 2, 6]. +- **๋‹จ๊ธฐ ๋ธŒ๋žœ์น˜ ์šด์˜ (Short-lived branches)**: ๊ฐ ์ž‘์—…(Task) ๋‹น ํ•˜๋‚˜์˜ ๋ธŒ๋žœ์น˜๋ฅผ ์ƒ์„ฑํ•˜๋ฉฐ, ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ž‘๊ฒŒ ์œ ์ง€ํ•˜์—ฌ ์•„์ฃผ ์งง์€ ์ฃผ๊ธฐ(์ˆ˜์ผ ๋‚ด)์— ๋ฉ”์ธ ๋ธŒ๋žœ์น˜๋กœ ๋ณ‘ํ•ฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [1, 2, 4]. +- **๋น ๋ฅธ ํ†ตํ•ฉ ๋ฐ ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ**: ๊ฐœ๋ฐœ์ž๋Š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ž‘๊ฒŒ ๋‚˜๋ˆ„์–ด ๋น ๋ฅด๊ฒŒ ์ปค๋ฐ‹ํ•˜๋ฉฐ, ์•„์ง ์™„์„ฑ๋˜์ง€ ์•Š์€ ๊ธฐ๋Šฅ์€ ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ(Feature flags)๋ฅผ ํ™œ์šฉํ•ด ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์— ๋ณ‘ํ•ฉํ•˜๋”๋ผ๋„ ์šด์˜ ํ™˜๊ฒฝ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋„๋ก ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค [4]. +- **ํ’ˆ์งˆ ๋ณด์ฆ (PR ๋ฐ ์ฝ”๋“œ ๋ฆฌ๋ทฐ)**: ์ฝ”๋“œ๋ฅผ ๋ณ‘ํ•ฉํ•˜๊ธฐ ์ „์—๋Š” ํ•ญ์ƒ ํ’€ ๋ฆฌํ€˜์ŠคํŠธ(PR)๋ฅผ ์—ด์–ด์•ผ ํ•˜๋ฉฐ, ์ตœ์†Œ 1๋ช… ์ด์ƒ์˜ ๋™๋ฃŒ ๋ฆฌ๋ทฐ(Peer Review)์™€ CI(์ง€์†์  ํ†ตํ•ฉ) ํ…Œ์ŠคํŠธ ํ†ต๊ณผ๊ฐ€ ํ•„์ˆ˜ ์กฐ๊ฑด์ž…๋‹ˆ๋‹ค [2, 7]. +- **ํžˆ์Šคํ† ๋ฆฌ ๊ด€๋ฆฌ**: ๊น”๋”ํ•œ ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์Šค์ฟผ์‹œ ๋ณ‘ํ•ฉ(Squash merge)์„ ์‚ฌ์šฉํ•˜๋ฉฐ, ๋ณ‘ํ•ฉ์ด ์™„๋ฃŒ๋œ ํ›„์—๋Š” ํ•ด๋‹น ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜๋ฅผ ์ž๋™์œผ๋กœ ์‚ญ์ œํ•˜์—ฌ ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋ฅผ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค [2, 7]. + +## โš–๏ธ Trade-offs & Caveats +์ด ์›Œํฌํ”Œ๋กœ์šฐ๋Š” ๋ฌด๊ฑฐ์šด ํ”„๋กœ์„ธ์Šค ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ œ๊ฑฐํ•˜์—ฌ ๋น ๋ฅธ ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•˜๊ณ , ์žฅ๊ธฐ ์‹คํ–‰ ๋ธŒ๋žœ์น˜(long-running branches)์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์‹ฌ๊ฐํ•œ ๋ณ‘ํ•ฉ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•œ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค [3, 8, 9]. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿฌํ•œ ์ด์ ์—๋Š” ๋ถ„๋ช…ํ•œ ๋ฐ˜๋Œ€ ๊ธ‰๋ถ€๊ฐ€ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ๋จผ์ €, ํŒ€์›๋“ค ๊ฐ„์˜ ๋งค์šฐ ๊ธด๋ฐ€ํ•œ ์กฐ์œจ(coordination)๊ณผ ๋†’์€ ๊ทœ์œจ์ด ์š”๊ตฌ๋ฉ๋‹ˆ๋‹ค [3]. ๋‘ ๋ฒˆ์งธ๋กœ, ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋Š” ์ฝ”๋“œ๊ฐ€ ๋ณ‘ํ•ฉ๋˜๋Š” ๊ฒƒ์„ ๋ง‰๊ธฐ ์œ„ํ•ด ๋งค์šฐ ๊ฐ•๋ ฅํ•œ ํ…Œ์ŠคํŠธ ์ž๋™ํ™”์™€ CI ์ธํ”„๋ผ๊ฐ€ ํ•„์ˆ˜์ ์ด๋ฉฐ, ์ด๋Ÿฌํ•œ ์ด์œ ๋กœ ์ดˆ๋ณด์ž๋ณด๋‹ค๋Š” ์ˆ™๋ จ๋œ ํŒ€(very experienced teams)์—๊ฒŒ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค [5]. ๋งˆ์ง€๋ง‰์œผ๋กœ ๋ฏธ์™„์„ฑ ๊ธฐ๋Šฅ์„ ๋น ๋ฅด๊ฒŒ ๋ณ‘ํ•ฉํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ(Feature flags)๋ฅผ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋Š” ์ถ”๊ฐ€์ ์ธ ๋ณต์žก์„ฑ๊ณผ, ์ด๋ฅผ ๋’ท๋ฐ›์นจํ•  ๊ฐ•๋ ฅํ•œ ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€๊ฐ€ ๊ฐ•์ œ๋œ๋‹ค๋Š” ๊ธฐ์ˆ ์  ์ œ์•ฝ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค [4]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [์›Œํฌํ”Œ๋กœ์šฐ ๋ฐ ํ†ตํ•ฉ ์•„ํ‚คํ…์ฒ˜] +- [[Continuous Integration (CI)]] + - ์—ฐ๊ฒฐ ์ด์œ : Trunk-based Development์—์„œ ์งง์€ ์ฃผ๊ธฐ๋กœ ์ฝ”๋“œ๋ฅผ ๋ณ‘ํ•ฉํ•  ๋•Œ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์˜ ์•ˆ์ •์„ฑ์„ ๊ฒ€์ฆํ•˜๊ธฐ ์œ„ํ•œ ํ•„์ˆ˜ ์ „์ œ ์กฐ๊ฑด์ž…๋‹ˆ๋‹ค [2, 5]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ž๋™ํ™”๋œ ํ…Œ์ŠคํŠธ๊ฐ€ ํ†ต๊ณผํ•ด์•ผ๋งŒ ๋ณ‘ํ•ฉ์„ ํ—ˆ์šฉํ•˜๋Š” ๊ณผ์ •์ด ์–ด๋–ป๊ฒŒ ๋นŒ๋“œ ์‹คํŒจ์™€ ๋ฒ„๊ทธ๋ฅผ ์‚ฌ์ „์— ์ฐจ๋‹จํ•˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +#### [๊ตฌํ˜„ ๋ฐ ์ฝ”๋“œ ๊ด€๋ฆฌ ๋„๊ตฌ] +- [[Feature Flags]] + - ์—ฐ๊ฒฐ ์ด์œ : Trunk-based Development์—์„œ ์ฝ”๋“œ ํ†ตํ•ฉ ์†๋„๋ฅผ ๋†’์ด๊ธฐ ์œ„ํ•ด, ์•„์ง ์™„์„ฑ๋˜์ง€ ์•Š์€ ๊ธฐ๋Šฅ์„ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์— ์•ˆ์ „ํ•˜๊ฒŒ ๋ณ‘ํ•ฉํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ํ•ต์‹ฌ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค [4]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ฝ”๋“œ์˜ ๋ฐฐํฌ(Deployment)์™€ ๊ธฐ๋Šฅ์˜ ๋ฆด๋ฆฌ์Šค(Release)๋ฅผ ๊ธฐ์ˆ ์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[Squash Merge]] + - ์—ฐ๊ฒฐ ์ด์œ : ์งง์€ ์ˆ˜๋ช…์˜ ๋ธŒ๋žœ์น˜๋ฅผ ์ž์ฃผ ๋ณ‘ํ•ฉํ•จ์— ๋”ฐ๋ผ ์ง€์ €๋ถ„ํ•ด์งˆ ์ˆ˜ ์žˆ๋Š” ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์˜ ์ปค๋ฐ‹ ์ด๋ ฅ์„ ํ•˜๋‚˜์˜ ์˜๋ฏธ ์žˆ๋Š” ์ปค๋ฐ‹์œผ๋กœ ์••์ถ•ํ•˜์—ฌ ๊น”๋”ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋Š” ๋ณ‘ํ•ฉ ์ „๋žต์ž…๋‹ˆ๋‹ค [2, 7, 10]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์žฆ์€ ํ†ตํ•ฉ ์ƒํ™ฉ์—์„œ ์ฝ”๋“œ ๋ฆฌ๋ทฐ์™€ ํžˆ์Šคํ† ๋ฆฌ ์ถ”์ ์„ ์šฉ์ดํ•˜๊ฒŒ ํ•˜๋Š” Git ์ด๋ ฅ ๊ด€๋ฆฌ ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### Deeper Research Questions +- Feature Branch ๊ธฐ๋ฐ˜ ์ „๋žต์—์„œ Trunk-based Development๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ๋•Œ, ๊ฐœ๋ฐœํŒ€์˜ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๋ฌธํ™”์™€ CI ํ…Œ์ŠคํŠธ ํ”„๋กœ์„ธ์Šค๋Š” ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ๋ณ€ํ™”ํ•ด์•ผ ํ•˜๋Š”๊ฐ€? +- ๋ฏธ์™„์„ฑ ๊ธฐ๋Šฅ์„ ํ†ตํ•ฉํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ(Feature flags)๋ฅผ ๊ณผ๋„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ์ˆ  ๋ถ€์ฑ„(Technical debt)๋Š” ๋ฌด์—‡์ด๋ฉฐ, ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒญ์‚ฐํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- Trunk-based Development๋ฅผ ์ ์šฉํ•  ๋•Œ, ์Šค์ฟผ์‹œ ๋ณ‘ํ•ฉ(Squash merge)์„ ํ†ตํ•ด ๊น”๋”ํ•œ ๋ฉ”์ธ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐœ๋ณ„ ์ž‘์—… ๋‹จ์œ„์˜ ์ƒ์„ธํ•œ ๋””๋ฒ„๊น… ์ถ”์ ์„ฑ์„ ํ™•๋ณดํ•˜๋Š” ๊ฒƒ ์‚ฌ์ด์˜ ๊ท ํ˜•์€ ์–ด๋–ป๊ฒŒ ๋งž์ถฐ์•ผ ํ•˜๋Š”๊ฐ€? +- ๊ฒฝํ—˜์ด ์ ์€ ํŒ€(์ดˆ๋ณด ํŒ€)์ด Trunk-based Development๋ฅผ ๋„์ž…ํ–ˆ์„ ๋•Œ ๊ฒช์„ ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ์น˜๋ช…์ ์ธ ๋ฌธ์ œ์ ์€ ๋ฌด์—‡์ด๋ฉฐ, ์ด๋ฅผ ์™„ํ™”ํ•˜๊ธฐ ์œ„ํ•œ ๋‹จ๊ณ„์  ๋„์ž… ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? +- ๋Œ€๊ทœ๋ชจ ์˜คํ”ˆ์†Œ์Šค ํ”„๋กœ์ ํŠธ๋‚˜ ๋Œ€ํ˜• ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ํ™˜๊ฒฝ์—์„œ Trunk-based Development๊ฐ€ Git Flow ๋ฐฉ์‹์— ๋น„ํ•ด ๊ฐ€์ง€๋Š” ๊ตฌ์กฐ์  ํ•œ๊ณ„์ ์€ ๋ฌด์—‡์ธ๊ฐ€? + +### Practical Application Contexts + +- **Implementation:** ์ž‘์—…์„ ๋งค์šฐ ์ž‘์€ ๋‹จ์œ„ ๋…ผ๋ฆฌ์  ๋ณ€๊ฒฝ(atomic commits)์œผ๋กœ ๋‚˜๋ˆ„์–ด ๋ธŒ๋žœ์น˜๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ๋ฅผ ํ™œ์šฉํ•ด ๋ฏธ์™„์„ฑ ์ฝ”๋“œ๋ผ๋„ ์ง€์†์ ์œผ๋กœ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์— ๋ณ‘ํ•ฉํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค [4, 11]. +- **System Design:** ์ฝ”๋“œ๊ฐ€ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜๋กœ ๋ณ‘ํ•ฉ๋˜๊ธฐ ์ „ ์ž๋™์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๊ฒ€์ฆํ•˜๋Š” ๊ฐ•๋ ฅํ•œ CI(์ง€์†์  ํ†ตํ•ฉ) ํŒŒ์ดํ”„๋ผ์ธ๊ณผ ๋ธŒ๋žœ์น˜ ๋ณดํ˜ธ ๊ทœ์น™(Branch protection)์„ ์‹œ์Šคํ…œ์ ์œผ๋กœ ์„ค๊ณ„ํ•˜๊ณ  ์—ฐ๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [5, 7]. +- **Operation / Maintenance:** '๋ณ‘ํ•ฉ ํ›„ ๋ธŒ๋žœ์น˜ ์ž๋™ ์‚ญ์ œ(Auto-delete merged branches)' ์„ค์ •์„ ์ผœ๊ณ , ์ง์ ‘ ํ‘ธ์‹œ(direct push)๋ฅผ ๊ธˆ์ง€ํ•˜์—ฌ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜๋ฅผ ํ•ญ์ƒ ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ ๊น”๋”ํ•œ ์ƒํƒœ๋กœ ์œ ์ง€๋ณด์ˆ˜ํ•ฉ๋‹ˆ๋‹ค [7, 11]. +- **Learning Path:** ์ฒ˜์Œ์—๋Š” ๋‹จ์ˆœํ•œ Feature Branch ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ํ†ตํ•ด ์ž‘์€ ์ปค๋ฐ‹๊ณผ PR ๊ณผ์ •์„ ์ตํžˆ๊ณ , CI๊ฐ€ ๊ฐ•ํ™”๋˜๊ณ  ๋ธŒ๋žœ์น˜ ์ˆ˜๋ช…์„ ์ˆ˜์ผ ๋‚ด๋กœ ๋‹จ์ถ•ํ•  ์ˆ˜ ์žˆ๋Š” ํ™•์‹ ์ด ๋“ค ๋•Œ Trunk-based ์ „๋žต์œผ๋กœ ์ ์ง„์ ์œผ๋กœ ์ด๊ด€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค [4, 5]. +- **My Project Relevance:** ์†Œ์Šค์— ๊ด€๋ จ ์ •๋ณด๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. + +### Adjacent Topics + +- [[Git Flow]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: Trunk-based Development์™€ ๋Œ€๋น„๋˜๋Š” ๋ฌด๊ฒ๊ณ  ๋ณต์žกํ•œ ๋ธŒ๋žœ์นญ ์ „๋žต์œผ๋กœ, ์™œ ์†Œ๊ทœ๋ชจ ํŒ€์ด๋‚˜ ๋น ๋ฅธ ๋ฐฐํฌ๋ฅผ ์›ํ•˜๋Š” ํŒ€์ด ์ด ์ „๋žต ๋Œ€์‹  Trunk-based๋ฅผ ์„ ํƒํ•˜๋Š”์ง€ ๋‘ ์ „๋žต ๊ฐ„์˜ ๊ตฌ์กฐ์  ์ฐจ์ด์™€ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๋ฅผ ํ™•์žฅํ•˜์—ฌ ๋น„๊ตํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [4, 5]. +- [[Feature Branch Workflow]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ์†Œ๊ทœ๋ชจ ํŒ€์— ๊ฐ€์žฅ ์นœํ™”์ ์ธ ๊ธฐ๋ณธ ์›Œํฌํ”Œ๋กœ์šฐ๋กœ, ์ด ์ „๋žต์˜ ๋ธŒ๋žœ์น˜ ์ˆ˜๋ช…์„ ๊ทน๋‹จ์ ์œผ๋กœ ์ค„์˜€์„ ๋•Œ ์–ด๋–ป๊ฒŒ Trunk-based Development๋กœ ์ง„ํ™”ํ•˜๊ฒŒ ๋˜๋Š”์ง€ ์—ฐ๊ฒฐํ•˜์—ฌ ํ•™์Šตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [4, 12]. + +--- +*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 new file mode 100644 index 00000000..39e67535 --- /dev/null +++ b/00_Raw/Vite and Bundling.md @@ -0,0 +1,63 @@ +# [[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/YAGNI.md b/00_Raw/YAGNI.md new file mode 100644 index 00000000..3ec47b1a --- /dev/null +++ b/00_Raw/YAGNI.md @@ -0,0 +1,52 @@ +# [[YAGNI]] + +## ๐Ÿ“Œ Brief Summary +YAGNI๋Š” "You Aren't Gonna Need It(๋‹น์‹ ์€ ๊ทธ๊ฒƒ์ด ํ•„์š”ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค)"์˜ ์•ฝ์ž๋กœ, ๋ฏธ๋ž˜์— ํ•„์š”ํ• ์ง€๋„ ๋ชจ๋ฅด๋Š” ๊ธฐ๋Šฅ์„ ๋ฏธ๋ฆฌ ๊ตฌํ˜„ํ•˜์ง€ ๋ง๋ผ๋Š” ์†Œํ”„ํŠธ์›จ์–ด ์—”์ง€๋‹ˆ์–ด๋ง ์›์น™์ž…๋‹ˆ๋‹ค [1, 2]. ๊ฐœ๋ฐœ์ž๋Š” ์˜ค์ง ํ˜„์žฌ์˜ ์š”๊ตฌ์‚ฌํ•ญ์—๋งŒ ์ง‘์ค‘ํ•ด์•ผ ํ•˜๋ฉฐ, ๋‚˜์ค‘์— ์‚ฌ์šฉ๋  ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ์ด์œ ๋งŒ์œผ๋กœ ๋ณต์žกํ•œ ๊ธฐ๋Šฅ์„ ์‚ฌ์ „์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ํ”ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [1, 3]. ์ด ์›์น™์„ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๋Š” ์‹œ๊ฐ„ ๋‚ญ๋น„๋ฅผ ์ค„์ด๊ณ , ์œ ์ง€๋ณด์ˆ˜ํ•ด์•ผ ํ•  ์ฝ”๋“œ์˜ ์–‘๊ณผ ๋ณต์žก์„ฑ์„ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1, 4]. + +## ๐Ÿ“– Core Content +* **ํ•ต์‹ฌ ๊ฐœ๋… ๋ฐ ๋ชฉ์ **: YAGNI๋Š” ํ˜„์žฌ ๋ช…ํ™•ํžˆ ์š”๊ตฌ๋˜์ง€ ์•Š์€ ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ๊ฐœ๋ฐœ ์‹œ๊ฐ„์„ ๋‚ญ๋น„ํ•˜์ง€ ์•Š๋„๋ก ๋•๋Š” ์‹ค์šฉ์ฃผ์˜์  ๋ฐฉ๋ฒ•๋ก ์ž…๋‹ˆ๋‹ค [3]. ๋ฏธ๋ž˜๋ฅผ ๋Œ€๋น„ํ•ด ์„ ์ œ์ ์œผ๋กœ ์ž‘์„ฑํ•œ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์€ ๊ฒฐ๊ตญ ์‹ค์ œ ์‚ฌ์šฉ๋˜์ง€ ์•Š์„ ํ™•๋ฅ ์ด ๋†’์œผ๋ฉฐ, ์ถ”ํ›„ ์š”๊ตฌ์‚ฌํ•ญ์ด ๋ณ€๊ฒฝ๋˜๋ฉด ์• ์จ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๊ฐ€ ์•„์˜ˆ ๋ถˆํ•„์š”ํ•ด์งˆ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค [3]. +* **React ๋ฐ ํ”„๋ก ํŠธ์—”๋“œ ์ƒํƒœ๊ณ„์—์„œ์˜ ์ ์šฉ**: React ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฐœ๋ฐœํ•  ๋•Œ, ํ˜„์žฌ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋‹น์žฅ ํ•„์š”๋กœ ํ•˜๋Š” ๊ธฐ๋Šฅ๊ณผ ์†์„ฑ(props)๋งŒ์„ ๋จผ์ € ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค [5]. ํ™•์žฅ์„ฑ์€ ์ถ”ํ›„ ์‹ค์ œ๋กœ ๊ทธ ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•ด์กŒ์„ ๋•Œ ๊ณ ๋ คํ•˜์—ฌ ๋ง๋ถ™์ด๋Š” ํ˜•ํƒœ๋ฅผ ์ทจํ•ฉ๋‹ˆ๋‹ค [5]. +* **์ ์šฉ ํ™˜๊ฒฝ**: ํŠนํžˆ ์š”๊ตฌ์‚ฌํ•ญ์ด ๋น ๋ฅด๊ณ  ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ณ€๊ฒฝ๋˜๋Š” ์• ์ž์ผ(Agile) ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์ด๋‚˜ ์Šคํƒ€ํŠธ์—… ํ”„๋กœ์ ํŠธ์—์„œ ๋งค์šฐ ์ค‘์š”ํ•œ ์›์น™์œผ๋กœ ์ž‘์šฉํ•ฉ๋‹ˆ๋‹ค [1, 5]. ํ˜„์žฌ ๊ธฐ๋Šฅ์— ์ง‘์ค‘ํ•จ์œผ๋กœ์จ ํ”„๋กœ์ ํŠธ์˜ ๋ฐฉํ–ฅ ์ „ํ™˜ ์‹œ ๋ถˆํ•„์š”ํ•œ ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๊ฐ€ ๋ฐœ๋ชฉ์„ ์žก๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. + +## โš–๏ธ Trade-offs & Caveats +YAGNI ์›์น™์„ ์ค€์ˆ˜ํ•˜๋ฉด ๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ ๋‚ญ๋น„๋˜๋Š” ๋…ธ๋ ฅ(wasted effort)์„ ํฌ๊ฒŒ ์ค„์ผ ์ˆ˜ ์žˆ๊ณ  ์‹œ์Šคํ…œ ๋‚ด์— ๋ฐฉ์น˜๋˜๋Š” ๋ฐ๋“œ ์ฝ”๋“œ(dead code)๋ฅผ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฐ•๋ ฅํ•œ ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค [1, 4]. + +ํ•˜์ง€๋งŒ ๋ฐ˜๋Œ€ ๊ธ‰๋ถ€(Trade-off)๋กœ **๋ฏธ๋ž˜์˜ ํ™•์žฅ์„ฑ(future scalability)์„ ๊ฐ„๊ณผํ•  ์œ„ํ—˜**์ด ์žˆ์Šต๋‹ˆ๋‹ค [4]. ๋‹น์žฅ์˜ ์š”๊ตฌ์‚ฌํ•ญ์—๋งŒ ์ง€๋‚˜์น˜๊ฒŒ ์ดˆ์ ์„ ๋งž์ถ”๋‹ค ๋ณด๋ฉด, ์ถ”ํ›„ ์‹œ์Šคํ…œ์„ ๋Œ€๊ทœ๋ชจ๋กœ ํ™•์žฅํ•˜๊ฑฐ๋‚˜ ๊ทผ๋ณธ์ ์ธ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•  ๋•Œ ๊ธฐ์กด ๊ตฌ์กฐ๊ฐ€ ์œ ์—ฐํ•˜๊ฒŒ ๋Œ€์‘ํ•˜์ง€ ๋ชปํ•˜์—ฌ ์˜คํžˆ๋ ค ๋” ํฐ ๋ฆฌํŒฉํ† ๋ง ๋น„์šฉ์„ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ๋Š” ์ œ์•ฝ ์‚ฌํ•ญ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค [4]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [์†Œํ”„ํŠธ์›จ์–ด ์—”์ง€๋‹ˆ์–ด๋ง ์›์น™ (Software Engineering Principles)] +- [[KISS]] + - ์—ฐ๊ฒฐ ์ด์œ : "Keep It Simple, Stupid"์˜ ์•ฝ์ž๋กœ, ์ฝ”๋“œ๋ฅผ ๋‹จ์ˆœํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ณ  ๋ณต์žก์„ฑ์„ ํ”ผํ•˜๋ผ๋Š” ์›์น™์ด๋ฏ€๋กœ YAGNI์™€ ๋ฐฉํ–ฅ์„ฑ์„ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค [2, 6]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: YAGNI๊ฐ€ ๊ธฐ๋Šฅ์˜ '์ถ”๊ฐ€ ์—ฌ๋ถ€(๊ฐœ๋ฐœํ•  ๊ฒƒ์ธ๊ฐ€ ๋ง ๊ฒƒ์ธ๊ฐ€)'๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค๋ฉด, KISS๋Š” ๊ฐœ๋ฐœํ•˜๊ธฐ๋กœ ๊ฒฐ์ •๋œ ๊ธฐ๋Šฅ์„ '์–ผ๋งˆ๋‚˜ ๋‹จ์ˆœํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ๊ฒƒ์ธ๊ฐ€'๋ฅผ ๊ทœ์ •ํ•˜์—ฌ ํด๋ฆฐ ์ฝ”๋“œ ์ž‘์„ฑ์„ ๋•์Šต๋‹ˆ๋‹ค [2]. +- [[DRY]] + - ์—ฐ๊ฒฐ ์ด์œ : "Don't Repeat Yourself"์˜ ์•ฝ์ž๋กœ, YAGNI, KISS์™€ ํ•จ๊ป˜ ๋ฐ˜๋ณต์„ ์ค„์ด๊ณ  ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์ด๋Š” ๋˜ ๋‹ค๋ฅธ ํ•ต์‹ฌ ์›์น™์œผ๋กœ ๋ฌถ์—ฌ ์–ธ๊ธ‰๋ฉ๋‹ˆ๋‹ค [2, 6]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ค‘๋ณต ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด ์ถ”์ƒํ™”(Custom Hooks ๋“ฑ)๋ฅผ ๋„์ž…ํ•  ๋•Œ, ๊ณผ๋„ํ•œ ์ถ”์ƒํ™”(Over-engineering)๋กœ ์ด์–ด์ง€์ง€ ์•Š๋„๋ก YAGNI ์›์น™๊ณผ ์–ด๋–ป๊ฒŒ ์ƒํ˜ธ ๋ณด์™„์ ์œผ๋กœ ์ž‘์šฉํ•ด์•ผ ํ•˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5, 6]. +- [[SOLID]] + - ์—ฐ๊ฒฐ ์ด์œ : ํ™•์žฅ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ๋†’์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•œ 5๊ฐ€์ง€ ์›์น™ ๋ชจ์Œ์œผ๋กœ, React ํ™˜๊ฒฝ์—์„œ๋„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ถ„๋ฆฌํ•˜๊ณ  ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๋Š” ๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ๋กœ ์ž‘์šฉํ•ฉ๋‹ˆ๋‹ค [7, 8]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์•„ํ‚คํ…์ฒ˜ ์ˆ˜์ค€์—์„œ ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)์ด๋‚˜ ๊ฐœ๋ฐฉ/ํ์‡„ ์›์น™(OCP)์„ ์ง€ํ‚ค๋Š” ๋ผˆ๋Œ€๋ฅผ ๊ตฌ์ถ•ํ•˜๋ฉด์„œ๋„, YAGNI๋ฅผ ํ†ตํ•ด ๋ถˆํ•„์š”ํ•œ ํด๋ž˜์Šค๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค ํ™•์žฅ์„ ์–ด๋–ป๊ฒŒ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ท ํ˜•์ ์„ ํ•™์Šตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [8, 9]. + +### Deeper Research Questions +- YAGNI ์›์น™์„ ์ ์šฉํ•  ๋•Œ, '๋ฏธ๋ž˜๋ฅผ ๋Œ€๋น„ํ•œ ์œ ์—ฐํ•œ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„'์™€ ๋ถˆํ•„์š”ํ•œ '์˜ค๋ฒ„์—”์ง€๋‹ˆ์–ด๋ง(Over-engineering)' ์‚ฌ์ด์˜ ๊ฒฝ๊ณ„๋Š” ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ์ •์˜ํ•˜๊ณ  ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- ์• ์ž์ผ(Agile) ํ™˜๊ฒฝ์—์„œ YAGNI ์›์น™์ด ์žฆ์€ ์š”๊ตฌ์‚ฌํ•ญ ๋ณ€๊ฒฝ์— ๋Œ€ํ•œ ์‹œ์Šคํ…œ์˜ ๋Œ€์ฒ˜ ๋Šฅ๋ ฅ์„ ๋ณธ์งˆ์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ค๋Š”๊ฐ€? +- ๋ฏธ๋ž˜์˜ ํ™•์žฅ์„ฑ์„ ํฌ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” YAGNI์˜ ๋‹จ์ (Trade-off)์„ ๋ณด์™„ํ•˜๋ฉด์„œ๋„ ์ดˆ๊ธฐ ๊ฐœ๋ฐœ ์†๋„๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด์€ ๋ฌด์—‡์ธ๊ฐ€? +- React ์ปดํฌ๋„ŒํŠธ ์„ค๊ณ„ ์‹œ YAGNI ์›์น™์„ ๊ณ ์ˆ˜ํ•˜์—ฌ ๋‹จ์ˆœํ•˜๊ฒŒ ๋งŒ๋“ค์—ˆ๋‹ค๊ฐ€, ์ถ”ํ›„ ๋Œ€๊ทœ๋ชจ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ์ถ”๊ฐ€๋˜์–ด ์ „๋ฉด์ ์ธ ๋ฆฌํŒฉํ† ๋ง์ด ๋ถˆ๊ฐ€ํ”ผํ•ด์ง€๋Š” ์ƒํ™ฉ์„ ์™„ํ™”ํ•  ๋ฐฉ๋ฒ•์€ ์—†๋Š”๊ฐ€? +- "๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ํ•ด๊ฒฐ์ฑ…"์„ ์š”๊ตฌํ•˜๋Š” KISS ์›์น™๊ณผ "๋ฏธ๋ž˜์˜ ๊ธฐ๋Šฅ ๋ฐฐ์ œ"๋ฅผ ์š”๊ตฌํ•˜๋Š” YAGNI ์›์น™์ด ์‹ค๋ฌด ์ฝ”๋“œ ๊ตฌํ˜„ ์ค‘ ์„œ๋กœ ์ƒ์ถฉํ•˜๊ฑฐ๋‚˜ ๋ชจ์ˆœ์„ ์ผ์œผํ‚ค๋Š” ์‚ฌ๋ก€๋Š” ๋ฌด์—‡์ธ๊ฐ€? + +### Practical Application Contexts +- **Implementation:** React ๋“ฑ ํ”„๋ก ํŠธ์—”๋“œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ, ๋‹น์žฅ ์‚ฌ์šฉ๋˜์ง€ ์•Š์„ props ์†์„ฑ์„ ์˜ˆ์ƒํ•˜์—ฌ ์„ ์–ธํ•ด๋‘๊ฑฐ๋‚˜ ์“ฐ์ด์ง€ ์•Š์„ ํ—ฌํผ ํ•จ์ˆ˜๋ฅผ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด๋‘๋Š” ๊ฒƒ์„ ๊ธˆ์ง€ํ•จ์œผ๋กœ์จ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค [5]. +- **System Design:** ์†Œํ”„ํŠธ์›จ์–ด ์„ค๊ณ„ ์‹œ ํ˜„์žฌ์˜ ๋น„์ฆˆ๋‹ˆ์Šค ์š”๊ตฌ์‚ฌํ•ญ(Business Needs)์— ์ง๊ฒฐ๋˜์ง€ ์•Š๋Š” ๋ถ€๊ฐ€์ ์ธ ์‹œ์Šคํ…œ ๋ ˆ์ด์–ด๋‚˜ ๋ณต์žกํ•œ ๋””์ž์ธ ํŒจํ„ด์˜ ๋„์ž…์„ ๋ณด๋ฅ˜ํ•ฉ๋‹ˆ๋‹ค. +- **Operation / Maintenance:** ๋ฏธ๋ž˜๋ฅผ ์œ„ํ•ด ๋‚จ๊ฒจ๋‘” ๋ฏธ์‚ฌ์šฉ ์ฝ”๋“œ(dead code)๊ฐ€ ์ƒ๊ธฐ์ง€ ์•Š์œผ๋ฏ€๋กœ, ์œ ์ง€๋ณด์ˆ˜ ์‹œ ๊ฐœ๋ฐœ์ž๊ฐ€ ํŒŒ์•…ํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•ด์•ผ ํ•  ์ฝ”๋“œ์˜ ์–‘์ด ์ค„์–ด๋“ค์–ด ์šด์˜ ํšจ์œจ์„ฑ์ด ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค [1]. +- **Learning Path:** ํด๋ฆฐ ์ฝ”๋“œ(Clean Code)์˜ ๊ธฐ์ดˆ๋ฅผ ๋‹ค์ง€๊ณ , ๊ฐ์ฒด์ง€ํ–ฅ ๋ฐ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ํ•ต์‹ฌ ์›์น™(SOLID, DRY, KISS)์„ ํ•™์Šตํ•˜๋Š” ๊ณผ์ •์—์„œ ์‹ค์šฉ์ฃผ์˜์  ๊ฐœ๋ฐœ ๋งˆ์ธ๋“œ์…‹์„ ๊ฐ–์ถ”๊ธฐ ์œ„ํ•ด ํ•„์ˆ˜์ ์œผ๋กœ ํ•จ๊ป˜ ํ•™์Šต๋ฉ๋‹ˆ๋‹ค [7, 10]. +- **My Project Relevance:** ๊ธฐํš์ด ์ˆ˜์‹œ๋กœ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๋Š” ์Šคํƒ€ํŠธ์—… ํ”„๋กœ์ ํŠธ๋‚˜ MVP(Minimum Viable Product) ๋ชจ๋ธ์„ ๊ฐœ๋ฐœํ•  ๋•Œ, ๊ฐœ๋ฐœ ์†๋„๋ฅผ ์ตœ์ ํ™”ํ•˜๊ณ  ๋ถˆํ•„์š”ํ•œ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ์— ๋ฆฌ์†Œ์Šค๋ฅผ ๋‚ญ๋น„ํ•˜์ง€ ์•Š๋Š” ๋ฐ ์ง์ ‘์ ์œผ๋กœ ํ™œ์šฉ๋ฉ๋‹ˆ๋‹ค [5]. + +### Adjacent Topics +- [[Agile Development]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: YAGNI ์›์น™์ด ์™œ ์• ์ž์ผ์˜ ์งง์€ ์Šคํ”„๋ฆฐํŠธ ๋ฐ ๋ฐ˜๋ณต์  ๊ฐœ๋ฐœ ์ฃผ๊ธฐ์™€ ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š”์ง€, ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ ๋ฐ ๊ฐœ๋ฐœ ๋ผ์ดํ”„์‚ฌ์ดํด ๊ด€์ ์—์„œ ์ดํ•ด๋ฅผ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[Clean Code]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: YAGNI, DRY, KISS์™€ ๊ฐ™์€ ์›์น™๋“ค์ด ๊ถ๊ทน์ ์œผ๋กœ ๊ฐ€๋…์„ฑ ๋†’๊ณ  ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ๋ฒ ์ด์Šค(Clean Code)๋ฅผ ์–ด๋–ป๊ฒŒ ์™„์„ฑํ•˜๋Š”์ง€ ํ†ตํ•ฉ์ ์ธ ๊ด€์ ์œผ๋กœ ํ™•์žฅํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2]. + +--- +*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 new file mode 100644 index 00000000..f886b495 --- /dev/null +++ b/00_Raw/agent harness engineering.md @@ -0,0 +1,89 @@ +# [[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/system_analysis_and_improvement_plan.md b/00_Raw/system_analysis_and_improvement_plan.md deleted file mode 100644 index cf92d5ac..00000000 --- a/00_Raw/system_analysis_and_improvement_plan.md +++ /dev/null @@ -1,27 +0,0 @@ -# ConnectAI ๊ธฐ์ˆ  ๋ถ€์ฑ„ ๋ฐ ์•„ํ‚คํ…์ฒ˜ ๊ฐœ์„  ๊ณ„ํš (Python Core) - -## ๐Ÿ“Œ ํ•ต์‹ฌ ์ง„๋‹จ ์š”์•ฝ -ํ˜„์žฌ ConnectAI์˜ Python ๊ธฐ๋ฐ˜ ์ถ”๋ก  ์—”์ง„์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋น„ํšจ์œจ์„ฑ($O(N^2)$), ๋™๊ธฐ์‹ I/O ๋ธ”๋กœํ‚น, ๊ฐ•ํ•œ ๊ฒฐํ•ฉ๋„(Tight Coupling)๋กœ ์ธํ•ด ์„ฑ๋Šฅ ํ™•์žฅ์ด ์ œํ•œ๋œ ์ƒํƒœ์ž„. ์ด๋ฅผ ํ”„๋กœ๋•์…˜ ์ˆ˜์ค€์œผ๋กœ ๋Œ์–ด์˜ฌ๋ฆฌ๊ธฐ ์œ„ํ•œ ๋‹จ๊ณ„๋ณ„ ์ตœ์ ํ™”๊ฐ€ ํ•„์š”ํ•จ. - -## ๐Ÿ› ๏ธ ์ตœ์ ํ™” ์ „๋žต (Phase 2: Core Optimization) - -### 1. ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํšจ์œจํ™” (Performance P1) -- **ํ˜„์ƒ**: `InferenceEngine.py`์˜ `feature_match_brute_force` ํ•จ์ˆ˜๊ฐ€ ์ค‘์ฒฉ ๋ฃจํ”„๋กœ ์ธํ•ด $O(N^2)$ ๋ณต์žก๋„ ๊ฐ€์ง. -- **ํ•ด๊ฒฐ**: **KD-Tree** ๋˜๋Š” ํ–‰๋ ฌ ๋ถ„ํ•ด ๊ธฐ๋ฒ•์„ ๋„์ž…ํ•˜์—ฌ $O(N \log N)$์œผ๋กœ ์ตœ์ ํ™”. ์ถ”๋ก  ์ง€์—ฐ ์‹œ๊ฐ„ 5~10๋ฐฐ ๋‹จ์ถ• ๋ชฉํ‘œ. - -### 2. ๋น„๋™๊ธฐ I/O ์ „ํ™˜ (Throughput P1) -- **ํ˜„์ƒ**: `DataLoader.py`์˜ `load_dataset_sync` ํ•จ์ˆ˜๊ฐ€ ๋™๊ธฐ์‹์œผ๋กœ ๋™์ž‘ํ•˜์—ฌ I/O ๋Œ€๊ธฐ ์‹œ CPU ์œ ํœด ๋ฐœ์ƒ. -- **ํ•ด๊ฒฐ**: `asyncio` ๊ธฐ๋ฐ˜ ๋น„๋™๊ธฐ I/O ๋˜๋Š” ์Šค๋ ˆ๋“œ ํ’€ ๊ธฐ๋ฐ˜ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋ฅผ ๋„์ž…ํ•˜์—ฌ ์ฒ˜๋ฆฌ๋Ÿ‰(Throughput) ๊ฐœ์„ . - -### 3. ๋ชจ๋“ˆ ๋””์ปคํ”Œ๋ง (Maintainability P2) -- **ํ˜„์ƒ**: `PreprocessingModule`๊ณผ `CoreModel` ๊ฐ„์˜ ์ง์ ‘ ์˜์กด์„ฑ์œผ๋กœ ์ธํ•œ ๊ฐ•ํ•œ ๊ฒฐํ•ฉ. -- **ํ•ด๊ฒฐ**: **๊ด€์ฐฐ์ž ํŒจํ„ด(Observer Pattern)** ๋„์ž…. `DataReadyEvent` ๋ฐœํ–‰-๊ตฌ๋… ๋ชจ๋ธ์„ ํ†ตํ•ด ๋ชจ๋“ˆ ๊ฐ„ ๋…๋ฆฝ์„ฑ ๋ฐ ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ ํ™•๋ณด. - -## ๐Ÿš€ ๊ตฌํ˜„ ๊ฐ€์ด๋“œ๋ผ์ธ -- **Step 1**: ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ตœ์ ํ™” (KD-Tree ๊ตฌํ˜„ ๋ฐ ๊ฒ€์ฆ) -- **Step 2**: ๋น„๋™๊ธฐ I/O ์ „ํ™˜ (async/await ๋ž˜ํ•‘ ๋ฐ ์ด๋ฒคํŠธ ๋ฃจํ”„ ํ†ตํ•ฉ) -- **Step 3**: ์•„ํ‚คํ…์ฒ˜ ๋””์ปคํ”Œ๋ง (์ด๋ฒคํŠธ ์‹œ์Šคํ…œ ๊ตฌ์ถ• ๋ฐ DIP ์‹คํ˜„) - ---- -*๋ถ„์„ ์ผ์ž: 2026-04-30* -*์šฐ์„ ์ˆœ์œ„: Step 1 (ROI ์ตœ์ƒ) > Step 2 > Step 3* diff --git a/00_Raw/useEffect.md b/00_Raw/useEffect.md new file mode 100644 index 00000000..62b77e7f --- /dev/null +++ b/00_Raw/useEffect.md @@ -0,0 +1,58 @@ +# [[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 new file mode 100644 index 00000000..ac95b55f --- /dev/null +++ b/00_Raw/๋Œ€๊ทœ๋ชจ React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์•„ํ‚คํ…์ฒ˜ ๊ตฌ์„ฑ.md @@ -0,0 +1,79 @@ +# [[๋Œ€๊ทœ๋ชจ 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/๋ ˆ๊ฑฐ์‹œ React ์ฝ”๋“œ๋ฒ ์ด์Šค ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜.md b/00_Raw/๋ ˆ๊ฑฐ์‹œ React ์ฝ”๋“œ๋ฒ ์ด์Šค ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜.md new file mode 100644 index 00000000..42133bab --- /dev/null +++ b/00_Raw/๋ ˆ๊ฑฐ์‹œ React ์ฝ”๋“œ๋ฒ ์ด์Šค ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜.md @@ -0,0 +1,66 @@ +# [[๋ ˆ๊ฑฐ์‹œ React ์ฝ”๋“œ๋ฒ ์ด์Šค ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜]] + +## ๐Ÿ“Œ Brief Summary +๋ ˆ๊ฑฐ์‹œ React ์ฝ”๋“œ๋ฒ ์ด์Šค ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜(๋ฆฌํŒฉํ† ๋ง)์€ ์˜ค๋ž˜๋œ React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์•„ํ‚คํ…์ฒ˜, ์ƒํƒœ ๊ด€๋ฆฌ, ์ปดํฌ๋„ŒํŠธ ๊ตฌ์กฐ ๋“ฑ์„ ์ตœ์‹  ํ‘œ์ค€๊ณผ ๋ฒ ์ŠคํŠธ ํ”„๋ž™ํ‹ฐ์Šค์— ๋งž๊ฒŒ ๊ฐœ์„ ํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค [1, 2]. ์ด ๊ณผ์ •์€ ๋‹จ์ˆœํžˆ ๊ตฌ์‹ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์„ ๋„˜์–ด, ์œ ๋‹› ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•œ ์•ˆ์ •์„ฑ ํ™•๋ณด, ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ ํ•จ์ˆ˜ํ˜•/ํ›…(Hook)์œผ๋กœ์˜ ์ „ํ™˜, ๊ทธ๋ฆฌ๊ณ  ์ ์ง„์ ์ธ ์•„ํ‚คํ…์ฒ˜ ๊ฐœํŽธ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค [2, 3]. ๊ถ๊ทน์ ์ธ ๋ชฉํ‘œ๋Š” ์‹œ์Šคํ…œ์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ณ  ์œ ์ง€๋ณด์ˆ˜์„ฑ ๋ฐ ํ™•์žฅ์„ฑ์„ ๋†’์—ฌ ๋ˆ„์ ๋œ ๊ธฐ์ˆ  ๋ถ€์ฑ„๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค [1, 4]. + +## ๐Ÿ“– Core Content +* **๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ค€๋น„ ๋ฐ ๊ธฐ๋ณธ ์›์น™**: + ๋ฆฌํŒฉํ† ๋ง์„ ์‹œ์ž‘ํ•˜๊ธฐ ์ „ ๊ฐ€์žฅ ๋จผ์ € ์ˆ˜ํ–‰ํ•ด์•ผ ํ•  ์ž‘์—…์€ ๊ธฐ์กด ๊ธฐ๋Šฅ์ด ๊นจ์ง€์ง€ ์•Š๋„๋ก ๋ณด์žฅํ•˜๋Š” ์œ ๋‹› ํ…Œ์ŠคํŠธ(Unit Test)๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค [3, 5, 6]. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋งค์šฐ ์ž‘๋‹ค๋ฉด ์ฒ˜์Œ๋ถ€ํ„ฐ ์ƒˆ๋กœ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋‚˜์„ ์ˆ˜๋„ ์žˆ์œผ๋‚˜ [7], ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” ์ „๋ฉด ์žฌ์ž‘์„ฑ(Rewrite)๋ณด๋‹ค๋Š” ์ ์ง„์ ์œผ๋กœ ๊ฐœ์„ ํ•˜๋Š” "๋ฆฌํŒฉํ† ๋ง(Refactor, do not rewrite)" ์ฒ ํ•™์„ ๋”ฐ๋ฅด๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค [1]. +* **์ปดํฌ๋„ŒํŠธ ๋ฐ ์–ธ์–ด ํ˜„๋Œ€ํ™”**: + ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ(JS)๋กœ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋ผ๋ฉด ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ(TS)๋กœ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ์ •์  ํƒ€์ดํ•‘์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค [2, 8]. ๋˜ํ•œ, ๋ ˆ๊ฑฐ์‹œ ํด๋ž˜์Šค ๊ธฐ๋ฐ˜ ์ปดํฌ๋„ŒํŠธ๋Š” ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์™€ ํ›…(Hooks)์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•ด์•ผ ํ•˜๋ฉฐ, ๋ผ์ดํ”„์‚ฌ์ดํด์— ๋ฌถ์—ฌ ์žˆ๋˜ ๋ถˆํ•„์š”ํ•œ `useEffect` ์‚ฌ์šฉ์„ ์‹๋ณ„ํ•˜๊ณ  ์ œ๊ฑฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [2]. +* **์ƒํƒœ ๊ด€๋ฆฌ(State Management) ๋ฆฌํŒฉํ† ๋ง**: + ๊ณผ๊ฑฐ์˜ ๋ฐฉ๋Œ€ํ•œ Redux ์Šคํ† ์–ด๋‚˜ ๋น„ํšจ์œจ์ ์ธ Context API ์‚ฌ์šฉ์„ ๋ชฉ์ ์— ๋งž๊ฒŒ ๋ถ„๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [2, 9, 10]. ์„œ๋ฒ„ ์ƒํƒœ(API ๋ฐ์ดํ„ฐ)๋Š” TanStack Query์™€ ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ด€๋ฆฌํ•˜๊ณ , ์ „์—ญ ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ๋Š” Zustand๋‚˜ Context๋กœ ๋ถ„๋ฆฌํ•˜๋ฉฐ, ์ง€์—ญ ์ƒํƒœ๋Š” ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€๋กœ ๊ตญํ•œ์‹œํ‚ค๋Š” ์ž‘์—…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค [2]. ์ด ๊ณผ์ • ์—ญ์‹œ ํ•œ ๋ฒˆ์— ๋ณ€๊ฒฝํ•˜๊ธฐ๋ณด๋‹ค๋Š” ๋‹จ์ผ ์Šคํ† ์–ด ๋‹จ์œ„(์˜ˆ: ์•Œ๋ฆผ ๊ธฐ๋Šฅ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด ์ฒดํฌ์•„์›ƒ ํ”Œ๋กœ์šฐ๋กœ ์ด๋™)๋กœ ์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค [1]. +* **์•„ํ‚คํ…์ฒ˜ ๋ฐ ํด๋” ๊ตฌ์กฐ ๊ฐœํŽธ**: + ๊ธฐ์กด์— ํŒŒ์ผ ํƒ€์ž…๋ณ„(์˜ˆ: components, hooks)๋กœ ๋‚˜๋‰˜์–ด ์žˆ๋˜ ๊ตฌ์กฐ๋ฅผ ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ์ด๋‚˜ ๊ธฐ๋Šฅ๋ณ„(Feature-based) ๊ตฌ์กฐ๋กœ ๊ฐœํŽธํ•ฉ๋‹ˆ๋‹ค [11, 12]. ๋” ๋‚˜์•„๊ฐ€ Feature-Sliced Design(FSD) ๊ฐ™์€ ๊ณ„์ธต์  ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋„์ž…ํ•˜์—ฌ ๊ฐ ๋ชจ๋“ˆ์˜ ์‘์ง‘๋„๋ฅผ ๋†’์ด๊ณ  ๋ชจ๋“ˆ ๊ฐ„ ์˜์กด์„ฑ์„ ๋‹จ๋ฐฉํ–ฅ์œผ๋กœ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค [13, 14]. +* **ํด๋ฆฐ ์ฝ”๋“œ์™€ ์Šคํƒ€์ผ๋ง ์ผ๊ด€์„ฑ ํ™•๋ณด**: + ๋ฐฉ๋Œ€ํ•œ ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์˜ ๋ฐ์ดํ„ฐ ํŽ˜์นญ์ด๋‚˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์€ ์ปค์Šคํ…€ ํ›…(Custom Hooks)์œผ๋กœ ์ถ”์ถœํ•˜์—ฌ ๋ชจ๋“ˆํ™”ํ•ฉ๋‹ˆ๋‹ค [15, 16]. ์—ฌ๋Ÿฌ ๊ฐ€์ง€ CSS ๋ฐฉ์‹(์ธ๋ผ์ธ ์Šคํƒ€์ผ, ์™ธ๋ถ€ CSS, sx ๋“ฑ)์ด ํ˜ผ์žฌ๋˜์–ด ์žˆ๋‹ค๋ฉด ํ•˜๋‚˜๋กœ ํ‘œ์ค€ํ™”ํ•˜์—ฌ ์ผ๊ด€์„ฑ์„ ๋งž์ถ”๊ณ , ESLint ๋“ฑ์˜ ๋„๊ตฌ๋ฅผ ๋„์ž…ํ•˜์—ฌ ์ฝ”๋“œ ๋ฆฐํŒ…์„ ๊ฐ•์ œํ•ฉ๋‹ˆ๋‹ค [6, 17-19]. + +## โš–๏ธ Trade-offs & Caveats +* **์ „๋ฉด ์žฌ์ž‘์„ฑ(Rewrite) vs ์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜**: ์ „๋ฉด ์žฌ์ž‘์„ฑ์€ ์ƒˆ๋กœ์šด ์„ค๊ณ„๋กœ ๊นจ๋—ํ•˜๊ฒŒ ์ฝ”๋“œ๋ฅผ ์งค ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์œผ๋‚˜, ์‹œ๊ฐ„ ๋น„์šฉ์ด ํฌ๊ณ  ๊ธฐ์กด์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๋ˆ„๋ฝ์ด๋ผ๋Š” ์‹ฌ๊ฐํ•œ ๋ฆฌ์Šคํฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค [1, 7]. ๋ฐ˜๋ฉด ์ ์ง„์  ๋ฆฌํŒฉํ† ๋ง์€ ๋น„๊ต์  ์•ˆ์ „ํ•˜์ง€๋งŒ, ๊ณผ๋„๊ธฐ ๋™์•ˆ ๋ ˆ๊ฑฐ์‹œ ์ƒํƒœ ๊ด€๋ฆฌ(์˜ˆ: Context API)์™€ ์ƒˆ๋กœ์šด ์ƒํƒœ ๊ด€๋ฆฌ(์˜ˆ: Zustand)๊ฐ€ ๊ณต์กดํ•˜๊ฒŒ ๋˜์–ด ๊ตฌ์กฐ์  ๋ณต์žก์„ฑ์ด ์ผ์‹œ์ ์œผ๋กœ ์ฆ๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1]. +* **ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ(TypeScript) ๋„์ž…์˜ ํ•œ๊ณ„**: JS ์ฝ”๋“œ๋ฅผ TS๋กœ ์ „ํ™˜ํ•˜๋Š” ๊ฒƒ์€ ์•ˆ์ •์„ฑ์„ ํฌ๊ฒŒ ๋†’์ด์ง€๋งŒ, ํŒ€์›์˜ ์ˆ™๋ จ๋„์— ๋”ฐ๋ผ ์ธ์ง€์  ์˜ค๋ฒ„ํ—ค๋“œ์™€ ๋ณต์žก์„ฑ์„ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฒฝํ—˜์ด ๋ถ€์กฑํ•œ ํŒ€์ด๋ผ๋ฉด ๋ฌด๋ฆฌํ•˜๊ฒŒ ํ•œ ๋ฒˆ์— ์ ์šฉํ•˜๊ธฐ๋ณด๋‹ค ์ ์ง„์  ์ฑ„ํƒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค [8]. +* **์ถ”์ƒํ™”์˜ ๋ถ€์ž‘์šฉ**: DRY(Don't Repeat Yourself) ์›์น™์„ ๊ทน๋‹จ์ ์œผ๋กœ ์ถ”๊ตฌํ•˜์—ฌ ๊ณตํ†ต ๋กœ์ง์„ ๋ฌด๋ฆฌํ•˜๊ฒŒ ์ถ”์ƒํ™”ํ•˜๋ฉด, ์ฝ”๋“œ๊ฐ€ ์ง€๋‚˜์น˜๊ฒŒ ๋ณต์žกํ•ด์ ธ KISS(Keep It Simple, Stupid) ์›์น™์— ์œ„๋ฐฐ๋ฉ๋‹ˆ๋‹ค [20]. ์ž˜๋ชป ์ถ”์ƒํ™”๋œ ์ฝ”๋“œ๋Š” ์˜คํžˆ๋ ค ํ–ฅํ›„ ๋ณ€๊ฒฝ์„ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํŒจํ„ด์ด ์„ธ ๋ฒˆ ์ด์ƒ ๋ฐ˜๋ณต๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ ์ถ”์ƒํ™”ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค [20, 21]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] +- [[Feature-Sliced Design]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋ ˆ๊ฑฐ์‹œ ๊ตฌ์กฐ์˜ ํŒŒํŽธํ™”๋œ ์ฝ”๋“œ๋“ค์„ ๋…ผ๋ฆฌ์ ์œผ๋กœ ์žฌ๋ฐฐ์น˜ํ•˜๊ณ  ํ–ฅํ›„ ํ™•์žฅ์ด ๊ฐ€๋Šฅํ•œ ํด๋” ๊ตฌ์กฐ๋กœ ๊ฐœํŽธํ•  ๋•Œ ํ™œ์šฉ๋˜๋Š” ํ˜„๋Œ€์ ์ธ ํ”„๋ก ํŠธ์—”๋“œ ์•„ํ‚คํ…์ฒ˜๋ก ์ž…๋‹ˆ๋‹ค [13, 14]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ธฐ๋Šฅ, ์—”ํ‹ฐํ‹ฐ, ์œ„์ ฏ ๋“ฑ์œผ๋กœ ๊ณ„์ธต์„ ๋‚˜๋ˆ„๊ณ  ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ๋ฐ ๋ช…์‹œ์  Public API๋ฅผ ์„ค์ •ํ•˜์—ฌ ์ฝ”๋“œ์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๋Š” ์›๋ฆฌ [13, 14, 22]. + +- [[์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ (Incremental Migration)]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋Œ€๊ทœ๋ชจ ๋ ˆ๊ฑฐ์‹œ ์‹œ์Šคํ…œ์„ ์•ˆ์ „ํ•˜๊ฒŒ ๋ฆฌํŒฉํ† ๋งํ•˜๊ธฐ ์œ„ํ•œ ํ•ต์‹ฌ ์‹คํ–‰ ์ „๋žต์ž…๋‹ˆ๋‹ค [1]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ƒˆ๋กœ์šด ๊ธฐ์ˆ (์˜ˆ: Zustand)์„ ๋„์ž…ํ•  ๋•Œ ์ „์ฒด๋ฅผ ์žฌ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ , ์•Œ๋ฆผ ๊ธฐ๋Šฅ ๋“ฑ ๋…๋ฆฝ์ ์ด๊ณ  ์ž‘์€ ์Šคํ† ์–ด๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด ์ ์ง„์ ์œผ๋กœ ์ „ํ™˜ํ•˜๋Š” ๋ฆฌ์Šคํฌ ๊ด€๋ฆฌ ๋ฐฉ๋ฒ• [1]. + +#### [๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ] +- [[์ปค์Šคํ…€ ํ›… (Custom Hooks)]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋น„๋Œ€ํ•ด์ง„ ๋ ˆ๊ฑฐ์‹œ ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ UI ๋ Œ๋”๋ง ๋กœ์ง์„ ๋ถ„๋ฆฌํ•ด๋‚ด๋Š” ํ•ต์‹ฌ์ ์ธ ๋ฆฌํŒฉํ† ๋ง ๋‹จ์œ„์ž…๋‹ˆ๋‹ค [15, 16]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋กœ์ง(์˜ˆ: `useFetch`, `useForm`)์„ ๋ถ„๋ฆฌํ•จ์œผ๋กœ์จ ๊ฐœ๋ณ„ ์œ ๋‹› ํ…Œ์ŠคํŠธ๊ฐ€ ์šฉ์ดํ•ด์ง€๊ณ  ์ปดํฌ๋„ŒํŠธ์˜ ์ฑ…์ž„์„ ๋‹จ์ผํ™”ํ•˜๋Š” ์›๋ฆฌ [15]. + +- [[TanStack Query (React Query)]] + - ์—ฐ๊ฒฐ ์ด์œ : ๊ธฐ์กด ๋ ˆ๊ฑฐ์‹œ ์•ฑ์—์„œ Redux๋‚˜ Context API๋กœ ์–ต์ง€๋กœ ๊ด€๋ฆฌํ•˜๋˜ API ์‘๋‹ต ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„๋ฆฌํ•ด๋‚ด๊ธฐ ์œ„ํ•œ ์„œ๋ฒ„ ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค [2, 10, 23]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ์™€ ์„œ๋ฒ„ ์ƒํƒœ๋ฅผ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌํ•จ์œผ๋กœ์จ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ๋ฅผ ์ค„์ด๊ณ  ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™”๋ฅผ ์ž๋™ํ™”ํ•˜๋Š” ๋ฐฉ์‹ [10, 23]. + +### Deeper Research Questions +- ๋ ˆ๊ฑฐ์‹œ Context API์—์„œ Zustand ๋“ฑ ๋‹ค๋ฅธ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์ ์ง„์ ์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ๋•Œ, ๋‘ ์ƒํƒœ ์‹œ์Šคํ…œ ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™” ์ด์Šˆ๋Š” ์–ด๋–ป๊ฒŒ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- TypeScript๊ฐ€ ์ „ํ˜€ ์ ์šฉ๋˜์ง€ ์•Š์€ ๋ฐฉ๋Œ€ํ•œ JavaScript ์ฝ”๋“œ๋ฒ ์ด์Šค์— TS๋ฅผ ๋„์ž…ํ•  ๋•Œ ๊ฐ€์žฅ ๋ฆฌ์Šคํฌ๊ฐ€ ์ ๊ณ  ํšจ์œจ์ ์ธ ์ ์ง„์  ์ ์šฉ(incremental adoption) ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? +- ๋ฆฌํŒฉํ† ๋ง ๊ณผ์ •์—์„œ ๊ธฐ์กด ๊ธฐ๋Šฅ์„ ์œ ์ง€ํ•˜๊ณ  ์žˆ์Œ์„ ์ฆ๋ช…ํ•˜๊ธฐ ์œ„ํ•ด, ์œ ๋‹› ํ…Œ์ŠคํŠธ์™€ ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ(Visual Regression Testing) ์ค‘ ์–ด๋А ๊ฒƒ์„ ๋จผ์ € ๋„์ž…ํ•˜๋Š” ๊ฒƒ์ด ํšจ๊ณผ์ ์ธ๊ฐ€? +- ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ๋ทฐ(View)์— ๊ฐ•ํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋œ ๋ ˆ๊ฑฐ์‹œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ปค์Šคํ…€ ํ›…์œผ๋กœ ์ถ”์ถœํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์˜์กด์„ฑ(props, state) ์–ฝํž˜ ๋ฌธ์ œ๋Š” ์–ด๋–ค ํŒจํ„ด์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- Feature-Sliced Design(FSD) ์•„ํ‚คํ…์ฒ˜๋กœ ๊ฐœํŽธ ์‹œ, ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ(Feature)์—์„œ ๊ณตํ†ต์œผ๋กœ ๊ต์ฐจ๋˜๋Š” ๊ด€์‹ฌ์‚ฌ(Cross-cutting concerns, ์˜ˆ: ์ธ์ฆ ๋กœ์ง)๋Š” ์–ด๋А ๊ณ„์ธต์— ์–ด๋–ป๊ฒŒ ๋ฐฐ์น˜ํ•ด์•ผ ๊ฒฐํ•ฉ๋„๋ฅผ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? + +### Practical Application Contexts +- **Implementation:** ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ์˜ ๋ณต์žกํ•œ ๋ผ์ดํ”„์‚ฌ์ดํด ๋ฉ”์„œ๋“œ๋ฅผ ๋ถ„์„ํ•˜์—ฌ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์˜ ํ›…(`useState`, `useEffect`)์œผ๋กœ 1:1 ๋Œ€์‘ ๋ณ€ํ™˜ํ•˜๊ณ , ๋ Œ๋”๋ง ์ตœ์ ํ™” ๋กœ์ง์„ ์žฌ๊ตฌ์„ฑํ•˜๋Š” ์ฝ”๋”ฉ ์ž‘์—… [2]. +- **System Design:** ๋‹จ์ˆœํžˆ ์ปดํฌ๋„ŒํŠธ, ํ›…, ์Šคํƒ€์ผ ๋‹จ์œ„๋กœ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ๋˜ ํด๋” ๊ตฌ์กฐ๋ฅผ ๋ถ„์„ํ•˜์—ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ(Auth, Dashboard ๋“ฑ) ๋‹จ์œ„๋กœ ์žฌ์„ค๊ณ„ ๋ฐ ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ตฌ์กฐ ๊ฐœํŽธ [11, 12]. +- **Operation / Maintenance:** ESLint ๋ฐ Prettier์™€ ํ•จ๊ป˜ Git ํ›…(Husky ๋“ฑ)์„ ๊ตฌ์ถ•ํ•˜์—ฌ, ํ–ฅํ›„ ์ƒˆ๋กœ ์ž‘์„ฑ๋˜๋Š” ์ฝ”๋“œ๊ฐ€ ๋ ˆ๊ฑฐ์‹œ ํŒจํ„ด(๊ตฌ์‹ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ, CSS ํ˜ผ์žฌ)์œผ๋กœ ๋˜๋Œ์•„๊ฐ€์ง€ ์•Š๋„๋ก ์ฝ”๋“œ ์ปจ๋ฒค์…˜์„ ์ž๋™ํ™”ํ•˜์—ฌ ์œ ์ง€๋ณด์ˆ˜ [19, 24]. +- **Learning Path:** ์†Œ๊ทœ๋ชจ ์žฅ๋‚œ๊ฐ(toy) ์•ฑ์—์„œ ๋จผ์ € TypeScript์™€ Custom Hooks ๋ถ„๋ฆฌ๋ฅผ ์—ฐ์Šตํ•œ ๋’ค, ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ์ž‘์€ ์ปดํฌ๋„ŒํŠธ๋ถ€ํ„ฐ ์œ ๋‹› ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•ด๊ฐ€๋ฉฐ ์ ์ง„์ ์œผ๋กœ ๊ทœ๋ชจ๋ฅผ ํ‚ค์šฐ๋Š” ์‹ค๋ฌด ํ•™์Šต ๋ฐฉํ–ฅ [5, 25]. +- **My Project Relevance:** ์œ ์ง€๋ณด์ˆ˜ ๊ธฐ๊ฐ„์ด ์˜ค๋ž˜๋˜์–ด ๊ธฐ์ˆ  ๋ถ€์ฑ„๊ฐ€ ์Œ“์ธ React ํ”„๋กœ์ ํŠธ๋ฅผ ์ธ์ˆ˜๋ฐ›์•˜์„ ๋•Œ, ์‹œ์Šคํ…œ์˜ ์ค‘๋‹จ ์—†์ด ์ฝ”๋“œ ํ’ˆ์งˆ๊ณผ ์„ฑ๋Šฅ์„ ์ตœ์‹  ๊ธฐ์ค€์— ๋งž๊ฒŒ ํ˜„๋Œ€ํ™”(Modernization)ํ•ด์•ผ ํ•˜๋Š” ์‹ค๋ฌด ํ™˜๊ฒฝ์— ์ง์ ‘ ์ ์šฉ. + +### Adjacent Topics +- [[ํด๋ฆฐ ์ฝ”๋“œ (Clean Code)์™€ SOLID ์›์น™]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋ฆฌํŒฉํ† ๋ง ์‹œ ์ปดํฌ๋„ŒํŠธ์˜ ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)๊ณผ ๊ฐœ๋ฐฉ-ํ์‡„ ์›์น™(OCP)์„ ์ค€์ˆ˜ํ•˜์—ฌ ๊ฐ€๋…์„ฑ๊ณผ ํ™•์žฅ์„ฑ์„ ๋†’์ด๋Š” ์ผ๋ฐ˜์ ์ธ ์†Œํ”„ํŠธ์›จ์–ด ๊ณตํ•™ ์„ค๊ณ„ ํŒจํ„ด ํƒ๊ตฌ. +- [[ํ”„๋ก ํŠธ์—”๋“œ ํ…Œ์ŠคํŒ… (Frontend Testing)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ณผ์ •์—์„œ ๊ธฐ์กด ๊ธฐ๋Šฅ์ด ํ›ผ์†๋˜์ง€ ์•Š๋„๋ก ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด Storybook ๊ธฐ๋ฐ˜ UI ํ…Œ์ŠคํŠธ๋‚˜ Jest, Cypress ๋“ฑ์„ ํ™œ์šฉํ•œ ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€ ํ™•๋ณด ์ „๋žต ์กฐ์‚ฌ. + +--- +*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 new file mode 100644 index 00000000..a40df2ec --- /dev/null +++ b/00_Raw/์›น ์„ฑ๋Šฅ ์ตœ์ ํ™”(Core Web Vitals) ๊ฐœ์„  ์ž‘์—….md @@ -0,0 +1,80 @@ +# [[์›น ์„ฑ๋Šฅ ์ตœ์ ํ™”(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 new file mode 100644 index 00000000..5524db97 --- /dev/null +++ b/00_Raw/ํ”„๋ก ํŠธ์—”๋“œ ๋ฆฌํŒฉํ† ๋ง ๋ฐ ์ฝ”๋“œ ์œ ์ง€๋ณด์ˆ˜.md @@ -0,0 +1,77 @@ +# [[ํ”„๋ก ํŠธ์—”๋“œ ๋ฆฌํŒฉํ† ๋ง ๋ฐ ์ฝ”๋“œ ์œ ์ง€๋ณด์ˆ˜]] + +## ๐Ÿ“Œ Brief ์‹œ Summary +ํ”„๋ก ํŠธ์—”๋“œ ๋ฆฌํŒฉํ† ๋ง ๋ฐ ์ฝ”๋“œ ์œ ์ง€๋ณด์ˆ˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ธฐ์กด ๋™์ž‘์„ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜๋ฉด์„œ ์ฝ”๋“œ์˜ ๊ตฌ์กฐ, ๊ฐ€๋…์„ฑ, ํ™•์žฅ์„ฑ์„ ๊ฐœ์„ ํ•˜๋Š” ์ง€์†์ ์ธ ์†Œํ”„ํŠธ์›จ์–ด ๊ณตํ•™ ๊ณผ์ •์ž…๋‹ˆ๋‹ค [1, 2]. ํ”„๋กœ์ ํŠธ๊ฐ€ ์„ฑ์žฅํ•จ์— ๋”ฐ๋ผ ์–ฝํ˜€์žˆ๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ UI๋ฅผ ๋ถ„๋ฆฌํ•˜๊ณ , ํŒŒ์ผ ์œ ํ˜•์ด ์•„๋‹Œ ๋„๋ฉ”์ธ ๋˜๋Š” ๊ธฐ๋Šฅ(Feature) ๋‹จ์œ„๋กœ ๊ตฌ์กฐ๋ฅผ ์žฌํŽธํ•˜์—ฌ ์•„ํ‚คํ…์ฒ˜์˜ ๋ถ•๊ดด๋ฅผ ๋ง‰๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค [1, 3, 4]. ๋˜ํ•œ, SOLID๋‚˜ DRY, KISS์™€ ๊ฐ™์€ ์„ค๊ณ„ ์›์น™์„ ์ ์šฉํ•˜๊ณ , ์ž๋™ํ™”๋œ ๋ฆฐํŒ…(Linting)๊ณผ ์—„๊ฒฉํ•œ Git ๊ฑฐ๋ฒ„๋„Œ์Šค๋ฅผ ํ†ตํ•ด ๋‹ค์ˆ˜์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ˜‘์—…ํ•˜๋Š” ํ™˜๊ฒฝ์—์„œ๋„ ๊ธฐ์ˆ  ๋ถ€์ฑ„๋ฅผ ์ตœ์†Œํ™”ํ•˜๊ณ  ์•ˆ์ •์ ์ธ ์‹œ์Šคํ…œ์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค [1, 5, 6]. + +## ๐Ÿ“– Core Content +* **๋ฆฌํŒฉํ† ๋ง์˜ ์ค€๋น„์™€ ํ…Œ์ŠคํŠธ ์˜์กด์„ฑ** + * ๋ ˆ๊ฑฐ์‹œ๋‚˜ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์ž‘์„ฑํ•œ React ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•˜๊ธฐ ์ „์—๋Š” ๋ฐ˜๋“œ์‹œ ์œ ๋‹› ํ…Œ์ŠคํŠธ๋‚˜ UI ํ…Œ์ŠคํŠธ๋ฅผ ๋จผ์ € ์ž‘์„ฑํ•˜์—ฌ ๊ธฐ์กด ๊ธฐ๋Šฅ์ด ๊นจ์ง€์ง€ ์•Š๋„๋ก ๋ณด์žฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [2]. + * Storybook๊ณผ ์—ฐ๋™๋˜๋Š” ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ(Visual Regression Testing) ๋„๊ตฌ(์˜ˆ: Happo, Chromatic)๋ฅผ ํ™œ์šฉํ•˜๋ฉด, ๋ฆฌํŒฉํ† ๋ง ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์˜๋„์น˜ ์•Š์€ UI ๋ ˆ์ด์•„์›ƒ ๋ณ€๊ฒฝ์ด๋‚˜ ์ ‘๊ทผ์„ฑ ์˜ค๋ฅ˜๋ฅผ ์ž๋™์œผ๋กœ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [7]. + * ์™„์ „ํžˆ ์ฝ”๋“œ๋ฅผ ๊ฐˆ์•„์—Ž๋Š” ์žฌ์ž‘์„ฑ(Rewrite)๋ณด๋‹ค๋Š” ํ•œ ๋ฒˆ์— ์•Œ๋ฆผ ๊ธฐ๋Šฅ์ด๋‚˜ ์ฒดํฌ์•„์›ƒ ํ๋ฆ„ ๋“ฑ ์ž‘์€ ์Šคํ† ์–ด ๋‹จ์œ„๋กœ ๊ธฐ์ˆ ์„ ๊ต์ฒดํ•˜๋Š” '์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜(Incremental Migration)' ์ „๋žต์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค [1]. +* **์•„ํ‚คํ…์ฒ˜ ๋ฐ ํด๋” ๊ตฌ์กฐ์˜ ํ˜„๋Œ€ํ™”** + * ์ปดํฌ๋„ŒํŠธ, ํ›…, ์Šคํƒ€์ผ ๋“ฑ์„ ๋‹จ์ˆœํžˆ ๊ธฐ์ˆ ์  ํŒŒ์ผ ์œ ํ˜•(Type-based)์œผ๋กœ ๋ฌถ๋Š” ํด๋” ๊ตฌ์กฐ๋Š” ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๊ฐ€ ์ปค์ง€๋ฉด ์œ ์ง€๋ณด์ˆ˜๋ฅผ ๊ทน๋„๋กœ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค [1, 4]. + * 2025๋…„ ๊ธฐ์ค€ ๋ชจ๋ฒ” ์‚ฌ๋ก€๋Š” ์ฝ”๋“œ๋ฅผ ๊ธฐ๋Šฅ(Feature) ๋‹จ์œ„๋กœ ๋ฌถ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŠน์ • ๊ธฐ๋Šฅ ๋‚ด์— ํ•ด๋‹น ๊ธฐ๋Šฅ๋งŒ์˜ ์ปดํฌ๋„ŒํŠธ, API, ํ›… ๋“ฑ์„ ์œ„์น˜์‹œ์ผœ ๋†’์€ ์‘์ง‘๋„๋ฅผ ํ™•๋ณดํ•ฉ๋‹ˆ๋‹ค [1, 4]. + * ๋” ๋‚˜์•„๊ฐ€ **Feature-Sliced Design (FSD)** ๊ฐ™์€ ์•„ํ‚คํ…์ฒ˜๋ก ์„ ๋„์ž…ํ•˜์—ฌ, ์ฝ”๋“œ๋ฅผ app, pages, widgets, features, entities, shared ๊ณ„์ธต์œผ๋กœ ๋‚˜๋ˆ„๊ณ , ์ƒ์œ„ ๊ณ„์ธต์ด ํ•˜์œ„ ๊ณ„์ธต์—๋งŒ ์˜์กดํ•˜๊ฒŒ ํ•˜๋Š” '๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ' ๋ฐ '๋‹จ์ผ ์ง„์ž…์ (Public API)' ๊ทœ์น™์„ ๊ฐ•์ œํ•˜์—ฌ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถœ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1, 3]. +* **์ฝ”๋“œ ํ’ˆ์งˆ ๋ฐ ์„ค๊ณ„ ์›์น™(SOLID, DRY, KISS) ์ ์šฉ** + * **๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP):** 300์ค„์ด ๋„˜์–ด๊ฐ€๋Š” ๋“ฑ ๋„ˆ๋ฌด ๋งŽ์€ ์—ญํ• ์„ ํ•˜๋Š” ๋Œ€ํ˜• ์ปดํฌ๋„ŒํŠธ๋Š” ์ƒํƒœ ๊ด€๋ฆฌ, ๋ฐ์ดํ„ฐ ํŽ˜์นญ, ๋ Œ๋”๋ง ์—ญํ• ์„ ๋ถ„๋ฆฌํ•˜์—ฌ ๋” ์ž‘๊ณ  ์ง‘์ค‘๋œ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ฆฌํŒฉํ† ๋งํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [1, 6]. + * **๋กœ์ง์˜ ์ถ”์ถœ๊ณผ ์žฌ์‚ฌ์šฉ:** ๋ฐ˜๋ณต๋˜๋Š” ์ฝ”๋“œ๋ฅผ ์—†์• ๋Š” 'DRY(Don't Repeat Yourself)' ์›์น™์— ๋”ฐ๋ผ, ์–ฝํ˜€์žˆ๋Š” ๋ณต์žกํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ํผ ์ฒ˜๋ฆฌ ๋กœ์ง ๋“ฑ์„ '์ปค์Šคํ…€ ํ›…(Custom Hooks)'์œผ๋กœ ๋ถ„๋ฆฌํ•ด ๋ฆฌํŒฉํ† ๋ง์˜ ๊ธฐ๋ณธ ๋‹จ์œ„๋กœ ์‚ผ์Šต๋‹ˆ๋‹ค [1, 6]. + * ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ ํ™˜๊ฒฝ์ด๋ผ๋ฉด ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์™€ ํ›… ๊ธฐ๋ฐ˜์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๊ณ , ๋ถˆํ•„์š”ํ•œ `useEffect`๋ฅผ ์ œ๊ฑฐํ•˜๋ฉฐ, ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ(TypeScript)๋ฅผ ๋„์ž…ํ•ด ํƒ€์ž… ์•ˆ์ •์„ฑ์„ ํ™•๋ณดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [2]. ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ์™€ ์„œ๋ฒ„ ์ƒํƒœ๋ฅผ ๋ถ„๋ฆฌํ•ด, ์„œ๋ฒ„ ๋ฐ์ดํ„ฐ๋Š” TanStack Query์™€ ๊ฐ™์€ ์ „์šฉ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ด ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค [1, 2]. +* **์œ ์ง€๋ณด์ˆ˜๋ฅผ ์œ„ํ•œ ๊ฑฐ๋ฒ„๋„Œ์Šค์™€ ํ‘œ์ค€ํ™”** + * React ์ปดํฌ๋„ŒํŠธ ํŒŒ์ผ ์ด๋ฆ„์€ PascalCase, ์ผ๋ฐ˜ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋‚˜ ํ›…์€ camelCase, ํด๋”๋ช…์€ ์šด์˜์ฒด์ œ ๊ฐ„ ์ถฉ๋Œ์„ ๋ง‰๊ธฐ ์œ„ํ•ด kebab-case๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋“ฑ ์ผ๊ด€๋œ ๋„ค์ด๋ฐ ์ปจ๋ฒค์…˜์„ ํ™•๋ฆฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [1, 8]. + * ํŒ€ ๋‹จ์œ„ ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์œ„ํ•ด ESLint, Prettier, Husky๋ฅผ ์กฐํ•ฉํ•˜์—ฌ ์ปค๋ฐ‹์ด๋‚˜ ๋ณ‘ํ•ฉ ์ „์— ์•„ํ‚คํ…์ฒ˜ ๊ฒฝ๊ณ„ ์œ„๋ฐ˜(์˜ˆ: feature๊ฐ€ ๋‹ค๋ฅธ feature๋ฅผ ์ž„ํฌํŠธํ•˜๋Š” ํ–‰์œ„)์ด๋‚˜ ์ฝ”๋“œ ํฌ๋งทํŒ…์„ ์ž๋™์œผ๋กœ ๊ฒ€์‚ฌํ•˜๊ณ  ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [1]. + * Git ๋ธŒ๋žœ์นญ ์‹œ ์งง์€ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๊ฐ€์ง„ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜(Feature Branch)๋ฅผ ์šด์˜ํ•˜๊ณ , 'Conventional Commits' ๊ทœ์น™์— ๋”ฐ๋ผ ์˜๋ฏธ ์žˆ๋Š” ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๋ฅผ ์ž‘์„ฑํ•˜๋ฉฐ, ๋‹จ์ผ ์ฑ…์ž„์— ๋งž๋Š” ์ž‘์€ PR(Pull Request)์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ ์œ ์ง€๋ณด์ˆ˜ ํ”„๋ž™ํ‹ฐ์Šค์ž…๋‹ˆ๋‹ค [1, 5, 9]. + +## โš–๏ธ Trade-offs & Caveats +* **์ถ”์ƒํ™”์™€ ๋ณต์žก์„ฑ์˜ ์ถฉ๋Œ (DRY vs KISS):** ์ค‘๋ณต ์ฝ”๋“œ๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด(DRY) ๋ฌด๋ฆฌํ•˜๊ฒŒ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ถ”์ƒํ™”๋ฅผ ๋งŒ๋“ค๋ฉด, ์˜คํžˆ๋ ค ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์›Œ์ ธ KISS(Keep It Simple, Stupid) ์›์น™์„ ์œ„๋ฐฐํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์†Œ์Šค ์ฝ”๋“œ ํŒจํ„ด์ด ์ตœ์†Œ 3๋ฒˆ ๋ฐ˜๋ณต๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ ์ถ”์ƒํ™”ํ•˜๋Š” ๊ฒƒ์ด ์„ฃ๋ถ€๋ฅธ ์ตœ์ ํ™”๋กœ ์ธํ•œ ๋ถ€์ž‘์šฉ์„ ๋ง‰๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค [1, 6]. +* **์•„ํ‚คํ…์ฒ˜ ์˜ค๋ฒ„ํ—ค๋“œ:** Feature-Sliced Design(FSD)๊ณผ ๊ฐ™์ด ์—„๊ฒฉํ•˜๊ฒŒ ๋ถ„๋ฆฌ๋œ ๊ณ„์ธต ๊ตฌ์กฐ๋Š” ๋Œ€๊ทœ๋ชจ ์•ฑ์˜ ์œ ์ง€๋ณด์ˆ˜์„ฑ์— ํƒ์›”ํ•˜์ง€๋งŒ, ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ๋‚˜ ์ดˆ๋ณด์ž์—๊ฒŒ๋Š” ํด๋”์™€ ํŒŒ์ผ์ด ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์ชผ๊ฐœ์ง€๊ณ  ๊ฐœ๋…์  ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๋ฐœ์ƒ์‹œ์ผœ ๊ณผ๋„ํ•œ ์„ค๊ณ„(Overkill)๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3, 4]. +* **์ƒํƒœ ๊ด€๋ฆฌ ๋ฆฌํŒฉํ† ๋ง์˜ ๋ฐ˜๋Œ€ ๊ธ‰๋ถ€:** Context API์—์„œ ์‹œ์ž‘ํ•œ ์ƒํƒœ๋ฅผ ๋Œ€๊ทœ๋ชจ ์•ฑ์˜ ์„ฑ๋Šฅ(๋ฆฌ๋ Œ๋”๋ง) ๋ฌธ์ œ๋กœ ์ธํ•ด Zustand๋‚˜ Redux๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ๋•Œ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. Zustand๋Š” ์œ ์—ฐํ•˜์ง€๋งŒ ํŒ€์›๋งˆ๋‹ค ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ํŒจํ„ด์ด ํŒŒํŽธํ™”๋  ์œ„ํ—˜์ด ์žˆ์œผ๋ฉฐ, Redux๋Š” ์ผ๊ด€๋œ ๊ตฌ์กฐ๋ฅผ ์ œ๊ณตํ•˜์ง€๋งŒ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ(Boilerplate) ์ฝ”๋“œ๊ฐ€ ํญ๋ฐœ์ ์œผ๋กœ ์ฆ๊ฐ€ํ•˜์—ฌ ๊ฐœ๋ฐœ ์†๋„๋ฅผ ์ €ํ•˜์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [10]. +* **์ „๋ฉด ์žฌ์ž‘์„ฑ์˜ ์œ„ํ—˜์„ฑ:** ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ค์šด ์ฝ”๋“œ๋ฅผ ๋งˆ์ฃผํ–ˆ์„ ๋•Œ ์ „์ฒด ์ฝ”๋“œ๋ฅผ ํ•œ ๋ฒˆ์— ์žฌ์ž‘์„ฑ(Rewrite)ํ•˜๋ ค๋Š” ์‹œ๋„๋Š” ์‹คํŒจํ•  ํ™•๋ฅ ์ด ๋งค์šฐ ๋†’์Šต๋‹ˆ๋‹ค. ๋ฆฌํŒฉํ† ๋ง์€ ๋น„์ฆˆ๋‹ˆ์Šค ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ์„ ๋ฉˆ์ถ”์ง€ ์•Š์€ ์ƒํƒœ์—์„œ, ์ปดํฌ๋„ŒํŠธ ๋ฐ ์Šคํ† ์–ด๋ฅผ ํ•˜๋‚˜์”ฉ '์ ์ง„์ (Incremental)'์œผ๋กœ ์ˆ˜์ •ํ•ด์•ผ๋งŒ ๋ฆฌ์Šคํฌ๋ฅผ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [๊ด€๊ณ„ ์œ ํ˜• A (์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ )] +- [[Feature-Sliced Design (FSD)]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋Œ€๊ทœ๋ชจ ํ”„๋ก ํŠธ์—”๋“œ ํ”„๋กœ์ ํŠธ์˜ ์ฝ”๋“œ๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•  ๋•Œ ๊ธฐ์ˆ  ๋ถ€์ฑ„๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด ์ฑ„ํƒํ•˜๋Š” ์ตœ์‹  ํด๋” ๋ฐ ์•„ํ‚คํ…์ฒ˜ ๋ฐฉ๋ฒ•๋ก ์ž…๋‹ˆ๋‹ค [1, 3]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์•ฑ์„ ๋ ˆ์ด์–ด(app, pages, widgets, features, entities, shared)๋กœ ์—„๊ฒฉํžˆ ๋‚˜๋ˆ„๊ณ  ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ์„ ๊ฐ•์ œํ•˜์—ฌ ์ฝ”๋“œ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๋Š” ์›๋ฆฌ๋ฅผ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[SOLID ์›์น™]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋ฆฌํŒฉํ† ๋ง ์‹œ ์ปดํฌ๋„ŒํŠธ์™€ ๋ชจ๋“ˆ์„ ์–ด๋–ป๊ฒŒ ๋‚˜๋ˆ„๊ณ  ๊ตฌ์„ฑํ• ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๊ฐ€์žฅ ๊ธฐ์ดˆ์ ์ธ ์†Œํ”„ํŠธ์›จ์–ด ์—”์ง€๋‹ˆ์–ด๋ง ์ฒ ํ•™์ž…๋‹ˆ๋‹ค [1, 6]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)์„ ํ†ตํ•ด ๋น„๋Œ€ํ•ด์ง„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ถ„ํ• ํ•˜๊ณ , ๊ฐœ๋ฐฉ-ํ์‡„ ์›์น™(OCP)์„ ํ†ตํ•ด ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๊ณ  ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ™•์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +#### [๊ด€๊ณ„ ์œ ํ˜• B (๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ)] +- [[์ปค์Šคํ…€ ํ›… (Custom Hooks)]] + - ์—ฐ๊ฒฐ ์ด์œ : React ๋ฆฌํŒฉํ† ๋ง์—์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ UI๋ฅผ ๋ถ„๋ฆฌํ•˜๊ณ , DRY ์›์น™์„ ์‹คํ˜„ํ•˜๋Š” ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ๋‹จ์œ„์ด์ž ๋„๊ตฌ์ž…๋‹ˆ๋‹ค [1, 6]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์— ์‚ฐ์žฌํ•œ ์ƒํƒœ ๊ด€๋ฆฌ์™€ ๋ถ€์ˆ˜ ํšจ๊ณผ(`useEffect`)๋ฅผ ์–ด๋–ป๊ฒŒ ์‘์ง‘๋„ ๋†’์€ ๋…๋ฆฝ์ ์ธ ํ•จ์ˆ˜๋กœ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ (Incremental Migration)]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ๊ฐœ์„ ํ•  ๋•Œ ์‹œ์Šคํ…œ์„ ์ค‘๋‹จ์‹œํ‚ค๊ฑฐ๋‚˜ ์œ„ํ—˜ํ•œ '์ „์ฒด ์žฌ์ž‘์„ฑ'์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ˜๋“œ์‹œ ์ฑ„ํƒํ•ด์•ผ ํ•˜๋Š” ์ „๋žต์ž…๋‹ˆ๋‹ค [1]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์•Œ๋ฆผ์ด๋‚˜ ๋‹จ์ˆœ ์ƒํƒœ ๊ฐ™์€ ์ž‘์€ ๋ชจ๋“ˆ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด ์ ์ง„์ ์œผ๋กœ ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ๋‚˜ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ต์ฒดํ•ด ๋‚˜๊ฐ€๋Š” ๊ตฌ์ฒด์ ์ธ ์ „ํ™˜ ์ ˆ์ฐจ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ (Visual Regression Testing)]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋Œ€๊ทœ๋ชจ ์ฝ”๋“œ ๊ตฌ์กฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฆฌํŒฉํ† ๋ง ์‹œ, ๊ธฐ์กด UI๊ฐ€ ์˜๋„์น˜ ์•Š๊ฒŒ ๊นจ์ง€๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๋Š” ํ•ต์‹ฌ ์•ˆ์ „๋ง์ž…๋‹ˆ๋‹ค [7]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Storybook๊ณผ ํ†ตํ•ฉ๋œ ๋„๊ตฌ(์˜ˆ: Happo, Chromatic)๋ฅผ ํ†ตํ•ด DOM ๊ตฌ์กฐ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์‹ค์ œ ๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง ํ”ฝ์…€ ์ฐจ์ด๋ฅผ ๊ฐ์ง€ํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### Deeper Research Questions + +- DRY ์›์น™๊ณผ KISS ์›์น™์ด ์ƒ์ถฉํ•˜๋Š” ์ƒํ™ฉ์—์„œ, ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฆฌํŒฉํ† ๋ง ์‹œ ์ถ”์ƒํ™”์˜ ์ ์ ˆํ•œ ์‹œ์ (์˜ˆ: Rule of Three)์„ ๊ฒฐ์ •ํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ์‹ค๋ฌด์  ๊ธฐ์ค€์€ ๋ฌด์—‡์ธ๊ฐ€? +- ๋Œ€๊ทœ๋ชจ React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ Context API๋กœ ๊ตฌ์ถ•๋œ ๊ธฐ์กด ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ Zustand๋‚˜ Redux๋กœ ์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜(Incremental Migration)ํ•  ๋•Œ ์ง๋ฉดํ•˜๋Š” ๊ธฐ์ˆ ์  ์žฅ์• ๋ฌผ๊ณผ ๋‹จ๊ณ„๋ณ„ ํ•ด๊ฒฐ ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? +- Feature-Sliced Design (FSD)์„ ๋„์ž…ํ•˜์—ฌ ๋ฆฌํŒฉํ† ๋งํ•  ๋•Œ, ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ(Feature)์—์„œ ๊ณตํ†ต์œผ๋กœ ํ•„์š”ํ•œ ๋กœ์ง์ด 'Shared' ๊ณ„์ธต์— ์ง€๋‚˜์น˜๊ฒŒ ๋น„๋Œ€ํ•ด์ง€๋Š” ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ๋ฐฉ์ง€ํ•˜๊ณ  ์กฐ์œจํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- ๋ ˆ๊ฑฐ์‹œ React ์ฝ”๋“œ๋ฒ ์ด์Šค์— ์กด์žฌํ•˜๋Š” ๋‹ค์ˆ˜์˜ ๋ถˆํ•„์š”ํ•œ `useEffect`์™€ ํŒŒํŽธํ™”๋œ ์„œ๋ฒ„ ์ƒํƒœ๋ฅผ TanStack Query์™€ ๊ฐ™์€ ๋„๊ตฌ๋กœ ๋ฆฌํŒฉํ† ๋งํ•  ๋•Œ, ๊ธฐ์กด ์œ ๋‹› ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์˜ ์ „๋žต์€ ์–ด๋–ป๊ฒŒ ์ˆ˜์ •๋˜์–ด์•ผ ํ•˜๋Š”๊ฐ€? +- ๋‹ค์ˆ˜์˜ ํ”„๋ก ํŠธ์—”๋“œ ํŒ€์ด ํ˜‘์—…ํ•˜๋Š” ํ™˜๊ฒฝ์—์„œ ESLint, Prettier, Husky๋ฅผ ํ™œ์šฉํ•ด FSD์˜ ์•„ํ‚คํ…์ฒ˜ ๊ฒฝ๊ณ„(๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ๋“ฑ)์™€ ๋„ค์ด๋ฐ ์ปจ๋ฒค์…˜์„ ์ž๋™ํ™” ๋ฐ ๊ฐ•์ œํ•˜๋Š” ์ตœ์ ์˜ CI/CD ๊ฑฐ๋ฒ„๋„Œ์Šค ๊ตฌ์„ฑ ๋ฐฉ์‹์€ ๋ฌด์—‡์ธ๊ฐ€? + +### Practical Application Contexts + +- **Implementation:** ๋น„๋Œ€ํ•ด์ง„ React ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งˆ์ฃผํ–ˆ์„ ๋•Œ ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)์„ ์ ์šฉํ•˜์—ฌ, UI ๋ Œ๋”๋ง ๋กœ์ง์€ ๊ทธ๋Œ€๋กœ ๋‘๊ณ  ๋ณต์žกํ•œ ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋‚˜ API ํŽ˜์นญ ๋กœ์ง์„ ์ปค์Šคํ…€ ํ›…์œผ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๋ฆฌํŒฉํ† ๋ง์„ ์ฆ‰์‹œ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค [1, 6]. +- **System Design:** ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ๊ฐ€ ์ ์  ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œ์ง€๋Š” ๊ฒƒ์„ ๋ง‰๊ธฐ ์œ„ํ•ด, ์ดˆ๊ธฐ๋ถ€ํ„ฐ ํŒŒ์ผ ์œ ํ˜•(components, hooks) ๊ธฐ๋ฐ˜์˜ ํด๋” ๋ถ„๋ฅ˜๋ฅผ ์ง€์–‘ํ•˜๊ณ , Feature-Sliced Design(FSD)๊ณผ ๊ฐ™์€ ๋„๋ฉ”์ธ/๊ธฐ๋Šฅ ์ค‘์‹ฌ์˜ ํด๋” ๊ตฌ์กฐ๋ฅผ ์‹œ์Šคํ…œ์˜ ๋ผˆ๋Œ€๋กœ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค [1, 3, 4]. +- **Operation / Maintenance:** ์œ ์ง€๋ณด์ˆ˜ ๊ณผ์ •์—์„œ ๋ฒ„๊ทธ ํ”ฝ์Šค์™€ ๋ฆฌํŒฉํ† ๋ง ์ฝ”๋“œ๊ฐ€ ์„ž์ด์ง€ ์•Š๋„๋ก, ์งง์€ ์ƒ๋ช…์ฃผ๊ธฐ์˜ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  Conventional Commits๋ฅผ ๋„์ž…ํ•˜์—ฌ ์œ ์ง€๋ณด์ˆ˜ ์ด๋ ฅ(History)์˜ ๊ฐ€๋…์„ฑ์„ ๋†’์ž…๋‹ˆ๋‹ค [5]. +- **Learning Path:** ๋ฆฌ์•กํŠธ๋ฅผ ์ฒ˜์Œ ๋ฐฐ์šด ํ›„, ๋‹จ์ˆœํžˆ ์ฝ”๋“œ๋ฅผ ์ž‘๋™ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ๋„˜์–ด, ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋ฅผ ์œ ๋‹› ํ…Œ์ŠคํŠธ(Unit Test)๋กœ ๊ฒ€์ฆํ•œ ๋’ค DRY, KISS, YAGNI ์›์น™์— ๋”ฐ๋ผ ๊ตฐ๋”๋”๊ธฐ๋ฅผ ์—†์• ๋Š” ์•ˆ์ „ํ•œ ๋ฆฌํŒฉํ† ๋ง ์‚ฌ์ดํด์„ ํ›ˆ๋ จํ•ฉ๋‹ˆ๋‹ค [2, 6]. +- **My Project Relevance:** ํƒ€์ธ์ด ์ž‘์„ฑํ•œ ๋˜๋Š” ์˜ค๋ž˜๋œ ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฅผ ์ธ๊ณ„๋ฐ›์•˜์„ ๋•Œ, ์ฝ”๋“œ๋ฅผ ์ „๋ฉด ์žฌ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ  Storybook ๋“ฑ์œผ๋กœ ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ ์•ˆ์ „๋ง์„ ๊ตฌ์ถ•ํ•œ ๋’ค [7], ๋ถˆํ•„์š”ํ•œ ์ƒํƒœ ๋ฐ Effect๋ฅผ ์ ์ง„์ ์œผ๋กœ ์ •๋ˆํ•ด ๋‚˜๊ฐ€๋Š” [2] ๊ตฌ์ฒด์ ์ธ ๊ฐ€์ด๋“œ๋ผ์ธ์œผ๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### Adjacent Topics + +- [[ํ”„๋ก ํŠธ์—”๋“œ ์„ฑ๋Šฅ ์ตœ์ ํ™” (Frontend Performance Optimization)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋ฆฌํŒฉํ† ๋ง์„ ํ†ตํ•ด ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ๋†’์ด๋Š” ๊ฒƒ์„ ๋„˜์–ด, ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ํ•ด๊ฒฐํ•˜๊ฑฐ๋‚˜(Chrome DevTools ํ™œ์šฉ), ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง ์š”์†Œ(React.memo, useCallback ์˜ค๋‚จ์šฉ ๋“ฑ)๋ฅผ ์ฐพ์•„๋‚ด์–ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•˜๋Š” ๊ธฐ๋ฒ•์œผ๋กœ ํ•™์Šต์„ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค. +- [[Git ๋ธŒ๋žœ์นญ ๋ฐ ํ˜‘์—… ์ „๋žต (Git Branching & Workflow)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋ฆฌํŒฉํ† ๋ง๊ณผ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ์ด ๋™์‹œ์— ์ผ์–ด๋‚˜๋Š” ํŒ€ ํ™˜๊ฒฝ์—์„œ, ์ฝ”๋“œ ์ถฉ๋Œ์„ ์ตœ์†Œํ™”ํ•˜๊ณ  ๋ฆฌ๋ทฐ ํšจ์œจ์„ ๋†’์ด๊ธฐ ์œ„ํ•œ Trunk-based Development, GitHub Flow ๋“ฑ ์‹ค๋ฌด์  ํ˜‘์—… ์›Œํฌํ”Œ๋กœ์šฐ๋กœ ์ดํ•ด๋ฅผ ๋„“ํž™๋‹ˆ๋‹ค. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/ํ”„๋ก ํŠธ์—”๋“œ ํด๋ผ์šฐ๋“œ ๋กœ๊น… ๋„๊ตฌ ๋„์ž… ๋ฐ ํ”„๋กœ๋•์…˜ ๋ชจ๋‹ˆํ„ฐ๋ง.md b/00_Raw/ํ”„๋ก ํŠธ์—”๋“œ ํด๋ผ์šฐ๋“œ ๋กœ๊น… ๋„๊ตฌ ๋„์ž… ๋ฐ ํ”„๋กœ๋•์…˜ ๋ชจ๋‹ˆํ„ฐ๋ง.md new file mode 100644 index 00000000..a60b2510 --- /dev/null +++ b/00_Raw/ํ”„๋ก ํŠธ์—”๋“œ ํด๋ผ์šฐ๋“œ ๋กœ๊น… ๋„๊ตฌ ๋„์ž… ๋ฐ ํ”„๋กœ๋•์…˜ ๋ชจ๋‹ˆํ„ฐ๋ง.md @@ -0,0 +1,69 @@ +# [[ํ”„๋ก ํŠธ์—”๋“œ ํด๋ผ์šฐ๋“œ ๋กœ๊น… ๋„๊ตฌ ๋„์ž… ๋ฐ ํ”„๋กœ๋•์…˜ ๋ชจ๋‹ˆํ„ฐ๋ง]] + +## ๐Ÿ“Œ 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 new file mode 100644 index 00000000..358b60e0 --- /dev/null +++ b/00_Raw/ํ™•์žฅ ๊ฐ€๋Šฅํ•œ React ์•„ํ‚คํ…์ฒ˜ ๋ฐ ํด๋” ๊ตฌ์กฐ ์„ค๊ณ„.md @@ -0,0 +1,73 @@ +# [[ํ™•์žฅ ๊ฐ€๋Šฅํ•œ 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/Projects/ConnectAI/Core_Optimization_Plan.md b/10_Wiki/Projects/ConnectAI/Core_Optimization_Plan.md new file mode 100644 index 00000000..07f1ff22 --- /dev/null +++ b/10_Wiki/Projects/ConnectAI/Core_Optimization_Plan.md @@ -0,0 +1,46 @@ +--- +id: a7f8e1c2-d3b4-4e5f-9a0b-1c2d3e4f5a6b +category: "[[10_Wiki/Projects/ConnectAI]]" +confidence_score: 0.90 +tags: [connectai, optimization, python, architecture, performance] +last_reinforced: 2026-05-01 +github_commit: "initial-wikification" +--- + +# [[ConnectAI Core Optimization Plan (Python Core)]] + +## ๐Ÿ“Œ ํ•œ ์ค„ ํ†ต์ฐฐ (The Karpathy Summary) +> ConnectAI์˜ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด $O(N^2)$ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ $O(N \log N)$์œผ๋กœ ๊ณ ๋„ํ™”ํ•˜๊ณ , ๋™๊ธฐ์‹ I/O๋ฅผ ๋น„๋™๊ธฐ ํŒŒ์ดํ”„๋ผ์ธ์œผ๋กœ ์ „ํ™˜ํ•˜๋ฉฐ, ์˜ต์ €๋ฒ„ ํŒจํ„ด์„ ํ†ตํ•ด ๋ชจ๋“ˆ ๊ฐ„ ๊ฒฐํ•ฉ๋„๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ์ „๋ฉด์ ์ธ ์ฝ”์–ด ์•„ํ‚คํ…์ฒ˜ ๊ฐœํŽธ ๊ณ„ํš์ด๋‹ค. + +## ๐Ÿ“– ๊ตฌ์กฐํ™”๋œ ์ง€์‹ (Synthesized Content) + +### 1. ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํšจ์œจํ™” (Performance Optimization) +- **ํ˜„์ƒ**: `InferenceEngine.py` ๋‚ด brute-force ํŠน์ง• ๋งค์นญ ๋กœ์ง์ด $O(N^2)$์˜ ๋น„ํšจ์œจ์„ฑ์„ ๊ฐ€์ง. +- **ํ•ด๊ฒฐ**: **KD-Tree** ๋˜๋Š” ํ–‰๋ ฌ ๋ถ„ํ•ด ๊ธฐ๋ฐ˜ ๋ฒกํ„ฐ ์—ฐ์‚ฐ์„ ๋„์ž…ํ•˜์—ฌ $O(N \log N)$์œผ๋กœ ๊ฐœ์„ . ์ถ”๋ก  ์ง€์—ฐ ์‹œ๊ฐ„ 5~10๋ฐฐ ๋‹จ์ถ•์„ ๋ชฉํ‘œ๋กœ ํ•จ. + +### 2. ๋น„๋™๊ธฐ I/O ํŒŒ์ดํ”„๋ผ์ธ (Throughput Enhancement) +- **ํ˜„์ƒ**: ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ(`DataLoader.py`) ๊ณผ์ •์ด ๋™๊ธฐ์‹์œผ๋กœ ๋™์ž‘ํ•˜์—ฌ CPU ์œ ํœด ์‹œ๊ฐ„ ๋ฐœ์ƒ ๋ฐ ์ฒ˜๋ฆฌ๋Ÿ‰ ์ €ํ•˜. +- **ํ•ด๊ฒฐ**: `asyncio` ๋ฐ ์Šค๋ ˆ๋“œ ํ’€์„ ํ™œ์šฉํ•œ ๋น„๋™๊ธฐ/๋ณ‘๋ ฌ I/O ๊ตฌ์กฐ๋กœ ์ „ํ™˜ํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ ๋ฐ ์ฒ˜๋ฆฌ ์†๋„ ๊ทน๋Œ€ํ™”. + +### 3. ๋ชจ๋“ˆ ๋””์ปคํ”Œ๋ง (Maintainability & Scalability) +- **ํ˜„์ƒ**: ์ „์ฒ˜๋ฆฌ ๋ชจ๋“ˆ๊ณผ ์ฝ”์–ด ๋ชจ๋ธ ๊ฐ„์˜ ์ง์ ‘์ ์ธ ํ•˜๋“œ์ฝ”๋”ฉ ์˜์กด์„ฑ์œผ๋กœ ์ธํ•ด ์œ ์ง€๋ณด์ˆ˜ ๋ฐ ํ…Œ์ŠคํŠธ๊ฐ€ ๋‚œํ•ดํ•จ. +- **ํ•ด๊ฒฐ**: **๊ด€์ฐฐ์ž ํŒจํ„ด(Observer Pattern)** ๋ฐ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ฒ˜ ๋„์ž…. `DataReadyEvent` ๋ฐœํ–‰-๊ตฌ๋… ๋ชจ๋ธ์„ ํ†ตํ•ด ๋ชจ๋“ˆ ๋…๋ฆฝ์„ฑ ํ™•๋ณด ๋ฐ DIP(์˜์กด ์—ญ์ „ ์›์น™) ์‹คํ˜„. + +## ๐Ÿš€ ๊ตฌํ˜„ ๋กœ๋“œ๋งต (Execution Roadmap) +- **Phase 1**: ํ•ต์‹ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ตœ์ ํ™” ๋ฐ ๋ฒค์น˜๋งˆํ‚น (KD-Tree ๊ตฌํ˜„). +- **Phase 2**: ๋น„๋™๊ธฐ I/O ๋ž˜ํ•‘ ๋ฐ ์ „์—ญ ์ด๋ฒคํŠธ ๋ฃจํ”„ ํ†ตํ•ฉ. +- **Phase 3**: ์ด๋ฒคํŠธ ์‹œ์Šคํ…œ ๊ตฌ์ถ•์„ ํ†ตํ•œ ๋ชจ๋“ˆ ๊ฐ„ ์ธํ„ฐํŽ˜์ด์Šค ํ‘œ์ค€ํ™”. + +## โš ๏ธ ๋ชจ์ˆœ ๋ฐ ์—…๋ฐ์ดํŠธ (Contradictions & RL Update) +- **๋ณต์žก๋„ vs ์„ฑ๋Šฅ**: KD-Tree ๋„์ž…์€ ์„ฑ๋Šฅ์„ ๋†’์ด์ง€๋งŒ ๋ฐ์ดํ„ฐ ์—…๋ฐ์ดํŠธ ๋นˆ๋„๊ฐ€ ๊ทน๋„๋กœ ๋†’์„ ๊ฒฝ์šฐ ํŠธ๋ฆฌ ์žฌ๊ตฌ์ถ• ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ. +- **๋น„๋™๊ธฐ ์˜ค๋ฒ„ํ—ค๋“œ**: ๋‹จ์ˆœ ์—ฐ์‚ฐ ์œ„์ฃผ ์ž‘์—…์—์„œ๋Š” `asyncio` ์ „ํ™˜์ด ์˜คํžˆ๋ ค ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ ๋น„์šฉ๋งŒ ๋Š˜๋ฆด ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ”„๋กœํŒŒ์ผ๋ง ํ•„์ˆ˜. + +## ๐Ÿ”— ์ง€์‹ ์—ฐ๊ฒฐ (Graph) +- **Parent**: [[10_Wiki/Projects/ConnectAI]] +- **Related**: [[Observer Pattern]], [[KD-Tree]], [[Asynchronous I/O]] +- **Raw Source**: [[00_Raw/system_analysis_and_improvement_plan]] + +## ๐Ÿ’ป GitHub ๋™๊ธฐํ™” ์ž๋™ํ™” ์›Œํฌํ”Œ๋กœ์šฐ +1. Stage: git add . +2. Commit: `git commit -m "[P-Reinforce] Wikify ConnectAI Core Optimization Plan"` +3. Push: `git push origin main` diff --git a/10_Wiki/Topics/Development/Modern_React_Engineering_2025.md b/10_Wiki/Topics/Development/Modern_React_Engineering_2025.md new file mode 100644 index 00000000..639bf010 --- /dev/null +++ b/10_Wiki/Topics/Development/Modern_React_Engineering_2025.md @@ -0,0 +1,50 @@ +--- +id: 5e8f4a2b-1c9d-4e8b-a2f3-7d9e1c6b4a2d +category: "[[10_Wiki/Topics/Development]]" +confidence_score: 0.95 +tags: [react, frontend, engineering, standard, 2025, performance, architecture] +last_reinforced: 2026-05-01 +github_commit: "initial-wikification" +--- + +# [[Modern React & Frontend Engineering Standard (2025)]] + +## ๐Ÿ“Œ ํ•œ ์ค„ ํ†ต์ฐฐ (The Karpathy Summary) +> 2025๋…„์˜ ํ”„๋ก ํŠธ์—”๋“œ ์—”์ง€๋‹ˆ์–ด๋ง์€ ๋‹จ์ˆœํ•œ UI ๊ฐœ๋ฐœ์„ ๋„˜์–ด, FSD ์•„ํ‚คํ…์ฒ˜, ๋นŒ๋“œ ํƒ€์ž„ ์ž๋™ํ™”(React Compiler), ๊ทธ๋ฆฌ๊ณ  ๋ชฉ์ ๋ณ„๋กœ ํŒŒํŽธํ™”๋œ ์ƒํƒœ ๊ด€๋ฆฌ ์ฒด๊ณ„๋ฅผ ํ†ตํ•ด ํ™•์žฅ์„ฑ๊ณผ ์•ˆ์ •์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•˜๋Š” ์ •๊ตํ•œ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ ์—”์ง€๋‹ˆ์–ด๋ง์œผ๋กœ ์ง„ํ™”ํ–ˆ๋‹ค. + +## ๐Ÿ“– ๊ตฌ์กฐํ™”๋œ ์ง€์‹ (Synthesized Content) + +### 1. ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์•„ํ‚คํ…์ฒ˜: Feature-Sliced Design (FSD) +- **๊ณ„์ธต์  ๊ตฌ์กฐํ™”**: `app` -> `pages` -> `widgets` -> `features` -> `entities` -> `shared` ์ˆœ์˜ ๋ ˆ์ด์–ด๋ง์„ ํ†ตํ•ด ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋ถ„๋ฆฌํ•œ๋‹ค. +- **๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ**: ์ƒ์œ„ ๋ ˆ์ด์–ด๋Š” ํ•˜์œ„ ๋ ˆ์ด์–ด๋งŒ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฐ•์ œํ•˜์—ฌ ์ˆœํ™˜ ์ฐธ์กฐ๋ฅผ ์›์ฒœ ์ฐจ๋‹จํ•˜๊ณ  ๋ชจ๋“ˆ ๊ฐ„ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ˜๋‹ค. +- **Public API (index.ts)**: ๊ฐ ์Šฌ๋ผ์ด์Šค๋Š” `index.ts`๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์™ธ๋ถ€์™€ ์†Œํ†ตํ•˜์—ฌ ๋‚ด๋ถ€ ๊ตฌํ˜„์„ ์บก์Аํ™”ํ•œ๋‹ค. + +### 2. ์ƒํƒœ ๊ด€๋ฆฌ์˜ ์ „๋ฌธํ™” ๋ฐ ํŒŒํŽธํ™” +- **์„œ๋ฒ„ ์ƒํƒœ**: TanStack Query (React Query)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์บ์‹ฑ, ๋™๊ธฐํ™”, ๋น„๋™๊ธฐ ์ƒํƒœ๋ฅผ ์ „๋‹ด ๊ด€๋ฆฌํ•œ๋‹ค. +- **์ „์—ญ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒํƒœ**: Zustand๋ฅผ ํ™œ์šฉํ•˜์—ฌ Selector ๊ธฐ๋ฐ˜์˜ ์„ธ๋ฐ€ํ•œ ๋ฆฌ๋ Œ๋”๋ง ์ œ์–ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, Redux๋Š” ๋ณต์žก๋„๊ฐ€ ๊ทน๋„๋กœ ๋†’์€ ๋Œ€๊ทœ๋ชจ ํ˜‘์—… ํ™˜๊ฒฝ์—์„œ๋งŒ ์ œํ•œ์ ์œผ๋กœ ์ฑ„ํƒํ•œ๋‹ค. +- **๋กœ์ปฌ ๋ฐ UI ์ƒํƒœ**: `useState`, `useReducer`, ๋˜๋Š” ์ •์ ์ธ ์„ค์ •๊ฐ’์˜ ๊ฒฝ์šฐ `Context API`๋ฅผ ์ ์žฌ์ ์†Œ์— ๋ฐฐ์น˜ํ•œ๋‹ค. + +### 3. ์„ฑ๋Šฅ ์—”์ง€๋‹ˆ์–ด๋ง (Build & Runtime) +- **Vite & ESM**: ๊ธฐ์กด ๋ฒˆ๋“ค๋Ÿฌ ๋Œ€๋น„ ๋น„์•ฝ์ ์œผ๋กœ ๋น ๋ฅธ HMR๊ณผ ๊ฐœ๋ฐœ ์„œ๋ฒ„ ์†๋„๋ฅผ ๋ณด์žฅํ•œ๋‹ค. +- **React Compiler**: ๋นŒ๋“œ ํƒ€์ž„์— AST ๋ถ„์„์„ ํ†ตํ•ด `useMemo`, `useCallback` ๋“ฑ์„ ์ž๋™์œผ๋กœ ์ฃผ์ž…ํ•˜์—ฌ ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์˜ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค. +- **์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…**: `React.lazy`์™€ Vite์˜ `manualChunks` ์„ค์ •์„ ํ†ตํ•ด ๋ผ์šฐํŠธ ๋‹จ์œ„๋กœ ๋ฒˆ๋“ค์„ ์ชผ๊ฐœ์–ด ์ดˆ๊ธฐ ๋กœ๋”ฉ ์†๋„(LCP)๋ฅผ ๊ฐœ์„ ํ•œ๋‹ค. + +### 4. ์šด์˜ ํšŒ๋ณต์„ฑ ๋ฐ ๊ฑฐ๋ฒ„๋„Œ์Šค +- **Error Boundaries**: ํŠน์ • ์ปดํฌ๋„ŒํŠธ์˜ ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๊ฐ€ ์ „์ฒด ์•ฑ ์ค‘๋‹จ(White Screen)์œผ๋กœ ๋ฒˆ์ง€์ง€ ์•Š๋„๋ก ๊ตฌํš๋ณ„๋กœ ์•ˆ์ „์žฅ์น˜๋ฅผ ๋ฐฐ์น˜ํ•œ๋‹ค. +- **Observability**: Sentry, LogRocket ๋“ฑ์„ ์—ฐ๋™ํ•˜์—ฌ ์‹ค์ œ ์‚ฌ์šฉ์ž์˜ ์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด ๋ฐ ์—๋Ÿฌ ๋กœ๊ทธ๋ฅผ ์‹ค์‹œ๊ฐ„ ๋ชจ๋‹ˆํ„ฐ๋งํ•œ๋‹ค. +- **์—„๊ฒฉํ•œ ์ปจ๋ฒค์…˜**: `kebab-case`(ํŒŒ์ผ๋ช…), `PascalCase`(์ปดํฌ๋„ŒํŠธ), `camelCase`(ํ›…/๋ณ€์ˆ˜) ๋„ค์ด๋ฐ์„ ์ž๋™ํ™” ํ›…(Husky, ESLint)์œผ๋กœ ๊ฐ•์ œํ•œ๋‹ค. + +## โš ๏ธ ๋ชจ์ˆœ ๋ฐ ์—…๋ฐ์ดํŠธ (Contradictions & RL Update) +- **๋ฉ”๋ชจ์ด์ œ์ด์…˜์˜ ํ•จ์ •**: `React.memo`์˜ ์–•์€ ๋น„๊ต ๋น„์šฉ์ด ์‹ค์ œ ๋ Œ๋”๋ง ๋น„์šฉ๋ณด๋‹ค ํด ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, React Profiler ์ธก์ • ์—†๋Š” ๋ฌด๋ถ„๋ณ„ํ•œ ์ตœ์ ํ™”๋Š” ์ง€์–‘ํ•ด์•ผ ํ•œ๋‹ค. +- **FSD vs Flat Structure**: ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” FSD๊ฐ€ ์˜ค๋ฒ„์—”์ง€๋‹ˆ์–ด๋ง์ด ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํŒ€์˜ ์ˆ™๋ จ๋„์— ๋”ฐ๋ผ `shared` ๋ ˆ์ด์–ด ๋น„๋Œ€ํ™” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. +- **Compiler ๋ธ”๋ž™๋ฐ•์Šค**: ์ž๋™ ์ตœ์ ํ™”๊ฐ€ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š” ์—ฃ์ง€ ์ผ€์ด์Šค(๋ถˆ์•ˆ์ •ํ•œ ์ฐธ์กฐ ๋ฐ˜ํ™˜ ๋“ฑ)์— ๋Œ€ํ•œ ๊ฐœ๋ฐœ์ž์˜ ์ˆ˜๋™ ๋Œ€์‘ ํŒจํ„ด์ด ์—ฌ์ „ํžˆ ํ•„์š”ํ•˜๋‹ค. + +## ๐Ÿ”— ์ง€์‹ ์—ฐ๊ฒฐ (Graph) +- **Parent**: [[10_Wiki/Topics/Development]] +- **Related**: [[Feature-Sliced Design]], [[Zustand]], [[React Compiler]], [[Error Boundaries]] +- **Raw Source**: [[00_Raw/2025 ํ”„๋ก ํŠธ์—”๋“œ ์—”์ง€๋‹ˆ์–ด๋ง ํ‘œ์ค€ ํ™•๋ฆฝ]], [[00_Raw/๋Œ€๊ทœ๋ชจ React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ]], [[00_Raw/Modern React Application Development (2025)]] + +## ๐Ÿ’ป GitHub ๋™๊ธฐํ™” ์ž๋™ํ™” ์›Œํฌํ”Œ๋กœ์šฐ +1. Stage: git add . +2. Commit: `git commit -m "[P-Reinforce] Wikify Modern React Engineering Standard 2025"` +3. Push: `git push origin main` diff --git a/10_Wiki/Topics_Biz/ConnectAI_Core_Optimization_Plan.md b/10_Wiki/Topics_Biz/ConnectAI_Core_Optimization_Plan.md new file mode 100644 index 00000000..07f1ff22 --- /dev/null +++ b/10_Wiki/Topics_Biz/ConnectAI_Core_Optimization_Plan.md @@ -0,0 +1,46 @@ +--- +id: a7f8e1c2-d3b4-4e5f-9a0b-1c2d3e4f5a6b +category: "[[10_Wiki/Projects/ConnectAI]]" +confidence_score: 0.90 +tags: [connectai, optimization, python, architecture, performance] +last_reinforced: 2026-05-01 +github_commit: "initial-wikification" +--- + +# [[ConnectAI Core Optimization Plan (Python Core)]] + +## ๐Ÿ“Œ ํ•œ ์ค„ ํ†ต์ฐฐ (The Karpathy Summary) +> ConnectAI์˜ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด $O(N^2)$ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ $O(N \log N)$์œผ๋กœ ๊ณ ๋„ํ™”ํ•˜๊ณ , ๋™๊ธฐ์‹ I/O๋ฅผ ๋น„๋™๊ธฐ ํŒŒ์ดํ”„๋ผ์ธ์œผ๋กœ ์ „ํ™˜ํ•˜๋ฉฐ, ์˜ต์ €๋ฒ„ ํŒจํ„ด์„ ํ†ตํ•ด ๋ชจ๋“ˆ ๊ฐ„ ๊ฒฐํ•ฉ๋„๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ์ „๋ฉด์ ์ธ ์ฝ”์–ด ์•„ํ‚คํ…์ฒ˜ ๊ฐœํŽธ ๊ณ„ํš์ด๋‹ค. + +## ๐Ÿ“– ๊ตฌ์กฐํ™”๋œ ์ง€์‹ (Synthesized Content) + +### 1. ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํšจ์œจํ™” (Performance Optimization) +- **ํ˜„์ƒ**: `InferenceEngine.py` ๋‚ด brute-force ํŠน์ง• ๋งค์นญ ๋กœ์ง์ด $O(N^2)$์˜ ๋น„ํšจ์œจ์„ฑ์„ ๊ฐ€์ง. +- **ํ•ด๊ฒฐ**: **KD-Tree** ๋˜๋Š” ํ–‰๋ ฌ ๋ถ„ํ•ด ๊ธฐ๋ฐ˜ ๋ฒกํ„ฐ ์—ฐ์‚ฐ์„ ๋„์ž…ํ•˜์—ฌ $O(N \log N)$์œผ๋กœ ๊ฐœ์„ . ์ถ”๋ก  ์ง€์—ฐ ์‹œ๊ฐ„ 5~10๋ฐฐ ๋‹จ์ถ•์„ ๋ชฉํ‘œ๋กœ ํ•จ. + +### 2. ๋น„๋™๊ธฐ I/O ํŒŒ์ดํ”„๋ผ์ธ (Throughput Enhancement) +- **ํ˜„์ƒ**: ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ(`DataLoader.py`) ๊ณผ์ •์ด ๋™๊ธฐ์‹์œผ๋กœ ๋™์ž‘ํ•˜์—ฌ CPU ์œ ํœด ์‹œ๊ฐ„ ๋ฐœ์ƒ ๋ฐ ์ฒ˜๋ฆฌ๋Ÿ‰ ์ €ํ•˜. +- **ํ•ด๊ฒฐ**: `asyncio` ๋ฐ ์Šค๋ ˆ๋“œ ํ’€์„ ํ™œ์šฉํ•œ ๋น„๋™๊ธฐ/๋ณ‘๋ ฌ I/O ๊ตฌ์กฐ๋กœ ์ „ํ™˜ํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ ๋ฐ ์ฒ˜๋ฆฌ ์†๋„ ๊ทน๋Œ€ํ™”. + +### 3. ๋ชจ๋“ˆ ๋””์ปคํ”Œ๋ง (Maintainability & Scalability) +- **ํ˜„์ƒ**: ์ „์ฒ˜๋ฆฌ ๋ชจ๋“ˆ๊ณผ ์ฝ”์–ด ๋ชจ๋ธ ๊ฐ„์˜ ์ง์ ‘์ ์ธ ํ•˜๋“œ์ฝ”๋”ฉ ์˜์กด์„ฑ์œผ๋กœ ์ธํ•ด ์œ ์ง€๋ณด์ˆ˜ ๋ฐ ํ…Œ์ŠคํŠธ๊ฐ€ ๋‚œํ•ดํ•จ. +- **ํ•ด๊ฒฐ**: **๊ด€์ฐฐ์ž ํŒจํ„ด(Observer Pattern)** ๋ฐ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ฒ˜ ๋„์ž…. `DataReadyEvent` ๋ฐœํ–‰-๊ตฌ๋… ๋ชจ๋ธ์„ ํ†ตํ•ด ๋ชจ๋“ˆ ๋…๋ฆฝ์„ฑ ํ™•๋ณด ๋ฐ DIP(์˜์กด ์—ญ์ „ ์›์น™) ์‹คํ˜„. + +## ๐Ÿš€ ๊ตฌํ˜„ ๋กœ๋“œ๋งต (Execution Roadmap) +- **Phase 1**: ํ•ต์‹ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ตœ์ ํ™” ๋ฐ ๋ฒค์น˜๋งˆํ‚น (KD-Tree ๊ตฌํ˜„). +- **Phase 2**: ๋น„๋™๊ธฐ I/O ๋ž˜ํ•‘ ๋ฐ ์ „์—ญ ์ด๋ฒคํŠธ ๋ฃจํ”„ ํ†ตํ•ฉ. +- **Phase 3**: ์ด๋ฒคํŠธ ์‹œ์Šคํ…œ ๊ตฌ์ถ•์„ ํ†ตํ•œ ๋ชจ๋“ˆ ๊ฐ„ ์ธํ„ฐํŽ˜์ด์Šค ํ‘œ์ค€ํ™”. + +## โš ๏ธ ๋ชจ์ˆœ ๋ฐ ์—…๋ฐ์ดํŠธ (Contradictions & RL Update) +- **๋ณต์žก๋„ vs ์„ฑ๋Šฅ**: KD-Tree ๋„์ž…์€ ์„ฑ๋Šฅ์„ ๋†’์ด์ง€๋งŒ ๋ฐ์ดํ„ฐ ์—…๋ฐ์ดํŠธ ๋นˆ๋„๊ฐ€ ๊ทน๋„๋กœ ๋†’์„ ๊ฒฝ์šฐ ํŠธ๋ฆฌ ์žฌ๊ตฌ์ถ• ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ. +- **๋น„๋™๊ธฐ ์˜ค๋ฒ„ํ—ค๋“œ**: ๋‹จ์ˆœ ์—ฐ์‚ฐ ์œ„์ฃผ ์ž‘์—…์—์„œ๋Š” `asyncio` ์ „ํ™˜์ด ์˜คํžˆ๋ ค ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ ๋น„์šฉ๋งŒ ๋Š˜๋ฆด ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ”„๋กœํŒŒ์ผ๋ง ํ•„์ˆ˜. + +## ๐Ÿ”— ์ง€์‹ ์—ฐ๊ฒฐ (Graph) +- **Parent**: [[10_Wiki/Projects/ConnectAI]] +- **Related**: [[Observer Pattern]], [[KD-Tree]], [[Asynchronous I/O]] +- **Raw Source**: [[00_Raw/system_analysis_and_improvement_plan]] + +## ๐Ÿ’ป GitHub ๋™๊ธฐํ™” ์ž๋™ํ™” ์›Œํฌํ”Œ๋กœ์šฐ +1. Stage: git add . +2. Commit: `git commit -m "[P-Reinforce] Wikify ConnectAI Core Optimization Plan"` +3. Push: `git push origin main` diff --git a/10_Wiki/Topics_Biz/Modern_React_Engineering_2025.md b/10_Wiki/Topics_Biz/Modern_React_Engineering_2025.md new file mode 100644 index 00000000..639bf010 --- /dev/null +++ b/10_Wiki/Topics_Biz/Modern_React_Engineering_2025.md @@ -0,0 +1,50 @@ +--- +id: 5e8f4a2b-1c9d-4e8b-a2f3-7d9e1c6b4a2d +category: "[[10_Wiki/Topics/Development]]" +confidence_score: 0.95 +tags: [react, frontend, engineering, standard, 2025, performance, architecture] +last_reinforced: 2026-05-01 +github_commit: "initial-wikification" +--- + +# [[Modern React & Frontend Engineering Standard (2025)]] + +## ๐Ÿ“Œ ํ•œ ์ค„ ํ†ต์ฐฐ (The Karpathy Summary) +> 2025๋…„์˜ ํ”„๋ก ํŠธ์—”๋“œ ์—”์ง€๋‹ˆ์–ด๋ง์€ ๋‹จ์ˆœํ•œ UI ๊ฐœ๋ฐœ์„ ๋„˜์–ด, FSD ์•„ํ‚คํ…์ฒ˜, ๋นŒ๋“œ ํƒ€์ž„ ์ž๋™ํ™”(React Compiler), ๊ทธ๋ฆฌ๊ณ  ๋ชฉ์ ๋ณ„๋กœ ํŒŒํŽธํ™”๋œ ์ƒํƒœ ๊ด€๋ฆฌ ์ฒด๊ณ„๋ฅผ ํ†ตํ•ด ํ™•์žฅ์„ฑ๊ณผ ์•ˆ์ •์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•˜๋Š” ์ •๊ตํ•œ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ ์—”์ง€๋‹ˆ์–ด๋ง์œผ๋กœ ์ง„ํ™”ํ–ˆ๋‹ค. + +## ๐Ÿ“– ๊ตฌ์กฐํ™”๋œ ์ง€์‹ (Synthesized Content) + +### 1. ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์•„ํ‚คํ…์ฒ˜: Feature-Sliced Design (FSD) +- **๊ณ„์ธต์  ๊ตฌ์กฐํ™”**: `app` -> `pages` -> `widgets` -> `features` -> `entities` -> `shared` ์ˆœ์˜ ๋ ˆ์ด์–ด๋ง์„ ํ†ตํ•ด ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋ถ„๋ฆฌํ•œ๋‹ค. +- **๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ**: ์ƒ์œ„ ๋ ˆ์ด์–ด๋Š” ํ•˜์œ„ ๋ ˆ์ด์–ด๋งŒ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฐ•์ œํ•˜์—ฌ ์ˆœํ™˜ ์ฐธ์กฐ๋ฅผ ์›์ฒœ ์ฐจ๋‹จํ•˜๊ณ  ๋ชจ๋“ˆ ๊ฐ„ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ˜๋‹ค. +- **Public API (index.ts)**: ๊ฐ ์Šฌ๋ผ์ด์Šค๋Š” `index.ts`๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์™ธ๋ถ€์™€ ์†Œํ†ตํ•˜์—ฌ ๋‚ด๋ถ€ ๊ตฌํ˜„์„ ์บก์Аํ™”ํ•œ๋‹ค. + +### 2. ์ƒํƒœ ๊ด€๋ฆฌ์˜ ์ „๋ฌธํ™” ๋ฐ ํŒŒํŽธํ™” +- **์„œ๋ฒ„ ์ƒํƒœ**: TanStack Query (React Query)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์บ์‹ฑ, ๋™๊ธฐํ™”, ๋น„๋™๊ธฐ ์ƒํƒœ๋ฅผ ์ „๋‹ด ๊ด€๋ฆฌํ•œ๋‹ค. +- **์ „์—ญ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒํƒœ**: Zustand๋ฅผ ํ™œ์šฉํ•˜์—ฌ Selector ๊ธฐ๋ฐ˜์˜ ์„ธ๋ฐ€ํ•œ ๋ฆฌ๋ Œ๋”๋ง ์ œ์–ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, Redux๋Š” ๋ณต์žก๋„๊ฐ€ ๊ทน๋„๋กœ ๋†’์€ ๋Œ€๊ทœ๋ชจ ํ˜‘์—… ํ™˜๊ฒฝ์—์„œ๋งŒ ์ œํ•œ์ ์œผ๋กœ ์ฑ„ํƒํ•œ๋‹ค. +- **๋กœ์ปฌ ๋ฐ UI ์ƒํƒœ**: `useState`, `useReducer`, ๋˜๋Š” ์ •์ ์ธ ์„ค์ •๊ฐ’์˜ ๊ฒฝ์šฐ `Context API`๋ฅผ ์ ์žฌ์ ์†Œ์— ๋ฐฐ์น˜ํ•œ๋‹ค. + +### 3. ์„ฑ๋Šฅ ์—”์ง€๋‹ˆ์–ด๋ง (Build & Runtime) +- **Vite & ESM**: ๊ธฐ์กด ๋ฒˆ๋“ค๋Ÿฌ ๋Œ€๋น„ ๋น„์•ฝ์ ์œผ๋กœ ๋น ๋ฅธ HMR๊ณผ ๊ฐœ๋ฐœ ์„œ๋ฒ„ ์†๋„๋ฅผ ๋ณด์žฅํ•œ๋‹ค. +- **React Compiler**: ๋นŒ๋“œ ํƒ€์ž„์— AST ๋ถ„์„์„ ํ†ตํ•ด `useMemo`, `useCallback` ๋“ฑ์„ ์ž๋™์œผ๋กœ ์ฃผ์ž…ํ•˜์—ฌ ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์˜ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค. +- **์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…**: `React.lazy`์™€ Vite์˜ `manualChunks` ์„ค์ •์„ ํ†ตํ•ด ๋ผ์šฐํŠธ ๋‹จ์œ„๋กœ ๋ฒˆ๋“ค์„ ์ชผ๊ฐœ์–ด ์ดˆ๊ธฐ ๋กœ๋”ฉ ์†๋„(LCP)๋ฅผ ๊ฐœ์„ ํ•œ๋‹ค. + +### 4. ์šด์˜ ํšŒ๋ณต์„ฑ ๋ฐ ๊ฑฐ๋ฒ„๋„Œ์Šค +- **Error Boundaries**: ํŠน์ • ์ปดํฌ๋„ŒํŠธ์˜ ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๊ฐ€ ์ „์ฒด ์•ฑ ์ค‘๋‹จ(White Screen)์œผ๋กœ ๋ฒˆ์ง€์ง€ ์•Š๋„๋ก ๊ตฌํš๋ณ„๋กœ ์•ˆ์ „์žฅ์น˜๋ฅผ ๋ฐฐ์น˜ํ•œ๋‹ค. +- **Observability**: Sentry, LogRocket ๋“ฑ์„ ์—ฐ๋™ํ•˜์—ฌ ์‹ค์ œ ์‚ฌ์šฉ์ž์˜ ์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด ๋ฐ ์—๋Ÿฌ ๋กœ๊ทธ๋ฅผ ์‹ค์‹œ๊ฐ„ ๋ชจ๋‹ˆํ„ฐ๋งํ•œ๋‹ค. +- **์—„๊ฒฉํ•œ ์ปจ๋ฒค์…˜**: `kebab-case`(ํŒŒ์ผ๋ช…), `PascalCase`(์ปดํฌ๋„ŒํŠธ), `camelCase`(ํ›…/๋ณ€์ˆ˜) ๋„ค์ด๋ฐ์„ ์ž๋™ํ™” ํ›…(Husky, ESLint)์œผ๋กœ ๊ฐ•์ œํ•œ๋‹ค. + +## โš ๏ธ ๋ชจ์ˆœ ๋ฐ ์—…๋ฐ์ดํŠธ (Contradictions & RL Update) +- **๋ฉ”๋ชจ์ด์ œ์ด์…˜์˜ ํ•จ์ •**: `React.memo`์˜ ์–•์€ ๋น„๊ต ๋น„์šฉ์ด ์‹ค์ œ ๋ Œ๋”๋ง ๋น„์šฉ๋ณด๋‹ค ํด ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, React Profiler ์ธก์ • ์—†๋Š” ๋ฌด๋ถ„๋ณ„ํ•œ ์ตœ์ ํ™”๋Š” ์ง€์–‘ํ•ด์•ผ ํ•œ๋‹ค. +- **FSD vs Flat Structure**: ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” FSD๊ฐ€ ์˜ค๋ฒ„์—”์ง€๋‹ˆ์–ด๋ง์ด ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํŒ€์˜ ์ˆ™๋ จ๋„์— ๋”ฐ๋ผ `shared` ๋ ˆ์ด์–ด ๋น„๋Œ€ํ™” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. +- **Compiler ๋ธ”๋ž™๋ฐ•์Šค**: ์ž๋™ ์ตœ์ ํ™”๊ฐ€ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š” ์—ฃ์ง€ ์ผ€์ด์Šค(๋ถˆ์•ˆ์ •ํ•œ ์ฐธ์กฐ ๋ฐ˜ํ™˜ ๋“ฑ)์— ๋Œ€ํ•œ ๊ฐœ๋ฐœ์ž์˜ ์ˆ˜๋™ ๋Œ€์‘ ํŒจํ„ด์ด ์—ฌ์ „ํžˆ ํ•„์š”ํ•˜๋‹ค. + +## ๐Ÿ”— ์ง€์‹ ์—ฐ๊ฒฐ (Graph) +- **Parent**: [[10_Wiki/Topics/Development]] +- **Related**: [[Feature-Sliced Design]], [[Zustand]], [[React Compiler]], [[Error Boundaries]] +- **Raw Source**: [[00_Raw/2025 ํ”„๋ก ํŠธ์—”๋“œ ์—”์ง€๋‹ˆ์–ด๋ง ํ‘œ์ค€ ํ™•๋ฆฝ]], [[00_Raw/๋Œ€๊ทœ๋ชจ React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ]], [[00_Raw/Modern React Application Development (2025)]] + +## ๐Ÿ’ป GitHub ๋™๊ธฐํ™” ์ž๋™ํ™” ์›Œํฌํ”Œ๋กœ์šฐ +1. Stage: git add . +2. Commit: `git commit -m "[P-Reinforce] Wikify Modern React Engineering Standard 2025"` +3. Push: `git push origin main` diff --git a/10_Wiki/Topics_Blog/Modern_React_Engineering_2025.md b/10_Wiki/Topics_Blog/Modern_React_Engineering_2025.md new file mode 100644 index 00000000..639bf010 --- /dev/null +++ b/10_Wiki/Topics_Blog/Modern_React_Engineering_2025.md @@ -0,0 +1,50 @@ +--- +id: 5e8f4a2b-1c9d-4e8b-a2f3-7d9e1c6b4a2d +category: "[[10_Wiki/Topics/Development]]" +confidence_score: 0.95 +tags: [react, frontend, engineering, standard, 2025, performance, architecture] +last_reinforced: 2026-05-01 +github_commit: "initial-wikification" +--- + +# [[Modern React & Frontend Engineering Standard (2025)]] + +## ๐Ÿ“Œ ํ•œ ์ค„ ํ†ต์ฐฐ (The Karpathy Summary) +> 2025๋…„์˜ ํ”„๋ก ํŠธ์—”๋“œ ์—”์ง€๋‹ˆ์–ด๋ง์€ ๋‹จ์ˆœํ•œ UI ๊ฐœ๋ฐœ์„ ๋„˜์–ด, FSD ์•„ํ‚คํ…์ฒ˜, ๋นŒ๋“œ ํƒ€์ž„ ์ž๋™ํ™”(React Compiler), ๊ทธ๋ฆฌ๊ณ  ๋ชฉ์ ๋ณ„๋กœ ํŒŒํŽธํ™”๋œ ์ƒํƒœ ๊ด€๋ฆฌ ์ฒด๊ณ„๋ฅผ ํ†ตํ•ด ํ™•์žฅ์„ฑ๊ณผ ์•ˆ์ •์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•˜๋Š” ์ •๊ตํ•œ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ ์—”์ง€๋‹ˆ์–ด๋ง์œผ๋กœ ์ง„ํ™”ํ–ˆ๋‹ค. + +## ๐Ÿ“– ๊ตฌ์กฐํ™”๋œ ์ง€์‹ (Synthesized Content) + +### 1. ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์•„ํ‚คํ…์ฒ˜: Feature-Sliced Design (FSD) +- **๊ณ„์ธต์  ๊ตฌ์กฐํ™”**: `app` -> `pages` -> `widgets` -> `features` -> `entities` -> `shared` ์ˆœ์˜ ๋ ˆ์ด์–ด๋ง์„ ํ†ตํ•ด ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋ถ„๋ฆฌํ•œ๋‹ค. +- **๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ**: ์ƒ์œ„ ๋ ˆ์ด์–ด๋Š” ํ•˜์œ„ ๋ ˆ์ด์–ด๋งŒ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฐ•์ œํ•˜์—ฌ ์ˆœํ™˜ ์ฐธ์กฐ๋ฅผ ์›์ฒœ ์ฐจ๋‹จํ•˜๊ณ  ๋ชจ๋“ˆ ๊ฐ„ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ˜๋‹ค. +- **Public API (index.ts)**: ๊ฐ ์Šฌ๋ผ์ด์Šค๋Š” `index.ts`๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์™ธ๋ถ€์™€ ์†Œํ†ตํ•˜์—ฌ ๋‚ด๋ถ€ ๊ตฌํ˜„์„ ์บก์Аํ™”ํ•œ๋‹ค. + +### 2. ์ƒํƒœ ๊ด€๋ฆฌ์˜ ์ „๋ฌธํ™” ๋ฐ ํŒŒํŽธํ™” +- **์„œ๋ฒ„ ์ƒํƒœ**: TanStack Query (React Query)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์บ์‹ฑ, ๋™๊ธฐํ™”, ๋น„๋™๊ธฐ ์ƒํƒœ๋ฅผ ์ „๋‹ด ๊ด€๋ฆฌํ•œ๋‹ค. +- **์ „์—ญ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒํƒœ**: Zustand๋ฅผ ํ™œ์šฉํ•˜์—ฌ Selector ๊ธฐ๋ฐ˜์˜ ์„ธ๋ฐ€ํ•œ ๋ฆฌ๋ Œ๋”๋ง ์ œ์–ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, Redux๋Š” ๋ณต์žก๋„๊ฐ€ ๊ทน๋„๋กœ ๋†’์€ ๋Œ€๊ทœ๋ชจ ํ˜‘์—… ํ™˜๊ฒฝ์—์„œ๋งŒ ์ œํ•œ์ ์œผ๋กœ ์ฑ„ํƒํ•œ๋‹ค. +- **๋กœ์ปฌ ๋ฐ UI ์ƒํƒœ**: `useState`, `useReducer`, ๋˜๋Š” ์ •์ ์ธ ์„ค์ •๊ฐ’์˜ ๊ฒฝ์šฐ `Context API`๋ฅผ ์ ์žฌ์ ์†Œ์— ๋ฐฐ์น˜ํ•œ๋‹ค. + +### 3. ์„ฑ๋Šฅ ์—”์ง€๋‹ˆ์–ด๋ง (Build & Runtime) +- **Vite & ESM**: ๊ธฐ์กด ๋ฒˆ๋“ค๋Ÿฌ ๋Œ€๋น„ ๋น„์•ฝ์ ์œผ๋กœ ๋น ๋ฅธ HMR๊ณผ ๊ฐœ๋ฐœ ์„œ๋ฒ„ ์†๋„๋ฅผ ๋ณด์žฅํ•œ๋‹ค. +- **React Compiler**: ๋นŒ๋“œ ํƒ€์ž„์— AST ๋ถ„์„์„ ํ†ตํ•ด `useMemo`, `useCallback` ๋“ฑ์„ ์ž๋™์œผ๋กœ ์ฃผ์ž…ํ•˜์—ฌ ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์˜ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค. +- **์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…**: `React.lazy`์™€ Vite์˜ `manualChunks` ์„ค์ •์„ ํ†ตํ•ด ๋ผ์šฐํŠธ ๋‹จ์œ„๋กœ ๋ฒˆ๋“ค์„ ์ชผ๊ฐœ์–ด ์ดˆ๊ธฐ ๋กœ๋”ฉ ์†๋„(LCP)๋ฅผ ๊ฐœ์„ ํ•œ๋‹ค. + +### 4. ์šด์˜ ํšŒ๋ณต์„ฑ ๋ฐ ๊ฑฐ๋ฒ„๋„Œ์Šค +- **Error Boundaries**: ํŠน์ • ์ปดํฌ๋„ŒํŠธ์˜ ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๊ฐ€ ์ „์ฒด ์•ฑ ์ค‘๋‹จ(White Screen)์œผ๋กœ ๋ฒˆ์ง€์ง€ ์•Š๋„๋ก ๊ตฌํš๋ณ„๋กœ ์•ˆ์ „์žฅ์น˜๋ฅผ ๋ฐฐ์น˜ํ•œ๋‹ค. +- **Observability**: Sentry, LogRocket ๋“ฑ์„ ์—ฐ๋™ํ•˜์—ฌ ์‹ค์ œ ์‚ฌ์šฉ์ž์˜ ์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด ๋ฐ ์—๋Ÿฌ ๋กœ๊ทธ๋ฅผ ์‹ค์‹œ๊ฐ„ ๋ชจ๋‹ˆํ„ฐ๋งํ•œ๋‹ค. +- **์—„๊ฒฉํ•œ ์ปจ๋ฒค์…˜**: `kebab-case`(ํŒŒ์ผ๋ช…), `PascalCase`(์ปดํฌ๋„ŒํŠธ), `camelCase`(ํ›…/๋ณ€์ˆ˜) ๋„ค์ด๋ฐ์„ ์ž๋™ํ™” ํ›…(Husky, ESLint)์œผ๋กœ ๊ฐ•์ œํ•œ๋‹ค. + +## โš ๏ธ ๋ชจ์ˆœ ๋ฐ ์—…๋ฐ์ดํŠธ (Contradictions & RL Update) +- **๋ฉ”๋ชจ์ด์ œ์ด์…˜์˜ ํ•จ์ •**: `React.memo`์˜ ์–•์€ ๋น„๊ต ๋น„์šฉ์ด ์‹ค์ œ ๋ Œ๋”๋ง ๋น„์šฉ๋ณด๋‹ค ํด ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, React Profiler ์ธก์ • ์—†๋Š” ๋ฌด๋ถ„๋ณ„ํ•œ ์ตœ์ ํ™”๋Š” ์ง€์–‘ํ•ด์•ผ ํ•œ๋‹ค. +- **FSD vs Flat Structure**: ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” FSD๊ฐ€ ์˜ค๋ฒ„์—”์ง€๋‹ˆ์–ด๋ง์ด ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํŒ€์˜ ์ˆ™๋ จ๋„์— ๋”ฐ๋ผ `shared` ๋ ˆ์ด์–ด ๋น„๋Œ€ํ™” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. +- **Compiler ๋ธ”๋ž™๋ฐ•์Šค**: ์ž๋™ ์ตœ์ ํ™”๊ฐ€ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š” ์—ฃ์ง€ ์ผ€์ด์Šค(๋ถˆ์•ˆ์ •ํ•œ ์ฐธ์กฐ ๋ฐ˜ํ™˜ ๋“ฑ)์— ๋Œ€ํ•œ ๊ฐœ๋ฐœ์ž์˜ ์ˆ˜๋™ ๋Œ€์‘ ํŒจํ„ด์ด ์—ฌ์ „ํžˆ ํ•„์š”ํ•˜๋‹ค. + +## ๐Ÿ”— ์ง€์‹ ์—ฐ๊ฒฐ (Graph) +- **Parent**: [[10_Wiki/Topics/Development]] +- **Related**: [[Feature-Sliced Design]], [[Zustand]], [[React Compiler]], [[Error Boundaries]] +- **Raw Source**: [[00_Raw/2025 ํ”„๋ก ํŠธ์—”๋“œ ์—”์ง€๋‹ˆ์–ด๋ง ํ‘œ์ค€ ํ™•๋ฆฝ]], [[00_Raw/๋Œ€๊ทœ๋ชจ React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ]], [[00_Raw/Modern React Application Development (2025)]] + +## ๐Ÿ’ป GitHub ๋™๊ธฐํ™” ์ž๋™ํ™” ์›Œํฌํ”Œ๋กœ์šฐ +1. Stage: git add . +2. Commit: `git commit -m "[P-Reinforce] Wikify Modern React Engineering Standard 2025"` +3. Push: `git push origin main` diff --git a/10_Wiki/Topics_GD/Modern_React_Engineering_2025.md b/10_Wiki/Topics_GD/Modern_React_Engineering_2025.md new file mode 100644 index 00000000..639bf010 --- /dev/null +++ b/10_Wiki/Topics_GD/Modern_React_Engineering_2025.md @@ -0,0 +1,50 @@ +--- +id: 5e8f4a2b-1c9d-4e8b-a2f3-7d9e1c6b4a2d +category: "[[10_Wiki/Topics/Development]]" +confidence_score: 0.95 +tags: [react, frontend, engineering, standard, 2025, performance, architecture] +last_reinforced: 2026-05-01 +github_commit: "initial-wikification" +--- + +# [[Modern React & Frontend Engineering Standard (2025)]] + +## ๐Ÿ“Œ ํ•œ ์ค„ ํ†ต์ฐฐ (The Karpathy Summary) +> 2025๋…„์˜ ํ”„๋ก ํŠธ์—”๋“œ ์—”์ง€๋‹ˆ์–ด๋ง์€ ๋‹จ์ˆœํ•œ UI ๊ฐœ๋ฐœ์„ ๋„˜์–ด, FSD ์•„ํ‚คํ…์ฒ˜, ๋นŒ๋“œ ํƒ€์ž„ ์ž๋™ํ™”(React Compiler), ๊ทธ๋ฆฌ๊ณ  ๋ชฉ์ ๋ณ„๋กœ ํŒŒํŽธํ™”๋œ ์ƒํƒœ ๊ด€๋ฆฌ ์ฒด๊ณ„๋ฅผ ํ†ตํ•ด ํ™•์žฅ์„ฑ๊ณผ ์•ˆ์ •์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•˜๋Š” ์ •๊ตํ•œ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ ์—”์ง€๋‹ˆ์–ด๋ง์œผ๋กœ ์ง„ํ™”ํ–ˆ๋‹ค. + +## ๐Ÿ“– ๊ตฌ์กฐํ™”๋œ ์ง€์‹ (Synthesized Content) + +### 1. ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์•„ํ‚คํ…์ฒ˜: Feature-Sliced Design (FSD) +- **๊ณ„์ธต์  ๊ตฌ์กฐํ™”**: `app` -> `pages` -> `widgets` -> `features` -> `entities` -> `shared` ์ˆœ์˜ ๋ ˆ์ด์–ด๋ง์„ ํ†ตํ•ด ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋ถ„๋ฆฌํ•œ๋‹ค. +- **๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ**: ์ƒ์œ„ ๋ ˆ์ด์–ด๋Š” ํ•˜์œ„ ๋ ˆ์ด์–ด๋งŒ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฐ•์ œํ•˜์—ฌ ์ˆœํ™˜ ์ฐธ์กฐ๋ฅผ ์›์ฒœ ์ฐจ๋‹จํ•˜๊ณ  ๋ชจ๋“ˆ ๊ฐ„ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ˜๋‹ค. +- **Public API (index.ts)**: ๊ฐ ์Šฌ๋ผ์ด์Šค๋Š” `index.ts`๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์™ธ๋ถ€์™€ ์†Œํ†ตํ•˜์—ฌ ๋‚ด๋ถ€ ๊ตฌํ˜„์„ ์บก์Аํ™”ํ•œ๋‹ค. + +### 2. ์ƒํƒœ ๊ด€๋ฆฌ์˜ ์ „๋ฌธํ™” ๋ฐ ํŒŒํŽธํ™” +- **์„œ๋ฒ„ ์ƒํƒœ**: TanStack Query (React Query)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์บ์‹ฑ, ๋™๊ธฐํ™”, ๋น„๋™๊ธฐ ์ƒํƒœ๋ฅผ ์ „๋‹ด ๊ด€๋ฆฌํ•œ๋‹ค. +- **์ „์—ญ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒํƒœ**: Zustand๋ฅผ ํ™œ์šฉํ•˜์—ฌ Selector ๊ธฐ๋ฐ˜์˜ ์„ธ๋ฐ€ํ•œ ๋ฆฌ๋ Œ๋”๋ง ์ œ์–ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, Redux๋Š” ๋ณต์žก๋„๊ฐ€ ๊ทน๋„๋กœ ๋†’์€ ๋Œ€๊ทœ๋ชจ ํ˜‘์—… ํ™˜๊ฒฝ์—์„œ๋งŒ ์ œํ•œ์ ์œผ๋กœ ์ฑ„ํƒํ•œ๋‹ค. +- **๋กœ์ปฌ ๋ฐ UI ์ƒํƒœ**: `useState`, `useReducer`, ๋˜๋Š” ์ •์ ์ธ ์„ค์ •๊ฐ’์˜ ๊ฒฝ์šฐ `Context API`๋ฅผ ์ ์žฌ์ ์†Œ์— ๋ฐฐ์น˜ํ•œ๋‹ค. + +### 3. ์„ฑ๋Šฅ ์—”์ง€๋‹ˆ์–ด๋ง (Build & Runtime) +- **Vite & ESM**: ๊ธฐ์กด ๋ฒˆ๋“ค๋Ÿฌ ๋Œ€๋น„ ๋น„์•ฝ์ ์œผ๋กœ ๋น ๋ฅธ HMR๊ณผ ๊ฐœ๋ฐœ ์„œ๋ฒ„ ์†๋„๋ฅผ ๋ณด์žฅํ•œ๋‹ค. +- **React Compiler**: ๋นŒ๋“œ ํƒ€์ž„์— AST ๋ถ„์„์„ ํ†ตํ•ด `useMemo`, `useCallback` ๋“ฑ์„ ์ž๋™์œผ๋กœ ์ฃผ์ž…ํ•˜์—ฌ ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์˜ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค. +- **์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…**: `React.lazy`์™€ Vite์˜ `manualChunks` ์„ค์ •์„ ํ†ตํ•ด ๋ผ์šฐํŠธ ๋‹จ์œ„๋กœ ๋ฒˆ๋“ค์„ ์ชผ๊ฐœ์–ด ์ดˆ๊ธฐ ๋กœ๋”ฉ ์†๋„(LCP)๋ฅผ ๊ฐœ์„ ํ•œ๋‹ค. + +### 4. ์šด์˜ ํšŒ๋ณต์„ฑ ๋ฐ ๊ฑฐ๋ฒ„๋„Œ์Šค +- **Error Boundaries**: ํŠน์ • ์ปดํฌ๋„ŒํŠธ์˜ ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๊ฐ€ ์ „์ฒด ์•ฑ ์ค‘๋‹จ(White Screen)์œผ๋กœ ๋ฒˆ์ง€์ง€ ์•Š๋„๋ก ๊ตฌํš๋ณ„๋กœ ์•ˆ์ „์žฅ์น˜๋ฅผ ๋ฐฐ์น˜ํ•œ๋‹ค. +- **Observability**: Sentry, LogRocket ๋“ฑ์„ ์—ฐ๋™ํ•˜์—ฌ ์‹ค์ œ ์‚ฌ์šฉ์ž์˜ ์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด ๋ฐ ์—๋Ÿฌ ๋กœ๊ทธ๋ฅผ ์‹ค์‹œ๊ฐ„ ๋ชจ๋‹ˆํ„ฐ๋งํ•œ๋‹ค. +- **์—„๊ฒฉํ•œ ์ปจ๋ฒค์…˜**: `kebab-case`(ํŒŒ์ผ๋ช…), `PascalCase`(์ปดํฌ๋„ŒํŠธ), `camelCase`(ํ›…/๋ณ€์ˆ˜) ๋„ค์ด๋ฐ์„ ์ž๋™ํ™” ํ›…(Husky, ESLint)์œผ๋กœ ๊ฐ•์ œํ•œ๋‹ค. + +## โš ๏ธ ๋ชจ์ˆœ ๋ฐ ์—…๋ฐ์ดํŠธ (Contradictions & RL Update) +- **๋ฉ”๋ชจ์ด์ œ์ด์…˜์˜ ํ•จ์ •**: `React.memo`์˜ ์–•์€ ๋น„๊ต ๋น„์šฉ์ด ์‹ค์ œ ๋ Œ๋”๋ง ๋น„์šฉ๋ณด๋‹ค ํด ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, React Profiler ์ธก์ • ์—†๋Š” ๋ฌด๋ถ„๋ณ„ํ•œ ์ตœ์ ํ™”๋Š” ์ง€์–‘ํ•ด์•ผ ํ•œ๋‹ค. +- **FSD vs Flat Structure**: ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” FSD๊ฐ€ ์˜ค๋ฒ„์—”์ง€๋‹ˆ์–ด๋ง์ด ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํŒ€์˜ ์ˆ™๋ จ๋„์— ๋”ฐ๋ผ `shared` ๋ ˆ์ด์–ด ๋น„๋Œ€ํ™” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. +- **Compiler ๋ธ”๋ž™๋ฐ•์Šค**: ์ž๋™ ์ตœ์ ํ™”๊ฐ€ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š” ์—ฃ์ง€ ์ผ€์ด์Šค(๋ถˆ์•ˆ์ •ํ•œ ์ฐธ์กฐ ๋ฐ˜ํ™˜ ๋“ฑ)์— ๋Œ€ํ•œ ๊ฐœ๋ฐœ์ž์˜ ์ˆ˜๋™ ๋Œ€์‘ ํŒจํ„ด์ด ์—ฌ์ „ํžˆ ํ•„์š”ํ•˜๋‹ค. + +## ๐Ÿ”— ์ง€์‹ ์—ฐ๊ฒฐ (Graph) +- **Parent**: [[10_Wiki/Topics/Development]] +- **Related**: [[Feature-Sliced Design]], [[Zustand]], [[React Compiler]], [[Error Boundaries]] +- **Raw Source**: [[00_Raw/2025 ํ”„๋ก ํŠธ์—”๋“œ ์—”์ง€๋‹ˆ์–ด๋ง ํ‘œ์ค€ ํ™•๋ฆฝ]], [[00_Raw/๋Œ€๊ทœ๋ชจ React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ]], [[00_Raw/Modern React Application Development (2025)]] + +## ๐Ÿ’ป GitHub ๋™๊ธฐํ™” ์ž๋™ํ™” ์›Œํฌํ”Œ๋กœ์šฐ +1. Stage: git add . +2. Commit: `git commit -m "[P-Reinforce] Wikify Modern React Engineering Standard 2025"` +3. Push: `git push origin main`