diff --git a/00_Raw/Agile Environments.md b/00_Raw/Agile Environments.md new file mode 100644 index 00000000..dbf3a829 --- /dev/null +++ b/00_Raw/Agile Environments.md @@ -0,0 +1,47 @@ +# [[Agile Environments]] + +## ๐Ÿ“Œ Brief Summary +Agile Environments(์• ์ž์ผ ํ™˜๊ฒฝ)๋Š” ์š”๊ตฌ์‚ฌํ•ญ์ด ์ง€์†์ ์œผ๋กœ ๋ณ€ํ™”ํ•˜๋Š” ํ”„๋กœ์ ํŠธ๋‚˜ ์Šคํƒ€ํŠธ์—… ํ™˜๊ฒฝ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค [1]. ์ด๋Ÿฌํ•œ ํ™˜๊ฒฝ์—์„œ๋Š” ๋ฏธ๋ž˜์— ํ•„์š”ํ• ์ง€๋„ ๋ชจ๋ฅด๋Š” ๋ณต์žกํ•œ ๊ธฐ๋Šฅ์„ ๋ฏธ๋ฆฌ ๊ฐœ๋ฐœํ•˜๊ธฐ๋ณด๋‹ค๋Š” ์˜ค์ง ํ˜„์žฌ์˜ ์š”๊ตฌ์‚ฌํ•ญ์— ์ง‘์ค‘ํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค [2]. ๋”ฐ๋ผ์„œ ๊ฐ ๊ธฐ๋Šฅ์„ ๋…๋ฆฝ์ ์œผ๋กœ ์ƒ์„ฑํ•˜๊ณ  ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์—ฐํ•˜๊ณ  ๋ชจ๋“ˆํ™”๋œ ์ ‘๊ทผ ๋ฐฉ์‹์ด ๋งค์šฐ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค [3]. + +## ๐Ÿ“– Core ์†Œ์Šค์— ๊ด€๋ จ ์ •๋ณด๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค.Content +์• ์ž์ผ ํ™˜๊ฒฝ(Agile Environments)๊ณผ ๊ด€๋ จํ•˜์—ฌ ์ œ๊ณต๋œ ์†Œ์Šค์—์„œ ๋‹ค๋ฃจ๊ณ  ์žˆ๋Š” ๊ตฌ์ฒด์ ์ธ ์„ค๋ช…์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. + +* **YAGNI ์›์น™์˜ ์ค‘์š”์„ฑ**: ์• ์ž์ผ ํ™˜๊ฒฝ์—์„œ๋Š” "You Aren't Gonna Need It (YAGNI)" ์›์น™์ด ํŠนํžˆ ํ•„์ˆ˜์ ์œผ๋กœ ์ž‘์šฉํ•ฉ๋‹ˆ๋‹ค [2]. ๋ณ€ํ™”ํ•˜๋Š” ์š”๊ตฌ์‚ฌํ•ญ์„ ๊ฐ€์ง„ ์Šคํƒ€ํŠธ์—…์ด๋‚˜ ์• ์ž์ผ ํ”„๋กœ์ ํŠธ์—์„œ๋Š”, ๋ฏธ๋ž˜์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๋Œ€๋น„ํ•˜์—ฌ ๋ณต์žกํ•œ ๊ธฐ๋Šฅ์„ ๋ฏธ๋ฆฌ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์„ ํ”ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [1, 2]. ๊ฐœ๋ฐœํŒ€์€ ์˜ค์ง ํ˜„์žฌ์˜ ์š”๊ตฌ์‚ฌํ•ญ์—๋งŒ ์ง‘์ค‘ํ•จ์œผ๋กœ์จ ๋‚˜์ค‘์— ์œ ์ง€๋ณด์ˆ˜ํ•ด์•ผ ํ•  ๋ณต์žก์„ฑ๊ณผ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์ฝ”๋“œ(dead code)์˜ ์–‘์„ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2]. +* **๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ(Feature-Based Structure)์˜ ์ ํ•ฉ์„ฑ**: ํ”„๋ก ํŠธ์—”๋“œ ์•„ํ‚คํ…์ฒ˜ ์ธก๋ฉด์—์„œ ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ํด๋” ๊ตฌ์กฐ๋Š” ์• ์ž์ผ ๊ฐœ๋ฐœ ๋ฐฉ๋ฒ•๋ก ๊ณผ ๋งค์šฐ ์ž˜ ๋งž์Šต๋‹ˆ๋‹ค [3]. ์ด ๊ตฌ์กฐ์—์„œ๋Š” ๊ฐ๊ฐ์˜ ๊ธฐ๋Šฅ(feature)์ด ๋…๋ฆฝ์ ์œผ๋กœ ๋ถ„๋ฆฌ๋˜์–ด ์ƒ์„ฑ ๋ฐ ๊ตฌํ˜„๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์• ์ž์ผ ํ™˜๊ฒฝ์—์„œ ์š”๊ตฌํ•˜๋Š” ์œ ์—ฐ์„ฑ๊ณผ ๋ณ‘๋ ฌ์ ์ธ ๊ฐœ๋ฐœ์„ ํšจ๊ณผ์ ์œผ๋กœ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค [3]. +* *์ฐธ๊ณ : ์ฃผ์–ด์ง„ ์†Œ์Šค์—๋Š” ๊ฐœ๋ฐœ ์›์น™(YAGNI) ๋ฐ ํด๋” ๊ตฌ์กฐ(Feature-Based)์™€ ์• ์ž์ผ์˜ ์—ฐ๊ด€์„ฑ๋งŒ ์–ธ๊ธ‰๋˜์–ด ์žˆ์œผ๋ฉฐ, ์Šคํฌ๋Ÿผ์ด๋‚˜ ์Šคํ”„๋ฆฐํŠธ ๋“ฑ ์• ์ž์ผ ํ™˜๊ฒฝ ์ž์ฒด์˜ ์ „๋ฐ˜์ ์ธ ํ”„๋กœ์„ธ์Šค๋‚˜ ์ด๋ก ์— ๋Œ€ํ•ด์„œ๋Š” ์†Œ์Šค์— ๊ด€๋ จ ์ •๋ณด๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค.* + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts +- [[YAGNI]] + - ์—ฐ๊ฒฐ ์ด์œ : ์• ์ž์ผ ํ™˜๊ฒฝ์—์„œ ๋ฏธ๋ž˜์˜ ๋ถˆํ™•์‹คํ•œ ๊ธฐ๋Šฅ์„ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์ง€ ์•Š๊ณ  ํ˜„์žฌ์˜ ์š”๊ตฌ์‚ฌํ•ญ์— ์ง‘์ค‘ํ•˜๋„๋ก ์ด๋„๋Š” ๊ฐ€์žฅ ํ•ต์‹ฌ์ ์ธ ๊ฐœ๋ฐœ ์›์น™์ž…๋‹ˆ๋‹ค [1, 2]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์• ์ž์ผ ํ™˜๊ฒฝ์—์„œ ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ(Dead Code)์˜ ์ƒ์„ฑ์„ ๋ฐฉ์ง€ํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜ ๋น„์šฉ์„ ์ตœ์†Œํ™”ํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ํŒ๋‹จ ๊ธฐ์ค€์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2]. +- [[Feature-Based Structure]] + - ์—ฐ๊ฒฐ ์ด์œ : ์• ์ž์ผ ๋ฐฉ๋ฒ•๋ก ๊ณผ ๊ฐ€์žฅ ์ž˜ ์–ด์šธ๋ฆฌ๋Š” ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด์œผ๋กœ, ์ฝ”๋“œ ๋ฒ ์ด์Šค๋ฅผ ๊ธฐ๋Šฅ ๋‹จ์œ„๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ๋…๋ฆฝ์ ์ธ ๊ฐœ๋ฐœ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค [3]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์• ์ž์ผ ํŒ€์ด ์š”๊ตฌ์‚ฌํ•ญ ๋ณ€๊ฒฝ์— ๋งž์ถฐ ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ์„ ๋…๋ฆฝ์ ์œผ๋กœ ํ™•์žฅํ•˜๊ณ  ๊ฐœ๋ฐœํ•  ๋•Œ ํŒŒ์ผ๊ณผ ํด๋”๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑํ•ด์•ผ ํ•˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3]. +- [[Startup Projects]] + - ์—ฐ๊ฒฐ ์ด์œ : ์• ์ž์ผ ํ™˜๊ฒฝ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์š”๊ตฌ์‚ฌํ•ญ์ด ์ง€์†์ ์œผ๋กœ ๋ณ€ํ™”ํ•˜๋Š” ํŠน์„ฑ์„ ๊ณต์œ ํ•˜๋ฉฐ, YAGNI ์›์น™์ด ๊ฐ•ํ•˜๊ฒŒ ์ ์šฉ๋˜๋Š” ๋Œ€ํ‘œ์ ์ธ ๋น„์ฆˆ๋‹ˆ์Šค ํ™˜๊ฒฝ์ž…๋‹ˆ๋‹ค [1]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์• ์ž์ผ ์›์น™์ด ์‹ค๋ฌด์—์„œ ์–ด๋– ํ•œ ํ˜•ํƒœ์˜ ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๋‚˜ ์ƒํ™ฉ(๋น ๋ฅธ ๋ณ€ํ™”์™€ ์œ ์—ฐ์„ฑ ์š”๊ตฌ)์—์„œ ์ฃผ๋กœ ์ฑ„ํƒ๋˜๋Š”์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1]. + +### Deeper Research Questions +- ์• ์ž์ผ ํ™˜๊ฒฝ์—์„œ YAGNI ์›์น™์„ ์—„๊ฒฉํ•˜๊ฒŒ ์ ์šฉํ•˜์—ฌ ๋‹น์žฅ์˜ ๊ธฐ๋Šฅ๋งŒ ๊ฐœ๋ฐœํ•  ๋•Œ, ํ–ฅํ›„ ์‹œ์Šคํ…œ์ด ํ™•์žฅ๋˜๋ฉด์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ์ˆ  ๋ถ€์ฑ„(Technical Debt)๋Š” ์–ด๋–ป๊ฒŒ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋Š”๊ฐ€? +- ์š”๊ตฌ์‚ฌํ•ญ์ด ๋Š์ž„์—†์ด ๋ณ€ํ™”ํ•˜๋Š” ์• ์ž์ผ ํ”„๋กœ์ ํŠธ์—์„œ Feature-Based Structure๊ฐ€ ๊ธฐ์กด์˜ ํŒŒ์ผ ์œ ํ˜• ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ(File-Type Based Structure)๋ณด๋‹ค ํŒ€ ํ˜‘์—… ๋ฐ ์œ ์ง€๋ณด์ˆ˜์— ์œ ๋ฆฌํ•œ ๊ตฌ์ฒด์  ์ด์œ ๋Š” ๋ฌด์—‡์ธ๊ฐ€? +- ์Šคํƒ€ํŠธ์—… ํ”„๋กœ์ ํŠธ์˜ ์ดˆ๊ธฐ ๋‹จ๊ณ„์—์„œ ์• ์ž์ผ ์›์น™(YAGNI, KISS ๋“ฑ)์„ ์ ์šฉํ•  ๋•Œ์™€, ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ํ™˜๊ฒฝ์œผ๋กœ ํ™•์žฅ(Scaling)๋  ๋•Œ ์•„ํ‚คํ…์ฒ˜ ์›์น™(SOLID ๋“ฑ)์˜ ์ ์šฉ ๋น„์ค‘์€ ์–ด๋–ป๊ฒŒ ๋ณ€ํ™”ํ•ด์•ผ ํ•˜๋Š”๊ฐ€? +- ๊ธฐ๋Šฅ(Feature)์„ ๋…๋ฆฝ์ ์œผ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ฐœ๋ฐœํ•˜๋Š” ์• ์ž์ผ ํ™˜๊ฒฝ์—์„œ, ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ ๊ฐ„์— ๊ณต์œ ๋˜๋Š” ๊ต์ฐจ ์˜์กด์„ฑ(Cross-cutting concerns)์€ ๊ตฌ์กฐ์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•ด์•ผ ํ•˜๋Š”๊ฐ€? +- ์• ์ž์ผ ํ™˜๊ฒฝ์˜ 'ํ˜„์žฌ ์š”๊ตฌ์‚ฌํ•ญ์— ๋Œ€ํ•œ ์ง‘์ค‘'๊ณผ '์žฅ๊ธฐ์ ์ธ ์†Œํ”„ํŠธ์›จ์–ด ์•„ํ‚คํ…์ฒ˜์˜ ๊ฒฌ๊ณ ํ•จ' ์‚ฌ์ด์˜ ๊ท ํ˜•์„ ๋งž์ถ”๊ธฐ ์œ„ํ•œ ๊ฐœ๋ฐœ ๊ฑฐ๋ฒ„๋„Œ์Šค๋Š” ์–ด๋–ป๊ฒŒ ๊ตฌ์ถ•ํ•ด์•ผ ํ•˜๋Š”๊ฐ€? + +### Practical Application Contexts +- **Implementation:** ์ฃผ์–ด์ง„ ์Šคํ† ๋ฆฌ๋‚˜ ํƒœ์Šคํฌ์˜ ์š”๊ตฌ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ตœ์†Œํ•œ์˜ ์ฝ”๋“œ๋งŒ ์šฐ์„ ์ ์œผ๋กœ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค (์˜ค๋ฒ„์—”์ง€๋‹ˆ์–ด๋ง ๊ธˆ์ง€) [2]. +- **System Design:** ํ”„๋กœ์ ํŠธ ํด๋”์™€ ๋ชจ๋“ˆ์„ ๊ธฐ๋Šฅ(Feature)์„ ์ค‘์‹ฌ์œผ๋กœ ์„ค๊ณ„ํ•˜์—ฌ, ์š”๊ตฌ์‚ฌํ•ญ์ด ๋ณ€๊ฒฝ๋˜๋”๋ผ๋„ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ์ตœ์†Œํ™”ํ•˜๊ณ  ๋…๋ฆฝ์ ์ธ ๋ฐฐํฌ ๋ฐ ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค [3]. +- **Operation / Maintenance:** ์–ธ์  ๊ฐ€ ์“ฐ์ผ ๊ฒƒ์ด๋ผ ์˜ˆ์ƒํ•˜๊ณ  ์ž‘์„ฑํ•œ ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ๋ฅผ ๋ฐฐ์ œํ•จ์œผ๋กœ์จ, ์šด์˜ ๋‹จ๊ณ„์—์„œ ํŒ€์ด ๊ด€๋ฆฌํ•˜๊ณ  ํŒŒ์•…ํ•ด์•ผ ํ•  ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ์˜ ๋ณต์žก์„ฑ์„ ๋Œ€ํญ ๋‚ฎ์ถฅ๋‹ˆ๋‹ค [2]. +- **Learning Path:** ์• ์ž์ผ ํ™˜๊ฒฝ์— ํ•ฉ๋ฅ˜ํ•˜๊ธฐ ์œ„ํ•ด YAGNI ์›์น™์˜ ์ ์šฉ๋ฒ•๊ณผ Feature-Sliced Design๊ณผ ๊ฐ™์€ ์ตœ์‹  ๊ธฐ๋Šฅ ๋‹จ์œ„์˜ ๋ชจ๋“ˆํ˜• ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด์„ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค [2, 3]. +- **My Project Relevance:** ์žฆ์€ ๊ธฐํš ๋ณ€๊ฒฝ์ด ์˜ˆ์ƒ๋˜๋Š” ์ดˆ๊ธฐ ๋‹จ๊ณ„์˜ ์Šคํƒ€ํŠธ์—… ํ”„๋กœ์ ํŠธ๋‚˜ ์• ์ž์ผ ์กฐ์ง์„ ์„ธํŒ…ํ•  ๋•Œ, ์ดˆ๊ธฐ ๊ฐœ๋ฐœ ์†๋„๋ฅผ ๋†’์ด๋ฉด์„œ๋„ ๋ณ€๊ฒฝ์— ์œ ์—ฐํ•˜๊ฒŒ ๋Œ€์‘ํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ€์ด๋“œ๋ผ์ธ์œผ๋กœ ์ง๊ฒฐ๋ฉ๋‹ˆ๋‹ค [1, 3]. + +### Adjacent Topics +- [[SOLID Principles]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ์• ์ž์ผ ํ™˜๊ฒฝ์—์„œ ๋‹น์žฅ์˜ ๊ธฐ๋Šฅ์„ ๋‹จ์ˆœํ•˜๊ฒŒ ๊ฐœ๋ฐœ(YAGNI)ํ•˜๋ฉด์„œ๋„, ์žฅ๊ธฐ์ ์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ทœ๋ชจ๊ฐ€ ์ปค์กŒ์„ ๋•Œ ์ฝ”๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ์œ ์ง€๋ณด์ˆ˜ ๊ฐ€๋Šฅํ•˜๊ฒŒ ์„ค๊ณ„ํ• ์ง€ ๊ฐ์ฒด ์ง€ํ–ฅ์ /๊ตฌ์กฐ์  ๊ด€์ ์—์„œ ์ดํ•ด๋ฅผ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1, 4]. +- [[Clean Code]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋น ๋ฅธ ๋ณ€ํ™”์™€ ๋ฐ˜๋ณต ๊ฐœ๋ฐœ(Iteration)์ด ์ผ์–ด๋‚˜๋Š” ์• ์ž์ผ ํ™˜๊ฒฝ ์†์—์„œ, ์—ฌ๋Ÿฌ ๋ช…์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ฝ”๋“œ๋ฅผ ์‰ฝ๊ฒŒ ์ฝ๊ณ  ํ˜‘์—…ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ธฐ๋ณธ์ ์ธ ์ฝ”๋“œ ํ’ˆ์งˆ ์œ ์ง€ ๊ธฐ๋ฒ•์œผ๋กœ ํ™•์žฅ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค [4, 5]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Branching Strategies.md b/00_Raw/Branching Strategies.md new file mode 100644 index 00000000..0c39642f --- /dev/null +++ b/00_Raw/Branching Strategies.md @@ -0,0 +1,71 @@ +# [[Branching Strategies]] + +## ๐Ÿ“Œ Brief ์†ŒSummary +Branching Strategies(๋ธŒ๋žœ์นญ ์ „๋žต)๋Š” ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ ์ฝ”๋“œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ด€๋ฆฌํ•˜๊ณ  ํŒ€์› ๊ฐ„์˜ ํ˜‘์—…์„ ์กฐ์œจํ•˜๊ธฐ ์œ„ํ•ด ๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ(Git ๋“ฑ)์—์„œ ๋ธŒ๋žœ์น˜๋ฅผ ์ƒ์„ฑ, ๋ณ‘ํ•ฉ, ์œ ์ง€๋ณด์ˆ˜ํ•˜๋Š” ๊ทœ์น™๊ณผ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ํŒ€์˜ ๊ทœ๋ชจ์™€ ํ”„๋กœ์ ํŠธ ์š”๊ตฌ์‚ฌํ•ญ์— ๋”ฐ๋ผ Git Flow, GitHub Flow, Trunk-Based Development, Feature Branch Workflow ๋“ฑ ๋‹ค์–‘ํ•œ ์ „๋žต์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋ช…ํ™•ํ•œ ๋ธŒ๋žœ์นญ ์ „๋žต์˜ ๋„์ž…์€ ๋ฉ”์ธ ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•˜๊ณ  ๋ณ‘ํ•ฉ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๋ฉฐ ์ฝ”๋“œ ๋ฆฌ๋ทฐ์™€ ์ถ”์ ์„ฑ์„ ๊ฐ•ํ™”ํ•˜๋Š” ํ•ต์‹ฌ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค [1-3]. + +## ๐Ÿ“– Core Content +* **์ฃผ์š” ๋ธŒ๋žœ์นญ ์ „๋žต ์œ ํ˜•** + * **Feature Branch Workflow (๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜ ์›Œํฌํ”Œ๋กœ์šฐ):** 2~5๋ช… ๊ทœ๋ชจ์˜ ์†Œ๊ทœ๋ชจ ํŒ€์— ๊ฐ€์žฅ ์ดˆ๋ณด์ž ์นœํ™”์ ์ด๊ณ  ์ถฉ๋Œ์ด ์ ์€ ์›Œํฌํ”Œ๋กœ์šฐ์ž…๋‹ˆ๋‹ค [4]. `main` ๋ธŒ๋žœ์น˜๋Š” ํ•ญ์ƒ ์•ˆ์ •์ ์ด๊ณ  ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋ฉฐ, ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด๋‚˜ ๋ฒ„๊ทธ ์ˆ˜์ • ์‹œ `main`์—์„œ ํŒŒ์ƒ๋œ ์งง์€ ์ˆ˜๋ช…์˜ ๋ธŒ๋žœ์น˜๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค [5]. ๊ฐœ๋ฐœ ์™„๋ฃŒ ํ›„ Pull Request(PR)๋ฅผ ์—ด๊ณ  ์ตœ์†Œ 1๋ช… ์ด์ƒ์˜ ๋™๋ฃŒ ๋ฆฌ๋ทฐ์™€ ํ…Œ์ŠคํŠธ๋ฅผ ๊ฑฐ์นœ ํ›„ Squash Merge ๋ฐฉ์‹์œผ๋กœ ๋ณ‘ํ•ฉํ•ฉ๋‹ˆ๋‹ค [6, 7]. + * **Trunk-Based Development (ํŠธ๋ ํฌ ๊ธฐ๋ฐ˜ ๊ฐœ๋ฐœ):** ๊ฐ•๋ ฅํ•œ CI(์ง€์†์  ํ†ตํ•ฉ) ํ™˜๊ฒฝ์„ ๊ฐ–์ถ˜ ์ˆ™๋ จ๋œ ํŒ€์— ์ ํ•ฉํ•œ ๊ฐ€๋ฒผ์šด ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค [8, 9]. ์ˆ˜๋ช…์ด ๋งค์šฐ ์งง์€ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์— ์ž‘์€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ž์ฃผ ์ปค๋ฐ‹ํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์ตœ์†Œํ™”๋˜๊ณ  ํ”ผ๋“œ๋ฐฑ์ด ๋น ๋ฅด๋ฉฐ ๋Œ€๊ทœ๋ชจ ๋ณ‘ํ•ฉ ์ถฉ๋Œ์„ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [8, 10]. + * **Git Flow:** ์ •๊ธฐ์ ์ธ ๋ฆด๋ฆฌ์Šค ์ผ์ •์„ ๊ฐ€์ง„ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค [9]. ํ•˜์ง€๋งŒ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜ ์™ธ์—๋„ `develop`, `release` ๋“ฑ ๊ด€๋ฆฌํ•ด์•ผ ํ•  ๋ธŒ๋žœ์น˜๊ฐ€ ๋งŽ์•„ ์†Œ๊ทœ๋ชจ ํŒ€์—๊ฒŒ๋Š” ๋ฌด๊ฒ๊ณ  ๊ณผ๋„ํ•œ ๋ณต์žก์„ฑ์„ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [9, 11, 12]. + * **GitHub Flow:** `main` ๋ธŒ๋žœ์น˜๋กœ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜๋ฅผ ์ง์ ‘ ๋ณ‘ํ•ฉํ•˜๋Š” ๋‹จ์ˆœํ™”๋œ ๊ตฌ์กฐ๋กœ, Git Flow๋ณด๋‹ค ๋น ๋ฅด๊ณ  ์ง€์†์ ์ธ ๋ฐฐํฌ ํ™˜๊ฒฝ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค [11, 13]. + +* **๋ชจ๋“  ์ „๋žต์— ์ ์šฉ๋˜๋Š” ๋ชจ๋ฒ” ์‚ฌ๋ก€ (Best Practices)** + * **ํ‹ฐ์ผ“ ID ๋ฐ ๋ช…๋ช… ๊ทœ์น™ ์‚ฌ์šฉ:** ๋ธŒ๋žœ์น˜ ์ด๋ฆ„๊ณผ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€์— ์š”๊ตฌ์‚ฌํ•ญ ์ถ”์ ์„ ์œ„ํ•œ ํ‹ฐ์ผ“ ID(์˜ˆ: `feature/PROJ-123-user-auth`)๋ฅผ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [14, 15]. ๋ธŒ๋žœ์น˜ ์ด๋ฆ„์€ ์ผ€๋ฐฅ ์ผ€์ด์Šค(kebab-case)๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์งง๊ณ  ๋ช…ํ™•ํ•˜๊ฒŒ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค [16, 17]. + * **์›์ž์  ์ปค๋ฐ‹ (Atomic Commits):** ํ•˜๋‚˜์˜ ์ปค๋ฐ‹์—๋Š” ํ•˜๋‚˜์˜ ๋…ผ๋ฆฌ์  ๋ณ€๊ฒฝ ์‚ฌํ•ญ๋งŒ ํฌํ•จํ•˜์—ฌ ์ฝ”๋“œ ๋ฆฌ๋ทฐ์™€ ํžˆ์Šคํ† ๋ฆฌ ์ถ”์ ์„ ๋‹จ์ˆœํ™”ํ•ฉ๋‹ˆ๋‹ค [7, 18]. + * **Conventional Commits ๊ทœ์น™:** ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๋Š” `feat:`, `fix:`, `chore:` ๋“ฑ์˜ ํ‘œ์ค€ํ™”๋œ ์ ‘๋‘์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€๊ฒฝ์˜ ๋ชฉ์ ์„ ๋ช…ํ™•ํžˆ ํ•ฉ๋‹ˆ๋‹ค [19-21]. + * **PR ๋ฐ ๋ณ‘ํ•ฉ ๊ทœ์น™:** ์ฝ”๋“œ๋ฅผ ์ ˆ๋Œ€ `main`์— ์ง์ ‘ ํ‘ธ์‹œํ•ด์„œ๋Š” ์•ˆ ๋˜๋ฉฐ, ๋ฐ˜๋“œ์‹œ PR์„ ํ†ตํ•œ ๋ฆฌ๋ทฐ๋ฅผ ๊ฑฐ์ณ์•ผ ํ•ฉ๋‹ˆ๋‹ค [6, 22]. ๋ณ‘ํ•ฉ ํ›„์—๋Š” ์‚ฌ์šฉ์ด ๋๋‚œ ๋ธŒ๋žœ์น˜๋ฅผ ์ฆ‰์‹œ ์‚ญ์ œํ•˜์—ฌ ์ €์žฅ์†Œ๋ฅผ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค [6, 23]. + +* **์ „๋žต ๊ฐ„ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋ฐฉ๋ฒ•** + * ํ”„๋กœ์ ํŠธ๊ฐ€ ๋ณ€ํ™”ํ•จ์— ๋”ฐ๋ผ ์ „๋žต๋„ ์ง„ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํ†ตํ•ฉ ์†๋„๋ฅผ ๋†’์ด๋ ค๋ฉด Feature Branch์—์„œ Trunk-Based(๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ ์‚ฌ์šฉ ๋ฐ ์ˆ˜๋ช… ๋‹จ์ถ•)๋กœ ์ „ํ™˜ํ•˜๊ณ , ๋” ๋งŽ์€ ์ฒด๊ณ„๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด GitHub Flow์—์„œ Git Flow(`develop` ๋ธŒ๋žœ์น˜ ๋ฐ ๋ฆด๋ฆฌ์Šค ๋ธŒ๋žœ์น˜ ์ถ”๊ฐ€)๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [11, 12]. + +## โš–๏ธ Trade-offs & Caveats +* **๊ตฌ์กฐ์  ์˜ค๋ฒ„ํ—ค๋“œ vs. ์•ˆ์ •์„ฑ:** Git Flow๋Š” ๊ตฌ์กฐ๊ฐ€ ๋ช…ํ™•ํ•˜๊ณ  ์ •๊ธฐ์ ์ธ ๋ฆด๋ฆฌ์Šค์— ๊ฐ•์ ์ด ์žˆ์ง€๋งŒ, ๋ธŒ๋žœ์น˜์˜ ์ˆ˜๊ฐ€ ๋งŽ์•„ ์œ ์ง€๋ณด์ˆ˜ ๋น„์šฉ(์˜ค๋ฒ„ํ—ค๋“œ)์ด ๋†’์Šต๋‹ˆ๋‹ค [9]. ๋ฐ˜๋ฉด Feature Branch๋‚˜ Trunk-Based ๋ฐฉ์‹์€ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ฐ€๋ฒผ์šด ๋Œ€์‹  ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์˜ ๋ณดํ˜ธ(`main` ๋ธŒ๋žœ์น˜ ์ง์ ‘ ํ‘ธ์‹œ ๊ธˆ์ง€, ์—„๊ฒฉํ•œ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๋“ฑ) ๊ทœ์น™์ด ๊ฐ•์ œ๋˜์ง€ ์•Š์œผ๋ฉด ์ฝ”๋“œ๊ฐ€ ์‰ฝ๊ฒŒ ๊นจ์งˆ ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค [6, 22]. +* **๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜์˜ ์ˆ˜๋ช…(Long-lived branches) ๋ฌธ์ œ:** ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜๋‚˜ GitHub Flow๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ, ๋ธŒ๋žœ์น˜์˜ ์ˆ˜๋ช…์ด ๋ช‡ ์ฃผ ์ด์ƒ ๊ธธ์–ด์ง€๋ฉด ๋‹ค๋ฅธ ์ž‘์—…์ž์™€์˜ ์ฝ”๋“œ ๋ถ„๊ธฐ๊ฐ€ ์‹ฌํ•ด์ ธ ๊ฑฐ๋Œ€ํ•œ ๋ณ‘ํ•ฉ ์ถฉ๋Œ(Merge conflicts)์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [17]. ๋”ฐ๋ผ์„œ ๋งค์ผ `main`์˜ ์ตœ์‹  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ Pull ํ•˜๊ฑฐ๋‚˜ Rebaseํ•˜์—ฌ ์ถฉ๋Œ์„ ์˜ˆ๋ฐฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [7]. +* **Trunk-Based ๊ฐœ๋ฐœ์˜ ์˜์กด์„ฑ:** ๋น ๋ฅธ ๋ณ‘ํ•ฉ์„ ์ง€ํ–ฅํ•˜๋Š” Trunk-Based Development๋Š” ์ง€์†์ ์ด๊ณ  ์ž๋™ํ™”๋œ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ(CI)๊ณผ ๋ฏธ์™„์„ฑ ๊ธฐ๋Šฅ์„ ํ”„๋กœ๋•์…˜์—์„œ ์ˆจ๊ธฐ๊ธฐ ์œ„ํ•œ ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ(Feature Flags) ๊ตฌํ˜„ ๋“ฑ ๊ธฐ์ˆ ์  ๋’ท๋ฐ›์นจ์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค [9, 11]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [๊ด€๊ณ„ ์œ ํ˜• A: ์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๋ฐฉ๋ฒ•๋ก ] +- [[Feature Branch Workflow]] + - ์—ฐ๊ฒฐ ์ด์œ : ์†Œ๊ทœ๋ชจ 3~5์ธ ๊ฐœ๋ฐœ ํŒ€์— ๊ฐ€์žฅ ์ถ”์ฒœ๋˜๋Š” ๋‹จ์ˆœํ•˜๊ณ  ์ง๊ด€์ ์ธ ๋ธŒ๋žœ์นญ ์ „๋žต์˜ ๊ธฐ๋ฐ˜ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ฉ”์ธ ๋ธŒ๋žœ์น˜๋ฅผ ์˜ค์—ผ์‹œํ‚ค์ง€ ์•Š๊ณ  ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ๊ฒฉ๋ฆฌ๋œ ํ™˜๊ฒฝ์—์„œ ๊ฐœ๋ฐœํ•˜๊ณ  ๋ณ‘ํ•ฉํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก ์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[Trunk-Based Development]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋ฌด๊ฑฐ์šด ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ํƒˆํ”ผํ•˜์—ฌ ๋ธŒ๋žœ์น˜ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๊ทนํ•œ์œผ๋กœ ์ค„์ด๊ณ  ๋น ๋ฅธ ํ†ตํ•ฉ์„ ์ค‘์‹œํ•˜๋Š” ์ตœ์‹  ํŠธ๋ Œ๋“œ ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: CI/CD ํ™˜๊ฒฝ์—์„œ์˜ ์žฆ์€ ์†Œ๊ทœ๋ชจ ๋ฐฐํฌ ๋ฐฉ์‹๊ณผ ์ถฉ๋Œ ์ตœ์†Œํ™” ์ „๋žต์„ ํ•™์Šตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[Git Flow]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋ธŒ๋žœ์นญ ์ „๋žต์˜ ๊ณ ์ „์ ์ด๊ณ  ์ฒด๊ณ„์ ์ธ ํ˜•ํƒœ๋กœ์„œ, ๋Œ€ํ˜• ํ”„๋กœ์ ํŠธ์˜ ์ •๊ธฐ์  ๋ฒ„์ €๋‹ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: `develop`, `release`, `hotfix` ๋“ฑ ๊ฐœ๋ฐœ ํŒŒ์ดํ”„๋ผ์ธ์— ๋”ฐ๋ฅธ ๋ธŒ๋žœ์น˜์˜ ์—ญํ•  ๋ถ„๋ฆฌ ๊ธฐ๋ฒ•์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +#### [๊ด€๊ณ„ ์œ ํ˜• B: ๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ ๋ฐ ๊ทœ์น™] +- [[Pull Request & Code Review]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋ธŒ๋žœ์นญ ์ „๋žต์ด ์•ˆ์ „ํ•˜๊ฒŒ ๋™์ž‘ํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋“  ๋ณ‘ํ•ฉ ์ „์— ํ•„์ˆ˜์ ์œผ๋กœ ๊ฑฐ์ณ์•ผ ํ•˜๋Š” ํ’ˆ์งˆ ๊ฒ€์ฆ ๊ด€๋ฌธ์ž…๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํŒ€์› ๊ฐ„์˜ ๋น„๋™๊ธฐ์  ํ”ผ๋“œ๋ฐฑ ์ˆ˜๋ ด, ์‹œ๊ฐ์  ๊ฒ€์ฆ, ๊ทธ๋ฆฌ๊ณ  CI ํ†ต๊ณผ๋ฅผ ์ „์ œ๋กœ ํ•œ ์•ˆ์ „ํ•œ ๋ณ‘ํ•ฉ ๊ณผ์ •์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[Conventional Commits]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋ธŒ๋žœ์น˜ ๋ณ‘ํ•ฉ ๋‚ด์—ญ์„ ์ถ”์ ํ•˜๊ณ  ๊ฐ€๋…์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ์ „ ์„ธ๊ณ„์ ์œผ๋กœ ํ†ต์šฉ๋˜๋Š” ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ์ž‘์„ฑ ํ‘œ์ค€์ž…๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: `feat(scope): message` ์™€ ๊ฐ™์€ ํ˜•์‹์˜ ๊ตฌ๋ฌธ์„ ํ†ตํ•ด ์ฝ”๋“œ ํžˆ์Šคํ† ๋ฆฌ ํŒŒ์•… ๋ฐ ๋ฌธ์„œ ์ž๋™ํ™”๋ฅผ ์–ด๋–ป๊ฒŒ ์ด๋ฃฐ ์ˆ˜ ์žˆ๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### Deeper Research Questions +- Trunk-Based Development๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด ํ•„์ˆ˜์ ์ธ ์ž๋™ํ™” ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ(CI)๊ณผ ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ(Feature flags)์˜ ๊ตฌํ˜„ ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? +- ์†Œ๊ทœ๋ชจ ํŒ€์ด ๋‹จ์ผ `main` ๋ธŒ๋žœ์น˜ ์ „๋žต์„ ์‚ฌ์šฉํ•  ๋•Œ, ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๋ฒ„๊ทธ๊ฐ€ ๋ฐฐํฌ๋˜๋Š” ๊ฒƒ์„ ๋ง‰๊ธฐ ์œ„ํ•œ GitHub ์ €์žฅ์†Œ์˜ ๋ธŒ๋žœ์น˜ ๋ณดํ˜ธ ๊ทœ์น™(Branch Protection Rules) ์ตœ์ ํ™” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? +- ์žฅ๊ธฐ ์ฒด๋ฅ˜ ๋ธŒ๋žœ์น˜(Long-lived branch)์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๊ฑฐ๋Œ€ํ•œ ๋ณ‘ํ•ฉ ์ถฉ๋Œ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด `main` ๋ธŒ๋žœ์น˜์˜ ์ตœ์‹  ๋‚ด์šฉ์„ ๊ฐ€์ ธ์˜ฌ ๋•Œ `merge`์™€ `rebase` ์ค‘ ์–ด๋–ค ๋ฐฉ์‹์ด ์ด๋ ฅ ๊ด€๋ฆฌ์— ๋” ํšจ๊ณผ์ ์ธ๊ฐ€? +- ์›์ž์  ์ปค๋ฐ‹(Atomic Commits)์„ ๊ฐ•์ œํ•˜๋Š” ์ •์ฑ…์ด Pull Request ๋ฆฌ๋ทฐ ์‹œ๊ฐ„๊ณผ ๋ฒ„๊ทธ ์ถ”์ ์„ฑ์— ์–ด๋– ํ•œ ์ •๋Ÿ‰์ /์ •์„ฑ์  ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”๊ฐ€? +- Git Flow ๋ฐฉ์‹์—์„œ GitHub Flow ๋ฐฉ์‹์œผ๋กœ ํŒ€์˜ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ๋•Œ ์˜ˆ์ƒ๋˜๋Š” ํ˜ผ๋ž€ ์š”์†Œ์™€ ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ CI/CD ํŒŒ์ดํ”„๋ผ์ธ์˜ ์žฌ๊ตฌ์„ฑ ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? + +### Practical Application Contexts +- **Implementation:** ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ์„ ์‹œ์ž‘ํ•  ๋•Œ, ์ตœ์‹  `main` ๋ธŒ๋žœ์น˜์—์„œ `feature/ํ‹ฐ์ผ“ID-๊ฐ„๋‹จํ•œ-์„ค๋ช…` ์ด๋ฆ„์œผ๋กœ ๋ธŒ๋žœ์น˜๋ฅผ ํŒŒ์ƒํ•˜๊ณ , ์›์ž์  ๋‹จ์œ„๋กœ ์ž‘์€ ์ปค๋ฐ‹์„ ์ž์ฃผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. +- **System Design:** ํ”„๋ก ํŠธ์—”๋“œ ๋ชจ๋“ˆ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ ์‹œ, ๋…๋ฆฝ์ ์ธ ํ”ผ์ฒ˜(Feature) ํด๋”๋ณ„๋กœ ๋ธŒ๋žœ์น˜๋ฅผ ๋‚˜๋ˆ„์–ด ๊ฐœ๋ฐœํ•จ์œผ๋กœ์จ ํŠน์ • ์ฝ”๋“œ ์˜์—ญ ๋ฐ–์œผ๋กœ ๋ณ‘ํ•ฉ ์ถฉ๋Œ์˜ ํญ๋ฐœ ๋ฐ˜๊ฒฝ(Blast radius)์ด ํผ์ง€์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. +- **Operation / Maintenance:** ๋ธŒ๋žœ์น˜๊ฐ€ `main`์œผ๋กœ ๋ณ‘ํ•ฉ๋˜๋Š” ์ฆ‰์‹œ GitHub Action ๋“ฑ CI ์„œ๋ฒ„์—์„œ ์ž๋™์œผ๋กœ ๋ฆฐํŠธ(ESLint), ํ…Œ์ŠคํŠธ(Jest), ํฌ๋งทํŒ…์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ๋ฐฉ์–ด๋ง‰์„ ๊ตฌ์ถ•ํ•˜์—ฌ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์˜ ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋ฅผ ์˜๊ตฌ์ ์œผ๋กœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. +- **Learning Path:** Git์˜ ๊ธฐ์ดˆ ๋ช…๋ น์–ด๋ฅผ ์Šต๋“ํ•œ ํ›„, ์†Œ๊ทœ๋ชจ ํŒ€ ๋‹จ์œ„์˜ Feature Branch Workflow๋ฅผ ์‹ค์Šตํ•˜๊ณ , ์ดํ›„ CI/CD ๋„๊ตฌ๋ฅผ ์—ฐ๋™ํ•œ Trunk-Based ํ™˜๊ฒฝ์œผ๋กœ ๋ฐœ์ „ํ•˜๋Š” ์ˆœ์„œ๋กœ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค. +- **My Project Relevance:** 3~5์ธ ๊ทœ๋ชจ์˜ ํ”„๋กœ์ ํŠธ์—์„œ ๋ฌด๊ฑฐ์šด Git Flow์˜ ๋„์ž…์„ ์ง€์–‘ํ•˜๊ณ , '๋‹จ๊ธฐ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜ โ†’ PR ๋ฐ 1์ธ ์ด์ƒ ํ”ผ์–ด ๋ฆฌ๋ทฐ ์Šน์ธ โ†’ Squash Merge ๋ฐ ๋ธŒ๋žœ์น˜ ์ฆ‰์‹œ ์‚ญ์ œ'๋ผ๋Š” ๋‹จ์ˆœํ™”๋œ ๋ฃฐ์„ ์ ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœ ์†๋„์™€ ์ฝ”๋“œ ํ’ˆ์งˆ์„ ๋™์‹œ์— ์ฑ™๊น๋‹ˆ๋‹ค. + +### Adjacent Topics +- [[Continuous Integration / Continuous Deployment (CI/CD)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋ธŒ๋žœ์นญ ์ „๋žต์— ์˜ํ•ด ํŠธ๋ฆฌ๊ฑฐ(Trigger)๋˜์–ด ์‹คํ–‰๋˜๋Š” ๋นŒ๋“œ, ํ…Œ์ŠคํŠธ, ๋ฐฐํฌ ํŒŒ์ดํ”„๋ผ์ธ์˜ ์ž๋™ํ™” ํ”„๋กœ์„ธ์Šค๋ฅผ ๊นŠ์ด ์•Œ์•„๋ด…๋‹ˆ๋‹ค. +- [[Feature-Sliced Design (FSD)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋„๋ฉ”์ธ๊ณผ ๊ธฐ๋Šฅ ๋‹จ์œ„๋กœ ์ฝ”๋“œ๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ํ”„๋ก ํŠธ์—”๋“œ ์•„ํ‚คํ…์ฒ˜ ๋ฐฉ๋ฒ•๋ก ์œผ๋กœ, ๋ธŒ๋žœ์น˜๋ฅผ ๊ธฐ๋Šฅ๋ณ„๋กœ ๋‚˜๋ˆŒ ๋•Œ ์ถฉ๋Œ์„ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ์ตœ์†Œํ™”ํ•˜๋Š” ์ฝ”๋“œ ๊ตฌ์กฐ ์„ค๊ณ„๋ฒ•์„ ํƒ๊ตฌํ•ฉ๋‹ˆ๋‹ค. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Code Review.md b/00_Raw/Code Review.md new file mode 100644 index 00000000..5436d57b --- /dev/null +++ b/00_Raw/Code Review.md @@ -0,0 +1,56 @@ +# [[Code Review]] + +## ๐Ÿ“Œ Brief Summary +์ฝ”๋“œ ๋ฆฌ๋ทฐ(Code Review)๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋ฅผ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์— ๋ณ‘ํ•ฉํ•˜๊ธฐ ์ „์— ํŒ€์›(๋™๋ฃŒ)์ด ๊ฒ€ํ† ํ•˜์—ฌ ์Šน์ธํ•˜๋Š” ํ’ˆ์งˆ ๊ด€๋ฆฌ ๋ฐ ํ˜‘์—… ํ”„๋กœ์„ธ์Šค์ž…๋‹ˆ๋‹ค [1, 2]. ์ฃผ๋กœ Pull Request(PR) ๋‹จ๊ณ„๋ฅผ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง€๋ฉฐ, ๋‹จ๋…์œผ๋กœ ์ž˜๋ชป๋œ ์ฝ”๋“œ๊ฐ€ ๋ณ‘ํ•ฉ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ณ  ํŒ€ ๋‚ด ๋น ๋ฅธ ํ”ผ๋“œ๋ฐฑ ๋ฃจํ”„๋ฅผ ํ˜•์„ฑํ•ฉ๋‹ˆ๋‹ค [1]. ์ตœ๊ทผ ํ”„๋ก ํŠธ์—”๋“œ ํ™˜๊ฒฝ์—์„œ๋Š” ๋‹จ์ˆœํ•œ ์ฝ”๋“œ ๊ฒ€ํ† ๋ฅผ ๋„˜์–ด Storybook๊ณผ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ CI ํŒŒ์ดํ”„๋ผ์ธ๊ณผ ๊ฒฐํ•ฉํ•œ '์‹œ๊ฐ์  ๋ฆฌ๋ทฐ(Visual Review)'๋กœ ํ™•์žฅ๋˜์–ด ์˜๋„์น˜ ์•Š์€ UI ๋ณ€๊ฒฝ์„ ๋ฐฉ์ง€ํ•˜๋Š” ์—ญํ• ๋„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค [3]. + +## ๐Ÿ“– Core ์†Œ์Šค์— ๊ธฐ๋ฐ˜ํ•œ Core Content +- **๋™๋ฃŒ ๊ฒ€ํ† (Peer Review)์˜ ์—ญํ•  ๋ฐ ์ด์ **: ๊ฐœ๋ฐœ์ž๋Š” ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜(feature branch)์—์„œ ์ž‘์—…์„ ๋งˆ์นœ ํ›„ ๋ณ‘ํ•ฉ์„ ์œ„ํ•œ Pull Request(PR)๋ฅผ ์ƒ์„ฑํ•˜๋ฉฐ, ์ด๋•Œ ์ตœ์†Œ 1๋ช… ์ด์ƒ์˜ ํŒ€์›์—๊ฒŒ ๊ฒ€ํ† ์™€ ์Šน์ธ์„ ๋ฐ›์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค [1, 4]. ๋ฆฌ๋ทฐ์–ด๋Š” ๋ณ€๊ฒฝ๋œ ์ฝ”๋“œ์— ๋Œ€ํ•ด ์ฝ”๋ฉ˜ํŠธ๋ฅผ ๋‚จ๊ธฐ๋ฉฐ, ์ž‘์„ฑ์ž๊ฐ€ ์ด๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  ์žฌํ‘ธ์‹œ(push)ํ•˜์—ฌ ์ตœ์ข… ์Šน์ธ์„ ๋ฐ›์œผ๋ฉด ๋ณ‘ํ•ฉ์ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค [5]. ์ด๋Š” ๋‹จ์ผ ๊ฐœ๋ฐœ์ž์˜ ์‹ค์ˆ˜๋กœ ์ธํ•œ ์ž˜๋ชป๋œ ๋ณ‘ํ•ฉ์„ ๋ง‰๊ณ , ํŒ€์› ๊ฐ„์˜ ๊ฑด์ „ํ•œ ๋ฆฌ๋ทฐ ์Šต๊ด€๊ณผ ํ˜‘์—…์„ ์ด‰์ง„ํ•ฉ๋‹ˆ๋‹ค [1, 6]. +- **ํšจ์œจ์ ์ธ PR ์—ํ‹ฐ์ผ“**: ์›ํ™œํ•œ ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ์œ„ํ•ด์„œ๋Š” PR์„ ์ž‘๊ฒŒ ์œ ์ง€ํ•˜๊ณ  ๋‹จ์ผ ์ž‘์—…(Single task)์— ์ง‘์ค‘ํ•˜๋Š” ๊ฒƒ์ด ๋ชจ๋ฒ” ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค [2]. ๋ฆฌ๋ทฐ์–ด๊ฐ€ ํ•œ ๋ฒˆ์— 2,000์ค„ ์ด์ƒ์˜ ๋ฐฉ๋Œ€ํ•œ ์ฝ”๋“œ๋ฅผ ๊ฒ€์‚ฌํ•˜๋„๋ก ์š”๊ตฌํ•ด์„œ๋Š” ์•ˆ ๋˜๋ฉฐ, PR ๊ทœ๋ชจ๊ฐ€ ์ž‘์„์ˆ˜๋ก ๋” ๋น ๋ฅด๊ณ  ์ฒ ์ €ํ•˜๊ฒŒ ๊ฒ€ํ† ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2, 7]. +- **์‹œ๊ฐ์  ๋ฆฌ๋ทฐ(Visual Review)์˜ ๋„์ž…**: ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์˜ PR ํ”„๋กœ์„ธ์Šค์—์„œ๋Š” ์ฝ”๋“œ์˜ ๋…ผ๋ฆฌ ๊ฒ€ํ† ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์‹œ๊ฐ์  ํšŒ๊ท€(Visual Regression) ๊ฒ€ํ† ๊ฐ€ ํ•„์ˆ˜๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค [3]. ๊ฐœ๋ฐœ์ž๋Š” Storybook์„ ํ™œ์šฉํ•ด ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ตฌ์ถ•ํ•˜๊ณ , Chromatic์ด๋‚˜ Happo ๋“ฑ์˜ ๋„๊ตฌ๋ฅผ CI ํŒŒ์ดํ”„๋ผ์ธ์— ํ†ตํ•ฉํ•ฉ๋‹ˆ๋‹ค [3, 8]. +- **์ž๋™ํ™”๋œ ์‹œ๊ฐ์  ํšŒ๊ท€ ๊ฐ์ง€**: PR์ด ์—ด๋ฆฌ๋ฉด ์ด ๋„๊ตฌ๋“ค์ด ์—ฌ๋Ÿฌ ๋ธŒ๋ผ์šฐ์ € ๋ฐ ๋ทฐํฌํŠธ ํ™˜๊ฒฝ์—์„œ ์ž๋™์œผ๋กœ ๋ชจ๋“  UI ์ƒํƒœ์˜ ์Šคํฌ๋ฆฐ์ƒท์„ ์บก์ฒ˜ํ•˜๊ณ  ์ด์ „ ๊ธฐ์ค€์„ (baseline)๊ณผ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค [9, 10]. ๋ ˆ์ด์•„์›ƒ์ด๋‚˜ ์ƒ‰์ƒ ๋“ฑ์— ์˜๋„์น˜ ์•Š์€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋ฐœ๊ฒฌ๋˜๋ฉด PR์— ํ•ด๋‹น ์‚ฌํ•ญ์ด ์ˆ˜๋™ ๊ฒ€ํ†  ๋Œ€์ƒ์œผ๋กœ ํ‘œ์‹œ(flagged)๋˜์–ด ๋ฒ„๊ทธ๊ฐ€ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์œผ๋กœ ๋ฐฐํฌ๋˜๋Š” ๊ฒƒ์„ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค [3]. ๋”๋ถˆ์–ด, ์‹œ๊ฐ์  ๊ฒ€ํ†  ๋„๊ตฌ๋Š” ์‹œ๊ฐ์  ๋ณ€๊ฒฝ ์‚ฌํ•ญ๊ณผ ํ•จ๊ป˜ ์ƒˆ๋กœ์šด ์ ‘๊ทผ์„ฑ ์œ„๋ฐ˜(accessibility violations)๊นŒ์ง€ ํฌ์ฐฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [9, 11]. + +## โš–๏ธ Trade-offs & Caveats +- **๋ฆฌ๋ทฐ ๋ณ‘๋ชฉ ํ˜„์ƒ ๋ฐ ๋ณต์žก๋„ ์ฆ๊ฐ€**: ํ•œ ๋ฒˆ์— ์ˆ˜์ฒœ ์ค„์— ๋‹ฌํ•˜๋Š” ํฐ ๊ทœ๋ชจ์˜ ์ฝ”๋“œ(PR)๋ฅผ ๋ฆฌ๋ทฐํ•˜๋„๋ก ์š”์ฒญํ•  ๊ฒฝ์šฐ, ๋ฆฌ๋ทฐ์–ด๊ฐ€ ์ฝ”๋“œ๋ฅผ ์ฒ ์ €ํžˆ ๊ฐ์‚ฌ(audit)ํ•˜๊ธฐ ์–ด๋ ค์›Œ ๋ฆฌ๋ทฐ ์†๋„์™€ ํ’ˆ์งˆ์ด ๋ชจ๋‘ ์ €ํ•˜๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [2]. ์ด๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” PR์„ ๋งค์šฐ ์ž‘๊ฒŒ ๋‚˜๋ˆ„์–ด ์ง€์†์ ์œผ๋กœ ๋ฆฌ๋ทฐํ•ด์•ผ ํ•˜๋ฏ€๋กœ, ๊ฐœ๋ฐœ์ž๋Š” ์ž‘์—… ๋‹จ์œ„๋ฅผ ์„ธ๋ฐ€ํ•˜๊ฒŒ ์ชผ๊ฐœ์•ผ ํ•˜๋Š” ์ถ”๊ฐ€์ ์ธ ๋…ธ๋ ฅ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค [2, 7]. +- **์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ์˜ ๋ถˆ์•ˆ์ •์„ฑ(Flake) ์ด์Šˆ**: ์‹œ๊ฐ์  ๋ฆฌ๋ทฐ๋ฅผ ์œ„ํ•ด ์Šคํฌ๋ฆฐ์ƒท ๊ธฐ๋ฐ˜ ํ…Œ์ŠคํŠธ๋ฅผ ๋„์ž…ํ•  ๋•Œ, ์ปดํฌ๋„ŒํŠธ์˜ ๊ธฐ๋Šฅ์  ๋ณ€๊ฒฝ์ด ์—†๋”๋ผ๋„ ์••์ถ• ๋…ธ์ด์ฆˆ, ์•ˆํ‹ฐ์•จ๋ฆฌ์–ด์‹ฑ, ๋น„๋™๊ธฐ ์—์…‹(ํฐํŠธ ๋“ฑ), ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋“ฑ์œผ๋กœ ์ธํ•ด ๋ฏธ์„ธํ•œ ํ”ฝ์…€ ์ฐจ์ด๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ์˜ค๋ฅ˜๋กœ ์ฒ˜๋ฆฌ๋˜๋Š” ๊ฑฐ์ง“ ์–‘์„ฑ(False positive) ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [8, 12]. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ƒ‰์ƒ ์˜ค์ฐจ ํ—ˆ์šฉ ๋ฒ”์œ„(color-delta tolerance)๋ฅผ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์Œ์†Œ๊ฑฐํ•˜๋Š” ๋“ฑ์˜ ์ถ”๊ฐ€์ ์ธ ๊ตฌ์„ฑ(Configuration)๊ณผ ๊ด€๋ฆฌ๊ฐ€ ์š”๊ตฌ๋ฉ๋‹ˆ๋‹ค [8, 12, 13]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [ํ˜‘์—… ๋ฐ ํ˜•์ƒ ๊ด€๋ฆฌ ์›Œํฌํ”Œ๋กœ์šฐ] +- [[Pull Request (PR)]] + - ์—ฐ๊ฒฐ ์ด์œ : ์ฝ”๋“œ ๋ฆฌ๋ทฐ๊ฐ€ ์‹ค์งˆ์ ์œผ๋กœ ์š”์ฒญ๋˜๊ณ , ๊ฒ€ํ†  ํ”ผ๋“œ๋ฐฑ์ด ์˜ค๊ฐ€๋Š” ํ•ต์‹ฌ ํ”Œ๋žซํผ์ด์ž ๋‹จ์œ„์ž…๋‹ˆ๋‹ค [1, 2]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ธŒ๋žœ์น˜ ๋ณ‘ํ•ฉ ์ „ ํ’ˆ์งˆ ๊ด€๋ฆฌ ๊ฒŒ์ดํŠธ๋กœ์„œ์˜ ๊ธฐ๋Šฅ๊ณผ ์งง๊ณ  ๋ช…ํ™•ํ•œ ์ž‘์—… ๋‹จ์œ„ ๋ถ„ํ• ์˜ ์ค‘์š”์„ฑ์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +- [[Feature Branch Workflow]] + - ์—ฐ๊ฒฐ ์ด์œ : ์ฝ”๋“œ ๋ฆฌ๋ทฐ ์‹œ์Šคํ…œ์„ ์‰ฝ๊ฒŒ ๋„์ž…ํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ด๊ณ  ์ถฉ๋Œ์ด ์ ์€ ๋ธŒ๋žœ์น˜ ์ „๋žต์ž…๋‹ˆ๋‹ค [14, 15]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ฉ”์ธ ๋ธŒ๋žœ์น˜๋ฅผ ํ•ญ์ƒ ์•ˆ์ •์ ์œผ๋กœ ์œ ์ง€ํ•˜๋ฉด์„œ, ๊ฐ๊ฐ์˜ ํƒœ์Šคํฌ๋ฅผ ๋…๋ฆฝ๋œ ๋ธŒ๋žœ์น˜์—์„œ ์ž‘์—…ํ•˜๊ณ  ๋ฆฌ๋ทฐ๋ฅผ ํ†ตํ•ด ๊ฒ€์ฆํ•˜๋Š” ์ „์ฒด ํ๋ฆ„์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +#### [์ž๋™ํ™” ๋ฐ ํ’ˆ์งˆ ๊ฒ€์ฆ ๋„๊ตฌ] +- [[Visual Regression Testing]] + - ์—ฐ๊ฒฐ ์ด์œ : ํ”„๋ก ํŠธ์—”๋“œ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ์‹œ ์œก์•ˆ์œผ๋กœ ํ™•์ธํ•˜๊ธฐ ํž˜๋“  ์˜๋„์น˜ ์•Š์€ ๋ ˆ์ด์•„์›ƒ/์ƒ‰์ƒ ๋ณ€๊ฒฝ์„ ์ž๋™ํ™” ๋„๊ตฌ๊ฐ€ ์‹œ๊ฐ์ ์œผ๋กœ ์ฐพ์•„๋‚ด์–ด ๋ฆฌ๋ทฐ์–ด์—๊ฒŒ ์ œ์‹œํ•ฉ๋‹ˆ๋‹ค [3, 9]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Chromatic์ด๋‚˜ Happo๋ฅผ CI ํŒŒ์ดํ”„๋ผ์ธ๊ณผ ๊ฒฐํ•ฉํ•˜์—ฌ PR ๋ฆฌ๋ทฐ์˜ ์ •ํ™•๋„๋ฅผ ๋†’์ด๊ณ  ์•ˆ์ •์ ์ธ UI๋ฅผ ๋ฐฐํฌํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### Deeper Research Questions + +- PR์˜ ํฌ๊ธฐ๋ฅผ ์ž‘๊ฒŒ ์œ ์ง€ํ•˜๊ณ  ๋‹จ์ผ ์ž‘์—…(Single task)์— ์ง‘์ค‘ํ•˜๋„๋ก ๋…ผ๋ฆฌ์ ์œผ๋กœ ์ž‘์—…์„ ๋ถ„ํ• ํ•˜๋Š” ๊ฐ€์žฅ ํšจ๊ณผ์ ์ธ ๋ฐฉ๋ฒ•๋ก ๊ณผ ๊ธฐ์ค€์€ ๋ฌด์—‡์ธ๊ฐ€? +- ๋Œ€๊ทœ๋ชจ ํŒ€์—์„œ ์Ÿ์•„์ง€๋Š” ์ˆ˜๋งŽ์€ PR๊ณผ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ์š”์ฒญ์„ ๋ณ‘๋ชฉ ํ˜„์ƒ ์—†์ด ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋ฐฐํฌ ์†๋„๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? +- ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ(Visual Regression Testing) ์‹œ ๋ฐœ์ƒํ•˜๋Š” ๋ฏธ์„ธํ•œ ๋ Œ๋”๋ง ์ฐจ์ด(Flake)๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ  ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ์ค€์„ (Baseline)์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๊ตฌ์ฒด์ ์ธ ๊ตฌ์„ฑ ์ตœ์ ํ™” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? +- ์ฝ”๋“œ ๋ฆฌ๋ทฐ ์‹œ ์‹œ๊ฐ์  ํšŒ๊ท€(Visual changes) ๊ฐ์ง€๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ์ ‘๊ทผ์„ฑ ํ…Œ์ŠคํŠธ(Accessibility tests)๋ฅผ ํ•จ๊ป˜ ์ž๋™ํ™”ํ–ˆ์„ ๋•Œ ์–ป๊ฒŒ ๋˜๋Š” ์ด์ ๊ณผ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋‚ด๋ถ€ ๋™์ž‘ ์›๋ฆฌ๋Š” ๋ฌด์—‡์ธ๊ฐ€? +- ๊ธฐ๋Šฅ ๋ถ„๊ธฐ(Feature branch)์˜ ์ˆ˜๋ช…์ด ๊ธธ์–ด์กŒ์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ฆฌ๋ทฐ ๋ฐ ๋ณ‘ํ•ฉ ์ถฉ๋Œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ , ์ง€์†์ ์œผ๋กœ ์งง์€ ์ฃผ๊ธฐ์˜ ๋ฆฌ๋ทฐ๋ฅผ ์œ ๋„ํ•˜๋Š” ๋ฌธํ™”๋Š” ์–ด๋–ป๊ฒŒ ์ •์ฐฉ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š”๊ฐ€? + +### Practical Application Contexts + +- **Implementation:** ์ฝ”๋“œ๋ฅผ ์ปค๋ฐ‹ํ•˜๊ณ  PR์„ ์ƒ์„ฑํ•  ๋•Œ, ๋ฆฌ๋ทฐ์–ด๊ฐ€ ์‰ฝ๊ฒŒ ์ฝ”๋“œ๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋„๋ก 200์ค„ ๋ฏธ๋งŒ์˜ ์ž‘์€ ๋‹จ์œ„๋กœ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ชผ๊ฐœ์–ด ์˜ฌ๋ฆฌ๊ณ  ๋ฌด์—‡์ด ์™œ ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€ ๋ช…ํ™•ํžˆ ๋ช…์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [2, 7]. +- **System Design:** ํ”„๋ก ํŠธ์—”๋“œ ์„ค๊ณ„ ์‹œ Storybook์„ ํ™œ์šฉํ•˜์—ฌ ๋ชจ๋“  UI ์ปดํฌ๋„ŒํŠธ์˜ ๋‹ค์–‘ํ•œ ์ƒํƒœ(loading, error ๋“ฑ)๋ฅผ ์บก์Аํ™”ํ•ด ๋‘๋ฉด, ์ฝ”๋“œ ๋ฆฌ๋ทฐ ์‹œ์— ์ด ์ƒํƒœ๋“ค์„ ์ž๋™์œผ๋กœ ์Šคํฌ๋ฆฐ์ƒท์œผ๋กœ ์ฐ์–ด ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ฐ˜ ์‹œ์Šคํ…œ์ด ๋งŒ๋“ค์–ด์ง‘๋‹ˆ๋‹ค [16]. +- **Operation / Maintenance:** CI/CD ํŒŒ์ดํ”„๋ผ์ธ ๋‹จ๊ณ„์— Chromatic์ด๋‚˜ Happo ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์—ฐ๋™์‹œ์ผœ, ํŒ€์›์ด PR์„ ์ƒ์„ฑํ•  ๋•Œ๋งˆ๋‹ค ์‹œ๊ฐ์  ๋ณ€๋™ ์‚ฌํ•ญ(diff)์ด๋‚˜ ์ ‘๊ทผ์„ฑ ์œ„๋ฐ˜ ๋‚ด์—ญ์ด PR ์ฒดํฌ ๋ฆฌ์ŠคํŠธ์— ๋ฐฐ์ง€๋กœ ์ž๋™ ๋ณด๊ณ ๋˜๋„๋ก ์šด์˜ ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•ฉ๋‹ˆ๋‹ค [17]. +- **Learning Path:** Git์˜ ๊ธฐ์ดˆ์ ์ธ ๋ธŒ๋žœ์น˜ ์‚ฌ์šฉ๋ฒ•์„ ๋ฐฐ์šด ํ›„, ํŒ€ ํ˜‘์—…์˜ ํ•ต์‹ฌ์ธ PR ์ƒ์„ฑ ๋ฐ ๋ฆฌ๋ทฐ ์š”์ฒญ ๊ณผ์ •(GitHub Flow ๋“ฑ)์„ ์ตํžˆ๊ณ , ๋‚˜์•„๊ฐ€ ์‹œ๊ฐ์  ํ…Œ์ŠคํŒ… ๋„๊ตฌ๊ฐ€ PR์— ์–ด๋–ป๊ฒŒ ํ”ผ๋“œ๋ฐฑ์„ ์ฃผ๋Š”์ง€๋ฅผ ์‹ค์Šตํ•ด๋ณด๋Š” ํ๋ฆ„์œผ๋กœ ํ•™์Šตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [8, 18]. +- **My Project Relevance:** ์†Œ๊ทœ๋ชจ 3์ธ ํŒ€ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•  ๋•Œ ๋ณต์žกํ•œ Git-Flow ๋Œ€์‹  ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์ฑ„ํƒํ•˜๊ณ , ์ฝ”๋“œ ๋ณ‘ํ•ฉ ์‹œ ๋ฐ˜๋“œ์‹œ 1๋ช… ์ด์ƒ์˜ ํ”ผ์–ด ๋ฆฌ๋ทฐ(Peer review)๋ฅผ ๋ฐ›๋„๋ก ๊ทœ์น™์„ ์ •ํ•ด ๋ฒ„๊ทธ ์—†๋Š” ์•ˆ์ •์  ๋ฉ”์ธ ๋ธŒ๋žœ์น˜๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1, 14]. + +### Adjacent Topics + +- [[Continuous Integration (CI)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: PR์ด ์˜ฌ๋ผ์™”์„ ๋•Œ ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ๋•๊ธฐ ์œ„ํ•ด ์‚ฌ์ „์— ํ…Œ์ŠคํŠธ ํ†ต๊ณผ ์—ฌ๋ถ€, ๋นŒ๋“œ ์„ฑ๊ณต ์—ฌ๋ถ€ ๋“ฑ์„ ์ž๋™์œผ๋กœ ๊ฒ€์‚ฌํ•ด์ฃผ๋Š” ์ž๋™ํ™” ํŒŒ์ดํ”„๋ผ์ธ์˜ ๊ตฌ์ถ•์— ๋Œ€ํ•ด ํ•™์Šตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [7, 19]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Code Splitting.md b/00_Raw/Code Splitting.md new file mode 100644 index 00000000..96aa31b1 --- /dev/null +++ b/00_Raw/Code Splitting.md @@ -0,0 +1,58 @@ +# [[Code Splitting]] + +## ๐Ÿ“Œ Brief Summary +ํฐ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค์„ ๋” ์ž‘์€ ์ฒญํฌ(chunk) ๋‹จ์œ„๋กœ ๋‚˜๋ˆ„์–ด ์‚ฌ์šฉ์ž๊ฐ€ ํ•„์š”๋กœ ํ•  ๋•Œ(on demand) ๋กœ๋“œํ•˜๋Š” ํ”„๋กœ์„ธ์Šค์ž…๋‹ˆ๋‹ค [1, 2]. ๋ชจ๋“  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋ฅผ ์ดˆ๊ธฐ์— ํ•œ ๋ฒˆ์— ๋‹ค์šด๋กœ๋“œํ•˜๋Š” ๋Œ€์‹ , ํ•„์š”ํ•œ ํŒŒ์ผ๋งŒ ๋จผ์ € ๋ถˆ๋Ÿฌ์˜ค๊ฒŒ ํ•˜์—ฌ ์ดˆ๊ธฐ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ๊ทน์ ์œผ๋กœ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2, 3]. ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ดˆ๊ธฐ ํŽ˜์ด์ง€ ๋กœ๋“œ ์†๋„๋ฅผ ํ–ฅ์ƒ์‹œํ‚ค๊ณ , ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ฒด๊ฐ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•˜๋Š” ํ•ต์‹ฌ์ ์ธ ํ”„๋ก ํŠธ์—”๋“œ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค [1, 4]. + +## ๐Ÿ“– Core Content +* **๋ผ์šฐํŠธ ๊ธฐ๋ฐ˜ ๋ถ„ํ•  (Route-level Code Splitting):** ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ด๊ณ  ํšจ๊ณผ์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ํŠน์ • ๋ผ์šฐํŠธ๋กœ ์ด๋™ํ•  ๋•Œ๋งŒ ํ•ด๋‹น ํŽ˜์ด์ง€์˜ ์ฝ”๋“œ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๋„๋ก ํ•˜์—ฌ ์ดˆ๊ธฐ ๋กœ๋”ฉ ์‹œ ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ ๋‹ค์šด๋กœ๋“œ๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค [1, 2, 5]. +* **์ปดํฌ๋„ŒํŠธ ์ˆ˜์ค€ ์ง€์—ฐ ๋กœ๋”ฉ (Component-level Lazy Loading):** ์ฐจํŠธ, ์ง€๋„, ๋ฆฌ์น˜ ํ…์ŠคํŠธ ์—๋””ํ„ฐ์ฒ˜๋Ÿผ ํฌ๊ณ  ๋ฌด๊ฑฐ์šด ์ปดํฌ๋„ŒํŠธ๋‚˜ ๋“œ๋ฌผ๊ฒŒ ์‚ฌ์šฉ๋˜๋Š” ๋ชจ๋‹ฌ, ์„ค์ • ํŒจ๋„ ๋“ฑ์„ ๋ Œ๋”๋ง์ด ํ•„์š”ํ•œ ์‹œ์ ์—๋งŒ ๋กœ๋“œํ•˜๋„๋ก ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค [6, 7]. React์—์„œ๋Š” `React.lazy()`์™€ ๋™์  ์ž„ํฌํŠธ(dynamic imports), ๊ทธ๋ฆฌ๊ณ  ``๋ฅผ ํ™œ์šฉํ•ด ์ด๋ฅผ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [4, 6, 8]. +* **๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ถ„ํ•  (Vendor Splitting):** Vite(๋‚ด๋ถ€์ ์œผ๋กœ Rollup ์‚ฌ์šฉ) ๋“ฑ์˜ ๋ฒˆ๋“ค๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ `manualChunks` ์˜ต์…˜์„ ํ†ตํ•ด React ์ฝ”์–ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜ ์ฐจํŠธ ๋“ฑ ๋ฌด๊ฑฐ์šด ๋ฒค๋” ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ ํŒŒ์ผ๋กœ ๋ถ„ํ• ํ•ฉ๋‹ˆ๋‹ค [5, 9, 10]. ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ž์ฃผ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ธŒ๋ผ์šฐ์ € ์บ์‹ฑ ํšจ์œจ์„ ๊ทน๋Œ€ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5, 11]. +* **๋ฒˆ๋“ค๋Ÿฌ์˜ ์ž๋™ํ™” ์ง€์›:** ์ตœ์‹  ๋ฒˆ๋“ค๋Ÿฌ(Webpack, Vite)๋Š” ์ฝ”๋“œ ๋‚ด์— ์ž‘์„ฑ๋œ ๋™์  ์ž„ํฌํŠธ(`import()`)๋ฅผ ๊ฐ์ง€ํ•˜๋ฉด ์ž๋™์œผ๋กœ ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ ์ฒญํฌ๋กœ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค [4, 6]. + +## โš–๏ธ Trade-offs & Caveats +* **ํ•„์ˆ˜ ์ปดํฌ๋„ŒํŠธ์— ๋Œ€ํ•œ ์˜ค๋‚จ์šฉ ๊ธˆ์ง€:** ํŽ˜์ด์ง€์— ์ฆ‰์‹œ ํ•„์š”ํ•œ ์Šคํฌ๋กค ์—†์ด ๋ณผ ์ˆ˜ ์žˆ๋Š”(above-the-fold) ํ•ต์‹ฌ ์ปดํฌ๋„ŒํŠธ๋‚˜, ๋ Œ๋”๋ง ์†๋„๊ฐ€ ๋นจ๋ผ์•ผ ํ•˜๋Š” ์š”์†Œ์—๋Š” ์ง€์—ฐ ๋กœ๋”ฉ๊ณผ ์ฝ”๋“œ ๋ถ„ํ• ์„ ํ”ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [7]. ์˜คํžˆ๋ ค ์ฒซ ํ™”๋ฉด์„ ๊ทธ๋ฆฌ๋Š” ์‹œ๊ฐ„์„ ์ง€์—ฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +* **์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ์ €ํ•˜ ๋ฐฉ์ง€ (Fallback UI ํ•„์š”):** ์ฝ”๋“œ๋ฅผ ๋™์ ์œผ๋กœ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋™์•ˆ ๋„คํŠธ์›Œํฌ ์ง€์—ฐ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ``๋ฅผ ์‚ฌ์šฉํ•ด ๋ชจ๋“ˆ์ด ๋กœ๋“œ๋˜๋Š” ๋™์•ˆ ์Šคํ”ผ๋„ˆ๋‚˜ ์Šค์ผˆ๋ ˆํ†ค๊ณผ ๊ฐ™์€ Fallback UI๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [5, 8]. +* **๋„คํŠธ์›Œํฌ ์š”์ฒญ ์ฆ๊ฐ€์˜ ์œ„ํ—˜:** ๋„ˆ๋ฌด ์ž˜๊ฒŒ ์ฝ”๋“œ๋ฅผ ๋ถ„ํ• ํ•˜๋ฉด ์˜คํžˆ๋ ค ์ˆ˜๋งŽ์€ ๋„คํŠธ์›Œํฌ ์š”์ฒญ์ด ๋ฐœ์ƒํ•ด ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ๋Š” `rollup-plugin-visualizer` ๋“ฑ์˜ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ด 500kB ์ด์ƒ์˜ ํฐ ์ฒญํฌ๋ฅผ ํƒ€๊ฒŸ์œผ๋กœ ์‹๋ณ„ํ•˜๊ณ  ์ ์ ˆํ•˜๊ฒŒ ๋ถ„ํ• ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [12, 13]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] +- [[Lazy Loading]] + - ์—ฐ๊ฒฐ ์ด์œ : ์ฝ”๋“œ ๋ถ„ํ• ์ด ๋ฒˆ๋“ค์„ ์ชผ๊ฐœ๋Š” ํ–‰์œ„๋ผ๋ฉด, ์ง€์—ฐ ๋กœ๋”ฉ(Lazy Loading)์€ ๊ทธ ์ชผ๊ฐœ์ง„ ์ฝ”๋“œ๋ฅผ ํ•„์š” ์‹œ์ ์— ๋กœ๋“œํ•˜๋Š” ๊ธฐ์ˆ ์  ๋ฐฉ๋ฒ•๋ก ์ž…๋‹ˆ๋‹ค [2, 3]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ถ„ํ• ๋œ ์ฝ”๋“œ๊ฐ€ ์–ธ์ œ ๋ธŒ๋ผ์šฐ์ €๋กœ ์ „์†ก๋˜๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋ณ‘ํ•ฉ๋˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [8]. +- [[Core Web Vitals]] + - ์—ฐ๊ฒฐ ์ด์œ : ์ฝ”๋“œ ๋ถ„ํ• ์„ ์ ์šฉํ•˜๋Š” ์ฃผ๋œ ์„ฑ๋Šฅ์  ๋ชฉ์ ์€ ์ดˆ๊ธฐ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰์„ ์ตœ์†Œํ™”ํ•˜์—ฌ LCP(Largest Contentful Paint)์™€ INP(Interaction to Next Paint) ๊ฐ™์€ ํ•ต์‹ฌ ์›น ์ง€ํ‘œ๋ฅผ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๋ฐ ์žˆ์Šต๋‹ˆ๋‹ค [1, 8, 14]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ตœ์ ํ™” ๊ฒฐ๊ณผ๊ฐ€ ์‹ค์ œ ์‚ฌ์šฉ์ž์˜ ์ฒด๊ฐ ์„ฑ๋Šฅ ๋ฐ ํŽ˜์ด์ง€ ์ธก์ • ์ง€ํ‘œ์— ์–ด๋–ป๊ฒŒ ๊ธ์ •์  ์˜ํ–ฅ์„ ์ฃผ๋Š”์ง€ ํ‰๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [15]. + +#### [๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ] +- [[React.lazy() and Suspense]] + - ์—ฐ๊ฒฐ ์ด์œ : React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ปดํฌ๋„ŒํŠธ ๋ ˆ๋ฒจ ๋ฐ ๋ผ์šฐํŠธ ๋ ˆ๋ฒจ์˜ ๋™์  ์ฝ”๋“œ ๋ถ„ํ• ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๊ณต์‹ API์ž…๋‹ˆ๋‹ค [6, 8]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋™์  ์ž„ํฌํŠธ ์ฒ˜๋ฆฌ ๊ณผ์ •์—์„œ์˜ ๋น„๋™๊ธฐ UI ๋ Œ๋”๋ง ํ๋ฆ„๊ณผ ์˜ˆ์™ธ(์ง€์—ฐ) ์ฒ˜๋ฆฌ ๋ฐฉ์‹์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5]. +- [[Vite (Rollup)]] + - ์—ฐ๊ฒฐ ์ด์œ : ๊ฐœ๋ฐœ ๋ฐ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฒˆ๋“ค๋งํ•˜๊ณ  ์‹ค์ œ ๋ฌผ๋ฆฌ์ ์ธ ์ฒญํฌ ํŒŒ์ผ๋“ค๋กœ ๋ถ„๋ฆฌํ•ด ๋‚ด๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค [9, 11]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ฒˆ๋“ค๋Ÿฌ์˜ `manualChunks` ์„ค์ •์„ ํ†ตํ•ด ์–ด๋–ป๊ฒŒ ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๋‚˜๋ˆ„์–ด ๋ธŒ๋ผ์šฐ์ € ์บ์‹ฑ์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5]. + +### Deeper Research Questions +- ๋ผ์šฐํŠธ ๊ธฐ๋ฐ˜ ๋ถ„ํ• ๊ณผ ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜ ๋ถ„ํ• ์„ ์–ด๋А ์ •๋„ ๋น„์œจ๋กœ ์ ์šฉํ•ด์•ผ ์ดˆ๊ธฐ ๋ Œ๋”๋ง ์„ฑ๋Šฅ๊ณผ ์ดํ›„ ํƒ์ƒ‰ ์‹œ์˜ ๋„คํŠธ์›Œํฌ ์ง€์—ฐ ๊ฐ„์˜ ๊ท ํ˜•์„ ์ด๋ฃฐ ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- Vite๋‚˜ Webpack ํ™˜๊ฒฝ์—์„œ `manualChunks`๋ฅผ ์„ค์ •ํ•  ๋•Œ, ๋ธŒ๋ผ์šฐ์ €์˜ HTTP/2 ๋ฐ HTTP/3 ๋‹ค์ค‘ํ™”(multiplexing) ํ™˜๊ฒฝ์„ ๊ณ ๋ คํ•œ ๊ฐ€์žฅ ์ด์ƒ์ ์ธ ์ฒญํฌ ๊ฐœ์ˆ˜์™€ ํฌ๊ธฐ๋Š” ๋ฌด์—‡์ธ๊ฐ€? +- ๋™์  ์ฒญํฌ(chunk)๋ฅผ ๋กœ๋“œํ•˜๋Š” ๋„์ค‘ ์‚ฌ์šฉ์ž์˜ ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ์ด ๋Š๊ธฐ๊ฑฐ๋‚˜ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ, React Error Boundaries์™€ ๊ฒฐํ•ฉํ•˜์—ฌ ์–ด๋–ป๊ฒŒ ์•ˆ์ •์ ์ธ Fallback ๊ฒฝํ—˜์„ ์„ค๊ณ„ํ•  ๊ฒƒ์ธ๊ฐ€? +- ์ฝ”๋“œ ๋ถ„ํ• ๋กœ ์ธํ•ด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ง€์—ฐ ๋กœ๋“œ๋  ๋•Œ, ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์˜์กดํ•˜๋Š” ์ƒํƒœ(Context, Zustand ๋“ฑ)๋Š” ๋กœ๋“œ ์‹œ์ ์— ์–ด๋–ป๊ฒŒ ๋™๊ธฐํ™”๋˜๋Š”๊ฐ€? +- Above-the-fold UI์— ์ž˜๋ชป ์ง€์—ฐ ๋กœ๋”ฉ์„ ์ ์šฉํ–ˆ์„ ๋•Œ LCP ์ ์ˆ˜์— ๋ฏธ์น˜๋Š” ์•…์˜ํ–ฅ์„ ํ™•์ธํ•˜๋ ค๋ฉด ๋ธŒ๋ผ์šฐ์ € ๊ฐœ๋ฐœ์ž ๋„๊ตฌ์˜ ์„ฑ๋Šฅ(Performance) ํŒจ๋„์—์„œ ์–ด๋–ค ์ง€ํ‘œ๋ฅผ ์ค‘์ ์ ์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋งํ•ด์•ผ ํ•˜๋Š”๊ฐ€? + +### Practical Application Contexts +- **Implementation:** React ์ฝ”๋“œ์—์„œ `import { Chart } from 'chart.js'`์™€ ๊ฐ™์€ ์ •์  ์ž„ํฌํŠธ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ , `const HeavyComponent = React.lazy(() => import('./HeavyComponent'))`๋กœ ๊ฐ์‹ธ์„œ ํŠน์ • ๋ฒ„ํŠผ์ด ๋ˆŒ๋ฆฌ๊ฑฐ๋‚˜ ๋ผ์šฐํŠธ๊ฐ€ ์ „ํ™˜๋  ๋•Œ ๋ Œ๋”๋ง๋˜๊ฒŒ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค [4, 6, 8]. +- **System Design:** ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ ์‹œ, ๋ชจ๋“  ์ฝ”๋“œ๊ฐ€ ํฌํ•จ๋œ ํ•˜๋‚˜์˜ `index.js` ๋ชจ๋†€๋ฆฌ์Šค ๋ฒˆ๋“ค ๋Œ€์‹ , Vite์˜ `vite.config.ts`์—์„œ `manualChunks` ์„ค์ •์„ ํ†ตํ•ด React ์ฝ”์–ด ๋ฐ ๋ฌด๊ฑฐ์šด ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ณ„๊ฐœ์˜ ์บ์‹ฑ ๊ฐ€๋Šฅํ•œ ์ฒญํฌ๋กœ ๋ถ„๋ฆฌํ•˜๋„๋ก ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค [5, 10]. +- **Operation / Maintenance:** CI/CD ํŒŒ์ดํ”„๋ผ์ธ์ด๋‚˜ ๋กœ์ปฌ ๋นŒ๋“œ ๊ณผ์ •์— `rollup-plugin-visualizer` ๋“ฑ์˜ ๋ฒˆ๋“ค ๋ถ„์„ ๋„๊ตฌ๋ฅผ ์—ฐ๊ฒฐํ•˜์—ฌ ์‹œ๊ฐ์  ํŠธ๋ฆฌ๋งต์„ ํ™•์ธํ•˜๊ณ , 500kB๋ฅผ ์ดˆ๊ณผํ•˜๋Š” ๊ฑฐ๋Œ€ ์ฒญํฌ๊ฐ€ ๋ฐœ๊ฒฌ๋˜๋ฉด ์ถ”๊ฐ€์ ์ธ ๋ถ„ํ•  ๋Œ€์ƒ์„ ์‹๋ณ„ํ•˜์—ฌ ์ตœ์ ํ™”ํ•ฉ๋‹ˆ๋‹ค [4, 12, 13]. +- **Learning Path:** ์šฐ์„  React์˜ ๋ฒˆ๋“ค๋ง ๊ฐœ๋…์„ ์ดํ•ดํ•œ ํ›„, ๋™์  ์ž„ํฌํŠธ ๊ตฌ๋ฌธ ํ™œ์šฉ -> `React.lazy()` ๋ฐ `` ์ ์šฉ -> ๋ผ์šฐํ„ฐ์— ์ฝ”๋“œ ๋ถ„ํ•  ๊ฒฐํ•ฉ -> ๋ฒˆ๋“ค ๋ถ„์„๊ธฐ ๋ฐ Core Web Vitals ์ธก์ •์„ ํ†ตํ•œ ํšจ๊ณผ ๊ฒ€์ฆ ์ˆœ์„œ๋กœ ์ง€์‹์„ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค [6, 8]. +- **My Project Relevance:** ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๊ฐ€ ์ปค์ง์— ๋”ฐ๋ผ ๋ฉ”์ธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค์ด ์ˆ˜ ๋ฉ”๊ฐ€๋ฐ”์ดํŠธ ๋‹จ์œ„๋กœ ๋ฌด๊ฑฐ์›Œ์ ธ ๋ชจ๋ฐ”์ผ ๊ธฐ๊ธฐ ๋“ฑ์—์„œ ๋กœ๋”ฉ ์†๋„ ์ €ํ•˜ ํ˜„์ƒ์ด ๋ณด์ผ ๊ฒฝ์šฐ, ์ฆ‰๊ฐ์ ์œผ๋กœ ๋ผ์šฐํŠธ ๊ธฐ๋ฐ˜ ์ฝ”๋“œ ๋ถ„ํ• ๊ณผ ์ฐจํŠธ/์—๋””ํ„ฐ ๋“ฑ ๋ฌด๊ฑฐ์šด UI์˜ ์ง€์—ฐ ๋กœ๋”ฉ์„ ๋„์ž…ํ•˜์—ฌ LCP ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3, 14, 16]. + +### Adjacent Topics +- [[Tree Shaking]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ์ฝ”๋“œ ๋ถ„ํ• ์ด ํ•„์š”ํ•œ ์ฝ”๋“œ๋ฅผ '์ชผ๊ฐœ์–ด' ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ์‹์ด๋ผ๋ฉด, ํŠธ๋ฆฌ ์‰์ดํ‚น์€ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์ฃฝ์€ ์ฝ”๋“œ(Dead Code) ์ž์ฒด๋ฅผ ๋ฒˆ๋“ค์—์„œ '์ œ๊ฑฐ'ํ•˜์—ฌ ์ดˆ๊ธฐ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ค„์ด๋Š” ์ƒํ˜ธ ๋ณด์™„์ ์ธ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค [17, 18]. +- [[Server Components (Next.js)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ์˜ ์ฝ”๋“œ ๋ถ„ํ• ์—์„œ ๋” ๋‚˜์•„๊ฐ€, ์•„์˜ˆ ์ •์ ์ธ UI ๋ Œ๋”๋ง์„ ์„œ๋ฒ„์—์„œ ์ฒ˜๋ฆฌํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ๋กœ ๋ณด๋‚ด๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค์˜ ์–‘ ์ž์ฒด๋ฅผ ํš๊ธฐ์ ์œผ๋กœ ์ค„์ด๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•˜๋Š” ์ตœ์‹  ์•„ํ‚คํ…์ฒ˜ ์ ‘๊ทผ๋ฒ•์ž…๋‹ˆ๋‹ค [19-21]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Concurrent Features.md b/00_Raw/Concurrent Features.md new file mode 100644 index 00000000..2c5c54ed --- /dev/null +++ b/00_Raw/Concurrent Features.md @@ -0,0 +1,56 @@ +# [[Concurrent Features]] + +## ๐Ÿ“Œ Brief Summary +Concurrent Features๋Š” React 18๋ถ€ํ„ฐ ๋„์ž…๋œ ๊ธฐ๋Šฅ์œผ๋กœ, ๋ Œ๋”๋ง ์ž‘์—…์„ ์ผ์‹œ ์ค‘์ง€(pause), ์ค‘๋‹จ(interrupt), ์žฌ๊ฐœ(resume)ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค [1]. ์ด๋ฅผ ํ†ตํ•ด ์ค‘์š”ํ•œ ์‚ฌ์šฉ์ž ์ƒํ˜ธ์ž‘์šฉ(ํด๋ฆญ, ํƒ€์ดํ•‘ ๋“ฑ)์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋†’์ด๊ณ , ์ƒ๋Œ€์ ์œผ๋กœ ๋А๋ฆฐ ์—…๋ฐ์ดํŠธ(๋Œ€์šฉ๋Ÿ‰ ํ•„ํ„ฐ๋ง ๋“ฑ)๋ฅผ ์ง€์—ฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1]. ๊ฒฐ๊ณผ์ ์œผ๋กœ ์•ฑ์˜ ์‹ค์ œ ์—ฐ์‚ฐ ์†๋„ ์ž์ฒด๋ฅผ ๋งˆ๋ฒ•์ฒ˜๋Ÿผ ๋น ๋ฅด๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ, ์ธ์ง€๋˜๋Š” ์†๋„(perceived speed)๋ฅผ ์ตœ์ ํ™”ํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ฐ˜์‘์„ฑ ์žˆ๊ฒŒ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค [2]. + +## ๐Ÿ“– Core Content +* **๋™์‹œ์„ฑ ๋ Œ๋”๋ง(Concurrent Rendering)์˜ ์›๋ฆฌ:** ์ตœ์‹  ๋ฒ„์ „์˜ React์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ, ๋ Œ๋”๋ง ์ž‘์—…์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ง€์ •ํ•˜์—ฌ ์ค‘์š”๋„๊ฐ€ ๋†’์€ ์ƒํ˜ธ์ž‘์šฉ์ด ๋ Œ๋”๋ง์— ์˜ํ•ด ์ฐจ๋‹จ(block)๋˜์ง€ ์•Š๊ณ  ์ฆ‰์‹œ ๋ฐ˜์‘ํ•˜๋„๋ก ๋•์Šต๋‹ˆ๋‹ค [1]. +* **`useTransition`์„ ํ†ตํ•œ ์šฐ์„ ์ˆœ์œ„ ์ œ์–ด:** ํŠน์ • ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋ฅผ '๊ธด๊ธ‰ํ•˜์ง€ ์•Š์€(non-urgent)' ๊ฒƒ์œผ๋กœ ํ‘œ์‹œํ•˜์—ฌ ์ง€์—ฐ์‹œํ‚ค๋Š” ํ›…(Hook)์ž…๋‹ˆ๋‹ค [3]. ์‹ค์‹œ๊ฐ„ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋‚˜ ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ ํ•„ํ„ฐ๋ง ์‹œ, ์‚ฌ์šฉ์ž์˜ ํƒ€์ดํ•‘ ๊ฐ™์€ ์ž…๋ ฅ์€ ์ฆ‰๊ฐ์ ์œผ๋กœ ๋ฐ˜์‘ํ•˜๊ฒŒ ํ•˜๋ฉด์„œ ๋ฌด๊ฑฐ์šด ๋ Œ๋”๋ง ์ฒ˜๋ฆฌ๋Š” ๋’ค๋กœ ๋ฏธ๋ฃฐ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3]. ๋˜ํ•œ `isPending` ์ƒํƒœ๋ฅผ ํ™œ์šฉํ•ด ์ž…๋ ฅ ์ฆ‰๊ฐ์„ฑ์„ ๋ง‰์ง€ ์•Š๊ณ  ๋กœ๋”ฉ ์Šคํ”ผ๋„ˆ๋‚˜ ์Šค์ผˆ๋ ˆํ†ค UI๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค [3]. +* **`useDeferredValue`๋ฅผ ํ†ตํ•œ ๊ฐ’ ์ฐธ์กฐ ์ง€์—ฐ:** `useTransition`์ด ์—…๋ฐ์ดํŠธ๋ฅผ ์–ธ์ œ ๋ฐœ์ƒ์‹œํ‚ฌ์ง€๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค๋ฉด, `useDeferredValue`๋Š” ๋ฌด๊ฑฐ์šด ๊ฐ’์„ ์–ธ์ œ '์ฝ์„์ง€'๋ฅผ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค [4]. ์ž…๋ ฅ๊ณผ ๊ฐ™์€ UI ๋ณ€๊ฒฝ์€ ์ฆ‰์‹œ ๋ฐ˜์˜ํ•˜๋ฉด์„œ, ํŒŒ์ƒ๋˜๋Š” ๋ฌด๊ฑฐ์šด ๋กœ์ง ์ ์šฉ์€ ์‚ด์ง ์ง€์—ฐ์‹œ์ผœ ์‹ค์‹œ๊ฐ„ ํผ(form) ๋“ฑ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋Š๊น€ ํ˜„์ƒ(jank)์„ ์ค„์—ฌ์ค๋‹ˆ๋‹ค [4]. +* **ํ”„๋ ˆ์ž„์›Œํฌ ์ง€์› ํ™˜๊ฒฝ:** 2025๋…„ ๊ธฐ์ค€ Next.js(App Router), Remix, Vite + React 18+ ํ™˜๊ฒฝ ๋“ฑ ๋Œ€๋ถ€๋ถ„์˜ ํ’€์Šคํƒ ๋ฐ ๋ฒˆ๋“ค๋Ÿฌ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋™์‹œ์„ฑ ๋ Œ๋”๋ง ๊ธฐ๋Šฅ์ด ํ†ตํ•ฉ๋˜์–ด ์ง€์›๋ฉ๋‹ˆ๋‹ค [2]. + +## โš–๏ธ Trade-offs & Caveats +* **์„ฑ๋Šฅ ํ–ฅ์ƒ์˜ ๋ณธ์งˆ์  ํ•œ๊ณ„:** ์ด ๊ธฐ๋Šฅ๋“ค์€ ์•ฑ์˜ ์‹ค์ œ ์—ฐ์‚ฐ ์†๋„๋ฅผ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๋†’์—ฌ์ฃผ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ "์ธ์ง€๋˜๋Š” ์†๋„(perceived speed)"๋ฅผ ์šฐ์„ ์‹œํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค [2]. ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์ด ๊ณ„์† ์ง„ํ–‰๋˜๋Š” ๋™์•ˆ UI์˜ ๋ฐ˜์‘์„ฑ์„ ์œ ์ง€ํ•  ๋ฟ, ์‹คํ–‰ํ•ด์•ผ ํ•  ์—ฐ์‚ฐ๋Ÿ‰ ์ž์ฒด๊ฐ€ ์ค„์–ด๋“œ๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค [2]. +* **์„ ๋ณ„์  ์‚ฌ์šฉ ์š”๊ตฌ:** ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ์— ์ „์—ญ์ ์œผ๋กœ ์‚ฌ์šฉํ•ด์„œ๋Š” ์•ˆ ๋˜๋ฉฐ, ์ฃผ๋กœ '์ƒํ˜ธ์ž‘์šฉ์ด ๋งŽ์€ ๋ทฐ(interactive views)'์— ์„ ๋ณ„์ ์œผ๋กœ ์ ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [4]. +* **ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ:** ๋ Œ๋”๋ง์„ ์ฐจ๋‹จํ•˜๋Š”(render-blocking) ๊ตฌ์‹ ํŒจํ„ด(๊ฐ€๋“œ๊ฐ€ ์—†๋Š” ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ ๋“ฑ)์ด๋‚˜ ์˜ค๋ž˜๋œ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์„ž์–ด์„œ ์‚ฌ์šฉํ•˜๋ฉด ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ์•ผ๊ธฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [4]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [๊ด€๊ณ„ ์œ ํ˜• A: ์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] +- [[useTransition]] + - ์—ฐ๊ฒฐ ์ด์œ : ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋ฅผ ๊ธด๊ธ‰ํ•˜์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œํ•˜์—ฌ ์ง€์—ฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” Concurrent Feature์˜ ํ•ต์‹ฌ ์š”์†Œ์ž…๋‹ˆ๋‹ค [3]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: React๊ฐ€ ๋ Œ๋”๋ง ์šฐ์„ ์ˆœ์œ„๋ฅผ ์กฐ์ •ํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ž…๋ ฅ ๋ฐ˜์‘์„ฑ์„ ์žƒ์ง€ ์•Š๊ฒŒ ์œ ์ง€ํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ๋ฉ”์ปค๋‹ˆ์ฆ˜. + +- [[useDeferredValue]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋น„์šฉ์ด ํฐ ํŒŒ์ƒ ๋ฐ์ดํ„ฐ์˜ ๋ Œ๋”๋ง ๋ฐ˜์˜ ์‹œ์ ์„ ์ง€์—ฐ์‹œ์ผœ UI ๋Š๊น€์„ ๋ง‰๋Š” ๋˜ ๋‹ค๋ฅธ ์ฃผ์š” ์š”์†Œ์ž…๋‹ˆ๋‹ค [4]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ƒํƒœ์˜ ์—…๋ฐ์ดํŠธ ์‹œ์ ์ด ์•„๋‹Œ, ๊ณ„์‚ฐ๋œ ๊ฐ’์„ ์ฝ์–ด ๋“ค์ด๋Š” ์‹œ์ ์„ ๋ถ„๋ฆฌํ•˜๋Š” ์ตœ์ ํ™” ์ „๋žต. + +#### [๊ด€๊ณ„ ์œ ํ˜• B: ๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ] +- [[Suspense]] + - ์—ฐ๊ฒฐ ์ด์œ : Concurrent Feature(ํŠนํžˆ `useTransition`)์™€ ๊ฒฐํ•ฉํ•˜์—ฌ ๋ฌด๊ฑฐ์šด ๋ Œ๋”๋ง์ด๋‚˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋กœ๋“œ๋˜๋Š” ๋™์•ˆ Fallback UI๋ฅผ ์œ ์—ฐํ•˜๊ฒŒ ํ‘œ์‹œํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค [4]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋น„๋™๊ธฐ ๋กœ๋”ฉ ์ƒํƒœ์—์„œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜(UX)์„ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ์„ค๊ณ„ํ•˜๋Š” ์„ ์–ธ์  UI ํŒจํ„ด. + +### Deeper Research Questions +- Concurrent Rendering์ด ๋™์ž‘ํ•  ๋•Œ ๋ธŒ๋ผ์šฐ์ €์˜ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ์ž‘์—…์„ ์ผ์‹œ ์ค‘์ง€ํ•˜๊ณ  ์žฌ๊ฐœ(pause, interrupt, resume)ํ•˜๋Š”๊ฐ€? +- `useTransition`๊ณผ `useDeferredValue`๋Š” ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ค ์ƒํ™ฉ์—์„œ ๊ฐ๊ฐ ์„ ํƒ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•˜๋ฉฐ, ๋‘ ๊ฐ€์ง€๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์ œ์•ฝ ์‚ฌํ•ญ์€ ์—†๋Š”๊ฐ€? +- ๊ตฌ์‹ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(outdated state libraries)๊ฐ€ Concurrent Features์™€ ์„ž์˜€์„ ๋•Œ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜๋Š” ๊ธฐ์ˆ ์  ์›๋ฆฌ๋Š” ๋ฌด์—‡์ธ๊ฐ€? +- ์ธ์ง€๋˜๋Š” ์†๋„(perceived speed)๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด Concurrent ๊ธฐ๋Šฅ์„ ๊ณผ๋„ํ•˜๊ฒŒ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๋‚˜ ์Šค์ผ€์ค„๋ง ์˜ค๋ฒ„ํ—ค๋“œ๋Š” ์–ด๋А ์ •๋„์ธ๊ฐ€? +- Next.js๋‚˜ Remix ๊ฐ™์€ ์ตœ์‹  ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ Concurrent Features๋ฅผ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•˜์—ฌ ์ŠคํŠธ๋ฆฌ๋ฐ(streaming) ์—…๋ฐ์ดํŠธ์™€ ๊ฐ™์€ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์ด๋Œ์–ด๋‚ด๋Š”๊ฐ€? + +### Practical Application Contexts +- **Implementation:** ์‹ค์‹œ๊ฐ„ ๊ฒ€์ƒ‰์ฐฝ, ํƒ€์ž…์–ดํ—ค๋“œ(Typeahead) ์ž…๋ ฅ๊ธฐ, ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ๊ทธ๋ฆฌ๋“œ ํ•„ํ„ฐ๋ง ๋“ฑ ์‚ฌ์šฉ์ž ์ž…๋ ฅ์ด ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค ๋ฌด๊ฑฐ์šด UI๋ฅผ ๋‹ค์‹œ ๊ทธ๋ ค์•ผ ํ•˜๋Š” ๊ณณ์— ๊ตฌํ˜„ํ•˜์—ฌ ์ž…๋ ฅ์ด ๋ฒ„๋ฒ…์ด์ง€ ์•Š๋„๋ก ๋งŒ๋“ญ๋‹ˆ๋‹ค [3, 4]. +- **System Design:** ์‚ฌ์šฉ์ž์˜ ์ฆ‰๊ฐ์ ์ธ ํ”ผ๋“œ๋ฐฑ์ด ํ•„์š”ํ•œ ๋ทฐ์™€, ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์ง€์—ฐ ๋ Œ๋”๋ง๋˜์–ด๋„ ๋ฌด๋ฐฉํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ์‹œ์Šคํ…œ ๊ตฌ์กฐ ๋ฐ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ธฐํšํ•ฉ๋‹ˆ๋‹ค [4]. +- **Operation / Maintenance:** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋กœํŒŒ์ผ๋ง ์ค‘ ์ž…๋ ฅ ์ง€์—ฐ(Input Lag)์ด ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ณด๊ณ ๋˜๋Š” ๋ถ€๋ถ„์„ ์ฐพ์•„๋‚ด๊ณ , ํ•ด๋‹น ๋ถ€๋ถ„์— ๋ Œ๋”๋ง ์ฐจ๋‹จ ํŒจํ„ด์ด ์—†๋Š”์ง€ ์ ๊ฒ€ํ•˜์—ฌ Concurrent ๊ธฐ๋Šฅ์„ ์ ์ง„์ ์œผ๋กœ ๋„์ž…ํ•ฉ๋‹ˆ๋‹ค [4, 5]. +- **Learning Path:** ๋‹จ์ˆœํ•œ React Hook(`useState`, `useEffect`)์˜ ๋ Œ๋”๋ง ๊ณผ์ •์„ ์ดํ•ดํ•œ ํ›„, ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ์ตœ์ ํ™”(`React.memo`, `useCallback`)๋ฅผ ๋ฐฐ์šฐ๊ณ , ์ตœ์ข…์ ์œผ๋กœ ๋ Œ๋”๋ง์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ œ์–ดํ•˜๋Š” ๊ณ ๊ธ‰ ์ตœ์ ํ™” ๊ณผ์ •์œผ๋กœ Concurrent ๊ธฐ๋Šฅ์„ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค. +- **My Project Relevance:** ๊ฒ€์ƒ‰ ํ•„ํ„ฐ๊ฐ€ ๋งŽ์€ ๋Œ€์‹œ๋ณด๋“œ๋‚˜ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์‹œ๊ฐํ™” ์ฐจํŠธ๋ฅผ ๊ตฌ์ถ•ํ•  ๋•Œ UI ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฉˆ์ถ”๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜์—ฌ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ํฌ๊ฒŒ ๊ฐœ์„ ํ•˜๋Š” ๋ฐ ์ง์ ‘์ ์œผ๋กœ ์ ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### Adjacent Topics +- [[Server Components]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ํด๋ผ์ด์–ธํŠธ์—์„œ ๋ Œ๋”๋ง์„ ์ง€์—ฐ์‹œํ‚ค๊ฑฐ๋‚˜ ์ตœ์ ํ™”ํ•˜๋Š” ๊ฒƒ์„ ๋„˜์–ด, ๋ฌด๊ฑฐ์šด ๋ Œ๋”๋ง ์ž‘์—… ์ž์ฒด๋ฅผ ์„œ๋ฒ„๋กœ ์™„์ „ํžˆ ์˜ฎ๊ฒจ ํด๋ผ์ด์–ธํŠธ์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค ํฌ๊ธฐ์™€ ์‹คํ–‰ ๋ถ€๋‹ด์„ ๊ทผ๋ณธ์ ์œผ๋กœ ์ค„์ด๋Š” ๋ฐฉ๋ฒ•๋ก  ํƒ๊ตฌ [6, 7]. +- [[Code Splitting & Lazy Loading]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ํ™”๋ฉด์˜ ๋ Œ๋”๋ง ๊ณผ์ •์„ ๋งค๋„๋Ÿฝ๊ฒŒ ํ•˜๋Š” ๊ฒƒ์„ ๋„˜์–ด, ์ดˆ๊ธฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ๋”ฉ ์‹œ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ๋‹ค์šด๋กœ๋“œํ•˜๋Š” ์ฝ”๋“œ์˜ ์–‘ ์ž์ฒด๋ฅผ ๋ถ„ํ• ํ•˜์—ฌ ์ดˆ๊ธฐ ์‘๋‹ต์„ฑ(Time to Interactive)์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ์ „๋žต ํƒ๊ตฌ [8, 9]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Concurrent Rendering in React 18+.md b/00_Raw/Concurrent Rendering in React 18+.md new file mode 100644 index 00000000..b20eeb11 --- /dev/null +++ b/00_Raw/Concurrent Rendering in React 18+.md @@ -0,0 +1,62 @@ +# [[Concurrent Rendering in React 18+]] + +## ๐Ÿ“Œ Brief Summary +React 18+์˜ ๋™์‹œ์„ฑ ๋ Œ๋”๋ง(Concurrent Rendering)์€ React๊ฐ€ ๋ Œ๋”๋ง ์ž‘์—…์„ ์ผ์‹œ ์ค‘์ง€, ์ค‘๋‹จ ๋ฐ ์žฌ๊ฐœํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค [1]. ์ด๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๋Š” ์—…๋ฐ์ดํŠธ ๋ฐœ์ƒ ์‹œ๊ธฐ์™€ ๋ฐฉ์‹์„ ์„ธ๋ฐ€ํ•˜๊ฒŒ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์‚ฌ์šฉ์ž์˜ ์ƒํ˜ธ์ž‘์šฉ์„ฑ์„ ์ €ํ•˜์‹œํ‚ค์ง€ ์•Š์œผ๋ฉด์„œ๋„ ํ™”๋ฉด์ด ๋ฉˆ์ถ”์ง€ ์•Š๋Š” ๋” ๋ถ€๋“œ๋Ÿฝ๊ณ  ๋ฐ˜์‘์„ฑ ๋†’์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1, 2]. + +## ๐Ÿ“– Core Content + +**๋™์‹œ์„ฑ ๋ Œ๋”๋ง์˜ ๊ฐœ๋…๊ณผ ์ด์ ** +* React 18๋ถ€ํ„ฐ ๋„์ž…๋œ ๋™์‹œ์„ฑ ๊ธฐ๋Šฅ์€ ๋ Œ๋”๋ง ์ž‘์—…์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋™์ ์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. ๋ Œ๋”๋ง ์ž‘์—…์„ ์ฐจ๋‹จํ•˜์ง€ ์•Š๊ณ , ๋А๋ฆฐ ๋ฐ์ดํ„ฐ ํ•„ํ„ฐ๋ง ์—…๋ฐ์ดํŠธ ๋“ฑ์„ ์ง€์—ฐ์‹œํ‚ค๋Š” ๋™์‹œ์— ํด๋ฆญ์ด๋‚˜ ํƒ€์ดํ•‘๊ณผ ๊ฐ™์€ ์ค‘์š”ํ•œ ์‚ฌ์šฉ์ž ์ƒํ˜ธ์ž‘์šฉ์— ์ฆ‰๊ฐ์ ์œผ๋กœ ๋ฐ˜์‘ํ•˜๋„๋ก ๋ Œ๋”๋ง์„ ์ผ์‹œ ์ค‘์ง€ํ•˜๊ฑฐ๋‚˜ ์žฌ๊ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1]. ์ด๋Š” ์ตœ์‹  React ๋ฒ„์ „์˜ ๊ธฐ๋ณธ ๋™์ž‘์œผ๋กœ ๋‚ด์žฅ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค [1]. + +**์ฃผ์š” ๋™์‹œ์„ฑ ํ›…(Hooks)** +* **`useTransition`:** ํŠน์ • ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋ฅผ '๊ธด๊ธ‰ํ•˜์ง€ ์•Š์€(non-urgent)' ๊ฒƒ์œผ๋กœ ํ‘œ์‹œํ•˜์—ฌ ์ง€์—ฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ํ›…์ž…๋‹ˆ๋‹ค [3]. ์‹ค์‹œ๊ฐ„ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ํ‘œ์‹œ, ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ ์„ธํŠธ ํ•„ํ„ฐ๋ง, ๋ณต์žกํ•œ ์ฐจํŠธ ๋ฐ ํ…Œ์ด๋ธ” ๋ Œ๋”๋ง๊ณผ ๊ฐ™์€ ๋ฌด๊ฑฐ์šด ์ž‘์—…์ด ์‚ฌ์šฉ์ž์˜ ์ฆ‰๊ฐ์ ์ธ ์ƒํ˜ธ์ž‘์šฉ์„ ์ฐจ๋‹จํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค [3]. ์ œ๊ณต๋˜๋Š” `isPending` ์ƒํƒœ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋ฅผ ์ฐจ๋‹จํ•˜์ง€ ์•Š๊ณ  ๋กœ๋”ฉ ์Šคํ”ผ๋„ˆ๋‚˜ ์Šค์ผˆ๋ ˆํ†ค UI๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3]. +* **`useDeferredValue`:** `useTransition`์ด ์—…๋ฐ์ดํŠธ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š” ์‹œ์ ์„ ์ œ์–ดํ•œ๋‹ค๋ฉด, `useDeferredValue`๋Š” ๋น„์šฉ์ด ๋งŽ์ด ๋“œ๋Š” ๊ฐ’์„ *์ฝ๊ณ  ์ ์šฉํ•˜๋Š” ์‹œ์ *์„ ์ง€์—ฐ์‹œํ‚ต๋‹ˆ๋‹ค [4]. ๊ฒ€์ƒ‰์ฐฝ์˜ ์ž…๋ ฅ ๊ฐ’ ๋“ฑ UI ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ์ฆ‰์‹œ ๋ฐ˜์˜ํ•˜๋ฉด์„œ, ํŒŒ์ƒ๋˜๋Š” ๋ฌด๊ฑฐ์šด ๊ณ„์‚ฐ ๋กœ์ง์€ ์•ฝ๊ฐ„ ์ง€์—ฐ์‹œ์ผœ ์‹ค์‹œ๊ฐ„ ํผ์ด๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค์—์„œ์˜ ํ™”๋ฉด ๋Š๊น€(Jank) ํ˜„์ƒ์„ ์ค„์—ฌ์ค๋‹ˆ๋‹ค [4]. + +**์‚ฌ์šฉ ๋ชจ๋ฒ” ์‚ฌ๋ก€ ๋ฐ ํ”„๋ ˆ์ž„์›Œํฌ ์ง€์›** +* ๋™์‹œ์„ฑ ๊ธฐ๋Šฅ์€ ์•ฑ์˜ ๋ชจ๋“  ๊ณณ์ด ์•„๋‹Œ '์ƒํ˜ธ์ž‘์šฉ์ด ์ง‘์ค‘๋œ ๋ทฐ'์— ์ „๋žต์ ์œผ๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [4]. ๋ฐ์ดํ„ฐ๊ฐ€ ๋กœ๋“œ๋˜๋Š” ๋™์•ˆ ๋Œ€์ฒด UI๋ฅผ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด `Suspense`์™€ ๊ฒฐํ•ฉํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค [4]. +* ์ฃผ์˜ํ•  ์ ์€ ๊ตฌ์‹ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜ ๋ Œ๋”๋ง์„ ์ฐจ๋‹จํ•˜๋Š” ํŒจํ„ด(์˜ˆ: ๊ฐ€๋“œ ๋กœ์ง์ด ์—†๋Š” ์˜ค๋ž˜๋œ ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ)๊ณผ ํ˜ผ์šฉํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค [4]. +* ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ๋“ค์€ ์—ฐ์‚ฐ ์†๋„ ์ž์ฒด๋ฅผ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๋†’์ด๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์ž‘์—…์ด ๊ณ„์†๋˜๋Š” ๋™์•ˆ UI๊ฐ€ ๋ฐ˜์‘ํ•˜๋„๋ก ์œ ์ง€ํ•จ์œผ๋กœ์จ '์ฒด๊ฐ ์†๋„(perceived speed)'๋ฅผ ์šฐ์„ ์‹œํ•˜๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค [4]. +* 2025๋…„ ๊ธฐ์ค€ Next.js(App Router), Remix, Vite + React 18 ๋“ฑ ๋Œ€๋ถ€๋ถ„์˜ ์ตœ์‹  ํ’€์Šคํƒ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด ๋™์‹œ์„ฑ ๋ Œ๋”๋ง์„ ์™„์ „ํžˆ ํ†ตํ•ฉํ•˜์—ฌ ์ง€์›ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค [5]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +- [[useTransition]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋™์‹œ์„ฑ ๋ Œ๋”๋ง ํ™˜๊ฒฝ์—์„œ ํŠน์ • ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋ฅผ '๊ธด๊ธ‰ํ•˜์ง€ ์•Š์€ ์ž‘์—…'์œผ๋กœ ๋ช…์‹œ์ ์œผ๋กœ ๋ถ„๋ฅ˜ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ํ•ต์‹ฌ ํ›…์ž…๋‹ˆ๋‹ค [3]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ƒํƒœ ์—…๋ฐ์ดํŠธ์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋‚ฎ์ถ”์–ด ์‚ฌ์šฉ์ž ์ž…๋ ฅ์— ๋Œ€ํ•œ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ ์ฐจ๋‹จ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ์ œ์–ด ๋ฐฉ๋ฒ•. + +- [[useDeferredValue]] + - ์—ฐ๊ฒฐ ์ด์œ : ์—ฐ์‚ฐ ๋น„์šฉ์ด ๋†’์€ ๊ฐ’์˜ ํ™”๋ฉด ์ ์šฉ ์‹œ์ ์„ ๋Šฆ์ถ”์–ด UI์˜ ์ฆ‰๊ฐ์ ์ธ ์ฒด๊ฐ ๋ฐ˜์‘์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๋™์‹œ์„ฑ ๊ธฐ๋Šฅ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [4]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์‚ฌ์šฉ์ž ์ž…๋ ฅ(ํƒ€์ดํ•‘ ๋“ฑ)์˜ ์ฆ‰๊ฐ์ ์ธ ๋ฐ˜์˜๊ณผ ๋ฌด๊ฑฐ์šด ํŒŒ์ƒ ๋ฐ์ดํ„ฐ ๋ Œ๋”๋ง ๊ฐ„์˜ ์ฒ˜๋ฆฌ ์‹œ์ ์„ ๋ถ„๋ฆฌํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜. + +- [[Suspense]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋™์‹œ์„ฑ ํ›…(`useTransition` ๋“ฑ)๊ณผ ๊ฒฐํ•ฉํ•˜์—ฌ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋‚˜ ์ง€์—ฐ๋œ ๋ Œ๋”๋ง์ด ์™„๋ฃŒ๋˜๊ธฐ ์ „๊นŒ์ง€ ์ž์—ฐ์Šค๋Ÿฌ์šด ๋Œ€์ฒด UI(Fallback UI)๋ฅผ ํ‘œ์‹œํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค [4]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ ๊ณผ์ •์—์„œ ๋™์‹œ์„ฑ ๋ Œ๋”๋ง์„ ํ™œ์šฉํ•œ ๋ถ€๋“œ๋Ÿฌ์šด ์‚ฌ์šฉ์ž ๊ฒฝํ—˜(UX) ์„ค๊ณ„ ๋ฐฉ์‹. + +### Deeper Research Questions + +- React์˜ ๋™์‹œ์„ฑ ๋ Œ๋”๋ง ์—”์ง„์€ ๋‚ด๋ถ€์ ์œผ๋กœ ๊ธด๊ธ‰ ์—…๋ฐ์ดํŠธ์™€ ์ง€์—ฐ ์—…๋ฐ์ดํŠธ์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์–ด๋–ค ์Šค์ผ€์ค„๋ง ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š”๊ฐ€? +- `useTransition`๊ณผ `useDeferredValue`๋ฅผ ๋ณต์žกํ•œ ๋‹จ์ผ ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ Œ๋”๋ง ์—ฃ์ง€ ์ผ€์ด์Šค๋‚˜ ์„ฑ๋Šฅ์  ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๋Š” ๋ฌด์—‡์ธ๊ฐ€? +- ๊ตฌ์‹ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(Context API๋ฅผ ์ž˜๋ชป ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋“ฑ)๊ฐ€ React 18์˜ ๋™์‹œ์„ฑ ๋ Œ๋”๋ง ํŒจํ„ด์„ ๋ฐฉํ•ดํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์ •ํ™•ํ•œ ๊ธฐ์ˆ ์  ์›๋ฆฌ(์˜ˆ: Tearing ํ˜„์ƒ)๋Š” ๋ฌด์—‡์ธ๊ฐ€? +- ๋™์‹œ์„ฑ ๋ Œ๋”๋ง์˜ ๋„์ž…์ด ๋ธŒ๋ผ์šฐ์ €์˜ INP(Interaction to Next Paint)์™€ TBT(Total Blocking Time) ์ง€ํ‘œ ์ตœ์ ํ™”์— ์ˆ˜ํ•™์ ์œผ๋กœ ์–ด๋–ค ์—ฐ๊ด€์„ฑ์„ ๊ฐ€์ง€๋Š”๊ฐ€? +- ๋™์‹œ์„ฑ ๋ Œ๋”๋ง์œผ๋กœ ์ธํ•ด ๋ Œ๋”๋ง ํŠธ๋ฆฌ๊ฐ€ ์ค‘๋‹จ(Interrupt)๋˜๊ณ  ํ๊ธฐ๋œ ํ›„ ๋‹ค์‹œ ์‹œ์ž‘๋  ๋•Œ, ๋ถˆํ•„์š”ํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ React์˜ ๋‚ด๋ถ€ ์ตœ์ ํ™” ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ๋ฌด์—‡์ธ๊ฐ€? + +### Practical Application Contexts + +- **Implementation:** ๋ผ์ด๋ธŒ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์ฐฝ, ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ ์„ธํŠธ ํ•„ํ„ฐ๋ง ๊ธฐ๋Šฅ ๊ตฌํ˜„ ์‹œ `useTransition`๊ณผ `useDeferredValue`๋ฅผ ์ ๊ทน ํ™œ์šฉํ•˜์—ฌ ์ž…๋ ฅ ์ค‘ ๋ฐœ์ƒํ•˜๋Š” ํ™”๋ฉด ๋ฉˆ์ถค(Jank) ๋ฐฉ์ง€ [3, 4]. +- **System Design:** ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ ์‹œ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋™์‹œ์„ฑ ๋ Œ๋”๋ง์ด ํ™œ์„ฑํ™”๋œ Next.js App Router๋‚˜ Remix์™€ ๊ฐ™์€ ์ตœ์‹  React ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋„์ž…ํ•˜์—ฌ ๋ฐ˜์‘์„ฑ ์ด์ ์„ ๊ทน๋Œ€ํ™” [5]. +- **Operation / Maintenance:** ๊ธฐ์กด ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ๋ Œ๋”๋ง์„ ์ฐจ๋‹จํ•˜๋Š” ์š”์†Œ(์˜ค๋ž˜๋œ ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ ๋“ฑ)๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•˜๊ณ , ๋™์‹œ์„ฑ ๊ธฐ๋Šฅ์ด ์ถฉ๋Œ ์—†์ด ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋„๋ก ์œ ์ง€๋ณด์ˆ˜ ํ™˜๊ฒฝ ๊ฐœ์„  [4]. +- **Learning Path:** ์ „ํ†ต์ ์ธ '๋™๊ธฐ์  ๋ Œ๋”๋ง(Synchronous Rendering)' ๋ชจ๋ธ์ด ๊ฐ€์ง„ ํ•œ๊ณ„๋ฅผ ๋ฒ—์–ด๋‚˜, ์ž‘์—… ๋‹จ์œ„์˜ ์ผ์‹œ ์ค‘์ง€์™€ ์žฌ๊ฐœ๊ฐ€ ๊ฐ€๋Šฅํ•œ ๋ Œ๋”๋ง ํŒจ๋Ÿฌ๋‹ค์ž„์œผ๋กœ ๊ฐœ๋ฐœ์ž์˜ ์‚ฌ๊ณ  ๋ฐฉ์‹์„ ์ „ํ™˜. +- **My Project Relevance:** ํ˜„์žฌ ์ง„ํ–‰ ์ค‘์ธ ์„œ๋น„์Šค ๋‚ด ๋ฌด๊ฑฐ์šด ๋Œ€์‹œ๋ณด๋“œ ํ™”๋ฉด์ด๋‚˜ ๋ณต์žกํ•œ ๊ฒ€์ƒ‰ ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ์ฒด๊ฐํ•˜๋Š” '์ธ์‹ ์†๋„(Perceived Speed)'๋ฅผ ์ตœ์ ํ™”ํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜ ๊ฐœ์„  ์ง€ํ‘œ๋กœ ํ™œ์šฉ [3, 4]. + +### Adjacent Topics + +- [[React Server Components]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋™์‹œ์„ฑ ๋ Œ๋”๋ง๊ณผ ํ•จ๊ป˜ Next.js App Router ํ™˜๊ฒฝ์˜ ํ•ต์‹ฌ ์„ฑ๋Šฅ ์ตœ์ ํ™” ์ถ•์„ ์ด๋ฃจ๋ฉฐ, ํด๋ผ์ด์–ธํŠธ ์ธก ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค์„ ํš๊ธฐ์ ์œผ๋กœ ์ค„์—ฌ์ฃผ๋Š” ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์˜ ๋ Œ๋”๋ง ์›๋ฆฌ ํƒ๊ตฌ [5, 6]. + +- [[Core Web Vitals (INP/TBT)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋™์‹œ์„ฑ ๋ Œ๋”๋ง ๊ธฐ๋Šฅ ์ ์šฉ์ด ์›น์˜ ํ•ต์‹ฌ ๋ฐ˜์‘์„ฑ ์ง€ํ‘œ์ธ INP ๋ฐ TBT๋ฅผ ์–ด๋–ป๊ฒŒ ๊ฐœ์„ ํ•˜๋Š”์ง€ ์‹ค์ œ ์„ฑ๋Šฅ ์ธก์ • ํˆด(Chrome DevTools, Lighthouse) ๋ฐ์ดํ„ฐ์™€ ์—ฐ๊ณ„ํ•˜์—ฌ ์กฐ์‚ฌ [7-9]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Context API.md b/00_Raw/Context API.md new file mode 100644 index 00000000..b0dfba57 --- /dev/null +++ b/00_Raw/Context API.md @@ -0,0 +1,46 @@ +# [[Context API]] + +## ๐Ÿ“Œ Brief Summary +Context API๋Š” React์— ๋‚ด์žฅ๋œ ์ƒํƒœ ๊ณต์œ  ์†”๋ฃจ์…˜์œผ๋กœ, ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ์˜ ๋ชจ๋“  ๋ ˆ๋ฒจ์„ ํ†ตํ•ด ๋ช…์‹œ์ ์œผ๋กœ props๋ฅผ ์ „๋‹ฌํ•˜์ง€ ์•Š๊ณ ๋„ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค [1, 2]. ์ด๋Š” ๋…๋ฆฝ์ ์ธ ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ๋ผ๊ธฐ๋ณด๋‹ค๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ์ „์†ก ๋ฉ”์ปค๋‹ˆ์ฆ˜์— ๊ฐ€๊น์Šต๋‹ˆ๋‹ค [3, 4]. ์ฃผ๋กœ ํ…Œ๋งˆ, ๋‹ค๊ตญ์–ด ์„ค์ • ๋“ฑ ๋ณ€๊ฒฝ์ด ๊ฑฐ์˜ ์—†๋Š” ์ •์ ์ธ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์—ญ์ ์œผ๋กœ ๊ณต์œ ํ•  ๋•Œ ์ ํ•ฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค [5, 6]. + +## ๐Ÿ“– Core Content +* **์ž‘๋™ ๋ฐฉ์‹ ๋ฐ ๊ตฌ์กฐ:** Context API๋Š” `React.createContext()`๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ƒ์„ฑ๋˜๋ฉฐ, ์ƒํƒœ ๊ฐ’์„ ์ œ๊ณตํ•˜๋Š” `Provider`์™€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š” `Consumer`(์‹ค๋ฌด์—์„œ๋Š” ์ฃผ๋กœ `useContext` ํ›…)๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค [4]. Provider๋Š” ๊ฐ’์„ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธํ•˜๊ณ , ํŠธ๋ฆฌ์˜ ์–ด๋А ๊นŠ์ด์— ์žˆ๋“  `useContext`๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ํ•ด๋‹น ๊ฐ’์„ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [4]. ๋‹จ, ์ƒํƒœ ์ž์ฒด๋ฅผ ๊ด€๋ฆฌํ•˜๋ ค๋ฉด `useState`๋‚˜ `useReducer`์™€ ๊ฐ™์€ ํ›…๊ณผ ๋ฐ˜๋“œ์‹œ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [4, 7]. +* **์„ฑ๋Šฅ์  ํ•œ๊ณ„์™€ ๋ฆฌ๋ Œ๋”๋ง ํญํฌ:** Context์˜ ๊ฐ€์žฅ ํฐ ๋‹จ์ ์€ ์„ฑ๋Šฅ ๊ด€๋ฆฌ์ž…๋‹ˆ๋‹ค [8]. Context๋กœ ์ „๋‹ฌ๋˜๋Š” ๊ฐ’ ์ค‘ ์ผ๋ถ€๋งŒ ๋ณ€๊ฒฝ๋˜๋”๋ผ๋„, ํ•ด๋‹น Context๋ฅผ ๊ตฌ๋…ํ•˜๋Š” **๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง**๋ฉ๋‹ˆ๋‹ค [8, 9]. React๋Š” ํŠน์ • ๋ฐ์ดํ„ฐ ๋ถ€๋ถ„๋งŒ ์‚ฌ์šฉํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ตฌ๋ณ„ํ•ด ๋‚ด์ง€ ๋ชปํ•˜๋ฏ€๋กœ, ์ƒํƒœ ๋ณ€๊ฒฝ์ด ์žฆ์€ ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ์ „์ฒด ๋Œ€์‹œ๋ณด๋“œ๊ฐ€ ์ˆ˜ ์ดˆ๊ฐ„ ๋ฉˆ์ถ”๋Š” ๋“ฑ ์‹ฌ๊ฐํ•œ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ์„ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1, 10]. +* **๊ตฌ์กฐ์  ์ตœ์ ํ™” ์ „๋žต:** ์ด๋Ÿฌํ•œ ๋ฆฌ๋ Œ๋”๋ง ๋ฌธ์ œ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ชจ๋“  ์ƒํƒœ๋ฅผ ํ•˜๋‚˜์˜ 'Global Context'์— ๋‹ด๋Š” ์•ˆํ‹ฐ ํŒจํ„ด์„ ํ”ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [11, 12]. ๋Œ€์‹  `ThemeContext`, `NotificationContext`์ฒ˜๋Ÿผ ์ƒํƒœ๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž‘์€ ๋„๋ฉ”์ธ๋ณ„ Context๋กœ ๋ถ„๋ฆฌํ•˜๊ณ , ์ปค์Šคํ…€ ํ›…๊ณผ Selector ํŒจํ„ด์„ ํ™œ์šฉํ•ด ํ•„์š”ํ•œ ๊ฐ’๋งŒ ์Šค์ฝ”ํ”„๋ฅผ ์ขํ˜€ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค [12, 13]. +* **์‚ฌ์šฉ์˜ ์ ํ•ฉ์„ฑ:** ํ…Œ๋งˆ(๋ผ์ดํŠธ/๋‹คํฌ ๋ชจ๋“œ), ์–ธ์–ด ํ™˜๊ฒฝ ์„ค์ •, ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ ๋“ฑ **๋ณ€๊ฒฝ ๋นˆ๋„๊ฐ€ ๋งค์šฐ ๋‚ฎ๊ณ  ์ •์ ์ธ ๋ฐ์ดํ„ฐ**๋ฅผ ๊ณต์œ ํ•˜๊ฑฐ๋‚˜ ์™ธ๋ถ€ ์ข…์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์€ ์ž‘์€ ํ”„๋กœ์ ํŠธ ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฐœ๋ฐœ์— ์™„๋ฒฝํ•œ ์„ ํƒ์ž…๋‹ˆ๋‹ค [5, 6, 14]. ๋ฐ˜๋ฉด, ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ, ์ž์ฃผ ์—…๋ฐ์ดํŠธ๋˜๋Š” ์žฅ๋ฐ”๊ตฌ๋‹ˆ, ๋ณต์žกํ•œ ๋น„๋™๊ธฐ ์ž‘์—…์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋Š” Context๋ฅผ ํ”ผํ•˜๊ณ  Zustand๋‚˜ Redux๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค [15-18]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts +- [[Prop Drilling]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ ๊นŠ๊ฒŒ ์ค‘์ฒฉ๋œ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด ๋ถˆํ•„์š”ํ•œ ์ค‘๊ฐ„ ์ปดํฌ๋„ŒํŠธ๋“ค์„ ๊ฑฐ์ณ์•ผ ํ•˜๋Š” ํŒจํ„ด์ž…๋‹ˆ๋‹ค [2]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Context API๊ฐ€ ํƒ„์ƒํ•˜๊ฒŒ ๋œ ๊ทผ๋ณธ์ ์ธ ๋ฐฐ๊ฒฝ๊ณผ, ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ํŠธ๋ฆฌ ์•„๋ž˜๋กœ "๊ฑด๋„ˆ๋›ฐ์–ด" ์ „๋‹ฌํ•˜๋Š”์ง€ ๊ทธ ๋ชฉ์ ์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2, 19]. +- [[useContext]] + - ์—ฐ๊ฒฐ ์ด์œ : Context API์˜ Provider๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ๊ฐ’์„ ์ฝ๊ธฐ ์œ„ํ•ด ๊ฐœ๋ณ„ ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ ํ˜ธ์ถœํ•˜๋Š” React์˜ ๋‚ด์žฅ ํ›…์ž…๋‹ˆ๋‹ค [4]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ตฌ๋…(Subscription)์ด ๋ฐœ์ƒํ•˜๋Š” ์ •ํ™•ํ•œ ์ง€์ ๊ณผ, ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ ์–ด๋–ค ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฆฌ๋ Œ๋”๋ง์ด ํŠธ๋ฆฌ๊ฑฐ๋˜๋Š”์ง€ ๋ Œ๋”๋ง ๋™์ž‘ ์›๋ฆฌ๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [8]. +- [[Zustand]] + - ์—ฐ๊ฒฐ ์ด์œ : Context API์˜ ๋ฆฌ๋ Œ๋”๋ง ํ•œ๊ณ„์™€ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ๋ฅผ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด ์ž์ฃผ ๋น„๊ต๋˜๊ณ  ์ฑ„ํƒ๋˜๋Š” ๊ฒฝ๋Ÿ‰ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค [20, 21]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Zustand์˜ 'Selector ํŒจํ„ด'์ด ์–ด๋–ป๊ฒŒ ํŠน์ • ์ƒํƒœ ์Šฌ๋ผ์ด์Šค๋งŒ ๊ตฌ๋…ํ•˜๊ฒŒ ํ•˜์—ฌ Context API์˜ "์ „์ฒด ๋ฆฌ๋ Œ๋”๋ง" ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š”์ง€ ์„ฑ๋Šฅ ์ตœ์ ํ™”์˜ ์ฐจ์ด๋ฅผ ๋น„๊ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [8, 10]. + +### Deeper Research Questions +- Context API์™€ ์™ธ๋ถ€ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(Zustand, Redux)๋ฅผ ๋™์ผํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์—์„œ ํšจ์œจ์ ์œผ๋กœ ํ˜ผ์šฉ(Hybrid)ํ•˜๊ธฐ ์œ„ํ•ด, ์ •์  ์ƒํƒœ์™€ ๋™์  ์ƒํƒœ๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ์ตœ์ ์˜ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ ๊ธฐ์ค€์€ ๋ฌด์—‡์ธ๊ฐ€? +- Context API์˜ "๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ" ํŠน์„ฑ์œผ๋กœ ์ธํ•œ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋„๋ฉ”์ธ๋ณ„๋กœ Context๋ฅผ ์ชผ๊ฐค ๋•Œ, ์ฝ”๋“œ์˜ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ์žƒ์ง€ ์•Š์œผ๋ฉด์„œ๋„ ์„ฑ๋Šฅ์„ ์žก์„ ์ˆ˜ ์žˆ๋Š” ์ ์ ˆํ•œ ๋ถ„๋ฆฌ ์ž…๋„(Granularity)๋Š” ์–ด๋А ์ •๋„์ธ๊ฐ€? +- `use-context-selector`์™€ ๊ฐ™์€ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Context API์˜ ๋ฆฌ๋ Œ๋”๋ง ๋ฌธ์ œ๋ฅผ ์šฐํšŒํ•˜๋Š” ๋ฐฉ์‹์€, ์ฒ˜์Œ๋ถ€ํ„ฐ Zustand๋‚˜ Redux๋ฅผ ๋„์ž…ํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„๊ตํ•˜์—ฌ ๋„์ž… ๋น„์šฉ ๋ฐ ์žฅ๊ธฐ์  ํ™•์žฅ์„ฑ ์ธก๋ฉด์—์„œ ์–ด๋–ค ์žฅ๋‹จ์ ์„ ๊ฐ€์ง€๋Š”๊ฐ€? +- ์˜์กด์„ฑ ์ฃผ์ž…(Dependency Injection)์˜ ๋ชฉ์ ์œผ๋กœ Context API๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ, ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ(Jest ๋“ฑ)์ด๋‚˜ Storybook์—์„œ Provider ๋ชจํ‚น(Mocking)์„ ์„ค๊ณ„ํ•  ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์ทจ์•ฝ์ ๊ณผ ํ•ด๊ฒฐ์ฑ…์€ ๋ฌด์—‡์ธ๊ฐ€? +- ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฌด๋ถ„๋ณ„ํ•œ `useEffect`์™€ Context API๊ฐ€ ๊ฒฐํ•ฉ๋˜์—ˆ์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” '๋ฆฌ๋ Œ๋”๋ง ํญํ’(Re-render storm)'์„ React DevTools Profiler๋กœ ์ง„๋‹จํ•˜๊ณ  ๋ฆฌํŒฉํ† ๋งํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ๊ณผ์ •์€ ์–ด๋–ป๊ฒŒ ๋˜๋Š”๊ฐ€? + +### Practical Application Contexts +- **Implementation:** React ํ”„๋กœ์ ํŠธ์—์„œ `React.createContext()`๋กœ ํ…Œ๋งˆ๋‚˜ ๋กœ์ผ€์ผ ์ •๋ณด๋ฅผ ์ •์˜ํ•˜๊ณ , ์ตœ์ƒ์œ„ ๋ ˆ์ด์–ด(`app/` ๋˜๋Š” ์ตœ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ)๋ฅผ `Provider`๋กœ ๊ฐ์‹ผ ๋’ค, ๋‚ด๋ถ€ ์ปดํฌ๋„ŒํŠธ์—์„œ `useContext`๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ์„ค์ •๊ฐ’์„ ๋ถˆ๋Ÿฌ์™€ UI์— ์ฆ‰๊ฐ์ ์œผ๋กœ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค [4, 22, 23]. +- **System Design:** ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ ์‹œ ์ƒํƒœ์˜ '๋ณ€๊ฒฝ ๋นˆ๋„'์— ๋”ฐ๋ผ ์ €์žฅ์†Œ๋ฅผ ์ด์›ํ™”ํ•ฉ๋‹ˆ๋‹ค. ๋‹คํฌ๋ชจ๋“œ, ๋กœ๊ทธ์ธ ์—ฌ๋ถ€ ๊ฐ™์€ ์ •์ ์ธ ์„ค์ •์€ Context API์— ๋ฐฐ์น˜ํ•˜๊ณ , ์žฅ๋ฐ”๊ตฌ๋‹ˆ๋‚˜ ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ์ฒ˜๋Ÿผ ์ˆ˜์‹œ๋กœ ๋ณ€ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋Š” Zustand๋‚˜ Redux ๊ฐ™์€ ์™ธ๋ถ€ ์Šคํ† ์–ด์— ๋ฐฐ์น˜ํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง ์ „ํŒŒ๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค [24]. +- **Operation / Maintenance:** ์„ฑ๋Šฅ ํ”„๋กœํŒŒ์ผ๋ง ์‹œ ์‚ฌ์šฉ์ž ์ธํ„ฐ๋ž™์…˜ ์ดํ›„ ๋Œ€์‹œ๋ณด๋“œ๊ฐ€ ์ผ์‹œ์ ์œผ๋กœ ๋ฉˆ์ถ”๋Š” ํ˜„์ƒ์ด ๋ฐœ๊ฒฌ๋˜๋ฉด, React DevTools์˜ Profiler๋ฅผ ์ด์šฉํ•ด ์›์ธ์„ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค. ์›์ธ์ด ๋‹จ์ผ Context ์—…๋ฐ์ดํŠธ์— ์˜ํ•œ ์ˆ˜๋ฐฑ ๊ฐœ ์ปดํฌ๋„ŒํŠธ์˜ ๋ฆฌ๋ Œ๋”๋ง์œผ๋กœ ํ™•์ธ๋  ๊ฒฝ์šฐ, Context๋ฅผ ์ž˜๊ฒŒ ์ชผ๊ฐœ๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋Š” ์œ ์ง€๋ณด์ˆ˜ ๊ฒฐ์ •์„ ๋‚ด๋ฆฝ๋‹ˆ๋‹ค [1, 25]. +- **Learning Path:** React ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ์ฒ˜์Œ ๋ฐฐ์šฐ๋Š” ๋‹จ๊ณ„์—์„œ, ์ปดํฌ๋„ŒํŠธ ๊ฐ„ Props ์ „๋‹ฌ์˜ ํ”ผ๋กœ๋„๋ฅผ ์ค„์ด๋Š” ์ฒซ ๋ฒˆ์งธ ๋„๊ตฌ๋กœ ํ•™์Šต๋ฉ๋‹ˆ๋‹ค. ์ดํ›„ ์‹ค์ œ ๋ณต์žกํ•œ ์•ฑ์„ ๋งŒ๋“ค๋ฉฐ ํ•œ๊ณ„๋ฅผ ๊ฒฝํ—˜ํ•˜๊ณ , Redux์˜ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ๊ตฌ์กฐ๋‚˜ Zustand์˜ ๋…๋ฆฝ๋œ ์Šคํ† ์–ด ๊ฐœ๋…์„ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ฐ›์•„๋“ค์ด๊ฒŒ ํ•˜๋Š” ํ•ต์‹ฌ ํ•™์Šต ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค [14, 26, 27]. +- **My Project Relevance:** ๊ธฐ์กด ์ฝ”๋“œ๋ฒ ์ด์Šค์— 'Global Context' ์•ˆํ‹ฐ ํŒจํ„ด(๋ชจ๋“  ์ƒํƒœ๋ฅผ ํ•œ ๊ณณ์— ๋ชฐ์•„๋„ฃ์€ ํ˜•ํƒœ)์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š”์ง€ ์ ๊ฒ€ํ•˜๊ณ  [11], ๋ Œ๋”๋ง ๋ณ‘๋ชฉ์ด ์žˆ๋Š” ๊ฒฝ์šฐ `useMemo`, `useCallback`๊ณผ ํ•จ๊ป˜ Context๋ฅผ ์ฑ…์ž„๋ณ„๋กœ ๋ถ„ํ• ํ•˜๋Š” ๋ฆฌํŒฉํ† ๋ง ๋ชฉํ‘œ์™€ ์ง์ ‘์ ์œผ๋กœ ์—ฐ๊ด€๋ฉ๋‹ˆ๋‹ค [1, 12]. + +### Adjacent Topics +- [[React.memo]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: Context API์— ์˜ํ•ด ๋ฐœ์ƒํ•˜๋Š” ๋ถˆํ•„์š”ํ•œ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์–•์€ ๋น„๊ต(Shallow Compare) ์ตœ์ ํ™” ๋„๊ตฌ๋กœ, ๋ Œ๋”๋ง ์„ฑ๋Šฅ ์ตœ์ ํ™”(Performance Optimization) ๊ธฐ๋ฒ• ์ „๋ฐ˜์œผ๋กœ์˜ ์ดํ•ด๋ฅผ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค [28, 29]. +- [[Concurrent Rendering]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: React 18์˜ ๋™์‹œ์„ฑ ๋ Œ๋”๋ง ๊ธฐ๋Šฅ(`useTransition`, `useDeferredValue`)์„ ํ†ตํ•ด ๋ฌด๊ฑฐ์šด ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง์„ ์–ด๋–ป๊ฒŒ ์ง€์—ฐ์‹œํ‚ค๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฐ˜์‘์„ฑ์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ƒํƒœ ์—…๋ฐ์ดํŠธ ํ๋ฆ„์œผ๋กœ ํƒ๊ตฌ๋ฅผ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค [6, 30]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Debugging Frontend Applications.md b/00_Raw/Debugging Frontend Applications.md new file mode 100644 index 00000000..51a64a0b --- /dev/null +++ b/00_Raw/Debugging Frontend Applications.md @@ -0,0 +1,74 @@ +# [[Debugging Frontend Applications]] + +## ๐Ÿ“Œ Brief Summary +ํ”„๋ก ํŠธ์—”๋“œ ๋””๋ฒ„๊น…์€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ, ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜, ๊ทธ๋ฆฌ๊ณ  ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง๊ณผ ๊ฐ™์€ ์„ฑ๋Šฅ ์ €ํ•˜ ์š”์ธ์„ ์‹๋ณ„ํ•˜๊ณ  ํ•ด๊ฒฐํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค [1-3]. Chrome DevTools์™€ ๊ฐ™์€ ๋ธŒ๋ผ์šฐ์ € ๋‚ด์žฅ ๋„๊ตฌ๋ถ€ํ„ฐ React DevTools, ๊ทธ๋ฆฌ๊ณ  Sentry๋‚˜ LogRocket๊ณผ ๊ฐ™์€ ํ”„๋กœ๋•์…˜ ํด๋ผ์šฐ๋“œ ๋กœ๊น… ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฌธ์ œ์˜ ๊ทผ๋ณธ ์›์ธ์„ ์ถ”์ ํ•ฉ๋‹ˆ๋‹ค [4-7]. ํšจ๊ณผ์ ์ธ ๋””๋ฒ„๊น… ์ „๋žต๊ณผ ์—๋Ÿฌ ํ•ธ๋“ค๋ง ์•„ํ‚คํ…์ฒ˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•˜๊ณ  ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์ตœ์ ํ™”ํ•˜๋Š” ๋ฐ ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค [8-10]. + +## ๐Ÿ“– Core Content + +* **๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜(Memory Leaks) ํƒ์ง€ ๋ฐ ํ•ด๊ฒฐ:** + * ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋Š” ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š์Œ์—๋„ ํ•ด์ œ๋˜์ง€ ์•Š์„ ๋•Œ ๋ฐœ์ƒํ•˜๋ฉฐ, ์•ฑ ์†๋„ ์ €ํ•˜์™€ ๋ธŒ๋ผ์šฐ์ € ํƒญ ์ถฉ๋Œ์„ ์œ ๋ฐœํ•ฉ๋‹ˆ๋‹ค [2, 11]. + * Chrome DevTools์˜ Task Manager๋ฅผ ํ†ตํ•ด ์‹ค์‹œ๊ฐ„ JavaScript ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ํ™•์ธํ•˜๊ณ , Performance ํƒญ์˜ ๊ธฐ๋ก์„ ํ†ตํ•ด ์‹œ๊ฐ„ ๊ฒฝ๊ณผ์— ๋”ฐ๋ฅธ ๋ฉ”๋ชจ๋ฆฌ ์ฆ๊ฐ€ ํŒจํ„ด์„ ์‹œ๊ฐํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [12, 13]. + * Memory ํŒจ๋„์˜ **Heap Snapshots**์„ ์‚ฌ์šฉํ•˜์—ฌ ์Šค๋ƒ…์ƒท ๊ฐ„์˜ ์ฐจ์ด(Delta)๋ฅผ ๋น„๊ตํ•จ์œผ๋กœ์จ, DOM์—์„œ ์ œ๊ฑฐ๋˜์—ˆ์œผ๋‚˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฐธ์กฐ๊ฐ€ ๋‚จ์•„์žˆ๋Š” 'Detached DOM nodes'๋ฅผ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [14-17]. ๋˜ํ•œ, **Allocation Timeline**์„ ํ†ตํ•ด ์ƒˆ๋กœ์šด ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์–ธ์ œ ํ• ๋‹น๋˜๋Š”์ง€ ์ถ”์ ํ•˜์—ฌ ๋ˆ„์ˆ˜ ํ›„๋ณด๋ฅผ ์ฐพ์•„๋ƒ…๋‹ˆ๋‹ค [18, 19]. +* **React ์ปดํฌ๋„ŒํŠธ ๋ฐ ์„ฑ๋Šฅ ๋””๋ฒ„๊น…:** + * **๋ฆฌ๋ Œ๋”๋ง ์›์ธ ์ถ”์ :** React DevTools์˜ Profiler๋ฅผ ์‚ฌ์šฉํ•ด ์–ด๋–ค ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ธ์ œ, ์™œ ๋ Œ๋”๋ง๋˜์—ˆ๋Š”์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ฐœ๋ฐœ ์ „์šฉ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ `why-did-you-render`๋ฅผ ํ†ตํ•ด ์‹ค์ œ props๋‚˜ ์ƒํƒœ ๋ณ€๊ฒฝ ์—†์ด ๋ฐœ์ƒํ•˜๋Š” ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ์ฝ˜์†” ๊ฒฝ๊ณ ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [7, 20]. + * **React Error Boundaries:** React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” Error Boundary๋ผ๋Š” ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ์˜ ๋ Œ๋”๋ง, ์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ, ์ƒ์„ฑ์ž์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ๋ฅผ ํฌ์ฐฉํ•ฉ๋‹ˆ๋‹ค [1]. ์ด๋Š” UI๋ฅผ ์œ„ํ•œ `try-catch` ๋ธ”๋ก ์—ญํ• ์„ ํ•˜๋ฉฐ, ์•ฑ ์ „์ฒด๊ฐ€ ์ถฉ๋Œํ•˜๋Š” ๋Œ€์‹  Fallback UI๋ฅผ ํ‘œ์‹œํ•˜์—ฌ ์•ฑ์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์„ ์ƒํ˜ธ์ž‘์šฉ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋กœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค [1, 8, 10]. +* **์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ์™€ ๋””๋ฒ„๊น… ํŽธ์˜์„ฑ:** + * ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ์˜ ์„ ํƒ์€ ๋””๋ฒ„๊น… ๊ฒฝํ—˜์— ํฐ ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค. Context API๋Š” ์ƒํƒœ ๋ณ€๊ฒฝ ๊ธฐ๋ก ์ถ”์ ์ด๋‚˜ ์‹œ๊ฐ„ ์—ฌํ–‰(Time-travel) ๋””๋ฒ„๊น…์ด ๋ถˆ๊ฐ€๋Šฅํ•˜์—ฌ ๋ฒ„๊ทธ ์›์ธ์„ ํŒŒ์•…ํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค [21]. ๋ฐ˜๋ฉด, Redux๋Š” Redux DevTools๋ฅผ ํ†ตํ•ด ์–ด๋–ค ์•ก์…˜์ด ์–ธ์ œ ๋””์ŠคํŒจ์น˜๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ์ƒํƒœ ์ด๋ ฅ์„ ๊ฒ€์‚ฌ ๋ฐ ์žฌ์ƒ(Replay)ํ•  ์ˆ˜ ์žˆ์–ด ๋ณต์žกํ•œ ๋น„๋™๊ธฐ ์—๋Ÿฌ๋ฅผ ์‹ ์†ํ•˜๊ฒŒ ๋””๋ฒ„๊น…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [21, 22]. +* **ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ๋กœ๊น…:** + * ๋ฐฐํฌ๋œ ํ”„๋กœ๋•์…˜ ์•ฑ์—์„œ๋Š” Sentry, LogRocket, Datadog RUM ๋“ฑ์˜ ํด๋ผ์šฐ๋“œ ๋กœ๊น… ํˆด์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž๊ฐ€ ๊ฒฝํ—˜ํ•˜๋Š” ์—๋Ÿฌ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค [23-25]. + * Sentry๋Š” ์ง€๋Šฅํ˜• ์—๋Ÿฌ ๊ทธ๋ฃนํ™”(Error grouping)์™€ ์—๋Ÿฌ ๋ฐœ์ƒ ์ „์˜ ์ฝ˜์†” ๋กœ๊ทธ, ๋„คํŠธ์›Œํฌ ์š”์ฒญ ๋“ฑ์„ ๋ณด์—ฌ์ฃผ๋Š” ๋นต๋ถ€์Šค๋Ÿฌ๊ธฐ(Breadcrumb) ํŠธ๋ ˆ์ผ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [4, 25]. LogRocket์€ ์‚ฌ์šฉ์ž์˜ ์ „์ฒด ํ™”๋ฉด์„ ๋…นํ™”ํ•˜๋“ฏ DOM ๋ฐ Redux/Vuex ์ƒํƒœ ๋ณ€ํ™”๊นŒ์ง€ ์บก์ฒ˜ํ•˜๋Š” ์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด(Session replay) ๊ธฐ๋Šฅ์œผ๋กœ ์ƒ์„ธํ•œ ๋””๋ฒ„๊น… ์ปจํ…์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [5]. Datadog RUM์€ ํ”„๋ก ํŠธ์—”๋“œ ์—๋Ÿฌ๋ฅผ ๋ฐฑ์—”๋“œ ๋ถ„์‚ฐ ํŠธ๋ ˆ์ด์‹ฑ(Distributed tracing)๊ณผ ์ƒ๊ด€๊ด€๊ณ„ ์ง€์–ด(Correlation) ๋ณต์žกํ•œ ์‹œ์Šคํ…œ์˜ ์—๋Ÿฌ๋ฅผ ํŒŒ์•…ํ•˜๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค [24]. + +## โš–๏ธ Trade-offs & Caveats + +* **ํด๋ผ์šฐ๋“œ ๋กœ๊น… ๋„๊ตฌ์˜ ์„ฑ๋Šฅ ๋ฐ ๋น„์šฉ ๋ฌธ์ œ:** ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ๋“ค์€ ๋ Œ๋”๋ง ์„ฑ๋Šฅ ๋ฐ ๋ฒˆ๋“ค ํฌ๊ธฐ์— ์ง์ ‘์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค. ์ผ๋ถ€ ๋„๊ตฌ ๊ตฌํ˜„ ์‹œ ์ตœ๋Œ€ 120ms์˜ ์ถ”๊ฐ€ ๋กœ๋“œ ์‹œ๊ฐ„์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [26]. ๋˜ํ•œ, Datadog๊ณผ ๊ฐ™์€ ํˆด์€ ๋กœ๊ทธ ์ˆ˜์ง‘(Ingest)๊ณผ ๊ฒ€์ƒ‰์„ ์œ„ํ•œ ์ธ๋ฑ์‹ฑ(Index)์— ๋Œ€ํ•ด ์ด์ค‘ ๊ณผ๊ธˆ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด ๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ๋น„์šฉ์ด ๋งค์šฐ ๊ฐ€ํŒŒ๋ฅด๊ฒŒ ์ฆ๊ฐ€ํ•˜๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค [27, 28]. +* **์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด์™€ ๊ฐœ์ธ์ •๋ณด ์นจํ•ด (Privacy Concerns):** LogRocket์ฒ˜๋Ÿผ '๋ชจ๋“  ๊ฒƒ์„ ์บก์ฒ˜'ํ•˜๋Š” ์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด ๋ฐฉ์‹์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ•๋ ฅํ•œ ๋””๋ฒ„๊น… ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜์ง€๋งŒ, ๋ฏผ๊ฐํ•œ ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๊นŒ์ง€ ๋…นํ™”๋  ์ˆ˜ ์žˆ๋Š” ์‹ฌ๊ฐํ•œ ๊ฐœ์ธ์ •๋ณด ์นจํ•ด ์šฐ๋ ค๊ฐ€ ๋™๋ฐ˜๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ณ„๋„์˜ ๋งˆ์Šคํ‚น ๋ฐ ์„ค์ • ์ž‘์—…์ด ๊ฐ•์ œ๋ฉ๋‹ˆ๋‹ค [5, 29, 30]. +* **Error Boundaries์˜ ํ•œ๊ณ„:** ์„ ์–ธ์ ์ธ UI ์—๋Ÿฌ ์ฒ˜๋ฆฌ์— ๊ฐ•๋ ฅํ•˜์ง€๋งŒ, ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ๋‚ด๋ถ€์˜ ์—๋Ÿฌ, `setTimeout` ๊ฐ™์€ ๋น„๋™๊ธฐ ์ฝ”๋“œ, ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง(SSR), ๊ทธ๋ฆฌ๊ณ  Error Boundary ์ž์ฒด์—์„œ ๋ฐœ์ƒํ•œ ์—๋Ÿฌ๋Š” ํฌ์ฐฉํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ถ€๋ถ„์€ ์ „ํ†ต์ ์ธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ `try/catch` ๋ธ”๋ก์œผ๋กœ ๋””๋ฒ„๊น… ๋ฐ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์•ผ ํ•˜๋Š” ์ œ์•ฝ์ด ์žˆ์Šต๋‹ˆ๋‹ค [31, 32]. +* **React Compiler ๋„์ž…์— ๋”ฐ๋ฅธ ๋””๋ฒ„๊น… ๋‚œ์ด๋„ ์ฆ๊ฐ€:** ์ฝ”๋“œ๋ฅผ ์ž๋™์œผ๋กœ ์ตœ์ ํ™”ํ•ด์ฃผ๋Š” React Compiler๋Š” ๋‚ด๋ถ€ ๋กœ์ง์ด ๋ธ”๋ž™๋ฐ•์Šค(Black box) ํ˜•ํƒœ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” ์ตœ์ ํ™”๋œ ๋ถ€๋ถ„๊ณผ ๊ทธ ์ด์œ ์— ๋Œ€ํ•œ ๊ฐ€์‹œ์„ฑ์„ ์žƒ๊ฒŒ ๋˜๋ฉฐ, ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๋ฆฌ๋ Œ๋”๋ง ๋ฐœ์ƒ ์‹œ ์ฝ”๋“œ์ƒ์˜ `React.memo`๋‚˜ `useCallback` ํ˜ธ์ถœ์„ ํ™•์ธํ•˜๋Š” ๋Œ€์‹  React DevTools Profiler์— ์ „์ ์œผ๋กœ ์˜์กดํ•ด ์กฐ์‚ฌํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋””๋ฒ„๊น… ๋‚œ์ด๋„๊ฐ€ ์ƒ์Šนํ•ฉ๋‹ˆ๋‹ค [33]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [๊ด€๊ณ„ ์œ ํ˜• A (๋ธŒ๋ผ์šฐ์ € ๋ฐ ์„ฑ๋Šฅ ๋ถ„์„ ๊ธฐ๋ฐ˜ ๋„๊ตฌ)] +- [[Chrome DevTools]] + - ์—ฐ๊ฒฐ ์ด์œ : ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํž™ ๋ฉ”๋ชจ๋ฆฌ์™€ DOM์˜ ์ƒํƒœ๋ฅผ ํ”„๋กœํŒŒ์ผ๋งํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ์ง„๋‹จํ•˜๋Š” ๊ฐ€์žฅ ๊ทผ๋ณธ์ ์ธ ํ”„๋ก ํŠธ์—”๋“œ ๋””๋ฒ„๊น… ๋„๊ตฌ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [6, 34]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ธŒ๋ผ์šฐ์ €์˜ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜(GC) ๋™์ž‘ ์›๋ฆฌ, ๋ถ„๋ฆฌ๋œ DOM ๋…ธ๋“œ(Detached DOM nodes)์™€ ํด๋กœ์ €(Closure)๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ์œ ํ•˜์—ฌ ์„ฑ๋Šฅ์„ ์ €ํ•˜์‹œํ‚ค๋Š” ์›๋ฆฌ๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2, 14, 17, 35]. + +#### [๊ด€๊ณ„ ์œ ํ˜• B (React ์ปดํฌ๋„ŒํŠธ ๋ฐ ์—๋Ÿฌ ํ•ธ๋“ค๋ง ๋„๊ตฌ)] +- [[React Error Boundaries]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋ Œ๋”๋ง ๋ฐ ์ƒ๋ช…์ฃผ๊ธฐ ๋„์ค‘ ๋ฐœ์ƒํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๋ฅผ ๋””๋ฒ„๊น…/ํ•ธ๋“ค๋งํ•˜์—ฌ "ํ•˜์–€ ํ™”๋ฉด(White screen of death)"์„ ๋ง‰์•„์ฃผ๋Š” React๋งŒ์˜ ๊ณ ์œ ํ•œ ๋ฐฉ์–ด์  ๋””๋ฒ„๊น… ํŒจํ„ด์ž…๋‹ˆ๋‹ค [1, 36]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์„ ์–ธ์ (Declarative) UI ํŠธ๋ฆฌ์˜ ์—๋Ÿฌ ์ „ํŒŒ ๋ฐฉ์‹๊ณผ, ๋ช…๋ นํ˜•(Imperative) ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์—์„œ `try-catch`๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜์  ์ฐจ์ด๋ฅผ ๋ช…ํ™•ํžˆ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [32]. +- [[React DevTools Profiler]] + - ์—ฐ๊ฒฐ ์ด์œ : ์–ด๋–ค ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ธ์ œ, ์™œ ๋ฆฌ๋ Œ๋”๋ง๋˜์—ˆ๋Š”์ง€๋ฅผ ์ธก์ •(Profiling)ํ•˜์—ฌ ๋ Œ๋”๋ง ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ๋””๋ฒ„๊น…ํ•˜๋Š” ํ•„์ˆ˜ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค [7, 37]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: React์˜ ๋ Œ๋”๋ง ๋ผ์ดํ”„์‚ฌ์ดํด, ๋ถˆํ•„์š”ํ•œ ์ƒํƒœ ๋ฐ props ๋ณ€๊ฒฝ ์ถ”์ , ๊ทธ๋ฆฌ๊ณ  React Compiler ๋„์ž… ์ „ํ›„์˜ ๋ Œ๋”๋ง ํŒจ์Šค(Render pass) ์ฐจ์ด๋ฅผ ๊ฒ€์ฆํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [7, 38]. + +#### [๊ด€๊ณ„ ์œ ํ˜• C (ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ ๊ด€์ธก์„ฑ ๋„๊ตฌ)] +- [[Session Replay & Distributed Tracing]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋กœ์ปฌ์—์„œ ์žฌํ˜„์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ํ”„๋กœ๋•์…˜ ์—๋Ÿฌ๋ฅผ ์ถ”์ ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ์ž์˜ ๋ธŒ๋ผ์šฐ์ € ์ƒํ˜ธ์ž‘์šฉ(Sentry, LogRocket)๊ณผ ๋ฐฑ์—”๋“œ ๋ฐ์ดํ„ฐ ํ๋ฆ„(Datadog)์„ ์—ฐ๊ฒฐํ•˜์—ฌ ๋””๋ฒ„๊น… ๋‹จ์„œ๋ฅผ ์ฐพ๋Š” ํ•ต์‹ฌ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค [5, 24, 39]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํ’€์Šคํƒ ํ™˜๊ฒฝ์—์„œ์˜ ์—”๋“œํˆฌ์—”๋“œ(End-to-End) ์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง ํ•œ๊ณ„์™€ ํ”„๋ก ํŠธ์—”๋“œ ์—๋Ÿฌ๊ฐ€ ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค์— ๋ฏธ์น˜๋Š” ์—ฐ๊ด€ ๊ด€๊ณ„๋ฅผ ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [24, 25]. + +### Deeper Research Questions + +- Chrome DevTools์˜ Heap Snapshot ๋ถ„์„์—์„œ 'Shallow size'์™€ 'Retained size'์˜ ์ฐจ์ด๋Š” ํ”„๋ก ํŠธ์—”๋“œ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ์ธก๋ฉด์—์„œ ์–ด๋–ป๊ฒŒ ํ•ด์„๋˜๋ฉฐ, ๋””๋ฒ„๊น… ์‹œ ์–ด๋–ค ๊ธฐ์ค€ํ‘œ๊ฐ€ ๋˜๋Š”๊ฐ€? [40] +- React Error Boundary๊ฐ€ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋‚˜ ๋น„๋™๊ธฐ ์ฝ”๋“œ์˜ ์—๋Ÿฌ๋ฅผ ์žก์ง€ ๋ชปํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜์  ์ด์œ ๋Š” ๋ฌด์—‡์ด๋ฉฐ, ์ด๋ฅผ ๋ณด์™„ํ•˜์—ฌ ์ „์ฒด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์—๋Ÿฌ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ์บก์ฒ˜ํ•˜๊ธฐ ์œ„ํ•œ ์ตœ์ ์˜ ๋กœ๊น… ํŒจํ„ด์€ ๋ฌด์—‡์ธ๊ฐ€? [31, 32] +- Sentry, LogRocket, Datadog RUM ๋“ฑ ํด๋ผ์šฐ๋“œ ๊ธฐ๋ฐ˜ ๋กœ๊น… ๋„๊ตฌ๊ฐ€ ํ”„๋ก ํŠธ์—”๋“œ ๋ฒˆ๋“ค ํฌ๊ธฐ ์ฆ๊ฐ€ ๋ฐ ์ดˆ๊ธฐ ๋ Œ๋”๋ง ์„ฑ๋Šฅ ์ง€์—ฐ(์ตœ๋Œ€ 120ms ์ถ”๊ฐ€ ๋กœ๋“œ)์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•œ ์„ค์ • ๋ฐ ๋กœ๋“œ ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? [26, 41] +- Redux DevTools์˜ ์‹œ๊ฐ„ ์—ฌํ–‰(Time-travel) ๋””๋ฒ„๊น… ์›๋ฆฌ๋Š” ๋ฌด์—‡์ด๋ฉฐ, ์™œ Context API๋‚˜ Zustand๋ณด๋‹ค ๋ณต์žกํ•œ ๋น„๋™๊ธฐ ์ƒํƒœ์˜ ๋ฒ„๊ทธ๋ฅผ ๋” ๋น ๋ฅด๊ณ  ์ •ํ™•ํ•˜๊ฒŒ ์ฐพ์•„๋‚ผ ์ˆ˜ ์žˆ๋Š”๊ฐ€? [21, 22] +- React Compiler ๋„์ž… ์ดํ›„ ์ž๋™ํ™”๋œ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ Œ๋”๋ง ์ด์Šˆ(์˜ˆ: Library Compatibility ๋ฌธ์ œ๋กœ ์ธํ•œ ์ฐธ์กฐ ๋ณ€๊ฒฝ)๋ฅผ ๋””๋ฒ„๊น…ํ•˜๊ธฐ ์œ„ํ•ด React Profiler๋ฅผ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•ด์•ผ ํ•˜๋Š”๊ฐ€? [33, 42, 43] + +### Practical Application Contexts + +- **Implementation:** ๊ฐœ๋ฐœ์ž๋Š” `why-did-you-render` ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ”„๋กœ์ ํŠธ์— ์—ฐ๋™ํ•ด, ๋กœ์ปฌ ๊ฐœ๋ฐœ ์‹œ ๋ถˆํ•„์š”ํ•œ ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง ์›์ธ์„ ์ฝ˜์†” ๊ฒฝ๊ณ ๋ฅผ ํ†ตํ•ด ์ฆ‰๊ฐ์ ์œผ๋กœ ํŒŒ์•…ํ•˜๊ณ  ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [20, 44]. +- **System Design:** ํ”„๋ก ํŠธ์—”๋“œ ์‹œ์Šคํ…œ ์„ค๊ณ„ ์‹œ ๋Œ€์‹œ๋ณด๋“œ, ์ฐจํŠธ, ๋ณต์žกํ•œ ํผ ๋“ฑ ์žฅ์•  ๋ฐœ์ƒ ํ™•๋ฅ ์ด ๋†’์€ UI ์ปดํฌ๋„ŒํŠธ ๊ฐ๊ฐ์— ๋…๋ฆฝ์ ์ธ `Error Boundary`๋ฅผ ๋ฐฐ์น˜ํ•ด ํ•˜๋‚˜์˜ ์œ„์ ฏ ๊ฒฐํ•จ์ด ์ „์ฒด ์•ฑ์˜ ๋งˆ๋น„๋ฅผ ๊ฐ€์ ธ์˜ค์ง€ ์•Š๋„๋ก ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค [8, 45, 46]. +- **Operation / Maintenance:** ํ”„๋กœ๋•์…˜ ๋‹จ๊ณ„์—์„œ๋Š” Sentry๋‚˜ LogRocket๊ณผ ๊ฐ™์€ ๊ด€์ธก์„ฑ(Observability) ํˆด์„ ํ†ตํ•ฉํ•˜์—ฌ, ์˜ค๋ฅ˜ ๋กœ๊ทธ ๋ฐœ์ƒ ์‹œ ์‚ฌ์šฉ์ž๊ฐ€ ํด๋ฆญํ•œ ์ด๋ฒคํŠธ์™€ ํ™”๋ฉด์˜ ์ƒํƒœ(Session Replay)๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํ™•์ธํ•˜๊ณ  ๋น ๋ฅด๊ฒŒ ์ด์Šˆ๋ฅผ ๋Œ€์‘(Hotfix)ํ•ฉ๋‹ˆ๋‹ค [5, 25, 47]. +- **Learning Path:** ์ฃผ๋‹ˆ์–ด ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ํ•™์Šตํ•  ๋•Œ, Chrome DevTools์˜ Memory ํƒญ์„ ์‚ฌ์šฉํ•ด ์Šค๋ƒ…์ƒท์„ ์ฐ๊ณ  DOM ๋…ธ๋“œ๊ฐ€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ณ€์ˆ˜์— ์˜ํ•ด ์ฐธ์กฐ๋˜์–ด ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜๋˜์ง€ ์•Š๋Š” ์ƒํ™ฉ(Detached Elements)์„ ์‹ค์Šตํ•ฉ๋‹ˆ๋‹ค [14, 15, 17]. +- **My Project Relevance:** React ํ”„๋กœ์ ํŠธ์—์„œ ์ „์—ญ ์ƒํƒœ๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ, ๋‹จ์ˆœ ์„ค์ •(Theme ๋“ฑ)์€ ๋””๋ฒ„๊น…์ด ๋‹จ์ˆœํ•œ Context API๋กœ, ๋ณ€๊ฒฝ์ด ์žฆ๊ณ  ์ƒํƒœ ์ถ”์ ์ด ์ค‘์š”ํ•œ ์š”์†Œ๋Š” DevTools๋ฅผ ์ง€์›ํ•˜๋Š” Redux๋‚˜ Zustand๋ฅผ ๋„์ž…ํ•˜์—ฌ ๋””๋ฒ„๊น… ์šฉ์ด์„ฑ์„ ํ™•๋ณดํ•ฉ๋‹ˆ๋‹ค [22, 48, 49]. + +### Adjacent Topics + +- [[State Management Architecture]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(Redux, Zustand, Context API ๋“ฑ)์˜ ์•„ํ‚คํ…์ฒ˜์  ์„ ํƒ์ด ์ƒํƒœ ๋ณ€ํ™” ์ถ”์ ์„ฑ๊ณผ DevTools ๋””๋ฒ„๊น… ํ€„๋ฆฌํ‹ฐ์— ์–ด๋–ค ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”์ง€ ๋ถ„์„ [21, 22, 49]. +- [[Frontend Performance Optimization]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋””๋ฒ„๊น…์„ ํ†ตํ•ด ๋ฐœ๊ฒฌํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜์™€ ๋ถˆํ•„์š”ํ•œ ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง(Re-renders) ๋ฌธ์ œ๋ฅผ ์‹ค์งˆ์ ์ธ ์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ธฐ๋ฒ•(๊ฐ€์ƒํ™”, ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…)์œผ๋กœ ํ•ด๊ฒฐํ•˜์—ฌ Core Web Vitals๋ฅผ ๊ฐœ์„ ํ•˜๋Š” ๋ฐฉํ–ฅ [20, 50]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Engineering Scalable Frontend Systems.md b/00_Raw/Engineering Scalable Frontend Systems.md new file mode 100644 index 00000000..387ef5fb --- /dev/null +++ b/00_Raw/Engineering Scalable Frontend Systems.md @@ -0,0 +1,84 @@ +# [[Engineering Scalable Frontend Systems]] + +## ๐Ÿ“Œ Brief Summary +ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ํ”„๋ก ํŠธ์—”๋“œ ์‹œ์Šคํ…œ(Engineering Scalable Frontend Systems)์€ ๋‹จ์ˆœํ•œ ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰์„ ๋„˜์–ด ์œ ์ง€๋ณด์ˆ˜์„ฑ, ๊ณ ์„ฑ๋Šฅ, ๊ฒฌ๊ณ ์„ฑ์„ ๊ฐ–์ถ˜ ๋ถ„์‚ฐ ์†Œํ”„ํŠธ์›จ์–ด ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค [1]. ์ด๋Š” ๊ธฐ์ˆ ์  ํŒŒ์ผ ๊ธฐ๋ฐ˜ ํด๋” ๊ตฌ์กฐ์—์„œ ๊ธฐ๋Šฅ ์ค‘์‹ฌ(Feature-Based) ๋ฐ ๋„๋ฉ”์ธ ๊ธฐ๋ฐ˜ ์„ค๊ณ„๋กœ์˜ ์ „ํ™˜์„ ์š”๊ตฌํ•˜๋ฉฐ, ์—„๊ฒฉํ•œ ์ฝ”๋“œ ์ปจ๋ฒค์…˜๊ณผ ๊ฑฐ๋ฒ„๋„Œ์Šค๋ฅผ ๋™๋ฐ˜ํ•ฉ๋‹ˆ๋‹ค [2, 3]. ๋˜ํ•œ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์— SOLID์™€ ๊ฐ™์€ ์†Œํ”„ํŠธ์›จ์–ด ๊ณตํ•™ ์›์น™์„ ๊ฒฐํ•ฉํ•˜๊ณ , ์„œ๋ฒ„/ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ์˜ ๋ถ„๋ฆฌ, ๊ทธ๋ฆฌ๊ณ  ๋นŒ๋“œ ํƒ€์ž„ ๋ฐ ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ํ†ตํ•ด ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ์„ฑ์žฅ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค [1, 4, 5]. + +## ๐Ÿ“– Core Content + +* **์•„ํ‚คํ…์ฒ˜ ๋ฐ ํด๋” ๊ตฌ์กฐ์˜ ์ง„ํ™”** + ๊ธฐ์กด์˜ ์ปดํฌ๋„ŒํŠธ, ํ›…, ์Šคํƒ€์ผ ๋“ฑ์„ ํŒŒ์ผ ํƒ€์ž…๋ณ„๋กœ ๋ชจ์•„๋‘๋Š” ๊ตฌ์กฐ๋Š” ์•ฑ์ด ์ปค์งˆ์ˆ˜๋ก ์ธ์ง€ ๋ถ€ํ•˜๋ฅผ ๋†’์ด๊ณ  ํ™•์žฅ์„ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค [2, 6]. 2025๋…„์˜ ํ”„๋ก ํŠธ์—”๋“œ ์‹œ์Šคํ…œ์€ ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ๊ณผ ๊ธฐ๋Šฅ(Feature)์„ ์ค‘์‹ฌ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์‘์ง‘์‹œํ‚ค๋Š” ๊ตฌ์กฐ๋ฅผ ํ‘œ์ค€์œผ๋กœ ์‚ผ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค [3, 7]. ํŠนํžˆ **Feature-Sliced Design (FSD)** ๊ฐ™์€ ์•„ํ‚คํ…์ฒ˜๋Š” ์ฝ”๋“œ๋ฅผ ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ๋ณ„ ๋ ˆ์ด์–ด(shared, entities, features, widgets, pages, app)๋กœ ๋‚˜๋ˆ„๊ณ , ์ƒ์œ„ ๊ณ„์ธต์—์„œ ํ•˜์œ„ ๊ณ„์ธต์œผ๋กœ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์—„๊ฒฉํ•œ ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ๊ทœ์น™์„ ๊ฐ•์ œํ•ฉ๋‹ˆ๋‹ค [8-10]. ๊ฐ ์Šฌ๋ผ์ด์Šค๋Š” `index.ts`๋ฅผ ํ†ตํ•ด ํผ๋ธ”๋ฆญ API(Public API)๋งŒ ์™ธ๋ถ€์— ๋…ธ์ถœํ•˜์—ฌ ๋‚ด๋ถ€ ๊ตฌํ˜„์„ ์บก์Аํ™”ํ•ฉ๋‹ˆ๋‹ค [4, 11, 12]. +* **์†Œํ”„ํŠธ์›จ์–ด ๊ณตํ•™ ์›์น™์˜ ์ ์šฉ (SOLID & Clean Code)** + ํ”„๋ก ํŠธ์—”๋“œ ์ฝ”๋“œ์˜ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ์œ„ํ•ด SOLID, DRY, KISS, YAGNI ์›์น™์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค [4, 13]. + * ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)์— ๋”ฐ๋ผ ๋„ˆ๋ฌด ๋งŽ์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋Œ€ํ˜• ์ปดํฌ๋„ŒํŠธ(์˜ˆ: 300์ค„ ์ด์ƒ)๋Š” ๋ฐ์ดํ„ฐ ํŒจ์นญ, ์ƒํƒœ ๊ด€๋ฆฌ, UI ๋ Œ๋”๋ง ๋“ฑ์˜ ์ฑ…์ž„์— ๋งž๊ฒŒ ๋” ์ž‘๊ณ  ๋…๋ฆฝ์ ์ธ ๋‹จ์œ„๋กœ ๋ถ„๋ฆฌ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [14]. + * ๊ฐœ๋ฐฉ-ํ์‡„ ์›์น™(OCP)์€ ๊ธฐ์กด ์ปดํฌ๋„ŒํŠธ ์†Œ์Šค๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  `children` prop์ด๋‚˜ Render Props ํŒจํ„ด์„ ์ด์šฉํ•œ ์ปดํฌ๋„ŒํŠธ ํ•ฉ์„ฑ(Composition)์œผ๋กœ ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค [15, 16]. + * ์ค‘๋ณต์„ ์ค„์ด๋Š” DRY ์›์น™์€ ๊ณตํ†ต ๋กœ์ง์„ ์ปค์Šคํ…€ ํ›…์œผ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•˜์ง€๋งŒ, ์ง€๋‚˜์นœ ์ถ”์ƒํ™”๋Š” ์ฝ”๋“œ ํŒŒ์•…์„ ์–ด๋ ต๊ฒŒ ํ•˜๋ฏ€๋กœ ๋‹จ์ˆœ์„ฑ์„ ์œ ์ง€ํ•˜๋Š” KISS ์›์น™๊ณผ ๊ท ํ˜•์„ ์ด๋ฃจ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [17]. +* **์ƒํƒœ ๊ด€๋ฆฌ ํŒจ๋Ÿฌ๋‹ค์ž„์˜ ์„ธ๋ถ„ํ™”** + ๊ฑฐ๋Œ€ํ•œ ๋‹จ์ผ ์ƒํƒœ ์ €์žฅ์†Œ(์˜ˆ: ๊ณผ๊ฑฐ์˜ Redux)์— ์˜์กดํ•˜๊ธฐ๋ณด๋‹ค๋Š” ๋ฐ์ดํ„ฐ์˜ ์„ฑ๊ฒฉ์— ๋”ฐ๋ผ ์ตœ์ ์˜ ๋„๊ตฌ๋ฅผ ์„ ํƒํ•˜์—ฌ ์ƒํƒœ๋ฅผ ํŒŒํŽธํ™” ๋ฐ ์ „๋ฌธํ™”ํ•ฉ๋‹ˆ๋‹ค [5]. + * **์ „์—ญ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒํƒœ:** Context API๋Š” ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ ์ „์ฒด๋ฅผ ๋ฆฌ๋ Œ๋”๋งํ•˜๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ [18, 19], ์ƒํƒœ ๋ณ€๊ฒฝ์ด ์žฆ๊ณ  ๊ทœ๋ชจ๊ฐ€ ํฐ ์•ฑ์—์„œ๋Š” ๋ถ€๋ถ„ ๊ตฌ๋…(Selector)์„ ์ง€์›ํ•˜์—ฌ ๋ Œ๋”๋ง ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๋Š” **Zustand**๋‚˜ **Jotai**๊ฐ€ ์„ ํ˜ธ๋ฉ๋‹ˆ๋‹ค [5, 20, 21]. + * **์„œ๋ฒ„ ์ƒํƒœ (API Layer):** API์—์„œ ๊ฐ€์ ธ์˜จ ๋ฐ์ดํ„ฐ๋Š” ์บ์‹ฑ, ๋™๊ธฐํ™”, ๋กœ๋”ฉ/์—๋Ÿฌ ์‚ฌ์ดํด ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋ฏ€๋กœ, ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ์™€ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌํ•˜์—ฌ **TanStack Query (React Query)** ๋“ฑ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค [18, 22]. +* **์„ฑ๋Šฅ ์—”์ง€๋‹ˆ์–ด๋ง ๋ฐ ๋นŒ๋“œ ์ตœ์ ํ™”** + ์ดˆ๊ธฐ ๋กœ๋”ฉ ์‹œ๊ฐ„๊ณผ Core Web Vitals ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด ๋‹ค์–‘ํ•œ ๊ธฐ๋ฒ•์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค [23, 24]. + * **๋นŒ๋“œ/์ปดํŒŒ์ผ ํƒ€์ž„:** Vite์™€ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ES ๋ชจ๋“ˆ์„ ์ œ๊ณตํ•˜๊ณ , ํ”„๋กœ๋•์…˜์—์„œ๋Š” Rollup์˜ `manualChunks`๋ฅผ ํ™œ์šฉํ•ด ์šฉ๋Ÿ‰์ด ํฐ ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(React, Recharts ๋“ฑ)๋ฅผ ๋ถ„ํ•  ์บ์‹ฑํ•˜์—ฌ ์บ์‹œ ํšจ์œจ์„ ๋†’์ž…๋‹ˆ๋‹ค [23, 25-27]. ๋˜ํ•œ **React Compiler**์˜ ๋„์ž…์œผ๋กœ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ž๋™์œผ๋กœ ์ฝ”๋“œ์˜ ๋ฆฌ๋ Œ๋”๋ง ๋ฐฉ์ง€(๋ฉ”๋ชจ์ด์ œ์ด์…˜)๋ฅผ ์ฒ˜๋ฆฌํ•˜์—ฌ ์ˆ˜๋™ ์ตœ์ ํ™”(`useMemo`, `useCallback`)์˜ ์˜ค๋ฅ˜๋ฅผ ์ค„์—ฌ์ค๋‹ˆ๋‹ค [25, 28, 29]. + * **๋Ÿฐํƒ€์ž„ ์ตœ์ ํ™”:** ๋™์  ์ž„ํฌํŠธ๋ฅผ ์ด์šฉํ•œ ๋ผ์šฐํŠธ ๋ฐ ์ปดํฌ๋„ŒํŠธ ๋ ˆ๋ฒจ์˜ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…(Code Splitting & Lazy Loading), ๊ทธ๋ฆฌ๊ณ  ์ˆ˜์ฒœ ๊ฐœ์˜ ๋ฆฌ์ŠคํŠธ ์•„์ดํ…œ ๋ Œ๋”๋ง ์‹œ DOM ๋น„๋Œ€๋ฅผ ๋ง‰๋Š” ๊ฐ€์ƒํ™”(Virtualization) ๊ธฐ์ˆ ์ด ํ•„์ˆ˜์ ์œผ๋กœ ์š”๊ตฌ๋ฉ๋‹ˆ๋‹ค [30-32]. +* **๋ณต์›๋ ฅ(Resilience) ๋ฐ ์‹œ์Šคํ…œ ๊ฑฐ๋ฒ„๋„Œ์Šค** + ๊ฒฌ๊ณ ํ•œ ์‹œ์Šคํ…œ์€ ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜๊ฐ€ ์ „์ฒด ์•ฑ์˜ ํฌ๋ž˜์‹œ๋กœ ์ด์–ด์ง€๋Š” ๊ฒƒ์„ ๋ง‰์Šต๋‹ˆ๋‹ค. UI์˜ ๋ถˆ์•ˆ์ •ํ•œ ์˜์—ญ์ด๋‚˜ ์„œ๋“œํŒŒํ‹ฐ ์œ„์ ฏ์€ **Error Boundaries**๋กœ ๊ฐ์‹ธ ํด๋ฐฑ UI๋ฅผ ์ œ๊ณตํ•˜์—ฌ ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค [33-35]. ๋˜ํ•œ, ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•œ DevTools ํž™ ์Šค๋ƒ…์ƒท ๋””๋ฒ„๊น…๊ณผ Sentry, LogRocket ๊ฐ™์€ ํด๋ผ์šฐ๋“œ ๋„๊ตฌ๋ฅผ ์ด์šฉํ•œ ํ”„๋กœ๋•์…˜ ์—๋Ÿฌ ๋ชจ๋‹ˆํ„ฐ๋ง์ด ํ™œ์šฉ๋ฉ๋‹ˆ๋‹ค [36-38]. ํ˜‘์—… ์ฐจ์›์—์„œ๋Š” ์ผ๊ด€๋œ ๋„ค์ด๋ฐ ๊ทœ์น™(์˜ˆ: ํŒŒ์ผ๋ช…์€ kebab-case, ์ปดํฌ๋„ŒํŠธ๋Š” PascalCase)๊ณผ ESLint, Prettier, Husky๋ฅผ ํ†ตํ•œ ์ž๋™ํ™”๋œ ๊ฑฐ๋ฒ„๋„Œ์Šค, ๊ทธ๋ฆฌ๊ณ  Storybook์„ ํ™œ์šฉํ•œ ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ๊ฐ€ ์ฝ”๋“œ ํ’ˆ์งˆ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค [39-41]. + +## โš–๏ธ Trade-offs & Caveats +* **Feature-Sliced Design (FSD)์˜ ์ดˆ๊ธฐ ๋„์ž… ๋น„์šฉ ๋ฐ ๋ณต์žก์„ฑ:** FSD๋Š” ํ™•์žฅ์„ฑ๊ณผ ๋ชจ๋“ˆํ™”์— ๋›ฐ์–ด๋‚˜์ง€๋งŒ ๋Ÿฌ๋‹ ์ปค๋ธŒ๊ฐ€ ๋†’์œผ๋ฉฐ, ์ž‘์€ ๊ทœ๋ชจ์˜ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์˜ค๋ฒ„์—”์ง€๋‹ˆ์–ด๋ง์œผ๋กœ ๋А๊ปด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [42, 43]. ๋˜ํ•œ '์ธ์ฆ(Auth)' ๊ฐ™์€ ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ(Cross-cutting concerns)๋ฅผ ์ •ํ™•ํžˆ ์–ด๋–ค ๊ธฐ๋Šฅ์ด๋‚˜ ์Šฌ๋ผ์ด์Šค์— ๋ฐฐ์น˜ํ• ์ง€ ๊ฒฝ๊ณ„๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ์–ด๋ ค์›Œ ํŒ€ ๋‚ด ๊ทœ์น™ ํ•ฉ์˜์™€ ์ง€์†์ ์ธ ๋ฌธ์„œํ™”๊ฐ€ ์š”๊ตฌ๋ฉ๋‹ˆ๋‹ค [44, 45]. +* **React Compiler ์ ์šฉ์˜ ์ œ์•ฝ:** React Compiler๊ฐ€ ์ž๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ์„ฑ๋Šฅ์„ ๋†’์—ฌ์ฃผ์ง€๋งŒ, ์ด๋Š” ๋ธ”๋ž™๋ฐ•์Šค๋กœ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜ˆ๊ธฐ์น˜ ์•Š๊ฒŒ ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์›์ธ์„ ๋””๋ฒ„๊น…ํ•˜๊ธฐ ๋” ์–ด๋ ค์›Œ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [46]. ๋˜ํ•œ ๋งค ๋ Œ๋”๋ง๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๊ฐ์ฒด ์ฐธ์กฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์ถฉ๋Œํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ๊ฒฝ์šฐ React์˜ ๋ถˆ๋ณ€์„ฑ ๋ฐ ๋ถ€์ˆ˜ ํšจ๊ณผ ๊ทœ์น™(Rules of React)์„ ์—„๊ฒฉํžˆ ์ค€์ˆ˜ํ•˜๋„๋ก ๋Œ€๋Œ€์ ์ธ ๋ฆฌํŒฉํ† ๋ง์ด ์„ ํ–‰๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [28, 47, 48]. +* **Context API vs. ์™ธ๋ถ€ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„:** Context API๋Š” ๋‚ด์žฅ ๊ธฐ๋Šฅ์ด๋ฏ€๋กœ ์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๋Š” ์žฅ์ ์ด ์žˆ์ง€๋งŒ, ๋ณ€๊ฒฝ์ด ์žฆ์€ ์ƒํƒœ์— ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ๋ถˆํ•„์š”ํ•œ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์˜ ์—ฐ์‡„ ๋ฆฌ๋ Œ๋”๋ง์„ ์œ ๋ฐœํ•˜๋Š” ์น˜๋ช…์ ์ธ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ์„ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค [19, 20]. ๋ฐ˜๋Œ€๋กœ Zustand๋‚˜ TanStack Query๋ฅผ ๋„์ž…ํ•˜๋ฉด ๋ฆฌ๋ Œ๋”๋ง ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์œผ๋‚˜, ์‹œ์Šคํ…œ์— ์ƒˆ๋กœ์šด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์˜์กด์„ฑ๊ณผ ํ•™์Šต ๊ณก์„ ์ด ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค [21, 49]. +* **DRY์™€ KISS ์›์น™์˜ ์ƒ์ถฉ:** ์ค‘๋ณต์„ ์ค„์ด๊ธฐ(DRY) ์œ„ํ•ด ๊ณตํ†ต ๋กœ์ง์„ ๊ณ ์ฐจ ์ปดํฌ๋„ŒํŠธ(HOC)๋‚˜ ์ปค์Šคํ…€ ํ›…์œผ๋กœ ์ง€๋‚˜์น˜๊ฒŒ ์ถ”์ƒํ™”ํ•˜๋ฉด, ์ฝ”๋“œ๊ฐ€ ์›๋ž˜์˜ ๋‹จ์ˆœํ•œ ํ˜•ํƒœ๋ณด๋‹ค ์ดํ•ดํ•˜๊ณ  ๋””๋ฒ„๊น…ํ•˜๊ธฐ ํ›จ์”ฌ ์–ด๋ ค์›Œ์ ธ ๊ฒฐ๊ตญ KISS ์›์น™์„ ์œ„๋ฐฐํ•˜๊ฒŒ ๋˜๋Š” ๋ถ€์ž‘์šฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [17]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [๊ด€๊ณ„ ์œ ํ˜• A: ์•„ํ‚คํ…์ฒ˜ ๋ฐ ์‹œ์Šคํ…œ ๊ตฌ์กฐ (Architecture & Structural Design)] +* `[[Feature-Sliced Design (FSD)]]` + * ์—ฐ๊ฒฐ ์ด์œ : ํ˜„๋Œ€ ํ”„๋ก ํŠธ์—”๋“œ์˜ ๋ชจ๋“ˆํ™” ๋ฐ ํ™•์žฅ์„ฑ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋„๋ฆฌ ์ฑ„ํƒ๋˜๋Š” ์•„ํ‚คํ…์ฒ˜ ๋ฐฉ๋ฒ•๋ก ์˜ ํ•ต์‹ฌ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [9, 10]. + * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ ๊ธฐ๋ฐ˜์˜ ์ฝ”๋“œ ๋ถ„ํ• , ์—„๊ฒฉํ•œ ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ๊ทœ์น™ ์ ์šฉ ๋ฐฉ๋ฒ•, ๊ทธ๋ฆฌ๊ณ  ํผ๋ธ”๋ฆญ API๋ฅผ ํ†ตํ•œ ๋ชจ๋“ˆ ์บก์Аํ™” ์›๋ฆฌ [4, 8, 50]. +* `[[Error Boundaries]]` + * ์—ฐ๊ฒฐ ์ด์œ : ๋ถ€๋ถ„์ ์ธ UI ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๊ฐ€ ์‹œ์Šคํ…œ ์ „์ฒด์˜ ์žฅ์• (White screen of death)๋กœ ํ™•์‚ฐ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๊ตฌ์กฐ์  ์•ˆ์ „ ์žฅ์น˜์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [33, 34]. + * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ Œ๋”๋ง ํŠธ๋ฆฌ์—์„œ ์ปดํฌ๋„ŒํŠธ ๊ฒฐํ•จ์„ ๊ฒฉ๋ฆฌํ•˜๋Š” ์›๋ฆฌ์™€ ์‹œ์Šคํ…œ ๋ณต์›๋ ฅ์„ ๋†’์ด๋Š” ์—๋Ÿฌ ์ฒ˜๋ฆฌ ์ „๋žต [33, 35]. + +#### [๊ด€๊ณ„ ์œ ํ˜• B: ์ƒํƒœ ๊ด€๋ฆฌ ํŒจ๋Ÿฌ๋‹ค์ž„ (State Management Paradigms)] +* `[[Zustand vs Context API]]` + * ์—ฐ๊ฒฐ ์ด์œ : ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ์—์„œ ์„ฑ๋Šฅ๊ณผ ํ™•์žฅ์„ฑ์„ ๊ฒฐ์ •์ง“๋Š” ๊ฐ€์žฅ ๋นˆ๋ฒˆํ•œ ์•„ํ‚คํ…์ฒ˜ ๊ฒฐ์ • ์ง€์ ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [5, 19]. + * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Context API์˜ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ๋ Œ๋”๋ง ๋ฌธ์ œ์ ๊ณผ ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ Zustand์˜ ๊ตฌ๋…/์„ ํƒ์ž(Selector) ๊ธฐ๋ฐ˜ ๋ Œ๋”๋ง ์ตœ์ ํ™” ๊ธฐ๋ฒ• [19, 20, 51]. +* `[[TanStack Query (React Query)]]` + * ์—ฐ๊ฒฐ ์ด์œ : ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ์™€ ์„œ๋ฒ„ ์ƒํƒœ(Server State)๋ฅผ ๊ตฌ์กฐ์ ์œผ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ API ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ์˜ ๋ณ‘๋ชฉ์„ ์—†์• ์ฃผ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [18, 22]. + * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ฐ์ดํ„ฐ ์บ์‹ฑ, ๋ฐฑ๊ทธ๋ผ์šด๋“œ ๋™๊ธฐํ™” ๋ฐ API ๊ณ„์ธต์˜ ๊ด€์‹ฌ์‚ฌ ๋ถ„๋ฆฌ(Separation of Concerns) [18, 22]. + +#### [๊ด€๊ณ„ ์œ ํ˜• C: ์„ฑ๋Šฅ ๋ฐ ๋นŒ๋“œ ์ตœ์ ํ™” (Performance & Build Optimization)] +* `[[React Compiler]]` + * ์—ฐ๊ฒฐ ์ด์œ : ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์˜ ๋ณต์žก์„ฑ์„ ์ค„์ด๊ณ  ๋นŒ๋“œ ํƒ€์ž„์— ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง ์„ฑ๋Šฅ์„ ์ž๋™์œผ๋กœ ์ตœ์ ํ™”ํ•˜๋Š” ์ตœ์‹  ํ•ต์‹ฌ ๋„๊ตฌ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [25, 28, 29]. + * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์„ ์–ธ์  UI ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ์˜ ๋นŒ๋“œ ํƒ€์ž„ ์ตœ์ ํ™” ํ•œ๊ณ„ ๋ฐ React์˜ ๊ทœ์น™(Rules of React)์ด ๊ฐ•์ œํ•˜๋Š” ๋ถˆ๋ณ€์„ฑ์˜ ์ค‘์š”์„ฑ [52, 53]. +* `[[Code Splitting & Lazy Loading]]` + * ์—ฐ๊ฒฐ ์ด์œ : ์ดˆ๊ธฐ ๋กœ๋“œ(First Paint) ์†๋„ ํ–ฅ์ƒ๊ณผ JavaScript ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ œ์–ดํ•˜๋Š” ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์‹œ์Šคํ…œ์˜ ํ•„์ˆ˜ ์„ฑ๋Šฅ ์ „๋žต์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [30, 31, 54]. + * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Vite๋‚˜ Webpack ๊ฐ™์€ ๋ฒˆ๋“ค๋Ÿฌ ํ™˜๊ฒฝ์—์„œ ๋™์  ์ž„ํฌํŠธ๋ฅผ ํ†ตํ•œ ๋ผ์šฐํŠธ ๋‹จ์œ„ ๋ถ„ํ•  ๋ฐ ๋ฌด๊ฑฐ์šด ๋ฒค๋” ์ฒญํฌ(`manualChunks`)์˜ ์บ์‹ฑ ๋ถ„๋ฆฌ ์ „๋žต [26, 27, 31]. + +### Deeper Research Questions + +* ๊ฑฐ๋Œ€ํ•œ ๋ชจ๋†€๋ฆฌ์‹ ๊ตฌ์กฐ ํ˜น์€ ๋‹จ์ผ ํŒŒ์ผ ํƒ€์ž…(components/, hooks/) ๊ธฐ๋ฐ˜์˜ ๋ ˆ๊ฑฐ์‹œ React ์•ฑ์„ Feature-Sliced Design(FSD) ์•„ํ‚คํ…์ฒ˜๋กœ ์ ์ง„์ ์œผ๋กœ ๋ฆฌํŒฉํ† ๋งํ•  ๋•Œ ๊ณ ๋ คํ•ด์•ผ ํ•  ์ตœ์ ์˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? +* React Compiler๊ฐ€ ๋„์ž…๋˜์–ด ์ปดํฌ๋„ŒํŠธ์˜ ๋ฆฌ๋ Œ๋”๋ง์„ ์ž๋™์œผ๋กœ ์ œ์–ดํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด, ๊ฐœ๋ฐœ์ž๋Š” ๋” ์ด์ƒ `useMemo`๋‚˜ `useCallback`์„ ์ž‘์„ฑํ•  ํ•„์š”๊ฐ€ ์™„์ „ํžˆ ์—†์–ด์ง€๋Š”๊ฐ€? ํ˜น์€ ์—ฌ์ „ํžˆ ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์ด ํ•„์ˆ˜์ ์ธ ์—ฃ์ง€ ์ผ€์ด์Šค๋Š” ๋ฌด์—‡์ธ๊ฐ€? +* Zustand์™€ ๊ฐ™์€ ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ ๊ด€๋ฆฌ์™€ TanStack Query์™€ ๊ฐ™์€ ์„œ๋ฒ„ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋™์‹œ ์‚ฌ์šฉํ•  ๋•Œ, ๋‘ ์ƒํƒœ ์‚ฌ์ด์˜ ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™”์™€ ์˜์กด์„ฑ ์ฃผ์ž…์€ ์–ด๋–ป๊ฒŒ ์„ค๊ณ„ํ•ด์•ผ ์‘์ง‘๋„๋ฅผ ๋†’์ผ ์ˆ˜ ์žˆ๋Š”๊ฐ€? +* ํ”„๋ก ํŠธ์—”๋“œ ์„ฑ๋Šฅ ์ตœ์ ํ™” ์ค‘ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜(Memory Leak)๋ฅผ ์˜ˆ๋ฐฉํ•˜๊ธฐ ์œ„ํ•ด Chrome DevTools ํž™ ์Šค๋ƒ…์ƒท์—์„œ ์‹๋ณ„๋˜๋Š” '๋ถ„๋ฆฌ๋œ DOM ๋…ธ๋“œ(Detached DOM Nodes)'์™€ ํด๋กœ์ €(Closure) ์ž”๋ฅ˜ ๋ฌธ์ œ๋ฅผ ํ”„๋กœ๋•์…˜์—์„œ ์–ด๋–ป๊ฒŒ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? +* Vite๋ฅผ ํ™œ์šฉํ•œ ๋นŒ๋“œ ์‹œ ๋Œ€๊ทœ๋ชจ ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์ธํ•œ ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ ๊ฒฝ๊ณ ("Large Chunks")๋ฅผ ๊ทผ๋ณธ์ ์œผ๋กœ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด `manualChunks` ์„ค์ •์„ ์–ด๋–ป๊ฒŒ ๋ถ„ํ• ํ•ด์•ผ ๋ธŒ๋ผ์šฐ์ €์˜ ๋ณ‘๋ ฌ ๋‹ค์šด๋กœ๋“œ ๋ฐ ์บ์‹ฑ ํšจ์œจ์„ ๊ทน๋Œ€ํ™”ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? + +### Practical Application Contexts + +* **Implementation:** ์‹ ๊ทœ ๋„๋ฉ”์ธ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ๋•Œ ๋กœ์ง, UI, ์ปค์Šคํ…€ ํ›…์„ ํ•˜๋‚˜์˜ ํ”ผ์ฒ˜(Feature) ํด๋”์— ์‘์ง‘์‹œํ‚ค๊ณ  ๋‹ค๋ฅธ ํ”ผ์ฒ˜์—์„œ์˜ ์ง์ ‘ ์ž„ํฌํŠธ๋ฅผ ์ œํ•œํ•˜์—ฌ ์ฒ ์ €ํžˆ ์บก์Аํ™”๋œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค [3, 4]. ๋นˆ๋ฒˆํžˆ ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ๋‚˜ ๋ Œ๋”๋ง ๋กœ์ง ์•ˆ์—์„œ๋Š” ์ธ๋ผ์ธ ์ต๋ช… ํ•จ์ˆ˜ ์‚ฌ์šฉ์„ ์ง€์–‘ํ•˜๊ณ  ๋ถˆํ•„์š”ํ•œ ์žฌํ• ๋‹น์„ ๋ง‰์Šต๋‹ˆ๋‹ค [55, 56]. +* **System Design:** ์‹œ์Šคํ…œ ์ดˆ๊ธฐ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ ์ƒํƒœ์˜ ์œ ํ˜•์„ ๋ช…ํ™•ํžˆ ๋ถ„๋ฅ˜ํ•˜์—ฌ, ์ž์ฃผ ๋ฐ”๋€Œ์ง€ ์•Š๋Š” ํ…Œ๋งˆ/์„ค์ •์€ Context API์—, ์ƒํ˜ธ์ž‘์šฉ์ด ์žฆ์€ ์žฅ๋ฐ”๊ตฌ๋‹ˆ/UI ์ƒํƒœ๋Š” Zustand์—, ์„œ๋ฒ„ ๋ฐ์ดํ„ฐ๋Š” TanStack Query์— ์œ„์ž„ํ•˜๋Š” ๋‹ค์ธต์  ์ƒํƒœ ํŠธ๋ฆฌ๋ฅผ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค [5, 18, 57]. +* **Operation / Maintenance:** ํ”„๋กœ๋•์…˜ ๋ฐฐํฌ ํ›„ Sentry, LogRocket, Datadog๊ณผ ๊ฐ™์€ ๊ฐ€์‹œ์„ฑ(Observability) ๋ฐ ํด๋ผ์šฐ๋“œ ๋กœ๊น… ๋„๊ตฌ๋ฅผ ์—ฐ๋™ํ•ด ์‚ฌ์šฉ์ž ์„ธ์…˜์„ ๋ฆฌํ”Œ๋ ˆ์ดํ•˜๊ณ  ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜ ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ์ด์Šˆ๋ฅผ ์‚ฌ์ „์— ํƒ์ง€ํ•ฉ๋‹ˆ๋‹ค [36, 37]. +* **Learning Path:** React ๊ธฐ์ดˆ(useState, Props)์™€ ์ปดํฌ๋„ŒํŠธ ๋ถ„๋ฆฌ(SOLID, Clean Code) ๊ฐœ๋…์„ ์ˆ™์ง€ํ•œ ํ›„, ์ ์ง„์ ์œผ๋กœ Context API์˜ ํ•œ๊ณ„๋ฅผ ์ฒดํ—˜ํ•˜๊ณ  Zustand๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋Š” ๊ณผ์ •์„ ๊ฑฐ์น˜๋ฉฐ ๋ Œ๋”๋ง ์ตœ์ ํ™”์™€ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์˜ ์›๋ฆฌ๋ฅผ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค [4, 14, 58]. +* **My Project Relevance:** ํ˜„์žฌ ์œ ์ง€๋ณด์ˆ˜ ์ค‘์ธ ๊ฑฐ๋Œ€ํ•œ React ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ๋‹ค๋ฉด, ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ ์ƒ๋‹จ์— ๋ฌด๋ถ„๋ณ„ํ•˜๊ฒŒ ๋ฐฐ์น˜๋œ Context Provider๋ฅผ ๊ฑท์–ด๋‚ด๊ณ  Zustand ๊ธฐ๋ฐ˜์˜ ๋ถ€๋ถ„ ๊ตฌ๋… ํŒจํ„ด์œผ๋กœ ๋ฆฌํŒฉํ† ๋งํ•˜๊ฑฐ๋‚˜ [21], Storybook ๋ฐ Chromatic์„ CI ํŒŒ์ดํ”„๋ผ์ธ์— ๋„์ž…ํ•˜์—ฌ PR ๋‹จ๊ณ„์—์„œ ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ(Visual Test)๋ฅผ ์ž๋™ํ™”ํ•˜์—ฌ ํ’ˆ์งˆ์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [41, 59]. + +### Adjacent Topics + +* `[[Core Web Vitals]]` + * ํ™•์žฅ ๋ฐฉํ–ฅ: LCP(Largest Contentful Paint), INP(Interaction to Next Paint), CLS(Cumulative Layout Shift) ๋“ฑ ๊ตฌ๊ธ€์ด ์ •์˜ํ•œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ์ค‘์‹ฌ์˜ ์„ฑ๋Šฅ ์ธก์ • ์ง€ํ‘œ๋ฅผ ์ดํ•ดํ•˜๊ณ , ์•ž์„œ ๋‹ค๋ฃฌ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…, ๋ ˆ์ด์ง€ ๋กœ๋”ฉ, ๋ Œ๋”๋ง ์ตœ์ ํ™” ๊ธฐ๋ฒ•์ด ์‹ค์ œ ์‚ฌ์šฉ์ž ์ฒด๊ฐ ์†๋„ ํ–ฅ์ƒ์— ์–ด๋–ป๊ฒŒ ์ง๊ฒฐ๋˜๋Š”์ง€ ์‹ฌ์ธต ๋ถ„์„ํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์—ฐ๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [23, 60, 61]. +* `[[Git Branching Strategies & CI/CD Governance]]` + * ํ™•์žฅ ๋ฐฉํ–ฅ: ๋ณต์žกํ•œ ํ”„๋ก ํŠธ์—”๋“œ ์‹œ์Šคํ…œ์„ ๋‹ค์ˆ˜์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ˜‘์—…ํ•˜์—ฌ ๊ตฌ์ถ•ํ•  ๋•Œ ์ถฉ๋Œ์„ ์ตœ์†Œํ™”ํ•˜๊ณ  ๋ฆด๋ฆฌ์Šค ์•ˆ์ •์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•œ GitHub Flow, Trunk-Based Development ๋“ฑ์˜ ๋ธŒ๋žœ์นญ ์ „๋žต๊ณผ, ESLint/Prettier ์ž๋™ํ™”, Conventional Commits๋ฅผ ํ™œ์šฉํ•œ ๋ฐฐํฌ ํŒŒ์ดํ”„๋ผ์ธ(CI/CD) ํ†ต์ œ ๋ฐฉ๋ฒ•์„ ํ™•์žฅํ•ด์„œ ์กฐ์‚ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [62-64]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Folder Structure Best Practices.md b/00_Raw/Folder Structure Best Practices.md new file mode 100644 index 00000000..c340d218 --- /dev/null +++ b/00_Raw/Folder Structure Best Practices.md @@ -0,0 +1,69 @@ +# [[Folder Structure Best Practices]] + +## ๐Ÿ“Œ Brief Summary +React ๋“ฑ ํ”„๋ก ํŠธ์—”๋“œ ํ”„๋กœ์ ํŠธ์—์„œ ์ฝ”๋“œ์˜ ์œ ์ง€๋ณด์ˆ˜์„ฑ, ํ™•์žฅ์„ฑ, ๊ทธ๋ฆฌ๊ณ  ํ˜‘์—… ํšจ์œจ์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ํŒŒ์ผ๊ณผ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ฒด๊ณ„์ ์œผ๋กœ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก ์ž…๋‹ˆ๋‹ค [1]. ํ˜„๋Œ€์ ์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ๊ณผ๊ฑฐ์˜ ํŒŒ์ผ ์œ ํ˜• ๊ธฐ๋ฐ˜(์œ ํ˜•๋ณ„ ๋ถ„๋ฅ˜) ๊ตฌ์กฐ์—์„œ ๋ฒ—์–ด๋‚˜, ๊ธฐ๋Šฅ(Feature)์ด๋‚˜ ๋„๋ฉ”์ธ ์ค‘์‹ฌ์œผ๋กœ ๊ด€๋ จ๋œ ๋กœ์ง์„ ๋ฌถ๋Š” ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๋˜๋Š” ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ๋ฐฉ์‹์ด ๋ชจ๋ฒ” ์‚ฌ๋ก€๋กœ ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค [2, 3]. ์ด๋ฅผ ํ†ตํ•ด UI, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง, ์ƒํƒœ ๊ด€๋ฆฌ ๋“ฑ์˜ ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌํ•˜๊ณ  ํ”„๋กœ์ ํŠธ๊ฐ€ ์ปค์ง์— ๋”ฐ๋ผ ๋ฐœ์ƒํ•˜๋Š” ๊ธฐ์ˆ  ๋ถ€์ฑ„๋ฅผ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [4]. + +## ๐Ÿ“– Core ์†Œ์Šค Content + +* **๊ตฌ์กฐ์˜ ์ง„ํ™”์™€ ํ•œ๊ณ„:** + * ์ดˆ๊ธฐ ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ๋Š” ์ฃผ๋กœ ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๋ฅผ `components` ํด๋”์—, ๋ชจ๋“  ํ›…์„ `hooks` ํด๋”์— ๋„ฃ๋Š” ํ”Œ๋žซ(Flat) ๊ตฌ์กฐ๋‚˜ ํŒŒ์ผ ์œ ํ˜• ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค [5, 6]. + * ํ•˜์ง€๋งŒ ์•ฑ์˜ ๊ทœ๋ชจ๊ฐ€ ์ปค์ง€๋ฉด ๋‹จ์ผ ๊ธฐ๋Šฅ์„ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ํด๋”๋ฅผ ๋„˜๋‚˜๋“ค์–ด์•ผ ํ•˜๋ฏ€๋กœ, ๊ฐœ๋ฐœ ์†๋„๊ฐ€ ๋А๋ ค์ง€๊ณ  ๋””๋ฒ„๊น…์ด ์–ด๋ ค์›Œ์ง€๋ฉฐ ์ฝ”๋“œ๋ฒ ์ด์Šค๊ฐ€ ๋ณต์žกํ•ด์ง€๋Š” ํ•œ๊ณ„๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [3, 6, 7]. +* **๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜(Feature-based) ๋ฐ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๊ตฌ์กฐ:** + * 2025๋…„ ๊ธฐ์ค€ ๊ฐ€์žฅ ๊ถŒ์žฅ๋˜๋Š” ์ ‘๊ทผ ๋ฐฉ์‹์€ ํŒŒ์ผ ์œ ํ˜•์ด ์•„๋‹Œ ๋น„์ฆˆ๋‹ˆ์Šค ๊ธฐ๋Šฅ์ด๋‚˜ ๋ชจ๋“ˆ์„ ์ค‘์‹ฌ์œผ๋กœ ํด๋”๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค [2, 8, 9]. + * ๊ฐ ๊ธฐ๋Šฅ(Feature)์€ ์บก์Аํ™”๋˜์–ด ๋‹ค๋ฅธ ๊ธฐ๋Šฅ๊ณผ ๋…๋ฆฝ์ ์œผ๋กœ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๊ทœ๋ชจ ํ™•์žฅ ์‹œ ๊ธฐ์กด ์ฝ”๋“œ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ณ  ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ๋งค๋„๋Ÿฝ๊ฒŒ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [8, 10]. +* **๊ถŒ์žฅ ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ตฌ์„ฑ (src/ ํ•˜์œ„):** + * `assets/`: ์ด๋ฏธ์ง€, ํฐํŠธ ๋“ฑ ์ •์  ๋ฏธ๋””์–ด ๋ฆฌ์†Œ์Šค ๋ณด๊ด€ [11, 12]. + * `components/`: ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ์—์„œ ๊ณตํ†ต์œผ๋กœ ์žฌ์‚ฌ์šฉ๋˜๋Š” ๋„๋ฉ”์ธ์— ๊ตฌ์• ๋ฐ›์ง€ ์•Š๋Š” UI ์š”์†Œ (์˜ˆ: ๋ฒ„ํŠผ, ๋ชจ๋‹ฌ, ๋„ค๋น„๊ฒŒ์ด์…˜ ๋ฐ” ๋“ฑ) [2, 12, 13]. + * `features/` (๋˜๋Š” `modules/`): ์ธ์ฆ(Auth), ๋Œ€์‹œ๋ณด๋“œ(Dashboard) ๋“ฑ ๋„๋ฉ”์ธ๋ณ„ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง. ์ด ํด๋” ๋‚ด๋ถ€์—๋Š” ํ•ด๋‹น ๊ธฐ๋Šฅ์—๋งŒ ์“ฐ์ด๋Š” ์ปดํฌ๋„ŒํŠธ, ํ›…, API ๋“ฑ์„ ์บก์Аํ™”ํ•˜์—ฌ ๋ณด๊ด€ํ•ฉ๋‹ˆ๋‹ค [2, 9, 13]. + * `hooks/`: ํผ ์ฒ˜๋ฆฌ, ๋ฐ์ดํ„ฐ ํŽ˜์นญ ๋“ฑ ์•ฑ ์ „๋ฐ˜์—์„œ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ปค์Šคํ…€ ํ›… [9, 14]. + * `pages/` (๋˜๋Š” `routes/`): ๋ผ์šฐํŒ…์— ๋งคํ•‘๋˜๋Š” ํŽ˜์ด์ง€ ๋ ˆ๋ฒจ ์ปดํฌ๋„ŒํŠธ [15, 16]. + * `services/`: ์„œ๋“œํŒŒํ‹ฐ ์„œ๋น„์Šค ์—ฐ๋™์ด๋‚˜ API ์š”์ฒญ ๋“ฑ ์™ธ๋ถ€ ํ†ต์‹  ๋กœ์ง [16, 17]. + * `store/` (๋˜๋Š” `context/`): Redux, Zustand, Context API๋ฅผ ํ™œ์šฉํ•˜๋Š” ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ ๋กœ์ง [14-16]. + * `utils/`: ๋‚ ์งœ ํฌ๋งทํŒ…, ๋ฐ์ดํ„ฐ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๋“ฑ ์ƒํƒœ๋ฅผ ๊ฐ€์ง€์ง€ ์•Š๋Š” ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜ [17, 18]. + * `styles/`: ๊ธ€๋กœ๋ฒŒ CSS, ํ…Œ๋งˆ(Theme) ๋“ฑ ์ „์—ญ ์Šคํƒ€์ผ๋ง ํŒŒ์ผ [18, 19]. + * `types/`: TypeScript ์‚ฌ์šฉ ์‹œ ์ „์—ญ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ํƒ€์ž… ๋ฐ ์ธํ„ฐํŽ˜์ด์Šค ๋ณด๊ด€ [18]. + * `config/`: ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋‚˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์—ญ ์„ค์ •(API ๊ธฐ๋ณธ URL ๋“ฑ) ๊ด€๋ฆฌ [18, 20]. +* **Feature-Sliced Design (FSD):** + * ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ํด๋” ๊ตฌ์กฐ๋ณด๋‹ค ๋” ์—„๊ฒฉํ•˜๊ฒŒ ์˜์กด์„ฑ์˜ ๋ฐฉํ–ฅ์„ ํ†ต์ œํ•˜๋Š” ํ”„๋ก ํŠธ์—”๋“œ ์•„ํ‚คํ…์ฒ˜ ๋ฐฉ๋ฒ•๋ก ์ž…๋‹ˆ๋‹ค [21]. + * `shared` -> `entities` -> `features` -> `widgets` -> `pages` -> `app` ์ด๋ผ๋Š” ๊ณ ์ •๋œ ๋‹ค์ธต ๊ณ„์ธต(Layer)์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค [22, 23]. + * ์ƒ์œ„ ๊ณ„์ธต์€ ํ•˜์œ„ ๊ณ„์ธต์˜ ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์ง€๋งŒ(Import), ํ•˜์œ„ ๊ณ„์ธต์€ ์ƒ์œ„ ๊ณ„์ธต์„ ์ฐธ์กฐํ•  ์ˆ˜ ์—†๋Š” ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ๊ทœ์น™์„ ํ†ตํ•ด ์ˆœํ™˜ ์˜์กด์„ฑ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค [22, 24]. +* **Next.js ํ™˜๊ฒฝ์—์„œ์˜ ๋ผ์šฐํŠธ ๊ทธ๋ฃน (Route Groups):** + * Next.js ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•œ ํด๋”๋ช… `(folderName)` ๋ฐฉ์‹์„ ํ†ตํ•ด, ์‹ค์ œ URL ๊ฒฝ๋กœ์—๋Š” ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์œผ๋ฉด์„œ๋„ ๊ด€๋ จ ๊ธฐ๋Šฅ์ด๋‚˜ ๋…ผ๋ฆฌ์— ๋”ฐ๋ผ ๋ผ์šฐํŠธ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ๊ทธ๋ฃนํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [25-27]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts +- [[Feature-Sliced Design]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋Œ€๊ทœ๋ชจ React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํด๋” ๊ตฌ์กฐ๋ฅผ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•ด ๊ณ ์•ˆ๋œ ์ „๋ฌธ์ ์ธ ํ”„๋ก ํŠธ์—”๋“œ ์•„ํ‚คํ…์ฒ˜ ๋ฐฉ๋ฒ•๋ก ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [21]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํด๋” ๊ฐ„์˜ ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ๊ทœ์น™๊ณผ ๊ฐ ํด๋”(Layer, Slice, Segment)๊ฐ€ ๋‹ด๋‹นํ•ด์•ผ ํ•˜๋Š” ์—ญํ• ์˜ ์—„๊ฒฉํ•œ ๋ถ„๋ฆฌ ๋ฐฉ์‹ [22, 28]. + +- [[Separation of Concerns]] (๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ) + - ์—ฐ๊ฒฐ ์ด์œ : ํด๋” ๊ตฌ์กฐ๋ฅผ ์„ค๊ณ„ํ•˜๋Š” ๊ทผ๋ณธ์ ์ธ ๋ชฉ์ ์ด UI ๋ Œ๋”๋ง, ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ, ๋ฐ์ดํ„ฐ ํ†ต์‹ (API) ๋“ฑ์˜ ์ฑ…์ž„์„ ๊ฐ๊ธฐ ๋‹ค๋ฅธ ์œ„์น˜๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๋ฐ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [4, 29]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: `services/`, `store/`, `components/` ๋“ฑ์˜ ํด๋”๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)์„ ํ”„๋ก ํŠธ์—”๋“œ ์•„ํ‚คํ…์ฒ˜ ์ „๋ฐ˜์— ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ• [4, 30]. + +- [[Naming Conventions]] (๋ช…๋ช… ๊ทœ์น™) + - ์—ฐ๊ฒฐ ์ด์œ : ์ผ๊ด€๋œ ํด๋” ๋ฐ ํŒŒ์ผ ๋ช…๋ช… ๊ทœ์น™(์˜ˆ: ํด๋”๋ช…์€ kebab-case, ์ปดํฌ๋„ŒํŠธ๋Š” PascalCase)์€ ํด๋” ๊ตฌ์กฐ ๋‚ด์—์„œ ํŒŒ์ผ์„ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๊ฒŒ ์ฐพ๊ณ  ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๋Š” ํ•ต์‹ฌ ๊ทœ์น™์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [31-33]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋‹ค์–‘ํ•œ ์šด์˜์ฒด์ œ์™€ CI/CD ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ๋นŒ๋“œ ์—๋Ÿฌ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ  ํŒ€ ๋‚ด ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ• [34, 35]. + +### Deeper Research Questions +- ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜(Feature-based) ํด๋” ๊ตฌ์กฐ์—์„œ ๊ฐ ๊ธฐ๋Šฅ์ด ์ƒํ˜ธ์ž‘์šฉํ•ด์•ผ ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๊ต์ฐจ ๊ด€์‹ฌ์‚ฌ(Cross-cutting concerns)๋‚˜ ๊ณต์œ  ์˜์กด์„ฑ์„ ์–ด๋–ป๊ฒŒ ๊ด€๋ฆฌํ•˜๊ณ  ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- ๋ ˆ๊ฑฐ์‹œ ํŒŒ์ผ ์œ ํ˜• ๊ธฐ๋ฐ˜(File-type based) React ํ”„๋กœ์ ํŠธ๋ฅผ ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ํ˜น์€ Feature-Sliced Design์œผ๋กœ ์ ์ง„์ ์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ€์žฅ ์•ˆ์ „ํ•˜๊ณ  ํšจ์œจ์ ์ธ ๋‹จ๊ณ„๋Š” ๋ฌด์—‡์ธ๊ฐ€? +- Feature-Sliced Design์˜ ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ์›์น™์„ ESLint์™€ ๊ฐ™์€ ์ •์  ๋ถ„์„ ๋„๊ตฌ๋กœ ์ž๋™ ๊ฐ•์ œํ™”(Governance)ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? +- ํด๋” ๊ตฌ์กฐ๋ฅผ ๋ชจ๋“ˆํ™”ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ํŒŒ์ผ ์ค‘์ฒฉ ๋ฌธ์ œ์™€ ์ด๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•œ ์ ์ ˆํ•œ ์ธ๋ฑ์Šค(Barrel) ํŒŒ์ผ ์‚ฌ์šฉ ์ „๋žต์˜ ์žฅ๋‹จ์ ์€ ๋ฌด์—‡์ธ๊ฐ€? +- ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(Context API, Zustand, Redux ๋“ฑ)์˜ ์ข…๋ฅ˜์— ๋”ฐ๋ผ ๊ถŒ์žฅ๋˜๋Š” `store/` ํด๋” ๋‚ด๋ถ€์˜ ๊ตฌ์กฐ๋Š” ์–ด๋–ป๊ฒŒ ๋‹ฌ๋ผ์ ธ์•ผ ํ•˜๋Š”๊ฐ€? + +### Practical Application Contexts +- **Implementation:** React ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ, ๋ชจ๋“  ์š”์†Œ๋ฅผ `components/` ํด๋”์— ๋„ฃ์ง€ ์•Š๊ณ  ํŠน์ • ๋„๋ฉ”์ธ(์˜ˆ: ์ธ์ฆ)์—๋งŒ ์“ฐ์ด๋Š” ์š”์†Œ๋Š” `features/auth/components/`๋กœ ๊ฒฉ๋ฆฌํ•˜์—ฌ ์บก์Аํ™”๋ฅผ ์‹ค์ฒœํ•ฉ๋‹ˆ๋‹ค. +- **System Design:** ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐ ์„ธํŒ… ๋‹จ๊ณ„์—์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ์„ ๋ถ„์„ํ•˜์—ฌ ์–ด๋–ค ์ฝ”๋“œ๊ฐ€ ์ „์—ญ(`shared/` ๋˜๋Š” `components/`)์— ์†ํ•˜๊ณ  ์–ด๋–ค ์ฝ”๋“œ๊ฐ€ ๋กœ์ปฌ(`features/`)์— ์†ํ• ์ง€ ๊ธฐ์ค€์„ ๋งˆ๋ จํ•ฉ๋‹ˆ๋‹ค. +- **Operation / Maintenance:** ๊ธฐ๋Šฅ์— ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ, ํ•ด๋‹น ๊ธฐ๋Šฅ์˜ ํด๋”(`features/feature-name/`)๋งŒ ํ™•์ธํ•˜๋ฉด UI, ์ƒํƒœ, API ์š”์ฒญ ๋กœ์ง์ด ๋ชจ์—ฌ ์žˆ์–ด ๋””๋ฒ„๊น… ๋ฐ ์œ ์ง€๋ณด์ˆ˜ ์†๋„๊ฐ€ ํฌ๊ฒŒ ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค. +- **Learning Path:** ์ฒ˜์Œ์—๋Š” ๋‹จ์ˆœํ•œ ํ”Œ๋žซ ๊ตฌ์กฐ๋กœ React๋ฅผ ํ•™์Šตํ•œ ํ›„, ์ปดํฌ๋„ŒํŠธ๊ฐ€ 30๊ฐœ ์ด์ƒ์œผ๋กœ ๋Š˜์–ด๋‚˜๋Š” ์‹œ์ ์— ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ํด๋” ๊ตฌ์กฐ๋ฅผ ๋„์ž…ํ•˜์—ฌ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ ์—ญ๋Ÿ‰์„ ๊ธฐ๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- **My Project Relevance:** ํ˜„์žฌ ์ง„ํ–‰ ์ค‘์ด๊ฑฐ๋‚˜ ๋ฆฌํŒฉํ† ๋งํ•ด์•ผ ํ•  React ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ, ๊ฑฐ๋Œ€ํ•ด์ง„ `components/` ํด๋”๋ฅผ ๋„๋ฉ”์ธ ๋‹จ์œ„์˜ `features/` ํด๋”๋กœ ๋‚˜๋ˆ„๊ณ  ์žฌ์‚ฌ์šฉ ๋ถˆ๊ฐ€ ๋กœ์ง๋“ค์„ ๋ถ„๋ฆฌํ•˜๋Š” ๋ฐ ์ง์ ‘์ ์œผ๋กœ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. + +### Adjacent Topics +- [[State Management]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ์ „์—ญ ์ƒํƒœ(Global State)์™€ ๋กœ์ปฌ ์ƒํƒœ(Local State)๋ฅผ ์–ด๋””์— ๋ณด๊ด€ํ•ด์•ผ ํ•˜๋Š”์ง€, Zustand์™€ ๊ฐ™์€ ๋„๊ตฌ๊ฐ€ `store/` ํด๋”์˜ ๊ตฌ์กฐ๋ฅผ ์–ด๋–ป๊ฒŒ ๋‹จ์ˆœํ™”ํ•˜๋Š”์ง€ ํ™•์žฅํ•˜์—ฌ ์กฐ์‚ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[Code Splitting]] (์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…) + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋ผ์šฐํŠธ ํ˜น์€ ํด๋”(Feature) ๋‹จ์œ„๋กœ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…๊ณผ ์ง€์—ฐ ๋กœ๋”ฉ(Lazy Loading)์„ ์ ์šฉํ•˜์—ฌ ์ดˆ๊ธฐ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ค„์ด๊ณ  ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๋Š” ์ „๋žต๊ณผ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Frontend Performance Debugging.md b/00_Raw/Frontend Performance Debugging.md new file mode 100644 index 00000000..e8479bfa --- /dev/null +++ b/00_Raw/Frontend Performance Debugging.md @@ -0,0 +1,72 @@ +# [[Frontend Performance Debugging]] + +## ๐Ÿ“Œ Brief Summary +ํ”„๋ก ํŠธ์—”๋“œ ์„ฑ๋Šฅ ๋””๋ฒ„๊น…(Frontend Performance Debugging)์€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜, ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง, ์žฆ์€ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ๋“ฑ์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ์„ฑ๋Šฅ ์ €ํ•˜์™€ ์‘๋‹ต ์ง€์—ฐ์„ ์‹๋ณ„ํ•˜๊ณ  ํ•ด๊ฒฐํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค [1-3]. ๊ฐœ๋ฐœ์ž๋Š” ๋ธŒ๋ผ์šฐ์ €์˜ ๋‚ด์žฅ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ(Chrome DevTools)๋ฅผ ํ™œ์šฉํ•ด ๋ฉ”๋ชจ๋ฆฌ ์ƒํƒœ์™€ ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง ๋น„์šฉ์„ ๋กœ์ปฌ์—์„œ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค [4, 5]. ๋” ๋‚˜์•„๊ฐ€ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋Š” ํด๋ผ์šฐ๋“œ ๊ธฐ๋ฐ˜ ๋กœ๊น… ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹ค์ œ ์‚ฌ์šฉ์ž์˜ ์„ธ์…˜๊ณผ ์—๋Ÿฌ๋ฅผ ์ถ”์ ํ•จ์œผ๋กœ์จ ๋ณต์žกํ•œ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ์˜ ๊ทผ๋ณธ ์›์ธ์„ ํŒŒ์•…ํ•ฉ๋‹ˆ๋‹ค [6-8]. + +## ๐Ÿ“– Core ์†Œ์Šค Content +**๋ฉ”๋ชจ๋ฆฌ ๋ฌธ์ œ ์ง„๋‹จ (Memory Issues Diagnosis)** +ํ”„๋ก ํŠธ์—”๋“œ ์„ฑ๋Šฅ ์ €ํ•˜์˜ ์ฃผ์š” ์›์ธ ์ค‘ ํ•˜๋‚˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜(Memory Leak)์™€ ๋ฉ”๋ชจ๋ฆฌ ํŒฝ์ฐฝ(Memory Bloat)์ž…๋‹ˆ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” ์‚ฌ์šฉ์ด ๋๋‚œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๊ฐ€ ํšŒ์ˆ˜ํ•˜์ง€๋งŒ, DOM ๋…ธ๋“œ๊ฐ€ ๋ฌธ์„œ์—์„œ ์ œ๊ฑฐ๋œ ํ›„์—๋„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฐธ์กฐ๊ฐ€ ๋‚จ์•„์žˆ๋Š” '๋ถ„๋ฆฌ๋œ DOM ๋…ธ๋“œ(Detached DOM Nodes)', ๋ˆ„์ ๋œ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ, ํด๋กœ์ €(Closure)์— ์˜ํ•ด ์œ ์ง€๋˜๋Š” ์ฐธ์กฐ ๋“ฑ์ด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ์œ ๋ฐœํ•ฉ๋‹ˆ๋‹ค [2, 9, 10]. Chrome DevTools์˜ Task Manager๋ฅผ ํ†ตํ•ด ์‹ค์‹œ๊ฐ„ DOM ๋…ธ๋“œ์™€ JS ํž™(Heap) ๋ฉ”๋ชจ๋ฆฌ ์ฆ๊ฐ€๋ฅผ ํ™•์ธํ•˜๊ณ , Memory ํŒจ๋„์˜ Heap Snapshot์„ ๋น„๊ตํ•˜์—ฌ ๋ถ„๋ฆฌ๋œ DOM ํŠธ๋ฆฌ๋ฅผ ์‹๋ณ„ํ•˜๋ฉฐ, Allocation Timeline์„ ์‚ฌ์šฉํ•ด ์–ธ์ œ ์ƒˆ๋กœ์šด ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ• ๋‹น๋˜๋Š”์ง€ ์ถ”์ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [4, 11, 12]. ๋นˆ๋ฒˆํ•œ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์€ ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰์„ ์ž์ฃผ ์ผ์‹œ ์ •์ง€์‹œ์ผœ ํ™”๋ฉด์˜ ๋Š๊น€(Jank)์„ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค [1]. + +**React ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง ํ”„๋กœํŒŒ์ผ๋ง (React Rendering Profiling)** +React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ์ƒํƒœ(State), ํ”„๋กœํผํ‹ฐ(Props), ์ปจํ…์ŠคํŠธ(Context) ๋ณ€๊ฒฝ ๋˜๋Š” ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์˜ ๋ Œ๋”๋ง์— ์˜ํ•ด ๋ฆฌ๋ Œ๋”๋ง์ด ํŠธ๋ฆฌ๊ฑฐ๋ฉ๋‹ˆ๋‹ค [13]. ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์€ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋ฅผ ์ฐจ๋‹จํ•˜๊ณ  ์ƒํ˜ธ์ž‘์šฉ ์‹œ๊ฐ„์„ ์ง€์—ฐ์‹œํ‚ต๋‹ˆ๋‹ค [3]. ์ด๋ฅผ ๋””๋ฒ„๊น…ํ•˜๊ธฐ ์œ„ํ•ด React DevTools Profiler๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์–ด๋–ค ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ธ์ œ, ์™œ ๋ Œ๋”๋ง๋˜์—ˆ๋Š”์ง€, ์–ผ๋งˆ๋‚˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ๋Š”์ง€(Flamegraph ๋ทฐ ๋“ฑ)๋ฅผ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค [5, 14]. ๋˜ํ•œ, ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์ „์šฉ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ `why-did-you-render`๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์‹ค์ œ ์ƒํƒœ๋‚˜ prop ๋ณ€๊ฒฝ ์—†์ด ๋ฐœ์ƒํ•˜๋Š” ๋ฆฌ๋ Œ๋”๋ง์— ๋Œ€ํ•œ ์ฝ˜์†” ๊ฒฝ๊ณ ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [15, 16]. + +**ํ”„๋กœ๋•์…˜ ๊ด€์ธก์„ฑ๊ณผ ํด๋ผ์šฐ๋“œ ๋กœ๊น… (Production Observability and Logging)** +๋กœ์ปฌ ํ™˜๊ฒฝ์„ ๋„˜์–ด ์‹ค์ œ ์šด์˜ ํ™˜๊ฒฝ์˜ ์„ฑ๋Šฅ์„ ๋””๋ฒ„๊น…ํ•˜๊ธฐ ์œ„ํ•ด Sentry, LogRocket, Datadog RUM, SigNoz์™€ ๊ฐ™์€ ํ”„๋ก ํŠธ์—”๋“œ ํด๋ผ์šฐ๋“œ ๋กœ๊น… ๋„๊ตฌ๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค [17, 18]. ์ด ๋„๊ตฌ๋“ค์€ ๋‹จ์ˆœํ•œ ์—๋Ÿฌ ๋กœ๊น…์„ ๋„˜์–ด ์‚ฌ์šฉ์ž๊ฐ€ ์—๋Ÿฌ๋‚˜ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ๊ฒช๊ธฐ ์ง์ „์˜ ํ–‰๋™์„ ๋น„๋””์˜ค์ฒ˜๋Ÿผ ๋‹ค์‹œ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด(Session Replay), ํ”„๋ก ํŠธ์—”๋“œ ์—๋Ÿฌ๋ฅผ ๋ฐฑ์—”๋“œ ํŠธ๋ ˆ์ด์Šค์™€ ์—ฐ๊ด€ ์ง€์–ด ๋ถ„์„ํ•˜๋Š” ๋ถ„์‚ฐ ํŠธ๋ ˆ์ด์‹ฑ(Distributed Tracing), ๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ ์‚ฌ์šฉ์ž์˜ Core Web Vitals(LCP, FID, INP ๋“ฑ) ๋ชจ๋‹ˆํ„ฐ๋ง ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์—ฌ ๋งน์  ์—†๋Š” ๋””๋ฒ„๊น…์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค [7, 8, 19-21]. + +## โš–๏ธ Trade-offs & Caveats +* **๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ์˜ ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ฐ˜๋Œ€ ๊ธ‰๋ถ€:** LogRocket์ด๋‚˜ Sentry ๊ฐ™์€ ๊ฐ•๋ ฅํ•œ ๋กœ๊น… ๋ฐ ์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ๋“ค์„ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ์— ํƒ‘์žฌํ•˜๋ฉด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ๊ฐ€ ์ปค์ง€๊ณ  ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค. ์ผ๋ถ€ ๋„๊ตฌ๋Š” ์ตœ๋Œ€ 120ms์˜ ์ถ”๊ฐ€ ๋กœ๋“œ ์‹œ๊ฐ„์„ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ 1์ดˆ๊ฐ€ ์ค‘์š”ํ•œ ์„œ๋น„์Šค์—์„œ๋Š” ๊ฐ€๋ฒผ์šด ์˜ต์…˜์„ ์„ ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [22-24]. +* **์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด์™€ ํ”„๋ผ์ด๋ฒ„์‹œ ๋ฌธ์ œ:** ๋ชจ๋“  ์‚ฌ์šฉ์ž ์„ธ์…˜๊ณผ DOM/์ƒํƒœ ๋ณ€ํ™”๋ฅผ ๊ธฐ๋กํ•˜๋Š” ๋„๊ตฌ(์˜ˆ: LogRocket)์˜ ๊ธฐ๋ณธ '๋ชจ๋‘ ์บก์ฒ˜' ๋ฐฉ์‹์€ ๋ฏผ๊ฐํ•œ ๊ฐœ์ธ์ •๋ณด๋ฅผ ๋…ธ์ถœํ•  ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋งˆ์Šคํ‚น ์„ค์ •์„ ์ˆ˜๋™์œผ๋กœ ์—„๊ฒฉํžˆ ๊ตฌ์„ฑํ•ด์•ผ ํ•˜๋Š” ๊ด€๋ฆฌ ๋น„์šฉ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [19, 23, 25, 26]. +* **๋น„์šฉ๊ณผ ๊ฐ€์‹œ์„ฑ์˜ ํƒ€ํ˜‘ (Cost vs. Visibility):** Datadog๊ณผ ๊ฐ™์€ ๋Œ€๊ทœ๋ชจ ์˜ต์ €๋ฒ„๋นŒ๋ฆฌํ‹ฐ ํ”Œ๋žซํผ์€ ์ˆ˜์ง‘(Ingestion)๊ณผ ์ƒ‰์ธ(Indexing) ๋‹จ๊ณ„์—์„œ ์ด์ค‘ ๊ณผ๊ธˆ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ํŠธ๋ž˜ํ”ฝ์ด ๋งŽ์€ ๊ฒฝ์šฐ ์—„์ฒญ๋‚œ ๋น„์šฉ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋น„์šฉ ์ ˆ๊ฐ์„ ์œ„ํ•ด ๋กœ๊ทธ์˜ 20%๋งŒ ์ƒ‰์ธํ•˜๊ฒŒ ๋˜๋ฉด, ์‹ค์ œ ์žฅ์•  ๋ฐœ์ƒ ์‹œ ๋””๋ฒ„๊น…์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ์˜ 80%๊ฐ€ ๊ฒ€์ƒ‰๋˜์ง€ ์•Š๋Š” ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [27-29]. +* **์ตœ์ ํ™” ๊ธฐ๋ฒ• ์ž์ฒด์˜ ์˜ค๋ฒ„ํ—ค๋“œ:** `React.memo()`, `useCallback`, `useMemo`์™€ ๊ฐ™์€ ์ตœ์ ํ™” ํ›…์€ ์ด์ „ ์ฐธ์กฐ๊ฐ’์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜๊ณ  ๋น„๊ตํ•˜๋Š” ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ๋ Œ๋”๋ง ๋น„์šฉ๋ณด๋‹ค ๋น„๊ต ๋น„์šฉ์ด ๋” ํฐ ๊ฐ€๋ฒผ์šด ์ปดํฌ๋„ŒํŠธ์— ๋‚จ์šฉํ•˜๋ฉด ์˜คํžˆ๋ ค ์„ฑ๋Šฅ์„ ์ €ํ•˜์‹œํ‚ค๋Š” ์›์ธ์ด ๋ฉ๋‹ˆ๋‹ค [30, 31]. +* **์ปดํŒŒ์ผ๋Ÿฌ ์ž๋™ํ™”๋กœ ์ธํ•œ ๋””๋ฒ„๊น… ๋‚œ์ด๋„ ์ƒ์Šน:** React Compiler ๊ฐ™์€ ๋นŒ๋“œ ํƒ€์ž„ ์ž๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ช…์‹œ์ ์ธ ํ›… ์ž‘์„ฑ์„ ์ค„์ผ ์ˆ˜ ์žˆ์ง€๋งŒ, ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ธ”๋ž™๋ฐ•์Šค๋กœ ์ž‘๋™ํ•˜๋ฏ€๋กœ ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ ์ฝ”๋“œ ์ƒ์—์„œ ์›์ธ์„ ์ฐพ๊ธฐ ์–ด๋ ค์›Œ React DevTools Profiler์— ์ „์ ์œผ๋กœ ์˜์กดํ•ด์•ผ ํ•˜๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค [32]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [๊ด€๊ณ„ ์œ ํ˜• A (๋กœ์ปฌ ๋””๋ฒ„๊น… ๋ฐ ๋ถ„์„ ๋„๊ตฌ)] +- [[Chrome DevTools Memory Profiler]] + - ์—ฐ๊ฒฐ ์ด์œ : ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜์™€ ๊ฐ์ฒด ๋ณด์กด ์ƒํƒœ๋ฅผ ํ”„๋กœํŒŒ์ผ๋งํ•˜๋Š” ๋ธŒ๋ผ์šฐ์ € ๋‚ด์žฅ ๋„๊ตฌ. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Heap Snapshots ๋น„๊ต, Allocation Timeline์„ ํ†ตํ•œ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ์ถ”์ , Detached DOM tree ํŒŒ์•… ๊ธฐ๋ฒ• [9, 12, 33]. +- [[React DevTools Profiler]] + - ์—ฐ๊ฒฐ ์ด์œ : React ํŠน์œ ์˜ ๋ Œ๋”๋ง ์‚ฌ์ดํด๊ณผ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ์„ ์‹œ๊ฐํ™”ํ•˜๋Š” ํ•ต์‹ฌ ๋„๊ตฌ. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง ์†Œ์š” ์‹œ๊ฐ„, ๋ Œ๋”๋ง ๋ฐœ์ƒ ์›์ธ(Props/State ๋ณ€๊ฒฝ ์—ฌ๋ถ€ ํŒ๋ณ„) [5, 14]. + +#### [๊ด€๊ณ„ ์œ ํ˜• B (ํ”„๋กœ๋•์…˜ ๊ด€์ธก์„ฑ ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง)] +- [[Frontend Cloud Logging Tools]] + - ์—ฐ๊ฒฐ ์ด์œ : Sentry, LogRocket, Datadog RUM, SigNoz ๋“ฑ ๋ฐฐํฌ ์ดํ›„ ๋ฐœ์ƒํ•˜๋Š” ์„ฑ๋Šฅ ์ €ํ•˜์™€ ๋ฒ„๊ทธ๋ฅผ ์ถ”์ ํ•˜๋Š” ํ”Œ๋žซํผ. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํ”„๋กœ๋•์…˜ ๋ ˆ๋ฒจ์—์„œ์˜ ์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด, ์ž๋™ ์—๋Ÿฌ ๊ทธ๋ฃนํ™”, ์—”๋“œํˆฌ์—”๋“œ ๋ถ„์‚ฐ ํŠธ๋ ˆ์ด์‹ฑ, Core Web Vitals ์ถ”์  [7, 8, 20, 21, 34]. + +#### [๊ด€๊ณ„ ์œ ํ˜• C (์•„ํ‚คํ…์ฒ˜ ๋ฐ ์•ˆํ‹ฐํŒจํ„ด)] +- [[JavaScript Memory Leaks]] + - ์—ฐ๊ฒฐ ์ด์œ : ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ฑ๋Šฅ์„ ์ ์ง„์ ์œผ๋กœ ํŒŒ๊ดดํ•˜๋Š” ํ˜„์ƒ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ํŒฝ์ฐฝ, ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ๋“ฑ๊ณผ ์—ฐ๊ด€. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํด๋กœ์ € ์ž”๋ฅ˜ ์ฐธ์กฐ(Closure-Retained References), ํ•ด์ œ๋˜์ง€ ์•Š์€ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ์˜ ๋™์ž‘ ๋ฉ”์ปค๋‹ˆ์ฆ˜ [2, 10, 35]. +- [[React Re-render Optimization]] + - ์—ฐ๊ฒฐ ์ด์œ : React์˜ ๋ Œ๋”๋ง ํŠน์„ฑ์ƒ ๋ฐœ์ƒํ•˜๋Š” ๋ฉ”์ธ ์Šค๋ ˆ๋“œ ๋ธ”๋กœํ‚น ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์ฝ”๋“œ ๋ ˆ๋ฒจ ๊ธฐ๋ฒ•. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ฐธ์กฐ ์•ˆ์ •์„ฑ(Reference stability), ์ต๋ช… ํ•จ์ˆ˜์˜ ๋ถ€์ž‘์šฉ, `useMemo` ๋ฐ `useCallback`์˜ ์˜ฌ๋ฐ”๋ฅธ ํ™œ์šฉ๋ฒ• [36-38]. + +### Deeper Research Questions + +- ํ”„๋ก ํŠธ์—”๋“œ ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ ์ˆ˜์ง‘ํ•˜๋Š” Sentry, LogRocket ๋“ฑ์˜ ํˆด์ด ์œ ๋ฐœํ•˜๋Š” ์„ฑ๋Šฅ ์ €ํ•˜(๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ ๋ฐ ์‹คํ–‰ ์˜ค๋ฒ„ํ—ค๋“œ)๋ฅผ ์ตœ์†Œํ™”ํ•˜๋ฉด์„œ๋„ Core Web Vitals ๋“ฑ ์œ ์˜๋ฏธํ•œ ๋””๋ฒ„๊น… ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๋Š” ์ตœ์ ์˜ ์„ค์ • ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? +- JavaScript ํ™˜๊ฒฝ์˜ Allocation Timeline ์ƒ์—์„œ ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ฐœ์ƒํ•˜๋Š” ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜(GC) ์ŠคํŒŒ์ดํฌ์™€ ์‹ค์ œ ๋ธŒ๋ผ์šฐ์ €์˜ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ ๋ฉˆ์ถค ํ˜„์ƒ(Jank/INP ์ €ํ•˜) ๊ฐ„์˜ ์ƒ๊ด€๊ด€๊ณ„๋ฅผ ์–ด๋–ป๊ฒŒ ์ •๋Ÿ‰์ ์œผ๋กœ ํ”„๋กœํŒŒ์ผ๋งํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- React Compiler๊ฐ€ ์ž๋™ํ™”ํ•˜๋Š” ์˜์—ญ๊ณผ ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(์˜ˆ: ํ•ญ์ƒ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” `useLocation`, `useMutation`)๋กœ ์ธํ•ด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ตœ์ ํ™”๋ฅผ ์šฐํšŒํ•˜๋Š” ๊ฒฝ์šฐ, ์ด ์ถฉ๋Œ์„ ๋””๋ฒ„๊น…ํ•˜๊ณ  ํ•ด๊ฒฐํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ํŒจํ„ด์€ ๋ฌด์—‡์ธ๊ฐ€? +- Puppeteer ๊ธฐ๋ฐ˜์˜ Automated Memory Testing์„ CI/CD ํŒŒ์ดํ”„๋ผ์ธ์— ํ†ตํ•ฉํ•˜์—ฌ, Detached DOM node๋‚˜ Event Listener ๋ˆ„์ ๊ณผ ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ํ”„๋กœ๋•์…˜ ๋ฐฐํฌ ์ „์— ์ฐจ๋‹จํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? +- Context API ์‚ฌ์šฉ ์‹œ ๋ฐœ์ƒํ•˜๋Š” ๊ด‘๋ฒ”์œ„ํ•œ ๋ฆฌ๋ Œ๋”๋ง ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Zustand์™€ ๊ฐ™์€ ์™ธ๋ถ€ ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ์˜ 'Selector' ํŒจํ„ด์„ ์‚ฌ์šฉํ•  ๋•Œ, ๋””๋ฒ„๊น… ๊ณผ์ •์—์„œ Redux DevTools ์—ฐ๋™์ด ์ œ๊ณตํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ์ด์ ์€ ๋ฌด์—‡์ธ๊ฐ€? + +### Practical Application Contexts + +- **Implementation:** React ์ปดํฌ๋„ŒํŠธ ๋งˆ์šดํŠธ ํ•ด์ œ ์‹œ `useEffect` ํด๋ฆฐ์—… ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ์ œ๊ฑฐํ•จ์œผ๋กœ์จ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ , ๋กœ์ปฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ `why-did-you-render` ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ์ฝ˜์†” ๊ฒฝ๊ณ ๋กœ ์กฐ๊ธฐ ๊ฐ์ง€ํ•œ๋‹ค [15, 39]. +- **System Design:** ์ดˆ๊ธฐ ํ”„๋ก ํŠธ์—”๋“œ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ ๋‹จ๊ณ„๋ถ€ํ„ฐ SigNoz(OpenTelemetry ๊ธฐ๋ฐ˜)๋‚˜ Sentry์™€ ๊ฐ™์€ ๋กœ๊น… ๋„๊ตฌ ๋„์ž…์„ ์ธํ”„๋ผ ๊ตฌ์„ฑ ์š”์†Œ๋กœ ๊ฒฐ์ •ํ•˜๊ณ , ์‚ฌ์šฉ์ž ์ •๋ณด ๋ณดํ˜ธ๋ฅผ ์œ„ํ•ด ์„ธ์…˜ ์บก์ฒ˜ ์‹œ ๋ฏผ๊ฐ ๋ฐ์ดํ„ฐ ๋งˆ์Šคํ‚น ์ •์ฑ…์„ ์‚ฌ์ „ ์„ค๊ณ„ํ•œ๋‹ค [21, 25, 26, 40]. +- **Operation / Maintenance:** ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ์•ฑ์ด ๋ฌด๊ฑฐ์›Œ์ง€๊ฑฐ๋‚˜ ๋А๋ ค์ง„๋‹ค๋Š” ์‚ฌ์šฉ์ž ์ œ๋ณด๊ฐ€ ๋“ค์–ด์˜ฌ ๊ฒฝ์šฐ, Chrome DevTools Memory ํŒจ๋„์˜ Heap Snapshot์„ ํ†ตํ•ด ๋ถ„๋ฆฌ๋œ DOM ๋…ธ๋“œ๊ฐ€ ์ ์ง„์ ์œผ๋กœ ๋ˆ„์ ๋˜๋Š”์ง€ ๊ฒ€์‚ฌํ•˜๊ณ  ์›์ธ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•œ๋‹ค [1, 9, 41]. +- **Learning Path:** ์šฐ์„  JavaScript ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ์˜ ๋™์ž‘ ์›๋ฆฌ์™€ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ํŒจํ„ด์„ ํ•™์Šตํ•œ ๋’ค, Chrome DevTools์˜ Task Manager์™€ Memory ํŒจ๋„ ์‚ฌ์šฉ๋ฒ•์„ ์ตํžˆ๊ณ , ์ตœ์ข…์ ์œผ๋กœ React Profiler์™€ ํ”„๋กœ๋•์…˜ ๋กœ๊น… ๋„๊ตฌ ํ™œ์šฉ๋ฒ•์œผ๋กœ ํ•™์Šต์„ ํ™•์žฅํ•œ๋‹ค. +- **My Project Relevance:** ํ˜„์žฌ ์ง„ํ–‰ํ•˜๋Š” React ๊ธฐ๋ฐ˜ ๋Œ€์‹œ๋ณด๋“œ ํ”„๋กœ์ ํŠธ์—์„œ ํ…Œ์ด๋ธ” ๋ฐ์ดํ„ฐ๋‚˜ ์ฐจํŠธ ์—…๋ฐ์ดํŠธ ์‹œ ํ™”๋ฉด ๋ฉˆ์ถค์ด ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ, Chrome DevTools Performance ํƒญ์„ ํ†ตํ•ด ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰ ์‹œ๊ฐ„์„ ํ™•์ธํ•˜๊ณ  React Profiler๋ฅผ ๋ถ™์—ฌ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ฆฌ๋ Œ๋”๋ง๋˜๋Š” ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‹๋ณ„, `React.memo` ๋˜๋Š” ์‹๋ณ„์ž(Key)๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ์ตœ์ ํ™” ์ž‘์—…์— ์ง์ ‘ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. + +### Adjacent Topics + +- [[Core Web Vitals]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ํ”„๋ก ํŠธ์—”๋“œ ์„ฑ๋Šฅ ์ตœ์ ํ™”์™€ ๋””๋ฒ„๊น…์˜ ๊ถ๊ทน์ ์ธ ์„ฑ๊ณผ ์ง€ํ‘œ์ด์ž ๊ธฐ์ค€์ ์ด ๋˜๋Š” ์‹ค์ œ ์‚ฌ์šฉ์ž ์ฒด๊ฐ ์†๋„ ์ง€ํ‘œ(LCP, FID, INP, CLS ๋“ฑ) ์‹ฌ์ธต ํƒ๊ตฌ [8]. +- [[React Server Components (RSC)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: Next.js ํ™˜๊ฒฝ์—์„œ ํด๋ผ์ด์–ธํŠธ ์ธก ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ ์ž์ฒด๋ฅผ ์ค„์ด๊ณ  ์ƒํ˜ธ์ž‘์šฉ ์—†๋Š” UI๋ฅผ ์„œ๋ฒ„์—์„œ ๋ Œ๋”๋งํ•จ์œผ๋กœ์จ ๊ทผ๋ณธ์ ์ธ ํด๋ผ์ด์–ธํŠธ ๋””๋ฒ„๊น… ์š”์†Œ ๋ฐ ๋ฆฌ๋ Œ๋”๋ง ๋น„์šฉ์„ ์ œ๊ฑฐํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜ [42, 43]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Git Workflow.md b/00_Raw/Git Workflow.md new file mode 100644 index 00000000..5dc64fac --- /dev/null +++ b/00_Raw/Git Workflow.md @@ -0,0 +1,75 @@ +# [[Git Workflow]] + +## ๐Ÿ“Œ Brief Summary +Git Workflow(๊นƒ ์›Œํฌํ”Œ๋กœ์šฐ)๋Š” ํŒ€ ํ™˜๊ฒฝ์—์„œ ์ฝ”๋“œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ด€๋ฆฌํ•˜๊ณ  ํ˜‘์—…ํ•˜๊ธฐ ์œ„ํ•œ ์ฒด๊ณ„์ ์ด๊ณ  ๊ตฌ์กฐํ™”๋œ ์ ‘๊ทผ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค [1, 2]. ์ด๋Š” ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜(Feature-branch), ํŠธ๋ ํฌ ๊ธฐ๋ฐ˜(Trunk-based), Git Flow ๋“ฑ ๋‹ค์–‘ํ•œ ์ „๋žต์„ ํฌ๊ด„ํ•˜๋ฉฐ, ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๊ณ  `main` ๋ธŒ๋žœ์น˜์˜ ๋ฐฐํฌ ๊ฐ€๋Šฅ ์ƒํƒœ๋ฅผ ๋ณด์žฅํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค [2-4]. ์ผ๊ด€๋œ ๋ธŒ๋žœ์น˜ ๋ช…๋ช… ๊ทœ์น™, ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ๊ทœ์•ฝ, ํ’€ ๋ฆฌํ€˜์ŠคํŠธ(PR)์™€ ๋ฆฌ๋ทฐ ์ ˆ์ฐจ๋ฅผ ๋„์ž…ํ•จ์œผ๋กœ์จ ์ž ์žฌ์ ์ธ ํ˜ผ๋ˆ์„ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ๋ฆด๋ฆฌ์Šค ํ๋ฆ„์œผ๋กœ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1, 5, 6]. + +## ๐Ÿ“– Core Content +* **์ฃผ์š” ๋ธŒ๋žœ์นญ ์ „๋žต (Main Branching Strategies):** + * **Feature-Branch Workflow (๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜ ์›Œํฌํ”Œ๋กœ์šฐ):** ์ฃผ ๋ธŒ๋žœ์น˜(`main`)๋ฅผ ํ•ญ์ƒ ์•ˆ์ •์ ์ด๊ณ  ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜๋ฉฐ, ์ƒˆ๋กœ์šด ์ž‘์—…์ด๋‚˜ ๋ฒ„๊ทธ ์ˆ˜์ •๋งˆ๋‹ค ์งง์€ ์ˆ˜๋ช…์˜ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜(์˜ˆ: `feature/login`)๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ž‘์—…ํ•ฉ๋‹ˆ๋‹ค [3, 4, 7]. ์†Œ๊ทœ๋ชจ ํŒ€์— ๋งค์šฐ ์ ํ•ฉํ•˜๋ฉฐ, ์˜ค๋ฒ„ํ—ค๋“œ ์—†์ด ์ฝ”๋“œ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [4, 8]. + * **Trunk-Based Development (ํŠธ๋ ํฌ ๊ธฐ๋ฐ˜ ๊ฐœ๋ฐœ):** ๊ฐ•๋ ฅํ•œ CI(์ง€์†์  ํ†ตํ•ฉ) ํ™˜๊ฒฝ์„ ๊ฐ–์ถ˜ ๊ฒฝํ—˜ ๋งŽ์€ ํŒ€์— ์ ํ•ฉํ•œ ๋ฐฉ์‹์œผ๋กœ, ์•„์ฃผ ์งง์€ ์ˆ˜๋ช…์˜ ๋ธŒ๋žœ์น˜๋ฅผ ์‚ฌ์šฉํ•ด ์ž์ฃผ `main`์— ์ฝ”๋“œ๋ฅผ ๋ณ‘ํ•ฉํ•˜์—ฌ ํ†ตํ•ฉ ์†๋„๋ฅผ ๋†’์ž…๋‹ˆ๋‹ค [8, 9]. + * **Git Flow:** `develop` ๋ฐ `release` ๋“ฑ ๋‹ค์ˆ˜์˜ ๋ธŒ๋žœ์น˜๋ฅผ ์šด์˜ํ•˜๋ฉฐ ์Šค์ผ€์ค„๋œ ๋ฆด๋ฆฌ์Šค๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์— ์ ํ•ฉํ•˜์ง€๋งŒ, ์†Œ๊ทœ๋ชจ ํŒ€์—๊ฒŒ๋Š” ๋„ˆ๋ฌด ๋ณต์žกํ•˜๊ณ  ๋ฌด๊ฑฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [8, 10]. + * **GitHub Flow:** ๊ธฐ๋Šฅ์„ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜์—์„œ ์ž‘์—…ํ•œ ๋’ค ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ํ†ตํ•ด ๋ฆฌ๋ทฐ๋ฐ›๊ณ  ๋ณ‘ํ•ฉํ•˜์—ฌ, `main`์—์„œ ๋ฐ”๋กœ ๋ฐฐํฌํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค [11, 12]. + +* **๋ช…๋ช… ๊ทœ์น™ ๋ฐ ์ถ”์ ์„ฑ (Naming Conventions & Traceability):** + * **๋ธŒ๋žœ์น˜ ์ด๋ฆ„:** ๋ธŒ๋žœ์น˜ ๋ชฉ์ ์„ ๋ช…ํ™•ํžˆ ํ•˜๊ธฐ ์œ„ํ•ด `feature/`, `bugfix/`์™€ ๊ฐ™์€ ์ ‘๋‘์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ํ‹ฐ์ผ“ ID๋ฅผ ํ•จ๊ป˜ ํฌํ•จ(์˜ˆ: `feature/PROJ-123-user-auth`)ํ•˜์—ฌ ์ด์Šˆ ํŠธ๋ž˜์ปค์™€์˜ ์ถ”์ ์„ฑ์„ ํ™•๋ณดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [13-15]. + * **์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€:** `type(scope): description` ํ˜•ํƒœ๋ฅผ ๋”ฐ๋ฅด๋Š” "Conventional Commits" ๊ทœ์•ฝ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค [6, 16]. ์˜ˆ๋ฅผ ๋“ค์–ด ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์€ `feat:`, ๋ฒ„๊ทธ ์ˆ˜์ •์€ `fix:`, ๋ฌธ์„œ ์ˆ˜์ •์€ `docs:` ๋“ฑ์œผ๋กœ ์‹œ์ž‘ํ•˜์—ฌ ๋ณ€๊ฒฝ์˜ ์˜๋„๋ฅผ ๋ช…ํ™•ํžˆ ํ•ฉ๋‹ˆ๋‹ค [6, 16]. + +* **ํ’€ ๋ฆฌํ€˜์ŠคํŠธ์™€ ๋ณ‘ํ•ฉ (Pull Requests & Merging):** + * `main` ๋ธŒ๋žœ์น˜์— ์ง์ ‘ ํ‘ธ์‹œ(Push)ํ•˜๋Š” ๊ฒƒ์„ ๊ธˆ์ง€ํ•˜๊ณ , ๋ฐ˜๋“œ์‹œ ํ’€ ๋ฆฌํ€˜์ŠคํŠธ(PR)๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ตœ์†Œ 1๋ช… ์ด์ƒ์˜ ๋™๋ฃŒ์—๊ฒŒ ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ›์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค [13, 17]. + * ์ฝ”๋“œ ๋ฆฌ๋ทฐ ์†๋„์™€ ํ’ˆ์งˆ์„ ์œ„ํ•ด PR์€ ์ž‘๊ณ  ๋…ผ๋ฆฌ์ ์ธ ๋‹จ์ผ ๋ณ€๊ฒฝ ์‚ฌํ•ญ(Atomic Commits) ๋‹จ์œ„๋กœ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [16, 18]. + * ๋ณ‘ํ•ฉ ์‹œ์—๋Š” ์Šค์ฟผ์‹œ ๋ณ‘ํ•ฉ(Squash merge)์„ ์‚ฌ์šฉํ•˜์—ฌ ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ณ , ๋ณ‘ํ•ฉ์ด ์™„๋ฃŒ๋œ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜๋Š” ์ž๋™์œผ๋กœ ์‚ญ์ œํ•˜์—ฌ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค [17-19]. + +## โš–๏ธ Trade-offs & Caveats +* **๊ตฌ์กฐ์˜ ๋ณต์žก์„ฑ vs. ํŒ€์˜ ๊ทœ๋ชจ:** Git Flow๋Š” ๋Œ€๊ทœ๋ชจ์˜ ๋ณต์žกํ•œ ๋ฆด๋ฆฌ์Šค ๊ณ„ํš์„ ์•ˆ์ „ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ํ”„๋กœ์„ธ์Šค ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ํฌ๊ณ  ๋ณ‘ํ•ฉ ์ง€์—ฐ์„ ์ดˆ๋ž˜ํ•ฉ๋‹ˆ๋‹ค [8, 20]. ๋ฐ˜๋ฉด, Feature-Branch ์›Œํฌํ”Œ๋กœ์šฐ๋‚˜ Trunk-Based ๋ฐฉ์‹์€ ์†Œ๊ทœ๋ชจ ํŒ€์ด ๋น ๋ฅด๊ณ  ๊ฐ€๋ณ๊ฒŒ ์›€์ง์ผ ์ˆ˜ ์žˆ๋„๋ก ๋•์ง€๋งŒ, ๊ทœ๋ชจ๊ฐ€ ์ปค์ง€๊ฑฐ๋‚˜ ์—„๊ฒฉํ•œ ๋ฆด๋ฆฌ์Šค ๋ฒ„์ „ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํ•œ๊ณ„์— ๋ถ€๋”ชํž ์ˆ˜ ์žˆ์–ด ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์ง„ํ™”(Migration)์‹œ์ผœ์•ผ ํ•ฉ๋‹ˆ๋‹ค [8, 10]. +* **๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜์˜ ์ˆ˜๋ช…๊ณผ ์ถฉ๋Œ:** ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜ ๋ฐฉ์‹์˜ ๊ฐ€์žฅ ํฐ ๋ถ€์ž‘์šฉ์€ ๋ธŒ๋žœ์น˜์˜ ์ˆ˜๋ช…์ด ๊ธธ์–ด์งˆ ๊ฒฝ์šฐ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์™€์˜ ์ฐจ์ด๊ฐ€ ์ปค์ ธ ์‹ฌ๊ฐํ•œ ๋ณ‘ํ•ฉ ์ถฉ๋Œ(Merge Conflict)์ด ๋ฐœ์ƒํ•œ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค [20, 21]. ์ด๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๊ฐœ๋ฐœ์ž๋Š” ์ž์ฃผ `main` ๋ธŒ๋žœ์น˜๋ฅผ ํ’€(Pull) ๋ฐ›๊ฑฐ๋‚˜ ๋ฆฌ๋ฒ ์ด์Šค(Rebase)ํ•˜์—ฌ ์ตœ์‹  ์ƒํƒœ๋ฅผ ๋™๊ธฐํ™”ํ•˜๋Š” ๋ถ€๊ฐ€์ ์ธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [19, 20]. +* **์™„์ „ํ•œ ์ถ”์ ์„ฑ์˜ ๋Œ€๊ฐ€:** ๋ชจ๋“  ๋ธŒ๋žœ์น˜์™€ ์ปค๋ฐ‹์— ํ‹ฐ์ผ“ ID ๋ถ€์—ฌ๋ฅผ ๊ฐ•์ œํ•˜๋ฉด ๋ฒ„๊ทธ ์ถ”์ ์ด๋‚˜ ๋ฆฌ๋ทฐ์— ์žˆ์–ด ์ปจํ…์ŠคํŠธ ํ™•๋ณด์—๋Š” ํƒ์›”ํ•˜๋‚˜ [5, 22], ์•„์ฃผ ๋‹จ์ˆœํ•˜๊ณ  ์‚ฌ์†Œํ•œ ์ฝ”๋“œ ์ˆ˜์ • ์ž‘์—…์—๋„ ๋ฐ˜๋“œ์‹œ ํ‹ฐ์ผ“์„ ์ƒ์„ฑํ•˜๊ณ  ์ ˆ์ฐจ๋ฅผ ๋ฐŸ์•„์•ผ ํ•˜๋Š” ์†๋„ ์ €ํ•˜์˜ ๋‹จ์ ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [23]. +* **Trunk-Based ์ „ํ™˜์˜ ์ „์ œ ์กฐ๊ฑด:** Trunk-Based Development๋กœ ์ „ํ™˜ํ•˜์—ฌ ๋น ๋ฅธ ํ†ตํ•ฉ์˜ ์ด์ ์„ ์–ป๊ณ ์ž ํ•œ๋‹ค๋ฉด, ์ฝ”๋“œ์˜ ๋ถˆ์•ˆ์ •์„ฑ์„ ๊ฐ์ถ”๊ธฐ ์œ„ํ•œ ๊ธฐ๋Šฅ ํ† ๊ธ€(Feature flags) ๊ธฐ๋ฒ•๊ณผ ๋ณ‘ํ•ฉ ์ „ ๊ฒฐํ•จ์„ ์žก์•„๋‚ผ ๊ฐ•๋ ฅํ•œ ํ…Œ์ŠคํŠธ ์ž๋™ํ™”(CI)๊ฐ€ ํ•„์ˆ˜์ ์œผ๋กœ ์š”๊ตฌ๋œ๋‹ค๋Š” ์ œ์•ฝ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค [12]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [๊ด€๊ณ„ ์œ ํ˜• A (์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ )] +- `[[Trunk-Based Development]]` + - ์—ฐ๊ฒฐ ์ด์œ : Git Workflow๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ํ•ต์‹ฌ ์ „๋žต ์ค‘ ํ•˜๋‚˜๋กœ, ๋น ๋ฅธ ํ†ตํ•ฉ์„ ๋ชฉ์ ์œผ๋กœ ํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก ์ž…๋‹ˆ๋‹ค [2]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์งง์€ ์ˆ˜๋ช…์˜ ๋ธŒ๋žœ์น˜, ๋นˆ๋ฒˆํ•œ ๋ณ‘ํ•ฉ, ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ(Feature Flags) ํ™œ์šฉ์ด ํ”„๋กœ์ ํŠธ ๋ฐฐํฌ ์†๋„์— ์–ด๋–ป๊ฒŒ ๊ธฐ์—ฌํ•˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [9, 12]. + +- `[[Git Flow]]` + - ์—ฐ๊ฒฐ ์ด์œ : ๊ตฌ์กฐ๊ฐ€ ๋ณต์žกํ•œ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์˜ ๋ฆด๋ฆฌ์Šค๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ์ „ํ†ต์  ๋ธŒ๋žœ์นญ ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค [2, 10]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: `develop`, `release`, `hotfix` ๋“ฑ ๋‹ค์ค‘ ๋ธŒ๋žœ์น˜ ์ „๋žต์ด ์™œ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์œ ๋ฐœํ•˜๋ฉด์„œ๋„ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉ๋˜๋Š”์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [8, 10]. + +#### [๊ด€๊ณ„ ์œ ํ˜• B (๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ)] +- `[[Conventional Commits]]` + - ์—ฐ๊ฒฐ ์ด์œ : ํŒ€์˜ ์ผ๊ด€๋œ ์ฝ”๋“œ๋ฒ ์ด์Šค ํžˆ์Šคํ† ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด Git ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ์ž‘์„ฑ์— ์ ์šฉ๋˜๋Š” ์—…๊ณ„ ํ‘œ์ค€ ๊ทœ์น™์ž…๋‹ˆ๋‹ค [6, 16]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: `feat:`, `fix:`, `chore:`์™€ ๊ฐ™์€ ์ ‘๋‘์‚ฌ๊ฐ€ ๋ฆฌ๋ทฐ์–ด์˜ ์ฝ”๋“œ ์ดํ•ด๋„๋ฅผ ์–ด๋–ป๊ฒŒ ๋†’์ด๊ณ  ์ž๋™ํ™”๋œ ๋ฆด๋ฆฌ์Šค์— ๊ธฐ์—ฌํ•˜๋Š”์ง€ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [6, 16]. + +- `[[Pull Requests (PR)]]` + - ์—ฐ๊ฒฐ ์ด์œ : ๋ธŒ๋žœ์น˜์˜ ์ฝ”๋“œ๋ฅผ `main`์œผ๋กœ ๋ณ‘ํ•ฉํ•˜๊ธฐ ์ „, ํ˜‘์—… ํŒ€์›๋“ค์ด ์ฝ”๋“œ๋ฅผ ๊ฒ€ํ† ํ•˜๋Š” ํ•ต์‹ฌ ๊ด€๋ฌธ์ž…๋‹ˆ๋‹ค [13, 16]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ธŒ๋žœ์น˜ ๋ณดํ˜ธ ์„ค์ •, ๋™๋ฃŒ ๋ฆฌ๋ทฐ ์š”๊ตฌ(1 review required), ์ง€์†์  ํ†ตํ•ฉ(CI) ์ฒดํฌ๊ฐ€ ์‹œ์Šคํ…œ ์•ˆ์ •์„ฑ ์œ ์ง€์— ์–ด๋–ป๊ฒŒ ํ•„์ˆ˜์ ์œผ๋กœ ์ž‘์šฉํ•˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [16, 17]. + +- `[[Ticket IDs (Traceability)]]` + - ์—ฐ๊ฒฐ ์ด์œ : ์ฝ”๋“œ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์–ด๋–ค ๋น„์ฆˆ๋‹ˆ์Šค ์š”๊ตฌ์‚ฌํ•ญ(์˜ˆ: Jira ํ‹ฐ์ผ“)์— ์˜ํ•ด ๋ฐœ์ƒํ–ˆ๋Š”์ง€๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๋„๊ตฌ์  ์žฅ์น˜์ž…๋‹ˆ๋‹ค [5, 22]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: `PROJ-123` ํ˜•ํƒœ์˜ ํ‹ฐ์ผ“ ๋ฒˆํ˜ธ๋ฅผ ๋ธŒ๋žœ์น˜์™€ ์ปค๋ฐ‹์— ์‚ฝ์ž…ํ•จ์œผ๋กœ์จ ๋ฆฌ๋ทฐ์–ด์—๊ฒŒ ๋งฅ๋ฝ์„ ์ œ๊ณตํ•˜๊ณ , ๋ฌธ์„œํ™” ๋ฐ ์ž‘์—… ์ถ”์ (Traceability)์„ ์–ด๋–ป๊ฒŒ ๋‹ฌ์„ฑํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5, 22]. + +### Deeper Research Questions +- ์†Œ๊ทœ๋ชจ ํŒ€์ด ์„ฑ์žฅํ•˜์—ฌ ๋ณต์žก์„ฑ์ด ์ฆ๊ฐ€ํ•  ๋•Œ, Feature Branch Workflow์—์„œ Git Flow๋กœ ์•ˆ์ „ํ•˜๊ฒŒ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋ ค๋ฉด ์–ด๋–ค ์ ˆ์ฐจ์™€ ํŒ€ ๋‚ด ๊ต์œก์ด ํ•„์š”ํ•œ๊ฐ€? +- Trunk-Based Development๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ๋„์ž…ํ•˜๊ธฐ ์œ„ํ•ด CI/CD(์ง€์†์  ํ†ตํ•ฉ/๋ฐฐํฌ) ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ๋ฐ˜๋“œ์‹œ ๊ตฌ์„ฑํ•ด์•ผ ํ•˜๋Š” ์ž๋™ํ™” ํ…Œ์ŠคํŠธ ์กฐ๊ฑด์€ ๋ฌด์—‡์ธ๊ฐ€? +- Conventional Commits ์‹œ์Šคํ…œ๊ณผ ์—ฐ๋™ํ•˜์—ฌ ์ž๋™ ๋ฆด๋ฆฌ์Šค ๋…ธํŠธ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์‹œ๋งจํ‹ฑ ๋ฒ„์ €๋‹(Semantic Versioning)์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ธฐ์ˆ ์  ์›๋ฆฌ๋Š” ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”๊ฐ€? +- ๋‹ค์ˆ˜์˜ ์ž‘์—…์ž๊ฐ€ ๊ฒน์น˜๋Š” ์˜์—ญ์„ ์ˆ˜์ •ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” Merge Conflict๋ฅผ ์˜ˆ๋ฐฉํ•˜๊ธฐ ์œ„ํ•ด, 'Atomic Commits'์™€ '์ž์ฃผ ๋ณ‘ํ•ฉํ•˜๊ธฐ' ์›์น™์€ ์‹ค๋ฌด์—์„œ ์–ด๋–ป๊ฒŒ ๊ตฌ์ฒด์ ์œผ๋กœ ์ ์šฉ๋˜์–ด์•ผ ํ•˜๋Š”๊ฐ€? +- ์ฝ”๋“œ ๋ฆฌ๋ทฐ์˜ ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด PR์˜ ๊ทœ๋ชจ๋ฅผ ์ž‘๊ฒŒ(์˜ˆ: 200์ค„ ์ดํ•˜) ์œ ์ง€ํ•˜๋ฉด์„œ๋„ ๋…ผ๋ฆฌ์ ์ธ ๊ธฐ๋Šฅ ๋‹จ์œ„๋ฅผ ํ›ผ์†ํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ ๋ถ„ํ•  ๊ธฐ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? + +### Practical Application Contexts +- **Implementation:** ์ƒˆ๋กœ์šด ์ž‘์—…์„ ์‹œ์ž‘ํ•  ๋•Œ ๋ฌด์กฐ๊ฑด `git checkout -b feature/ํ‹ฐ์ผ“ID-์ž‘์—…๋ช…`์œผ๋กœ ๋…๋ฆฝ์ ์ธ ๋ธŒ๋žœ์น˜๋ฅผ ํŒŒ๊ณ , ์™„๋ฃŒ ํ›„ `feat:` ๋“ฑ์˜ ๊ทœ์น™์„ ๋”ฐ๋ฅธ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๋ฅผ ์ž‘์„ฑํ•œ ๋’ค `main` ๋ธŒ๋žœ์น˜์— PR์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค [6, 7, 13, 22]. +- **System Design:** GitHub์™€ ๊ฐ™์€ ํ˜ธ์ŠคํŒ… ํ”Œ๋žซํผ์—์„œ `main` ๋ธŒ๋žœ์น˜ ๋ณดํ˜ธ(Branch Protection) ์˜ต์…˜์„ ํ™œ์„ฑํ™”ํ•˜์—ฌ ์ง์ ‘ ํ‘ธ์‹œ๋ฅผ ๋ง‰๊ณ , CI ๋นŒ๋“œ ํ†ต๊ณผ์™€ ์ตœ์†Œ 1์ธ์˜ ์Šน์ธ์ด ์žˆ์–ด์•ผ ๋ณ‘ํ•ฉ๋˜๋„๋ก ์‹œ์Šคํ…œ์„ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค [17]. +- **Operation / Maintenance:** ๋ธŒ๋žœ์น˜๊ฐ€ ๋ณ‘ํ•ฉ๋  ๋•Œ๋งˆ๋‹ค ์Šค์ฟผ์‹œ ๋ณ‘ํ•ฉ(Squash and merge)์„ ๊ฐ•์ œํ•˜์—ฌ ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๋‹จ์ผ ํ•ญ๋ชฉ์œผ๋กœ ์••์ถ•ํ•˜๊ณ , ๋ณ‘ํ•ฉ ํ›„ ๋‚จ์€ ๋ธŒ๋žœ์น˜๋ฅผ ์ž๋™ ์‚ญ์ œ(Auto-delete) ์„ค์ •ํ•˜์—ฌ ์ €์žฅ์†Œ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์šด์˜ํ•ฉ๋‹ˆ๋‹ค [17-19]. +- **Learning Path:** Git์— ์ž…๋ฌธํ•˜๋Š” ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ์šฐ, ๋ณต์žกํ•œ `develop` ๋ธŒ๋žœ์น˜ ์—†์ด `main` ๋ธŒ๋žœ์น˜ ํ•˜๋‚˜์™€ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜๋“ค๋กœ๋งŒ ๊ตฌ์„ฑ๋œ ๊ฐ€๋ฒผ์šด ์›Œํฌํ”Œ๋กœ์šฐ(Feature-Branch Workflow)๋ฅผ ๋จผ์ € ํ•™์Šตํ•˜๊ณ  ์ฒดํ™”ํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค [4, 8]. +- **My Project Relevance:** ํ˜„์žฌ ์ง„ํ–‰ํ•˜๋Š” 3์ธ ๊ทœ๋ชจ์˜ ํ”„๋กœ์ ํŠธ ๋“ฑ์—์„œ๋Š” Git Flow์˜ ๋ฌด๊ฑฐ์šด ์ ˆ์ฐจ๋ฅผ ํ”ผํ•˜๊ณ , ํ•ญ์ƒ ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ ์•ˆ์ •์ ์ธ `main` ๋ธŒ๋žœ์น˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์งง์€ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋น ๋ฅธ ๋ฆฌ๋ทฐ์™€ ํ”ผ๋“œ๋ฐฑ์„ ์ฃผ๊ณ ๋ฐ›๋Š” ๋ฐฉ์‹์„ ์ฆ‰๊ฐ ๋„์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [4, 8]. + +### Adjacent Topics +- `[[CI/CD (Continuous Integration/Continuous Deployment)]]` + - ํ™•์žฅ ๋ฐฉํ–ฅ: PR์„ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ๋ณ‘ํ•ฉํ•  ๋•Œ ์ฝ”๋“œ๋ฅผ ์ž๋™์œผ๋กœ ํ…Œ์ŠคํŠธํ•˜๊ณ  ๋นŒ๋“œ, ๋ฐฐํฌํ•˜๋Š” ์ธํ”„๋ผ ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์„ฑ ๋ฐฉ๋ฒ•๋ก ์œผ๋กœ ํ™•์žฅํ•˜์—ฌ ์กฐ์‚ฌ. +- `[[Semantic Versioning (SemVer)]]` + - ํ™•์žฅ ๋ฐฉํ–ฅ: Git ํƒœ๊ทธ(Tag)์™€ Conventional Commits๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์†Œํ”„ํŠธ์›จ์–ด์˜ ๋ฒ„์ „์„ ์ฒด๊ณ„์ ์ด๊ณ  ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ๋ถ€์—ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ํ™•์žฅ. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/GitHub Flow.md b/00_Raw/GitHub Flow.md new file mode 100644 index 00000000..2214b4bc --- /dev/null +++ b/00_Raw/GitHub Flow.md @@ -0,0 +1,64 @@ +# [[GitHub Flow]] + +## ๐Ÿ“Œ Brief Summary +GitHub Flow๋Š” ๋ณต์žกํ•œ Git Flow์˜ ๋Œ€์•ˆ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ฐ€๋ณ๊ณ  ๋‹จ์ˆœํ•œ ๋ธŒ๋žœ์น˜ ๊ธฐ๋ฐ˜ ์›Œํฌํ”Œ๋กœ์šฐ์ž…๋‹ˆ๋‹ค [1, 2]. ์ด ๋ฐฉ์‹์€ ํ•ญ์ƒ ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ(deployable)๋ฅผ ์œ ์ง€ํ•˜๋Š” `main` ๋ธŒ๋žœ์น˜๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ์ž‘๋™ํ•˜๋ฉฐ, ๊ฐœ๋ฐœ์ž๋Š” ์ƒˆ๋กœ์šด ์ž‘์—…์„ ์œ„ํ•ด ์งง์€ ์ฃผ๊ธฐ์˜ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜(feature branch)๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค [3-5]. ๋ณ€๊ฒฝ๋œ ์ฝ”๋“œ๋Š” ๋™๋ฃŒ์˜ ์ฝ”๋“œ ๋ฆฌ๋ทฐ์™€ CI/CD ํ…Œ์ŠคํŠธ๋ฅผ ๋ชจ๋‘ ํ†ต๊ณผํ•œ ํ›„ ์˜ค์ง Pull Request(PR)๋ฅผ ํ†ตํ•ด์„œ๋งŒ `main`์— ๋ณ‘ํ•ฉ๋ฉ๋‹ˆ๋‹ค [1, 6]. + +## ๐Ÿ“– Core Content +* **์•ˆ์ •์ ์ธ `main` ๋ธŒ๋žœ์น˜ ์œ ์ง€** + GitHub Flow์˜ ํ•ต์‹ฌ์€ `main` (๋˜๋Š” `master`) ๋ธŒ๋žœ์น˜๊ฐ€ ํ•ญ์ƒ ์•ˆ์ •์ ์ด๊ณ  ์–ธ์ œ๋“  ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ์—ฌ์•ผ ํ•œ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค [3-5]. ๊ฐœ๋ฐœ์ž๋Š” ์–ด๋– ํ•œ ๊ฒฝ์šฐ์—๋„ `main` ๋ธŒ๋žœ์น˜์— ์ง์ ‘ ์ปค๋ฐ‹(direct commit)ํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค [1, 6, 7]. +* **๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜(Feature Branch) ๊ธฐ๋ฐ˜ ์ž‘์—…** + ๋ชจ๋“  ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ, ๋ฒ„๊ทธ ์ˆ˜์ •, ๋ฌธ์„œ ์ž‘์—… ๋“ฑ์€ `main`์—์„œ ํŒŒ์ƒ๋œ ์งง์€ ์ˆ˜๋ช…(short-lived)์˜ ์ „์šฉ ๋ธŒ๋žœ์น˜์—์„œ ์ˆ˜ํ–‰๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [3-5]. ๋ธŒ๋žœ์น˜ ์ด๋ฆ„์€ `feature/user-auth` ๋˜๋Š” `bugfix/login-error`์™€ ๊ฐ™์ด ์„ค๋ช…์ ์ด์–ด์•ผ ํ•˜๋ฉฐ, ๊ฐ€๋Šฅํ•˜๋ฉด ํ‹ฐ์ผ“ ID(์˜ˆ: `PROJ-123`)๋ฅผ ํฌํ•จํ•˜์—ฌ ์ถ”์ ์„ฑ์„ ๋†’์ด๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค [8, 9]. +* **Pull Request (PR) ๋ฐ ์ฝ”๋“œ ๋ฆฌ๋ทฐ** + ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด `main` ๋ธŒ๋žœ์น˜๋กœ ๋ณ‘ํ•ฉํ•˜๊ธฐ ์œ„ํ•ด PR์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค [6, 10]. ๋ณ‘ํ•ฉ ์ „์—๋Š” ๋ฐ˜๋“œ์‹œ ์ตœ์†Œ 1๋ช… ์ด์ƒ์˜ ํŒ€์›์—๊ฒŒ ์ฝ”๋“œ ๋ฆฌ๋ทฐ(Peer Review)๋ฅผ ๋ฐ›์•„์•ผ ํ•˜๋ฉฐ, CI/CD ํ™˜๊ฒฝ์—์„œ์˜ ์ž๋™ํ™” ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [1, 6, 8]. ์ด๋Š” ํ˜ผ์ž์„œ ์ž˜๋ชป๋œ ์ฝ”๋“œ๋ฅผ ๋ณ‘ํ•ฉํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๋Š” ์•ˆ์ „์žฅ์น˜์ž…๋‹ˆ๋‹ค [8]. +* **๋ณ‘ํ•ฉ ๊ทœ์น™๊ณผ ์ •๋ฆฌ** + ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด PR์„ ๋ณ‘ํ•ฉํ•  ๋•Œ๋Š” 'Squash Merge' ๋ฐฉ์‹์„ ์ฃผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค [6, 7, 11]. ์„ฑ๊ณต์ ์œผ๋กœ ๋ณ‘ํ•ฉ๋œ ์ดํ›„์—๋Š” ๋ถˆํ•„์š”ํ•œ ๋ธŒ๋žœ์น˜๊ฐ€ ์Œ“์ด์ง€ ์•Š๋„๋ก ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜๋ฅผ ์ฆ‰์‹œ ์‚ญ์ œ(auto-delete)ํ•ฉ๋‹ˆ๋‹ค [6, 8, 11]. +* **์›Œํฌํ”Œ๋กœ์šฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ (Migration)** + ํŒ€์ด ๊ธฐ์กด์˜ ๋ณต์žกํ•œ Git Flow์—์„œ GitHub Flow๋กœ ์ „ํ™˜ํ•˜์—ฌ ํ†ตํ•ฉ ์†๋„๋ฅผ ๋†’์ด๊ณ  ๋‹จ์ˆœํ™”ํ•˜๋ ค๋ฉด, ๋ฆด๋ฆฌ์Šค ๋ธŒ๋žœ์น˜(release branch) ์ƒ์„ฑ์„ ์ค‘๋‹จํ•˜๊ณ , `develop` ๋ธŒ๋žœ์น˜๋ฅผ `main`์œผ๋กœ ํ†ตํ•ฉํ•œ ๋’ค, `main` ๋ธŒ๋žœ์น˜์—์„œ ์ง์ ‘ ๋ฐฐํฌํ•˜๋„๋ก CI/CD ํŒŒ์ดํ”„๋ผ์ธ์„ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [2]. ๋ฐ˜๋Œ€๋กœ ํ”„๋กœ์ ํŠธ์˜ ๊ตฌ์กฐ๊ฐ€ ๋” ๋ณต์žกํ•ด์ง€๋ฉด `develop` ๋ธŒ๋žœ์น˜ ๋“ฑ์„ ์ถ”๊ฐ€ํ•ด Git Flow๋กœ ๋˜๋Œ์•„๊ฐˆ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค [12]. + +## โš–๏ธ Trade-offs & Caveats +* **๋ณ‘ํ•ฉ ์ฝ”๋“œ์˜ ์ฆ‰๊ฐ์ ์ธ ๋ฆฌ์Šคํฌ**: `main` ๋ธŒ๋žœ์น˜๊ฐ€ ์œ ์ผํ•œ ๋ฐฐํฌ ๊ธฐ์ค€์ ์ด ๋˜๋ฏ€๋กœ, ๋ฆฌ๋ทฐ๋‚˜ ํ…Œ์ŠคํŠธ๊ฐ€ ๋ˆ„๋ฝ๋˜์–ด ๋ฒ„๊ทธ๊ฐ€ ํฌํ•จ๋œ ์ฝ”๋“œ๊ฐ€ ๋ณ‘ํ•ฉ๋  ๊ฒฝ์šฐ ํ”„๋กœ๋•์…˜(์šด์˜) ํ™˜๊ฒฝ์— ์น˜๋ช…์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [13, 14]. ๋”ฐ๋ผ์„œ ๊ฐ•๋ ฅํ•œ CI/CD ์ž๋™ํ™” ํ™˜๊ฒฝ๊ณผ Branch Protection Rule(๋ณดํ˜ธ ๊ทœ์น™)์ด ํ•„์ˆ˜์ ์œผ๋กœ ๋’ท๋ฐ›์นจ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [1, 6]. +* **๋ธŒ๋žœ์น˜ ์ˆ˜๋ช… ๊ด€๋ฆฌ์˜ ์–ด๋ ค์›€**: ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜๊ฐ€ ๋„ˆ๋ฌด ์˜ค๋ž˜ ์œ ์ง€(Long-lived)๋˜๋ฉด `main` ๋ธŒ๋žœ์น˜์™€์˜ ์ฐจ์ด๊ฐ€ ๋ฒŒ์–ด์ ธ ์‹ฌ๊ฐํ•œ ๋ณ‘ํ•ฉ ์ถฉ๋Œ(Merge Conflict)์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [13, 15]. ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐœ๋ฐœ์ž๋Š” ๋งค์ผ ์ž‘์—… ์ „ `main` ๋ธŒ๋žœ์น˜์˜ ์ตœ์‹  ์ƒํƒœ๋ฅผ ๋‹น๊ฒจ์˜ค๊ณ (pull/rebase) ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ž‘๊ฒŒ ์œ ์ง€ํ•˜๋Š” ๊ทœ์œจ์„ ์—„๊ฒฉํžˆ ์ง€์ผœ์•ผ ํ•ฉ๋‹ˆ๋‹ค [11, 13]. +* **๋Œ€๊ทœ๋ชจ/์ •๊ธฐ ๋ฆด๋ฆฌ์Šค ํ”„๋กœ์ ํŠธ์—์„œ์˜ ํ•œ๊ณ„**: ์ •ํ•ด์ง„ ์ผ์ •์— ๋”ฐ๋ผ ๋ฒ„์ „์„ ๋ฌถ์–ด์„œ ๋ฐฐํฌํ•ด์•ผ ํ•˜๊ฑฐ๋‚˜, ์œ ์ง€๋ณด์ˆ˜ํ•ด์•ผ ํ•  ๊ณผ๊ฑฐ ๋ฆด๋ฆฌ์Šค ๋ฒ„์ „์ด ์—ฌ๋Ÿฌ ๊ฐœ์ธ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ์šฐ, ๋ฆด๋ฆฌ์Šค ๋ธŒ๋žœ์น˜๊ฐ€ ์—†๋Š” GitHub Flow๋Š” ๊ตฌ์กฐ์  ํ•œ๊ณ„๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ์—๋Š” ๋ฌด๊ฒ๋”๋ผ๋„ Git Flow๊ฐ€ ๋” ์ ํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [12, 16]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [๊ด€๊ณ„ ์œ ํ˜• A: ์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ  (๊ฐœ๋ฐœ ์›Œํฌํ”Œ๋กœ์šฐ)] +- [[Git Flow]] + - ์—ฐ๊ฒฐ ์ด์œ : GitHub Flow์™€ ์ž์ฃผ ๋น„๊ต๋˜๋Š” ๋ถ„๊ธฐ ์ „๋žต์œผ๋กœ, ํ”„๋กœ์ ํŠธ์˜ ๋ณต์žก์„ฑ์— ๋”ฐ๋ผ ๋‘ ์ „๋žต ์‚ฌ์ด๋ฅผ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค [2, 12]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: `develop`, `release`, `hotfix` ๋ธŒ๋žœ์น˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” Git Flow๋ฅผ ์ดํ•ดํ•จ์œผ๋กœ์จ, ์ƒ๋Œ€์ ์œผ๋กœ GitHub Flow๊ฐ€ ์ƒ๋žตํ•œ ๊ตฌ์กฐ์  ๋ณต์žก์„ฑ๊ณผ ๊ทธ์— ๋”ฐ๋ฅธ ์†๋„/๋‹จ์ˆœ์„ฑ์˜ ์ด์ ์„ ๋ช…ํ™•ํžˆ ๋น„๊ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[Trunk-Based Development]] + - ์—ฐ๊ฒฐ ์ด์œ : ์†Œ๊ทœ๋ชจ ํŒ€์—์„œ ๋น ๋ฅด๊ณ  ์ถฉ๋Œ ์—†๋Š” ๋ณ‘ํ•ฉ์„ ์œ„ํ•ด ๋„์ž…ํ•  ์ˆ˜ ์žˆ๋Š” ๋˜ ๋‹ค๋ฅธ ๊ฒฝ๋Ÿ‰ ์›Œํฌํ”Œ๋กœ์šฐ์ž…๋‹ˆ๋‹ค [3, 16]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ทน๋‹จ์ ์œผ๋กœ ์งง์€ ์ƒ๋ช…์ฃผ๊ธฐ์˜ ๋ธŒ๋žœ์น˜๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋ฉ”์ธ์— ๋นˆ๋ฒˆํžˆ ์ง์ ‘ ๋ณ‘ํ•ฉํ•˜๋Š” ์ฒ ํ•™์„ ํ†ตํ•ด CI(์ง€์†์  ํ†ตํ•ฉ)์˜ ๋ณธ์งˆ์„ ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +#### [๊ด€๊ณ„ ์œ ํ˜• B: ๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ] +- [[Pull Request]] + - ์—ฐ๊ฒฐ ์ด์œ : GitHub Flow์—์„œ ์ฝ”๋“œ ๋ณ‘ํ•ฉ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ํŒ€์› ๊ฐ„์˜ ํ˜‘์—… ๋ฐ ๋ฆฌ๋ทฐ๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ๊ฐ€์žฅ ํ•ต์‹ฌ์ ์ธ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค [8, 10]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ฝ”๋“œ ํ’ˆ์งˆ ํ†ต์ œ, ํ”ผ์–ด ๋ฆฌ๋ทฐ(Peer Review)์˜ ์—ญํ•  ๋ฐ CI/CD ํ›…(Hook)์ด ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์„ ๊ตฌ์ฒด์ ์œผ๋กœ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[CI/CD]] + - ์—ฐ๊ฒฐ ์ด์œ : `main` ๋ธŒ๋žœ์น˜๋ฅผ ํ•ญ์ƒ ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐฐํ›„์—์„œ ์ฝ”๋“œ๋ฅผ ๊ฒ€์ฆํ•˜๋Š” ํ•„์ˆ˜ ์ž๋™ํ™” ํŒŒ์ดํ”„๋ผ์ธ์ž…๋‹ˆ๋‹ค [1, 6]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์™œ ์ˆ˜๋™ ๋ณ‘ํ•ฉ์ด ์œ„ํ—˜ํ•œ์ง€, PR ๋ฆฌ๋ทฐ๊ฐ€ ๋๋‚œ ์ฝ”๋“œ๊ฐ€ ์–ด๋–ป๊ฒŒ ์•ˆ์ „ํ•˜๊ฒŒ ํ”„๋กœ๋•์…˜ ๋ ˆ๋ฒจ๊นŒ์ง€ ๋ฐฐํฌ๋˜๋Š”์ง€์˜ ์ „ ๊ณผ์ •์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### Deeper Research Questions +- Git Flow ๊ธฐ๋ฐ˜ ํ”„๋กœ์ ํŠธ์—์„œ GitHub Flow๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ๋•Œ, ๊ธฐ์กด์˜ ๋ฒ„์ „ ๊ด€๋ฆฌ ์ฒด๊ณ„ ๋ฐ ๋ฐฐํฌ ์ž๋™ํ™” ํŒŒ์ดํ”„๋ผ์ธ์„ ์–ด๋–ป๊ฒŒ ์žฌ์„ค๊ณ„ํ•ด์•ผ ํ•˜๋Š”๊ฐ€? +- GitHub Flow ํ™˜๊ฒฝ์—์„œ ๊ธฐ๋Šฅ์ด ๋ฏธ์™„์„ฑ๋œ ์ƒํƒœ๋กœ `main`์— ๋ณ‘ํ•ฉ๋˜์–ด์•ผ ํ•  ๋•Œ, Feature Flag(๊ธฐ๋Šฅ ํ† ๊ธ€)๋ฅผ ์–ด๋–ป๊ฒŒ ํšจ๊ณผ์ ์œผ๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- ํŒ€ ๊ทœ๋ชจ๊ฐ€ 3~5์ธ์—์„œ 20์ธ ์ด์ƒ์œผ๋กœ ๊ธ‰๊ฒฉํžˆ ์„ฑ์žฅํ•  ๋•Œ, GitHub Flow์˜ ํ•œ๊ณ„์ ์€ ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ๋‚˜ํƒ€๋‚˜๋ฉฐ ์–ด๋–ค ์‹œ์ ์— ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์ „ํ™˜ํ•ด์•ผ ํ•˜๋Š”๊ฐ€? +- ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ์ •๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๊ถŒ์žฅ๋˜๋Š” Squash Merge ๋ฐฉ์‹์ด ์žฅ๊ธฐ์ ์ธ ๋ฒ„๊ทธ ์ถ”์ ์„ฑ(Traceability) ๊ด€์ ์—์„œ๋Š” ์–ด๋–ค ๋‹จ์ ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- Branch Protection์„ ํ†ตํ•ด '์ตœ์†Œ 1์ธ์˜ ๋ฆฌ๋ทฐ'์™€ 'CI ํ†ต๊ณผ'๋ฅผ ๊ฐ•์ œํ•  ๋•Œ, ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ํ”„๋กœ์„ธ์Šค์  ์ตœ์ ํ™” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? + +### Practical Application Contexts +- **Implementation:** ๊ฐœ๋ฐœ์ž๋Š” JIRA ๋“ฑ์—์„œ ํ• ๋‹น๋ฐ›์€ ํ‹ฐ์ผ“ ID๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ `feature/PROJ-123-login` ํ˜•์‹์˜ ๋ธŒ๋žœ์น˜๋ฅผ ๋”ฐ๊ณ , ํ•œ ๊ฐ€์ง€ ๋…ผ๋ฆฌ์  ๋ณ€๊ฒฝ์‚ฌํ•ญ๋งŒ ๋‹ด์€ Atomic Commit์„ ์ˆ˜ํ–‰ํ•œ ๋’ค PR์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. +- **System Design:** GitHub/GitLab ๋“ฑ์˜ ๋ ˆํฌ์ง€ํ† ๋ฆฌ ์„ค์ •์—์„œ `main` ๋ธŒ๋žœ์น˜์— ๋Œ€ํ•ด ์ง์ ‘ ํ‘ธ์‹œ(Direct Push)๋ฅผ ์ฐจ๋‹จํ•˜๊ณ , Status Check(ํ…Œ์ŠคํŠธ ํ†ต๊ณผ) ๋ฐ ์ง€์ •๋œ ๋ฆฌ๋ทฐ์–ด์˜ Approve๋ฅผ ๊ฐ•์ œํ•˜๋Š” ๋ณดํ˜ธ ๊ทœ์น™(Branch Protection)์„ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค. +- **Operation / Maintenance:** CI/CD ํŒŒ์ดํ”„๋ผ์ธ์ด `main` ๋ธŒ๋žœ์น˜์˜ ๋ณ€๊ฒฝ์„ ๊ฐ์ง€ํ•˜๋ฉด ์ž๋™์œผ๋กœ ํ”„๋กœ๋•์…˜์— ๋ฐฐํฌ๋˜๋„๋ก ๊ตฌ์„ฑํ•˜๊ณ , ์ €์žฅ์†Œ์˜ ๊น”๋”ํ•œ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ๋ณ‘ํ•ฉ๋œ ๋ธŒ๋žœ์น˜๋Š” ์‹œ์Šคํ…œ์—์„œ ์ž๋™ ์‚ญ์ œ๋˜๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. +- **Learning Path:** Git ๋ธŒ๋žœ์น˜ ๊ธฐ์ดˆ ๋ช…๋ น์–ด ์ˆ™์ง€ -> 1๊ธฐ๋Šฅ 1๋ธŒ๋žœ์น˜ ์›์น™ ์‹ค์Šต -> PR ์ž‘์„ฑ ๋ฐ ๋™๋ฃŒ ๋ฆฌ๋ทฐ ๊ฒฝํ—˜ -> ์ž๋™ํ™”๋œ CI/CD์™€์˜ ์—ฐ๋™ ์ดํ•ด์˜ ์ˆœ์„œ๋กœ ํ˜‘์—… ๋Šฅ๋ ฅ์„ ์„ฑ์žฅ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- **My Project Relevance:** 3~5๋ช…์˜ ์†Œ๊ทœ๋ชจ ํŒ€์—์„œ ์ถฉ๋Œ์„ ์ตœ์†Œํ™”ํ•˜๋ฉด์„œ๋„ ๋น ๋ฅธ ํ”ผ๋“œ๋ฐฑ๊ณผ ๋ฆด๋ฆฌ์Šค๊ฐ€ ํ•„์š”ํ•œ ํ˜„์žฌ ํ”„๋กœ์ ํŠธ ์ƒํ™ฉ์—, ๋ถˆํ•„์š”ํ•œ ์ ˆ์ฐจ๋ฅผ ์—†์• ๊ณ  ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•˜๋Š” ๊ฐ€์žฅ ์ด์ƒ์ ์ธ ํ˜‘์—… ๋ชจ๋ธ๋กœ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### Adjacent Topics +- [[Conventional Commits]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๋ฅผ `feat:`, `fix:`, `chore:` ๋“ฑ์˜ ๊ทœ๊ฒฉ์œผ๋กœ ํ†ต์ผํ•จ์œผ๋กœ์จ, PR ๋‚ด์šฉ์˜ ๊ฐ€๋…์„ฑ์„ ๋†’์ด๊ณ  ํ–ฅํ›„ ๋ฆด๋ฆฌ์Šค ๋…ธํŠธ๋ฅผ ์ž๋™ํ™”ํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์ง€์‹์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[Issue Tracking System]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ์ฝ”๋“œ ๊ตฌํ˜„(GitHub)๊ณผ ์š”๊ตฌ์‚ฌํ•ญ ์ •์˜(JIRA, Linear ๋“ฑ)๋ฅผ ์—ฐ๊ฒฐํ•˜์—ฌ ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ ์ˆ˜์ค€์„ ๋†’์ด๊ณ  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋งฅ๋ฝ(Traceability)์„ ์ถ”์ ํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก ์œผ๋กœ ํ™•์žฅ๋ฉ๋‹ˆ๋‹ค. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Large-scale Application Refactoring.md b/00_Raw/Large-scale Application Refactoring.md new file mode 100644 index 00000000..57dc756e --- /dev/null +++ b/00_Raw/Large-scale Application Refactoring.md @@ -0,0 +1,66 @@ +# [[Large-scale Application Refactoring]] + +## ๐Ÿ“Œ Brief Summary +๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฆฌํŒฉํ† ๋ง์€ ์ฝ”๋“œ์˜ ๋™์ž‘ ๋ฐฉ์‹์„ ๋ณด์กดํ•˜๋ฉด์„œ ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ๊ฐœ์„ ํ•˜์—ฌ ์˜ค๋ž˜๋œ ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ํ™•์žฅ์„ฑ์„ ํšŒ๋ณตํ•˜๋Š” ๊ณผ์ •์ด๋‹ค [1]. ์ด๋Š” ๋‹จ์ˆœํžˆ ์ฝ”๋“œ๋ฅผ '์ˆ˜์ •'ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๋ณต์žกํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋ถ„๋ฆฌํ•˜๊ณ  ๊ตฌ์กฐ์  ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•œ๋‹ค [2]. ์„ฑ๊ณต์ ์ธ ๋ฆฌํŒฉํ† ๋ง์„ ์œ„ํ•ด์„œ๋Š” ์ ์ง„์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹, ์—„๊ฒฉํ•œ ์•„ํ‚คํ…์ฒ˜ ์ ์šฉ, ๊ทธ๋ฆฌ๊ณ  ์ฝ”๋“œ ๋ณ€๊ฒฝ์„ ๋’ท๋ฐ›์นจํ•  ์ˆ˜ ์žˆ๋Š” ํ…Œ์ŠคํŠธ ๊ตฌ์ถ•์ด ํ•„์ˆ˜์ ์ด๋‹ค [1, 3]. + +## ๐Ÿ“– Core Content + +* **์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ „๋žต (Incremental Migration):** ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ•œ ๋ฒˆ์— ์ „๋ฉด ์žฌ์ž‘์„ฑ(Rewrite)ํ•˜๋Š” ๊ฒƒ์€ ๋ฆฌ์Šคํฌ๊ฐ€ ๋งค์šฐ ํฌ๊ธฐ ๋•Œ๋ฌธ์—, "์žฌ์ž‘์„ฑ์ด ์•„๋‹Œ ๋ฆฌํŒฉํ† ๋ง" ์ „๋žต์ด ๊ถŒ์žฅ๋œ๋‹ค [1]. ์˜ˆ๋ฅผ ๋“ค์–ด ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ๋ฅผ Context API์—์„œ Zustand๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ๋•Œ, ์•Œ๋ฆผ๊ณผ ๊ฐ™์€ ๋‹จ์ˆœํ•œ ์œ ํ‹ธ๋ฆฌํ‹ฐ ์Šคํ† ์–ด๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด ๊ฒฐ์ œ ํ๋ฆ„๊ณผ ๊ฐ™์€ ๋ณต์žกํ•œ ๋„๋ฉ”์ธ์œผ๋กœ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์Šคํ† ์–ด์”ฉ ์ ์ง„์ ์œผ๋กœ ์ด๋™ํ•ด์•ผ ํ•œ๋‹ค [1]. +* **๊ธฐ๋Šฅ ๋ฐ ๋„๋ฉ”์ธ ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ๋กœ์˜ ๊ฐœํŽธ:** ๋ ˆ๊ฑฐ์‹œ ์•ฑ์—์„œ ํ”ํžˆ ์“ฐ์ด๋Š” ํŒŒ์ผ ํƒ€์ž… ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ(components, hooks ๋“ฑ์„ ๋”ฐ๋กœ ๋ชจ์œผ๋Š” ๋ฐฉ์‹)๋Š” ์•ฑ์ด ์ปค์งˆ์ˆ˜๋ก ํƒ์ƒ‰๊ณผ ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ ๋‹ค [4, 5]. ๋”ฐ๋ผ์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๊ธฐ๋Šฅ๋ณ„๋กœ ์ฝ”๋“œ๋ฅผ ๋ชจ์œผ๋Š” ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ๋‚˜, ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ์„ ๊ฐ•์ œํ•˜๋Š” ์—„๊ฒฉํ•œ ๊ณ„์ธต ๋ชจ๋ธ์ธ Feature-Sliced Design(FSD)์œผ๋กœ ํด๋” ๊ตฌ์กฐ๋ฅผ ์žฌํŽธํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ ์ธ ๋ฆฌํŒฉํ† ๋ง ๋ชฉํ‘œ๊ฐ€ ๋œ๋‹ค [6-8]. +* **์ปค์Šคํ…€ ํ›…์„ ํ†ตํ•œ ๋กœ์ง ์บก์Аํ™”:** ํ˜„๋Œ€ React ๋ฆฌํŒฉํ† ๋ง์˜ ๊ธฐ๋ณธ ๋‹จ์œ„๋Š” ์ปค์Šคํ…€ ํ›…์ด๋‹ค [9]. ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ํŽ˜์นญ์ด๋‚˜ ํผ ํ•ธ๋“ค๋ง ๋กœ์ง์„ ๊ฑฐ๋Œ€ํ•œ UI ์ปดํฌ๋„ŒํŠธ์—์„œ ์ถ”์ถœํ•˜์—ฌ `useFetch`, `useForm` ๋“ฑ์˜ ํ›…์œผ๋กœ ๋ถ„๋ฆฌํ•˜๋ฉด, UI์™€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ๊ฒฉ๋ฆฌ๋˜์–ด ๋” ๋น ๋ฅด๊ณ  ๋…๋ฆฝ์ ์ธ ์œ ๋‹› ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง„๋‹ค [9, 10]. +* **ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•œ ์•ˆ์ „๋ง ํ™•๋ณด:** ์ฝ”๋“œ๋ฅผ ๋ณธ๊ฒฉ์ ์œผ๋กœ ์ˆ˜์ •ํ•˜๊ธฐ ์ „์— ํ…Œ์ŠคํŠธ(Unit Test, UI Test ๋“ฑ)๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ตœ์šฐ์„  ๋ฐฉ์–ด์„ ์ด๋‹ค [3, 11, 12]. ๊ธฐ์กด ๊ธฐ๋Šฅ์ด ๊นจ์ง€์ง€ ์•Š์•˜๋Š”์ง€ ๊ฒ€์ฆํ•  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ณผ์ • ์ž์ฒด๊ฐ€ ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ธฐ์กด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ํ๋ฆ„์„ ๊นŠ์ด ์ดํ•ดํ•˜๋„๋ก ๊ฐ•์ œํ•˜๋Š” ํ•™์Šต ๋„๊ตฌ๊ฐ€ ๋œ๋‹ค [13, 14]. +* **๋ ˆ๊ฑฐ์‹œ ์•ˆํ‹ฐํŒจํ„ด ๋ฐ ์Šคํƒ ์ œ๊ฑฐ:** ํšจ์œจ์ ์ธ ๊ตฌ์กฐ๋ฅผ ์œ„ํ•ด ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ Œ๋”๋ง์„ ์œ ๋ฐœํ•˜๋Š” ๋‹ค์ˆ˜์˜ `useEffect`๋ฅผ ์ œ๊ฑฐํ•˜๊ณ , ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ์ƒํƒœ๋ฅผ ๋ถ„๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด TanStack Query์™€ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ๋„์ž…ํ•ด์•ผ ํ•œ๋‹ค [15]. ๋˜ํ•œ, ๊ฐ€๋Šฅํ•  ๊ฒฝ์šฐ ํด๋ž˜์Šค ๊ธฐ๋ฐ˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์™€ ํ›…์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ , ์ผ๊ด€์„ฑ ์—†๋Š” CSS ์ ์šฉ ๋ฐฉ์‹์„ ํ•˜๋‚˜๋กœ ํ†ต์ผํ•˜๋Š” ์ž‘์—…๋„ ์ˆ˜๋ฐ˜๋œ๋‹ค [15, 16]. + +## โš–๏ธ Trade-offs & Caveats +* **DRY์™€ KISS ์›์น™์˜ ์ถฉ๋Œ:** ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๋ ค๋Š” DRY(Don't Repeat Yourself) ์›์น™์„ ๊ณผ๋„ํ•˜๊ฒŒ ์ ์šฉํ•  ๊ฒฝ์šฐ, ์ถ”์ƒํ™”๊ฐ€ ์ง€๋‚˜์น˜๊ฒŒ ๋ณต์žกํ•ด์ ธ ์ฝ”๋“œ๋ฅผ ๋‹จ์ˆœํ•˜๊ฒŒ ์œ ์ง€ํ•ด์•ผ ํ•˜๋Š” KISS(Keep It Simple, Stupid) ์›์น™์„ ์œ„๋ฐ˜ํ•˜๊ฒŒ ๋œ๋‹ค [17]. ๋”ฐ๋ผ์„œ ํŠน์ • ํŒจํ„ด์ด ์„ธ ๋ฒˆ ๋ฐ˜๋ณต๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ ์ถ”์ƒํ™”๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์กฐ๊ธฐ ์ตœ์ ํ™”๋กœ ์ธํ•œ ๋ถ€์ž‘์šฉ์„ ๋ง‰๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค [17]. +* **์žฌ์ž‘์„ฑ(Rewrite) vs ๋ฆฌํŒฉํ† ๋ง(Refactoring)์˜ ๊ธฐ๋กœ:** ๋ฆฌํŒฉํ† ๋ง ๋Œ€์ƒ์ธ ์•ฑ์˜ ๊ทœ๋ชจ๊ฐ€ ๋น„๊ต์  ์ž‘๋‹ค๋ฉด ์ฒ˜์Œ๋ถ€ํ„ฐ ์ƒˆ๋กœ ์•ฑ์„ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์ด ์˜คํžˆ๋ ค ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ๋‹ค [11]. ๊ทธ๋Ÿฌ๋‚˜ ๋Œ€ํ˜• ์•ฑ์˜ ๊ฒฝ์šฐ ์ „์ฒด ์žฌ์ž‘์„ฑ์€ ์œ„ํ—˜์ด ์ปค์„œ ์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ํ•ด์•ผ ํ•˜๋Š”๋ฐ, ์ด ๊ฒฝ์šฐ ์ „ํ™˜ ๊ธฐ๊ฐ„ ๋™์•ˆ ๋‘ ๊ฐ€์ง€ ๋‹ค๋ฅธ ๊ธฐ์ˆ ์ด๋‚˜ ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด์ด ๊ณต์กดํ•ด์•ผ ํ•˜๋Š” ๊ณผ๋„๊ธฐ์  ๊ธฐ์ˆ  ๋ถ€์ฑ„๋ฅผ ๊ฐ๋‹นํ•ด์•ผ ํ•œ๋‹ค [1]. +* **์ปดํŒŒ์ผ๋Ÿฌ ์ž๋™ํ™” ๋„์ž…์˜ ์žฅ๋ฒฝ:** React Compiler์™€ ๊ฐ™์ด ์„ฑ๋Šฅ ์ตœ์ ํ™”(๋ฉ”๋ชจ์ด์ œ์ด์…˜)๋ฅผ ์ž๋™ํ™”ํ•ด ์ฃผ๋Š” ๋„๊ตฌ๋ฅผ ๋„์ž…ํ•˜๋ฉด ์ˆ˜๋™ ์ตœ์ ํ™” ์ฝ”๋“œ๋ฅผ ์ง€์›Œ ์ฝ”๋“œ๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค [18]. ํ•˜์ง€๋งŒ ๊ธฐ์ˆ  ๋ถ€์ฑ„๊ฐ€ ๋งŽ์€ ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ๊ฒฝ์šฐ, ๊ธฐ์กด ์ฝ”๋“œ๊ฐ€ 'React์˜ ๊ทœ์น™(Rules of React)'์„ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์œ„๋ฐ˜ํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ, ๋„์ž… ์ „ ๋Œ€๋Œ€์ ์ธ ์‚ฌ์ „ ๋ฆฌํŒฉํ† ๋ง์ด ์„ ํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ์ œ์•ฝ์ด ๋”ฐ๋ฅธ๋‹ค [19]. +* **๊ณต์œ (Shared) ๋ชจ๋“ˆ์˜ ๋น„๋Œ€ํ™”:** ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ฒ˜(์˜ˆ: FSD)๋กœ ๋ถ„๋ฆฌํ•  ๋•Œ, ๊ณตํ†ต์œผ๋กœ ์“ฐ์ด๋Š” ์ฝ”๋“œ๋ฅผ ๋ฌด๋ถ„๋ณ„ํ•˜๊ฒŒ 'Shared' ๊ณ„์ธต์— ๋„ฃ์œผ๋ฉด ํ•ด๋‹น ๊ณ„์ธต์ด ๋ณต์žกํ•œ ์ŠคํŒŒ๊ฒŒํ‹ฐ ์ฝ”๋“œ๊ฐ€ ๋˜๊ณ  ๋ณ€๊ฒฝ ์‹œ ์˜ํ–ฅ ๋ฒ”์œ„(Blast Radius)๊ฐ€ ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ์ปค์ง€๋Š” ์œ„ํ—˜์ด ์žˆ๋‹ค [20, 21]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [์•„ํ‚คํ…์ฒ˜ ๋ฐ ๊ธฐ๋ฐ˜ ์›์น™] +- [[Feature-Sliced Design]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋Œ€๊ทœ๋ชจ ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ์ŠคํŒŒ๊ฒŒํ‹ฐํ™”๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ , ๋„๋ฉ”์ธ/๊ธฐ๋Šฅ ์ค‘์‹ฌ์˜ ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ๊ทœ์น™์„ ๋ถ€์—ฌํ•˜์—ฌ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฆฌํŒฉํ† ๋ง์˜ ๊ถ๊ทน์  ๋ชฉํ‘œ ๋ชจ๋ธ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค [7, 22]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ธฐ๋Šฅ(Feature)๊ณผ ๊ณ„์ธต(Layer)์„ ์–ด๋–ป๊ฒŒ ๋‚˜๋ˆ„๊ณ  ์บก์Аํ™”ํ•˜์—ฌ ์„œ๋กœ ๊ฐ„์˜ ์˜์กด์„ฑ ๊ฒฐํ•ฉ์„ ๋Š์–ด๋‚ด๋Š”์ง€์— ๋Œ€ํ•œ ์‹ค๋ฌด์  ์•„ํ‚คํ…์ฒ˜ ๊ตฌ์กฐ [6, 23]. + +- [[SOLID Principles]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP) ๋“ฑ์„ ํ†ตํ•ด ๊ฑฐ๋Œ€ํ•œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ฐ€์ง€๋Š” ์—ฌ๋Ÿฌ ์ฑ…์ž„์„ ๋ถ„๋ฆฌํ•˜๊ณ , ํ•จ์ˆ˜๋‚˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅํ•˜๊ฒŒ ์ž˜๊ฒŒ ์ชผ๊ฐœ๋Š” ๋ฆฌํŒฉํ† ๋ง์˜ ํ•ต์‹ฌ ์ด๋ก ์  ๋ฐฐ๊ฒฝ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค [24, 25]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ธฐ๋Šฅ์  ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ์ธํ„ฐํŽ˜์ด์Šค(Props)๋ฅผ ์–ด๋–ป๊ฒŒ ๋ถ„๋ฆฌํ•˜๊ณ , ํ™•์žฅ์— ์—ด๋ ค์žˆ์œผ๋ฉด์„œ ์ˆ˜์ •์—๋Š” ๋‹ซํžŒ ์ฝ”๋“œ ์ž‘์„ฑ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ• [25, 26]. + +#### [๊ตฌํ˜„ ๋ฐ ํ™œ์šฉ ๋„๊ตฌ] +- [[Unit Testing]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ ๊ตฌ์กฐ๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ ๊ธฐ๋Šฅ์ด ๋ง๊ฐ€์ง€์ง€ ์•Š์•˜์Œ์„ ๋ณด์žฅํ•˜๋Š” ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„์ด์ž ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์•ˆ์ „๋ง ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค [3, 12]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ฝ”๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ๋” ์ž‘๊ณ  ๋…ผ๋ฆฌ์ ์ธ ๋ธ”๋ก ๋‹จ์œ„๋กœ ๋‚˜๋ˆ„์–ด(Triangulation) ์˜์กด์„ฑ ์—†์ด ๋…๋ฆฝ์ ์œผ๋กœ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ๋ฐฉ๋ฒ•๋ก  [9, 12]. + +- [[Custom Hooks]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์— ๋ณต์žกํ•˜๊ฒŒ ์–ฝํžŒ ์ƒํƒœ์™€ ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ ๋กœ์ง์„ ์™ธ๋ถ€๋กœ ์ถ”์ถœํ•˜๋Š” ๋ฆฌํŒฉํ† ๋ง์˜ ์ฃผ๋œ ๋‹จ์œ„์ด์ž ๋„๊ตฌ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค [9]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: UI ๋ Œ๋”๋ง ์ฑ…์ž„๊ณผ ๋น„์ฆˆ๋‹ˆ์Šค ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์ฑ…์ž„์„ ์–ด๋–ป๊ฒŒ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๊ฒฉ๋ฆฌํ•˜์—ฌ ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋Š”์ง€์˜ ์›๋ฆฌ [9, 10]. + +### Deeper Research Questions + +- ๋ฆฌํŒฉํ† ๋ง ๊ณผ์ •์—์„œ Feature-Sliced Design(FSD) ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋„์ž…ํ•  ๋•Œ, ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ(Feature)์—์„œ ๋™์‹œ์— ์š”๊ตฌ๋˜๋Š” ๊ต์ฐจ ๊ด€์‹ฌ์‚ฌ(Cross-cutting concerns) ๋กœ์ง์€ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋Š”๊ฐ€? +- ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ์ „๋ฌดํ•œ ๊ฑฐ๋Œ€ํ•œ ๋ ˆ๊ฑฐ์‹œ React ์•ฑ์„ ๋ฆฌํŒฉํ† ๋งํ•  ๋•Œ, ์–ด๋–ค ๋ถ€๋ถ„(์˜ˆ: ๊ณตํ†ต ์œ ํ‹ธ, UI ์ปดํฌ๋„ŒํŠธ, ์ „์—ญ ์ƒํƒœ ๋“ฑ)๋ถ€ํ„ฐ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋‘๊ณ  ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€๋ฅผ ํ™•๋ณดํ•ด์•ผ ํ•˜๋Š”๊ฐ€? +- ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ Context API ๊ธฐ๋ฐ˜ ์ „์—ญ ์ƒํƒœ๋ฅผ Zustand ๋“ฑ ํ˜„๋Œ€์  ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ๋กœ ์ ์ง„์ ์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์ƒํƒœ ๋™๊ธฐํ™” ๋ฌธ์ œ๋Š” ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- ๊ธฐ์กด์˜ ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜(`useMemo`, `useCallback`) ์ฝ”๋“œ๊ฐ€ ๋งŽ์€ ๋ ˆ๊ฑฐ์‹œ ์•ฑ์— React Compiler๋ฅผ ๋„์ž…ํ•˜๊ธฐ ์œ„ํ•ด ์ฝ”๋“œ ๋‚ด์˜ 'Rules of React' ์œ„๋ฐ˜ ์‚ฌํ•ญ์„ ์ถ”์ ํ•˜๊ณ  ๊ฒ€์ฆํ•˜๋Š” ํšจ๊ณผ์ ์ธ ์ž๋™ํ™” ํ”„๋กœ์„ธ์Šค๋Š” ๋ฌด์—‡์ธ๊ฐ€? +- ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์™€ ์ปค์Šคํ…€ ํ›… ๊ตฌ์กฐ๋กœ ๋ฆฌํŒฉํ† ๋งํ•  ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜(Memory Leaks) ํŒจํ„ด์„ ๊ฐ์ง€ํ•˜๊ณ  ๋ฐฉ์ง€ํ•˜๋Š” ๋””๋ฒ„๊น… ์ „๋žต๋ก ์€ ๋ฌด์—‡์ธ๊ฐ€? + +### Practical Application Contexts + +- **Implementation:** ๊ฑฐ๋Œ€ํ•œ ํผ ์ฒ˜๋ฆฌ๋‚˜ API ํŽ˜์นญ ๋กœ์ง์ด ๋ทฐ์™€ ๊ฒฐํ•ฉํ•˜์—ฌ 300์ค„์ด ๋„˜์–ด๊ฐ€๋Š” ๊ธฐ์กด ์ปดํฌ๋„ŒํŠธ๋ฅผ, ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)์— ๋”ฐ๋ผ ์ˆœ์ˆ˜ ๋ทฐ ์ปดํฌ๋„ŒํŠธ์™€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋‹ด์€ ์ปค์Šคํ…€ ํ›…์œผ๋กœ ์ถ”์ถœํ•˜์—ฌ ๋‹ค์‹œ ์—ฐ๊ฒฐํ•œ๋‹ค [9, 25]. +- **System Design:** ํด๋” ๊ตฌ์กฐ๋ฅผ `components/`, `hooks/` ๊ฐ™์€ ํŒŒ์ผ ์œ ํ˜• ๊ตฌ๋ถ„์ด ์•„๋‹Œ, ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ(์˜ˆ: ์ธ์ฆ, ๊ฒฐ์ œ)์„ ์ค‘์‹ฌ์œผ๋กœ ๋ชจ์€ ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ํ˜น์€ FSD ๊ธฐ๋ฐ˜ ํด๋” ๊ณ„์ธต ๊ตฌ์กฐ๋กœ ์ „๋ฉด ์žฌ์„ค๊ณ„ํ•œ๋‹ค [8, 27]. +- **Operation / Maintenance:** ESLint์™€ Husky ๋“ฑ์˜ ๋„๊ตฌ๋ฅผ ํŒŒ์ดํ”„๋ผ์ธ์— ๊ตฌ์ถ•ํ•˜์—ฌ ๋ฆฌํŒฉํ† ๋ง๋œ ์ฝ”๋“œ๊ฐ€ ์ƒ์œ„ ๊ณ„์ธต์„ ์ž˜๋ชป ์ฐธ์กฐํ•˜๋Š” ์—ญ์˜์กด์„ฑ(Reverse dependency)์„ ๋ฐœ์ƒ์‹œํ‚ค๊ฑฐ๋‚˜ ์ฝ”๋“œ ์ปจ๋ฒค์…˜์ด ์–ด๊ธ‹๋‚˜์ง€ ์•Š๋„๋ก ์—„๊ฒฉํžˆ ํ†ต์ œํ•œ๋‹ค [28]. +- **Learning Path:** ๋ฆฌํŒฉํ† ๋งํ•ด์•ผ ํ•  ์ฝ”๋“œ๋ฅผ ํŒŒ์•…ํ•˜๊ธฐ ์ „, ๋จผ์ € ์ž‘์€ ๋นˆ ํ”„๋กœ์ ํŠธ๋‚˜ 'ํ† ์ด ์•ฑ'์„ ๋งŒ๋“ค์–ด ๋ฆฌํŒฉํ† ๋ง์— ๋„์ž…ํ•  ์ƒˆ๋กœ์šด ๊ธฐ์ˆ (React์˜ ์ตœ์‹  ๊ธฐ๋Šฅ ๋“ฑ)์˜ ๊ธฐ์ดˆ๋ฅผ ์‹ค์Šตํ•˜์—ฌ ๊ฐœ๋…์„ ํ™•๋ฆฝํ•œ๋‹ค [29]. +- **My Project Relevance:** ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค์ด ์ž‘์„ฑํ•œ ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฅผ ์ธ๊ณ„๋ฐ›์•„ ๋…ผ๋ฌธ ํ”„๋กœ์ ํŠธ์šฉ์œผ๋กœ ๋ฆฌํŒฉํ† ๋งํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ, ๋จผ์ € ๊ธฐ์กด ๋กœ์ง์„ ํŒŒ์•…ํ•˜๊ธฐ ์œ„ํ•œ ์œ ๋‹› ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•œ ํ›„, ๋ฌด๋ถ„๋ณ„ํ•˜๊ฒŒ ํ˜ผ์šฉ๋œ CSS ์Šคํƒ€์ผ ์ •์ฑ…์„ ํ•˜๋‚˜๋กœ ํ†ต์ผ์‹œํ‚ค๊ณ  ๋ถˆํ•„์š”ํ•œ ์ „์—ญ ์ƒํƒœ๋ฅผ ์ง€์—ญ ์ƒํƒœ๋กœ ์ „ํ™˜ํ•˜๋Š” ์‹ค๋ฌด ํ”„๋กœ์„ธ์Šค๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค [14, 16, 30, 31]. + +### Adjacent Topics + +- [[Web Performance Optimization]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋ฆฌํŒฉํ† ๋ง ์ž‘์—…๊ณผ ๋ณ‘ํ–‰ํ•˜์—ฌ ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ ๊ฐ์†Œ(์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…), ๋ฆฌ๋ Œ๋”๋ง ์ตœ์ ํ™”, ๋ถˆํ•„์š”ํ•œ ๋ Œ๋” ๋ธ”๋กœํ‚น ์ œ๊ฑฐ ๋“ฑ์„ ํ†ตํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋Ÿฐํƒ€์ž„ ๋ฐ ๋กœ๋”ฉ ์†๋„๋ฅผ ํ–ฅ์ƒํ•˜๋Š” ์ „๋žต์  ๊ธฐ๋ฒ•์„ ํƒ๊ตฌํ•œ๋‹ค. +- [[State Management Fragmentation]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋ ˆ๊ฑฐ์‹œ ์•ฑ์˜ ๊ฑฐ๋Œ€ํ•œ ๋‹จ์ผ ์ „์—ญ ์ƒํƒœ๋ฅผ ๋ถ„์„ํ•˜์—ฌ ๋กœ์ปฌ ์ปดํฌ๋„ŒํŠธ ์ƒํƒœ, ์ „์—ญ UI ์ƒํƒœ, ์„œ๋ฒ„ ์บ์‹œ ์ƒํƒœ, URL ์ƒํƒœ ๋“ฑ์œผ๋กœ ํŒŒํŽธํ™” ๋ฐ ์ „๋ฌธํ™”ํ•˜์—ฌ ๊ฐ๊ฐ์— ๋งž๋Š” ๋„๊ตฌ(Zustand, React Query ๋“ฑ)๋กœ ์ด๊ด€ํ•˜๋Š” ์„ค๊ณ„ ๋ฐฉ๋ฒ•๋ก ์„ ์กฐ์‚ฌํ•œ๋‹ค. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Lazy Loading.md b/00_Raw/Lazy Loading.md new file mode 100644 index 00000000..8756a85b --- /dev/null +++ b/00_Raw/Lazy Loading.md @@ -0,0 +1,63 @@ +# [[Lazy Loading]] + +## ๐Ÿ“Œ Brief Summary +Lazy Loading์€ ๋ฆฌ์†Œ์Šค๋‚˜ ์ฝ”๋“œ ์ฒญํฌ๋ฅผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ดˆ๊ธฐ ๊ตฌ๋™ ์‹œ ํ•œ ๋ฒˆ์— ๋กœ๋“œํ•˜์ง€ ์•Š๊ณ , ์‚ฌ์šฉ์ž๊ฐ€ ์‹ค์ œ๋กœ ํ•„์š”๋กœ ํ•˜๋Š” ์‹œ์ ์— ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค [1, 2]. ํ”„๋ก ํŠธ์—”๋“œ ํ™˜๊ฒฝ์—์„œ๋Š” ์ดˆ๊ธฐ JavaScript ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ตœ๋Œ€ 20~70%๊นŒ์ง€ ์ค„์—ฌ ์ดˆ๊ธฐ ํŽ˜์ด์ง€ ๋กœ๋“œ ์‹œ๊ฐ„์„ ํš๊ธฐ์ ์œผ๋กœ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค [3]. ์ฃผ๋กœ ๊ฒฝ๋กœ(Route) ๊ธฐ๋ฐ˜ ์ปดํฌ๋„ŒํŠธ, ๋ฌด๊ฑฐ์šด UI ์œ„์ ฏ(์ฐจํŠธ ๋“ฑ), ๋ทฐํฌํŠธ ํ•˜๋‹จ์˜ ์ด๋ฏธ์ง€ ๋“ฑ์— ์ ์šฉ๋˜์–ด ์•ฑ์˜ ์ „๋ฐ˜์ ์ธ ๋ฐ˜์‘์„ฑ๊ณผ Core Web Vitals ์ง€ํ‘œ๋ฅผ ๊ฐœ์„ ํ•ฉ๋‹ˆ๋‹ค [4, 5]. + +## ๐Ÿ“– Core Content +* **JavaScript ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…๊ณผ ๋™์  ์ž„ํฌํŠธ(Dynamic Imports)**: Lazy Loading์€ ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์˜จ๋””๋งจ๋“œ(on-demand)๋กœ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋Š” ๋” ์ž‘์€ ์ฒญํฌ(chunk)๋กœ ๋ถ„ํ• ํ•˜๋Š” ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…(Code Splitting) ๊ธฐ๋ฒ•์˜ ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค [2]. ๋™์  ์ž„ํฌํŠธ๋ฅผ ํ†ตํ•ด Vite๋‚˜ Webpack ๊ฐ™์€ ๋นŒ๋“œ ํˆด์ด ๋ Œ๋”๋ง์— ๋‹น์žฅ ํ•„์š”ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๋ฅผ ๋ฉ”์ธ ๋ฒˆ๋“ค์—์„œ ๋ถ„๋ฆฌํ•˜์—ฌ ๋…๋ฆฝ์ ์ธ ํŒŒ์ผ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค [1, 6, 7]. +* **React ํ™˜๊ฒฝ์—์„œ์˜ ๊ตฌํ˜„ (`React.lazy` ๋ฐ `Suspense`)**: React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” `React.lazy()` ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ปดํฌ๋„ŒํŠธ์˜ ์ง€์—ฐ ๋กœ๋”ฉ์„ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค [8]. ๋ชจ๋“ˆ์ด ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ๋‹ค์šด๋กœ๋“œ๋˜๋Š” ๋™์•ˆ ํ™”๋ฉด์ด ๋ฉˆ์ถ”๊ฑฐ๋‚˜ ๋น„์–ด ๋ณด์ด์ง€ ์•Š๋„๋ก, ``๋ฅผ ๊ฐ์‹ธ์„œ ๋กœ๋”ฉ ์Šคํ”ผ๋„ˆ์™€ ๊ฐ™์€ ๋Œ€์ฒด UI(Fallback UI)๋ฅผ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค [7, 8]. +* **๋ผ์šฐํŠธ ๋ ˆ๋ฒจ ๋ฐ ์ปดํฌ๋„ŒํŠธ ๋ ˆ๋ฒจ ์ง€์—ฐ ๋กœ๋”ฉ**: ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ๋ฐฉ์‹์€ ๋ผ์šฐํŠธ ๋ ˆ๋ฒจ์—์„œ ์ ์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ, ์‚ฌ์šฉ์ž๊ฐ€ ํŠน์ • ํŽ˜์ด์ง€๋กœ ๋„ค๋น„๊ฒŒ์ด์…˜ํ•  ๋•Œ๋งŒ ํ•ด๋‹น ํŽ˜์ด์ง€์˜ JavaScript ์ฒญํฌ๊ฐ€ ๋‹ค์šด๋กœ๋“œ๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค [2, 7]. ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„๋กœ๋Š” ์„œ๋“œํŒŒํ‹ฐ ํ†ตํ•ฉ ๊ธฐ๋Šฅ(๋น„๋””์˜ค ํ”Œ๋ ˆ์ด์–ด, PDF ๋ทฐ์–ด ๋“ฑ)์ด๋‚˜ ์ฐจํŠธ, ๋ฆฌ์น˜ ํ…์ŠคํŠธ ์—๋””ํ„ฐ ๊ฐ™์ด ๋ฌด๊ฑฐ์šด UI ๋ธ”๋ก์— ์ ์šฉํ•˜์—ฌ ๋ฉ”์ธ ๋ฒˆ๋“ค์„ ์ตœ์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค [5, 6]. +* **์ด๋ฏธ์ง€(Media) ์ตœ์ ํ™”**: JavaScript ์ฝ”๋“œ๋ฟ ์•„๋‹ˆ๋ผ ๋ฏธ๋””์–ด ๋ฆฌ์†Œ์Šค์—๋„ Lazy Loading์ด ๋„๋ฆฌ ์“ฐ์ž…๋‹ˆ๋‹ค [4]. HTML `` ํƒœ๊ทธ์— ๋„ค์ดํ‹ฐ๋ธŒ ์†์„ฑ์ธ `loading="lazy"`๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด, ์Šคํฌ๋กค์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž์˜ ๋ทฐํฌํŠธ์— ๋„๋‹ฌํ•˜๊ธฐ ์ „๊นŒ์ง€ ์ด๋ฏธ์ง€๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ดˆ๊ธฐ ํŽ˜์ด์ง€ ๋กœ๋”ฉ์˜ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ค„์ž…๋‹ˆ๋‹ค [4]. + +## โš–๏ธ Trade-offs & Caveats +* **์ดˆ๊ธฐ ๋ทฐํฌํŠธ(Above-the-fold) ์ฝ˜ํ…์ธ  ์ ์šฉ ๊ธˆ์ง€**: ์ง€์—ฐ ๋กœ๋”ฉ์€ ์Šคํฌ๋กค ์—†์ด ์ฒ˜์Œ ํ™”๋ฉด์— ๋ฐ”๋กœ ๋ณด์—ฌ์•ผ ํ•˜๋Š” ํ•ต์‹ฌ ์ฝ˜ํ…์ธ (Above-the-fold)๋‚˜ ์ฆ‰์‹œ ์ƒํ˜ธ์ž‘์šฉํ•ด์•ผ ํ•˜๋Š” ๋ Œ๋”๋ง์ด ๋น ๋ฅธ ์š”์†Œ์—๋Š” ์ ˆ๋Œ€ ์ ์šฉํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค [5]. ์ด๋ฅผ ์ ์šฉํ•  ๊ฒฝ์šฐ ์ดˆ๊ธฐ ํŽ˜์ธํŠธ ์‹œ๊ฐ„์ด ๋А๋ ค์ง€๊ณ  ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์ด ์‹ฌ๊ฐํ•˜๊ฒŒ ์ €ํ•˜๋ฉ๋‹ˆ๋‹ค [5, 9]. +* **์‚ฌ์šฉ์ž ์ธํ„ฐ๋ž™์…˜ ์‹œ ์ผ์‹œ์  ์ง€์—ฐ ๋ฐœ์ƒ**: ์ง€์—ฐ ๋กœ๋”ฉ๋œ ๊ธฐ๋Šฅ์ด๋‚˜ ํŽ˜์ด์ง€์— ์‚ฌ์šฉ์ž๊ฐ€ ์ฒ˜์Œ ์ ‘๊ทผํ•  ๋•Œ, ๋ธŒ๋ผ์šฐ์ €๋Š” ํ•„์š”ํ•œ ์Šคํฌ๋ฆฝํŠธ ์ฒญํฌ๋ฅผ ๊ทธ์ œ์•ผ ๋„คํŠธ์›Œํฌ๋กœ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค [7, 8, 10]. ์ด๋กœ ์ธํ•ด ์•ฝ๊ฐ„์˜ ๋Œ€๊ธฐ ์‹œ๊ฐ„์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ``๋ฅผ ํ†ตํ•œ ํด๋ฐฑ ์ƒํƒœ๋ฅผ ์„ธ์‹ฌํ•˜๊ฒŒ ๋””์ž์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [8, 11]. +* **๊ณผ๋„ํ•œ ํŒŒํŽธํ™”(Over-fragmentation) ์ฃผ์˜**: ํฌ๊ธฐ๊ฐ€ ์ž‘๊ณ  ๊ฐ€๋ฒผ์šด ๊ธฐ๋Šฅ๊นŒ์ง€ ๋ชจ๋‘ ์ง€์—ฐ ๋กœ๋”ฉ์œผ๋กœ ๋ถ„๋ฆฌํ•  ๊ฒฝ์šฐ, ์˜คํžˆ๋ ค ๋ธŒ๋ผ์šฐ์ €์˜ ๋„คํŠธ์›Œํฌ ์š”์ฒญ ํšŸ์ˆ˜๊ฐ€ ๊ธ‰์ฆํ•˜๊ณ  ๊ด€๋ฆฌํ•ด์•ผ ํ•  ๋กœ๋”ฉ ์ƒํƒœ(`Suspense`)๊ฐ€ ๋งŽ์•„์ ธ ์„ฑ๋Šฅ ๋ฐ ๊ฐœ๋ฐœ ํšจ์œจ์„ ๋–จ์–ด๋œจ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5, 12]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] +- [[Code Splitting]] + - ์—ฐ๊ฒฐ ์ด์œ : Lazy Loading์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋‹จ์ผ JavaScript ๋ฒˆ๋“ค์„ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž‘์€ ์ฒญํฌ ๋‹จ์œ„๋กœ ๋‚˜๋ˆ„๋Š” ๊ทผ๋ณธ์ ์ธ ๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [2, 13]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ชจ๋˜ ํ”„๋ก ํŠธ์—”๋“œ ํ™˜๊ฒฝ์—์„œ ๋นŒ๋“œ ํˆด(Vite, Webpack)์ด ๋Ÿฐํƒ€์ž„ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด ์ฝ”๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ๋ถ„ํ• ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [6, 7]. + +- [[Dynamic Imports]] + - ์—ฐ๊ฒฐ ์ด์œ : ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ชจ๋“ˆ์„ ํŒŒ์ผ์˜ ์ตœ์ƒ๋‹จ์—์„œ ์ •์ ์œผ๋กœ ๋ถˆ๋Ÿฌ์˜ค์ง€ ์•Š๊ณ , ์‹คํ–‰ ์ค‘์— ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ์œ„ํ•ด `import()` ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค [1, 7]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ผ์šฐํŠธ ์ „ํ™˜์ด๋‚˜ ํŠน์ • ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ์ ์— ํ•„์š”ํ•œ ์ฝ”๋“œ๋งŒ ๋„คํŠธ์›Œํฌ๋กœ ํ˜ธ์ถœํ•˜๋Š” ๋Ÿฐํƒ€์ž„ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [7]. + +#### [๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ] +- [[React Suspense]] + - ์—ฐ๊ฒฐ ์ด์œ : `React.lazy()`๋ฅผ ์ด์šฉํ•ด ์ง€์—ฐ ๋กœ๋”ฉ์„ ์ˆ˜ํ–‰ํ•  ๋•Œ, ์ฒญํฌ๊ฐ€ ๋กœ๋“œ๋˜๊ธฐ ์ „๊นŒ์ง€ ๋ Œ๋”๋ง์„ ์ผ์‹œ ์ค‘์ง€ํ•˜๊ณ  Fallback UI๋ฅผ ํ™”๋ฉด์— ๊ทธ๋ ค์ฃผ๋Š” ํ•ต์‹ฌ ์ปดํฌ๋„ŒํŠธ์ž…๋‹ˆ๋‹ค [7, 8]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋น„๋™๊ธฐ UI ๋กœ๋”ฉ ์‹œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜(UX)์„ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๋ Œ๋”๋ง ์ œ์–ด ๋ฐ ๋กœ๋”ฉ ์ƒํƒœ ์„ค๊ณ„ ํŒจํ„ด์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [8, 11]. + +- [[Vite manualChunks]] + - ์—ฐ๊ฒฐ ์ด์œ : Vite๋ฅผ ํ†ตํ•ด ๋นŒ๋“œํ•  ๋•Œ, ๋ณ€๊ฒฝ์ด ์žฆ์ง€ ์•Š์€ ๋ฌด๊ฑฐ์šด ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(React ์ฝ”์–ด ๋“ฑ)๋ฅผ Lazy Loading์˜ ์ฒญํฌ ๋ถ„ํ•  ์ „๋žต๊ณผ ๊ฒฐํ•ฉํ•ด ๋ณ„๋„ ํŒŒ์ผ๋กœ ๋…๋ฆฝ์‹œํ‚ค๋Š” ํ™˜๊ฒฝ ์„ค์ •์ž…๋‹ˆ๋‹ค [7, 14]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ธŒ๋ผ์šฐ์ € ์บ์‹ฑ ์ „๋žต์„ ๊ทน๋Œ€ํ™”ํ•˜๊ณ , ์ดˆ๊ธฐ ๋ฒˆ๋“ค ์šฉ๋Ÿ‰ ๊ฒฝ๊ณ ("Large Chunks") ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ๋ฒˆ๋“ค๋Ÿฌ ์ตœ์ ํ™” ๋ฐฉ๋ฒ•์„ ํ•™์Šตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [7, 15]. + +### Deeper Research Questions + +- React 18์˜ ๋™์‹œ์„ฑ ๋ Œ๋”๋ง(Concurrent Rendering) ๊ธฐ๋Šฅ์ธ `useTransition` ๋“ฑ์€ ์ง€์—ฐ ๋กœ๋”ฉ ์‹œ ๋ฐœ์ƒํ•˜๋Š” UI ๋ฉˆ์ถค ํ˜„์ƒ์„ ์–ด๋–ป๊ฒŒ ๋ณด์™„ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? [16, 17] +- ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ์ €ํ•˜๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด ์ง€์—ฐ ๋กœ๋”ฉ๋˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉ์ž๊ฐ€ ํด๋ฆญํ•˜๊ธฐ ์ง์ „์— ๋ฏธ๋ฆฌ ๊ฐ€์ ธ์˜ค๋Š” Prefetching ์ „๋žต์€ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•˜๋Š”๊ฐ€? [18, 19] +- Next.js์˜ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ ์ง€์—ฐ ๋กœ๋”ฉ๊ณผ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ(RSC) ์•„ํ‚คํ…์ฒ˜๋Š” ์ดˆ๊ธฐ ๋ฒˆ๋“ค ์ตœ์ ํ™” ์ธก๋ฉด์—์„œ ์–ด๋–ค ์ฐจ์ด์ ๊ณผ ์‹œ๋„ˆ์ง€๋ฅผ ๊ฐ€์ง€๋Š”๊ฐ€? [5, 20, 21] +- ๋ฌด๊ฑฐ์šด UI ๋ธ”๋ก์„ ์ง€์—ฐ ๋กœ๋”ฉํ•  ๋•Œ, `rollup-plugin-visualizer`์™€ ๊ฐ™์€ ๋ฒˆ๋“ค ๋ถ„์„ ๋„๊ตฌ๋ฅผ ํ†ตํ•ด ์ง€์—ฐ ๋กœ๋”ฉ ๋Œ€์ƒ์„ ์–ด๋–ป๊ฒŒ ํšจ๊ณผ์ ์œผ๋กœ ์‹๋ณ„ํ•˜๊ณ  ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ •ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? [10, 12] +- ๋„ค์ดํ‹ฐ๋ธŒ ๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋Šฅ์ธ `loading="lazy"` ์†์„ฑ๊ณผ JavaScript ๊ธฐ๋ฐ˜์˜ Intersection Observer API๋ฅผ ํ™œ์šฉํ•œ ๋ฏธ๋””์–ด ์ง€์—ฐ ๋กœ๋”ฉ์˜ ์„ฑ๋Šฅ ์ตœ์ ํ™” ํ•œ๊ณ„์ ๊ณผ Trade-off๋Š” ๋ฌด์—‡์ธ๊ฐ€? [4] + +### Practical Application Contexts + +- **Implementation:** React ์ฝ”๋“œ ์ƒ๋‹จ์˜ ๋ฌด๊ฑฐ์šด ์™ธ๋ถ€ ์ปดํฌ๋„ŒํŠธ(์˜ˆ: ์—๋””ํ„ฐ, ์ฐจํŠธ ๋“ฑ) import ๋ฌธ์„ ์ง€์šฐ๊ณ , `const Dashboard = React.lazy(() => import('./Dashboard'));`์™€ ๊ฐ™์ด ๋ณ€๊ฒฝํ•œ ํ›„ ๋ Œ๋”๋ง ์˜์—ญ์„ `}>`๋กœ ๊ฐ์Œ‰๋‹ˆ๋‹ค [1, 6-8]. +- **System Design:** ํ”„๋ก ํŠธ์—”๋“œ ๋ผ์šฐํŒ… ๋ฐ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ ์‹œ๋ถ€ํ„ฐ, ํ•„์ˆ˜ ์ดˆ๊ธฐ ์ง„์ž… ํ™”๋ฉด(Above-the-fold)์€ ์ฆ‰์‹œ ๋กœ๋“œํ•˜๊ณ , ๊ด€๋ฆฌ์ž ํŒจ๋„์ด๋‚˜ ์ž˜ ์“ฐ์ด์ง€ ์•Š๋Š” ๋ผ์šฐํŠธ๋Š” ๋ถ„๋ฆฌํ•˜์—ฌ Code Splitting๋˜๋„๋ก ์‹œ์Šคํ…œ์˜ ๋ฒˆ๋“ค๋ง ์ „๋žต์„ ๊ตฌ์ƒํ•ฉ๋‹ˆ๋‹ค [5, 12, 14]. +- **Operation / Maintenance:** ์šด์˜ ์ค‘์ธ ์„œ๋น„์Šค๊ฐ€ ๋ฌด๊ฑฐ์›Œ์ง€๊ฑฐ๋‚˜ Vite ๋นŒ๋“œ ์‹œ "500 kB ์ดˆ๊ณผ ์ฒญํฌ" ๊ฒฝ๊ณ ๊ฐ€ ๋œฐ ๊ฒฝ์šฐ, ๋ฒˆ๋“ค ๋ถ„์„ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ด ๋ฉ”์ธ ๋ฒˆ๋“ค์—์„œ ๋ถ„๋ฆฌ ๊ฐ€๋Šฅํ•œ ๋ฌด๊ฑฐ์šด ๋ฒค๋”๋‚˜ ํŠน์ • ๋ผ์šฐํŠธ๋ฅผ ์‹๋ณ„ํ•ด ์ ์ง„์ ์œผ๋กœ Lazy Loading์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค [10, 12, 15]. +- **Learning Path:** React ๊ธฐ์ดˆ ๋ Œ๋”๋ง ์‚ฌ์ดํด ํ•™์Šต โž” JavaScript ๋ชจ๋“ˆ ๋ฐ ๋ฒˆ๋“ค๋Ÿฌ ๊ตฌ์กฐ ์ดํ•ด โž” `React.lazy`์™€ `Suspense`๋ฅผ ํ†ตํ•œ ๋ผ์šฐํŠธ ์Šคํ”Œ๋ฆฌํŒ… ์ ์šฉ โž” Chrome ์„ฑ๋Šฅ ํƒญ๊ณผ Web Vitals๋กœ ์‹ค์ œ ๋กœ๋“œ ์†๋„ ์ธก์ • ๋ฐ ๊ฒ€์ฆ [13, 22, 23]. +- **My Project Relevance:** ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ทœ๋ชจ๊ฐ€ ์ปค์ง์— ๋”ฐ๋ผ ํ•„์—ฐ์ ์œผ๋กœ ์ฆ๊ฐ€ํ•˜๋Š” JavaScript ํŽ˜์ด๋กœ๋“œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ , FCP(First Contentful Paint)์™€ TTI(Time to Interactive) ๋“ฑ ํ•ต์‹ฌ ์„ฑ๋Šฅ ์ง€ํ‘œ๋ฅผ ๋ฐฉ์–ดํ•˜๊ธฐ ์œ„ํ•œ ํ•„์ˆ˜์ ์ธ ๋ Œ๋”๋ง ์ตœ์ ํ™” ์ „๋žต์ž…๋‹ˆ๋‹ค [3, 8]. + +### Adjacent Topics + +- [[Core Web Vitals]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ์ง€์—ฐ ๋กœ๋”ฉ์ด ๊ฒ€์ƒ‰ ์—”์ง„ ์ตœ์ ํ™”(SEO) ๋ฐ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ์ง€ํ‘œ์ธ FCP, LCP(Largest Contentful Paint), INP(Interaction to Next Paint) ์ˆ˜์น˜๋ฅผ ์‹ค์ œ๋กœ ์–ผ๋งˆ๋‚˜ ๊ฐœ์„ ํ•˜๋Š”์ง€ ์ธก์ • ๋ฐ ๋ถ„์„ํ•˜๋Š” ๊ด€์ ์œผ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3, 23, 24]. +- [[Server Components (RSC)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํฌ๊ธฐ๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•œ ๋˜ ๋‹ค๋ฅธ ํ˜„๋Œ€์  ํŒจ๋Ÿฌ๋‹ค์ž„์œผ๋กœ, ํด๋ผ์ด์–ธํŠธ์—์„œ ์‹คํ–‰๋  ์ฝ”๋“œ๋ฅผ ์•„์˜ˆ ์„œ๋ฒ„์—์„œ ๋ Œ๋”๋งํ•˜๊ณ  HTML๋กœ๋งŒ ๋ณด๋‚ด๋Š” ๋ฐฉ์‹๊ณผ Lazy Loading๊ณผ์˜ ์—ญํ• ์„ ๋น„๊ต/๋Œ€์กฐํ•ฉ๋‹ˆ๋‹ค [20, 21]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Next.js App Router.md b/00_Raw/Next.js App Router.md new file mode 100644 index 00000000..43ddac1f --- /dev/null +++ b/00_Raw/Next.js App Router.md @@ -0,0 +1,54 @@ +# [[Next.js App Router]] + +## ๐Ÿ“Œ Brief Summary +Next.js App Router๋Š” Next.js(๋ฒ„์ „ 13 ์ดํ›„)์—์„œ ๋„์ž…๋œ ์ตœ์‹  ๋ผ์šฐํŒ… ๋ฐ ์•„ํ‚คํ…์ฒ˜ ์‹œ์Šคํ…œ์œผ๋กœ, React Server Components(RSC)๋ฅผ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์›ํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ ์ธก ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ „์†ก๋Ÿ‰์„ ์ค„์ด๊ณ  ์ดˆ๊ธฐ ๋กœ๋”ฉ ์†๋„๋ฅผ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค [1, 2]. ์ด ์‹œ์Šคํ…œ์€ `app` ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•˜๋ฉฐ, `page.js`, `layout.js`์™€ ๊ฐ™์€ ํŠน์ˆ˜ ํŒŒ์ผ๋“ค์„ ํ†ตํ•ด ์ง๊ด€์ ์ด๊ณ  ๊ตฌ์กฐํ™”๋œ ๋ผ์šฐํŒ…์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [3, 4]. + +## ๐Ÿ“– Core Content + +* **ํŠน์ˆ˜ ํŒŒ์ผ์„ ํ™œ์šฉํ•œ ๊ตฌ์กฐ์  ๋ผ์šฐํŒ…**: Next.js App Router๋Š” ๋ผ์šฐํŠธ ๊ตฌ์„ฑ ๋ฐ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ํŠน์ˆ˜ ํŒŒ์ผ ๋ช…๋ช… ๊ทœ์น™์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ผ์šฐํŠธ๋Š” `page.js`๋กœ, ๊ณต์œ  ๋ ˆ์ด์•„์›ƒ์€ `layout.js`๋กœ, ์‚ฌ์šฉ์ž ์ •์˜ ์—๋Ÿฌ๋Š” `error.js`๋กœ, ๋กœ๋”ฉ ์ƒํƒœ๋Š” `loading.js`๋กœ ์ •์˜ํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋™์ž‘์„ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค [3]. +* **๋™์  ๋ผ์šฐํŠธ ๋ฐ ๋ผ์šฐํŠธ ๊ทธ๋ฃน**: ๋™์ ์ธ ๊ฒฝ๋กœ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด `[param]`์„ ์‚ฌ์šฉํ•˜๊ณ , ํฌ๊ด„์ (catch-all) ๋ผ์šฐํŠธ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด `[...param]`์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค [3]. ๋˜ํ•œ URL ๊ตฌ์กฐ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ณ  ๋…ผ๋ฆฌ์ ์œผ๋กœ ๋ผ์šฐํŠธ๋ฅผ ๊ทธ๋ฃนํ™”ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ผ์šฐํŠธ ๊ทธ๋ฃน(์˜ˆ: `(folderName)`) ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์—ฌ, ๊ธฐ๋Šฅ๋ณ„ ๋˜๋Š” ํŒ€๋ณ„๋กœ ์ฝ”๋“œ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์กฐ์งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5]. +* **React Server Components (RSC) ํ†ตํ•ฉ**: App Router๋Š” ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ •์ ์ด๊ฑฐ๋‚˜ ๋ฐ์ดํ„ฐ ์ฃผ๋„์ ์ธ(read-only) UI๋Š” ํด๋ผ์ด์–ธํŠธ ์ธก ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—†์ด ์„œ๋ฒ„์—์„œ๋งŒ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ์–ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค ํฌ๊ธฐ์™€ Hydration ์†Œ์š” ์‹œ๊ฐ„์„ ๊ทน๋Œ€ํ™”ํ•˜์—ฌ ์ค„์—ฌ์ค๋‹ˆ๋‹ค [2, 6, 7]. +* **ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„์˜ ์—ญํ•  ๋ถ„๋ฆฌ**: ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” ์ƒํƒœ(state), `useEffect`, ํด๋ผ์ด์–ธํŠธ ์ „์šฉ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค [8]. ๋”ฐ๋ผ์„œ ์ƒํ˜ธ์ž‘์šฉ์ด ์ฆ‰๊ฐ์ ์œผ๋กœ ํ•„์š”ํ•œ UI(๋ชจ๋‹ฌ, ์ž…๋ ฅ์ฐฝ ๋“ฑ)์—๋งŒ ํŒŒ์ผ ์ƒ๋‹จ์— `use client` ์ง€์‹œ์–ด๋ฅผ ์„ ์–ธํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ๋กœ ๋งŒ๋“ค๊ณ , ๋‚˜๋จธ์ง€๋Š” ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค [7, 9]. +* **๋™์‹œ์„ฑ ๋ Œ๋”๋ง(Concurrent Rendering) ์™„๋ฒฝ ์ง€์›**: App Router๋Š” React 18์˜ ๋™์‹œ์„ฑ ๊ธฐ๋Šฅ๊ณผ ์™„๋ฒฝํ•˜๊ฒŒ ํ†ตํ•ฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. `useTransition` ๋ฐ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค์˜ ์‘๋‹ต์„ฑ์„ ๋–จ์–ด๋œจ๋ฆฌ์ง€ ์•Š๊ณ  ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์„ ํšจ๊ณผ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [10]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +- [[React Server Components]] + - ์—ฐ๊ฒฐ ์ด์œ : Next.js App Router ์•„ํ‚คํ…์ฒ˜์˜ ํ•ต์‹ฌ ๊ธฐ๋ฐ˜์œผ๋กœ, ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ค„์ด๊ณ  ๋ฐ์ดํ„ฐ ํŽ˜์นญ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค [1, 2]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํด๋ผ์ด์–ธํŠธ ์ธก ๋ Œ๋”๋ง ์ฝ”๋“œ์™€ ์„œ๋ฒ„ ์ธก ๋ Œ๋”๋ง ์ฝ”๋“œ ๊ฐ„์˜ ๋ช…ํ™•ํ•œ ๊ฒฝ๊ณ„ ๊ตฌ๋ถ„ ๋ฐ Hydration ์ตœ์†Œํ™” ์ „๋žต [6, 7, 9]. + +- [[Route Groups]] + - ์—ฐ๊ฒฐ ์ด์œ : App Router ๋‚ด์—์„œ URL ๊ฒฝ๋กœ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ ๋„ ํด๋” ๊ตฌ์กฐ๋ฅผ ๋…ผ๋ฆฌ์ ์œผ๋กœ ์กฐ์งํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ํ•ต์‹ฌ ํด๋” ๋ผ์šฐํŒ… ํŒจํ„ด์ž…๋‹ˆ๋‹ค [5, 11]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ณต์žกํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ณ„๋„์˜ ๋ ˆ์ด์•„์›ƒ์„ ๊ฐ€์ง„ ์„น์…˜(์˜ˆ: ๋งˆ์ผ€ํŒ… ํŽ˜์ด์ง€์™€ ์ƒ์  ํŽ˜์ด์ง€)์„ ์ถฉ๋Œ ์—†์ด ๋…๋ฆฝ์ ์œผ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ• [5, 11]. + +- [[Concurrent Rendering]] + - ์—ฐ๊ฒฐ ์ด์œ : Next.js App Router๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์™„๋ฒฝํ•˜๊ฒŒ ์ง€์›ํ•˜๋Š” React์˜ ๋ Œ๋”๋ง ๋ฉ”์ปค๋‹ˆ์ฆ˜์œผ๋กœ, ๋ Œ๋”๋ง ์ž‘์—…์„ ์ผ์‹œ ์ค‘์ง€, ์ค‘๋‹จ ๋ฐ ์žฌ๊ฐœํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค [10, 12]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: `useTransition` ๋ฐ `useDeferredValue` ํ›…์„ ํ†ตํ•ด ๋ฌด๊ฑฐ์šด ๋ Œ๋”๋ง ์‹œ์—๋„ ์‚ฌ์šฉ์ž ์ž…๋ ฅ ๋ฐ˜์‘์„ฑ(UX)์„ ๋†’๊ฒŒ ์œ ์ง€ํ•˜๋Š” ์›๋ฆฌ [13, 14]. + +### Deeper Research Questions + +- ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฃจํŠธ ๋ ˆ์ด์•„์›ƒ์„ ๊ฐ€์ง„ Route Groups ํ™˜๊ฒฝ์—์„œ ์ตœ์ƒ์œ„ `layout.js`๊ฐ€ ์—†์„ ๋•Œ, ๋‹ค๋ฅธ ๋ฃจํŠธ ๋ ˆ์ด์•„์›ƒ ๊ฐ„์˜ ๋„ค๋น„๊ฒŒ์ด์…˜ ์‹œ ๋ฐœ์ƒํ•˜๋Š” ์ „์ฒด ํŽ˜์ด์ง€ ๋กœ๋“œ(full page load)์˜ ๋‚ด๋ถ€ ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ๋ฌด์—‡์ธ๊ฐ€? [11] +- App Router์—์„œ `[param]` ํ˜•ํƒœ์˜ ๋™์  ๋ผ์šฐํŠธ์™€ Route Group ๊ฐ„์˜ ๊ฒฝ๋กœ ์ค‘๋ณต(์˜ˆ: `(marketing)/about/page.tsx`์™€ `(shop)/about/page.tsx`) ์ถฉ๋Œ ์‹œ, Next.js์˜ ๋ผ์šฐํŠธ ํ•ด์„ ์šฐ์„ ์ˆœ์œ„๋Š” ์–ด๋–ป๊ฒŒ ๊ฒฐ์ •๋˜๋Š”๊ฐ€? [11] +- ๊ธฐ์กด Pages Router ๋ฐฉ์‹๊ณผ ๋น„๊ตํ•˜์—ฌ App Router์˜ React Server Components๋Š” ๋ฐ์ดํ„ฐ ํŽ˜์นญ ์‹œ ์–ด๋–ป๊ฒŒ 'Double Fetching' ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๋Š”๊ฐ€? [7, 8] +- ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ(`use client`)์™€ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ˜ผํ•ฉ๋œ ํ˜•ํƒœ์˜ ํŠธ๋ฆฌ์—์„œ, ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ๋ฅผ `children`์œผ๋กœ ์ „๋‹ฌํ•˜๊ฑฐ๋‚˜ ์ž„ํฌํŠธํ•  ๋•Œ ์ ์šฉ๋˜๋Š” ์ง๋ ฌํ™” ๊ทœ์น™ ๋ฐ ํ•œ๊ณ„์ ์€ ๋ฌด์—‡์ธ๊ฐ€? [6, 7, 9] +- ํŠน์ˆ˜ ๋ผ์šฐํŒ… ํŒŒ์ผ ์ค‘ `error.js`๊ฐ€ React Error Boundary๋กœ์„œ ๋™์ž‘ํ•  ๋•Œ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ ์˜ค๋ฅ˜์™€ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ ์˜ค๋ฅ˜๋ฅผ ๊ฐ๊ฐ ์ฒ˜๋ฆฌํ•˜๋Š” ํ๋ฆ„์€ ์–ด๋–ป๊ฒŒ ๊ตฌ๋ถ„๋˜๋Š”๊ฐ€? [3] + +### Practical Application Contexts + +- **Implementation:** ๋ผ์šฐํŠธ๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ๋Š” `kebab-case` ๋ช…๋ช… ๊ทœ์น™์„ ์ ์šฉํ•œ ํด๋”(์˜ˆ: `auth-provider.tsx`)๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋ผ์šฐํŒ…ํ•˜๊ณ , ๋Œ€์‹œ๋ณด๋“œ์ฒ˜๋Ÿผ ์ •์ ์ธ ๋ ˆ์ด์•„์›ƒ์€ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋กœ ๋‘๋ฉด์„œ `AddToCartButton` ๊ฐ™์ด ์ƒํ˜ธ์ž‘์šฉ์ด ํ•„์š”ํ•œ ์œ„์ ฏ๋งŒ `use client` ์ปดํฌ๋„ŒํŠธ๋กœ ์ž„ํฌํŠธํ•˜์—ฌ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค [4, 7, 15]. +- **System Design:** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋ฅผ ์กฐ์งํ•  ๋•Œ, ๊ธฐ๋Šฅ๋ณ„(Feature-Based) ํด๋” ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ, ํŽ˜์ด์ง€, ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ํ•œ ๊ธฐ๋Šฅ ํด๋”(์˜ˆ: `features/auth/`)์— ๋ชจ์œผ๊ณ , ์ด๋ฅผ ๋‹ค์‹œ `Route Groups`๋ฅผ ํ†ตํ•ด ๋ชจ๋“ˆํ™”๋œ ์•„ํ‚คํ…์ฒ˜๋กœ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค [5, 16, 17]. +- **Operation / Maintenance:** ์ดˆ๊ธฐ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค ์šฉ๋Ÿ‰์ด ์ปค์ ธ INP(Interaction to Next Paint)์™€ TTI(Time to Interactive) ๋“ฑ ์ฝ”์–ด ์›น ๋ฐ”์ดํƒˆ ์ˆ˜์น˜๊ฐ€ ์ €ํ•˜๋  ๋•Œ, ์–ด๋–ค ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ๋กœ ๋กœ๋“œ๋˜์—ˆ๋Š”์ง€ ํŒŒ์•…ํ•˜์—ฌ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•˜๋Š” ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค [6, 18]. +- **Learning Path:** ์šฐ์„  React์˜ ๋ Œ๋”๋ง ๋ชจ๋ธ ํŠธ๋ฆฌ๊ฑฐ ์š”์ธ๊ณผ ์ƒํƒœ ๋ณ€ํ™” ์›๋ฆฌ๋ฅผ ์ˆ™์ง€ํ•˜๊ณ  [19], ์ดํ›„ React 18์˜ ๋™์‹œ์„ฑ ํ›…(`useTransition`) ๋™์ž‘์„ ์‹ค์Šตํ•œ ๋’ค [12, 13], Next.js App Router์˜ Server Components๋ฅผ ํ†ตํ•œ ์„œ๋ฒ„/ํด๋ผ์ด์–ธํŠธ ๊ฒฝ๊ณ„ ๊ฐœ๋…์„ ๋ฐฐ์šฐ๋Š” ์ˆœ์„œ๋กœ ์ ‘๊ทผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [2, 7]. +- **My Project Relevance:** ์†Œ์Šค์— ๊ด€๋ จ ์ •๋ณด๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. + +### Adjacent Topics + +- [[Code Splitting & Lazy Loading]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: App Router์˜ Server Components๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, `React.lazy`์™€ `Suspense`๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ๋ผ์šฐํŠธ ๋ฐ ๋ฌด๊ฑฐ์šด ์ปดํฌ๋„ŒํŠธ(์ฐจํŠธ, ์—๋””ํ„ฐ ๋“ฑ)๋ฅผ ํ•„์š”ํ•œ ์ˆœ๊ฐ„์—๋งŒ ๋กœ๋“œํ•˜๋„๋ก ์ตœ์ ํ™”ํ•˜๋Š” ๊ธฐ๋ฒ•์œผ๋กœ์˜ ์ดํ•ด ํ™•์žฅ [20, 21]. +- [[React Context API Optimization]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: App Router ํ™˜๊ฒฝ ํ•˜์˜ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ๋ถˆ๊ฐ€ํ”ผํ•˜๊ฒŒ ์ „์—ญ ์ƒํƒœ๋ฅผ ์“ธ ๋•Œ, Context์˜ ๊ด‘๋ฒ”์œ„ํ•œ ๋ฆฌ๋ Œ๋”๋ง ์ด์Šˆ๋ฅผ ํšŒํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์ปจํ…์ŠคํŠธ๋ฅผ ๋ถ„๋ฆฌํ•˜๊ฑฐ๋‚˜ Zustand, Jotai ๋“ฑ์˜ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋„์ž…ํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ํ•™์Šต ํ™•์žฅ [22-24]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Prop Drilling.md b/00_Raw/Prop Drilling.md new file mode 100644 index 00000000..aea73383 --- /dev/null +++ b/00_Raw/Prop Drilling.md @@ -0,0 +1,56 @@ +# [[Prop Drilling]] + +## ๐Ÿ“Œ Brief Summary +Prop Drilling์€ ์‹ค์ œ๋กœ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์€ ์—ฌ๋Ÿฌ ์ค‘๊ฐ„ ์ปดํฌ๋„ŒํŠธ๋“ค์„ ๊ฑฐ์ณ ๊ณ„์ธต์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ์•ˆํ‹ฐ ํŒจํ„ด์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค [1]. ์ฃผ๋กœ ๊นŠ๊ฒŒ ์ค‘์ฒฉ๋œ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์— ์ƒํƒœ๋‚˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•  ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [1]. React ์ƒํƒœ๊ณ„์—์„œ๋Š” ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋‚ด์žฅ๋œ Context API๋‚˜ ์™ธ๋ถ€ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค [1, 2]. + +## ๐Ÿ“– Core Content +* **์ž‘๋™ ๋ฐฉ์‹ ๋ฐ ์›์ธ:** Prop Drilling์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ ๊นŠ์ด ์ค‘์ฒฉ๋œ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋กœ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด, ์ค‘๊ฐ„์— ์œ„์น˜ํ•œ ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ์˜ props๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ํ†ต๊ณผ์‹œํ‚ค๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค [1]. +* **๊ตฌ์กฐ์  ๋ฌธ์ œ์ :** ์ด ํŒจํ„ด์€ ์ค‘๊ฐ„ ์ปดํฌ๋„ŒํŠธ๋“ค์ด ์ž์‹ ์—๊ฒŒ ํ•„์š” ์—†๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋‹จ์ง€ ์ „๋‹ฌ(transport)ํ•˜๊ธฐ ์œ„ํ•œ ๋ชฉ์ ์œผ๋กœ ์ทจ๊ธ‰ํ•˜๊ฒŒ ๋งŒ๋“ค๋ฉฐ, ์ด๋Š” ์ฝ”๋“œ์˜ ๋ณต์žก์„ฑ์„ ๋†’์ด๊ณ  ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค [1]. +* **React์˜ ๋‚ด์žฅ ํ•ด๊ฒฐ์ฑ…:** React๋Š” ์ด๋Ÿฌํ•œ ํ˜„์ƒ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด 'Context API'๋ฅผ ๋„์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ์˜ ๋ชจ๋“  ๋ ˆ๋ฒจ์„ ๊ฑฐ์น˜์ง€ ์•Š๊ณ ๋„ ์ „์—ญ ๊ด€์‹ฌ์‚ฌ(global concerns) ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘์ ์œผ๋กœ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์™€ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1, 3, 4]. +* **ํŒŒ์ƒ ์ƒํƒœ ์ฒ˜๋ฆฌ์˜ ํ•œ๊ณ„:** Redux๋‚˜ Zustand๊ฐ€ ํŒŒ์ƒ ์ƒํƒœ๋ฅผ ์œ„ํ•œ ์„ ํƒ์ž(derived selectors)๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒƒ๊ณผ ๋‹ฌ๋ฆฌ, Context๋Š” ํŒŒ์ƒ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•  ๋•Œ ์—ฌ์ „ํžˆ Prop Drilling ๋ฐฉ์‹์— ์˜์กดํ•˜๊ฒŒ ๋˜๊ฑฐ๋‚˜ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ํ”ผํ•˜๊ธฐ ์–ด๋ ค์šด ๊ธฐ๋Šฅ์  ํ•œ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค [5]. + +## โš–๏ธ Trade-offs & Caveats +Prop Drilling์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ€์žฅ ๋จผ์ € ๊ณ ๋ ค๋˜๋Š” Context API๋Š” ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ณ€๊ฒฝ๋˜๋Š” ์ƒํƒœ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ์‹ฌ๊ฐํ•œ ์„ฑ๋Šฅ ์ œ์•ฝ(Trade-off)์„ ๋™๋ฐ˜ํ•ฉ๋‹ˆ๋‹ค [6, 7]. Context ๊ฐ’์˜ ์ผ๋ถ€๋งŒ ๋ณ€๊ฒฝ๋˜์–ด๋„ ํ•ด๋‹น Context๋ฅผ ๊ตฌ๋…ํ•˜๋Š” ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์ „์ฒด ๋ฆฌ๋ Œ๋”๋ง(re-render)์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค [6, 8]. + +๋”ฐ๋ผ์„œ ์žฅ๋ฐ”๊ตฌ๋‹ˆ๋‚˜ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ๋“ฑ ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ณ€๊ฒฝ๋˜๋Š” ์ƒํƒœ์— ๋Œ€ํ•ด Prop Drilling์„ ํ”ผํ•˜๊ฒ ๋‹ค๊ณ  ๋ฌด์ž‘์ • Context API๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ ์ €ํ•˜(Re-render storm)๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [9, 10]. ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ์—๋Š” ์„ ํƒ์ž(Selector) ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ํ•„์š”ํ•œ ์ƒํƒœ ๋ณ€๊ฒฝ ์‹œ์—๋งŒ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ฐœ์ƒ์‹œํ‚ค๋Š” Zustand๋‚˜ Redux๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ตœ์ ํ™” ์ธก๋ฉด์—์„œ ํ•„์ˆ˜์ ์ธ ๋ฐ˜๋Œ€ ๊ธ‰๋ถ€์˜ ํ•ด๊ฒฐ์ฑ…์ด ๋ฉ๋‹ˆ๋‹ค [7, 11]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [๊ธฐ๋ฐ˜ ๊ธฐ์ˆ /ํ•ด๊ฒฐ์ฑ…] +- [[Context API]] + - ์—ฐ๊ฒฐ ์ด์œ : Prop Drilling ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด React์—์„œ ์ž์ฒด์ ์œผ๋กœ ๋„์ž…ํ•œ ๋‚ด์žฅ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [1]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: props๋ฅผ ์ผ์ผ์ด ๋„˜๊ธฐ์ง€ ์•Š๊ณ  ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธํ•˜๋Š” ์›๋ฆฌ์™€ ๊ทธ์— ๋”ฐ๋ฅธ ๋ฆฌ๋ Œ๋”๋ง ํ•œ๊ณ„๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [6, 12]. + +#### [์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ/๋Œ€์•ˆ] +- [[Zustand]] + - ์—ฐ๊ฒฐ ์ด์œ : Prop Drilling์˜ ๋Œ€์•ˆ์ธ Context API๊ฐ€ ๊ฐ–๋Š” ๋ฆฌ๋ Œ๋”๋ง ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ๊ทน๋ณตํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๋Ÿ‰ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [2, 7]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์„ ํƒ์ž(Selector) ํŒจํ„ด์„ ํ™œ์šฉํ•ด ํ•„์š”ํ•œ ์ƒํƒœ์˜ ๋ณ€๊ฒฝ์—๋งŒ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฆฌ๋ Œ๋”๋งํ•˜๋„๋ก ์Šค๋งˆํŠธํ•˜๊ฒŒ ๊ตฌ๋…(subscribe)ํ•˜๋Š” ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [7, 13]. +- [[Redux]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ Prop Drilling์„ ๋ฐฉ์ง€ํ•˜๊ณ  ์ƒํƒœ๋ฅผ ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์‚ฐ์—… ํ‘œ์ค€ ์ƒํƒœ ์ปจํ…Œ์ด๋„ˆ ๋„๊ตฌ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [5, 14]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํŒŒ์ƒ ์„ ํƒ์ž(derived selectors)๊ฐ€ ์กด์žฌํ•จ์œผ๋กœ์จ Prop Drilling ์—†์ด ๋ณต์žกํ•œ ์ƒํƒœ์™€ ๋น„๋™๊ธฐ ๋กœ์ง์„ ์–ด๋–ป๊ฒŒ ํšจ์œจ์ ์œผ๋กœ ๋‹ค๋ฃจ๋Š”์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5, 15]. + +### Deeper Research Questions + +- Prop Drilling์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด Context API๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง(re-renders) ๋ฌธ์ œ๋Š” ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? [6, 8] +- Redux์™€ Zustand๊ฐ€ ์ œ๊ณตํ•˜๋Š” '์„ ํƒ์ž(Selector)' ๊ธฐ๋Šฅ์€ Prop Drilling ๋ฐฉ์‹๊ณผ ๋น„๊ตํ•˜์—ฌ ํŒŒ์ƒ ์ƒํƒœ(derived state)๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ ์–ด๋– ํ•œ ์•„ํ‚คํ…์ฒ˜์  ์ด์ ์„ ์ œ๊ณตํ•˜๋Š”๊ฐ€? [5, 7] +- Context API๊ฐ€ ์•„๋‹Œ Zustand๋‚˜ Redux ๊ฐ™์€ ์ „๋ฌธ์ ์ธ ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ๋ฅผ ๋„์ž…ํ•˜์—ฌ Prop Drilling์„ ํ•ด๊ฒฐํ•ด์•ผ ํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ณต์žก๋„ ๋ฐ ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง ๋นˆ๋„์˜ ์ •ํ™•ํ•œ ๊ธฐ์ค€์ ์€ ๋ฌด์—‡์ธ๊ฐ€? [10, 11] +- Prop Drilling์„ ๋‹จ์ˆœํžˆ ํšŒํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋“  ์ƒํƒœ๋ฅผ ์ „์—ญ ์ปจํ…์ŠคํŠธ(Global Context for Everything)์— ๋„ฃ๋Š” ์•ˆํ‹ฐ ํŒจํ„ด์€ ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜์— ์–ด๋–ค ๋ถ€์ž‘์šฉ์„ ์ผ์œผํ‚ค๋Š”๊ฐ€? [16, 17] +- ์ „์—ญ ์ƒํƒœ๊ฐ€ ์•„๋‹Œ ์ง€์—ญ ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ ๋‚ด์—์„œ ๋ฐœ์ƒํ•˜๋Š” Prop Drilling์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด, ์ปดํฌ๋„ŒํŠธ ํ•ฉ์„ฑ(Component Composition)์ด๋‚˜ ํด๋ฆฐ ์ฝ”๋“œ ์›์น™์„ ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? [18, 19] + +### Practical Application Contexts + +- **Implementation:** ๊นŠ๊ฒŒ ์ค‘์ฒฉ๋œ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ๋•Œ, ์ค‘๊ฐ„ ์ปดํฌ๋„ŒํŠธ๋“ค์ด ๋ถˆํ•„์š”ํ•œ props๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๋„๋ก `React.createContext()`๋ฅผ ํ™œ์šฉํ•ด ๋ฐ์ดํ„ฐ ์ œ๊ณต์ž(Provider)์™€ ์†Œ๋น„์ž(Consumer)๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค [1, 12]. +- **System Design:** ํ…Œ๋งˆ๋‚˜ ์–ธ์–ด ์„ค์ •๊ณผ ๊ฐ™์€ ์ •์ ์ธ ์ „์—ญ ๊ด€์‹ฌ์‚ฌ(global concerns)์— ๋Œ€ํ•œ Prop Drilling์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Context API๋ฅผ ์„ค๊ณ„์— ๋ฐ˜์˜ํ•˜์ง€๋งŒ, ์ƒํƒœ ๋ณ€๊ฒฝ์ด ์žฆ์€ ์˜์—ญ์€ Zustand๋‚˜ Redux ๊ธฐ๋ฐ˜์˜ ์Šค๋งˆํŠธ ์•Œ๋ฆผ ์‹œ์Šคํ…œ(smart notification system) ๊ตฌ์กฐ๋กœ ์„ค๊ณ„ํ•˜์—ฌ ๊ด€์‹ฌ์‚ฌ์™€ ์„ฑ๋Šฅ์„ ๋ชจ๋‘ ์ฑ™๊น๋‹ˆ๋‹ค [4, 13, 20]. +- **Operation / Maintenance:** ์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง ํˆด(์˜ˆ: React DevTools Profiler)์„ ํ†ตํ•ด Prop Drilling์„ ์šฐํšŒํ•˜๊ณ ์ž ๋„์ž…ํ•œ Context๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง ํญํ’(re-render storm)์„ ์ผ์œผํ‚ค๋Š”์ง€ ์ถ”์ ํ•˜๊ณ , ๋ณ‘๋ชฉ ๋ฐœ์ƒ ์‹œ Selector๋ฅผ ์ง€์›ํ•˜๋Š” ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ๋กœ ์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜(Incremental Migration)์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค [8, 9, 21]. +- **Learning Path:** React ์ž…๋ฌธ ์‹œ ๋ฐ์ดํ„ฐ ํ๋ฆ„์˜ ๊ธฐ๋ณธ์ธ Prop Drilling์˜ ๋ถˆํŽธํ•จ์„ ๋จผ์ € ๊ฒฝํ—˜ํ•˜๊ณ , ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” Context API๋ฅผ ํ•™์Šตํ•œ ํ›„, ์ตœ์ข…์ ์œผ๋กœ ๋Œ€๊ทœ๋ชจ ์•ฑ์„ ์œ„ํ•œ Zustand๋‚˜ Redux๋กœ ๋ฐœ์ „ํ•ด ๋‚˜๊ฐ€๋Š” ํ˜•ํƒœ์˜ ํ•™์Šต ๊ฒฝ๋กœ๋ฅผ ๋ฐŸ๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค [22]. +- **My Project Relevance:** ์†Œ์Šค์— ๊ด€๋ จ ์ •๋ณด๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. + +### Adjacent Topics + +- [[Re-renders]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: Prop Drilling์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•œ ์ˆ˜๋‹จ(Context API)์ด ์ดˆ๋ž˜ํ•˜๋Š” ๋ถ€์ž‘์šฉ์ธ ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”๋ชจ์ด์ œ์ด์…˜(`React.memo`, `useMemo`, `useCallback`) ๋“ฑ React ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์œผ๋กœ์˜ ์ดํ•ด ํ™•์žฅ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค [3, 6, 23]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Re-renders Optimization.md b/00_Raw/Re-renders Optimization.md new file mode 100644 index 00000000..be2c3213 --- /dev/null +++ b/00_Raw/Re-renders Optimization.md @@ -0,0 +1,54 @@ +# [[Re-renders Optimization]] + +## ๐Ÿ“Œ Brief Summary +Re-renders Optimization์€ React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ถˆํ•„์š”ํ•œ ์ปดํฌ๋„ŒํŠธ ์—…๋ฐ์ดํŠธ๋ฅผ ์ตœ์†Œํ™”ํ•˜์—ฌ ์„ฑ๋Šฅ, ๋ฐ˜์‘์„ฑ ๋ฐ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค [1, 2]. ์ฃผ๋กœ ์ƒํƒœ(state), ์†์„ฑ(props), ์ปจํ…์ŠคํŠธ(context)์˜ ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ๊ณผ๋„ํ•œ ๋ Œ๋”๋ง์„ ํƒ€๊ฒŸ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค [3]. ์ด๋ฅผ ์œ„ํ•ด ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜, ์ƒํƒœ ๊ด€๋ฆฌ ์ตœ์ ํ™”, ๊ฐ€์ƒํ™” ๊ธฐ๋ฒ•, ๊ทธ๋ฆฌ๊ณ  React Compiler์™€ ๊ฐ™์€ ์ตœ์‹  ์ž๋™ํ™” ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค [4-6]. + +## ๐Ÿ“– Core Content +* **๋ฆฌ๋ Œ๋”๋ง์˜ ์›์ธ๊ณผ ์„ฑ๋Šฅ์  ์˜ํ–ฅ:** + React ์ปดํฌ๋„ŒํŠธ๋Š” ๋‚ด๋ถ€ ์ƒํƒœ(state) ๋ณ€๊ฒฝ, ์†์„ฑ(props) ๋ณ€๊ฒฝ, ๊ตฌ๋… ์ค‘์ธ ์ปจํ…์ŠคํŠธ(context) ๊ฐ’ ๋ณ€๊ฒฝ, ํ˜น์€ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง๋  ๋•Œ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค [3]. ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์ด ๋ˆ„์ ๋˜๋ฉด UI ๋ฐ˜์‘์„ฑ ์ €ํ•˜, ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ์ฆ๊ฐ€, ์ƒํ˜ธ์ž‘์šฉ์„ฑ(TTI) ์ง€์—ฐ ๋“ฑ์„ ์ดˆ๋ž˜ํ•˜๋ฉฐ, ๊นŠ์€ ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ์—์„œ๋Š” ์Šคํฌ๋ฆฝํŒ… ์‹œ๊ฐ„์„ 30~60%๊นŒ์ง€ ์ฆ๊ฐ€์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2]. +* **์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ (Manual Memoization):** + `React.memo()`๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด props๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ด์ „ ๋ Œ๋”๋ง ๊ฒฐ๊ณผ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜์—ฌ ๋ Œ๋”๋ง ํšŸ์ˆ˜๋ฅผ 30~50%๊ฐ€๋Ÿ‰ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [7, 8]. ์ด์™€ ํ•จ๊ป˜ `useCallback`๊ณผ `useMemo` ํ›…์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ์ฒด๋‚˜ ํ•จ์ˆ˜์˜ ์ฐธ์กฐ ๋™๋“ฑ์„ฑ(Reference Equality)์„ ์œ ์ง€ํ•ด์•ผ ์ž์‹ ์ปดํฌ๋„ŒํŠธ์˜ ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง์„ ๋ง‰์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [9, 10]. ๋‹จ, ๋ฌด๋ถ„๋ณ„ํ•œ ์‚ฌ์šฉ์€ ๋น„๊ต ์—ฐ์‚ฐ์˜ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋ฏ€๋กœ ํ”„๋กœํŒŒ์ผ๋ง์„ ํ†ตํ•ด ํ™•์ธ๋œ ๋ณ‘๋ชฉ ๊ตฌ๊ฐ„์—๋งŒ ์ ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [11, 12]. +* **์ปจํ…์ŠคํŠธ ์ตœ์ ํ™” (Context Optimization):** + React์˜ ๊ธฐ๋ณธ Context API๋Š” ๊ฐ’์˜ ์ผ๋ถ€๋งŒ ๋ณ€๊ฒฝ๋˜์–ด๋„ ํ•ด๋‹น ์ปจํ…์ŠคํŠธ๋ฅผ ๊ตฌ๋…ํ•˜๋Š” ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฆฌ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค [13, 14]. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ปจํ…์ŠคํŠธ๋ฅผ ์ž‘์€ ๋„๋ฉ”์ธ ๋‹จ์œ„๋กœ ์ชผ๊ฐœ๊ฑฐ๋‚˜ [15], ์„ ํƒ์ž(Selector)๋ฅผ ํ†ตํ•ด ์ƒํƒœ์˜ ํŠน์ • ์กฐ๊ฐ์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งŒ ๋ฆฌ๋ Œ๋”๋ง์„ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š” Zustand, Jotai ๋“ฑ์˜ ์™ธ๋ถ€ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค [16-18]. +* **React Compiler์˜ ๋„์ž…:** + ๋นŒ๋“œ ํƒ€์ž„ ์ตœ์ ํ™” ๋„๊ตฌ์ธ React Compiler๋Š” ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜(`useMemo`, `useCallback`, `React.memo`) ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ ์ปดํŒŒ์ผ ๋‹จ๊ณ„์—์„œ ์ž๋™์œผ๋กœ ์บ์‹ฑ ๋กœ์ง์„ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค [4, 19]. ์ปดํฌ๋„ŒํŠธ ์ „์ฒด๊ฐ€ ์•„๋‹Œ ๊ฐœ๋ณ„ JSX ์š”์†Œ ๋‹จ์œ„๋กœ ์„ธ๋ถ„ํ™”ํ•˜์—ฌ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์ˆ˜ํ–‰ํ•จ์œผ๋กœ์จ, ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ๋†’์ด๊ณ  ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง์„ ์›์ฒœ์ ์œผ๋กœ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค [19, 20]. +* **๋ Œ๋”๋ง ํŒจํ„ด ๋ฐ ๋™์‹œ์„ฑ ์ตœ์ ํ™”:** + ์ˆ˜๋ฐฑ ๊ฐœ ์ด์ƒ์˜ ํ•ญ๋ชฉ์„ ๋ Œ๋”๋งํ•˜๋Š” ๋Œ€๊ทœ๋ชจ ๋ฆฌ์ŠคํŠธ์—์„œ๋Š” ๊ณ ์œ ํ•˜๊ณ  ์•ˆ์ •์ ์ธ `key` ์†์„ฑ์„ ๋ถ€์—ฌํ•˜๊ณ , ํ™”๋ฉด์— ๋ณด์ด๋Š” ํ•ญ๋ชฉ๋งŒ ๋ Œ๋”๋งํ•˜๋Š” ๊ฐ€์ƒํ™”(Windowing) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(์˜ˆ: `react-window`)๋ฅผ ์ ์šฉํ•˜์—ฌ DOM ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ค„์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค [6, 21]. ๋˜ํ•œ JSX ๋‚ด๋ถ€์— ์ต๋ช… ํ•จ์ˆ˜๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•˜๋ฉด ๋งค ๋ Œ๋”๋ง๋งˆ๋‹ค ์ƒˆ๋กœ์šด ์ฐธ์กฐ๊ฐ€ ์ƒ์„ฑ๋˜๋ฏ€๋กœ ์ง€์–‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [22, 23]. ๋ถ€๊ฐ€์ ์œผ๋กœ `useTransition` ๋ฐ `useDeferredValue`์™€ ๊ฐ™์€ ๋™์‹œ์„ฑ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•ด ๋ฌด๊ฑฐ์šด ์—…๋ฐ์ดํŠธ๋ฅผ ์ง€์—ฐ์‹œํ‚ค๊ณ  ์‚ฌ์šฉ์ž ์ž…๋ ฅ์— ๋Œ€ํ•œ UI ๋ฐ˜์‘์„ฑ์„ ์šฐ์„ ์ˆœ์œ„์— ๋‘˜ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [24, 25]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts +- [[React Compiler]] + - ์—ฐ๊ฒฐ ์ด์œ : ๊ฐœ๋ฐœ์ž๊ฐ€ ์ˆ˜๋™์œผ๋กœ ๋ฆฌ๋ Œ๋”๋ง์„ ์ตœ์ ํ™”ํ•˜๋˜ ๊ธฐ์กด ๋ฐฉ์‹์„ ๋Œ€์ฒดํ•˜์—ฌ, ๋นŒ๋“œ ํƒ€์ž„์— ์ž๋™์œผ๋กœ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์ ์šฉํ•˜๋Š” 2025๋…„ ๊ธฐ์ค€ ํ•ต์‹ฌ ๊ธฐ์ˆ ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [4]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ปดํฌ๋„ŒํŠธ ์ „์ฒด๊ฐ€ ์•„๋‹Œ ๊ฐœ๋ณ„ JSX ์š”์†Œ์™€ ์—ฐ์‚ฐ์ด ์–ด๋–ป๊ฒŒ ๋…๋ฆฝ์ ์œผ๋กœ ์บ์‹ฑ๋˜๋Š”์ง€์˜ ์›๋ฆฌ์™€ ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ˜ธํ™˜์„ฑ ํ•œ๊ณ„ [19, 26]. + +- [[State Management (Zustand vs Context)]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋ถˆํ•„์š”ํ•œ ์ „์ฒด ๋ฆฌ๋ Œ๋”๋ง์„ ์œ ๋ฐœํ•˜๋Š” Context API์˜ ๊ตฌ์กฐ์  ํ•œ๊ณ„๋ฅผ Zustand์˜ ์„ ํƒ์ž(Selector) ํŒจํ„ด์ด ์–ด๋–ป๊ฒŒ ๊ทน๋ณตํ•˜์—ฌ ๋ Œ๋”๋ง์„ ์ตœ์ ํ™”ํ•˜๋Š”์ง€ ์„ค๋ช…ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [13, 17]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ž์ฃผ ๋ณ€๊ฒฝ๋˜๋Š” ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ์—์„œ React ๋ Œ๋”๋ง ์‚ฌ์ดํด ์™ธ๋ถ€์˜ ์Šคํ† ์–ด๊ฐ€ ์–ด๋–ป๊ฒŒ ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง์„ ์ •๋ฐ€ํ•˜๊ฒŒ ์ œ์–ดํ•˜๋Š”์ง€ [17, 27]. + +- [[Memoization (useMemo, useCallback)]] + - ์—ฐ๊ฒฐ ์ด์œ : React์˜ ์–•์€ ๋น„๊ต(Shallow comparison) ํŠน์„ฑ์„ ๊ทน๋ณตํ•˜๊ณ  ์ฐธ์กฐ ๋™๋“ฑ์„ฑ์„ ์œ ์ง€ํ•˜์—ฌ `React.memo`์™€ ๊ฒฐํ•ฉํ•œ ๋ฆฌ๋ Œ๋”๋ง ์ตœ์ ํ™”์˜ ๊ธฐ๋ฐ˜์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [10]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ฌด๋ถ„๋ณ„ํ•œ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์ด ์˜คํžˆ๋ ค ๋ Œ๋”๋ง ๋น„์šฉ๋ณด๋‹ค ํฐ ์„ฑ๋Šฅ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์œ ๋ฐœํ•˜๋Š” ์ด์œ ์™€ ์˜ฌ๋ฐ”๋ฅธ ์ ์šฉ ์กฐ๊ฑด [11, 12]. + +### Deeper Research Questions +- React Compiler๊ฐ€ ์ ์šฉ๋œ ํ™˜๊ฒฝ์—์„œ ๊ธฐ์กด `React.memo`, `useMemo`, `useCallback`์œผ๋กœ ์ž‘์„ฑ๋œ ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ์ฝ”๋“œ๋Š” ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๋ฆฌํŒฉํ† ๋ง๋˜๊ฑฐ๋‚˜ ๊ณต์กดํ•ด์•ผ ํ•˜๋Š”๊ฐ€? +- Context API๋ฅผ ๋‹ค์ˆ˜์˜ ์ž‘์€ ๋„๋ฉ”์ธ์œผ๋กœ ๋ถ„ํ• ํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜์™€ Zustand๋ฅผ ๋„์ž…ํ•˜์—ฌ ์„ ํƒ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜ ๊ฐ„์˜ ๋ Œ๋”๋ง ์„ฑ๋Šฅ ๋ฐ ์œ ์ง€๋ณด์ˆ˜์„ฑ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๋Š” ๋ฌด์—‡์ธ๊ฐ€? +- ๋Œ€๊ทœ๋ชจ ๋ฆฌ์ŠคํŠธ์—์„œ ์•ˆ์ •์ ์ธ `key` ์†์„ฑ ๋ถ€์—ฌ์™€ ๊ฐ€์ƒํ™”(Windowing) ๊ธฐ๋ฒ•์„ ํ•จ๊ป˜ ์ ์šฉํ•  ๋•Œ, DOM ๋…ธ๋“œ ๊ด€๋ฆฌ์™€ ๋ฉ”๋ชจ๋ฆฌ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ์ธก๋ฉด์—์„œ ๋‚ด๋ถ€์ ์œผ๋กœ ์–ด๋–ค ์ตœ์ ํ™”๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”๊ฐ€? +- JSX ๋‚ด ์ต๋ช… ํ•จ์ˆ˜ ์‚ฌ์šฉ์ด ์œ ๋ฐœํ•˜๋Š” ์ฐธ์กฐ ๋ณ€๊ฒฝ(Reference change) ๋ฌธ์ œ๋ฅผ `useCallback` ์™ธ์— ์ปดํฌ๋„ŒํŠธ ์™ธ๋ถ€ ์„ ์–ธ ๋ฐฉ์‹ ๋“ฑ์œผ๋กœ ํ•ด๊ฒฐํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์ƒํƒœ ์ ‘๊ทผ์„ฑ ์ œ์•ฝ์€ ์–ด๋–ป๊ฒŒ ๊ทน๋ณตํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- `useTransition`๊ณผ `useDeferredValue`๋ฅผ ํ™œ์šฉํ•œ ๋™์‹œ์„ฑ ๋ Œ๋”๋ง(Concurrent rendering)์ด ๋ฆฌ๋ Œ๋”๋ง์„ ์ฐจ๋‹จํ•˜์ง€ ์•Š๊ณ  ์ง€์—ฐ์‹œํ‚ฌ ๋•Œ, ๋ฌด๊ฑฐ์šด ์—ฐ์‚ฐ์ด ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋ฅผ ์ ์œ ํ•˜๋Š” ํ•œ๊ณ„๋Š” ์–ด๋–ป๊ฒŒ ๋ณด์™„ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? + +### Practical Application Contexts +- **Implementation:** ๋ฌด๊ฑฐ์šด ์ปดํฌ๋„ŒํŠธ๋‚˜ ์ž์‹์—๊ฒŒ ์ „๋‹ฌ๋˜๋Š” ํ•จ์ˆ˜/๊ฐ์ฒด prop์— ๋Œ€ํ•ด `React.memo()`, `useCallback`, `useMemo`๋ฅผ ์„ ํƒ์ ์œผ๋กœ ์ ์šฉํ•˜์—ฌ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค [7, 10]. ๋Œ€๊ทœ๋ชจ ๋ฆฌ์ŠคํŠธ ๊ตฌํ˜„ ์‹œ `react-window`๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค [6]. +- **System Design:** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ „์—ญ ์ƒํƒœ๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ, ํ…Œ๋งˆ๋‚˜ ๋‹ค๊ตญ์–ด์ฒ˜๋Ÿผ ๋ณ€๊ฒฝ์ด ์ ์€ ์ •์  ๋ฐ์ดํ„ฐ๋Š” Context API๋ฅผ, ์•Œ๋ฆผ์ด๋‚˜ ์žฅ๋ฐ”๊ตฌ๋‹ˆ์ฒ˜๋Ÿผ ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ณ€๊ฒฝ๋˜๋Š” ๋™์  ๋ฐ์ดํ„ฐ๋Š” ๋ถ€๋ถ„ ๊ตฌ๋…(Selector)์„ ์ง€์›ํ•˜๋Š” ์™ธ๋ถ€ ์ƒํƒœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(Zustand ๋“ฑ)๋กœ ์„ค๊ณ„ํ•˜์—ฌ ๋ Œ๋”๋ง ๋ฒ”์œ„๋ฅผ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค [18, 28, 29]. +- **Operation / Maintenance:** React DevTools Profiler, `why-did-you-render` ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, Chrome DevTools Performance Tab์„ ํ™œ์šฉํ•˜์—ฌ ํ”„๋กœ๋•์…˜ ๋ฐฐํฌ ์ „ ๋ฐ ์šด์˜ ์ค‘์— ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง๊ณผ ๊ทธ ์›์ธ์„ ์ง€์†์ ์œผ๋กœ ์ธก์ •ํ•˜๊ณ  ๊ฐœ์„ ํ•ฉ๋‹ˆ๋‹ค [30-32]. +- **Learning Path:** React์˜ ๊ธฐ๋ณธ ๋ Œ๋”๋ง ๋™์ž‘ ์›๋ฆฌ(์ƒํƒœ, props, ์ฐธ์กฐ ๋™๋“ฑ์„ฑ)๋ฅผ ๋จผ์ € ํ•™์Šตํ•˜๊ณ  ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์˜ ๋น„์šฉ์„ ์ดํ•ดํ•œ ๋’ค, ๋™์‹œ์„ฑ ๊ธฐ๋Šฅ(Concurrent Features)๊ณผ React Compiler๋ฅผ ํ†ตํ•œ ์ž๋™ํ™” ์ตœ์ ํ™” ํŒจ๋Ÿฌ๋‹ค์ž„์œผ๋กœ ์ง€์‹์„ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค [5]. +- **My Project Relevance:** ํ˜„์žฌ ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ฑฐ๋‚˜ ์ƒˆ๋กœ ๊ตฌ์ถ•ํ•˜๋Š” React ํ”„๋กœ์ ํŠธ์—์„œ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ๊ฒช๊ณ  ์žˆ๋‹ค๋ฉด, ์ต๋ช… ํ•จ์ˆ˜ ์ธ๋ผ์ธ ์ž‘์„ฑ ํŒจํ„ด์„ ์ˆ˜์ •ํ•˜๊ณ , ๋ถˆํ•„์š”ํ•œ ๊ฑฐ๋Œ€ Context๋ฅผ ๋ถ„๋ฆฌํ•˜๋ฉฐ, ์‹๋ณ„ ๊ฐ€๋Šฅํ•œ ๋ณ‘๋ชฉ ์ง€์ ์— ํ”„๋กœํŒŒ์ผ๋ง ๊ธฐ๋ฐ˜์˜ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์ ์šฉํ•ด ์ฆ‰๊ฐ์ ์ธ ์„ฑ๋Šฅ ๊ฐœ์„ ์„ ์ด๋ฃฐ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5, 15, 22]. + +### Adjacent Topics +- [[Core Web Vitals (INP, FCP, TTI)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ํ”„๋ก ํŠธ์—”๋“œ ์ฝ”๋“œ์˜ ๋ฆฌ๋ Œ๋”๋ง ์ตœ์ ํ™”๊ฐ€ ์‹ค์ œ ์‚ฌ์šฉ์ž์˜ ์ฒด๊ฐ ์„ฑ๋Šฅ์„ ์ธก์ •ํ•˜๋Š” ์ง€ํ‘œ(ํŠนํžˆ Interaction to Next Paint)์— ๋ธŒ๋ผ์šฐ์ € ๋ ˆ๋ฒจ์—์„œ ์–ด๋–ค ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”์ง€ ํ™•์žฅํ•˜์—ฌ ์กฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค [2, 33]. +- [[Code Splitting & Lazy Loading]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ์ปดํฌ๋„ŒํŠธ ์—…๋ฐ์ดํŠธ ์‹œ์ (๋ฆฌ๋ Œ๋”๋ง)์˜ ์ตœ์ ํ™”๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ์ปดํฌ๋„ŒํŠธ ์ตœ์ดˆ ๋กœ๋“œ ์‹œ์ ์˜ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ค„์—ฌ ์ดˆ๊ธฐ ๋ Œ๋”๋ง ์„ฑ๋Šฅ์„ ๊ทน๋Œ€ํ™”ํ•˜๋Š” `React.lazy`์™€ ๋™์  ์ž„ํฌํŠธ ๊ธฐ๋ฒ•์„ ํ•จ๊ป˜ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค [34]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/React 18 Concurrent Features.md b/00_Raw/React 18 Concurrent Features.md new file mode 100644 index 00000000..a5c653e9 --- /dev/null +++ b/00_Raw/React 18 Concurrent Features.md @@ -0,0 +1,50 @@ +# [[React 18 Concurrent Features]] + +## ๐Ÿ“Œ Brief Summary +React 18 Concurrent Features(๋™์‹œ์„ฑ ๊ธฐ๋Šฅ)๋Š” ์—…๋ฐ์ดํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์‹œ์ ๊ณผ ๋ฐฉ์‹์„ ์ œ์–ดํ•˜์—ฌ ์‘๋‹ต์„ฑ์„ ํฌ์ƒํ•˜์ง€ ์•Š์œผ๋ฉด์„œ๋„ ๋” ๋งค๋„๋Ÿฌ์šด ์•ฑ์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ด๋‹ค [1]. ์ด ๋ Œ๋”๋ง ๋ชจ๋ธ์€ React๊ฐ€ ๋ Œ๋”๋ง ์ž‘์—…์„ ์ผ์‹œ ์ค‘์ง€(pause), ์ค‘๋‹จ(interrupt), ์žฌ๊ฐœ(resume)ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•˜์—ฌ ์ค‘์š”๋„์— ๋”ฐ๋ฅธ ์—…๋ฐ์ดํŠธ ์šฐ์„ ์ˆœ์œ„ ์ง€์ •์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค [2]. ๋Œ€ํ‘œ์ ์ธ ํ›…(Hook)์ธ `useTransition`๊ณผ `useDeferredValue`๋ฅผ ํ†ตํ•ด ๋А๋ฆฐ ๋ Œ๋”๋ง์ด ์ค‘์š”ํ•œ ์‚ฌ์šฉ์ž ์ƒํ˜ธ์ž‘์šฉ์„ ์ฐจ๋‹จํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค [3, 4]. + +## ๐Ÿ“– Core Content +* **๋™์‹œ์„ฑ ๋ Œ๋”๋ง์˜ ์›๋ฆฌ์™€ ์žฅ์ ** + ๋™์‹œ์„ฑ ๋ Œ๋”๋ง์€ ๋ฌด๊ฑฐ์šด ํ•„ํ„ฐ ์—…๋ฐ์ดํŠธ์™€ ๊ฐ™์€ ์ž‘์—…์€ ์ง€์—ฐ์‹œํ‚ค๋ฉด์„œ, ํด๋ฆญ์ด๋‚˜ ํƒ€์ดํ•‘ ๋“ฑ ์ค‘์š”ํ•˜๊ณ  ์ฆ‰๊ฐ์ ์ธ ์ƒํ˜ธ์ž‘์šฉ์„ ์šฐ์„ ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค [2]. ์ตœ์‹  ๋ฒ„์ „์˜ React์—์„œ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ˆ˜๋™์œผ๋กœ ํ™œ์„ฑํ™”ํ•  ํ•„์š” ์—†์ด ๊ธฐ๋ณธ ๋™์ž‘์œผ๋กœ ๋‚ด์žฅ๋˜์–ด ์ž‘๋™ํ•œ๋‹ค [2]. ์ด ๊ธฐ๋Šฅ์€ ์•ฑ์„ ์‹ค์ œ๋กœ ๋” ๋น ๋ฅด๊ฒŒ ๋งŒ๋“ ๋‹ค๊ธฐ๋ณด๋‹ค๋Š”, ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์ด ์ง„ํ–‰๋˜๋Š” ๋™์•ˆ UI์˜ ์‘๋‹ต์„ฑ์„ ์œ ์ง€ํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ๋А๋ผ๋Š” ์ฒด๊ฐ ์†๋„(perceived speed)๋ฅผ ์šฐ์„ ์‹œํ•œ๋‹ค [4]. +* **`useTransition` (UX ์‘๋‹ต์„ฑ ์šฐ์„ ์ˆœ์œ„ ์ง€์ •)** + ์ด ํ›…์€ ํŠน์ • ์—…๋ฐ์ดํŠธ๋ฅผ '๋น„๊ธด๊ธ‰(non-urgent)'์œผ๋กœ ํ‘œ์‹œํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค [3]. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ผ์ด๋ธŒ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋‚˜ ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ๋ฅผ ํ•„ํ„ฐ๋งํ•  ๋•Œ, ๋ Œ๋”๋ง ์ฒ˜๋ฆฌ๊ฐ€ ๋А๋ ค์ง€๋”๋ผ๋„ ์‚ฌ์šฉ์ž์˜ ํƒ€์ดํ•‘์ด๋‚˜ ํด๋ฆญ ๊ฐ™์€ ์ค‘์š”ํ•œ ์ƒํ˜ธ์ž‘์šฉ์ด ์ฐจ๋‹จ๋˜์ง€ ์•Š๋Š”๋‹ค [3]. ์ฒ˜๋ฆฌ ๋Œ€๊ธฐ ์ค‘์ธ ์ƒํƒœ(`isPending`)๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ Œ๋”๋ง์„ ์ฐจ๋‹จํ•˜์ง€ ์•Š๊ณ  ๋กœ๋”ฉ ์Šคํ”ผ๋„ˆ๋‚˜ ์Šค์ผˆ๋ ˆํ†ค ์ƒํƒœ๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๋‹ค [3]. +* **`useDeferredValue` (ํŒŒ์ƒ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์ง€์—ฐ)** + `useTransition`์ด ์—…๋ฐ์ดํŠธ๊ฐ€ ํŠธ๋ฆฌ๊ฑฐ๋˜๋Š” ์‹œ์ ์„ ์ œ์–ดํ•œ๋‹ค๋ฉด, `useDeferredValue`๋Š” ๋ฌด๊ฑฐ์šด ๊ฐ’์„ '์ฝ๋Š”(read)' ์‹œ์ ์„ ์ œ์–ดํ•œ๋‹ค [4]. ์‚ฌ์šฉ์ž์˜ ํƒ€์ดํ•‘๊ณผ ๊ฐ™์€ UI ๋ณ€๊ฒฝ์€ ์ฆ‰๊ฐ์ ์œผ๋กœ ๋ฐ˜์˜ํ•˜๋˜, ํŒŒ์ƒ๋œ ๋ฌด๊ฑฐ์šด ์—ฐ์‚ฐ์ด๋‚˜ ํ•„ํ„ฐ๋ง ๋กœ์ง์€ ์•ฝ๊ฐ„ ์ง€์—ฐ์‹œ์ผœ ์ ์šฉํ•ด์•ผ ํ•  ๋•Œ ์ด์ƒ์ ์ธ ๋ฐฉ๋ฒ•์ด๋‹ค [4]. ์ฃผ๋กœ ๊ฒ€์ƒ‰ ์ƒ์ž, Typeahead ์ž…๋ ฅ๊ธฐ, ์‹ค์‹œ๊ฐ„ ํผ ๋“ฑ์—์„œ ๋Š๊น€ ํ˜„์ƒ(jank)์„ ์ค„์ด๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค [4]. +* **๋ชจ๋ฒ” ์‚ฌ๋ก€ ๋ฐ ํ”„๋ ˆ์ž„์›Œํฌ ์ƒํƒœ๊ณ„ ์ง€์›** + ๋™์‹œ์„ฑ ๊ธฐ๋Šฅ์€ ์•ฑ์˜ ๋ชจ๋“  ๊ณณ์ด ์•„๋‹Œ '์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ๋ทฐ'์— ํ•œ์ •ํ•˜์—ฌ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค [4]. ๋ฐ์ดํ„ฐ๊ฐ€ ๋กœ๋“œ๋˜๋Š” ๋™์•ˆ ๋Œ€์ฒด UI๋ฅผ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด `Suspense`์™€ ๊ฒฐํ•ฉํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋˜๋ฉฐ, ๊ตฌํ˜• ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜ ๋ Œ๋”๋ง์„ ์ฐจ๋‹จํ•˜๋Š” ์•ˆํ‹ฐ ํŒจํ„ด๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ํ”ผํ•ด์•ผ ํ•œ๋‹ค [4]. 2025๋…„ ๊ธฐ์ค€ Next.js(App Router), Remix, Vite ๊ธฐ๋ฐ˜ ํ™˜๊ฒฝ ๋“ฑ ๋Œ€๋‹ค์ˆ˜์˜ ํ’€์Šคํƒ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๋™์‹œ์„ฑ ๋ Œ๋”๋ง์„ ๊ธฐ๋ณธ์ ์œผ๋กœ ์—ฐ๋™ํ•˜๊ณ  ์ง€์›ํ•œ๋‹ค [5]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts +- [[useTransition]] + - ์—ฐ๊ฒฐ ์ด์œ : React 18 ๋™์‹œ์„ฑ ๊ธฐ๋Šฅ์˜ ํ•ต์‹ฌ ํ›…์œผ๋กœ, ๋น„๊ธด๊ธ‰ ์—…๋ฐ์ดํŠธ๋ฅผ ์ง€์—ฐ์‹œํ‚ค๋Š” ๊ตฌ์ฒด์ ์ธ ๊ตฌํ˜„์ฒด์ด๋‹ค [3]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ผ์ด๋ธŒ ๊ฒ€์ƒ‰์ด๋‚˜ ํ•„ํ„ฐ๋ง ์‹œ ๋ Œ๋”๋ง ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ๋ฐฉ์ง€ํ•˜๊ณ , ์–ด๋–ป๊ฒŒ ๋น„๊ธด๊ธ‰ ์ž‘์—…๊ณผ ๊ธด๊ธ‰ ์ƒํ˜ธ์ž‘์šฉ(ํƒ€์ดํ•‘ ๋“ฑ)์„ ๋ถ„๋ฆฌํ•˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค [3]. +- [[useDeferredValue]] + - ์—ฐ๊ฒฐ ์ด์œ : ๊ฐ’์˜ ์ฝ๊ธฐ๋ฅผ ์ง€์—ฐ์‹œ์ผœ UI ์—…๋ฐ์ดํŠธ์™€ ์—ฐ์‚ฐ ๋ถ€ํ•˜๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ๋™์‹œ์„ฑ ๊ธฐ๋Šฅ์˜ ๋˜ ๋‹ค๋ฅธ ํ•ต์‹ฌ ํ›…์ด๋‹ค [4]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ฆ‰๊ฐ์ ์ธ UI ๋ฐ˜์˜์ด ํ•„์š”ํ•œ ๋ถ€๋ถ„๊ณผ ์ง€์—ฐ์‹œ์ผœ๋„ ๋ฌด๋ฐฉํ•œ ๋ฌด๊ฑฐ์šด ๊ณ„์‚ฐ(derived data)์„ ์–ด๋–ป๊ฒŒ ๋‚˜๋ˆ„์–ด ์ฒ˜๋ฆฌํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค [4]. +- [[Suspense]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋™์‹œ์„ฑ ํ›…(`useTransition` ๋“ฑ)๊ณผ ๊ฒฐํ•ฉํ•˜์—ฌ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ๋ Œ๋”๋ง์ด ์ง„ํ–‰๋˜๊ฑฐ๋‚˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋กœ๋“œ๋  ๋•Œ ์Šค์ผˆ๋ ˆํ†ค(fallback UI)์„ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋œ ๊ธฐ๋Šฅ์ด๋‹ค [4]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ง€์—ฐ ์ค‘์ธ ๋ Œ๋”๋ง ์ƒํƒœ์—์„œ ์‚ฌ์šฉ์ž์˜ ๊ฒฝํ—˜(UX)์„ ์–ด๋–ป๊ฒŒ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ์ด์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค [4]. + +### Deeper Research Questions +- `useTransition`๊ณผ `useDeferredValue`๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ React ๋‚ด๋ถ€์ ์œผ๋กœ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์˜ ์œ ํœด ์‹œ๊ฐ„(idle time)์„ ์–ด๋–ป๊ฒŒ ํŒ๋‹จํ•˜์—ฌ ์ž‘์—…์„ ์ค‘๋‹จ ๋ฐ ์žฌ๊ฐœํ•˜๋Š”๊ฐ€? +- ๊ตฌํ˜• ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜ ํด๋ž˜์Šค ๊ธฐ๋ฐ˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋™์‹œ์„ฑ ๊ธฐ๋Šฅ๊ณผ ํ˜ผ์šฉํ–ˆ์„ ๋•Œ ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ค ๋ Œ๋”๋ง ์ฐจ๋‹จ ์ถฉ๋Œ์ด๋‚˜ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”๊ฐ€? +- ๋™์‹œ์„ฑ ๋ Œ๋”๋ง์„ ์ ์šฉํ–ˆ์„ ๋•Œ Interaction to Next Paint (INP)๋‚˜ Total Blocking Time (TBT)๊ณผ ๊ฐ™์€ Core Web Vitals ์ง€ํ‘œ๊ฐ€ ์ˆ˜์น˜์ƒ์œผ๋กœ ์–ด๋–ป๊ฒŒ ๋ณ€ํ™”ํ•˜๋Š”๊ฐ€? +- Next.js์˜ App Router์™€ ๊ฒฐํ•ฉ๋œ ๋™์‹œ์„ฑ ๋ Œ๋”๋ง์—์„œ, ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ(Server Components)์™€ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ ๊ฐ„์˜ ๋ Œ๋”๋ง ์šฐ์„ ์ˆœ์œ„๋Š” ์–ด๋–ป๊ฒŒ ๊ด€๋ฆฌ๋˜๋Š”๊ฐ€? +- `isPending` ์†์„ฑ์„ ํ™œ์šฉํ•ด ๋Œ€์ฒด UI(์Šค์ผˆ๋ ˆํ†ค, ์Šคํ”ผ๋„ˆ)๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ์‹œ๊ฐ์  ๊นœ๋นก์ž„์„ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•œ ์ด์ƒ์ ์ธ ์ง€์—ฐ ์‹œ๊ฐ„ ์„ค๊ณ„ ํŒจํ„ด์€ ๋ฌด์—‡์ธ๊ฐ€? + +### Practical Application Contexts +- **Implementation:** ๋ผ์ด๋ธŒ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ๋ Œ๋”๋ง์ด๋‚˜ ์ˆ˜์ฒœ ๊ฐœ์˜ ํ•ญ๋ชฉ์ด ์žˆ๋Š” ๋ฐ์ดํ„ฐ ๋ชฉ๋ก์„ ํ•„ํ„ฐ๋งํ•  ๋•Œ `useTransition`์„ ๋„์ž…ํ•˜์—ฌ ์ž…๋ ฅ์ฐฝ์˜ ์ž…๋ ฅ์ด ์ง€์—ฐ๋˜์ง€ ์•Š๋„๋ก ๊ตฌํ˜„ํ•œ๋‹ค [3]. +- **System Design:** ๊ฒ€์ƒ‰ ์ƒ์ž, Typeahead ์ž…๋ ฅ๊ธฐ, ๋˜๋Š” ์‹ค์‹œ๊ฐ„ ํผ์„ ์„ค๊ณ„ํ•  ๋•Œ ์ฆ‰๊ฐ์ ์ธ ์ž…๋ ฅ ๋ Œ๋”๋ง๊ณผ ์—ฐ์‚ฐ์ด ๋ฌด๊ฑฐ์šด ๋ฐ์ดํ„ฐ ๋ Œ๋”๋ง ๊ฐ„์˜ ์˜ํ–ฅ์„ ์ฐจ๋‹จํ•˜๊ธฐ ์œ„ํ•ด `useDeferredValue` ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋„์ž…ํ•œ๋‹ค [4]. +- **Operation / Maintenance:** Chrome DevTools์˜ Performance ํƒญ๊ณผ Web Vitals ์ง€ํ‘œ๋ฅผ ํ†ตํ•ด ๊ธด ์ž‘์—…(Long tasks)์ด ๋™์‹œ์„ฑ ๋ Œ๋”๋ง ๋•๋ถ„์— ์„ฑ๊ณต์ ์œผ๋กœ ์ชผ๊ฐœ์ ธ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ ์ฐจ๋‹จ์„ ์ค„์˜€๋Š”์ง€ ์ง€์†์ ์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋งํ•œ๋‹ค [6, 7]. +- **Learning Path:** React์˜ ๊ธฐ๋ณธ ๋ Œ๋”๋ง ๋ชจ๋ธ(props ๋ฐ state ๋ณ€๊ฒฝ์— ๋”ฐ๋ฅธ ๋ฆฌ๋ Œ๋”๋ง ํŠธ๋ฆฌ๊ฑฐ)์„ ๋ช…ํ™•ํžˆ ์ดํ•ดํ•œ ๋‹ค์Œ, ๋™์‹œ์„ฑ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ์ด๋Ÿฌํ•œ ๋ Œ๋”๋ง ์‚ฌ์ดํด์ด ์–ด๋–ป๊ฒŒ ์ผ์‹œ ์ค‘์ง€๋˜๊ณ  ์žฌ๊ฐœ๋  ์ˆ˜ ์žˆ๋Š”์ง€ ํ•™์Šต์„ ํ™•์žฅํ•œ๋‹ค [2, 8]. +- **My Project Relevance:** ํ˜„์žฌ ์ง„ํ–‰ ์ค‘์ธ ํ”„๋กœ์ ํŠธ์—์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์€ ์ฐจํŠธ๋‚˜ ํ…Œ์ด๋ธ” ํ•„ํ„ฐ๋ง ์‹œ UI๊ฐ€ ๋Š๊ธฐ๋Š”(Jank) ํ˜„์ƒ์ด ์žˆ๋‹ค๋ฉด, ์ด ๋™์‹œ์„ฑ ๊ธฐ๋Šฅ ํ›…์„ ๋„์ž…ํ•˜์—ฌ ์ฆ‰๊ฐ์ ์ธ ํด๋ฆญ/์ž…๋ ฅ ์‘๋‹ต์„ฑ์„ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ๋‹ค [3, 4]. + +### Adjacent Topics +- [[React Performance Optimization]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋™์‹œ์„ฑ ๋ Œ๋”๋ง ์™ธ์—๋„ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง ์ž์ฒด๋ฅผ ๋ง‰๋Š” `React.memo`, `useCallback`, `useMemo` ํ™œ์šฉ๋ฒ•๊ณผ ๊ฐ™์€ ๋‹ค์–‘ํ•œ React ์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ธฐ๋ฒ• ์ „๋ฐ˜์œผ๋กœ ์ง€์‹์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋‹ค [9-11]. +- [[Server Components]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: Next.js์—์„œ ๋™์‹œ์„ฑ ๊ธฐ๋Šฅ๊ณผ ํ•จ๊ป˜ ์„ฑ๋Šฅ ํ–ฅ์ƒ์˜ ์–‘๋Œ€ ์ถ•์„ ์ด๋ฃจ๋Š” ๊ธฐ๋Šฅ์œผ๋กœ, ํด๋ผ์ด์–ธํŠธ ์ธก JavaScript๋ฅผ ์ „์†กํ•˜์ง€ ์•Š๊ณ  ์„œ๋ฒ„์—์„œ ๋ Œ๋”๋ง์„ ์™„๋ฃŒํ•˜์—ฌ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ค„์ด๋Š” ์ „๋žต์„ ํ•™์Šตํ•  ์ˆ˜ ์žˆ๋‹ค [12, 13]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/React Application Scaling.md b/00_Raw/React Application Scaling.md new file mode 100644 index 00000000..3baf9301 --- /dev/null +++ b/00_Raw/React Application Scaling.md @@ -0,0 +1,29 @@ +# [[React Application Scaling]] + +## ๐Ÿ“Œ Brief Summary +๋ฆฌ์•กํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์Šค์ผ€์ผ๋ง(React Application Scaling)์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํฌ๊ธฐ์™€ ๋ณต์žก์„ฑ์ด ์ฆ๊ฐ€ํ•จ์— ๋”ฐ๋ผ ๋ฐœ์ƒํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜, ์„ฑ๋Šฅ, ์ƒํƒœ ๊ด€๋ฆฌ, ๊ทธ๋ฆฌ๊ณ  ํ˜‘์—… ๋ฌธ์ œ๋ฅผ ์ฒด๊ณ„์ ์œผ๋กœ ํ•ด๊ฒฐํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค [1-3]. ์ด๋Š” ๋‹จ์ˆœํžˆ ๋ Œ๋”๋ง ์†๋„๋ฅผ ๋†’์ด๋Š” ๊ฒƒ์„ ๋„˜์–ด, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ UI์˜ ๊ฒฐํ•ฉ์„ ๋ง‰๊ณ , ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ํด๋” ๊ตฌ์กฐ๋ฅผ ๋„์ž…ํ•˜๋ฉฐ, ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง๊ณผ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ตœ์ ํ™”ํ•˜๋Š” ๊ฒƒ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค [2-5]. ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋Œ€๊ทœ๋ชจ ํŒ€์ด ์•ˆ์ •์ ์ด๊ณ  ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ์‰ฌ์šด ํ”„๋ก ํŠธ์—”๋“œ ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š” ํ•ต์‹ฌ ์—”์ง€๋‹ˆ์–ด๋ง ํŒจ๋Ÿฌ๋‹ค์ž„์ž…๋‹ˆ๋‹ค [3, 6]. + +## ๐Ÿ“– Core Content +* **๊ตฌ์กฐ์  ์•„ํ‚คํ…์ฒ˜ ๋ฐ ํด๋” ๊ตฌ์„ฑ (Architectural Paradigms):** + ์ดˆ๊ธฐ ๋ฆฌ์•กํŠธ ์•ฑ์€ ์ปดํฌ๋„ŒํŠธ๋‚˜ ํ›…์„ ๊ธฐ์ˆ ์  ํŒŒ์ผ ํƒ€์ž…(Type-Based)์œผ๋กœ ๋ถ„๋ฆฌํ•˜์ง€๋งŒ, ์•ฑ์ด ์ปค์ง€๋ฉด ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜(Feature-Based) ๋˜๋Š” ๋„๋ฉ”์ธ ์ฃผ๋„ ๊ตฌ์กฐ๋กœ ์ „ํ™˜ํ•ด์•ผ ํ™•์žฅ์„ฑ์„ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [7, 8]. ํŠนํžˆ **FSD(Feature-Sliced Design)**๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ `app`, `pages`, `widgets`, `features`, `entities`, `shared` ๋“ฑ์˜ ๊ณ„์ธตํ™”๋œ ์Šฌ๋ผ์ด์Šค๋กœ ๋‚˜๋ˆ„๊ณ , ํ•˜์œ„ ๊ณ„์ธต๋งŒ ์ฐธ์กฐํ•˜๋„๋ก ํ•˜๋Š” ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ์„ ๊ฐ•์ œํ•˜์—ฌ ์ฝ”๋“œ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ณ  ๋ฆฌํŒฉํ† ๋ง์„ ์šฉ์ดํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค [9-11]. +* **์ƒํƒœ ๊ด€๋ฆฌ ์•„ํ‚คํ…์ฒ˜ (State Management Evolution):** + ๋‹จ์ผํ•œ ์ „์—ญ ์ƒํƒœ ๋„๊ตฌ์—์„œ ๋ฒ—์–ด๋‚˜ ๋ฐ์ดํ„ฐ ํŠน์„ฑ์— ๋งž๋Š” ๋„๊ตฌ๋ฅผ ์„ ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [12]. ํ…Œ๋งˆ๋‚˜ ๋กœ์ผ€์ผ์ฒ˜๋Ÿผ ์ •์ ์ด๊ณ  ๋ณ€๊ฒฝ์ด ์ ์€ ๋ฐ์ดํ„ฐ๋Š” Context API๊ฐ€ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค [13]. ๋ฐ˜๋ฉด ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ณ€๊ฒฝ๋˜๋Š” ๋™์  ์ƒํƒœ๋Š” ์„ ํƒ์ž(Selector) ํŒจํ„ด์„ ํ†ตํ•ด ๋ฆฌ๋ Œ๋”๋ง์„ ๋ฐฉ์ง€ํ•˜๋Š” Zustand๊ฐ€ ์œ ๋ฆฌํ•˜๋ฉฐ, ๋ณต์žกํ•œ ๋น„๋™๊ธฐ ๋กœ์ง๊ณผ ๋Œ€๊ทœ๋ชจ ํŒ€ ํ˜‘์—…์—๋Š” ๊ตฌ์กฐ๋ฅผ ๊ฐ•์ œํ•˜๋Š” Redux๊ฐ€ ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค [14-17]. ์„œ๋ฒ„ ์ƒํƒœ ์ฒ˜๋ฆฌ๋Š” TanStack Query์™€ ๊ฐ™์€ API ๊ณ„์ธต์šฉ ๋„๊ตฌ๋กœ ์™„์ „ํžˆ ๋ถ„๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [16, 18]. +* **์„ฑ๋Šฅ ๋ฐ ๋ฒˆ๋“ค๋ง ์ตœ์ ํ™” (Performance & Bundling):** + ๋ฆฌ์•กํŠธ๋Š” ์ƒํƒœ๋‚˜ ํ”„๋กญ์Šค๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ํ•˜์œ„ ํŠธ๋ฆฌ๋ฅผ ๋ฆฌ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค [19]. ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด `React.memo`, `useCallback`, `useMemo`๋ฅผ ์ „๋žต์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ์ฐธ์กฐ ์•ˆ์ •์„ฑ(Reference Equality)์„ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [20, 21]. ์ดˆ๊ธฐ ๋กœ๋”ฉ ์†๋„ ๊ฐœ์„ ์„ ์œ„ํ•ด์„œ๋Š” `React.lazy`์™€ ๋ผ์šฐํŠธ ๋ ˆ๋ฒจ์˜ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…์„ ์ ์šฉํ•˜๊ณ , Vite์˜ `manualChunks`๋ฅผ ํ™œ์šฉํ•ด React ์ฝ”์–ด ๋“ฑ ๋ฌด๊ฑฐ์šด ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ณ„๋„ ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ์บ์‹ฑ ํšจ์œจ์„ ๋†’์ž…๋‹ˆ๋‹ค [22-25]. ์ตœ๊ทผ์—๋Š” React Compiler๋ฅผ ๋„์ž…ํ•ด ๋นŒ๋“œ ํƒ€์ž„์— ์ž๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ธฐ๋ฒ•๋„ ํ™œ์šฉ๋ฉ๋‹ˆ๋‹ค [26-29]. +* **์ฝ”๋“œ ํ’ˆ์งˆ ๋ฐ ๋ณต์›๋ ฅ (Quality & Resilience):** + SOLID, DRY, KISS, YAGNI ์›์น™์„ ์ค€์ˆ˜ํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‹จ์ผ ์ฑ…์ž„(SRP)์„ ๊ฐ–๋„๋ก ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค [30-32]. ํŒŒ์ผ๋ช…์€ ์šด์˜์ฒด์ œ ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด `kebab-case`๋ฅผ, ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ๋Š” `PascalCase`๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋“ฑ ๋„ค์ด๋ฐ ์ปจ๋ฒค์…˜์„ ํ†ต์ผํ•ฉ๋‹ˆ๋‹ค [33-36]. ๋˜ํ•œ ํŠน์ • ์ปดํฌ๋„ŒํŠธ์˜ ๋ Œ๋”๋ง ์˜ค๋ฅ˜๊ฐ€ ์ „์ฒด ์•ฑ์„ ๋‹ค์šด์‹œํ‚ค๋Š” ๊ฒƒ์„ ๋ง‰๊ธฐ ์œ„ํ•ด ์—๋Ÿฌ ๋ฐ”์šด๋”๋ฆฌ(Error Boundaries)๋ฅผ ์ค‘์š” UI ์„น์…˜๋งˆ๋‹ค ๋ฐฐ์น˜ํ•˜์—ฌ Fallback UI๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ณต์›๋ ฅ ์žˆ๋Š” ์„ค๊ณ„๊ฐ€ ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค [37-39]. + +## โš–๏ธ Trade-offs & Caveats +* **๊ณผ๋„ํ•œ ์—”์ง€๋‹ˆ์–ด๋ง (Over-Engineering):** FSD๋‚˜ Redux์™€ ๊ฐ™์€ ๊ณ ๋„ํ™”๋œ ์•„ํ‚คํ…์ฒ˜์™€ ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ๋ฅผ ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ๋‚˜ ๊ฒฝํ—˜์ด ์ ์€ ํŒ€์— ๋„์ž…ํ•˜๋ฉด, ํ•™์Šต ๊ณก์„ ์ด ํฌ๊ฒŒ ์ƒ์Šนํ•˜๊ณ  ๋ถˆํ•„์š”ํ•œ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ๊ฐ€ ์–‘์‚ฐ๋˜์–ด ์˜คํžˆ๋ ค ๊ฐœ๋ฐœ ์†๋„๋ฅผ ๋Šฆ์ถœ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [40-43]. +* **๋ฉ”๋ชจ์ด์ œ์ด์…˜์˜ ์˜ค์šฉ์— ๋”ฐ๋ฅธ ์„ฑ๋Šฅ ์ €ํ•˜:** `React.memo`๋‚˜ `useMemo`๋ฅผ ๋ฌด๋ถ„๋ณ„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด, ์ด์ „ props ๋ฐ ์ƒํƒœ๋ฅผ ๋น„๊ตํ•˜๋Š” ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์—ฐ์‚ฐ ๋น„์šฉ์ด ๋ Œ๋”๋ง ๋น„์šฉ ์ž์ฒด๋ฅผ ์ดˆ๊ณผํ•˜์—ฌ ์˜คํžˆ๋ ค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ์„ ์•…ํ™”์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [44, 45]. +* **React Compiler์˜ ๊ฐ€์‹œ์„ฑ ์ €ํ•˜ ๋ฐ ํ˜ธํ™˜์„ฑ ์ œ์•ฝ:** ์ž๋™ํ™”๋œ ์ตœ์ ํ™” ๋„๊ตฌ์ธ React Compiler๋Š” ๋ธ”๋ž™๋ฐ•์Šค์ฒ˜๋Ÿผ ์ž‘๋™ํ•˜๋ฏ€๋กœ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ ๋ฐœ์ƒ ์‹œ ๋””๋ฒ„๊น…์ด ๋” ๊นŒ๋‹ค๋กœ์›Œ์ง‘๋‹ˆ๋‹ค [46]. ๋˜ํ•œ ๋งค ๋ Œ๋”๋ง ์‹œ ์˜๋„์ ์œผ๋กœ ๋ถˆ์•ˆ์ •ํ•œ ์ฐธ์กฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(์˜ˆ: React Router, TanStack Query ์ผ๋ถ€ ํ›…)์™€๋Š” ์ตœ์ ํ™” ํ˜ธํ™˜์ด ๊นจ์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ, React ๊ทœ์น™์„ ์ง€ํ‚ค์ง€ ์•Š์€ ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ๋Š” ์ ์šฉ์ด ์–ด๋ ต์Šต๋‹ˆ๋‹ค [47, 48]. +* **Context API์˜ ๋ฆฌ๋ Œ๋”๋ง ํญํ’ (Re-render Storm):** Context API๋ฅผ ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ณ€ํ•˜๋Š” ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ์— ์‚ฌ์šฉํ•˜๋ฉด, ๋ฐ์ดํ„ฐ ์ค‘ ์ผ๋ถ€๋ถ„๋งŒ ๋ณ€๊ฒฝ๋˜๋”๋ผ๋„ ํ•ด๋‹น ์ปจํ…์ŠคํŠธ๋ฅผ ๊ตฌ๋…ํ•˜๋Š” ๋ชจ๋“  ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ฆฌ๋ Œ๋”๋ง๋˜๋Š” ์น˜๋ช…์ ์ธ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ์œ ๋ฐœํ•ฉ๋‹ˆ๋‹ค [49, 50]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [์•„ํ‚คํ…์ฒ˜ ๋ฐ ํด๋” ๊ตฌ์กฐ (Architecture & Structure)] +- [[Feature-Sliced Design (FSD)]] + - ์—ฐ๊ฒฐ ์ด์œ : ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ๋ฆฌ์•กํŠธ ์•ฑ์„ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•œ ํ•ต์‹ฌ ๋„๋ฉ”์ธ ์ฃผ๋„ ์•„ํ‚คํ…์ฒ˜ ๋ฐฉ๋ฒ•๋ก ์ž…๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ธฐ๋Šฅ, ์œ„์ ฏ, ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋ถ„๋ฆฌํ•˜๊ณ  ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ๊ทœ์น™์„ ๊ฐ•์ œํ•˜์—ฌ ๊ฒฐ \ No newline at end of file diff --git a/00_Raw/React Codebase Refactoring.md b/00_Raw/React Codebase Refactoring.md new file mode 100644 index 00000000..53140358 --- /dev/null +++ b/00_Raw/React Codebase Refactoring.md @@ -0,0 +1,64 @@ +# [[React Codebase Refactoring]] + +## ๐Ÿ“Œ Brief Summary +React ์ฝ”๋“œ๋ฒ ์ด์Šค ๋ฆฌํŒฉํ† ๋ง์€ ๊ธฐ์กด ์•ฑ์˜ ์™ธ๋ถ€ ๋™์ž‘์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋ฉด์„œ ์œ ์ง€๋ณด์ˆ˜์„ฑ, ์„ฑ๋Šฅ, ๊ฐ€๋…์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์ฝ”๋“œ๋ฅผ ์žฌ์„ค๊ณ„ํ•˜๊ณ  ์ •๋ฆฌํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค. ๋Œ€๊ทœ๋ชจ React ์•ฑ์—์„œ ์ž์ฃผ ๋ฐœ์ƒํ•˜๋Š” ๋…ผ๋ฆฌ ๊ฒฐํ•ฉ, ๋ถˆํ•„์š”ํ•œ ์žฌ๋ Œ๋”๋ง, ์ „์—ญ ์ƒํƒœ์˜ ๋‚จ์šฉ ๋“ฑ์˜ ์•„ํ‚คํ…์ฒ˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ์ค‘์ ์„ ๋‘ก๋‹ˆ๋‹ค. ์„ฑ๊ณต์ ์ธ ๋ฆฌํŒฉํ† ๋ง์„ ์œ„ํ•ด์„œ๋Š” ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋กœ ์•ˆ์ „๋ง์„ ํ™•๋ณดํ•œ ํ›„, ์ปดํฌ๋„ŒํŠธ ์ฑ…์ž„ ๋ถ„๋ฆฌ, TypeScript ๋„์ž…, ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ์˜ ํ˜„๋Œ€ํ™”๋ฅผ ์ ์ง„์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค [1-3]. + +## ๐Ÿ“– Core Content +* **ํ…Œ์ŠคํŠธ ์ฃผ๋„ ์ ‘๊ทผ (Test-Driven Approach):** ๋ฆฌํŒฉํ† ๋ง ๋„์ค‘ ๊ธฐ์กด ๊ธฐ๋Šฅ์ด ์†์ƒ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ€์žฅ ๋จผ์ € ๋‹จ์œ„ ํ…Œ์ŠคํŠธ(Unit Test)๋‚˜ UI ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ์˜ ๊ธฐ์กด ๋™์ž‘์„ ๋ณด์žฅํ•˜๋ฉฐ ์•ˆ์ „ํ•˜๊ฒŒ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2, 4, 5]. +* **์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ (Incremental Migration):** ์ „์ฒด ์ฝ”๋“œ๋ฅผ ํ•œ ๋ฒˆ์— ์žฌ์ž‘์„ฑ(Rewrite)ํ•˜๋Š” ๊ฒƒ์€ ์œ„ํ—˜๋„๊ฐ€ ๋†’์œผ๋ฏ€๋กœ, ์ ์ง„์ ์ธ ์ ‘๊ทผ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Context API์—์„œ Zustand๋กœ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ, ํ•˜๋‚˜์˜ ์Šคํ† ์–ด๋‚˜ ๊ธฐ๋Šฅ ๋‹จ์œ„๋กœ ๋‹จ๊ณ„๋ณ„ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์ง„ํ–‰ํ•ด์•ผ ๋น„์ฆˆ๋‹ˆ์Šค ๊ฐœ๋ฐœ์˜ ์ค‘๋‹จ ์—†์ด ์•„ํ‚คํ…์ฒ˜๋ฅผ ํ˜„๋Œ€ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1]. +* **๊ตฌ์กฐ ๋ฐ ์ปดํฌ๋„ŒํŠธ ์ฑ…์ž„ ๋ถ„๋ฆฌ (Separation of Concerns):** 300์ค„ ์ด์ƒ์˜ ๋ฐฉ๋Œ€ํ•œ ์ปดํฌ๋„ŒํŠธ๋Š” ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)์— ๋”ฐ๋ผ ๋” ์ž‘๊ณ  ์ดˆ์ ์ด ๋งž์ถฐ์ง„ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ถ„๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [6, 7]. ๋ฐ์ดํ„ฐ ํŽ˜์นญ์ด๋‚˜ ํผ ์ฒ˜๋ฆฌ์™€ ๊ฐ™์€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์€ ์ปค์Šคํ…€ ํ›…(Custom Hooks)์œผ๋กœ ์ถ”์ถœํ•˜์—ฌ UI ์ปดํฌ๋„ŒํŠธ์™€ ์™„์ „ํžˆ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค [8, 9]. +* **์ƒํƒœ ๊ด€๋ฆฌ์˜ ํ˜„๋Œ€ํ™”:** ๊ณผ๊ฑฐ์˜ ๊ฑฐ๋Œ€ํ•œ ๋‹จ์ผ ์ „์—ญ ์ƒํƒœ๋ฅผ ์—ญํ• ์— ๋งž๊ฒŒ ๋ถ„๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. API์—์„œ ๊ฐ€์ ธ์˜ค๋Š” '์„œ๋ฒ„ ์ƒํƒœ'๋Š” TanStack Query(React Query)์™€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ ํŽ˜์นญ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์œ„์ž„ํ•˜๊ณ , 'ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ'๋Š” Zustand์™€ ๊ฐ™์€ ๊ฐ€๋ฒผ์šด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜ ์ง€์—ญ ์ƒํƒœ(Local State)๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๊ด€๋ฆฌํ•˜๋„๋ก ๊ฐœ์„ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [10-12]. +* **๋„๊ตฌ ๋ฐ ์ปจ๋ฒค์…˜์˜ ์ ์šฉ:** JavaScript ๊ธฐ๋ฐ˜ ์ฝ”๋“œ๋Š” TypeScript๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜์—ฌ ํƒ€์ž… ์•ˆ์ •์„ฑ์„ ํ™•๋ณดํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค [3, 11]. ๋˜ํ•œ, ESLint์™€ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ๋„์ž…ํ•ด ์ฝ”๋“œ ํฌ๋งทํŒ…๊ณผ ์•„ํ‚คํ…์ฒ˜ ๊ทœ์น™(์˜ˆ: ๋ชจ๋“ˆ ๊ฐ„ ์˜์กด์„ฑ ๊ทœ์น™)์„ ์ž๋™์œผ๋กœ ๊ฐ•์ œํ•ด์•ผ ํ•˜๋ฉฐ, ์ธ๋ผ์ธ ์Šคํƒ€์ผ์ด๋‚˜ ์—ฌ๋Ÿฌ ๋ฐฉ์‹์ด ํ˜ผ์žฌ๋œ CSS๋ฅผ ํ•œ ๊ฐ€์ง€ ๋ฐฉ์‹(์˜ˆ: CSS Modules, Tailwind ๋“ฑ)์œผ๋กœ ํ†ต์ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [13-15]. +* **๊ณผ๊ฑฐ์˜ ํŒจํ„ด ์ œ๊ฑฐ:** ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žˆ๋‹ค๋ฉด ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์™€ ํ›…(Hooks)์œผ๋กœ ๊ต์ฒดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [11]. ์ตœ์‹  React(์˜ˆ: React 19)๋‚˜ React Compiler๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ™˜๊ฒฝ์ด๋ผ๋ฉด ๋ถˆํ•„์š”ํ•œ `useEffect`, `useMemo`, `useCallback` ๋“ฑ์„ ์ œ๊ฑฐํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ๋”์šฑ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [11, 16, 17]. + +## โš–๏ธ Trade-offs & Caveats +* **์ถ”์ƒํ™”์˜ ํ•จ์ •๊ณผ ์˜ค๋ฒ„์—”์ง€๋‹ˆ์–ด๋ง (KISS vs DRY):** DRY(Don't Repeat Yourself) ์›์น™์„ ๋”ฐ๋ฅด๊ธฐ ์œ„ํ•ด ์„ฑ๊ธ‰ํ•˜๊ฒŒ ๊ณตํ†ต ๋กœ์ง์„ ์ถ”์ƒํ™”ํ•˜๋ฉด, ์ฝ”๋“œ๊ฐ€ ์›๋ž˜์˜ ๋ฐ˜๋ณต๋œ ์ฝ”๋“œ๋ณด๋‹ค ๋” ๋ณต์žกํ•ด์ง€๊ณ  ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์›Œ์ง€๋Š” ๋ถ€์ž‘์šฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ „๋ฌธ๊ฐ€๋“ค์€ ํŒจํ„ด์ด 3๋ฒˆ ์ด์ƒ ๋ฐ˜๋ณต๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ ์ถ”์ƒํ™”(Custom Hook ๋“ฑ)๋ฅผ ์ง„ํ–‰ํ•  ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค [18]. +* **TypeScript ์ฑ„ํƒ์˜ ์ธ์ง€์  ๋ถ€ํ•˜:** ๋ฆฌํŒฉํ† ๋ง ์‹œ TypeScript๋ฅผ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์€ ์žฅ๊ธฐ์  ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•˜์ง€๋งŒ, ๊ฒฝํ—˜์ด ๋ถ€์กฑํ•œ ๊ฐœ๋ฐœํŒ€์—๊ฒŒ๋Š” ์ƒˆ๋กœ์šด ๋ณต์žก์„ฑ ๋ ˆ์ด์–ด๋กœ ์ž‘์šฉํ•˜์—ฌ ์ดˆ๊ธฐ์— ์ƒ์‚ฐ์„ฑ์„ ๋Šฆ์ถœ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ•์ œ ๋„์ž…๋ณด๋‹ค๋Š” ๊ฐœ๋ณ„ ํŒŒ์ผ๋ถ€ํ„ฐ ์ ์ง„์ ์œผ๋กœ ์ „ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ์ถ”์ฒœ๋ฉ๋‹ˆ๋‹ค [3]. +* **์•„ํ‚คํ…์ฒ˜ ๋„์ž… ๋น„์šฉ:** Feature-Sliced Design(FSD)๊ณผ ๊ฐ™์ด ์—„๊ฒฉํ•œ ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ๊ฐ•์ œํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜๋กœ ํด๋” ๊ตฌ์กฐ๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•˜๋Š” ๊ฒƒ์€ ํฐ ํ•™์Šต ๊ณก์„ ๊ณผ ์„ค์ • ๋น„์šฉ์„ ์ˆ˜๋ฐ˜ํ•ฉ๋‹ˆ๋‹ค. ํŒ€ ์ „์ฒด์˜ ์ดํ•ด๋„๊ฐ€ ์—†์œผ๋ฉด ์˜คํžˆ๋ ค ์‹œ์Šคํ…œ์ด ์—‰๋ง์ด ๋˜๊ฑฐ๋‚˜ ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๊ณผ๋„ํ•œ ์„ค๊ณ„(Overkill)๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [19-21]. +* **์™„์ „ ์žฌ์ž‘์„ฑ(Rewrite)์˜ ์œ„ํ—˜์„ฑ:** ํ”„๋กœ์ ํŠธ๊ฐ€ ๋งค์šฐ ์ž‘๋‹ค๋ฉด ์•„์˜ˆ ์ฒ˜์Œ๋ถ€ํ„ฐ ์ƒˆ๋กœ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋น ๋ฅผ ์ˆ˜๋„ ์žˆ์œผ๋‚˜ [4], ์ผ๋ฐ˜์ ์ธ ํ™˜๊ฒฝ์—์„œ๋Š” ๊ธฐ์กด ๊ธฐ๋Šฅ์„ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜๋ฉด์„œ ์ฝ”๋“œ๋ฅผ ๊ฐœ์„ ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ „๋ฉด ์žฌ์ž‘์„ฑ๋ณด๋‹ค๋Š” ์•ˆ์ „์„ฑ์„ ๋‹ด๋ณดํ•œ ์ ์ง„์  ๋ฆฌํŒฉํ† ๋ง์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค [1]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [๊ด€๊ณ„ ์œ ํ˜• A (์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ )] +- [[Feature-Sliced Design]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋ฆฌํŒฉํ† ๋ง ๊ณผ์ •์—์„œ ๊ธฐ์ˆ  ๋‹จ์œ„(Component, Hooks ๋“ฑ)๋กœ ํฉ์–ด์ง„ ๊ธฐ์กด ํด๋” ๊ตฌ์กฐ๋ฅผ ๊ธฐ๋Šฅ(Feature) ์ค‘์‹ฌ์œผ๋กœ ๋ชจ๋“ˆํ™”ํ•˜๊ณ  ์žฌํŽธํ•  ๋•Œ ๊ธฐ์ค€์ด ๋˜๋Š” ํ˜„๋Œ€์ ์ธ ํ”„๋ก ํŠธ์—”๋“œ ์•„ํ‚คํ…์ฒ˜๋ก ์ž…๋‹ˆ๋‹ค [22, 23]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํ™•์žฅ์„ฑ์„ ์œ„ํ•œ ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ๊ทœ์น™๊ณผ ๋„๋ฉ”์ธ ์ค‘์‹ฌ์˜ ์ฝ”๋“œ ์บก์Аํ™” ์„ค๊ณ„ ๋ฐฉ๋ฒ•. +- [[SOLID Principles]] + - ์—ฐ๊ฒฐ ์ด์œ : ๊ฑฐ๋Œ€ํ•œ React ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ž‘๊ฒŒ ๋ถ„๋ฆฌํ•˜๊ณ  ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ, ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)๊ณผ ๊ฐ™์€ ํด๋ฆฐ ์ฝ”๋“œ์˜ ๊ธฐ๋ฐ˜ ์ง€์นจ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [6, 24]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ์˜ ์ฑ…์ž„์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ถ„๋ฆฌํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ์‰ฌ์šด ์ถ”์ƒํ™”๋ฅผ ์„ค๊ณ„ํ•˜๋Š” ๊ธฐ์ค€. + +#### [๊ด€๊ณ„ ์œ ํ˜• B (๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ)] +- [[TanStack Query]] + - ์—ฐ๊ฒฐ ์ด์œ : ๊ธฐ์กด์˜ ๋น„ํšจ์œจ์ ์ธ Context API๋‚˜ ๊ฑฐ๋Œ€ํ•œ Redux ์Šคํ† ์–ด๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•  ๋•Œ, ์„œ๋ฒ„ ์ƒํƒœ(์บ์‹ฑ, ๋™๊ธฐํ™” ๋“ฑ)๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ๋ถ„๋ฆฌํ•ด ์ฃผ๋Š” ํ•ต์‹ฌ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค [10, 11]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์„œ๋ฒ„ ๋ฐ์ดํ„ฐ ํŽ˜์นญ ๋กœ์ง์˜ ๋ถ„๋ฆฌ์™€ ์ปดํฌ๋„ŒํŠธ ๋‚ด ๋ณต์žกํ•œ ์ƒํƒœ ๊ด€๋ฆฌ ๊ฐ์†Œ ๋ฐฉ๋ฒ•. +- [[Zustand]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋ถˆํ•„์š”ํ•œ ์žฌ๋ Œ๋”๋ง์„ ์œ ๋ฐœํ•˜๋Š” ๊ธฐ์กด์˜ Context API ๊ธฐ๋ฐ˜ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•  ๋•Œ ์ฃผ๋กœ ๋„์ž…๋˜๋Š” ๊ฒฝ๋Ÿ‰ ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค [1, 25]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ƒํƒœ ์„ ํƒ์ž(Selector)๋ฅผ ํ†ตํ•œ ๋ Œ๋”๋ง ์ตœ์ ํ™” ๊ตฌ์กฐ ๋ฐ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์—†๋Š” ์ƒํƒœ ๊ด€๋ฆฌ ๋กœ์ง ์ž‘์„ฑ๋ฒ•. +- [[Unit Testing]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋ฆฌํŒฉํ† ๋ง ์‹œ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜๋”๋ผ๋„ ๊ธฐ์กด์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ํŒŒ๊ดด๋˜์ง€ ์•Š์Œ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ๋ฆฌํŒฉํ† ๋ง ์ž‘์—…์— ์„ ํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค [2, 5]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ๊ฒ€์ฆ ๊ฐ€๋Šฅํ•œ ํ˜•ํƒœ๋กœ ์ชผ๊ฐœ๊ณ  ์•ˆ์ „์„ฑ์„ ํ™•๋ณดํ•˜๋Š” ์‹ค์งˆ์ ์ธ ์—”์ง€๋‹ˆ์–ด๋ง ์ ˆ์ฐจ. + +### Deeper Research Questions +- ๋ ˆ๊ฑฐ์‹œ React ์•ฑ์—์„œ Context API๋ฅผ Zustand๋กœ ์ ์ง„์ ์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ๋•Œ(Incremental Migration), ์ƒํƒœ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ€์žฅ ์•ˆ์ „ํ•œ ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? +- ๋Œ€๊ทœ๋ชจ ๋ฆฌํŒฉํ† ๋ง ์ง„ํ–‰ ์‹œ, Feature-Sliced Design(FSD) ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋„์ž…ํ•  ๋•Œ ๊ธฐ์กด ์ปดํฌ๋„ŒํŠธ ๊ฐ„์˜ ๊ฒฐํ•ฉ(Cross-cutting concerns)์„ ์–ด๋–ป๊ฒŒ ๊ณ„์ธต์ ์œผ๋กœ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- React Compiler ํ™˜๊ฒฝ์ด ๋„์ž…๋˜์—ˆ์„ ๋•Œ, ๋ฆฌํŒฉํ† ๋ง ์‹œ ๊ธฐ์กด ์ฝ”๋“œ์— ๋‚จ์šฉ๋œ `useMemo`์™€ `useCallback`์„ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ด ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ ๋ฐ ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์— ์–ด๋–ค ๊ตฌ์ฒด์ ์ธ ์ด์ ์„ ์ฃผ๋Š”๊ฐ€? +- ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ํ˜ผ์žฌ๋œ ๊ฑฐ๋Œ€ํ•œ ํผ(Form) ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•  ๋•Œ ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)๊ณผ YAGNI ์›์น™ ๊ฐ„์˜ ๊ท ํ˜•์„ ๋งž์ถ”๋Š” ๊ธฐ์ค€์€ ๋ฌด์—‡์ธ๊ฐ€? +- ๋Œ€๊ทœ๋ชจ TypeScript ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์ง„ํ–‰ํ•  ๋•Œ ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ ์ €ํ•˜๋ฅผ ๋ฐฉ์ง€ํ•˜๋ฉด์„œ ์ ์ง„์  ํƒ€์ž… ์ •์˜๋ฅผ ์ ์šฉํ•˜๋Š” ๋ชจ๋ฒ” ์‚ฌ๋ก€๋Š” ๋ฌด์—‡์ธ๊ฐ€? + +### Practical Application Contexts +- **Implementation:** ๋น„๋Œ€ํ•ด์ง„ React ์ปดํฌ๋„ŒํŠธ์—์„œ API ํ˜ธ์ถœ๊ณผ ์ƒํƒœ ๊ด€๋ฆฌ ๋กœ์ง์„ ๋ถ„๋ฆฌํ•˜์—ฌ Custom Hook์œผ๋กœ ์ž‘์„ฑํ•˜๊ณ , ESLint๋ฅผ ๋„์ž…ํ•˜์—ฌ ์ฝ”๋“œ ์ปจ๋ฒค์…˜๊ณผ ์•„ํ‚คํ…์ฒ˜ ๊ทœ์น™ ์œ„๋ฐ˜์„ ๋ฆฐํŠธ(Lint) ๋‹จ๊ณ„์—์„œ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค. +- **System Design:** ํ”„๋กœ์ ํŠธ์˜ ํŒŒ์ผ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๋‹จ์ˆœํ•œ ๊ธฐ๋Šฅ๋ณ„(File-type based) ๋ถ„๋ฅ˜์—์„œ Feature-Sliced Design๊ณผ ๊ฐ™์€ ๋„๋ฉ”์ธ/๋น„์ฆˆ๋‹ˆ์Šค ์ค‘์‹ฌ์˜ ๊ณ„์ธตํ˜• ๊ตฌ์กฐ๋กœ ์žฌ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค. +- **Operation / Maintenance:** ์„œ๋น„์Šค๋ฅผ ์ค‘๋‹จํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด ํ•œ ๋ฒˆ์— ๋ชจ๋“  ์‹œ์Šคํ…œ์„ ๋ฐ”๊พธ์ง€ ์•Š๊ณ , ํ•˜๋‚˜์˜ ์Šคํ† ์–ด๋‚˜ ํŠน์ • ๊ธฐ๋Šฅ ๋ชจ๋“ˆ ๋‹จ์œ„๋กœ ๋ฆฌํŒฉํ† ๋ง์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ ์ง„์  ์ ‘๊ทผ๋ฒ•์„ ์šด์˜ํ•ฉ๋‹ˆ๋‹ค. +- **Learning Path:** React ๊ธฐ์ดˆ ์Šต๋“ โž” Clean Code ๋ฐ SOLID ์›์น™ ์ดํ•ด โž” ์ƒํƒœ ๊ด€๋ฆฌ์˜ ์„ธ๋ถ„ํ™”(์„œ๋ฒ„ ๋ฐ์ดํ„ฐ vs UI ์ƒํƒœ) โž” ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ โž” ์ ์ง„์  ๋ฆฌํŒฉํ† ๋ง ์ ์šฉ ์ˆœ์œผ๋กœ ์—”์ง€๋‹ˆ์–ด๋ง ์—ญ๋Ÿ‰์„ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค. +- **My Project Relevance:** ํ˜„์žฌ ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ณ  ์žˆ๋Š” ๋ณต์žกํ•œ ๋ ˆ๊ฑฐ์‹œ React ํ”„๋กœ์ ํŠธ์˜ ์„ฑ๋Šฅ ๋ฐ ์œ ์ง€๋ณด์ˆ˜์„ฑ ์ €ํ•˜ ์›์ธ์„ ๋ถ„์„ํ•˜๊ณ , ์ปดํฌ๋„ŒํŠธ ๋ถ„๋ฆฌ์™€ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(Zustand, React Query) ๊ต์ฒด ์ž‘์—…์„ ์ฒด๊ณ„์ ์œผ๋กœ ๊ธฐํšํ•  ๋•Œ ์ง์ ‘ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### Adjacent Topics +- [[Web Performance Optimization]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋ฆฌํŒฉํ† ๋ง์˜ ๊ถ๊ทน์  ๊ฒฐ๊ณผ๋ฌผ ์ค‘ ํ•˜๋‚˜์ธ ์ดˆ๊ธฐ ๋กœ๋”ฉ ์†๋„ ํ–ฅ์ƒ, ๋ Œ๋”๋ง ์ตœ์ ํ™”, ๊ทธ๋ฆฌ๊ณ  ๋ถˆํ•„์š”ํ•œ ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ๋ฅผ ์ค„์ด๋Š” ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…(Code Splitting) ๊ธฐ๋ฒ• ๋“ฑ์œผ๋กœ ๊ฐœ๋…์„ ํ™•์žฅํ•˜์—ฌ ํ•™์Šตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[Git Workflow & CI/CD]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋Œ€๊ทœ๋ชจ ๋ฆฌํŒฉํ† ๋ง ์‹œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ธŒ๋žœ์น˜ ์ถฉ๋Œ ๋ฐฉ์ง€์™€ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ์ž๋™ํ™”, ๊ทธ๋ฆฌ๊ณ  Pull Request ๊ณผ์ •์—์„œ Visual Regression Testing์„ ์—ฐ๋™ํ•˜๋Š” ๋“ฑ ํ˜‘์—… ์ „๋žต์œผ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/React DevTools Profiler.md b/00_Raw/React DevTools Profiler.md new file mode 100644 index 00000000..0ed6a720 --- /dev/null +++ b/00_Raw/React DevTools Profiler.md @@ -0,0 +1,52 @@ +# [[React DevTools Profiler]] + +## ๐Ÿ“Œ Brief Summary +React DevTools Profiler๋Š” React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ Œ๋”๋ง ์„ฑ๋Šฅ์„ ์ธก์ •ํ•˜๊ณ  ์ตœ์ ํ™” ๋Œ€์ƒ์„ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด React DevTools์— ๋‚ด์žฅ๋œ ํ”„๋กœํŒŒ์ผ๋ง ๋ฐ ๋””๋ฒ„๊น… ๋„๊ตฌ์ด๋‹ค [1]. ์ด ๋„๊ตฌ๋Š” ์–ด๋–ค ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ธ์ œ, ์–ผ๋งˆ๋‚˜ ์˜ค๋ž˜ ๋ Œ๋”๋ง๋˜์—ˆ๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์–ด๋–ค ์š”์ธ(props, state ๋ณ€๊ฒฝ ๋“ฑ)์ด ๋ Œ๋”๋ง์„ ์œ ๋ฐœํ–ˆ๋Š”์ง€ ํŒŒ์•…ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค [1, 2]. ์ฃผ๋กœ ๋กœ์ปฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ์‹๋ณ„ํ•˜๊ณ  ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ์ฐพ์•„๋‚ด๋Š” ๋ฐ ํ•ต์‹ฌ์ ์œผ๋กœ ํ™œ์šฉ๋œ๋‹ค [3]. + +## ๐Ÿ“– Core Content +* **๋ Œ๋”๋ง ์ถ”์  ๋ฐ ์‹œ๊ฐํ™”**: Profiler๋Š” ํŠน์ • props๋‚˜ ์ƒํƒœ(state) ๋ณ€๊ฒฝ ๋“ฑ ์ปดํฌ๋„ŒํŠธ์˜ ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•œ ์ •ํ™•ํ•œ ์›์ธ์„ ์ถ”์ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค [1, 2]. ํ”Œ๋ ˆ์ž„๊ทธ๋ž˜ํ”„(Flamegraph)์™€ ์ˆœ์œ„ ๋ทฐ(Ranked views)๋ฅผ ์ œ๊ณตํ•˜์—ฌ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ ์ง€์ ์„ ์‹œ๊ฐ์ ์œผ๋กœ ์‰ฝ๊ฒŒ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š”๋‹ค [2]. +* **์ตœ์ ํ™” ํ•„์š”์„ฑ ๊ฒ€์ฆ (์ธก์ • ๊ธฐ๋ฐ˜ ์ตœ์ ํ™”)**: `React.memo`์™€ ๊ฐ™์€ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๊ธฐ์ˆ ์„ ์ ์šฉํ•˜๊ธฐ ์ „์—, ์ปดํฌ๋„ŒํŠธ์˜ ๋ฆฌ๋ Œ๋”๋ง ๋น„์šฉ์ด ์ตœ์ ํ™” ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๊ฐ์ˆ˜ํ•  ๋งŒํผ ํฐ์ง€ ์ธก์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค [4]. ๋˜ํ•œ, ๋ฉ”๋ชจ์ด์ œ์ด์…˜๋œ ์ปดํฌ๋„ŒํŠธ ๋‚ด์˜ prop ๋ณ€๊ฒฝ์„ ์ถ”์ ํ•˜์—ฌ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ฆฌ๋ Œ๋”๋ง๋˜๋Š”์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค [5]. "์ธก์ •ํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ์ตœ์ ํ™”ํ•˜์ง€ ๋ง๋ผ"๋Š” ์›์น™์— ๋”ฐ๋ผ, ํ”„๋กœํŒŒ์ผ๋ง์€ ์„ฑ๋Šฅ ํ•ซ์ŠคํŒŸ์—๋งŒ ์ง‘์ค‘ํ•˜๋„๋ก ๋•๋Š”๋‹ค [2, 6]. +* **React Compiler ์‹œ๊ฐํ™”**: React Compiler๊ฐ€ ์ ์šฉ๋œ ํ™˜๊ฒฝ์—์„œ๋Š” Profiler ํƒญ์—์„œ ์ž๋™ ์ตœ์ ํ™”๋œ ์ปดํฌ๋„ŒํŠธ์— `Memo โœจ` ๋ฐฐ์ง€๊ฐ€ ํ‘œ์‹œ๋œ๋‹ค [7, 8]. ์ž…๋ ฅ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•„ ๋ฆฌ๋ Œ๋”๋ง์„ ๊ฑด๋„ˆ๋›ด ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋Š” ํšŒ์ƒ‰์œผ๋กœ ํ‘œ์‹œ๋˜๋ฉฐ, ๋งˆ์šฐ์Šค๋ฅผ ์˜ฌ๋ฆฌ๋ฉด ์ž๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๋ฐ ๋ฆฌ๋ Œ๋”๋ง ์ƒ๋žต ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๋Š” ํˆดํŒ์ด ๋‚˜ํƒ€๋‚œ๋‹ค [8]. +* **๋ธ”๋ž™๋ฐ•์Šค ํ™˜๊ฒฝ์—์„œ์˜ ๋””๋ฒ„๊น… ํ•„์ˆ˜์„ฑ**: React Compiler ๋„์ž… ์‹œ ๊ธฐ์กด์˜ ๋ช…์‹œ์ ์ธ `React.memo`, `useMemo`, `useCallback` ํ˜ธ์ถœ์ด ์ฝ”๋“œ์—์„œ ์‚ฌ๋ผ์ ธ ๋ Œ๋”๋ง ์ œ์–ด๊ฐ€ ๋ธ”๋ž™๋ฐ•์Šค์ฒ˜๋Ÿผ ์ž‘๋™ํ•˜๊ฒŒ ๋œ๋‹ค [9]. ๋”ฐ๋ผ์„œ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ฆฌ๋ Œ๋”๋ง ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ, ์ด๋ฅผ ์ฝ”๋“œ ์ƒ์—์„œ ํ™•์ธํ•˜๋Š” ๋Œ€์‹  Profiler๋ฅผ ํ†ตํ•ด ์ง์ ‘ ์กฐ์‚ฌํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๊ทธ ์ค‘์š”์„ฑ์ด ๋”์šฑ ์ปค์ง„๋‹ค [9]. + +## โš–๏ธ Trade-offs & Caveats +* **ํ•ด์„์ƒ์˜ ์ฃผ์˜์  (`Memo โœจ` ๋ฐฐ์ง€์˜ ํ•จ์ •)**: Profiler ํƒญ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” `Memo โœจ` ๋ฐฐ์ง€๋Š” ๋‹ค์†Œ ์˜คํ•ด๋ฅผ ๋ถˆ๋Ÿฌ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋‹ค [10]. ์ด ๋ฐฐ์ง€๋Š” React Compiler๊ฐ€ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ฒ˜๋ฆฌ(Compile)ํ–ˆ์Œ์„ ๋‚˜ํƒ€๋‚ผ ๋ฟ, ์ตœ์ ํ™”๊ฐ€ ์™„๋ฒฝํ•˜๊ฒŒ ์„ฑ๊ณตํ–ˆ์Œ์„ ์˜๋ฏธํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค [10]. ์ปดํฌ๋„ŒํŠธ์— ๋ฐฐ์ง€๊ฐ€ ํ‘œ์‹œ๋˜์–ด ์žˆ๋”๋ผ๋„, ์ธ๋ผ์ธ ๊ฐ์ฒด๋‚˜ ํ•จ์ˆ˜์™€ ๊ฐ™์€ ๋ถˆ์•ˆ์ •ํ•œ ์ฐธ์กฐ๋ฅผ ๊ฐ€์ง„ props๊ฐ€ ์ „๋‹ฌ๋œ๋‹ค๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ง‰์ง€ ๋ชปํ•ด ์—ฌ์ „ํžˆ ๋งค๋ฒˆ ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค [10]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [๊ด€๊ณ„ ์œ ํ˜• A: ์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] +- [[React Compiler]] + - ์—ฐ๊ฒฐ ์ด์œ : React Compiler๊ฐ€ ๋นŒ๋“œ ํƒ€์ž„์— ์ฃผ์ž…ํ•œ ์ž๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๋กœ์ง์˜ ์„ฑ๊ณต ์—ฌ๋ถ€์™€ ๋ Œ๋”๋ง ์Šคํ‚ต ๊ฒฐ๊ณผ๋ฅผ Profiler๋ฅผ ํ†ตํ•ด ์‹œ๊ฐ์ ์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค [7-9]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ช…์‹œ์ ์ธ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ์ฝ”๋“œ ์—†์ด๋„ ๋ Œ๋”๋ง ์„ฑ๋Šฅ์ด ์ตœ์ ํ™”๋˜๋Š” ์›๋ฆฌ์™€, ๋ธ”๋ž™๋ฐ•์Šคํ™”๋œ ๋ Œ๋”๋ง ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๋””๋ฒ„๊น…ํ•˜๋Š” ๋ฐฉ๋ฒ• [9, 11]. + +#### [๊ด€๊ณ„ ์œ ํ˜• B: ๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ] +- [[React.memo]] + - ์—ฐ๊ฒฐ ์ด์œ : Profiler๋ฅผ ํ†ตํ•ด ํŠน์ • ์ปดํฌ๋„ŒํŠธ์˜ ๋ Œ๋”๋ง ๋นˆ๋„์™€ ๋น„์šฉ์„ ์ธก์ •ํ•œ ๋’ค, ๊ทธ ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ `React.memo` ์ ์šฉ์ด ์„ฑ๋Šฅ ํ–ฅ์ƒ์— ์‹ค์งˆ์ ์ธ ๋„์›€์ด ๋ ์ง€ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๋‹ค [4]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์–•์€ ๋น„๊ต(Shallow comparison)์˜ ์›๋ฆฌ์™€ ํ”„๋กœํŒŒ์ผ๋ง ๋ฐ์ดํ„ฐ์— ๊ธฐ๋ฐ˜ํ•œ ์ „๋žต์  ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๋ฐฉ๋ฒ• [4, 12, 13]. +- [[useCallback & useMemo]] + - ์—ฐ๊ฒฐ ์ด์œ : Profiler์—์„œ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ฐธ์กฐ(Reference) ๋ณ€๊ฒฝ ๋•Œ๋ฌธ์— ๊ณ„์† ๋ฆฌ๋ Œ๋”๋ง๋˜๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ๋‹ค๋ฉด, ์ด ํ›…๋“ค์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฐธ์กฐ ์•ˆ์ •์„ฑ(Reference stability)์„ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ๋‹ค [5, 14]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํ•จ์ˆ˜๋‚˜ ๊ฐ์ฒด์˜ ์ฐธ์กฐ ๋™์ผ์„ฑ์ด ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง ํŠธ๋ฆฌ์— ๋ฏธ์น˜๋Š” ์ง์ ‘์ ์ธ ์˜ํ–ฅ [14]. + +### Deeper Research Questions +- React DevTools Profiler์˜ ํ”Œ๋ ˆ์ž„๊ทธ๋ž˜ํ”„(Flamegraph)์™€ ์ˆœ์œ„ ๋ทฐ(Ranked view)๋ฅผ ์–ด๋–ป๊ฒŒ ๋ถ„์„ํ•ด์•ผ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ๊ฐ€์žฅ ๋น ๋ฅด๊ณ  ์ •ํ™•ํ•˜๊ฒŒ ์ฐพ์•„๋‚ผ ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- ๋ช…์‹œ์ ์ธ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ํ›…์ด ์ œ๊ฑฐ๋˜๋Š” React Compiler ํ™˜๊ฒฝ์—์„œ, Profiler๋ฅผ ํ†ตํ•œ ์„ฑ๋Šฅ ๋””๋ฒ„๊น… ์›Œํฌํ”Œ๋กœ์šฐ๋Š” ๊ธฐ์กด๊ณผ ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ๋‹ฌ๋ผ์ง€๋Š”๊ฐ€? +- Profiler๋ฅผ ํ†ตํ•ด ์‹๋ณ„๋œ ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ๋•Œ, ์–ด๋–ค ์ƒํ™ฉ์—์„œ ๊ตฌ์กฐ ์žฌ์„ค๊ณ„(์˜ˆ: Context API ๋Œ€์‹  Zustand ๋„์ž…)๊ฐ€ ๋‹จ์ˆœํ•œ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ์ ์šฉ๋ณด๋‹ค ๋” ๋‚˜์€ ์„ ํƒ์ด ๋˜๋Š”๊ฐ€? +- ๋กœ์ปฌ ํ™˜๊ฒฝ์˜ Profiler์—์„œ ๊ด€์ฐฐ๋˜๋Š” ๋ Œ๋”๋ง ์‹œ๊ฐ„๊ณผ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์˜ ์‹ค์ œ ์‚ฌ์šฉ์ž ์ฒด๊ฐ ์„ฑ๋Šฅ(Core Web Vitals์˜ INP ๋“ฑ) ๊ฐ„์˜ ์ฐจ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ๋ณด์ •ํ•˜์—ฌ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? + +### Practical Application Contexts +- **Implementation:** ๋ Œ๋”๋ง ์ตœ์ ํ™” ์ฝ”๋“œ๋ฅผ ๋ฌด์ž‘์ • ์ถ”๊ฐ€ํ•˜๊ธฐ ์ „์—, Profiler๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์‹ค์ œ ๋ Œ๋”๋ง ๋นˆ๋„์™€ ์‹คํ–‰ ์‹œ๊ฐ„์„ ์ธก์ •ํ•จ์œผ๋กœ์จ ๋ Œ๋”๋ง์ด ๋ฌด๊ฑฐ์šด(expensive) ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ •ํ™•ํžˆ ์‹๋ณ„ํ•œ๋‹ค [4, 6]. +- **System Design:** Context API์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ Œ๋”๋ง๋˜๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ๊ธ€๋กœ๋ฒŒ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(Zustand ๋“ฑ) ๋„์ž…์ด๋‚˜ ์ƒํƒœ ๋„๋ฉ”์ธ ๋ถ„๋ฆฌ์˜ ๊ธฐ์ˆ ์  ํƒ€๋‹น์„ฑ์„ ๊ฒ€์ฆํ•œ๋‹ค [15-18]. +- **Operation / Maintenance:** ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ฑฐ๋‚˜ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ๋ฆด๋ฆฌ์Šคํ•œ ์งํ›„, ํ”Œ๋ ˆ์ž„๊ทธ๋ž˜ํ”„๋ฅผ ์ •๊ธฐ์ ์œผ๋กœ ๋ฆฌ๋ทฐํ•˜์—ฌ ์˜๋„์น˜ ์•Š์€ ์„ฑ๋Šฅ ํšŒ๊ท€(Regression)๋ฅผ ์‹๋ณ„ํ•˜๊ณ  ๊ด€๋ฆฌํ•œ๋‹ค [19]. +- **Learning Path:** React ์ž…๋ฌธ์ž๋‚˜ ํŒ€์›๋“ค์ด Props, State, Context๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ฐ˜์‘ํ•˜๊ณ  ์žฌ๋ Œ๋”๋ง๋˜๋Š”์ง€๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ๋ณด์—ฌ์คŒ์œผ๋กœ์จ ๋ Œ๋”๋ง ๋ชจ๋ธ์„ ๊นŠ๊ฒŒ ์ดํ•ด์‹œํ‚จ๋‹ค [1, 20]. +- **My Project Relevance:** ํ™”๋ฉด ๋‚ด ๋Œ€์šฉ๋Ÿ‰ ๋ฆฌ์ŠคํŠธ๋‚˜ ๋ณต์žกํ•œ ํ•„ํ„ฐ๋ฅผ ์กฐ์ž‘ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์ง€์—ฐ ํ˜„์ƒ(Jank)์˜ ์›์ธ์ด ๋ Œ๋”๋ง ์‹œ๊ฐ„ ์ž์ฒด์ธ์ง€, ์•„๋‹ˆ๋ฉด ๋ถˆํ•„์š”ํ•œ ์—ฐ์‡„ ๋ฆฌ๋ Œ๋”๋ง ๋•Œ๋ฌธ์ธ์ง€ ์ง„๋‹จํ•˜๊ณ  ํ•ด๊ฒฐ์ฑ…์„ ๋งˆ๋ จํ•œ๋‹ค [21, 22]. + +### Adjacent Topics +- [[why-did-you-render]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: Profiler์™€ ๊ฒฐํ•ฉํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ, ์‹ค์ œ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์ด ์—†์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง๋œ '์ •ํ™•ํ•œ ์ด์œ '๋ฅผ ์ฝ˜์†”์— ๊ฒฝ๊ณ  ํ˜•ํƒœ๋กœ ๋‚จ๊ฒจ์ฃผ์–ด ๋””๋ฒ„๊น…์„ ๋”์šฑ ์‰ฝ๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๋„๊ตฌ์— ๋Œ€ํ•ด ์กฐ์‚ฌํ•œ๋‹ค [3, 23]. +- [[Chrome DevTools Performance Tab]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: Profiler๊ฐ€ ์•Œ๋ ค์ฃผ๋Š” React ๋‚ด๋ถ€์˜ ๋ Œ๋”๋ง ์†๋„ ์ด์™ธ์—, ํ”„๋ ˆ์ž„ ๋“œ๋กญ์ด๋‚˜ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋ฅผ ๋ง‰๋Š” ๋ฌด๊ฑฐ์šด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰, ๋ ˆ์ด์•„์›ƒ ์ด๋™ ๋“ฑ ๋ธŒ๋ผ์šฐ์ € ๋ ˆ๋ฒจ์˜ ์ „์ฒด์ ์ธ ์„ฑ๋Šฅ ๋ถ„์„์œผ๋กœ ์‹œ์•ผ๋ฅผ ํ™•์žฅํ•œ๋‹ค [3, 23]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/React Frontend Architecture.md b/00_Raw/React Frontend Architecture.md new file mode 100644 index 00000000..76200a99 --- /dev/null +++ b/00_Raw/React Frontend Architecture.md @@ -0,0 +1,64 @@ +# [[React Frontend Architecture]] + +## ๐Ÿ“Œ Brief Summary +React ํ”„๋ก ํŠธ์—”๋“œ ์•„ํ‚คํ…์ฒ˜๋Š” ํ™•์žฅ ๊ฐ€๋Šฅํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ์‰ฌ์šด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•œ ๊ตฌ์กฐ์  ๋ผˆ๋Œ€์ด์ž ์กฐ์งํ™” ๋ฐฉ๋ฒ•๋ก ์ด๋‹ค [1, 2]. ๊ธฐ์กด์˜ ๊ธฐ์ˆ ์  ํŒŒ์ผ ๋‹จ์œ„ ๋ถ„๋ฆฌ์—์„œ ๋ฒ—์–ด๋‚˜, ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ๊ณผ ๊ธฐ๋Šฅ(Feature-Based)์„ ์ค‘์‹ฌ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๊ตฌ์„ฑํ•˜์—ฌ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ณ  ์‘์ง‘๋„๋ฅผ ๋†’์ด๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•œ๋‹ค [3-5]. ์ด๋ฅผ ํ†ตํ•ด ๋ฌด๋ถ„๋ณ„ํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์˜ UI ๋ˆ„์ˆ˜๋ฅผ ๋ง‰๊ณ  ๋ช…ํ™•ํ•œ ์ƒํƒœ ์†Œ์œ ๊ถŒ์„ ํ™•๋ฆฝํ•˜๋ฉฐ, ํŒ€๊ณผ ์ฝ”๋“œ๋ฒ ์ด์Šค๊ฐ€ ์„ฑ์žฅํ•จ์— ๋”ฐ๋ผ ์‹œ์Šคํ…œ์ด ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š”๋‹ค [6-8]. + +## ๐Ÿ“– Core Content + +* **ํด๋” ๊ตฌ์กฐ์™€ ๋ชจ๋“ˆํ™”์˜ ์ง„ํ™”**: ๊ณผ๊ฑฐ์—๋Š” ์ปดํฌ๋„ŒํŠธ, ํ›…, ์Šคํƒ€์ผ ๋“ฑ์„ ํŒŒ์ผ ์œ ํ˜•๋ณ„๋กœ ๊ทธ๋ฃนํ™”ํ–ˆ์œผ๋‚˜, ํ”„๋กœ์ ํŠธ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ๋…ผ๋ฆฌ์  ๊ธฐ๋Šฅ์ด ํŒŒํŽธํ™”๋˜์–ด ํƒ์ƒ‰๊ณผ ํ™•์žฅ์ด ์–ด๋ ค์› ๋‹ค [4, 9]. 2025๋…„ ๊ธฐ์ค€ ํ”„๋ก ํŠธ์—”๋“œ ์—…๊ณ„ ํ‘œ์ค€์€ ๋น„์ฆˆ๋‹ˆ์Šค ๊ธฐ๋Šฅ์„ ์ค‘์‹ฌ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๋ฌถ๋Š” '๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜(Feature-Based)' ๊ตฌ์กฐ๋กœ ์ „ํ™˜๋˜์—ˆ๋‹ค [5, 10]. ํŠน์ • ๊ธฐ๋Šฅ๊ณผ ๊ด€๋ จ๋œ ์ปดํฌ๋„ŒํŠธ, ํ›…, API ๋กœ์ง ๋“ฑ์„ ๋‹จ์ผ ๋””๋ ‰ํ† ๋ฆฌ์— ์บก์Аํ™”ํ•จ์œผ๋กœ์จ ๋ชจ๋“ˆ์˜ ๋…๋ฆฝ์„ฑ๊ณผ ํ™•์žฅ์„ฑ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚จ๋‹ค [11, 12]. +* **๊ธฐ๋Šฅ ๋ถ„ํ•  ์„ค๊ณ„ (Feature-Sliced Design, FSD)**: FSD๋Š” ๋„๋ฉ”์ธ ์ฃผ๋„ ์„ค๊ณ„(DDD)์™€ ๋ชจ๋“ˆํ˜• ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ฒฐํ•ฉํ•œ ํ”„๋ก ํŠธ์—”๋“œ ์ „์šฉ ๋ฐฉ๋ฒ•๋ก ์ด๋‹ค [3, 13]. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ `app`, `pages`, `widgets`, `features`, `entities`, `shared`์˜ ๊ณ„์ธต(Layer)์œผ๋กœ ๋‚˜๋ˆ„๊ณ , ์ƒ์œ„ ๊ณ„์ธต์€ ํ•˜์œ„ ๊ณ„์ธต์—๋งŒ ์˜์กดํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์—„๊ฒฉํ•œ '๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ' ๊ทœ์น™์„ ๊ฐ•์ œํ•œ๋‹ค [11, 14, 15]. ๊ฐ ์Šฌ๋ผ์ด์Šค๋Š” `index.ts` ํ˜•ํƒœ์˜ 'Public API'๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์™ธ๋ถ€์— ๊ธฐ๋Šฅ๊ณผ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋…ธ์ถœํ•˜์—ฌ ๋‚ด๋ถ€ ๊ตฌํ˜„์„ ์•ˆ์ „ํ•˜๊ฒŒ ์บก์Аํ™”ํ•œ๋‹ค [16-18]. +* **์ƒํƒœ ๊ด€๋ฆฌ ์•„ํ‚คํ…์ฒ˜์˜ ์„ธ๋ถ„ํ™”**: ๋‹จ์ผ ๋ชจ๋†€๋ฆฌ์‹ ์Šคํ† ์–ด(์˜ˆ: ๋Œ€๊ทœ๋ชจ Redux)์— ์˜์กดํ•˜๋˜ ๋ฐฉ์‹์—์„œ ๋ฒ—์–ด๋‚˜, ๋ฐ์ดํ„ฐ์˜ ์„ฑ๊ฒฉ์— ๋”ฐ๋ผ ์ตœ์ ์˜ ๋„๊ตฌ๋ฅผ ์„ ํƒํ•˜๋„๋ก ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ํŒŒํŽธํ™”๋˜์—ˆ๋‹ค [19, 20]. ์„œ๋ฒ„์—์„œ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐ์ดํ„ฐ์ธ '์„œ๋ฒ„ ์ƒํƒœ'๋Š” TanStack Query(React Query)๋ฅผ ์ด์šฉํ•ด ์บ์‹ฑ ๋ฐ ๋„คํŠธ์›Œํฌ ๋กœ์ง์„ ๊ฒฉ๋ฆฌํ•˜๊ณ , ํ…Œ๋งˆ๋‚˜ ์„ค์ • ๋“ฑ ์ •์ ์ธ '์ „์—ญ ์ƒํƒœ'๋Š” Context API๋กœ, ์žฅ๋ฐ”๊ตฌ๋‹ˆ๋‚˜ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ์ฒ˜๋Ÿผ ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ณ€ํ•˜๋Š” ์ƒํƒœ๋Š” Zustand๋‚˜ Jotai ๋“ฑ ์„ ํƒ์  ๋ Œ๋”๋ง์„ ์ง€์›ํ•˜๋Š” ๋„๊ตฌ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค [20-24]. +* **์†Œํ”„ํŠธ์›จ์–ด ๊ณตํ•™ ์›์น™์˜ ์ ์šฉ (SOLID & Clean Code)**: React์˜ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ ๊ฐœ๋ฐœ์—๋„ ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)์„ ์ ์šฉํ•˜์—ฌ, ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ปค์ง€๋ฉด ์ƒํƒœ ๊ด€๋ฆฌ, ๋ฐ์ดํ„ฐ ํŽ˜์นญ, ๋ Œ๋”๋ง ๋“ฑ ๊ฐ๊ธฐ ๋‹ค๋ฅธ ์ฑ…์ž„์„ ๊ฐ€์ง„ ์ž‘์€ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ถ„๋ฆฌํ•ด์•ผ ํ•œ๋‹ค [25, 26]. ์ค‘๋ณต์„ ํ”ผํ•˜๋Š” DRY ์›์น™์„ ํ†ตํ•ด ๊ณตํ†ต ๋กœ์ง์„ ์ปค์Šคํ…€ ํ›…์œผ๋กœ ์ถ”์ถœํ•˜๋ฉด์„œ๋„, ์ฝ”๋“œ๋ฅผ ๋‹จ์ˆœํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋Š” KISS ์›์น™๊ณผ ๋ฏธ๋ž˜๋ฅผ ์œ„ํ•œ ๊ณผ๋„ํ•œ ์ตœ์ ํ™”๋ฅผ ํ”ผํ•˜๋Š” YAGNI ์›์น™ ๊ฐ„์˜ ๊ท ํ˜•์„ ๋งž์ถ”๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ด๋‹ค [27, 28]. +* **๋ช…๋ช… ๊ทœ์น™๊ณผ ๊ฑฐ๋ฒ„๋„Œ์Šค ๋„๊ตฌ**: ํด๋”์™€ ํŒŒ์ผ ์‹œ์Šคํ…œ์€ OS ํ™˜๊ฒฝ์— ๋”ฐ๋ฅธ ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด `kebab-case`๋ฅผ, React ์ปดํฌ๋„ŒํŠธ๋Š” `PascalCase`๋ฅผ, ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜๋Š” `camelCase`๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ณดํŽธ์ ์ธ ์ปจ๋ฒค์…˜์ด๋‹ค [29-33]. ์ด๋Ÿฌํ•œ ๊ทœ์น™๊ณผ ์•„ํ‚คํ…์ฒ˜ ์˜์กด์„ฑ ๊ฒฝ๊ณ„๋Š” ESLint๋‚˜ Prettier, Husky์™€ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•ด ๋นŒ๋“œ ํƒ€์ž„ ๋ฐ ์ปค๋ฐ‹ ๋‹จ๊ณ„์—์„œ ์ž๋™์œผ๋กœ ๊ฐ•์ œ(Linting)๋œ๋‹ค [30, 34]. + +## โš–๏ธ Trade-offs & Caveats + +* **FSD ๋ฐ ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ๋ชจ๋“ˆํ™”์˜ ๋ณต์žก์„ฑ ์˜ค๋ฒ„ํ—ค๋“œ**: Feature-Sliced Design์€ ๊ตฌ์กฐ์  ์•ˆ์ •์„ฑ์„ ์ œ๊ณตํ•˜์ง€๋งŒ "๋ฌด์—‡์ด ํ•˜๋‚˜์˜ ๊ธฐ๋Šฅ(Feature)์ธ๊ฐ€?"๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒฝ๊ณ„๋ฅผ ์„ค์ •ํ•˜๊ธฐ ๋งค์šฐ ๊นŒ๋‹ค๋กญ๋‹ค๋Š” ๊ทผ๋ณธ์  ์–ด๋ ค์›€์ด ์žˆ๋‹ค [35]. ์ธ์ฆ(Auth)๊ณผ ๊ฐ™์€ ๊ต์ฐจ ๊ด€์‹ฌ์‚ฌ(Cross-cutting concern)๋Š” ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ์— ๊ฑธ์ณ ์žˆ์–ด ์ ์ ˆํ•œ ๊ณ„์ธต์„ ์ฐพ๊ธฐ ๋ชจํ˜ธํ•˜๋ฉฐ [35, 36], ์—„๊ฒฉํ•œ ๋ถ„ํ•  ๊ทœ์น™์„ ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์— ๋„์ž…ํ•˜๋ฉด ์˜คํžˆ๋ ค ๋ถˆํ•„์š”ํ•œ ํด๋” ๊ตฌ์กฐ์™€ ์˜ค๋ฒ„์—”์ง€๋‹ˆ์–ด๋ง์œผ๋กœ ์ธํ•œ ๊ฐœ๋ฐœ ์†๋„ ์ €ํ•˜๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ๋‹ค [12, 37]. ๋˜ํ•œ, ๊ทœ์น™์„ ์ œ๋Œ€๋กœ ์ˆ™์ง€ํ•˜์ง€ ์•Š์œผ๋ฉด ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ 'Shared' ๊ณ„์ธต์— ์Ÿ์•„๋ถ€์–ด ์ตœ์•…์˜ ํŒŒ๊ธ‰ ํšจ๊ณผ๋ฅผ ๋‚ณ๋Š” ์ŠคํŒŒ๊ฒŒํ‹ฐ ์ฝ”๋“œ๊ฐ€ ๋  ์œ„ํ—˜์ด ์กด์žฌํ•œ๋‹ค [38, 39]. +* **์ถ”์ƒํ™”(DRY)์™€ ๋‹จ์ˆœํ•จ(KISS)์˜ ์ƒ์ถฉ**: DRY ์›์น™์— ์ง‘์ฐฉํ•˜์—ฌ ์ฝ”๋“œ ์ค‘๋ณต์„ ๋ฌด์กฐ๊ฑด ํ”ผํ•˜๋ ค๊ณ  ํ•˜๋ฉด, ์ˆ˜๋งŽ์€ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ์™€ ๋ถ„๊ธฐ๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฑฐ๋Œ€ํ•˜๊ณ  ๋ณต์žกํ•œ ์ปค์Šคํ…€ ํ›…์ด๋‚˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํƒ„์ƒํ•˜๊ฒŒ ๋œ๋‹ค [27]. ์ด๋Ÿฌํ•œ ๊ณผ๋„ํ•œ ์ถ”์ƒํ™”๋Š” ๋‹จ์ˆœํ•œ ์ฝ”๋“œ ๋ฐ˜๋ณต๋ณด๋‹ค ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋–จ์–ด๋œจ๋ ค KISS ์›์น™์„ ์œ„๋ฐ˜ํ•˜๋Š” ๋ฐ˜๋Œ€ ๊ธ‰๋ถ€๋ฅผ ๋‚ณ์œผ๋ฏ€๋กœ, ๋ช…ํ™•ํ•œ ํŒจํ„ด์ด 3๋ฒˆ ์ด์ƒ ๋ฐ˜๋ณต๋  ๋•Œ๊นŒ์ง€๋Š” ์ถ”์ƒํ™”๋ฅผ ๋ฏธ๋ฃจ๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋œ๋‹ค [27, 40, 41]. +* **์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ ์„ ํƒ์— ๋”ฐ๋ฅธ ๋ถ€์ž‘์šฉ**: React ๋‚ด์žฅ Context API๋Š” ์™ธ๋ถ€ ์˜์กด์„ฑ ์—†์ด ์ƒํƒœ๋ฅผ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ƒํƒœ๊ฐ’์˜ ์ผ๋ถ€๋งŒ ๋ณ€๊ฒฝ๋˜์–ด๋„ ํ•ด๋‹น ์ปจํ…์ŠคํŠธ๋ฅผ ๊ตฌ๋…ํ•˜๋Š” ๋ชจ๋“  ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ฐ•์ œ๋กœ ๋ฆฌ๋ Œ๋”๋ง๋œ๋‹ค๋Š” ์น˜๋ช…์ ์ธ ์„ฑ๋Šฅ ์ œ์•ฝ์ด ์žˆ๋‹ค [42, 43]. ๋ฐ˜๋Œ€๋กœ Redux๋Š” ๋ช…ํ™•ํ•œ ๊ตฌ์กฐ์™€ ๊ฐ•๋ ฅํ•œ ๋””๋ฒ„๊น… ํˆด์„ ์ œ๊ณตํ•˜์ง€๋งŒ, ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ์˜ ํญ๋ฐœ์  ์ฆ๊ฐ€๋ฅผ ๋™๋ฐ˜ํ•˜์—ฌ ์†Œ๊ทœ๋ชจ ํŒ€์ด๋‚˜ ๊ฐ„๋‹จํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ๊ณผ๋„ํ•œ ๊ธฐ์ˆ  ๋ถ€์ฑ„๋กœ ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๋‹ค [44, 45]. +* **์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์˜ ์ˆจ์€ ๋น„์šฉ**: `React.memo`, `useMemo`, `useCallback`์€ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ง‰์•„์ฃผ์ง€๋งŒ ๊ทธ ์ž์ฒด๊ฐ€ ๊ณต์งœ๋Š” ์•„๋‹ˆ๋‹ค [46]. ์ด์ „ Props๋‚˜ ์˜์กด์„ฑ ๋ฐฐ์—ด์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜๊ณ  ๋ณ€๊ฒฝ ์—ฌ๋ถ€๋ฅผ ์–•์€ ๋น„๊ต(Shallow compare)ํ•˜๋Š” ์—ฐ์‚ฐ ๋น„์šฉ์ด ์ถ”๊ฐ€๋œ๋‹ค [46]. ๋งŒ์•ฝ ๋ Œ๋”๋ง ๋น„์šฉ์ด ๋งค์šฐ ์‹ผ ์ปดํฌ๋„ŒํŠธ์— ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋ถˆ์•ˆ์ •ํ•œ ์ฐธ์กฐ๊ฐ’(์ธ๋ผ์ธ ํ•จ์ˆ˜, ๊ฐ์ฒด)์„ ์ง€์†์ ์œผ๋กœ ์ „๋‹ฌํ•˜์—ฌ ๋ฆฌ๋ Œ๋”๋ง ์ฐจ๋‹จ์— ์‹คํŒจํ•œ๋‹ค๋ฉด, ์ตœ์ ํ™” ์ฝ”๋“œ ์ž์ฒด๊ฐ€ ์˜คํžˆ๋ ค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋” ๋А๋ฆฌ๊ฒŒ ๋งŒ๋“œ๋Š” ๋ถ€์ž‘์šฉ์ด ๋ฐœ์ƒํ•œ๋‹ค [46, 47]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [์•„ํ‚คํ…์ฒ˜ ๋ฐ ๋””์ž์ธ ํŒจํ„ด] +- [[Feature-Sliced Design]] + - ์—ฐ๊ฒฐ ์ด์œ : ํ˜„๋Œ€ React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ชจ๋“ˆํ™” ๋ฐ ๊ณ„์ธตํ™”๋ฅผ ์œ„ํ•ด ๊ณ ์•ˆ๋œ ๊ฐ€์žฅ ๋Œ€ํ‘œ์ ์ด๊ณ  ๊ตฌ์ฒด์ ์ธ ํ”„๋ก ํŠธ์—”๋“œ ์•„ํ‚คํ…์ฒ˜ ๋ฐฉ๋ฒ•๋ก ์ด๊ธฐ ๋•Œ๋ฌธ [3, 13]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋„๋ฉ”์ธ ๊ธฐ๋ฐ˜ ๋ถ„ํ• , ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ๊ทœ์น™ ์ ์šฉ ๋ฐฉ๋ฒ•, ๊ทธ๋ฆฌ๊ณ  Public API๋ฅผ ํ†ตํ•œ ์ปดํฌ๋„ŒํŠธ์˜ ์บก์Аํ™” ์›๋ฆฌ [14, 16, 17]. +- [[SOLID Principles]] + - ์—ฐ๊ฒฐ ์ด์œ : ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ํ”„๋ก ํŠธ์—”๋“œ ๊ตฌ์กฐ๋ฅผ ์งœ๊ธฐ ์œ„ํ•ด ํด๋ž˜์Šค ๊ธฐ๋ฐ˜ OOP๋ฅผ ๋„˜์–ด React์˜ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—๋„ ์ ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ทผ๋ณธ์ ์ธ ์†Œํ”„ํŠธ์›จ์–ด ์„ค๊ณ„ ์›์น™์ด๊ธฐ ๋•Œ๋ฌธ [17, 48]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)์„ ์ด์šฉํ•œ ๋น„๋Œ€ํ•ด์ง„ ์ปดํฌ๋„ŒํŠธ์˜ ๋ฆฌํŒฉํ† ๋ง ๋ฐฉ์‹ ๋ฐ ๊ฐœ๋ฐฉ-ํ์‡„ ์›์น™(OCP)์„ ํ™œ์šฉํ•œ UI ์ปดํฌ๋„ŒํŠธ ํ•ฉ์„ฑ(Composition) ์ „๋žต [25, 49]. + +#### [์ƒํƒœ ๊ด€๋ฆฌ ๋ฐ ์ตœ์ ํ™” ์ „๋žต] +- [[State Management]] + - ์—ฐ๊ฒฐ ์ด์œ : ์•„ํ‚คํ…์ฒ˜ ๋‚ด์—์„œ ๋ฐ์ดํ„ฐ(์„œ๋ฒ„ ๋ฐ์ดํ„ฐ, ๋กœ์ปฌ ์ƒํƒœ, ์ „์—ญ UI ์ƒํƒœ)์˜ ์„ฑ๊ฒฉ์— ๋”ฐ๋ผ ์ฑ…์ž„๊ณผ ์ €์žฅ์†Œ๋ฅผ ์–ด๋–ป๊ฒŒ ๋‚˜๋ˆŒ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ํ•ต์‹ฌ ๋ถ„์•ผ์ด๊ธฐ ๋•Œ๋ฌธ [20, 50]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Context API์˜ ๋ Œ๋”๋ง ํ•œ๊ณ„๋ฅผ ๋ŒํŒŒํ•˜๊ธฐ ์œ„ํ•œ Zustand/Jotai์˜ Selector ํŒจํ„ด ์ž‘๋™ ์›๋ฆฌ ๋ฐ TanStack Query๋ฅผ ํ™œ์šฉํ•œ ์„œ๋ฒ„ ์ƒํƒœ ๊ฒฉ๋ฆฌ ๊ธฐ๋ฒ• [21, 43, 51]. +- [[Performance Optimization]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋Œ€๊ทœ๋ชจ ์•„ํ‚คํ…์ฒ˜๊ฐ€ ์‹ค์ œ๋กœ ์‚ฌ์šฉ์ž ๋ธŒ๋ผ์šฐ์ €์—์„œ ํšจ์œจ์ ์œผ๋กœ ๋™์ž‘ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์ˆ˜์ ์œผ๋กœ ์ˆ˜๋ฐ˜๋˜์–ด์•ผ ํ•˜๋Š” ์„ฑ๋Šฅ ์ง€ํ‘œ(Web Vitals) ๊ด€๋ฆฌ ๋ฐฉ๋ฒ•์ด๊ธฐ ๋•Œ๋ฌธ [52, 53]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ง€์—ฐ ๋กœ๋”ฉ(Lazy Loading) ๋ฐ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…์„ ํ†ตํ•œ ์ดˆ๊ธฐ ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ ์ตœ์ ํ™”, ๊ทธ๋ฆฌ๊ณ  ๋™์‹œ์„ฑ ๋ Œ๋”๋ง(Concurrent Rendering) ํ›…์˜ ํ™œ์šฉ๋ฒ• [54-56]. + +### Deeper Research Questions +- Feature-Sliced Design(FSD)์—์„œ ์ธ์ฆ(Auth)์ด๋‚˜ ๋ถ„์„(Analytics) ๊ฐ™์€ ๋„๋ฉ”์ธ ๊ฐ„์˜ ๊ต์ฐจ ๊ด€์‹ฌ์‚ฌ(Cross-cutting concerns)๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ, ๊ฒฐํ•ฉ๋„๋ฅผ ๋†’์ด์ง€ ์•Š๊ณ  ์ฃผ์ž…/๊ณต์œ ํ•˜๋Š” ๊ฐ€์žฅ ์ด์ƒ์ ์ธ ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? +- React Compiler๊ฐ€ ํ”„๋กœ์ ํŠธ์— ์„ฑ๊ณต์ ์œผ๋กœ ๋„์ž…๋˜์–ด ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๋กœ์ง(`useMemo`, `useCallback`)์ด ๋Œ€๊ฑฐ ์‚ญ์ œ๋  ๋•Œ, ํ”„๋ก ํŠธ์—”๋“œ ํด๋” ๊ตฌ์กฐ์™€ ์ฝ”๋“œ ์‘์ง‘๋„์— ์–ด๋–ค ํ˜•ํƒœ์˜ ๊ตฌ์กฐ์  ๋ณ€ํ™”๊ฐ€ ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- ์„œ๋ฒ„ ์ƒํƒœ(Server State) ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํด๋ผ์ด์–ธํŠธ ๊ธ€๋กœ๋ฒŒ ์ƒํƒœ(Client State) ๋„๊ตฌ๋ฅผ ์™„๋ฒฝํžˆ ๋ถ„๋ฆฌํ•œ ์•„ํ‚คํ…์ฒ˜์—์„œ, ๋‘ ์ƒํƒœ๊ฐ€ ๋ถˆ๊ฐ€ํ”ผํ•˜๊ฒŒ ๋™๊ธฐํ™”๋˜๊ฑฐ๋‚˜ ์ƒํ˜ธ์ž‘์šฉํ•ด์•ผ ํ•˜๋Š” ์—ฃ์ง€ ์ผ€์ด์Šค๋ฅผ ๊นจ๋—ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š” ํŒจํ„ด์€ ๋ฌด์—‡์ธ๊ฐ€? +- ๋Œ€๊ทœ๋ชจ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ํ™˜๊ฒฝ์—์„œ Micro-Frontends ์•„ํ‚คํ…์ฒ˜์™€ Feature-Sliced Design์€ ์–ด๋–ป๊ฒŒ ํ˜ธํ™˜๋˜๋ฉฐ, ๊ฐ ๋…๋ฆฝ ์„œ๋น„์Šค ๊ฐ„์˜ ์ค‘๋ณต ์ฝ”๋“œ(Shared ๋ ˆ์ด์–ด) ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ํ†ต์ œํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- ๋ณต์žก๋„ ๋†’์€ ์ˆœ์ˆ˜ ํ•จ์ˆ˜ํ˜• React ์ปดํฌ๋„ŒํŠธ์— ์˜์กด์„ฑ ์—ญ์ „ ์›์น™(DIP)์„ ์ ์šฉํ•  ๋•Œ, ์ปจํ…์ŠคํŠธ(Context API)๋‚˜ ํ”„๋กญ ๋“œ๋ฆด๋ง(Prop Drilling)์„ ํ”ผํ•˜๋ฉด์„œ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ˜„๋Œ€์ ์ธ ์ œ์–ด ์—ญ์ „(IoC) ๊ตฌํ˜„ ํŒจํ„ด์€ ๋ฌด์—‡์ด ์žˆ๋Š”๊ฐ€? + +### Practical Application Contexts + +- **Implementation:** ๊ธฐ์ˆ ์  ํŒŒ์ผ ์œ ํ˜•(์ปดํฌ๋„ŒํŠธ, ํ›…) ์ค‘์‹ฌ์˜ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ์—์„œ ๋ฒ—์–ด๋‚˜, `src/features/` ๋‚ด์— ํŠน์ • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง(์˜ˆ: ์žฅ๋ฐ”๊ตฌ๋‹ˆ, ์œ ์ € ํ”„๋กœํ•„)์— ์—ฐ๊ด€๋œ UI, API ํ†ต์‹ , ๋กœ์ปฌ ํ›…์„ ์บก์Аํ™”ํ•˜์—ฌ ๊ตฌํ˜„ํ•œ๋‹ค [5, 11, 57]. +- **System Design:** ๋ชจ๋†€๋ฆฌ์‹ ๊ธ€๋กœ๋ฒŒ ์Šคํ† ์–ด ์„ค๊ณ„ ์ง€์–‘. API ์บ์‹ฑ ๋ฐ ์„œ๋ฒ„ ๋ฐ์ดํ„ฐ๋Š” TanStack Query๋ฅผ ์‚ฌ์šฉํ•ด ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๊ฒฝ๊ณ„๋กœ ๋ถ„๋ฆฌํ•˜๊ณ , ๋‹คํฌ ๋ชจ๋“œ ๊ฐ™์€ ์•ฑ ์„ค์ •์€ Context API๋กœ, ์‹ค์‹œ๊ฐ„ UI ์ƒํƒœ ๋ณ€๊ฒฝ์€ Zustand ๋“ฑ์œผ๋กœ ์ชผ๊ฐœ์–ด ์‹œ์Šคํ…œ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ์ตœ์ ํ™”ํ•œ๋‹ค [20, 21, 24]. +- **Operation / Maintenance:** ๋Ÿฐํƒ€์ž„ ํฌ๋ž˜์‹œ์— ๋Œ€๋น„ํ•˜๊ธฐ ์œ„ํ•ด Error Boundary ์ปดํฌ๋„ŒํŠธ๋ฅผ ์•ฑ์˜ ์ตœ์ƒ๋‹จ๋ฟ ์•„๋‹ˆ๋ผ ๋ถˆ์•ˆ์ •ํ•œ ์„œ๋“œํŒŒํ‹ฐ ์œ„์ ฏ์ด๋‚˜ ๊ฐœ๋ณ„ ๋ผ์šฐํŠธ ๋‹จ์œ„์— ๊ฐ์‹ธ, ํŠน์ • ๋ชจ๋“ˆ์˜ ์—๋Ÿฌ๊ฐ€ ์•ฑ ์ „์ฒด์˜ "ํ™”์ดํŠธ ์Šคํฌ๋ฆฐ" ์žฅ์• ๋กœ ๋ฒˆ์ง€๋Š” ๊ฒƒ์„ ์ฐจ๋‹จํ•œ๋‹ค [58-60]. +- **Learning Path:** React ๊ธฐ์ดˆ ๋ฌธ๋ฒ• ๋ฐ ๋ Œ๋”๋ง ์›๋ฆฌ ํŒŒ์•… -> ์ปดํฌ๋„ŒํŠธ ์žฌ์‚ฌ์šฉ๊ณผ SRP ์›์น™(SOLID) ํ•™์Šต -> ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ํด๋” ๊ตฌ์กฐ ๋ฐ FSD ์ ์šฉ ๋ฐฉ์‹ ์ดํ•ด -> ๋ฒˆ๋“ค ์ตœ์ ํ™” ๋ฐ ๋ Œ๋”๋ง ๋ฆฌํŒฉํ† ๋ง ์Šคํ‚ฌ ํ–ฅ์ƒ์˜ ํ๋ฆ„์œผ๋กœ ์—ญ๋Ÿ‰์„ ๋ฐœ์ „์‹œํ‚จ๋‹ค [6, 17, 25]. +- **My Project Relevance:** ๊ธฐ์กด ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ `components/` ํด๋”์— ์ˆ˜์‹ญ ๊ฐœ์˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฐฉ์น˜๋˜์–ด ์žˆ๊ฑฐ๋‚˜, `useCallback` ๋“ฑ์ด ๊ณผ๋„ํ•˜๊ฒŒ ์‚ฌ์šฉ๋œ ๊ฒฝ์šฐ, ์ด๋ฅผ ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ ๋‹จ์œ„์˜ ํด๋”๋กœ ์žฌ๋ฐฐ์น˜ํ•˜๊ณ  ํ”„๋กœํŒŒ์ผ๋Ÿฌ(Profiler)๋ฅผ ํ†ตํ•ด ์‹ค์ œ ๋ณ‘๋ชฉ ์ง€์ ์„ ์ธก์ •ํ•œ ๋’ค ์ตœ์ ํ™”๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜ ๋ฆฌํŒฉํ† ๋ง์— ์ง๊ฒฐ๋œ๋‹ค [12, 61, 62]. + +### Adjacent Topics + +- [[Micro-Frontends]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋‹จ์ผ React SPA ์•„ํ‚คํ…์ฒ˜์˜ ํ•œ๊ณ„๋ฅผ ๋„˜์–ด, ๋…๋ฆฝ์ ์œผ๋กœ ๋ฐฐํฌ ๋ฐ ๊ด€๋ฆฌ ๊ฐ€๋Šฅํ•œ ์—ฌ๋Ÿฌ ํ”„๋ก ํŠธ์—”๋“œ ํŒ€๊ณผ ์„œ๋น„์Šค๋ฅผ ํ•˜๋‚˜๋กœ ์กฐ์œจํ•˜๋Š” ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ๊ธ‰ ์ธํ”„๋ผ ํ™•์žฅ ๊ด€์ ์œผ๋กœ ์—ฐ๊ฒฐ [3, 63]. +- [[Observability and Monitoring]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ์„ค๊ณ„ํ•œ ์•„ํ‚คํ…์ฒ˜๊ฐ€ ์‹ค์ œ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๊ณ  ์–ด๋””์„œ ๋ณ‘๋ชฉ์„ ์ผ์œผํ‚ค๋Š”์ง€ ์ธก์ •ํ•˜๊ธฐ ์œ„ํ•œ ๊ตฌ์กฐ์  ๋กœ๊น…, ์„ฑ๋Šฅ ํ”„๋กœํŒŒ์ผ๋ง(Web Vitals), ๊ทธ๋ฆฌ๊ณ  Sentry๋ฅผ ํ™œ์šฉํ•œ ์„ธ์…˜ ๋ชจ๋‹ˆํ„ฐ๋ง ๊ธฐ๋ฒ•์œผ๋กœ ํ™•์žฅ [64-66]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/React Scalability.md b/00_Raw/React Scalability.md new file mode 100644 index 00000000..6bd3e18d --- /dev/null +++ b/00_Raw/React Scalability.md @@ -0,0 +1,67 @@ +# [[React Scalability]] + +## ๐Ÿ“Œ Brief Summary +React Scalability(React ํ™•์žฅ์„ฑ)๋Š” ๊ธฐ๋Šฅ, ํŒ€ ๊ทœ๋ชจ, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์˜ ๋ณต์žก์„ฑ์ด ์ฆ๊ฐ€ํ•จ์— ๋”ฐ๋ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ, ์œ ์ง€๋ณด์ˆ˜์„ฑ, ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ์„ฑ์žฅ์„ ์œ ์ง€ํ•˜๋Š” ๋Šฅ๋ ฅ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋‹จ์ˆœํžˆ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ๊ฒƒ์„ ๋„˜์–ด, ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ณ  ์‘์ง‘๋„๋ฅผ ๋†’์ด๋Š” ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„, ์ƒํƒœ ๊ด€๋ฆฌ์˜ ์ตœ์ ํ™”, ๊ทธ๋ฆฌ๊ณ  ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…๊ณผ ๋ Œ๋”๋ง ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ํฌ๊ด„ํ•ฉ๋‹ˆ๋‹ค. ํ™•์žฅ ๊ฐ€๋Šฅํ•œ React ์‹œ์Šคํ…œ์€ ๋ช…ํ™•ํ•œ ํด๋” ๊ตฌ์กฐ(์˜ˆ: Feature-Sliced Design)์™€ ์—„๊ฒฉํ•œ ๊ด€์‹ฌ์‚ฌ ๋ถ„๋ฆฌ๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ๋ฒ ์ด์Šค๊ฐ€ ์ž์ฒด์ ์ธ ๋ฌด๊ฒŒ๋กœ ์ธํ•ด ๋ถ•๊ดด๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. [1-4] + +## ๐Ÿ“– Core Content +- **์•„ํ‚คํ…์ฒ˜ ๋ฐ ํด๋” ๊ตฌ์กฐ์˜ ์ง„ํ™”:** React๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ฐ•์ œํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ํ”„๋กœ์ ํŠธ๊ฐ€ ์ปค์ง€๋ฉด ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด UI์— ์Šค๋ฉฐ๋“ค๊ณ  ์˜์กด์„ฑ์ด ์—‰ํ‚ค๋Š” ์•„ํ‚คํ…์ฒ˜ ๋ถ•๊ดด๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค [2]. ๊ณผ๊ฑฐ์˜ ํŒŒ์ผ ์œ ํ˜•๋ณ„ ํด๋” ๊ตฌ์กฐ(components, hooks, styles ๋“ฑ)๋Š” ๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค [5, 6]. ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•ด์„œ๋Š” ๋„๋ฉ”์ธ/๊ธฐ๋Šฅ ์ค‘์‹ฌ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” Feature-Based ๊ตฌ์กฐ ๋˜๋Š” **Feature-Sliced Design(FSD)**๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•๋ก ์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค. FSD๋Š” ์•ฑ์„ layers(app, pages, widgets, features, entities, shared)๋กœ ๋‚˜๋ˆ„๊ณ  ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ๊ทœ์น™๊ณผ ํผ๋ธ”๋ฆญ API ์บก์Аํ™”๋ฅผ ๊ฐ•์ œํ•˜์—ฌ ๋ชจ๋“ˆ์˜ ๋…๋ฆฝ์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค [7-11]. +- **ํด๋ฆฐ ์ฝ”๋“œ์™€ ์†Œํ”„ํŠธ์›จ์–ด ์—”์ง€๋‹ˆ์–ด๋ง ์›์น™:** ๋Œ€๊ทœ๋ชจ React ์‹œ์Šคํ…œ์—์„œ๋Š” SOLID, DRY, KISS, YAGNI์™€ ๊ฐ™์€ ์›์น™์ด ์ ์šฉ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)์— ๋”ฐ๋ผ ๊ฑฐ๋Œ€ํ•œ ์ปดํฌ๋„ŒํŠธ๋Š” ์ž‘๊ณ  ์ง‘์ค‘๋œ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ถ„๋ฆฌ๋˜์–ด์•ผ ํ•˜๋ฉฐ [12], DRY ์›์น™์„ ํ†ตํ•ด ๊ณตํ†ต ๋กœ์ง์€ ์ปค์Šคํ…€ ํ›…์œผ๋กœ ์ถ”์ถœํ•˜์—ฌ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค [13]. ๋”๋ถˆ์–ด ํŒŒ์ผ ๋ฐ ์ปดํฌ๋„ŒํŠธ ๋ช…๋ช… ๊ทœ์น™(์˜ˆ: ํŒŒ์ผ์€ kebab-case, ์ปดํฌ๋„ŒํŠธ๋Š” PascalCase)์„ ์ผ๊ด€๋˜๊ฒŒ ์œ ์ง€ํ•˜๊ณ  ESLint๋ฅผ ํ†ตํ•ด ์•„ํ‚คํ…์ฒ˜ ๊ฒฝ๊ณ„๋ฅผ ๊ฐ•์ œํ•˜๋Š” ๊ฒƒ์ด ๋Œ€๊ทœ๋ชจ ํŒ€ ํ˜‘์—…์— ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค [14, 15]. +- **๊ทœ๋ชจ์— ๋”ฐ๋ฅธ ์ƒํƒœ ๊ด€๋ฆฌ ์ „๋žต:** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ปค์ง€๋ฉด ๋‹จ์ผ ์ „์—ญ ์ƒํƒœ๋งŒ์œผ๋กœ๋Š” ๋ถ€์กฑํ•˜๋ฉฐ ์ƒํƒœ์˜ ์—ญํ• ์— ๋”ฐ๋ผ ๋„๊ตฌ๊ฐ€ ๋ถ„๋ฆฌ๋ฉ๋‹ˆ๋‹ค [16]. React์˜ Context API๋Š” ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ ์ „์ฒด๋ฅผ ๋ฆฌ๋ Œ๋”๋ง์‹œํ‚ค๋ฏ€๋กœ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žฆ์€ ์ƒํƒœ ๊ด€๋ฆฌ์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค [17, 18]. ์ค‘๊ฐ„ ๊ทœ๋ชจ์˜ ์•ฑ์—์„œ๋Š” Selector ํŒจํ„ด์„ ํ†ตํ•ด ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ง‰๋Š” Zustand๊ฐ€ ์œ ์šฉํ•˜๋ฉฐ [19-21], 500๊ฐœ ์ด์ƒ์˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žˆ๋Š” ๋Œ€๊ทœ๋ชจ ์•ฑ์ด๋‚˜ ๋น„๋™๊ธฐ ์ž‘์—…์ด ๋ณต์žกํ•œ ๊ฒฝ์šฐ ์ผ๊ด€๋œ ํŒจํ„ด๊ณผ ๊ฐ•๋ ฅํ•œ ๋””๋ฒ„๊น…์„ ์ œ๊ณตํ•˜๋Š” Redux๊ฐ€ ์‚ฐ์—… ํ‘œ์ค€์œผ๋กœ ์ž‘์šฉํ•ฉ๋‹ˆ๋‹ค [22, 23]. ์„œ๋ฒ„ ์ƒํƒœ ๊ด€๋ฆฌ๋Š” TanStack Query(React Query) ๋“ฑ์œผ๋กœ ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ์™€ ๋ถ„๋ฆฌํ•˜์—ฌ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค [20, 24]. +- **์„ฑ๋Šฅ ์—”์ง€๋‹ˆ์–ด๋ง (Performance Optimization):** ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์•ฑ์€ ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ๊ณผ ๋กœ๋”ฉ ์†๋„ ์ตœ์ ํ™”๊ฐ€ ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค. `React.lazy`์™€ ๋™์  ์ž„ํฌํŠธ(Dynamic Imports)๋ฅผ ํ™œ์šฉํ•œ ๋ผ์šฐํŠธ ๋ฐ ์ปดํฌ๋„ŒํŠธ ๋ ˆ๋ฒจ์˜ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…์€ ์ดˆ๊ธฐ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ํš๊ธฐ์ ์œผ๋กœ ์ค„์—ฌ์ค๋‹ˆ๋‹ค [25-27]. ๋˜ํ•œ Vite์˜ `manualChunks`๋ฅผ ์ด์šฉํ•ด ์ž์ฃผ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” Vendor ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ์บ์‹ฑ ํšจ์œจ์„ ๋†’์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค [28-30]. ๋Ÿฐํƒ€์ž„ ์‹œ์—๋Š” ๋Œ€๊ทœ๋ชจ ๋ฆฌ์ŠคํŠธ๋ฅผ ์œ„ํ•œ Virtualization(๊ฐ€์ƒํ™”) ์ฒ˜๋ฆฌ, ์•ˆ์ •์ ์ธ ์ฐธ์กฐ ์œ ์ง€๋ฅผ ์œ„ํ•œ `useCallback`๊ณผ `useMemo` ์‚ฌ์šฉ, ๊ทธ๋ฆฌ๊ณ  React 18์˜ ๋™์‹œ์„ฑ ๊ธฐ๋Šฅ(`useTransition`, `useDeferredValue`)์„ ํ™œ์šฉํ•ด ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์˜ ์‘๋‹ต์„ฑ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค [31-34]. + +## โš–๏ธ Trade-offs & Caveats +- **์•„ํ‚คํ…์ฒ˜์˜ ์˜ค๋ฒ„ํ—ค๋“œ:** Feature-Sliced Design์ด๋‚˜ ๋„๋ฉ”์ธ ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ๋ฅผ ๋„์ž…ํ•˜๋ฉด ์ปดํฌ๋„ŒํŠธ๊ฐ€ '๊ธฐ๋Šฅ'์ธ์ง€ '์œ„์ ฏ'์ธ์ง€ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•œ ์˜๋ฏธ๋ก ์  ๋…ผ์˜๊ฐ€ ํ•„์š”ํ•ด์ง€๋Š” ๋“ฑ ์ดˆ๊ธฐ ํ•™์Šต ๊ณก์„ ๊ณผ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [35, 36]. ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์ด๋Ÿฌํ•œ ๊ตฌ์กฐ๊ฐ€ ์˜คํžˆ๋ ค ๊ณผ๋„ํ•œ ๋ณต์žก์„ฑ(Overkill)์„ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [37]. +- **๋ฉ”๋ชจ์ด์ œ์ด์…˜์˜ ๋น„์šฉ:** `React.memo`, `useMemo`, `useCallback`์„ ๋‚จ์šฉํ•˜๋ฉด ์˜คํžˆ๋ ค ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. React๊ฐ€ ์ด์ „ props๋ฅผ ์ €์žฅํ•˜๊ณ  ๋น„๊ตํ•˜๋Š” ์ž‘์—…์— ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉฐ, ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง ๋น„์šฉ์ด ๋งค์šฐ ์ž‘์€ ๊ฒฝ์šฐ ์ด ๋น„๊ต ์ž‘์—…์ด ๋ Œ๋”๋ง ์ž์ฒด๋ณด๋‹ค ๋” ๋งŽ์€ ๋น„์šฉ์„ ์†Œ๋ชจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [38, 39]. +- **์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ์˜ ์œ ์—ฐ์„ฑ vs ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ:** Zustand์˜ ๊ทน๋‹จ์ ์ธ ์œ ์—ฐ์„ฑ์€ ๊ทœ์œจ ์—†์ด ์‚ฌ์šฉ๋  ๊ฒฝ์šฐ ํŒ€์›๋งˆ๋‹ค ์„œ๋กœ ๋‹ค๋ฅธ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ํŒจํ„ด์„ ์ž‘์„ฑํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๋“ฑ ํ˜ผ๋ž€์„ ์•ผ๊ธฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [19, 40]. ๋ฐ˜๋ฉด Redux๋Š” ์ดˆ๊ธฐ์— ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š” ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ๊ฐ€ ๋งค์šฐ ๋งŽ์•„ ๊ฐœ๋ฐœ ์†๋„๋ฅผ ๋Šฆ์ถ”์ง€๋งŒ, ๋Œ€๊ทœ๋ชจ ํŒ€์—์„œ๋Š” ์˜คํžˆ๋ ค ์ด ๊ตฌ์กฐ๊ฐ€ ๋ฒ„๊ทธ๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ๊ธฐ๋Šฅ์œผ๋กœ ์ž‘์šฉํ•ฉ๋‹ˆ๋‹ค [22, 41]. +- **React Compiler์™€ ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ˜ธํ™˜์„ฑ:** React Compiler๋ฅผ ๋„์ž…ํ•˜๋ฉด ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์˜ ํ•„์š”์„ฑ์„ ํฌ๊ฒŒ ์ค„์ผ ์ˆ˜ ์žˆ์ง€๋งŒ, `useMutation`์ด๋‚˜ `useLocation`์ฒ˜๋Ÿผ ๋ Œ๋”๋ง ์‹œ๋งˆ๋‹ค ์˜๋„์ ์œผ๋กœ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ›…๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์บ์‹ฑ ์ฒด์ธ์ด ๋Š์–ด์ง€๊ณ  ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•˜๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค [42, 43]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] +- [[Feature-Sliced Design]] + - ์—ฐ๊ฒฐ ์ด์œ : React์˜ ํ•œ๊ณ„์ธ ๊ตฌ์ฒด์ ์ธ ์•„ํ‚คํ…์ฒ˜ ๋ถ€์žฌ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์„ค๊ณ„๋œ ๋Œ€๊ทœ๋ชจ ํ”„๋ก ํŠธ์—”๋“œ ๋ฐฉ๋ฒ•๋ก ์ž…๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ ˆ์ด์–ด(Layer) ๊ฐ„์˜ ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ์›์น™๊ณผ Public API๋ฅผ ํ™œ์šฉํ•œ ๋ชจ๋“ˆ์˜ ์บก์Аํ™” ๋ฐ ๊ฒฐํ•ฉ๋„ ์ตœ์†Œํ™” ๋ฐฉ๋ฒ•. +- [[SOLID Principles]] + - ์—ฐ๊ฒฐ ์ด์œ : ํ™•์žฅ ๊ฐ€๋Šฅํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฌ์šด React ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•œ ํ•ต์‹ฌ ์†Œํ”„ํŠธ์›จ์–ด ์—”์ง€๋‹ˆ์–ด๋ง ์›์น™์ž…๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ฑฐ๋Œ€ํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)์— ๋”ฐ๋ผ ์ž‘์€ ๊ธฐ๋Šฅ์œผ๋กœ ๋ถ„๋ฆฌํ•˜๊ณ , ์ปค์Šคํ…€ ํ›…์„ ํ™œ์šฉํ•˜์—ฌ ๋กœ์ง์„ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ตฌ์กฐ์  ์‚ฌ๊ณ . + +#### [๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ] +- [[State Management Libraries (Redux, Zustand, Context API)]] + - ์—ฐ๊ฒฐ ์ด์œ : ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํฌ๊ธฐ์™€ ์ƒํƒœ ์—…๋ฐ์ดํŠธ ๋นˆ๋„์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ๋„๊ตฌ๋ฅผ ์„ ํƒํ•˜๋Š” ๊ฒƒ์€ ํ™•์žฅ์„ฑ์— ์ง€๋Œ€ํ•œ ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง ๋ฐฉ์ง€๋ฅผ ์œ„ํ•œ Selector ํŒจํ„ด์˜ ๋™์ž‘ ์›๋ฆฌ์™€, ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ ๊ฐ•์ œ๋˜๋Š” ์ƒํƒœ ๊ด€๋ฆฌ ์•„ํ‚คํ…์ฒ˜์˜ ์ค‘์š”์„ฑ. +- [[Code Splitting & Lazy Loading]] + - ์—ฐ๊ฒฐ ์ด์œ : ์ฝ”๋“œ๊ฐ€ ๋น„๋Œ€ํ•ด์ง์— ๋”ฐ๋ผ ๋ฐœ์ƒํ•˜๋Š” ์„ฑ๋Šฅ ์ €ํ•˜(๋ฒˆ๋“ค ํฌ๊ธฐ ์ฆ๊ฐ€)๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ํ•ต์‹ฌ ๋Ÿฐํƒ€์ž„ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: `React.lazy`์™€ Vite์˜ `manualChunks`๋ฅผ ์ด์šฉํ•œ ๋ฒˆ๋“ค ํฌ๊ธฐ ์ถ•์†Œ ๋ฐ ๋ธŒ๋ผ์šฐ์ € ์บ์‹ฑ ์ „๋žต. +- [[React Error Boundaries]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋Œ€๊ทœ๋ชจ ์•ฑ์—์„œ ํ•˜๋‚˜์˜ ๊ฒฐํ•จ ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ๋กœ ์ธํ•ด ์ „์ฒด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ถ•๊ดด๋˜๋Š” ๊ฒƒ์„ ๋ง‰์•„์ฃผ๋Š” ์•ˆ์ „ ์žฅ์น˜์ž…๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋Ÿฐํƒ€์ž„ ๋ Œ๋”๋ง ์—๋Ÿฌ๋ฅผ ๊ฒฉ๋ฆฌ(Isolate)ํ•˜๊ณ  ํด๋ฐฑ(Fallback) UI๋ฅผ ์ œ๊ณตํ•˜์—ฌ ์‹œ์Šคํ…œ ๋ณต์›๋ ฅ์„ ๋†’์ด๋Š” ๋ฐฉ๋ฒ•. + +### Deeper Research Questions + +- ๋Œ€๊ทœ๋ชจ ํŒ€ ํ™˜๊ฒฝ์—์„œ Feature-Sliced Design์„ ์ ์šฉํ•  ๋•Œ, 'Shared' ๋ ˆ์ด์–ด๊ฐ€ ๋น„๋Œ€ํ•ด์ง€๊ณ  ๊ธฐ๋Šฅ ๊ฐ„ ๊ต์ฐจ ๊ด€์‹ฌ์‚ฌ(Cross-cutting concerns)๊ฐ€ ์–ฝํžˆ๋Š” ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋Š”๊ฐ€? +- React Context API์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ฆฌ๋ Œ๋”๋ง ํญํฌ(Re-render storm) ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Zustand์˜ Selector ํŒจํ„ด์€ ๋‚ด๋ถ€์ ์œผ๋กœ ๊ตฌ๋…(Subscription) ๋ชจ๋ธ์„ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š”๊ฐ€? +- React Compiler์˜ ์ž๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๊ธฐ๋Šฅ์ด ๋„์ž…๋จ์— ๋”ฐ๋ผ ๊ธฐ์กด ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ๊ธฐ์ˆ  ๋ถ€์ฑ„(์˜ˆ: Rules of React ์œ„๋ฐ˜ ์‚ฌํ•ญ)๋Š” ์ปดํŒŒ์ผ ์ตœ์ ํ™” ๊ณผ์ •์—์„œ ์–ด๋– ํ•œ ๋ถ€์ž‘์šฉ์„ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- Vite์˜ `manualChunks`๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฑฐ๋Œ€ํ•œ ๋ฒˆ๋“ค์„ ๋ถ„๋ฆฌํ•  ๋•Œ, ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(React core, UI Kits ๋“ฑ)์˜ ํŠน์„ฑ์— ๋”ฐ๋ฅธ ์ตœ์ ์˜ ์ฒญํฌ ๋ถ„ํ•  ๋ฐ ๋ธŒ๋ผ์šฐ์ € ์บ์‹ฑ ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? +- ๋Œ€๊ทœ๋ชจ ๋ฆฌ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ Œ๋”๋งํ•  ๋•Œ ๊ฐ€์ƒํ™”(Virtualization)๋ฅผ ์ ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ๋ธŒ๋ผ์šฐ์ € ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น(Detached DOM nodes ๋“ฑ) ์ธก๋ฉด์—์„œ ์–ด๋–ค ์น˜๋ช…์ ์ธ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”๊ฐ€? + +### Practical Application Contexts + +- **Implementation:** ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐ ์„ค์ • ์‹œ ๊ธฐ์ˆ  ํŒŒ์ผ ๋‹จ์œ„(components, hooks) ๊ตฌ์กฐ๋ฅผ ํ”ผํ•˜๊ณ , ๋„๋ฉ”์ธ/๊ธฐ๋Šฅ ์ค‘์‹ฌ์˜ ํด๋” ๊ตฌ์กฐ๋ฅผ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ๋ช…์€ ์šด์˜์ฒด์ œ ๊ฐ„ ์ถฉ๋Œ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด kebab-case๋กœ, ์ปดํฌ๋„ŒํŠธ๋Š” PascalCase๋กœ ์ผ๊ด€๋˜๊ฒŒ ๋ช…๋ช…ํ•ฉ๋‹ˆ๋‹ค. +- **System Design:** ์ „์—ญ ์ƒํƒœ(Zustand/Redux), ์„œ๋ฒ„ ์ƒํƒœ(TanStack Query), ๋กœ์ปฌ ์ƒํƒœ(useState)์˜ ์ฑ…์ž„์„ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์žฆ์€ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ƒํƒœ๋Š” ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ์˜ ์ตœ์ƒ๋‹จ Context์— ๋‘๋Š” ๊ฒƒ์„ ํ”ผํ•ฉ๋‹ˆ๋‹ค. +- **Operation / Maintenance:** Sentry๋‚˜ LogRocket๊ณผ ๊ฐ™์€ ํ”„๋ก ํŠธ์—”๋“œ ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ์™€ React Error Boundaries๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ, ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง ์—๋Ÿฌ๋ฅผ ์บก์ฒ˜ํ•˜๊ณ  ์•ฑ์˜ ํฌ๋ž˜์‹œ๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. +- **Learning Path:** ๋‹จ์ˆœํ•œ React ๋ฌธ๋ฒ• ํ•™์Šต์„ ๋„˜์–ด, ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ๋ณ„ ๋ Œ๋”๋ง ์ตœ์ ํ™” ์ฐจ์ด๋ฅผ ๋ถ„์„ํ•˜๊ณ  Chrome DevTools ํ”„๋กœํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ Œ๋”๋ง ๋ณ‘๋ชฉ์„ ํ™•์ธํ•˜๋Š” ์Šต๊ด€์„ ๊ธธ๋Ÿฌ ์•„ํ‚คํ…ํŠธ ์ˆ˜์ค€์œผ๋กœ ์„ฑ์žฅํ•ฉ๋‹ˆ๋‹ค. +- **My Project Relevance:** ํ˜„์žฌ ์œ ์ง€๋ณด์ˆ˜ ์ค‘์ธ React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฌด๊ฑฐ์šด ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์ธํ•ด ๋ฉ”์ธ ๋ฒˆ๋“ค ํฌ๊ธฐ๊ฐ€ ๋น„๋Œ€ํ•ด์ง„ ์ƒํ™ฉ์ด๋ผ๋ฉด, `React.lazy` ๊ธฐ๋ฐ˜์˜ ๋ผ์šฐํŠธ ๋ ˆ๋ฒจ ์Šคํ”Œ๋ฆฌํŒ…๊ณผ Vite `manualChunks` ์ ์šฉ์„ ๊ฒ€ํ† ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### Adjacent Topics + +- [[Server Components (Next.js)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ํด๋ผ์ด์–ธํŠธ ์ธก์œผ๋กœ ์ „์†ก๋˜๋Š” JavaScript ๋ฒˆ๋“ค ์ž์ฒด๋ฅผ ์ œ๊ฑฐํ•˜์—ฌ ํ•˜์ด๋“œ๋ ˆ์ด์…˜(Hydration) ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ค„์ด๊ณ  ํ™•์žฅ์„ฑ๊ณผ ์„ฑ๋Šฅ์„ ๋™์‹œ์— ์žก๋Š” ์ตœ์‹  ๋ Œ๋”๋ง ํŒจ๋Ÿฌ๋‹ค์ž„. +- [[Memory Leak Detection in JavaScript]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์žฅ์‹œ๊ฐ„ ์‚ฌ์šฉ ์‹œ ์„ฑ๋Šฅ์„ ์ €ํ•˜์‹œํ‚ค๋Š” Detached DOM Nodes๋‚˜ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๋ˆ„์ˆ˜ ๋“ฑ์„ Chrome DevTools Heap Snapshot์„ ํ†ตํ•ด ๋””๋ฒ„๊น…ํ•˜๋Š” ๋ฐฉ๋ฒ•. +- [[Git Branching Workflows for Small & Large Teams]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๊ทœ๋ชจ๊ฐ€ ํ™•์žฅ๋˜๋Š” ํ”„๋ก ํŠธ์—”๋“œ ํŒ€์ด ์ถฉ๋Œ ์—†์ด ์ฝ”๋“œ๋ฅผ ํ†ตํ•ฉํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” GitHub Flow, Trunk-Based Development ๋ฐ PR(Pull Request) ๋ฆฌ๋ทฐ ์—ํ‹ฐ์ผ“. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/React.lazy().md b/00_Raw/React.lazy().md new file mode 100644 index 00000000..afb49c8c --- /dev/null +++ b/00_Raw/React.lazy().md @@ -0,0 +1,65 @@ +# [[React.lazy()]] + +## ๐Ÿ“Œ Brief Summary +`React.lazy()`๋Š” ๋ฆฌ์•กํŠธ(React)์—์„œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ•„์š”ํ•œ ์‹œ์ ์— ๋™์ ์œผ๋กœ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋‚ด์žฅ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค [1]. ์ด ๊ธฐ๋Šฅ์„ ๋™์  ์ž„ํฌํŠธ(Dynamic Imports)์™€ ๊ฒฐํ•ฉํ•˜๋ฉด ๊ฑฐ๋Œ€ํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค์„ ๋” ์ž‘์€ ์ฒญํฌ(Chunk)๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2, 3]. ๊ฒฐ๊ณผ์ ์œผ๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ์•ฑ์— ์ฒ˜์Œ ์ ‘๊ทผํ•  ๋•Œ ๋‹ค์šด๋กœ๋“œํ•ด์•ผ ํ•˜๋Š” ์ดˆ๊ธฐ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŽ˜์ด๋กœ๋“œ ํฌ๊ธฐ๋ฅผ ๋Œ€ํญ ์ค„์—ฌ ์•ฑ์˜ ์ดˆ๊ธฐ ๋กœ๋“œ ์†๋„์™€ ์ „๋ฐ˜์ ์ธ ์„ฑ๋Šฅ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค [2-4]. + +## ๐Ÿ“– Core Content +* **์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…(Code Splitting)๊ณผ ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ ๊ฐ์†Œ:** + ์ดˆ๊ธฐ ๋กœ๋“œ ์‹œ ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ํ•œ ๋ฒˆ์— ๋ถˆ๋Ÿฌ์˜ค๋ฉด ๋ฒˆ๋“ค ํฌ๊ธฐ๊ฐ€ ๋น„๋Œ€ํ•ด์ ธ ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [5]. `React.lazy()`๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฑฐ๋Œ€ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋ฅผ ์ž˜๊ฒŒ ์ชผ๊ฐœ์–ด, ํŠน์ • ๋ผ์šฐํŠธ๋‚˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง๋  ๋•Œ๋งŒ ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ๋‹ค์šด๋กœ๋“œํ•˜๋„๋ก ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1, 6, 7]. +* **Suspense์™€์˜ ๊ฒฐํ•ฉ:** + `React.lazy()`๋กœ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ปดํฌ๋„ŒํŠธ๋Š” ๋ฐ˜๋“œ์‹œ `` ์ปดํฌ๋„ŒํŠธ๋กœ ๊ฐ์‹ธ์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [1, 3]. ``๋Š” ๋ชจ๋“ˆ์ด ๋กœ๋“œ๋˜๋Š” ๋™์•ˆ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ค„ ๋Œ€์ฒด UI(์˜ˆ: ๋กœ๋”ฉ ์Šคํ”ผ๋„ˆ)๋ฅผ `fallback` ์†์„ฑ์„ ํ†ตํ•ด ์ •์˜ํ•˜์—ฌ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๋งค๋„๋Ÿฝ๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค [1, 3, 8]. +* **์ ์šฉ ๋Œ€์ƒ(Use Cases):** + * **๋ผ์šฐํŠธ ๊ธฐ๋ฐ˜ ์ปดํฌ๋„ŒํŠธ(Route-based components):** ์‚ฌ์šฉ์ž๊ฐ€ ํŠน์ • ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•  ๋•Œ๋งŒ ํ•ด๋‹น ํŽ˜์ด์ง€ ์ฝ”๋“œ๋ฅผ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค [8, 9]. + * **์‚ฌ์šฉ ๋นˆ๋„๊ฐ€ ๋‚ฎ์€ ๋ทฐ:** ๊ด€๋ฆฌ์ž ํ™”๋ฉด์ด๋‚˜ ์„ค์ • ํŒจ๋„์ฒ˜๋Ÿผ ๋“œ๋ฌผ๊ฒŒ ์‚ฌ์šฉ๋˜๋Š” ํ™”๋ฉด์— ์ ์šฉํ•ฉ๋‹ˆ๋‹ค [9]. + * **๋ฌด๊ฑฐ์šด UI ๋ธ”๋ก ๋ฐ ์„œ๋“œํŒŒํ‹ฐ ํ†ตํ•ฉ ๊ธฐ๋Šฅ:** ์ฐจํŠธ, ์ง€๋„, ๋ฆฌ์น˜ ํ…์ŠคํŠธ ์—๋””ํ„ฐ, ๋น„๋””์˜ค ํ”Œ๋ ˆ์ด์–ด ๋“ฑ ์šฉ๋Ÿ‰์ด ํฐ ์œ„์ ฏ์„ ๋ Œ๋”๋งํ•  ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค [3, 9, 10]. +* **๋นŒ๋“œ ๋„๊ตฌ์™€์˜ ์ž๋™ ํ†ตํ•ฉ:** + Vite๋‚˜ Webpack๊ณผ ๊ฐ™์€ ์ตœ์‹  ๋ฒˆ๋“ค๋Ÿฌ๋Š” `React.lazy(() => import('./Component'))` ๋ฌธ๋ฒ•์„ ์ž๋™์œผ๋กœ ์ธ์‹ํ•˜์—ฌ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ณ„๋„์˜ ํŒŒ์ผ(์ฒญํฌ)๋กœ ๋ถ„๋ฆฌํ•ด ์ปดํŒŒ์ผํ•ฉ๋‹ˆ๋‹ค [2, 3, 8]. + +## โš–๏ธ Trade-offs & Caveats +* **์–ด๋ณด๋ธŒ ๋” ํด๋“œ(Above-the-fold) ์š”์†Œ ์ ์šฉ ๊ธˆ์ง€:** ์‚ฌ์šฉ์ž๊ฐ€ ํŽ˜์ด์ง€์— ์ง„์ž…ํ•˜์ž๋งˆ์ž ์ฆ‰์‹œ ๋ณด์•„์•ผ ํ•˜๋Š” ํ•„์ˆ˜์ ์ธ ์ปดํฌ๋„ŒํŠธ๋‚˜ ๋น ๋ฅด๊ฒŒ ๋ Œ๋”๋ง๋˜์–ด์•ผ ํ•˜๋Š” ์š”์†Œ์— `React.lazy()`๋ฅผ ์ ์šฉํ•˜๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค [9]. ์ด๋ฅผ ์ง€์—ฐ ๋กœ๋”ฉํ•  ๊ฒฝ์šฐ ๋ถˆํ•„์š”ํ•œ ๋„คํŠธ์›Œํฌ ์ง€์—ฐ์ด ๋ฐœ์ƒํ•˜์—ฌ ์˜คํžˆ๋ ค ์ฒด๊ฐ ์„ฑ๋Šฅ๊ณผ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์ด ํ•˜๋ฝํ•ฉ๋‹ˆ๋‹ค [9]. +* **๋ ˆ์ด์•„์›ƒ ์‹œํ”„ํŠธ ๋ฐ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ์ €ํ•˜:** ๋น„๋™๊ธฐ ๋กœ๋”ฉ ์ค‘ ``์˜ `fallback`์ด ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚˜๋ฉด์„œ, ๋กœ๋”ฉ์ด ๋๋‚œ ํ›„ ๋ณธ๋ž˜ ์ปดํฌ๋„ŒํŠธ๋กœ ์ „ํ™˜๋  ๋•Œ ๋ ˆ์ด์•„์›ƒ์ด ๋ฐ€๋ฆฌ๊ฑฐ๋‚˜ ๊นœ๋นก๊ฑฐ๋ฆฌ๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1, 11]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] +- [[Code Splitting]] + - ์—ฐ๊ฒฐ ์ด์œ : `React.lazy()`์˜ ์กด์žฌ ๋ชฉ์ ์ด์ž ๊ทผ๋ณธ์ ์ธ ์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค [6]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ดˆ๊ธฐ ๋ Œ๋”๋ง ์‹œ ๋ถˆํ•„์š”ํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ค„์—ฌ ๋กœ๋”ฉ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ์กฐ ์›๋ฆฌ. +- [[Dynamic Imports]] + - ์—ฐ๊ฒฐ ์ด์œ : `React.lazy()` ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋ชจ๋“ˆ์„ ๋กœ๋“œํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ํ‘œ์ค€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฌธ๋ฒ•(`import()`)์ž…๋‹ˆ๋‹ค [2, 3, 8]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํŠน์ • ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜์–ด์•ผ ํ•  ์‹œ์ ์— ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ์ƒ์„ฑํ•˜์—ฌ ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์˜ค๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜. + +#### [๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ] +- [[Suspense]] + - ์—ฐ๊ฒฐ ์ด์œ : `React.lazy()`๋กœ ๋ถ„๋ฆฌ๋œ ์ฝ”๋“œ๊ฐ€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๋‹ค์šด๋กœ๋“œ๋˜๋Š” ๋™์•ˆ ์•ฑ์ด ๋ฉˆ์ถ”์ง€ ์•Š๋„๋ก ๋กœ๋”ฉ UI๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ํ•„์ˆ˜์ ์œผ๋กœ ๊ฒฐํ•ฉ๋˜๋Š” ๋ฆฌ์•กํŠธ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค [1, 3]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋น„๋™๊ธฐ ๋ Œ๋”๋ง ํ๋ฆ„์—์„œ ๋กœ๋”ฉ ์ƒํƒœ(Loading State)๋ฅผ ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ ์ƒ๋‹จ์—์„œ ์„ ์–ธ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•. +- [[Vite/Rollup]] + - ์—ฐ๊ฒฐ ์ด์œ : ์†Œ์Šค ์ฝ”๋“œ์— ์ž‘์„ฑ๋œ `React.lazy()` ๊ตฌ๋ฌธ์„ ๋ถ„์„ํ•˜์—ฌ ๋นŒ๋“œ ํƒ€์ž„์— ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๊ฐœ๋ณ„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ(์ฒญํฌ)๋กœ ๋ถ„ํ• ํ•ด ๋‚ด๋Š” ๋„๊ตฌ๋“ค์ž…๋‹ˆ๋‹ค [2, 8]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ชจ๋“ˆ ๋ฒˆ๋“ค๋Ÿฌ๊ฐ€ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…์„ ์ธ์‹ํ•˜๊ณ  ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์˜ ์ •์  ์—์…‹์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์บ์‹ฑ ํšจ์œจ์„ ๋†’์ด๋Š” ๊ณผ์ •. + +### Deeper Research Questions +- `React.lazy()`๋ฅผ ํ™œ์šฉํ•œ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…๊ณผ ์„œ๋ฒ„ ์‚ฌ์ด๋“œ์—์„œ ์ด๋ฃจ์–ด์ง€๋Š” [[React Server Components]]์˜ ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ฐฉ์‹์€ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅด๋ฉฐ ์„œ๋กœ ์–ด๋–ป๊ฒŒ ๋ณด์™„๋  ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- ``๋กœ ๊ฐ์‹ธ์ง„ ์ง€์—ฐ ๋กœ๋”ฉ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋กœ๋“œ๋  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” Cumulative Layout Shift (CLS)๋ฅผ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•œ ๊ตฌ์ฒด์ ์ธ UI ํŒจํ„ด๊ณผ ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? +- ๋ชจ๋ฐ”์ผ ํ™˜๊ฒฝ ๋“ฑ ๋„คํŠธ์›Œํฌ ์†๋„๊ฐ€ ๋А๋ฆฐ ๊ณณ์—์„œ `React.lazy()`๋กœ ๋ถ„๋ฆฌ๋œ ์ฒญํฌ๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ๋•Œ, ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ(์˜ˆ: ๋ฐฐํฌ ํ›„ ์ด์ „ ํ•ด์‹œ ์ฒญํฌ ์‚ญ์ œ๋จ) ์ด๋ฅผ Error Boundary๋กœ ์–ด๋–ป๊ฒŒ ์šฐ์•„ํ•˜๊ฒŒ ๋ณต๊ตฌํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- ์‚ฌ์šฉ์ž๊ฐ€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์š”์ฒญํ•˜๊ธฐ ์ „(์˜ˆ: ๋งํฌ์— ๋งˆ์šฐ์Šค๋ฅผ ์˜ฌ๋ฆฌ๋Š” ์‹œ์ )์— `React.lazy()`๋กœ ๋ถ„๋ฆฌ๋œ ์ฒญํฌ๋ฅผ ๋ฏธ๋ฆฌ ๊ฐ€์ ธ์˜ค๋Š” ํ”„๋ฆฌํŒจ์น˜(Prefetching/Preloading) ์ „๋žต์€ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•˜๋Š”๊ฐ€? +- Vite์˜ `manualChunks` ์„ค์ •๊ณผ `React.lazy()`๋ฅผ ๋™์‹œ์— ํ™œ์šฉํ•˜์—ฌ, ํ•ต์‹ฌ ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์บ์‹ฑ๊ณผ ํŽ˜์ด์ง€๋ณ„ ์ง€์—ฐ ๋กœ๋”ฉ์„ ๊ฒฐํ•ฉํ•˜๋Š” ์ตœ์ ์˜ ๋นŒ๋“œ ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? + +### Practical Application Contexts +- **Implementation:** React ์ฝ”๋“œ ์ƒ๋‹จ์— ๋ชจ๋“ˆ์„ ์ •์  ์ž„ํฌํŠธํ•˜๋Š” ๋Œ€์‹ , `const LazyComponent = React.lazy(() => import('./LazyComponent'))`๋กœ ์„ ์–ธํ•˜๊ณ , ๋ Œ๋” ํŠธ๋ฆฌ์— ์‚ฌ์šฉํ•  ๋•Œ `}> ` ํ˜•ํƒœ๋กœ ๊ฐ์‹ธ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค [1, 3]. +- **System Design:** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ผ์šฐํŒ… ๋ ˆ์ด์–ด ์„ค๊ณ„ ์‹œ, ๋ชจ๋“  ๋ผ์šฐํŠธ๋ฅผ ์ดˆ๊ธฐ ๋ฒˆ๋“ค์— ๋ฌถ์ง€ ์•Š๊ณ  ๊ฐ ํŽ˜์ด์ง€ ๋˜๋Š” ๋ฌด๊ฑฐ์šด ์ฐจํŠธ/์—๋””ํ„ฐ์™€ ๊ฐ™์€ ๋…๋ฆฝ์  ๋„๋ฉ”์ธ์„ ๋ถ„๋ฆฌํ•˜๋Š” ๊ธฐ์ค€์œผ๋กœ ์„ค๊ณ„ ๊ธฐ์ค€์„ ์ˆ˜๋ฆฝํ•ฉ๋‹ˆ๋‹ค [8, 9]. +- **Operation / Maintenance:** `rollup-plugin-visualizer`๋‚˜ Webpack Bundle Analyzer ๋“ฑ์˜ ๋„๊ตฌ๋ฅผ ์ด์šฉํ•ด ๋นŒ๋“œ ํ›„ 500KB๊ฐ€ ๋„˜์–ด๊ฐ€๋Š” ํฐ ์ฒญํฌ(Large chunks)๊ฐ€ ์žˆ๋Š”์ง€ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ , ๋ฐœ๊ฒฌ ์‹œ `React.lazy()`๋ฅผ ์‚ฌ์šฉํ•ด ์ง€์—ฐ ๋กœ๋”ฉ ๊ฐ€๋Šฅํ•œ ๋ถ€๋ถ„์œผ๋กœ ์ž˜๋ผ๋ƒ…๋‹ˆ๋‹ค [7, 12, 13]. +- **Learning Path:** React ์ปดํฌ๋„ŒํŠธ ์ƒ๋ช…์ฃผ๊ธฐ์™€ ๋ Œ๋”๋ง์— ๋Œ€ํ•œ ์ดํ•ด โ†’ ๋ฒˆ๋“ค ํฌ๊ธฐ๊ฐ€ ์„ฑ๋Šฅ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ ํŒŒ์•… โ†’ `React.lazy`์™€ `Suspense`๋ฅผ ํ†ตํ•œ ํด๋ผ์ด์–ธํŠธ ๋กœ๋”ฉ ์ตœ์ ํ™” โ†’ ๋” ๋‚˜์•„๊ฐ€ ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง(SSR) ๋ฐ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋กœ ํ™•์žฅํ•˜๋Š” ๊ฒฝ๋กœ๋กœ ํ•™์Šต์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค. +- **My Project Relevance:** ํ˜„์žฌ ์œ ์ง€๋ณด์ˆ˜ ์ค‘์ธ ํ”„๋กœ์ ํŠธ์— ๋ชจ๋‹ฌ, ์–ด๋“œ๋ฏผ ์„ค์ • ํŒจ๋„ ๋“ฑ ์ฆ‰์‹œ ๋ณด์ด์ง€ ์•Š๋Š” ์ปดํฌ๋„ŒํŠธ๋“ค์ด ๋ฉ”์ธ ๋ฒˆ๋“ค์— ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋ฉด, ์ด๋ฅผ `React.lazy()`๋กœ ๋ฆฌํŒฉํ† ๋งํ•˜์—ฌ Time To Interactive (TTI) ์ง€ํ‘œ๋ฅผ ๋‹น์žฅ ๊ฐœ์„ ํ•˜๋Š” ๋ฐ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### Adjacent Topics +- [[Core Web Vitals]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: `React.lazy()`๋ฅผ ์ ์šฉํ–ˆ์„ ๋•Œ First Contentful Paint (FCP)์™€ Interaction to Next Paint (INP) ๊ฐ™์€ ๊ตฌ๊ธ€์˜ ์›น ์„ฑ๋Šฅ ์ง€ํ‘œ๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ฐœ์„ ๋˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์—ฐ๊ตฌ ํ™•์žฅ [1, 5]. +- [[manualChunks]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: `React.lazy()`์— ์˜ํ•œ ์Šคํ”Œ๋ฆฌํŒ… ์™ธ์—, React ์ฝ”์–ด๋‚˜ ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค(vendor)์„ ๋ณ„๋„ ๋ถ„๋ฆฌํ•ด ๋ธŒ๋ผ์šฐ์ € ์บ์‹ฑ์„ ๊ณ ๋„ํ™”ํ•˜๋Š” ๋นŒ๋“œ ๋„๊ตฌ ์ˆ˜์ค€์˜ ์ˆ˜๋™ ์ œ์–ด ๊ธฐ๋ฒ• ํŒŒ์•… [8, 14]. +- [[React Server Components (RSC)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ํด๋ผ์ด์–ธํŠธ๋กœ ์•„์˜ˆ ๋ณด๋‚ด์ง€ ์•Š๊ณ  ์„œ๋ฒ„์—์„œ ๋ Œ๋”๋งํ•˜์—ฌ ์„ฑ๋Šฅ์„ ๊ทน๋Œ€ํ™”ํ•˜๋Š” ์ตœ์‹  Next.js ํŒจ๋Ÿฌ๋‹ค์ž„๊ณผ ํด๋ผ์ด์–ธํŠธ ๋‹จ์˜ `React.lazy`๋ฅผ ๋น„๊ต [9, 15]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Real User Monitoring (RUM).md b/00_Raw/Real User Monitoring (RUM).md new file mode 100644 index 00000000..fafa3074 --- /dev/null +++ b/00_Raw/Real User Monitoring (RUM).md @@ -0,0 +1,62 @@ +# [[Real User Monitoring (RUM)]] + +## ๐Ÿ“Œ Brief ์‹œ Summary +Real User Monitoring (RUM)์€ ๋‹ค์–‘ํ•œ ๊ธฐ๊ธฐ์™€ ๋„คํŠธ์›Œํฌ ์กฐ๊ฑด์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ๊ฒฝํ—˜ํ•˜๋Š” ์‹ค์ œ ์„ฑ๋Šฅ๊ณผ ์ƒํ˜ธ์ž‘์šฉ์„ ์ถ”์ ํ•˜๋Š” ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค [1]. ํ•ฉ์„ฑ ํ…Œ์ŠคํŠธ(Synthetic testing)๊ฐ€ ๋†“์น  ์ˆ˜ ์žˆ๋Š” ์‹ค์ œ ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ํŒŒ์•…ํ•˜๋Š” ๋ฐ ํ•„์ˆ˜์ ์ด๋ฉฐ [1], ํ”„๋ก ํŠธ์—”๋“œ์˜ ์‚ฌ์šฉ์ž ์•ก์…˜๊ณผ ๋ฐฑ์—”๋“œ์˜ ์ธํ”„๋ผ ํŠธ๋ ˆ์ด์Šค๋ฅผ ์—ฐ๊ฒฐํ•˜์—ฌ ์ „์ฒด ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ๊ฐ€์‹œ์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [2]. + +## ๐Ÿ“– Core Content +* **์‹ค์ œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ์ถ”์ :** RUM์€ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์ด๋‚˜ ์ธ์œ„์ ์ธ ํ•ฉ์„ฑ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์—์„œ๋Š” ํฌ์ฐฉํ•˜๊ธฐ ์–ด๋ ค์šด ๋‹ค์–‘ํ•œ ๊ธฐ๊ธฐ, ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ ๋ฐ ๋„คํŠธ์›Œํฌ ์กฐ๊ฑด์—์„œ์˜ ์‹ค์ œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค [1]. ์ด๋ฅผ ํ†ตํ•ด ํŠน์ • ๊ธฐ๊ธฐ๋‚˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ๋งŒ ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3]. +* **์—”๋“œํˆฌ์—”๋“œ(End-to-End) ํŠธ๋ ˆ์ด์‹ฑ:** Datadog RUM ๋“ฑ์˜ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ ๊ฐ„์˜ ๋ชจ๋‹ˆํ„ฐ๋ง ๊ฒฉ์ฐจ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋ก ํŠธ์—”๋“œ์—์„œ ๋ฐœ์ƒํ•œ ์—๋Ÿฌ๋ฅผ ํด๋ฆญํ•˜๋ฉด, ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฐ ์„œ๋“œํŒŒํ‹ฐ API์— ์ด๋ฅด๋Š” ์ „์ฒด ์š”์ฒญ ๊ณผ์ •์„ ๋ถ„์‚ฐ ํŠธ๋ ˆ์ด์‹ฑ(Distributed tracing)์„ ํ†ตํ•ด ์ถ”์ ํ•  ์ˆ˜ ์žˆ์–ด ๋ณต์žกํ•œ ์‹œ์Šคํ…œ์˜ ๋””๋ฒ„๊น…์„ ๋•์Šต๋‹ˆ๋‹ค [2]. +* **ํ†ตํ•ฉ ๊ด€์ธก์„ฑ(Unified Observability):** ์ตœ์‹  ๋ชจ๋‹ˆํ„ฐ๋ง ํ”Œ๋žซํผ์—์„œ RUM์€ ํ”„๋ก ํŠธ์—”๋“œ์˜ ์˜ค๋ฅ˜ ๋กœ๊ทธ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ธํ”„๋ผ ๋ชจ๋‹ˆํ„ฐ๋ง, ๋ฐฑ์—”๋“œ APM(Application Performance Monitoring) ๋“ฑ๊ณผ ํ•œ๊ณณ์—์„œ ๊ฒฐํ•ฉ๋˜์–ด ํ™œ์šฉ๋ฉ๋‹ˆ๋‹ค [4]. +* **๋น„์šฉ ๋ฐ ๋ผ์ด์„ ์Šค ๋ชจ๋ธ:** 1,000๋ช…์˜ ์œ ์ €๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•  ๋•Œ ๊ธฐ๋ณธ์ ์ธ RUM ๊ธฐ๋Šฅ์€ ์›” $15~$30 ์ˆ˜์ค€์œผ๋กœ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์œผ๋‚˜, ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘๋Ÿ‰์— ๋”ฐ๋ผ ๋น„์šฉ์ด ์ฒญ๊ตฌ๋˜๋Š” ์‚ฌ์šฉ๋Ÿ‰ ๊ธฐ๋ฐ˜ ๊ฐ€๊ฒฉ ์ •์ฑ…์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค [5]. + +## โš–๏ธ Trade-offs & Caveats +* **๋ฐ์ดํ„ฐ ๊ทœ๋ชจ์— ๋”ฐ๋ฅธ ๊ณผ๋„ํ•œ ๋น„์šฉ ์ฒญ๊ตฌ:** RUM ํ”Œ๋žซํผ(์˜ˆ: Datadog)์€ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘(Ingest)๊ณผ ๊ฒ€์ƒ‰์„ ์œ„ํ•œ ์ธ๋ฑ์‹ฑ(Index)์„ ๋ถ„๋ฆฌํ•˜์—ฌ ์š”๊ธˆ์„ ๋ถ€๊ณผํ•˜๋Š” '์ด์ค‘ ์š”๊ธˆ์ œ'๋ฅผ ์ฑ„ํƒํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ํŠธ๋ž˜ํ”ฝ์ด ๋†’์€ ์„œ๋น„์Šค์—์„œ๋Š” ๋น„์šฉ์ด ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ์ฆ๊ฐ€ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋กœ ์ธํ•ด ๋น„์šฉ ์ ˆ๊ฐ์„ ์œ„ํ•ด ๋กœ๊ทธ์˜ 20%๋งŒ ์ธ๋ฑ์‹ฑํ•˜๊ฒŒ ๋˜๋ฉด ์žฅ์•  ๋ฐœ์ƒ ์‹œ 80%์˜ ์ฃผ์š” ๋””๋ฒ„๊น… ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์—†๋Š” ์ƒํ™ฉ์— ๋†“์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5, 6]. +* **ํ”„๋ผ์ด๋ฒ„์‹œ ๋ฐ ๋ณด์•ˆ ๋ฌธ์ œ:** ์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด(Session replay) ๋“ฑ ์‚ฌ์šฉ์ž์˜ ๋ชจ๋“  ํ–‰๋™์„ ๊ธฐ๋กํ•˜๋Š” RUM ๋„๊ตฌ๋Š” ๋ฏผ๊ฐํ•œ ๊ฐœ์ธ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ํ•  ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์—„๊ฒฉํ•ด์ง€๋Š” ๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ ๊ทœ์ œ๋ฅผ ์ค€์ˆ˜ํ•˜๊ธฐ ์œ„ํ•ด ๋ฏผ๊ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ž๋™ ๋งˆ์Šคํ‚นํ•˜๋„๋ก ์„ค์ •ํ•˜๋Š” ๋ฐ ๋งŽ์€ ์‹œ๊ฐ„์ด ์†Œ์š”๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [7-9]. +* **์ดˆ๊ธฐ ๋กœ๋“œ ์„ฑ๋Šฅ ์ €ํ•˜ (์„ฑ๋Šฅ ์˜ค๋ฒ„ํ—ค๋“œ):** ํ”„๋ก ํŠธ์—”๋“œ์— ์‚ฝ์ž…๋˜๋Š” RUM ์ถ”์  ์Šคํฌ๋ฆฝํŠธ๋Š” ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ฆ๊ฐ€์‹œํ‚ต๋‹ˆ๋‹ค. ์ผ๋ถ€ ๋„๊ตฌ์˜ ๊ฒฝ์šฐ ๋กœ๋“œ ์‹œ๊ฐ„์„ ์ตœ๋Œ€ 120ms๊นŒ์ง€ ์ง€์—ฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, 1์ดˆ๊ฐ€ ์ค‘์š”ํ•œ ์ด์ปค๋จธ์Šค ๋“ฑ์˜ ์‚ฌ์ดํŠธ์—์„œ๋Š” ๊ฒฝ๋Ÿ‰ํ™”๋œ ์˜ต์…˜์„ ์‹ ์ค‘ํžˆ ์„ ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [10]. +* **๋„์ž… ๋ฐ ํ•™์Šต ๊ณก์„ :** ํ’€์Šคํƒ ๊ด€์ธก ํ”Œ๋žซํผ๊ณผ ๊ฒฐํ•ฉ๋œ RUM ๋„๊ตฌ๋Š” ๋‹จ์ˆœ ํ”„๋ก ํŠธ์—”๋“œ ๋กœ๊น…๋งŒ ํ•„์š”ํ•œ ์ž‘์€ ํŒ€์—๊ฒŒ๋Š” ์ง€๋‚˜์นœ ์˜ค๋ฒ„์—”์ง€๋‹ˆ์–ด๋ง(Overkill)์ด ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ „์ฒด ํ”Œ๋žซํผ์„ ์ดํ•ดํ•˜๋Š” ๋ฐ ๊ฐ€ํŒŒ๋ฅธ ํ•™์Šต ๊ณก์„ ์ด ์š”๊ตฌ๋ฉ๋‹ˆ๋‹ค [6, 11]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [๊ด€๊ณ„ ์œ ํ˜• A (์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ )] +- [[Synthetic Testing]] + - ์—ฐ๊ฒฐ ์ด์œ : RUM๊ณผ ๋Œ€๋น„๋˜๋Š” ๋ชจ๋‹ˆํ„ฐ๋ง ๊ฐœ๋…์œผ๋กœ, ๊ฐ€์ƒ ํ™˜๊ฒฝ์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜์—ฌ ์ธก์ •ํ•ฉ๋‹ˆ๋‹ค [1]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๋ฐ์ดํ„ฐ์™€ ์‹ค์ œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜(RUM) ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ƒํ˜ธ๋ณด์™„์ ์œผ๋กœ ์ž‘์šฉํ•˜์—ฌ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ์ฐพ์•„๋‚ด๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[Distributed Tracing]] + - ์—ฐ๊ฒฐ ์ด์œ : RUM ๋„๊ตฌ๊ฐ€ ํ”„๋ก ํŠธ์—”๋“œ์˜ ์‚ฌ์šฉ์ž ๋™์ž‘์„ ๋ฐฑ์—”๋“œ์˜ ์„œ๋น„์Šค ์š”์ฒญ๊ณผ ์—ฐ๊ด€ ์ง“๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ํ•ต์‹ฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค [2, 4, 12]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜ ํ™˜๊ฒฝ์—์„œ ํด๋ผ์ด์–ธํŠธ ์—๋Ÿฌ์˜ ๊ทผ๋ณธ ์›์ธ์„ ๋ฐฑ์—”๋“œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋‚˜ ์™ธ๋ถ€ API๊นŒ์ง€ ์–ด๋–ป๊ฒŒ ์ถ”์ ํ•˜๋Š”์ง€ ์›๋ฆฌ๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[Core Web Vitals]] + - ์—ฐ๊ฒฐ ์ด์œ : RUM์„ ํ†ตํ•ด ์ฃผ๋กœ ์ธก์ •ํ•˜๊ณ  ์ตœ์ ํ™”ํ•˜๋ ค๋Š” ๋Œ€์ƒ์ธ ์‹ค์ œ ์‚ฌ์šฉ์ž ์ค‘์‹ฌ์˜ ๋กœ๋”ฉ ์†๋„, ์ƒํ˜ธ์ž‘์šฉ, ์‹œ๊ฐ์  ์•ˆ์ •์„ฑ ์ง€ํ‘œ์ž…๋‹ˆ๋‹ค [13, 14]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: RUM ๋ฐ์ดํ„ฐ๊ฐ€ ์›น ์„ฑ๋Šฅ ์ตœ์ ํ™”์˜ ๊ธฐ์ค€(LCP, FID, CLS, INP)๊ณผ ์–ด๋–ป๊ฒŒ ๋งคํ•‘๋˜์–ด ์‚ฌ์šฉ์ž ๊ฒฝํ—˜(UX)์„ ์ˆ˜์น˜ํ™”ํ•˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +#### [๊ด€๊ณ„ ์œ ํ˜• B (๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ)] +- [[Datadog RUM]] + - ์—ฐ๊ฒฐ ์ด์œ : ์†Œ์Šค์—์„œ ์—”๋“œํˆฌ์—”๋“œ ํ”„๋ก ํŠธ์—”๋“œ-๋ฐฑ์—”๋“œ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์—ฐ๊ฒฐํ•ด ์ฃผ๋Š” ๋Œ€ํ‘œ์ ์ธ RUM ํ”Œ๋žซํผ์œผ๋กœ ์†Œ๊ฐœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค [2]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋Œ€๊ทœ๋ชจ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์—์„œ RUM์„ ํ™œ์šฉํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ์‚ฌ๋ก€์™€, ์ธ๋ฑ์‹ฑ ๋น„์šฉ ์ตœ์ ํ™”(Trade-off) ์ „๋žต์˜ ์ค‘์š”์„ฑ์„ ํ•™์Šตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[Session Replay]] + - ์—ฐ๊ฒฐ ์ด์œ : ์‚ฌ์šฉ์ž์˜ ์ƒํƒœ ๋ณ€๊ฒฝ, ์ฝ˜์†” ๋กœ๊ทธ, ๋„คํŠธ์›Œํฌ ์š”์ฒญ ๋“ฑ์„ ๋งˆ์น˜ ํ™”๋ฉด ๋…นํ™”์ฒ˜๋Ÿผ ์žฌํ˜„ํ•˜๋Š” RUM์˜ ๊ณ ๊ธ‰ ๋””๋ฒ„๊น… ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค [7, 12, 15]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์Šคํƒ ํŠธ๋ ˆ์ด์Šค๋งŒ์œผ๋กœ ์ฐพ๊ธฐ ํž˜๋“  ๋ณต์žกํ•œ ์‚ฌ์šฉ์ž ์ƒํ˜ธ์ž‘์šฉ ์˜ค๋ฅ˜์˜ ๋””๋ฒ„๊น… ๋ฐฉ๋ฒ•๋ก ๊ณผ ์ด์— ๋”ฐ๋ฅธ ํ”„๋ผ์ด๋ฒ„์‹œ ์„ค์ •์˜ ์ค‘์š”์„ฑ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### Deeper Research Questions +- ๊ฐ€์ƒ ํ™˜๊ฒฝ์˜ ์„ฑ๋Šฅ์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜๋Š” ํ•ฉ์„ฑ ํ…Œ์ŠคํŠธ(Synthetic Testing)์™€ ๋น„๊ตํ•  ๋•Œ, RUM๋งŒ์ด ๋…์ ์ ์œผ๋กœ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š” ์‹ค์ œ ๊ธฐ๊ธฐ/๋„คํŠธ์›Œํฌ ๊ธฐ๋ฐ˜์˜ ์„ฑ๋Šฅ ์ด์Šˆ ํŒจํ„ด์€ ๋ฌด์—‡์ธ๊ฐ€? +- Datadog๊ณผ ๊ฐ™์€ RUM ์†”๋ฃจ์…˜์„ ํ™œ์šฉํ•  ๋•Œ, ๋Œ€๊ทœ๋ชจ ํŠธ๋ž˜ํ”ฝ ํ•˜์—์„œ ๊ฐ€์‹œ์„ฑ ์†์‹ค ์—†์ด ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘(Ingest)๊ณผ ์ธ๋ฑ์‹ฑ(Indexing) ๋น„์šฉ์˜ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๋ฅผ ๊ทน๋ณตํ•  ์ˆ˜ ์žˆ๋Š” ๋กœ๊ทธ ํ•„ํ„ฐ๋ง ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? +- RUM ์—์ด์ „ํŠธ์˜ ์‚ฝ์ž…์ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค ํฌ๊ธฐ ๋ฐ ์ดˆ๊ธฐ ํŽ˜์ด์ง€ ๋กœ๋“œ ์†๋„(์ตœ๋Œ€ 120ms ์ถ”๊ฐ€)์— ๋ฏธ์น˜๋Š” ์„ฑ๋Šฅ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ตœ์†Œํ™”ํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? +- ๊ธ€๋กœ๋ฒŒ ํ”„๋ผ์ด๋ฒ„์‹œ ๊ทœ์ œ๋ฅผ ์ค€์ˆ˜ํ•˜๋ฉด์„œ Session Replay๋ฅผ ํฌํ•จํ•œ RUM ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ธฐ ์œ„ํ•ด, ๋ฏผ๊ฐํ•œ DOM ์š”์†Œ๋‚˜ ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ์–ด๋–ป๊ฒŒ ํšจ๊ณผ์ ์œผ๋กœ ๋งˆ์Šคํ‚น(Masking)ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- ํ”„๋ก ํŠธ์—”๋“œ React ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฐœ์ƒํ•œ ์—๋Ÿฌ๋ฅผ RUM ๋ฐ์ดํ„ฐ์™€ ๊ฒฐํ•ฉํ•˜๊ณ , ๋ฐฑ์—”๋“œ์˜ OpenTelemetry ๋ถ„์‚ฐ ํŠธ๋ ˆ์ด์Šค์™€ ์—ฐ๊ฒฐ(Trace ID ๊ณต์œ  ๋“ฑ)ํ•˜์—ฌ ์ „์ฒด ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ํ๋ฆ„์—์„œ ๊ทผ๋ณธ ์›์ธ์„ ํŒŒ์•…ํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ• ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? + +### Practical Application Contexts +- **Implementation:** React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์—”ํŠธ๋ฆฌ ํฌ์ธํŠธ์— Datadog์ด๋‚˜ Sentry์™€ ๊ฐ™์€ RUM ๋ชจ๋‹ˆํ„ฐ๋ง SDK๋ฅผ ํ†ตํ•ฉํ•˜๊ณ , Core Web Vitals ๋ฐ ์„ธ์…˜๋ณ„ ์„ฑ๋Šฅ ์ง€ํ‘œ๋ฅผ ์ž๋™์œผ๋กœ ์ˆ˜์ง‘ํ•˜๋„๋ก ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค. +- **System Design:** ์‚ฌ์šฉ์ž์˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ฐœ์ƒํ•œ ํ”„๋ก ํŠธ์—”๋“œ ๋กœ๊ทธ์™€ API ์š”์ฒญ ํ—ค๋”์— ํŠธ๋ ˆ์ด์Šค ID๋ฅผ ์‚ฝ์ž…ํ•˜์—ฌ, ๋ฐฑ์—”๋“œ ๋กœ๊น… ์‹œ์Šคํ…œ๊ณผ ๋งค์นญ์‹œํ‚ค๋Š” '์—”๋“œํˆฌ์—”๋“œ(End-to-End) ๋ชจ๋‹ˆํ„ฐ๋ง ์•„ํ‚คํ…์ฒ˜'๋ฅผ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค. +- **Operation / Maintenance:** ์›”๋ณ„ ๋ชจ๋‹ˆํ„ฐ๋ง ๋น„์šฉ(ํŠนํžˆ ๋ฐ์ดํ„ฐ ์ธ๋ฑ์‹ฑ ๋น„์šฉ)์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ์ด๋ฒคํŠธ๋Š” ์ƒ˜ํ”Œ๋งํ•˜๊ณ , ๋ฐ์ดํ„ฐ ๋งˆ์Šคํ‚น ๊ทœ์น™์„ ์ง€์†์ ์œผ๋กœ ๊ด€๋ฆฌํ•ด GDPR ๋“ฑ์˜ ๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ ์ •์ฑ…์„ ์œ„๋ฐ˜ํ•˜์ง€ ์•Š๋„๋ก ์œ ์ง€๋ณด์ˆ˜ํ•ฉ๋‹ˆ๋‹ค. +- **Learning Path:** ๋จผ์ € React์˜ ๊ธฐ๋ณธ ์—๋Ÿฌ ์ฒ˜๋ฆฌ(Error Boundaries)์™€ ๋ธŒ๋ผ์šฐ์ € DevTools๋ฅผ ์‚ฌ์šฉํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ์ธก์ •์„ ์ตํžŒ ํ›„, ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์˜ ์‹ค์‹œ๊ฐ„ ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๋Š” RUM๊ณผ ๋ฐฑ์—”๋“œ ๋ถ„์‚ฐ ํŠธ๋ ˆ์ด์‹ฑ์„ ํ•™์Šตํ•˜์—ฌ ํ’€์Šคํƒ ๊ด€์ธก์„ฑ(Observability) ์—ญ๋Ÿ‰์„ ๊ธฐ๋ฆ…๋‹ˆ๋‹ค. +- **My Project Relevance:** ํ˜„์žฌ ์ง„ํ–‰ ์ค‘์ธ ํ”„๋ก ํŠธ์—”๋“œ ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉ์ž ์ดํƒˆ๋ฅ ์ด ๋†’์€ ํŠน์ • ํ™”๋ฉด์˜ ๋ณ‘๋ชฉ ์ง€์ ์„ ์ฐพ๊ธฐ ์œ„ํ•ด, RUM์„ ์ ์šฉํ•˜์—ฌ ์‹ค์ œ ๋ชจ๋ฐ”์ผ ๊ธฐ๊ธฐ์™€ 3G/LTE ํ™˜๊ฒฝ์—์„œ์˜ INP(Interaction to Next Paint)์™€ ๋ Œ๋”๋ง ์ง€์—ฐ์„ ์ธก์ • ๋ฐ ๊ฐœ์„ ํ•  ๋•Œ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค. + +### Adjacent Topics +- [[OpenTelemetry]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ํŠน์ • ๋ฒค๋”์— ์ข…์†๋˜์ง€ ์•Š๊ณ (No vendor lock-in) ์˜คํ”ˆ ์Šคํƒ ๋‹ค๋“œ ํ”„๋กœํ† ์ฝœ์„ ์ด์šฉํ•ด RUM, ๋ฉ”ํŠธ๋ฆญ, ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ  ๋ฐฑ์—”๋“œ์™€ ์—ฐ๊ฒฐํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜๋กœ ์ง€์‹์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [16, 17]. +- [[Error Boundaries]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์—์„œ UI ๋ Œ๋”๋ง ์ค‘ ๋ฐœ์ƒํ•˜๋Š” ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๋ฅผ ์บก์ฒ˜ํ•˜์—ฌ ์ „์ฒด ์•ฑ์˜ ํฌ๋ž˜์‹œ๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ๊ฐœ๋…์œผ๋กœ, ์—ฌ๊ธฐ์„œ ํฌ์ฐฉ๋œ ์—๋Ÿฌ๋ฅผ RUM ์‹œ์Šคํ…œ์— ๋ณด๊ณ ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์—ฐ๊ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [18-20]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Redux.md b/00_Raw/Redux.md new file mode 100644 index 00000000..332910b5 --- /dev/null +++ b/00_Raw/Redux.md @@ -0,0 +1,53 @@ +# [[Redux]] + +## ๐Ÿ“Œ Brief Summary +Redux๋Š” ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ์ƒํƒœ ์ปจํ…Œ์ด๋„ˆ๋กœ, ๋ถˆ๋ณ€์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ์—…๋ฐ์ดํŠธ, ์•ก์…˜ ๋””์ŠคํŒจ์น˜(action dispatch), ๊ทธ๋ฆฌ๊ณ  ๋ฆฌ๋“€์„œ(reducer)๋ฅผ ํ†ตํ•ด ์ „์—ญ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์‚ฐ์—… ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค [1]. ์ฃผ๋กœ ๋ณต์žกํ•œ ํŒŒ์ƒ ๋ฐ ๊ณ„์‚ฐ๋œ ์ƒํƒœ๊ฐ€ ์กด์žฌํ•˜๊ฑฐ๋‚˜ 500๊ฐœ ์ด์ƒ์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‹ค๋ฃจ๋Š” ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ผ๊ด€๋œ ๊ฐœ๋ฐœ ํŒจํ„ด์„ ๊ฐ•์ œํ•˜๊ธฐ ์œ„ํ•ด ์ฑ„ํƒ๋œ๋‹ค [2]. RTK Query์™€ Redux DevTools ๊ฐ™์€ ์„ฑ์ˆ™ํ•œ ์ƒํƒœ๊ณ„๋ฅผ ํ†ตํ•ด ๋น„๋™๊ธฐ ์ƒํƒœ ๊ด€๋ฆฌ์˜ ๋ณต์žก์„ฑ์„ ์ค„์ด๊ณ  ๊ฐ•๋ ฅํ•œ ๋””๋ฒ„๊น… ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค [2-4]. + +## ๐Ÿ“– Core ๋Œ€Content +* **์ƒํƒœ ๊ด€๋ฆฌ ์•„ํ‚คํ…์ฒ˜์™€ ๊ตฌ์กฐํ™”**: Redux๋Š” ๋ถˆ๋ณ€์„ฑ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋ฉฐ, ์•ก์…˜๊ณผ ๋ฆฌ๋“€์„œ ํŒจํ„ด์„ ํ†ตํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ณต์žกํ•œ ์ƒํƒœ ๋กœ์ง์„ ์ œ์–ดํ•œ๋‹ค [1]. ๋ชจ๋˜ ํ”„๋ก ํŠธ์—”๋“œ ํด๋” ๊ตฌ์กฐ์—์„œ Redux ์Šฌ๋ผ์ด์Šค(Redux slices)์™€ ๊ธ€๋กœ๋ฒŒ ์ƒํƒœ ๊ด€๋ จ ๋กœ์ง์€ ์ „๋‹ด ๋””๋ ‰ํ† ๋ฆฌ์ธ `store/`์— ๋ฐฐ์น˜๋œ๋‹ค [5-7]. 10๋ช… ์ด์ƒ์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ˜‘์—…ํ•˜๋Š” ์กฐ์ง์ด๋‚˜ ์ด์ปค๋จธ์Šค, ๊ธˆ์œต ์‹œ์Šคํ…œ๊ณผ ๊ฐ™์ด ๋ฏธ์…˜ ํฌ๋ฆฌํ‹ฐ์ปฌํ•œ ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ์ด ์ค‘์š”ํ•œ ํ”„๋กœ์ ํŠธ์—์„œ ์ฝ”๋“œ ์ž‘์„ฑ์˜ ์ผ๊ด€์„ฑ์„ ๊ฐ•์ œํ•˜๋Š” ๋ผˆ๋Œ€ ์—ญํ• ์„ ํ•œ๋‹ค [2]. +* **์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ฐ ์ƒํƒœ ๊ตฌ๋…**: ๋‚ด์žฅ๋œ React Context API๋Š” ์ƒํƒœ์˜ ์ผ๋ถ€๋งŒ ๋ณ€๊ฒฝ๋˜์–ด๋„ ํ•ด๋‹น ์ปจํ…์ŠคํŠธ๋ฅผ ๊ตฌ๋…ํ•˜๋Š” ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ์— ๋ฌด์ฐจ๋ณ„์ ์ธ ๋ฆฌ๋ Œ๋”๋ง์„ ์œ ๋ฐœํ•˜๋Š” ๋ฐ˜๋ฉด, Redux๋Š” ๊ตฌ๋… ๋กœ์ง๊ณผ ๋ Œ๋”๋ง์„ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌํ•œ๋‹ค [3, 8-10]. ์„ ํƒ์ž(Selector)๋ฅผ ์‚ฌ์šฉํ•ด ํ•„์š”ํ•œ ํŒŒ์ƒ ์ƒํƒœ๋งŒ ์ปดํฌ๋„ŒํŠธ์— ๊ณต๊ธ‰ํ•˜์—ฌ ์„ฑ๋Šฅ๊ณผ ์ตœ์ ํ™”๋ฅผ ๋ณด์žฅํ•œ๋‹ค [3]. +* **๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ (RTK Query ๋„์ž…)**: ๊ณผ๊ฑฐ Redux๋Š” ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์— ๋ง‰๋Œ€ํ•œ ์–‘์˜ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ(Thunk, Saga ๋“ฑ)๊ฐ€ ํ•„์š”ํ–ˆ์œผ๋‚˜, ํ˜„์žฌ๋Š” RTK Query๋ฅผ ํ†ตํ•ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ๋‹ค [2, 4]. RTK Query๋Š” ๋ฐ์ดํ„ฐ ์บ์‹ฑ, ์ค‘๋ณต ์š”์ฒญ ์ œ๊ฑฐ, ์ž๋™ ๋ฐ์ดํ„ฐ ์žฌ์š”์ฒญ ๊ธฐ๋Šฅ ๋“ฑ์„ ๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณตํ•˜์—ฌ ๋น„๋™๊ธฐ ์ž‘์—… ์ฝ”๋“œ๋ฅผ ํš๊ธฐ์ ์œผ๋กœ ์ค„์—ฌ์ค€๋‹ค [4]. +* **๋””๋ฒ„๊น…๊ณผ ์ถ”์ ์„ฑ**: Redux์˜ ๊ฐ€์žฅ ํฐ ์ฐจ๋ณ„์ ์€ ๋ธŒ๋ผ์šฐ์ €์˜ Redux DevTools๋ฅผ ํ™œ์šฉํ•œ '์‹œ๊ฐ„ ์—ฌํ–‰ ๋””๋ฒ„๊น…(Time-Travel Debugging)'์ด๋‹ค [2, 3]. ์ƒํƒœ ๋ณ€ํ™” ์ด๋ ฅ์„ ๊ณผ๊ฑฐ๋กœ ๋Œ๋ ค๋ณด๊ฑฐ๋‚˜ ์•ก์…˜์„ ์žฌํ˜„ํ•  ์ˆ˜ ์žˆ์–ด, ์‹ฌ์•ผ์— ๋ฐœ์ƒํ•˜๋Š” ๋ณต์žกํ•œ ์šด์˜ ํ™˜๊ฒฝ์˜ ๋น„๋™๊ธฐ ๋ฒ„๊ทธ๋„ ๋ช‡ ๋ถ„ ๋‚ด์— ์‹œ๊ฐ์ ์œผ๋กœ ํŒŒ์•…ํ•˜๊ฒŒ ํ•ด์ค€๋‹ค [3, 11, 12]. +* **ํ•œ๊ณ„์  ๋ฐ ์ฃผ์˜์‚ฌํ•ญ**: Redux๋Š” ๋„์ž… ์‹œ ๋ง‰๋Œ€ํ•œ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ, ์ •๊ทœํ™”๋œ ์ƒํƒœ ๊ด€๋ฆฌ์˜ ๋‚œํ•ดํ•จ, ๋ฏธ๋“ค์›จ์–ด ์ˆœ์„œ ์˜ค๋ฅ˜, ๊ทธ๋ฆฌ๊ณ  ๊นจ์ง€๊ธฐ ์‰ฌ์šด ์„ ํƒ์ž ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๋“ฑ์˜ ํ•œ๊ณ„๋ฅผ ๊ฐ€์ง„๋‹ค [13]. ๋˜ํ•œ ๋ชจ๋“  ์ƒํƒœ๋ฅผ ํ•˜๋‚˜์˜ ํฐ ๋ฆฌ๋“€์„œ์— ๋ชฐ์•„๋„ฃ๋Š” "God Reducer" ๊ตฌ์กฐ๋‚˜ ํŒ€ ๋‹จ์œ„์˜ ์•ก์…˜ ๊ฒฐํ•ฉ(Action Coupling)์€ ๋Œ€ํ‘œ์ ์ธ ์•ˆํ‹ฐ ํŒจํ„ด์œผ๋กœ ์ง€์ ๋œ๋‹ค [13, 14]. ์ตœ์‹  ํŠธ๋ Œ๋“œ์—์„œ๋Š” ์ด์™€ ๊ฐ™์€ ๋‹จ์ผ(monolithic) ์Šคํ† ์–ด ๊ตฌ์กฐ์˜ ๋ณต์žก์„ฑ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ์™€ ์„œ๋ฒ„ ์ƒํƒœ๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ๋“ฑ ๋ณด๋‹ค ํŒŒํŽธํ™”๋œ ๋ฐฉ์‹์œผ๋กœ ์ง„ํ™”ํ•˜๊ณ  ์žˆ๋‹ค [15]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts +- [[Context API]] + - ์—ฐ๊ฒฐ ์ด์œ : Redux์™€ ์ž์ฃผ ๋น„๊ต๋˜๋Š” React์˜ ๋‚ด์žฅ ์ƒํƒœ ๊ณต์œ  ๊ธฐ๋Šฅ์œผ๋กœ, ์†Œ๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ…Œ๋งˆ๋‚˜ ์–ธ์–ด ์„ค์ • ๋“ฑ์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์ ํ•ฉํ•˜์ง€๋งŒ, ์ƒํƒœ ๋ณ€๊ฒฝ ์‹œ ๋ฐœ์ƒํ•˜๋Š” ๋Œ€๊ทœ๋ชจ ๋ฆฌ๋ Œ๋”๋ง ํญํ’(Re-render Storm)์„ ์œ ๋ฐœํ•˜์—ฌ ๋Œ€๊ทœ๋ชจ ์•ฑ์—์„œ Redux๊ฐ€ ํ•„์š”ํ•œ ๋‹น์œ„์„ฑ์„ ์ œ๊ณตํ•œ๋‹ค [8, 9, 16]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ƒํƒœ ๊ตฌ๋… ์•„ํ‚คํ…์ฒ˜์˜ ์ฐจ์ด๊ฐ€ React ์ปดํฌ๋„ŒํŠธ์˜ ๋ฆฌ๋ Œ๋”๋ง ์„ฑ๋Šฅ์— ๋ฏธ์น˜๋Š” ์น˜๋ช…์ ์ธ ์˜ํ–ฅ์„ฑ [8, 10]. + +- [[Zustand]] + - ์—ฐ๊ฒฐ ์ด์œ : Redux์˜ ๋ฌด๊ฑฐ์šด ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ์™€ Context API์˜ ์„ฑ๋Šฅ ๋ฌธ์ œ ์‚ฌ์ด์—์„œ ์ ์ ˆํ•œ ํƒ€ํ˜‘์ ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒฝ๋Ÿ‰ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค [17-19]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๊ณผ๋„ํ•œ ์œ ์—ฐ์„ฑ(Zustand)์ด ํŒ€ ๋‹จ์œ„ ํ˜‘์—…์—์„œ ์–ด๋–ป๊ฒŒ ๋น„๋™๊ธฐ ํŒจํ„ด์˜ ํŒŒํŽธํ™”์™€ ํ˜ผ๋ž€์„ ์•ผ๊ธฐํ•  ์ˆ˜ ์žˆ๋Š”์ง€, ๋Œ€์กฐ์ ์œผ๋กœ Redux์˜ ์—„๊ฒฉํ•œ ๊ตฌ์กฐ๊ฐ€ ๊ฐ–๋Š” ๋ฐฉ์–ด์  ์ด์  [1, 11, 18, 20]. + +- [[RTK Query]] + - ์—ฐ๊ฒฐ ์ด์œ : Redux Toolkit(RTK) ์ƒํƒœ๊ณ„์— ํฌํ•จ๋œ ๋ฐ์ดํ„ฐ ํŒจ์นญ ๋ฐ ์บ์‹ฑ ๋„๊ตฌ์ด๋‹ค [4]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Redux๊ฐ€ ์–ด๋–ป๊ฒŒ ๋‹จ์ˆœํ•œ ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ๋„˜์–ด ์„œ๋ฒ„ API ์‘๋‹ต(์บ์‹ฑ, ๋ฌดํšจํ™”, ์žฌ์š”์ฒญ)์ด๋ผ๋Š” ํ˜„๋Œ€์ ์ธ ์š”๊ตฌ์‚ฌํ•ญ์„ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์—†์ด ์†Œํ™”ํ•˜๋Š”์ง€ ํŒŒ์•… [4, 21]. + +- [[Time-Travel Debugging]] + - ์—ฐ๊ฒฐ ์ด์œ : Redux DevTools๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ณ ์œ ์˜ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์œผ๋กœ, ์–ธ์ œ ์–ด๋–ค ์•ก์…˜์ด ๋””์ŠคํŒจ์น˜๋˜์–ด ์ƒํƒœ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€ ๊ธฐ๋กํ•˜๊ณ  ๋˜๊ฐ๋Š” ๊ธฐ์ˆ ์ด๋‹ค [2, 3]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: 5๋…„ ์ด์ƒ ์ง€์†๋˜๋Š” ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์•„ํ‚คํ…์ฒ˜์˜ ๋””๋ฒ„๊น… ์—ญ๋Ÿ‰์ด ๊ฐœ๋ฐœ์ž์˜ ์ƒ์‚ฐ์„ฑ ๋ฐ ์žฅ์•  ๋Œ€์‘์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ [11, 12]. + +### Deeper Research Questions +- Redux์˜ ์ƒํƒœ ๊ตฌ๋… ๋ฐ ์„ ํƒ์ž(selector) ํŒจํ„ด์€ ๋‚ด๋ถ€์ ์œผ๋กœ Context API์™€ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅด๊ฒŒ ์„ค๊ณ„๋˜์–ด ๋ถ€๋ถ„ ์ƒํƒœ ๋ณ€๊ฒฝ ์‹œ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ์ฐจ๋‹จํ•˜๋Š”๊ฐ€? +- RTK Query๋ฅผ ํ†ตํ•œ Redux ๋น„๋™๊ธฐ ์ƒํƒœ ๊ด€๋ฆฌ๋Š” Zustand ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๋Š” ๋น„๋™๊ธฐ ์บ์‹ฑ ํŒจํ„ด๊ณผ ๋น„๊ตํ•ด ์–ด๋– ํ•œ ์•„ํ‚คํ…์ฒ˜์  ์•ˆ์ •์„ฑ์„ ๋‹ด๋ณดํ•˜๋Š”๊ฐ€? +- "God Reducer" ์•ˆํ‹ฐ ํŒจํ„ด์ด ๋Œ€๊ทœ๋ชจ React ์ฝ”๋“œ๋ฒ ์ด์Šค ๋‚ด๋น„๊ฒŒ์ด์…˜ ๋ฐ ์„ฑ๋Šฅ ์ตœ์ ํ™”์— ๋ฏธ์น˜๋Š” ์น˜๋ช…์ ์ธ ๋ถ€์ž‘์šฉ์€ ๋ฌด์—‡์ธ๊ฐ€? +- ํ”„๋ก ํŠธ์—”๋“œ ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ๊ณผ๊ฑฐ์˜ ๊ฑฐ๋Œ€ํ•œ ๋‹จ์ผ ์Šคํ† ์–ด ๋ฐฉ์‹์—์„œ '์„œ๋ฒ„ ์ƒํƒœ'์™€ 'ํด๋ผ์ด์–ธํŠธ ๋กœ์ปฌ ์ƒํƒœ'๋กœ ํŒŒํŽธํ™”(Fragmentation)๋˜๋Š” ์ตœ์‹  ํŠธ๋ Œ๋“œ ์†์—์„œ, Redux์˜ ์ ์ • ์‚ฌ์šฉ ๋ฒ”์œ„๋Š” ์–ด๋–ป๊ฒŒ ์žฌ์กฐ์ •๋˜์—ˆ๋Š”๊ฐ€? +- 10๋ช… ์ด์ƒ์˜ ์‹œ๋‹ˆ์–ด ๋ฐ ์ฃผ๋‹ˆ์–ด ๊ฐœ๋ฐœ์ž๊ฐ€ ํ˜ผ์žฌ๋œ ํŒ€์—์„œ Redux์˜ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ๋Š” ๊ฐœ๋ฐœ ์†๋„๋ฅผ ์ €ํ•˜์‹œํ‚ค๋Š” ๋ถ€์ฑ„์ธ๊ฐ€, ์•„๋‹ˆ๋ฉด ๋ฒ„๊ทธ๋ฅผ ์‚ฌ์ „์— ๋ฐฉ์ง€ํ•˜๋Š” ๊ตฌ์กฐ์  ๋ฐฉ์–ด๋ง‰์ธ๊ฐ€? + +### Practical Application Contexts +- **Implementation:** React ํ”„๋กœ์ ํŠธ์˜ `store/` ๋˜๋Š” `features/` ๋””๋ ‰ํ† ๋ฆฌ์— ๋„๋ฉ”์ธ๋ณ„ Redux slice๋ฅผ ๋ฐฐ์น˜ํ•˜์—ฌ ์ „์—ญ ์ƒํƒœ ๋ฐ ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ๋ฅผ ์„ ์–ธํ•˜๊ณ  ์•ก์…˜๊ณผ ๋ณ‘ํ•ฉํ•˜์—ฌ ๊ด€๋ฆฌํ•œ๋‹ค [5-7]. +- **System Design:** ์žฅ๊ธฐ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์š”๊ตฌ๋˜๋Š” ๋Œ€๊ทœ๋ชจ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์‹œ์Šคํ…œ(์ด์ปค๋จธ์Šค ๊ฒฐ์ œ ๋“ฑ ๋ฐ์ดํ„ฐ ํ๋ฆ„์ด ์ค‘์š”ํ•œ 500๊ฐœ ์ปดํฌ๋„ŒํŠธ ์ด์ƒ์˜ ์•ฑ)์—์„œ ํŒŒ์ƒ ์ƒํƒœ ์ฒ˜๋ฆฌ์™€ ํŒ€ ๊ฐœ๋ฐœ ํŒจํ„ด ๊ฐ•์ œํ™” ๋ชฉ์ ์œผ๋กœ ์ฑ„ํƒํ•œ๋‹ค [2, 12, 13, 22]. +- **Operation / Maintenance:** ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์ด๋‚˜ ๋””๋ฒ„๊น… ์‹œ Redux DevTools๋ฅผ ์—ฐ๋™ํ•˜์—ฌ ํŠน์ • UI ๋ฒ„๊ทธ๋‚˜ ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ๊ผฌ์ž„ ํ˜„์ƒ์„ ์‹œ๊ฐ์ ์ธ ์•ก์…˜ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ํ†ตํ•ด ๋‹จ์‹œ๊ฐ„์— ํ•ด๊ฒฐํ•œ๋‹ค [11, 12]. +- **Learning Path:** ํ”„๋ก ํŠธ์—”๋“œ ๊ต์œก ์‹œ, Context API์˜ ๊ทผ๋ณธ ์›๋ฆฌ์™€ ํ•œ๊ณ„๋ฅผ ๋จผ์ € ํ•™์Šตํ•˜๊ณ , Zustand์˜ ์ƒ์‚ฐ์„ฑ์„ ๊ฒฝํ—˜ํ•œ ๋’ค, ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ํ‘œ์ค€์ด์ž ๊ฐ€์žฅ ๋ณต์žก๋„๊ฐ€ ๋†’์€ Redux์˜ ํŒจํ„ด๊ณผ ๊ตฌ์กฐ์  ์ด์ ์„ ์ตœ์ข…์ ์œผ๋กœ ํ•™์Šตํ•˜๋Š” ๋‹จ๊ณ„์  ์ ‘๊ทผ์ด ์š”๊ตฌ๋œ๋‹ค [23]. +- **My Project Relevance:** ๊ธ€๋กœ๋ฒŒ ์ƒํƒœ๊ฐ€ ๋‹ค์ˆ˜์˜ ์ปดํฌ๋„ŒํŠธ์— ๋ณต์žกํ•˜๊ฒŒ ์–ฝํ˜€ ์žˆ๊ฑฐ๋‚˜, ํŒ€์› ๊ฐ„ ๋™์ผํ•œ ๋น„๋™๊ธฐ/์ƒํƒœ ๊ด€๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๊ฐ•์ œํ•˜์—ฌ ํŒŒํŽธํ™”๋ฅผ ๋ง‰์•„์•ผ ํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•  ๋•Œ ํ•ต์‹ฌ์ ์ธ ๊ธฐ์ˆ  ์Šคํƒ์œผ๋กœ ๊ฒ€ํ† ๋  ์ˆ˜ ์žˆ๋‹ค [1, 12]. + +### Adjacent Topics +- [[Server State Management (TanStack Query ๋“ฑ)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ํด๋ผ์ด์–ธํŠธ ์ „์—ญ ์ƒํƒœ์™€ ๊ตฌ๋ณ„๋˜๋Š” "์„œ๋ฒ„ ๋ฐ์ดํ„ฐ(API ์บ์‹ฑ, ๋™๊ธฐํ™”, ๋กœ๋”ฉ/์—๋Ÿฌ ์‚ฌ์ดํด)"๋งŒ์„ ์ „๋ฌธ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ชจ๋˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ Redux์˜ ์—ญํ•  ๋น„๊ต ๋ฐ ์—ฐ๋™ ๋ฐฉ์•ˆ ํƒ์ƒ‰ [24, 25]. +- [[React Rendering Optimization]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์„ ํƒ๊ณผ ๋ณ„๊ฐœ๋กœ, React ์ปดํฌ๋„ŒํŠธ ์ƒ๋ช…์ฃผ๊ธฐ ๋ฐ ๋ฉ”๋ชจ์ด์ œ์ด์…˜(`useMemo`, `useCallback`, `React.memo`)์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํผํฌ๋จผ์Šค์— ๋ฏธ์น˜๋Š” ์›๋ฆฌ์™€ ํ”„๋กœํŒŒ์ผ๋ง ๋ฐฉ๋ฒ• ํƒ์ƒ‰ [26-28]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Rollup.md b/00_Raw/Rollup.md new file mode 100644 index 00000000..5a38f732 --- /dev/null +++ b/00_Raw/Rollup.md @@ -0,0 +1,57 @@ +# [[Rollup]] + +## ๐Ÿ“Œ Brief Summary +Rollup์€ 2025๋…„ ๊ธฐ์ค€ ์ตœ์‹  ํ”„๋ก ํŠธ์—”๋“œ ๋นŒ๋“œ ๋„๊ตฌ์ธ Vite์˜ ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ๋ฅผ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๋‹ด๋‹นํ•˜๋Š” ๋ชจ๋“ˆ ๋ฒˆ๋“ค๋Ÿฌ์ž…๋‹ˆ๋‹ค [1]. ๊ฐœ๋ฐœ ๋‹จ๊ณ„์—์„œ๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ES ๋ชจ๋“ˆ(ESM)์„ ์‚ฌ์šฉํ•˜๋Š” Vite๊ฐ€ ์‹ค์ œ ๋ฐฐํฌ ์‹œ์ ์—๋Š” Rollup์œผ๋กœ ์ „ํ™˜ํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋ฅผ ๋ณ‘ํ•ฉํ•˜๊ณ  ์ตœ์ ํ™”ํ•ฉ๋‹ˆ๋‹ค [1, 2]. ์ž๋™ ์ฝ”๋“œ ๋ถ„ํ• (Code Splitting)๊ณผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ํŠธ๋ฆฌ ์‰์ดํ‚น(Tree-shaking) ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ๋งค์šฐ ์ตœ์ ํ™”๋œ ์ตœ์ข… ์—์…‹์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ ์—ญํ• ์ž…๋‹ˆ๋‹ค [1]. + +## ๐Ÿ“– Core ๋Œ€Content +* **Vite์™€์˜ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์•„ํ‚คํ…์ฒ˜:** Vite๋Š” ๋กœ์ปฌ ๊ฐœ๋ฐœ ์‹œ์—๋Š” ๋ฒˆ๋“ค๋ง ์—†์ด ๋„ค์ดํ‹ฐ๋ธŒ ESM์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ œ๊ณตํ•˜์—ฌ ๊ทน๋„๋กœ ๋น ๋ฅธ ์‹œ์ž‘๊ณผ HMR(Hot Module Replacement)์„ ์ง€์›ํ•˜์ง€๋งŒ, ํ”„๋กœ๋•์…˜ ๋ฐฐํฌ ์‹œ์—๋Š” Rollup์„ ์‚ฌ์šฉํ•˜์—ฌ ์ตœ์ ํ™”๋œ ๋ฒˆ๋“ค(Bundled build)์„ ์ƒ์„ฑํ•˜๋Š” ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๋ฐฉ์‹์„ ์ทจํ•ฉ๋‹ˆ๋‹ค [1]. +* **๋ฒˆ๋“ค ์ตœ์ ํ™” ๋ฐ ํŠธ๋ฆฌ ์‰์ดํ‚น (Tree-shaking):** Rollup์€ ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ ์‹œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์—์„œ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์ฝ”๋“œ๋ฅผ ์ž๋™์œผ๋กœ ์ œ๊ฑฐ(Tree-shaking)ํ•˜๊ณ  ํšจ์œจ์ ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๋ถ„ํ• ํ•˜์—ฌ ์ตœ์ ํ™”๋œ ์—์…‹์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [1]. +* **์ฒญํฌ ์ˆ˜๋™ ์ œ์–ด (`manualChunks`):** ๊ธฐ๋ณธ ์„ค์ • ์ƒํƒœ์—์„œ Rollup์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ์™€ `node_modules`์˜ ๋ชจ๋“  ์ข…์†์„ฑ์„ ๋‹จ์ผ ํŒŒ์ผ(`index.js`)๋กœ ๋ฌถ์–ด ๊ฑฐ๋Œ€ํ•œ ๋ฒˆ๋“ค์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3]. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” Rollup ์˜ต์…˜ ์ค‘ `manualChunks`๋ฅผ ์„ธ๋ฐ€ํ•˜๊ฒŒ ์„ค์ •ํ•˜์—ฌ, ์ž์ฃผ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ๋ฌด๊ฑฐ์šด ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(React ์ฝ”์–ด, Recharts, Lodash, ์•„์ด์ฝ˜ ๋“ฑ)๋ฅผ ๋ณ„๋„์˜ ์ฒญํฌ ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค [4-6]. +* **์บ์‹œ ํšจ์œจ์„ฑ ๊ฐœ์„ :** `manualChunks`๋ฅผ ํ†ตํ•ด ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ถ„๋ฆฌํ•˜๋ฉด, ํ•ด๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ž์ฃผ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๋Ÿฌ ๋ฒˆ ๋ฐฐํฌํ•˜๋”๋ผ๋„ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ด๋ฅผ ์บ์‹œํ•˜์—ฌ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ดˆ๊ธฐ ๋กœ๋“œ ์„ฑ๋Šฅ์ด ํฌ๊ฒŒ ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค [5-7]. + +## โš–๏ธ Trade-offs & Caveats +* **์ดˆ๊ธฐ ์„ค์ • ๋ถ€์กฑ ์‹œ ๋Œ€์šฉ๋Ÿ‰ ๋ฒˆ๋“ค ๋ฐœ์ƒ:** ๊ธฐ๋ณธ ์„ค์ •์œผ๋กœ ๋‘˜ ๊ฒฝ์šฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ชจ๋“  ์ข…์†์„ฑ์ด ํ•˜๋‚˜์˜ ํŒŒ์ผ์— Eager Import ๋˜์–ด ๊ฒฐํ•ฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3]. ์ด๋Š” ๋ฏธ๋‹ˆํŒŒ์ด(Minification) ํ›„์—๋„ 500kB๋ฅผ ์ดˆ๊ณผํ•˜๋Š” ๋Œ€๊ทœ๋ชจ ์ฒญํฌ(Large Chunks)๋ฅผ ์ƒ์„ฑํ•˜์—ฌ, ๋‹ค์šด๋กœ๋“œ ์‹œ๊ฐ„์„ ์ง€์—ฐ์‹œํ‚ค๊ณ  ์ €์‚ฌ์–‘ ๊ธฐ๊ธฐ์—์„œ ํŒŒ์‹ฑ ๋ฐ ์ปดํŒŒ์ผ์— ๋ฌด๋ฆฌ๋ฅผ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3, 8, 9]. +* **์บ์‹œ ๋ฌดํšจํ™”(Cache Invalidation) ๋ฌธ์ œ:** ๋‹จ์ผ ๊ฑฐ๋Œ€ ๋ฒˆ๋“ค๋กœ ๋นŒ๋“œํ•  ๊ฒฝ์šฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ž‘์€ ์ฝ”๋“œ ํ•˜๋‚˜๋งŒ ์ˆ˜์ •ํ•˜๋”๋ผ๋„ ์ „์ฒด ๋ฒˆ๋“ค์ด ์ƒˆ๋กœ ํ•ด์‹œ(Hash)๋˜์–ด ์‚ฌ์šฉ์ž๋Š” ๋ชจ๋“  JavaScript ํŒŒ์ผ์„ ๋‹ค์‹œ ๋‹ค์šด๋กœ๋“œํ•ด์•ผ ํ•˜๋Š” ๋น„ํšจ์œจ์„ฑ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [9]. ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๋ ค๋ฉด `manualChunks` ์„ค์ •๊ณผ `React.lazy`๋ฅผ ๊ฒฐํ•ฉํ•œ ๋ผ์šฐํŠธ ๊ธฐ๋ฐ˜ ์ฝ”๋“œ ๋ถ„ํ•  ๋“ฑ ์ถ”๊ฐ€์ ์ธ ์ตœ์ ํ™” ์ž‘์—…์ด ๊ฐ•์ œ๋ฉ๋‹ˆ๋‹ค [3, 6]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] +- [[Vite]] + - ์—ฐ๊ฒฐ ์ด์œ : Rollup์€ Vite์˜ ์•„ํ‚คํ…์ฒ˜ ๋‚ด์—์„œ ํ”„๋กœ๋•์…˜ ๋ฐฐํฌ ์‹œ ์ตœ์ ํ™”๋œ ๋นŒ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋‚ด๋ถ€ ์—”์ง„์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค [1]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ฐœ๋ฐœ ๋ชจ๋“œ(ESM)์™€ ๋ฐฐํฌ ๋ชจ๋“œ(Rollup)๋ฅผ ๋‹ค๋ฅด๊ฒŒ ๊ฐ€์ ธ๊ฐ€๋Š” Vite์˜ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๋ฒˆ๋“ค๋ง ์•„ํ‚คํ…์ฒ˜ ์ „๋žต์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1, 2]. +- [[Tree-shaking]] + - ์—ฐ๊ฒฐ ์ด์œ : Rollup์ด ๋ฐฐํฌ์šฉ ์ฝ”๋“œ๋ฅผ ์ตœ์ ํ™”ํ•  ๋•Œ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ๋ฅผ ๋œ์–ด๋‚ด๋Š” ํ•ต์‹ฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค [1]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ES ๋ชจ๋“ˆ ๊ธฐ๋ฐ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ์ด ์™œ ์ตœ์ข… ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ ์ตœ์ ํ™”์— ํ•„์ˆ˜์ ์ธ์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [10]. + +#### [๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ] +- [[manualChunks]] + - ์—ฐ๊ฒฐ ์ด์œ : Rollup์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฑฐ๋Œ€ํ•œ ๋ฉ”์ธ ๋ฒˆ๋“ค์„ ์„ธ๋ถ„ํ™”๋œ ๋ฒค๋” ์ฒญํฌ(Vendor chunk)๋กœ ์ชผ๊ฐค ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ํ•ต์‹ฌ ์„ค์ •์ž…๋‹ˆ๋‹ค [4-6]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ธŒ๋ผ์šฐ์ € ์บ์‹ฑ์„ ๊ทน๋Œ€ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์ฝ”๋“œ๋ฅผ ์„ฑ๊ฒฉ(๋ณ€๊ฒฝ ๋นˆ๋„)์— ๋”ฐ๋ผ ๋ถ„๋ฆฌํ•˜๋Š” ์ตœ์ ํ™” ์ „๋žต์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [6, 7]. +- [[Code Splitting]] + - ์—ฐ๊ฒฐ ์ด์œ : Rollup์˜ ๊ธฐ๋Šฅ๊ณผ React์˜ ์ง€์—ฐ ๋กœ๋”ฉ(`React.lazy`)์„ ๊ฒฐํ•ฉํ•˜์—ฌ ๊ตฌํ˜„๋˜๋Š” ์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค [3, 11]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ดˆ๊ธฐ ํŽ˜์ด๋กœ๋“œ(Payload)๋ฅผ ์ค„์ด๊ณ  Core Web Vitals๋ฅผ ๊ฐœ์„ ํ•˜๋Š” ๋Ÿฐํƒ€์ž„ ์ตœ์ ํ™” ๋ฐฉ๋ฒ•์„ ํ•™์Šตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [9, 12]. + +### Deeper Research Questions +- Vite๋Š” ์™œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋Š” Rollup์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋„ค์ดํ‹ฐ๋ธŒ ESM์„ ์‚ฌ์šฉํ•˜๋ฉฐ, ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ์—์„œ๋งŒ Rollup์„ ๋„์ž…ํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜๋ฅผ ์„ ํƒํ–ˆ๋Š”๊ฐ€? +- Rollup์˜ Tree-shaking ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ๋นŒ๋“œ ์‹œ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๋ฐ๋“œ ์ฝ”๋“œ(Dead code)๋ฅผ ์‹๋ณ„ํ•˜๊ณ  ์ตœ์ข… ๋ฒˆ๋“ค์—์„œ ์ œ์™ธํ•˜๋Š”๊ฐ€? +- `manualChunks`๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฒค๋”(Vendor) ํŒŒ์ผ์„ ๋ถ„ํ• ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ชจ๋“ˆ ๊ฐ„ ์ค‘๋ณต ํฌํ•จ ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ์„ค์ • ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? +- Rollup์ด ์ƒ์„ฑํ•œ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ๋ถ„์„ํ•˜๊ธฐ ์œ„ํ•ด `rollup-plugin-visualizer`๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋ฐ์ดํ„ฐ๋Š” ์‹ค์ œ ์„ฑ๋Šฅ ๊ฐœ์„ ์— ์–ด๋–ป๊ฒŒ ํ™œ์šฉ๋˜๋Š”๊ฐ€? +- Rollup์˜ ๋นŒ๋“œ ์ตœ์ ํ™”๊ฐ€ FCP, LCP, INP ๋“ฑ Core Web Vitals ์ง€ํ‘œ ํ–ฅ์ƒ์— ๋ฏธ์น˜๋Š” ๊ตฌ์ฒด์ ์ธ ์ธ๊ณผ๊ด€๊ณ„๋Š” ๋ฌด์—‡์ธ๊ฐ€? + +### Practical Application Contexts +- **Implementation:** `vite.config.js` ๋‚ด๋ถ€์— `build.rollupOptions.output.manualChunks`๋ฅผ ๊ตฌ์„ฑํ•˜์—ฌ `react`, `react-dom` ๋“ฑ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ณ„๋„์˜ ํŒŒ์ผ๋กœ ๊ฐ•์ œ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค [4, 6]. +- **System Design:** ํ”„๋ก ํŠธ์—”๋“œ ํ”„๋กœ๋•์…˜ ์‹œ์Šคํ…œ ์„ค๊ณ„ ์‹œ, ์ž์ฃผ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋ถ„๋ฆฌํ•˜์—ฌ CDN ์บ์‹œ ํžˆํŠธ์œจ์„ ๋†’์ด๋„๋ก ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค [5, 6]. +- **Operation / Maintenance:** CI/CD ํŒŒ์ดํ”„๋ผ์ธ์—์„œ "500 kB ์ด์ƒ์˜ ์ฒญํฌ" ๊ฒฝ๊ณ ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ, `rollup-plugin-visualizer`๋ฅผ ํ†ตํ•ด ๋ฒˆ๋“ค ์ƒํƒœ๋ฅผ ์ ๊ฒ€ํ•˜๊ณ  ๋ถ„ํ•  ์„ค์ •์„ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค [8, 13, 14]. +- **Learning Path:** React ์ตœ์ ํ™” ํ•™์Šต ์‹œ, ๋‹จ์ˆœํžˆ `React.lazy()`๋งŒ ๋ฐฐ์šฐ๋Š” ๊ฒƒ์„ ๋„˜์–ด ๋ฒˆ๋“ค๋Ÿฌ(Rollup) ๋ ˆ๋ฒจ์—์„œ์˜ ์ฝ”๋“œ ์ฒญํ‚น(Chunking) ์›๋ฆฌ๋ฅผ ํ•จ๊ป˜ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค [3, 6]. +- **My Project Relevance:** Vite ๊ธฐ๋ฐ˜ React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ Vercel์ด๋‚˜ AWS ์„œ๋ฒ„์— ๋ฐฐํฌํ•˜๊ธฐ ์ „์— ๋นŒ๋“œ ์†๋„ ๋ฐ ์ดˆ๊ธฐ ๋‹ค์šด๋กœ๋“œ ์†๋„๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•œ ํ•„์ˆ˜ ์ ๊ฒ€ ๋‹จ๊ณ„๋กœ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค [2, 11]. + +### Adjacent Topics +- [[ES Modules (ESM)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: Rollup์˜ ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ ์ด์ „, Vite๊ฐ€ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ์ฝ”๋“œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ฆ‰๊ฐ์ ์œผ๋กœ ๋ธŒ๋ผ์šฐ์ €์— ๋ฐ˜์˜ํ•˜๋Š” ์›๋ฆฌ ํŒŒ์•… [1, 15]. +- [[Core Web Vitals]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: Rollup์˜ ๋ฒˆ๋“ค ๋ถ„ํ•  ๋ฐ ๊ฒฝ๋Ÿ‰ํ™” ์ž‘์—…์ด LCP(Largest Contentful Paint)๋‚˜ INP(Interaction to Next Paint)์™€ ๊ฐ™์€ ๋ธŒ๋ผ์šฐ์ € ์„ฑ๋Šฅ ์ธก์ • ์ง€ํ‘œ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ฐœ์„ ํ•˜๋Š”์ง€ ์กฐ์‚ฌ [9, 14]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Scalable Frontend Systems.md b/00_Raw/Scalable Frontend Systems.md new file mode 100644 index 00000000..57f7da94 --- /dev/null +++ b/00_Raw/Scalable Frontend Systems.md @@ -0,0 +1,65 @@ +# [[Scalable Frontend Systems]] + +## ๐Ÿ“Œ Brief Summary +๋Œ€๊ทœ๋ชจ ํ”„๋ก ํŠธ์—”๋“œ ์‹œ์Šคํ…œ(Scalable Frontend Systems)์€ ๋†’์€ ์œ ์ง€๋ณด์ˆ˜์„ฑ, ๊ณ ์„ฑ๋Šฅ, ํ™•์žฅ์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ์กด์˜ ๋‹จ์ˆœํ•œ ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰์„ ๋„˜์–ด ์ •๊ตํ•˜๊ฒŒ ๋ถ„์‚ฐ๋œ ์†Œํ”„ํŠธ์›จ์–ด ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋„์ž…ํ•œ ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค [1]. ๊ธฐ๋Šฅ๋ณ„ ๋˜๋Š” ๋„๋ฉ”์ธ ์ค‘์‹ฌ์˜ ๋ชจ๋“ˆํ˜• ํด๋” ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, SOLID์™€ ๊ฐ™์€ ํด๋ฆฐ ์ฝ”๋“œ ์›์น™์„ ์ค€์ˆ˜ํ•˜๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒํƒœ์™€ ์„œ๋ฒ„ ์ƒํƒœ๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค [2-4]. ๋”๋ถˆ์–ด ์ž๋™ํ™”๋œ ๋นŒ๋“œ ์ตœ์ ํ™”, ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ๋ Œ๋”๋ง ์ตœ์ ํ™”, ์ •๊ตํ•œ ์—๋Ÿฌ ์ฒ˜๋ฆฌ ๋ฐ ํ˜‘์—… ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์•ˆ์ •์ ์œผ๋กœ ์„ฑ์žฅํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•ฉ๋‹ˆ๋‹ค [1, 5]. + +## ๐Ÿ“– Core Content + +* **์•„ํ‚คํ…์ฒ˜ ํŒจ๋Ÿฌ๋‹ค์ž„๊ณผ ํด๋” ๊ตฌ์กฐ:** ํ™•์žฅ์„ฑ์„ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํŒŒ์ผ์„ ํŒŒ์ผ์˜ ์œ ํ˜•(components, hooks ๋“ฑ)๋ณ„๋กœ ๋ชจ์•„๋‘๋Š” ๊ตฌ์กฐ์—์„œ ๊ธฐ๋Šฅ(Feature)์ด๋‚˜ ๋„๋ฉ”์ธ ์ค‘์‹ฌ์œผ๋กœ ๊ตฌ์กฐ๋ฅผ ๊ฐœํŽธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [2, 6]. ํŠนํžˆ Feature-Sliced Design (FSD)์€ ์ฝ”๋“œ ๊ณ„์ธต์„ Scope์™€ ์ฑ…์ž„์— ๋”ฐ๋ผ ๋ถ„ํ• (shared, entities, features, widgets, pages, app)ํ•˜๊ณ , ํ•˜์œ„ ๊ณ„์ธต์ด ์ƒ์œ„ ๊ณ„์ธต์„ ์ฐธ์กฐํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ํ•˜๋Š” ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ๊ณผ ์บก์Аํ™”๋œ Public API ๊ทœ์น™์„ ๊ฐ•์ œํ•˜์—ฌ ๊ฒฐํ•ฉ๋„(Coupling)๋ฅผ ๊ทน์ ์œผ๋กœ ๋‚ฎ์ถฅ๋‹ˆ๋‹ค [7-10]. +* **์†Œํ”„ํŠธ์›จ์–ด ์—”์ง€๋‹ˆ์–ด๋ง ์›์น™ ์ ์šฉ:** ํ™•์žฅ ๊ฐ€๋Šฅํ•œ React ์‹œ์Šคํ…œ์€ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ•˜๋‚˜์˜ ์—ญํ• ๋งŒ ํ•˜๋„๋ก ๋ถ„๋ฆฌํ•˜๋Š” ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)์„ ๋น„๋กฏํ•˜์—ฌ ๊ฐœ๋ฐฉ/ํ์‡„ ์›์น™(OCP), DRY, KISS, YAGNI ๋“ฑ์˜ SOLID ๋ฐ ํด๋ฆฐ ์ฝ”๋“œ ์›์น™์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค [3, 11]. ์ด๋กœ ์ธํ•ด ์ฝ”๋“œ์˜ ์˜ˆ์ธก ๊ฐ€๋Šฅ์„ฑ์ด ํ–ฅ์ƒ๋˜๊ณ  ๋ถˆํ•„์š”ํ•œ ์กฐ๊ธฐ ์ตœ์ ํ™”๋‚˜ ๋ณต์žก์„ฑ์ด ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค [12]. +* **์ƒํƒœ ๊ด€๋ฆฌ์˜ ํŒŒํŽธํ™” (State Management):** ํ•˜๋‚˜์˜ ๊ฑฐ๋Œ€ํ•œ Redux ์Šคํ† ์–ด์— ์˜์กดํ•˜๊ธฐ๋ณด๋‹ค, ๋ฐ์ดํ„ฐ์˜ ์„ฑ๊ฒฉ์— ๋งž๋Š” ๋„๊ตฌ๋ฅผ ์„ ํƒํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ง„ํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค [13]. ๋ถˆํ•„์š”ํ•œ ์ „์—ญ ๋ Œ๋”๋ง์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด Context API ๋Œ€์‹  ์„ ํƒ์ž(Selector) ํŒจํ„ด์„ ์ง€์›ํ•˜๋Š” Zustand ๋“ฑ์„ ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ์— ์‚ฌ์šฉํ•˜๋ฉฐ, API์—์„œ ๊ฐ€์ ธ์˜ค๋Š” ์„œ๋ฒ„ ์ƒํƒœ๋Š” ์บ์‹ฑ๊ณผ ๋™๊ธฐํ™”๋ฅผ ์œ„ํ•ด TanStack Query(React Query)๋กœ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค [4, 14]. +* **์„ฑ๋Šฅ ์—”์ง€๋‹ˆ์–ด๋ง ๋ฐ ๋ Œ๋”๋ง ์ตœ์ ํ™”:** ์ดˆ๊ธฐ์˜ ๊ฑฐ๋Œ€ํ•œ JavaScript ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด `React.lazy`์™€ Suspense๋ฅผ ํ™œ์šฉํ•œ ๋ผ์šฐํŠธ ๋ฐ ์ปดํฌ๋„ŒํŠธ ์ˆ˜์ค€์˜ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…(Code Splitting)์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค [15-17]. ์„ฑ๋Šฅ ๋ณ‘๋ชฉ์„ ์ผ์œผํ‚ค๋Š” ๋ฌด์˜๋ฏธํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด `React.memo`, `useCallback`, `useMemo`๋ฅผ ์ ์žฌ์ ์†Œ์— ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, React Compiler์™€ ๊ฐ™์€ ๋นŒ๋“œ ํƒ€์ž„ ๋„๊ตฌ๋ฅผ ๋„์ž…ํ•ด ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์ž๋™ํ™”ํ•ฉ๋‹ˆ๋‹ค [18-21]. ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐฉ๋Œ€ํ•œ ๋ชฉ๋ก์˜ ๊ฒฝ์šฐ ๊ฐ€์ƒํ™”(Virtualization/Windowing)๋ฅผ ๋„์ž…ํ•˜์—ฌ DOM ๋ถ€ํ•˜๋ฅผ ์ค„์ž…๋‹ˆ๋‹ค [22]. +* **๋ณต์›๋ ฅ(Resilience)๊ณผ ๋ชจ๋‹ˆํ„ฐ๋ง:** ์ „์ฒด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ Œ๋”๋ง ํฌ๋ž˜์‹œ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋ถˆ์•ˆ์ •ํ•œ UI ์˜์—ญ(์จ๋“œํŒŒํ‹ฐ ์œ„์ ฏ ๋“ฑ)์„ Error Boundary๋กœ ๊ฐ์‹ธ์„œ ๊ฒฉ๋ฆฌํ•ฉ๋‹ˆ๋‹ค [23, 24]. ๋ธŒ๋ผ์šฐ์ € ๋ฉ”๋ชจ๋ฆฌ ํƒญ์˜ Heap Snapshot์„ ํ†ตํ•ด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋””๋ฒ„๊น…ํ•˜๊ณ , ๋ฐฐํฌ ์ดํ›„์—๋Š” Sentry, LogRocket, Datadog๊ณผ ๊ฐ™์€ ํด๋ผ์šฐ๋“œ ๊ด€์ธก(Observability) ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ด ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์˜ ์‚ฌ์šฉ์ž ์—๋Ÿฌ ๋ฐ ์„ธ์…˜์„ ์‹ค์‹œ๊ฐ„ ๋ชจ๋‹ˆํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค [25-27]. +* **ํŒ€ ํ˜‘์—… ๋ฐ ๊ฑฐ๋ฒ„๋„Œ์Šค ๊ทœ์น™:** ์œˆ๋„์šฐ/๋ฆฌ๋ˆ…์Šค ํ™˜๊ฒฝ ์ฐจ์ด๋กœ ์ธํ•œ CI ๋นŒ๋“œ ์—๋Ÿฌ๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด ํŒŒ์ผ๋ช…์— kebab-case๋ฅผ ๊ฐ•์ œํ•˜๊ฑฐ๋‚˜(์ปดํฌ๋„ŒํŠธ ์ด๋ฆ„์€ PascalCase ์ ์šฉ), ESLint ๋ฐ Git Hooks๋ฅผ ํ†ตํ•ด ์•„ํ‚คํ…์ฒ˜ ๊ทœ์น™ ๋ฐ ์ฝ”๋“œ ํฌ๋งท์„ ์ž๋™ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค [28-30]. Git-flow, GitHub Flow ๋“ฑ ์†Œ๊ทœ๋ชจ/๋Œ€๊ทœ๋ชจ ํŒ€ ๊ทœ๋ชจ์— ๋งž๋Š” ๋ช…ํ™•ํ•œ ๋ธŒ๋žœ์น˜ ์ „๋žต๊ณผ ํ‹ฐ์ผ“ ID ๊ธฐ๋ฐ˜ ์ถ”์  ๊ด€๋ฆฌ๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค [31, 32]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +- [[Feature-Sliced Design (FSD)]] + - ์—ฐ๊ฒฐ ์ด์œ : ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ํ”„๋ก ํŠธ์—”๋“œ ์•„ํ‚คํ…์ฒ˜์—์„œ ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ฐœ์ƒํ•˜๋Š” '๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์–ฝํž˜' ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋„์ž…๋œ ํ•ต์‹ฌ์ ์ธ ์ปดํฌ๋„ŒํŠธ/๋””๋ ‰ํ† ๋ฆฌ ๋ถ„ํ•  ๋ฐฉ๋ฒ•๋ก ์ž…๋‹ˆ๋‹ค [33, 34]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ํ๋ฆ„, ๊ณ„์ธต๋ณ„(Layered) ๋ถ„ํ• , ์บก์Аํ™”๋ฅผ ํ†ตํ•œ Public API ์ธํ„ฐํŽ˜์ด์Šค ์„ค๊ณ„ ์›๋ฆฌ [7, 9]. + +- [[State Management Fragmentation (์ƒํƒœ ๊ด€๋ฆฌ ํŒŒํŽธํ™”)]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋‹จ์ผ ์Šคํ† ์–ด๋‚˜ Context API๋งŒ์œผ๋กœ๋Š” ๋ฆฌ๋ Œ๋”๋ง ์„ฑ๋Šฅ ์ตœ์ ํ™”๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•ด์ง์— ๋”ฐ๋ผ, ์ „์—ญ ์ƒํƒœ(Zustand), ์„œ๋ฒ„ ์ƒํƒœ(React Query), ๋กœ์ปฌ ์ƒํƒœ๋กœ ์—ญํ• ์„ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ด€๋ฆฌํ•˜๋Š” ํŠธ๋ Œ๋“œ์ž…๋‹ˆ๋‹ค [4, 13, 35]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง ๋ฐฉ์ง€ ์›๋ฆฌ(Zustand์˜ ์„ ํƒ์ž ํŒจํ„ด)์™€ ์„œ๋ฒ„/ํด๋ผ์ด์–ธํŠธ ๋ฐ์ดํ„ฐ ๊ฐ„์˜ ์บ์‹ฑ ๋ฐ ๋™๊ธฐํ™” ์ „๋žต [4, 14]. + +- [[React Compiler]] + - ์—ฐ๊ฒฐ ์ด์œ : ๊ฐœ๋ฐœ์ž๊ฐ€ ์ˆ˜๋™์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋˜ `useMemo`, `useCallback`, `React.memo` ๋“ฑ์˜ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ๋นŒ๋“œ ํƒ€์ž„์— ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•ด ์ฃผ์–ด, ๊น”๋”ํ•œ ์ฝ”๋“œ๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ ์„ฑ๋Šฅ ํ™•์žฅ์„ ๊ฐ€๋Šฅ์ผ€ ํ•˜๋Š” ์ตœ์‹  ๋„๊ตฌ์ž…๋‹ˆ๋‹ค [19, 36]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: React์˜ ๋ Œ๋”๋ง ์ตœ์ ํ™” ํ•œ๊ณ„ ๋ฐ Rules of React ์ค€์ˆ˜ ์ค‘์š”์„ฑ, ์จ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€์˜ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ [37, 38]. + +- [[Error Boundaries]] + - ์—ฐ๊ฒฐ ์ด์œ : ์‹œ์Šคํ…œ์˜ ํฌ๊ธฐ๊ฐ€ ์ปค์งˆ ๋•Œ ๋‹จ์ผ ์ปดํฌ๋„ŒํŠธ์˜ ์˜ค๋ฅ˜๊ฐ€ ์ „์ฒด ์•ฑ์˜ 'ํ™”์ดํŠธ ์Šคํฌ๋ฆฐ' ํฌ๋ž˜์‹œ๋กœ ์ด์–ด์ง€์ง€ ์•Š๊ฒŒ UI์˜ ์ผ๋ถ€๋ถ„๋งŒ ๋Œ€์ฒด(Fallback)ํ•˜์—ฌ ์‹œ์Šคํ…œ ๋ณต์›๋ ฅ(Resilience)์„ ๋ณด์žฅํ•˜๋Š” ์žฅ์น˜์ž…๋‹ˆ๋‹ค [23, 24, 39]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ํ™œ์šฉํ•œ ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ ํฌ์ฐฉ ์›๋ฆฌ ๋ฐ ๋Œ€๊ทœ๋ชจ UI ๋ณดํ˜ธ ์ „๋žต [40, 41]. + +- [[Code Splitting & Lazy Loading (์ฝ”๋“œ ๋ถ„ํ• ๊ณผ ์ง€์—ฐ ๋กœ๋”ฉ)]] + - ์—ฐ๊ฒฐ ์ด์œ : ํ”„๋ก ํŠธ์—”๋“œ ์ฝ”๋“œ๊ฐ€ ๋น„๋Œ€ํ•ด์ง€๋ฉด์„œ ์ดˆ๊ธฐ ๋กœ๋”ฉ ์†๋„(TTI, LCP)๋ฅผ ์ตœ์ ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์ˆ˜์ ์œผ๋กœ ์š”๊ตฌ๋˜๋Š” ๊ธฐ์ˆ ๋กœ, Vite๋‚˜ React.lazy๋ฅผ ํ†ตํ•ด ํ•„์š”ํ•œ ์‹œ์ ์—๋งŒ ๋ชจ๋“ˆ์„ ๋‹ค์šด๋กœ๋“œํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค [15, 17, 42]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ชจ๋“ˆ ๋ฒˆ๋“ค๋Ÿฌ์˜ ์ฒญํฌ(Chunk) ๋ถ„๋ฆฌ ์›๋ฆฌ ๋ฐ ๋ธŒ๋ผ์šฐ์ € ์„ฑ๋Šฅ ์ตœ์ ํ™”(Core Web Vitals)์™€ ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ์˜ ์ƒ๊ด€๊ด€๊ณ„ [43, 44]. + +### Deeper Research Questions + +- Feature-Sliced Design (FSD) ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋„์ž…ํ•  ๋•Œ, ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ(Feature)์ด ๊ณต์œ ํ•ด์•ผ ํ•˜๋Š” ๊ต์ฐจ ๊ด€์‹ฌ์‚ฌ(Cross-cutting concerns)๋‚˜ ํ•˜์œ„ ๊ธฐ๋Šฅ ๊ฒฐํ•ฉ ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ณ„์ธต ๋ถ„๋ฆฌ์™€ ์บก์Аํ™”๋ฅผ ํ›ผ์†ํ•˜์ง€ ์•Š๊ณ  ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? [45, 46] +- React Context API๊ฐ€ ์•ผ๊ธฐํ•˜๋Š” ๋ถˆํ•„์š”ํ•œ ๋ Œ๋” ํŠธ๋ฆฌ ๋ฆฌ๋ Œ๋”๋ง ๋ฌธ์ œ๋ฅผ Zustand๋‚˜ Redux ๊ฐ™์€ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์„ ํƒ์ž(Selector) ํŒจํ„ด ๋ฐ ์™ธ๋ถ€ ์Šคํ† ์–ด ๊ตฌ๋… ๋ฐฉ์‹๊ณผ ๋น„๊ตํ–ˆ์„ ๋•Œ, ์„ฑ๋Šฅ๊ณผ ํ™•์žฅ์„ฑ ์ธก๋ฉด์—์„œ ๊ตฌ์ฒด์ ์ธ ์ฐจ์ด๋Š” ๋ฌด์—‡์ธ๊ฐ€? [14, 35, 47] +- Vite ๋นŒ๋“œ ํ™˜๊ฒฝ์—์„œ ๋ฒˆ๋“ค ํฌ๊ธฐ ๊ฒฝ๊ณ ("Large Chunks")๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด `manualChunks`์™€ `React.lazy`๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…์„ ๊ตฌํ˜„ํ•  ๋•Œ, ์ดˆ๊ธฐ ๋ Œ๋”๋ง ์„ฑ๋Šฅ ๊ฐœ์„ ๊ณผ ๋ธŒ๋ผ์šฐ์ € ์บ์‹ฑ ํšจ์œจ์€ ๊ฐ๊ฐ ์–ด๋–ป๊ฒŒ ์ž‘์šฉํ•˜๋Š”๊ฐ€? [42, 48, 49] +- Next.js์˜ React Server Components (RSC)๋ฅผ ์ฑ„ํƒํ•จ์œผ๋กœ์จ ์„œ๋ฒ„์—์„œ ๋ฏธ๋ฆฌ ๋ Œ๋”๋งํ•˜๊ณ  ํด๋ผ์ด์–ธํŠธ ์ธก JavaScript ํŽ˜์ด๋กœ๋“œ๋ฅผ ์ค„์ด๋Š” ์ ‘๊ทผ๋ฒ•์ด, ๊ฑฐ๋Œ€ํ•œ ํ”„๋ก ํŠธ์—”๋“œ ์•ฑ์˜ ํ™•์žฅ์„ฑ์— ์–ด๋–ค ์•„ํ‚คํ…์ฒ˜์  ํŒจ๋Ÿฌ๋‹ค์ž„ ์ „ํ™˜์„ ๊ฐ€์ ธ์˜ค๋Š”๊ฐ€? [50, 51] +- React Compiler์˜ ์ž๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๋กœ์ง์ด ์„œ๋“œํŒŒํ‹ฐ ํ›…(์˜ˆ: ๋ถˆ์•ˆ์ •ํ•œ ์ฐธ์กฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ›…)๊ณผ ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ๊ธฐ์ˆ  ๋ถ€์ฑ„ ํ™˜๊ฒฝ์—์„œ ์–ด๋–ค ์ตœ์ ํ™” ์‹คํŒจ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋ฉฐ, ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๋ฆฌํŒฉํ† ๋ง ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? [38, 52] + +### Practical Application Contexts + +- **Implementation:** ๊ฑฐ๋Œ€ํ•œ React ํ”„๋กœ์ ํŠธ๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•  ๋•Œ ํŒŒ์ผ์„ ํŒŒ์ผ ์†์„ฑ ๋‹จ์œ„๊ฐ€ ์•„๋‹Œ FSD์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ(Feature) ๋ฐ ๋„๋ฉ”์ธ ๊ตฌ์กฐ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•ฉ๋‹ˆ๋‹ค. ์ƒํƒœ๊ฐ€ ์ž์ฃผ ๋ณ€๊ฒฝ๋˜๋Š” ๊ธฐ๋Šฅ์—๋Š” Zustand ์Šคํ† ์–ด๋ฅผ ์ ์šฉํ•˜๊ณ , ์„œ๋ฒ„ API ์š”์ฒญ์—๋Š” TanStack Query๋ฅผ ๋„์ž…ํ•˜์—ฌ ๋กœ์ปฌ ์ƒํƒœ์™€ ์„œ๋ฒ„ ์ƒํƒœ๋ฅผ ์™„๋ฒฝํžˆ ๋ถ„๋ฆฌ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค [2, 10, 53]. +- **System Design:** ์ปดํฌ๋„ŒํŠธ ๊ฐ„์˜ ์ˆœํ™˜ ์ฐธ์กฐ๋‚˜ ๊ฐ•ํ•œ ๊ฒฐํ•ฉ(Coupling)์„ ๋ง‰๊ธฐ ์œ„ํ•ด ์บก์Аํ™”๋œ `index.ts` ํ˜•ํƒœ์˜ Public API ์„ค๊ณ„ ํŒจํ„ด์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ Œ๋”๋ง ๋ถ€ํ•˜๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด ๋ฐ์ดํ„ฐ ๋ฆฌ์ŠคํŠธ์—๋Š” ๊ฐ€์ƒํ™”(Virtualization) ์„ค๊ณ„๋ฅผ ๋„์ž…ํ•ฉ๋‹ˆ๋‹ค [11, 22]. +- **Operation / Maintenance:** ํ”„๋กœ๋•์…˜ ๋ฐฐํฌ ํ›„ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ํฌ๋ž˜์‹œ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด Error Boundary๋ฅผ ์œ„์ ฏ ๋ฐ ์ค‘์š” UI ์„น์…˜๋งˆ๋‹ค ๊ฐ์‹ธ๋ฉฐ, LogRocket ๋˜๋Š” Sentry๋ฅผ ๋„์ž…ํ•ด ์—๋Ÿฌ ์ถ”์  ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ๋ฆญ(Memory Leaks) ์ƒํ™ฉ์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋””๋ฒ„๊น…ํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜ํ•ฉ๋‹ˆ๋‹ค [23, 26, 27]. +- **Learning Path:** ์†Œ๊ทœ๋ชจ ์žฅ๋‚œ๊ฐ ํ”„๋กœ์ ํŠธ๋กœ React์˜ ๊ธฐ์ดˆ๋ฅผ ๋‹ค์ง„ ํ›„, Context API์˜ ํ•œ๊ณ„๋ฅผ ํŒŒ์•…ํ•˜๊ณ  Zustand ๋“ฑ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ๋ฐฐ์›๋‹ˆ๋‹ค. ์ดํ›„ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ, Typescript ์ „ํ™˜, ๊ทธ๋ฆฌ๊ณ  ํด๋ฆฐ ์ฝ”๋“œ ์›์น™(SOLID, DRY) ๊ธฐ๋ฐ˜์˜ ์•„ํ‚คํ…์ฒ˜๋ง(Feature-Sliced Design) ์ตœ์ ํ™”๋กœ ๋‚˜์•„๊ฐ€๋Š” ๋‹จ๊ณ„์  ํ•™์Šต์„ ๊ฑฐ์นฉ๋‹ˆ๋‹ค [54-57]. +- **My Project Relevance:** ์†Œ์Šค์— ๊ด€๋ จ ์ •๋ณด๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. + +### Adjacent Topics + +- [[Frontend Cloud Logging Tools (ํ”„๋ก ํŠธ์—”๋“œ ํด๋ผ์šฐ๋“œ ๋กœ๊น… ๋„๊ตฌ)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์‹œ์Šคํ…œ์ด ํ”„๋กœ๋•์…˜ ๋‹จ๊ณ„์— ๋“ค์–ด๊ฐ”์„ ๋•Œ, Sentry๋‚˜ Datadog, SigNoz ๊ฐ™์€ ๋ชจ๋‹ˆํ„ฐ๋ง ํˆด์„ ํ™œ์šฉํ•ด ์‚ฌ์šฉ์ž ์„ธ์…˜๊ณผ ์—๋Ÿฌ ๋กœ๊ทธ๋ฅผ ์—ฐ๋™ํ•˜์—ฌ ๊ฐ€์‹œ์„ฑ(Observability)์„ ํ™•๋ณดํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [58-60]. +- [[Storybook Visual Regression Testing (Storybook ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋Œ€๊ทœ๋ชจ ํŒ€์—์„œ UI ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ, ๊ธฐ์กด ํ™”๋ฉด(baseline)์˜ ๋ ˆ์ด์•„์›ƒ์ด๋‚˜ ํ”ฝ์…€์ด ์˜๋„์น˜ ์•Š๊ฒŒ ๊นจ์ง€๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์ž๋™ํ™”๋œ ์‹œ๊ฐ์  ํšŒ๊ท€ ๊ฒ€์ฆ(Happo, Chromatic) ๋ฐ CI ํŒŒ์ดํ”„๋ผ์ธ ์—ฐ๋™ ๋ฐฉํ–ฅ์œผ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [61-63]. +- [[Git Branching Strategies & Workflows (Git ๋ธŒ๋žœ์น˜ ์ „๋žต ๋ฐ ์›Œํฌํ”Œ๋กœ์šฐ)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ™•์žฅ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ฐธ์—ฌํ•˜๋Š” ๊ฐœ๋ฐœ์ž ์ˆ˜๊ฐ€ ๋งŽ์•„์งˆ ๋•Œ, Trunk-based ๊ฐœ๋ฐœ์ด๋‚˜ GitHub Flow ๋“ฑ์„ ๋„์ž…ํ•˜์—ฌ ์ถฉ๋Œ์„ ์ค„์ด๊ณ  ํ‹ฐ์ผ“ ๊ธฐ๋ฐ˜ ์ถ”์ ์„ฑ์„ ํ™•๋ณดํ•˜๋Š” ํ˜•์ƒ๊ด€๋ฆฌ ๋ฐฉํ–ฅ์œผ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [31, 64]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Server State.md b/00_Raw/Server State.md new file mode 100644 index 00000000..f224dedf --- /dev/null +++ b/00_Raw/Server State.md @@ -0,0 +1,57 @@ +# [[Server State]] + +## ๐Ÿ“Œ Brief Summary +Server State(์„œ๋ฒ„ ์ƒํƒœ)๋Š” API๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๊ฐ€์ ธ์˜จ ๋ฐ์ดํ„ฐ ์ƒํƒœ๋กœ, ํด๋ผ์ด์–ธํŠธ ์ธก์˜ ์ผ๋ฐ˜์ ์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒํƒœ(Application State)์™€ ๊ทผ๋ณธ์ ์œผ๋กœ ๋‹ค๋ฅธ ํŠน์„ฑ์„ ์ง€๋‹™๋‹ˆ๋‹ค [1]. ์ด๋Ÿฌํ•œ ์ƒํƒœ๋Š” ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋ฉฐ, ๋ฐ์ดํ„ฐ์˜ ์ตœ์‹ ํ™”(์‹ ์„ ๋„ ์œ ์ง€), ๋™๊ธฐํ™”, ์บ์‹ฑ, ๋กœ๋”ฉ ๋ฐ ์—๋Ÿฌ ์ฃผ๊ธฐ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ํ•„์ˆ˜๋กœ ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค [1]. ์ตœ๊ทผ์˜ ํ”„๋ก ํŠธ์—”๋“œ ์•„ํ‚คํ…์ฒ˜์—์„œ๋Š” ์ด ์„œ๋ฒ„ ์ƒํƒœ๋ฅผ ์ „์—ญ ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ์™€ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌํ•˜์—ฌ, ํŠนํ™”๋œ ์ „์šฉ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ด ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ํ‘œ์ค€์œผ๋กœ ์ž๋ฆฌ ์žก์•˜์Šต๋‹ˆ๋‹ค [1, 2]. + +## ๐Ÿ“– Core Content +* **์ƒํƒœ ๋ถ„๋ฆฌ ์•„ํ‚คํ…์ฒ˜:** ๊ณผ๊ฑฐ ๋‹จ์ผ ์Šคํ† ์–ด(์˜ˆ: Redux)์—์„œ ๋ชจ๋“  ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋˜ ํŒจ๋Ÿฌ๋‹ค์ž„์—์„œ ๋ฒ—์–ด๋‚˜, ํ˜„๋Œ€์˜ React ์‹œ์Šคํ…œ์—์„œ๋Š” '์„œ๋ฒ„ ์ƒํƒœ(Server State)'์™€ '์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒํƒœ(Application State)'๋ฅผ ๊ตฌ๋ถ„ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ƒํƒœ ๊ด€๋ฆฌ์˜ ๋ณ€ํ™”๋กœ ๊ผฝํž™๋‹ˆ๋‹ค [1, 3]. +* **Server State์˜ ์ฃผ์š” ์š”๊ตฌ์‚ฌํ•ญ:** ๋ฐ์ดํ„ฐ๊ฐ€ ์™ธ๋ถ€(API)์— ์กด์žฌํ•˜๋ฏ€๋กœ, ์ด๋ฅผ ๋กœ์ปฌ์—์„œ ํšจ์œจ์ ์œผ๋กœ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ค‘๋ณต ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ์ค„์ด๋Š” ์บ์‹ฑ, ์„œ๋ฒ„์™€์˜ ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™”, ๋กœ๋”ฉ ์ค‘์ด๋‚˜ ์—๋Ÿฌ ๋ฐœ์ƒ ์‹œ์˜ UI ์ฒ˜๋ฆฌ ์‚ฌ์ดํด ๊ด€๋ฆฌ๊ฐ€ ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค [1, 4]. +* **์ฃผ์š” ๊ด€๋ฆฌ ๋„๊ตฌ:** TanStack Query(React Query)์™€ RTK Query๊ฐ€ ์„œ๋ฒ„ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ์‚ฌ์‹ค์ƒ์˜ ํ‘œ์ค€(de facto standard) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ํ™œ์šฉ๋ฉ๋‹ˆ๋‹ค [1, 5]. ์ด๋Ÿฌํ•œ ๋„๊ตฌ๋“ค์€ ๋ฌดํ•œ ์Šคํฌ๋กค๋ง, ๋‚™๊ด€์  ์—…๋ฐ์ดํŠธ(optimistic updates)์™€ ๊ฐ™์€ ๋ณต์žกํ•œ ๊ธฐ๋Šฅ์„ ๋‹จ์ˆœํ™”ํ•˜๊ณ , ๊ฐ•๋ ฅํ•œ ์บ์‹ฑ ๋ ˆ์ด์–ด๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ์˜ ์‹ ์„ ๋„๋ฅผ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค [4]. RTK Query์˜ ๊ฒฝ์šฐ ์บ์‹ฑ, ๋ฐ์ดํ„ฐ ์ค‘๋ณต ์ œ๊ฑฐ, ์ž๋™ ๋ฆฌํŒจ์นญ(refetching) ๋ฐ ์บ์‹œ ๋ฌดํšจํ™”๋ฅผ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [5]. +* **์ฝ”๋“œ ๊ตฌ์„ฑ ๋ฐ ๊ฒฝ๊ณ„ ์„ค์ •:** ์„œ๋ฒ„ ์ƒํƒœ๋ฅผ ๋‹ค๋ฃจ๋Š” API ๋ ˆ์ด์–ด๋Š” ํ”„๋กœ์ ํŠธ ๋‚ด์—์„œ ๋šœ๋ ทํ•œ ๊ฒฝ๊ณ„๋กœ ๊ตฌ์„ฑ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์š”์ฒญ ์„ ์–ธ๋ถ€์™€ ์ปค์Šคํ…€ ํ›…(Custom Hooks)์€ ํŠน์ • ๊ธฐ๋Šฅ(feature) ํด๋” ๋‚ด์— ํ•จ๊ป˜ ๋ฐฐ์น˜(colocated)๋˜์–ด, ๋„คํŠธ์›Œํฌ ๋กœ์ง์ด UI ์ปดํฌ๋„ŒํŠธ์™€ ๋ถ„๋ฆฌ๋˜๋„๋ก ์„ค๊ณ„ํ•ด์•ผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ๋†’์•„์ง‘๋‹ˆ๋‹ค [4]. + +## โš–๏ธ Trade-offs & Caveats +* **๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ vs ์ผ๊ด€์„ฑ:** Zustand๋‚˜ Context API์ฒ˜๋Ÿผ ๋งค์šฐ ์œ ์—ฐํ•œ ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ด ์„œ๋ฒ„ ์ƒํƒœ ์ฒ˜๋ฆฌ๋ฅผ ์ง์ ‘ ๊ตฌํ˜„ํ•  ๊ฒฝ์šฐ, ์บ์‹ฑ์ด๋‚˜ ์ค‘๋ณต ์ œ๊ฑฐ ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ์ง์ ‘ ๋งŒ๋“ค์–ด์•ผ ํ•˜๋ฏ€๋กœ ์ˆ˜ ์ฃผ์ผ์˜ ์ž‘์—…์ด ๋‚ญ๋น„๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํŒ€์› ๊ฐ„ ๋น„๋™๊ธฐ ๋กœ์ง ์ฒ˜๋ฆฌ ๋ฐฉ์‹์ด ํŒŒํŽธํ™”๋˜๋Š” ๋ถ€์ž‘์šฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5-8]. ๋ฐ˜๋ฉด, RTK Query์™€ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŒ€ ๋‚ด ์ผ๊ด€์„ฑ์ด ๊ฐ•์ œ๋˜์ง€๋งŒ, ์ดˆ๊ธฐ ํ™˜๊ฒฝ ์„ค์ •์— ๋Œ€ํ•œ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ํญ๋ฐœ ๋ฐ ํ•™์Šต ๊ณก์„ ์ด๋ผ๋Š” ๋น„์šฉ์„ ๊ฐ์ˆ˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [5, 9, 10]. +* **๋ณต์žก์„ฑ ๊ด€๋ฆฌ:** ์ „์šฉ ์„œ๋ฒ„ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋น„๋™๊ธฐ ์ฝ”๋“œ์˜ ๋งŽ์€ ๋ถ€๋ถ„์„ ์ž๋™ํ™”ํ•˜์ง€๋งŒ ๋ณต์žก์„ฑ ์ž์ฒด๋ฅผ ์™„์ „ํžˆ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋ฏ€๋กœ, ์ •๊ทœํ™”๋œ ๋ฐ์ดํ„ฐ ๋“ฑ ์•ฑ์˜ ๊ทœ๋ชจ์™€ ๋ณต์žก์„ฑ์— ์•Œ๋งž์€ ๋„๊ตฌ๋ฅผ ์‹ ์ค‘ํ•˜๊ฒŒ ์„ ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [10]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [๊ด€๊ณ„ ์œ ํ˜• A: ์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] +- [[Application State]] + - ์—ฐ๊ฒฐ ์ด์œ : Server State์™€ ๋Œ€๋น„๋˜๋Š” ํด๋ผ์ด์–ธํŠธ ์ธก ์ „์—ญ/์ง€์—ญ ์ƒํƒœ๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ, ์ด ๋‘ ๊ฐ€์ง€๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ตœ์‹  ํ”„๋ก ํŠธ์—”๋“œ ์ƒํƒœ ๊ด€๋ฆฌ์˜ ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค [1, 2]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ ์„ฑ๊ฒฉ(ํด๋ผ์ด์–ธํŠธ ๋…์ž ๋ฐ์ดํ„ฐ vs ์™ธ๋ถ€ ์‹œ์Šคํ…œ ์ข…์† ๋ฐ์ดํ„ฐ)์— ๋”ฐ๋ผ ์™œ ๋ถ„๋ฆฌํ•ด์„œ ๋‹ค๋ฃจ์–ด์•ผ ํ•˜๋Š”์ง€ ์•„ํ‚คํ…์ฒ˜์  ๊ทผ๊ฑฐ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +#### [๊ด€๊ณ„ ์œ ํ˜• B: ๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ] +- [[TanStack Query]] + - ์—ฐ๊ฒฐ ์ด์œ : Server State ๊ด€๋ฆฌ์— ํŠนํ™”๋œ ์‚ฌ์‹ค์ƒ์˜ ํ‘œ์ค€(de facto standard) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค [1, 2]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์„œ๋ฒ„ ์ƒํƒœ ์บ์‹ฑ, ๋™๊ธฐํ™”, ๋กœ๋”ฉ/์—๋Ÿฌ ์‚ฌ์ดํด ์ฒ˜๋ฆฌ, ๋‚™๊ด€์  ์—…๋ฐ์ดํŠธ ๋“ฑ์ด ์‹ค์ œ ์ฝ”๋“œ์—์„œ ์–ด๋–ป๊ฒŒ ์ตœ์ ํ™”๋˜์–ด ๊ตฌํ˜„๋˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [4]. +- [[RTK Query]] + - ์—ฐ๊ฒฐ ์ด์œ : Redux ์ƒํƒœ๊ณ„์—์„œ ๋น„๋™๊ธฐ ์„œ๋ฒ„ ์ƒํƒœ์˜ ์บ์‹ฑ, ์ค‘๋ณต ์ œ๊ฑฐ, ์บ์‹œ ๋ฌดํšจํ™” ๋“ฑ์„ ์ฆ‰์‹œ ์ œ๊ณตํ•˜์—ฌ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ๋ฅผ ๋Œ€ํญ ์ค„์—ฌ์ฃผ๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค [5]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: API ํ†ต์‹ ์ด ๋งค์šฐ ๋งŽ๊ณ  ๋ณต์žกํ•œ ์•ฑ ํ™˜๊ฒฝ์—์„œ ๋น„๋™๊ธฐ ๋กœ์ง์˜ ์ผ๊ด€์„ฑ์„ ์–ด๋–ป๊ฒŒ ํ™•๋ณดํ•˜๋Š”์ง€ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5, 9]. +- [[Zustand]] + - ์—ฐ๊ฒฐ ์ด์œ : Server State ์ „์šฉ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋„์ž…ํ•œ ํ›„, ๋‚จ์€ ํด๋ผ์ด์–ธํŠธ ์ „์—ญ ์ƒํƒœ(Application State) ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ํ•จ๊ป˜ ๊ฒฐํ•ฉํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋˜๋Š” ๊ฒฝ๋Ÿ‰ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค [2]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์„œ๋ฒ„ ์ƒํƒœ์™€ ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ๋ฅผ ๊ฐ๊ฐ ์ ํ•ฉํ•œ ๋„๊ตฌ๋กœ ์–ด๋–ป๊ฒŒ ์กฐํ™”๋กญ๊ฒŒ ์šด์˜ํ• ์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### Deeper Research Questions +- Server State์™€ Application State๋ฅผ ํ•œ ๊ณณ์—์„œ ๊ด€๋ฆฌํ•  ๋•Œ ์ƒ๊ธฐ๋Š” ์„ฑ๋Šฅ ์ €ํ•˜ ๋ฐ ์œ ์ง€๋ณด์ˆ˜์„ฑ ํ•˜๋ฝ์˜ ๊ตฌ์ฒด์ ์ธ ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ๋ฌด์—‡์ธ๊ฐ€? +- TanStack Query๋‚˜ RTK Query๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ์บ์‹œ๋œ Server State ๋ฐ์ดํ„ฐ์˜ ์‹ ์„ ๋„(freshness)๋ฅผ ์–ด๋–ป๊ฒŒ ํ‰๊ฐ€ํ•˜๊ณ  ๋งŒ๋ฃŒ(invalidate)์‹œํ‚ค๋Š”๊ฐ€? +- Server State ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ด ๋ฌดํ•œ ์Šคํฌ๋กค(Infinite Scrolling)๊ณผ ๋‚™๊ด€์  ์—…๋ฐ์ดํŠธ(Optimistic Updates)๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ์˜ ๋ฐ์ดํ„ฐ ํ๋ฆ„๊ณผ ์˜ค๋ฅ˜ ๋ณต๊ตฌ(Rollback) ์ „๋žต์€ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑ๋˜๋Š”๊ฐ€? +- ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ํ†ต์‹  ์‹œ ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ฐœ์ƒํ•˜๋Š” ๋กœ๋”ฉ ๋ฐ ์—๋Ÿฌ ์ƒํƒœ๋ฅผ React์˜ Error Boundaries ๋ฐ Suspense์™€ ๊ฒฐํ•ฉํ•˜์—ฌ ์–ด๋–ป๊ฒŒ ์šฐ์•„ํ•˜๊ฒŒ(Graceful) ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- ์œ ์—ฐํ•œ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(Zustand ๋“ฑ)๋ฅผ ์ด์šฉํ•ด Server State ์บ์‹ฑ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๋ ค ํ•  ๋•Œ ๊ฒช๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฐ ์žฌ๋ Œ๋”๋ง ์ตœ์ ํ™”์˜ ํ•œ๊ณ„๋Š” ๋ฌด์—‡์ธ๊ฐ€? + +### Practical Application Contexts +- **Implementation:** React ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ์ˆ˜๋™์œผ๋กœ `useEffect`์™€ `useState`๋ฅผ ์กฐํ•ฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ํŒจ์นญํ•˜๋˜ ๋ฐฉ์‹์„ ํ๊ธฐํ•˜๊ณ , TanStack Query๋ฅผ ๋„์ž…ํ•ด ๋น„๋™๊ธฐ ์ƒํƒœ์˜ ์บ์‹ฑ ๋ฐ ๋ผ์ดํ”„์‚ฌ์ดํด ๊ด€๋ฆฌ๋ฅผ ์ž๋™ํ™”ํ•ฉ๋‹ˆ๋‹ค [1, 2, 11, 12]. +- **System Design:** Feature-Sliced Design(FSD)๊ณผ ๊ฐ™์€ ๋””๋ ‰ํ† ๋ฆฌ ์•„ํ‚คํ…์ฒ˜์—์„œ, ๋„๋ฉ”์ธ(Feature) ํด๋” ๋‚ด๋ถ€์— `api/` ๋˜๋Š” `hooks/` ํด๋”๋ฅผ ๊ตฌ์„ฑํ•˜์—ฌ ํ•ด๋‹น ๋„๋ฉ”์ธ์— ์†ํ•˜๋Š” Server State ์š”์ฒญ ๋กœ์ง์„ ์บก์Аํ™”ํ•ฉ๋‹ˆ๋‹ค [4, 13]. +- **Operation / Maintenance:** ๋ธŒ๋ผ์šฐ์ € DevTools์™€ ์ „์šฉ ๋„๊ตฌ(์˜ˆ: Redux DevTools)๋ฅผ ํ†ตํ•ด ์–ด๋А ์‹œ์ ์— ์•ก์…˜์ด ๋ฐœ์ƒํ•˜๊ณ  ๋„คํŠธ์›Œํฌ ์š”์ฒญ์ด ์ค‘๋ณต ์ œ๊ฑฐ๋˜์—ˆ๋Š”์ง€ ์‰ฝ๊ฒŒ ์ถ”์  ๋ฐ ๋””๋ฒ„๊น…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [9, 14]. +- **Learning Path:** ํด๋ผ์ด์–ธํŠธ ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ(Context, Zustand)์˜ ํ•œ๊ณ„์™€ ๊ณผ๋„ํ•œ ๋ Œ๋”๋ง ๋ฌธ์ œ๋ฅผ ํ•™์Šตํ•œ ๋’ค, API ํ˜ธ์ถœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ Server State ํŒจ๋Ÿฌ๋‹ค์ž„ ๋ถ„๋ฆฌ ํ•„์š”์„ฑ์„ ์ตํžˆ๊ณ , ์ตœ์ข…์ ์œผ๋กœ TanStack Query ๋“ฑ์˜ ์ตœ์ ํ™” ๋„๊ตฌ๋ฅผ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค [1, 3]. +- **My Project Relevance:** React ์ฝ”๋“œ๋ฒ ์ด์Šค ๋ฆฌํŒฉํ† ๋ง ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ, ๊ธฐ์กด Redux ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ค‘ ๋น„๋™๊ธฐ API ํ˜ธ์ถœ ๋ถ€๋ถ„์„ TanStack Query๋กœ ์ „ํ™˜(Server State)ํ•˜๊ณ , ๋‚จ์€ ํด๋ผ์ด์–ธํŠธ ์ „์—ญ ์ƒํƒœ๋งŒ Zustand๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ์ฝ”๋“œ์˜ ๋ณต์žก์„ฑ์„ ๋‚ฎ์ถ”๋Š” ๊ตฌ์กฐ ๊ฐœ์„ ์— ์ง์ ‘ ํ™œ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค [2]. + +### Adjacent Topics +- [[React Error Boundaries]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: Server State์—์„œ API ์š”์ฒญ ์‹คํŒจ ๋“ฑ ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด๊ฐ€ ์ถฉ๋Œํ•˜์—ฌ ๋นˆ ํ™”๋ฉด์ด ๋‚˜์˜ค์ง€ ์•Š๋„๋ก ํด๋ฐฑ(Fallback) UI๋ฅผ ํ‘œ์‹œํ•˜๊ณ  ๋ณต๊ตฌํ•˜๋Š” ์—๋Ÿฌ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•๋ก ์œผ๋กœ ํ™•์žฅ [15, 16]. +- [[Feature-Sliced Design]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ์บก์Аํ™”๋œ Server State ํ›…๊ณผ API ๋ ˆ์ด์–ด๋ฅผ ํฌํ•จํ•˜์—ฌ ํ”„๋ก ํŠธ์—”๋“œ ํ”„๋กœ์ ํŠธ์˜ ์ „์ฒด ํด๋” ๊ตฌ์กฐ๋ฅผ ์–ด๋–ป๊ฒŒ ๋„๋ฉ”์ธ/๊ธฐ๋Šฅ ์ค‘์‹ฌ์œผ๋กœ ํ™•์žฅ์„ฑ ์žˆ๊ฒŒ ์„ค๊ณ„ํ•  ๊ฒƒ์ธ์ง€์— ๋Œ€ํ•œ ์•„ํ‚คํ…์ฒ˜ ๋…ผ์˜๋กœ ํ™•์žฅ [4, 17]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Storybook.md b/00_Raw/Storybook.md new file mode 100644 index 00000000..6d872c98 --- /dev/null +++ b/00_Raw/Storybook.md @@ -0,0 +1,66 @@ +# [[Storybook]] + +## ๐Ÿ“Œ Brief ์ฃผSummary +Storybook์€ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ ์‹œ UI ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ฃผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ๊ฒฉ๋ฆฌํ•˜์—ฌ ๊ฐœ๋ฐœํ•˜๊ณ  ๋ฌธ์„œํ™”ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค [1-3]. ํŠนํžˆ ๊ฐœ๋ฐœ๋œ ์ปดํฌ๋„ŒํŠธ์˜ ๋‹ค์–‘ํ•œ ์ƒํƒœ(์Šคํ† ๋ฆฌ)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž๋™ํ™”๋œ ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ(Visual Regression Testing) ๋ฐ ์ƒํ˜ธ์ž‘์šฉ ํ…Œ์ŠคํŠธ(Interaction Testing)๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ ์˜๋„์น˜ ์•Š์€ UI ๋ณ€๊ฒฝ์ด๋‚˜ ์ ‘๊ทผ์„ฑ ์œ„๋ฐ˜์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค [4-6]. Pull Request ๊ณผ์ •์— ๊ฒฐํ•ฉ๋˜์–ด ์•ˆ์ „ํ•œ UI ์—…๋ฐ์ดํŠธ์™€ ๋ฆฌ๋ทฐ๋ฅผ ์ง€์›ํ•˜๋Š” ํ•„์ˆ˜์ ์ธ ํ”Œ๋žซํผ์œผ๋กœ ํ™œ์šฉ๋ฉ๋‹ˆ๋‹ค [1, 7]. + +## ๐Ÿ“– Core Content +* **์ปดํฌ๋„ŒํŠธ์˜ ๊ฒฉ๋ฆฌ๋œ ๊ฐœ๋ฐœ ๋ฐ ๋ฌธ์„œํ™”** + Storybook์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฉ”์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ณต์žกํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด๋‚˜ ์ปจํ…์ŠคํŠธ์—์„œ ๋ฒ—์–ด๋‚˜ UI ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค [1]. ์ด๋Š” ๋ชจ๋…ธ๋ ˆํฌ(Monorepo) ํ™˜๊ฒฝ์ด๋‚˜ ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ฒ˜(Feature-Sliced Design ๋“ฑ)์—์„œ ๊ฐ ๊ธฐ๋Šฅ์„ ๋…๋ฆฝ์ ์œผ๋กœ ๊ฐœ๋ฐœํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•  ๋•Œ ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค [3]. ์ด๋ฏธ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฌธ์„œํ™”ํ•˜๊ณ  ๊ฐœ๋ฐœํ•˜๋Š” ์šฉ๋„๋กœ Storybook์„ ์‚ฌ์šฉ ์ค‘์ด๋ผ๋ฉด, ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ๋ฅผ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ๋น ๋ฅธ UI ๊ฒ€์ฆ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค [2]. + +* **์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ (Visual Regression Testing)** + Storybook์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜๋Š” ๊ฐ ์Šคํ† ๋ฆฌ์˜ ์Šค๋ƒ…์ƒท์„ ์บก์ฒ˜ํ•˜๊ณ  ์ด๋ฅผ ์ด์ „์— ์Šน์ธ๋œ '๋ฒ ์ด์Šค๋ผ์ธ(Baseline)'๊ณผ ๋น„๊ตํ•˜์—ฌ ์‹œ๊ฐ์  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ฐ์ง€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค [8]. ์ „ํ†ต์ ์ธ ์Šค๋ƒ…์ƒท ํ…Œ์ŠคํŠธ๊ฐ€ HTML ๋งˆํฌ์—… ๋ธ”๋กญ์„ ๋น„๊ตํ•˜์—ฌ ์‹œ๊ฐ์  ๋ณ€ํ™”๊ฐ€ ์—†์Œ์—๋„ ์˜คํƒ(false positive)์„ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๊ฒƒ๊ณผ ๋‹ฌ๋ฆฌ, Storybook์˜ ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์‹ค์ œ๋กœ ๊ฒฝํ—˜ํ•˜๋Š” '๋ Œ๋”๋ง๋œ ํ”ฝ์…€'์„ ์ง์ ‘ ๋น„๊ตํ•˜๋ฏ€๋กœ ํ›จ์”ฌ ๋” ํ’๋ถ€ํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค [9]. + +* **์ƒํ˜ธ์ž‘์šฉ ๋ฐ ์ ‘๊ทผ์„ฑ ํ…Œ์ŠคํŠธ (Interaction & Accessibility Tests)** + Storybook์€ ์ปดํฌ๋„ŒํŠธ์˜ ์™ธํ˜•๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋™์ž‘(Behavior)๊นŒ์ง€ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒํ˜ธ์ž‘์šฉ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด ๋กœ๋”ฉ, ์—๋Ÿฌ, ํ˜ธ๋ฒ„, ๋ฉ”๋‰ด ์—ด๋ฆผ ๋“ฑ ๋‹ค์–‘ํ•œ UI ์ƒํƒœ๋ฅผ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ [5], ์ด๋Ÿฌํ•œ ์ƒํƒœ ๋ณ€ํ™”์— ๋งž์ถฐ ์Šคํฌ๋ฆฐ์ƒท์„ ์ฐ์Œ์œผ๋กœ์จ ํ–‰๋™ ํ…Œ์ŠคํŠธ์™€ ์‹œ๊ฐ์  ๊ฒ€์ฆ์„ ๋™์ผํ•œ ์›Œํฌํ”Œ๋กœ์šฐ ๋‚ด์—์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5, 6]. ๋ถ€๊ฐ€์ ์œผ๋กœ ์ถ”๊ฐ€์ ์ธ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ ์—†์ด๋„ ์ ‘๊ทผ์„ฑ ํšŒ๊ท€ ํ…Œ์ŠคํŠธ๋ฅผ ํ•จ๊ป˜ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [4, 10]. + +* **CI/CD ๋ฐ ๋„๊ตฌ ํ†ตํ•ฉ (CI/CD Integrations)** + Storybook์€ Chromatic์ด๋‚˜ Happo ๊ฐ™์€ ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค ๋„๊ตฌ๋“ค๊ณผ ์›ํ™œํ•˜๊ฒŒ ํ†ตํ•ฉ๋ฉ๋‹ˆ๋‹ค [1, 4, 8]. ์ด๋Ÿฌํ•œ ๋„๊ตฌ๋ฅผ CI ํŒŒ์ดํ”„๋ผ์ธ์— ์—ฐ๋™ํ•˜๋ฉด, PR(Pull Request)์ด ์ƒ์„ฑ๋  ๋•Œ๋งˆ๋‹ค Chrome, Firefox, Safari ๋“ฑ ๋‹ค์–‘ํ•œ ์‹ค์ œ ๋ธŒ๋ผ์šฐ์ €์™€ ์—ฌ๋Ÿฌ ๋ทฐํฌํŠธ ํฌ๊ธฐ์—์„œ ์ž๋™์œผ๋กœ ์Šคํฌ๋ฆฐ์ƒท์ด ์บก์ฒ˜๋˜๊ณ  ๋ฒ ์ด์Šค๋ผ์ธ๊ณผ ๋น„๊ต๋ฉ๋‹ˆ๋‹ค [1, 4, 11]. ์ด๋ฅผ ํ†ตํ•ด ๋ฆฌ๋ทฐ์–ด๋Š” ๊ฐ ์ƒํƒœ๋ฅผ ์ˆ˜๋™์œผ๋กœ ํ™•์ธํ•  ํ•„์š” ์—†์ด ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„(Diff)์—๋งŒ ์ง‘์ค‘ํ•˜์—ฌ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์Šน์ธ(Accept)ํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2, 12, 13]. + +## โš–๏ธ Trade-offs & Caveats +* **ํ…Œ์ŠคํŠธ์˜ ๋ถˆ์•ˆ์ •์„ฑ(Flakiness) ๋ฐ ๋…ธ์ด์ฆˆ ๋ฌธ์ œ:** ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜, ๋น„๋™๊ธฐ ์ž์‚ฐ(Asset), ํฐํŠธ ๋กœ๋”ฉ ๋“ฑ์œผ๋กœ ์ธํ•ด ๊นจ์ง€๊ธฐ ์‰ฝ๊ฑฐ๋‚˜ ๋ถˆ์•ˆ์ •ํ•ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [10, 11]. ๋˜ํ•œ ์ด๋ฏธ์ง€ ์••์ถ• ๋…ธ์ด์ฆˆ๋‚˜ ์•ˆํ‹ฐ์•จ๋ฆฌ์–ด์‹ฑ(anti-aliasing)๊ณผ ๊ฐ™์€ ๋ฏธ์„ธํ•œ ์ฐจ์ด๋กœ ์ธํ•ด ์‹คํŒจํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค [10, 14]. ์ด๋ฅผ ์™„ํ™”ํ•˜๊ธฐ ์œ„ํ•ด Happo ๋“ฑ์€ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ž๋™์œผ๋กœ ๋ฌดํšจํ™”ํ•˜๊ณ  ๋น„๋™๊ธฐ ์ž์‚ฐ์„ ๋Œ€๊ธฐํ•˜๋ฉฐ, ์‹œ๊ฐ์  ๋ณ€๊ฒฝ์— ๋Œ€ํ•œ ์ƒ‰์ƒ ํ—ˆ์šฉ ์˜ค์ฐจ(color-delta tolerance)๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•˜๋Š” ์ œ์•ฝ๊ณผ ์„ค์ • ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค [11, 14]. +* **์ถ”๊ฐ€์ ์ธ ๋ฆฌ๋ทฐ ๋ณ‘๋ชฉ ๋ฐ CI ์„ค์ • ์˜ค๋ฒ„ํ—ค๋“œ:** ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ๊ฐ€ ์œ ํšจํ•˜๋ ค๋ฉด ๋ณ€๊ฒฝ๋œ ์Šคํฌ๋ฆฐ์ƒท์ด ์˜๋„๋œ ๊ฒƒ์ธ์ง€(์ƒˆ๋กœ์šด ๋ฒ ์ด์Šค๋ผ์ธ์œผ๋กœ ์ˆ˜๋ฝ) ์•„๋‹ˆ๋ฉด ๋ฒ„๊ทธ์ธ์ง€ ํŒ๋‹จํ•˜๋Š” ํŒ€์›์˜ ์ˆ˜๋™ ๋ฆฌ๋ทฐ ๊ณผ์ •์ด ๋ฐ˜๋“œ์‹œ ์ˆ˜๋ฐ˜๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [12, 13]. ๋˜ํ•œ CI/CD์—์„œ ์›ํ™œํ•˜๊ฒŒ ๋™์ž‘ํ•˜๋„๋ก ํ”„๋กœ์ ํŠธ ํ† ํฐ ๋“ฑ ์ธ์ฆ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ  ํŒŒ์ดํ”„๋ผ์ธ์„ ์„ค์ •ํ•˜๋Š” ์ดˆ๊ธฐ ์ž‘์—…์ด ์š”๊ตฌ๋ฉ๋‹ˆ๋‹ค [7]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [ํ…Œ์ŠคํŠธ ๋ฐ ๊ฒ€์ฆ ๊ธฐ๋ฒ• (Testing Methods)] +- [[Visual Regression Testing]] + - ์—ฐ๊ฒฐ ์ด์œ : Storybook์ด ์ปดํฌ๋„ŒํŠธ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํ”ฝ์…€ ๋‹จ์œ„๋กœ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ํ•ต์‹ฌ ํ…Œ์ŠคํŠธ ๋ฐฉ๋ฒ•๋ก ์ž…๋‹ˆ๋‹ค [4, 8]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: HTML ๋งˆํฌ์—…์„ ๋น„๊ตํ•˜๋Š” Snapshot Test์˜ ํ•œ๊ณ„์ ๊ณผ ์˜คํƒ(False Positive)์˜ ์›๋ฆฌ, ๊ทธ๋ฆฌ๊ณ  ํ”ฝ์…€ ๋ Œ๋”๋ง ๊ธฐ๋ฐ˜ ๋น„๊ต์˜ ์žฅ์ ์„ ๋ช…ํ™•ํžˆ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [9]. + +- [[Interaction Testing]] + - ์—ฐ๊ฒฐ ์ด์œ : ์ปดํฌ๋„ŒํŠธ์˜ ๋‹จ์ˆœํ•œ ๋ Œ๋”๋ง๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์œ ์ €์˜ ํ–‰๋™(์ด๋ฒคํŠธ, ์ƒํƒœ ๋“ฑ)์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜์—ฌ ๋‹ค์–‘ํ•œ UI ์ƒํƒœ(๋กœ๋”ฉ, ํ˜ธ๋ฒ„ ๋“ฑ)๋ฅผ ๊ฒ€์ฆํ•˜๋Š” Storybook์˜ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค [5, 6]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ƒํƒœ ์ „์ด์— ๋”ฐ๋ผ ๋™์ ์œผ๋กœ ๋ณ€ํ•˜๋Š” UI๋ฅผ ์–ด๋–ป๊ฒŒ ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ์™€ ๊ฒฐํ•ฉํ•˜์—ฌ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์›๋ฆฌ๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5]. + +#### [ํ†ตํ•ฉ ๋ฐ ์ž๋™ํ™” ๋„๊ตฌ (Integration Tools)] +- [[Chromatic]] + - ์—ฐ๊ฒฐ ์ด์œ : Storybook ์œ ์ง€๋ณด์ˆ˜ ํŒ€์ด ๋งŒ๋“  ๊ณต์‹ ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค๋กœ, ํฌ๋กœ์Šค ๋ธŒ๋ผ์šฐ์ € ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ์™€ CI ํ†ตํ•ฉ์„ ๋„ค์ดํ‹ฐ๋ธŒ๋กœ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค [8, 15]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ์—์„œ ๋ฒ ์ด์Šค๋ผ์ธ(Baseline) ์ด๋ฏธ์ง€๊ฐ€ ์–ด๋–ป๊ฒŒ ์ €์žฅ, ๋น„๊ต, ๋™๊ธฐํ™”๋˜๋Š”์ง€ CI/CD ํŒŒ์ดํ”„๋ผ์ธ ํ†ตํ•ฉ ๊ณผ์ •์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [7, 13]. + +- [[Happo]] + - ์—ฐ๊ฒฐ ์ด์œ : Storybook๊ณผ ํ†ตํ•ฉ๋˜์–ด ๋‹ค์ค‘ ๋ธŒ๋ผ์šฐ์ € ์Šคํฌ๋ฆฐ์ƒท ํ…Œ์ŠคํŠธ ๋ฐ ์ ‘๊ทผ์„ฑ ํšŒ๊ท€ ํ…Œ์ŠคํŠธ๋ฅผ ๋ณ‘๋ ฌ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค [4]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Flakiness ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ •์ง€ํ•˜๊ฑฐ๋‚˜ ์ƒ‰์ƒ ์˜ค์ฐจ ๋ฒ”์œ„(color-delta tolerance)๋ฅผ ์„ค์ •ํ•˜์—ฌ ์‹œ๊ฐ์  ๋…ธ์ด์ฆˆ๋ฅผ ์ค„์ด๋Š” ๊ตฌ์ฒด์  ์ตœ์ ํ™” ๊ธฐ๋ฒ•์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [11, 14]. + +### Deeper Research Questions +- Storybook์˜ Visual Test์™€ ์ „ํ†ต์ ์ธ HTML Snapshot Test๋ฅผ ๋น„๊ตํ–ˆ์„ ๋•Œ, ์‹ค์ œ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์œ ์ง€๋ณด์ˆ˜ ์˜ค๋ฒ„ํ—ค๋“œ์™€ ์˜คํƒ(false positive) ๋น„์œจ์˜ ์ฐจ์ด๋Š” ์–ด๋– ํ•œ๊ฐ€? +- ์• ๋‹ˆ๋ฉ”์ด์…˜, ๋น„๋™๊ธฐ ํฐํŠธ ๋กœ๋”ฉ ๋“ฑ์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” Visual Test์˜ Flakiness๋ฅผ ์™„์ „ํžˆ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•ด Chromatic์ด๋‚˜ Happo๋Š” ์–ด๋–ค ๋ Œ๋”๋ง ํŒŒ์ดํ”„๋ผ์ธ ์ œ์–ด ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜๋Š”๊ฐ€? +- Storybook์˜ Interaction Test๋กœ ๋ณต์žกํ•œ ์‚ฌ์šฉ์ž ์—ฌ์ •(User Journey)์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•  ๋•Œ, ์ƒํƒœ๋ณ„ ์Šคํฌ๋ฆฐ์ƒท ์บก์ฒ˜๊ฐ€ CI ๋นŒ๋“œ ์‹œ๊ฐ„์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ๊ณผ ์ด๋ฅผ ๋ณ‘๋ ฌํ™”ํ•˜์—ฌ ์ตœ์ ํ™”ํ•˜๋Š” ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? +- ๋ชจ๋…ธ๋ ˆํฌ(Monorepo) ํ™˜๊ฒฝ์ด๋‚˜ Feature-Sliced Design ์•„ํ‚คํ…์ฒ˜์—์„œ ์ˆ˜๋ฐฑ ๊ฐœ์˜ ๊ธฐ๋Šฅ ๋ชจ๋“ˆ์ด ๊ฐ๊ฐ ๋ถ„๋ฆฌ๋œ Storybook์„ ๊ฐ€์งˆ ๋•Œ, ์ด๋ฅผ ํ†ตํ•ฉ์ ์œผ๋กœ ๋นŒ๋“œํ•˜๊ณ  ์‹œ๊ฐ์  ํšŒ๊ท€๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ๋ฒ ์ŠคํŠธ ํ”„๋ž™ํ‹ฐ์Šค๋Š” ๋ฌด์—‡์ธ๊ฐ€? +- Storybook์„ ์‚ฌ์šฉํ•œ ์‹œ๊ฐ์  ์ ‘๊ทผ์„ฑ ํ…Œ์ŠคํŠธ(Accessibility regression testing)๊ฐ€ ์‹ค์ œ DOM ๊ธฐ๋ฐ˜์˜ ์ ‘๊ทผ์„ฑ ๊ฐ์‚ฌ ๋„๊ตฌ(aXe ๋“ฑ)์™€ ๋น„๊ตํ•˜์—ฌ ๊ฐ–๋Š” ํ•œ๊ณ„์ ๊ณผ ๋ณด์™„์ ์€ ๋ฌด์—‡์ธ๊ฐ€? + +### Practical Application Contexts +- **Implementation:** React ๋“ฑ UI ํ”„๋ ˆ์ž„์›Œํฌ ๊ธฐ๋ฐ˜ ํ”„๋กœ์ ํŠธ์—์„œ ๋ณต์žกํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์•ฑ์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ๋ถ„๋ฆฌํ•˜์—ฌ `Button`, `Modal` ๋“ฑ์˜ ์š”์†Œ๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ๋ Œ๋”๋งํ•˜๊ณ , ํ˜ธ๋ฒ„ ๋ฐ ์—๋Ÿฌ ์ƒํƒœ์˜ Story๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. +- **System Design:** Feature-Sliced Design์ฒ˜๋Ÿผ ๋„๋ฉ”์ธ๊ณผ ํ”ผ์ฒ˜๊ฐ€ ๋šœ๋ ทํ•˜๊ฒŒ ๋‚˜๋‰œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋„์ž…ํ•  ๋•Œ, ๊ฐ ํ”ผ์ฒ˜ ํด๋”๋ณ„๋กœ Storybook ํ™˜๊ฒฝ์„ ์„ธํŒ…ํ•˜์—ฌ ๊ฒฉ๋ฆฌ๋œ ๊ฐœ๋ฐœ ๋ฐ ํ…Œ์ŠคํŠธ ๊ตฌ์กฐ๋ฅผ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค. +- **Operation / Maintenance:** CI/CD ์›Œํฌํ”Œ๋กœ์šฐ์— Chromatic ๋˜๋Š” Happo๋ฅผ ์—ฐ๋™ํ•˜์—ฌ, ํŒ€์›์ด PR์„ ์˜ฌ๋ฆด ๋•Œ๋งˆ๋‹ค ์ž๋™์œผ๋กœ ์‹œ๊ฐ์  ๋ณ€๊ฒฝ ์‚ฌํ•ญ(Visual Diff)์ด ์บก์ฒ˜๋˜๊ณ  ์ด๋ฅผ ๋ฆฌ๋ทฐ์–ด๊ฐ€ ์ง์ ‘ ํ™•์ธ ํ›„ ๋ณ‘ํ•ฉ(Merge)ํ•˜๋Š” ์šด์˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ตฌ์ถ•ํ•ฉ๋‹ˆ๋‹ค. +- **Learning Path:** ๊ธฐ๋ณธ UI ์ปดํฌ๋„ŒํŠธ ๊ฒฉ๋ฆฌ ๊ฐœ๋ฐœ -> Story ์ž‘์„ฑ์„ ํ†ตํ•œ ๋ฌธ์„œํ™” -> Interaction Test ์ž‘์„ฑ -> ์ž๋™ํ™”๋œ Visual Regression Test ๊ตฌ์ถ•์œผ๋กœ ์ด์–ด์ง€๋Š” ํ”„๋ก ํŠธ์—”๋“œ ํ’ˆ์งˆ ๋ณด์ฆ ํ•™์Šต ๊ฒฝ๋กœ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. +- **My Project Relevance:** ํ˜„์žฌ ์œ ์ง€๋ณด์ˆ˜ ์ค‘์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฆฌํŒฉํ† ๋ง์ด๋‚˜ ์ƒˆ๋กœ์šด ๋””์ž์ธ ์‹œ์Šคํ…œ(UI ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ) ๊ตฌ์ถ• ์ž‘์—… ์‹œ, ์‹ค์ˆ˜๋กœ ๋ฐœ์ƒํ•˜๋Š” CSS/๋ ˆ์ด์•„์›ƒ ๊นจ์ง์„ ์‚ฌ์ „์— ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์•ˆ์ „์žฅ์น˜๋กœ ๋„์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### Adjacent Topics +- [[Pull Request Workflow]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: Storybook ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ์˜ ๊ฒฐ๊ณผ๋ฅผ GitHub, GitLab ๋“ฑ์˜ ๋ฆฌ๋ทฐ ํ”„๋กœ์„ธ์Šค์™€ ๊ฒฐํ•ฉํ•˜์—ฌ, ๋ฒ„๊ทธ ์—†๋Š” UI ์ฝ”๋“œ๋ฅผ ๋ฐฐํฌํ•˜๊ธฐ ์œ„ํ•œ ํ˜‘์—… ๋ฐ ๊ฒ€์ฆ ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ• ์ „๋žต์œผ๋กœ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค. +- [[Feature-Sliced Design]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ํ”„๋ก ํŠธ์—”๋“œ ์ฝ”๋“œ๋ฅผ ๊ธฐ๋Šฅ(Feature) ๋‹จ์œ„๋กœ ๋ถ„๋ฆฌํ•  ๋•Œ, Storybook์„ ์ด์šฉํ•ด ๊ฐ ๊ธฐ๋Šฅ์˜ UI ์ปดํฌ๋„ŒํŠธ๋“ค์„ ๋ฉ”์ธ ์•ฑ์— ์˜์กดํ•˜์ง€ ์•Š๊ณ  ๋…๋ฆฝ์ ์œผ๋กœ ์ž‘๋™ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ์„ค๊ณ„ ์›์น™์œผ๋กœ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Team Collaboration.md b/00_Raw/Team Collaboration.md new file mode 100644 index 00000000..cd5d477d --- /dev/null +++ b/00_Raw/Team Collaboration.md @@ -0,0 +1,70 @@ +# [[Team Collaboration]] + +## ๐Ÿ“Œ Brief Summary +ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์—์„œ 'Team Collaboration(ํŒ€ ํ˜‘์—…)'์ด๋ž€ ๋‹ค์ˆ˜์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋™์ผํ•œ ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ํšจ์œจ์ ์œผ๋กœ ํ•จ๊ป˜ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•˜๋Š” ์‹ค์ฒœ ๋ฐฉ์‹, ์•„ํ‚คํ…์ฒ˜, ๊ทธ๋ฆฌ๊ณ  ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์˜๋ฏธํ•œ๋‹ค [1, 2]. ์ด๋Š” ์ผ๊ด€๋œ ํด๋” ๊ตฌ์กฐ, ๋ช…๋ช… ๊ทœ์น™, ์ƒํƒœ ๊ด€๋ฆฌ ํŒจํ„ด ๋ฐ Git ๋ธŒ๋žœ์นญ ์ „๋žต์„ ํ™•๋ฆฝํ•˜์—ฌ ๊ฐœ๋ฐœ์ž ๊ฐ„์˜ ์ถฉ๋Œ๊ณผ ์†Œํ†ต ๋น„์šฉ์„ ์ตœ์†Œํ™”ํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•œ๋‹ค [2-4]. ์„ฑ๊ณต์ ์ธ ํ˜‘์—…์€ ๋ฆฐํŒ…์ด๋‚˜ ํฌ๋งคํŒ…๊ณผ ๊ฐ™์€ ์ž๋™ํ™”๋œ ๋„๊ตฌ๋ฅผ ํ†ตํ•œ ์—„๊ฒฉํ•œ ์ฝ”๋“œ ๊ฑฐ๋ฒ„๋„Œ์Šค์™€ ๋ช…ํ™•ํ•œ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๋ฌธํ™”๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ํŒ€์ด ํ™•์žฅ๋  ๋•Œ ์•ˆ์ •์„ฑ์„ ์œ ์ง€ํ•˜๋„๋ก ๋•๋Š”๋‹ค [5-7]. + +## ๐Ÿ“– Core Content +* **Git ์›Œํฌํ”Œ๋กœ์šฐ ๋ฐ ๋ธŒ๋žœ์นญ ์ „๋žต:** + ์†Œ๊ทœ๋ชจ ํŒ€์—์„œ๋Š” ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์ ์œผ๋ฉด์„œ๋„ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๋Š” '๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜(Feature-branch) ์›Œํฌํ”Œ๋กœ์šฐ'๋‚˜ 'ํŠธ๋ ํฌ ๊ธฐ๋ฐ˜(Trunk-based) ๊ฐœ๋ฐœ'์ด ์ฃผ๋กœ ๊ถŒ์žฅ๋œ๋‹ค [8-10]. ๋ชจ๋“  ์ž‘์—…์€ `main` ๋ธŒ๋žœ์น˜์— ์ง์ ‘ ์ปค๋ฐ‹ํ•˜์ง€ ์•Š๊ณ  ์งง์€ ์ˆ˜๋ช…์˜ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜์—์„œ ์ง„ํ–‰๋˜๋ฉฐ, Pull Request(PR)์™€ ์ตœ์†Œ 1๋ช… ์ด์ƒ์˜ ๋™๋ฃŒ ๋ฆฌ๋ทฐ(Peer review) ๋ฐ ํ…Œ์ŠคํŠธ ํ†ต๊ณผ ํ›„ ๋ณ‘ํ•ฉ๋˜์–ด์•ผ ํ•œ๋‹ค [7, 11, 12]. ๋˜ํ•œ, ๋ธŒ๋žœ์น˜๋ช…๊ณผ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€์— ํ‹ฐ์ผ“ ID(์˜ˆ: `PROJ-123`)๋ฅผ ํฌํ•จํ•˜๋ฉด ์š”๊ตฌ์‚ฌํ•ญ๊ณผ ์ฝ”๋“œ ๋ณ€๊ฒฝ ์ด๋ ฅ ๊ฐ„์˜ ์ถ”์ ์„ฑ(Traceability)์„ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ๋‹ค [13, 14]. +* **์•„ํ‚คํ…์ฒ˜ ๋ฐ ํด๋” ๊ตฌ์กฐ์˜ ํ‘œ์ค€ํ™”:** + ํ‘œ์ค€ํ™”๋œ ํด๋” ๊ตฌ์กฐ(์˜ˆ: ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ ๋˜๋Š” Feature-Sliced Design)๋Š” ํŒŒ์ผ์˜ ์œ„์น˜๋ฅผ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜์—ฌ ํŒ€ ํ˜‘์—…์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚จ๋‹ค [2]. ๊ตฌ์กฐ๊ฐ€ ์ž˜ ์žกํ˜€ ์žˆ์œผ๋ฉด ๊ฐœ๋ฐœ์ž๋“ค์ด ํŒŒ์ผ์„ ์ฐพ๋Š” ์‹œ๊ฐ„์„ ์ค„์ด๊ณ , ํŒ€์› ๊ฐ„ ๋ถˆํ•„์š”ํ•œ ์†Œํ†ต์„ ์ค„์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์‹ ๊ทœ ๊ฐœ๋ฐœ์ž์˜ ์˜จ๋ณด๋”ฉ์ด ๋นจ๋ผ์ง„๋‹ค [2, 15]. ๋˜ํ•œ ๊ฐ ๊ธฐ๋Šฅ์ด ๋…๋ฆฝ๋œ ํด๋”๋กœ ๊ฒฉ๋ฆฌ๋˜์–ด ์žˆ์–ด ์„œ๋กœ์˜ ์ฝ”๋“œ๋ฅผ ๊ฐ„์„ญํ•  ํ™•๋ฅ ์ด ๋‚ฎ์•„์ง„๋‹ค [16]. +* **๋ช…๋ช… ๊ทœ์น™(Naming Conventions) ๋ฐ ์ž๋™ํ™”๋œ ๊ฑฐ๋ฒ„๋„Œ์Šค:** + ์ปดํฌ๋„ŒํŠธ ์ด๋ฆ„์€ ํŒŒ์Šค์นผ ์ผ€์ด์Šค(PascalCase), ํŒŒ์ผ ๋ฐ ํด๋” ์ด๋ฆ„์€ ์ผ€๋ฐฅ ์ผ€์ด์Šค(kebab-case)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋“ฑ ์ผ๊ด€๋œ ๋ช…๋ช… ๊ทœ์น™์€ OS ํ™˜๊ฒฝ ๊ฐ„์˜ ๋นŒ๋“œ ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ  ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์„ ๋†’์ธ๋‹ค [17-19]. ๋” ๋‚˜์•„๊ฐ€ ์ˆ˜๋™ ๊ฒ€์‚ฌ์— ์˜์กดํ•˜๊ธฐ๋ณด๋‹ค ESLint, Prettier, Husky๋ฅผ ํ™œ์šฉํ•ด ์ปค๋ฐ‹ ์ด์ „์— ๋ฆฐํŒ…, ํฌ๋งคํŒ… ๋ฐ ํƒ€์ž… ๊ฒ€์‚ฌ๋ฅผ ์ž๋™์œผ๋กœ ๊ฐ•์ œํ•˜๋Š” ๊ฒƒ์ด ๊ณ ํ’ˆ์งˆ ์ฝ”๋“œ ํ˜‘์—…์˜ ๊ธฐ๋ฐ˜์ด๋‹ค [6, 20, 21]. +* **์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ์™€ ํŒ€ ๊ทœ๋ชจ์˜ ์ƒ๊ด€๊ด€๊ณ„:** + ํŒ€์˜ ๊ทœ๋ชจ๊ฐ€ ํด์ˆ˜๋ก(10๋ช… ์ด์ƒ) ๊ตฌ์กฐ๋ฅผ ๊ฐ•์ œํ•˜๋Š” ๋„๊ตฌ๊ฐ€ ํ˜‘์—…์— ์œ ๋ฆฌํ•˜๋‹ค [5]. Zustand์™€ ๊ฐ™์€ ๋„๊ตฌ๋Š” ์œ ์—ฐํ•˜๊ณ  ๋น ๋ฅด์ง€๋งŒ, ๊ทœ์œจ์ด ๋ถ€์กฑํ•˜๋ฉด ๊ฐœ๋ฐœ์ž๋งˆ๋‹ค ๋น„๋™๊ธฐ ์ž‘์—…์„ ๋‹ค๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•˜์—ฌ ์ฝ”๋“œ๋ฒ ์ด์Šค์— ํ˜ผ๋ž€(integration chaos)์„ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ๋‹ค [22, 23]. ๋ฐ˜๋ฉด Redux๋Š” ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ๊ฐ€ ๋งŽ์ง€๋งŒ, ํŒ€ ์ „์›์ด ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” '๋‹จ์ผ ์ง„์‹ค ๊ณต๊ธ‰์›'๊ณผ ๊ตฌ์กฐ๋ฅผ ์ œ๊ณตํ•˜์—ฌ ๋Œ€๊ทœ๋ชจ ํ˜‘์—…์—์„œ ๋ฒ„๊ทธ๋ฅผ ์ค„์ธ๋‹ค [5, 24, 25]. + +## โš–๏ธ Trade-offs & Caveats +* **์œ ์—ฐ์„ฑ vs. ๊ตฌ์กฐ์  ๊ฐ•์ œ์„ฑ (์ƒํƒœ ๊ด€๋ฆฌ):** Zustand ๊ฐ™์ด ๊ฐ€๋ฒผ์šด ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ๊ฐ€ ์ ์–ด ๋น ๋ฅธ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ(์Šคํƒ€ํŠธ์—… ๋“ฑ)์— ์ ํ•ฉํ•˜์ง€๋งŒ, ์œ ์—ฐ์„ฑ์ด ๋„ˆ๋ฌด ์ปค์„œ ํŒ€์ด ์ปค์งˆ ๊ฒฝ์šฐ ํŒŒํŽธํ™”๋œ ํŒจํ„ด์„ ๋‚ณ์„ ์ˆ˜ ์žˆ๋‹ค [22, 23, 26, 27]. ๋ฐ˜๋ฉด Redux๋Š” ์ผ๊ด€์„ฑ์„ ๊ฐ•์ œํ•˜์—ฌ ๋””๋ฒ„๊น…๊ณผ ํ˜‘์—…์„ ํŽธํ•˜๊ฒŒ ํ•ด์ฃผ์ง€๋งŒ, ์ดˆ๊ธฐ ์„ค์ •๊ณผ ๊ตฌ์กฐํ™”์— ๋“œ๋Š” ์‹œ๊ฐ„์ด ์†Œ๊ทœ๋ชจ ํŒ€์—๊ฒŒ๋Š” ๊ณผ๋„ํ•œ ์˜ค๋ฒ„ํ—ค๋“œ๋กœ ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๋‹ค [5, 24, 28]. +* **๋ธŒ๋žœ์นญ ์›Œํฌํ”Œ๋กœ์šฐ์˜ ๋ฌด๊ฒŒ๊ฐ:** Git Flow๋Š” ์˜ˆ์ •๋œ ๋ฆด๋ฆฌ์Šค๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฑฐ๋Œ€ ํ”„๋กœ์ ํŠธ์—๋Š” ์œ ์šฉํ•˜์ง€๋งŒ, ์†Œ๊ทœ๋ชจ ํŒ€์—๊ฒŒ๋Š” ๋ธŒ๋žœ์น˜ ๊ด€๋ฆฌ ๋น„์šฉ์ด ๋„ˆ๋ฌด ์ปค์„œ ๊ฐœ๋ฐœ ์†๋„๋ฅผ ๋Šฆ์ถœ ์ˆ˜ ์žˆ๋‹ค [8, 29]. ๊ฐ€๋ฒผ์šด Feature-branch ์›Œํฌํ”Œ๋กœ์šฐ๋‚˜ Trunk-based ๊ฐœ๋ฐœ์ด ๋Œ€์•ˆ์ด์ง€๋งŒ, ์ด๋Š” ๊ฐœ๋ฐœ์ž๋“ค์ด ๋ธŒ๋žœ์น˜๋ฅผ ์งง๊ฒŒ ์œ ์ง€ํ•˜๊ณ  ๋นˆ๋ฒˆํžˆ ๋ณ‘ํ•ฉ(Merge)ํ•˜๋Š” ๊ทœ์œจ์„ ์Šค์Šค๋กœ ์ง€์ผœ์•ผ๋งŒ ์„ฑ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค [30, 31]. +* **์ดˆ๊ธฐ ํ•™์Šต ๊ณก์„ ๊ณผ ์˜ค๋ฒ„ํ—ค๋“œ:** Feature-Sliced Design(FSD) ๊ฐ™์€ ์—„๊ฒฉํ•œ ์•„ํ‚คํ…์ฒ˜๋Š” ์ฝ”๋“œ์˜ ๋ชจ๋“ˆํ™”์™€ ๋…๋ฆฝ์  ์ž‘์—…(๋ณ‘๋ ฌ ์ž‘์—…)์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜์ง€๋งŒ, ์ดˆ๊ธฐ ๋„์ž… ์‹œ ํŒ€์› ์ „์ฒด๊ฐ€ ํ•ด๋‹น ๋ฐฉ๋ฒ•๋ก (Layer, Slice ๋“ฑ์˜ ๊ฐœ๋…)์„ ์ดํ•ดํ•˜๊ณ  ๋™์˜ํ•ด์•ผ ํ•˜๋Š” ํ•™์Šต ๋น„์šฉ์ด ๋ฐœ์ƒํ•œ๋‹ค [32, 33]. ๊ทœ์น™์— ๋Œ€ํ•œ ์ง€์‹ ๊ณต์œ ์™€ ๋ฌธ์„œํ™”๊ฐ€ ๋™๋ฐ˜๋˜์ง€ ์•Š์œผ๋ฉด, ๊ฐœ๋ฐœ์ž๋“ค์ด ์ž„์˜๋กœ ํ•˜์œ„ ํด๋”๋‚˜ `/shared` ๋“ฑ์— ์ฝ”๋“œ๋ฅผ ์Ÿ์•„๋ถ€์–ด ์˜คํžˆ๋ ค ์•„ํ‚คํ…์ฒ˜๊ฐ€ ๋ง๊ฐ€์ง€๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋‚ณ์„ ์ˆ˜ ์žˆ๋‹ค [33]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [๊ด€๊ณ„ ์œ ํ˜• A (ํ˜‘์—…/์ฝ”๋“œ ๊ด€๋ฆฌ ํ”„๋กœ์„ธ์Šค)] +- [[Git Branching Strategies]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋‹ค์ˆ˜์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋™์‹œ์— ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๊ณ  ํ†ตํ•ฉ ๊ณผ์ •์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ํ•ต์‹ฌ ๊ทœ์•ฝ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค [3, 34]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Pull Request, ์ฝ”๋“œ ๋ฆฌ๋ทฐ, ๋ธŒ๋žœ์น˜ ๋ช…๋ช… ๊ทœ์น™, Trunk-based ์›Œํฌํ”Œ๋กœ์šฐ ๋“ฑ ์‹ค์ œ ํŒ€ ์šด์˜ ๋ฐฉ์‹ [7, 35]. +- [[Commit Message Conventions]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋ณ€๊ฒฝ ์‚ฌํ•ญ์˜ ์˜๋„์™€ ์ž‘์—… ๋‚ด์—ญ(๋ฒ„๊ทธ ํ”ฝ์Šค, ๊ธฐ๋Šฅ ์ถ”๊ฐ€ ๋“ฑ)์„ ๋‹ค๋ฅธ ํŒ€์›๋“ค์—๊ฒŒ ๋ช…ํ™•ํžˆ ์ „๋‹ฌํ•˜๋Š” ์†Œํ†ต์˜ ๋„๊ตฌ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค [36]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํ‹ฐ์ผ“ ID ํ†ตํ•ฉ, `feat:`, `fix:`์™€ ๊ฐ™์€ ์ ‘๋‘์‚ฌ๋ฅผ ํ†ตํ•œ ๋ณ€๊ฒฝ ์ด๋ ฅ์˜ ์ž๋™ํ™” ๋ฐ ์Šค์บ๋‹ [14, 36, 37]. + +#### [๊ด€๊ณ„ ์œ ํ˜• B (์•„ํ‚คํ…์ฒ˜ ๋ฐ ๊ฑฐ๋ฒ„๋„Œ์Šค ๋„๊ตฌ)] +- [[Feature-Sliced Design]] + - ์—ฐ๊ฒฐ ์ด์œ : ์ฝ”๋“œ๋ฅผ ๊ธฐ์ˆ ์  ๊ณ„์ธต์ด ์•„๋‹Œ ๋น„์ฆˆ๋‹ˆ์Šค ๊ธฐ๋Šฅ(Feature) ์ค‘์‹ฌ์œผ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ, ์—ฌ๋Ÿฌ ํŒ€์ด ์„œ๋กœ ๊ฐ„์„ญ ์—†์ด ๋…๋ฆฝ์ ์œผ๋กœ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ๋Š” ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•œ๋‹ค [16, 38]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋„๋ฉ”์ธ ์ฃผ๋„ ์„ค๊ณ„์˜ ํ”„๋ก ํŠธ์—”๋“œ ์ ์šฉ, ๋ช…์‹œ์  ํผ๋ธ”๋ฆญ API๋ฅผ ํ†ตํ•œ ๋ชจ๋“ˆ ์บก์Аํ™”์™€ ๊ฒฐํ•ฉ๋„ ๋‚ฎ์ถ”๊ธฐ [38-40]. +- [[Automated Governance]] + - ์—ฐ๊ฒฐ ์ด์œ : ์‚ฌ๋žŒ์˜ ์ˆ˜๋™ ํ™•์ธ์— ์˜์กดํ•˜์ง€ ์•Š๊ณ  ESLint, Prettier, Husky ๋“ฑ์œผ๋กœ ์ฝ”๋“œ ์ปจ๋ฒค์…˜๊ณผ ์•„ํ‚คํ…์ฒ˜ ๋ฃฐ(์˜์กด์„ฑ ๋ฐฉํ–ฅ ๋“ฑ)์„ ์‹œ์Šคํ…œ์ ์œผ๋กœ ๊ฐ•์ œํ•œ๋‹ค [6, 20]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: CI/CD ํŒŒ์ดํ”„๋ผ์ธ์—์„œ์˜ ์ฝ”๋“œ ํ’ˆ์งˆ ๋ณด์ฆ ๋ฐ ํŒ€์› ๊ฐ„์˜ ์Šคํƒ€์ผ ๋ถ„์Ÿ ๋ฐฉ์ง€ [20]. +- [[Redux vs Zustand in Teams]] + - ์—ฐ๊ฒฐ ์ด์œ : ํŒ€์˜ ๊ทœ๋ชจ(์†Œ๊ทœ๋ชจ vs ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ)์— ๋”ฐ๋ผ ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ์˜ ์„ ํƒ์ด ํ˜‘์—…์˜ ์ผ๊ด€์„ฑ์— ๊ฒฐ์ •์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค [5, 24, 27]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ฐœ๋ฐœ์ž์˜ ์ž์œจ์„ฑ ๋ถ€์—ฌ์™€ ์ผ๊ด€์„ฑ ๊ฐ•์ œ(Boilerplate) ์‚ฌ์ด์˜ ์•„ํ‚คํ…์ฒ˜์  ํŠธ๋ ˆ์ด๋“œ์˜คํ”„ [22, 41]. + +### Deeper Research Questions + +- ์†Œ๊ทœ๋ชจ ํŒ€(2~5์ธ)์—์„œ ๋Œ€๊ทœ๋ชจ ํŒ€(10์ธ ์ด์ƒ)์œผ๋กœ ํ™•์žฅํ•  ๋•Œ Git ์›Œํฌํ”Œ๋กœ์šฐ์™€ ๋ธŒ๋žœ์นญ ์ „๋žต์€ ์–ด๋–ป๊ฒŒ ์ง„ํ™”ํ•ด์•ผ ํ•˜๋Š”๊ฐ€? +- Feature-Sliced Design(FSD)์„ ํ”„๋กœ์ ํŠธ์— ๋„์ž…ํ•  ๋•Œ, ํŒ€์›๋“ค์ด ๊ณตํ†ต ๋ชจ๋“ˆ์„ `/shared` ํด๋”์— ๋ฌด๋ถ„๋ณ„ํ•˜๊ฒŒ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์ฒด์ ์ธ ๊ฑฐ๋ฒ„๋„Œ์Šค ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? +- ESLint์™€ Husky๋ฅผ ํ™œ์šฉํ•œ ์ž๋™ํ™” ๊ฑฐ๋ฒ„๋„Œ์Šค ์„ค์ • ์‹œ, ๊ฐœ๋ฐœ ์†๋„๋ฅผ ๋Šฆ์ถ”์ง€ ์•Š์œผ๋ฉด์„œ ๋ชจ๋“ˆ ๊ฐ„ ์ž˜๋ชป๋œ ์˜์กด์„ฑ(์ƒ์œ„ ๋ ˆ์ด์–ด ์ฐธ์กฐ ๋“ฑ)์„ ์›์ฒœ ์ฐจ๋‹จํ•˜๋Š” ์ตœ์ ์˜ ๊ทœ์น™ ๊ตฌ์„ฑ์€ ๋ฌด์—‡์ธ๊ฐ€? +- ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(Redux vs Zustand)์˜ ์„ ํƒ์ด ํŒ€์› ๊ฐ„์˜ ๋น„๋™๊ธฐ ๋กœ์ง ๋ฐ ๋ฐ์ดํ„ฐ ํŒจ์นญ(Fetching) ํŒจํ„ด์˜ ํŒŒํŽธํ™”์— ๋ฏธ์น˜๋Š” ์‹ค์ œ ์˜ํ–ฅ์€ ๋ฌด์—‡์ธ๊ฐ€? +- Pull Request ๊ธฐ๋ฐ˜์˜ ํ˜‘์—… ํ™˜๊ฒฝ์—์„œ, ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ ๋„๊ตฌ(์˜ˆ: Storybook, Chromatic)๊ฐ€ ์ฝ”๋“œ ๋ฆฌ๋ทฐ์˜ ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ์–ด๋–ป๊ฒŒ ํ•ด์†Œํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? + +### Practical Application Contexts + +- **Implementation:** ์ฝ”๋“œ๋ฅผ ์ปค๋ฐ‹ํ•˜๊ณ  PR์„ ์ƒ์„ฑํ•  ๋•Œ, ๋ฐ˜๋“œ์‹œ ์ •ํ•ด์ง„ Conventional Commits ๊ทœ์น™์„ ๋”ฐ๋ฅด๊ณ  JIRA ๋“ฑ์˜ ์ด์Šˆ ํ‹ฐ์ผ“ ๋ฒˆํ˜ธ๋ฅผ ๋ธŒ๋žœ์น˜์™€ ์ปค๋ฐ‹์— ๊ธฐ์ž…ํ•˜์—ฌ ์ถ”์ ์„ฑ์„ ๋ณด์žฅํ•œ๋‹ค [14, 37]. +- **System Design:** ํ”„๋กœ์ ํŠธ ํด๋” ๊ตฌ์กฐ ์„ค๊ณ„ ์‹œ ๊ธฐ์ˆ ์  ํŒŒ์ผ ํƒ€์ž…(์ปดํฌ๋„ŒํŠธ, ํ›… ๋“ฑ)์˜ ๋‚˜์—ด์ด ์•„๋‹Œ, ์ธ์ฆ, ๋Œ€์‹œ๋ณด๋“œ ๋“ฑ ๊ธฐ๋Šฅ(Feature) ๋„๋ฉ”์ธ ๋‹จ์œ„๋กœ ๊ฒฉ๋ฆฌ์‹œ์ผœ ๊ฐ ๊ธฐ๋Šฅ๋ณ„๋กœ ์ „๋‹ด ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ณ‘๋ ฌ๋กœ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค [2, 42, 43]. +- **Operation / Maintenance:** CI/CD ํŒŒ์ดํ”„๋ผ์ธ๊ณผ Git Hooks(Husky)๋ฅผ ์„ธํŒ…ํ•˜์—ฌ, ๋ˆ„๊ตฐ๊ฐ€ ์ปจ๋ฒค์…˜์„ ์–ด๊ธด ์ฝ”๋“œ๋ฅผ ํ‘ธ์‹œํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์‚ฌ์ „์— ๋ฆฐํ„ฐ์™€ ํฌ๋งคํ„ฐ๊ฐ€ ์ž‘๋™ํ•ด ์ž˜๋ชป๋œ ์ฝ”๋“œ๊ฐ€ ์›๊ฒฉ ๋ธŒ๋žœ์น˜์— ์˜ฌ๋ผ๊ฐ€๋Š” ๊ฒƒ์„ ์ฐจ๋‹จํ•œ๋‹ค [20]. +- **Learning Path:** ์‹ ๊ทœ ์ž…์‚ฌ์ž๋‚˜ ํŒ€์›์ด ๋ฐฐ์ •๋˜์—ˆ์„ ๋•Œ, `README`์— ๋ช…์‹œ๋œ ํŒ€์˜ ๋ธŒ๋žœ์นญ ์ „๋žต ๊ทœ์น™๊ณผ ํด๋” ๋””๋ ‰ํ† ๋ฆฌ ์„ค๊ณ„ ์˜๋„๋ฅผ ๋จผ์ € ํ•™์Šตํ•˜๊ฒŒ ํ•˜์—ฌ ํ”„๋กœ์ ํŠธ ์˜จ๋ณด๋”ฉ ์‹œ๊ฐ„์„ ๋‹จ์ถ•ํ•œ๋‹ค [2, 44]. +- **My Project Relevance:** ๋‹ค์ˆ˜์˜ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•จ๊ป˜ ์ฐธ์—ฌํ•˜๋Š” ๋ฆฌ์•กํŠธ ํ”„๋กœ์ ํŠธ์—์„œ, ์ฝ”๋“œ ์ถฉ๋Œ๊ณผ ๊ธฐ์ˆ  ๋ถ€์ฑ„๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ  ์ผ๊ด€๋œ ์ œํ’ˆ ํ’ˆ์งˆ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์ˆ˜์ ์œผ๋กœ ์ˆ˜๋ฆฝํ•ด์•ผ ํ•˜๋Š” ํ˜‘์—… ๊ทธ๋ผ์šด๋“œ ๋ฃฐ(Ground Rules)์ด๋‹ค. + +### Adjacent Topics + +- [[Code Review Practices]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ์ž‘์€ ๋‹จ์œ„์˜ Pull Request ์œ ์ง€, ์‹œ๊ฐ์  ๋ฆฌ๋ทฐ ๋„๊ตฌ์˜ ๋„์ž…, ํšจ์œจ์ ์ธ ๋™๋ฃŒ ํ”ผ๋“œ๋ฐฑ ์ œ๊ณต ๋“ฑ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ์ž์ฒด์˜ ํ’ˆ์งˆ๊ณผ ์†๋„๋ฅผ ๋†’์ด๋Š” ๋ฐฉ๋ฒ•๋ก  [37, 45]. +- [[CI/CD Pipelines]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ํŒ€์›์˜ ์ฝ”๋“œ๊ฐ€ `main`์— ๋ณ‘ํ•ฉ๋˜๊ธฐ ์ „, ์ž๋™์œผ๋กœ ํ…Œ์ŠคํŠธ์™€ ๋ฆฐํŒ…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋ฐฐํฌ๊นŒ์ง€ ์ด์–ด์ง€๋Š” ์ธํ”„๋ผ ๋ฐ ๋ฐ๋ธŒ์˜ต์Šค ํ™˜๊ฒฝ [7]. +- [[Visual Regression Testing]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: Storybook ๋ฐ Chromatic์„ ํ™œ์šฉํ•ด UI ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ฆฌ๋ทฐ์–ด๊ฐ€ ์‹œ๊ฐ์ ์œผ๋กœ ์ง์ ‘ ํ™•์ธํ•˜๊ณ , ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๋ ˆ์ด์•„์›ƒ ๊นจ์ง์„ ๋ฐฉ์ง€ํ•˜๋Š” ํ˜‘์—… ๊ธฐ์ˆ  [45, 46]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Version Control.md b/00_Raw/Version Control.md new file mode 100644 index 00000000..2da5260d --- /dev/null +++ b/00_Raw/Version Control.md @@ -0,0 +1,69 @@ +# [[Version Control]] + +## ๐Ÿ“Œ Brief Summary +๋ฒ„์ „ ๊ด€๋ฆฌ(Version Control)๋Š” ์†Œ๊ทœ๋ชจ๋ถ€ํ„ฐ ๋Œ€๊ทœ๋ชจ ํŒ€์— ์ด๋ฅด๊ธฐ๊นŒ์ง€ ์ฝ”๋“œ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ถ”์ ํ•˜๊ณ , ๋ณ‘ํ•ฉ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๋ฉฐ ์•ˆ์ •์ ์ธ ๋ฐฐํฌ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ํ•„์ˆ˜์ ์ธ ํ˜‘์—… ๋„๊ตฌ ๋ฐ ๊ฑฐ๋ฒ„๋„Œ์Šค ํ”„๋กœ์„ธ์Šค์ž…๋‹ˆ๋‹ค [1, 2]. ๊ฐœ๋ฐœํŒ€์€ ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ์™€ ํŒ€์˜ ์ˆ™๋ จ๋„์— ๋”ฐ๋ผ Feature-Branch ์›Œํฌํ”Œ๋กœ์šฐ, Trunk-based ๊ฐœ๋ฐœ, Git Flow ๋“ฑ ๋‹ค์–‘ํ•œ ๋ธŒ๋žœ์นญ ์ „๋žต์„ ์„ ํƒํ•˜์—ฌ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค [3, 4]. ํšจ๊ณผ์ ์ธ ๋ฒ„์ „ ๊ด€๋ฆฌ๋Š” ๋ธŒ๋žœ์น˜์™€ ์ปค๋ฐ‹์— ํ‹ฐ์ผ“ ID ์—ฐ๋™, ์˜๋ฏธ ์žˆ๋Š” ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ์ž‘์„ฑ, ์ž‘๊ณ  ๋นˆ๋ฒˆํ•œ ์ปค๋ฐ‹, ๊ทธ๋ฆฌ๊ณ  ์—„๊ฒฉํ•œ ํ’€ ๋ฆฌํ€˜์ŠคํŠธ(PR) ๋ฆฌ๋ทฐ ๋“ฑ์˜ ๋ชจ๋ฒ” ์‚ฌ๋ก€๋ฅผ ์ค€์ˆ˜ํ•˜์—ฌ ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ํ’ˆ์งˆ๊ณผ ์ถ”์ ์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค [2, 5]. + +## ๐Ÿ“– Core Content +* **์ฃผ์š” ๋ธŒ๋žœ์นญ ์ „๋žต (Branching Strategies)** + * **Feature-Branch Workflow**: 2~5์ธ ๊ทœ๋ชจ์˜ ์†Œ๊ทœ๋ชจ ํŒ€์—๊ฒŒ ๊ฐ€์žฅ ๊ถŒ์žฅ๋˜๋Š” ๋‹จ์ˆœํ•˜๊ณ  ์ถฉ๋Œ์ด ์ ์€ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค [6]. `main` ๋ธŒ๋žœ์น˜๋Š” ํ•ญ์ƒ ์•ˆ์ •์ ์ด๊ณ  ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋ฉฐ, ๊ฐ ๊ธฐ๋Šฅ์ด๋‚˜ ๋ฒ„๊ทธ ์ˆ˜์ •์€ `main`์—์„œ ๋ถ„๊ธฐ๋œ ์งง์€ ์ˆ˜๋ช…์˜ ๊ฐœ๋ณ„ ๋ธŒ๋žœ์น˜์—์„œ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค [6, 7]. + * **Trunk-Based Development**: ์งง์€ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜(Trunk)์— ์ฝ”๋“œ๋ฅผ ๋น ๋ฅด๊ณ  ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ณ‘ํ•ฉํ•˜๋Š” ์ „๋žต์œผ๋กœ, ๊ฐ•๋ ฅํ•œ CI/CD ํ™˜๊ฒฝ๊ณผ ๊ฒฝํ—˜์ด ๋งŽ์€ ํŒ€์—๊ฒŒ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค [8, 9]. + * **Git Flow & GitHub Flow**: Git Flow๋Š” ๋ณ„๋„์˜ ๋ฆด๋ฆฌ์Šค ๋ธŒ๋žœ์น˜ ๋“ฑ์„ ๋‘์–ด ์Šค์ผ€์ค„์— ๋”ฐ๋ฅธ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์ข‹์ง€๋งŒ, ์ž‘์€ ํŒ€์—๊ฒŒ๋Š” ์ ˆ์ฐจ๊ฐ€ ๋ฌด๊ฒ์Šต๋‹ˆ๋‹ค [9]. ๋ฐ˜๋ฉด GitHub Flow๋Š” ๋” ๋‹จ์ˆœํ•˜๋ฉฐ ๋น ๋ฅธ ํ†ตํ•ฉ์„ ์ง€ํ–ฅํ•ฉ๋‹ˆ๋‹ค [10]. + +* **๋ช…๋ช… ๊ทœ์น™ ๋ฐ ์ถ”์ ์„ฑ (Naming Conventions & Traceability)** + * **๋ธŒ๋žœ์น˜ ๋ช…๋ช… (Branch Naming)**: ๋ธŒ๋žœ์น˜ ์ด๋ฆ„์—๋Š” ์ž‘์—…์˜ ์œ ํ˜•๊ณผ ํ‹ฐ์ผ“ ID, ์งง์€ ์„ค๋ช…์„ ํฌํ•จํ•˜๋Š” ๊ฒƒ(์˜ˆ: `feature/PROJ-123-user-auth`)์ด ๊ถŒ์žฅ๋˜๋ฉฐ, ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ์†Œ๋ฌธ์ž์™€ ํ•˜์ดํ”ˆ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [11, 12]. + * **์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ (Commit Messages)**: 'Conventional Commits' ์‚ฌ์–‘์„ ๋”ฐ๋ผ `feat:`, `fix:`, `docs:`, `refactor:`, `chore:` ๋“ฑ์˜ ์ ‘๋‘์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€๊ฒฝ ๋ชฉ์ ์„ ๋ช…ํ™•ํžˆ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [5, 13]. ์ปค๋ฐ‹์€ ๋…ผ๋ฆฌ์ ์ธ ๋‹จ์ผ ๋ณ€๊ฒฝ ์‚ฌํ•ญ๋งŒ์„ ํฌํ•จํ•˜๋Š” '์›์ž์  ์ปค๋ฐ‹(Atomic Commits)' ํ˜•ํƒœ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค [14]. + +* **๋ณ‘ํ•ฉ ๋ฐ ๋ฆฌ๋ทฐ ํ”„๋กœ์„ธ์Šค (Merging and Code Review)** + * **Pull Request (PR)**: ์ฝ”๋“œ๋ฅผ `main`์— ๋ณ‘ํ•ฉํ•˜๊ธฐ ์ „ ๋ฐ˜๋“œ์‹œ PR์„ ์—ด์–ด ์ตœ์†Œ 1๋ช… ์ด์ƒ์˜ ๋™๋ฃŒ ๋ฆฌ๋ทฐ๋ฅผ ๊ฑฐ์น˜๊ณ  CI ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [15, 16]. ๋ฆฌ๋ทฐ๊ฐ€ ์‰ฝ๊ฒŒ ์ง„ํ–‰๋˜๋„๋ก PR์€ ์ž‘๊ฒŒ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [13]. + * **์ถฉ๋Œ ์˜ˆ๋ฐฉ ๋ฐ ์ •๋ฆฌ**: ๋ณ‘ํ•ฉ ์ถฉ๋Œ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด `main` ๋ธŒ๋žœ์น˜์˜ ์ตœ์‹  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ž์ฃผ ๊ฐ€์ ธ์™€ ๋™๊ธฐํ™”(pull/rebase)ํ•ด์•ผ ํ•˜๋ฉฐ, ๋ณ‘ํ•ฉํ•  ๋•Œ๋Š” 'Squash & Merge'๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ณ  ๋ณ‘ํ•ฉ ํ›„์—๋Š” ์‚ฌ์šฉํ•œ ๋ธŒ๋žœ์น˜๋ฅผ ์ž๋™ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค [15, 17, 18]. + +## โš–๏ธ Trade-offs & Caveats +* **์˜ค๋ฒ„ํ—ค๋“œ vs. ์ œ์–ด๋ ฅ**: Git Flow์™€ ๊ฐ™์ด ๊ตฌ์กฐํ™”๋˜๊ณ  ๋ฌด๊ฑฐ์šด ํ”„๋กœ์„ธ์Šค๋Š” ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฆด๋ฆฌ์Šค ์ผ์ •์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์ข‹์ง€๋งŒ, ์†Œ๊ทœ๋ชจ ํŒ€์—๊ฒŒ๋Š” ํ”„๋กœ์„ธ์Šค ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋„ˆ๋ฌด ์ปค์„œ ๊ฐœ๋ฐœ ์†๋„๋ฅผ ์ €ํ•˜์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [9, 19]. ๋ฐ˜๋Œ€๋กœ ๋„ˆ๋ฌด ๋‹จ์ˆœํ•œ ์ „๋žต์€ ์—„๊ฒฉํ•œ ์ œ์–ด๊ฐ€ ํ•„์š”ํ•œ ๋Œ€ํ˜• ํ”„๋กœ์ ํŠธ์—์„œ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํŒ€ ๊ทœ๋ชจ์™€ ์š”๊ตฌ์‚ฌํ•ญ์— ๋งž์ถ˜ ์ „๋žต ์„ ํƒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค [20]. +* **Trunk-Based ๊ฐœ๋ฐœ์˜ ์ œ์•ฝ์‚ฌํ•ญ**: ๋ณ‘ํ•ฉ ์ถฉ๋Œ์„ ์ตœ์†Œํ™”ํ•˜๊ณ  ๋น ๋ฅธ ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•˜์ง€๋งŒ, ๊ฐœ๋ฐœํŒ€์˜ ๋†’์€ ์ˆ™๋ จ๋„์™€ ๊ฐ•๋ ฅํ•œ CI ๊ฒ€์ฆ ํŒŒ์ดํ”„๋ผ์ธ์ด ์ „์ œ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [9]. ๋˜ํ•œ, ๋ฏธ์™„์„ฑ๋œ ๊ธฐ๋Šฅ์ด ๋ณ‘ํ•ฉ๋  ์œ„ํ—˜์ด ์žˆ์œผ๋ฏ€๋กœ ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ(Feature flags)๋ฅผ ์ถ”๊ฐ€๋กœ ๋„์ž…ํ•ด์•ผ ํ•˜๋Š” ์ œ์•ฝ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [19]. +* **์žฅ๊ธฐ ๋ธŒ๋žœ์น˜(Long-lived Branches)์˜ ๋ฐ˜๋Œ€๊ธ‰๋ถ€**: ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ์„ ์œ„ํ•ด ๋ธŒ๋žœ์น˜๋ฅผ ๋„ˆ๋ฌด ์˜ค๋ž˜ ์œ ์ง€ํ•˜๋ฉด ๋ณ‘ํ•ฉ ์‹œ์ ์— ์—„์ฒญ๋‚œ ์ฝ”๋“œ ์ถฉ๋Œ(merge conflicts)์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค [12, 21]. ๋”ฐ๋ผ์„œ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ž‘์—…์ž๊ฐ€ ๋งค์ผ `main` ๋ธŒ๋žœ์น˜์™€ ๋™๊ธฐํ™”ํ•˜๋Š” ์ง€์†์ ์ธ ์œ ์ง€๋ณด์ˆ˜ ๋…ธ๋ ฅ์„ ๊ธฐ์šธ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค [18]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [์›Œํฌํ”Œ๋กœ์šฐ ๋ฐ ๋ฐฉ๋ฒ•๋ก  (Workflow Strategies)] +- [[Feature Branch Workflow]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋ฒ„๊ทธ ์ˆ˜์ •์ด๋‚˜ ์ƒˆ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ ์‹œ `main`๊ณผ ๋ถ„๋ฆฌ๋œ ๋…๋ฆฝ์ ์ด๊ณ  ์งง์€ ์ˆ˜๋ช…์˜ ๋ธŒ๋žœ์น˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ „๋žต์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. [6, 7] + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์–ด๋–ป๊ฒŒ `main` ๋ธŒ๋žœ์น˜์˜ ์•ˆ์ •์„ฑ์„ ํ›ผ์†ํ•˜์ง€ ์•Š์œผ๋ฉด์„œ๋„ ๋‹ค์ˆ˜์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[Trunk-Based Development]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋ชจ๋“  ๊ฐœ๋ฐœ์ž๊ฐ€ ๋นˆ๋ฒˆํ•˜๊ฒŒ ์งง์€ ์ฃผ๊ธฐ๋กœ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜(Trunk)์— ์ฝ”๋“œ๋ฅผ ๋ณ‘ํ•ฉํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. [8, 9] + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ง€์†์  ํ†ตํ•ฉ(CI)์„ ์–ด๋–ป๊ฒŒ ๋ณด์žฅํ•˜๋ฉฐ, ์žฅ๊ธฐ ๋ธŒ๋žœ์น˜๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ํšŒํ”ผํ•˜๋Š”์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[Git Flow]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋ฆด๋ฆฌ์Šค์šฉ ๋ธŒ๋žœ์น˜์™€ ๊ฐœ๋ฐœ์šฉ ๋ธŒ๋žœ์น˜๋ฅผ ๋ช…ํ™•ํžˆ ๋‚˜๋ˆ„์–ด ๋ณต์žกํ•œ ํ”„๋กœ์ ํŠธ ๋ฆด๋ฆฌ์Šค๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. [9, 19] + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํŒ€์˜ ๊ทœ๋ชจ์™€ ๋ฐฐํฌ ์Šค์ผ€์ค„์— ๋”ฐ๋ผ ์›Œํฌํ”Œ๋กœ์šฐ์— ์–ด๋–ค ๊ตฌ์กฐ์  ๋ ˆ์ด์–ด๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +#### [ํ˜‘์—… ๋ฐ ํ’ˆ์งˆ ๊ด€๋ฆฌ (Quality Assurance & Collaboration)] +- [[Pull Request (PR)]] + - ์—ฐ๊ฒฐ ์ด์œ : ์ฝ”๋“œ๋ฅผ ์ฃผ ๋ธŒ๋žœ์น˜์— ๋ณ‘ํ•ฉํ•˜๊ธฐ ์ „, ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋™๋ฃŒ์—๊ฒŒ ๊ฒ€ํ† ๋ฐ›๋Š” ํ•ต์‹ฌ ํ’ˆ์งˆ ํ†ต์ œ ์ ˆ์ฐจ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. [13, 16] + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ฝ”๋“œ ๋ฆฌ๋ทฐ์™€ CI ํ…Œ์ŠคํŠธ ์ž๋™ํ™”๊ฐ€ ์–ด๋–ป๊ฒŒ ์‹ค์ œ ์ฝ”๋“œ ํ’ˆ์งˆ์„ ์œ ์ง€ํ•˜๊ณ  ํŒ€ ๋‚ด ์ง€์‹ ๊ณต์œ ๋ฅผ ๋•๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[Conventional Commits]] + - ์—ฐ๊ฒฐ ์ด์œ : `feat:`, `fix:`์™€ ๊ฐ™์ด ํ‘œ์ค€ํ™”๋œ ์ ‘๋‘์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€์˜ ์˜๋„๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ตฌ๋ฌธ ๊ทœ์น™์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. [5, 13] + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ํ†ตํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์ถ”์ ์„ฑ ํ™•๋ณด์™€ ๋ฆด๋ฆฌ์Šค ๋…ธํŠธ ์ž๋™ํ™”์— ์–ด๋–ป๊ฒŒ ๊ธฐ์—ฌํ•˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### Deeper Research Questions +- ์†Œ๊ทœ๋ชจ ํŒ€(2~5๋ช…)์ด ์„ฑ์žฅํ•˜์—ฌ 10๋ช… ์ด์ƒ์˜ ๋Œ€๊ทœ๋ชจ ์กฐ์ง์ด ๋  ๋•Œ, Feature-Branch ์›Œํฌํ”Œ๋กœ์šฐ์—์„œ Git Flow ๋“ฑ ๋” ๋ณต์žกํ•œ ์ „๋žต์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋Š” ๊ตฌ์ฒด์ ์ด๊ณ  ์•ˆ์ „ํ•œ ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? [9, 20] +- Trunk-based ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ๋ถˆ์™„์ „ํ•œ ์ฝ”๋“œ๋ฅผ ๋ฐฐํฌํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ(Feature Flags)๋Š” ๋ฒ„์ „ ๊ด€๋ฆฌ ๋ฐ ๋ธŒ๋žœ์นญ ์ „๋žต์˜ ๋ณต์žก์„ฑ์— ์–ด๋–ค ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”๊ฐ€? [19] +- Pull Request ์™„๋ฃŒ ์‹œ 'Squash & Merge' ๋ฐฉ์‹๊ณผ 'Merge Commit' ๋ฐฉ์‹ ๊ฐ„์˜ ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ ๊ฐ€๋…์„ฑ ๋ฐ ๋กค๋ฐฑ ์šฉ์ด์„ฑ ์ฐจ์ด๋Š” ์–ด๋–ป๊ฒŒ ๋‚˜ํƒ€๋‚˜๋Š”๊ฐ€? [15, 17, 18] +- ๋ธŒ๋žœ์น˜ ์ด๋ฆ„๊ณผ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€์— ํ‹ฐ์ผ“ ID๋ฅผ ์˜๋ฌด์ ์œผ๋กœ ํฌํ•จํ•˜๋Š” ๊ฑฐ๋ฒ„๋„Œ์Šค๋Š”, ์‹ค์ œ ์ด์Šˆ ํŠธ๋ž˜ํ‚น ๋„๊ตฌ(์˜ˆ: JIRA) ๋ฐ CI/CD ํŒŒ์ดํ”„๋ผ์ธ๊ณผ ๊ฒฐํ•ฉ ์‹œ ์–ด๋–ค ์ž๋™ํ™” ํ˜œํƒ์„ ์ œ๊ณตํ•˜๋Š”๊ฐ€? [2, 10] +- ์žฅ๊ธฐ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜(Long-lived feature branches)๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ๊ฑฐ๋Œ€ํ•œ ๋ณ‘ํ•ฉ ์ถฉ๋Œ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ํŒ€์€ ์ผ์ผ ์ž‘์—…์—์„œ ์–ด๋–ค ๋™๊ธฐํ™” ํŒจํ„ด์„ ์Šต๊ด€ํ™”ํ•ด์•ผ ํ•˜๋Š”๊ฐ€? [18, 21] + +### Practical Application Contexts +- **Implementation:** ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ ์‹œ `feature/PROJ-123-user-auth`์ฒ˜๋Ÿผ ํ‹ฐ์ผ“ ID๋ฅผ ํฌํ•จํ•˜๋Š” ๋ช…๋ช… ๊ทœ์น™์„ ์ ์šฉํ•˜๊ณ , `feat: add login form` ๋“ฑ์˜ Conventional Commits ํ˜•์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„ ์ด๋ ฅ์„ ์ฒด๊ณ„์ ์œผ๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค [10, 11]. +- **System Design:** ์ฝ”๋“œ๋ฅผ ํ•˜๋‚˜์˜ ๋…ผ๋ฆฌ์  ๋‹จ์œ„๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ์›์ž์  ์ปค๋ฐ‹(Atomic Commits) ๊ทœ์น™์„ ๋„์ž…ํ•˜๊ณ , CI/CD ์ฒดํฌ๊ฐ€ ํ†ต๊ณผ๋˜๊ณ  1์ธ ์ด์ƒ์ด ์Šน์ธํ•ด์•ผ๋งŒ `main`์— ๋ณ‘ํ•ฉ ๊ฐ€๋Šฅํ•˜๋„๋ก ๋ธŒ๋žœ์น˜ ๋ณดํ˜ธ(Branch Protection) ์‹œ์Šคํ…œ์„ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค [14, 15]. +- **Operation / Maintenance:** `main` ๋ธŒ๋žœ์น˜๋Š” ํ•ญ์ƒ ์•ˆ์ •์ ์ด๊ณ  ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ(deployable) ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋„๋ก ์šด์˜ํ•˜๋ฉฐ, ๋ณ‘ํ•ฉ ์™„๋ฃŒ ํ›„ ์‚ฌ์šฉ์ด ๋๋‚œ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜๋ฅผ ์ž๋™ ์‚ญ์ œ ์„ค์ •ํ•˜์—ฌ ์ €์žฅ์†Œ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค [7, 15, 18]. +- **Learning Path:** ์ฒ˜์Œ์—๋Š” ๋ณต์žกํ•œ ๋ฃฐ ์—†์ด ๋‹จ์ˆœํ•œ Feature-Branch ์›Œํฌํ”Œ๋กœ์šฐ์™€ ๋ช…ํ™•ํ•œ ๋„ค์ด๋ฐ ๊ทœ์น™์„ ์ตํžˆ๊ณ , ์ˆ™๋ จ๋„๊ฐ€ ๋†’์•„์ง€๋ฉด ์ž๋™ํ™”๋œ CI ํ™˜๊ฒฝ ํ•˜์˜ Trunk-Based ๊ฐœ๋ฐœ ๋˜๋Š” ๋ณต์žกํ•œ ๋ฒ„์ „ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ Git Flow๋กœ ํ•™์Šต์„ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค [9, 19, 20]. +- **My Project Relevance:** ํ”„๋ก ํŠธ์—”๋“œ/React ๊ฐœ๋ฐœ ํ”„๋กœ์ ํŠธ ๋“ฑ์˜ ํŒ€ ๋‹จ์œ„ ํ˜‘์—… ์‹œ, ๋ถˆํ•„์š”ํ•œ ์ ˆ์ฐจ ์—†์ด ์ฝ”๋“œ ์ถฉ๋Œ์„ ์ตœ์†Œํ™”ํ•˜๊ณ  ์ถ”์  ๊ฐ€๋Šฅํ•œ ๋ณ€๊ฒฝ ๋‚ด์—ญ์„ ๋ณด์žฅํ•˜๋Š” ํ˜‘์—… ๊ธฐ์ค€์„ ๋งˆ๋ จํ•˜๋Š” ๋ฐ ์ฆ‰๊ฐ์ ์œผ๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1, 22]. + +### Adjacent Topics +- [[Continuous Integration / Continuous Deployment (CI/CD)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: PR ๋‹จ๊ณ„์—์„œ ์ž๋™ํ™”๋œ ํ…Œ์ŠคํŠธ ๋ฐ ๋ฆฐํŒ…์„ ์‹คํ–‰ํ•˜๊ณ , ๋ฉ”์ธ ๋ธŒ๋žœ์น˜ ๋ณ‘ํ•ฉ ์‹œ ๋ฐฐํฌ๋ฅผ ์ž๋™ํ™”ํ•˜์—ฌ ๋ฒ„์ „ ๊ด€๋ฆฌ ๋„๊ตฌ์™€ ์–ด๋–ป๊ฒŒ ์‹œ๋„ˆ์ง€๋ฅผ ๋‚ด๋Š”์ง€ ์กฐ์‚ฌ. [1, 19] +- [[Issue Tracking Systems]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: JIRA๋‚˜ GitHub Issues ๋“ฑ์˜ ๋„๊ตฌ๊ฐ€ Git์˜ ํ‹ฐ์ผ“ ID ๊ฑฐ๋ฒ„๋„Œ์Šค์™€ ๊ฒฐํ•ฉ๋˜์–ด ์š”๊ตฌ์‚ฌํ•ญ๋ถ€ํ„ฐ ์ฝ”๋“œ ๋ณ€๊ฒฝ๊นŒ์ง€ ์–ด๋–ป๊ฒŒ ์™„๋ฒฝํ•œ ์ถ”์ ์„ฑ(Traceability)์„ ๋ณด์žฅํ•˜๋Š”์ง€ ์กฐ์‚ฌ. [2, 23] + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Visual Regression Testing.md b/00_Raw/Visual Regression Testing.md new file mode 100644 index 00000000..7711b648 --- /dev/null +++ b/00_Raw/Visual Regression Testing.md @@ -0,0 +1,57 @@ +# [[Visual Regression Testing]] + +## ๐Ÿ“Œ Brief Summary +์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ(Visual Regression Testing)๋Š” ์Šคํ† ๋ฆฌ๋ถ(Storybook) ๋“ฑ์˜ ๋„๊ตฌ๋กœ ๋ Œ๋”๋ง๋œ ์ปดํฌ๋„ŒํŠธ์˜ ํ”ฝ์…€ ๋‹จ์œ„ ์Šคํฌ๋ฆฐ์ƒท์„ ์บก์ฒ˜ํ•˜์—ฌ ์ด์ „์— ์•Œ๋ ค์ง„ "์ •์ƒ(baseline)" ์ƒํƒœ์˜ ์Šคํฌ๋ฆฐ์ƒท๊ณผ ์ž๋™์œผ๋กœ ๋น„๊ตํ•˜๋Š” ํ…Œ์ŠคํŠธ ๋ฐฉ์‹์ด๋‹ค [1, 2]. ์ด๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๋Š” ํ’€ ๋ฆฌํ€˜์ŠคํŠธ(PR) ๊ณผ์ •์—์„œ ์˜๋„์น˜ ์•Š์€ UI ๋ ˆ์ด์•„์›ƒ, ์ƒ‰์ƒ, ํƒ€์ดํฌ๊ทธ๋ž˜ํ”ผ ๋“ฑ์˜ ์‹œ๊ฐ์  ๋ณ€๊ฒฝ์ด๋‚˜ ๊ฒฐํ•จ์„ ์ฐพ์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค [3-5]. HTML ๋งˆํฌ์—…๋งŒ ๋น„๊ตํ•˜๋Š” ๊ธฐ์กด์˜ ์Šค๋ƒ…์ƒท ํ…Œ์ŠคํŠธ์™€ ๋‹ฌ๋ฆฌ, ์‹ค์ œ ์‚ฌ์šฉ์ž๊ฐ€ ๊ฒฝํ—˜ํ•˜๋Š” ํ™”๋ฉด ํ”ฝ์…€์„ ์ง์ ‘ ๊ฒ€์ฆํ•˜๋ฏ€๋กœ ์ถ”๊ฐ€์ ์ธ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ์ด๋‚˜ ์œ ์ง€๋ณด์ˆ˜ ๋ถ€๋‹ด์„ ์ค„์ด๋ฉด์„œ๋„ ์˜คํƒ(false positive)์„ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ํŠน์ง•์ด๋‹ค [1, 2]. + +## ๐Ÿ“– Core Content +* **์ž‘๋™ ์›๋ฆฌ ๋ฐ ํ”„๋กœ์„ธ์Šค:** ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ๋Š” ์ฝ”๋“œ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ ๋ชจ๋“  ์Šคํ† ๋ฆฌ(story)๋ฅผ ์‹ค์ œ ๋ธŒ๋ผ์šฐ์ €(Chrome, Firefox, Safari ๋“ฑ) ํ™˜๊ฒฝ์—์„œ ๋ Œ๋”๋งํ•˜๊ณ , ํ•ด๋‹น ํ™”๋ฉด์„ ์บก์ฒ˜ํ•˜์—ฌ ๊ธฐ์กด์˜ ๊ธฐ์ค€์„ (baseline)๊ณผ ๋น„๊ตํ•œ๋‹ค [4, 6]. ๋งŒ์•ฝ ๋ ˆ์ด์•„์›ƒ์ด๋‚˜ ์ƒ‰์ƒ ๋“ฑ์— ์˜๋„์น˜ ์•Š์€ ๋ณ€ํ™”๊ฐ€ ๊ฐ์ง€๋˜๋ฉด ํ•ด๋‹น ์ฐจ์ด์ ์„ ๊ฐ•์กฐํ•˜์—ฌ PR์—์„œ ์ˆ˜๋™ ๊ฒ€ํ† ๋ฅผ ๊ฑฐ์น˜๊ฒŒ ํ•จ์œผ๋กœ์จ ์‹œ๊ฐ์  ๊ฒฐํ•จ์ด ํ”„๋กœ๋•์…˜์œผ๋กœ ๋ฐฐํฌ๋˜๋Š” ๊ฒƒ์„ ์ฐจ๋‹จํ•œ๋‹ค [3, 6, 7]. ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์˜๋„๋œ ๊ฒƒ์ด๋ผ๋ฉด ๊ฐœ๋ฐœ์ž๊ฐ€ ์ƒˆ๋กœ์šด ๊ธฐ์ค€์„ ์œผ๋กœ ์Šน์ธ(accept)ํ•˜์—ฌ ๋กœ์ปฌ ๋ฐ CI ํ™˜๊ฒฝ์— ๋™๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค [7, 8]. +* **์Šค๋ƒ…์ƒท ํ…Œ์ŠคํŠธ(Snapshot Testing)์™€์˜ ์ฐจ์ด์ :** ๊ธฐ์กด ์Šค๋ƒ…์ƒท ํ…Œ์ŠคํŠธ๋Š” ๋ Œ๋”๋ง๋œ HTML ๋งˆํฌ์—… ๋ธ”๋ก์„ ๋น„๊ตํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ฝ”๋“œ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์œผ๋‚˜ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์ด๋Š” ์‹ค์ œ ์‹œ๊ฐ์  ๋ณ€๊ฒฝ์ด ์—†๋Š” ๊ฒฝ์šฐ์—๋„ ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ•˜๋Š” ์˜คํƒ(false positive)์ด ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฝ๋‹ค [2]. ๋ฐ˜๋ฉด ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ๋Š” ๋ Œ๋”๋ง๋œ ํ”ฝ์…€ ์ž์ฒด๋ฅผ ๋น„๊ตํ•˜๋ฏ€๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ์‹ค์ œ๋กœ ๊ฒฝํ—˜ํ•˜๋Š” UI์˜ ๋ชจ์–‘, ๊ฐ„๊ฒฉ, ๋ฐ˜์‘ํ˜• ๋™์ž‘ ๋“ฑ์„ ํ›จ์”ฌ ๋” ์ •ํ™•ํ•˜๊ณ  ํ’๋ถ€ํ•˜๊ฒŒ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๋‹ค [2, 5]. +* **์ธํ„ฐ๋ž™์…˜(Interaction) ๊ธฐ๋ฐ˜ ์ƒํƒœ ๊ฒ€์ฆ:** ์ปดํฌ๋„ŒํŠธ์˜ ๋กœ๋”ฉ, ์—๋Ÿฌ, ํ˜ธ๋ฒ„(hover), ๋ฉ”๋‰ด ์—ด๋ฆผ ๋“ฑ์˜ ๋‹ค์–‘ํ•œ UI ์ƒํƒœ๋ฅผ ๊ฒ€์ฆํ•˜๊ธฐ ์œ„ํ•ด ์Šคํ† ๋ฆฌ๋ถ์˜ ์ธํ„ฐ๋ž™์…˜ ํ…Œ์ŠคํŠธ์™€ ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ๋ฅผ ๊ฒฐํ•ฉํ•  ์ˆ˜ ์žˆ๋‹ค [9]. ์ธํ„ฐ๋ž™์…˜ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด ์ปดํฌ๋„ŒํŠธ๋ฅผ ํŠน์ • ์ƒํƒœ๋กœ ๋งŒ๋“  ํ›„ ์Šคํฌ๋ฆฐ์ƒท์„ ์ฐ์Œ์œผ๋กœ์จ ๋™์ ์ธ ํ–‰๋™์— ๋Œ€ํ•œ ์‹œ๊ฐ์  ๊ฒฐํ•จ ์œ ๋ฌด๊นŒ์ง€ ํ•˜๋‚˜์˜ ์›Œํฌํ”Œ๋กœ์šฐ ์•ˆ์—์„œ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค [9, 10]. +* **CI ํŒŒ์ดํ”„๋ผ์ธ ์ž๋™ํ™”:** ์ด ํ…Œ์ŠคํŠธ๋Š” GitHub Actions, GitLab Pipelines ๋“ฑ CI ํ™˜๊ฒฝ๊ณผ ์›ํ™œํ•˜๊ฒŒ ํ†ตํ•ฉ๋˜์–ด ํ’€ ๋ฆฌํ€˜์ŠคํŠธ(PR)๋งˆ๋‹ค ์ž๋™์œผ๋กœ ์‹คํ–‰๋œ๋‹ค [11, 12]. ํ…Œ์ŠคํŠธ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด PR์— UI ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•œ ์•Œ๋ฆผ(badge)์„ ์ œ๊ณตํ•˜์—ฌ, ๋ฆฌ๋ทฐ์–ด๊ฐ€ ๋ชจ๋“  ์ƒํƒœ๋ฅผ ์ผ์ผ์ด ํ™•์ธํ•˜๋Š” ๋Œ€์‹  ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„(diffs)์—๋งŒ ์ง‘์ค‘ํ•ด์„œ ๋ฆฌ๋ทฐํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š”๋‹ค [6, 12]. + +## โš–๏ธ Trade-offs & Caveats +* **๋ฏธ์„ธํ•œ ํ”ฝ์…€ ์ฐจ์ด๋กœ ์ธํ•œ ๋…ธ์ด์ฆˆ(Flakiness):** ๋ธŒ๋ผ์šฐ์ €์˜ ์ด๋ฏธ์ง€ ์••์ถ• ๋…ธ์ด์ฆˆ๋‚˜ ์•ˆํ‹ฐ์•จ๋ฆฌ์–ด์‹ฑ(anti-aliasing) ์ฒ˜๋ฆฌ ๋“ฑ ์•„์ฃผ ๋ฏธ์„ธํ•œ ํ”ฝ์…€ ์ฐจ์ด ๋•Œ๋ฌธ์— ์‹ค์ œ๋กœ๋Š” ๊ฒฐํ•จ์ด ์•„๋‹˜์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์‹œ๊ฐ์  ๋ณ€๊ฒฝ์œผ๋กœ ๊ฐ์ง€๋˜๋Š” ํ…Œ์ŠคํŠธ ๋ถˆ์•ˆ์ •์„ฑ(Flake)์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค [11, 13]. ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ ๋„๊ตฌ์—์„œ๋Š” ์ƒ‰์ƒ ์ฐจ์ด ํ—ˆ์šฉ์น˜(color-delta tolerance) ์ž„๊ณ„๊ฐ’์„ ์„ค์ •ํ•˜์—ฌ ํ•ด๋‹น ๋ฒ”์ฃผ ์•„๋ž˜์˜ ์ฐจ์ด๋Š” ๋…ธ์ด์ฆˆ๋กœ ๋ฌด์‹œํ•˜๋Š” ์ตœ์ ํ™” ์ž‘์—…์ด ์š”๊ตฌ๋œ๋‹ค [10, 13]. +* **๋น„๋™๊ธฐ ์š”์†Œ ๋ฐ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ œ์–ด์˜ ํ•„์š”์„ฑ:** ์ปดํฌ๋„ŒํŠธ์— ํฌํ•จ๋œ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด๋‚˜ ๋น„๋™๊ธฐ ์—์…‹, ํฐํŠธ ๋“ฑ์ด ์™„์ „ํžˆ ๋ Œ๋”๋ง๋˜๊ธฐ ์ „์— ์Šคํฌ๋ฆฐ์ƒท์ด ์บก์ฒ˜๋˜๋ฉด ๋งค๋ฒˆ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์™€ ์ผ๊ด€๋œ ํ…Œ์ŠคํŠธ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•ด์ง„๋‹ค [10, 11]. ๋”ฐ๋ผ์„œ ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ ๋„๊ตฌ(Happo ๋“ฑ)๋Š” ์บก์ฒ˜ ์ „ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ž๋™์œผ๋กœ ์Œ์†Œ๊ฑฐ(silence) ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜ ๋น„๋™๊ธฐ ์š”์†Œ์˜ ๋กœ๋”ฉ์„ ๊ฐ•์ œ๋กœ ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๋Š” ๊ธฐ์ˆ ์  ์ œ์•ฝ๊ณผ ์ถ”๊ฐ€ ์„ค์ •์ด ํ•„์š”ํ•˜๋‹ค [10, 11]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [ํ…Œ์ŠคํŠธ ๋ฐ ๊ฒ€์ฆ ๊ธฐ์ˆ ] +- [[Snapshot Testing]] + - ์—ฐ๊ฒฐ ์ด์œ : ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ์™€ ๋Œ€์กฐ๋˜๋Š” ํ…Œ์ŠคํŠธ ๋ฐฉ์‹์œผ๋กœ, ํ”ฝ์…€์ด ์•„๋‹Œ ๋ Œ๋”๋ง๋œ HTML ๋งˆํฌ์—… ์ฝ”๋“œ ๋ฉ์–ด๋ฆฌ๋ฅผ ๋น„๊ตํ•œ๋‹ค [2]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: HTML ๊ตฌ์กฐ ๋น„๊ต ๋ฐฉ์‹์ด ์™œ ๋นˆ๋ฒˆํ•˜๊ฒŒ ์˜คํƒ(False Positive)์„ ๋ฐœ์ƒ์‹œํ‚ค๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ํ”ฝ์…€ ๊ธฐ๋ฐ˜ ๋น„๊ต๊ฐ€ ์œ ์ง€๋ณด์ˆ˜์— ์™œ ๋” ์œ ๋ฆฌํ•œ์ง€ ๋ช…ํ™•ํ•˜๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค [2]. +- [[Interaction Testing]] + - ์—ฐ๊ฒฐ ์ด์œ : ์‚ฌ์šฉ์ž์˜ ์ƒํ˜ธ์ž‘์šฉ์ด๋‚˜ ์ด๋ฒคํŠธ๋ฅผ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ์˜ ํŠน์ • UI ์ƒํƒœ๋ฅผ ์œ ๋„ํ•˜๋Š” ํ…Œ์ŠคํŠธ ๋ฐฉ์‹์ด๋‹ค [5, 10]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ •์  UI ํ™”๋ฉด๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋กœ๋”ฉ, ์—๋Ÿฌ, ํด๋ฆญ ์‹œ ๋“œ๋กญ๋‹ค์šด ์˜คํ”ˆ ๋“ฑ ๋™์ ์œผ๋กœ ๋ณ€ํ™”ํ•˜๋Š” UI ์ƒํƒœ๋ฅผ ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ๊ฐ€ ์–ด๋–ป๊ฒŒ ์บก์ฒ˜ํ•˜๊ณ  ๊ฒ€์ฆํ•˜๋Š”์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค [9, 10]. + +#### [๊ตฌํ˜„ ๋ฐ ํ™œ์šฉ ๋„๊ตฌ] +- [[Storybook]] + - ์—ฐ๊ฒฐ ์ด์œ : UI ์ปดํฌ๋„ŒํŠธ๋ฅผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ณต์žกํ•œ ๋กœ์ง๊ณผ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ฒฉ๋ฆฌ๋œ ํ™˜๊ฒฝ์—์„œ ์‹œ๊ฐ์ ์œผ๋กœ ๊ฐœ๋ฐœํ•˜๊ณ  ๋ฌธ์„œํ™”ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋„๊ตฌ์ด๋‹ค [3, 6]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ๊ฐ€ ์ „์ฒด ํŽ˜์ด์ง€ ๋‹จ์œ„๊ฐ€ ์•„๋‹Œ ๊ฐœ๋ณ„ ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ(Story) ๋‹จ์œ„๋กœ ๋ Œ๋”๋ง๋˜๊ณ  ๊ธฐ์ค€์„ ๊ณผ ๋น„๊ต๋˜๋Š” ์•„ํ‚คํ…์ฒ˜์  ๊ธฐ๋ฐ˜์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค [1]. +- [[Chromatic]] / [[Happo]] + - ์—ฐ๊ฒฐ ์ด์œ : Storybook๊ณผ ์—ฐ๊ฒฐ๋˜์–ด ์‹ค์ œ ๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋ฐ˜์˜ ์Šคํฌ๋ฆฐ์ƒท ์บก์ฒ˜, ๋ฒ ์ด์Šค๋ผ์ธ ํ”ฝ์…€ ๋น„๊ต, CI/CD ์—ฐ๋™ ๋“ฑ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค(๋„๊ตฌ)์ด๋‹ค [1, 3, 4]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ž๋™ํ™”๋œ ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ๊ฐ€ ๋ธŒ๋ผ์šฐ์ € ๊ฐ„์˜ ๋ Œ๋”๋ง ์ฐจ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ๋ณ‘๋ ฌ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ  ํ’€ ๋ฆฌํ€˜์ŠคํŠธ(PR) ํ”„๋กœ์„ธ์Šค์™€ ์–ด๋–ป๊ฒŒ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค [4, 12]. + +### Deeper Research Questions +- Snapshot Testing์—์„œ Visual Regression Testing์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ๋•Œ, ๋Œ€๊ทœ๋ชจ ์ปดํฌ๋„ŒํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ™˜๊ฒฝ์—์„œ ์ดˆ๊ธฐ ๊ธฐ์ค€์„ (baseline) ๊ตฌ์ถ• ๋ฐ ์Šคํ† ๋ฆฌ์ง€ ์œ ์ง€๋ณด์ˆ˜ ๋น„์šฉ์€ ์–ด๋–ป๊ฒŒ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- Chromatic์ด๋‚˜ Happo์™€ ๊ฐ™์€ ๋„๊ตฌ๊ฐ€ ํฌ๋กœ์Šค ๋ธŒ๋ผ์šฐ์ €(Chrome, Safari, Firefox ๋“ฑ)์—์„œ ๋™์ผํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋งํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” OS/๋ธŒ๋ผ์šฐ์ € ์—”์ง„๋ณ„ ๋ฏธ์„ธํ•œ ๋ Œ๋”๋ง ์ฐจ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋ณด์ •ํ•˜๋Š”๊ฐ€? +- ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ ํŒŒ์ดํ”„๋ผ์ธ์„ CI/CD์— ํ†ตํ•ฉํ–ˆ์„ ๋•Œ ๋นŒ๋“œ ์‹œ๊ฐ„ ์ง€์—ฐ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ(Parallelization) ๋ฐ ์ตœ์ ํ™” ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? +- ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋ฐ ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๋ณต์žกํ•œ ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ์ปดํฌ๋„ŒํŠธ์—์„œ ํ…Œ์ŠคํŠธ์˜ ๋ถˆ์•ˆ์ •์„ฑ(Flakiness)์„ ์ฝ”๋“œ ๋ ˆ๋ฒจ์—์„œ ๊ทผ๋ณธ์ ์œผ๋กœ ์ œ๊ฑฐํ•˜๋ ค๋ฉด ์ปดํฌ๋„ŒํŠธ๋ฅผ ์–ด๋–ป๊ฒŒ ์„ค๊ณ„ํ•ด์•ผ ํ•˜๋Š”๊ฐ€? +- Visual Regression Testing๊ณผ Accessibility Regression Testing์„ ํ•˜๋‚˜์˜ ์›Œํฌํ”Œ๋กœ์šฐ๋กœ ๊ฒฐํ•ฉํ–ˆ์„ ๋•Œ, ์ ‘๊ทผ์„ฑ ์œ„๋ฐ˜ ์‚ฌํ•ญ์ด ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ค ์‹œ๊ฐ์  ์ง€ํ‘œ์™€ ํ•จ๊ป˜ ๋ฆฌํฌํŠธ๋˜๋ฉฐ PR ๋ฆฌ๋ทฐ ํ”„๋กœ์„ธ์Šค๋Š” ์–ด๋–ป๊ฒŒ ํšจ์œจํ™”๋˜๋Š”๊ฐ€? + +### Practical Application Contexts +- **Implementation:** Storybook์œผ๋กœ UI ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฐœ๋ฐœํ•œ ํ›„, Chromatic์ด๋‚˜ Happo ๋“ฑ์˜ ์• ๋“œ์˜จ์„ ์„ค์น˜ํ•˜์—ฌ ์ฝ”๋“œ ๋ณ€๊ฒฝ ์‹œ๋งˆ๋‹ค ๊ฐ ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ๋ณ„ ์Šคํฌ๋ฆฐ์ƒท์„ ์ž๋™์œผ๋กœ ์บก์ฒ˜ํ•˜๊ณ  ๊ธฐ์ค€์„ ๊ณผ ๋น„๊ตํ•˜๋„๋ก ์„ค์ •ํ•œ๋‹ค [4, 14]. +- **System Design:** ํ”„๋ก ํŠธ์—”๋“œ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ ์‹œ, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ UI๋ฅผ ์ฒ ์ €ํžˆ ๋ถ„๋ฆฌํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ตฌ์ถ•ํ•˜๊ณ , ์‹œ๊ฐ์  ๊ฒ€์ฆ ์‹œ์Šคํ…œ์„ ๋„์ž…ํ•˜์—ฌ ๋Œ€๊ทœ๋ชจ ํŒ€์ด ๋™์‹œ์— ๊ฐœ๋ฐœํ•˜๋”๋ผ๋„ ์ผ๊ด€๋œ ๋””์ž์ธ ์‹œ์Šคํ…œ์ด ํ›ผ์†๋˜์ง€ ์•Š๋„๋ก ๋ฐฉ์–ด ์ฒด๊ณ„๋ฅผ ๋งˆ๋ จํ•œ๋‹ค [3, 4]. +- **Operation / Maintenance:** CI ํŒŒ์ดํ”„๋ผ์ธ(GitHub Actions ๋“ฑ)์— ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ๋ฅผ ํ•„์ˆ˜ ๋‹จ๊ณ„๋กœ ์ถ”๊ฐ€ํ•˜์—ฌ, ๋ณ€๊ฒฝ๋œ ๋””์ž์ธ ์ฝ”๋“œ๊ฐ€ PR์— ์˜ฌ๋ผ์˜ฌ ๋•Œ๋งˆ๋‹ค ์˜๋„์น˜ ์•Š์€ ๋ ˆ์ด์•„์›ƒ ๊นจ์ง ํ˜„์ƒ์„ ์ž๋™์œผ๋กœ ๊ฐ์ง€ํ•˜๊ณ  ๋ฆฌ๋ทฐ์–ด์—๊ฒŒ ์‹œ๊ฐ์  Diff๋ฅผ ์ œ๊ณตํ•˜์—ฌ ์šด์˜ ์œ ์ง€๋ณด์ˆ˜ ๋ถ€๋‹ด์„ ์ค„์ธ๋‹ค [3, 6, 12]. +- **Learning Path:** React ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜ UI ์ž‘์„ฑ โ†’ Storybook์„ ํ™œ์šฉํ•œ ์ปดํฌ๋„ŒํŠธ ๋ฌธ์„œํ™” ๋ฐ CDD(Component-Driven Development) โ†’ ์ธํ„ฐ๋ž™์…˜(Interaction) ํ…Œ์ŠคํŠธ ์ž‘์„ฑ โ†’ ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ ์ž๋™ํ™” ์ˆœ์œผ๋กœ ํ”„๋ก ํŠธ์—”๋“œ ํ’ˆ์งˆ ๊ฒ€์ฆ ํŒŒ์ดํ”„๋ผ์ธ์„ ํ•™์Šตํ•œ๋‹ค [9, 15]. +- **My Project Relevance:** ํ”„๋ก ํŠธ์—”๋“œ ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•˜๊ฑฐ๋‚˜ ์ˆ˜๋ฐฑ ๊ฐœ์˜ ํ™”๋ฉด์—์„œ ๊ณต์œ ๋˜๋Š” ์ฝ”์–ด UI ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฒ„์ „์„ ์—…๊ทธ๋ ˆ์ด๋“œํ•  ๋•Œ, ๋‹ค๋ฅธ ํŒ€์˜ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์˜๋„์น˜ ์•Š์€ ํŒŒ๊ธ‰ ํšจ๊ณผ(Side Effect) ๋ฐ ์‹œ๊ฐ์  ๊นจ์ง์„ ์•ˆ์ „ํ•˜๊ฒŒ ๊ฐ์ง€ํ•˜๊ณ  ํ™•์‹ ์„ ๊ฐ–๊ณ  ๋ฐฐํฌํ•˜๋Š” ๋ฐ ํ•ต์‹ฌ์ ์ธ ์—ญํ• ์„ ํ•œ๋‹ค [3, 16]. + +### Adjacent Topics +- [[Accessibility Regression Testing]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ ์›Œํฌํ”Œ๋กœ์šฐ์™€ ๊ฒฐํ•ฉํ•˜์—ฌ, ์ƒˆ๋กœ์šด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๋ณ„๋„๋กœ ์ž‘์„ฑํ•  ํ•„์š” ์—†์ด ์Šคํฌ๋ฆฐ์ƒท ์‹คํ–‰ ๋‹จ๊ณ„์—์„œ UI์˜ ์ ‘๊ทผ์„ฑ ์œ„๋ฐ˜(๋ช…๋„ ๋Œ€๋น„ ๋ถ€์กฑ, ํ‚ค๋ณด๋“œ ํฌ์ปค์Šค ๋ˆ„๋ฝ ๋“ฑ)๊นŒ์ง€ ๋™์‹œ์— ์ž๋™ ๊ฒ€์ฆํ•˜๋Š” ์˜์—ญ์œผ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋‹ค [9, 10]. +- [[Continuous Integration (CI) Pipelines]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: GitHub Actions, CircleCI ๋“ฑ์˜ CI ๋„๊ตฌ์—์„œ ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ ์ธํ”„๋ผ๊ฐ€ ์–ด๋–ป๊ฒŒ ์—ฐ๋™๋˜๋ฉฐ, ์ฝ”๋“œ๊ฐ€ ๋ณ‘ํ•ฉ๋˜๊ธฐ ์ „์— PR์˜ ์ƒํƒœ ์ฒดํฌ(Status Check)๋ฅผ ํ•„์ˆ˜๋กœ ์ œ์–ดํ•˜๋Š” ์ž๋™ํ™” ํŒŒ์ดํ”„๋ผ์ธ ๋ฐ DevOps ํ”„๋กœ์„ธ์Šค๋กœ ํ•™์Šต์„ ๋„“ํž ์ˆ˜ ์žˆ๋‹ค [12]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Vite + React ์„ฑ๋Šฅ ์ตœ์ ํ™”.md b/00_Raw/Vite + React ์„ฑ๋Šฅ ์ตœ์ ํ™”.md new file mode 100644 index 00000000..5fbe3306 --- /dev/null +++ b/00_Raw/Vite + React ์„ฑ๋Šฅ ์ตœ์ ํ™”.md @@ -0,0 +1,75 @@ +# [[Vite + React ์„ฑ๋Šฅ ์ตœ์ ํ™”]] + +## ๐Ÿ“Œ Brief Summary +Vite์™€ React ํ™˜๊ฒฝ์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๋Š” ๊ฒƒ์€ ์ดˆ๊ธฐ ๋กœ๋”ฉ ์†๋„๋ฅผ ๋†’์ด๊ณ  ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œ์ผœ ์ „๋ฐ˜์ ์ธ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๊ฐœ์„ ํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋Š” ๊ธฐ๋ณธ ES ๋ชจ๋“ˆ(ESM)์„, ์šด์˜ ํ™˜๊ฒฝ์—์„œ๋Š” Rollup์„ ํ†ตํ•œ ๋ฒˆ๋“ค๋ง์„ ํ™œ์šฉํ•˜๋Š” Vite์˜ ๊ตฌ์กฐ์  ์ด์ ์„ ๊ทน๋Œ€ํ™”ํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค. ์ฃผ์š” ์ตœ์ ํ™” ๊ธฐ๋ฒ•์œผ๋กœ๋Š” ๋น ๋ฅธ ์ปดํŒŒ์ผ์„ ์œ„ํ•œ SWC ๋„์ž…, ๋™์  ์ž„ํฌํŠธ๋ฅผ ํ†ตํ•œ ์ฝ”๋“œ ๋ถ„ํ• , `manualChunks`๋ฅผ ํ™œ์šฉํ•œ ๋ฌด๊ฑฐ์šด ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ถ„๋ฆฌ, ๊ทธ๋ฆฌ๊ณ  ๋ฒˆ๋“ค ์‹œ๊ฐํ™” ๋„๊ตฌ๋ฅผ ํ†ตํ•œ ๋ถˆํ•„์š”ํ•œ ์˜์กด์„ฑ ์ œ๊ฑฐ ๋“ฑ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. + +## ๐Ÿ“– Core Content +* **Vite์˜ ์•„ํ‚คํ…์ฒ˜ ์ดํ•ด ๋ฐ SWC ํ™œ์šฉ** + ๊ฐœ๋ฐœ ์ค‘์—๋Š” ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ๋ฏธ๋ฆฌ ๋ฒˆ๋“ค๋งํ•˜์ง€ ์•Š๊ณ  ๋ธŒ๋ผ์šฐ์ €์— ๋„ค์ดํ‹ฐ๋ธŒ ES ๋ชจ๋“ˆ(ESM)๋กœ ์ง์ ‘ ์ œ๊ณตํ•˜์—ฌ ๋งค์šฐ ๋น ๋ฅธ ์„œ๋ฒ„ ์‹œ์ž‘๊ณผ HMR(Hot Module Replacement)์„ ๋‹ฌ์„ฑํ•ฉ๋‹ˆ๋‹ค [1, 2]. ์ปดํŒŒ์ผ ์†๋„๋ฅผ ๊ทน๋Œ€ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ์กด์˜ Babel ๋Œ€์‹  Rust ๊ธฐ๋ฐ˜ ์ปดํŒŒ์ผ๋Ÿฌ์ธ SWC(`@vitejs/plugin-react-swc`)๋ฅผ ์ฑ„ํƒํ•˜๋ฉด, ์ปค์Šคํ…€ Babel ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ํ•„์š” ์—†๋Š” ๋Œ€๊ทœ๋ชจ React ํ”„๋กœ์ ํŠธ์—์„œ ๋นŒ๋“œ ๋ฐ ์ƒˆ๋กœ๊ณ ์นจ ์‹œ๊ฐ„์„ ํš๊ธฐ์ ์œผ๋กœ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3-5]. +* **์ฝ”๋“œ ๋ถ„ํ• (Code Splitting) ๋ฐ ์ง€์—ฐ ๋กœ๋”ฉ(Lazy Loading)** + ์ดˆ๊ธฐ ๋กœ๋“œ ์†๋„๋ฅผ ๋†’์ด๊ณ  LCP(Largest Contentful Paint)์™€ ๊ฐ™์€ ์›น ์ง€ํ‘œ๋ฅผ ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ๋ฌด๊ฑฐ์šด ๋ฒˆ๋“ค์„ ์—ฌ๋Ÿฌ ์ฒญํฌ๋กœ ๋ถ„ํ• ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [6, 7]. `React.lazy()`์™€ ``๋ฅผ ์‚ฌ์šฉํ•œ ๋™์  ์ž„ํฌํŠธ๋กœ ๋ผ์šฐํŠธ ๋ ˆ๋ฒจ์ด๋‚˜ ์ฐจํŠธ ๋“ฑ ํฐ ์œ„์ ฏ์„ ์‚ฌ์šฉ์ž๊ฐ€ ์ ‘๊ทผํ•  ๋•Œ๋งŒ ๋กœ๋“œํ•˜๋„๋ก ์„ค์ •ํ•˜๋ฉด ๋ฉ”์ธ ๋ฒˆ๋“ค์˜ ํฌ๊ธฐ๋ฅผ ๋Œ€ํญ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [6, 8-13]. +* **`manualChunks`๋ฅผ ํ™œ์šฉํ•œ ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ถ„ํ• ** + ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ ์‹œ 500kB ์ด์ƒ์˜ ๊ฑฐ๋Œ€ํ•œ ์ฒญํฌ ๊ฒฝ๊ณ ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด `vite.config.js`์˜ Rollup ์˜ต์…˜์—์„œ `manualChunks`๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค [12, 14-17]. React ์ฝ”์–ด๋‚˜ Lodash, ์ฐจํŠธ, ์•„์ด์ฝ˜ ๋“ฑ ์žฆ์€ ๋ณ€๊ฒฝ์ด ์—†๋Š” ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์„ ๋ณ„๋„์˜ ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌํ•˜๋ฉด, ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์€ ์ฝ”๋“œ๋ฅผ ์žฅ๊ธฐ๊ฐ„ ์บ์‹ฑ(Long-term caching)ํ•  ์ˆ˜ ์žˆ์–ด ์žฌ๋ฐฉ๋ฌธ ๋ฐ ๋ฐฐํฌ ์‹œ ๋กœ๋”ฉ ํšจ์œจ์ด ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค [12, 15, 18, 19]. +* **์˜์กด์„ฑ ์‚ฌ์ „ ๋ฒˆ๋“ค๋ง(`optimizeDeps`)๊ณผ ํŠธ๋ฆฌ ์‰์ดํ‚น** + ๋Œ€๊ทœ๋ชจ ์•ฑ์ด๋‚˜ ๋น„์ •์ƒ์ ์ธ ์˜์กด์„ฑ ๋กœ๋”ฉ์œผ๋กœ ์ธํ•œ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด `optimizeDeps`๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5, 6]. ๋˜ํ•œ ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ ๋กœ๋“œ๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด `lodash` ๋Œ€์‹  `lodash-es`์ฒ˜๋Ÿผ ํŠธ๋ฆฌ ์‰์ดํ‚น(Tree-shaking)์ด ์ง€์›๋˜๋Š” ์ตœ์‹  ES ๋ชจ๋“ˆ ๊ธฐ๋ฐ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์šฐ์„ ์ ์œผ๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [20]. +* **๋ฒˆ๋“ค ์‹œ๊ฐํ™” ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง** + `rollup-plugin-visualizer` ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์—ฐ๋™ํ•˜์—ฌ ๋นŒ๋“œ ์‹œ ๊ฑฐ๋Œ€ํ•œ ๋ฒˆ๋“ค์˜ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‹œ๊ฐ์ ์ธ ํŠธ๋ฆฌ๋งต ํ˜•ํƒœ๋กœ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค [6, 13, 21]. ์ด๋ฅผ ํ†ตํ•ด ๋ฒˆ๋“ค ๋‚ด ์ฐจ์ง€ํ•˜๋Š” ๋น„์ค‘์ด ๋ถˆํ•„์š”ํ•˜๊ฒŒ ํฐ ์ฝ”๋“œ๋ฅผ ์ฐพ์•„๋‚ด์–ด ์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜ ์ง€์—ฐ ๋กœ๋”ฉ์œผ๋กœ ๋ถ„๋ฆฌํ•  ๊ธฐํšŒ๋ฅผ ์‹ ์†ํ•˜๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [13, 20, 22]. + +## โš–๏ธ Trade-offs & Caveats +* **๊ณผ๋„ํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ ์‚ฌ์šฉ:** Vite๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ ๋„ˆ๋ฌด ๋งŽ์€ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋‚จ์šฉํ•˜๋ฉด ๊ฐœ๋ฐœ ์„œ๋ฒ„์˜ ์„ฑ๋Šฅ์ด ํ˜„์ €ํžˆ ๋А๋ ค์งˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ ์œ„์ฃผ๋กœ ๊ฐ€๋ณ๊ฒŒ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [20]. +* **์บ์‹ฑ ๋ฌดํšจํ™” ์ฃผ์˜:** ๋ชจ๋“ˆ ๋กœ๋”ฉ ์„ฑ๋Šฅ์„ ์œ„ํ•ด Vite๋Š” ๋ธŒ๋ผ์šฐ์ € ์บ์‹ฑ์— ํฌ๊ฒŒ ์˜์กดํ•˜๋ฏ€๋กœ, ๊ฐœ๋ฐœ ์‹œ ๋ธŒ๋ผ์šฐ์ € ๊ฐœ๋ฐœ์ž ๋„๊ตฌ์—์„œ ์บ์‹œ๋ฅผ ๋ฌดํšจํ™”(Disable cache)ํ•˜๋ฉด ์„ฑ๋Šฅ์ด ๊ธ‰๊ฒฉํ•˜๊ฒŒ ์ €ํ•˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [20]. +* **์ง€์—ฐ ๋กœ๋”ฉ์˜ ๊ณผ์šฉ ๋ฐ ์ž˜๋ชป๋œ ๋ฐฐ์น˜:** ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ์— ์ง€์—ฐ ๋กœ๋”ฉ์„ ๋‚จ๋ฐœํ•˜๊ฑฐ๋‚˜, ์Šคํฌ๋กค ์—†์ด ๋ฐ”๋กœ ๋ณด์—ฌ์•ผ ํ•˜๋Š” ํ•ต์‹ฌ(Above-the-fold) ์š”์†Œ๋‚˜ ์ฆ‰์‹œ ๋ Œ๋”๋งํ•ด์•ผ ํ•˜๋Š” UI๊นŒ์ง€ ์ง€์—ฐ ๋กœ๋”ฉ์„ ์ ์šฉํ•˜๋ฉด ์ดˆ๊ธฐ ํ™”๋ฉด ํ‘œ์‹œ๊ฐ€ ์ง€์—ฐ๋˜์–ด ์˜คํžˆ๋ ค ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๋ง์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [23, 24]. +* **๋ฉ”๋ชจ์ด์ œ์ด์…˜(`React.memo`, `useMemo` ๋“ฑ) ์˜ค๋ฒ„ํ—ค๋“œ:** ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ง‰๊ธฐ ์œ„ํ•œ ๋„๊ตฌ์ง€๋งŒ, ๋น„๊ต ์—ฐ์‚ฐ๊ณผ ์ด์ „ ์ƒํƒœ๋ฅผ ์บ์‹ฑํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋น„์šฉ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [25]. ๋ Œ๋”๋ง์ด ์•„์ฃผ ๋น ๋ฅด๊ณ  ๋‹จ์ˆœํ•œ ์ปดํฌ๋„ŒํŠธ๋‚˜, ์ „๋‹ฌ๋˜๋Š” props๊ฐ€ ๋นˆ๋ฒˆํžˆ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒฝ์šฐ(์˜ˆ: ์ธ๋ผ์ธ ๊ฐ์ฒด, ํ•จ์ˆ˜ ์ „๋‹ฌ)์— ์‚ฌ์šฉํ•˜๋ฉด ๋ Œ๋”๋ง ์ž์ฒด๋ณด๋‹ค ์ƒํƒœ ๋น„๊ต ๋น„์šฉ์ด ๋” ์ปค์ ธ ์„ฑ๋Šฅ์ด ์˜คํžˆ๋ ค ์•…ํ™”๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [25-28]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [๊ด€๊ณ„ ์œ ํ˜• A (์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ )] +- [[๋„ค์ดํ‹ฐ๋ธŒ ES ๋ชจ๋“ˆ(ESM)]] + - ์—ฐ๊ฒฐ ์ด์œ : Vite๊ฐ€ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ์ฝ”๋“œ ๋ชจ๋“ˆ์„ ์„œ๋น™ํ•˜๋Š” ๋ฐฉ์‹์˜ ํ•ต์‹ฌ ๊ธฐ๋ฐ˜ ์›๋ฆฌ์ž…๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ฒˆ๋“ค๋Ÿฌ๊ฐ€ ์ „์ฒด ์•ฑ์„ ๋งค๋ฒˆ ๋นŒ๋“œํ•˜์ง€ ์•Š๊ณ  ๋ณ€๊ฒฝ๋œ ๋ชจ๋“ˆ๋งŒ ์š”์ฒญ/๋กœ๋“œํ•จ์œผ๋กœ์จ ํ”„๋กœ์ ํŠธ ํฌ๊ธฐ์— ์ƒ๊ด€์—†์ด ๋น ๋ฅธ HMR๊ณผ ์‘๋‹ต์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1, 29, 30]. + +- [[Rollup]] + - ์—ฐ๊ฒฐ ์ด์œ : Vite ํ™˜๊ฒฝ์—์„œ ํ”„๋กœ๋•์…˜ ๋ฐฐํฌ ์‹œ ์ฝ”๋“œ๋ฅผ ํ•˜๋‚˜๋กœ ๋ชจ์œผ๊ณ  ์ตœ์ ํ™”ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋ฒˆ๋“ค๋Ÿฌ์ž…๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Vite์˜ ์„ค์ • ํŒŒ์ผ(`vite.config.js`)์—์„œ `manualChunks` ๋“ฑ Rollup ์ „์šฉ ๋นŒ๋“œ ์˜ต์…˜์„ ํ†ตํ•ด ์–ด๋–ป๊ฒŒ ํšจ์œจ์ ์ธ ์ •์  ์• ์…‹(Asset)์„ ์ƒ์„ฑํ•˜๊ณ , ์ฝ”๋“œ ๋ถ„ํ• ๊ณผ ํŠธ๋ฆฌ ์‰์ดํ‚น์„ ์ˆ˜ํ–‰ํ•˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [14, 18, 31, 32]. + +#### [๊ด€๊ณ„ ์œ ํ˜• B (๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ)] +- [[SWC ์ปดํŒŒ์ผ๋Ÿฌ]] + - ์—ฐ๊ฒฐ ์ด์œ : Vite์˜ ๊ธฐ๋ณธ ๊ตฌ์„ฑ์„ ํ™•์žฅํ•ด ์†๋„๋ฅผ ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•œ ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ณผ๊ฑฐ Babel์ด ์ฒ˜๋ฆฌํ•˜๋˜ JSX/TypeScript ๋ณ€ํ™˜ ์ž‘์—…์„ Rust ๊ธฐ๋ฐ˜์˜ ๋น ๋ฅธ ๋„๊ตฌ(`@vitejs/plugin-react-swc`)๋กœ ๊ต์ฒดํ•˜์—ฌ ๋Œ€ํ˜• React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์žฌ๋นŒ๋“œ ์‹œ๊ฐ„์„ ์ฆ‰๊ฐ์ ์œผ๋กœ ๋‹จ์ถ•์‹œํ‚ค๋Š” ๋ฐฉ์‹์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1, 3, 5]. + +- [[React.lazy & Suspense]] + - ์—ฐ๊ฒฐ ์ด์œ : React ๋‚ด๋ถ€์—์„œ ๋™์  ์ž„ํฌํŠธ๋ฅผ ํ†ตํ•œ ์ปดํฌ๋„ŒํŠธ ๋ ˆ๋ฒจ ์ง€์—ฐ ๋กœ๋”ฉ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ API์ž…๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ผ์šฐํŠธ๋‚˜ ๋ฌด๊ฑฐ์šด ๋ชจ๋“ˆ์„ ๋ถ„๋ฆฌํ•˜๊ณ , ๋ฒˆ๋“ค์ด ๋กœ๋“œ๋˜๋Š” ๋™์•ˆ ``๋ฅผ ํ†ตํ•ด ํด๋ฐฑ(Fallback) UI๋ฅผ ์ฒ˜๋ฆฌํ•จ์œผ๋กœ์จ ์ดˆ๊ธฐ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŽ˜์ด๋กœ๋“œ ์šฉ๋Ÿ‰์„ ๋Œ€ํญ ์ค„์ด๋Š” ์‹ค๋ฌด ๊ธฐ๋ฒ•์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [6, 9, 11, 12, 33]. + +- [[rollup-plugin-visualizer]] + - ์—ฐ๊ฒฐ ์ด์œ : ์ตœ์ ํ™” ์ž‘์—… ์ „ํ›„๋กœ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์‹œ๊ฐํ™”ํ•˜๊ณ  ๋ฌธ์ œ๋ฅผ ์ง„๋‹จํ•˜๋Š” ํ•„์ˆ˜ ๋ถ„์„ ํ”Œ๋Ÿฌ๊ทธ์ธ์ž…๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํฐ ์ฒญํฌ๊ฐ€ ์™œ ๋ฐœ์ƒํ•˜๋Š”์ง€, ์–ด๋–ค ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(๋ฒค๋”)๊ฐ€ ์˜๋„์น˜ ์•Š๊ฒŒ ์šฉ๋Ÿ‰์„ ๊ณผ๋„ํ•˜๊ฒŒ ์ ์œ ํ•˜๋Š”์ง€ ๋ถ„์„ํ•˜์—ฌ `manualChunks`๋‚˜ ์ฝ”๋“œ ๊ต์ฒด๋ฅผ ๊ฒฐ๋‹จํ•˜๋Š” ์ธก์ •/๋””๋ฒ„๊น… ๊ธฐ๋ฐ˜์„ ํ™•๋ฆฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [6, 13, 21]. + +### Deeper Research Questions + +- ๋Œ€๊ทœ๋ชจ ์™ธ๋ถ€ ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ Vite์˜ `optimizeDeps`๋ฅผ ์„ธ๋ฐ€ํ•˜๊ฒŒ ํŠœ๋‹ํ•˜๋ ค๋ฉด ์–ด๋– ํ•œ ๊ธฐ์ค€๊ณผ ์„ค์ • ๋ฐฉ์‹์„ ์ ์šฉํ•ด์•ผ ํ•˜๋Š”๊ฐ€? +- SWC ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋„์ž…ํ•  ๋•Œ ๊ธฐ์กด์— ์‚ฌ์šฉ ์ค‘์ธ ํŠน์ • ์ปค์Šคํ…€ Babel ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์˜จ์ „ํžˆ ๋Œ€์ฒดํ•˜๊ฑฐ๋‚˜ ๋ณ‘ํ–‰ํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์˜ ํ•œ๊ณ„ ๋ฐ ํ•ด๊ฒฐ์ฑ…์€ ๋ฌด์—‡์ธ๊ฐ€? +- Rollup์˜ `manualChunks`๋กœ ๋ฌด๊ฑฐ์šด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ถ„๋ฆฌํ•  ๋•Œ, ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ณ‘๋ ฌ๋กœ ๋‹ค์šด๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋Š” ํ•œ๊ณ„์ ๊ณผ ์žฅ๊ธฐ ์บ์‹ฑ(Long-term caching)์˜ ์ด์ ์„ ๊ณ ๋ คํ•œ ์ตœ์ ์˜ ๋ถ„ํ•  ๋‹จ์œ„(Chunk size)๋Š” ์–ด๋А ์ •๋„์ธ๊ฐ€? +- `React.lazy`์™€ ``๋ฅผ ๋ผ์šฐํŠธ ๋ ˆ๋ฒจ์ด ์•„๋‹Œ ์„ธ๋ถ€ ์ปดํฌ๋„ŒํŠธ ๋ ˆ๋ฒจ(์˜ˆ: ๋ฌด๊ฑฐ์šด ๋ชจ๋‹ฌ ์ฐฝ์ด๋‚˜ ์ฐจํŠธ)์— ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์ ์šฉํ•  ๋•Œ, ๋ถˆํ•„์š”ํ•œ ๋กœ๋”ฉ ์ƒํƒœ ๋‚จ๋ฐœ์„ ๋ง‰๊ณ  ์ž์—ฐ์Šค๋Ÿฌ์šด ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์œ ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? +- ๋ฒˆ๋“ค ์‹œ๊ฐํ™”๋ฅผ ํ†ตํ•ด ๋ฐœ๊ฒฌ๋œ, ํŠธ๋ฆฌ ์‰์ดํ‚น์ด ์ „ํ˜€ ์ ์šฉ๋˜์ง€ ์•Š๋Š” ๋ ˆ๊ฑฐ์‹œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์˜์กด์„ฑ์„ ์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜ ๋ชจ๋˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ๋•Œ ๋”ฐ๋ผ์•ผ ํ•  ๋ฆฌํŒฉํ† ๋ง ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? + +### Practical Application Contexts + +- **Implementation:** `vite.config.ts` ํŒŒ์ผ์—์„œ SWC ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์ • ๋ฐ `rollupOptions` ๋‚ด `manualChunks`๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•˜์—ฌ React ๋Ÿฐํƒ€์ž„, ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ, ์ฐจํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋“ฑ์„ ๊ฐ๊ฐ์˜ ์ฒญํฌ๋กœ ์ถ”์ถœํ•˜๋„๋ก ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. +- **System Design:** ์ดˆ๊ธฐ ์•„ํ‚คํ…์ฒ˜ ์ˆ˜๋ฆฝ ์‹œ, ๋ผ์šฐํŠธ ๋ณ„๋กœ ์ง€์—ฐ ๋กœ๋”ฉ๋  ๊ธฐ๋Šฅ๊ณผ ์•ฑ ๊ตฌ๋™ ์‹œ ์ฆ‰์‹œ ํ•„์š”ํ•œ ์ฝ”์–ด ๋ ˆ์ด์–ด๋ฅผ ์—„๊ฒฉํ•˜๊ฒŒ ๋ถ„๋ฆฌํ•˜์—ฌ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…์„ ์ „์ œ๋กœ ํ•œ ์ปดํฌ๋„ŒํŠธ ๊ณ„์ธต ํŠธ๋ฆฌ๋ฅผ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค. +- **Operation / Maintenance:** CI/CD ํŒŒ์ดํ”„๋ผ์ธ์— `rollup-plugin-visualizer`์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํฌํŠธ๋กœ ๋‚จ๊ธฐ๋„๋ก ๊ตฌ์„ฑํ•˜์—ฌ, ํŒ€์›์ด ์ƒˆ๋กœ์šด ํŒจํ‚ค์ง€๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ ๋ฉ”์ธ ๋ฒˆ๋“ค ํฌ๊ธฐ๊ฐ€ ๋น„์ •์ƒ์ ์œผ๋กœ ์ปค์ง€์ง€ ์•Š๋Š”์ง€ ์ง€์†์ ์œผ๋กœ ๊ฐ์‹œํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜ํ•ฉ๋‹ˆ๋‹ค. +- **Learning Path:** ์šฐ์„  React์˜ ๋ Œ๋”๋ง ์›๋ฆฌ ๋ฐ ํ”„๋กœํŒŒ์ผ๋Ÿฌ ์‚ฌ์šฉ๋ฒ•์„ ํ•™์Šตํ•œ ํ›„, ๋นŒ๋“œ ํˆด(Vite/Rollup)์˜ ๋ฒˆ๋“ค๋ง ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ดํ•ดํ•˜๊ณ , ์ดํ›„ ์ง€์—ฐ ๋กœ๋”ฉ ๊ธฐ๋ฒ• ๋ฐ ๋ฒˆ๋“ค ์ตœ์ ํ™” ํ”Œ๋Ÿฌ๊ทธ์ธ ์‹ค์Šต์œผ๋กœ ์ด์–ด์ง€๋Š” ๋กœ๋“œ๋งต์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. +- **My Project Relevance:** ๊ฑฐ๋Œ€ํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ ์ „์†ก์œผ๋กœ ์ธํ•ด ๋ Œ๋”๋ง์ด ์ง€์—ฐ๋˜๋Š” ํ”„๋กœ์ ํŠธ๋‚˜, ๋นŒ๋“œ ํ›„ "500kB ์ดˆ๊ณผ" ๊ฒฝ๊ณ ๊ฐ€ ๋œจ๋Š” ํ”„๋ก ํŠธ์—”๋“œ ํ™˜๊ฒฝ์—์„œ ์ฆ‰๊ฐ์ ์ธ ํŒŒ์ผ ๋ถ„ํ• ๊ณผ ์บ์‹ฑ ์ „๋žต์„ ์ ์šฉํ•˜์—ฌ ํŽ˜์ด์ง€ ๋กœ๋“œ ์„ฑ๋Šฅ(FCP, LCP)์„ ๊ฐ€์‹œ์ ์œผ๋กœ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### Adjacent Topics + +- [[Core Web Vitals]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: Vite์™€ React ์ตœ์ ํ™”๋ฅผ ํ†ตํ•ด ์–ป์–ด๋‚ธ ๋ฉ”์ธ ๋ฒˆ๋“ค ํฌ๊ธฐ ๊ฐ์†Œ ๋ฐ ๋ Œ๋”๋ง ์†๋„ ํ–ฅ์ƒ์ด ์‹ค์ œ ์‚ฌ์šฉ์ž ์ฒด๊ฐ ์„ฑ๋Šฅ ์ง€ํ‘œ(LCP, FID/INP ๋“ฑ)์— ์–ด๋–ค ์ˆ˜์น˜์  ๊ฐœ์„ ์œผ๋กœ ๋‚˜ํƒ€๋‚˜๋Š”์ง€๋ฅผ ๊ตฌ์ฒด์ ์œผ๋กœ ์—ฐ๊ตฌํ•ฉ๋‹ˆ๋‹ค [11, 34, 35]. + +- [[Concurrent Rendering (๋™์‹œ์„ฑ ๋ Œ๋”๋ง)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋กœ๋”ฉ๊ณผ ๋ฒˆ๋“ค๋ง ์ตœ์ ํ™”๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, `useTransition` ๋ฐ `useDeferredValue` ํ›…์„ ์ด์šฉํ•˜์—ฌ ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ๋ณ€ํ™” ์‹œ์—๋„ ์‚ฌ์šฉ์ž ์ž…๋ ฅ ๋“ฑ์˜ UI ๋ฐ˜์‘์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๋Ÿฐํƒ€์ž„ ์ฐจ์›์˜ ์„ฑ๋Šฅ ํ–ฅ์ƒ ์ „๋žต์œผ๋กœ ์ง€์‹์„ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค [36-38]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Vite Build System.md b/00_Raw/Vite Build System.md new file mode 100644 index 00000000..9ee03e7c --- /dev/null +++ b/00_Raw/Vite Build System.md @@ -0,0 +1,52 @@ +# [[Vite Build System]] + +## ๐Ÿ“Œ Brief Summary +Vite๋Š” ํ˜„๋Œ€ ํ”„๋ก ํŠธ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(ํŠนํžˆ React) ๊ฐœ๋ฐœ์„ ์œ„ํ•œ ์ƒˆ๋กœ์šด ์‚ฐ์—… ํ‘œ์ค€ ๋นŒ๋“œ ๋„๊ตฌ๋กœ, ๊ฑฐ์˜ ์ฆ‰๊ฐ์ ์ธ ์„œ๋ฒ„ ์‹œ์ž‘๊ณผ ์ดˆ๊ณ ์† HMR(Hot Module Replacement)์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [1, 2]. ๊ธฐ์กด ๋ฒˆ๋“ค๋Ÿฌ์™€ ๋‹ฌ๋ฆฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋Š” ๋ธŒ๋ผ์šฐ์ €์— ๋„ค์ดํ‹ฐ๋ธŒ ES ๋ชจ๋“ˆ ํ˜•ํƒœ๋กœ ์ฝ”๋“œ๋ฅผ ์ œ๊ณตํ•˜๊ณ , ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋Š” Rollup์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ณ ๋„๋กœ ์ตœ์ ํ™”๋œ ๋ฒˆ๋“ค์„ ์ƒ์„ฑํ•˜๋Š” ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค [3, 4]. ๋˜ํ•œ SWC๋‚˜ esbuild์™€ ๊ฐ™์€ Rust ๊ธฐ๋ฐ˜ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ๋„ ๋น ๋ฅด๊ณ  ์›ํ™œํ•œ ๊ฐœ๋ฐœ์ž ๊ฒฝํ—˜์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค [3, 5, 6]. + +## ๐Ÿ“– Core Content +* **ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์•„ํ‚คํ…์ฒ˜ (๊ฐœ๋ฐœ ๋ฐ ํ”„๋กœ๋•์…˜)**: Vite๋Š” ๊ฐœ๋ฐœ ์‹œ ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ์‚ฌ์ „์— ๋ฒˆ๋“ค๋งํ•˜๋Š” ๋Œ€์‹ , ์ฝ”๋“œ๋ฅผ ๋„ค์ดํ‹ฐ๋ธŒ ES ๋ชจ๋“ˆ(ESM) ํ˜•ํƒœ๋กœ ๋ธŒ๋ผ์šฐ์ €์— ์ง์ ‘ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [2, 3]. ์ด ๋ฐฉ์‹์€ ํ•„์š”ํ•  ๋•Œ ํ•„์š”ํ•œ ํŒŒ์ผ๋งŒ ๋กœ๋“œํ•˜๋ฏ€๋กœ ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๊ฐ€ ์ปค์ ธ๋„ ์„œ๋ฒ„ ์‹œ์ž‘ ๋ฐ ๊ฐฑ์‹  ์†๋„๊ฐ€ ๋งค์šฐ ๋น ๋ฆ…๋‹ˆ๋‹ค [3, 7]. ๋ฐ˜๋ฉด, ํ”„๋กœ๋•์…˜ ๋ฐฐํฌ ์‹œ์—๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ Rollup์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž๋™ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…, ๋ฏธ์‚ฌ์šฉ ์ฝ”๋“œ ์ œ๊ฑฐ(Tree-shaking), ์ž์‚ฐ ์ตœ์ ํ™” ๋“ฑ์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ์„ฑ๋Šฅ์ด ๋›ฐ์–ด๋‚œ ๋ฒˆ๋“ค์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค [4, 8]. +* **์ดˆ๊ณ ์† ์ปดํŒŒ์ผ๋Ÿฌ ๋ฐ ํ”Œ๋Ÿฌ๊ทธ์ธ ํ™œ์šฉ**: Vite๋Š” ์ปดํŒŒ์ผ ์†๋„๋ฅผ ๋†’์ด๊ธฐ ์œ„ํ•ด Rust ๊ธฐ๋ฐ˜์˜ ์ปดํŒŒ์ผ๋Ÿฌ์ธ SWC ๋˜๋Š” esbuild๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค [3]. ๊ธฐ์กด Babel ๋Œ€์‹  `@vitejs/plugin-react-swc`๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด JSX ๋ฐ TypeScript ์ปดํŒŒ์ผ ์†๋„๊ฐ€ ๋น„์•ฝ์ ์œผ๋กœ ํ–ฅ์ƒ๋˜์–ด ์žฌ๋นŒ๋“œ ์‹œ๊ฐ„์ด ๋‹จ์ถ•๋ฉ๋‹ˆ๋‹ค [5, 6, 9]. ์ด์™ธ์—๋„ `vite-plugin-svgr`(SVG ์ปดํฌ๋„ŒํŠธํ™”), `vite-plugin-pwa`์™€ ๊ฐ™์€ ์œ ์—ฐํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ƒํƒœ๊ณ„๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค [10]. +* **๊ณ ๊ธ‰ ๊ตฌ์„ฑ (vite.config.js)**: Vite๋Š” `vite.config.js`๋ฅผ ํ†ตํ•ด ๋ณต์žกํ•œ ํ”„๋กœ์ ํŠธ ์„ค์ •์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๊ฒฝ๋กœ ๋ณ„์นญ(Path Aliases)์„ ์„ค์ •ํ•˜์—ฌ ์ž„ํฌํŠธ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•˜๊ฑฐ๋‚˜, `VITE_` ์ ‘๋‘์‚ฌ๊ฐ€ ๋ถ™์€ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋งŒ์„ ์•ˆ์ „ํ•˜๊ฒŒ ๋…ธ์ถœํ•˜๋ฉฐ, ๊ฐœ๋ฐœ ์ค‘ CORS ๋ฌธ์ œ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•œ ๋‚ด์žฅ ํ”„๋ก์‹œ ์„œ๋ฒ„ ์„ค์ •์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค [5, 9, 11]. +* **์„ฑ๋Šฅ ํŠœ๋‹ ๋ฐ ๋Œ€์šฉ๋Ÿ‰ ์ฒญํฌ(Chunk) ๊ด€๋ฆฌ**: ๋Œ€๊ทœ๋ชจ ์•ฑ์—์„œ๋Š” ๋ฌด๊ฑฐ์šด ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์ธํ•ด ๋ฉ”์ธ ๋ฒˆ๋“ค์ด ๊ณผ๋„ํ•˜๊ฒŒ ์ปค์ง€๋Š” ๋ฌธ์ œ("chunks are larger than 500 kB")๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [12-14]. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด `manualChunks`๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ React, ์ฐจํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋“ฑ ์ž์ฃผ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ๋ฒค๋” ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌํ•ด ๋ธŒ๋ผ์šฐ์ € ์บ์‹ฑ์„ ๊ทน๋Œ€ํ™”ํ•ฉ๋‹ˆ๋‹ค [8, 11, 14-16]. ์ด์™€ ํ•จ๊ป˜ `React.lazy`์™€ ``๋ฅผ ์ด์šฉํ•œ ๋ผ์šฐํŠธ ๋ ˆ๋ฒจ์˜ ๋™์  ์ž„ํฌํŠธ(์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…)๋ฅผ ์ ์šฉํ•˜๊ณ , `rollup-plugin-visualizer`๋กœ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ๋ถ„์„ํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ด ๋ชจ๋ฒ” ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค [16-19]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts +- [[Native ES Modules (ESM)]] + - ์—ฐ๊ฒฐ ์ด์œ : Vite๊ฐ€ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ํŒŒ์ผ ์ „์ฒด๋ฅผ ์‚ฌ์ „ ๋ฒˆ๋“ค๋งํ•˜์ง€ ์•Š๊ณ , ํ•„์š”ํ•  ๋•Œ ๋ธŒ๋ผ์šฐ์ €์— ์ฝ”๋“œ๋ฅผ ์ œ๊ณตํ•˜๋Š” ํ•ต์‹ฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [3, 7]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Vite๊ฐ€ ๊ธฐ์กด ๋„๊ตฌ(Webpack ๋“ฑ)์— ๋น„ํ•ด ์–ด๋–ป๊ฒŒ ์ดˆ๊ธฐ ๊ตฌ๋™ ์†๋„์™€ HMR ์‘๋‹ต์„ฑ์„ ๊ทน์ ์œผ๋กœ ๋‹จ์ถ•ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ทธ ์›๋ฆฌ๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2, 3]. + +- [[Rollup]] + - ์—ฐ๊ฒฐ ์ด์œ : Vite๊ฐ€ ํ”„๋กœ๋•์…˜์šฉ ๋นŒ๋“œ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๋‚ด๋ถ€์ ์œผ๋กœ ์ฑ„ํƒํ•˜๊ณ  ์žˆ๋Š” ๋ฒˆ๋“ค๋Ÿฌ ๋„๊ตฌ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [4]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ์ฒญํฌ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋‚˜๋‰˜๋ฉฐ(`manualChunks`), ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…๊ณผ ํŠธ๋ฆฌ ์‰์ดํ‚น์„ ํ†ตํ•ด ์ตœ์ ํ™”๋œ ์ •์  ์ž์‚ฐ์ด ๋งŒ๋“ค์–ด์ง€๋Š” ๊ณผ์ •์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [4, 8, 11]. + +- [[SWC (Speedy Web Compiler)]] + - ์—ฐ๊ฒฐ ์ด์œ : Vite ํ™˜๊ฒฝ์—์„œ ๊ธฐ์กด์˜ Babel์„ ๋Œ€์ฒดํ•˜์—ฌ JSX์™€ TypeScript๋ฅผ ์‹ค์‹œ๊ฐ„์— ๊ฐ€๊น๊ฒŒ ๋ณ€ํ™˜ํ•˜๋Š” Rust ๊ธฐ๋ฐ˜ ์ปดํŒŒ์ผ๋Ÿฌ ๊ธฐ์ˆ ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [3, 5, 6]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋Œ€๊ทœ๋ชจ React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ ์‹œ ์ปดํŒŒ์ผ ์†๋„์™€ ํ•ซ ๋ฆฌ๋กœ๋“œ ์†๋„๋ฅผ ํ–ฅ์ƒํ•˜๋Š” ๊ธฐ์ˆ ์  ๋ฐฐ๊ฒฝ์„ ๊นŠ์ด ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3, 6]. + +- [[Code Splitting & manualChunks]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋Œ€์šฉ๋Ÿ‰ ๋ฉ”์ธ ๋ฒˆ๋“ค ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ , ์ดˆ๊ธฐ ํŽ˜์ด์ง€ ๋กœ๋“œ ์†๋„๋ฅผ ๋†’์ด๊ธฐ ์œ„ํ•œ Vite ์„ฑ๋Šฅ ์ตœ์ ํ™”์˜ ํ•ต์‹ฌ ๊ธฐ๋ฒ•์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [12, 14]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋™์  ์ž„ํฌํŠธ์™€ ๊ฒฐํ•ฉํ•˜์—ฌ ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(์•ˆ์ •์ ์ธ ์ฝ”๋“œ)๋ฅผ ๋ณ„๋„ ํŒŒ์ผ๋กœ ์บ์‹ฑํ•˜๊ณ  ๊ธฐ๋Šฅ ๋‹จ์œ„๋กœ ์ฒญํฌ๋ฅผ ๋‚˜๋ˆ„๋Š” ์ „๋žต์„ ํ•™์Šตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [8, 16]. + +### Deeper Research Questions +- ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์˜ ๋„ค์ดํ‹ฐ๋ธŒ ESM ์ฒ˜๋ฆฌ ๋ฐฉ์‹๊ณผ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์˜ Rollup ๋ฒˆ๋“ค๋ง ๊ฐ„์˜ ์•„ํ‚คํ…์ฒ˜ ์ฐจ์ด๊ฐ€ ๋Ÿฐํƒ€์ž„ ๋™์ž‘์ด๋‚˜ ๋ชจ๋“ˆ ํ•ด์„(Module Resolution)์— ์–ด๋–ค ์ฐจ์ด์™€ ์ž ์žฌ์  ๋ฒ„๊ทธ๋ฅผ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- Vite์˜ `optimizeDeps`๋ฅผ ํ†ตํ•œ ์‚ฌ์ „ ๋ฒˆ๋“ค๋ง(Pre-bundling) ํ”„๋กœ์„ธ์Šค๋Š” ๊ฑฐ๋Œ€ํ•œ ์™ธ๋ถ€ ์˜์กด์„ฑ ํŒจํ‚ค์ง€๋ฅผ ๋กœ๋“œํ•  ๋•Œ ๋ธŒ๋ผ์šฐ์ €์˜ ๋„คํŠธ์›Œํฌ ๋ณ‘๋ชฉ์„ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•˜๋Š”๊ฐ€? +- ๋Œ€๊ทœ๋ชจ React ์•ฑ์„ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•  ๋•Œ ์ปค์Šคํ…€ Babel ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉ ์ค‘์ธ ํ™˜๊ฒฝ์—์„œ SWC ์ปดํŒŒ์ผ๋Ÿฌ(`@vitejs/plugin-react-swc`)๋กœ ์ „ํ™˜ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ํ˜ธํ™˜์„ฑ ํ•œ๊ณ„์™€ ๋Œ€์•ˆ์€ ๋ฌด์—‡์ธ๊ฐ€? +- `manualChunks`๋ฅผ ํ™œ์šฉํ•ด ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ธ๋ฐ€ํ•˜๊ฒŒ ๋ถ„ํ• ํ•  ๋•Œ, ์ƒ์„ฑ๋œ ํ•ด์‹œ(hash) ํŒŒ์ผ๋ช… ๊ธฐ๋ฐ˜์˜ ์žฅ๊ธฐ ์บ์‹ฑ(Long-term Caching) ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ์ตœ์ ํ™”๋˜๋Š”๊ฐ€? +- `rollup-plugin-visualizer`๋ฅผ ํ†ตํ•œ ๋ฒˆ๋“ค ์‹œ๊ฐํ™” ์ดํ›„, ์˜๋„์น˜ ์•Š๊ฒŒ ๋ฉ”์ธ ์ฒญํฌ์— ํฌํ•จ๋œ ๊ณผ๋„ํ•œ ํŠธ๋žœ์ง€ํ‹ฐ๋ธŒ ์˜์กด์„ฑ(Transitive Dependencies)์„ ํšจ๊ณผ์ ์œผ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ์ฝ”๋“œ ๋ ˆ๋ฒจ ํŒจํ„ด์€ ๋ฌด์—‡์ธ๊ฐ€? + +### Practical Application Contexts +- **Implementation:** `vite.config.js`๋ฅผ ๊ตฌ์„ฑํ•˜์—ฌ `@vitejs/plugin-react-swc`๋ฅผ ๋„์ž…ํ•˜๊ณ , ์ƒ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•œ ๊ฒฝ๋กœ ๋ณ„์นญ(Path Aliases) ์„ค์ •, `VITE_` ์ ‘๋‘์‚ฌ๋ฅผ ์ด์šฉํ•œ ์•ˆ์ „ํ•œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋ฐ”์ธ๋”ฉ, CORS๋ฅผ ์šฐํšŒํ•˜๊ธฐ ์œ„ํ•œ ํ”„๋ก์‹œ(Proxy) ์„ค์ •์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค [5, 9, 11]. +- **System Design:** ๋Œ€๊ทœ๋ชจ ํ”„๋ก ํŠธ์—”๋“œ ์‹œ์Šคํ…œ ์„ค๊ณ„ ์‹œ, ๋ฌด๊ฑฐ์šด ์ดˆ๊ธฐ ๋ฒˆ๋“ค ํฌ๊ธฐ ์ด์Šˆ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด Webpack ๋Œ€์‹  Vite๋ฅผ ๋„์ž…ํ•˜๊ณ  ๊ฐœ๋ฐœ(๋„ค์ดํ‹ฐ๋ธŒ ESM)๊ณผ ํ”„๋กœ๋•์…˜(Rollup ์ตœ์ ํ™”)์˜ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๋นŒ๋“œ ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌ์ถ•ํ•ฉ๋‹ˆ๋‹ค [2-4, 8]. +- **Operation / Maintenance:** `rollup-plugin-visualizer`๋ฅผ ๋นŒ๋“œ ํ”„๋กœ์„ธ์Šค์— ์—ฐ๋™ํ•ด ์ •๊ธฐ์ ์œผ๋กœ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ , `manualChunks`๋ฅผ ์œ ์ง€๋ณด์ˆ˜ํ•˜์—ฌ React ์ฝ”์–ด ๊ฐ™์€ ๋ฒค๋” ํŒจํ‚ค์ง€์˜ ๋ธŒ๋ผ์šฐ์ € ์บ์‹ฑ ์ด์ ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค [16-19]. +- **Learning Path:** ์šฐ์„  Vite์˜ ๊ณต์‹ ์Šค์บํด๋“œ ํˆด๋กœ React ์•ฑ์„ ์ƒ์„ฑํ•˜์—ฌ ๊ธฐ์กด CRA(Create React App) ๊ตฌ์กฐ์™€์˜ ์ฐจ์ด๋ฅผ ์ฒดํ—˜ํ•œ ํ›„, ๋™์  ์ž„ํฌํŠธ(`React.lazy`)์™€ `optimizeDeps` ๋“ฑ์˜ ๊ณ ๊ธ‰ ์„ค์ • ๋ฐ ํ”Œ๋Ÿฌ๊ทธ์ธ ํ™•์žฅ์„ ์ ์ง„์ ์œผ๋กœ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค [6, 7, 10, 16, 20]. +- **My Project Relevance:** ์†Œ์Šค์— ๊ด€๋ จ ์ •๋ณด๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. (๊ฐœ์ธ์˜ ํ˜„์žฌ ์ง„ํ–‰ ์ค‘์ธ ํŠน์ • ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ์†Œ์Šค ํ…์ŠคํŠธ์— ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.) + +### Adjacent Topics +- [[React Server Components (RSC) & Next.js App Router]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: Vite๋ฅผ ์ด์šฉํ•œ ๋นŒ๋“œ ํˆด ์ฒด์ธ ์ตœ์ ํ™”(CSR/SPA ์„ฑ๋Šฅ ์ตœ์ ํ™”)๋ฅผ ๋„˜์–ด, ํด๋ผ์ด์–ธํŠธ ์ธก ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค ์ž์ฒด๋ฅผ ์ „์†กํ•˜์ง€ ์•Š๊ณ  ์„œ๋ฒ„์—์„œ ๋ฏธ๋ฆฌ ๋ Œ๋”๋งํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜ ์ˆ˜์ค€์˜ ์„ฑ๋Šฅ ์ตœ์ ํ™” ํŒจ๋Ÿฌ๋‹ค์ž„์œผ๋กœ ์ดํ•ด๋ฅผ ๋„“ํž™๋‹ˆ๋‹ค [21-23]. +- [[Performance Metrics (Core Web Vitals)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: Vite์˜ ์ฒญํฌ ์ตœ์ ํ™”์™€ ๋ ˆ์ด์ง€ ๋กœ๋”ฉ ๊ธฐ๋ฒ•์ด ์‹ค์ œ ์‚ฌ์šฉ์ž ์ฒด๊ฐ ์„ฑ๋Šฅ ์ง€ํ‘œ์ธ FCP(First Contentful Paint), LCP(Largest Contentful Paint), INP(Interaction to Next Paint)์— ์–ด๋–ค ์ง์ ‘์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”์ง€ ์—ฐ๊ฒฐํ•˜์—ฌ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค [13, 24, 25]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/Vite Build Tool.md b/00_Raw/Vite Build Tool.md new file mode 100644 index 00000000..de593fe3 --- /dev/null +++ b/00_Raw/Vite Build Tool.md @@ -0,0 +1,72 @@ +# [[Vite Build Tool]] + +## ๐Ÿ“Œ Brief ์ž„๋ฌด +Vite๋Š” ํ˜„๋Œ€ ํ”„๋ก ํŠธ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(์ฃผ๋กœ React)์„ ์œ„ํ•œ ํ‘œ์ค€ ๋นŒ๋“œ ๋„๊ตฌ๋กœ, ๊ธฐ์กด Webpack ๋ฐ Create React App(CRA)์„ ๋Œ€์ฒดํ•˜๋ฉฐ ๋น ๋ฅด๊ฒŒ ์ž๋ฆฌ ์žก์•˜์Šต๋‹ˆ๋‹ค [1, 2]. ์ด ๋„๊ตฌ๋Š” ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋Š” ๋ธŒ๋ผ์šฐ์ €์˜ ๋„ค์ดํ‹ฐ๋ธŒ ES ๋ชจ๋“ˆ(ESM)์„ ํ™œ์šฉํ•ด ์ฆ‰๊ฐ์ ์ธ ์„œ๋ฒ„ ์‹œ์ž‘๊ณผ ์ดˆ๊ณ ์† HMR(Hot Module Replacement)์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [2-4]. ํ”„๋กœ๋•์…˜ ๋ฐฐํฌ ์‹œ์—๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ Rollup์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…๊ณผ ํŠธ๋ฆฌ ์‰์ดํ‚น์ด ์ ์šฉ๋œ ๊ณ ๋„๋กœ ์ตœ์ ํ™”๋œ ๋ฒˆ๋“ค์„ ์ƒ์„ฑํ•˜๋Š” ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ํŠน์ง•์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค [5, 6]. + +## ๐Ÿ“– Core Content +* **ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์•„ํ‚คํ…์ฒ˜ (Hybrid Architecture)** + * **๊ฐœ๋ฐœ ํ™˜๊ฒฝ:** ์ฝ”๋“œ๋ฅผ ์‚ฌ์ „์— ์ „์ฒด ๋ฒˆ๋“ค๋งํ•˜์ง€ ์•Š๊ณ  ๋ธŒ๋ผ์šฐ์ €์— ๋„ค์ดํ‹ฐ๋ธŒ ES ๋ชจ๋“ˆ(ESM)๋กœ ์ง์ ‘ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ํŒŒ์ผ๋งŒ ๋กœ๋“œ๋˜๋ฏ€๋กœ ํ”„๋กœ์ ํŠธ ํฌ๊ธฐ๊ฐ€ ์ปค์ ธ๋„ ๊ฐœ๋ฐœ ์„œ๋ฒ„๊ฐ€ ์ฆ‰๊ฐ์ ์œผ๋กœ ๋ฐ˜์‘ํ•ฉ๋‹ˆ๋‹ค [2-4]. + * **ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ:** ๋ฐฐํฌ ์‹œ์—๋Š” Rollup์„ ์‚ฌ์šฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฒˆ๋“ค๋งํ•˜๋ฉฐ, ์ž๋™ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ… ๋ฐ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ํŠธ๋ฆฌ ์‰์ดํ‚น(Tree-shaking)์„ ํ†ตํ•ด ์ตœ์ ํ™”๋œ ์ •์  ์—์…‹์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [5, 6]. +* **์ดˆ๊ณ ์† ์ปดํŒŒ์ผ ๋ฐ ์‚ฌ์ „ ๋ฒˆ๋“ค๋ง (Fast Compilation & Pre-bundling)** + * Vite๋Š” esbuild๋‚˜ ์ตœ์‹  Rust ๊ธฐ๋ฐ˜ ํŠธ๋žœ์Šคํฌ๋จธ์ธ SWC(Speedy Web Compiler)๋ฅผ ํ™œ์šฉํ•˜์—ฌ JSX ๋ฐ TypeScript ํŒŒ์ผ์„ ์‚ฌ์‹ค์ƒ ์ฆ‰์‹œ ์ปดํŒŒ์ผํ•ฉ๋‹ˆ๋‹ค [4, 7]. ๊ธฐ์กด Babel์„ SWC๋กœ ๋Œ€์ฒดํ•˜๋ฉด ํ•ซ ๋ชจ๋“ˆ ๋ฆฌ๋กœ๋“œ ์‹œ๊ฐ„์ด ํฌ๊ฒŒ ๋‹จ์ถ•๋ฉ๋‹ˆ๋‹ค [8]. + * ๊ฐœ๋ฐœ ์ค‘ ์ƒˆ๋กœ๊ณ ์นจ ์†๋„๋ฅผ ์ตœ์ ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์ข…์†์„ฑ์„ ์‚ฌ์ „ ๋ฒˆ๋“ค๋ง(Pre-bundling, `optimizeDeps`)ํ•ฉ๋‹ˆ๋‹ค [8]. +* **์„ค์ • ๋ฐ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ƒํƒœ๊ณ„ (Configuration & Plugins)** + * `vite.config.js`๋ฅผ ํ†ตํ•ด ๊ฒฝ๋กœ ๋ณ„์นญ(Path Aliases), CORS ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ๊ฐœ๋ฐœ ์„œ๋ฒ„ ํ”„๋ก์‹œ, `VITE_` ์ ‘๋‘์‚ฌ๊ฐ€ ๋ถ™์€ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋“ฑ์„ ์œ ์—ฐํ•˜๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [7, 9, 10]. + * SVG๋ฅผ React ์ปดํฌ๋„ŒํŠธ๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•œ `vite-plugin-svgr`, ์˜คํ”„๋ผ์ธ PWA ์ง€์›์„ ์œ„ํ•œ `vite-plugin-pwa`, ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ๋ถ„์„ํ•˜๋Š” `rollup-plugin-visualizer` ๋“ฑ ๊ฐ•๋ ฅํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ƒํƒœ๊ณ„๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค [11-13]. +* **๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ ์ตœ์ ํ™” (Bundle Optimization)** + * ๊ธฐ๋ณธ์ ์œผ๋กœ Vite๋Š” ์•ฑ ์ฝ”๋“œ์™€ ๋ชจ๋“  ์ข…์†์„ฑ(node_modules)์„ ํ•˜๋‚˜์˜ `index.js`์— ๋‹ด์•„ ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด `vite.config.ts`์˜ Rollup ์˜ต์…˜์—์„œ `manualChunks`๋ฅผ ์„ค์ •ํ•˜์—ฌ React ์ฝ”์–ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋“ฑ ๋ฌด๊ฑฐ์šด ๋ฒค๋”๋ฅผ ๋ถ„๋ฆฌํ•˜๊ณ  ๋ธŒ๋ผ์šฐ์ € ์บ์‹ฑ ํšจ์œจ์„ ๋†’์ž…๋‹ˆ๋‹ค [6, 14, 15]. + * `React.lazy()`์™€ ``๋ฅผ ๊ฒฐํ•ฉํ•œ ๋ผ์šฐํŠธ ๋ ˆ๋ฒจ ๋™์  ์ž„ํฌํŠธ๋ฅผ ํ†ตํ•ด ์ดˆ๊ธฐ ๋ฉ”์ธ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ๊ทน์ ์œผ๋กœ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [11, 14, 15]. + +## โš–๏ธ Trade-offs & Caveats +* **๋Œ€ํ˜• ์ฒญํฌ ๊ฒฝ๊ณ  ๋ฐ ์ดˆ๊ธฐ ๋ฒˆ๋“ค ๋น„๋Œ€ํ™” (Large Chunks Warning):** Vite๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ์ข…์†์„ฑ์„ ๋‹จ์ผ ํŒŒ์ผ๋กœ ๋นŒ๋“œํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ˆ˜๋™์œผ๋กœ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…์„ ํ•˜์ง€ ์•Š์œผ๋ฉด ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ ์‹œ "500kB ์ดˆ๊ณผ" ๊ฒฝ๊ณ ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋‹ค์šด๋กœ๋“œ ์‹œ๊ฐ„์„ ์ง€์—ฐ์‹œํ‚ค๊ณ  ๋‚ฎ์€ ์„ฑ๋Šฅ์˜ ๋ชจ๋ฐ”์ผ ๊ธฐ๊ธฐ์—์„œ ํŒŒ์‹ฑ ๋ฐ ์ปดํŒŒ์ผ์— ๋ฌด๋ฆฌ๋ฅผ ์ฃผ์–ด FCP, LCP, INP์™€ ๊ฐ™์€ Core Web Vitals ์ง€ํ‘œ๋ฅผ ์•…ํ™”์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [14, 16, 17]. +* **๊ฐœ๋ฐœ์ž ๋„๊ตฌ ์บ์‹ฑ ์˜์กด์„ฑ:** Vite๋Š” ๋ชจ๋“ˆ ๋กœ๋”ฉ ์„ฑ๋Šฅ์„ ์œ„ํ•ด ๋ธŒ๋ผ์šฐ์ €์˜ ์บ์‹ฑ์— ํฌ๊ฒŒ ์˜์กดํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐœ๋ฐœ ์ค‘ ๋ธŒ๋ผ์šฐ์ € ๊ฐœ๋ฐœ์ž ๋„๊ตฌ์—์„œ "์บ์‹œ ์‚ฌ์šฉ ์•ˆ ํ•จ(Disable cache)"์„ ์„ค์ •ํ•˜๋ฉด ๊ฐœ๋ฐœ ์„œ๋ฒ„๊ฐ€ ๋А๋ ค์ง€๋Š” ๋ถ€์ž‘์šฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [18]. +* **ํ”Œ๋Ÿฌ๊ทธ์ธ ๋‚จ์šฉ์œผ๋กœ ์ธํ•œ ์„ฑ๋Šฅ ์ €ํ•˜:** ๊ณผ๋„ํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ ์‚ฌ์šฉ์€ ๊ฐœ๋ฐœ ์„œ๋ฒ„์˜ ์†๋„๋ฅผ ์ €ํ•˜์‹œํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๊ตฌ์„ฑ์„ ์ตœ์†Œํ™”ํ•˜๊ณ  ํ•„์š”ํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ๋งŒ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [18]. +* **์‚ฌ์ „ ๋ฒˆ๋“ค๋ง ๊ด€๋ฆฌ ํ•„์š”์„ฑ:** ๊ทœ๋ชจ๊ฐ€ ํฌ๊ฑฐ๋‚˜ ํŠน์ดํ•œ ์™ธ๋ถ€ ์ข…์†์„ฑ์˜ ๊ฒฝ์šฐ, `optimizeDeps` ์„ค์ •์„ ์ˆ˜๋™์œผ๋กœ ์ œ์–ดํ•˜์ง€ ์•Š์œผ๋ฉด ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์ „ ๋ฒˆ๋“ค๋ง์œผ๋กœ ์ธํ•œ ์†๋„ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [8, 11]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] +- [[Native ES Modules (ESM)]] + - ์—ฐ๊ฒฐ ์ด์œ : Vite๊ฐ€ ๊ฐœ๋ฐœ ๋‹จ๊ณ„์—์„œ ๋น ๋ฅธ ๊ตฌ๋™ ์†๋„๋ฅผ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ํ™œ์šฉํ•˜๋Š” ๋ธŒ๋ผ์šฐ์ €์˜ ๊ธฐ๋ณธ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค [2, 4]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ณผ๊ฑฐ ๋„๊ตฌ(Webpack)์˜ ๋ฌด๊ฑฐ์šด ์‚ฌ์ „ ๋ฒˆ๋“ค๋ง ๋ฐฉ์‹๊ณผ ๋Œ€๋น„๋˜๋Š” Vite์˜ '์š”์ฒญ ์‹œ ์ œ๊ณต(On-demand serving)' ๋ฉ”์ปค๋‹ˆ์ฆ˜์˜ ์›๋ฆฌ. + +- [[Rollup]] + - ์—ฐ๊ฒฐ ์ด์œ : Vite์˜ ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ๋‚ด๋ถ€ ๋ฒˆ๋“ค๋Ÿฌ์ž…๋‹ˆ๋‹ค [5, 6]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ฐฐํฌ ํ™˜๊ฒฝ์—์„œ ์–ด๋–ป๊ฒŒ `manualChunks`๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฒˆ๋“ค์„ ๋ถ„ํ• ํ•˜๊ณ , ํŠธ๋ฆฌ ์‰์ดํ‚น์„ ํ†ตํ•ด ์ตœ์ ํ™”๋œ ๊ฒฐ๊ณผ๋ฌผ์„ ๋„์ถœํ•˜๋Š”์ง€ ๊ทธ ๊ณผ์ • [10, 16]. + +- [[SWC]] + - ์—ฐ๊ฒฐ ์ด์œ : ๊ธฐ์กด์˜ Babel์„ ๋Œ€์ฒดํ•˜์—ฌ JSX์™€ TypeScript ์ปดํŒŒ์ผ์„ ์—„์ฒญ๋‚˜๊ฒŒ ๋น ๋ฅธ ์†๋„๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” Rust ๊ธฐ๋ฐ˜ ํŠธ๋žœ์Šคํฌ๋จธ์ž…๋‹ˆ๋‹ค [4, 7, 8]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Vite ํ™˜๊ฒฝ์—์„œ React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ•ซ ๋ฆฌ๋กœ๋“œ์™€ ๋นŒ๋“œ ํผํฌ๋จผ์Šค๋ฅผ ํ•œ ์ฐจ์› ๋Œ์–ด์˜ฌ๋ฆฌ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ์˜ ์—ญํ• . + +#### [์ตœ์ ํ™” ๊ธฐ๋ฒ•] +- [[Code Splitting & manualChunks]] + - ์—ฐ๊ฒฐ ์ด์œ : 500kB ์ด์ƒ์˜ ๊ฑฐ๋Œ€ํ•œ ๋ฉ”์ธ ๋ฒˆ๋“ค ๊ฒฝ๊ณ  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Vite/Rollup ํ™˜๊ฒฝ์—์„œ ๋ฒค๋” ์ฝ”๋“œ์™€ ์•ฑ ์ฝ”๋“œ๋ฅผ ๋‚˜๋ˆ„๋Š” ํ•ต์‹ฌ ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค [6, 14, 15]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ธŒ๋ผ์šฐ์ € ๋ณ‘๋ ฌ ๋‹ค์šด๋กœ๋“œ์™€ ํšจ์œจ์ ์ธ ์บ์‹œ ๋ฌดํšจํ™” ์ „๋žต, ์ดˆ๊ธฐ ํŽ˜์ด๋กœ๋“œ ์ตœ์†Œํ™” ๋ฐฉ๋ฒ• [17, 19]. + +### Deeper Research Questions + +- Vite์˜ ๋„ค์ดํ‹ฐ๋ธŒ ESM ๊ธฐ๋ฐ˜ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ๊ณผ Rollup ๊ธฐ๋ฐ˜ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ ์‚ฌ์ด์˜ ์ฐจ์ด๋กœ ์ธํ•ด, ๋Ÿฐํƒ€์ž„ ๋˜๋Š” ๋นŒ๋“œ ํƒ€์ž„์— ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๋‚˜ ์˜ˆ์™ธ ์ผ€์ด์Šค๋Š” ๋ฌด์—‡์ธ๊ฐ€? +- ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ `optimizeDeps`๋ฅผ ํ†ตํ•œ ์‚ฌ์ „ ๋ฒˆ๋“ค๋ง ๋ฉ”์ปค๋‹ˆ์ฆ˜ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ค ๊ธฐ์ค€์„ ๊ฐ€์ง€๊ณ  ์ข…์†์„ฑ์„ ๋ถ„๋ฆฌ/ํฌํ•จํ•ด์•ผ ํ•˜๋Š”๊ฐ€? +- `@vitejs/plugin-react-swc` ์‚ฌ์šฉ ์‹œ, ๊ธฐ์กด Babel ์ƒํƒœ๊ณ„์˜ ์ปค์Šคํ…€ ํ”Œ๋Ÿฌ๊ทธ์ธ๋“ค์„ ์–ด๋–ป๊ฒŒ ์ด๊ด€ํ•˜๊ฑฐ๋‚˜ ๋Œ€์ฒดํ•ด์•ผ ํ•˜๋Š”๊ฐ€? +- `manualChunks`๋ฅผ ์„ธ๋ฐ€ํ•˜๊ฒŒ ์„ค์ •ํ•  ๋•Œ ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ค‘๋ณต ํฌํ•จ์„ ๋ง‰๊ณ  ๊ฐ€์žฅ ์ด์ƒ์ ์ธ ์ฒญํฌ ํฌ๊ธฐ๋ฅผ ์œ ์ง€ํ•˜๋Š” ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? +- Vite ํ™˜๊ฒฝ์—์„œ ๋ผ์šฐํŠธ ๋ ˆ๋ฒจ ์ง€์—ฐ ๋กœ๋”ฉ(`React.lazy`) ์ ์šฉ ์‹œ ๋ฐœ์ƒํ•˜๋Š” ์›Œํ„ฐํด(Waterfall) ๋„คํŠธ์›Œํฌ ์š”์ฒญ ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด `preload` ๋˜๋Š” `prefetch` ํžŒํŠธ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ฒฐํ•ฉํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? + +### Practical Application Contexts + +- **Implementation:** `npm create vite@latest`๋ฅผ ์‚ฌ์šฉํ•ด ๋ถˆํ•„์š”ํ•œ ์„ค์ • ์—†๋Š” ๊ฐ€๋ฒผ์šด ์ดˆ๊ธฐ ๊ตฌ์กฐ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , `vite.config.js`์— `@vitejs/plugin-react-swc`์™€ ๊ฐ™์€ ํ”Œ๋Ÿฌ๊ทธ์ธ, ๊ฒฝ๋กœ ๋ณ„์นญ(`@/components` ๋“ฑ), ๋ฐฑ์—”๋“œ API ์—ฐ๋™์„ ์œ„ํ•œ proxy ์„ค์ •์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค [3, 7, 9, 10]. +- **System Design:** ํ”„๋ก ํŠธ์—”๋“œ ์‹œ์Šคํ…œ ์„ค๊ณ„ ์‹œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ(๋น ๋ฅธ ํ”ผ๋“œ๋ฐฑ ๋ฃจํ”„ ๋ณด์žฅ)๊ณผ ๋ฐฐํฌ ํ™˜๊ฒฝ(๊ณ ๋„์˜ ์••์ถ• ๋ฐ ๋ณ‘๋ ฌ ๋กœ๋“œ๋ฅผ ์œ„ํ•œ ๋ชจ๋“ˆํ™” ๋ณด์žฅ)์— ๋‹ค๋ฅธ ์ „๋žต์„ ์ทจํ•˜๋Š” Vite์˜ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์ฒ ํ•™์„ ์•„ํ‚คํ…์ฒ˜์— ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค [5]. +- **Operation / Maintenance:** CI/CD ํŒŒ์ดํ”„๋ผ์ธ์ด๋‚˜ ๋กœ์ปฌ ๋นŒ๋“œ ํ›„ `rollup-plugin-visualizer` ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ํ™œ์šฉํ•˜์—ฌ ์–ด๋–ค ํŒจํ‚ค์ง€๊ฐ€ ๋ฉ”์ธ ๋ฒˆ๋“ค ์šฉ๋Ÿ‰์„ ์ฐจ์ง€ํ•˜๋Š”์ง€ ์‹œ๊ฐ์  ํŠธ๋ฆฌ๋งต์œผ๋กœ ์ •๊ธฐ ์ ๊ฒ€ํ•˜๊ณ  ์ตœ์ ํ™”ํ•ฉ๋‹ˆ๋‹ค [11, 13, 18]. +- **Learning Path:** ๋ชจ๋“ˆ ๋ฒˆ๋“ค๋Ÿฌ์˜ ๋ฐœ์ „ ๊ณผ์ •(Webpack -> ES Modules ๋„ค์ดํ‹ฐ๋ธŒ ๋„์ž… -> Vite)์„ ํ•™์Šตํ•œ ํ›„, ๋นŒ๋“œ ๋„๊ตฌ ์ฐจ์›์˜ ์ตœ์ ํ™”(`manualChunks`)์™€ React ํ”„๋ ˆ์ž„์›Œํฌ ์ฐจ์›์˜ ์ตœ์ ํ™”(`React.lazy`)๊ฐ€ ๊ฒฐํ•ฉ๋˜์—ˆ์„ ๋•Œ์˜ ์‹œ๋„ˆ์ง€๋ฅผ ์ดํ•ดํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ํ•™์Šต์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค [2, 6, 15]. +- **My Project Relevance:** Vite ๋นŒ๋“œ ์‹œ "Some chunks are larger than 500 kB" ๊ฒฝ๊ณ ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ๋‹นํ™ฉํ•˜์ง€ ์•Š๊ณ , ์ž์ฃผ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ๋ฒค๋” ์ฝ”๋“œ(React ์ฝ”์–ด, ์ฐจํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋“ฑ)๋ฅผ ๋ถ„๋ฆฌํ•˜๊ณ  ๋ผ์šฐํ„ฐ ๋ ˆ๋ฒจ์—์„œ ์ง€์—ฐ ๋กœ๋”ฉ์„ ๋„์ž…ํ•˜์—ฌ ๋‹ค์šด๋กœ๋“œ ์†๋„ ๋ฐ FCP, LCP๋ฅผ ๊ฐœ์„ ํ•˜๋Š” ๋ฐ ์ง์ ‘์ ์œผ๋กœ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค [14-16]. + +### Adjacent Topics + +- [[Webpack]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: Vite๊ฐ€ ๋“ฑ์žฅํ•˜๊ธฐ ์ „ ์—…๊ณ„ ํ‘œ์ค€์ด์—ˆ์œผ๋‚˜ ์‹œ์ž‘ ์ „ ์ „์ฒด ๋ฒˆ๋“ค๋ง ๊ณผ์ •์œผ๋กœ ์ธํ•ด ๋ฌด๊ฑฐ์šด ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„ Webpack์˜ ํ•œ๊ณ„์™€ Vite์™€์˜ ์•„ํ‚คํ…์ฒ˜ ๋น„๊ต [1, 2]. +- [[Core Web Vitals]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: Vite์˜ ์ฒญํฌ ๋ถ„ํ•  ๋ฐ ์ง€์—ฐ ๋กœ๋”ฉ ๊ธฐ๋ฒ•์ด ์‹ค์ œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ์ง€ํ‘œ์ธ FCP(First Contentful Paint), LCP(Largest Contentful Paint), INP(Interaction to Next Paint)์— ์–ด๋–ป๊ฒŒ ์ง๊ฒฐ๋˜๋Š”์ง€ ํƒ๊ตฌ [17, 20]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/๋Œ€๊ทœ๋ชจ ํ”„๋ก ํŠธ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜.md b/00_Raw/๋Œ€๊ทœ๋ชจ ํ”„๋ก ํŠธ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜.md new file mode 100644 index 00000000..b3e02b9e --- /dev/null +++ b/00_Raw/๋Œ€๊ทœ๋ชจ ํ”„๋ก ํŠธ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜.md @@ -0,0 +1,64 @@ +# [[๋Œ€๊ทœ๋ชจ ํ”„๋ก ํŠธ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜]] + +## ๐Ÿ“Œ Brief Summary +๋Œ€๊ทœ๋ชจ ํ”„๋ก ํŠธ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋‹จ์ˆœํ•œ ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰์„ ๋„˜์–ด ํ™•์žฅ์„ฑ, ์œ ์ง€๋ณด์ˆ˜์„ฑ, ๊ณ ์„ฑ๋Šฅ์„ ์š”๊ตฌํ•˜๋Š” ๊ณ ๋„๋กœ ์ •๊ตํ•œ ๋ถ„์‚ฐ ์†Œํ”„ํŠธ์›จ์–ด ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค. ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ UI์˜ ๋ถ„๋ฆฌ, ๋ช…ํ™•ํ•œ ์ƒํƒœ ์†Œ์œ ๊ถŒ, ์—„๊ฒฉํ•œ ํด๋” ๊ตฌ์กฐ(Feature-Sliced Design ๋“ฑ)๋ฅผ ํ†ตํ•ด ์•„ํ‚คํ…์ฒ˜์˜ ๋ถ•๊ดด๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…, ์ž๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜, ์„ธ๋ถ„ํ™”๋œ ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ตœ์ ์˜ ๋ Œ๋”๋ง ์„ฑ๋Šฅ๊ณผ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค. + +## ๐Ÿ“– Core Content + +* **์•„ํ‚คํ…์ฒ˜ ๋ฐ ํด๋” ๊ตฌ์กฐ (Architecture & Folder Structure)** + * ๊ณผ๊ฑฐ์˜ ํŒŒ์ผ ํƒ€์ž… ๊ธฐ๋ฐ˜(MVC ๋“ฑ) ํด๋” ๊ตฌ์กฐ๋Š” ๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ๋กœ์ง์ด ํŒŒํŽธํ™”๋˜๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€๊ทœ๋ชจ ์•ฑ์—์„œ๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๊ธฐ๋Šฅ๋ณ„๋กœ ์ฝ”๋“œ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” **๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜(Feature-based)** ๋˜๋Š” **FSD(Feature-Sliced Design)** ์•„ํ‚คํ…์ฒ˜๊ฐ€ ํ‘œ์ค€์œผ๋กœ ์ž๋ฆฌ ์žก์•˜์Šต๋‹ˆ๋‹ค [1-13]. + * FSD๋Š” ์•ฑ์„ ๊ณต์œ (shared), ์—”ํ‹ฐํ‹ฐ(entities), ๊ธฐ๋Šฅ(features), ์œ„์ ฏ(widgets), ํŽ˜์ด์ง€(pages), ์•ฑ(app) ๋“ฑ์˜ ๊ณ„์ธต์œผ๋กœ ๋‚˜๋ˆ„๊ณ , **๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ๊ทœ์น™**(ํ•˜์œ„ ๊ณ„์ธต๋งŒ ์ฐธ์กฐ ๊ฐ€๋Šฅ)๊ณผ **Public API ๊ทœ์น™**(index.ts๋ฅผ ํ†ตํ•œ ์บก์Аํ™”)์„ ๊ฐ•์ œํ•˜์—ฌ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถฅ๋‹ˆ๋‹ค [6, 9, 10, 14, 15]. +* **์ƒํƒœ ๊ด€๋ฆฌ์˜ ํŒŒํŽธํ™” (Fragmentation of Global State)** + * ๊ฑฐ๋Œ€ํ•œ ๋‹จ์ผ ์Šคํ† ์–ด(Monolithic Redux) ๋Œ€์‹ , ๋ฐ์ดํ„ฐ ์œ ํ˜•์— ๋”ฐ๋ผ ์ตœ์ ์˜ ๋„๊ตฌ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๋กœ์ปฌ ์ƒํƒœ๋Š” `useState`, ์ „์—ญ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒํƒœ๋Š” `Zustand`๋‚˜ `Jotai`, ์„œ๋ฒ„(API) ์ƒํƒœ๋Š” `TanStack Query`๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์บ์‹ฑ ๋ฐ ๋™๊ธฐํ™”๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค [16-24]. + * ํŠนํžˆ Context API๋Š” ๊ฐ’์ด ๋ณ€ํ•  ๋•Œ๋งˆ๋‹ค ๋ชจ๋“  ๊ตฌ๋… ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฆฌ๋ Œ๋”๋งํ•˜๋Š” '๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ' ๋ฐฉ์‹์ด๋ฏ€๋กœ ์ •์  ๋ฐ์ดํ„ฐ(ํ…Œ๋งˆ ๋“ฑ)์— ์ ํ•ฉํ•˜๋ฉฐ, ์ž์ฃผ ๋ณ€๊ฒฝ๋˜๋Š” ๋™์  ์ƒํƒœ๋Š” ์„ ํƒ์ž(Selector) ํŒจํ„ด์œผ๋กœ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ฐฉ์ง€ํ•˜๋Š” Zustand ๋“ฑ์ด ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค [16, 17, 25-28]. +* **์„ฑ๋Šฅ ์ตœ์ ํ™” (Performance Optimization)** + * **๋นŒ๋“œ/๋Ÿฐํƒ€์ž„ ์ตœ์ ํ™”:** Vite์™€ Rollup์„ ํ™œ์šฉํ•˜์—ฌ ์ž์ฃผ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(React ๋“ฑ)๋ฅผ `manualChunks`๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ์บ์‹œ ํšจ์œจ์„ ๋†’์ด๊ณ , `React.lazy`์™€ `Suspense`๋ฅผ ํ†ตํ•ด ๋ผ์šฐํŠธ ๋˜๋Š” ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„์˜ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค [29-37]. + * **๋ Œ๋”๋ง ์„ฑ๋Šฅ:** React 19/2025 ์ƒํƒœ๊ณ„์—์„œ๋Š” ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜(React.memo, useMemo)์˜ ํ•œ๊ณ„๋ฅผ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด **React Compiler**๋ฅผ ๋„์ž…ํ•˜์—ฌ ๋นŒ๋“œ ํƒ€์ž„์— ์ž๋™์œผ๋กœ ๋ Œ๋”๋ง ์ตœ์ ํ™”๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๋Ÿ‰์˜ ๋ฆฌ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋Š” ๊ฐ€์ƒํ™”(Virtualization) ๊ธฐ์ˆ ์„ ํ†ตํ•ด DOM ๋น„๋Œ€ํ™”๋ฅผ ๋ง‰์Šต๋‹ˆ๋‹ค [30-32, 38-44]. +* **๋ณต์›๋ ฅ ๋ฐ ๋””๋ฒ„๊น… (Resilience & Debugging)** + * ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๋กœ ์ธํ•œ '๋ฐฑ์ง€ ํ™”๋ฉด(White screen of death)'์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด **์—๋Ÿฌ ๋ฐ”์šด๋”๋ฆฌ(Error Boundaries)**๋ฅผ ๋Œ€์‹œ๋ณด๋“œ๋‚˜ ์„œ๋“œํŒŒํ‹ฐ ์œ„์ ฏ ๋“ฑ ๋ถˆ์•ˆ์ •ํ•œ UI ์„น์…˜์— ์ „๋žต์ ์œผ๋กœ ๋ฐฐ์น˜ํ•˜์—ฌ Fallback UI๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [45-53]. + * ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜(Detached DOM nodes ๋“ฑ)๋Š” ์„ฑ๋Šฅ ์ €ํ•˜์˜ ์ฃผ์›์ธ์ด๋ฏ€๋กœ Chrome DevTools์˜ Heap Snapshot ๋ฐ Allocation Timeline์„ ํ†ตํ•ด ์ถ”์ ํ•˜๋ฉฐ, ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋Š” Sentry, LogRocket, Datadog ๋“ฑ์˜ ๊ฐ€์‹œ์„ฑ(Observability) ๋„๊ตฌ๋กœ ๋ชจ๋‹ˆํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค [54-63]. +* **ํด๋ฆฐ ์ฝ”๋“œ ๋ฐ ๊ฑฐ๋ฒ„๋„Œ์Šค (Clean Code & Governance)** + * React์˜ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—๋„ SOLID ์›์น™(๋‹จ์ผ ์ฑ…์ž„ ์›์น™, ๊ฐœ๋ฐฉ-ํ์‡„ ์›์น™ ๋“ฑ), DRY, KISS, YAGNI ์›์น™์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ปดํฌ๋„ŒํŠธ๋Š” ๋‹จ์ผ ์ฑ…์ž„์„ ๊ฐ€์ ธ์•ผ ํ•˜๋ฉฐ ๊ณผ๋„ํ•œ ์ถ”์ƒํ™”๋Š” ์ง€์–‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [64-69]. + * ์šด์˜์ฒด์ œ ๊ฐ„ ํ˜ธํ™˜์„ฑ ๋ฐ ๋นŒ๋“œ ์˜ค๋ฅ˜ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด ํŒŒ์ผ ๋ฐ ํด๋”๋ช…์€ `kebab-case`, ์ปดํฌ๋„ŒํŠธ๋Š” `PascalCase` ์‚ฌ์šฉ์„ ํ‘œ์ค€ํ™”ํ•˜๋ฉฐ, ESLint, Prettier, Husky๋ฅผ ํ†ตํ•ด CI/CD ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ์•„ํ‚คํ…์ฒ˜ ๊ฒฝ๊ณ„์™€ ์ฝ”๋“œ ํ’ˆ์งˆ์„ ์ž๋™ ๊ฐ•์ œํ•ฉ๋‹ˆ๋‹ค [70-73]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts +- [[Feature-Sliced Design (FSD)]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋Œ€๊ทœ๋ชจ ํ”„๋ก ํŠธ์—”๋“œ ํ”„๋กœ์ ํŠธ์˜ ํด๋” ๊ตฌ์กฐ์™€ ๋ชจ๋“ˆ ์˜์กด์„ฑ์„ ํ†ต์ œํ•˜๋Š” ํ•ต์‹ฌ ์•„ํ‚คํ…์ฒ˜ ๋ฐฉ๋ฒ•๋ก ์ž…๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ๊ณผ UI๋ฅผ ์–ด๋–ป๊ฒŒ ๊ณ„์ธต์ ์œผ๋กœ ๋ถ„๋ฆฌํ•˜๊ณ , ์ˆœํ™˜ ์ฐธ์กฐ ๋ฐ ๊ฐ•ํ•œ ๊ฒฐํ•ฉ์„ ์–ด๋–ป๊ฒŒ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[์ƒํƒœ ๊ด€๋ฆฌ (State Management)]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋Œ€๊ทœ๋ชจ ์•ฑ์—์„œ๋Š” ์ „์—ญ ์ƒํƒœ, ์„œ๋ฒ„ ์ƒํƒœ, ๋กœ์ปฌ ์ƒํƒœ๋ฅผ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌํ•ด์•ผ ํ™•์žฅ ๋ฐ ์„ฑ๋Šฅ ์œ ์ง€๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Context API์˜ ์„ฑ๋Šฅ์  ํ•œ๊ณ„(๋ฆฌ๋ Œ๋”๋ง ํญํ’)์™€ Zustand์˜ Selector ํŒจํ„ด, TanStack Query๋ฅผ ํ†ตํ•œ ์„œ๋ฒ„ ์ƒํƒœ ์บ์‹ฑ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[์„ฑ๋Šฅ ์ตœ์ ํ™” (Performance Optimization)]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋Œ€๊ทœ๋ชจ ์ฝ”๋“œ๋ฒ ์ด์Šค๋Š” ํ•„์—ฐ์ ์œผ๋กœ ๋ฒˆ๋“ค ํฌ๊ธฐ ์ฆ๊ฐ€์™€ ๋ Œ๋”๋ง ๋ณ‘๋ชฉ์„ ์ดˆ๋ž˜ํ•˜๋ฏ€๋กœ ์ด๋ฅผ ์ œ์–ดํ•˜๋Š” ๊ธฐ์ˆ ์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: React Compiler์˜ ์ž๋™ํ™”๋œ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ์›๋ฆฌ, Vite์˜ manualChunks๋ฅผ ํ†ตํ•œ ๋ฒˆ๋“ค ๋ถ„ํ• , React.lazy ๊ธฐ๋ฐ˜์˜ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ… ์ ์šฉ ๋ฐฉ์‹์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[์—๋Ÿฌ ๋ฐ”์šด๋”๋ฆฌ (Error Boundaries)]] + - ์—ฐ๊ฒฐ ์ด์œ : ์ปดํฌ๋„ŒํŠธ ํ•˜๋‚˜์˜ ์˜ค๋ฅ˜๊ฐ€ ์ „์ฒด ์•ฑ์˜ ํฌ๋ž˜์‹œ๋กœ ์ด์–ด์ง€์ง€ ์•Š๊ฒŒ ๋ง‰์•„์ฃผ๋Š” ๋Œ€๊ทœ๋ชจ ์‹œ์Šคํ…œ์˜ ํ•„์ˆ˜ ์•ˆ์ „๋ง์ž…๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ ๋‚ด์—์„œ ์—๋Ÿฌ๋ฅผ ๊ฒฉ๋ฆฌํ•˜๋Š” ์›๋ฆฌ์™€ ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๋ฅผ ์šฐ์•„ํ•˜๊ฒŒ ์ฒ˜๋ฆฌ(Graceful degradation)ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ (Memory Leaks)]] + - ์—ฐ๊ฒฐ ์ด์œ : ์•ฑ ์‚ฌ์šฉ ์‹œ๊ฐ„์ด ๊ธธ์–ด์งˆ์ˆ˜๋ก ์„ฑ๋Šฅ์„ ์‹ฌ๊ฐํ•˜๊ฒŒ ์ €ํ•˜์‹œํ‚ค๋Š” ์ˆจ์€ ์›์ธ์ž…๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํด๋กœ์ €(Closure)๋‚˜ Detached DOM์— ์˜ํ•ด ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํšŒ์ˆ˜ํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ตฌ์กฐ์  ์›์ธ๊ณผ DevTools๋ฅผ ํ™œ์šฉํ•œ ๋””๋ฒ„๊น… ๊ธฐ๋ฒ•์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### Deeper Research Questions +- FSD(Feature-Sliced Design) ๋„์ž… ์‹œ '์ธ์ฆ(Auth)'์ด๋‚˜ '๋ผ์šฐํŒ…'๊ณผ ๊ฐ™์€ Cross-cutting concern(๊ณตํ†ต ๊ด€์‹ฌ์‚ฌ)์€ ๊ณ„์ธต(Layer) ๊ตฌ์กฐ์˜ ์–ด๋А ๋ถ€๋ถ„์— ๋ฐฐ์น˜ํ•˜๊ณ  ์–ด๋–ป๊ฒŒ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ ํ•ฉํ•œ๊ฐ€? +- React Compiler๊ฐ€ ์ž๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์ˆ˜ํ–‰ํ•  ๋•Œ, ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(์˜ˆ: ๋ถˆ์•ˆ์ •ํ•œ ๊ฐ์ฒด ์ฐธ์กฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ปค์Šคํ…€ ํ›…)์™€์˜ ํ˜ธํ™˜์„ฑ ์ถฉ๋Œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๊ตฌ์ฒด์  ๋ฐฉ์•ˆ์€ ๋ฌด์—‡์ธ๊ฐ€? +- ๋Œ€๊ทœ๋ชจ ๋ฆฌ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ Œ๋”๋งํ•  ๋•Œ Virtualization(์œˆ๋„์œ™) ๊ธฐ์ˆ ์ด DOM ๋…ธ๋“œ ์ฆ๊ฐ€๋ฅผ ๋ง‰๋Š” ์›๋ฆฌ๋Š” ๋ฌด์—‡์ด๋ฉฐ, ์ด ๊ณผ์ •์—์„œ `key` ํ”„๋กญ(prop)์ด ์„ฑ๋Šฅ์— ๋ฏธ์น˜๋Š” ์ •ํ™•ํ•œ ์˜ํ–ฅ์€ ๋ฌด์—‡์ธ๊ฐ€? +- ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์˜ ํ”„๋ก ํŠธ์—”๋“œ ๋ชจ๋‹ˆํ„ฐ๋ง(Sentry, Datadog ๋“ฑ)์ด ์ œ๊ณตํ•˜๋Š” ์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด(Session Replay) ๊ธฐ๋Šฅ์ด ๊ฐœ๋ฐœ์ž์˜ ๋””๋ฒ„๊น…์— ์–ด๋–ป๊ฒŒ ๊ธฐ์—ฌํ•˜๋ฉฐ, ์ด๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฏผ๊ฐ ๋ฐ์ดํ„ฐ ์œ ์ถœ ๋ฐ ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ ์ฆ๊ฐ€๋ผ๋Š” ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๋Š” ์–ด๋–ป๊ฒŒ ๊ทน๋ณตํ•˜๋Š”๊ฐ€? +- Zustand, Jotai์™€ ๊ฐ™์€ ์ตœ์‹  ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๊ธฐ์กด์˜ Redux๋‚˜ Context API์™€ ๋น„๊ตํ•˜์—ฌ ๋™์ /์‹ค์‹œ๊ฐ„ ๋ Œ๋”๋ง ์ตœ์ ํ™”(์˜ˆ: ๋ฆฌ๋ Œ๋”๋ง ์Šคํ‚ต)๋ฅผ ๋‚ด๋ถ€์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ๋Š”๊ฐ€? + +### Practical Application Contexts +- **Implementation:** ํŒŒ์ผ๊ณผ ํด๋” ๋„ค์ด๋ฐ ๊ทœ์น™(ํŒŒ์ผ: kebab-case, ์ปดํฌ๋„ŒํŠธ: PascalCase)์„ ํ†ต์ผํ•˜๊ณ , 300์ค„์ด ๋„˜์–ด๊ฐ€๋Š” ์ปดํฌ๋„ŒํŠธ๋Š” ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)์— ๋”ฐ๋ผ ๋” ์ž‘์€ ํ›…(Hook)๊ณผ ์„œ๋ธŒ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ฆฌํŒฉํ† ๋งํ•ฉ๋‹ˆ๋‹ค. +- **System Design:** ํ”„๋กœ์ ํŠธ ์„ค๊ณ„ ์‹œ ํด๋” ๊ตฌ์กฐ๋ฅผ ๊ธฐ์ˆ  ์Šคํƒ(components, hooks) ๊ธฐ๋ฐ˜์ด ์•„๋‹Œ ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ(features/auth, features/dashboard ๋“ฑ) ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์„ฑํ•˜์—ฌ ๊ฐ ๋ชจ๋“ˆ์˜ ์บก์Аํ™”๋ฅผ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. +- **Operation / Maintenance:** ๊ฐœ๋ณ„ ์„œ๋“œํŒŒํ‹ฐ ์œ„์ ฏ์ด๋‚˜ ๋ถˆ์•ˆ์ •ํ•œ UI ํŒŒํŠธ์— Error Boundary๋ฅผ ์”Œ์›Œ ๋ฉ”์ธ ์„œ๋น„์Šค์˜ ๋™์ž‘์„ ๋ณด์žฅํ•˜๋ฉฐ, Memory Profiler๋ฅผ ์‚ฌ์šฉํ•ด Detached DOM node ๋“ฑ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ์š”์ธ์„ ์ •๊ธฐ์ ์œผ๋กœ ๊ฐ์‚ฌ(Audit)ํ•ฉ๋‹ˆ๋‹ค. +- **Learning Path:** ๋ฆฌ์•กํŠธ ํ•ต์‹ฌ ์›๋ฆฌ(๋ Œ๋”๋ง ํŠธ๋ฆฌ๊ฑฐ ์ดํ•ด) โ†’ ํด๋” ๊ตฌ์กฐ/์•„ํ‚คํ…์ฒ˜(FSD) ์„ค๊ณ„ โ†’ ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ ๋น„๊ต ๋ฐ ๋„์ž… โ†’ ์›น ์„ฑ๋Šฅ ์ง€ํ‘œ(Core Web Vitals) ๋ฐ ๋ฒˆ๋“ค๋Ÿฌ(Vite) ์ตœ์ ํ™” ๋„๊ตฌ ์ฒด๋“์˜ ์ˆœ์„œ๋กœ ํ•™์Šต์„ ๊ณ ๋„ํ™”ํ•ฉ๋‹ˆ๋‹ค. +- **My Project Relevance:** ํŒ€ ๋‹จ์œ„์˜ ํ˜‘์—… ์‹œ ESLint, Prettier, Husky๋ฅผ ๋„์ž…ํ•ด ์•„ํ‚คํ…์ฒ˜ ๊ทœ์น™(๋‹ค๋ฅธ Feature์— ์ง์ ‘ ์ ‘๊ทผ ๊ธˆ์ง€ ๋“ฑ)์„ ์ž๋™ ๊ฐ•์ œํ•˜๊ณ , ์ฝ”๋“œ ๋ฆฌ๋ทฐ ์‹œ ์ผ๊ด€๋œ ์•„ํ‚คํ…์ฒ˜ ์›์น™์„ ๊ธฐ์ค€์œผ๋กœ ์‚ผ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### Adjacent Topics +- [[๋งˆ์ดํฌ๋กœ ํ”„๋ก ํŠธ์—”๋“œ (Micro-Frontends)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋‹จ์ผ ์ €์žฅ์†Œ(Monorepo) ๋ฐ ๋ชจ๋“ˆํ™”์˜ ํ•œ๊ณ„๋ฅผ ๋„˜์–ด, ์ดˆ๋Œ€ํ˜• ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ํ™˜๊ฒฝ์—์„œ ์—ฌ๋Ÿฌ ํŒ€์ด ํ”„๋ก ํŠธ์—”๋“œ๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ๋ฐฐํฌํ•˜๊ณ  ์šด์˜ํ•˜๊ธฐ ์œ„ํ•œ ๋Ÿฐํƒ€์ž„ ํ†ตํ•ฉ ์•„ํ‚คํ…์ฒ˜๋กœ ์ง€์‹์„ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค. +- [[์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ (Visual Regression Testing)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: Storybook์„ ํ™œ์šฉํ•œ ์ปดํฌ๋„ŒํŠธ ๊ณ ๋ฆฝ ๊ฐœ๋ฐœ์„ ๋„˜์–ด์„œ, Happo, Chromatic ๋“ฑ์˜ ๋„๊ตฌ๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ ๋ณ€๊ฒฝ์ด UI๋‚˜ ์ ‘๊ทผ์„ฑ(Accessibility)์— ์˜๋„์น˜ ์•Š์€ ํŒŒ๊ดด์  ์˜ํ–ฅ์„ ๋ฏธ์ณค๋Š”์ง€ ์ž๋™ ๊ฒ€์ฆํ•˜๋Š” QA ๊ณ ๋„ํ™” ์˜์—ญ์œผ๋กœ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ.md b/00_Raw/๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ.md new file mode 100644 index 00000000..a26dcf51 --- /dev/null +++ b/00_Raw/๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ.md @@ -0,0 +1,63 @@ +# [[๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ]] + +## ๐Ÿ“Œ Brief Summary +๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ(์„œ๋ฒ„ ์ƒํƒœ ๊ด€๋ฆฌ)๋Š” API์—์„œ ๊ฐ€์ ธ์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ํด๋ผ์ด์–ธํŠธ ์ธก ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒํƒœ์™€ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌํ•˜์—ฌ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค [1]. ์ด๋Š” ๋„คํŠธ์›Œํฌ ์š”์ฒญ์— ๋”ฐ๋ฅธ ๋ฐ์ดํ„ฐ ์บ์‹ฑ, ๋™๊ธฐํ™”, ๋กœ๋”ฉ ๋ฐ ์—๋Ÿฌ ์‚ฌ์ดํด ๊ด€๋ฆฌ๋ฅผ ํฌํ•จํ•˜๋ฉฐ, ํ˜„๋Œ€ ํ”„๋ก ํŠธ์—”๋“œ ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜์˜ ํ•ต์‹ฌ ์š”์†Œ์ž…๋‹ˆ๋‹ค [1, 2]. ๋Œ€๊ทœ๋ชจ ์•ฑ์—์„œ๋Š” RTK Query๋‚˜ TanStack Query(React Query)์™€ ๊ฐ™์€ ํŠนํ™”๋œ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ๋ฅผ ์ค„์ด๊ณ  ํšจ์œจ์ ์ธ ์บ์‹œ ๊ด€๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค [1, 3, 4]. + +## ๐Ÿ“– Core Content + +* **์„œ๋ฒ„ ์ƒํƒœ์™€ ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ์˜ ๋ถ„๋ฆฌ:** + ์ตœ๊ทผ ํ”„๋ก ํŠธ์—”๋“œ ์•„ํ‚คํ…์ฒ˜์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ณ€ํ™” ์ค‘ ํ•˜๋‚˜๋Š” "์„œ๋ฒ„ ์ƒํƒœ(Server State)"๋ฅผ "์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒํƒœ"์™€ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. API์—์„œ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐ์ดํ„ฐ๋Š” ํด๋ผ์ด์–ธํŠธ ๋ฐ์ดํ„ฐ์™€ ๊ทผ๋ณธ์ ์œผ๋กœ ๋‹ค๋ฅด๋ฉฐ, ์บ์‹ฑ, ๋™๊ธฐํ™”, ๋กœ๋”ฉ ๋ฐ ์—๋Ÿฌ ์ฒ˜๋ฆฌ๊ฐ€ ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค [1]. Zustand์™€ ๊ฐ™์ด ์œ ์—ฐํ•œ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋น„๋™๊ธฐ(Async) ์ž‘์—…์„ ์ง์ ‘ ๋‹ค๋ฃจ๊ฒŒ ๋˜๋ฉด, ํŒ€์›๋งˆ๋‹ค ์ฝœ๋ฐฑ, ํ”„๋กœ๋ฏธ์Šค, ๋ฏธ๋“ค์›จ์–ด ๋“ฑ ์„œ๋กœ ๋‹ค๋ฅธ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์—ฌ ์ผ๊ด€์„ฑ์ด ๋–จ์–ด์ง€๊ณ  ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ค์›Œ์ง€๋Š” ํ•œ๊ณ„๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3, 5]. + +* **๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ ์ตœ์ ํ™” ๋„๊ตฌ:** + ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด TanStack Query(React Query)์™€ RTK Query ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์‚ฌ์‹ค์ƒ์˜ ํ‘œ์ค€์œผ๋กœ ์ž๋ฆฌ ์žก์•˜์Šต๋‹ˆ๋‹ค [1]. + * **TanStack Query:** ๊ฐ•๋ ฅํ•œ ์บ์‹ฑ ๋ ˆ์ด์–ด๋ฅผ ์ œ๊ณตํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ๋„คํŠธ์›Œํฌ ์ค‘๋ณต ์š”์ฒญ์„ ์ค„์ด๊ณ  ๋ฐ์ดํ„ฐ์˜ ์ตœ์‹  ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๋ฌดํ•œ ์Šคํฌ๋กค(infinite scrolling)์ด๋‚˜ ๋‚™๊ด€์  ์—…๋ฐ์ดํŠธ(optimistic updates)์™€ ๊ฐ™์€ ๋ณต์žกํ•œ ๋น„๋™๊ธฐ ๊ธฐ๋Šฅ์„ ๋‹จ์ˆœํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2]. + * **RTK Query:** Redux ์ƒํƒœ๊ณ„์—์„œ ๋น„๋™๊ธฐ ์ž‘์—…์ด ๋งŽ์€ ์•ฑ์„ ์œ„ํ•ด ์บ์‹ฑ, ์ค‘๋ณต ์ œ๊ฑฐ, ์ž๋™ ๋ฐ์ดํ„ฐ ์žฌ์š”์ฒญ(refetching), ์บ์‹œ ๋ฌดํšจํ™” ๊ธฐ๋Šฅ์„ ๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณตํ•˜์—ฌ ๋น„๋™๊ธฐ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ๋ฅผ ์‚ฌ์‹ค์ƒ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค [3, 4]. + +* **๊ตฌ์กฐ์  ๋ถ„๋ฆฌ์™€ ์•„ํ‚คํ…์ฒ˜:** + API ๊ณ„์ธต์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋…๋ฆฝ์ ์ธ ๊ฒฝ๊ณ„๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ, ์š”์ฒญ ์„ ์–ธ๋ถ€์™€ ์ปค์Šคํ…€ ํ›…(Custom Hooks)์€ ํŠน์ • ๊ธฐ๋Šฅ(feature) ํด๋” ๋‚ด์— ํ•จ๊ป˜ ๋ฐฐ์น˜(colocate)๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋„คํŠธ์›Œํฌ ๊ด€๋ จ ๋น„๋™๊ธฐ ๋กœ์ง์„ UI ์ปดํฌ๋„ŒํŠธ์™€ ์™„๋ฒฝํžˆ ๋””์ปคํ”Œ๋ง(decoupling)ํ•˜์—ฌ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค [2]. + +* **์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ฐ ์•ˆ์ •์„ฑ:** + * **๋””๋ฐ”์šด์‹ฑ๊ณผ ์“ฐ๋กœํ‹€๋ง:** ์‚ฌ์šฉ์ž ์ž…๋ ฅ(์˜ˆ: ๊ฒ€์ƒ‰)์— ์˜ํ•ด ํŠธ๋ฆฌ๊ฑฐ๋˜๋Š” ๊ฐ’๋น„์‹ผ ๋น„๋™๊ธฐ API ํ˜ธ์ถœ์€ ๋””๋ฐ”์šด์‹ฑ(debouncing)์ด๋‚˜ ์“ฐ๋กœํ‹€๋ง(throttling)์„ ํ†ตํ•ด ํšŸ์ˆ˜๋ฅผ ์ œํ•œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ณผ๋„ํ•œ API ํ˜ธ์ถœ์„ ๋ฐฉ์ง€ํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ณ  ์„œ๋ฒ„ ๋ถ€ํ•˜๋ฅผ ์ค„์—ฌ์ค๋‹ˆ๋‹ค [6, 7]. + * **๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฐฉ์ง€:** ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋‚˜ ๊ตฌ๋…(subscriptions) ๋“ฑ ์ •๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๋น„๋™๊ธฐ ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ์˜ ๊ฒฝ์šฐ, ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ธ๋งˆ์šดํŠธ๋  ๋•Œ ๋ฆฌ์†Œ์Šค๋ฅผ ํ•ด์ œํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜(memory leaks)๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด ๋ฐ˜๋“œ์‹œ `useEffect`์—์„œ ํด๋ฆฐ์—…(cleanup) ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [8, 9]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts +- [[TanStack Query ๋ฐ RTK Query]] + - ์—ฐ๊ฒฐ ์ด์œ : ์„œ๋ฒ„ ์ƒํƒœ(API ๋ฐ์ดํ„ฐ) ๊ด€๋ฆฌ์— ์žˆ์–ด ์บ์‹ฑ, ์ค‘๋ณต ์š”์ฒญ ์ œ๊ฑฐ, ์ž๋™ ์žฌ์š”์ฒญ ๋“ฑ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ํ˜„๋Œ€์ ์ธ ํ•„์ˆ˜ ํ‘œ์ค€ ๋„๊ตฌ๋กœ ์†Œ์Šค์—์„œ ๊ฐ•์กฐ๋˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [1, 2, 4]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ๊ฐ์†Œ ์›๋ฆฌ์™€ ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™” ๋ฉ”์ปค๋‹ˆ์ฆ˜. + +- [[์„œ๋ฒ„ ์ƒํƒœ (Server State)]] + - ์—ฐ๊ฒฐ ์ด์œ : API๋กœ๋ถ€ํ„ฐ ํŒจ์น˜(fetch)๋˜๋Š” ๋ฐ์ดํ„ฐ๋Š” ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ์™€ ์„ฑ๊ฒฉ์ด ์™„์ „ํžˆ ๋‹ฌ๋ผ ๋ณ„๋„์˜ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ๋น„๋™๊ธฐ ๊ด€๋ฆฌ์˜ ํ•ต์‹ฌ ์ „์ œ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [1]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์บ์‹ฑ ๋กœ๋”ฉ, ์—๋Ÿฌ ์‚ฌ์ดํด, ์„œ๋ฒ„ ๋ฐ์ดํ„ฐ ์ตœ์‹ ํ™” ๊ธฐ๋ฒ•. + +- [[๋””๋ฐ”์šด์‹ฑ(Debouncing) ๋ฐ ์“ฐ๋กœํ‹€๋ง(Throttling)]] + - ์—ฐ๊ฒฐ ์ด์œ : ์žฆ์€ ์‚ฌ์šฉ์ž ์ด๋ฒคํŠธ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ๋ฌด๋ถ„๋ณ„ํ•œ ๋น„๋™๊ธฐ API ํ˜ธ์ถœ์„ ์ œ์–ดํ•˜์—ฌ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ์ „๋žต์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [6, 7]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํ”„๋ก ํŠธ์—”๋“œ์—์„œ์˜ ๋„คํŠธ์›Œํฌ ์ตœ์ ํ™” ๋ฐ ๋Ÿฐํƒ€์ž„ ๋ณ‘๋ชฉ ํ˜„์ƒ ๋ฐฉ์ง€. + +- [[ํด๋ฆฐ์—… (Cleanup) ํ•จ์ˆ˜์™€ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋น„๋™๊ธฐ ์ž‘์—… ์™„๋ฃŒ ์ „ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ธ๋งˆ์šดํŠธ๋˜์—ˆ์„ ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์ž์› ๋‚ญ๋น„์™€ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋ง‰๋Š” ํ•„์ˆ˜ ๊ทœ์น™์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [8, 9]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: React ์ƒ๋ช…์ฃผ๊ธฐ(Lifecycle)์™€ ๊ฒฐํ•ฉ๋œ ์•ˆ์ „ํ•œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•. + +### Deeper Research Questions +- Zustand์™€ ๊ฐ™์€ ๊ฐ€๋ฒผ์šด ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋Œ€๊ทœ๋ชจ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜์  ํ•œ๊ณ„์™€ ํŒŒํŽธํ™” ๋ฌธ์ œ๋Š” ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ๋‚˜ํƒ€๋‚˜๋Š”๊ฐ€? [3, 5] +- RTK Query๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์บ์‹œ ๋ฌดํšจํ™”(cache invalidation) ๋ฐ ์ž๋™ ๋ฐ์ดํ„ฐ ์žฌ์š”์ฒญ ๊ธฐ๋Šฅ์˜ ๋‚ด๋ถ€ ์ž‘๋™ ๋ฐฉ์‹์€ ๋ฌด์—‡์ธ๊ฐ€? [4] +- TanStack Query๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฌดํ•œ ์Šคํฌ๋กค ๋ฐ ๋‚™๊ด€์  ์—…๋ฐ์ดํŠธ๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ, ์บ์‹œ ๋ ˆ์ด์–ด๋Š” ์–ด๋–ป๊ฒŒ ๋ฌด๊ฒฐ์„ฑ์„ ๋ณด์žฅํ•˜๋Š”๊ฐ€? [2] +- Feature-Sliced Design ๊ฐ™์€ ๋ชจ๋“ˆํ™”๋œ ํด๋” ๊ตฌ์กฐ์—์„œ API ์„ ์–ธ๊ณผ ๋น„๋™๊ธฐ ์ปค์Šคํ…€ ํ›…์€ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์บก์Аํ™”๋˜๊ณ  ํ˜ธ์ถœ๋˜๋Š”๊ฐ€? [2] +- `useEffect` ๋‚ด์˜ ๋น„๋™๊ธฐ ํ˜ธ์ถœ ์‹œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ์žก๊ธฐ ์œ„ํ•œ DevTools Heap Snapshot ๋ถ„์„ ๋ฐฉ๋ฒ•์€ ์–ด๋–ป๊ฒŒ ์ ์šฉ๋˜๋Š”๊ฐ€? [9] + +### Practical Application Contexts +- **Implementation:** UI ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ ๋น„๋™๊ธฐ ๋กœ์ง์„ ์ง์ ‘ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๊ณ , API ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋„คํŠธ์›Œํฌ ๋กœ์ง์„ ์ปค์Šคํ…€ ํ›…์œผ๋กœ ์ถ”์ถœํ•˜์—ฌ `features/` ํด๋” ํ•˜์œ„์— ๊ฒฉ๋ฆฌํ•˜์—ฌ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค [2, 10]. ๋˜ํ•œ `useEffect`๋ฅผ ํ†ตํ•œ ๊ตฌ๋… ์‹œ ํด๋ฆฐ์—… ํ•จ์ˆ˜๋ฅผ ๋ฐ˜๋“œ์‹œ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค [8]. +- **System Design:** ํ”„๋กœ์ ํŠธ ์„ค๊ณ„ ์‹œ ํด๋ผ์ด์–ธํŠธ ์ „์—ญ ์ƒํƒœ(์˜ˆ: UI ํ…Œ๋งˆ, ์–ธ์–ด)์™€ ์„œ๋ฒ„์—์„œ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋น„๋™๊ธฐ ์ƒํƒœ(์˜ˆ: ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ, ์•Œ๋ฆผ)๋ฅผ ์™„์ „ํžˆ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ฐ๊ธฐ ๋‹ค๋ฅธ ๋„๊ตฌ(Zustand + TanStack Query)๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค [1, 11]. +- **Operation / Maintenance:** Redux DevTools์™€ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ ์•ก์…˜์ด ์–ธ์ œ ํ˜ธ์ถœ๋˜์—ˆ๊ณ  ์„œ๋ฒ„ ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋–ป๊ฒŒ ์—…๋ฐ์ดํŠธ๋˜์—ˆ๋Š”์ง€ ํƒ€์ž„ํŠธ๋ž˜๋ธ” ๋””๋ฒ„๊น…(Time-travel debugging)์„ ์ง„ํ–‰ํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ์‹ ์†ํžˆ ํŒŒ์•…ํ•ฉ๋‹ˆ๋‹ค [12, 13]. +- **Learning Path:** ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„์˜ `useState`/`useEffect`๋ฅผ ํ†ตํ•œ ๋ฐ์ดํ„ฐ ํŒจ์นญ์˜ ํ•œ๊ณ„ ํ•™์Šต โ†’ ๋””๋ฐ”์šด์‹ฑ/๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฐฉ์ง€ ์›๋ฆฌ ์ดํ•ด โ†’ ์„œ๋ฒ„ ์ƒํƒœ์™€ ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ์˜ ์ฐจ์ด ์ธ์ง€ โ†’ TanStack Query/RTK Query๋ฅผ ํ†ตํ•œ ์ „๋ฌธ์ ์ธ ๋น„๋™๊ธฐ ์ƒํƒœ ๊ด€๋ฆฌ ๋งˆ์Šคํ„ฐ๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค [1, 3, 7, 8]. +- **My Project Relevance:** ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ, ๋ฐฉ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ์˜ ๋ฌดํ•œ ์Šคํฌ๋กค, ์‚ฌ์šฉ์ž ๊ฒ€์ƒ‰ ์‹œ์˜ ์ž๋™์™„์„ฑ(๋””๋ฐ”์šด์Šค ์ ์šฉ) ๊ธฐ๋Šฅ ๋“ฑ ๋ณต์žกํ•œ API ๊ธฐ๋ฐ˜ ๊ธฐ๋Šฅ์ด ์žˆ๋Š” ํ”„๋กœ์ ํŠธ์˜ ์„ฑ๋Šฅ ๋ฐ ์•„ํ‚คํ…์ฒ˜ ๊ฐœ์„ ์— ์ง์ ‘ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค [2, 6, 7]. + +### Adjacent Topics +- [[์ƒํƒœ ๊ด€๋ฆฌ ์•„ํ‚คํ…์ฒ˜ (State Management Architecture)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ(์„œ๋ฒ„ ์ƒํƒœ)์™€ ๋กœ์ปฌ ์ƒํƒœ, ์ „์—ญ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒํƒœ๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์—์„œ ์–ด๋–ป๊ฒŒ ์ƒํ˜ธ์ž‘์šฉํ•˜๊ณ  ์กฐํ™”๋กญ๊ฒŒ ๊ตฌ์„ฑ๋˜๋Š”์ง€ ํ™•์žฅํ•ด์„œ ์•Œ์•„๋ด…๋‹ˆ๋‹ค [1, 14]. +- [[์„ฑ๋Šฅ ํ”„๋กœํŒŒ์ผ๋ง ๋ฐ ๋ Œ๋”๋ง ์ตœ์ ํ™” (Performance Profiling & Rendering Optimization)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ์ž˜๋ชป๋œ ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง ํญํ’(re-render storm)์ด๋‚˜ ๋ณ‘๋ชฉ์„ ์ผ์œผํ‚ค๋Š”์ง€ ํŒŒ์•…ํ•˜๊ณ , React Profiler๋ฅผ ํ†ตํ•ด ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ํƒ์ง€ํ•˜๋Š”์ง€ ์•Œ์•„๋ด…๋‹ˆ๋‹ค [15-17]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/00_Raw/ํ”„๋ก ํŠธ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ Œ๋”๋ง ๋ณ‘๋ชฉ ๊ฐœ์„ .md b/00_Raw/ํ”„๋ก ํŠธ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ Œ๋”๋ง ๋ณ‘๋ชฉ ๊ฐœ์„ .md new file mode 100644 index 00000000..600727cc --- /dev/null +++ b/00_Raw/ํ”„๋ก ํŠธ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ Œ๋”๋ง ๋ณ‘๋ชฉ ๊ฐœ์„ .md @@ -0,0 +1,70 @@ +# [[ํ”„๋ก ํŠธ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ Œ๋”๋ง ๋ณ‘๋ชฉ ๊ฐœ์„ ]] + +## ๐Ÿ“Œ Brief Summary +ํ”„๋ก ํŠธ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ Œ๋”๋ง ๋ณ‘๋ชฉ์€ ๋ถˆํ•„์š”ํ•˜๊ฑฐ๋‚˜ ๊ณผ๋„ํ•œ ์ปดํฌ๋„ŒํŠธ ๋ฆฌ๋ Œ๋”๋ง์œผ๋กœ ์ธํ•ด UI ๋ฐ˜์‘์„ฑ์ด ๋–จ์–ด์ง€๊ณ  ์ƒํ˜ธ์ž‘์šฉ ์†๋„๊ฐ€ ์ง€์—ฐ๋˜๋Š” ํ˜„์ƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค [1, 2]. ์ด๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ Œ๋”๋ง ํŠธ๋ฆฌ๊ฑฐ(์ƒํƒœ, Props, Context ๋“ฑ)๋ฅผ ์‹๋ณ„ํ•˜๊ณ  ๋ฉ”๋ชจ์ด์ œ์ด์…˜, ๋ฆฌ์ŠคํŠธ ๊ฐ€์ƒํ™”, ์ƒํƒœ ๋ถ„๋ฆฌ, ๋™์‹œ์„ฑ ๋ Œ๋”๋ง(Concurrent Rendering) ๊ธฐ๋Šฅ ๋“ฑ์„ ํ™œ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [3, 4]. ์ง€์†์ ์ธ ํ”„๋กœํŒŒ์ผ๋ง์„ ํ†ตํ•ด ๋ Œ๋”๋ง ๋น„์šฉ์ด ๋†’์€ ๋ถ€๋ถ„์„ ์ธก์ •ํ•˜๊ณ  ์ „๋žต์ ์œผ๋กœ ์ตœ์ ํ™”๋ฅผ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค [5, 6]. + +## ๐Ÿ“– Core Content +* **๋ Œ๋”๋ง ๋ฐœ์ƒ ์›์ธ ํŒŒ์•… ๋ฐ ํ”„๋กœํŒŒ์ผ๋ง** + React ์ปดํฌ๋„ŒํŠธ๋Š” ์ƒํƒœ(State), Props, Context์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๊ฑฐ๋‚˜ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง๋  ๋•Œ ๋ฆฌ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค [4]. ์ด๋Ÿฌํ•œ ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํŠธ๋ฆฌ๊ฐ€ ๊นŠ์„ ๊ฒฝ์šฐ ์Šคํฌ๋ฆฝํŒ… ์‹œ๊ฐ„์„ 30~60% ์ฆ๊ฐ€์‹œ์ผœ ์„ฑ๋Šฅ์„ ์ €ํ•˜์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2]. ๋”ฐ๋ผ์„œ React DevTools Profiler๋‚˜ `why-did-you-render` ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ด ๋ Œ๋”๋ง ๋นˆ๋„์™€ ๋น„์šฉ์„ ์ธก์ •ํ•œ ๋’ค ์ตœ์ ํ™”๋ฅผ ์ง„ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [5, 7, 8]. +* **๋ฉ”๋ชจ์ด์ œ์ด์…˜(Memoization)๊ณผ ์ฐธ์กฐ ์•ˆ์ •์„ฑ** + `React.memo()`, `useCallback`, `useMemo`๋ฅผ ์ ์ ˆํžˆ ํ™œ์šฉํ•˜๋ฉด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์€ ์ปดํฌ๋„ŒํŠธ์˜ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ง‰์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [9, 10]. ๋‹จ, JSX ๋‚ด๋ถ€์— ์ต๋ช… ํ•จ์ˆ˜๋‚˜ ์ธ๋ผ์ธ ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์ •์˜ํ•˜์—ฌ Props๋กœ ๋„˜๊ธฐ๋ฉด ์–•์€ ๋น„๊ต(Shallow comparison) ํŠน์„ฑ์ƒ ๋งค ๋ Œ๋”๋ง๋งˆ๋‹ค ์ƒˆ๋กœ์šด ์ฐธ์กฐ๊ฐ€ ์ƒ์„ฑ๋˜์–ด ๋ฉ”๋ชจ์ด์ œ์ด์…˜์ด ๋ฌด๋ ฅํ™”๋˜๋ฏ€๋กœ ์ฐธ์กฐ๋ฅผ ์•ˆ์ •ํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [10-12]. +* **React Compiler๋ฅผ ํ†ตํ•œ ์ž๋™ํ™”** + 2025๋…„ ๊ธฐ์ค€ React Compiler๋Š” ๋นŒ๋“œ ํƒ€์ž„์— ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ •์ ์œผ๋กœ ๋ถ„์„ํ•˜์—ฌ JSX ์š”์†Œ ๋‹จ์œ„๊นŒ์ง€ ์„ธ๋ฐ€ํ•˜๊ฒŒ ์ž๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค [13, 14]. ์ด๋ฅผ ํ†ตํ•ด ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์˜ ๋ฒˆ๊ฑฐ๋กœ์›€์„ ์ค„์ด๊ณ  ๋ Œ๋”๋ง ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [15]. +* **Context API ์ตœ์ ํ™”์™€ ๊ธ€๋กœ๋ฒŒ ์ƒํƒœ ๋ถ„๋ฆฌ** + Context API๋Š” ๊ฐ’์ด ๋ณ€ํ•  ๋•Œ ํ•ด๋‹น ์ปจํ…์ŠคํŠธ๋ฅผ ๊ตฌ๋…ํ•˜๋Š” ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” "๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ์‹œ์Šคํ…œ"์œผ๋กœ ์ž‘๋™ํ•˜์—ฌ ํฐ ๋ณ‘๋ชฉ์„ ์œ ๋ฐœํ•ฉ๋‹ˆ๋‹ค [16, 17]. ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ปจํ…์ŠคํŠธ๋ฅผ ์ž‘์€ ๋„๋ฉ”์ธ ๋‹จ์œ„๋กœ ์ชผ๊ฐœ๊ฑฐ๋‚˜, Zustand ๋“ฑ ํŠน์ • ์ƒํƒœ ์Šฌ๋ผ์ด์Šค(Slice)๋งŒ ์„ ํƒ์ ์œผ๋กœ ๊ตฌ๋…(Selector)ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋ฒผ์šด ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฆฌ๋ Œ๋”๋ง์„ ์ œ์–ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [16, 18-20]. +* **๋™์‹œ์„ฑ ๊ธฐ๋Šฅ(Concurrent Features)์˜ ํ™œ์šฉ** + `useTransition`์„ ์‚ฌ์šฉํ•ด ์ค‘์š”ํ•˜์ง€ ์•Š์€ ์—…๋ฐ์ดํŠธ๋ฅผ ์ง€์—ฐ์‹œํ‚ด์œผ๋กœ์จ ํƒ€์ดํ•‘๊ณผ ๊ฐ™์€ ์ฆ‰๊ฐ์ ์ธ ์ƒํ˜ธ์ž‘์šฉ์ด ์ฐจ๋‹จ๋˜์ง€ ์•Š๊ฒŒ ํ•˜๊ณ , `useDeferredValue`๋กœ ๋ฌด๊ฑฐ์šด ํŒŒ์ƒ ๋ฐ์ดํ„ฐ์˜ ๋ Œ๋”๋ง์„ ๋ฏธ๋ฃจ์–ด UI์˜ ๋ฐ˜์‘์„ฑ์„ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [21-23]. +* **๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ ๊ฐ€์ƒํ™”(Virtualization) ๋ฐ ๋ฆฌ์ŠคํŠธ ์ตœ์ ํ™”** + 50~100๊ฐœ ์ด์ƒ์˜ ํ•ญ๋ชฉ์ด ์žˆ๋Š” ๊ธด ๋ชฉ๋ก์€ ๋‹ค์ˆ˜์˜ DOM ๋…ธ๋“œ ๋ Œ๋”๋ง์„ ์œ ๋ฐœํ•˜์—ฌ ๋ณ‘๋ชฉ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค [24, 25]. `react-window` ๋“ฑ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ™œ์šฉํ•ด ๋ทฐํฌํŠธ์— ๋ณด์ด๋Š” ํ•ญ๋ชฉ๋งŒ ๋ Œ๋”๋งํ•˜๋Š” ์œˆ๋„์œ™(Windowing) ๊ธฐ๋ฒ•์„ ์ ์šฉํ•˜๊ณ , ์•ˆ์ •์ ์ด๊ณ  ๊ณ ์œ ํ•œ `key`๋ฅผ ๋ถ€์—ฌํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ DOM ์žฌ์ƒ์„ฑ์„ ๋ง‰์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค [25-27]. + +## โš–๏ธ Trade-offs & Caveats +* **๋ฉ”๋ชจ์ด์ œ์ด์…˜ ์˜ค๋ฒ„ํ—ค๋“œ:** `React.memo()`, `useCallback`, `useMemo`๋Š” ๋‚จ์šฉ๋  ๊ฒฝ์šฐ ์„ฑ๋Šฅ์„ ์˜คํžˆ๋ ค ์•…ํ™”์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [28, 29]. ์ด์ „ Props์™€ ์ƒˆ Props๋ฅผ ๋น„๊ตํ•˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๋Š” ๊ณผ์ •์— ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋ Œ๋”๋ง ๋น„์šฉ์ด ์ €๋ ดํ•œ ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” ๋ Œ๋”๋ง ์ž์ฒด๋ณด๋‹ค ๋น„๊ต ์—ฐ์‚ฐ์˜ ๋น„์šฉ์ด ๋” ํด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [29]. +* **React Compiler์˜ ์ œ์•ฝ ์‚ฌํ•ญ:** React Compiler๋Š” ์ž๋™ ์ตœ์ ํ™”๋ฅผ ์ œ๊ณตํ•˜์ง€๋งŒ, 'Rules of React'๋ฅผ ์—„๊ฒฉํžˆ ์ค€์ˆ˜ํ•ด์•ผ ์ •์ƒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค [30, 31]. ๋˜ํ•œ ๋งค ๋ Œ๋”๋ง๋งˆ๋‹ค ์ƒˆ๋กœ์šด ์ฐธ์กฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ผ๋ถ€ ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ›…(์˜ˆ: TanStack Query์˜ `useMutation` ๋“ฑ)๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ์ฒด์ธ์ด ๋Š์–ด์ง€๋Š” ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [32, 33]. +* **Context API vs ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋„์ž…:** Context API๋Š” ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ถ”๊ฐ€ ์—†์ด ํ…Œ๋งˆ, ๋‹ค๊ตญ์–ด ๋“ฑ ์ •์  ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ์— ์šฉ์ดํ•˜์ง€๋งŒ [34], ์žฆ์€ ์ƒํƒœ ๋ณ€๊ฒฝ์—๋Š” ์„ฑ๋Šฅ ์ทจ์•ฝ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค [35]. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์™ธ๋ถ€ ์ƒํƒœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(Zustand ๋“ฑ)๋ฅผ ๋ฌด์กฐ๊ฑด ๋„์ž…ํ•˜๋ฉด ์ถ”๊ฐ€์ ์ธ ๋ฒˆ๋“ค ์šฉ๋Ÿ‰ ์ฆ๊ฐ€ ๋ฐ ํŒ€์˜ ํ•™์Šต ๊ณก์„ ์ด ์ˆ˜๋ฐ˜๋œ๋‹ค๋Š” ๋ฐ˜๋Œ€ ๊ธ‰๋ถ€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค [36, 37]. +* **์ต๋ช… ํ•จ์ˆ˜ ์ œ๊ฑฐ์— ๋”ฐ๋ฅธ ์ฝ”๋“œ ๋ณต์žก๋„ ์ฆ๊ฐ€:** ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ง‰๊ณ ์ž ๋ชจ๋“  ์ธ๋ผ์ธ ํ•จ์ˆ˜๋ฅผ ์™ธ๋ถ€๋กœ ๋นผ๊ฑฐ๋‚˜ `useCallback`์œผ๋กœ ๊ฐ์‹ธ๋ฉด ์ฝ”๋“œ๊ฐ€ ๊ธธ์–ด์ง€๊ณ  ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [38]. ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ž‘๊ณ  ์„ฑ๋Šฅ ์˜ํ–ฅ์ด ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” ์ต๋ช… ํ•จ์ˆ˜ ์‚ฌ์šฉ์ด ์‹ค์šฉ์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [38]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] +- [[Context API]] + - ์—ฐ๊ฒฐ ์ด์œ : ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ ๊นŠ์€ ๊ณณ๊นŒ์ง€ ์ƒํƒœ๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์œผ๋‚˜ ๊ตฌ๋… ์ค‘์ธ ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฆฌ๋ Œ๋”๋ง์‹œํ‚ค๋Š” ํŠน์„ฑ์ƒ ๋ Œ๋”๋ง ๋ณ‘๋ชฉ์˜ ์ฃผ์š” ์›์ธ์ด ๋ฉ๋‹ˆ๋‹ค [17]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ๊ธฐ๋ฐ˜ ์ƒํƒœ ๊ด€๋ฆฌ์˜ ํ•œ๊ณ„์™€ ๋ฆฌ๋ Œ๋”๋ง ๋ฐœ์ƒ ๋ฒ”์œ„๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[Concurrent Rendering]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋ Œ๋”๋ง ์ž‘์—…์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋ถ€์—ฌํ•˜๊ณ  ์ค‘๋‹จ/์žฌ๊ฐœํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ์ˆ ๋กœ, `useTransition` ๋“ฑ์„ ํ†ตํ•ด ๋ฌด๊ฑฐ์šด ๋ Œ๋”๋ง์ด ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋ฅผ ๋ง‰๋Š” ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค [21]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ฐ˜์‘์„ฑ ์ง€ํ‘œ(INP ๋“ฑ)๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•œ ๋ Œ๋”๋ง ์Šค์ผ€์ค„๋ง ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[React Compiler]] + - ์—ฐ๊ฒฐ ์ด์œ : ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์˜ ํ•œ๊ณ„๋ฅผ ๊ทน๋ณตํ•˜๊ณ  ๋นŒ๋“œ ํƒ€์ž„์— ์ž๋™์œผ๋กœ JSX ์š”์†Œ ๋‹จ์œ„์˜ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์ ์šฉํ•˜์—ฌ ๋ Œ๋”๋ง ์ตœ์ ํ™”๋ฅผ ๋‹ฌ์„ฑํ•ฉ๋‹ˆ๋‹ค [13, 14]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ตœ์‹  React์˜ ๋ Œ๋”๋ง ์ตœ์ ํ™”๊ฐ€ ๋Ÿฐํƒ€์ž„ ์ œ์–ด์—์„œ ์ปดํŒŒ์ผ๋Ÿฌ ๊ธฐ๋ฐ˜ ์ •์  ๋ถ„์„์œผ๋กœ ๋„˜์–ด๊ฐ€๋Š” ๊ธฐ์ˆ ์  ์ง„ํ™”๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +#### [๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ] +- [[Zustand]] + - ์—ฐ๊ฒฐ ์ด์œ : ์…€๋ ‰ํ„ฐ(Selector) ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•ด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ž์‹ ์ด ํ•„์š”ํ•œ ์ƒํƒœ ์กฐ๊ฐ(Slice)์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งŒ ๋ฆฌ๋ Œ๋”๋ง๋˜๋„๋ก ๋ณด์žฅํ•˜์—ฌ ๋ณ‘๋ชฉ์„ ์ค„์ด๋Š” ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค [18]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ „์—ญ ์ƒํƒœ์˜ ํŒŒํŽธํ™” ๊ด€๋ฆฌ์™€ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ์ฐจ๋‹จํ•˜๋Š” ๊ตฌ๋… ์ตœ์ ํ™” ํŒจํ„ด์„ ํ•™์Šตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[List Virtualization (Windowing)]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋Œ€๊ทœ๋ชจ ๋ฆฌ์ŠคํŠธ์—์„œ ์‚ฌ์šฉ์ž์˜ ํ™”๋ฉด ๋ทฐํฌํŠธ์— ์กด์žฌํ•˜๋Š” DOM ๋…ธ๋“œ๋งŒ ์ œํ•œ์ ์œผ๋กœ ๋ Œ๋”๋งํ•˜์—ฌ DOM ํŠธ๋ฆฌ ๋น„๋Œ€ํ™”๋ฅผ ๋ง‰์Šต๋‹ˆ๋‹ค [25, 26]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋‹ค์ˆ˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ Œ๋”๋งํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ฐ ๋ ˆ์ด์•„์›ƒ ํŽ˜์ธํŒ… ๋ณ‘๋ชฉ์„ ์ œ์–ดํ•˜๋Š” ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### Deeper Research Questions +- React Compiler๋Š” ๋นŒ๋“œ ํƒ€์ž„์— ๋ช…์‹œ์ ์ธ ์˜์กด์„ฑ ๋ฐฐ์—ด ์—†์ด ์–ด๋–ป๊ฒŒ ๋‚ด๋ถ€ JSX ๋…ธ๋“œ๋ณ„ ์บ์‹ฑ ๋ฐ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๋‹จ์œ„๋ฅผ ๊ฒฐ์ •ํ•˜๋Š”๊ฐ€? +- Context API์˜ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ๋ฆฌ๋ Œ๋”๋ง ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” `use-context-selector`์˜ ์›๋ฆฌ๋Š” ๋ฌด์—‡์ด๋ฉฐ, Zustand์˜ ๊ตฌ๋… ์ตœ์ ํ™” ๋ฐฉ์‹๊ณผ ๊ตฌ์กฐ์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ๊ฐ€? +- `useTransition`๊ณผ `useDeferredValue`๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ์‚ฌ์šฉํ•  ๋•Œ, ๋ธŒ๋ผ์šฐ์ €์˜ ํŽ˜์ธํŠธ ์ฃผ๊ธฐ(Paint Cycle) ๊ด€์ ์—์„œ ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง์€ ์–ด๋–ป๊ฒŒ ์Šค์ผ€์ค„๋ง ๋ฐ ์ง€์—ฐ๋˜๋Š”๊ฐ€? +- ๋Œ€ํ˜• ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ List Virtualization๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ์Šคํฌ๋กค ์ด๋ฒคํŠธ ๋””๋ฐ”์šด์‹ฑ(Debouncing) ํ˜น์€ ์“ฐ๋กœํ‹€๋ง(Throttling) ์ตœ์ ํ™”์˜ ๊ธฐ์ˆ ์  ํ•œ๊ณ„์ ์€ ๋ฌด์—‡์ธ๊ฐ€? +- ์ƒํƒœ ๊ด€๋ฆฌ ์•„ํ‚คํ…์ฒ˜ ๊ด€์ ์—์„œ, Feature-Sliced Design(FSD)๊ณผ ๊ฐ™์ด ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ํด๋” ๋ฐ ๊ตฌ์กฐ์  ์„ค๊ณ„๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฆฌ๋ Œ๋”๋ง ๋ฒ”์œ„๋ฅผ ์ œํ•œํ•˜๋Š” ๋ฐ ์–ด๋–ป๊ฒŒ ๊ธฐ์—ฌํ•˜๋Š”๊ฐ€? + +### Practical Application Contexts +- **Implementation:** Props๋กœ ์ „๋‹ฌํ•˜๋Š” ํ•จ์ˆ˜๋‚˜ ๊ฐ์ฒด๋Š” ์ต๋ช… ์ƒ์„ฑ(์ธ๋ผ์ธ)์„ ์ง€์–‘ํ•˜๊ณ  `useCallback`์ด๋‚˜ ์™ธ๋ถ€ ์„ ์–ธ์œผ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ์ฐธ์กฐ ๋ฌด๊ฒฐ์„ฑ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜๋ฐฑ ๊ฐœ ์ด์ƒ์˜ ํ•ญ๋ชฉ์„ ๋ Œ๋”๋งํ•  ๊ฒฝ์šฐ `react-window`์™€ ๊ฐ™์€ ๊ฐ€์ƒํ™” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์˜๋ฌด์ ์œผ๋กœ ๋„์ž…ํ•ฉ๋‹ˆ๋‹ค. +- **System Design:** ๋นˆ๋ฒˆํžˆ ์—…๋ฐ์ดํŠธ๋˜๋Š” ์ƒํƒœ(์˜ˆ: ์•Œ๋ฆผ ๊ฐœ์ˆ˜, ์žฅ๋ฐ”๊ตฌ๋‹ˆ)๋Š” Context API ๋Œ€์‹  Zustand ๋“ฑ์˜ ์„ ํƒ์  ๊ตฌ๋…์ด ๊ฐ€๋Šฅํ•œ ์Šคํ† ์–ด์— ๋ฐฐ์น˜ํ•˜๊ณ , ์ •์  ๋ฐ์ดํ„ฐ(ํ…Œ๋งˆ ๋“ฑ)๋Š” Context๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ Œ๋”๋ง ์ „ํŒŒ ๋ฒ”์œ„๋ฅผ ์‹œ์Šคํ…œ ๋ ˆ๋ฒจ์—์„œ ๊ฒฉ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. +- **Operation / Maintenance:** `why-did-you-render` ํŒจํ‚ค์ง€์™€ React DevTools์˜ Profiler ํŒจ๋„์„ ์ด์šฉํ•ด ๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ฐ˜๋ณต ๋ Œ๋”๋ง๋˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ฐพ์•„๋‚ด๊ณ , ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋Š” Core Web Vitals(INP, FCP ๋“ฑ)๋ฅผ ์ถ”์ ํ•˜์—ฌ ์ƒํ˜ธ์ž‘์šฉ ์ง€์—ฐ์ด ์žˆ๋Š”์ง€ ๋ชจ๋‹ˆํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค. +- **Learning Path:** React์˜ ๋ Œ๋”๋ง ์กฐ๊ฑด(State, Props, Parent) ์ดํ•ด -> ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๋„๊ตฌ ์ˆ™๋‹ฌ -> Context API์˜ ์„ฑ๋Šฅ ํ•œ๊ณ„ ์ฒด๊ฐ ๋ฐ Zustand ํ™œ์šฉ -> Concurrent Features ์ ์šฉ -> React Compiler๋ฅผ ์ด์šฉํ•œ ์ž๋™ํ™” ํ๋ฆ„์œผ๋กœ ๋ Œ๋”๋ง ์ตœ์ ํ™” ์ง€์‹์„ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค. +- **My Project Relevance:** ํ˜„์žฌ ์œ ์ง€ ๋ณด์ˆ˜ํ•˜๊ฑฐ๋‚˜ ์‹ ๊ทœ ๊ตฌ์ถ•ํ•˜๋Š” React ์›น ์•ฑ์—์„œ ์Šคํฌ๋กค ๋Š๊น€์ด๋‚˜ ํด๋ฆญ ์‹œ ๋ฐ˜์‘ ์ง€์—ฐ์ด ๋ฐœ์ƒํ•  ๋•Œ, ํ•ด๋‹น ๊ฐœ๋…์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ณ‘๋ชฉ์ด ๋˜๋Š” ์ปดํฌ๋„ŒํŠธ์˜ ๋ Œ๋”๋ง ํšŸ์ˆ˜๋ฅผ ์ธก์ •ํ•˜๊ณ  ์ ์ ˆํ•œ ์ตœ์ ํ™” ๋„๊ตฌ๋ฅผ ์ฆ‰๊ฐ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### Adjacent Topics +- [[Server Components (Next.js)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋ธŒ๋ผ์šฐ์ €์—์„œ์˜ ๋ Œ๋”๋ง ๋ถ€ํ•˜๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด ํด๋ผ์ด์–ธํŠธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค์„ ์ตœ์†Œํ™”ํ•˜๊ณ  ์„œ๋ฒ„์—์„œ ์ •์  UI๋ฅผ ๋ Œ๋”๋งํ•˜์—ฌ ๋„˜๊ฒจ์ฃผ๋Š” ์•„ํ‚คํ…์ฒ˜์  ์ตœ์ ํ™”์— ๋Œ€ํ•ด ์‹ฌ๋„ ์žˆ๊ฒŒ ์กฐ์‚ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [39-41]. +- [[JavaScript Memory Leaks]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๊ณผ๋„ํ•œ ๋ Œ๋”๋ง ์™ธ์—๋„ ํด๋กœ์ €๋‚˜ ๋ถ„๋ฆฌ๋œ DOM ๋…ธ๋“œ์— ์˜ํ•ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•ด์ œ๋˜์ง€ ์•Š๊ณ  ๋ˆ„์ ๋˜์–ด ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์ผ์œผํ‚ค๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ์‹๋ณ„ ๋ฐ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์œผ๋กœ ์ดํ•ด๋ฅผ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค [42-44]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Development/Code Splitting.md b/10_Wiki/Development/Code Splitting.md new file mode 100644 index 00000000..96aa31b1 --- /dev/null +++ b/10_Wiki/Development/Code Splitting.md @@ -0,0 +1,58 @@ +# [[Code Splitting]] + +## ๐Ÿ“Œ Brief Summary +ํฐ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค์„ ๋” ์ž‘์€ ์ฒญํฌ(chunk) ๋‹จ์œ„๋กœ ๋‚˜๋ˆ„์–ด ์‚ฌ์šฉ์ž๊ฐ€ ํ•„์š”๋กœ ํ•  ๋•Œ(on demand) ๋กœ๋“œํ•˜๋Š” ํ”„๋กœ์„ธ์Šค์ž…๋‹ˆ๋‹ค [1, 2]. ๋ชจ๋“  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋ฅผ ์ดˆ๊ธฐ์— ํ•œ ๋ฒˆ์— ๋‹ค์šด๋กœ๋“œํ•˜๋Š” ๋Œ€์‹ , ํ•„์š”ํ•œ ํŒŒ์ผ๋งŒ ๋จผ์ € ๋ถˆ๋Ÿฌ์˜ค๊ฒŒ ํ•˜์—ฌ ์ดˆ๊ธฐ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ๊ทน์ ์œผ๋กœ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2, 3]. ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ดˆ๊ธฐ ํŽ˜์ด์ง€ ๋กœ๋“œ ์†๋„๋ฅผ ํ–ฅ์ƒ์‹œํ‚ค๊ณ , ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ฒด๊ฐ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•˜๋Š” ํ•ต์‹ฌ์ ์ธ ํ”„๋ก ํŠธ์—”๋“œ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค [1, 4]. + +## ๐Ÿ“– Core Content +* **๋ผ์šฐํŠธ ๊ธฐ๋ฐ˜ ๋ถ„ํ•  (Route-level Code Splitting):** ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ด๊ณ  ํšจ๊ณผ์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ํŠน์ • ๋ผ์šฐํŠธ๋กœ ์ด๋™ํ•  ๋•Œ๋งŒ ํ•ด๋‹น ํŽ˜์ด์ง€์˜ ์ฝ”๋“œ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๋„๋ก ํ•˜์—ฌ ์ดˆ๊ธฐ ๋กœ๋”ฉ ์‹œ ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ ๋‹ค์šด๋กœ๋“œ๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค [1, 2, 5]. +* **์ปดํฌ๋„ŒํŠธ ์ˆ˜์ค€ ์ง€์—ฐ ๋กœ๋”ฉ (Component-level Lazy Loading):** ์ฐจํŠธ, ์ง€๋„, ๋ฆฌ์น˜ ํ…์ŠคํŠธ ์—๋””ํ„ฐ์ฒ˜๋Ÿผ ํฌ๊ณ  ๋ฌด๊ฑฐ์šด ์ปดํฌ๋„ŒํŠธ๋‚˜ ๋“œ๋ฌผ๊ฒŒ ์‚ฌ์šฉ๋˜๋Š” ๋ชจ๋‹ฌ, ์„ค์ • ํŒจ๋„ ๋“ฑ์„ ๋ Œ๋”๋ง์ด ํ•„์š”ํ•œ ์‹œ์ ์—๋งŒ ๋กœ๋“œํ•˜๋„๋ก ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค [6, 7]. React์—์„œ๋Š” `React.lazy()`์™€ ๋™์  ์ž„ํฌํŠธ(dynamic imports), ๊ทธ๋ฆฌ๊ณ  ``๋ฅผ ํ™œ์šฉํ•ด ์ด๋ฅผ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [4, 6, 8]. +* **๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ถ„ํ•  (Vendor Splitting):** Vite(๋‚ด๋ถ€์ ์œผ๋กœ Rollup ์‚ฌ์šฉ) ๋“ฑ์˜ ๋ฒˆ๋“ค๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ `manualChunks` ์˜ต์…˜์„ ํ†ตํ•ด React ์ฝ”์–ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜ ์ฐจํŠธ ๋“ฑ ๋ฌด๊ฑฐ์šด ๋ฒค๋” ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ ํŒŒ์ผ๋กœ ๋ถ„ํ• ํ•ฉ๋‹ˆ๋‹ค [5, 9, 10]. ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ž์ฃผ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ธŒ๋ผ์šฐ์ € ์บ์‹ฑ ํšจ์œจ์„ ๊ทน๋Œ€ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5, 11]. +* **๋ฒˆ๋“ค๋Ÿฌ์˜ ์ž๋™ํ™” ์ง€์›:** ์ตœ์‹  ๋ฒˆ๋“ค๋Ÿฌ(Webpack, Vite)๋Š” ์ฝ”๋“œ ๋‚ด์— ์ž‘์„ฑ๋œ ๋™์  ์ž„ํฌํŠธ(`import()`)๋ฅผ ๊ฐ์ง€ํ•˜๋ฉด ์ž๋™์œผ๋กœ ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ ์ฒญํฌ๋กœ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค [4, 6]. + +## โš–๏ธ Trade-offs & Caveats +* **ํ•„์ˆ˜ ์ปดํฌ๋„ŒํŠธ์— ๋Œ€ํ•œ ์˜ค๋‚จ์šฉ ๊ธˆ์ง€:** ํŽ˜์ด์ง€์— ์ฆ‰์‹œ ํ•„์š”ํ•œ ์Šคํฌ๋กค ์—†์ด ๋ณผ ์ˆ˜ ์žˆ๋Š”(above-the-fold) ํ•ต์‹ฌ ์ปดํฌ๋„ŒํŠธ๋‚˜, ๋ Œ๋”๋ง ์†๋„๊ฐ€ ๋นจ๋ผ์•ผ ํ•˜๋Š” ์š”์†Œ์—๋Š” ์ง€์—ฐ ๋กœ๋”ฉ๊ณผ ์ฝ”๋“œ ๋ถ„ํ• ์„ ํ”ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [7]. ์˜คํžˆ๋ ค ์ฒซ ํ™”๋ฉด์„ ๊ทธ๋ฆฌ๋Š” ์‹œ๊ฐ„์„ ์ง€์—ฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +* **์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ์ €ํ•˜ ๋ฐฉ์ง€ (Fallback UI ํ•„์š”):** ์ฝ”๋“œ๋ฅผ ๋™์ ์œผ๋กœ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋™์•ˆ ๋„คํŠธ์›Œํฌ ์ง€์—ฐ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ``๋ฅผ ์‚ฌ์šฉํ•ด ๋ชจ๋“ˆ์ด ๋กœ๋“œ๋˜๋Š” ๋™์•ˆ ์Šคํ”ผ๋„ˆ๋‚˜ ์Šค์ผˆ๋ ˆํ†ค๊ณผ ๊ฐ™์€ Fallback UI๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [5, 8]. +* **๋„คํŠธ์›Œํฌ ์š”์ฒญ ์ฆ๊ฐ€์˜ ์œ„ํ—˜:** ๋„ˆ๋ฌด ์ž˜๊ฒŒ ์ฝ”๋“œ๋ฅผ ๋ถ„ํ• ํ•˜๋ฉด ์˜คํžˆ๋ ค ์ˆ˜๋งŽ์€ ๋„คํŠธ์›Œํฌ ์š”์ฒญ์ด ๋ฐœ์ƒํ•ด ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ๋Š” `rollup-plugin-visualizer` ๋“ฑ์˜ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ด 500kB ์ด์ƒ์˜ ํฐ ์ฒญํฌ๋ฅผ ํƒ€๊ฒŸ์œผ๋กœ ์‹๋ณ„ํ•˜๊ณ  ์ ์ ˆํ•˜๊ฒŒ ๋ถ„ํ• ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [12, 13]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] +- [[Lazy Loading]] + - ์—ฐ๊ฒฐ ์ด์œ : ์ฝ”๋“œ ๋ถ„ํ• ์ด ๋ฒˆ๋“ค์„ ์ชผ๊ฐœ๋Š” ํ–‰์œ„๋ผ๋ฉด, ์ง€์—ฐ ๋กœ๋”ฉ(Lazy Loading)์€ ๊ทธ ์ชผ๊ฐœ์ง„ ์ฝ”๋“œ๋ฅผ ํ•„์š” ์‹œ์ ์— ๋กœ๋“œํ•˜๋Š” ๊ธฐ์ˆ ์  ๋ฐฉ๋ฒ•๋ก ์ž…๋‹ˆ๋‹ค [2, 3]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ถ„ํ• ๋œ ์ฝ”๋“œ๊ฐ€ ์–ธ์ œ ๋ธŒ๋ผ์šฐ์ €๋กœ ์ „์†ก๋˜๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋ณ‘ํ•ฉ๋˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [8]. +- [[Core Web Vitals]] + - ์—ฐ๊ฒฐ ์ด์œ : ์ฝ”๋“œ ๋ถ„ํ• ์„ ์ ์šฉํ•˜๋Š” ์ฃผ๋œ ์„ฑ๋Šฅ์  ๋ชฉ์ ์€ ์ดˆ๊ธฐ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰์„ ์ตœ์†Œํ™”ํ•˜์—ฌ LCP(Largest Contentful Paint)์™€ INP(Interaction to Next Paint) ๊ฐ™์€ ํ•ต์‹ฌ ์›น ์ง€ํ‘œ๋ฅผ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๋ฐ ์žˆ์Šต๋‹ˆ๋‹ค [1, 8, 14]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ตœ์ ํ™” ๊ฒฐ๊ณผ๊ฐ€ ์‹ค์ œ ์‚ฌ์šฉ์ž์˜ ์ฒด๊ฐ ์„ฑ๋Šฅ ๋ฐ ํŽ˜์ด์ง€ ์ธก์ • ์ง€ํ‘œ์— ์–ด๋–ป๊ฒŒ ๊ธ์ •์  ์˜ํ–ฅ์„ ์ฃผ๋Š”์ง€ ํ‰๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [15]. + +#### [๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ] +- [[React.lazy() and Suspense]] + - ์—ฐ๊ฒฐ ์ด์œ : React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ปดํฌ๋„ŒํŠธ ๋ ˆ๋ฒจ ๋ฐ ๋ผ์šฐํŠธ ๋ ˆ๋ฒจ์˜ ๋™์  ์ฝ”๋“œ ๋ถ„ํ• ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๊ณต์‹ API์ž…๋‹ˆ๋‹ค [6, 8]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋™์  ์ž„ํฌํŠธ ์ฒ˜๋ฆฌ ๊ณผ์ •์—์„œ์˜ ๋น„๋™๊ธฐ UI ๋ Œ๋”๋ง ํ๋ฆ„๊ณผ ์˜ˆ์™ธ(์ง€์—ฐ) ์ฒ˜๋ฆฌ ๋ฐฉ์‹์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5]. +- [[Vite (Rollup)]] + - ์—ฐ๊ฒฐ ์ด์œ : ๊ฐœ๋ฐœ ๋ฐ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฒˆ๋“ค๋งํ•˜๊ณ  ์‹ค์ œ ๋ฌผ๋ฆฌ์ ์ธ ์ฒญํฌ ํŒŒ์ผ๋“ค๋กœ ๋ถ„๋ฆฌํ•ด ๋‚ด๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค [9, 11]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ฒˆ๋“ค๋Ÿฌ์˜ `manualChunks` ์„ค์ •์„ ํ†ตํ•ด ์–ด๋–ป๊ฒŒ ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๋‚˜๋ˆ„์–ด ๋ธŒ๋ผ์šฐ์ € ์บ์‹ฑ์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5]. + +### Deeper Research Questions +- ๋ผ์šฐํŠธ ๊ธฐ๋ฐ˜ ๋ถ„ํ• ๊ณผ ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜ ๋ถ„ํ• ์„ ์–ด๋А ์ •๋„ ๋น„์œจ๋กœ ์ ์šฉํ•ด์•ผ ์ดˆ๊ธฐ ๋ Œ๋”๋ง ์„ฑ๋Šฅ๊ณผ ์ดํ›„ ํƒ์ƒ‰ ์‹œ์˜ ๋„คํŠธ์›Œํฌ ์ง€์—ฐ ๊ฐ„์˜ ๊ท ํ˜•์„ ์ด๋ฃฐ ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- Vite๋‚˜ Webpack ํ™˜๊ฒฝ์—์„œ `manualChunks`๋ฅผ ์„ค์ •ํ•  ๋•Œ, ๋ธŒ๋ผ์šฐ์ €์˜ HTTP/2 ๋ฐ HTTP/3 ๋‹ค์ค‘ํ™”(multiplexing) ํ™˜๊ฒฝ์„ ๊ณ ๋ คํ•œ ๊ฐ€์žฅ ์ด์ƒ์ ์ธ ์ฒญํฌ ๊ฐœ์ˆ˜์™€ ํฌ๊ธฐ๋Š” ๋ฌด์—‡์ธ๊ฐ€? +- ๋™์  ์ฒญํฌ(chunk)๋ฅผ ๋กœ๋“œํ•˜๋Š” ๋„์ค‘ ์‚ฌ์šฉ์ž์˜ ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ์ด ๋Š๊ธฐ๊ฑฐ๋‚˜ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ, React Error Boundaries์™€ ๊ฒฐํ•ฉํ•˜์—ฌ ์–ด๋–ป๊ฒŒ ์•ˆ์ •์ ์ธ Fallback ๊ฒฝํ—˜์„ ์„ค๊ณ„ํ•  ๊ฒƒ์ธ๊ฐ€? +- ์ฝ”๋“œ ๋ถ„ํ• ๋กœ ์ธํ•ด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ง€์—ฐ ๋กœ๋“œ๋  ๋•Œ, ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์˜์กดํ•˜๋Š” ์ƒํƒœ(Context, Zustand ๋“ฑ)๋Š” ๋กœ๋“œ ์‹œ์ ์— ์–ด๋–ป๊ฒŒ ๋™๊ธฐํ™”๋˜๋Š”๊ฐ€? +- Above-the-fold UI์— ์ž˜๋ชป ์ง€์—ฐ ๋กœ๋”ฉ์„ ์ ์šฉํ–ˆ์„ ๋•Œ LCP ์ ์ˆ˜์— ๋ฏธ์น˜๋Š” ์•…์˜ํ–ฅ์„ ํ™•์ธํ•˜๋ ค๋ฉด ๋ธŒ๋ผ์šฐ์ € ๊ฐœ๋ฐœ์ž ๋„๊ตฌ์˜ ์„ฑ๋Šฅ(Performance) ํŒจ๋„์—์„œ ์–ด๋–ค ์ง€ํ‘œ๋ฅผ ์ค‘์ ์ ์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋งํ•ด์•ผ ํ•˜๋Š”๊ฐ€? + +### Practical Application Contexts +- **Implementation:** React ์ฝ”๋“œ์—์„œ `import { Chart } from 'chart.js'`์™€ ๊ฐ™์€ ์ •์  ์ž„ํฌํŠธ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ , `const HeavyComponent = React.lazy(() => import('./HeavyComponent'))`๋กœ ๊ฐ์‹ธ์„œ ํŠน์ • ๋ฒ„ํŠผ์ด ๋ˆŒ๋ฆฌ๊ฑฐ๋‚˜ ๋ผ์šฐํŠธ๊ฐ€ ์ „ํ™˜๋  ๋•Œ ๋ Œ๋”๋ง๋˜๊ฒŒ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค [4, 6, 8]. +- **System Design:** ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ ์‹œ, ๋ชจ๋“  ์ฝ”๋“œ๊ฐ€ ํฌํ•จ๋œ ํ•˜๋‚˜์˜ `index.js` ๋ชจ๋†€๋ฆฌ์Šค ๋ฒˆ๋“ค ๋Œ€์‹ , Vite์˜ `vite.config.ts`์—์„œ `manualChunks` ์„ค์ •์„ ํ†ตํ•ด React ์ฝ”์–ด ๋ฐ ๋ฌด๊ฑฐ์šด ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ณ„๊ฐœ์˜ ์บ์‹ฑ ๊ฐ€๋Šฅํ•œ ์ฒญํฌ๋กœ ๋ถ„๋ฆฌํ•˜๋„๋ก ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค [5, 10]. +- **Operation / Maintenance:** CI/CD ํŒŒ์ดํ”„๋ผ์ธ์ด๋‚˜ ๋กœ์ปฌ ๋นŒ๋“œ ๊ณผ์ •์— `rollup-plugin-visualizer` ๋“ฑ์˜ ๋ฒˆ๋“ค ๋ถ„์„ ๋„๊ตฌ๋ฅผ ์—ฐ๊ฒฐํ•˜์—ฌ ์‹œ๊ฐ์  ํŠธ๋ฆฌ๋งต์„ ํ™•์ธํ•˜๊ณ , 500kB๋ฅผ ์ดˆ๊ณผํ•˜๋Š” ๊ฑฐ๋Œ€ ์ฒญํฌ๊ฐ€ ๋ฐœ๊ฒฌ๋˜๋ฉด ์ถ”๊ฐ€์ ์ธ ๋ถ„ํ•  ๋Œ€์ƒ์„ ์‹๋ณ„ํ•˜์—ฌ ์ตœ์ ํ™”ํ•ฉ๋‹ˆ๋‹ค [4, 12, 13]. +- **Learning Path:** ์šฐ์„  React์˜ ๋ฒˆ๋“ค๋ง ๊ฐœ๋…์„ ์ดํ•ดํ•œ ํ›„, ๋™์  ์ž„ํฌํŠธ ๊ตฌ๋ฌธ ํ™œ์šฉ -> `React.lazy()` ๋ฐ `` ์ ์šฉ -> ๋ผ์šฐํ„ฐ์— ์ฝ”๋“œ ๋ถ„ํ•  ๊ฒฐํ•ฉ -> ๋ฒˆ๋“ค ๋ถ„์„๊ธฐ ๋ฐ Core Web Vitals ์ธก์ •์„ ํ†ตํ•œ ํšจ๊ณผ ๊ฒ€์ฆ ์ˆœ์„œ๋กœ ์ง€์‹์„ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค [6, 8]. +- **My Project Relevance:** ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๊ฐ€ ์ปค์ง์— ๋”ฐ๋ผ ๋ฉ”์ธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค์ด ์ˆ˜ ๋ฉ”๊ฐ€๋ฐ”์ดํŠธ ๋‹จ์œ„๋กœ ๋ฌด๊ฑฐ์›Œ์ ธ ๋ชจ๋ฐ”์ผ ๊ธฐ๊ธฐ ๋“ฑ์—์„œ ๋กœ๋”ฉ ์†๋„ ์ €ํ•˜ ํ˜„์ƒ์ด ๋ณด์ผ ๊ฒฝ์šฐ, ์ฆ‰๊ฐ์ ์œผ๋กœ ๋ผ์šฐํŠธ ๊ธฐ๋ฐ˜ ์ฝ”๋“œ ๋ถ„ํ• ๊ณผ ์ฐจํŠธ/์—๋””ํ„ฐ ๋“ฑ ๋ฌด๊ฑฐ์šด UI์˜ ์ง€์—ฐ ๋กœ๋”ฉ์„ ๋„์ž…ํ•˜์—ฌ LCP ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3, 14, 16]. + +### Adjacent Topics +- [[Tree Shaking]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ์ฝ”๋“œ ๋ถ„ํ• ์ด ํ•„์š”ํ•œ ์ฝ”๋“œ๋ฅผ '์ชผ๊ฐœ์–ด' ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ์‹์ด๋ผ๋ฉด, ํŠธ๋ฆฌ ์‰์ดํ‚น์€ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์ฃฝ์€ ์ฝ”๋“œ(Dead Code) ์ž์ฒด๋ฅผ ๋ฒˆ๋“ค์—์„œ '์ œ๊ฑฐ'ํ•˜์—ฌ ์ดˆ๊ธฐ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ค„์ด๋Š” ์ƒํ˜ธ ๋ณด์™„์ ์ธ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค [17, 18]. +- [[Server Components (Next.js)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ์˜ ์ฝ”๋“œ ๋ถ„ํ• ์—์„œ ๋” ๋‚˜์•„๊ฐ€, ์•„์˜ˆ ์ •์ ์ธ UI ๋ Œ๋”๋ง์„ ์„œ๋ฒ„์—์„œ ์ฒ˜๋ฆฌํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ๋กœ ๋ณด๋‚ด๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค์˜ ์–‘ ์ž์ฒด๋ฅผ ํš๊ธฐ์ ์œผ๋กœ ์ค„์ด๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•˜๋Š” ์ตœ์‹  ์•„ํ‚คํ…์ฒ˜ ์ ‘๊ทผ๋ฒ•์ž…๋‹ˆ๋‹ค [19-21]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Development/Concurrent Features.md b/10_Wiki/Development/Concurrent Features.md new file mode 100644 index 00000000..2c5c54ed --- /dev/null +++ b/10_Wiki/Development/Concurrent Features.md @@ -0,0 +1,56 @@ +# [[Concurrent Features]] + +## ๐Ÿ“Œ Brief Summary +Concurrent Features๋Š” React 18๋ถ€ํ„ฐ ๋„์ž…๋œ ๊ธฐ๋Šฅ์œผ๋กœ, ๋ Œ๋”๋ง ์ž‘์—…์„ ์ผ์‹œ ์ค‘์ง€(pause), ์ค‘๋‹จ(interrupt), ์žฌ๊ฐœ(resume)ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค [1]. ์ด๋ฅผ ํ†ตํ•ด ์ค‘์š”ํ•œ ์‚ฌ์šฉ์ž ์ƒํ˜ธ์ž‘์šฉ(ํด๋ฆญ, ํƒ€์ดํ•‘ ๋“ฑ)์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋†’์ด๊ณ , ์ƒ๋Œ€์ ์œผ๋กœ ๋А๋ฆฐ ์—…๋ฐ์ดํŠธ(๋Œ€์šฉ๋Ÿ‰ ํ•„ํ„ฐ๋ง ๋“ฑ)๋ฅผ ์ง€์—ฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1]. ๊ฒฐ๊ณผ์ ์œผ๋กœ ์•ฑ์˜ ์‹ค์ œ ์—ฐ์‚ฐ ์†๋„ ์ž์ฒด๋ฅผ ๋งˆ๋ฒ•์ฒ˜๋Ÿผ ๋น ๋ฅด๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ, ์ธ์ง€๋˜๋Š” ์†๋„(perceived speed)๋ฅผ ์ตœ์ ํ™”ํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ฐ˜์‘์„ฑ ์žˆ๊ฒŒ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค [2]. + +## ๐Ÿ“– Core Content +* **๋™์‹œ์„ฑ ๋ Œ๋”๋ง(Concurrent Rendering)์˜ ์›๋ฆฌ:** ์ตœ์‹  ๋ฒ„์ „์˜ React์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ, ๋ Œ๋”๋ง ์ž‘์—…์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ง€์ •ํ•˜์—ฌ ์ค‘์š”๋„๊ฐ€ ๋†’์€ ์ƒํ˜ธ์ž‘์šฉ์ด ๋ Œ๋”๋ง์— ์˜ํ•ด ์ฐจ๋‹จ(block)๋˜์ง€ ์•Š๊ณ  ์ฆ‰์‹œ ๋ฐ˜์‘ํ•˜๋„๋ก ๋•์Šต๋‹ˆ๋‹ค [1]. +* **`useTransition`์„ ํ†ตํ•œ ์šฐ์„ ์ˆœ์œ„ ์ œ์–ด:** ํŠน์ • ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋ฅผ '๊ธด๊ธ‰ํ•˜์ง€ ์•Š์€(non-urgent)' ๊ฒƒ์œผ๋กœ ํ‘œ์‹œํ•˜์—ฌ ์ง€์—ฐ์‹œํ‚ค๋Š” ํ›…(Hook)์ž…๋‹ˆ๋‹ค [3]. ์‹ค์‹œ๊ฐ„ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋‚˜ ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ ํ•„ํ„ฐ๋ง ์‹œ, ์‚ฌ์šฉ์ž์˜ ํƒ€์ดํ•‘ ๊ฐ™์€ ์ž…๋ ฅ์€ ์ฆ‰๊ฐ์ ์œผ๋กœ ๋ฐ˜์‘ํ•˜๊ฒŒ ํ•˜๋ฉด์„œ ๋ฌด๊ฑฐ์šด ๋ Œ๋”๋ง ์ฒ˜๋ฆฌ๋Š” ๋’ค๋กœ ๋ฏธ๋ฃฐ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3]. ๋˜ํ•œ `isPending` ์ƒํƒœ๋ฅผ ํ™œ์šฉํ•ด ์ž…๋ ฅ ์ฆ‰๊ฐ์„ฑ์„ ๋ง‰์ง€ ์•Š๊ณ  ๋กœ๋”ฉ ์Šคํ”ผ๋„ˆ๋‚˜ ์Šค์ผˆ๋ ˆํ†ค UI๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค [3]. +* **`useDeferredValue`๋ฅผ ํ†ตํ•œ ๊ฐ’ ์ฐธ์กฐ ์ง€์—ฐ:** `useTransition`์ด ์—…๋ฐ์ดํŠธ๋ฅผ ์–ธ์ œ ๋ฐœ์ƒ์‹œํ‚ฌ์ง€๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค๋ฉด, `useDeferredValue`๋Š” ๋ฌด๊ฑฐ์šด ๊ฐ’์„ ์–ธ์ œ '์ฝ์„์ง€'๋ฅผ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค [4]. ์ž…๋ ฅ๊ณผ ๊ฐ™์€ UI ๋ณ€๊ฒฝ์€ ์ฆ‰์‹œ ๋ฐ˜์˜ํ•˜๋ฉด์„œ, ํŒŒ์ƒ๋˜๋Š” ๋ฌด๊ฑฐ์šด ๋กœ์ง ์ ์šฉ์€ ์‚ด์ง ์ง€์—ฐ์‹œ์ผœ ์‹ค์‹œ๊ฐ„ ํผ(form) ๋“ฑ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋Š๊น€ ํ˜„์ƒ(jank)์„ ์ค„์—ฌ์ค๋‹ˆ๋‹ค [4]. +* **ํ”„๋ ˆ์ž„์›Œํฌ ์ง€์› ํ™˜๊ฒฝ:** 2025๋…„ ๊ธฐ์ค€ Next.js(App Router), Remix, Vite + React 18+ ํ™˜๊ฒฝ ๋“ฑ ๋Œ€๋ถ€๋ถ„์˜ ํ’€์Šคํƒ ๋ฐ ๋ฒˆ๋“ค๋Ÿฌ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋™์‹œ์„ฑ ๋ Œ๋”๋ง ๊ธฐ๋Šฅ์ด ํ†ตํ•ฉ๋˜์–ด ์ง€์›๋ฉ๋‹ˆ๋‹ค [2]. + +## โš–๏ธ Trade-offs & Caveats +* **์„ฑ๋Šฅ ํ–ฅ์ƒ์˜ ๋ณธ์งˆ์  ํ•œ๊ณ„:** ์ด ๊ธฐ๋Šฅ๋“ค์€ ์•ฑ์˜ ์‹ค์ œ ์—ฐ์‚ฐ ์†๋„๋ฅผ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๋†’์—ฌ์ฃผ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ "์ธ์ง€๋˜๋Š” ์†๋„(perceived speed)"๋ฅผ ์šฐ์„ ์‹œํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค [2]. ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์ด ๊ณ„์† ์ง„ํ–‰๋˜๋Š” ๋™์•ˆ UI์˜ ๋ฐ˜์‘์„ฑ์„ ์œ ์ง€ํ•  ๋ฟ, ์‹คํ–‰ํ•ด์•ผ ํ•  ์—ฐ์‚ฐ๋Ÿ‰ ์ž์ฒด๊ฐ€ ์ค„์–ด๋“œ๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค [2]. +* **์„ ๋ณ„์  ์‚ฌ์šฉ ์š”๊ตฌ:** ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ์— ์ „์—ญ์ ์œผ๋กœ ์‚ฌ์šฉํ•ด์„œ๋Š” ์•ˆ ๋˜๋ฉฐ, ์ฃผ๋กœ '์ƒํ˜ธ์ž‘์šฉ์ด ๋งŽ์€ ๋ทฐ(interactive views)'์— ์„ ๋ณ„์ ์œผ๋กœ ์ ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [4]. +* **ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ:** ๋ Œ๋”๋ง์„ ์ฐจ๋‹จํ•˜๋Š”(render-blocking) ๊ตฌ์‹ ํŒจํ„ด(๊ฐ€๋“œ๊ฐ€ ์—†๋Š” ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ ๋“ฑ)์ด๋‚˜ ์˜ค๋ž˜๋œ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์„ž์–ด์„œ ์‚ฌ์šฉํ•˜๋ฉด ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ์•ผ๊ธฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [4]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [๊ด€๊ณ„ ์œ ํ˜• A: ์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] +- [[useTransition]] + - ์—ฐ๊ฒฐ ์ด์œ : ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋ฅผ ๊ธด๊ธ‰ํ•˜์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œํ•˜์—ฌ ์ง€์—ฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” Concurrent Feature์˜ ํ•ต์‹ฌ ์š”์†Œ์ž…๋‹ˆ๋‹ค [3]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: React๊ฐ€ ๋ Œ๋”๋ง ์šฐ์„ ์ˆœ์œ„๋ฅผ ์กฐ์ •ํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ž…๋ ฅ ๋ฐ˜์‘์„ฑ์„ ์žƒ์ง€ ์•Š๊ฒŒ ์œ ์ง€ํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ๋ฉ”์ปค๋‹ˆ์ฆ˜. + +- [[useDeferredValue]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋น„์šฉ์ด ํฐ ํŒŒ์ƒ ๋ฐ์ดํ„ฐ์˜ ๋ Œ๋”๋ง ๋ฐ˜์˜ ์‹œ์ ์„ ์ง€์—ฐ์‹œ์ผœ UI ๋Š๊น€์„ ๋ง‰๋Š” ๋˜ ๋‹ค๋ฅธ ์ฃผ์š” ์š”์†Œ์ž…๋‹ˆ๋‹ค [4]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ƒํƒœ์˜ ์—…๋ฐ์ดํŠธ ์‹œ์ ์ด ์•„๋‹Œ, ๊ณ„์‚ฐ๋œ ๊ฐ’์„ ์ฝ์–ด ๋“ค์ด๋Š” ์‹œ์ ์„ ๋ถ„๋ฆฌํ•˜๋Š” ์ตœ์ ํ™” ์ „๋žต. + +#### [๊ด€๊ณ„ ์œ ํ˜• B: ๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ] +- [[Suspense]] + - ์—ฐ๊ฒฐ ์ด์œ : Concurrent Feature(ํŠนํžˆ `useTransition`)์™€ ๊ฒฐํ•ฉํ•˜์—ฌ ๋ฌด๊ฑฐ์šด ๋ Œ๋”๋ง์ด๋‚˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋กœ๋“œ๋˜๋Š” ๋™์•ˆ Fallback UI๋ฅผ ์œ ์—ฐํ•˜๊ฒŒ ํ‘œ์‹œํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค [4]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋น„๋™๊ธฐ ๋กœ๋”ฉ ์ƒํƒœ์—์„œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜(UX)์„ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ์„ค๊ณ„ํ•˜๋Š” ์„ ์–ธ์  UI ํŒจํ„ด. + +### Deeper Research Questions +- Concurrent Rendering์ด ๋™์ž‘ํ•  ๋•Œ ๋ธŒ๋ผ์šฐ์ €์˜ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ์ž‘์—…์„ ์ผ์‹œ ์ค‘์ง€ํ•˜๊ณ  ์žฌ๊ฐœ(pause, interrupt, resume)ํ•˜๋Š”๊ฐ€? +- `useTransition`๊ณผ `useDeferredValue`๋Š” ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ค ์ƒํ™ฉ์—์„œ ๊ฐ๊ฐ ์„ ํƒ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•˜๋ฉฐ, ๋‘ ๊ฐ€์ง€๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์ œ์•ฝ ์‚ฌํ•ญ์€ ์—†๋Š”๊ฐ€? +- ๊ตฌ์‹ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(outdated state libraries)๊ฐ€ Concurrent Features์™€ ์„ž์˜€์„ ๋•Œ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜๋Š” ๊ธฐ์ˆ ์  ์›๋ฆฌ๋Š” ๋ฌด์—‡์ธ๊ฐ€? +- ์ธ์ง€๋˜๋Š” ์†๋„(perceived speed)๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด Concurrent ๊ธฐ๋Šฅ์„ ๊ณผ๋„ํ•˜๊ฒŒ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๋‚˜ ์Šค์ผ€์ค„๋ง ์˜ค๋ฒ„ํ—ค๋“œ๋Š” ์–ด๋А ์ •๋„์ธ๊ฐ€? +- Next.js๋‚˜ Remix ๊ฐ™์€ ์ตœ์‹  ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ Concurrent Features๋ฅผ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•˜์—ฌ ์ŠคํŠธ๋ฆฌ๋ฐ(streaming) ์—…๋ฐ์ดํŠธ์™€ ๊ฐ™์€ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์ด๋Œ์–ด๋‚ด๋Š”๊ฐ€? + +### Practical Application Contexts +- **Implementation:** ์‹ค์‹œ๊ฐ„ ๊ฒ€์ƒ‰์ฐฝ, ํƒ€์ž…์–ดํ—ค๋“œ(Typeahead) ์ž…๋ ฅ๊ธฐ, ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ๊ทธ๋ฆฌ๋“œ ํ•„ํ„ฐ๋ง ๋“ฑ ์‚ฌ์šฉ์ž ์ž…๋ ฅ์ด ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค ๋ฌด๊ฑฐ์šด UI๋ฅผ ๋‹ค์‹œ ๊ทธ๋ ค์•ผ ํ•˜๋Š” ๊ณณ์— ๊ตฌํ˜„ํ•˜์—ฌ ์ž…๋ ฅ์ด ๋ฒ„๋ฒ…์ด์ง€ ์•Š๋„๋ก ๋งŒ๋“ญ๋‹ˆ๋‹ค [3, 4]. +- **System Design:** ์‚ฌ์šฉ์ž์˜ ์ฆ‰๊ฐ์ ์ธ ํ”ผ๋“œ๋ฐฑ์ด ํ•„์š”ํ•œ ๋ทฐ์™€, ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์ง€์—ฐ ๋ Œ๋”๋ง๋˜์–ด๋„ ๋ฌด๋ฐฉํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ์‹œ์Šคํ…œ ๊ตฌ์กฐ ๋ฐ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ธฐํšํ•ฉ๋‹ˆ๋‹ค [4]. +- **Operation / Maintenance:** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋กœํŒŒ์ผ๋ง ์ค‘ ์ž…๋ ฅ ์ง€์—ฐ(Input Lag)์ด ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ณด๊ณ ๋˜๋Š” ๋ถ€๋ถ„์„ ์ฐพ์•„๋‚ด๊ณ , ํ•ด๋‹น ๋ถ€๋ถ„์— ๋ Œ๋”๋ง ์ฐจ๋‹จ ํŒจํ„ด์ด ์—†๋Š”์ง€ ์ ๊ฒ€ํ•˜์—ฌ Concurrent ๊ธฐ๋Šฅ์„ ์ ์ง„์ ์œผ๋กœ ๋„์ž…ํ•ฉ๋‹ˆ๋‹ค [4, 5]. +- **Learning Path:** ๋‹จ์ˆœํ•œ React Hook(`useState`, `useEffect`)์˜ ๋ Œ๋”๋ง ๊ณผ์ •์„ ์ดํ•ดํ•œ ํ›„, ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ์ตœ์ ํ™”(`React.memo`, `useCallback`)๋ฅผ ๋ฐฐ์šฐ๊ณ , ์ตœ์ข…์ ์œผ๋กœ ๋ Œ๋”๋ง์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ œ์–ดํ•˜๋Š” ๊ณ ๊ธ‰ ์ตœ์ ํ™” ๊ณผ์ •์œผ๋กœ Concurrent ๊ธฐ๋Šฅ์„ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค. +- **My Project Relevance:** ๊ฒ€์ƒ‰ ํ•„ํ„ฐ๊ฐ€ ๋งŽ์€ ๋Œ€์‹œ๋ณด๋“œ๋‚˜ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์‹œ๊ฐํ™” ์ฐจํŠธ๋ฅผ ๊ตฌ์ถ•ํ•  ๋•Œ UI ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฉˆ์ถ”๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜์—ฌ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ํฌ๊ฒŒ ๊ฐœ์„ ํ•˜๋Š” ๋ฐ ์ง์ ‘์ ์œผ๋กœ ์ ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### Adjacent Topics +- [[Server Components]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ํด๋ผ์ด์–ธํŠธ์—์„œ ๋ Œ๋”๋ง์„ ์ง€์—ฐ์‹œํ‚ค๊ฑฐ๋‚˜ ์ตœ์ ํ™”ํ•˜๋Š” ๊ฒƒ์„ ๋„˜์–ด, ๋ฌด๊ฑฐ์šด ๋ Œ๋”๋ง ์ž‘์—… ์ž์ฒด๋ฅผ ์„œ๋ฒ„๋กœ ์™„์ „ํžˆ ์˜ฎ๊ฒจ ํด๋ผ์ด์–ธํŠธ์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค ํฌ๊ธฐ์™€ ์‹คํ–‰ ๋ถ€๋‹ด์„ ๊ทผ๋ณธ์ ์œผ๋กœ ์ค„์ด๋Š” ๋ฐฉ๋ฒ•๋ก  ํƒ๊ตฌ [6, 7]. +- [[Code Splitting & Lazy Loading]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ํ™”๋ฉด์˜ ๋ Œ๋”๋ง ๊ณผ์ •์„ ๋งค๋„๋Ÿฝ๊ฒŒ ํ•˜๋Š” ๊ฒƒ์„ ๋„˜์–ด, ์ดˆ๊ธฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ๋”ฉ ์‹œ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ๋‹ค์šด๋กœ๋“œํ•˜๋Š” ์ฝ”๋“œ์˜ ์–‘ ์ž์ฒด๋ฅผ ๋ถ„ํ• ํ•˜์—ฌ ์ดˆ๊ธฐ ์‘๋‹ต์„ฑ(Time to Interactive)์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ์ „๋žต ํƒ๊ตฌ [8, 9]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Development/Concurrent Rendering in React 18+.md b/10_Wiki/Development/Concurrent Rendering in React 18+.md new file mode 100644 index 00000000..b20eeb11 --- /dev/null +++ b/10_Wiki/Development/Concurrent Rendering in React 18+.md @@ -0,0 +1,62 @@ +# [[Concurrent Rendering in React 18+]] + +## ๐Ÿ“Œ Brief Summary +React 18+์˜ ๋™์‹œ์„ฑ ๋ Œ๋”๋ง(Concurrent Rendering)์€ React๊ฐ€ ๋ Œ๋”๋ง ์ž‘์—…์„ ์ผ์‹œ ์ค‘์ง€, ์ค‘๋‹จ ๋ฐ ์žฌ๊ฐœํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค [1]. ์ด๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๋Š” ์—…๋ฐ์ดํŠธ ๋ฐœ์ƒ ์‹œ๊ธฐ์™€ ๋ฐฉ์‹์„ ์„ธ๋ฐ€ํ•˜๊ฒŒ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์‚ฌ์šฉ์ž์˜ ์ƒํ˜ธ์ž‘์šฉ์„ฑ์„ ์ €ํ•˜์‹œํ‚ค์ง€ ์•Š์œผ๋ฉด์„œ๋„ ํ™”๋ฉด์ด ๋ฉˆ์ถ”์ง€ ์•Š๋Š” ๋” ๋ถ€๋“œ๋Ÿฝ๊ณ  ๋ฐ˜์‘์„ฑ ๋†’์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1, 2]. + +## ๐Ÿ“– Core Content + +**๋™์‹œ์„ฑ ๋ Œ๋”๋ง์˜ ๊ฐœ๋…๊ณผ ์ด์ ** +* React 18๋ถ€ํ„ฐ ๋„์ž…๋œ ๋™์‹œ์„ฑ ๊ธฐ๋Šฅ์€ ๋ Œ๋”๋ง ์ž‘์—…์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋™์ ์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. ๋ Œ๋”๋ง ์ž‘์—…์„ ์ฐจ๋‹จํ•˜์ง€ ์•Š๊ณ , ๋А๋ฆฐ ๋ฐ์ดํ„ฐ ํ•„ํ„ฐ๋ง ์—…๋ฐ์ดํŠธ ๋“ฑ์„ ์ง€์—ฐ์‹œํ‚ค๋Š” ๋™์‹œ์— ํด๋ฆญ์ด๋‚˜ ํƒ€์ดํ•‘๊ณผ ๊ฐ™์€ ์ค‘์š”ํ•œ ์‚ฌ์šฉ์ž ์ƒํ˜ธ์ž‘์šฉ์— ์ฆ‰๊ฐ์ ์œผ๋กœ ๋ฐ˜์‘ํ•˜๋„๋ก ๋ Œ๋”๋ง์„ ์ผ์‹œ ์ค‘์ง€ํ•˜๊ฑฐ๋‚˜ ์žฌ๊ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1]. ์ด๋Š” ์ตœ์‹  React ๋ฒ„์ „์˜ ๊ธฐ๋ณธ ๋™์ž‘์œผ๋กœ ๋‚ด์žฅ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค [1]. + +**์ฃผ์š” ๋™์‹œ์„ฑ ํ›…(Hooks)** +* **`useTransition`:** ํŠน์ • ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋ฅผ '๊ธด๊ธ‰ํ•˜์ง€ ์•Š์€(non-urgent)' ๊ฒƒ์œผ๋กœ ํ‘œ์‹œํ•˜์—ฌ ์ง€์—ฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ํ›…์ž…๋‹ˆ๋‹ค [3]. ์‹ค์‹œ๊ฐ„ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ํ‘œ์‹œ, ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ ์„ธํŠธ ํ•„ํ„ฐ๋ง, ๋ณต์žกํ•œ ์ฐจํŠธ ๋ฐ ํ…Œ์ด๋ธ” ๋ Œ๋”๋ง๊ณผ ๊ฐ™์€ ๋ฌด๊ฑฐ์šด ์ž‘์—…์ด ์‚ฌ์šฉ์ž์˜ ์ฆ‰๊ฐ์ ์ธ ์ƒํ˜ธ์ž‘์šฉ์„ ์ฐจ๋‹จํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค [3]. ์ œ๊ณต๋˜๋Š” `isPending` ์ƒํƒœ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋ฅผ ์ฐจ๋‹จํ•˜์ง€ ์•Š๊ณ  ๋กœ๋”ฉ ์Šคํ”ผ๋„ˆ๋‚˜ ์Šค์ผˆ๋ ˆํ†ค UI๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3]. +* **`useDeferredValue`:** `useTransition`์ด ์—…๋ฐ์ดํŠธ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š” ์‹œ์ ์„ ์ œ์–ดํ•œ๋‹ค๋ฉด, `useDeferredValue`๋Š” ๋น„์šฉ์ด ๋งŽ์ด ๋“œ๋Š” ๊ฐ’์„ *์ฝ๊ณ  ์ ์šฉํ•˜๋Š” ์‹œ์ *์„ ์ง€์—ฐ์‹œํ‚ต๋‹ˆ๋‹ค [4]. ๊ฒ€์ƒ‰์ฐฝ์˜ ์ž…๋ ฅ ๊ฐ’ ๋“ฑ UI ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ์ฆ‰์‹œ ๋ฐ˜์˜ํ•˜๋ฉด์„œ, ํŒŒ์ƒ๋˜๋Š” ๋ฌด๊ฑฐ์šด ๊ณ„์‚ฐ ๋กœ์ง์€ ์•ฝ๊ฐ„ ์ง€์—ฐ์‹œ์ผœ ์‹ค์‹œ๊ฐ„ ํผ์ด๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค์—์„œ์˜ ํ™”๋ฉด ๋Š๊น€(Jank) ํ˜„์ƒ์„ ์ค„์—ฌ์ค๋‹ˆ๋‹ค [4]. + +**์‚ฌ์šฉ ๋ชจ๋ฒ” ์‚ฌ๋ก€ ๋ฐ ํ”„๋ ˆ์ž„์›Œํฌ ์ง€์›** +* ๋™์‹œ์„ฑ ๊ธฐ๋Šฅ์€ ์•ฑ์˜ ๋ชจ๋“  ๊ณณ์ด ์•„๋‹Œ '์ƒํ˜ธ์ž‘์šฉ์ด ์ง‘์ค‘๋œ ๋ทฐ'์— ์ „๋žต์ ์œผ๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [4]. ๋ฐ์ดํ„ฐ๊ฐ€ ๋กœ๋“œ๋˜๋Š” ๋™์•ˆ ๋Œ€์ฒด UI๋ฅผ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด `Suspense`์™€ ๊ฒฐํ•ฉํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค [4]. +* ์ฃผ์˜ํ•  ์ ์€ ๊ตฌ์‹ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜ ๋ Œ๋”๋ง์„ ์ฐจ๋‹จํ•˜๋Š” ํŒจํ„ด(์˜ˆ: ๊ฐ€๋“œ ๋กœ์ง์ด ์—†๋Š” ์˜ค๋ž˜๋œ ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ)๊ณผ ํ˜ผ์šฉํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค [4]. +* ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ๋“ค์€ ์—ฐ์‚ฐ ์†๋„ ์ž์ฒด๋ฅผ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๋†’์ด๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์ž‘์—…์ด ๊ณ„์†๋˜๋Š” ๋™์•ˆ UI๊ฐ€ ๋ฐ˜์‘ํ•˜๋„๋ก ์œ ์ง€ํ•จ์œผ๋กœ์จ '์ฒด๊ฐ ์†๋„(perceived speed)'๋ฅผ ์šฐ์„ ์‹œํ•˜๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค [4]. +* 2025๋…„ ๊ธฐ์ค€ Next.js(App Router), Remix, Vite + React 18 ๋“ฑ ๋Œ€๋ถ€๋ถ„์˜ ์ตœ์‹  ํ’€์Šคํƒ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด ๋™์‹œ์„ฑ ๋ Œ๋”๋ง์„ ์™„์ „ํžˆ ํ†ตํ•ฉํ•˜์—ฌ ์ง€์›ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค [5]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +- [[useTransition]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋™์‹œ์„ฑ ๋ Œ๋”๋ง ํ™˜๊ฒฝ์—์„œ ํŠน์ • ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋ฅผ '๊ธด๊ธ‰ํ•˜์ง€ ์•Š์€ ์ž‘์—…'์œผ๋กœ ๋ช…์‹œ์ ์œผ๋กœ ๋ถ„๋ฅ˜ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ํ•ต์‹ฌ ํ›…์ž…๋‹ˆ๋‹ค [3]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ƒํƒœ ์—…๋ฐ์ดํŠธ์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋‚ฎ์ถ”์–ด ์‚ฌ์šฉ์ž ์ž…๋ ฅ์— ๋Œ€ํ•œ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ ์ฐจ๋‹จ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ์ œ์–ด ๋ฐฉ๋ฒ•. + +- [[useDeferredValue]] + - ์—ฐ๊ฒฐ ์ด์œ : ์—ฐ์‚ฐ ๋น„์šฉ์ด ๋†’์€ ๊ฐ’์˜ ํ™”๋ฉด ์ ์šฉ ์‹œ์ ์„ ๋Šฆ์ถ”์–ด UI์˜ ์ฆ‰๊ฐ์ ์ธ ์ฒด๊ฐ ๋ฐ˜์‘์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๋™์‹œ์„ฑ ๊ธฐ๋Šฅ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [4]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์‚ฌ์šฉ์ž ์ž…๋ ฅ(ํƒ€์ดํ•‘ ๋“ฑ)์˜ ์ฆ‰๊ฐ์ ์ธ ๋ฐ˜์˜๊ณผ ๋ฌด๊ฑฐ์šด ํŒŒ์ƒ ๋ฐ์ดํ„ฐ ๋ Œ๋”๋ง ๊ฐ„์˜ ์ฒ˜๋ฆฌ ์‹œ์ ์„ ๋ถ„๋ฆฌํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜. + +- [[Suspense]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋™์‹œ์„ฑ ํ›…(`useTransition` ๋“ฑ)๊ณผ ๊ฒฐํ•ฉํ•˜์—ฌ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋‚˜ ์ง€์—ฐ๋œ ๋ Œ๋”๋ง์ด ์™„๋ฃŒ๋˜๊ธฐ ์ „๊นŒ์ง€ ์ž์—ฐ์Šค๋Ÿฌ์šด ๋Œ€์ฒด UI(Fallback UI)๋ฅผ ํ‘œ์‹œํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค [4]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ ๊ณผ์ •์—์„œ ๋™์‹œ์„ฑ ๋ Œ๋”๋ง์„ ํ™œ์šฉํ•œ ๋ถ€๋“œ๋Ÿฌ์šด ์‚ฌ์šฉ์ž ๊ฒฝํ—˜(UX) ์„ค๊ณ„ ๋ฐฉ์‹. + +### Deeper Research Questions + +- React์˜ ๋™์‹œ์„ฑ ๋ Œ๋”๋ง ์—”์ง„์€ ๋‚ด๋ถ€์ ์œผ๋กœ ๊ธด๊ธ‰ ์—…๋ฐ์ดํŠธ์™€ ์ง€์—ฐ ์—…๋ฐ์ดํŠธ์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์–ด๋–ค ์Šค์ผ€์ค„๋ง ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š”๊ฐ€? +- `useTransition`๊ณผ `useDeferredValue`๋ฅผ ๋ณต์žกํ•œ ๋‹จ์ผ ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ Œ๋”๋ง ์—ฃ์ง€ ์ผ€์ด์Šค๋‚˜ ์„ฑ๋Šฅ์  ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๋Š” ๋ฌด์—‡์ธ๊ฐ€? +- ๊ตฌ์‹ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(Context API๋ฅผ ์ž˜๋ชป ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋“ฑ)๊ฐ€ React 18์˜ ๋™์‹œ์„ฑ ๋ Œ๋”๋ง ํŒจํ„ด์„ ๋ฐฉํ•ดํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์ •ํ™•ํ•œ ๊ธฐ์ˆ ์  ์›๋ฆฌ(์˜ˆ: Tearing ํ˜„์ƒ)๋Š” ๋ฌด์—‡์ธ๊ฐ€? +- ๋™์‹œ์„ฑ ๋ Œ๋”๋ง์˜ ๋„์ž…์ด ๋ธŒ๋ผ์šฐ์ €์˜ INP(Interaction to Next Paint)์™€ TBT(Total Blocking Time) ์ง€ํ‘œ ์ตœ์ ํ™”์— ์ˆ˜ํ•™์ ์œผ๋กœ ์–ด๋–ค ์—ฐ๊ด€์„ฑ์„ ๊ฐ€์ง€๋Š”๊ฐ€? +- ๋™์‹œ์„ฑ ๋ Œ๋”๋ง์œผ๋กœ ์ธํ•ด ๋ Œ๋”๋ง ํŠธ๋ฆฌ๊ฐ€ ์ค‘๋‹จ(Interrupt)๋˜๊ณ  ํ๊ธฐ๋œ ํ›„ ๋‹ค์‹œ ์‹œ์ž‘๋  ๋•Œ, ๋ถˆํ•„์š”ํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ React์˜ ๋‚ด๋ถ€ ์ตœ์ ํ™” ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ๋ฌด์—‡์ธ๊ฐ€? + +### Practical Application Contexts + +- **Implementation:** ๋ผ์ด๋ธŒ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์ฐฝ, ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ ์„ธํŠธ ํ•„ํ„ฐ๋ง ๊ธฐ๋Šฅ ๊ตฌํ˜„ ์‹œ `useTransition`๊ณผ `useDeferredValue`๋ฅผ ์ ๊ทน ํ™œ์šฉํ•˜์—ฌ ์ž…๋ ฅ ์ค‘ ๋ฐœ์ƒํ•˜๋Š” ํ™”๋ฉด ๋ฉˆ์ถค(Jank) ๋ฐฉ์ง€ [3, 4]. +- **System Design:** ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ ์‹œ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋™์‹œ์„ฑ ๋ Œ๋”๋ง์ด ํ™œ์„ฑํ™”๋œ Next.js App Router๋‚˜ Remix์™€ ๊ฐ™์€ ์ตœ์‹  React ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋„์ž…ํ•˜์—ฌ ๋ฐ˜์‘์„ฑ ์ด์ ์„ ๊ทน๋Œ€ํ™” [5]. +- **Operation / Maintenance:** ๊ธฐ์กด ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ๋ Œ๋”๋ง์„ ์ฐจ๋‹จํ•˜๋Š” ์š”์†Œ(์˜ค๋ž˜๋œ ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ ๋“ฑ)๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•˜๊ณ , ๋™์‹œ์„ฑ ๊ธฐ๋Šฅ์ด ์ถฉ๋Œ ์—†์ด ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋„๋ก ์œ ์ง€๋ณด์ˆ˜ ํ™˜๊ฒฝ ๊ฐœ์„  [4]. +- **Learning Path:** ์ „ํ†ต์ ์ธ '๋™๊ธฐ์  ๋ Œ๋”๋ง(Synchronous Rendering)' ๋ชจ๋ธ์ด ๊ฐ€์ง„ ํ•œ๊ณ„๋ฅผ ๋ฒ—์–ด๋‚˜, ์ž‘์—… ๋‹จ์œ„์˜ ์ผ์‹œ ์ค‘์ง€์™€ ์žฌ๊ฐœ๊ฐ€ ๊ฐ€๋Šฅํ•œ ๋ Œ๋”๋ง ํŒจ๋Ÿฌ๋‹ค์ž„์œผ๋กœ ๊ฐœ๋ฐœ์ž์˜ ์‚ฌ๊ณ  ๋ฐฉ์‹์„ ์ „ํ™˜. +- **My Project Relevance:** ํ˜„์žฌ ์ง„ํ–‰ ์ค‘์ธ ์„œ๋น„์Šค ๋‚ด ๋ฌด๊ฑฐ์šด ๋Œ€์‹œ๋ณด๋“œ ํ™”๋ฉด์ด๋‚˜ ๋ณต์žกํ•œ ๊ฒ€์ƒ‰ ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ์ฒด๊ฐํ•˜๋Š” '์ธ์‹ ์†๋„(Perceived Speed)'๋ฅผ ์ตœ์ ํ™”ํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜ ๊ฐœ์„  ์ง€ํ‘œ๋กœ ํ™œ์šฉ [3, 4]. + +### Adjacent Topics + +- [[React Server Components]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋™์‹œ์„ฑ ๋ Œ๋”๋ง๊ณผ ํ•จ๊ป˜ Next.js App Router ํ™˜๊ฒฝ์˜ ํ•ต์‹ฌ ์„ฑ๋Šฅ ์ตœ์ ํ™” ์ถ•์„ ์ด๋ฃจ๋ฉฐ, ํด๋ผ์ด์–ธํŠธ ์ธก ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค์„ ํš๊ธฐ์ ์œผ๋กœ ์ค„์—ฌ์ฃผ๋Š” ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์˜ ๋ Œ๋”๋ง ์›๋ฆฌ ํƒ๊ตฌ [5, 6]. + +- [[Core Web Vitals (INP/TBT)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋™์‹œ์„ฑ ๋ Œ๋”๋ง ๊ธฐ๋Šฅ ์ ์šฉ์ด ์›น์˜ ํ•ต์‹ฌ ๋ฐ˜์‘์„ฑ ์ง€ํ‘œ์ธ INP ๋ฐ TBT๋ฅผ ์–ด๋–ป๊ฒŒ ๊ฐœ์„ ํ•˜๋Š”์ง€ ์‹ค์ œ ์„ฑ๋Šฅ ์ธก์ • ํˆด(Chrome DevTools, Lighthouse) ๋ฐ์ดํ„ฐ์™€ ์—ฐ๊ณ„ํ•˜์—ฌ ์กฐ์‚ฌ [7-9]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Development/Context API.md b/10_Wiki/Development/Context API.md new file mode 100644 index 00000000..b0dfba57 --- /dev/null +++ b/10_Wiki/Development/Context API.md @@ -0,0 +1,46 @@ +# [[Context API]] + +## ๐Ÿ“Œ Brief Summary +Context API๋Š” React์— ๋‚ด์žฅ๋œ ์ƒํƒœ ๊ณต์œ  ์†”๋ฃจ์…˜์œผ๋กœ, ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ์˜ ๋ชจ๋“  ๋ ˆ๋ฒจ์„ ํ†ตํ•ด ๋ช…์‹œ์ ์œผ๋กœ props๋ฅผ ์ „๋‹ฌํ•˜์ง€ ์•Š๊ณ ๋„ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค [1, 2]. ์ด๋Š” ๋…๋ฆฝ์ ์ธ ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ๋ผ๊ธฐ๋ณด๋‹ค๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ์ „์†ก ๋ฉ”์ปค๋‹ˆ์ฆ˜์— ๊ฐ€๊น์Šต๋‹ˆ๋‹ค [3, 4]. ์ฃผ๋กœ ํ…Œ๋งˆ, ๋‹ค๊ตญ์–ด ์„ค์ • ๋“ฑ ๋ณ€๊ฒฝ์ด ๊ฑฐ์˜ ์—†๋Š” ์ •์ ์ธ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์—ญ์ ์œผ๋กœ ๊ณต์œ ํ•  ๋•Œ ์ ํ•ฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค [5, 6]. + +## ๐Ÿ“– Core Content +* **์ž‘๋™ ๋ฐฉ์‹ ๋ฐ ๊ตฌ์กฐ:** Context API๋Š” `React.createContext()`๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ƒ์„ฑ๋˜๋ฉฐ, ์ƒํƒœ ๊ฐ’์„ ์ œ๊ณตํ•˜๋Š” `Provider`์™€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š” `Consumer`(์‹ค๋ฌด์—์„œ๋Š” ์ฃผ๋กœ `useContext` ํ›…)๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค [4]. Provider๋Š” ๊ฐ’์„ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธํ•˜๊ณ , ํŠธ๋ฆฌ์˜ ์–ด๋А ๊นŠ์ด์— ์žˆ๋“  `useContext`๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ํ•ด๋‹น ๊ฐ’์„ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [4]. ๋‹จ, ์ƒํƒœ ์ž์ฒด๋ฅผ ๊ด€๋ฆฌํ•˜๋ ค๋ฉด `useState`๋‚˜ `useReducer`์™€ ๊ฐ™์€ ํ›…๊ณผ ๋ฐ˜๋“œ์‹œ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [4, 7]. +* **์„ฑ๋Šฅ์  ํ•œ๊ณ„์™€ ๋ฆฌ๋ Œ๋”๋ง ํญํฌ:** Context์˜ ๊ฐ€์žฅ ํฐ ๋‹จ์ ์€ ์„ฑ๋Šฅ ๊ด€๋ฆฌ์ž…๋‹ˆ๋‹ค [8]. Context๋กœ ์ „๋‹ฌ๋˜๋Š” ๊ฐ’ ์ค‘ ์ผ๋ถ€๋งŒ ๋ณ€๊ฒฝ๋˜๋”๋ผ๋„, ํ•ด๋‹น Context๋ฅผ ๊ตฌ๋…ํ•˜๋Š” **๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง**๋ฉ๋‹ˆ๋‹ค [8, 9]. React๋Š” ํŠน์ • ๋ฐ์ดํ„ฐ ๋ถ€๋ถ„๋งŒ ์‚ฌ์šฉํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ตฌ๋ณ„ํ•ด ๋‚ด์ง€ ๋ชปํ•˜๋ฏ€๋กœ, ์ƒํƒœ ๋ณ€๊ฒฝ์ด ์žฆ์€ ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ์ „์ฒด ๋Œ€์‹œ๋ณด๋“œ๊ฐ€ ์ˆ˜ ์ดˆ๊ฐ„ ๋ฉˆ์ถ”๋Š” ๋“ฑ ์‹ฌ๊ฐํ•œ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ์„ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1, 10]. +* **๊ตฌ์กฐ์  ์ตœ์ ํ™” ์ „๋žต:** ์ด๋Ÿฌํ•œ ๋ฆฌ๋ Œ๋”๋ง ๋ฌธ์ œ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ชจ๋“  ์ƒํƒœ๋ฅผ ํ•˜๋‚˜์˜ 'Global Context'์— ๋‹ด๋Š” ์•ˆํ‹ฐ ํŒจํ„ด์„ ํ”ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [11, 12]. ๋Œ€์‹  `ThemeContext`, `NotificationContext`์ฒ˜๋Ÿผ ์ƒํƒœ๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž‘์€ ๋„๋ฉ”์ธ๋ณ„ Context๋กœ ๋ถ„๋ฆฌํ•˜๊ณ , ์ปค์Šคํ…€ ํ›…๊ณผ Selector ํŒจํ„ด์„ ํ™œ์šฉํ•ด ํ•„์š”ํ•œ ๊ฐ’๋งŒ ์Šค์ฝ”ํ”„๋ฅผ ์ขํ˜€ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค [12, 13]. +* **์‚ฌ์šฉ์˜ ์ ํ•ฉ์„ฑ:** ํ…Œ๋งˆ(๋ผ์ดํŠธ/๋‹คํฌ ๋ชจ๋“œ), ์–ธ์–ด ํ™˜๊ฒฝ ์„ค์ •, ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ ๋“ฑ **๋ณ€๊ฒฝ ๋นˆ๋„๊ฐ€ ๋งค์šฐ ๋‚ฎ๊ณ  ์ •์ ์ธ ๋ฐ์ดํ„ฐ**๋ฅผ ๊ณต์œ ํ•˜๊ฑฐ๋‚˜ ์™ธ๋ถ€ ์ข…์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์€ ์ž‘์€ ํ”„๋กœ์ ํŠธ ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฐœ๋ฐœ์— ์™„๋ฒฝํ•œ ์„ ํƒ์ž…๋‹ˆ๋‹ค [5, 6, 14]. ๋ฐ˜๋ฉด, ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ, ์ž์ฃผ ์—…๋ฐ์ดํŠธ๋˜๋Š” ์žฅ๋ฐ”๊ตฌ๋‹ˆ, ๋ณต์žกํ•œ ๋น„๋™๊ธฐ ์ž‘์—…์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋Š” Context๋ฅผ ํ”ผํ•˜๊ณ  Zustand๋‚˜ Redux๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค [15-18]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts +- [[Prop Drilling]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ ๊นŠ๊ฒŒ ์ค‘์ฒฉ๋œ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด ๋ถˆํ•„์š”ํ•œ ์ค‘๊ฐ„ ์ปดํฌ๋„ŒํŠธ๋“ค์„ ๊ฑฐ์ณ์•ผ ํ•˜๋Š” ํŒจํ„ด์ž…๋‹ˆ๋‹ค [2]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Context API๊ฐ€ ํƒ„์ƒํ•˜๊ฒŒ ๋œ ๊ทผ๋ณธ์ ์ธ ๋ฐฐ๊ฒฝ๊ณผ, ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ํŠธ๋ฆฌ ์•„๋ž˜๋กœ "๊ฑด๋„ˆ๋›ฐ์–ด" ์ „๋‹ฌํ•˜๋Š”์ง€ ๊ทธ ๋ชฉ์ ์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2, 19]. +- [[useContext]] + - ์—ฐ๊ฒฐ ์ด์œ : Context API์˜ Provider๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ๊ฐ’์„ ์ฝ๊ธฐ ์œ„ํ•ด ๊ฐœ๋ณ„ ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ ํ˜ธ์ถœํ•˜๋Š” React์˜ ๋‚ด์žฅ ํ›…์ž…๋‹ˆ๋‹ค [4]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ตฌ๋…(Subscription)์ด ๋ฐœ์ƒํ•˜๋Š” ์ •ํ™•ํ•œ ์ง€์ ๊ณผ, ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ ์–ด๋–ค ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฆฌ๋ Œ๋”๋ง์ด ํŠธ๋ฆฌ๊ฑฐ๋˜๋Š”์ง€ ๋ Œ๋”๋ง ๋™์ž‘ ์›๋ฆฌ๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [8]. +- [[Zustand]] + - ์—ฐ๊ฒฐ ์ด์œ : Context API์˜ ๋ฆฌ๋ Œ๋”๋ง ํ•œ๊ณ„์™€ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ๋ฅผ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด ์ž์ฃผ ๋น„๊ต๋˜๊ณ  ์ฑ„ํƒ๋˜๋Š” ๊ฒฝ๋Ÿ‰ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค [20, 21]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Zustand์˜ 'Selector ํŒจํ„ด'์ด ์–ด๋–ป๊ฒŒ ํŠน์ • ์ƒํƒœ ์Šฌ๋ผ์ด์Šค๋งŒ ๊ตฌ๋…ํ•˜๊ฒŒ ํ•˜์—ฌ Context API์˜ "์ „์ฒด ๋ฆฌ๋ Œ๋”๋ง" ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š”์ง€ ์„ฑ๋Šฅ ์ตœ์ ํ™”์˜ ์ฐจ์ด๋ฅผ ๋น„๊ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [8, 10]. + +### Deeper Research Questions +- Context API์™€ ์™ธ๋ถ€ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(Zustand, Redux)๋ฅผ ๋™์ผํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์—์„œ ํšจ์œจ์ ์œผ๋กœ ํ˜ผ์šฉ(Hybrid)ํ•˜๊ธฐ ์œ„ํ•ด, ์ •์  ์ƒํƒœ์™€ ๋™์  ์ƒํƒœ๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ์ตœ์ ์˜ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ ๊ธฐ์ค€์€ ๋ฌด์—‡์ธ๊ฐ€? +- Context API์˜ "๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ" ํŠน์„ฑ์œผ๋กœ ์ธํ•œ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋„๋ฉ”์ธ๋ณ„๋กœ Context๋ฅผ ์ชผ๊ฐค ๋•Œ, ์ฝ”๋“œ์˜ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ์žƒ์ง€ ์•Š์œผ๋ฉด์„œ๋„ ์„ฑ๋Šฅ์„ ์žก์„ ์ˆ˜ ์žˆ๋Š” ์ ์ ˆํ•œ ๋ถ„๋ฆฌ ์ž…๋„(Granularity)๋Š” ์–ด๋А ์ •๋„์ธ๊ฐ€? +- `use-context-selector`์™€ ๊ฐ™์€ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Context API์˜ ๋ฆฌ๋ Œ๋”๋ง ๋ฌธ์ œ๋ฅผ ์šฐํšŒํ•˜๋Š” ๋ฐฉ์‹์€, ์ฒ˜์Œ๋ถ€ํ„ฐ Zustand๋‚˜ Redux๋ฅผ ๋„์ž…ํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„๊ตํ•˜์—ฌ ๋„์ž… ๋น„์šฉ ๋ฐ ์žฅ๊ธฐ์  ํ™•์žฅ์„ฑ ์ธก๋ฉด์—์„œ ์–ด๋–ค ์žฅ๋‹จ์ ์„ ๊ฐ€์ง€๋Š”๊ฐ€? +- ์˜์กด์„ฑ ์ฃผ์ž…(Dependency Injection)์˜ ๋ชฉ์ ์œผ๋กœ Context API๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ, ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ(Jest ๋“ฑ)์ด๋‚˜ Storybook์—์„œ Provider ๋ชจํ‚น(Mocking)์„ ์„ค๊ณ„ํ•  ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์ทจ์•ฝ์ ๊ณผ ํ•ด๊ฒฐ์ฑ…์€ ๋ฌด์—‡์ธ๊ฐ€? +- ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฌด๋ถ„๋ณ„ํ•œ `useEffect`์™€ Context API๊ฐ€ ๊ฒฐํ•ฉ๋˜์—ˆ์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” '๋ฆฌ๋ Œ๋”๋ง ํญํ’(Re-render storm)'์„ React DevTools Profiler๋กœ ์ง„๋‹จํ•˜๊ณ  ๋ฆฌํŒฉํ† ๋งํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ๊ณผ์ •์€ ์–ด๋–ป๊ฒŒ ๋˜๋Š”๊ฐ€? + +### Practical Application Contexts +- **Implementation:** React ํ”„๋กœ์ ํŠธ์—์„œ `React.createContext()`๋กœ ํ…Œ๋งˆ๋‚˜ ๋กœ์ผ€์ผ ์ •๋ณด๋ฅผ ์ •์˜ํ•˜๊ณ , ์ตœ์ƒ์œ„ ๋ ˆ์ด์–ด(`app/` ๋˜๋Š” ์ตœ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ)๋ฅผ `Provider`๋กœ ๊ฐ์‹ผ ๋’ค, ๋‚ด๋ถ€ ์ปดํฌ๋„ŒํŠธ์—์„œ `useContext`๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ์„ค์ •๊ฐ’์„ ๋ถˆ๋Ÿฌ์™€ UI์— ์ฆ‰๊ฐ์ ์œผ๋กœ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค [4, 22, 23]. +- **System Design:** ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ ์‹œ ์ƒํƒœ์˜ '๋ณ€๊ฒฝ ๋นˆ๋„'์— ๋”ฐ๋ผ ์ €์žฅ์†Œ๋ฅผ ์ด์›ํ™”ํ•ฉ๋‹ˆ๋‹ค. ๋‹คํฌ๋ชจ๋“œ, ๋กœ๊ทธ์ธ ์—ฌ๋ถ€ ๊ฐ™์€ ์ •์ ์ธ ์„ค์ •์€ Context API์— ๋ฐฐ์น˜ํ•˜๊ณ , ์žฅ๋ฐ”๊ตฌ๋‹ˆ๋‚˜ ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ์ฒ˜๋Ÿผ ์ˆ˜์‹œ๋กœ ๋ณ€ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋Š” Zustand๋‚˜ Redux ๊ฐ™์€ ์™ธ๋ถ€ ์Šคํ† ์–ด์— ๋ฐฐ์น˜ํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง ์ „ํŒŒ๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค [24]. +- **Operation / Maintenance:** ์„ฑ๋Šฅ ํ”„๋กœํŒŒ์ผ๋ง ์‹œ ์‚ฌ์šฉ์ž ์ธํ„ฐ๋ž™์…˜ ์ดํ›„ ๋Œ€์‹œ๋ณด๋“œ๊ฐ€ ์ผ์‹œ์ ์œผ๋กœ ๋ฉˆ์ถ”๋Š” ํ˜„์ƒ์ด ๋ฐœ๊ฒฌ๋˜๋ฉด, React DevTools์˜ Profiler๋ฅผ ์ด์šฉํ•ด ์›์ธ์„ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค. ์›์ธ์ด ๋‹จ์ผ Context ์—…๋ฐ์ดํŠธ์— ์˜ํ•œ ์ˆ˜๋ฐฑ ๊ฐœ ์ปดํฌ๋„ŒํŠธ์˜ ๋ฆฌ๋ Œ๋”๋ง์œผ๋กœ ํ™•์ธ๋  ๊ฒฝ์šฐ, Context๋ฅผ ์ž˜๊ฒŒ ์ชผ๊ฐœ๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋Š” ์œ ์ง€๋ณด์ˆ˜ ๊ฒฐ์ •์„ ๋‚ด๋ฆฝ๋‹ˆ๋‹ค [1, 25]. +- **Learning Path:** React ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ์ฒ˜์Œ ๋ฐฐ์šฐ๋Š” ๋‹จ๊ณ„์—์„œ, ์ปดํฌ๋„ŒํŠธ ๊ฐ„ Props ์ „๋‹ฌ์˜ ํ”ผ๋กœ๋„๋ฅผ ์ค„์ด๋Š” ์ฒซ ๋ฒˆ์งธ ๋„๊ตฌ๋กœ ํ•™์Šต๋ฉ๋‹ˆ๋‹ค. ์ดํ›„ ์‹ค์ œ ๋ณต์žกํ•œ ์•ฑ์„ ๋งŒ๋“ค๋ฉฐ ํ•œ๊ณ„๋ฅผ ๊ฒฝํ—˜ํ•˜๊ณ , Redux์˜ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ๊ตฌ์กฐ๋‚˜ Zustand์˜ ๋…๋ฆฝ๋œ ์Šคํ† ์–ด ๊ฐœ๋…์„ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ฐ›์•„๋“ค์ด๊ฒŒ ํ•˜๋Š” ํ•ต์‹ฌ ํ•™์Šต ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค [14, 26, 27]. +- **My Project Relevance:** ๊ธฐ์กด ์ฝ”๋“œ๋ฒ ์ด์Šค์— 'Global Context' ์•ˆํ‹ฐ ํŒจํ„ด(๋ชจ๋“  ์ƒํƒœ๋ฅผ ํ•œ ๊ณณ์— ๋ชฐ์•„๋„ฃ์€ ํ˜•ํƒœ)์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š”์ง€ ์ ๊ฒ€ํ•˜๊ณ  [11], ๋ Œ๋”๋ง ๋ณ‘๋ชฉ์ด ์žˆ๋Š” ๊ฒฝ์šฐ `useMemo`, `useCallback`๊ณผ ํ•จ๊ป˜ Context๋ฅผ ์ฑ…์ž„๋ณ„๋กœ ๋ถ„ํ• ํ•˜๋Š” ๋ฆฌํŒฉํ† ๋ง ๋ชฉํ‘œ์™€ ์ง์ ‘์ ์œผ๋กœ ์—ฐ๊ด€๋ฉ๋‹ˆ๋‹ค [1, 12]. + +### Adjacent Topics +- [[React.memo]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: Context API์— ์˜ํ•ด ๋ฐœ์ƒํ•˜๋Š” ๋ถˆํ•„์š”ํ•œ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์–•์€ ๋น„๊ต(Shallow Compare) ์ตœ์ ํ™” ๋„๊ตฌ๋กœ, ๋ Œ๋”๋ง ์„ฑ๋Šฅ ์ตœ์ ํ™”(Performance Optimization) ๊ธฐ๋ฒ• ์ „๋ฐ˜์œผ๋กœ์˜ ์ดํ•ด๋ฅผ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค [28, 29]. +- [[Concurrent Rendering]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: React 18์˜ ๋™์‹œ์„ฑ ๋ Œ๋”๋ง ๊ธฐ๋Šฅ(`useTransition`, `useDeferredValue`)์„ ํ†ตํ•ด ๋ฌด๊ฑฐ์šด ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง์„ ์–ด๋–ป๊ฒŒ ์ง€์—ฐ์‹œํ‚ค๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฐ˜์‘์„ฑ์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ƒํƒœ ์—…๋ฐ์ดํŠธ ํ๋ฆ„์œผ๋กœ ํƒ๊ตฌ๋ฅผ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค [6, 30]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Development/Debugging Frontend Applications.md b/10_Wiki/Development/Debugging Frontend Applications.md new file mode 100644 index 00000000..51a64a0b --- /dev/null +++ b/10_Wiki/Development/Debugging Frontend Applications.md @@ -0,0 +1,74 @@ +# [[Debugging Frontend Applications]] + +## ๐Ÿ“Œ Brief Summary +ํ”„๋ก ํŠธ์—”๋“œ ๋””๋ฒ„๊น…์€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ, ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜, ๊ทธ๋ฆฌ๊ณ  ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง๊ณผ ๊ฐ™์€ ์„ฑ๋Šฅ ์ €ํ•˜ ์š”์ธ์„ ์‹๋ณ„ํ•˜๊ณ  ํ•ด๊ฒฐํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค [1-3]. Chrome DevTools์™€ ๊ฐ™์€ ๋ธŒ๋ผ์šฐ์ € ๋‚ด์žฅ ๋„๊ตฌ๋ถ€ํ„ฐ React DevTools, ๊ทธ๋ฆฌ๊ณ  Sentry๋‚˜ LogRocket๊ณผ ๊ฐ™์€ ํ”„๋กœ๋•์…˜ ํด๋ผ์šฐ๋“œ ๋กœ๊น… ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฌธ์ œ์˜ ๊ทผ๋ณธ ์›์ธ์„ ์ถ”์ ํ•ฉ๋‹ˆ๋‹ค [4-7]. ํšจ๊ณผ์ ์ธ ๋””๋ฒ„๊น… ์ „๋žต๊ณผ ์—๋Ÿฌ ํ•ธ๋“ค๋ง ์•„ํ‚คํ…์ฒ˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•˜๊ณ  ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์ตœ์ ํ™”ํ•˜๋Š” ๋ฐ ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค [8-10]. + +## ๐Ÿ“– Core Content + +* **๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜(Memory Leaks) ํƒ์ง€ ๋ฐ ํ•ด๊ฒฐ:** + * ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋Š” ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š์Œ์—๋„ ํ•ด์ œ๋˜์ง€ ์•Š์„ ๋•Œ ๋ฐœ์ƒํ•˜๋ฉฐ, ์•ฑ ์†๋„ ์ €ํ•˜์™€ ๋ธŒ๋ผ์šฐ์ € ํƒญ ์ถฉ๋Œ์„ ์œ ๋ฐœํ•ฉ๋‹ˆ๋‹ค [2, 11]. + * Chrome DevTools์˜ Task Manager๋ฅผ ํ†ตํ•ด ์‹ค์‹œ๊ฐ„ JavaScript ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ํ™•์ธํ•˜๊ณ , Performance ํƒญ์˜ ๊ธฐ๋ก์„ ํ†ตํ•ด ์‹œ๊ฐ„ ๊ฒฝ๊ณผ์— ๋”ฐ๋ฅธ ๋ฉ”๋ชจ๋ฆฌ ์ฆ๊ฐ€ ํŒจํ„ด์„ ์‹œ๊ฐํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [12, 13]. + * Memory ํŒจ๋„์˜ **Heap Snapshots**์„ ์‚ฌ์šฉํ•˜์—ฌ ์Šค๋ƒ…์ƒท ๊ฐ„์˜ ์ฐจ์ด(Delta)๋ฅผ ๋น„๊ตํ•จ์œผ๋กœ์จ, DOM์—์„œ ์ œ๊ฑฐ๋˜์—ˆ์œผ๋‚˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฐธ์กฐ๊ฐ€ ๋‚จ์•„์žˆ๋Š” 'Detached DOM nodes'๋ฅผ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [14-17]. ๋˜ํ•œ, **Allocation Timeline**์„ ํ†ตํ•ด ์ƒˆ๋กœ์šด ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์–ธ์ œ ํ• ๋‹น๋˜๋Š”์ง€ ์ถ”์ ํ•˜์—ฌ ๋ˆ„์ˆ˜ ํ›„๋ณด๋ฅผ ์ฐพ์•„๋ƒ…๋‹ˆ๋‹ค [18, 19]. +* **React ์ปดํฌ๋„ŒํŠธ ๋ฐ ์„ฑ๋Šฅ ๋””๋ฒ„๊น…:** + * **๋ฆฌ๋ Œ๋”๋ง ์›์ธ ์ถ”์ :** React DevTools์˜ Profiler๋ฅผ ์‚ฌ์šฉํ•ด ์–ด๋–ค ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ธ์ œ, ์™œ ๋ Œ๋”๋ง๋˜์—ˆ๋Š”์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ฐœ๋ฐœ ์ „์šฉ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ `why-did-you-render`๋ฅผ ํ†ตํ•ด ์‹ค์ œ props๋‚˜ ์ƒํƒœ ๋ณ€๊ฒฝ ์—†์ด ๋ฐœ์ƒํ•˜๋Š” ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ์ฝ˜์†” ๊ฒฝ๊ณ ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [7, 20]. + * **React Error Boundaries:** React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” Error Boundary๋ผ๋Š” ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ์˜ ๋ Œ๋”๋ง, ์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ, ์ƒ์„ฑ์ž์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ๋ฅผ ํฌ์ฐฉํ•ฉ๋‹ˆ๋‹ค [1]. ์ด๋Š” UI๋ฅผ ์œ„ํ•œ `try-catch` ๋ธ”๋ก ์—ญํ• ์„ ํ•˜๋ฉฐ, ์•ฑ ์ „์ฒด๊ฐ€ ์ถฉ๋Œํ•˜๋Š” ๋Œ€์‹  Fallback UI๋ฅผ ํ‘œ์‹œํ•˜์—ฌ ์•ฑ์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์„ ์ƒํ˜ธ์ž‘์šฉ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋กœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค [1, 8, 10]. +* **์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ์™€ ๋””๋ฒ„๊น… ํŽธ์˜์„ฑ:** + * ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ์˜ ์„ ํƒ์€ ๋””๋ฒ„๊น… ๊ฒฝํ—˜์— ํฐ ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค. Context API๋Š” ์ƒํƒœ ๋ณ€๊ฒฝ ๊ธฐ๋ก ์ถ”์ ์ด๋‚˜ ์‹œ๊ฐ„ ์—ฌํ–‰(Time-travel) ๋””๋ฒ„๊น…์ด ๋ถˆ๊ฐ€๋Šฅํ•˜์—ฌ ๋ฒ„๊ทธ ์›์ธ์„ ํŒŒ์•…ํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค [21]. ๋ฐ˜๋ฉด, Redux๋Š” Redux DevTools๋ฅผ ํ†ตํ•ด ์–ด๋–ค ์•ก์…˜์ด ์–ธ์ œ ๋””์ŠคํŒจ์น˜๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ์ƒํƒœ ์ด๋ ฅ์„ ๊ฒ€์‚ฌ ๋ฐ ์žฌ์ƒ(Replay)ํ•  ์ˆ˜ ์žˆ์–ด ๋ณต์žกํ•œ ๋น„๋™๊ธฐ ์—๋Ÿฌ๋ฅผ ์‹ ์†ํ•˜๊ฒŒ ๋””๋ฒ„๊น…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [21, 22]. +* **ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ๋กœ๊น…:** + * ๋ฐฐํฌ๋œ ํ”„๋กœ๋•์…˜ ์•ฑ์—์„œ๋Š” Sentry, LogRocket, Datadog RUM ๋“ฑ์˜ ํด๋ผ์šฐ๋“œ ๋กœ๊น… ํˆด์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž๊ฐ€ ๊ฒฝํ—˜ํ•˜๋Š” ์—๋Ÿฌ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค [23-25]. + * Sentry๋Š” ์ง€๋Šฅํ˜• ์—๋Ÿฌ ๊ทธ๋ฃนํ™”(Error grouping)์™€ ์—๋Ÿฌ ๋ฐœ์ƒ ์ „์˜ ์ฝ˜์†” ๋กœ๊ทธ, ๋„คํŠธ์›Œํฌ ์š”์ฒญ ๋“ฑ์„ ๋ณด์—ฌ์ฃผ๋Š” ๋นต๋ถ€์Šค๋Ÿฌ๊ธฐ(Breadcrumb) ํŠธ๋ ˆ์ผ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [4, 25]. LogRocket์€ ์‚ฌ์šฉ์ž์˜ ์ „์ฒด ํ™”๋ฉด์„ ๋…นํ™”ํ•˜๋“ฏ DOM ๋ฐ Redux/Vuex ์ƒํƒœ ๋ณ€ํ™”๊นŒ์ง€ ์บก์ฒ˜ํ•˜๋Š” ์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด(Session replay) ๊ธฐ๋Šฅ์œผ๋กœ ์ƒ์„ธํ•œ ๋””๋ฒ„๊น… ์ปจํ…์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [5]. Datadog RUM์€ ํ”„๋ก ํŠธ์—”๋“œ ์—๋Ÿฌ๋ฅผ ๋ฐฑ์—”๋“œ ๋ถ„์‚ฐ ํŠธ๋ ˆ์ด์‹ฑ(Distributed tracing)๊ณผ ์ƒ๊ด€๊ด€๊ณ„ ์ง€์–ด(Correlation) ๋ณต์žกํ•œ ์‹œ์Šคํ…œ์˜ ์—๋Ÿฌ๋ฅผ ํŒŒ์•…ํ•˜๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค [24]. + +## โš–๏ธ Trade-offs & Caveats + +* **ํด๋ผ์šฐ๋“œ ๋กœ๊น… ๋„๊ตฌ์˜ ์„ฑ๋Šฅ ๋ฐ ๋น„์šฉ ๋ฌธ์ œ:** ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ๋“ค์€ ๋ Œ๋”๋ง ์„ฑ๋Šฅ ๋ฐ ๋ฒˆ๋“ค ํฌ๊ธฐ์— ์ง์ ‘์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค. ์ผ๋ถ€ ๋„๊ตฌ ๊ตฌํ˜„ ์‹œ ์ตœ๋Œ€ 120ms์˜ ์ถ”๊ฐ€ ๋กœ๋“œ ์‹œ๊ฐ„์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [26]. ๋˜ํ•œ, Datadog๊ณผ ๊ฐ™์€ ํˆด์€ ๋กœ๊ทธ ์ˆ˜์ง‘(Ingest)๊ณผ ๊ฒ€์ƒ‰์„ ์œ„ํ•œ ์ธ๋ฑ์‹ฑ(Index)์— ๋Œ€ํ•ด ์ด์ค‘ ๊ณผ๊ธˆ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด ๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ๋น„์šฉ์ด ๋งค์šฐ ๊ฐ€ํŒŒ๋ฅด๊ฒŒ ์ฆ๊ฐ€ํ•˜๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค [27, 28]. +* **์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด์™€ ๊ฐœ์ธ์ •๋ณด ์นจํ•ด (Privacy Concerns):** LogRocket์ฒ˜๋Ÿผ '๋ชจ๋“  ๊ฒƒ์„ ์บก์ฒ˜'ํ•˜๋Š” ์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด ๋ฐฉ์‹์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ•๋ ฅํ•œ ๋””๋ฒ„๊น… ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜์ง€๋งŒ, ๋ฏผ๊ฐํ•œ ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๊นŒ์ง€ ๋…นํ™”๋  ์ˆ˜ ์žˆ๋Š” ์‹ฌ๊ฐํ•œ ๊ฐœ์ธ์ •๋ณด ์นจํ•ด ์šฐ๋ ค๊ฐ€ ๋™๋ฐ˜๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ณ„๋„์˜ ๋งˆ์Šคํ‚น ๋ฐ ์„ค์ • ์ž‘์—…์ด ๊ฐ•์ œ๋ฉ๋‹ˆ๋‹ค [5, 29, 30]. +* **Error Boundaries์˜ ํ•œ๊ณ„:** ์„ ์–ธ์ ์ธ UI ์—๋Ÿฌ ์ฒ˜๋ฆฌ์— ๊ฐ•๋ ฅํ•˜์ง€๋งŒ, ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ๋‚ด๋ถ€์˜ ์—๋Ÿฌ, `setTimeout` ๊ฐ™์€ ๋น„๋™๊ธฐ ์ฝ”๋“œ, ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง(SSR), ๊ทธ๋ฆฌ๊ณ  Error Boundary ์ž์ฒด์—์„œ ๋ฐœ์ƒํ•œ ์—๋Ÿฌ๋Š” ํฌ์ฐฉํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ถ€๋ถ„์€ ์ „ํ†ต์ ์ธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ `try/catch` ๋ธ”๋ก์œผ๋กœ ๋””๋ฒ„๊น… ๋ฐ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์•ผ ํ•˜๋Š” ์ œ์•ฝ์ด ์žˆ์Šต๋‹ˆ๋‹ค [31, 32]. +* **React Compiler ๋„์ž…์— ๋”ฐ๋ฅธ ๋””๋ฒ„๊น… ๋‚œ์ด๋„ ์ฆ๊ฐ€:** ์ฝ”๋“œ๋ฅผ ์ž๋™์œผ๋กœ ์ตœ์ ํ™”ํ•ด์ฃผ๋Š” React Compiler๋Š” ๋‚ด๋ถ€ ๋กœ์ง์ด ๋ธ”๋ž™๋ฐ•์Šค(Black box) ํ˜•ํƒœ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” ์ตœ์ ํ™”๋œ ๋ถ€๋ถ„๊ณผ ๊ทธ ์ด์œ ์— ๋Œ€ํ•œ ๊ฐ€์‹œ์„ฑ์„ ์žƒ๊ฒŒ ๋˜๋ฉฐ, ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๋ฆฌ๋ Œ๋”๋ง ๋ฐœ์ƒ ์‹œ ์ฝ”๋“œ์ƒ์˜ `React.memo`๋‚˜ `useCallback` ํ˜ธ์ถœ์„ ํ™•์ธํ•˜๋Š” ๋Œ€์‹  React DevTools Profiler์— ์ „์ ์œผ๋กœ ์˜์กดํ•ด ์กฐ์‚ฌํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋””๋ฒ„๊น… ๋‚œ์ด๋„๊ฐ€ ์ƒ์Šนํ•ฉ๋‹ˆ๋‹ค [33]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [๊ด€๊ณ„ ์œ ํ˜• A (๋ธŒ๋ผ์šฐ์ € ๋ฐ ์„ฑ๋Šฅ ๋ถ„์„ ๊ธฐ๋ฐ˜ ๋„๊ตฌ)] +- [[Chrome DevTools]] + - ์—ฐ๊ฒฐ ์ด์œ : ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํž™ ๋ฉ”๋ชจ๋ฆฌ์™€ DOM์˜ ์ƒํƒœ๋ฅผ ํ”„๋กœํŒŒ์ผ๋งํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ์ง„๋‹จํ•˜๋Š” ๊ฐ€์žฅ ๊ทผ๋ณธ์ ์ธ ํ”„๋ก ํŠธ์—”๋“œ ๋””๋ฒ„๊น… ๋„๊ตฌ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [6, 34]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ธŒ๋ผ์šฐ์ €์˜ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜(GC) ๋™์ž‘ ์›๋ฆฌ, ๋ถ„๋ฆฌ๋œ DOM ๋…ธ๋“œ(Detached DOM nodes)์™€ ํด๋กœ์ €(Closure)๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ์œ ํ•˜์—ฌ ์„ฑ๋Šฅ์„ ์ €ํ•˜์‹œํ‚ค๋Š” ์›๋ฆฌ๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2, 14, 17, 35]. + +#### [๊ด€๊ณ„ ์œ ํ˜• B (React ์ปดํฌ๋„ŒํŠธ ๋ฐ ์—๋Ÿฌ ํ•ธ๋“ค๋ง ๋„๊ตฌ)] +- [[React Error Boundaries]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋ Œ๋”๋ง ๋ฐ ์ƒ๋ช…์ฃผ๊ธฐ ๋„์ค‘ ๋ฐœ์ƒํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๋ฅผ ๋””๋ฒ„๊น…/ํ•ธ๋“ค๋งํ•˜์—ฌ "ํ•˜์–€ ํ™”๋ฉด(White screen of death)"์„ ๋ง‰์•„์ฃผ๋Š” React๋งŒ์˜ ๊ณ ์œ ํ•œ ๋ฐฉ์–ด์  ๋””๋ฒ„๊น… ํŒจํ„ด์ž…๋‹ˆ๋‹ค [1, 36]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์„ ์–ธ์ (Declarative) UI ํŠธ๋ฆฌ์˜ ์—๋Ÿฌ ์ „ํŒŒ ๋ฐฉ์‹๊ณผ, ๋ช…๋ นํ˜•(Imperative) ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์—์„œ `try-catch`๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜์  ์ฐจ์ด๋ฅผ ๋ช…ํ™•ํžˆ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [32]. +- [[React DevTools Profiler]] + - ์—ฐ๊ฒฐ ์ด์œ : ์–ด๋–ค ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ธ์ œ, ์™œ ๋ฆฌ๋ Œ๋”๋ง๋˜์—ˆ๋Š”์ง€๋ฅผ ์ธก์ •(Profiling)ํ•˜์—ฌ ๋ Œ๋”๋ง ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ๋””๋ฒ„๊น…ํ•˜๋Š” ํ•„์ˆ˜ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค [7, 37]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: React์˜ ๋ Œ๋”๋ง ๋ผ์ดํ”„์‚ฌ์ดํด, ๋ถˆํ•„์š”ํ•œ ์ƒํƒœ ๋ฐ props ๋ณ€๊ฒฝ ์ถ”์ , ๊ทธ๋ฆฌ๊ณ  React Compiler ๋„์ž… ์ „ํ›„์˜ ๋ Œ๋”๋ง ํŒจ์Šค(Render pass) ์ฐจ์ด๋ฅผ ๊ฒ€์ฆํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [7, 38]. + +#### [๊ด€๊ณ„ ์œ ํ˜• C (ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ ๊ด€์ธก์„ฑ ๋„๊ตฌ)] +- [[Session Replay & Distributed Tracing]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋กœ์ปฌ์—์„œ ์žฌํ˜„์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ํ”„๋กœ๋•์…˜ ์—๋Ÿฌ๋ฅผ ์ถ”์ ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ์ž์˜ ๋ธŒ๋ผ์šฐ์ € ์ƒํ˜ธ์ž‘์šฉ(Sentry, LogRocket)๊ณผ ๋ฐฑ์—”๋“œ ๋ฐ์ดํ„ฐ ํ๋ฆ„(Datadog)์„ ์—ฐ๊ฒฐํ•˜์—ฌ ๋””๋ฒ„๊น… ๋‹จ์„œ๋ฅผ ์ฐพ๋Š” ํ•ต์‹ฌ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค [5, 24, 39]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํ’€์Šคํƒ ํ™˜๊ฒฝ์—์„œ์˜ ์—”๋“œํˆฌ์—”๋“œ(End-to-End) ์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง ํ•œ๊ณ„์™€ ํ”„๋ก ํŠธ์—”๋“œ ์—๋Ÿฌ๊ฐ€ ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค์— ๋ฏธ์น˜๋Š” ์—ฐ๊ด€ ๊ด€๊ณ„๋ฅผ ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [24, 25]. + +### Deeper Research Questions + +- Chrome DevTools์˜ Heap Snapshot ๋ถ„์„์—์„œ 'Shallow size'์™€ 'Retained size'์˜ ์ฐจ์ด๋Š” ํ”„๋ก ํŠธ์—”๋“œ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ์ธก๋ฉด์—์„œ ์–ด๋–ป๊ฒŒ ํ•ด์„๋˜๋ฉฐ, ๋””๋ฒ„๊น… ์‹œ ์–ด๋–ค ๊ธฐ์ค€ํ‘œ๊ฐ€ ๋˜๋Š”๊ฐ€? [40] +- React Error Boundary๊ฐ€ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋‚˜ ๋น„๋™๊ธฐ ์ฝ”๋“œ์˜ ์—๋Ÿฌ๋ฅผ ์žก์ง€ ๋ชปํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜์  ์ด์œ ๋Š” ๋ฌด์—‡์ด๋ฉฐ, ์ด๋ฅผ ๋ณด์™„ํ•˜์—ฌ ์ „์ฒด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์—๋Ÿฌ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ์บก์ฒ˜ํ•˜๊ธฐ ์œ„ํ•œ ์ตœ์ ์˜ ๋กœ๊น… ํŒจํ„ด์€ ๋ฌด์—‡์ธ๊ฐ€? [31, 32] +- Sentry, LogRocket, Datadog RUM ๋“ฑ ํด๋ผ์šฐ๋“œ ๊ธฐ๋ฐ˜ ๋กœ๊น… ๋„๊ตฌ๊ฐ€ ํ”„๋ก ํŠธ์—”๋“œ ๋ฒˆ๋“ค ํฌ๊ธฐ ์ฆ๊ฐ€ ๋ฐ ์ดˆ๊ธฐ ๋ Œ๋”๋ง ์„ฑ๋Šฅ ์ง€์—ฐ(์ตœ๋Œ€ 120ms ์ถ”๊ฐ€ ๋กœ๋“œ)์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•œ ์„ค์ • ๋ฐ ๋กœ๋“œ ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? [26, 41] +- Redux DevTools์˜ ์‹œ๊ฐ„ ์—ฌํ–‰(Time-travel) ๋””๋ฒ„๊น… ์›๋ฆฌ๋Š” ๋ฌด์—‡์ด๋ฉฐ, ์™œ Context API๋‚˜ Zustand๋ณด๋‹ค ๋ณต์žกํ•œ ๋น„๋™๊ธฐ ์ƒํƒœ์˜ ๋ฒ„๊ทธ๋ฅผ ๋” ๋น ๋ฅด๊ณ  ์ •ํ™•ํ•˜๊ฒŒ ์ฐพ์•„๋‚ผ ์ˆ˜ ์žˆ๋Š”๊ฐ€? [21, 22] +- React Compiler ๋„์ž… ์ดํ›„ ์ž๋™ํ™”๋œ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ Œ๋”๋ง ์ด์Šˆ(์˜ˆ: Library Compatibility ๋ฌธ์ œ๋กœ ์ธํ•œ ์ฐธ์กฐ ๋ณ€๊ฒฝ)๋ฅผ ๋””๋ฒ„๊น…ํ•˜๊ธฐ ์œ„ํ•ด React Profiler๋ฅผ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•ด์•ผ ํ•˜๋Š”๊ฐ€? [33, 42, 43] + +### Practical Application Contexts + +- **Implementation:** ๊ฐœ๋ฐœ์ž๋Š” `why-did-you-render` ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ”„๋กœ์ ํŠธ์— ์—ฐ๋™ํ•ด, ๋กœ์ปฌ ๊ฐœ๋ฐœ ์‹œ ๋ถˆํ•„์š”ํ•œ ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง ์›์ธ์„ ์ฝ˜์†” ๊ฒฝ๊ณ ๋ฅผ ํ†ตํ•ด ์ฆ‰๊ฐ์ ์œผ๋กœ ํŒŒ์•…ํ•˜๊ณ  ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [20, 44]. +- **System Design:** ํ”„๋ก ํŠธ์—”๋“œ ์‹œ์Šคํ…œ ์„ค๊ณ„ ์‹œ ๋Œ€์‹œ๋ณด๋“œ, ์ฐจํŠธ, ๋ณต์žกํ•œ ํผ ๋“ฑ ์žฅ์•  ๋ฐœ์ƒ ํ™•๋ฅ ์ด ๋†’์€ UI ์ปดํฌ๋„ŒํŠธ ๊ฐ๊ฐ์— ๋…๋ฆฝ์ ์ธ `Error Boundary`๋ฅผ ๋ฐฐ์น˜ํ•ด ํ•˜๋‚˜์˜ ์œ„์ ฏ ๊ฒฐํ•จ์ด ์ „์ฒด ์•ฑ์˜ ๋งˆ๋น„๋ฅผ ๊ฐ€์ ธ์˜ค์ง€ ์•Š๋„๋ก ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค [8, 45, 46]. +- **Operation / Maintenance:** ํ”„๋กœ๋•์…˜ ๋‹จ๊ณ„์—์„œ๋Š” Sentry๋‚˜ LogRocket๊ณผ ๊ฐ™์€ ๊ด€์ธก์„ฑ(Observability) ํˆด์„ ํ†ตํ•ฉํ•˜์—ฌ, ์˜ค๋ฅ˜ ๋กœ๊ทธ ๋ฐœ์ƒ ์‹œ ์‚ฌ์šฉ์ž๊ฐ€ ํด๋ฆญํ•œ ์ด๋ฒคํŠธ์™€ ํ™”๋ฉด์˜ ์ƒํƒœ(Session Replay)๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํ™•์ธํ•˜๊ณ  ๋น ๋ฅด๊ฒŒ ์ด์Šˆ๋ฅผ ๋Œ€์‘(Hotfix)ํ•ฉ๋‹ˆ๋‹ค [5, 25, 47]. +- **Learning Path:** ์ฃผ๋‹ˆ์–ด ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ํ•™์Šตํ•  ๋•Œ, Chrome DevTools์˜ Memory ํƒญ์„ ์‚ฌ์šฉํ•ด ์Šค๋ƒ…์ƒท์„ ์ฐ๊ณ  DOM ๋…ธ๋“œ๊ฐ€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ณ€์ˆ˜์— ์˜ํ•ด ์ฐธ์กฐ๋˜์–ด ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜๋˜์ง€ ์•Š๋Š” ์ƒํ™ฉ(Detached Elements)์„ ์‹ค์Šตํ•ฉ๋‹ˆ๋‹ค [14, 15, 17]. +- **My Project Relevance:** React ํ”„๋กœ์ ํŠธ์—์„œ ์ „์—ญ ์ƒํƒœ๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ, ๋‹จ์ˆœ ์„ค์ •(Theme ๋“ฑ)์€ ๋””๋ฒ„๊น…์ด ๋‹จ์ˆœํ•œ Context API๋กœ, ๋ณ€๊ฒฝ์ด ์žฆ๊ณ  ์ƒํƒœ ์ถ”์ ์ด ์ค‘์š”ํ•œ ์š”์†Œ๋Š” DevTools๋ฅผ ์ง€์›ํ•˜๋Š” Redux๋‚˜ Zustand๋ฅผ ๋„์ž…ํ•˜์—ฌ ๋””๋ฒ„๊น… ์šฉ์ด์„ฑ์„ ํ™•๋ณดํ•ฉ๋‹ˆ๋‹ค [22, 48, 49]. + +### Adjacent Topics + +- [[State Management Architecture]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(Redux, Zustand, Context API ๋“ฑ)์˜ ์•„ํ‚คํ…์ฒ˜์  ์„ ํƒ์ด ์ƒํƒœ ๋ณ€ํ™” ์ถ”์ ์„ฑ๊ณผ DevTools ๋””๋ฒ„๊น… ํ€„๋ฆฌํ‹ฐ์— ์–ด๋–ค ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”์ง€ ๋ถ„์„ [21, 22, 49]. +- [[Frontend Performance Optimization]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋””๋ฒ„๊น…์„ ํ†ตํ•ด ๋ฐœ๊ฒฌํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜์™€ ๋ถˆํ•„์š”ํ•œ ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง(Re-renders) ๋ฌธ์ œ๋ฅผ ์‹ค์งˆ์ ์ธ ์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ธฐ๋ฒ•(๊ฐ€์ƒํ™”, ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…)์œผ๋กœ ํ•ด๊ฒฐํ•˜์—ฌ Core Web Vitals๋ฅผ ๊ฐœ์„ ํ•˜๋Š” ๋ฐฉํ–ฅ [20, 50]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Development/Engineering Scalable Frontend Systems.md b/10_Wiki/Development/Engineering Scalable Frontend Systems.md new file mode 100644 index 00000000..387ef5fb --- /dev/null +++ b/10_Wiki/Development/Engineering Scalable Frontend Systems.md @@ -0,0 +1,84 @@ +# [[Engineering Scalable Frontend Systems]] + +## ๐Ÿ“Œ Brief Summary +ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ํ”„๋ก ํŠธ์—”๋“œ ์‹œ์Šคํ…œ(Engineering Scalable Frontend Systems)์€ ๋‹จ์ˆœํ•œ ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰์„ ๋„˜์–ด ์œ ์ง€๋ณด์ˆ˜์„ฑ, ๊ณ ์„ฑ๋Šฅ, ๊ฒฌ๊ณ ์„ฑ์„ ๊ฐ–์ถ˜ ๋ถ„์‚ฐ ์†Œํ”„ํŠธ์›จ์–ด ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค [1]. ์ด๋Š” ๊ธฐ์ˆ ์  ํŒŒ์ผ ๊ธฐ๋ฐ˜ ํด๋” ๊ตฌ์กฐ์—์„œ ๊ธฐ๋Šฅ ์ค‘์‹ฌ(Feature-Based) ๋ฐ ๋„๋ฉ”์ธ ๊ธฐ๋ฐ˜ ์„ค๊ณ„๋กœ์˜ ์ „ํ™˜์„ ์š”๊ตฌํ•˜๋ฉฐ, ์—„๊ฒฉํ•œ ์ฝ”๋“œ ์ปจ๋ฒค์…˜๊ณผ ๊ฑฐ๋ฒ„๋„Œ์Šค๋ฅผ ๋™๋ฐ˜ํ•ฉ๋‹ˆ๋‹ค [2, 3]. ๋˜ํ•œ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์— SOLID์™€ ๊ฐ™์€ ์†Œํ”„ํŠธ์›จ์–ด ๊ณตํ•™ ์›์น™์„ ๊ฒฐํ•ฉํ•˜๊ณ , ์„œ๋ฒ„/ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ์˜ ๋ถ„๋ฆฌ, ๊ทธ๋ฆฌ๊ณ  ๋นŒ๋“œ ํƒ€์ž„ ๋ฐ ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ํ†ตํ•ด ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ์„ฑ์žฅ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค [1, 4, 5]. + +## ๐Ÿ“– Core Content + +* **์•„ํ‚คํ…์ฒ˜ ๋ฐ ํด๋” ๊ตฌ์กฐ์˜ ์ง„ํ™”** + ๊ธฐ์กด์˜ ์ปดํฌ๋„ŒํŠธ, ํ›…, ์Šคํƒ€์ผ ๋“ฑ์„ ํŒŒ์ผ ํƒ€์ž…๋ณ„๋กœ ๋ชจ์•„๋‘๋Š” ๊ตฌ์กฐ๋Š” ์•ฑ์ด ์ปค์งˆ์ˆ˜๋ก ์ธ์ง€ ๋ถ€ํ•˜๋ฅผ ๋†’์ด๊ณ  ํ™•์žฅ์„ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค [2, 6]. 2025๋…„์˜ ํ”„๋ก ํŠธ์—”๋“œ ์‹œ์Šคํ…œ์€ ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ๊ณผ ๊ธฐ๋Šฅ(Feature)์„ ์ค‘์‹ฌ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์‘์ง‘์‹œํ‚ค๋Š” ๊ตฌ์กฐ๋ฅผ ํ‘œ์ค€์œผ๋กœ ์‚ผ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค [3, 7]. ํŠนํžˆ **Feature-Sliced Design (FSD)** ๊ฐ™์€ ์•„ํ‚คํ…์ฒ˜๋Š” ์ฝ”๋“œ๋ฅผ ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ๋ณ„ ๋ ˆ์ด์–ด(shared, entities, features, widgets, pages, app)๋กœ ๋‚˜๋ˆ„๊ณ , ์ƒ์œ„ ๊ณ„์ธต์—์„œ ํ•˜์œ„ ๊ณ„์ธต์œผ๋กœ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์—„๊ฒฉํ•œ ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ๊ทœ์น™์„ ๊ฐ•์ œํ•ฉ๋‹ˆ๋‹ค [8-10]. ๊ฐ ์Šฌ๋ผ์ด์Šค๋Š” `index.ts`๋ฅผ ํ†ตํ•ด ํผ๋ธ”๋ฆญ API(Public API)๋งŒ ์™ธ๋ถ€์— ๋…ธ์ถœํ•˜์—ฌ ๋‚ด๋ถ€ ๊ตฌํ˜„์„ ์บก์Аํ™”ํ•ฉ๋‹ˆ๋‹ค [4, 11, 12]. +* **์†Œํ”„ํŠธ์›จ์–ด ๊ณตํ•™ ์›์น™์˜ ์ ์šฉ (SOLID & Clean Code)** + ํ”„๋ก ํŠธ์—”๋“œ ์ฝ”๋“œ์˜ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ์œ„ํ•ด SOLID, DRY, KISS, YAGNI ์›์น™์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค [4, 13]. + * ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)์— ๋”ฐ๋ผ ๋„ˆ๋ฌด ๋งŽ์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋Œ€ํ˜• ์ปดํฌ๋„ŒํŠธ(์˜ˆ: 300์ค„ ์ด์ƒ)๋Š” ๋ฐ์ดํ„ฐ ํŒจ์นญ, ์ƒํƒœ ๊ด€๋ฆฌ, UI ๋ Œ๋”๋ง ๋“ฑ์˜ ์ฑ…์ž„์— ๋งž๊ฒŒ ๋” ์ž‘๊ณ  ๋…๋ฆฝ์ ์ธ ๋‹จ์œ„๋กœ ๋ถ„๋ฆฌ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [14]. + * ๊ฐœ๋ฐฉ-ํ์‡„ ์›์น™(OCP)์€ ๊ธฐ์กด ์ปดํฌ๋„ŒํŠธ ์†Œ์Šค๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  `children` prop์ด๋‚˜ Render Props ํŒจํ„ด์„ ์ด์šฉํ•œ ์ปดํฌ๋„ŒํŠธ ํ•ฉ์„ฑ(Composition)์œผ๋กœ ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค [15, 16]. + * ์ค‘๋ณต์„ ์ค„์ด๋Š” DRY ์›์น™์€ ๊ณตํ†ต ๋กœ์ง์„ ์ปค์Šคํ…€ ํ›…์œผ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•˜์ง€๋งŒ, ์ง€๋‚˜์นœ ์ถ”์ƒํ™”๋Š” ์ฝ”๋“œ ํŒŒ์•…์„ ์–ด๋ ต๊ฒŒ ํ•˜๋ฏ€๋กœ ๋‹จ์ˆœ์„ฑ์„ ์œ ์ง€ํ•˜๋Š” KISS ์›์น™๊ณผ ๊ท ํ˜•์„ ์ด๋ฃจ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [17]. +* **์ƒํƒœ ๊ด€๋ฆฌ ํŒจ๋Ÿฌ๋‹ค์ž„์˜ ์„ธ๋ถ„ํ™”** + ๊ฑฐ๋Œ€ํ•œ ๋‹จ์ผ ์ƒํƒœ ์ €์žฅ์†Œ(์˜ˆ: ๊ณผ๊ฑฐ์˜ Redux)์— ์˜์กดํ•˜๊ธฐ๋ณด๋‹ค๋Š” ๋ฐ์ดํ„ฐ์˜ ์„ฑ๊ฒฉ์— ๋”ฐ๋ผ ์ตœ์ ์˜ ๋„๊ตฌ๋ฅผ ์„ ํƒํ•˜์—ฌ ์ƒํƒœ๋ฅผ ํŒŒํŽธํ™” ๋ฐ ์ „๋ฌธํ™”ํ•ฉ๋‹ˆ๋‹ค [5]. + * **์ „์—ญ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒํƒœ:** Context API๋Š” ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ ์ „์ฒด๋ฅผ ๋ฆฌ๋ Œ๋”๋งํ•˜๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ [18, 19], ์ƒํƒœ ๋ณ€๊ฒฝ์ด ์žฆ๊ณ  ๊ทœ๋ชจ๊ฐ€ ํฐ ์•ฑ์—์„œ๋Š” ๋ถ€๋ถ„ ๊ตฌ๋…(Selector)์„ ์ง€์›ํ•˜์—ฌ ๋ Œ๋”๋ง ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๋Š” **Zustand**๋‚˜ **Jotai**๊ฐ€ ์„ ํ˜ธ๋ฉ๋‹ˆ๋‹ค [5, 20, 21]. + * **์„œ๋ฒ„ ์ƒํƒœ (API Layer):** API์—์„œ ๊ฐ€์ ธ์˜จ ๋ฐ์ดํ„ฐ๋Š” ์บ์‹ฑ, ๋™๊ธฐํ™”, ๋กœ๋”ฉ/์—๋Ÿฌ ์‚ฌ์ดํด ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋ฏ€๋กœ, ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ์™€ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌํ•˜์—ฌ **TanStack Query (React Query)** ๋“ฑ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค [18, 22]. +* **์„ฑ๋Šฅ ์—”์ง€๋‹ˆ์–ด๋ง ๋ฐ ๋นŒ๋“œ ์ตœ์ ํ™”** + ์ดˆ๊ธฐ ๋กœ๋”ฉ ์‹œ๊ฐ„๊ณผ Core Web Vitals ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด ๋‹ค์–‘ํ•œ ๊ธฐ๋ฒ•์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค [23, 24]. + * **๋นŒ๋“œ/์ปดํŒŒ์ผ ํƒ€์ž„:** Vite์™€ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ES ๋ชจ๋“ˆ์„ ์ œ๊ณตํ•˜๊ณ , ํ”„๋กœ๋•์…˜์—์„œ๋Š” Rollup์˜ `manualChunks`๋ฅผ ํ™œ์šฉํ•ด ์šฉ๋Ÿ‰์ด ํฐ ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(React, Recharts ๋“ฑ)๋ฅผ ๋ถ„ํ•  ์บ์‹ฑํ•˜์—ฌ ์บ์‹œ ํšจ์œจ์„ ๋†’์ž…๋‹ˆ๋‹ค [23, 25-27]. ๋˜ํ•œ **React Compiler**์˜ ๋„์ž…์œผ๋กœ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ž๋™์œผ๋กœ ์ฝ”๋“œ์˜ ๋ฆฌ๋ Œ๋”๋ง ๋ฐฉ์ง€(๋ฉ”๋ชจ์ด์ œ์ด์…˜)๋ฅผ ์ฒ˜๋ฆฌํ•˜์—ฌ ์ˆ˜๋™ ์ตœ์ ํ™”(`useMemo`, `useCallback`)์˜ ์˜ค๋ฅ˜๋ฅผ ์ค„์—ฌ์ค๋‹ˆ๋‹ค [25, 28, 29]. + * **๋Ÿฐํƒ€์ž„ ์ตœ์ ํ™”:** ๋™์  ์ž„ํฌํŠธ๋ฅผ ์ด์šฉํ•œ ๋ผ์šฐํŠธ ๋ฐ ์ปดํฌ๋„ŒํŠธ ๋ ˆ๋ฒจ์˜ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…(Code Splitting & Lazy Loading), ๊ทธ๋ฆฌ๊ณ  ์ˆ˜์ฒœ ๊ฐœ์˜ ๋ฆฌ์ŠคํŠธ ์•„์ดํ…œ ๋ Œ๋”๋ง ์‹œ DOM ๋น„๋Œ€๋ฅผ ๋ง‰๋Š” ๊ฐ€์ƒํ™”(Virtualization) ๊ธฐ์ˆ ์ด ํ•„์ˆ˜์ ์œผ๋กœ ์š”๊ตฌ๋ฉ๋‹ˆ๋‹ค [30-32]. +* **๋ณต์›๋ ฅ(Resilience) ๋ฐ ์‹œ์Šคํ…œ ๊ฑฐ๋ฒ„๋„Œ์Šค** + ๊ฒฌ๊ณ ํ•œ ์‹œ์Šคํ…œ์€ ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜๊ฐ€ ์ „์ฒด ์•ฑ์˜ ํฌ๋ž˜์‹œ๋กœ ์ด์–ด์ง€๋Š” ๊ฒƒ์„ ๋ง‰์Šต๋‹ˆ๋‹ค. UI์˜ ๋ถˆ์•ˆ์ •ํ•œ ์˜์—ญ์ด๋‚˜ ์„œ๋“œํŒŒํ‹ฐ ์œ„์ ฏ์€ **Error Boundaries**๋กœ ๊ฐ์‹ธ ํด๋ฐฑ UI๋ฅผ ์ œ๊ณตํ•˜์—ฌ ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค [33-35]. ๋˜ํ•œ, ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•œ DevTools ํž™ ์Šค๋ƒ…์ƒท ๋””๋ฒ„๊น…๊ณผ Sentry, LogRocket ๊ฐ™์€ ํด๋ผ์šฐ๋“œ ๋„๊ตฌ๋ฅผ ์ด์šฉํ•œ ํ”„๋กœ๋•์…˜ ์—๋Ÿฌ ๋ชจ๋‹ˆํ„ฐ๋ง์ด ํ™œ์šฉ๋ฉ๋‹ˆ๋‹ค [36-38]. ํ˜‘์—… ์ฐจ์›์—์„œ๋Š” ์ผ๊ด€๋œ ๋„ค์ด๋ฐ ๊ทœ์น™(์˜ˆ: ํŒŒ์ผ๋ช…์€ kebab-case, ์ปดํฌ๋„ŒํŠธ๋Š” PascalCase)๊ณผ ESLint, Prettier, Husky๋ฅผ ํ†ตํ•œ ์ž๋™ํ™”๋œ ๊ฑฐ๋ฒ„๋„Œ์Šค, ๊ทธ๋ฆฌ๊ณ  Storybook์„ ํ™œ์šฉํ•œ ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ๊ฐ€ ์ฝ”๋“œ ํ’ˆ์งˆ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค [39-41]. + +## โš–๏ธ Trade-offs & Caveats +* **Feature-Sliced Design (FSD)์˜ ์ดˆ๊ธฐ ๋„์ž… ๋น„์šฉ ๋ฐ ๋ณต์žก์„ฑ:** FSD๋Š” ํ™•์žฅ์„ฑ๊ณผ ๋ชจ๋“ˆํ™”์— ๋›ฐ์–ด๋‚˜์ง€๋งŒ ๋Ÿฌ๋‹ ์ปค๋ธŒ๊ฐ€ ๋†’์œผ๋ฉฐ, ์ž‘์€ ๊ทœ๋ชจ์˜ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์˜ค๋ฒ„์—”์ง€๋‹ˆ์–ด๋ง์œผ๋กœ ๋А๊ปด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [42, 43]. ๋˜ํ•œ '์ธ์ฆ(Auth)' ๊ฐ™์€ ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ(Cross-cutting concerns)๋ฅผ ์ •ํ™•ํžˆ ์–ด๋–ค ๊ธฐ๋Šฅ์ด๋‚˜ ์Šฌ๋ผ์ด์Šค์— ๋ฐฐ์น˜ํ• ์ง€ ๊ฒฝ๊ณ„๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ์–ด๋ ค์›Œ ํŒ€ ๋‚ด ๊ทœ์น™ ํ•ฉ์˜์™€ ์ง€์†์ ์ธ ๋ฌธ์„œํ™”๊ฐ€ ์š”๊ตฌ๋ฉ๋‹ˆ๋‹ค [44, 45]. +* **React Compiler ์ ์šฉ์˜ ์ œ์•ฝ:** React Compiler๊ฐ€ ์ž๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ์„ฑ๋Šฅ์„ ๋†’์—ฌ์ฃผ์ง€๋งŒ, ์ด๋Š” ๋ธ”๋ž™๋ฐ•์Šค๋กœ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜ˆ๊ธฐ์น˜ ์•Š๊ฒŒ ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์›์ธ์„ ๋””๋ฒ„๊น…ํ•˜๊ธฐ ๋” ์–ด๋ ค์›Œ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [46]. ๋˜ํ•œ ๋งค ๋ Œ๋”๋ง๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๊ฐ์ฒด ์ฐธ์กฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์ถฉ๋Œํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ๊ฒฝ์šฐ React์˜ ๋ถˆ๋ณ€์„ฑ ๋ฐ ๋ถ€์ˆ˜ ํšจ๊ณผ ๊ทœ์น™(Rules of React)์„ ์—„๊ฒฉํžˆ ์ค€์ˆ˜ํ•˜๋„๋ก ๋Œ€๋Œ€์ ์ธ ๋ฆฌํŒฉํ† ๋ง์ด ์„ ํ–‰๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [28, 47, 48]. +* **Context API vs. ์™ธ๋ถ€ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„:** Context API๋Š” ๋‚ด์žฅ ๊ธฐ๋Šฅ์ด๋ฏ€๋กœ ์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๋Š” ์žฅ์ ์ด ์žˆ์ง€๋งŒ, ๋ณ€๊ฒฝ์ด ์žฆ์€ ์ƒํƒœ์— ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ๋ถˆํ•„์š”ํ•œ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์˜ ์—ฐ์‡„ ๋ฆฌ๋ Œ๋”๋ง์„ ์œ ๋ฐœํ•˜๋Š” ์น˜๋ช…์ ์ธ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ์„ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค [19, 20]. ๋ฐ˜๋Œ€๋กœ Zustand๋‚˜ TanStack Query๋ฅผ ๋„์ž…ํ•˜๋ฉด ๋ฆฌ๋ Œ๋”๋ง ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์œผ๋‚˜, ์‹œ์Šคํ…œ์— ์ƒˆ๋กœ์šด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์˜์กด์„ฑ๊ณผ ํ•™์Šต ๊ณก์„ ์ด ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค [21, 49]. +* **DRY์™€ KISS ์›์น™์˜ ์ƒ์ถฉ:** ์ค‘๋ณต์„ ์ค„์ด๊ธฐ(DRY) ์œ„ํ•ด ๊ณตํ†ต ๋กœ์ง์„ ๊ณ ์ฐจ ์ปดํฌ๋„ŒํŠธ(HOC)๋‚˜ ์ปค์Šคํ…€ ํ›…์œผ๋กœ ์ง€๋‚˜์น˜๊ฒŒ ์ถ”์ƒํ™”ํ•˜๋ฉด, ์ฝ”๋“œ๊ฐ€ ์›๋ž˜์˜ ๋‹จ์ˆœํ•œ ํ˜•ํƒœ๋ณด๋‹ค ์ดํ•ดํ•˜๊ณ  ๋””๋ฒ„๊น…ํ•˜๊ธฐ ํ›จ์”ฌ ์–ด๋ ค์›Œ์ ธ ๊ฒฐ๊ตญ KISS ์›์น™์„ ์œ„๋ฐฐํ•˜๊ฒŒ ๋˜๋Š” ๋ถ€์ž‘์šฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [17]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [๊ด€๊ณ„ ์œ ํ˜• A: ์•„ํ‚คํ…์ฒ˜ ๋ฐ ์‹œ์Šคํ…œ ๊ตฌ์กฐ (Architecture & Structural Design)] +* `[[Feature-Sliced Design (FSD)]]` + * ์—ฐ๊ฒฐ ์ด์œ : ํ˜„๋Œ€ ํ”„๋ก ํŠธ์—”๋“œ์˜ ๋ชจ๋“ˆํ™” ๋ฐ ํ™•์žฅ์„ฑ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋„๋ฆฌ ์ฑ„ํƒ๋˜๋Š” ์•„ํ‚คํ…์ฒ˜ ๋ฐฉ๋ฒ•๋ก ์˜ ํ•ต์‹ฌ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [9, 10]. + * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ ๊ธฐ๋ฐ˜์˜ ์ฝ”๋“œ ๋ถ„ํ• , ์—„๊ฒฉํ•œ ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ๊ทœ์น™ ์ ์šฉ ๋ฐฉ๋ฒ•, ๊ทธ๋ฆฌ๊ณ  ํผ๋ธ”๋ฆญ API๋ฅผ ํ†ตํ•œ ๋ชจ๋“ˆ ์บก์Аํ™” ์›๋ฆฌ [4, 8, 50]. +* `[[Error Boundaries]]` + * ์—ฐ๊ฒฐ ์ด์œ : ๋ถ€๋ถ„์ ์ธ UI ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๊ฐ€ ์‹œ์Šคํ…œ ์ „์ฒด์˜ ์žฅ์• (White screen of death)๋กœ ํ™•์‚ฐ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๊ตฌ์กฐ์  ์•ˆ์ „ ์žฅ์น˜์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [33, 34]. + * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ Œ๋”๋ง ํŠธ๋ฆฌ์—์„œ ์ปดํฌ๋„ŒํŠธ ๊ฒฐํ•จ์„ ๊ฒฉ๋ฆฌํ•˜๋Š” ์›๋ฆฌ์™€ ์‹œ์Šคํ…œ ๋ณต์›๋ ฅ์„ ๋†’์ด๋Š” ์—๋Ÿฌ ์ฒ˜๋ฆฌ ์ „๋žต [33, 35]. + +#### [๊ด€๊ณ„ ์œ ํ˜• B: ์ƒํƒœ ๊ด€๋ฆฌ ํŒจ๋Ÿฌ๋‹ค์ž„ (State Management Paradigms)] +* `[[Zustand vs Context API]]` + * ์—ฐ๊ฒฐ ์ด์œ : ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ์—์„œ ์„ฑ๋Šฅ๊ณผ ํ™•์žฅ์„ฑ์„ ๊ฒฐ์ •์ง“๋Š” ๊ฐ€์žฅ ๋นˆ๋ฒˆํ•œ ์•„ํ‚คํ…์ฒ˜ ๊ฒฐ์ • ์ง€์ ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [5, 19]. + * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Context API์˜ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ๋ Œ๋”๋ง ๋ฌธ์ œ์ ๊ณผ ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ Zustand์˜ ๊ตฌ๋…/์„ ํƒ์ž(Selector) ๊ธฐ๋ฐ˜ ๋ Œ๋”๋ง ์ตœ์ ํ™” ๊ธฐ๋ฒ• [19, 20, 51]. +* `[[TanStack Query (React Query)]]` + * ์—ฐ๊ฒฐ ์ด์œ : ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ์™€ ์„œ๋ฒ„ ์ƒํƒœ(Server State)๋ฅผ ๊ตฌ์กฐ์ ์œผ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ API ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ์˜ ๋ณ‘๋ชฉ์„ ์—†์• ์ฃผ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [18, 22]. + * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ฐ์ดํ„ฐ ์บ์‹ฑ, ๋ฐฑ๊ทธ๋ผ์šด๋“œ ๋™๊ธฐํ™” ๋ฐ API ๊ณ„์ธต์˜ ๊ด€์‹ฌ์‚ฌ ๋ถ„๋ฆฌ(Separation of Concerns) [18, 22]. + +#### [๊ด€๊ณ„ ์œ ํ˜• C: ์„ฑ๋Šฅ ๋ฐ ๋นŒ๋“œ ์ตœ์ ํ™” (Performance & Build Optimization)] +* `[[React Compiler]]` + * ์—ฐ๊ฒฐ ์ด์œ : ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์˜ ๋ณต์žก์„ฑ์„ ์ค„์ด๊ณ  ๋นŒ๋“œ ํƒ€์ž„์— ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง ์„ฑ๋Šฅ์„ ์ž๋™์œผ๋กœ ์ตœ์ ํ™”ํ•˜๋Š” ์ตœ์‹  ํ•ต์‹ฌ ๋„๊ตฌ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [25, 28, 29]. + * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์„ ์–ธ์  UI ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ์˜ ๋นŒ๋“œ ํƒ€์ž„ ์ตœ์ ํ™” ํ•œ๊ณ„ ๋ฐ React์˜ ๊ทœ์น™(Rules of React)์ด ๊ฐ•์ œํ•˜๋Š” ๋ถˆ๋ณ€์„ฑ์˜ ์ค‘์š”์„ฑ [52, 53]. +* `[[Code Splitting & Lazy Loading]]` + * ์—ฐ๊ฒฐ ์ด์œ : ์ดˆ๊ธฐ ๋กœ๋“œ(First Paint) ์†๋„ ํ–ฅ์ƒ๊ณผ JavaScript ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ œ์–ดํ•˜๋Š” ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์‹œ์Šคํ…œ์˜ ํ•„์ˆ˜ ์„ฑ๋Šฅ ์ „๋žต์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [30, 31, 54]. + * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Vite๋‚˜ Webpack ๊ฐ™์€ ๋ฒˆ๋“ค๋Ÿฌ ํ™˜๊ฒฝ์—์„œ ๋™์  ์ž„ํฌํŠธ๋ฅผ ํ†ตํ•œ ๋ผ์šฐํŠธ ๋‹จ์œ„ ๋ถ„ํ•  ๋ฐ ๋ฌด๊ฑฐ์šด ๋ฒค๋” ์ฒญํฌ(`manualChunks`)์˜ ์บ์‹ฑ ๋ถ„๋ฆฌ ์ „๋žต [26, 27, 31]. + +### Deeper Research Questions + +* ๊ฑฐ๋Œ€ํ•œ ๋ชจ๋†€๋ฆฌ์‹ ๊ตฌ์กฐ ํ˜น์€ ๋‹จ์ผ ํŒŒ์ผ ํƒ€์ž…(components/, hooks/) ๊ธฐ๋ฐ˜์˜ ๋ ˆ๊ฑฐ์‹œ React ์•ฑ์„ Feature-Sliced Design(FSD) ์•„ํ‚คํ…์ฒ˜๋กœ ์ ์ง„์ ์œผ๋กœ ๋ฆฌํŒฉํ† ๋งํ•  ๋•Œ ๊ณ ๋ คํ•ด์•ผ ํ•  ์ตœ์ ์˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? +* React Compiler๊ฐ€ ๋„์ž…๋˜์–ด ์ปดํฌ๋„ŒํŠธ์˜ ๋ฆฌ๋ Œ๋”๋ง์„ ์ž๋™์œผ๋กœ ์ œ์–ดํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด, ๊ฐœ๋ฐœ์ž๋Š” ๋” ์ด์ƒ `useMemo`๋‚˜ `useCallback`์„ ์ž‘์„ฑํ•  ํ•„์š”๊ฐ€ ์™„์ „ํžˆ ์—†์–ด์ง€๋Š”๊ฐ€? ํ˜น์€ ์—ฌ์ „ํžˆ ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์ด ํ•„์ˆ˜์ ์ธ ์—ฃ์ง€ ์ผ€์ด์Šค๋Š” ๋ฌด์—‡์ธ๊ฐ€? +* Zustand์™€ ๊ฐ™์€ ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ ๊ด€๋ฆฌ์™€ TanStack Query์™€ ๊ฐ™์€ ์„œ๋ฒ„ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋™์‹œ ์‚ฌ์šฉํ•  ๋•Œ, ๋‘ ์ƒํƒœ ์‚ฌ์ด์˜ ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™”์™€ ์˜์กด์„ฑ ์ฃผ์ž…์€ ์–ด๋–ป๊ฒŒ ์„ค๊ณ„ํ•ด์•ผ ์‘์ง‘๋„๋ฅผ ๋†’์ผ ์ˆ˜ ์žˆ๋Š”๊ฐ€? +* ํ”„๋ก ํŠธ์—”๋“œ ์„ฑ๋Šฅ ์ตœ์ ํ™” ์ค‘ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜(Memory Leak)๋ฅผ ์˜ˆ๋ฐฉํ•˜๊ธฐ ์œ„ํ•ด Chrome DevTools ํž™ ์Šค๋ƒ…์ƒท์—์„œ ์‹๋ณ„๋˜๋Š” '๋ถ„๋ฆฌ๋œ DOM ๋…ธ๋“œ(Detached DOM Nodes)'์™€ ํด๋กœ์ €(Closure) ์ž”๋ฅ˜ ๋ฌธ์ œ๋ฅผ ํ”„๋กœ๋•์…˜์—์„œ ์–ด๋–ป๊ฒŒ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? +* Vite๋ฅผ ํ™œ์šฉํ•œ ๋นŒ๋“œ ์‹œ ๋Œ€๊ทœ๋ชจ ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์ธํ•œ ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ ๊ฒฝ๊ณ ("Large Chunks")๋ฅผ ๊ทผ๋ณธ์ ์œผ๋กœ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด `manualChunks` ์„ค์ •์„ ์–ด๋–ป๊ฒŒ ๋ถ„ํ• ํ•ด์•ผ ๋ธŒ๋ผ์šฐ์ €์˜ ๋ณ‘๋ ฌ ๋‹ค์šด๋กœ๋“œ ๋ฐ ์บ์‹ฑ ํšจ์œจ์„ ๊ทน๋Œ€ํ™”ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? + +### Practical Application Contexts + +* **Implementation:** ์‹ ๊ทœ ๋„๋ฉ”์ธ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ๋•Œ ๋กœ์ง, UI, ์ปค์Šคํ…€ ํ›…์„ ํ•˜๋‚˜์˜ ํ”ผ์ฒ˜(Feature) ํด๋”์— ์‘์ง‘์‹œํ‚ค๊ณ  ๋‹ค๋ฅธ ํ”ผ์ฒ˜์—์„œ์˜ ์ง์ ‘ ์ž„ํฌํŠธ๋ฅผ ์ œํ•œํ•˜์—ฌ ์ฒ ์ €ํžˆ ์บก์Аํ™”๋œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค [3, 4]. ๋นˆ๋ฒˆํžˆ ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ๋‚˜ ๋ Œ๋”๋ง ๋กœ์ง ์•ˆ์—์„œ๋Š” ์ธ๋ผ์ธ ์ต๋ช… ํ•จ์ˆ˜ ์‚ฌ์šฉ์„ ์ง€์–‘ํ•˜๊ณ  ๋ถˆํ•„์š”ํ•œ ์žฌํ• ๋‹น์„ ๋ง‰์Šต๋‹ˆ๋‹ค [55, 56]. +* **System Design:** ์‹œ์Šคํ…œ ์ดˆ๊ธฐ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ ์ƒํƒœ์˜ ์œ ํ˜•์„ ๋ช…ํ™•ํžˆ ๋ถ„๋ฅ˜ํ•˜์—ฌ, ์ž์ฃผ ๋ฐ”๋€Œ์ง€ ์•Š๋Š” ํ…Œ๋งˆ/์„ค์ •์€ Context API์—, ์ƒํ˜ธ์ž‘์šฉ์ด ์žฆ์€ ์žฅ๋ฐ”๊ตฌ๋‹ˆ/UI ์ƒํƒœ๋Š” Zustand์—, ์„œ๋ฒ„ ๋ฐ์ดํ„ฐ๋Š” TanStack Query์— ์œ„์ž„ํ•˜๋Š” ๋‹ค์ธต์  ์ƒํƒœ ํŠธ๋ฆฌ๋ฅผ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค [5, 18, 57]. +* **Operation / Maintenance:** ํ”„๋กœ๋•์…˜ ๋ฐฐํฌ ํ›„ Sentry, LogRocket, Datadog๊ณผ ๊ฐ™์€ ๊ฐ€์‹œ์„ฑ(Observability) ๋ฐ ํด๋ผ์šฐ๋“œ ๋กœ๊น… ๋„๊ตฌ๋ฅผ ์—ฐ๋™ํ•ด ์‚ฌ์šฉ์ž ์„ธ์…˜์„ ๋ฆฌํ”Œ๋ ˆ์ดํ•˜๊ณ  ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜ ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ์ด์Šˆ๋ฅผ ์‚ฌ์ „์— ํƒ์ง€ํ•ฉ๋‹ˆ๋‹ค [36, 37]. +* **Learning Path:** React ๊ธฐ์ดˆ(useState, Props)์™€ ์ปดํฌ๋„ŒํŠธ ๋ถ„๋ฆฌ(SOLID, Clean Code) ๊ฐœ๋…์„ ์ˆ™์ง€ํ•œ ํ›„, ์ ์ง„์ ์œผ๋กœ Context API์˜ ํ•œ๊ณ„๋ฅผ ์ฒดํ—˜ํ•˜๊ณ  Zustand๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋Š” ๊ณผ์ •์„ ๊ฑฐ์น˜๋ฉฐ ๋ Œ๋”๋ง ์ตœ์ ํ™”์™€ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์˜ ์›๋ฆฌ๋ฅผ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค [4, 14, 58]. +* **My Project Relevance:** ํ˜„์žฌ ์œ ์ง€๋ณด์ˆ˜ ์ค‘์ธ ๊ฑฐ๋Œ€ํ•œ React ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ๋‹ค๋ฉด, ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ ์ƒ๋‹จ์— ๋ฌด๋ถ„๋ณ„ํ•˜๊ฒŒ ๋ฐฐ์น˜๋œ Context Provider๋ฅผ ๊ฑท์–ด๋‚ด๊ณ  Zustand ๊ธฐ๋ฐ˜์˜ ๋ถ€๋ถ„ ๊ตฌ๋… ํŒจํ„ด์œผ๋กœ ๋ฆฌํŒฉํ† ๋งํ•˜๊ฑฐ๋‚˜ [21], Storybook ๋ฐ Chromatic์„ CI ํŒŒ์ดํ”„๋ผ์ธ์— ๋„์ž…ํ•˜์—ฌ PR ๋‹จ๊ณ„์—์„œ ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ(Visual Test)๋ฅผ ์ž๋™ํ™”ํ•˜์—ฌ ํ’ˆ์งˆ์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [41, 59]. + +### Adjacent Topics + +* `[[Core Web Vitals]]` + * ํ™•์žฅ ๋ฐฉํ–ฅ: LCP(Largest Contentful Paint), INP(Interaction to Next Paint), CLS(Cumulative Layout Shift) ๋“ฑ ๊ตฌ๊ธ€์ด ์ •์˜ํ•œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ์ค‘์‹ฌ์˜ ์„ฑ๋Šฅ ์ธก์ • ์ง€ํ‘œ๋ฅผ ์ดํ•ดํ•˜๊ณ , ์•ž์„œ ๋‹ค๋ฃฌ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…, ๋ ˆ์ด์ง€ ๋กœ๋”ฉ, ๋ Œ๋”๋ง ์ตœ์ ํ™” ๊ธฐ๋ฒ•์ด ์‹ค์ œ ์‚ฌ์šฉ์ž ์ฒด๊ฐ ์†๋„ ํ–ฅ์ƒ์— ์–ด๋–ป๊ฒŒ ์ง๊ฒฐ๋˜๋Š”์ง€ ์‹ฌ์ธต ๋ถ„์„ํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์—ฐ๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [23, 60, 61]. +* `[[Git Branching Strategies & CI/CD Governance]]` + * ํ™•์žฅ ๋ฐฉํ–ฅ: ๋ณต์žกํ•œ ํ”„๋ก ํŠธ์—”๋“œ ์‹œ์Šคํ…œ์„ ๋‹ค์ˆ˜์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ˜‘์—…ํ•˜์—ฌ ๊ตฌ์ถ•ํ•  ๋•Œ ์ถฉ๋Œ์„ ์ตœ์†Œํ™”ํ•˜๊ณ  ๋ฆด๋ฆฌ์Šค ์•ˆ์ •์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•œ GitHub Flow, Trunk-Based Development ๋“ฑ์˜ ๋ธŒ๋žœ์นญ ์ „๋žต๊ณผ, ESLint/Prettier ์ž๋™ํ™”, Conventional Commits๋ฅผ ํ™œ์šฉํ•œ ๋ฐฐํฌ ํŒŒ์ดํ”„๋ผ์ธ(CI/CD) ํ†ต์ œ ๋ฐฉ๋ฒ•์„ ํ™•์žฅํ•ด์„œ ์กฐ์‚ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [62-64]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Development/Folder Structure Best Practices.md b/10_Wiki/Development/Folder Structure Best Practices.md new file mode 100644 index 00000000..c340d218 --- /dev/null +++ b/10_Wiki/Development/Folder Structure Best Practices.md @@ -0,0 +1,69 @@ +# [[Folder Structure Best Practices]] + +## ๐Ÿ“Œ Brief Summary +React ๋“ฑ ํ”„๋ก ํŠธ์—”๋“œ ํ”„๋กœ์ ํŠธ์—์„œ ์ฝ”๋“œ์˜ ์œ ์ง€๋ณด์ˆ˜์„ฑ, ํ™•์žฅ์„ฑ, ๊ทธ๋ฆฌ๊ณ  ํ˜‘์—… ํšจ์œจ์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ํŒŒ์ผ๊ณผ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ฒด๊ณ„์ ์œผ๋กœ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก ์ž…๋‹ˆ๋‹ค [1]. ํ˜„๋Œ€์ ์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ๊ณผ๊ฑฐ์˜ ํŒŒ์ผ ์œ ํ˜• ๊ธฐ๋ฐ˜(์œ ํ˜•๋ณ„ ๋ถ„๋ฅ˜) ๊ตฌ์กฐ์—์„œ ๋ฒ—์–ด๋‚˜, ๊ธฐ๋Šฅ(Feature)์ด๋‚˜ ๋„๋ฉ”์ธ ์ค‘์‹ฌ์œผ๋กœ ๊ด€๋ จ๋œ ๋กœ์ง์„ ๋ฌถ๋Š” ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๋˜๋Š” ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ๋ฐฉ์‹์ด ๋ชจ๋ฒ” ์‚ฌ๋ก€๋กœ ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค [2, 3]. ์ด๋ฅผ ํ†ตํ•ด UI, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง, ์ƒํƒœ ๊ด€๋ฆฌ ๋“ฑ์˜ ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌํ•˜๊ณ  ํ”„๋กœ์ ํŠธ๊ฐ€ ์ปค์ง์— ๋”ฐ๋ผ ๋ฐœ์ƒํ•˜๋Š” ๊ธฐ์ˆ  ๋ถ€์ฑ„๋ฅผ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [4]. + +## ๐Ÿ“– Core ์†Œ์Šค Content + +* **๊ตฌ์กฐ์˜ ์ง„ํ™”์™€ ํ•œ๊ณ„:** + * ์ดˆ๊ธฐ ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ๋Š” ์ฃผ๋กœ ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๋ฅผ `components` ํด๋”์—, ๋ชจ๋“  ํ›…์„ `hooks` ํด๋”์— ๋„ฃ๋Š” ํ”Œ๋žซ(Flat) ๊ตฌ์กฐ๋‚˜ ํŒŒ์ผ ์œ ํ˜• ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค [5, 6]. + * ํ•˜์ง€๋งŒ ์•ฑ์˜ ๊ทœ๋ชจ๊ฐ€ ์ปค์ง€๋ฉด ๋‹จ์ผ ๊ธฐ๋Šฅ์„ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ํด๋”๋ฅผ ๋„˜๋‚˜๋“ค์–ด์•ผ ํ•˜๋ฏ€๋กœ, ๊ฐœ๋ฐœ ์†๋„๊ฐ€ ๋А๋ ค์ง€๊ณ  ๋””๋ฒ„๊น…์ด ์–ด๋ ค์›Œ์ง€๋ฉฐ ์ฝ”๋“œ๋ฒ ์ด์Šค๊ฐ€ ๋ณต์žกํ•ด์ง€๋Š” ํ•œ๊ณ„๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [3, 6, 7]. +* **๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜(Feature-based) ๋ฐ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๊ตฌ์กฐ:** + * 2025๋…„ ๊ธฐ์ค€ ๊ฐ€์žฅ ๊ถŒ์žฅ๋˜๋Š” ์ ‘๊ทผ ๋ฐฉ์‹์€ ํŒŒ์ผ ์œ ํ˜•์ด ์•„๋‹Œ ๋น„์ฆˆ๋‹ˆ์Šค ๊ธฐ๋Šฅ์ด๋‚˜ ๋ชจ๋“ˆ์„ ์ค‘์‹ฌ์œผ๋กœ ํด๋”๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค [2, 8, 9]. + * ๊ฐ ๊ธฐ๋Šฅ(Feature)์€ ์บก์Аํ™”๋˜์–ด ๋‹ค๋ฅธ ๊ธฐ๋Šฅ๊ณผ ๋…๋ฆฝ์ ์œผ๋กœ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๊ทœ๋ชจ ํ™•์žฅ ์‹œ ๊ธฐ์กด ์ฝ”๋“œ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ณ  ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ๋งค๋„๋Ÿฝ๊ฒŒ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [8, 10]. +* **๊ถŒ์žฅ ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ตฌ์„ฑ (src/ ํ•˜์œ„):** + * `assets/`: ์ด๋ฏธ์ง€, ํฐํŠธ ๋“ฑ ์ •์  ๋ฏธ๋””์–ด ๋ฆฌ์†Œ์Šค ๋ณด๊ด€ [11, 12]. + * `components/`: ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ์—์„œ ๊ณตํ†ต์œผ๋กœ ์žฌ์‚ฌ์šฉ๋˜๋Š” ๋„๋ฉ”์ธ์— ๊ตฌ์• ๋ฐ›์ง€ ์•Š๋Š” UI ์š”์†Œ (์˜ˆ: ๋ฒ„ํŠผ, ๋ชจ๋‹ฌ, ๋„ค๋น„๊ฒŒ์ด์…˜ ๋ฐ” ๋“ฑ) [2, 12, 13]. + * `features/` (๋˜๋Š” `modules/`): ์ธ์ฆ(Auth), ๋Œ€์‹œ๋ณด๋“œ(Dashboard) ๋“ฑ ๋„๋ฉ”์ธ๋ณ„ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง. ์ด ํด๋” ๋‚ด๋ถ€์—๋Š” ํ•ด๋‹น ๊ธฐ๋Šฅ์—๋งŒ ์“ฐ์ด๋Š” ์ปดํฌ๋„ŒํŠธ, ํ›…, API ๋“ฑ์„ ์บก์Аํ™”ํ•˜์—ฌ ๋ณด๊ด€ํ•ฉ๋‹ˆ๋‹ค [2, 9, 13]. + * `hooks/`: ํผ ์ฒ˜๋ฆฌ, ๋ฐ์ดํ„ฐ ํŽ˜์นญ ๋“ฑ ์•ฑ ์ „๋ฐ˜์—์„œ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ปค์Šคํ…€ ํ›… [9, 14]. + * `pages/` (๋˜๋Š” `routes/`): ๋ผ์šฐํŒ…์— ๋งคํ•‘๋˜๋Š” ํŽ˜์ด์ง€ ๋ ˆ๋ฒจ ์ปดํฌ๋„ŒํŠธ [15, 16]. + * `services/`: ์„œ๋“œํŒŒํ‹ฐ ์„œ๋น„์Šค ์—ฐ๋™์ด๋‚˜ API ์š”์ฒญ ๋“ฑ ์™ธ๋ถ€ ํ†ต์‹  ๋กœ์ง [16, 17]. + * `store/` (๋˜๋Š” `context/`): Redux, Zustand, Context API๋ฅผ ํ™œ์šฉํ•˜๋Š” ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ ๋กœ์ง [14-16]. + * `utils/`: ๋‚ ์งœ ํฌ๋งทํŒ…, ๋ฐ์ดํ„ฐ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๋“ฑ ์ƒํƒœ๋ฅผ ๊ฐ€์ง€์ง€ ์•Š๋Š” ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜ [17, 18]. + * `styles/`: ๊ธ€๋กœ๋ฒŒ CSS, ํ…Œ๋งˆ(Theme) ๋“ฑ ์ „์—ญ ์Šคํƒ€์ผ๋ง ํŒŒ์ผ [18, 19]. + * `types/`: TypeScript ์‚ฌ์šฉ ์‹œ ์ „์—ญ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ํƒ€์ž… ๋ฐ ์ธํ„ฐํŽ˜์ด์Šค ๋ณด๊ด€ [18]. + * `config/`: ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋‚˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์—ญ ์„ค์ •(API ๊ธฐ๋ณธ URL ๋“ฑ) ๊ด€๋ฆฌ [18, 20]. +* **Feature-Sliced Design (FSD):** + * ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ํด๋” ๊ตฌ์กฐ๋ณด๋‹ค ๋” ์—„๊ฒฉํ•˜๊ฒŒ ์˜์กด์„ฑ์˜ ๋ฐฉํ–ฅ์„ ํ†ต์ œํ•˜๋Š” ํ”„๋ก ํŠธ์—”๋“œ ์•„ํ‚คํ…์ฒ˜ ๋ฐฉ๋ฒ•๋ก ์ž…๋‹ˆ๋‹ค [21]. + * `shared` -> `entities` -> `features` -> `widgets` -> `pages` -> `app` ์ด๋ผ๋Š” ๊ณ ์ •๋œ ๋‹ค์ธต ๊ณ„์ธต(Layer)์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค [22, 23]. + * ์ƒ์œ„ ๊ณ„์ธต์€ ํ•˜์œ„ ๊ณ„์ธต์˜ ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์ง€๋งŒ(Import), ํ•˜์œ„ ๊ณ„์ธต์€ ์ƒ์œ„ ๊ณ„์ธต์„ ์ฐธ์กฐํ•  ์ˆ˜ ์—†๋Š” ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ๊ทœ์น™์„ ํ†ตํ•ด ์ˆœํ™˜ ์˜์กด์„ฑ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค [22, 24]. +* **Next.js ํ™˜๊ฒฝ์—์„œ์˜ ๋ผ์šฐํŠธ ๊ทธ๋ฃน (Route Groups):** + * Next.js ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•œ ํด๋”๋ช… `(folderName)` ๋ฐฉ์‹์„ ํ†ตํ•ด, ์‹ค์ œ URL ๊ฒฝ๋กœ์—๋Š” ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์œผ๋ฉด์„œ๋„ ๊ด€๋ จ ๊ธฐ๋Šฅ์ด๋‚˜ ๋…ผ๋ฆฌ์— ๋”ฐ๋ผ ๋ผ์šฐํŠธ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ๊ทธ๋ฃนํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [25-27]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts +- [[Feature-Sliced Design]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋Œ€๊ทœ๋ชจ React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํด๋” ๊ตฌ์กฐ๋ฅผ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•ด ๊ณ ์•ˆ๋œ ์ „๋ฌธ์ ์ธ ํ”„๋ก ํŠธ์—”๋“œ ์•„ํ‚คํ…์ฒ˜ ๋ฐฉ๋ฒ•๋ก ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [21]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํด๋” ๊ฐ„์˜ ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ๊ทœ์น™๊ณผ ๊ฐ ํด๋”(Layer, Slice, Segment)๊ฐ€ ๋‹ด๋‹นํ•ด์•ผ ํ•˜๋Š” ์—ญํ• ์˜ ์—„๊ฒฉํ•œ ๋ถ„๋ฆฌ ๋ฐฉ์‹ [22, 28]. + +- [[Separation of Concerns]] (๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ) + - ์—ฐ๊ฒฐ ์ด์œ : ํด๋” ๊ตฌ์กฐ๋ฅผ ์„ค๊ณ„ํ•˜๋Š” ๊ทผ๋ณธ์ ์ธ ๋ชฉ์ ์ด UI ๋ Œ๋”๋ง, ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ, ๋ฐ์ดํ„ฐ ํ†ต์‹ (API) ๋“ฑ์˜ ์ฑ…์ž„์„ ๊ฐ๊ธฐ ๋‹ค๋ฅธ ์œ„์น˜๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๋ฐ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [4, 29]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: `services/`, `store/`, `components/` ๋“ฑ์˜ ํด๋”๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)์„ ํ”„๋ก ํŠธ์—”๋“œ ์•„ํ‚คํ…์ฒ˜ ์ „๋ฐ˜์— ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ• [4, 30]. + +- [[Naming Conventions]] (๋ช…๋ช… ๊ทœ์น™) + - ์—ฐ๊ฒฐ ์ด์œ : ์ผ๊ด€๋œ ํด๋” ๋ฐ ํŒŒ์ผ ๋ช…๋ช… ๊ทœ์น™(์˜ˆ: ํด๋”๋ช…์€ kebab-case, ์ปดํฌ๋„ŒํŠธ๋Š” PascalCase)์€ ํด๋” ๊ตฌ์กฐ ๋‚ด์—์„œ ํŒŒ์ผ์„ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๊ฒŒ ์ฐพ๊ณ  ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๋Š” ํ•ต์‹ฌ ๊ทœ์น™์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [31-33]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋‹ค์–‘ํ•œ ์šด์˜์ฒด์ œ์™€ CI/CD ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ๋นŒ๋“œ ์—๋Ÿฌ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ  ํŒ€ ๋‚ด ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ• [34, 35]. + +### Deeper Research Questions +- ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜(Feature-based) ํด๋” ๊ตฌ์กฐ์—์„œ ๊ฐ ๊ธฐ๋Šฅ์ด ์ƒํ˜ธ์ž‘์šฉํ•ด์•ผ ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๊ต์ฐจ ๊ด€์‹ฌ์‚ฌ(Cross-cutting concerns)๋‚˜ ๊ณต์œ  ์˜์กด์„ฑ์„ ์–ด๋–ป๊ฒŒ ๊ด€๋ฆฌํ•˜๊ณ  ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- ๋ ˆ๊ฑฐ์‹œ ํŒŒ์ผ ์œ ํ˜• ๊ธฐ๋ฐ˜(File-type based) React ํ”„๋กœ์ ํŠธ๋ฅผ ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ํ˜น์€ Feature-Sliced Design์œผ๋กœ ์ ์ง„์ ์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ€์žฅ ์•ˆ์ „ํ•˜๊ณ  ํšจ์œจ์ ์ธ ๋‹จ๊ณ„๋Š” ๋ฌด์—‡์ธ๊ฐ€? +- Feature-Sliced Design์˜ ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ์›์น™์„ ESLint์™€ ๊ฐ™์€ ์ •์  ๋ถ„์„ ๋„๊ตฌ๋กœ ์ž๋™ ๊ฐ•์ œํ™”(Governance)ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? +- ํด๋” ๊ตฌ์กฐ๋ฅผ ๋ชจ๋“ˆํ™”ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ํŒŒ์ผ ์ค‘์ฒฉ ๋ฌธ์ œ์™€ ์ด๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•œ ์ ์ ˆํ•œ ์ธ๋ฑ์Šค(Barrel) ํŒŒ์ผ ์‚ฌ์šฉ ์ „๋žต์˜ ์žฅ๋‹จ์ ์€ ๋ฌด์—‡์ธ๊ฐ€? +- ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(Context API, Zustand, Redux ๋“ฑ)์˜ ์ข…๋ฅ˜์— ๋”ฐ๋ผ ๊ถŒ์žฅ๋˜๋Š” `store/` ํด๋” ๋‚ด๋ถ€์˜ ๊ตฌ์กฐ๋Š” ์–ด๋–ป๊ฒŒ ๋‹ฌ๋ผ์ ธ์•ผ ํ•˜๋Š”๊ฐ€? + +### Practical Application Contexts +- **Implementation:** React ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ, ๋ชจ๋“  ์š”์†Œ๋ฅผ `components/` ํด๋”์— ๋„ฃ์ง€ ์•Š๊ณ  ํŠน์ • ๋„๋ฉ”์ธ(์˜ˆ: ์ธ์ฆ)์—๋งŒ ์“ฐ์ด๋Š” ์š”์†Œ๋Š” `features/auth/components/`๋กœ ๊ฒฉ๋ฆฌํ•˜์—ฌ ์บก์Аํ™”๋ฅผ ์‹ค์ฒœํ•ฉ๋‹ˆ๋‹ค. +- **System Design:** ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐ ์„ธํŒ… ๋‹จ๊ณ„์—์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ์„ ๋ถ„์„ํ•˜์—ฌ ์–ด๋–ค ์ฝ”๋“œ๊ฐ€ ์ „์—ญ(`shared/` ๋˜๋Š” `components/`)์— ์†ํ•˜๊ณ  ์–ด๋–ค ์ฝ”๋“œ๊ฐ€ ๋กœ์ปฌ(`features/`)์— ์†ํ• ์ง€ ๊ธฐ์ค€์„ ๋งˆ๋ จํ•ฉ๋‹ˆ๋‹ค. +- **Operation / Maintenance:** ๊ธฐ๋Šฅ์— ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ, ํ•ด๋‹น ๊ธฐ๋Šฅ์˜ ํด๋”(`features/feature-name/`)๋งŒ ํ™•์ธํ•˜๋ฉด UI, ์ƒํƒœ, API ์š”์ฒญ ๋กœ์ง์ด ๋ชจ์—ฌ ์žˆ์–ด ๋””๋ฒ„๊น… ๋ฐ ์œ ์ง€๋ณด์ˆ˜ ์†๋„๊ฐ€ ํฌ๊ฒŒ ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค. +- **Learning Path:** ์ฒ˜์Œ์—๋Š” ๋‹จ์ˆœํ•œ ํ”Œ๋žซ ๊ตฌ์กฐ๋กœ React๋ฅผ ํ•™์Šตํ•œ ํ›„, ์ปดํฌ๋„ŒํŠธ๊ฐ€ 30๊ฐœ ์ด์ƒ์œผ๋กœ ๋Š˜์–ด๋‚˜๋Š” ์‹œ์ ์— ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ํด๋” ๊ตฌ์กฐ๋ฅผ ๋„์ž…ํ•˜์—ฌ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ ์—ญ๋Ÿ‰์„ ๊ธฐ๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- **My Project Relevance:** ํ˜„์žฌ ์ง„ํ–‰ ์ค‘์ด๊ฑฐ๋‚˜ ๋ฆฌํŒฉํ† ๋งํ•ด์•ผ ํ•  React ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ, ๊ฑฐ๋Œ€ํ•ด์ง„ `components/` ํด๋”๋ฅผ ๋„๋ฉ”์ธ ๋‹จ์œ„์˜ `features/` ํด๋”๋กœ ๋‚˜๋ˆ„๊ณ  ์žฌ์‚ฌ์šฉ ๋ถˆ๊ฐ€ ๋กœ์ง๋“ค์„ ๋ถ„๋ฆฌํ•˜๋Š” ๋ฐ ์ง์ ‘์ ์œผ๋กœ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. + +### Adjacent Topics +- [[State Management]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ์ „์—ญ ์ƒํƒœ(Global State)์™€ ๋กœ์ปฌ ์ƒํƒœ(Local State)๋ฅผ ์–ด๋””์— ๋ณด๊ด€ํ•ด์•ผ ํ•˜๋Š”์ง€, Zustand์™€ ๊ฐ™์€ ๋„๊ตฌ๊ฐ€ `store/` ํด๋”์˜ ๊ตฌ์กฐ๋ฅผ ์–ด๋–ป๊ฒŒ ๋‹จ์ˆœํ™”ํ•˜๋Š”์ง€ ํ™•์žฅํ•˜์—ฌ ์กฐ์‚ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[Code Splitting]] (์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…) + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋ผ์šฐํŠธ ํ˜น์€ ํด๋”(Feature) ๋‹จ์œ„๋กœ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…๊ณผ ์ง€์—ฐ ๋กœ๋”ฉ(Lazy Loading)์„ ์ ์šฉํ•˜์—ฌ ์ดˆ๊ธฐ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ค„์ด๊ณ  ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๋Š” ์ „๋žต๊ณผ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Development/Frontend Performance Debugging.md b/10_Wiki/Development/Frontend Performance Debugging.md new file mode 100644 index 00000000..e8479bfa --- /dev/null +++ b/10_Wiki/Development/Frontend Performance Debugging.md @@ -0,0 +1,72 @@ +# [[Frontend Performance Debugging]] + +## ๐Ÿ“Œ Brief Summary +ํ”„๋ก ํŠธ์—”๋“œ ์„ฑ๋Šฅ ๋””๋ฒ„๊น…(Frontend Performance Debugging)์€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜, ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง, ์žฆ์€ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ๋“ฑ์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ์„ฑ๋Šฅ ์ €ํ•˜์™€ ์‘๋‹ต ์ง€์—ฐ์„ ์‹๋ณ„ํ•˜๊ณ  ํ•ด๊ฒฐํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค [1-3]. ๊ฐœ๋ฐœ์ž๋Š” ๋ธŒ๋ผ์šฐ์ €์˜ ๋‚ด์žฅ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ(Chrome DevTools)๋ฅผ ํ™œ์šฉํ•ด ๋ฉ”๋ชจ๋ฆฌ ์ƒํƒœ์™€ ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง ๋น„์šฉ์„ ๋กœ์ปฌ์—์„œ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค [4, 5]. ๋” ๋‚˜์•„๊ฐ€ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋Š” ํด๋ผ์šฐ๋“œ ๊ธฐ๋ฐ˜ ๋กœ๊น… ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹ค์ œ ์‚ฌ์šฉ์ž์˜ ์„ธ์…˜๊ณผ ์—๋Ÿฌ๋ฅผ ์ถ”์ ํ•จ์œผ๋กœ์จ ๋ณต์žกํ•œ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ์˜ ๊ทผ๋ณธ ์›์ธ์„ ํŒŒ์•…ํ•ฉ๋‹ˆ๋‹ค [6-8]. + +## ๐Ÿ“– Core ์†Œ์Šค Content +**๋ฉ”๋ชจ๋ฆฌ ๋ฌธ์ œ ์ง„๋‹จ (Memory Issues Diagnosis)** +ํ”„๋ก ํŠธ์—”๋“œ ์„ฑ๋Šฅ ์ €ํ•˜์˜ ์ฃผ์š” ์›์ธ ์ค‘ ํ•˜๋‚˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜(Memory Leak)์™€ ๋ฉ”๋ชจ๋ฆฌ ํŒฝ์ฐฝ(Memory Bloat)์ž…๋‹ˆ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” ์‚ฌ์šฉ์ด ๋๋‚œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๊ฐ€ ํšŒ์ˆ˜ํ•˜์ง€๋งŒ, DOM ๋…ธ๋“œ๊ฐ€ ๋ฌธ์„œ์—์„œ ์ œ๊ฑฐ๋œ ํ›„์—๋„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฐธ์กฐ๊ฐ€ ๋‚จ์•„์žˆ๋Š” '๋ถ„๋ฆฌ๋œ DOM ๋…ธ๋“œ(Detached DOM Nodes)', ๋ˆ„์ ๋œ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ, ํด๋กœ์ €(Closure)์— ์˜ํ•ด ์œ ์ง€๋˜๋Š” ์ฐธ์กฐ ๋“ฑ์ด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ์œ ๋ฐœํ•ฉ๋‹ˆ๋‹ค [2, 9, 10]. Chrome DevTools์˜ Task Manager๋ฅผ ํ†ตํ•ด ์‹ค์‹œ๊ฐ„ DOM ๋…ธ๋“œ์™€ JS ํž™(Heap) ๋ฉ”๋ชจ๋ฆฌ ์ฆ๊ฐ€๋ฅผ ํ™•์ธํ•˜๊ณ , Memory ํŒจ๋„์˜ Heap Snapshot์„ ๋น„๊ตํ•˜์—ฌ ๋ถ„๋ฆฌ๋œ DOM ํŠธ๋ฆฌ๋ฅผ ์‹๋ณ„ํ•˜๋ฉฐ, Allocation Timeline์„ ์‚ฌ์šฉํ•ด ์–ธ์ œ ์ƒˆ๋กœ์šด ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ• ๋‹น๋˜๋Š”์ง€ ์ถ”์ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [4, 11, 12]. ๋นˆ๋ฒˆํ•œ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์€ ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰์„ ์ž์ฃผ ์ผ์‹œ ์ •์ง€์‹œ์ผœ ํ™”๋ฉด์˜ ๋Š๊น€(Jank)์„ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค [1]. + +**React ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง ํ”„๋กœํŒŒ์ผ๋ง (React Rendering Profiling)** +React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ์ƒํƒœ(State), ํ”„๋กœํผํ‹ฐ(Props), ์ปจํ…์ŠคํŠธ(Context) ๋ณ€๊ฒฝ ๋˜๋Š” ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์˜ ๋ Œ๋”๋ง์— ์˜ํ•ด ๋ฆฌ๋ Œ๋”๋ง์ด ํŠธ๋ฆฌ๊ฑฐ๋ฉ๋‹ˆ๋‹ค [13]. ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์€ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋ฅผ ์ฐจ๋‹จํ•˜๊ณ  ์ƒํ˜ธ์ž‘์šฉ ์‹œ๊ฐ„์„ ์ง€์—ฐ์‹œํ‚ต๋‹ˆ๋‹ค [3]. ์ด๋ฅผ ๋””๋ฒ„๊น…ํ•˜๊ธฐ ์œ„ํ•ด React DevTools Profiler๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์–ด๋–ค ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ธ์ œ, ์™œ ๋ Œ๋”๋ง๋˜์—ˆ๋Š”์ง€, ์–ผ๋งˆ๋‚˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ๋Š”์ง€(Flamegraph ๋ทฐ ๋“ฑ)๋ฅผ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค [5, 14]. ๋˜ํ•œ, ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์ „์šฉ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ `why-did-you-render`๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์‹ค์ œ ์ƒํƒœ๋‚˜ prop ๋ณ€๊ฒฝ ์—†์ด ๋ฐœ์ƒํ•˜๋Š” ๋ฆฌ๋ Œ๋”๋ง์— ๋Œ€ํ•œ ์ฝ˜์†” ๊ฒฝ๊ณ ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [15, 16]. + +**ํ”„๋กœ๋•์…˜ ๊ด€์ธก์„ฑ๊ณผ ํด๋ผ์šฐ๋“œ ๋กœ๊น… (Production Observability and Logging)** +๋กœ์ปฌ ํ™˜๊ฒฝ์„ ๋„˜์–ด ์‹ค์ œ ์šด์˜ ํ™˜๊ฒฝ์˜ ์„ฑ๋Šฅ์„ ๋””๋ฒ„๊น…ํ•˜๊ธฐ ์œ„ํ•ด Sentry, LogRocket, Datadog RUM, SigNoz์™€ ๊ฐ™์€ ํ”„๋ก ํŠธ์—”๋“œ ํด๋ผ์šฐ๋“œ ๋กœ๊น… ๋„๊ตฌ๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค [17, 18]. ์ด ๋„๊ตฌ๋“ค์€ ๋‹จ์ˆœํ•œ ์—๋Ÿฌ ๋กœ๊น…์„ ๋„˜์–ด ์‚ฌ์šฉ์ž๊ฐ€ ์—๋Ÿฌ๋‚˜ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ๊ฒช๊ธฐ ์ง์ „์˜ ํ–‰๋™์„ ๋น„๋””์˜ค์ฒ˜๋Ÿผ ๋‹ค์‹œ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด(Session Replay), ํ”„๋ก ํŠธ์—”๋“œ ์—๋Ÿฌ๋ฅผ ๋ฐฑ์—”๋“œ ํŠธ๋ ˆ์ด์Šค์™€ ์—ฐ๊ด€ ์ง€์–ด ๋ถ„์„ํ•˜๋Š” ๋ถ„์‚ฐ ํŠธ๋ ˆ์ด์‹ฑ(Distributed Tracing), ๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ ์‚ฌ์šฉ์ž์˜ Core Web Vitals(LCP, FID, INP ๋“ฑ) ๋ชจ๋‹ˆํ„ฐ๋ง ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์—ฌ ๋งน์  ์—†๋Š” ๋””๋ฒ„๊น…์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค [7, 8, 19-21]. + +## โš–๏ธ Trade-offs & Caveats +* **๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ์˜ ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ฐ˜๋Œ€ ๊ธ‰๋ถ€:** LogRocket์ด๋‚˜ Sentry ๊ฐ™์€ ๊ฐ•๋ ฅํ•œ ๋กœ๊น… ๋ฐ ์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ๋“ค์„ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ์— ํƒ‘์žฌํ•˜๋ฉด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ๊ฐ€ ์ปค์ง€๊ณ  ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค. ์ผ๋ถ€ ๋„๊ตฌ๋Š” ์ตœ๋Œ€ 120ms์˜ ์ถ”๊ฐ€ ๋กœ๋“œ ์‹œ๊ฐ„์„ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ 1์ดˆ๊ฐ€ ์ค‘์š”ํ•œ ์„œ๋น„์Šค์—์„œ๋Š” ๊ฐ€๋ฒผ์šด ์˜ต์…˜์„ ์„ ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [22-24]. +* **์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด์™€ ํ”„๋ผ์ด๋ฒ„์‹œ ๋ฌธ์ œ:** ๋ชจ๋“  ์‚ฌ์šฉ์ž ์„ธ์…˜๊ณผ DOM/์ƒํƒœ ๋ณ€ํ™”๋ฅผ ๊ธฐ๋กํ•˜๋Š” ๋„๊ตฌ(์˜ˆ: LogRocket)์˜ ๊ธฐ๋ณธ '๋ชจ๋‘ ์บก์ฒ˜' ๋ฐฉ์‹์€ ๋ฏผ๊ฐํ•œ ๊ฐœ์ธ์ •๋ณด๋ฅผ ๋…ธ์ถœํ•  ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋งˆ์Šคํ‚น ์„ค์ •์„ ์ˆ˜๋™์œผ๋กœ ์—„๊ฒฉํžˆ ๊ตฌ์„ฑํ•ด์•ผ ํ•˜๋Š” ๊ด€๋ฆฌ ๋น„์šฉ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [19, 23, 25, 26]. +* **๋น„์šฉ๊ณผ ๊ฐ€์‹œ์„ฑ์˜ ํƒ€ํ˜‘ (Cost vs. Visibility):** Datadog๊ณผ ๊ฐ™์€ ๋Œ€๊ทœ๋ชจ ์˜ต์ €๋ฒ„๋นŒ๋ฆฌํ‹ฐ ํ”Œ๋žซํผ์€ ์ˆ˜์ง‘(Ingestion)๊ณผ ์ƒ‰์ธ(Indexing) ๋‹จ๊ณ„์—์„œ ์ด์ค‘ ๊ณผ๊ธˆ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ํŠธ๋ž˜ํ”ฝ์ด ๋งŽ์€ ๊ฒฝ์šฐ ์—„์ฒญ๋‚œ ๋น„์šฉ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋น„์šฉ ์ ˆ๊ฐ์„ ์œ„ํ•ด ๋กœ๊ทธ์˜ 20%๋งŒ ์ƒ‰์ธํ•˜๊ฒŒ ๋˜๋ฉด, ์‹ค์ œ ์žฅ์•  ๋ฐœ์ƒ ์‹œ ๋””๋ฒ„๊น…์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ์˜ 80%๊ฐ€ ๊ฒ€์ƒ‰๋˜์ง€ ์•Š๋Š” ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [27-29]. +* **์ตœ์ ํ™” ๊ธฐ๋ฒ• ์ž์ฒด์˜ ์˜ค๋ฒ„ํ—ค๋“œ:** `React.memo()`, `useCallback`, `useMemo`์™€ ๊ฐ™์€ ์ตœ์ ํ™” ํ›…์€ ์ด์ „ ์ฐธ์กฐ๊ฐ’์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜๊ณ  ๋น„๊ตํ•˜๋Š” ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ๋ Œ๋”๋ง ๋น„์šฉ๋ณด๋‹ค ๋น„๊ต ๋น„์šฉ์ด ๋” ํฐ ๊ฐ€๋ฒผ์šด ์ปดํฌ๋„ŒํŠธ์— ๋‚จ์šฉํ•˜๋ฉด ์˜คํžˆ๋ ค ์„ฑ๋Šฅ์„ ์ €ํ•˜์‹œํ‚ค๋Š” ์›์ธ์ด ๋ฉ๋‹ˆ๋‹ค [30, 31]. +* **์ปดํŒŒ์ผ๋Ÿฌ ์ž๋™ํ™”๋กœ ์ธํ•œ ๋””๋ฒ„๊น… ๋‚œ์ด๋„ ์ƒ์Šน:** React Compiler ๊ฐ™์€ ๋นŒ๋“œ ํƒ€์ž„ ์ž๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ช…์‹œ์ ์ธ ํ›… ์ž‘์„ฑ์„ ์ค„์ผ ์ˆ˜ ์žˆ์ง€๋งŒ, ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ธ”๋ž™๋ฐ•์Šค๋กœ ์ž‘๋™ํ•˜๋ฏ€๋กœ ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ ์ฝ”๋“œ ์ƒ์—์„œ ์›์ธ์„ ์ฐพ๊ธฐ ์–ด๋ ค์›Œ React DevTools Profiler์— ์ „์ ์œผ๋กœ ์˜์กดํ•ด์•ผ ํ•˜๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค [32]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [๊ด€๊ณ„ ์œ ํ˜• A (๋กœ์ปฌ ๋””๋ฒ„๊น… ๋ฐ ๋ถ„์„ ๋„๊ตฌ)] +- [[Chrome DevTools Memory Profiler]] + - ์—ฐ๊ฒฐ ์ด์œ : ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜์™€ ๊ฐ์ฒด ๋ณด์กด ์ƒํƒœ๋ฅผ ํ”„๋กœํŒŒ์ผ๋งํ•˜๋Š” ๋ธŒ๋ผ์šฐ์ € ๋‚ด์žฅ ๋„๊ตฌ. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Heap Snapshots ๋น„๊ต, Allocation Timeline์„ ํ†ตํ•œ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ์ถ”์ , Detached DOM tree ํŒŒ์•… ๊ธฐ๋ฒ• [9, 12, 33]. +- [[React DevTools Profiler]] + - ์—ฐ๊ฒฐ ์ด์œ : React ํŠน์œ ์˜ ๋ Œ๋”๋ง ์‚ฌ์ดํด๊ณผ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ์„ ์‹œ๊ฐํ™”ํ•˜๋Š” ํ•ต์‹ฌ ๋„๊ตฌ. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง ์†Œ์š” ์‹œ๊ฐ„, ๋ Œ๋”๋ง ๋ฐœ์ƒ ์›์ธ(Props/State ๋ณ€๊ฒฝ ์—ฌ๋ถ€ ํŒ๋ณ„) [5, 14]. + +#### [๊ด€๊ณ„ ์œ ํ˜• B (ํ”„๋กœ๋•์…˜ ๊ด€์ธก์„ฑ ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง)] +- [[Frontend Cloud Logging Tools]] + - ์—ฐ๊ฒฐ ์ด์œ : Sentry, LogRocket, Datadog RUM, SigNoz ๋“ฑ ๋ฐฐํฌ ์ดํ›„ ๋ฐœ์ƒํ•˜๋Š” ์„ฑ๋Šฅ ์ €ํ•˜์™€ ๋ฒ„๊ทธ๋ฅผ ์ถ”์ ํ•˜๋Š” ํ”Œ๋žซํผ. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํ”„๋กœ๋•์…˜ ๋ ˆ๋ฒจ์—์„œ์˜ ์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด, ์ž๋™ ์—๋Ÿฌ ๊ทธ๋ฃนํ™”, ์—”๋“œํˆฌ์—”๋“œ ๋ถ„์‚ฐ ํŠธ๋ ˆ์ด์‹ฑ, Core Web Vitals ์ถ”์  [7, 8, 20, 21, 34]. + +#### [๊ด€๊ณ„ ์œ ํ˜• C (์•„ํ‚คํ…์ฒ˜ ๋ฐ ์•ˆํ‹ฐํŒจํ„ด)] +- [[JavaScript Memory Leaks]] + - ์—ฐ๊ฒฐ ์ด์œ : ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ฑ๋Šฅ์„ ์ ์ง„์ ์œผ๋กœ ํŒŒ๊ดดํ•˜๋Š” ํ˜„์ƒ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ํŒฝ์ฐฝ, ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ๋“ฑ๊ณผ ์—ฐ๊ด€. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํด๋กœ์ € ์ž”๋ฅ˜ ์ฐธ์กฐ(Closure-Retained References), ํ•ด์ œ๋˜์ง€ ์•Š์€ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ์˜ ๋™์ž‘ ๋ฉ”์ปค๋‹ˆ์ฆ˜ [2, 10, 35]. +- [[React Re-render Optimization]] + - ์—ฐ๊ฒฐ ์ด์œ : React์˜ ๋ Œ๋”๋ง ํŠน์„ฑ์ƒ ๋ฐœ์ƒํ•˜๋Š” ๋ฉ”์ธ ์Šค๋ ˆ๋“œ ๋ธ”๋กœํ‚น ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์ฝ”๋“œ ๋ ˆ๋ฒจ ๊ธฐ๋ฒ•. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ฐธ์กฐ ์•ˆ์ •์„ฑ(Reference stability), ์ต๋ช… ํ•จ์ˆ˜์˜ ๋ถ€์ž‘์šฉ, `useMemo` ๋ฐ `useCallback`์˜ ์˜ฌ๋ฐ”๋ฅธ ํ™œ์šฉ๋ฒ• [36-38]. + +### Deeper Research Questions + +- ํ”„๋ก ํŠธ์—”๋“œ ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ ์ˆ˜์ง‘ํ•˜๋Š” Sentry, LogRocket ๋“ฑ์˜ ํˆด์ด ์œ ๋ฐœํ•˜๋Š” ์„ฑ๋Šฅ ์ €ํ•˜(๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ ๋ฐ ์‹คํ–‰ ์˜ค๋ฒ„ํ—ค๋“œ)๋ฅผ ์ตœ์†Œํ™”ํ•˜๋ฉด์„œ๋„ Core Web Vitals ๋“ฑ ์œ ์˜๋ฏธํ•œ ๋””๋ฒ„๊น… ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๋Š” ์ตœ์ ์˜ ์„ค์ • ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? +- JavaScript ํ™˜๊ฒฝ์˜ Allocation Timeline ์ƒ์—์„œ ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ฐœ์ƒํ•˜๋Š” ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜(GC) ์ŠคํŒŒ์ดํฌ์™€ ์‹ค์ œ ๋ธŒ๋ผ์šฐ์ €์˜ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ ๋ฉˆ์ถค ํ˜„์ƒ(Jank/INP ์ €ํ•˜) ๊ฐ„์˜ ์ƒ๊ด€๊ด€๊ณ„๋ฅผ ์–ด๋–ป๊ฒŒ ์ •๋Ÿ‰์ ์œผ๋กœ ํ”„๋กœํŒŒ์ผ๋งํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- React Compiler๊ฐ€ ์ž๋™ํ™”ํ•˜๋Š” ์˜์—ญ๊ณผ ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(์˜ˆ: ํ•ญ์ƒ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” `useLocation`, `useMutation`)๋กœ ์ธํ•ด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ตœ์ ํ™”๋ฅผ ์šฐํšŒํ•˜๋Š” ๊ฒฝ์šฐ, ์ด ์ถฉ๋Œ์„ ๋””๋ฒ„๊น…ํ•˜๊ณ  ํ•ด๊ฒฐํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ํŒจํ„ด์€ ๋ฌด์—‡์ธ๊ฐ€? +- Puppeteer ๊ธฐ๋ฐ˜์˜ Automated Memory Testing์„ CI/CD ํŒŒ์ดํ”„๋ผ์ธ์— ํ†ตํ•ฉํ•˜์—ฌ, Detached DOM node๋‚˜ Event Listener ๋ˆ„์ ๊ณผ ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ํ”„๋กœ๋•์…˜ ๋ฐฐํฌ ์ „์— ์ฐจ๋‹จํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? +- Context API ์‚ฌ์šฉ ์‹œ ๋ฐœ์ƒํ•˜๋Š” ๊ด‘๋ฒ”์œ„ํ•œ ๋ฆฌ๋ Œ๋”๋ง ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Zustand์™€ ๊ฐ™์€ ์™ธ๋ถ€ ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ์˜ 'Selector' ํŒจํ„ด์„ ์‚ฌ์šฉํ•  ๋•Œ, ๋””๋ฒ„๊น… ๊ณผ์ •์—์„œ Redux DevTools ์—ฐ๋™์ด ์ œ๊ณตํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ์ด์ ์€ ๋ฌด์—‡์ธ๊ฐ€? + +### Practical Application Contexts + +- **Implementation:** React ์ปดํฌ๋„ŒํŠธ ๋งˆ์šดํŠธ ํ•ด์ œ ์‹œ `useEffect` ํด๋ฆฐ์—… ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ์ œ๊ฑฐํ•จ์œผ๋กœ์จ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ , ๋กœ์ปฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ `why-did-you-render` ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ์ฝ˜์†” ๊ฒฝ๊ณ ๋กœ ์กฐ๊ธฐ ๊ฐ์ง€ํ•œ๋‹ค [15, 39]. +- **System Design:** ์ดˆ๊ธฐ ํ”„๋ก ํŠธ์—”๋“œ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ ๋‹จ๊ณ„๋ถ€ํ„ฐ SigNoz(OpenTelemetry ๊ธฐ๋ฐ˜)๋‚˜ Sentry์™€ ๊ฐ™์€ ๋กœ๊น… ๋„๊ตฌ ๋„์ž…์„ ์ธํ”„๋ผ ๊ตฌ์„ฑ ์š”์†Œ๋กœ ๊ฒฐ์ •ํ•˜๊ณ , ์‚ฌ์šฉ์ž ์ •๋ณด ๋ณดํ˜ธ๋ฅผ ์œ„ํ•ด ์„ธ์…˜ ์บก์ฒ˜ ์‹œ ๋ฏผ๊ฐ ๋ฐ์ดํ„ฐ ๋งˆ์Šคํ‚น ์ •์ฑ…์„ ์‚ฌ์ „ ์„ค๊ณ„ํ•œ๋‹ค [21, 25, 26, 40]. +- **Operation / Maintenance:** ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ์•ฑ์ด ๋ฌด๊ฑฐ์›Œ์ง€๊ฑฐ๋‚˜ ๋А๋ ค์ง„๋‹ค๋Š” ์‚ฌ์šฉ์ž ์ œ๋ณด๊ฐ€ ๋“ค์–ด์˜ฌ ๊ฒฝ์šฐ, Chrome DevTools Memory ํŒจ๋„์˜ Heap Snapshot์„ ํ†ตํ•ด ๋ถ„๋ฆฌ๋œ DOM ๋…ธ๋“œ๊ฐ€ ์ ์ง„์ ์œผ๋กœ ๋ˆ„์ ๋˜๋Š”์ง€ ๊ฒ€์‚ฌํ•˜๊ณ  ์›์ธ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•œ๋‹ค [1, 9, 41]. +- **Learning Path:** ์šฐ์„  JavaScript ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ์˜ ๋™์ž‘ ์›๋ฆฌ์™€ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ํŒจํ„ด์„ ํ•™์Šตํ•œ ๋’ค, Chrome DevTools์˜ Task Manager์™€ Memory ํŒจ๋„ ์‚ฌ์šฉ๋ฒ•์„ ์ตํžˆ๊ณ , ์ตœ์ข…์ ์œผ๋กœ React Profiler์™€ ํ”„๋กœ๋•์…˜ ๋กœ๊น… ๋„๊ตฌ ํ™œ์šฉ๋ฒ•์œผ๋กœ ํ•™์Šต์„ ํ™•์žฅํ•œ๋‹ค. +- **My Project Relevance:** ํ˜„์žฌ ์ง„ํ–‰ํ•˜๋Š” React ๊ธฐ๋ฐ˜ ๋Œ€์‹œ๋ณด๋“œ ํ”„๋กœ์ ํŠธ์—์„œ ํ…Œ์ด๋ธ” ๋ฐ์ดํ„ฐ๋‚˜ ์ฐจํŠธ ์—…๋ฐ์ดํŠธ ์‹œ ํ™”๋ฉด ๋ฉˆ์ถค์ด ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ, Chrome DevTools Performance ํƒญ์„ ํ†ตํ•ด ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰ ์‹œ๊ฐ„์„ ํ™•์ธํ•˜๊ณ  React Profiler๋ฅผ ๋ถ™์—ฌ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ฆฌ๋ Œ๋”๋ง๋˜๋Š” ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‹๋ณ„, `React.memo` ๋˜๋Š” ์‹๋ณ„์ž(Key)๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ์ตœ์ ํ™” ์ž‘์—…์— ์ง์ ‘ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. + +### Adjacent Topics + +- [[Core Web Vitals]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ํ”„๋ก ํŠธ์—”๋“œ ์„ฑ๋Šฅ ์ตœ์ ํ™”์™€ ๋””๋ฒ„๊น…์˜ ๊ถ๊ทน์ ์ธ ์„ฑ๊ณผ ์ง€ํ‘œ์ด์ž ๊ธฐ์ค€์ ์ด ๋˜๋Š” ์‹ค์ œ ์‚ฌ์šฉ์ž ์ฒด๊ฐ ์†๋„ ์ง€ํ‘œ(LCP, FID, INP, CLS ๋“ฑ) ์‹ฌ์ธต ํƒ๊ตฌ [8]. +- [[React Server Components (RSC)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: Next.js ํ™˜๊ฒฝ์—์„œ ํด๋ผ์ด์–ธํŠธ ์ธก ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ ์ž์ฒด๋ฅผ ์ค„์ด๊ณ  ์ƒํ˜ธ์ž‘์šฉ ์—†๋Š” UI๋ฅผ ์„œ๋ฒ„์—์„œ ๋ Œ๋”๋งํ•จ์œผ๋กœ์จ ๊ทผ๋ณธ์ ์ธ ํด๋ผ์ด์–ธํŠธ ๋””๋ฒ„๊น… ์š”์†Œ ๋ฐ ๋ฆฌ๋ Œ๋”๋ง ๋น„์šฉ์„ ์ œ๊ฑฐํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜ [42, 43]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Development/Large-scale Application Refactoring.md b/10_Wiki/Development/Large-scale Application Refactoring.md new file mode 100644 index 00000000..57dc756e --- /dev/null +++ b/10_Wiki/Development/Large-scale Application Refactoring.md @@ -0,0 +1,66 @@ +# [[Large-scale Application Refactoring]] + +## ๐Ÿ“Œ Brief Summary +๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฆฌํŒฉํ† ๋ง์€ ์ฝ”๋“œ์˜ ๋™์ž‘ ๋ฐฉ์‹์„ ๋ณด์กดํ•˜๋ฉด์„œ ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ๊ฐœ์„ ํ•˜์—ฌ ์˜ค๋ž˜๋œ ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ํ™•์žฅ์„ฑ์„ ํšŒ๋ณตํ•˜๋Š” ๊ณผ์ •์ด๋‹ค [1]. ์ด๋Š” ๋‹จ์ˆœํžˆ ์ฝ”๋“œ๋ฅผ '์ˆ˜์ •'ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๋ณต์žกํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋ถ„๋ฆฌํ•˜๊ณ  ๊ตฌ์กฐ์  ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•œ๋‹ค [2]. ์„ฑ๊ณต์ ์ธ ๋ฆฌํŒฉํ† ๋ง์„ ์œ„ํ•ด์„œ๋Š” ์ ์ง„์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹, ์—„๊ฒฉํ•œ ์•„ํ‚คํ…์ฒ˜ ์ ์šฉ, ๊ทธ๋ฆฌ๊ณ  ์ฝ”๋“œ ๋ณ€๊ฒฝ์„ ๋’ท๋ฐ›์นจํ•  ์ˆ˜ ์žˆ๋Š” ํ…Œ์ŠคํŠธ ๊ตฌ์ถ•์ด ํ•„์ˆ˜์ ์ด๋‹ค [1, 3]. + +## ๐Ÿ“– Core Content + +* **์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ „๋žต (Incremental Migration):** ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ•œ ๋ฒˆ์— ์ „๋ฉด ์žฌ์ž‘์„ฑ(Rewrite)ํ•˜๋Š” ๊ฒƒ์€ ๋ฆฌ์Šคํฌ๊ฐ€ ๋งค์šฐ ํฌ๊ธฐ ๋•Œ๋ฌธ์—, "์žฌ์ž‘์„ฑ์ด ์•„๋‹Œ ๋ฆฌํŒฉํ† ๋ง" ์ „๋žต์ด ๊ถŒ์žฅ๋œ๋‹ค [1]. ์˜ˆ๋ฅผ ๋“ค์–ด ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ๋ฅผ Context API์—์„œ Zustand๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ๋•Œ, ์•Œ๋ฆผ๊ณผ ๊ฐ™์€ ๋‹จ์ˆœํ•œ ์œ ํ‹ธ๋ฆฌํ‹ฐ ์Šคํ† ์–ด๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด ๊ฒฐ์ œ ํ๋ฆ„๊ณผ ๊ฐ™์€ ๋ณต์žกํ•œ ๋„๋ฉ”์ธ์œผ๋กœ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์Šคํ† ์–ด์”ฉ ์ ์ง„์ ์œผ๋กœ ์ด๋™ํ•ด์•ผ ํ•œ๋‹ค [1]. +* **๊ธฐ๋Šฅ ๋ฐ ๋„๋ฉ”์ธ ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ๋กœ์˜ ๊ฐœํŽธ:** ๋ ˆ๊ฑฐ์‹œ ์•ฑ์—์„œ ํ”ํžˆ ์“ฐ์ด๋Š” ํŒŒ์ผ ํƒ€์ž… ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ(components, hooks ๋“ฑ์„ ๋”ฐ๋กœ ๋ชจ์œผ๋Š” ๋ฐฉ์‹)๋Š” ์•ฑ์ด ์ปค์งˆ์ˆ˜๋ก ํƒ์ƒ‰๊ณผ ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ ๋‹ค [4, 5]. ๋”ฐ๋ผ์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๊ธฐ๋Šฅ๋ณ„๋กœ ์ฝ”๋“œ๋ฅผ ๋ชจ์œผ๋Š” ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ๋‚˜, ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ์„ ๊ฐ•์ œํ•˜๋Š” ์—„๊ฒฉํ•œ ๊ณ„์ธต ๋ชจ๋ธ์ธ Feature-Sliced Design(FSD)์œผ๋กœ ํด๋” ๊ตฌ์กฐ๋ฅผ ์žฌํŽธํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ ์ธ ๋ฆฌํŒฉํ† ๋ง ๋ชฉํ‘œ๊ฐ€ ๋œ๋‹ค [6-8]. +* **์ปค์Šคํ…€ ํ›…์„ ํ†ตํ•œ ๋กœ์ง ์บก์Аํ™”:** ํ˜„๋Œ€ React ๋ฆฌํŒฉํ† ๋ง์˜ ๊ธฐ๋ณธ ๋‹จ์œ„๋Š” ์ปค์Šคํ…€ ํ›…์ด๋‹ค [9]. ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ํŽ˜์นญ์ด๋‚˜ ํผ ํ•ธ๋“ค๋ง ๋กœ์ง์„ ๊ฑฐ๋Œ€ํ•œ UI ์ปดํฌ๋„ŒํŠธ์—์„œ ์ถ”์ถœํ•˜์—ฌ `useFetch`, `useForm` ๋“ฑ์˜ ํ›…์œผ๋กœ ๋ถ„๋ฆฌํ•˜๋ฉด, UI์™€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ๊ฒฉ๋ฆฌ๋˜์–ด ๋” ๋น ๋ฅด๊ณ  ๋…๋ฆฝ์ ์ธ ์œ ๋‹› ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง„๋‹ค [9, 10]. +* **ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•œ ์•ˆ์ „๋ง ํ™•๋ณด:** ์ฝ”๋“œ๋ฅผ ๋ณธ๊ฒฉ์ ์œผ๋กœ ์ˆ˜์ •ํ•˜๊ธฐ ์ „์— ํ…Œ์ŠคํŠธ(Unit Test, UI Test ๋“ฑ)๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ตœ์šฐ์„  ๋ฐฉ์–ด์„ ์ด๋‹ค [3, 11, 12]. ๊ธฐ์กด ๊ธฐ๋Šฅ์ด ๊นจ์ง€์ง€ ์•Š์•˜๋Š”์ง€ ๊ฒ€์ฆํ•  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ณผ์ • ์ž์ฒด๊ฐ€ ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ธฐ์กด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ํ๋ฆ„์„ ๊นŠ์ด ์ดํ•ดํ•˜๋„๋ก ๊ฐ•์ œํ•˜๋Š” ํ•™์Šต ๋„๊ตฌ๊ฐ€ ๋œ๋‹ค [13, 14]. +* **๋ ˆ๊ฑฐ์‹œ ์•ˆํ‹ฐํŒจํ„ด ๋ฐ ์Šคํƒ ์ œ๊ฑฐ:** ํšจ์œจ์ ์ธ ๊ตฌ์กฐ๋ฅผ ์œ„ํ•ด ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ Œ๋”๋ง์„ ์œ ๋ฐœํ•˜๋Š” ๋‹ค์ˆ˜์˜ `useEffect`๋ฅผ ์ œ๊ฑฐํ•˜๊ณ , ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ์ƒํƒœ๋ฅผ ๋ถ„๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด TanStack Query์™€ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ๋„์ž…ํ•ด์•ผ ํ•œ๋‹ค [15]. ๋˜ํ•œ, ๊ฐ€๋Šฅํ•  ๊ฒฝ์šฐ ํด๋ž˜์Šค ๊ธฐ๋ฐ˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์™€ ํ›…์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ , ์ผ๊ด€์„ฑ ์—†๋Š” CSS ์ ์šฉ ๋ฐฉ์‹์„ ํ•˜๋‚˜๋กœ ํ†ต์ผํ•˜๋Š” ์ž‘์—…๋„ ์ˆ˜๋ฐ˜๋œ๋‹ค [15, 16]. + +## โš–๏ธ Trade-offs & Caveats +* **DRY์™€ KISS ์›์น™์˜ ์ถฉ๋Œ:** ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๋ ค๋Š” DRY(Don't Repeat Yourself) ์›์น™์„ ๊ณผ๋„ํ•˜๊ฒŒ ์ ์šฉํ•  ๊ฒฝ์šฐ, ์ถ”์ƒํ™”๊ฐ€ ์ง€๋‚˜์น˜๊ฒŒ ๋ณต์žกํ•ด์ ธ ์ฝ”๋“œ๋ฅผ ๋‹จ์ˆœํ•˜๊ฒŒ ์œ ์ง€ํ•ด์•ผ ํ•˜๋Š” KISS(Keep It Simple, Stupid) ์›์น™์„ ์œ„๋ฐ˜ํ•˜๊ฒŒ ๋œ๋‹ค [17]. ๋”ฐ๋ผ์„œ ํŠน์ • ํŒจํ„ด์ด ์„ธ ๋ฒˆ ๋ฐ˜๋ณต๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ ์ถ”์ƒํ™”๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์กฐ๊ธฐ ์ตœ์ ํ™”๋กœ ์ธํ•œ ๋ถ€์ž‘์šฉ์„ ๋ง‰๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค [17]. +* **์žฌ์ž‘์„ฑ(Rewrite) vs ๋ฆฌํŒฉํ† ๋ง(Refactoring)์˜ ๊ธฐ๋กœ:** ๋ฆฌํŒฉํ† ๋ง ๋Œ€์ƒ์ธ ์•ฑ์˜ ๊ทœ๋ชจ๊ฐ€ ๋น„๊ต์  ์ž‘๋‹ค๋ฉด ์ฒ˜์Œ๋ถ€ํ„ฐ ์ƒˆ๋กœ ์•ฑ์„ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์ด ์˜คํžˆ๋ ค ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ๋‹ค [11]. ๊ทธ๋Ÿฌ๋‚˜ ๋Œ€ํ˜• ์•ฑ์˜ ๊ฒฝ์šฐ ์ „์ฒด ์žฌ์ž‘์„ฑ์€ ์œ„ํ—˜์ด ์ปค์„œ ์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ํ•ด์•ผ ํ•˜๋Š”๋ฐ, ์ด ๊ฒฝ์šฐ ์ „ํ™˜ ๊ธฐ๊ฐ„ ๋™์•ˆ ๋‘ ๊ฐ€์ง€ ๋‹ค๋ฅธ ๊ธฐ์ˆ ์ด๋‚˜ ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด์ด ๊ณต์กดํ•ด์•ผ ํ•˜๋Š” ๊ณผ๋„๊ธฐ์  ๊ธฐ์ˆ  ๋ถ€์ฑ„๋ฅผ ๊ฐ๋‹นํ•ด์•ผ ํ•œ๋‹ค [1]. +* **์ปดํŒŒ์ผ๋Ÿฌ ์ž๋™ํ™” ๋„์ž…์˜ ์žฅ๋ฒฝ:** React Compiler์™€ ๊ฐ™์ด ์„ฑ๋Šฅ ์ตœ์ ํ™”(๋ฉ”๋ชจ์ด์ œ์ด์…˜)๋ฅผ ์ž๋™ํ™”ํ•ด ์ฃผ๋Š” ๋„๊ตฌ๋ฅผ ๋„์ž…ํ•˜๋ฉด ์ˆ˜๋™ ์ตœ์ ํ™” ์ฝ”๋“œ๋ฅผ ์ง€์›Œ ์ฝ”๋“œ๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค [18]. ํ•˜์ง€๋งŒ ๊ธฐ์ˆ  ๋ถ€์ฑ„๊ฐ€ ๋งŽ์€ ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ๊ฒฝ์šฐ, ๊ธฐ์กด ์ฝ”๋“œ๊ฐ€ 'React์˜ ๊ทœ์น™(Rules of React)'์„ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์œ„๋ฐ˜ํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ, ๋„์ž… ์ „ ๋Œ€๋Œ€์ ์ธ ์‚ฌ์ „ ๋ฆฌํŒฉํ† ๋ง์ด ์„ ํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ์ œ์•ฝ์ด ๋”ฐ๋ฅธ๋‹ค [19]. +* **๊ณต์œ (Shared) ๋ชจ๋“ˆ์˜ ๋น„๋Œ€ํ™”:** ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ฒ˜(์˜ˆ: FSD)๋กœ ๋ถ„๋ฆฌํ•  ๋•Œ, ๊ณตํ†ต์œผ๋กœ ์“ฐ์ด๋Š” ์ฝ”๋“œ๋ฅผ ๋ฌด๋ถ„๋ณ„ํ•˜๊ฒŒ 'Shared' ๊ณ„์ธต์— ๋„ฃ์œผ๋ฉด ํ•ด๋‹น ๊ณ„์ธต์ด ๋ณต์žกํ•œ ์ŠคํŒŒ๊ฒŒํ‹ฐ ์ฝ”๋“œ๊ฐ€ ๋˜๊ณ  ๋ณ€๊ฒฝ ์‹œ ์˜ํ–ฅ ๋ฒ”์œ„(Blast Radius)๊ฐ€ ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ์ปค์ง€๋Š” ์œ„ํ—˜์ด ์žˆ๋‹ค [20, 21]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [์•„ํ‚คํ…์ฒ˜ ๋ฐ ๊ธฐ๋ฐ˜ ์›์น™] +- [[Feature-Sliced Design]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋Œ€๊ทœ๋ชจ ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ์ŠคํŒŒ๊ฒŒํ‹ฐํ™”๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ , ๋„๋ฉ”์ธ/๊ธฐ๋Šฅ ์ค‘์‹ฌ์˜ ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ๊ทœ์น™์„ ๋ถ€์—ฌํ•˜์—ฌ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฆฌํŒฉํ† ๋ง์˜ ๊ถ๊ทน์  ๋ชฉํ‘œ ๋ชจ๋ธ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค [7, 22]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ธฐ๋Šฅ(Feature)๊ณผ ๊ณ„์ธต(Layer)์„ ์–ด๋–ป๊ฒŒ ๋‚˜๋ˆ„๊ณ  ์บก์Аํ™”ํ•˜์—ฌ ์„œ๋กœ ๊ฐ„์˜ ์˜์กด์„ฑ ๊ฒฐํ•ฉ์„ ๋Š์–ด๋‚ด๋Š”์ง€์— ๋Œ€ํ•œ ์‹ค๋ฌด์  ์•„ํ‚คํ…์ฒ˜ ๊ตฌ์กฐ [6, 23]. + +- [[SOLID Principles]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP) ๋“ฑ์„ ํ†ตํ•ด ๊ฑฐ๋Œ€ํ•œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ฐ€์ง€๋Š” ์—ฌ๋Ÿฌ ์ฑ…์ž„์„ ๋ถ„๋ฆฌํ•˜๊ณ , ํ•จ์ˆ˜๋‚˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅํ•˜๊ฒŒ ์ž˜๊ฒŒ ์ชผ๊ฐœ๋Š” ๋ฆฌํŒฉํ† ๋ง์˜ ํ•ต์‹ฌ ์ด๋ก ์  ๋ฐฐ๊ฒฝ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค [24, 25]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ธฐ๋Šฅ์  ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ์ธํ„ฐํŽ˜์ด์Šค(Props)๋ฅผ ์–ด๋–ป๊ฒŒ ๋ถ„๋ฆฌํ•˜๊ณ , ํ™•์žฅ์— ์—ด๋ ค์žˆ์œผ๋ฉด์„œ ์ˆ˜์ •์—๋Š” ๋‹ซํžŒ ์ฝ”๋“œ ์ž‘์„ฑ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ• [25, 26]. + +#### [๊ตฌํ˜„ ๋ฐ ํ™œ์šฉ ๋„๊ตฌ] +- [[Unit Testing]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ ๊ตฌ์กฐ๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ ๊ธฐ๋Šฅ์ด ๋ง๊ฐ€์ง€์ง€ ์•Š์•˜์Œ์„ ๋ณด์žฅํ•˜๋Š” ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„์ด์ž ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์•ˆ์ „๋ง ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค [3, 12]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ฝ”๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ๋” ์ž‘๊ณ  ๋…ผ๋ฆฌ์ ์ธ ๋ธ”๋ก ๋‹จ์œ„๋กœ ๋‚˜๋ˆ„์–ด(Triangulation) ์˜์กด์„ฑ ์—†์ด ๋…๋ฆฝ์ ์œผ๋กœ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ๋ฐฉ๋ฒ•๋ก  [9, 12]. + +- [[Custom Hooks]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์— ๋ณต์žกํ•˜๊ฒŒ ์–ฝํžŒ ์ƒํƒœ์™€ ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ ๋กœ์ง์„ ์™ธ๋ถ€๋กœ ์ถ”์ถœํ•˜๋Š” ๋ฆฌํŒฉํ† ๋ง์˜ ์ฃผ๋œ ๋‹จ์œ„์ด์ž ๋„๊ตฌ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค [9]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: UI ๋ Œ๋”๋ง ์ฑ…์ž„๊ณผ ๋น„์ฆˆ๋‹ˆ์Šค ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์ฑ…์ž„์„ ์–ด๋–ป๊ฒŒ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๊ฒฉ๋ฆฌํ•˜์—ฌ ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋Š”์ง€์˜ ์›๋ฆฌ [9, 10]. + +### Deeper Research Questions + +- ๋ฆฌํŒฉํ† ๋ง ๊ณผ์ •์—์„œ Feature-Sliced Design(FSD) ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋„์ž…ํ•  ๋•Œ, ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ(Feature)์—์„œ ๋™์‹œ์— ์š”๊ตฌ๋˜๋Š” ๊ต์ฐจ ๊ด€์‹ฌ์‚ฌ(Cross-cutting concerns) ๋กœ์ง์€ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋Š”๊ฐ€? +- ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ์ „๋ฌดํ•œ ๊ฑฐ๋Œ€ํ•œ ๋ ˆ๊ฑฐ์‹œ React ์•ฑ์„ ๋ฆฌํŒฉํ† ๋งํ•  ๋•Œ, ์–ด๋–ค ๋ถ€๋ถ„(์˜ˆ: ๊ณตํ†ต ์œ ํ‹ธ, UI ์ปดํฌ๋„ŒํŠธ, ์ „์—ญ ์ƒํƒœ ๋“ฑ)๋ถ€ํ„ฐ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋‘๊ณ  ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€๋ฅผ ํ™•๋ณดํ•ด์•ผ ํ•˜๋Š”๊ฐ€? +- ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ Context API ๊ธฐ๋ฐ˜ ์ „์—ญ ์ƒํƒœ๋ฅผ Zustand ๋“ฑ ํ˜„๋Œ€์  ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ๋กœ ์ ์ง„์ ์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์ƒํƒœ ๋™๊ธฐํ™” ๋ฌธ์ œ๋Š” ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- ๊ธฐ์กด์˜ ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜(`useMemo`, `useCallback`) ์ฝ”๋“œ๊ฐ€ ๋งŽ์€ ๋ ˆ๊ฑฐ์‹œ ์•ฑ์— React Compiler๋ฅผ ๋„์ž…ํ•˜๊ธฐ ์œ„ํ•ด ์ฝ”๋“œ ๋‚ด์˜ 'Rules of React' ์œ„๋ฐ˜ ์‚ฌํ•ญ์„ ์ถ”์ ํ•˜๊ณ  ๊ฒ€์ฆํ•˜๋Š” ํšจ๊ณผ์ ์ธ ์ž๋™ํ™” ํ”„๋กœ์„ธ์Šค๋Š” ๋ฌด์—‡์ธ๊ฐ€? +- ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์™€ ์ปค์Šคํ…€ ํ›… ๊ตฌ์กฐ๋กœ ๋ฆฌํŒฉํ† ๋งํ•  ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜(Memory Leaks) ํŒจํ„ด์„ ๊ฐ์ง€ํ•˜๊ณ  ๋ฐฉ์ง€ํ•˜๋Š” ๋””๋ฒ„๊น… ์ „๋žต๋ก ์€ ๋ฌด์—‡์ธ๊ฐ€? + +### Practical Application Contexts + +- **Implementation:** ๊ฑฐ๋Œ€ํ•œ ํผ ์ฒ˜๋ฆฌ๋‚˜ API ํŽ˜์นญ ๋กœ์ง์ด ๋ทฐ์™€ ๊ฒฐํ•ฉํ•˜์—ฌ 300์ค„์ด ๋„˜์–ด๊ฐ€๋Š” ๊ธฐ์กด ์ปดํฌ๋„ŒํŠธ๋ฅผ, ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)์— ๋”ฐ๋ผ ์ˆœ์ˆ˜ ๋ทฐ ์ปดํฌ๋„ŒํŠธ์™€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋‹ด์€ ์ปค์Šคํ…€ ํ›…์œผ๋กœ ์ถ”์ถœํ•˜์—ฌ ๋‹ค์‹œ ์—ฐ๊ฒฐํ•œ๋‹ค [9, 25]. +- **System Design:** ํด๋” ๊ตฌ์กฐ๋ฅผ `components/`, `hooks/` ๊ฐ™์€ ํŒŒ์ผ ์œ ํ˜• ๊ตฌ๋ถ„์ด ์•„๋‹Œ, ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ(์˜ˆ: ์ธ์ฆ, ๊ฒฐ์ œ)์„ ์ค‘์‹ฌ์œผ๋กœ ๋ชจ์€ ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ํ˜น์€ FSD ๊ธฐ๋ฐ˜ ํด๋” ๊ณ„์ธต ๊ตฌ์กฐ๋กœ ์ „๋ฉด ์žฌ์„ค๊ณ„ํ•œ๋‹ค [8, 27]. +- **Operation / Maintenance:** ESLint์™€ Husky ๋“ฑ์˜ ๋„๊ตฌ๋ฅผ ํŒŒ์ดํ”„๋ผ์ธ์— ๊ตฌ์ถ•ํ•˜์—ฌ ๋ฆฌํŒฉํ† ๋ง๋œ ์ฝ”๋“œ๊ฐ€ ์ƒ์œ„ ๊ณ„์ธต์„ ์ž˜๋ชป ์ฐธ์กฐํ•˜๋Š” ์—ญ์˜์กด์„ฑ(Reverse dependency)์„ ๋ฐœ์ƒ์‹œํ‚ค๊ฑฐ๋‚˜ ์ฝ”๋“œ ์ปจ๋ฒค์…˜์ด ์–ด๊ธ‹๋‚˜์ง€ ์•Š๋„๋ก ์—„๊ฒฉํžˆ ํ†ต์ œํ•œ๋‹ค [28]. +- **Learning Path:** ๋ฆฌํŒฉํ† ๋งํ•ด์•ผ ํ•  ์ฝ”๋“œ๋ฅผ ํŒŒ์•…ํ•˜๊ธฐ ์ „, ๋จผ์ € ์ž‘์€ ๋นˆ ํ”„๋กœ์ ํŠธ๋‚˜ 'ํ† ์ด ์•ฑ'์„ ๋งŒ๋“ค์–ด ๋ฆฌํŒฉํ† ๋ง์— ๋„์ž…ํ•  ์ƒˆ๋กœ์šด ๊ธฐ์ˆ (React์˜ ์ตœ์‹  ๊ธฐ๋Šฅ ๋“ฑ)์˜ ๊ธฐ์ดˆ๋ฅผ ์‹ค์Šตํ•˜์—ฌ ๊ฐœ๋…์„ ํ™•๋ฆฝํ•œ๋‹ค [29]. +- **My Project Relevance:** ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค์ด ์ž‘์„ฑํ•œ ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฅผ ์ธ๊ณ„๋ฐ›์•„ ๋…ผ๋ฌธ ํ”„๋กœ์ ํŠธ์šฉ์œผ๋กœ ๋ฆฌํŒฉํ† ๋งํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ, ๋จผ์ € ๊ธฐ์กด ๋กœ์ง์„ ํŒŒ์•…ํ•˜๊ธฐ ์œ„ํ•œ ์œ ๋‹› ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•œ ํ›„, ๋ฌด๋ถ„๋ณ„ํ•˜๊ฒŒ ํ˜ผ์šฉ๋œ CSS ์Šคํƒ€์ผ ์ •์ฑ…์„ ํ•˜๋‚˜๋กœ ํ†ต์ผ์‹œํ‚ค๊ณ  ๋ถˆํ•„์š”ํ•œ ์ „์—ญ ์ƒํƒœ๋ฅผ ์ง€์—ญ ์ƒํƒœ๋กœ ์ „ํ™˜ํ•˜๋Š” ์‹ค๋ฌด ํ”„๋กœ์„ธ์Šค๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค [14, 16, 30, 31]. + +### Adjacent Topics + +- [[Web Performance Optimization]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋ฆฌํŒฉํ† ๋ง ์ž‘์—…๊ณผ ๋ณ‘ํ–‰ํ•˜์—ฌ ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ ๊ฐ์†Œ(์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…), ๋ฆฌ๋ Œ๋”๋ง ์ตœ์ ํ™”, ๋ถˆํ•„์š”ํ•œ ๋ Œ๋” ๋ธ”๋กœํ‚น ์ œ๊ฑฐ ๋“ฑ์„ ํ†ตํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋Ÿฐํƒ€์ž„ ๋ฐ ๋กœ๋”ฉ ์†๋„๋ฅผ ํ–ฅ์ƒํ•˜๋Š” ์ „๋žต์  ๊ธฐ๋ฒ•์„ ํƒ๊ตฌํ•œ๋‹ค. +- [[State Management Fragmentation]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋ ˆ๊ฑฐ์‹œ ์•ฑ์˜ ๊ฑฐ๋Œ€ํ•œ ๋‹จ์ผ ์ „์—ญ ์ƒํƒœ๋ฅผ ๋ถ„์„ํ•˜์—ฌ ๋กœ์ปฌ ์ปดํฌ๋„ŒํŠธ ์ƒํƒœ, ์ „์—ญ UI ์ƒํƒœ, ์„œ๋ฒ„ ์บ์‹œ ์ƒํƒœ, URL ์ƒํƒœ ๋“ฑ์œผ๋กœ ํŒŒํŽธํ™” ๋ฐ ์ „๋ฌธํ™”ํ•˜์—ฌ ๊ฐ๊ฐ์— ๋งž๋Š” ๋„๊ตฌ(Zustand, React Query ๋“ฑ)๋กœ ์ด๊ด€ํ•˜๋Š” ์„ค๊ณ„ ๋ฐฉ๋ฒ•๋ก ์„ ์กฐ์‚ฌํ•œ๋‹ค. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Development/Lazy Loading.md b/10_Wiki/Development/Lazy Loading.md new file mode 100644 index 00000000..8756a85b --- /dev/null +++ b/10_Wiki/Development/Lazy Loading.md @@ -0,0 +1,63 @@ +# [[Lazy Loading]] + +## ๐Ÿ“Œ Brief Summary +Lazy Loading์€ ๋ฆฌ์†Œ์Šค๋‚˜ ์ฝ”๋“œ ์ฒญํฌ๋ฅผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ดˆ๊ธฐ ๊ตฌ๋™ ์‹œ ํ•œ ๋ฒˆ์— ๋กœ๋“œํ•˜์ง€ ์•Š๊ณ , ์‚ฌ์šฉ์ž๊ฐ€ ์‹ค์ œ๋กœ ํ•„์š”๋กœ ํ•˜๋Š” ์‹œ์ ์— ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค [1, 2]. ํ”„๋ก ํŠธ์—”๋“œ ํ™˜๊ฒฝ์—์„œ๋Š” ์ดˆ๊ธฐ JavaScript ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ตœ๋Œ€ 20~70%๊นŒ์ง€ ์ค„์—ฌ ์ดˆ๊ธฐ ํŽ˜์ด์ง€ ๋กœ๋“œ ์‹œ๊ฐ„์„ ํš๊ธฐ์ ์œผ๋กœ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค [3]. ์ฃผ๋กœ ๊ฒฝ๋กœ(Route) ๊ธฐ๋ฐ˜ ์ปดํฌ๋„ŒํŠธ, ๋ฌด๊ฑฐ์šด UI ์œ„์ ฏ(์ฐจํŠธ ๋“ฑ), ๋ทฐํฌํŠธ ํ•˜๋‹จ์˜ ์ด๋ฏธ์ง€ ๋“ฑ์— ์ ์šฉ๋˜์–ด ์•ฑ์˜ ์ „๋ฐ˜์ ์ธ ๋ฐ˜์‘์„ฑ๊ณผ Core Web Vitals ์ง€ํ‘œ๋ฅผ ๊ฐœ์„ ํ•ฉ๋‹ˆ๋‹ค [4, 5]. + +## ๐Ÿ“– Core Content +* **JavaScript ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…๊ณผ ๋™์  ์ž„ํฌํŠธ(Dynamic Imports)**: Lazy Loading์€ ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์˜จ๋””๋งจ๋“œ(on-demand)๋กœ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋Š” ๋” ์ž‘์€ ์ฒญํฌ(chunk)๋กœ ๋ถ„ํ• ํ•˜๋Š” ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…(Code Splitting) ๊ธฐ๋ฒ•์˜ ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค [2]. ๋™์  ์ž„ํฌํŠธ๋ฅผ ํ†ตํ•ด Vite๋‚˜ Webpack ๊ฐ™์€ ๋นŒ๋“œ ํˆด์ด ๋ Œ๋”๋ง์— ๋‹น์žฅ ํ•„์š”ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๋ฅผ ๋ฉ”์ธ ๋ฒˆ๋“ค์—์„œ ๋ถ„๋ฆฌํ•˜์—ฌ ๋…๋ฆฝ์ ์ธ ํŒŒ์ผ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค [1, 6, 7]. +* **React ํ™˜๊ฒฝ์—์„œ์˜ ๊ตฌํ˜„ (`React.lazy` ๋ฐ `Suspense`)**: React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” `React.lazy()` ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ปดํฌ๋„ŒํŠธ์˜ ์ง€์—ฐ ๋กœ๋”ฉ์„ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค [8]. ๋ชจ๋“ˆ์ด ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ๋‹ค์šด๋กœ๋“œ๋˜๋Š” ๋™์•ˆ ํ™”๋ฉด์ด ๋ฉˆ์ถ”๊ฑฐ๋‚˜ ๋น„์–ด ๋ณด์ด์ง€ ์•Š๋„๋ก, ``๋ฅผ ๊ฐ์‹ธ์„œ ๋กœ๋”ฉ ์Šคํ”ผ๋„ˆ์™€ ๊ฐ™์€ ๋Œ€์ฒด UI(Fallback UI)๋ฅผ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค [7, 8]. +* **๋ผ์šฐํŠธ ๋ ˆ๋ฒจ ๋ฐ ์ปดํฌ๋„ŒํŠธ ๋ ˆ๋ฒจ ์ง€์—ฐ ๋กœ๋”ฉ**: ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ๋ฐฉ์‹์€ ๋ผ์šฐํŠธ ๋ ˆ๋ฒจ์—์„œ ์ ์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ, ์‚ฌ์šฉ์ž๊ฐ€ ํŠน์ • ํŽ˜์ด์ง€๋กœ ๋„ค๋น„๊ฒŒ์ด์…˜ํ•  ๋•Œ๋งŒ ํ•ด๋‹น ํŽ˜์ด์ง€์˜ JavaScript ์ฒญํฌ๊ฐ€ ๋‹ค์šด๋กœ๋“œ๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค [2, 7]. ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„๋กœ๋Š” ์„œ๋“œํŒŒํ‹ฐ ํ†ตํ•ฉ ๊ธฐ๋Šฅ(๋น„๋””์˜ค ํ”Œ๋ ˆ์ด์–ด, PDF ๋ทฐ์–ด ๋“ฑ)์ด๋‚˜ ์ฐจํŠธ, ๋ฆฌ์น˜ ํ…์ŠคํŠธ ์—๋””ํ„ฐ ๊ฐ™์ด ๋ฌด๊ฑฐ์šด UI ๋ธ”๋ก์— ์ ์šฉํ•˜์—ฌ ๋ฉ”์ธ ๋ฒˆ๋“ค์„ ์ตœ์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค [5, 6]. +* **์ด๋ฏธ์ง€(Media) ์ตœ์ ํ™”**: JavaScript ์ฝ”๋“œ๋ฟ ์•„๋‹ˆ๋ผ ๋ฏธ๋””์–ด ๋ฆฌ์†Œ์Šค์—๋„ Lazy Loading์ด ๋„๋ฆฌ ์“ฐ์ž…๋‹ˆ๋‹ค [4]. HTML `` ํƒœ๊ทธ์— ๋„ค์ดํ‹ฐ๋ธŒ ์†์„ฑ์ธ `loading="lazy"`๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด, ์Šคํฌ๋กค์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž์˜ ๋ทฐํฌํŠธ์— ๋„๋‹ฌํ•˜๊ธฐ ์ „๊นŒ์ง€ ์ด๋ฏธ์ง€๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ดˆ๊ธฐ ํŽ˜์ด์ง€ ๋กœ๋”ฉ์˜ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ค„์ž…๋‹ˆ๋‹ค [4]. + +## โš–๏ธ Trade-offs & Caveats +* **์ดˆ๊ธฐ ๋ทฐํฌํŠธ(Above-the-fold) ์ฝ˜ํ…์ธ  ์ ์šฉ ๊ธˆ์ง€**: ์ง€์—ฐ ๋กœ๋”ฉ์€ ์Šคํฌ๋กค ์—†์ด ์ฒ˜์Œ ํ™”๋ฉด์— ๋ฐ”๋กœ ๋ณด์—ฌ์•ผ ํ•˜๋Š” ํ•ต์‹ฌ ์ฝ˜ํ…์ธ (Above-the-fold)๋‚˜ ์ฆ‰์‹œ ์ƒํ˜ธ์ž‘์šฉํ•ด์•ผ ํ•˜๋Š” ๋ Œ๋”๋ง์ด ๋น ๋ฅธ ์š”์†Œ์—๋Š” ์ ˆ๋Œ€ ์ ์šฉํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค [5]. ์ด๋ฅผ ์ ์šฉํ•  ๊ฒฝ์šฐ ์ดˆ๊ธฐ ํŽ˜์ธํŠธ ์‹œ๊ฐ„์ด ๋А๋ ค์ง€๊ณ  ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์ด ์‹ฌ๊ฐํ•˜๊ฒŒ ์ €ํ•˜๋ฉ๋‹ˆ๋‹ค [5, 9]. +* **์‚ฌ์šฉ์ž ์ธํ„ฐ๋ž™์…˜ ์‹œ ์ผ์‹œ์  ์ง€์—ฐ ๋ฐœ์ƒ**: ์ง€์—ฐ ๋กœ๋”ฉ๋œ ๊ธฐ๋Šฅ์ด๋‚˜ ํŽ˜์ด์ง€์— ์‚ฌ์šฉ์ž๊ฐ€ ์ฒ˜์Œ ์ ‘๊ทผํ•  ๋•Œ, ๋ธŒ๋ผ์šฐ์ €๋Š” ํ•„์š”ํ•œ ์Šคํฌ๋ฆฝํŠธ ์ฒญํฌ๋ฅผ ๊ทธ์ œ์•ผ ๋„คํŠธ์›Œํฌ๋กœ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค [7, 8, 10]. ์ด๋กœ ์ธํ•ด ์•ฝ๊ฐ„์˜ ๋Œ€๊ธฐ ์‹œ๊ฐ„์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ``๋ฅผ ํ†ตํ•œ ํด๋ฐฑ ์ƒํƒœ๋ฅผ ์„ธ์‹ฌํ•˜๊ฒŒ ๋””์ž์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [8, 11]. +* **๊ณผ๋„ํ•œ ํŒŒํŽธํ™”(Over-fragmentation) ์ฃผ์˜**: ํฌ๊ธฐ๊ฐ€ ์ž‘๊ณ  ๊ฐ€๋ฒผ์šด ๊ธฐ๋Šฅ๊นŒ์ง€ ๋ชจ๋‘ ์ง€์—ฐ ๋กœ๋”ฉ์œผ๋กœ ๋ถ„๋ฆฌํ•  ๊ฒฝ์šฐ, ์˜คํžˆ๋ ค ๋ธŒ๋ผ์šฐ์ €์˜ ๋„คํŠธ์›Œํฌ ์š”์ฒญ ํšŸ์ˆ˜๊ฐ€ ๊ธ‰์ฆํ•˜๊ณ  ๊ด€๋ฆฌํ•ด์•ผ ํ•  ๋กœ๋”ฉ ์ƒํƒœ(`Suspense`)๊ฐ€ ๋งŽ์•„์ ธ ์„ฑ๋Šฅ ๋ฐ ๊ฐœ๋ฐœ ํšจ์œจ์„ ๋–จ์–ด๋œจ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5, 12]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] +- [[Code Splitting]] + - ์—ฐ๊ฒฐ ์ด์œ : Lazy Loading์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋‹จ์ผ JavaScript ๋ฒˆ๋“ค์„ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž‘์€ ์ฒญํฌ ๋‹จ์œ„๋กœ ๋‚˜๋ˆ„๋Š” ๊ทผ๋ณธ์ ์ธ ๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [2, 13]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ชจ๋˜ ํ”„๋ก ํŠธ์—”๋“œ ํ™˜๊ฒฝ์—์„œ ๋นŒ๋“œ ํˆด(Vite, Webpack)์ด ๋Ÿฐํƒ€์ž„ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด ์ฝ”๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ๋ถ„ํ• ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [6, 7]. + +- [[Dynamic Imports]] + - ์—ฐ๊ฒฐ ์ด์œ : ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ชจ๋“ˆ์„ ํŒŒ์ผ์˜ ์ตœ์ƒ๋‹จ์—์„œ ์ •์ ์œผ๋กœ ๋ถˆ๋Ÿฌ์˜ค์ง€ ์•Š๊ณ , ์‹คํ–‰ ์ค‘์— ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ์œ„ํ•ด `import()` ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค [1, 7]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ผ์šฐํŠธ ์ „ํ™˜์ด๋‚˜ ํŠน์ • ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ์ ์— ํ•„์š”ํ•œ ์ฝ”๋“œ๋งŒ ๋„คํŠธ์›Œํฌ๋กœ ํ˜ธ์ถœํ•˜๋Š” ๋Ÿฐํƒ€์ž„ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [7]. + +#### [๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ] +- [[React Suspense]] + - ์—ฐ๊ฒฐ ์ด์œ : `React.lazy()`๋ฅผ ์ด์šฉํ•ด ์ง€์—ฐ ๋กœ๋”ฉ์„ ์ˆ˜ํ–‰ํ•  ๋•Œ, ์ฒญํฌ๊ฐ€ ๋กœ๋“œ๋˜๊ธฐ ์ „๊นŒ์ง€ ๋ Œ๋”๋ง์„ ์ผ์‹œ ์ค‘์ง€ํ•˜๊ณ  Fallback UI๋ฅผ ํ™”๋ฉด์— ๊ทธ๋ ค์ฃผ๋Š” ํ•ต์‹ฌ ์ปดํฌ๋„ŒํŠธ์ž…๋‹ˆ๋‹ค [7, 8]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋น„๋™๊ธฐ UI ๋กœ๋”ฉ ์‹œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜(UX)์„ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๋ Œ๋”๋ง ์ œ์–ด ๋ฐ ๋กœ๋”ฉ ์ƒํƒœ ์„ค๊ณ„ ํŒจํ„ด์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [8, 11]. + +- [[Vite manualChunks]] + - ์—ฐ๊ฒฐ ์ด์œ : Vite๋ฅผ ํ†ตํ•ด ๋นŒ๋“œํ•  ๋•Œ, ๋ณ€๊ฒฝ์ด ์žฆ์ง€ ์•Š์€ ๋ฌด๊ฑฐ์šด ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(React ์ฝ”์–ด ๋“ฑ)๋ฅผ Lazy Loading์˜ ์ฒญํฌ ๋ถ„ํ•  ์ „๋žต๊ณผ ๊ฒฐํ•ฉํ•ด ๋ณ„๋„ ํŒŒ์ผ๋กœ ๋…๋ฆฝ์‹œํ‚ค๋Š” ํ™˜๊ฒฝ ์„ค์ •์ž…๋‹ˆ๋‹ค [7, 14]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ธŒ๋ผ์šฐ์ € ์บ์‹ฑ ์ „๋žต์„ ๊ทน๋Œ€ํ™”ํ•˜๊ณ , ์ดˆ๊ธฐ ๋ฒˆ๋“ค ์šฉ๋Ÿ‰ ๊ฒฝ๊ณ ("Large Chunks") ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ๋ฒˆ๋“ค๋Ÿฌ ์ตœ์ ํ™” ๋ฐฉ๋ฒ•์„ ํ•™์Šตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [7, 15]. + +### Deeper Research Questions + +- React 18์˜ ๋™์‹œ์„ฑ ๋ Œ๋”๋ง(Concurrent Rendering) ๊ธฐ๋Šฅ์ธ `useTransition` ๋“ฑ์€ ์ง€์—ฐ ๋กœ๋”ฉ ์‹œ ๋ฐœ์ƒํ•˜๋Š” UI ๋ฉˆ์ถค ํ˜„์ƒ์„ ์–ด๋–ป๊ฒŒ ๋ณด์™„ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? [16, 17] +- ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ์ €ํ•˜๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด ์ง€์—ฐ ๋กœ๋”ฉ๋˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉ์ž๊ฐ€ ํด๋ฆญํ•˜๊ธฐ ์ง์ „์— ๋ฏธ๋ฆฌ ๊ฐ€์ ธ์˜ค๋Š” Prefetching ์ „๋žต์€ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•˜๋Š”๊ฐ€? [18, 19] +- Next.js์˜ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ ์ง€์—ฐ ๋กœ๋”ฉ๊ณผ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ(RSC) ์•„ํ‚คํ…์ฒ˜๋Š” ์ดˆ๊ธฐ ๋ฒˆ๋“ค ์ตœ์ ํ™” ์ธก๋ฉด์—์„œ ์–ด๋–ค ์ฐจ์ด์ ๊ณผ ์‹œ๋„ˆ์ง€๋ฅผ ๊ฐ€์ง€๋Š”๊ฐ€? [5, 20, 21] +- ๋ฌด๊ฑฐ์šด UI ๋ธ”๋ก์„ ์ง€์—ฐ ๋กœ๋”ฉํ•  ๋•Œ, `rollup-plugin-visualizer`์™€ ๊ฐ™์€ ๋ฒˆ๋“ค ๋ถ„์„ ๋„๊ตฌ๋ฅผ ํ†ตํ•ด ์ง€์—ฐ ๋กœ๋”ฉ ๋Œ€์ƒ์„ ์–ด๋–ป๊ฒŒ ํšจ๊ณผ์ ์œผ๋กœ ์‹๋ณ„ํ•˜๊ณ  ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ •ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? [10, 12] +- ๋„ค์ดํ‹ฐ๋ธŒ ๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋Šฅ์ธ `loading="lazy"` ์†์„ฑ๊ณผ JavaScript ๊ธฐ๋ฐ˜์˜ Intersection Observer API๋ฅผ ํ™œ์šฉํ•œ ๋ฏธ๋””์–ด ์ง€์—ฐ ๋กœ๋”ฉ์˜ ์„ฑ๋Šฅ ์ตœ์ ํ™” ํ•œ๊ณ„์ ๊ณผ Trade-off๋Š” ๋ฌด์—‡์ธ๊ฐ€? [4] + +### Practical Application Contexts + +- **Implementation:** React ์ฝ”๋“œ ์ƒ๋‹จ์˜ ๋ฌด๊ฑฐ์šด ์™ธ๋ถ€ ์ปดํฌ๋„ŒํŠธ(์˜ˆ: ์—๋””ํ„ฐ, ์ฐจํŠธ ๋“ฑ) import ๋ฌธ์„ ์ง€์šฐ๊ณ , `const Dashboard = React.lazy(() => import('./Dashboard'));`์™€ ๊ฐ™์ด ๋ณ€๊ฒฝํ•œ ํ›„ ๋ Œ๋”๋ง ์˜์—ญ์„ `}>`๋กœ ๊ฐ์Œ‰๋‹ˆ๋‹ค [1, 6-8]. +- **System Design:** ํ”„๋ก ํŠธ์—”๋“œ ๋ผ์šฐํŒ… ๋ฐ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ ์‹œ๋ถ€ํ„ฐ, ํ•„์ˆ˜ ์ดˆ๊ธฐ ์ง„์ž… ํ™”๋ฉด(Above-the-fold)์€ ์ฆ‰์‹œ ๋กœ๋“œํ•˜๊ณ , ๊ด€๋ฆฌ์ž ํŒจ๋„์ด๋‚˜ ์ž˜ ์“ฐ์ด์ง€ ์•Š๋Š” ๋ผ์šฐํŠธ๋Š” ๋ถ„๋ฆฌํ•˜์—ฌ Code Splitting๋˜๋„๋ก ์‹œ์Šคํ…œ์˜ ๋ฒˆ๋“ค๋ง ์ „๋žต์„ ๊ตฌ์ƒํ•ฉ๋‹ˆ๋‹ค [5, 12, 14]. +- **Operation / Maintenance:** ์šด์˜ ์ค‘์ธ ์„œ๋น„์Šค๊ฐ€ ๋ฌด๊ฑฐ์›Œ์ง€๊ฑฐ๋‚˜ Vite ๋นŒ๋“œ ์‹œ "500 kB ์ดˆ๊ณผ ์ฒญํฌ" ๊ฒฝ๊ณ ๊ฐ€ ๋œฐ ๊ฒฝ์šฐ, ๋ฒˆ๋“ค ๋ถ„์„ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ด ๋ฉ”์ธ ๋ฒˆ๋“ค์—์„œ ๋ถ„๋ฆฌ ๊ฐ€๋Šฅํ•œ ๋ฌด๊ฑฐ์šด ๋ฒค๋”๋‚˜ ํŠน์ • ๋ผ์šฐํŠธ๋ฅผ ์‹๋ณ„ํ•ด ์ ์ง„์ ์œผ๋กœ Lazy Loading์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค [10, 12, 15]. +- **Learning Path:** React ๊ธฐ์ดˆ ๋ Œ๋”๋ง ์‚ฌ์ดํด ํ•™์Šต โž” JavaScript ๋ชจ๋“ˆ ๋ฐ ๋ฒˆ๋“ค๋Ÿฌ ๊ตฌ์กฐ ์ดํ•ด โž” `React.lazy`์™€ `Suspense`๋ฅผ ํ†ตํ•œ ๋ผ์šฐํŠธ ์Šคํ”Œ๋ฆฌํŒ… ์ ์šฉ โž” Chrome ์„ฑ๋Šฅ ํƒญ๊ณผ Web Vitals๋กœ ์‹ค์ œ ๋กœ๋“œ ์†๋„ ์ธก์ • ๋ฐ ๊ฒ€์ฆ [13, 22, 23]. +- **My Project Relevance:** ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ทœ๋ชจ๊ฐ€ ์ปค์ง์— ๋”ฐ๋ผ ํ•„์—ฐ์ ์œผ๋กœ ์ฆ๊ฐ€ํ•˜๋Š” JavaScript ํŽ˜์ด๋กœ๋“œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ , FCP(First Contentful Paint)์™€ TTI(Time to Interactive) ๋“ฑ ํ•ต์‹ฌ ์„ฑ๋Šฅ ์ง€ํ‘œ๋ฅผ ๋ฐฉ์–ดํ•˜๊ธฐ ์œ„ํ•œ ํ•„์ˆ˜์ ์ธ ๋ Œ๋”๋ง ์ตœ์ ํ™” ์ „๋žต์ž…๋‹ˆ๋‹ค [3, 8]. + +### Adjacent Topics + +- [[Core Web Vitals]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ์ง€์—ฐ ๋กœ๋”ฉ์ด ๊ฒ€์ƒ‰ ์—”์ง„ ์ตœ์ ํ™”(SEO) ๋ฐ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ์ง€ํ‘œ์ธ FCP, LCP(Largest Contentful Paint), INP(Interaction to Next Paint) ์ˆ˜์น˜๋ฅผ ์‹ค์ œ๋กœ ์–ผ๋งˆ๋‚˜ ๊ฐœ์„ ํ•˜๋Š”์ง€ ์ธก์ • ๋ฐ ๋ถ„์„ํ•˜๋Š” ๊ด€์ ์œผ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3, 23, 24]. +- [[Server Components (RSC)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํฌ๊ธฐ๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•œ ๋˜ ๋‹ค๋ฅธ ํ˜„๋Œ€์  ํŒจ๋Ÿฌ๋‹ค์ž„์œผ๋กœ, ํด๋ผ์ด์–ธํŠธ์—์„œ ์‹คํ–‰๋  ์ฝ”๋“œ๋ฅผ ์•„์˜ˆ ์„œ๋ฒ„์—์„œ ๋ Œ๋”๋งํ•˜๊ณ  HTML๋กœ๋งŒ ๋ณด๋‚ด๋Š” ๋ฐฉ์‹๊ณผ Lazy Loading๊ณผ์˜ ์—ญํ• ์„ ๋น„๊ต/๋Œ€์กฐํ•ฉ๋‹ˆ๋‹ค [20, 21]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Development/Next.js App Router.md b/10_Wiki/Development/Next.js App Router.md new file mode 100644 index 00000000..43ddac1f --- /dev/null +++ b/10_Wiki/Development/Next.js App Router.md @@ -0,0 +1,54 @@ +# [[Next.js App Router]] + +## ๐Ÿ“Œ Brief Summary +Next.js App Router๋Š” Next.js(๋ฒ„์ „ 13 ์ดํ›„)์—์„œ ๋„์ž…๋œ ์ตœ์‹  ๋ผ์šฐํŒ… ๋ฐ ์•„ํ‚คํ…์ฒ˜ ์‹œ์Šคํ…œ์œผ๋กœ, React Server Components(RSC)๋ฅผ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์›ํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ ์ธก ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ „์†ก๋Ÿ‰์„ ์ค„์ด๊ณ  ์ดˆ๊ธฐ ๋กœ๋”ฉ ์†๋„๋ฅผ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค [1, 2]. ์ด ์‹œ์Šคํ…œ์€ `app` ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•˜๋ฉฐ, `page.js`, `layout.js`์™€ ๊ฐ™์€ ํŠน์ˆ˜ ํŒŒ์ผ๋“ค์„ ํ†ตํ•ด ์ง๊ด€์ ์ด๊ณ  ๊ตฌ์กฐํ™”๋œ ๋ผ์šฐํŒ…์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [3, 4]. + +## ๐Ÿ“– Core Content + +* **ํŠน์ˆ˜ ํŒŒ์ผ์„ ํ™œ์šฉํ•œ ๊ตฌ์กฐ์  ๋ผ์šฐํŒ…**: Next.js App Router๋Š” ๋ผ์šฐํŠธ ๊ตฌ์„ฑ ๋ฐ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ํŠน์ˆ˜ ํŒŒ์ผ ๋ช…๋ช… ๊ทœ์น™์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ผ์šฐํŠธ๋Š” `page.js`๋กœ, ๊ณต์œ  ๋ ˆ์ด์•„์›ƒ์€ `layout.js`๋กœ, ์‚ฌ์šฉ์ž ์ •์˜ ์—๋Ÿฌ๋Š” `error.js`๋กœ, ๋กœ๋”ฉ ์ƒํƒœ๋Š” `loading.js`๋กœ ์ •์˜ํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋™์ž‘์„ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค [3]. +* **๋™์  ๋ผ์šฐํŠธ ๋ฐ ๋ผ์šฐํŠธ ๊ทธ๋ฃน**: ๋™์ ์ธ ๊ฒฝ๋กœ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด `[param]`์„ ์‚ฌ์šฉํ•˜๊ณ , ํฌ๊ด„์ (catch-all) ๋ผ์šฐํŠธ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด `[...param]`์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค [3]. ๋˜ํ•œ URL ๊ตฌ์กฐ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ณ  ๋…ผ๋ฆฌ์ ์œผ๋กœ ๋ผ์šฐํŠธ๋ฅผ ๊ทธ๋ฃนํ™”ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ผ์šฐํŠธ ๊ทธ๋ฃน(์˜ˆ: `(folderName)`) ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์—ฌ, ๊ธฐ๋Šฅ๋ณ„ ๋˜๋Š” ํŒ€๋ณ„๋กœ ์ฝ”๋“œ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์กฐ์งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5]. +* **React Server Components (RSC) ํ†ตํ•ฉ**: App Router๋Š” ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ •์ ์ด๊ฑฐ๋‚˜ ๋ฐ์ดํ„ฐ ์ฃผ๋„์ ์ธ(read-only) UI๋Š” ํด๋ผ์ด์–ธํŠธ ์ธก ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—†์ด ์„œ๋ฒ„์—์„œ๋งŒ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ์–ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค ํฌ๊ธฐ์™€ Hydration ์†Œ์š” ์‹œ๊ฐ„์„ ๊ทน๋Œ€ํ™”ํ•˜์—ฌ ์ค„์—ฌ์ค๋‹ˆ๋‹ค [2, 6, 7]. +* **ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„์˜ ์—ญํ•  ๋ถ„๋ฆฌ**: ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” ์ƒํƒœ(state), `useEffect`, ํด๋ผ์ด์–ธํŠธ ์ „์šฉ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค [8]. ๋”ฐ๋ผ์„œ ์ƒํ˜ธ์ž‘์šฉ์ด ์ฆ‰๊ฐ์ ์œผ๋กœ ํ•„์š”ํ•œ UI(๋ชจ๋‹ฌ, ์ž…๋ ฅ์ฐฝ ๋“ฑ)์—๋งŒ ํŒŒ์ผ ์ƒ๋‹จ์— `use client` ์ง€์‹œ์–ด๋ฅผ ์„ ์–ธํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ๋กœ ๋งŒ๋“ค๊ณ , ๋‚˜๋จธ์ง€๋Š” ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค [7, 9]. +* **๋™์‹œ์„ฑ ๋ Œ๋”๋ง(Concurrent Rendering) ์™„๋ฒฝ ์ง€์›**: App Router๋Š” React 18์˜ ๋™์‹œ์„ฑ ๊ธฐ๋Šฅ๊ณผ ์™„๋ฒฝํ•˜๊ฒŒ ํ†ตํ•ฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. `useTransition` ๋ฐ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค์˜ ์‘๋‹ต์„ฑ์„ ๋–จ์–ด๋œจ๋ฆฌ์ง€ ์•Š๊ณ  ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์„ ํšจ๊ณผ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [10]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +- [[React Server Components]] + - ์—ฐ๊ฒฐ ์ด์œ : Next.js App Router ์•„ํ‚คํ…์ฒ˜์˜ ํ•ต์‹ฌ ๊ธฐ๋ฐ˜์œผ๋กœ, ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ค„์ด๊ณ  ๋ฐ์ดํ„ฐ ํŽ˜์นญ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค [1, 2]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํด๋ผ์ด์–ธํŠธ ์ธก ๋ Œ๋”๋ง ์ฝ”๋“œ์™€ ์„œ๋ฒ„ ์ธก ๋ Œ๋”๋ง ์ฝ”๋“œ ๊ฐ„์˜ ๋ช…ํ™•ํ•œ ๊ฒฝ๊ณ„ ๊ตฌ๋ถ„ ๋ฐ Hydration ์ตœ์†Œํ™” ์ „๋žต [6, 7, 9]. + +- [[Route Groups]] + - ์—ฐ๊ฒฐ ์ด์œ : App Router ๋‚ด์—์„œ URL ๊ฒฝ๋กœ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ ๋„ ํด๋” ๊ตฌ์กฐ๋ฅผ ๋…ผ๋ฆฌ์ ์œผ๋กœ ์กฐ์งํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ํ•ต์‹ฌ ํด๋” ๋ผ์šฐํŒ… ํŒจํ„ด์ž…๋‹ˆ๋‹ค [5, 11]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ณต์žกํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ณ„๋„์˜ ๋ ˆ์ด์•„์›ƒ์„ ๊ฐ€์ง„ ์„น์…˜(์˜ˆ: ๋งˆ์ผ€ํŒ… ํŽ˜์ด์ง€์™€ ์ƒ์  ํŽ˜์ด์ง€)์„ ์ถฉ๋Œ ์—†์ด ๋…๋ฆฝ์ ์œผ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ• [5, 11]. + +- [[Concurrent Rendering]] + - ์—ฐ๊ฒฐ ์ด์œ : Next.js App Router๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์™„๋ฒฝํ•˜๊ฒŒ ์ง€์›ํ•˜๋Š” React์˜ ๋ Œ๋”๋ง ๋ฉ”์ปค๋‹ˆ์ฆ˜์œผ๋กœ, ๋ Œ๋”๋ง ์ž‘์—…์„ ์ผ์‹œ ์ค‘์ง€, ์ค‘๋‹จ ๋ฐ ์žฌ๊ฐœํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค [10, 12]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: `useTransition` ๋ฐ `useDeferredValue` ํ›…์„ ํ†ตํ•ด ๋ฌด๊ฑฐ์šด ๋ Œ๋”๋ง ์‹œ์—๋„ ์‚ฌ์šฉ์ž ์ž…๋ ฅ ๋ฐ˜์‘์„ฑ(UX)์„ ๋†’๊ฒŒ ์œ ์ง€ํ•˜๋Š” ์›๋ฆฌ [13, 14]. + +### Deeper Research Questions + +- ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฃจํŠธ ๋ ˆ์ด์•„์›ƒ์„ ๊ฐ€์ง„ Route Groups ํ™˜๊ฒฝ์—์„œ ์ตœ์ƒ์œ„ `layout.js`๊ฐ€ ์—†์„ ๋•Œ, ๋‹ค๋ฅธ ๋ฃจํŠธ ๋ ˆ์ด์•„์›ƒ ๊ฐ„์˜ ๋„ค๋น„๊ฒŒ์ด์…˜ ์‹œ ๋ฐœ์ƒํ•˜๋Š” ์ „์ฒด ํŽ˜์ด์ง€ ๋กœ๋“œ(full page load)์˜ ๋‚ด๋ถ€ ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ๋ฌด์—‡์ธ๊ฐ€? [11] +- App Router์—์„œ `[param]` ํ˜•ํƒœ์˜ ๋™์  ๋ผ์šฐํŠธ์™€ Route Group ๊ฐ„์˜ ๊ฒฝ๋กœ ์ค‘๋ณต(์˜ˆ: `(marketing)/about/page.tsx`์™€ `(shop)/about/page.tsx`) ์ถฉ๋Œ ์‹œ, Next.js์˜ ๋ผ์šฐํŠธ ํ•ด์„ ์šฐ์„ ์ˆœ์œ„๋Š” ์–ด๋–ป๊ฒŒ ๊ฒฐ์ •๋˜๋Š”๊ฐ€? [11] +- ๊ธฐ์กด Pages Router ๋ฐฉ์‹๊ณผ ๋น„๊ตํ•˜์—ฌ App Router์˜ React Server Components๋Š” ๋ฐ์ดํ„ฐ ํŽ˜์นญ ์‹œ ์–ด๋–ป๊ฒŒ 'Double Fetching' ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๋Š”๊ฐ€? [7, 8] +- ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ(`use client`)์™€ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ˜ผํ•ฉ๋œ ํ˜•ํƒœ์˜ ํŠธ๋ฆฌ์—์„œ, ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ๋ฅผ `children`์œผ๋กœ ์ „๋‹ฌํ•˜๊ฑฐ๋‚˜ ์ž„ํฌํŠธํ•  ๋•Œ ์ ์šฉ๋˜๋Š” ์ง๋ ฌํ™” ๊ทœ์น™ ๋ฐ ํ•œ๊ณ„์ ์€ ๋ฌด์—‡์ธ๊ฐ€? [6, 7, 9] +- ํŠน์ˆ˜ ๋ผ์šฐํŒ… ํŒŒ์ผ ์ค‘ `error.js`๊ฐ€ React Error Boundary๋กœ์„œ ๋™์ž‘ํ•  ๋•Œ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ ์˜ค๋ฅ˜์™€ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ ์˜ค๋ฅ˜๋ฅผ ๊ฐ๊ฐ ์ฒ˜๋ฆฌํ•˜๋Š” ํ๋ฆ„์€ ์–ด๋–ป๊ฒŒ ๊ตฌ๋ถ„๋˜๋Š”๊ฐ€? [3] + +### Practical Application Contexts + +- **Implementation:** ๋ผ์šฐํŠธ๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ๋Š” `kebab-case` ๋ช…๋ช… ๊ทœ์น™์„ ์ ์šฉํ•œ ํด๋”(์˜ˆ: `auth-provider.tsx`)๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋ผ์šฐํŒ…ํ•˜๊ณ , ๋Œ€์‹œ๋ณด๋“œ์ฒ˜๋Ÿผ ์ •์ ์ธ ๋ ˆ์ด์•„์›ƒ์€ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋กœ ๋‘๋ฉด์„œ `AddToCartButton` ๊ฐ™์ด ์ƒํ˜ธ์ž‘์šฉ์ด ํ•„์š”ํ•œ ์œ„์ ฏ๋งŒ `use client` ์ปดํฌ๋„ŒํŠธ๋กœ ์ž„ํฌํŠธํ•˜์—ฌ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค [4, 7, 15]. +- **System Design:** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋ฅผ ์กฐ์งํ•  ๋•Œ, ๊ธฐ๋Šฅ๋ณ„(Feature-Based) ํด๋” ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ, ํŽ˜์ด์ง€, ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ํ•œ ๊ธฐ๋Šฅ ํด๋”(์˜ˆ: `features/auth/`)์— ๋ชจ์œผ๊ณ , ์ด๋ฅผ ๋‹ค์‹œ `Route Groups`๋ฅผ ํ†ตํ•ด ๋ชจ๋“ˆํ™”๋œ ์•„ํ‚คํ…์ฒ˜๋กœ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค [5, 16, 17]. +- **Operation / Maintenance:** ์ดˆ๊ธฐ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค ์šฉ๋Ÿ‰์ด ์ปค์ ธ INP(Interaction to Next Paint)์™€ TTI(Time to Interactive) ๋“ฑ ์ฝ”์–ด ์›น ๋ฐ”์ดํƒˆ ์ˆ˜์น˜๊ฐ€ ์ €ํ•˜๋  ๋•Œ, ์–ด๋–ค ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ๋กœ ๋กœ๋“œ๋˜์—ˆ๋Š”์ง€ ํŒŒ์•…ํ•˜์—ฌ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•˜๋Š” ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค [6, 18]. +- **Learning Path:** ์šฐ์„  React์˜ ๋ Œ๋”๋ง ๋ชจ๋ธ ํŠธ๋ฆฌ๊ฑฐ ์š”์ธ๊ณผ ์ƒํƒœ ๋ณ€ํ™” ์›๋ฆฌ๋ฅผ ์ˆ™์ง€ํ•˜๊ณ  [19], ์ดํ›„ React 18์˜ ๋™์‹œ์„ฑ ํ›…(`useTransition`) ๋™์ž‘์„ ์‹ค์Šตํ•œ ๋’ค [12, 13], Next.js App Router์˜ Server Components๋ฅผ ํ†ตํ•œ ์„œ๋ฒ„/ํด๋ผ์ด์–ธํŠธ ๊ฒฝ๊ณ„ ๊ฐœ๋…์„ ๋ฐฐ์šฐ๋Š” ์ˆœ์„œ๋กœ ์ ‘๊ทผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [2, 7]. +- **My Project Relevance:** ์†Œ์Šค์— ๊ด€๋ จ ์ •๋ณด๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. + +### Adjacent Topics + +- [[Code Splitting & Lazy Loading]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: App Router์˜ Server Components๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, `React.lazy`์™€ `Suspense`๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ๋ผ์šฐํŠธ ๋ฐ ๋ฌด๊ฑฐ์šด ์ปดํฌ๋„ŒํŠธ(์ฐจํŠธ, ์—๋””ํ„ฐ ๋“ฑ)๋ฅผ ํ•„์š”ํ•œ ์ˆœ๊ฐ„์—๋งŒ ๋กœ๋“œํ•˜๋„๋ก ์ตœ์ ํ™”ํ•˜๋Š” ๊ธฐ๋ฒ•์œผ๋กœ์˜ ์ดํ•ด ํ™•์žฅ [20, 21]. +- [[React Context API Optimization]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: App Router ํ™˜๊ฒฝ ํ•˜์˜ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ๋ถˆ๊ฐ€ํ”ผํ•˜๊ฒŒ ์ „์—ญ ์ƒํƒœ๋ฅผ ์“ธ ๋•Œ, Context์˜ ๊ด‘๋ฒ”์œ„ํ•œ ๋ฆฌ๋ Œ๋”๋ง ์ด์Šˆ๋ฅผ ํšŒํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์ปจํ…์ŠคํŠธ๋ฅผ ๋ถ„๋ฆฌํ•˜๊ฑฐ๋‚˜ Zustand, Jotai ๋“ฑ์˜ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋„์ž…ํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ํ•™์Šต ํ™•์žฅ [22-24]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Development/Prop Drilling.md b/10_Wiki/Development/Prop Drilling.md new file mode 100644 index 00000000..aea73383 --- /dev/null +++ b/10_Wiki/Development/Prop Drilling.md @@ -0,0 +1,56 @@ +# [[Prop Drilling]] + +## ๐Ÿ“Œ Brief Summary +Prop Drilling์€ ์‹ค์ œ๋กœ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์€ ์—ฌ๋Ÿฌ ์ค‘๊ฐ„ ์ปดํฌ๋„ŒํŠธ๋“ค์„ ๊ฑฐ์ณ ๊ณ„์ธต์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ์•ˆํ‹ฐ ํŒจํ„ด์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค [1]. ์ฃผ๋กœ ๊นŠ๊ฒŒ ์ค‘์ฒฉ๋œ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์— ์ƒํƒœ๋‚˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•  ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [1]. React ์ƒํƒœ๊ณ„์—์„œ๋Š” ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋‚ด์žฅ๋œ Context API๋‚˜ ์™ธ๋ถ€ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค [1, 2]. + +## ๐Ÿ“– Core Content +* **์ž‘๋™ ๋ฐฉ์‹ ๋ฐ ์›์ธ:** Prop Drilling์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ ๊นŠ์ด ์ค‘์ฒฉ๋œ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋กœ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด, ์ค‘๊ฐ„์— ์œ„์น˜ํ•œ ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ์˜ props๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ํ†ต๊ณผ์‹œํ‚ค๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค [1]. +* **๊ตฌ์กฐ์  ๋ฌธ์ œ์ :** ์ด ํŒจํ„ด์€ ์ค‘๊ฐ„ ์ปดํฌ๋„ŒํŠธ๋“ค์ด ์ž์‹ ์—๊ฒŒ ํ•„์š” ์—†๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋‹จ์ง€ ์ „๋‹ฌ(transport)ํ•˜๊ธฐ ์œ„ํ•œ ๋ชฉ์ ์œผ๋กœ ์ทจ๊ธ‰ํ•˜๊ฒŒ ๋งŒ๋“ค๋ฉฐ, ์ด๋Š” ์ฝ”๋“œ์˜ ๋ณต์žก์„ฑ์„ ๋†’์ด๊ณ  ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค [1]. +* **React์˜ ๋‚ด์žฅ ํ•ด๊ฒฐ์ฑ…:** React๋Š” ์ด๋Ÿฌํ•œ ํ˜„์ƒ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด 'Context API'๋ฅผ ๋„์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ์˜ ๋ชจ๋“  ๋ ˆ๋ฒจ์„ ๊ฑฐ์น˜์ง€ ์•Š๊ณ ๋„ ์ „์—ญ ๊ด€์‹ฌ์‚ฌ(global concerns) ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘์ ์œผ๋กœ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์™€ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1, 3, 4]. +* **ํŒŒ์ƒ ์ƒํƒœ ์ฒ˜๋ฆฌ์˜ ํ•œ๊ณ„:** Redux๋‚˜ Zustand๊ฐ€ ํŒŒ์ƒ ์ƒํƒœ๋ฅผ ์œ„ํ•œ ์„ ํƒ์ž(derived selectors)๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒƒ๊ณผ ๋‹ฌ๋ฆฌ, Context๋Š” ํŒŒ์ƒ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•  ๋•Œ ์—ฌ์ „ํžˆ Prop Drilling ๋ฐฉ์‹์— ์˜์กดํ•˜๊ฒŒ ๋˜๊ฑฐ๋‚˜ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ํ”ผํ•˜๊ธฐ ์–ด๋ ค์šด ๊ธฐ๋Šฅ์  ํ•œ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค [5]. + +## โš–๏ธ Trade-offs & Caveats +Prop Drilling์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ€์žฅ ๋จผ์ € ๊ณ ๋ ค๋˜๋Š” Context API๋Š” ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ณ€๊ฒฝ๋˜๋Š” ์ƒํƒœ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ์‹ฌ๊ฐํ•œ ์„ฑ๋Šฅ ์ œ์•ฝ(Trade-off)์„ ๋™๋ฐ˜ํ•ฉ๋‹ˆ๋‹ค [6, 7]. Context ๊ฐ’์˜ ์ผ๋ถ€๋งŒ ๋ณ€๊ฒฝ๋˜์–ด๋„ ํ•ด๋‹น Context๋ฅผ ๊ตฌ๋…ํ•˜๋Š” ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์ „์ฒด ๋ฆฌ๋ Œ๋”๋ง(re-render)์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค [6, 8]. + +๋”ฐ๋ผ์„œ ์žฅ๋ฐ”๊ตฌ๋‹ˆ๋‚˜ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ๋“ฑ ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ณ€๊ฒฝ๋˜๋Š” ์ƒํƒœ์— ๋Œ€ํ•ด Prop Drilling์„ ํ”ผํ•˜๊ฒ ๋‹ค๊ณ  ๋ฌด์ž‘์ • Context API๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ ์ €ํ•˜(Re-render storm)๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [9, 10]. ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ์—๋Š” ์„ ํƒ์ž(Selector) ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ํ•„์š”ํ•œ ์ƒํƒœ ๋ณ€๊ฒฝ ์‹œ์—๋งŒ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ฐœ์ƒ์‹œํ‚ค๋Š” Zustand๋‚˜ Redux๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ตœ์ ํ™” ์ธก๋ฉด์—์„œ ํ•„์ˆ˜์ ์ธ ๋ฐ˜๋Œ€ ๊ธ‰๋ถ€์˜ ํ•ด๊ฒฐ์ฑ…์ด ๋ฉ๋‹ˆ๋‹ค [7, 11]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [๊ธฐ๋ฐ˜ ๊ธฐ์ˆ /ํ•ด๊ฒฐ์ฑ…] +- [[Context API]] + - ์—ฐ๊ฒฐ ์ด์œ : Prop Drilling ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด React์—์„œ ์ž์ฒด์ ์œผ๋กœ ๋„์ž…ํ•œ ๋‚ด์žฅ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [1]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: props๋ฅผ ์ผ์ผ์ด ๋„˜๊ธฐ์ง€ ์•Š๊ณ  ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธํ•˜๋Š” ์›๋ฆฌ์™€ ๊ทธ์— ๋”ฐ๋ฅธ ๋ฆฌ๋ Œ๋”๋ง ํ•œ๊ณ„๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [6, 12]. + +#### [์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ/๋Œ€์•ˆ] +- [[Zustand]] + - ์—ฐ๊ฒฐ ์ด์œ : Prop Drilling์˜ ๋Œ€์•ˆ์ธ Context API๊ฐ€ ๊ฐ–๋Š” ๋ฆฌ๋ Œ๋”๋ง ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ๊ทน๋ณตํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๋Ÿ‰ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [2, 7]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์„ ํƒ์ž(Selector) ํŒจํ„ด์„ ํ™œ์šฉํ•ด ํ•„์š”ํ•œ ์ƒํƒœ์˜ ๋ณ€๊ฒฝ์—๋งŒ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฆฌ๋ Œ๋”๋งํ•˜๋„๋ก ์Šค๋งˆํŠธํ•˜๊ฒŒ ๊ตฌ๋…(subscribe)ํ•˜๋Š” ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [7, 13]. +- [[Redux]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ Prop Drilling์„ ๋ฐฉ์ง€ํ•˜๊ณ  ์ƒํƒœ๋ฅผ ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์‚ฐ์—… ํ‘œ์ค€ ์ƒํƒœ ์ปจํ…Œ์ด๋„ˆ ๋„๊ตฌ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [5, 14]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํŒŒ์ƒ ์„ ํƒ์ž(derived selectors)๊ฐ€ ์กด์žฌํ•จ์œผ๋กœ์จ Prop Drilling ์—†์ด ๋ณต์žกํ•œ ์ƒํƒœ์™€ ๋น„๋™๊ธฐ ๋กœ์ง์„ ์–ด๋–ป๊ฒŒ ํšจ์œจ์ ์œผ๋กœ ๋‹ค๋ฃจ๋Š”์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5, 15]. + +### Deeper Research Questions + +- Prop Drilling์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด Context API๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง(re-renders) ๋ฌธ์ œ๋Š” ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? [6, 8] +- Redux์™€ Zustand๊ฐ€ ์ œ๊ณตํ•˜๋Š” '์„ ํƒ์ž(Selector)' ๊ธฐ๋Šฅ์€ Prop Drilling ๋ฐฉ์‹๊ณผ ๋น„๊ตํ•˜์—ฌ ํŒŒ์ƒ ์ƒํƒœ(derived state)๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ ์–ด๋– ํ•œ ์•„ํ‚คํ…์ฒ˜์  ์ด์ ์„ ์ œ๊ณตํ•˜๋Š”๊ฐ€? [5, 7] +- Context API๊ฐ€ ์•„๋‹Œ Zustand๋‚˜ Redux ๊ฐ™์€ ์ „๋ฌธ์ ์ธ ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ๋ฅผ ๋„์ž…ํ•˜์—ฌ Prop Drilling์„ ํ•ด๊ฒฐํ•ด์•ผ ํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ณต์žก๋„ ๋ฐ ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง ๋นˆ๋„์˜ ์ •ํ™•ํ•œ ๊ธฐ์ค€์ ์€ ๋ฌด์—‡์ธ๊ฐ€? [10, 11] +- Prop Drilling์„ ๋‹จ์ˆœํžˆ ํšŒํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋“  ์ƒํƒœ๋ฅผ ์ „์—ญ ์ปจํ…์ŠคํŠธ(Global Context for Everything)์— ๋„ฃ๋Š” ์•ˆํ‹ฐ ํŒจํ„ด์€ ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜์— ์–ด๋–ค ๋ถ€์ž‘์šฉ์„ ์ผ์œผํ‚ค๋Š”๊ฐ€? [16, 17] +- ์ „์—ญ ์ƒํƒœ๊ฐ€ ์•„๋‹Œ ์ง€์—ญ ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ ๋‚ด์—์„œ ๋ฐœ์ƒํ•˜๋Š” Prop Drilling์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด, ์ปดํฌ๋„ŒํŠธ ํ•ฉ์„ฑ(Component Composition)์ด๋‚˜ ํด๋ฆฐ ์ฝ”๋“œ ์›์น™์„ ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? [18, 19] + +### Practical Application Contexts + +- **Implementation:** ๊นŠ๊ฒŒ ์ค‘์ฒฉ๋œ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ๋•Œ, ์ค‘๊ฐ„ ์ปดํฌ๋„ŒํŠธ๋“ค์ด ๋ถˆํ•„์š”ํ•œ props๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๋„๋ก `React.createContext()`๋ฅผ ํ™œ์šฉํ•ด ๋ฐ์ดํ„ฐ ์ œ๊ณต์ž(Provider)์™€ ์†Œ๋น„์ž(Consumer)๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค [1, 12]. +- **System Design:** ํ…Œ๋งˆ๋‚˜ ์–ธ์–ด ์„ค์ •๊ณผ ๊ฐ™์€ ์ •์ ์ธ ์ „์—ญ ๊ด€์‹ฌ์‚ฌ(global concerns)์— ๋Œ€ํ•œ Prop Drilling์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Context API๋ฅผ ์„ค๊ณ„์— ๋ฐ˜์˜ํ•˜์ง€๋งŒ, ์ƒํƒœ ๋ณ€๊ฒฝ์ด ์žฆ์€ ์˜์—ญ์€ Zustand๋‚˜ Redux ๊ธฐ๋ฐ˜์˜ ์Šค๋งˆํŠธ ์•Œ๋ฆผ ์‹œ์Šคํ…œ(smart notification system) ๊ตฌ์กฐ๋กœ ์„ค๊ณ„ํ•˜์—ฌ ๊ด€์‹ฌ์‚ฌ์™€ ์„ฑ๋Šฅ์„ ๋ชจ๋‘ ์ฑ™๊น๋‹ˆ๋‹ค [4, 13, 20]. +- **Operation / Maintenance:** ์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง ํˆด(์˜ˆ: React DevTools Profiler)์„ ํ†ตํ•ด Prop Drilling์„ ์šฐํšŒํ•˜๊ณ ์ž ๋„์ž…ํ•œ Context๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง ํญํ’(re-render storm)์„ ์ผ์œผํ‚ค๋Š”์ง€ ์ถ”์ ํ•˜๊ณ , ๋ณ‘๋ชฉ ๋ฐœ์ƒ ์‹œ Selector๋ฅผ ์ง€์›ํ•˜๋Š” ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ๋กœ ์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜(Incremental Migration)์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค [8, 9, 21]. +- **Learning Path:** React ์ž…๋ฌธ ์‹œ ๋ฐ์ดํ„ฐ ํ๋ฆ„์˜ ๊ธฐ๋ณธ์ธ Prop Drilling์˜ ๋ถˆํŽธํ•จ์„ ๋จผ์ € ๊ฒฝํ—˜ํ•˜๊ณ , ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” Context API๋ฅผ ํ•™์Šตํ•œ ํ›„, ์ตœ์ข…์ ์œผ๋กœ ๋Œ€๊ทœ๋ชจ ์•ฑ์„ ์œ„ํ•œ Zustand๋‚˜ Redux๋กœ ๋ฐœ์ „ํ•ด ๋‚˜๊ฐ€๋Š” ํ˜•ํƒœ์˜ ํ•™์Šต ๊ฒฝ๋กœ๋ฅผ ๋ฐŸ๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค [22]. +- **My Project Relevance:** ์†Œ์Šค์— ๊ด€๋ จ ์ •๋ณด๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. + +### Adjacent Topics + +- [[Re-renders]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: Prop Drilling์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•œ ์ˆ˜๋‹จ(Context API)์ด ์ดˆ๋ž˜ํ•˜๋Š” ๋ถ€์ž‘์šฉ์ธ ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”๋ชจ์ด์ œ์ด์…˜(`React.memo`, `useMemo`, `useCallback`) ๋“ฑ React ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์œผ๋กœ์˜ ์ดํ•ด ํ™•์žฅ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค [3, 6, 23]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Development/Re-renders Optimization.md b/10_Wiki/Development/Re-renders Optimization.md new file mode 100644 index 00000000..be2c3213 --- /dev/null +++ b/10_Wiki/Development/Re-renders Optimization.md @@ -0,0 +1,54 @@ +# [[Re-renders Optimization]] + +## ๐Ÿ“Œ Brief Summary +Re-renders Optimization์€ React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ถˆํ•„์š”ํ•œ ์ปดํฌ๋„ŒํŠธ ์—…๋ฐ์ดํŠธ๋ฅผ ์ตœ์†Œํ™”ํ•˜์—ฌ ์„ฑ๋Šฅ, ๋ฐ˜์‘์„ฑ ๋ฐ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค [1, 2]. ์ฃผ๋กœ ์ƒํƒœ(state), ์†์„ฑ(props), ์ปจํ…์ŠคํŠธ(context)์˜ ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ๊ณผ๋„ํ•œ ๋ Œ๋”๋ง์„ ํƒ€๊ฒŸ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค [3]. ์ด๋ฅผ ์œ„ํ•ด ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜, ์ƒํƒœ ๊ด€๋ฆฌ ์ตœ์ ํ™”, ๊ฐ€์ƒํ™” ๊ธฐ๋ฒ•, ๊ทธ๋ฆฌ๊ณ  React Compiler์™€ ๊ฐ™์€ ์ตœ์‹  ์ž๋™ํ™” ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค [4-6]. + +## ๐Ÿ“– Core Content +* **๋ฆฌ๋ Œ๋”๋ง์˜ ์›์ธ๊ณผ ์„ฑ๋Šฅ์  ์˜ํ–ฅ:** + React ์ปดํฌ๋„ŒํŠธ๋Š” ๋‚ด๋ถ€ ์ƒํƒœ(state) ๋ณ€๊ฒฝ, ์†์„ฑ(props) ๋ณ€๊ฒฝ, ๊ตฌ๋… ์ค‘์ธ ์ปจํ…์ŠคํŠธ(context) ๊ฐ’ ๋ณ€๊ฒฝ, ํ˜น์€ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง๋  ๋•Œ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค [3]. ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์ด ๋ˆ„์ ๋˜๋ฉด UI ๋ฐ˜์‘์„ฑ ์ €ํ•˜, ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ์ฆ๊ฐ€, ์ƒํ˜ธ์ž‘์šฉ์„ฑ(TTI) ์ง€์—ฐ ๋“ฑ์„ ์ดˆ๋ž˜ํ•˜๋ฉฐ, ๊นŠ์€ ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ์—์„œ๋Š” ์Šคํฌ๋ฆฝํŒ… ์‹œ๊ฐ„์„ 30~60%๊นŒ์ง€ ์ฆ๊ฐ€์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2]. +* **์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ (Manual Memoization):** + `React.memo()`๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด props๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ด์ „ ๋ Œ๋”๋ง ๊ฒฐ๊ณผ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜์—ฌ ๋ Œ๋”๋ง ํšŸ์ˆ˜๋ฅผ 30~50%๊ฐ€๋Ÿ‰ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [7, 8]. ์ด์™€ ํ•จ๊ป˜ `useCallback`๊ณผ `useMemo` ํ›…์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ์ฒด๋‚˜ ํ•จ์ˆ˜์˜ ์ฐธ์กฐ ๋™๋“ฑ์„ฑ(Reference Equality)์„ ์œ ์ง€ํ•ด์•ผ ์ž์‹ ์ปดํฌ๋„ŒํŠธ์˜ ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง์„ ๋ง‰์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [9, 10]. ๋‹จ, ๋ฌด๋ถ„๋ณ„ํ•œ ์‚ฌ์šฉ์€ ๋น„๊ต ์—ฐ์‚ฐ์˜ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋ฏ€๋กœ ํ”„๋กœํŒŒ์ผ๋ง์„ ํ†ตํ•ด ํ™•์ธ๋œ ๋ณ‘๋ชฉ ๊ตฌ๊ฐ„์—๋งŒ ์ ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [11, 12]. +* **์ปจํ…์ŠคํŠธ ์ตœ์ ํ™” (Context Optimization):** + React์˜ ๊ธฐ๋ณธ Context API๋Š” ๊ฐ’์˜ ์ผ๋ถ€๋งŒ ๋ณ€๊ฒฝ๋˜์–ด๋„ ํ•ด๋‹น ์ปจํ…์ŠคํŠธ๋ฅผ ๊ตฌ๋…ํ•˜๋Š” ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฆฌ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค [13, 14]. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ปจํ…์ŠคํŠธ๋ฅผ ์ž‘์€ ๋„๋ฉ”์ธ ๋‹จ์œ„๋กœ ์ชผ๊ฐœ๊ฑฐ๋‚˜ [15], ์„ ํƒ์ž(Selector)๋ฅผ ํ†ตํ•ด ์ƒํƒœ์˜ ํŠน์ • ์กฐ๊ฐ์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งŒ ๋ฆฌ๋ Œ๋”๋ง์„ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š” Zustand, Jotai ๋“ฑ์˜ ์™ธ๋ถ€ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค [16-18]. +* **React Compiler์˜ ๋„์ž…:** + ๋นŒ๋“œ ํƒ€์ž„ ์ตœ์ ํ™” ๋„๊ตฌ์ธ React Compiler๋Š” ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜(`useMemo`, `useCallback`, `React.memo`) ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ ์ปดํŒŒ์ผ ๋‹จ๊ณ„์—์„œ ์ž๋™์œผ๋กœ ์บ์‹ฑ ๋กœ์ง์„ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค [4, 19]. ์ปดํฌ๋„ŒํŠธ ์ „์ฒด๊ฐ€ ์•„๋‹Œ ๊ฐœ๋ณ„ JSX ์š”์†Œ ๋‹จ์œ„๋กœ ์„ธ๋ถ„ํ™”ํ•˜์—ฌ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์ˆ˜ํ–‰ํ•จ์œผ๋กœ์จ, ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ๋†’์ด๊ณ  ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง์„ ์›์ฒœ์ ์œผ๋กœ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค [19, 20]. +* **๋ Œ๋”๋ง ํŒจํ„ด ๋ฐ ๋™์‹œ์„ฑ ์ตœ์ ํ™”:** + ์ˆ˜๋ฐฑ ๊ฐœ ์ด์ƒ์˜ ํ•ญ๋ชฉ์„ ๋ Œ๋”๋งํ•˜๋Š” ๋Œ€๊ทœ๋ชจ ๋ฆฌ์ŠคํŠธ์—์„œ๋Š” ๊ณ ์œ ํ•˜๊ณ  ์•ˆ์ •์ ์ธ `key` ์†์„ฑ์„ ๋ถ€์—ฌํ•˜๊ณ , ํ™”๋ฉด์— ๋ณด์ด๋Š” ํ•ญ๋ชฉ๋งŒ ๋ Œ๋”๋งํ•˜๋Š” ๊ฐ€์ƒํ™”(Windowing) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(์˜ˆ: `react-window`)๋ฅผ ์ ์šฉํ•˜์—ฌ DOM ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ค„์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค [6, 21]. ๋˜ํ•œ JSX ๋‚ด๋ถ€์— ์ต๋ช… ํ•จ์ˆ˜๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•˜๋ฉด ๋งค ๋ Œ๋”๋ง๋งˆ๋‹ค ์ƒˆ๋กœ์šด ์ฐธ์กฐ๊ฐ€ ์ƒ์„ฑ๋˜๋ฏ€๋กœ ์ง€์–‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [22, 23]. ๋ถ€๊ฐ€์ ์œผ๋กœ `useTransition` ๋ฐ `useDeferredValue`์™€ ๊ฐ™์€ ๋™์‹œ์„ฑ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•ด ๋ฌด๊ฑฐ์šด ์—…๋ฐ์ดํŠธ๋ฅผ ์ง€์—ฐ์‹œํ‚ค๊ณ  ์‚ฌ์šฉ์ž ์ž…๋ ฅ์— ๋Œ€ํ•œ UI ๋ฐ˜์‘์„ฑ์„ ์šฐ์„ ์ˆœ์œ„์— ๋‘˜ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [24, 25]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts +- [[React Compiler]] + - ์—ฐ๊ฒฐ ์ด์œ : ๊ฐœ๋ฐœ์ž๊ฐ€ ์ˆ˜๋™์œผ๋กœ ๋ฆฌ๋ Œ๋”๋ง์„ ์ตœ์ ํ™”ํ•˜๋˜ ๊ธฐ์กด ๋ฐฉ์‹์„ ๋Œ€์ฒดํ•˜์—ฌ, ๋นŒ๋“œ ํƒ€์ž„์— ์ž๋™์œผ๋กœ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์ ์šฉํ•˜๋Š” 2025๋…„ ๊ธฐ์ค€ ํ•ต์‹ฌ ๊ธฐ์ˆ ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [4]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ปดํฌ๋„ŒํŠธ ์ „์ฒด๊ฐ€ ์•„๋‹Œ ๊ฐœ๋ณ„ JSX ์š”์†Œ์™€ ์—ฐ์‚ฐ์ด ์–ด๋–ป๊ฒŒ ๋…๋ฆฝ์ ์œผ๋กœ ์บ์‹ฑ๋˜๋Š”์ง€์˜ ์›๋ฆฌ์™€ ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ˜ธํ™˜์„ฑ ํ•œ๊ณ„ [19, 26]. + +- [[State Management (Zustand vs Context)]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋ถˆํ•„์š”ํ•œ ์ „์ฒด ๋ฆฌ๋ Œ๋”๋ง์„ ์œ ๋ฐœํ•˜๋Š” Context API์˜ ๊ตฌ์กฐ์  ํ•œ๊ณ„๋ฅผ Zustand์˜ ์„ ํƒ์ž(Selector) ํŒจํ„ด์ด ์–ด๋–ป๊ฒŒ ๊ทน๋ณตํ•˜์—ฌ ๋ Œ๋”๋ง์„ ์ตœ์ ํ™”ํ•˜๋Š”์ง€ ์„ค๋ช…ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [13, 17]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ž์ฃผ ๋ณ€๊ฒฝ๋˜๋Š” ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ์—์„œ React ๋ Œ๋”๋ง ์‚ฌ์ดํด ์™ธ๋ถ€์˜ ์Šคํ† ์–ด๊ฐ€ ์–ด๋–ป๊ฒŒ ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง์„ ์ •๋ฐ€ํ•˜๊ฒŒ ์ œ์–ดํ•˜๋Š”์ง€ [17, 27]. + +- [[Memoization (useMemo, useCallback)]] + - ์—ฐ๊ฒฐ ์ด์œ : React์˜ ์–•์€ ๋น„๊ต(Shallow comparison) ํŠน์„ฑ์„ ๊ทน๋ณตํ•˜๊ณ  ์ฐธ์กฐ ๋™๋“ฑ์„ฑ์„ ์œ ์ง€ํ•˜์—ฌ `React.memo`์™€ ๊ฒฐํ•ฉํ•œ ๋ฆฌ๋ Œ๋”๋ง ์ตœ์ ํ™”์˜ ๊ธฐ๋ฐ˜์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [10]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ฌด๋ถ„๋ณ„ํ•œ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์ด ์˜คํžˆ๋ ค ๋ Œ๋”๋ง ๋น„์šฉ๋ณด๋‹ค ํฐ ์„ฑ๋Šฅ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์œ ๋ฐœํ•˜๋Š” ์ด์œ ์™€ ์˜ฌ๋ฐ”๋ฅธ ์ ์šฉ ์กฐ๊ฑด [11, 12]. + +### Deeper Research Questions +- React Compiler๊ฐ€ ์ ์šฉ๋œ ํ™˜๊ฒฝ์—์„œ ๊ธฐ์กด `React.memo`, `useMemo`, `useCallback`์œผ๋กœ ์ž‘์„ฑ๋œ ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ์ฝ”๋“œ๋Š” ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๋ฆฌํŒฉํ† ๋ง๋˜๊ฑฐ๋‚˜ ๊ณต์กดํ•ด์•ผ ํ•˜๋Š”๊ฐ€? +- Context API๋ฅผ ๋‹ค์ˆ˜์˜ ์ž‘์€ ๋„๋ฉ”์ธ์œผ๋กœ ๋ถ„ํ• ํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜์™€ Zustand๋ฅผ ๋„์ž…ํ•˜์—ฌ ์„ ํƒ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜ ๊ฐ„์˜ ๋ Œ๋”๋ง ์„ฑ๋Šฅ ๋ฐ ์œ ์ง€๋ณด์ˆ˜์„ฑ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๋Š” ๋ฌด์—‡์ธ๊ฐ€? +- ๋Œ€๊ทœ๋ชจ ๋ฆฌ์ŠคํŠธ์—์„œ ์•ˆ์ •์ ์ธ `key` ์†์„ฑ ๋ถ€์—ฌ์™€ ๊ฐ€์ƒํ™”(Windowing) ๊ธฐ๋ฒ•์„ ํ•จ๊ป˜ ์ ์šฉํ•  ๋•Œ, DOM ๋…ธ๋“œ ๊ด€๋ฆฌ์™€ ๋ฉ”๋ชจ๋ฆฌ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ์ธก๋ฉด์—์„œ ๋‚ด๋ถ€์ ์œผ๋กœ ์–ด๋–ค ์ตœ์ ํ™”๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”๊ฐ€? +- JSX ๋‚ด ์ต๋ช… ํ•จ์ˆ˜ ์‚ฌ์šฉ์ด ์œ ๋ฐœํ•˜๋Š” ์ฐธ์กฐ ๋ณ€๊ฒฝ(Reference change) ๋ฌธ์ œ๋ฅผ `useCallback` ์™ธ์— ์ปดํฌ๋„ŒํŠธ ์™ธ๋ถ€ ์„ ์–ธ ๋ฐฉ์‹ ๋“ฑ์œผ๋กœ ํ•ด๊ฒฐํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์ƒํƒœ ์ ‘๊ทผ์„ฑ ์ œ์•ฝ์€ ์–ด๋–ป๊ฒŒ ๊ทน๋ณตํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- `useTransition`๊ณผ `useDeferredValue`๋ฅผ ํ™œ์šฉํ•œ ๋™์‹œ์„ฑ ๋ Œ๋”๋ง(Concurrent rendering)์ด ๋ฆฌ๋ Œ๋”๋ง์„ ์ฐจ๋‹จํ•˜์ง€ ์•Š๊ณ  ์ง€์—ฐ์‹œํ‚ฌ ๋•Œ, ๋ฌด๊ฑฐ์šด ์—ฐ์‚ฐ์ด ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋ฅผ ์ ์œ ํ•˜๋Š” ํ•œ๊ณ„๋Š” ์–ด๋–ป๊ฒŒ ๋ณด์™„ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? + +### Practical Application Contexts +- **Implementation:** ๋ฌด๊ฑฐ์šด ์ปดํฌ๋„ŒํŠธ๋‚˜ ์ž์‹์—๊ฒŒ ์ „๋‹ฌ๋˜๋Š” ํ•จ์ˆ˜/๊ฐ์ฒด prop์— ๋Œ€ํ•ด `React.memo()`, `useCallback`, `useMemo`๋ฅผ ์„ ํƒ์ ์œผ๋กœ ์ ์šฉํ•˜์—ฌ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค [7, 10]. ๋Œ€๊ทœ๋ชจ ๋ฆฌ์ŠคํŠธ ๊ตฌํ˜„ ์‹œ `react-window`๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค [6]. +- **System Design:** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ „์—ญ ์ƒํƒœ๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ, ํ…Œ๋งˆ๋‚˜ ๋‹ค๊ตญ์–ด์ฒ˜๋Ÿผ ๋ณ€๊ฒฝ์ด ์ ์€ ์ •์  ๋ฐ์ดํ„ฐ๋Š” Context API๋ฅผ, ์•Œ๋ฆผ์ด๋‚˜ ์žฅ๋ฐ”๊ตฌ๋‹ˆ์ฒ˜๋Ÿผ ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ณ€๊ฒฝ๋˜๋Š” ๋™์  ๋ฐ์ดํ„ฐ๋Š” ๋ถ€๋ถ„ ๊ตฌ๋…(Selector)์„ ์ง€์›ํ•˜๋Š” ์™ธ๋ถ€ ์ƒํƒœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(Zustand ๋“ฑ)๋กœ ์„ค๊ณ„ํ•˜์—ฌ ๋ Œ๋”๋ง ๋ฒ”์œ„๋ฅผ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค [18, 28, 29]. +- **Operation / Maintenance:** React DevTools Profiler, `why-did-you-render` ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, Chrome DevTools Performance Tab์„ ํ™œ์šฉํ•˜์—ฌ ํ”„๋กœ๋•์…˜ ๋ฐฐํฌ ์ „ ๋ฐ ์šด์˜ ์ค‘์— ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง๊ณผ ๊ทธ ์›์ธ์„ ์ง€์†์ ์œผ๋กœ ์ธก์ •ํ•˜๊ณ  ๊ฐœ์„ ํ•ฉ๋‹ˆ๋‹ค [30-32]. +- **Learning Path:** React์˜ ๊ธฐ๋ณธ ๋ Œ๋”๋ง ๋™์ž‘ ์›๋ฆฌ(์ƒํƒœ, props, ์ฐธ์กฐ ๋™๋“ฑ์„ฑ)๋ฅผ ๋จผ์ € ํ•™์Šตํ•˜๊ณ  ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์˜ ๋น„์šฉ์„ ์ดํ•ดํ•œ ๋’ค, ๋™์‹œ์„ฑ ๊ธฐ๋Šฅ(Concurrent Features)๊ณผ React Compiler๋ฅผ ํ†ตํ•œ ์ž๋™ํ™” ์ตœ์ ํ™” ํŒจ๋Ÿฌ๋‹ค์ž„์œผ๋กœ ์ง€์‹์„ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค [5]. +- **My Project Relevance:** ํ˜„์žฌ ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ฑฐ๋‚˜ ์ƒˆ๋กœ ๊ตฌ์ถ•ํ•˜๋Š” React ํ”„๋กœ์ ํŠธ์—์„œ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ๊ฒช๊ณ  ์žˆ๋‹ค๋ฉด, ์ต๋ช… ํ•จ์ˆ˜ ์ธ๋ผ์ธ ์ž‘์„ฑ ํŒจํ„ด์„ ์ˆ˜์ •ํ•˜๊ณ , ๋ถˆํ•„์š”ํ•œ ๊ฑฐ๋Œ€ Context๋ฅผ ๋ถ„๋ฆฌํ•˜๋ฉฐ, ์‹๋ณ„ ๊ฐ€๋Šฅํ•œ ๋ณ‘๋ชฉ ์ง€์ ์— ํ”„๋กœํŒŒ์ผ๋ง ๊ธฐ๋ฐ˜์˜ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์ ์šฉํ•ด ์ฆ‰๊ฐ์ ์ธ ์„ฑ๋Šฅ ๊ฐœ์„ ์„ ์ด๋ฃฐ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5, 15, 22]. + +### Adjacent Topics +- [[Core Web Vitals (INP, FCP, TTI)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ํ”„๋ก ํŠธ์—”๋“œ ์ฝ”๋“œ์˜ ๋ฆฌ๋ Œ๋”๋ง ์ตœ์ ํ™”๊ฐ€ ์‹ค์ œ ์‚ฌ์šฉ์ž์˜ ์ฒด๊ฐ ์„ฑ๋Šฅ์„ ์ธก์ •ํ•˜๋Š” ์ง€ํ‘œ(ํŠนํžˆ Interaction to Next Paint)์— ๋ธŒ๋ผ์šฐ์ € ๋ ˆ๋ฒจ์—์„œ ์–ด๋–ค ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”์ง€ ํ™•์žฅํ•˜์—ฌ ์กฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค [2, 33]. +- [[Code Splitting & Lazy Loading]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ์ปดํฌ๋„ŒํŠธ ์—…๋ฐ์ดํŠธ ์‹œ์ (๋ฆฌ๋ Œ๋”๋ง)์˜ ์ตœ์ ํ™”๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ์ปดํฌ๋„ŒํŠธ ์ตœ์ดˆ ๋กœ๋“œ ์‹œ์ ์˜ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ค„์—ฌ ์ดˆ๊ธฐ ๋ Œ๋”๋ง ์„ฑ๋Šฅ์„ ๊ทน๋Œ€ํ™”ํ•˜๋Š” `React.lazy`์™€ ๋™์  ์ž„ํฌํŠธ ๊ธฐ๋ฒ•์„ ํ•จ๊ป˜ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค [34]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Development/React 18 Concurrent Features.md b/10_Wiki/Development/React 18 Concurrent Features.md new file mode 100644 index 00000000..a5c653e9 --- /dev/null +++ b/10_Wiki/Development/React 18 Concurrent Features.md @@ -0,0 +1,50 @@ +# [[React 18 Concurrent Features]] + +## ๐Ÿ“Œ Brief Summary +React 18 Concurrent Features(๋™์‹œ์„ฑ ๊ธฐ๋Šฅ)๋Š” ์—…๋ฐ์ดํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์‹œ์ ๊ณผ ๋ฐฉ์‹์„ ์ œ์–ดํ•˜์—ฌ ์‘๋‹ต์„ฑ์„ ํฌ์ƒํ•˜์ง€ ์•Š์œผ๋ฉด์„œ๋„ ๋” ๋งค๋„๋Ÿฌ์šด ์•ฑ์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ด๋‹ค [1]. ์ด ๋ Œ๋”๋ง ๋ชจ๋ธ์€ React๊ฐ€ ๋ Œ๋”๋ง ์ž‘์—…์„ ์ผ์‹œ ์ค‘์ง€(pause), ์ค‘๋‹จ(interrupt), ์žฌ๊ฐœ(resume)ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•˜์—ฌ ์ค‘์š”๋„์— ๋”ฐ๋ฅธ ์—…๋ฐ์ดํŠธ ์šฐ์„ ์ˆœ์œ„ ์ง€์ •์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค [2]. ๋Œ€ํ‘œ์ ์ธ ํ›…(Hook)์ธ `useTransition`๊ณผ `useDeferredValue`๋ฅผ ํ†ตํ•ด ๋А๋ฆฐ ๋ Œ๋”๋ง์ด ์ค‘์š”ํ•œ ์‚ฌ์šฉ์ž ์ƒํ˜ธ์ž‘์šฉ์„ ์ฐจ๋‹จํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค [3, 4]. + +## ๐Ÿ“– Core Content +* **๋™์‹œ์„ฑ ๋ Œ๋”๋ง์˜ ์›๋ฆฌ์™€ ์žฅ์ ** + ๋™์‹œ์„ฑ ๋ Œ๋”๋ง์€ ๋ฌด๊ฑฐ์šด ํ•„ํ„ฐ ์—…๋ฐ์ดํŠธ์™€ ๊ฐ™์€ ์ž‘์—…์€ ์ง€์—ฐ์‹œํ‚ค๋ฉด์„œ, ํด๋ฆญ์ด๋‚˜ ํƒ€์ดํ•‘ ๋“ฑ ์ค‘์š”ํ•˜๊ณ  ์ฆ‰๊ฐ์ ์ธ ์ƒํ˜ธ์ž‘์šฉ์„ ์šฐ์„ ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค [2]. ์ตœ์‹  ๋ฒ„์ „์˜ React์—์„œ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ˆ˜๋™์œผ๋กœ ํ™œ์„ฑํ™”ํ•  ํ•„์š” ์—†์ด ๊ธฐ๋ณธ ๋™์ž‘์œผ๋กœ ๋‚ด์žฅ๋˜์–ด ์ž‘๋™ํ•œ๋‹ค [2]. ์ด ๊ธฐ๋Šฅ์€ ์•ฑ์„ ์‹ค์ œ๋กœ ๋” ๋น ๋ฅด๊ฒŒ ๋งŒ๋“ ๋‹ค๊ธฐ๋ณด๋‹ค๋Š”, ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์ด ์ง„ํ–‰๋˜๋Š” ๋™์•ˆ UI์˜ ์‘๋‹ต์„ฑ์„ ์œ ์ง€ํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ๋А๋ผ๋Š” ์ฒด๊ฐ ์†๋„(perceived speed)๋ฅผ ์šฐ์„ ์‹œํ•œ๋‹ค [4]. +* **`useTransition` (UX ์‘๋‹ต์„ฑ ์šฐ์„ ์ˆœ์œ„ ์ง€์ •)** + ์ด ํ›…์€ ํŠน์ • ์—…๋ฐ์ดํŠธ๋ฅผ '๋น„๊ธด๊ธ‰(non-urgent)'์œผ๋กœ ํ‘œ์‹œํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค [3]. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ผ์ด๋ธŒ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋‚˜ ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ๋ฅผ ํ•„ํ„ฐ๋งํ•  ๋•Œ, ๋ Œ๋”๋ง ์ฒ˜๋ฆฌ๊ฐ€ ๋А๋ ค์ง€๋”๋ผ๋„ ์‚ฌ์šฉ์ž์˜ ํƒ€์ดํ•‘์ด๋‚˜ ํด๋ฆญ ๊ฐ™์€ ์ค‘์š”ํ•œ ์ƒํ˜ธ์ž‘์šฉ์ด ์ฐจ๋‹จ๋˜์ง€ ์•Š๋Š”๋‹ค [3]. ์ฒ˜๋ฆฌ ๋Œ€๊ธฐ ์ค‘์ธ ์ƒํƒœ(`isPending`)๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ Œ๋”๋ง์„ ์ฐจ๋‹จํ•˜์ง€ ์•Š๊ณ  ๋กœ๋”ฉ ์Šคํ”ผ๋„ˆ๋‚˜ ์Šค์ผˆ๋ ˆํ†ค ์ƒํƒœ๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๋‹ค [3]. +* **`useDeferredValue` (ํŒŒ์ƒ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์ง€์—ฐ)** + `useTransition`์ด ์—…๋ฐ์ดํŠธ๊ฐ€ ํŠธ๋ฆฌ๊ฑฐ๋˜๋Š” ์‹œ์ ์„ ์ œ์–ดํ•œ๋‹ค๋ฉด, `useDeferredValue`๋Š” ๋ฌด๊ฑฐ์šด ๊ฐ’์„ '์ฝ๋Š”(read)' ์‹œ์ ์„ ์ œ์–ดํ•œ๋‹ค [4]. ์‚ฌ์šฉ์ž์˜ ํƒ€์ดํ•‘๊ณผ ๊ฐ™์€ UI ๋ณ€๊ฒฝ์€ ์ฆ‰๊ฐ์ ์œผ๋กœ ๋ฐ˜์˜ํ•˜๋˜, ํŒŒ์ƒ๋œ ๋ฌด๊ฑฐ์šด ์—ฐ์‚ฐ์ด๋‚˜ ํ•„ํ„ฐ๋ง ๋กœ์ง์€ ์•ฝ๊ฐ„ ์ง€์—ฐ์‹œ์ผœ ์ ์šฉํ•ด์•ผ ํ•  ๋•Œ ์ด์ƒ์ ์ธ ๋ฐฉ๋ฒ•์ด๋‹ค [4]. ์ฃผ๋กœ ๊ฒ€์ƒ‰ ์ƒ์ž, Typeahead ์ž…๋ ฅ๊ธฐ, ์‹ค์‹œ๊ฐ„ ํผ ๋“ฑ์—์„œ ๋Š๊น€ ํ˜„์ƒ(jank)์„ ์ค„์ด๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค [4]. +* **๋ชจ๋ฒ” ์‚ฌ๋ก€ ๋ฐ ํ”„๋ ˆ์ž„์›Œํฌ ์ƒํƒœ๊ณ„ ์ง€์›** + ๋™์‹œ์„ฑ ๊ธฐ๋Šฅ์€ ์•ฑ์˜ ๋ชจ๋“  ๊ณณ์ด ์•„๋‹Œ '์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ๋ทฐ'์— ํ•œ์ •ํ•˜์—ฌ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค [4]. ๋ฐ์ดํ„ฐ๊ฐ€ ๋กœ๋“œ๋˜๋Š” ๋™์•ˆ ๋Œ€์ฒด UI๋ฅผ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด `Suspense`์™€ ๊ฒฐํ•ฉํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋˜๋ฉฐ, ๊ตฌํ˜• ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜ ๋ Œ๋”๋ง์„ ์ฐจ๋‹จํ•˜๋Š” ์•ˆํ‹ฐ ํŒจํ„ด๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ํ”ผํ•ด์•ผ ํ•œ๋‹ค [4]. 2025๋…„ ๊ธฐ์ค€ Next.js(App Router), Remix, Vite ๊ธฐ๋ฐ˜ ํ™˜๊ฒฝ ๋“ฑ ๋Œ€๋‹ค์ˆ˜์˜ ํ’€์Šคํƒ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๋™์‹œ์„ฑ ๋ Œ๋”๋ง์„ ๊ธฐ๋ณธ์ ์œผ๋กœ ์—ฐ๋™ํ•˜๊ณ  ์ง€์›ํ•œ๋‹ค [5]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts +- [[useTransition]] + - ์—ฐ๊ฒฐ ์ด์œ : React 18 ๋™์‹œ์„ฑ ๊ธฐ๋Šฅ์˜ ํ•ต์‹ฌ ํ›…์œผ๋กœ, ๋น„๊ธด๊ธ‰ ์—…๋ฐ์ดํŠธ๋ฅผ ์ง€์—ฐ์‹œํ‚ค๋Š” ๊ตฌ์ฒด์ ์ธ ๊ตฌํ˜„์ฒด์ด๋‹ค [3]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ผ์ด๋ธŒ ๊ฒ€์ƒ‰์ด๋‚˜ ํ•„ํ„ฐ๋ง ์‹œ ๋ Œ๋”๋ง ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ๋ฐฉ์ง€ํ•˜๊ณ , ์–ด๋–ป๊ฒŒ ๋น„๊ธด๊ธ‰ ์ž‘์—…๊ณผ ๊ธด๊ธ‰ ์ƒํ˜ธ์ž‘์šฉ(ํƒ€์ดํ•‘ ๋“ฑ)์„ ๋ถ„๋ฆฌํ•˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค [3]. +- [[useDeferredValue]] + - ์—ฐ๊ฒฐ ์ด์œ : ๊ฐ’์˜ ์ฝ๊ธฐ๋ฅผ ์ง€์—ฐ์‹œ์ผœ UI ์—…๋ฐ์ดํŠธ์™€ ์—ฐ์‚ฐ ๋ถ€ํ•˜๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ๋™์‹œ์„ฑ ๊ธฐ๋Šฅ์˜ ๋˜ ๋‹ค๋ฅธ ํ•ต์‹ฌ ํ›…์ด๋‹ค [4]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ฆ‰๊ฐ์ ์ธ UI ๋ฐ˜์˜์ด ํ•„์š”ํ•œ ๋ถ€๋ถ„๊ณผ ์ง€์—ฐ์‹œ์ผœ๋„ ๋ฌด๋ฐฉํ•œ ๋ฌด๊ฑฐ์šด ๊ณ„์‚ฐ(derived data)์„ ์–ด๋–ป๊ฒŒ ๋‚˜๋ˆ„์–ด ์ฒ˜๋ฆฌํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค [4]. +- [[Suspense]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋™์‹œ์„ฑ ํ›…(`useTransition` ๋“ฑ)๊ณผ ๊ฒฐํ•ฉํ•˜์—ฌ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ๋ Œ๋”๋ง์ด ์ง„ํ–‰๋˜๊ฑฐ๋‚˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋กœ๋“œ๋  ๋•Œ ์Šค์ผˆ๋ ˆํ†ค(fallback UI)์„ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋œ ๊ธฐ๋Šฅ์ด๋‹ค [4]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ง€์—ฐ ์ค‘์ธ ๋ Œ๋”๋ง ์ƒํƒœ์—์„œ ์‚ฌ์šฉ์ž์˜ ๊ฒฝํ—˜(UX)์„ ์–ด๋–ป๊ฒŒ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ์ด์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค [4]. + +### Deeper Research Questions +- `useTransition`๊ณผ `useDeferredValue`๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ React ๋‚ด๋ถ€์ ์œผ๋กœ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์˜ ์œ ํœด ์‹œ๊ฐ„(idle time)์„ ์–ด๋–ป๊ฒŒ ํŒ๋‹จํ•˜์—ฌ ์ž‘์—…์„ ์ค‘๋‹จ ๋ฐ ์žฌ๊ฐœํ•˜๋Š”๊ฐ€? +- ๊ตฌํ˜• ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜ ํด๋ž˜์Šค ๊ธฐ๋ฐ˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋™์‹œ์„ฑ ๊ธฐ๋Šฅ๊ณผ ํ˜ผ์šฉํ–ˆ์„ ๋•Œ ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ค ๋ Œ๋”๋ง ์ฐจ๋‹จ ์ถฉ๋Œ์ด๋‚˜ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”๊ฐ€? +- ๋™์‹œ์„ฑ ๋ Œ๋”๋ง์„ ์ ์šฉํ–ˆ์„ ๋•Œ Interaction to Next Paint (INP)๋‚˜ Total Blocking Time (TBT)๊ณผ ๊ฐ™์€ Core Web Vitals ์ง€ํ‘œ๊ฐ€ ์ˆ˜์น˜์ƒ์œผ๋กœ ์–ด๋–ป๊ฒŒ ๋ณ€ํ™”ํ•˜๋Š”๊ฐ€? +- Next.js์˜ App Router์™€ ๊ฒฐํ•ฉ๋œ ๋™์‹œ์„ฑ ๋ Œ๋”๋ง์—์„œ, ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ(Server Components)์™€ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ ๊ฐ„์˜ ๋ Œ๋”๋ง ์šฐ์„ ์ˆœ์œ„๋Š” ์–ด๋–ป๊ฒŒ ๊ด€๋ฆฌ๋˜๋Š”๊ฐ€? +- `isPending` ์†์„ฑ์„ ํ™œ์šฉํ•ด ๋Œ€์ฒด UI(์Šค์ผˆ๋ ˆํ†ค, ์Šคํ”ผ๋„ˆ)๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ์‹œ๊ฐ์  ๊นœ๋นก์ž„์„ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•œ ์ด์ƒ์ ์ธ ์ง€์—ฐ ์‹œ๊ฐ„ ์„ค๊ณ„ ํŒจํ„ด์€ ๋ฌด์—‡์ธ๊ฐ€? + +### Practical Application Contexts +- **Implementation:** ๋ผ์ด๋ธŒ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ๋ Œ๋”๋ง์ด๋‚˜ ์ˆ˜์ฒœ ๊ฐœ์˜ ํ•ญ๋ชฉ์ด ์žˆ๋Š” ๋ฐ์ดํ„ฐ ๋ชฉ๋ก์„ ํ•„ํ„ฐ๋งํ•  ๋•Œ `useTransition`์„ ๋„์ž…ํ•˜์—ฌ ์ž…๋ ฅ์ฐฝ์˜ ์ž…๋ ฅ์ด ์ง€์—ฐ๋˜์ง€ ์•Š๋„๋ก ๊ตฌํ˜„ํ•œ๋‹ค [3]. +- **System Design:** ๊ฒ€์ƒ‰ ์ƒ์ž, Typeahead ์ž…๋ ฅ๊ธฐ, ๋˜๋Š” ์‹ค์‹œ๊ฐ„ ํผ์„ ์„ค๊ณ„ํ•  ๋•Œ ์ฆ‰๊ฐ์ ์ธ ์ž…๋ ฅ ๋ Œ๋”๋ง๊ณผ ์—ฐ์‚ฐ์ด ๋ฌด๊ฑฐ์šด ๋ฐ์ดํ„ฐ ๋ Œ๋”๋ง ๊ฐ„์˜ ์˜ํ–ฅ์„ ์ฐจ๋‹จํ•˜๊ธฐ ์œ„ํ•ด `useDeferredValue` ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋„์ž…ํ•œ๋‹ค [4]. +- **Operation / Maintenance:** Chrome DevTools์˜ Performance ํƒญ๊ณผ Web Vitals ์ง€ํ‘œ๋ฅผ ํ†ตํ•ด ๊ธด ์ž‘์—…(Long tasks)์ด ๋™์‹œ์„ฑ ๋ Œ๋”๋ง ๋•๋ถ„์— ์„ฑ๊ณต์ ์œผ๋กœ ์ชผ๊ฐœ์ ธ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ ์ฐจ๋‹จ์„ ์ค„์˜€๋Š”์ง€ ์ง€์†์ ์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋งํ•œ๋‹ค [6, 7]. +- **Learning Path:** React์˜ ๊ธฐ๋ณธ ๋ Œ๋”๋ง ๋ชจ๋ธ(props ๋ฐ state ๋ณ€๊ฒฝ์— ๋”ฐ๋ฅธ ๋ฆฌ๋ Œ๋”๋ง ํŠธ๋ฆฌ๊ฑฐ)์„ ๋ช…ํ™•ํžˆ ์ดํ•ดํ•œ ๋‹ค์Œ, ๋™์‹œ์„ฑ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ์ด๋Ÿฌํ•œ ๋ Œ๋”๋ง ์‚ฌ์ดํด์ด ์–ด๋–ป๊ฒŒ ์ผ์‹œ ์ค‘์ง€๋˜๊ณ  ์žฌ๊ฐœ๋  ์ˆ˜ ์žˆ๋Š”์ง€ ํ•™์Šต์„ ํ™•์žฅํ•œ๋‹ค [2, 8]. +- **My Project Relevance:** ํ˜„์žฌ ์ง„ํ–‰ ์ค‘์ธ ํ”„๋กœ์ ํŠธ์—์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์€ ์ฐจํŠธ๋‚˜ ํ…Œ์ด๋ธ” ํ•„ํ„ฐ๋ง ์‹œ UI๊ฐ€ ๋Š๊ธฐ๋Š”(Jank) ํ˜„์ƒ์ด ์žˆ๋‹ค๋ฉด, ์ด ๋™์‹œ์„ฑ ๊ธฐ๋Šฅ ํ›…์„ ๋„์ž…ํ•˜์—ฌ ์ฆ‰๊ฐ์ ์ธ ํด๋ฆญ/์ž…๋ ฅ ์‘๋‹ต์„ฑ์„ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ๋‹ค [3, 4]. + +### Adjacent Topics +- [[React Performance Optimization]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋™์‹œ์„ฑ ๋ Œ๋”๋ง ์™ธ์—๋„ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง ์ž์ฒด๋ฅผ ๋ง‰๋Š” `React.memo`, `useCallback`, `useMemo` ํ™œ์šฉ๋ฒ•๊ณผ ๊ฐ™์€ ๋‹ค์–‘ํ•œ React ์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ธฐ๋ฒ• ์ „๋ฐ˜์œผ๋กœ ์ง€์‹์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋‹ค [9-11]. +- [[Server Components]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: Next.js์—์„œ ๋™์‹œ์„ฑ ๊ธฐ๋Šฅ๊ณผ ํ•จ๊ป˜ ์„ฑ๋Šฅ ํ–ฅ์ƒ์˜ ์–‘๋Œ€ ์ถ•์„ ์ด๋ฃจ๋Š” ๊ธฐ๋Šฅ์œผ๋กœ, ํด๋ผ์ด์–ธํŠธ ์ธก JavaScript๋ฅผ ์ „์†กํ•˜์ง€ ์•Š๊ณ  ์„œ๋ฒ„์—์„œ ๋ Œ๋”๋ง์„ ์™„๋ฃŒํ•˜์—ฌ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ค„์ด๋Š” ์ „๋žต์„ ํ•™์Šตํ•  ์ˆ˜ ์žˆ๋‹ค [12, 13]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Development/React Application Scaling.md b/10_Wiki/Development/React Application Scaling.md new file mode 100644 index 00000000..3baf9301 --- /dev/null +++ b/10_Wiki/Development/React Application Scaling.md @@ -0,0 +1,29 @@ +# [[React Application Scaling]] + +## ๐Ÿ“Œ Brief Summary +๋ฆฌ์•กํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์Šค์ผ€์ผ๋ง(React Application Scaling)์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํฌ๊ธฐ์™€ ๋ณต์žก์„ฑ์ด ์ฆ๊ฐ€ํ•จ์— ๋”ฐ๋ผ ๋ฐœ์ƒํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜, ์„ฑ๋Šฅ, ์ƒํƒœ ๊ด€๋ฆฌ, ๊ทธ๋ฆฌ๊ณ  ํ˜‘์—… ๋ฌธ์ œ๋ฅผ ์ฒด๊ณ„์ ์œผ๋กœ ํ•ด๊ฒฐํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค [1-3]. ์ด๋Š” ๋‹จ์ˆœํžˆ ๋ Œ๋”๋ง ์†๋„๋ฅผ ๋†’์ด๋Š” ๊ฒƒ์„ ๋„˜์–ด, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ UI์˜ ๊ฒฐํ•ฉ์„ ๋ง‰๊ณ , ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ํด๋” ๊ตฌ์กฐ๋ฅผ ๋„์ž…ํ•˜๋ฉฐ, ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง๊ณผ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ตœ์ ํ™”ํ•˜๋Š” ๊ฒƒ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค [2-5]. ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋Œ€๊ทœ๋ชจ ํŒ€์ด ์•ˆ์ •์ ์ด๊ณ  ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ์‰ฌ์šด ํ”„๋ก ํŠธ์—”๋“œ ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š” ํ•ต์‹ฌ ์—”์ง€๋‹ˆ์–ด๋ง ํŒจ๋Ÿฌ๋‹ค์ž„์ž…๋‹ˆ๋‹ค [3, 6]. + +## ๐Ÿ“– Core Content +* **๊ตฌ์กฐ์  ์•„ํ‚คํ…์ฒ˜ ๋ฐ ํด๋” ๊ตฌ์„ฑ (Architectural Paradigms):** + ์ดˆ๊ธฐ ๋ฆฌ์•กํŠธ ์•ฑ์€ ์ปดํฌ๋„ŒํŠธ๋‚˜ ํ›…์„ ๊ธฐ์ˆ ์  ํŒŒ์ผ ํƒ€์ž…(Type-Based)์œผ๋กœ ๋ถ„๋ฆฌํ•˜์ง€๋งŒ, ์•ฑ์ด ์ปค์ง€๋ฉด ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜(Feature-Based) ๋˜๋Š” ๋„๋ฉ”์ธ ์ฃผ๋„ ๊ตฌ์กฐ๋กœ ์ „ํ™˜ํ•ด์•ผ ํ™•์žฅ์„ฑ์„ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [7, 8]. ํŠนํžˆ **FSD(Feature-Sliced Design)**๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ `app`, `pages`, `widgets`, `features`, `entities`, `shared` ๋“ฑ์˜ ๊ณ„์ธตํ™”๋œ ์Šฌ๋ผ์ด์Šค๋กœ ๋‚˜๋ˆ„๊ณ , ํ•˜์œ„ ๊ณ„์ธต๋งŒ ์ฐธ์กฐํ•˜๋„๋ก ํ•˜๋Š” ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ์„ ๊ฐ•์ œํ•˜์—ฌ ์ฝ”๋“œ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ณ  ๋ฆฌํŒฉํ† ๋ง์„ ์šฉ์ดํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค [9-11]. +* **์ƒํƒœ ๊ด€๋ฆฌ ์•„ํ‚คํ…์ฒ˜ (State Management Evolution):** + ๋‹จ์ผํ•œ ์ „์—ญ ์ƒํƒœ ๋„๊ตฌ์—์„œ ๋ฒ—์–ด๋‚˜ ๋ฐ์ดํ„ฐ ํŠน์„ฑ์— ๋งž๋Š” ๋„๊ตฌ๋ฅผ ์„ ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [12]. ํ…Œ๋งˆ๋‚˜ ๋กœ์ผ€์ผ์ฒ˜๋Ÿผ ์ •์ ์ด๊ณ  ๋ณ€๊ฒฝ์ด ์ ์€ ๋ฐ์ดํ„ฐ๋Š” Context API๊ฐ€ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค [13]. ๋ฐ˜๋ฉด ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ณ€๊ฒฝ๋˜๋Š” ๋™์  ์ƒํƒœ๋Š” ์„ ํƒ์ž(Selector) ํŒจํ„ด์„ ํ†ตํ•ด ๋ฆฌ๋ Œ๋”๋ง์„ ๋ฐฉ์ง€ํ•˜๋Š” Zustand๊ฐ€ ์œ ๋ฆฌํ•˜๋ฉฐ, ๋ณต์žกํ•œ ๋น„๋™๊ธฐ ๋กœ์ง๊ณผ ๋Œ€๊ทœ๋ชจ ํŒ€ ํ˜‘์—…์—๋Š” ๊ตฌ์กฐ๋ฅผ ๊ฐ•์ œํ•˜๋Š” Redux๊ฐ€ ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค [14-17]. ์„œ๋ฒ„ ์ƒํƒœ ์ฒ˜๋ฆฌ๋Š” TanStack Query์™€ ๊ฐ™์€ API ๊ณ„์ธต์šฉ ๋„๊ตฌ๋กœ ์™„์ „ํžˆ ๋ถ„๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [16, 18]. +* **์„ฑ๋Šฅ ๋ฐ ๋ฒˆ๋“ค๋ง ์ตœ์ ํ™” (Performance & Bundling):** + ๋ฆฌ์•กํŠธ๋Š” ์ƒํƒœ๋‚˜ ํ”„๋กญ์Šค๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ํ•˜์œ„ ํŠธ๋ฆฌ๋ฅผ ๋ฆฌ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค [19]. ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด `React.memo`, `useCallback`, `useMemo`๋ฅผ ์ „๋žต์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ์ฐธ์กฐ ์•ˆ์ •์„ฑ(Reference Equality)์„ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [20, 21]. ์ดˆ๊ธฐ ๋กœ๋”ฉ ์†๋„ ๊ฐœ์„ ์„ ์œ„ํ•ด์„œ๋Š” `React.lazy`์™€ ๋ผ์šฐํŠธ ๋ ˆ๋ฒจ์˜ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…์„ ์ ์šฉํ•˜๊ณ , Vite์˜ `manualChunks`๋ฅผ ํ™œ์šฉํ•ด React ์ฝ”์–ด ๋“ฑ ๋ฌด๊ฑฐ์šด ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ณ„๋„ ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ์บ์‹ฑ ํšจ์œจ์„ ๋†’์ž…๋‹ˆ๋‹ค [22-25]. ์ตœ๊ทผ์—๋Š” React Compiler๋ฅผ ๋„์ž…ํ•ด ๋นŒ๋“œ ํƒ€์ž„์— ์ž๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ธฐ๋ฒ•๋„ ํ™œ์šฉ๋ฉ๋‹ˆ๋‹ค [26-29]. +* **์ฝ”๋“œ ํ’ˆ์งˆ ๋ฐ ๋ณต์›๋ ฅ (Quality & Resilience):** + SOLID, DRY, KISS, YAGNI ์›์น™์„ ์ค€์ˆ˜ํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‹จ์ผ ์ฑ…์ž„(SRP)์„ ๊ฐ–๋„๋ก ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค [30-32]. ํŒŒ์ผ๋ช…์€ ์šด์˜์ฒด์ œ ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด `kebab-case`๋ฅผ, ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ๋Š” `PascalCase`๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋“ฑ ๋„ค์ด๋ฐ ์ปจ๋ฒค์…˜์„ ํ†ต์ผํ•ฉ๋‹ˆ๋‹ค [33-36]. ๋˜ํ•œ ํŠน์ • ์ปดํฌ๋„ŒํŠธ์˜ ๋ Œ๋”๋ง ์˜ค๋ฅ˜๊ฐ€ ์ „์ฒด ์•ฑ์„ ๋‹ค์šด์‹œํ‚ค๋Š” ๊ฒƒ์„ ๋ง‰๊ธฐ ์œ„ํ•ด ์—๋Ÿฌ ๋ฐ”์šด๋”๋ฆฌ(Error Boundaries)๋ฅผ ์ค‘์š” UI ์„น์…˜๋งˆ๋‹ค ๋ฐฐ์น˜ํ•˜์—ฌ Fallback UI๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ณต์›๋ ฅ ์žˆ๋Š” ์„ค๊ณ„๊ฐ€ ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค [37-39]. + +## โš–๏ธ Trade-offs & Caveats +* **๊ณผ๋„ํ•œ ์—”์ง€๋‹ˆ์–ด๋ง (Over-Engineering):** FSD๋‚˜ Redux์™€ ๊ฐ™์€ ๊ณ ๋„ํ™”๋œ ์•„ํ‚คํ…์ฒ˜์™€ ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ๋ฅผ ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ๋‚˜ ๊ฒฝํ—˜์ด ์ ์€ ํŒ€์— ๋„์ž…ํ•˜๋ฉด, ํ•™์Šต ๊ณก์„ ์ด ํฌ๊ฒŒ ์ƒ์Šนํ•˜๊ณ  ๋ถˆํ•„์š”ํ•œ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ๊ฐ€ ์–‘์‚ฐ๋˜์–ด ์˜คํžˆ๋ ค ๊ฐœ๋ฐœ ์†๋„๋ฅผ ๋Šฆ์ถœ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [40-43]. +* **๋ฉ”๋ชจ์ด์ œ์ด์…˜์˜ ์˜ค์šฉ์— ๋”ฐ๋ฅธ ์„ฑ๋Šฅ ์ €ํ•˜:** `React.memo`๋‚˜ `useMemo`๋ฅผ ๋ฌด๋ถ„๋ณ„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด, ์ด์ „ props ๋ฐ ์ƒํƒœ๋ฅผ ๋น„๊ตํ•˜๋Š” ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์—ฐ์‚ฐ ๋น„์šฉ์ด ๋ Œ๋”๋ง ๋น„์šฉ ์ž์ฒด๋ฅผ ์ดˆ๊ณผํ•˜์—ฌ ์˜คํžˆ๋ ค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ์„ ์•…ํ™”์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [44, 45]. +* **React Compiler์˜ ๊ฐ€์‹œ์„ฑ ์ €ํ•˜ ๋ฐ ํ˜ธํ™˜์„ฑ ์ œ์•ฝ:** ์ž๋™ํ™”๋œ ์ตœ์ ํ™” ๋„๊ตฌ์ธ React Compiler๋Š” ๋ธ”๋ž™๋ฐ•์Šค์ฒ˜๋Ÿผ ์ž‘๋™ํ•˜๋ฏ€๋กœ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ ๋ฐœ์ƒ ์‹œ ๋””๋ฒ„๊น…์ด ๋” ๊นŒ๋‹ค๋กœ์›Œ์ง‘๋‹ˆ๋‹ค [46]. ๋˜ํ•œ ๋งค ๋ Œ๋”๋ง ์‹œ ์˜๋„์ ์œผ๋กœ ๋ถˆ์•ˆ์ •ํ•œ ์ฐธ์กฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(์˜ˆ: React Router, TanStack Query ์ผ๋ถ€ ํ›…)์™€๋Š” ์ตœ์ ํ™” ํ˜ธํ™˜์ด ๊นจ์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ, React ๊ทœ์น™์„ ์ง€ํ‚ค์ง€ ์•Š์€ ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ๋Š” ์ ์šฉ์ด ์–ด๋ ต์Šต๋‹ˆ๋‹ค [47, 48]. +* **Context API์˜ ๋ฆฌ๋ Œ๋”๋ง ํญํ’ (Re-render Storm):** Context API๋ฅผ ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ณ€ํ•˜๋Š” ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ์— ์‚ฌ์šฉํ•˜๋ฉด, ๋ฐ์ดํ„ฐ ์ค‘ ์ผ๋ถ€๋ถ„๋งŒ ๋ณ€๊ฒฝ๋˜๋”๋ผ๋„ ํ•ด๋‹น ์ปจํ…์ŠคํŠธ๋ฅผ ๊ตฌ๋…ํ•˜๋Š” ๋ชจ๋“  ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ฆฌ๋ Œ๋”๋ง๋˜๋Š” ์น˜๋ช…์ ์ธ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ์œ ๋ฐœํ•ฉ๋‹ˆ๋‹ค [49, 50]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [์•„ํ‚คํ…์ฒ˜ ๋ฐ ํด๋” ๊ตฌ์กฐ (Architecture & Structure)] +- [[Feature-Sliced Design (FSD)]] + - ์—ฐ๊ฒฐ ์ด์œ : ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ๋ฆฌ์•กํŠธ ์•ฑ์„ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•œ ํ•ต์‹ฌ ๋„๋ฉ”์ธ ์ฃผ๋„ ์•„ํ‚คํ…์ฒ˜ ๋ฐฉ๋ฒ•๋ก ์ž…๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ธฐ๋Šฅ, ์œ„์ ฏ, ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋ถ„๋ฆฌํ•˜๊ณ  ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ๊ทœ์น™์„ ๊ฐ•์ œํ•˜์—ฌ ๊ฒฐ \ No newline at end of file diff --git a/10_Wiki/Development/React Codebase Refactoring.md b/10_Wiki/Development/React Codebase Refactoring.md new file mode 100644 index 00000000..53140358 --- /dev/null +++ b/10_Wiki/Development/React Codebase Refactoring.md @@ -0,0 +1,64 @@ +# [[React Codebase Refactoring]] + +## ๐Ÿ“Œ Brief Summary +React ์ฝ”๋“œ๋ฒ ์ด์Šค ๋ฆฌํŒฉํ† ๋ง์€ ๊ธฐ์กด ์•ฑ์˜ ์™ธ๋ถ€ ๋™์ž‘์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋ฉด์„œ ์œ ์ง€๋ณด์ˆ˜์„ฑ, ์„ฑ๋Šฅ, ๊ฐ€๋…์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์ฝ”๋“œ๋ฅผ ์žฌ์„ค๊ณ„ํ•˜๊ณ  ์ •๋ฆฌํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค. ๋Œ€๊ทœ๋ชจ React ์•ฑ์—์„œ ์ž์ฃผ ๋ฐœ์ƒํ•˜๋Š” ๋…ผ๋ฆฌ ๊ฒฐํ•ฉ, ๋ถˆํ•„์š”ํ•œ ์žฌ๋ Œ๋”๋ง, ์ „์—ญ ์ƒํƒœ์˜ ๋‚จ์šฉ ๋“ฑ์˜ ์•„ํ‚คํ…์ฒ˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ์ค‘์ ์„ ๋‘ก๋‹ˆ๋‹ค. ์„ฑ๊ณต์ ์ธ ๋ฆฌํŒฉํ† ๋ง์„ ์œ„ํ•ด์„œ๋Š” ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋กœ ์•ˆ์ „๋ง์„ ํ™•๋ณดํ•œ ํ›„, ์ปดํฌ๋„ŒํŠธ ์ฑ…์ž„ ๋ถ„๋ฆฌ, TypeScript ๋„์ž…, ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ์˜ ํ˜„๋Œ€ํ™”๋ฅผ ์ ์ง„์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค [1-3]. + +## ๐Ÿ“– Core Content +* **ํ…Œ์ŠคํŠธ ์ฃผ๋„ ์ ‘๊ทผ (Test-Driven Approach):** ๋ฆฌํŒฉํ† ๋ง ๋„์ค‘ ๊ธฐ์กด ๊ธฐ๋Šฅ์ด ์†์ƒ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ€์žฅ ๋จผ์ € ๋‹จ์œ„ ํ…Œ์ŠคํŠธ(Unit Test)๋‚˜ UI ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ์˜ ๊ธฐ์กด ๋™์ž‘์„ ๋ณด์žฅํ•˜๋ฉฐ ์•ˆ์ „ํ•˜๊ฒŒ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2, 4, 5]. +* **์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ (Incremental Migration):** ์ „์ฒด ์ฝ”๋“œ๋ฅผ ํ•œ ๋ฒˆ์— ์žฌ์ž‘์„ฑ(Rewrite)ํ•˜๋Š” ๊ฒƒ์€ ์œ„ํ—˜๋„๊ฐ€ ๋†’์œผ๋ฏ€๋กœ, ์ ์ง„์ ์ธ ์ ‘๊ทผ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Context API์—์„œ Zustand๋กœ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ, ํ•˜๋‚˜์˜ ์Šคํ† ์–ด๋‚˜ ๊ธฐ๋Šฅ ๋‹จ์œ„๋กœ ๋‹จ๊ณ„๋ณ„ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์ง„ํ–‰ํ•ด์•ผ ๋น„์ฆˆ๋‹ˆ์Šค ๊ฐœ๋ฐœ์˜ ์ค‘๋‹จ ์—†์ด ์•„ํ‚คํ…์ฒ˜๋ฅผ ํ˜„๋Œ€ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1]. +* **๊ตฌ์กฐ ๋ฐ ์ปดํฌ๋„ŒํŠธ ์ฑ…์ž„ ๋ถ„๋ฆฌ (Separation of Concerns):** 300์ค„ ์ด์ƒ์˜ ๋ฐฉ๋Œ€ํ•œ ์ปดํฌ๋„ŒํŠธ๋Š” ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)์— ๋”ฐ๋ผ ๋” ์ž‘๊ณ  ์ดˆ์ ์ด ๋งž์ถฐ์ง„ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ถ„๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [6, 7]. ๋ฐ์ดํ„ฐ ํŽ˜์นญ์ด๋‚˜ ํผ ์ฒ˜๋ฆฌ์™€ ๊ฐ™์€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์€ ์ปค์Šคํ…€ ํ›…(Custom Hooks)์œผ๋กœ ์ถ”์ถœํ•˜์—ฌ UI ์ปดํฌ๋„ŒํŠธ์™€ ์™„์ „ํžˆ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค [8, 9]. +* **์ƒํƒœ ๊ด€๋ฆฌ์˜ ํ˜„๋Œ€ํ™”:** ๊ณผ๊ฑฐ์˜ ๊ฑฐ๋Œ€ํ•œ ๋‹จ์ผ ์ „์—ญ ์ƒํƒœ๋ฅผ ์—ญํ• ์— ๋งž๊ฒŒ ๋ถ„๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. API์—์„œ ๊ฐ€์ ธ์˜ค๋Š” '์„œ๋ฒ„ ์ƒํƒœ'๋Š” TanStack Query(React Query)์™€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ ํŽ˜์นญ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์œ„์ž„ํ•˜๊ณ , 'ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ'๋Š” Zustand์™€ ๊ฐ™์€ ๊ฐ€๋ฒผ์šด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜ ์ง€์—ญ ์ƒํƒœ(Local State)๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๊ด€๋ฆฌํ•˜๋„๋ก ๊ฐœ์„ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [10-12]. +* **๋„๊ตฌ ๋ฐ ์ปจ๋ฒค์…˜์˜ ์ ์šฉ:** JavaScript ๊ธฐ๋ฐ˜ ์ฝ”๋“œ๋Š” TypeScript๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜์—ฌ ํƒ€์ž… ์•ˆ์ •์„ฑ์„ ํ™•๋ณดํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค [3, 11]. ๋˜ํ•œ, ESLint์™€ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ๋„์ž…ํ•ด ์ฝ”๋“œ ํฌ๋งทํŒ…๊ณผ ์•„ํ‚คํ…์ฒ˜ ๊ทœ์น™(์˜ˆ: ๋ชจ๋“ˆ ๊ฐ„ ์˜์กด์„ฑ ๊ทœ์น™)์„ ์ž๋™์œผ๋กœ ๊ฐ•์ œํ•ด์•ผ ํ•˜๋ฉฐ, ์ธ๋ผ์ธ ์Šคํƒ€์ผ์ด๋‚˜ ์—ฌ๋Ÿฌ ๋ฐฉ์‹์ด ํ˜ผ์žฌ๋œ CSS๋ฅผ ํ•œ ๊ฐ€์ง€ ๋ฐฉ์‹(์˜ˆ: CSS Modules, Tailwind ๋“ฑ)์œผ๋กœ ํ†ต์ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [13-15]. +* **๊ณผ๊ฑฐ์˜ ํŒจํ„ด ์ œ๊ฑฐ:** ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žˆ๋‹ค๋ฉด ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์™€ ํ›…(Hooks)์œผ๋กœ ๊ต์ฒดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [11]. ์ตœ์‹  React(์˜ˆ: React 19)๋‚˜ React Compiler๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ™˜๊ฒฝ์ด๋ผ๋ฉด ๋ถˆํ•„์š”ํ•œ `useEffect`, `useMemo`, `useCallback` ๋“ฑ์„ ์ œ๊ฑฐํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ๋”์šฑ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [11, 16, 17]. + +## โš–๏ธ Trade-offs & Caveats +* **์ถ”์ƒํ™”์˜ ํ•จ์ •๊ณผ ์˜ค๋ฒ„์—”์ง€๋‹ˆ์–ด๋ง (KISS vs DRY):** DRY(Don't Repeat Yourself) ์›์น™์„ ๋”ฐ๋ฅด๊ธฐ ์œ„ํ•ด ์„ฑ๊ธ‰ํ•˜๊ฒŒ ๊ณตํ†ต ๋กœ์ง์„ ์ถ”์ƒํ™”ํ•˜๋ฉด, ์ฝ”๋“œ๊ฐ€ ์›๋ž˜์˜ ๋ฐ˜๋ณต๋œ ์ฝ”๋“œ๋ณด๋‹ค ๋” ๋ณต์žกํ•ด์ง€๊ณ  ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์›Œ์ง€๋Š” ๋ถ€์ž‘์šฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ „๋ฌธ๊ฐ€๋“ค์€ ํŒจํ„ด์ด 3๋ฒˆ ์ด์ƒ ๋ฐ˜๋ณต๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ ์ถ”์ƒํ™”(Custom Hook ๋“ฑ)๋ฅผ ์ง„ํ–‰ํ•  ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค [18]. +* **TypeScript ์ฑ„ํƒ์˜ ์ธ์ง€์  ๋ถ€ํ•˜:** ๋ฆฌํŒฉํ† ๋ง ์‹œ TypeScript๋ฅผ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์€ ์žฅ๊ธฐ์  ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•˜์ง€๋งŒ, ๊ฒฝํ—˜์ด ๋ถ€์กฑํ•œ ๊ฐœ๋ฐœํŒ€์—๊ฒŒ๋Š” ์ƒˆ๋กœ์šด ๋ณต์žก์„ฑ ๋ ˆ์ด์–ด๋กœ ์ž‘์šฉํ•˜์—ฌ ์ดˆ๊ธฐ์— ์ƒ์‚ฐ์„ฑ์„ ๋Šฆ์ถœ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ•์ œ ๋„์ž…๋ณด๋‹ค๋Š” ๊ฐœ๋ณ„ ํŒŒ์ผ๋ถ€ํ„ฐ ์ ์ง„์ ์œผ๋กœ ์ „ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ์ถ”์ฒœ๋ฉ๋‹ˆ๋‹ค [3]. +* **์•„ํ‚คํ…์ฒ˜ ๋„์ž… ๋น„์šฉ:** Feature-Sliced Design(FSD)๊ณผ ๊ฐ™์ด ์—„๊ฒฉํ•œ ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ๊ฐ•์ œํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜๋กœ ํด๋” ๊ตฌ์กฐ๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•˜๋Š” ๊ฒƒ์€ ํฐ ํ•™์Šต ๊ณก์„ ๊ณผ ์„ค์ • ๋น„์šฉ์„ ์ˆ˜๋ฐ˜ํ•ฉ๋‹ˆ๋‹ค. ํŒ€ ์ „์ฒด์˜ ์ดํ•ด๋„๊ฐ€ ์—†์œผ๋ฉด ์˜คํžˆ๋ ค ์‹œ์Šคํ…œ์ด ์—‰๋ง์ด ๋˜๊ฑฐ๋‚˜ ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๊ณผ๋„ํ•œ ์„ค๊ณ„(Overkill)๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [19-21]. +* **์™„์ „ ์žฌ์ž‘์„ฑ(Rewrite)์˜ ์œ„ํ—˜์„ฑ:** ํ”„๋กœ์ ํŠธ๊ฐ€ ๋งค์šฐ ์ž‘๋‹ค๋ฉด ์•„์˜ˆ ์ฒ˜์Œ๋ถ€ํ„ฐ ์ƒˆ๋กœ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋น ๋ฅผ ์ˆ˜๋„ ์žˆ์œผ๋‚˜ [4], ์ผ๋ฐ˜์ ์ธ ํ™˜๊ฒฝ์—์„œ๋Š” ๊ธฐ์กด ๊ธฐ๋Šฅ์„ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜๋ฉด์„œ ์ฝ”๋“œ๋ฅผ ๊ฐœ์„ ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ „๋ฉด ์žฌ์ž‘์„ฑ๋ณด๋‹ค๋Š” ์•ˆ์ „์„ฑ์„ ๋‹ด๋ณดํ•œ ์ ์ง„์  ๋ฆฌํŒฉํ† ๋ง์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค [1]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [๊ด€๊ณ„ ์œ ํ˜• A (์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ )] +- [[Feature-Sliced Design]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋ฆฌํŒฉํ† ๋ง ๊ณผ์ •์—์„œ ๊ธฐ์ˆ  ๋‹จ์œ„(Component, Hooks ๋“ฑ)๋กœ ํฉ์–ด์ง„ ๊ธฐ์กด ํด๋” ๊ตฌ์กฐ๋ฅผ ๊ธฐ๋Šฅ(Feature) ์ค‘์‹ฌ์œผ๋กœ ๋ชจ๋“ˆํ™”ํ•˜๊ณ  ์žฌํŽธํ•  ๋•Œ ๊ธฐ์ค€์ด ๋˜๋Š” ํ˜„๋Œ€์ ์ธ ํ”„๋ก ํŠธ์—”๋“œ ์•„ํ‚คํ…์ฒ˜๋ก ์ž…๋‹ˆ๋‹ค [22, 23]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํ™•์žฅ์„ฑ์„ ์œ„ํ•œ ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ๊ทœ์น™๊ณผ ๋„๋ฉ”์ธ ์ค‘์‹ฌ์˜ ์ฝ”๋“œ ์บก์Аํ™” ์„ค๊ณ„ ๋ฐฉ๋ฒ•. +- [[SOLID Principles]] + - ์—ฐ๊ฒฐ ์ด์œ : ๊ฑฐ๋Œ€ํ•œ React ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ž‘๊ฒŒ ๋ถ„๋ฆฌํ•˜๊ณ  ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ, ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)๊ณผ ๊ฐ™์€ ํด๋ฆฐ ์ฝ”๋“œ์˜ ๊ธฐ๋ฐ˜ ์ง€์นจ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [6, 24]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ์˜ ์ฑ…์ž„์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ถ„๋ฆฌํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ์‰ฌ์šด ์ถ”์ƒํ™”๋ฅผ ์„ค๊ณ„ํ•˜๋Š” ๊ธฐ์ค€. + +#### [๊ด€๊ณ„ ์œ ํ˜• B (๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ)] +- [[TanStack Query]] + - ์—ฐ๊ฒฐ ์ด์œ : ๊ธฐ์กด์˜ ๋น„ํšจ์œจ์ ์ธ Context API๋‚˜ ๊ฑฐ๋Œ€ํ•œ Redux ์Šคํ† ์–ด๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•  ๋•Œ, ์„œ๋ฒ„ ์ƒํƒœ(์บ์‹ฑ, ๋™๊ธฐํ™” ๋“ฑ)๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ๋ถ„๋ฆฌํ•ด ์ฃผ๋Š” ํ•ต์‹ฌ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค [10, 11]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์„œ๋ฒ„ ๋ฐ์ดํ„ฐ ํŽ˜์นญ ๋กœ์ง์˜ ๋ถ„๋ฆฌ์™€ ์ปดํฌ๋„ŒํŠธ ๋‚ด ๋ณต์žกํ•œ ์ƒํƒœ ๊ด€๋ฆฌ ๊ฐ์†Œ ๋ฐฉ๋ฒ•. +- [[Zustand]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋ถˆํ•„์š”ํ•œ ์žฌ๋ Œ๋”๋ง์„ ์œ ๋ฐœํ•˜๋Š” ๊ธฐ์กด์˜ Context API ๊ธฐ๋ฐ˜ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•  ๋•Œ ์ฃผ๋กœ ๋„์ž…๋˜๋Š” ๊ฒฝ๋Ÿ‰ ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค [1, 25]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ƒํƒœ ์„ ํƒ์ž(Selector)๋ฅผ ํ†ตํ•œ ๋ Œ๋”๋ง ์ตœ์ ํ™” ๊ตฌ์กฐ ๋ฐ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์—†๋Š” ์ƒํƒœ ๊ด€๋ฆฌ ๋กœ์ง ์ž‘์„ฑ๋ฒ•. +- [[Unit Testing]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋ฆฌํŒฉํ† ๋ง ์‹œ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜๋”๋ผ๋„ ๊ธฐ์กด์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ํŒŒ๊ดด๋˜์ง€ ์•Š์Œ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ๋ฆฌํŒฉํ† ๋ง ์ž‘์—…์— ์„ ํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค [2, 5]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ๊ฒ€์ฆ ๊ฐ€๋Šฅํ•œ ํ˜•ํƒœ๋กœ ์ชผ๊ฐœ๊ณ  ์•ˆ์ „์„ฑ์„ ํ™•๋ณดํ•˜๋Š” ์‹ค์งˆ์ ์ธ ์—”์ง€๋‹ˆ์–ด๋ง ์ ˆ์ฐจ. + +### Deeper Research Questions +- ๋ ˆ๊ฑฐ์‹œ React ์•ฑ์—์„œ Context API๋ฅผ Zustand๋กœ ์ ์ง„์ ์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ๋•Œ(Incremental Migration), ์ƒํƒœ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ€์žฅ ์•ˆ์ „ํ•œ ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? +- ๋Œ€๊ทœ๋ชจ ๋ฆฌํŒฉํ† ๋ง ์ง„ํ–‰ ์‹œ, Feature-Sliced Design(FSD) ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋„์ž…ํ•  ๋•Œ ๊ธฐ์กด ์ปดํฌ๋„ŒํŠธ ๊ฐ„์˜ ๊ฒฐํ•ฉ(Cross-cutting concerns)์„ ์–ด๋–ป๊ฒŒ ๊ณ„์ธต์ ์œผ๋กœ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- React Compiler ํ™˜๊ฒฝ์ด ๋„์ž…๋˜์—ˆ์„ ๋•Œ, ๋ฆฌํŒฉํ† ๋ง ์‹œ ๊ธฐ์กด ์ฝ”๋“œ์— ๋‚จ์šฉ๋œ `useMemo`์™€ `useCallback`์„ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ด ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ ๋ฐ ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์— ์–ด๋–ค ๊ตฌ์ฒด์ ์ธ ์ด์ ์„ ์ฃผ๋Š”๊ฐ€? +- ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ํ˜ผ์žฌ๋œ ๊ฑฐ๋Œ€ํ•œ ํผ(Form) ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•  ๋•Œ ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)๊ณผ YAGNI ์›์น™ ๊ฐ„์˜ ๊ท ํ˜•์„ ๋งž์ถ”๋Š” ๊ธฐ์ค€์€ ๋ฌด์—‡์ธ๊ฐ€? +- ๋Œ€๊ทœ๋ชจ TypeScript ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์ง„ํ–‰ํ•  ๋•Œ ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ ์ €ํ•˜๋ฅผ ๋ฐฉ์ง€ํ•˜๋ฉด์„œ ์ ์ง„์  ํƒ€์ž… ์ •์˜๋ฅผ ์ ์šฉํ•˜๋Š” ๋ชจ๋ฒ” ์‚ฌ๋ก€๋Š” ๋ฌด์—‡์ธ๊ฐ€? + +### Practical Application Contexts +- **Implementation:** ๋น„๋Œ€ํ•ด์ง„ React ์ปดํฌ๋„ŒํŠธ์—์„œ API ํ˜ธ์ถœ๊ณผ ์ƒํƒœ ๊ด€๋ฆฌ ๋กœ์ง์„ ๋ถ„๋ฆฌํ•˜์—ฌ Custom Hook์œผ๋กœ ์ž‘์„ฑํ•˜๊ณ , ESLint๋ฅผ ๋„์ž…ํ•˜์—ฌ ์ฝ”๋“œ ์ปจ๋ฒค์…˜๊ณผ ์•„ํ‚คํ…์ฒ˜ ๊ทœ์น™ ์œ„๋ฐ˜์„ ๋ฆฐํŠธ(Lint) ๋‹จ๊ณ„์—์„œ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค. +- **System Design:** ํ”„๋กœ์ ํŠธ์˜ ํŒŒ์ผ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๋‹จ์ˆœํ•œ ๊ธฐ๋Šฅ๋ณ„(File-type based) ๋ถ„๋ฅ˜์—์„œ Feature-Sliced Design๊ณผ ๊ฐ™์€ ๋„๋ฉ”์ธ/๋น„์ฆˆ๋‹ˆ์Šค ์ค‘์‹ฌ์˜ ๊ณ„์ธตํ˜• ๊ตฌ์กฐ๋กœ ์žฌ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค. +- **Operation / Maintenance:** ์„œ๋น„์Šค๋ฅผ ์ค‘๋‹จํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด ํ•œ ๋ฒˆ์— ๋ชจ๋“  ์‹œ์Šคํ…œ์„ ๋ฐ”๊พธ์ง€ ์•Š๊ณ , ํ•˜๋‚˜์˜ ์Šคํ† ์–ด๋‚˜ ํŠน์ • ๊ธฐ๋Šฅ ๋ชจ๋“ˆ ๋‹จ์œ„๋กœ ๋ฆฌํŒฉํ† ๋ง์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ ์ง„์  ์ ‘๊ทผ๋ฒ•์„ ์šด์˜ํ•ฉ๋‹ˆ๋‹ค. +- **Learning Path:** React ๊ธฐ์ดˆ ์Šต๋“ โž” Clean Code ๋ฐ SOLID ์›์น™ ์ดํ•ด โž” ์ƒํƒœ ๊ด€๋ฆฌ์˜ ์„ธ๋ถ„ํ™”(์„œ๋ฒ„ ๋ฐ์ดํ„ฐ vs UI ์ƒํƒœ) โž” ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ โž” ์ ์ง„์  ๋ฆฌํŒฉํ† ๋ง ์ ์šฉ ์ˆœ์œผ๋กœ ์—”์ง€๋‹ˆ์–ด๋ง ์—ญ๋Ÿ‰์„ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค. +- **My Project Relevance:** ํ˜„์žฌ ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ณ  ์žˆ๋Š” ๋ณต์žกํ•œ ๋ ˆ๊ฑฐ์‹œ React ํ”„๋กœ์ ํŠธ์˜ ์„ฑ๋Šฅ ๋ฐ ์œ ์ง€๋ณด์ˆ˜์„ฑ ์ €ํ•˜ ์›์ธ์„ ๋ถ„์„ํ•˜๊ณ , ์ปดํฌ๋„ŒํŠธ ๋ถ„๋ฆฌ์™€ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(Zustand, React Query) ๊ต์ฒด ์ž‘์—…์„ ์ฒด๊ณ„์ ์œผ๋กœ ๊ธฐํšํ•  ๋•Œ ์ง์ ‘ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### Adjacent Topics +- [[Web Performance Optimization]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋ฆฌํŒฉํ† ๋ง์˜ ๊ถ๊ทน์  ๊ฒฐ๊ณผ๋ฌผ ์ค‘ ํ•˜๋‚˜์ธ ์ดˆ๊ธฐ ๋กœ๋”ฉ ์†๋„ ํ–ฅ์ƒ, ๋ Œ๋”๋ง ์ตœ์ ํ™”, ๊ทธ๋ฆฌ๊ณ  ๋ถˆํ•„์š”ํ•œ ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ๋ฅผ ์ค„์ด๋Š” ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…(Code Splitting) ๊ธฐ๋ฒ• ๋“ฑ์œผ๋กœ ๊ฐœ๋…์„ ํ™•์žฅํ•˜์—ฌ ํ•™์Šตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[Git Workflow & CI/CD]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋Œ€๊ทœ๋ชจ ๋ฆฌํŒฉํ† ๋ง ์‹œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ธŒ๋žœ์น˜ ์ถฉ๋Œ ๋ฐฉ์ง€์™€ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ์ž๋™ํ™”, ๊ทธ๋ฆฌ๊ณ  Pull Request ๊ณผ์ •์—์„œ Visual Regression Testing์„ ์—ฐ๋™ํ•˜๋Š” ๋“ฑ ํ˜‘์—… ์ „๋žต์œผ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Development/React DevTools Profiler.md b/10_Wiki/Development/React DevTools Profiler.md new file mode 100644 index 00000000..0ed6a720 --- /dev/null +++ b/10_Wiki/Development/React DevTools Profiler.md @@ -0,0 +1,52 @@ +# [[React DevTools Profiler]] + +## ๐Ÿ“Œ Brief Summary +React DevTools Profiler๋Š” React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ Œ๋”๋ง ์„ฑ๋Šฅ์„ ์ธก์ •ํ•˜๊ณ  ์ตœ์ ํ™” ๋Œ€์ƒ์„ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด React DevTools์— ๋‚ด์žฅ๋œ ํ”„๋กœํŒŒ์ผ๋ง ๋ฐ ๋””๋ฒ„๊น… ๋„๊ตฌ์ด๋‹ค [1]. ์ด ๋„๊ตฌ๋Š” ์–ด๋–ค ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ธ์ œ, ์–ผ๋งˆ๋‚˜ ์˜ค๋ž˜ ๋ Œ๋”๋ง๋˜์—ˆ๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์–ด๋–ค ์š”์ธ(props, state ๋ณ€๊ฒฝ ๋“ฑ)์ด ๋ Œ๋”๋ง์„ ์œ ๋ฐœํ–ˆ๋Š”์ง€ ํŒŒ์•…ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค [1, 2]. ์ฃผ๋กœ ๋กœ์ปฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ์‹๋ณ„ํ•˜๊ณ  ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ์ฐพ์•„๋‚ด๋Š” ๋ฐ ํ•ต์‹ฌ์ ์œผ๋กœ ํ™œ์šฉ๋œ๋‹ค [3]. + +## ๐Ÿ“– Core Content +* **๋ Œ๋”๋ง ์ถ”์  ๋ฐ ์‹œ๊ฐํ™”**: Profiler๋Š” ํŠน์ • props๋‚˜ ์ƒํƒœ(state) ๋ณ€๊ฒฝ ๋“ฑ ์ปดํฌ๋„ŒํŠธ์˜ ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•œ ์ •ํ™•ํ•œ ์›์ธ์„ ์ถ”์ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค [1, 2]. ํ”Œ๋ ˆ์ž„๊ทธ๋ž˜ํ”„(Flamegraph)์™€ ์ˆœ์œ„ ๋ทฐ(Ranked views)๋ฅผ ์ œ๊ณตํ•˜์—ฌ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ ์ง€์ ์„ ์‹œ๊ฐ์ ์œผ๋กœ ์‰ฝ๊ฒŒ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š”๋‹ค [2]. +* **์ตœ์ ํ™” ํ•„์š”์„ฑ ๊ฒ€์ฆ (์ธก์ • ๊ธฐ๋ฐ˜ ์ตœ์ ํ™”)**: `React.memo`์™€ ๊ฐ™์€ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๊ธฐ์ˆ ์„ ์ ์šฉํ•˜๊ธฐ ์ „์—, ์ปดํฌ๋„ŒํŠธ์˜ ๋ฆฌ๋ Œ๋”๋ง ๋น„์šฉ์ด ์ตœ์ ํ™” ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๊ฐ์ˆ˜ํ•  ๋งŒํผ ํฐ์ง€ ์ธก์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค [4]. ๋˜ํ•œ, ๋ฉ”๋ชจ์ด์ œ์ด์…˜๋œ ์ปดํฌ๋„ŒํŠธ ๋‚ด์˜ prop ๋ณ€๊ฒฝ์„ ์ถ”์ ํ•˜์—ฌ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ฆฌ๋ Œ๋”๋ง๋˜๋Š”์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค [5]. "์ธก์ •ํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ์ตœ์ ํ™”ํ•˜์ง€ ๋ง๋ผ"๋Š” ์›์น™์— ๋”ฐ๋ผ, ํ”„๋กœํŒŒ์ผ๋ง์€ ์„ฑ๋Šฅ ํ•ซ์ŠคํŒŸ์—๋งŒ ์ง‘์ค‘ํ•˜๋„๋ก ๋•๋Š”๋‹ค [2, 6]. +* **React Compiler ์‹œ๊ฐํ™”**: React Compiler๊ฐ€ ์ ์šฉ๋œ ํ™˜๊ฒฝ์—์„œ๋Š” Profiler ํƒญ์—์„œ ์ž๋™ ์ตœ์ ํ™”๋œ ์ปดํฌ๋„ŒํŠธ์— `Memo โœจ` ๋ฐฐ์ง€๊ฐ€ ํ‘œ์‹œ๋œ๋‹ค [7, 8]. ์ž…๋ ฅ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•„ ๋ฆฌ๋ Œ๋”๋ง์„ ๊ฑด๋„ˆ๋›ด ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋Š” ํšŒ์ƒ‰์œผ๋กœ ํ‘œ์‹œ๋˜๋ฉฐ, ๋งˆ์šฐ์Šค๋ฅผ ์˜ฌ๋ฆฌ๋ฉด ์ž๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๋ฐ ๋ฆฌ๋ Œ๋”๋ง ์ƒ๋žต ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๋Š” ํˆดํŒ์ด ๋‚˜ํƒ€๋‚œ๋‹ค [8]. +* **๋ธ”๋ž™๋ฐ•์Šค ํ™˜๊ฒฝ์—์„œ์˜ ๋””๋ฒ„๊น… ํ•„์ˆ˜์„ฑ**: React Compiler ๋„์ž… ์‹œ ๊ธฐ์กด์˜ ๋ช…์‹œ์ ์ธ `React.memo`, `useMemo`, `useCallback` ํ˜ธ์ถœ์ด ์ฝ”๋“œ์—์„œ ์‚ฌ๋ผ์ ธ ๋ Œ๋”๋ง ์ œ์–ด๊ฐ€ ๋ธ”๋ž™๋ฐ•์Šค์ฒ˜๋Ÿผ ์ž‘๋™ํ•˜๊ฒŒ ๋œ๋‹ค [9]. ๋”ฐ๋ผ์„œ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ฆฌ๋ Œ๋”๋ง ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ, ์ด๋ฅผ ์ฝ”๋“œ ์ƒ์—์„œ ํ™•์ธํ•˜๋Š” ๋Œ€์‹  Profiler๋ฅผ ํ†ตํ•ด ์ง์ ‘ ์กฐ์‚ฌํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๊ทธ ์ค‘์š”์„ฑ์ด ๋”์šฑ ์ปค์ง„๋‹ค [9]. + +## โš–๏ธ Trade-offs & Caveats +* **ํ•ด์„์ƒ์˜ ์ฃผ์˜์  (`Memo โœจ` ๋ฐฐ์ง€์˜ ํ•จ์ •)**: Profiler ํƒญ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” `Memo โœจ` ๋ฐฐ์ง€๋Š” ๋‹ค์†Œ ์˜คํ•ด๋ฅผ ๋ถˆ๋Ÿฌ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋‹ค [10]. ์ด ๋ฐฐ์ง€๋Š” React Compiler๊ฐ€ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ฒ˜๋ฆฌ(Compile)ํ–ˆ์Œ์„ ๋‚˜ํƒ€๋‚ผ ๋ฟ, ์ตœ์ ํ™”๊ฐ€ ์™„๋ฒฝํ•˜๊ฒŒ ์„ฑ๊ณตํ–ˆ์Œ์„ ์˜๋ฏธํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค [10]. ์ปดํฌ๋„ŒํŠธ์— ๋ฐฐ์ง€๊ฐ€ ํ‘œ์‹œ๋˜์–ด ์žˆ๋”๋ผ๋„, ์ธ๋ผ์ธ ๊ฐ์ฒด๋‚˜ ํ•จ์ˆ˜์™€ ๊ฐ™์€ ๋ถˆ์•ˆ์ •ํ•œ ์ฐธ์กฐ๋ฅผ ๊ฐ€์ง„ props๊ฐ€ ์ „๋‹ฌ๋œ๋‹ค๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ง‰์ง€ ๋ชปํ•ด ์—ฌ์ „ํžˆ ๋งค๋ฒˆ ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค [10]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [๊ด€๊ณ„ ์œ ํ˜• A: ์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] +- [[React Compiler]] + - ์—ฐ๊ฒฐ ์ด์œ : React Compiler๊ฐ€ ๋นŒ๋“œ ํƒ€์ž„์— ์ฃผ์ž…ํ•œ ์ž๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๋กœ์ง์˜ ์„ฑ๊ณต ์—ฌ๋ถ€์™€ ๋ Œ๋”๋ง ์Šคํ‚ต ๊ฒฐ๊ณผ๋ฅผ Profiler๋ฅผ ํ†ตํ•ด ์‹œ๊ฐ์ ์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค [7-9]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ช…์‹œ์ ์ธ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ์ฝ”๋“œ ์—†์ด๋„ ๋ Œ๋”๋ง ์„ฑ๋Šฅ์ด ์ตœ์ ํ™”๋˜๋Š” ์›๋ฆฌ์™€, ๋ธ”๋ž™๋ฐ•์Šคํ™”๋œ ๋ Œ๋”๋ง ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๋””๋ฒ„๊น…ํ•˜๋Š” ๋ฐฉ๋ฒ• [9, 11]. + +#### [๊ด€๊ณ„ ์œ ํ˜• B: ๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ] +- [[React.memo]] + - ์—ฐ๊ฒฐ ์ด์œ : Profiler๋ฅผ ํ†ตํ•ด ํŠน์ • ์ปดํฌ๋„ŒํŠธ์˜ ๋ Œ๋”๋ง ๋นˆ๋„์™€ ๋น„์šฉ์„ ์ธก์ •ํ•œ ๋’ค, ๊ทธ ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ `React.memo` ์ ์šฉ์ด ์„ฑ๋Šฅ ํ–ฅ์ƒ์— ์‹ค์งˆ์ ์ธ ๋„์›€์ด ๋ ์ง€ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๋‹ค [4]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์–•์€ ๋น„๊ต(Shallow comparison)์˜ ์›๋ฆฌ์™€ ํ”„๋กœํŒŒ์ผ๋ง ๋ฐ์ดํ„ฐ์— ๊ธฐ๋ฐ˜ํ•œ ์ „๋žต์  ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๋ฐฉ๋ฒ• [4, 12, 13]. +- [[useCallback & useMemo]] + - ์—ฐ๊ฒฐ ์ด์œ : Profiler์—์„œ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ฐธ์กฐ(Reference) ๋ณ€๊ฒฝ ๋•Œ๋ฌธ์— ๊ณ„์† ๋ฆฌ๋ Œ๋”๋ง๋˜๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ๋‹ค๋ฉด, ์ด ํ›…๋“ค์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฐธ์กฐ ์•ˆ์ •์„ฑ(Reference stability)์„ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ๋‹ค [5, 14]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํ•จ์ˆ˜๋‚˜ ๊ฐ์ฒด์˜ ์ฐธ์กฐ ๋™์ผ์„ฑ์ด ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง ํŠธ๋ฆฌ์— ๋ฏธ์น˜๋Š” ์ง์ ‘์ ์ธ ์˜ํ–ฅ [14]. + +### Deeper Research Questions +- React DevTools Profiler์˜ ํ”Œ๋ ˆ์ž„๊ทธ๋ž˜ํ”„(Flamegraph)์™€ ์ˆœ์œ„ ๋ทฐ(Ranked view)๋ฅผ ์–ด๋–ป๊ฒŒ ๋ถ„์„ํ•ด์•ผ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ๊ฐ€์žฅ ๋น ๋ฅด๊ณ  ์ •ํ™•ํ•˜๊ฒŒ ์ฐพ์•„๋‚ผ ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- ๋ช…์‹œ์ ์ธ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ํ›…์ด ์ œ๊ฑฐ๋˜๋Š” React Compiler ํ™˜๊ฒฝ์—์„œ, Profiler๋ฅผ ํ†ตํ•œ ์„ฑ๋Šฅ ๋””๋ฒ„๊น… ์›Œํฌํ”Œ๋กœ์šฐ๋Š” ๊ธฐ์กด๊ณผ ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ๋‹ฌ๋ผ์ง€๋Š”๊ฐ€? +- Profiler๋ฅผ ํ†ตํ•ด ์‹๋ณ„๋œ ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ๋•Œ, ์–ด๋–ค ์ƒํ™ฉ์—์„œ ๊ตฌ์กฐ ์žฌ์„ค๊ณ„(์˜ˆ: Context API ๋Œ€์‹  Zustand ๋„์ž…)๊ฐ€ ๋‹จ์ˆœํ•œ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ์ ์šฉ๋ณด๋‹ค ๋” ๋‚˜์€ ์„ ํƒ์ด ๋˜๋Š”๊ฐ€? +- ๋กœ์ปฌ ํ™˜๊ฒฝ์˜ Profiler์—์„œ ๊ด€์ฐฐ๋˜๋Š” ๋ Œ๋”๋ง ์‹œ๊ฐ„๊ณผ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์˜ ์‹ค์ œ ์‚ฌ์šฉ์ž ์ฒด๊ฐ ์„ฑ๋Šฅ(Core Web Vitals์˜ INP ๋“ฑ) ๊ฐ„์˜ ์ฐจ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ๋ณด์ •ํ•˜์—ฌ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? + +### Practical Application Contexts +- **Implementation:** ๋ Œ๋”๋ง ์ตœ์ ํ™” ์ฝ”๋“œ๋ฅผ ๋ฌด์ž‘์ • ์ถ”๊ฐ€ํ•˜๊ธฐ ์ „์—, Profiler๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์‹ค์ œ ๋ Œ๋”๋ง ๋นˆ๋„์™€ ์‹คํ–‰ ์‹œ๊ฐ„์„ ์ธก์ •ํ•จ์œผ๋กœ์จ ๋ Œ๋”๋ง์ด ๋ฌด๊ฑฐ์šด(expensive) ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ •ํ™•ํžˆ ์‹๋ณ„ํ•œ๋‹ค [4, 6]. +- **System Design:** Context API์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ Œ๋”๋ง๋˜๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ๊ธ€๋กœ๋ฒŒ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(Zustand ๋“ฑ) ๋„์ž…์ด๋‚˜ ์ƒํƒœ ๋„๋ฉ”์ธ ๋ถ„๋ฆฌ์˜ ๊ธฐ์ˆ ์  ํƒ€๋‹น์„ฑ์„ ๊ฒ€์ฆํ•œ๋‹ค [15-18]. +- **Operation / Maintenance:** ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ฑฐ๋‚˜ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ๋ฆด๋ฆฌ์Šคํ•œ ์งํ›„, ํ”Œ๋ ˆ์ž„๊ทธ๋ž˜ํ”„๋ฅผ ์ •๊ธฐ์ ์œผ๋กœ ๋ฆฌ๋ทฐํ•˜์—ฌ ์˜๋„์น˜ ์•Š์€ ์„ฑ๋Šฅ ํšŒ๊ท€(Regression)๋ฅผ ์‹๋ณ„ํ•˜๊ณ  ๊ด€๋ฆฌํ•œ๋‹ค [19]. +- **Learning Path:** React ์ž…๋ฌธ์ž๋‚˜ ํŒ€์›๋“ค์ด Props, State, Context๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ฐ˜์‘ํ•˜๊ณ  ์žฌ๋ Œ๋”๋ง๋˜๋Š”์ง€๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ๋ณด์—ฌ์คŒ์œผ๋กœ์จ ๋ Œ๋”๋ง ๋ชจ๋ธ์„ ๊นŠ๊ฒŒ ์ดํ•ด์‹œํ‚จ๋‹ค [1, 20]. +- **My Project Relevance:** ํ™”๋ฉด ๋‚ด ๋Œ€์šฉ๋Ÿ‰ ๋ฆฌ์ŠคํŠธ๋‚˜ ๋ณต์žกํ•œ ํ•„ํ„ฐ๋ฅผ ์กฐ์ž‘ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์ง€์—ฐ ํ˜„์ƒ(Jank)์˜ ์›์ธ์ด ๋ Œ๋”๋ง ์‹œ๊ฐ„ ์ž์ฒด์ธ์ง€, ์•„๋‹ˆ๋ฉด ๋ถˆํ•„์š”ํ•œ ์—ฐ์‡„ ๋ฆฌ๋ Œ๋”๋ง ๋•Œ๋ฌธ์ธ์ง€ ์ง„๋‹จํ•˜๊ณ  ํ•ด๊ฒฐ์ฑ…์„ ๋งˆ๋ จํ•œ๋‹ค [21, 22]. + +### Adjacent Topics +- [[why-did-you-render]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: Profiler์™€ ๊ฒฐํ•ฉํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ, ์‹ค์ œ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์ด ์—†์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง๋œ '์ •ํ™•ํ•œ ์ด์œ '๋ฅผ ์ฝ˜์†”์— ๊ฒฝ๊ณ  ํ˜•ํƒœ๋กœ ๋‚จ๊ฒจ์ฃผ์–ด ๋””๋ฒ„๊น…์„ ๋”์šฑ ์‰ฝ๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๋„๊ตฌ์— ๋Œ€ํ•ด ์กฐ์‚ฌํ•œ๋‹ค [3, 23]. +- [[Chrome DevTools Performance Tab]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: Profiler๊ฐ€ ์•Œ๋ ค์ฃผ๋Š” React ๋‚ด๋ถ€์˜ ๋ Œ๋”๋ง ์†๋„ ์ด์™ธ์—, ํ”„๋ ˆ์ž„ ๋“œ๋กญ์ด๋‚˜ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋ฅผ ๋ง‰๋Š” ๋ฌด๊ฑฐ์šด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰, ๋ ˆ์ด์•„์›ƒ ์ด๋™ ๋“ฑ ๋ธŒ๋ผ์šฐ์ € ๋ ˆ๋ฒจ์˜ ์ „์ฒด์ ์ธ ์„ฑ๋Šฅ ๋ถ„์„์œผ๋กœ ์‹œ์•ผ๋ฅผ ํ™•์žฅํ•œ๋‹ค [3, 23]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Development/React Frontend Architecture.md b/10_Wiki/Development/React Frontend Architecture.md new file mode 100644 index 00000000..76200a99 --- /dev/null +++ b/10_Wiki/Development/React Frontend Architecture.md @@ -0,0 +1,64 @@ +# [[React Frontend Architecture]] + +## ๐Ÿ“Œ Brief Summary +React ํ”„๋ก ํŠธ์—”๋“œ ์•„ํ‚คํ…์ฒ˜๋Š” ํ™•์žฅ ๊ฐ€๋Šฅํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ์‰ฌ์šด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•œ ๊ตฌ์กฐ์  ๋ผˆ๋Œ€์ด์ž ์กฐ์งํ™” ๋ฐฉ๋ฒ•๋ก ์ด๋‹ค [1, 2]. ๊ธฐ์กด์˜ ๊ธฐ์ˆ ์  ํŒŒ์ผ ๋‹จ์œ„ ๋ถ„๋ฆฌ์—์„œ ๋ฒ—์–ด๋‚˜, ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ๊ณผ ๊ธฐ๋Šฅ(Feature-Based)์„ ์ค‘์‹ฌ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๊ตฌ์„ฑํ•˜์—ฌ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ณ  ์‘์ง‘๋„๋ฅผ ๋†’์ด๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•œ๋‹ค [3-5]. ์ด๋ฅผ ํ†ตํ•ด ๋ฌด๋ถ„๋ณ„ํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์˜ UI ๋ˆ„์ˆ˜๋ฅผ ๋ง‰๊ณ  ๋ช…ํ™•ํ•œ ์ƒํƒœ ์†Œ์œ ๊ถŒ์„ ํ™•๋ฆฝํ•˜๋ฉฐ, ํŒ€๊ณผ ์ฝ”๋“œ๋ฒ ์ด์Šค๊ฐ€ ์„ฑ์žฅํ•จ์— ๋”ฐ๋ผ ์‹œ์Šคํ…œ์ด ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š”๋‹ค [6-8]. + +## ๐Ÿ“– Core Content + +* **ํด๋” ๊ตฌ์กฐ์™€ ๋ชจ๋“ˆํ™”์˜ ์ง„ํ™”**: ๊ณผ๊ฑฐ์—๋Š” ์ปดํฌ๋„ŒํŠธ, ํ›…, ์Šคํƒ€์ผ ๋“ฑ์„ ํŒŒ์ผ ์œ ํ˜•๋ณ„๋กœ ๊ทธ๋ฃนํ™”ํ–ˆ์œผ๋‚˜, ํ”„๋กœ์ ํŠธ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ๋…ผ๋ฆฌ์  ๊ธฐ๋Šฅ์ด ํŒŒํŽธํ™”๋˜์–ด ํƒ์ƒ‰๊ณผ ํ™•์žฅ์ด ์–ด๋ ค์› ๋‹ค [4, 9]. 2025๋…„ ๊ธฐ์ค€ ํ”„๋ก ํŠธ์—”๋“œ ์—…๊ณ„ ํ‘œ์ค€์€ ๋น„์ฆˆ๋‹ˆ์Šค ๊ธฐ๋Šฅ์„ ์ค‘์‹ฌ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๋ฌถ๋Š” '๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜(Feature-Based)' ๊ตฌ์กฐ๋กœ ์ „ํ™˜๋˜์—ˆ๋‹ค [5, 10]. ํŠน์ • ๊ธฐ๋Šฅ๊ณผ ๊ด€๋ จ๋œ ์ปดํฌ๋„ŒํŠธ, ํ›…, API ๋กœ์ง ๋“ฑ์„ ๋‹จ์ผ ๋””๋ ‰ํ† ๋ฆฌ์— ์บก์Аํ™”ํ•จ์œผ๋กœ์จ ๋ชจ๋“ˆ์˜ ๋…๋ฆฝ์„ฑ๊ณผ ํ™•์žฅ์„ฑ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚จ๋‹ค [11, 12]. +* **๊ธฐ๋Šฅ ๋ถ„ํ•  ์„ค๊ณ„ (Feature-Sliced Design, FSD)**: FSD๋Š” ๋„๋ฉ”์ธ ์ฃผ๋„ ์„ค๊ณ„(DDD)์™€ ๋ชจ๋“ˆํ˜• ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ฒฐํ•ฉํ•œ ํ”„๋ก ํŠธ์—”๋“œ ์ „์šฉ ๋ฐฉ๋ฒ•๋ก ์ด๋‹ค [3, 13]. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ `app`, `pages`, `widgets`, `features`, `entities`, `shared`์˜ ๊ณ„์ธต(Layer)์œผ๋กœ ๋‚˜๋ˆ„๊ณ , ์ƒ์œ„ ๊ณ„์ธต์€ ํ•˜์œ„ ๊ณ„์ธต์—๋งŒ ์˜์กดํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์—„๊ฒฉํ•œ '๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ' ๊ทœ์น™์„ ๊ฐ•์ œํ•œ๋‹ค [11, 14, 15]. ๊ฐ ์Šฌ๋ผ์ด์Šค๋Š” `index.ts` ํ˜•ํƒœ์˜ 'Public API'๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์™ธ๋ถ€์— ๊ธฐ๋Šฅ๊ณผ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋…ธ์ถœํ•˜์—ฌ ๋‚ด๋ถ€ ๊ตฌํ˜„์„ ์•ˆ์ „ํ•˜๊ฒŒ ์บก์Аํ™”ํ•œ๋‹ค [16-18]. +* **์ƒํƒœ ๊ด€๋ฆฌ ์•„ํ‚คํ…์ฒ˜์˜ ์„ธ๋ถ„ํ™”**: ๋‹จ์ผ ๋ชจ๋†€๋ฆฌ์‹ ์Šคํ† ์–ด(์˜ˆ: ๋Œ€๊ทœ๋ชจ Redux)์— ์˜์กดํ•˜๋˜ ๋ฐฉ์‹์—์„œ ๋ฒ—์–ด๋‚˜, ๋ฐ์ดํ„ฐ์˜ ์„ฑ๊ฒฉ์— ๋”ฐ๋ผ ์ตœ์ ์˜ ๋„๊ตฌ๋ฅผ ์„ ํƒํ•˜๋„๋ก ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ํŒŒํŽธํ™”๋˜์—ˆ๋‹ค [19, 20]. ์„œ๋ฒ„์—์„œ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐ์ดํ„ฐ์ธ '์„œ๋ฒ„ ์ƒํƒœ'๋Š” TanStack Query(React Query)๋ฅผ ์ด์šฉํ•ด ์บ์‹ฑ ๋ฐ ๋„คํŠธ์›Œํฌ ๋กœ์ง์„ ๊ฒฉ๋ฆฌํ•˜๊ณ , ํ…Œ๋งˆ๋‚˜ ์„ค์ • ๋“ฑ ์ •์ ์ธ '์ „์—ญ ์ƒํƒœ'๋Š” Context API๋กœ, ์žฅ๋ฐ”๊ตฌ๋‹ˆ๋‚˜ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ์ฒ˜๋Ÿผ ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ณ€ํ•˜๋Š” ์ƒํƒœ๋Š” Zustand๋‚˜ Jotai ๋“ฑ ์„ ํƒ์  ๋ Œ๋”๋ง์„ ์ง€์›ํ•˜๋Š” ๋„๊ตฌ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค [20-24]. +* **์†Œํ”„ํŠธ์›จ์–ด ๊ณตํ•™ ์›์น™์˜ ์ ์šฉ (SOLID & Clean Code)**: React์˜ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ ๊ฐœ๋ฐœ์—๋„ ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)์„ ์ ์šฉํ•˜์—ฌ, ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ปค์ง€๋ฉด ์ƒํƒœ ๊ด€๋ฆฌ, ๋ฐ์ดํ„ฐ ํŽ˜์นญ, ๋ Œ๋”๋ง ๋“ฑ ๊ฐ๊ธฐ ๋‹ค๋ฅธ ์ฑ…์ž„์„ ๊ฐ€์ง„ ์ž‘์€ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ถ„๋ฆฌํ•ด์•ผ ํ•œ๋‹ค [25, 26]. ์ค‘๋ณต์„ ํ”ผํ•˜๋Š” DRY ์›์น™์„ ํ†ตํ•ด ๊ณตํ†ต ๋กœ์ง์„ ์ปค์Šคํ…€ ํ›…์œผ๋กœ ์ถ”์ถœํ•˜๋ฉด์„œ๋„, ์ฝ”๋“œ๋ฅผ ๋‹จ์ˆœํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋Š” KISS ์›์น™๊ณผ ๋ฏธ๋ž˜๋ฅผ ์œ„ํ•œ ๊ณผ๋„ํ•œ ์ตœ์ ํ™”๋ฅผ ํ”ผํ•˜๋Š” YAGNI ์›์น™ ๊ฐ„์˜ ๊ท ํ˜•์„ ๋งž์ถ”๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ด๋‹ค [27, 28]. +* **๋ช…๋ช… ๊ทœ์น™๊ณผ ๊ฑฐ๋ฒ„๋„Œ์Šค ๋„๊ตฌ**: ํด๋”์™€ ํŒŒ์ผ ์‹œ์Šคํ…œ์€ OS ํ™˜๊ฒฝ์— ๋”ฐ๋ฅธ ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด `kebab-case`๋ฅผ, React ์ปดํฌ๋„ŒํŠธ๋Š” `PascalCase`๋ฅผ, ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜๋Š” `camelCase`๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ณดํŽธ์ ์ธ ์ปจ๋ฒค์…˜์ด๋‹ค [29-33]. ์ด๋Ÿฌํ•œ ๊ทœ์น™๊ณผ ์•„ํ‚คํ…์ฒ˜ ์˜์กด์„ฑ ๊ฒฝ๊ณ„๋Š” ESLint๋‚˜ Prettier, Husky์™€ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•ด ๋นŒ๋“œ ํƒ€์ž„ ๋ฐ ์ปค๋ฐ‹ ๋‹จ๊ณ„์—์„œ ์ž๋™์œผ๋กœ ๊ฐ•์ œ(Linting)๋œ๋‹ค [30, 34]. + +## โš–๏ธ Trade-offs & Caveats + +* **FSD ๋ฐ ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ๋ชจ๋“ˆํ™”์˜ ๋ณต์žก์„ฑ ์˜ค๋ฒ„ํ—ค๋“œ**: Feature-Sliced Design์€ ๊ตฌ์กฐ์  ์•ˆ์ •์„ฑ์„ ์ œ๊ณตํ•˜์ง€๋งŒ "๋ฌด์—‡์ด ํ•˜๋‚˜์˜ ๊ธฐ๋Šฅ(Feature)์ธ๊ฐ€?"๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒฝ๊ณ„๋ฅผ ์„ค์ •ํ•˜๊ธฐ ๋งค์šฐ ๊นŒ๋‹ค๋กญ๋‹ค๋Š” ๊ทผ๋ณธ์  ์–ด๋ ค์›€์ด ์žˆ๋‹ค [35]. ์ธ์ฆ(Auth)๊ณผ ๊ฐ™์€ ๊ต์ฐจ ๊ด€์‹ฌ์‚ฌ(Cross-cutting concern)๋Š” ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ์— ๊ฑธ์ณ ์žˆ์–ด ์ ์ ˆํ•œ ๊ณ„์ธต์„ ์ฐพ๊ธฐ ๋ชจํ˜ธํ•˜๋ฉฐ [35, 36], ์—„๊ฒฉํ•œ ๋ถ„ํ•  ๊ทœ์น™์„ ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์— ๋„์ž…ํ•˜๋ฉด ์˜คํžˆ๋ ค ๋ถˆํ•„์š”ํ•œ ํด๋” ๊ตฌ์กฐ์™€ ์˜ค๋ฒ„์—”์ง€๋‹ˆ์–ด๋ง์œผ๋กœ ์ธํ•œ ๊ฐœ๋ฐœ ์†๋„ ์ €ํ•˜๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ๋‹ค [12, 37]. ๋˜ํ•œ, ๊ทœ์น™์„ ์ œ๋Œ€๋กœ ์ˆ™์ง€ํ•˜์ง€ ์•Š์œผ๋ฉด ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ 'Shared' ๊ณ„์ธต์— ์Ÿ์•„๋ถ€์–ด ์ตœ์•…์˜ ํŒŒ๊ธ‰ ํšจ๊ณผ๋ฅผ ๋‚ณ๋Š” ์ŠคํŒŒ๊ฒŒํ‹ฐ ์ฝ”๋“œ๊ฐ€ ๋  ์œ„ํ—˜์ด ์กด์žฌํ•œ๋‹ค [38, 39]. +* **์ถ”์ƒํ™”(DRY)์™€ ๋‹จ์ˆœํ•จ(KISS)์˜ ์ƒ์ถฉ**: DRY ์›์น™์— ์ง‘์ฐฉํ•˜์—ฌ ์ฝ”๋“œ ์ค‘๋ณต์„ ๋ฌด์กฐ๊ฑด ํ”ผํ•˜๋ ค๊ณ  ํ•˜๋ฉด, ์ˆ˜๋งŽ์€ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ์™€ ๋ถ„๊ธฐ๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฑฐ๋Œ€ํ•˜๊ณ  ๋ณต์žกํ•œ ์ปค์Šคํ…€ ํ›…์ด๋‚˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํƒ„์ƒํ•˜๊ฒŒ ๋œ๋‹ค [27]. ์ด๋Ÿฌํ•œ ๊ณผ๋„ํ•œ ์ถ”์ƒํ™”๋Š” ๋‹จ์ˆœํ•œ ์ฝ”๋“œ ๋ฐ˜๋ณต๋ณด๋‹ค ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋–จ์–ด๋œจ๋ ค KISS ์›์น™์„ ์œ„๋ฐ˜ํ•˜๋Š” ๋ฐ˜๋Œ€ ๊ธ‰๋ถ€๋ฅผ ๋‚ณ์œผ๋ฏ€๋กœ, ๋ช…ํ™•ํ•œ ํŒจํ„ด์ด 3๋ฒˆ ์ด์ƒ ๋ฐ˜๋ณต๋  ๋•Œ๊นŒ์ง€๋Š” ์ถ”์ƒํ™”๋ฅผ ๋ฏธ๋ฃจ๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋œ๋‹ค [27, 40, 41]. +* **์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ ์„ ํƒ์— ๋”ฐ๋ฅธ ๋ถ€์ž‘์šฉ**: React ๋‚ด์žฅ Context API๋Š” ์™ธ๋ถ€ ์˜์กด์„ฑ ์—†์ด ์ƒํƒœ๋ฅผ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ƒํƒœ๊ฐ’์˜ ์ผ๋ถ€๋งŒ ๋ณ€๊ฒฝ๋˜์–ด๋„ ํ•ด๋‹น ์ปจํ…์ŠคํŠธ๋ฅผ ๊ตฌ๋…ํ•˜๋Š” ๋ชจ๋“  ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ฐ•์ œ๋กœ ๋ฆฌ๋ Œ๋”๋ง๋œ๋‹ค๋Š” ์น˜๋ช…์ ์ธ ์„ฑ๋Šฅ ์ œ์•ฝ์ด ์žˆ๋‹ค [42, 43]. ๋ฐ˜๋Œ€๋กœ Redux๋Š” ๋ช…ํ™•ํ•œ ๊ตฌ์กฐ์™€ ๊ฐ•๋ ฅํ•œ ๋””๋ฒ„๊น… ํˆด์„ ์ œ๊ณตํ•˜์ง€๋งŒ, ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ์˜ ํญ๋ฐœ์  ์ฆ๊ฐ€๋ฅผ ๋™๋ฐ˜ํ•˜์—ฌ ์†Œ๊ทœ๋ชจ ํŒ€์ด๋‚˜ ๊ฐ„๋‹จํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ๊ณผ๋„ํ•œ ๊ธฐ์ˆ  ๋ถ€์ฑ„๋กœ ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๋‹ค [44, 45]. +* **์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์˜ ์ˆจ์€ ๋น„์šฉ**: `React.memo`, `useMemo`, `useCallback`์€ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ง‰์•„์ฃผ์ง€๋งŒ ๊ทธ ์ž์ฒด๊ฐ€ ๊ณต์งœ๋Š” ์•„๋‹ˆ๋‹ค [46]. ์ด์ „ Props๋‚˜ ์˜์กด์„ฑ ๋ฐฐ์—ด์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜๊ณ  ๋ณ€๊ฒฝ ์—ฌ๋ถ€๋ฅผ ์–•์€ ๋น„๊ต(Shallow compare)ํ•˜๋Š” ์—ฐ์‚ฐ ๋น„์šฉ์ด ์ถ”๊ฐ€๋œ๋‹ค [46]. ๋งŒ์•ฝ ๋ Œ๋”๋ง ๋น„์šฉ์ด ๋งค์šฐ ์‹ผ ์ปดํฌ๋„ŒํŠธ์— ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋ถˆ์•ˆ์ •ํ•œ ์ฐธ์กฐ๊ฐ’(์ธ๋ผ์ธ ํ•จ์ˆ˜, ๊ฐ์ฒด)์„ ์ง€์†์ ์œผ๋กœ ์ „๋‹ฌํ•˜์—ฌ ๋ฆฌ๋ Œ๋”๋ง ์ฐจ๋‹จ์— ์‹คํŒจํ•œ๋‹ค๋ฉด, ์ตœ์ ํ™” ์ฝ”๋“œ ์ž์ฒด๊ฐ€ ์˜คํžˆ๋ ค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋” ๋А๋ฆฌ๊ฒŒ ๋งŒ๋“œ๋Š” ๋ถ€์ž‘์šฉ์ด ๋ฐœ์ƒํ•œ๋‹ค [46, 47]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [์•„ํ‚คํ…์ฒ˜ ๋ฐ ๋””์ž์ธ ํŒจํ„ด] +- [[Feature-Sliced Design]] + - ์—ฐ๊ฒฐ ์ด์œ : ํ˜„๋Œ€ React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ชจ๋“ˆํ™” ๋ฐ ๊ณ„์ธตํ™”๋ฅผ ์œ„ํ•ด ๊ณ ์•ˆ๋œ ๊ฐ€์žฅ ๋Œ€ํ‘œ์ ์ด๊ณ  ๊ตฌ์ฒด์ ์ธ ํ”„๋ก ํŠธ์—”๋“œ ์•„ํ‚คํ…์ฒ˜ ๋ฐฉ๋ฒ•๋ก ์ด๊ธฐ ๋•Œ๋ฌธ [3, 13]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋„๋ฉ”์ธ ๊ธฐ๋ฐ˜ ๋ถ„ํ• , ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ๊ทœ์น™ ์ ์šฉ ๋ฐฉ๋ฒ•, ๊ทธ๋ฆฌ๊ณ  Public API๋ฅผ ํ†ตํ•œ ์ปดํฌ๋„ŒํŠธ์˜ ์บก์Аํ™” ์›๋ฆฌ [14, 16, 17]. +- [[SOLID Principles]] + - ์—ฐ๊ฒฐ ์ด์œ : ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ํ”„๋ก ํŠธ์—”๋“œ ๊ตฌ์กฐ๋ฅผ ์งœ๊ธฐ ์œ„ํ•ด ํด๋ž˜์Šค ๊ธฐ๋ฐ˜ OOP๋ฅผ ๋„˜์–ด React์˜ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—๋„ ์ ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ทผ๋ณธ์ ์ธ ์†Œํ”„ํŠธ์›จ์–ด ์„ค๊ณ„ ์›์น™์ด๊ธฐ ๋•Œ๋ฌธ [17, 48]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)์„ ์ด์šฉํ•œ ๋น„๋Œ€ํ•ด์ง„ ์ปดํฌ๋„ŒํŠธ์˜ ๋ฆฌํŒฉํ† ๋ง ๋ฐฉ์‹ ๋ฐ ๊ฐœ๋ฐฉ-ํ์‡„ ์›์น™(OCP)์„ ํ™œ์šฉํ•œ UI ์ปดํฌ๋„ŒํŠธ ํ•ฉ์„ฑ(Composition) ์ „๋žต [25, 49]. + +#### [์ƒํƒœ ๊ด€๋ฆฌ ๋ฐ ์ตœ์ ํ™” ์ „๋žต] +- [[State Management]] + - ์—ฐ๊ฒฐ ์ด์œ : ์•„ํ‚คํ…์ฒ˜ ๋‚ด์—์„œ ๋ฐ์ดํ„ฐ(์„œ๋ฒ„ ๋ฐ์ดํ„ฐ, ๋กœ์ปฌ ์ƒํƒœ, ์ „์—ญ UI ์ƒํƒœ)์˜ ์„ฑ๊ฒฉ์— ๋”ฐ๋ผ ์ฑ…์ž„๊ณผ ์ €์žฅ์†Œ๋ฅผ ์–ด๋–ป๊ฒŒ ๋‚˜๋ˆŒ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ํ•ต์‹ฌ ๋ถ„์•ผ์ด๊ธฐ ๋•Œ๋ฌธ [20, 50]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Context API์˜ ๋ Œ๋”๋ง ํ•œ๊ณ„๋ฅผ ๋ŒํŒŒํ•˜๊ธฐ ์œ„ํ•œ Zustand/Jotai์˜ Selector ํŒจํ„ด ์ž‘๋™ ์›๋ฆฌ ๋ฐ TanStack Query๋ฅผ ํ™œ์šฉํ•œ ์„œ๋ฒ„ ์ƒํƒœ ๊ฒฉ๋ฆฌ ๊ธฐ๋ฒ• [21, 43, 51]. +- [[Performance Optimization]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋Œ€๊ทœ๋ชจ ์•„ํ‚คํ…์ฒ˜๊ฐ€ ์‹ค์ œ๋กœ ์‚ฌ์šฉ์ž ๋ธŒ๋ผ์šฐ์ €์—์„œ ํšจ์œจ์ ์œผ๋กœ ๋™์ž‘ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์ˆ˜์ ์œผ๋กœ ์ˆ˜๋ฐ˜๋˜์–ด์•ผ ํ•˜๋Š” ์„ฑ๋Šฅ ์ง€ํ‘œ(Web Vitals) ๊ด€๋ฆฌ ๋ฐฉ๋ฒ•์ด๊ธฐ ๋•Œ๋ฌธ [52, 53]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ง€์—ฐ ๋กœ๋”ฉ(Lazy Loading) ๋ฐ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…์„ ํ†ตํ•œ ์ดˆ๊ธฐ ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ ์ตœ์ ํ™”, ๊ทธ๋ฆฌ๊ณ  ๋™์‹œ์„ฑ ๋ Œ๋”๋ง(Concurrent Rendering) ํ›…์˜ ํ™œ์šฉ๋ฒ• [54-56]. + +### Deeper Research Questions +- Feature-Sliced Design(FSD)์—์„œ ์ธ์ฆ(Auth)์ด๋‚˜ ๋ถ„์„(Analytics) ๊ฐ™์€ ๋„๋ฉ”์ธ ๊ฐ„์˜ ๊ต์ฐจ ๊ด€์‹ฌ์‚ฌ(Cross-cutting concerns)๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ, ๊ฒฐํ•ฉ๋„๋ฅผ ๋†’์ด์ง€ ์•Š๊ณ  ์ฃผ์ž…/๊ณต์œ ํ•˜๋Š” ๊ฐ€์žฅ ์ด์ƒ์ ์ธ ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? +- React Compiler๊ฐ€ ํ”„๋กœ์ ํŠธ์— ์„ฑ๊ณต์ ์œผ๋กœ ๋„์ž…๋˜์–ด ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๋กœ์ง(`useMemo`, `useCallback`)์ด ๋Œ€๊ฑฐ ์‚ญ์ œ๋  ๋•Œ, ํ”„๋ก ํŠธ์—”๋“œ ํด๋” ๊ตฌ์กฐ์™€ ์ฝ”๋“œ ์‘์ง‘๋„์— ์–ด๋–ค ํ˜•ํƒœ์˜ ๊ตฌ์กฐ์  ๋ณ€ํ™”๊ฐ€ ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- ์„œ๋ฒ„ ์ƒํƒœ(Server State) ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํด๋ผ์ด์–ธํŠธ ๊ธ€๋กœ๋ฒŒ ์ƒํƒœ(Client State) ๋„๊ตฌ๋ฅผ ์™„๋ฒฝํžˆ ๋ถ„๋ฆฌํ•œ ์•„ํ‚คํ…์ฒ˜์—์„œ, ๋‘ ์ƒํƒœ๊ฐ€ ๋ถˆ๊ฐ€ํ”ผํ•˜๊ฒŒ ๋™๊ธฐํ™”๋˜๊ฑฐ๋‚˜ ์ƒํ˜ธ์ž‘์šฉํ•ด์•ผ ํ•˜๋Š” ์—ฃ์ง€ ์ผ€์ด์Šค๋ฅผ ๊นจ๋—ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š” ํŒจํ„ด์€ ๋ฌด์—‡์ธ๊ฐ€? +- ๋Œ€๊ทœ๋ชจ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ํ™˜๊ฒฝ์—์„œ Micro-Frontends ์•„ํ‚คํ…์ฒ˜์™€ Feature-Sliced Design์€ ์–ด๋–ป๊ฒŒ ํ˜ธํ™˜๋˜๋ฉฐ, ๊ฐ ๋…๋ฆฝ ์„œ๋น„์Šค ๊ฐ„์˜ ์ค‘๋ณต ์ฝ”๋“œ(Shared ๋ ˆ์ด์–ด) ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ํ†ต์ œํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- ๋ณต์žก๋„ ๋†’์€ ์ˆœ์ˆ˜ ํ•จ์ˆ˜ํ˜• React ์ปดํฌ๋„ŒํŠธ์— ์˜์กด์„ฑ ์—ญ์ „ ์›์น™(DIP)์„ ์ ์šฉํ•  ๋•Œ, ์ปจํ…์ŠคํŠธ(Context API)๋‚˜ ํ”„๋กญ ๋“œ๋ฆด๋ง(Prop Drilling)์„ ํ”ผํ•˜๋ฉด์„œ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ˜„๋Œ€์ ์ธ ์ œ์–ด ์—ญ์ „(IoC) ๊ตฌํ˜„ ํŒจํ„ด์€ ๋ฌด์—‡์ด ์žˆ๋Š”๊ฐ€? + +### Practical Application Contexts + +- **Implementation:** ๊ธฐ์ˆ ์  ํŒŒ์ผ ์œ ํ˜•(์ปดํฌ๋„ŒํŠธ, ํ›…) ์ค‘์‹ฌ์˜ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ์—์„œ ๋ฒ—์–ด๋‚˜, `src/features/` ๋‚ด์— ํŠน์ • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง(์˜ˆ: ์žฅ๋ฐ”๊ตฌ๋‹ˆ, ์œ ์ € ํ”„๋กœํ•„)์— ์—ฐ๊ด€๋œ UI, API ํ†ต์‹ , ๋กœ์ปฌ ํ›…์„ ์บก์Аํ™”ํ•˜์—ฌ ๊ตฌํ˜„ํ•œ๋‹ค [5, 11, 57]. +- **System Design:** ๋ชจ๋†€๋ฆฌ์‹ ๊ธ€๋กœ๋ฒŒ ์Šคํ† ์–ด ์„ค๊ณ„ ์ง€์–‘. API ์บ์‹ฑ ๋ฐ ์„œ๋ฒ„ ๋ฐ์ดํ„ฐ๋Š” TanStack Query๋ฅผ ์‚ฌ์šฉํ•ด ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๊ฒฝ๊ณ„๋กœ ๋ถ„๋ฆฌํ•˜๊ณ , ๋‹คํฌ ๋ชจ๋“œ ๊ฐ™์€ ์•ฑ ์„ค์ •์€ Context API๋กœ, ์‹ค์‹œ๊ฐ„ UI ์ƒํƒœ ๋ณ€๊ฒฝ์€ Zustand ๋“ฑ์œผ๋กœ ์ชผ๊ฐœ์–ด ์‹œ์Šคํ…œ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ์ตœ์ ํ™”ํ•œ๋‹ค [20, 21, 24]. +- **Operation / Maintenance:** ๋Ÿฐํƒ€์ž„ ํฌ๋ž˜์‹œ์— ๋Œ€๋น„ํ•˜๊ธฐ ์œ„ํ•ด Error Boundary ์ปดํฌ๋„ŒํŠธ๋ฅผ ์•ฑ์˜ ์ตœ์ƒ๋‹จ๋ฟ ์•„๋‹ˆ๋ผ ๋ถˆ์•ˆ์ •ํ•œ ์„œ๋“œํŒŒํ‹ฐ ์œ„์ ฏ์ด๋‚˜ ๊ฐœ๋ณ„ ๋ผ์šฐํŠธ ๋‹จ์œ„์— ๊ฐ์‹ธ, ํŠน์ • ๋ชจ๋“ˆ์˜ ์—๋Ÿฌ๊ฐ€ ์•ฑ ์ „์ฒด์˜ "ํ™”์ดํŠธ ์Šคํฌ๋ฆฐ" ์žฅ์• ๋กœ ๋ฒˆ์ง€๋Š” ๊ฒƒ์„ ์ฐจ๋‹จํ•œ๋‹ค [58-60]. +- **Learning Path:** React ๊ธฐ์ดˆ ๋ฌธ๋ฒ• ๋ฐ ๋ Œ๋”๋ง ์›๋ฆฌ ํŒŒ์•… -> ์ปดํฌ๋„ŒํŠธ ์žฌ์‚ฌ์šฉ๊ณผ SRP ์›์น™(SOLID) ํ•™์Šต -> ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ํด๋” ๊ตฌ์กฐ ๋ฐ FSD ์ ์šฉ ๋ฐฉ์‹ ์ดํ•ด -> ๋ฒˆ๋“ค ์ตœ์ ํ™” ๋ฐ ๋ Œ๋”๋ง ๋ฆฌํŒฉํ† ๋ง ์Šคํ‚ฌ ํ–ฅ์ƒ์˜ ํ๋ฆ„์œผ๋กœ ์—ญ๋Ÿ‰์„ ๋ฐœ์ „์‹œํ‚จ๋‹ค [6, 17, 25]. +- **My Project Relevance:** ๊ธฐ์กด ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ `components/` ํด๋”์— ์ˆ˜์‹ญ ๊ฐœ์˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฐฉ์น˜๋˜์–ด ์žˆ๊ฑฐ๋‚˜, `useCallback` ๋“ฑ์ด ๊ณผ๋„ํ•˜๊ฒŒ ์‚ฌ์šฉ๋œ ๊ฒฝ์šฐ, ์ด๋ฅผ ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ ๋‹จ์œ„์˜ ํด๋”๋กœ ์žฌ๋ฐฐ์น˜ํ•˜๊ณ  ํ”„๋กœํŒŒ์ผ๋Ÿฌ(Profiler)๋ฅผ ํ†ตํ•ด ์‹ค์ œ ๋ณ‘๋ชฉ ์ง€์ ์„ ์ธก์ •ํ•œ ๋’ค ์ตœ์ ํ™”๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜ ๋ฆฌํŒฉํ† ๋ง์— ์ง๊ฒฐ๋œ๋‹ค [12, 61, 62]. + +### Adjacent Topics + +- [[Micro-Frontends]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋‹จ์ผ React SPA ์•„ํ‚คํ…์ฒ˜์˜ ํ•œ๊ณ„๋ฅผ ๋„˜์–ด, ๋…๋ฆฝ์ ์œผ๋กœ ๋ฐฐํฌ ๋ฐ ๊ด€๋ฆฌ ๊ฐ€๋Šฅํ•œ ์—ฌ๋Ÿฌ ํ”„๋ก ํŠธ์—”๋“œ ํŒ€๊ณผ ์„œ๋น„์Šค๋ฅผ ํ•˜๋‚˜๋กœ ์กฐ์œจํ•˜๋Š” ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ๊ธ‰ ์ธํ”„๋ผ ํ™•์žฅ ๊ด€์ ์œผ๋กœ ์—ฐ๊ฒฐ [3, 63]. +- [[Observability and Monitoring]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ์„ค๊ณ„ํ•œ ์•„ํ‚คํ…์ฒ˜๊ฐ€ ์‹ค์ œ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๊ณ  ์–ด๋””์„œ ๋ณ‘๋ชฉ์„ ์ผ์œผํ‚ค๋Š”์ง€ ์ธก์ •ํ•˜๊ธฐ ์œ„ํ•œ ๊ตฌ์กฐ์  ๋กœ๊น…, ์„ฑ๋Šฅ ํ”„๋กœํŒŒ์ผ๋ง(Web Vitals), ๊ทธ๋ฆฌ๊ณ  Sentry๋ฅผ ํ™œ์šฉํ•œ ์„ธ์…˜ ๋ชจ๋‹ˆํ„ฐ๋ง ๊ธฐ๋ฒ•์œผ๋กœ ํ™•์žฅ [64-66]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Development/React Scalability.md b/10_Wiki/Development/React Scalability.md new file mode 100644 index 00000000..6bd3e18d --- /dev/null +++ b/10_Wiki/Development/React Scalability.md @@ -0,0 +1,67 @@ +# [[React Scalability]] + +## ๐Ÿ“Œ Brief Summary +React Scalability(React ํ™•์žฅ์„ฑ)๋Š” ๊ธฐ๋Šฅ, ํŒ€ ๊ทœ๋ชจ, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์˜ ๋ณต์žก์„ฑ์ด ์ฆ๊ฐ€ํ•จ์— ๋”ฐ๋ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ, ์œ ์ง€๋ณด์ˆ˜์„ฑ, ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ์„ฑ์žฅ์„ ์œ ์ง€ํ•˜๋Š” ๋Šฅ๋ ฅ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋‹จ์ˆœํžˆ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ๊ฒƒ์„ ๋„˜์–ด, ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ณ  ์‘์ง‘๋„๋ฅผ ๋†’์ด๋Š” ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„, ์ƒํƒœ ๊ด€๋ฆฌ์˜ ์ตœ์ ํ™”, ๊ทธ๋ฆฌ๊ณ  ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…๊ณผ ๋ Œ๋”๋ง ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ํฌ๊ด„ํ•ฉ๋‹ˆ๋‹ค. ํ™•์žฅ ๊ฐ€๋Šฅํ•œ React ์‹œ์Šคํ…œ์€ ๋ช…ํ™•ํ•œ ํด๋” ๊ตฌ์กฐ(์˜ˆ: Feature-Sliced Design)์™€ ์—„๊ฒฉํ•œ ๊ด€์‹ฌ์‚ฌ ๋ถ„๋ฆฌ๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ๋ฒ ์ด์Šค๊ฐ€ ์ž์ฒด์ ์ธ ๋ฌด๊ฒŒ๋กœ ์ธํ•ด ๋ถ•๊ดด๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. [1-4] + +## ๐Ÿ“– Core Content +- **์•„ํ‚คํ…์ฒ˜ ๋ฐ ํด๋” ๊ตฌ์กฐ์˜ ์ง„ํ™”:** React๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ฐ•์ œํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ํ”„๋กœ์ ํŠธ๊ฐ€ ์ปค์ง€๋ฉด ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด UI์— ์Šค๋ฉฐ๋“ค๊ณ  ์˜์กด์„ฑ์ด ์—‰ํ‚ค๋Š” ์•„ํ‚คํ…์ฒ˜ ๋ถ•๊ดด๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค [2]. ๊ณผ๊ฑฐ์˜ ํŒŒ์ผ ์œ ํ˜•๋ณ„ ํด๋” ๊ตฌ์กฐ(components, hooks, styles ๋“ฑ)๋Š” ๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค [5, 6]. ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•ด์„œ๋Š” ๋„๋ฉ”์ธ/๊ธฐ๋Šฅ ์ค‘์‹ฌ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” Feature-Based ๊ตฌ์กฐ ๋˜๋Š” **Feature-Sliced Design(FSD)**๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•๋ก ์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค. FSD๋Š” ์•ฑ์„ layers(app, pages, widgets, features, entities, shared)๋กœ ๋‚˜๋ˆ„๊ณ  ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ๊ทœ์น™๊ณผ ํผ๋ธ”๋ฆญ API ์บก์Аํ™”๋ฅผ ๊ฐ•์ œํ•˜์—ฌ ๋ชจ๋“ˆ์˜ ๋…๋ฆฝ์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค [7-11]. +- **ํด๋ฆฐ ์ฝ”๋“œ์™€ ์†Œํ”„ํŠธ์›จ์–ด ์—”์ง€๋‹ˆ์–ด๋ง ์›์น™:** ๋Œ€๊ทœ๋ชจ React ์‹œ์Šคํ…œ์—์„œ๋Š” SOLID, DRY, KISS, YAGNI์™€ ๊ฐ™์€ ์›์น™์ด ์ ์šฉ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)์— ๋”ฐ๋ผ ๊ฑฐ๋Œ€ํ•œ ์ปดํฌ๋„ŒํŠธ๋Š” ์ž‘๊ณ  ์ง‘์ค‘๋œ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ถ„๋ฆฌ๋˜์–ด์•ผ ํ•˜๋ฉฐ [12], DRY ์›์น™์„ ํ†ตํ•ด ๊ณตํ†ต ๋กœ์ง์€ ์ปค์Šคํ…€ ํ›…์œผ๋กœ ์ถ”์ถœํ•˜์—ฌ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค [13]. ๋”๋ถˆ์–ด ํŒŒ์ผ ๋ฐ ์ปดํฌ๋„ŒํŠธ ๋ช…๋ช… ๊ทœ์น™(์˜ˆ: ํŒŒ์ผ์€ kebab-case, ์ปดํฌ๋„ŒํŠธ๋Š” PascalCase)์„ ์ผ๊ด€๋˜๊ฒŒ ์œ ์ง€ํ•˜๊ณ  ESLint๋ฅผ ํ†ตํ•ด ์•„ํ‚คํ…์ฒ˜ ๊ฒฝ๊ณ„๋ฅผ ๊ฐ•์ œํ•˜๋Š” ๊ฒƒ์ด ๋Œ€๊ทœ๋ชจ ํŒ€ ํ˜‘์—…์— ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค [14, 15]. +- **๊ทœ๋ชจ์— ๋”ฐ๋ฅธ ์ƒํƒœ ๊ด€๋ฆฌ ์ „๋žต:** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ปค์ง€๋ฉด ๋‹จ์ผ ์ „์—ญ ์ƒํƒœ๋งŒ์œผ๋กœ๋Š” ๋ถ€์กฑํ•˜๋ฉฐ ์ƒํƒœ์˜ ์—ญํ• ์— ๋”ฐ๋ผ ๋„๊ตฌ๊ฐ€ ๋ถ„๋ฆฌ๋ฉ๋‹ˆ๋‹ค [16]. React์˜ Context API๋Š” ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ ์ „์ฒด๋ฅผ ๋ฆฌ๋ Œ๋”๋ง์‹œํ‚ค๋ฏ€๋กœ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žฆ์€ ์ƒํƒœ ๊ด€๋ฆฌ์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค [17, 18]. ์ค‘๊ฐ„ ๊ทœ๋ชจ์˜ ์•ฑ์—์„œ๋Š” Selector ํŒจํ„ด์„ ํ†ตํ•ด ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ง‰๋Š” Zustand๊ฐ€ ์œ ์šฉํ•˜๋ฉฐ [19-21], 500๊ฐœ ์ด์ƒ์˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žˆ๋Š” ๋Œ€๊ทœ๋ชจ ์•ฑ์ด๋‚˜ ๋น„๋™๊ธฐ ์ž‘์—…์ด ๋ณต์žกํ•œ ๊ฒฝ์šฐ ์ผ๊ด€๋œ ํŒจํ„ด๊ณผ ๊ฐ•๋ ฅํ•œ ๋””๋ฒ„๊น…์„ ์ œ๊ณตํ•˜๋Š” Redux๊ฐ€ ์‚ฐ์—… ํ‘œ์ค€์œผ๋กœ ์ž‘์šฉํ•ฉ๋‹ˆ๋‹ค [22, 23]. ์„œ๋ฒ„ ์ƒํƒœ ๊ด€๋ฆฌ๋Š” TanStack Query(React Query) ๋“ฑ์œผ๋กœ ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ์™€ ๋ถ„๋ฆฌํ•˜์—ฌ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค [20, 24]. +- **์„ฑ๋Šฅ ์—”์ง€๋‹ˆ์–ด๋ง (Performance Optimization):** ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์•ฑ์€ ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ๊ณผ ๋กœ๋”ฉ ์†๋„ ์ตœ์ ํ™”๊ฐ€ ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค. `React.lazy`์™€ ๋™์  ์ž„ํฌํŠธ(Dynamic Imports)๋ฅผ ํ™œ์šฉํ•œ ๋ผ์šฐํŠธ ๋ฐ ์ปดํฌ๋„ŒํŠธ ๋ ˆ๋ฒจ์˜ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…์€ ์ดˆ๊ธฐ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ํš๊ธฐ์ ์œผ๋กœ ์ค„์—ฌ์ค๋‹ˆ๋‹ค [25-27]. ๋˜ํ•œ Vite์˜ `manualChunks`๋ฅผ ์ด์šฉํ•ด ์ž์ฃผ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” Vendor ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ์บ์‹ฑ ํšจ์œจ์„ ๋†’์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค [28-30]. ๋Ÿฐํƒ€์ž„ ์‹œ์—๋Š” ๋Œ€๊ทœ๋ชจ ๋ฆฌ์ŠคํŠธ๋ฅผ ์œ„ํ•œ Virtualization(๊ฐ€์ƒํ™”) ์ฒ˜๋ฆฌ, ์•ˆ์ •์ ์ธ ์ฐธ์กฐ ์œ ์ง€๋ฅผ ์œ„ํ•œ `useCallback`๊ณผ `useMemo` ์‚ฌ์šฉ, ๊ทธ๋ฆฌ๊ณ  React 18์˜ ๋™์‹œ์„ฑ ๊ธฐ๋Šฅ(`useTransition`, `useDeferredValue`)์„ ํ™œ์šฉํ•ด ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์˜ ์‘๋‹ต์„ฑ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค [31-34]. + +## โš–๏ธ Trade-offs & Caveats +- **์•„ํ‚คํ…์ฒ˜์˜ ์˜ค๋ฒ„ํ—ค๋“œ:** Feature-Sliced Design์ด๋‚˜ ๋„๋ฉ”์ธ ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ๋ฅผ ๋„์ž…ํ•˜๋ฉด ์ปดํฌ๋„ŒํŠธ๊ฐ€ '๊ธฐ๋Šฅ'์ธ์ง€ '์œ„์ ฏ'์ธ์ง€ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•œ ์˜๋ฏธ๋ก ์  ๋…ผ์˜๊ฐ€ ํ•„์š”ํ•ด์ง€๋Š” ๋“ฑ ์ดˆ๊ธฐ ํ•™์Šต ๊ณก์„ ๊ณผ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [35, 36]. ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์ด๋Ÿฌํ•œ ๊ตฌ์กฐ๊ฐ€ ์˜คํžˆ๋ ค ๊ณผ๋„ํ•œ ๋ณต์žก์„ฑ(Overkill)์„ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [37]. +- **๋ฉ”๋ชจ์ด์ œ์ด์…˜์˜ ๋น„์šฉ:** `React.memo`, `useMemo`, `useCallback`์„ ๋‚จ์šฉํ•˜๋ฉด ์˜คํžˆ๋ ค ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. React๊ฐ€ ์ด์ „ props๋ฅผ ์ €์žฅํ•˜๊ณ  ๋น„๊ตํ•˜๋Š” ์ž‘์—…์— ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉฐ, ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง ๋น„์šฉ์ด ๋งค์šฐ ์ž‘์€ ๊ฒฝ์šฐ ์ด ๋น„๊ต ์ž‘์—…์ด ๋ Œ๋”๋ง ์ž์ฒด๋ณด๋‹ค ๋” ๋งŽ์€ ๋น„์šฉ์„ ์†Œ๋ชจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [38, 39]. +- **์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ์˜ ์œ ์—ฐ์„ฑ vs ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ:** Zustand์˜ ๊ทน๋‹จ์ ์ธ ์œ ์—ฐ์„ฑ์€ ๊ทœ์œจ ์—†์ด ์‚ฌ์šฉ๋  ๊ฒฝ์šฐ ํŒ€์›๋งˆ๋‹ค ์„œ๋กœ ๋‹ค๋ฅธ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ํŒจํ„ด์„ ์ž‘์„ฑํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๋“ฑ ํ˜ผ๋ž€์„ ์•ผ๊ธฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [19, 40]. ๋ฐ˜๋ฉด Redux๋Š” ์ดˆ๊ธฐ์— ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š” ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ๊ฐ€ ๋งค์šฐ ๋งŽ์•„ ๊ฐœ๋ฐœ ์†๋„๋ฅผ ๋Šฆ์ถ”์ง€๋งŒ, ๋Œ€๊ทœ๋ชจ ํŒ€์—์„œ๋Š” ์˜คํžˆ๋ ค ์ด ๊ตฌ์กฐ๊ฐ€ ๋ฒ„๊ทธ๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ๊ธฐ๋Šฅ์œผ๋กœ ์ž‘์šฉํ•ฉ๋‹ˆ๋‹ค [22, 41]. +- **React Compiler์™€ ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ˜ธํ™˜์„ฑ:** React Compiler๋ฅผ ๋„์ž…ํ•˜๋ฉด ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์˜ ํ•„์š”์„ฑ์„ ํฌ๊ฒŒ ์ค„์ผ ์ˆ˜ ์žˆ์ง€๋งŒ, `useMutation`์ด๋‚˜ `useLocation`์ฒ˜๋Ÿผ ๋ Œ๋”๋ง ์‹œ๋งˆ๋‹ค ์˜๋„์ ์œผ๋กœ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ›…๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์บ์‹ฑ ์ฒด์ธ์ด ๋Š์–ด์ง€๊ณ  ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•˜๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค [42, 43]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] +- [[Feature-Sliced Design]] + - ์—ฐ๊ฒฐ ์ด์œ : React์˜ ํ•œ๊ณ„์ธ ๊ตฌ์ฒด์ ์ธ ์•„ํ‚คํ…์ฒ˜ ๋ถ€์žฌ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์„ค๊ณ„๋œ ๋Œ€๊ทœ๋ชจ ํ”„๋ก ํŠธ์—”๋“œ ๋ฐฉ๋ฒ•๋ก ์ž…๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ ˆ์ด์–ด(Layer) ๊ฐ„์˜ ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ์›์น™๊ณผ Public API๋ฅผ ํ™œ์šฉํ•œ ๋ชจ๋“ˆ์˜ ์บก์Аํ™” ๋ฐ ๊ฒฐํ•ฉ๋„ ์ตœ์†Œํ™” ๋ฐฉ๋ฒ•. +- [[SOLID Principles]] + - ์—ฐ๊ฒฐ ์ด์œ : ํ™•์žฅ ๊ฐ€๋Šฅํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฌ์šด React ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•œ ํ•ต์‹ฌ ์†Œํ”„ํŠธ์›จ์–ด ์—”์ง€๋‹ˆ์–ด๋ง ์›์น™์ž…๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ฑฐ๋Œ€ํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)์— ๋”ฐ๋ผ ์ž‘์€ ๊ธฐ๋Šฅ์œผ๋กœ ๋ถ„๋ฆฌํ•˜๊ณ , ์ปค์Šคํ…€ ํ›…์„ ํ™œ์šฉํ•˜์—ฌ ๋กœ์ง์„ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ตฌ์กฐ์  ์‚ฌ๊ณ . + +#### [๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ] +- [[State Management Libraries (Redux, Zustand, Context API)]] + - ์—ฐ๊ฒฐ ์ด์œ : ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํฌ๊ธฐ์™€ ์ƒํƒœ ์—…๋ฐ์ดํŠธ ๋นˆ๋„์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ๋„๊ตฌ๋ฅผ ์„ ํƒํ•˜๋Š” ๊ฒƒ์€ ํ™•์žฅ์„ฑ์— ์ง€๋Œ€ํ•œ ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง ๋ฐฉ์ง€๋ฅผ ์œ„ํ•œ Selector ํŒจํ„ด์˜ ๋™์ž‘ ์›๋ฆฌ์™€, ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ ๊ฐ•์ œ๋˜๋Š” ์ƒํƒœ ๊ด€๋ฆฌ ์•„ํ‚คํ…์ฒ˜์˜ ์ค‘์š”์„ฑ. +- [[Code Splitting & Lazy Loading]] + - ์—ฐ๊ฒฐ ์ด์œ : ์ฝ”๋“œ๊ฐ€ ๋น„๋Œ€ํ•ด์ง์— ๋”ฐ๋ผ ๋ฐœ์ƒํ•˜๋Š” ์„ฑ๋Šฅ ์ €ํ•˜(๋ฒˆ๋“ค ํฌ๊ธฐ ์ฆ๊ฐ€)๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ํ•ต์‹ฌ ๋Ÿฐํƒ€์ž„ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: `React.lazy`์™€ Vite์˜ `manualChunks`๋ฅผ ์ด์šฉํ•œ ๋ฒˆ๋“ค ํฌ๊ธฐ ์ถ•์†Œ ๋ฐ ๋ธŒ๋ผ์šฐ์ € ์บ์‹ฑ ์ „๋žต. +- [[React Error Boundaries]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋Œ€๊ทœ๋ชจ ์•ฑ์—์„œ ํ•˜๋‚˜์˜ ๊ฒฐํ•จ ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ๋กœ ์ธํ•ด ์ „์ฒด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ถ•๊ดด๋˜๋Š” ๊ฒƒ์„ ๋ง‰์•„์ฃผ๋Š” ์•ˆ์ „ ์žฅ์น˜์ž…๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋Ÿฐํƒ€์ž„ ๋ Œ๋”๋ง ์—๋Ÿฌ๋ฅผ ๊ฒฉ๋ฆฌ(Isolate)ํ•˜๊ณ  ํด๋ฐฑ(Fallback) UI๋ฅผ ์ œ๊ณตํ•˜์—ฌ ์‹œ์Šคํ…œ ๋ณต์›๋ ฅ์„ ๋†’์ด๋Š” ๋ฐฉ๋ฒ•. + +### Deeper Research Questions + +- ๋Œ€๊ทœ๋ชจ ํŒ€ ํ™˜๊ฒฝ์—์„œ Feature-Sliced Design์„ ์ ์šฉํ•  ๋•Œ, 'Shared' ๋ ˆ์ด์–ด๊ฐ€ ๋น„๋Œ€ํ•ด์ง€๊ณ  ๊ธฐ๋Šฅ ๊ฐ„ ๊ต์ฐจ ๊ด€์‹ฌ์‚ฌ(Cross-cutting concerns)๊ฐ€ ์–ฝํžˆ๋Š” ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋Š”๊ฐ€? +- React Context API์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ฆฌ๋ Œ๋”๋ง ํญํฌ(Re-render storm) ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Zustand์˜ Selector ํŒจํ„ด์€ ๋‚ด๋ถ€์ ์œผ๋กœ ๊ตฌ๋…(Subscription) ๋ชจ๋ธ์„ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š”๊ฐ€? +- React Compiler์˜ ์ž๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๊ธฐ๋Šฅ์ด ๋„์ž…๋จ์— ๋”ฐ๋ผ ๊ธฐ์กด ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ๊ธฐ์ˆ  ๋ถ€์ฑ„(์˜ˆ: Rules of React ์œ„๋ฐ˜ ์‚ฌํ•ญ)๋Š” ์ปดํŒŒ์ผ ์ตœ์ ํ™” ๊ณผ์ •์—์„œ ์–ด๋– ํ•œ ๋ถ€์ž‘์šฉ์„ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- Vite์˜ `manualChunks`๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฑฐ๋Œ€ํ•œ ๋ฒˆ๋“ค์„ ๋ถ„๋ฆฌํ•  ๋•Œ, ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(React core, UI Kits ๋“ฑ)์˜ ํŠน์„ฑ์— ๋”ฐ๋ฅธ ์ตœ์ ์˜ ์ฒญํฌ ๋ถ„ํ•  ๋ฐ ๋ธŒ๋ผ์šฐ์ € ์บ์‹ฑ ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? +- ๋Œ€๊ทœ๋ชจ ๋ฆฌ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ Œ๋”๋งํ•  ๋•Œ ๊ฐ€์ƒํ™”(Virtualization)๋ฅผ ์ ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ๋ธŒ๋ผ์šฐ์ € ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น(Detached DOM nodes ๋“ฑ) ์ธก๋ฉด์—์„œ ์–ด๋–ค ์น˜๋ช…์ ์ธ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”๊ฐ€? + +### Practical Application Contexts + +- **Implementation:** ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐ ์„ค์ • ์‹œ ๊ธฐ์ˆ  ํŒŒ์ผ ๋‹จ์œ„(components, hooks) ๊ตฌ์กฐ๋ฅผ ํ”ผํ•˜๊ณ , ๋„๋ฉ”์ธ/๊ธฐ๋Šฅ ์ค‘์‹ฌ์˜ ํด๋” ๊ตฌ์กฐ๋ฅผ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ๋ช…์€ ์šด์˜์ฒด์ œ ๊ฐ„ ์ถฉ๋Œ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด kebab-case๋กœ, ์ปดํฌ๋„ŒํŠธ๋Š” PascalCase๋กœ ์ผ๊ด€๋˜๊ฒŒ ๋ช…๋ช…ํ•ฉ๋‹ˆ๋‹ค. +- **System Design:** ์ „์—ญ ์ƒํƒœ(Zustand/Redux), ์„œ๋ฒ„ ์ƒํƒœ(TanStack Query), ๋กœ์ปฌ ์ƒํƒœ(useState)์˜ ์ฑ…์ž„์„ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์žฆ์€ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ƒํƒœ๋Š” ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ์˜ ์ตœ์ƒ๋‹จ Context์— ๋‘๋Š” ๊ฒƒ์„ ํ”ผํ•ฉ๋‹ˆ๋‹ค. +- **Operation / Maintenance:** Sentry๋‚˜ LogRocket๊ณผ ๊ฐ™์€ ํ”„๋ก ํŠธ์—”๋“œ ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ์™€ React Error Boundaries๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ, ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง ์—๋Ÿฌ๋ฅผ ์บก์ฒ˜ํ•˜๊ณ  ์•ฑ์˜ ํฌ๋ž˜์‹œ๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. +- **Learning Path:** ๋‹จ์ˆœํ•œ React ๋ฌธ๋ฒ• ํ•™์Šต์„ ๋„˜์–ด, ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ๋ณ„ ๋ Œ๋”๋ง ์ตœ์ ํ™” ์ฐจ์ด๋ฅผ ๋ถ„์„ํ•˜๊ณ  Chrome DevTools ํ”„๋กœํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ Œ๋”๋ง ๋ณ‘๋ชฉ์„ ํ™•์ธํ•˜๋Š” ์Šต๊ด€์„ ๊ธธ๋Ÿฌ ์•„ํ‚คํ…ํŠธ ์ˆ˜์ค€์œผ๋กœ ์„ฑ์žฅํ•ฉ๋‹ˆ๋‹ค. +- **My Project Relevance:** ํ˜„์žฌ ์œ ์ง€๋ณด์ˆ˜ ์ค‘์ธ React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฌด๊ฑฐ์šด ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์ธํ•ด ๋ฉ”์ธ ๋ฒˆ๋“ค ํฌ๊ธฐ๊ฐ€ ๋น„๋Œ€ํ•ด์ง„ ์ƒํ™ฉ์ด๋ผ๋ฉด, `React.lazy` ๊ธฐ๋ฐ˜์˜ ๋ผ์šฐํŠธ ๋ ˆ๋ฒจ ์Šคํ”Œ๋ฆฌํŒ…๊ณผ Vite `manualChunks` ์ ์šฉ์„ ๊ฒ€ํ† ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### Adjacent Topics + +- [[Server Components (Next.js)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ํด๋ผ์ด์–ธํŠธ ์ธก์œผ๋กœ ์ „์†ก๋˜๋Š” JavaScript ๋ฒˆ๋“ค ์ž์ฒด๋ฅผ ์ œ๊ฑฐํ•˜์—ฌ ํ•˜์ด๋“œ๋ ˆ์ด์…˜(Hydration) ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ค„์ด๊ณ  ํ™•์žฅ์„ฑ๊ณผ ์„ฑ๋Šฅ์„ ๋™์‹œ์— ์žก๋Š” ์ตœ์‹  ๋ Œ๋”๋ง ํŒจ๋Ÿฌ๋‹ค์ž„. +- [[Memory Leak Detection in JavaScript]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์žฅ์‹œ๊ฐ„ ์‚ฌ์šฉ ์‹œ ์„ฑ๋Šฅ์„ ์ €ํ•˜์‹œํ‚ค๋Š” Detached DOM Nodes๋‚˜ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๋ˆ„์ˆ˜ ๋“ฑ์„ Chrome DevTools Heap Snapshot์„ ํ†ตํ•ด ๋””๋ฒ„๊น…ํ•˜๋Š” ๋ฐฉ๋ฒ•. +- [[Git Branching Workflows for Small & Large Teams]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๊ทœ๋ชจ๊ฐ€ ํ™•์žฅ๋˜๋Š” ํ”„๋ก ํŠธ์—”๋“œ ํŒ€์ด ์ถฉ๋Œ ์—†์ด ์ฝ”๋“œ๋ฅผ ํ†ตํ•ฉํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” GitHub Flow, Trunk-Based Development ๋ฐ PR(Pull Request) ๋ฆฌ๋ทฐ ์—ํ‹ฐ์ผ“. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Development/React.lazy().md b/10_Wiki/Development/React.lazy().md new file mode 100644 index 00000000..afb49c8c --- /dev/null +++ b/10_Wiki/Development/React.lazy().md @@ -0,0 +1,65 @@ +# [[React.lazy()]] + +## ๐Ÿ“Œ Brief Summary +`React.lazy()`๋Š” ๋ฆฌ์•กํŠธ(React)์—์„œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ•„์š”ํ•œ ์‹œ์ ์— ๋™์ ์œผ๋กœ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋‚ด์žฅ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค [1]. ์ด ๊ธฐ๋Šฅ์„ ๋™์  ์ž„ํฌํŠธ(Dynamic Imports)์™€ ๊ฒฐํ•ฉํ•˜๋ฉด ๊ฑฐ๋Œ€ํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค์„ ๋” ์ž‘์€ ์ฒญํฌ(Chunk)๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2, 3]. ๊ฒฐ๊ณผ์ ์œผ๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ์•ฑ์— ์ฒ˜์Œ ์ ‘๊ทผํ•  ๋•Œ ๋‹ค์šด๋กœ๋“œํ•ด์•ผ ํ•˜๋Š” ์ดˆ๊ธฐ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŽ˜์ด๋กœ๋“œ ํฌ๊ธฐ๋ฅผ ๋Œ€ํญ ์ค„์—ฌ ์•ฑ์˜ ์ดˆ๊ธฐ ๋กœ๋“œ ์†๋„์™€ ์ „๋ฐ˜์ ์ธ ์„ฑ๋Šฅ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค [2-4]. + +## ๐Ÿ“– Core Content +* **์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…(Code Splitting)๊ณผ ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ ๊ฐ์†Œ:** + ์ดˆ๊ธฐ ๋กœ๋“œ ์‹œ ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ํ•œ ๋ฒˆ์— ๋ถˆ๋Ÿฌ์˜ค๋ฉด ๋ฒˆ๋“ค ํฌ๊ธฐ๊ฐ€ ๋น„๋Œ€ํ•ด์ ธ ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [5]. `React.lazy()`๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฑฐ๋Œ€ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋ฅผ ์ž˜๊ฒŒ ์ชผ๊ฐœ์–ด, ํŠน์ • ๋ผ์šฐํŠธ๋‚˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง๋  ๋•Œ๋งŒ ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ๋‹ค์šด๋กœ๋“œํ•˜๋„๋ก ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1, 6, 7]. +* **Suspense์™€์˜ ๊ฒฐํ•ฉ:** + `React.lazy()`๋กœ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ปดํฌ๋„ŒํŠธ๋Š” ๋ฐ˜๋“œ์‹œ `` ์ปดํฌ๋„ŒํŠธ๋กœ ๊ฐ์‹ธ์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [1, 3]. ``๋Š” ๋ชจ๋“ˆ์ด ๋กœ๋“œ๋˜๋Š” ๋™์•ˆ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ค„ ๋Œ€์ฒด UI(์˜ˆ: ๋กœ๋”ฉ ์Šคํ”ผ๋„ˆ)๋ฅผ `fallback` ์†์„ฑ์„ ํ†ตํ•ด ์ •์˜ํ•˜์—ฌ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๋งค๋„๋Ÿฝ๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค [1, 3, 8]. +* **์ ์šฉ ๋Œ€์ƒ(Use Cases):** + * **๋ผ์šฐํŠธ ๊ธฐ๋ฐ˜ ์ปดํฌ๋„ŒํŠธ(Route-based components):** ์‚ฌ์šฉ์ž๊ฐ€ ํŠน์ • ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•  ๋•Œ๋งŒ ํ•ด๋‹น ํŽ˜์ด์ง€ ์ฝ”๋“œ๋ฅผ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค [8, 9]. + * **์‚ฌ์šฉ ๋นˆ๋„๊ฐ€ ๋‚ฎ์€ ๋ทฐ:** ๊ด€๋ฆฌ์ž ํ™”๋ฉด์ด๋‚˜ ์„ค์ • ํŒจ๋„์ฒ˜๋Ÿผ ๋“œ๋ฌผ๊ฒŒ ์‚ฌ์šฉ๋˜๋Š” ํ™”๋ฉด์— ์ ์šฉํ•ฉ๋‹ˆ๋‹ค [9]. + * **๋ฌด๊ฑฐ์šด UI ๋ธ”๋ก ๋ฐ ์„œ๋“œํŒŒํ‹ฐ ํ†ตํ•ฉ ๊ธฐ๋Šฅ:** ์ฐจํŠธ, ์ง€๋„, ๋ฆฌ์น˜ ํ…์ŠคํŠธ ์—๋””ํ„ฐ, ๋น„๋””์˜ค ํ”Œ๋ ˆ์ด์–ด ๋“ฑ ์šฉ๋Ÿ‰์ด ํฐ ์œ„์ ฏ์„ ๋ Œ๋”๋งํ•  ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค [3, 9, 10]. +* **๋นŒ๋“œ ๋„๊ตฌ์™€์˜ ์ž๋™ ํ†ตํ•ฉ:** + Vite๋‚˜ Webpack๊ณผ ๊ฐ™์€ ์ตœ์‹  ๋ฒˆ๋“ค๋Ÿฌ๋Š” `React.lazy(() => import('./Component'))` ๋ฌธ๋ฒ•์„ ์ž๋™์œผ๋กœ ์ธ์‹ํ•˜์—ฌ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ณ„๋„์˜ ํŒŒ์ผ(์ฒญํฌ)๋กœ ๋ถ„๋ฆฌํ•ด ์ปดํŒŒ์ผํ•ฉ๋‹ˆ๋‹ค [2, 3, 8]. + +## โš–๏ธ Trade-offs & Caveats +* **์–ด๋ณด๋ธŒ ๋” ํด๋“œ(Above-the-fold) ์š”์†Œ ์ ์šฉ ๊ธˆ์ง€:** ์‚ฌ์šฉ์ž๊ฐ€ ํŽ˜์ด์ง€์— ์ง„์ž…ํ•˜์ž๋งˆ์ž ์ฆ‰์‹œ ๋ณด์•„์•ผ ํ•˜๋Š” ํ•„์ˆ˜์ ์ธ ์ปดํฌ๋„ŒํŠธ๋‚˜ ๋น ๋ฅด๊ฒŒ ๋ Œ๋”๋ง๋˜์–ด์•ผ ํ•˜๋Š” ์š”์†Œ์— `React.lazy()`๋ฅผ ์ ์šฉํ•˜๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค [9]. ์ด๋ฅผ ์ง€์—ฐ ๋กœ๋”ฉํ•  ๊ฒฝ์šฐ ๋ถˆํ•„์š”ํ•œ ๋„คํŠธ์›Œํฌ ์ง€์—ฐ์ด ๋ฐœ์ƒํ•˜์—ฌ ์˜คํžˆ๋ ค ์ฒด๊ฐ ์„ฑ๋Šฅ๊ณผ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์ด ํ•˜๋ฝํ•ฉ๋‹ˆ๋‹ค [9]. +* **๋ ˆ์ด์•„์›ƒ ์‹œํ”„ํŠธ ๋ฐ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ์ €ํ•˜:** ๋น„๋™๊ธฐ ๋กœ๋”ฉ ์ค‘ ``์˜ `fallback`์ด ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚˜๋ฉด์„œ, ๋กœ๋”ฉ์ด ๋๋‚œ ํ›„ ๋ณธ๋ž˜ ์ปดํฌ๋„ŒํŠธ๋กœ ์ „ํ™˜๋  ๋•Œ ๋ ˆ์ด์•„์›ƒ์ด ๋ฐ€๋ฆฌ๊ฑฐ๋‚˜ ๊นœ๋นก๊ฑฐ๋ฆฌ๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1, 11]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] +- [[Code Splitting]] + - ์—ฐ๊ฒฐ ์ด์œ : `React.lazy()`์˜ ์กด์žฌ ๋ชฉ์ ์ด์ž ๊ทผ๋ณธ์ ์ธ ์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค [6]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ดˆ๊ธฐ ๋ Œ๋”๋ง ์‹œ ๋ถˆํ•„์š”ํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ค„์—ฌ ๋กœ๋”ฉ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ์กฐ ์›๋ฆฌ. +- [[Dynamic Imports]] + - ์—ฐ๊ฒฐ ์ด์œ : `React.lazy()` ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋ชจ๋“ˆ์„ ๋กœ๋“œํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ํ‘œ์ค€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฌธ๋ฒ•(`import()`)์ž…๋‹ˆ๋‹ค [2, 3, 8]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํŠน์ • ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜์–ด์•ผ ํ•  ์‹œ์ ์— ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ์ƒ์„ฑํ•˜์—ฌ ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์˜ค๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜. + +#### [๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ] +- [[Suspense]] + - ์—ฐ๊ฒฐ ์ด์œ : `React.lazy()`๋กœ ๋ถ„๋ฆฌ๋œ ์ฝ”๋“œ๊ฐ€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๋‹ค์šด๋กœ๋“œ๋˜๋Š” ๋™์•ˆ ์•ฑ์ด ๋ฉˆ์ถ”์ง€ ์•Š๋„๋ก ๋กœ๋”ฉ UI๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ํ•„์ˆ˜์ ์œผ๋กœ ๊ฒฐํ•ฉ๋˜๋Š” ๋ฆฌ์•กํŠธ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค [1, 3]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋น„๋™๊ธฐ ๋ Œ๋”๋ง ํ๋ฆ„์—์„œ ๋กœ๋”ฉ ์ƒํƒœ(Loading State)๋ฅผ ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ ์ƒ๋‹จ์—์„œ ์„ ์–ธ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•. +- [[Vite/Rollup]] + - ์—ฐ๊ฒฐ ์ด์œ : ์†Œ์Šค ์ฝ”๋“œ์— ์ž‘์„ฑ๋œ `React.lazy()` ๊ตฌ๋ฌธ์„ ๋ถ„์„ํ•˜์—ฌ ๋นŒ๋“œ ํƒ€์ž„์— ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๊ฐœ๋ณ„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ(์ฒญํฌ)๋กœ ๋ถ„ํ• ํ•ด ๋‚ด๋Š” ๋„๊ตฌ๋“ค์ž…๋‹ˆ๋‹ค [2, 8]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ชจ๋“ˆ ๋ฒˆ๋“ค๋Ÿฌ๊ฐ€ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…์„ ์ธ์‹ํ•˜๊ณ  ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์˜ ์ •์  ์—์…‹์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์บ์‹ฑ ํšจ์œจ์„ ๋†’์ด๋Š” ๊ณผ์ •. + +### Deeper Research Questions +- `React.lazy()`๋ฅผ ํ™œ์šฉํ•œ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…๊ณผ ์„œ๋ฒ„ ์‚ฌ์ด๋“œ์—์„œ ์ด๋ฃจ์–ด์ง€๋Š” [[React Server Components]]์˜ ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ฐฉ์‹์€ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅด๋ฉฐ ์„œ๋กœ ์–ด๋–ป๊ฒŒ ๋ณด์™„๋  ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- ``๋กœ ๊ฐ์‹ธ์ง„ ์ง€์—ฐ ๋กœ๋”ฉ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋กœ๋“œ๋  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” Cumulative Layout Shift (CLS)๋ฅผ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•œ ๊ตฌ์ฒด์ ์ธ UI ํŒจํ„ด๊ณผ ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? +- ๋ชจ๋ฐ”์ผ ํ™˜๊ฒฝ ๋“ฑ ๋„คํŠธ์›Œํฌ ์†๋„๊ฐ€ ๋А๋ฆฐ ๊ณณ์—์„œ `React.lazy()`๋กœ ๋ถ„๋ฆฌ๋œ ์ฒญํฌ๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ๋•Œ, ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ(์˜ˆ: ๋ฐฐํฌ ํ›„ ์ด์ „ ํ•ด์‹œ ์ฒญํฌ ์‚ญ์ œ๋จ) ์ด๋ฅผ Error Boundary๋กœ ์–ด๋–ป๊ฒŒ ์šฐ์•„ํ•˜๊ฒŒ ๋ณต๊ตฌํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- ์‚ฌ์šฉ์ž๊ฐ€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์š”์ฒญํ•˜๊ธฐ ์ „(์˜ˆ: ๋งํฌ์— ๋งˆ์šฐ์Šค๋ฅผ ์˜ฌ๋ฆฌ๋Š” ์‹œ์ )์— `React.lazy()`๋กœ ๋ถ„๋ฆฌ๋œ ์ฒญํฌ๋ฅผ ๋ฏธ๋ฆฌ ๊ฐ€์ ธ์˜ค๋Š” ํ”„๋ฆฌํŒจ์น˜(Prefetching/Preloading) ์ „๋žต์€ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•˜๋Š”๊ฐ€? +- Vite์˜ `manualChunks` ์„ค์ •๊ณผ `React.lazy()`๋ฅผ ๋™์‹œ์— ํ™œ์šฉํ•˜์—ฌ, ํ•ต์‹ฌ ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์บ์‹ฑ๊ณผ ํŽ˜์ด์ง€๋ณ„ ์ง€์—ฐ ๋กœ๋”ฉ์„ ๊ฒฐํ•ฉํ•˜๋Š” ์ตœ์ ์˜ ๋นŒ๋“œ ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? + +### Practical Application Contexts +- **Implementation:** React ์ฝ”๋“œ ์ƒ๋‹จ์— ๋ชจ๋“ˆ์„ ์ •์  ์ž„ํฌํŠธํ•˜๋Š” ๋Œ€์‹ , `const LazyComponent = React.lazy(() => import('./LazyComponent'))`๋กœ ์„ ์–ธํ•˜๊ณ , ๋ Œ๋” ํŠธ๋ฆฌ์— ์‚ฌ์šฉํ•  ๋•Œ `}> ` ํ˜•ํƒœ๋กœ ๊ฐ์‹ธ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค [1, 3]. +- **System Design:** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ผ์šฐํŒ… ๋ ˆ์ด์–ด ์„ค๊ณ„ ์‹œ, ๋ชจ๋“  ๋ผ์šฐํŠธ๋ฅผ ์ดˆ๊ธฐ ๋ฒˆ๋“ค์— ๋ฌถ์ง€ ์•Š๊ณ  ๊ฐ ํŽ˜์ด์ง€ ๋˜๋Š” ๋ฌด๊ฑฐ์šด ์ฐจํŠธ/์—๋””ํ„ฐ์™€ ๊ฐ™์€ ๋…๋ฆฝ์  ๋„๋ฉ”์ธ์„ ๋ถ„๋ฆฌํ•˜๋Š” ๊ธฐ์ค€์œผ๋กœ ์„ค๊ณ„ ๊ธฐ์ค€์„ ์ˆ˜๋ฆฝํ•ฉ๋‹ˆ๋‹ค [8, 9]. +- **Operation / Maintenance:** `rollup-plugin-visualizer`๋‚˜ Webpack Bundle Analyzer ๋“ฑ์˜ ๋„๊ตฌ๋ฅผ ์ด์šฉํ•ด ๋นŒ๋“œ ํ›„ 500KB๊ฐ€ ๋„˜์–ด๊ฐ€๋Š” ํฐ ์ฒญํฌ(Large chunks)๊ฐ€ ์žˆ๋Š”์ง€ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ , ๋ฐœ๊ฒฌ ์‹œ `React.lazy()`๋ฅผ ์‚ฌ์šฉํ•ด ์ง€์—ฐ ๋กœ๋”ฉ ๊ฐ€๋Šฅํ•œ ๋ถ€๋ถ„์œผ๋กœ ์ž˜๋ผ๋ƒ…๋‹ˆ๋‹ค [7, 12, 13]. +- **Learning Path:** React ์ปดํฌ๋„ŒํŠธ ์ƒ๋ช…์ฃผ๊ธฐ์™€ ๋ Œ๋”๋ง์— ๋Œ€ํ•œ ์ดํ•ด โ†’ ๋ฒˆ๋“ค ํฌ๊ธฐ๊ฐ€ ์„ฑ๋Šฅ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ ํŒŒ์•… โ†’ `React.lazy`์™€ `Suspense`๋ฅผ ํ†ตํ•œ ํด๋ผ์ด์–ธํŠธ ๋กœ๋”ฉ ์ตœ์ ํ™” โ†’ ๋” ๋‚˜์•„๊ฐ€ ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง(SSR) ๋ฐ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋กœ ํ™•์žฅํ•˜๋Š” ๊ฒฝ๋กœ๋กœ ํ•™์Šต์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค. +- **My Project Relevance:** ํ˜„์žฌ ์œ ์ง€๋ณด์ˆ˜ ์ค‘์ธ ํ”„๋กœ์ ํŠธ์— ๋ชจ๋‹ฌ, ์–ด๋“œ๋ฏผ ์„ค์ • ํŒจ๋„ ๋“ฑ ์ฆ‰์‹œ ๋ณด์ด์ง€ ์•Š๋Š” ์ปดํฌ๋„ŒํŠธ๋“ค์ด ๋ฉ”์ธ ๋ฒˆ๋“ค์— ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋ฉด, ์ด๋ฅผ `React.lazy()`๋กœ ๋ฆฌํŒฉํ† ๋งํ•˜์—ฌ Time To Interactive (TTI) ์ง€ํ‘œ๋ฅผ ๋‹น์žฅ ๊ฐœ์„ ํ•˜๋Š” ๋ฐ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### Adjacent Topics +- [[Core Web Vitals]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: `React.lazy()`๋ฅผ ์ ์šฉํ–ˆ์„ ๋•Œ First Contentful Paint (FCP)์™€ Interaction to Next Paint (INP) ๊ฐ™์€ ๊ตฌ๊ธ€์˜ ์›น ์„ฑ๋Šฅ ์ง€ํ‘œ๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ฐœ์„ ๋˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์—ฐ๊ตฌ ํ™•์žฅ [1, 5]. +- [[manualChunks]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: `React.lazy()`์— ์˜ํ•œ ์Šคํ”Œ๋ฆฌํŒ… ์™ธ์—, React ์ฝ”์–ด๋‚˜ ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค(vendor)์„ ๋ณ„๋„ ๋ถ„๋ฆฌํ•ด ๋ธŒ๋ผ์šฐ์ € ์บ์‹ฑ์„ ๊ณ ๋„ํ™”ํ•˜๋Š” ๋นŒ๋“œ ๋„๊ตฌ ์ˆ˜์ค€์˜ ์ˆ˜๋™ ์ œ์–ด ๊ธฐ๋ฒ• ํŒŒ์•… [8, 14]. +- [[React Server Components (RSC)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ํด๋ผ์ด์–ธํŠธ๋กœ ์•„์˜ˆ ๋ณด๋‚ด์ง€ ์•Š๊ณ  ์„œ๋ฒ„์—์„œ ๋ Œ๋”๋งํ•˜์—ฌ ์„ฑ๋Šฅ์„ ๊ทน๋Œ€ํ™”ํ•˜๋Š” ์ตœ์‹  Next.js ํŒจ๋Ÿฌ๋‹ค์ž„๊ณผ ํด๋ผ์ด์–ธํŠธ ๋‹จ์˜ `React.lazy`๋ฅผ ๋น„๊ต [9, 15]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Development/Real User Monitoring (RUM).md b/10_Wiki/Development/Real User Monitoring (RUM).md new file mode 100644 index 00000000..fafa3074 --- /dev/null +++ b/10_Wiki/Development/Real User Monitoring (RUM).md @@ -0,0 +1,62 @@ +# [[Real User Monitoring (RUM)]] + +## ๐Ÿ“Œ Brief ์‹œ Summary +Real User Monitoring (RUM)์€ ๋‹ค์–‘ํ•œ ๊ธฐ๊ธฐ์™€ ๋„คํŠธ์›Œํฌ ์กฐ๊ฑด์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ๊ฒฝํ—˜ํ•˜๋Š” ์‹ค์ œ ์„ฑ๋Šฅ๊ณผ ์ƒํ˜ธ์ž‘์šฉ์„ ์ถ”์ ํ•˜๋Š” ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค [1]. ํ•ฉ์„ฑ ํ…Œ์ŠคํŠธ(Synthetic testing)๊ฐ€ ๋†“์น  ์ˆ˜ ์žˆ๋Š” ์‹ค์ œ ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ํŒŒ์•…ํ•˜๋Š” ๋ฐ ํ•„์ˆ˜์ ์ด๋ฉฐ [1], ํ”„๋ก ํŠธ์—”๋“œ์˜ ์‚ฌ์šฉ์ž ์•ก์…˜๊ณผ ๋ฐฑ์—”๋“œ์˜ ์ธํ”„๋ผ ํŠธ๋ ˆ์ด์Šค๋ฅผ ์—ฐ๊ฒฐํ•˜์—ฌ ์ „์ฒด ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ๊ฐ€์‹œ์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [2]. + +## ๐Ÿ“– Core Content +* **์‹ค์ œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ์ถ”์ :** RUM์€ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์ด๋‚˜ ์ธ์œ„์ ์ธ ํ•ฉ์„ฑ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์—์„œ๋Š” ํฌ์ฐฉํ•˜๊ธฐ ์–ด๋ ค์šด ๋‹ค์–‘ํ•œ ๊ธฐ๊ธฐ, ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ ๋ฐ ๋„คํŠธ์›Œํฌ ์กฐ๊ฑด์—์„œ์˜ ์‹ค์ œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค [1]. ์ด๋ฅผ ํ†ตํ•ด ํŠน์ • ๊ธฐ๊ธฐ๋‚˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ๋งŒ ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3]. +* **์—”๋“œํˆฌ์—”๋“œ(End-to-End) ํŠธ๋ ˆ์ด์‹ฑ:** Datadog RUM ๋“ฑ์˜ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ ๊ฐ„์˜ ๋ชจ๋‹ˆํ„ฐ๋ง ๊ฒฉ์ฐจ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋ก ํŠธ์—”๋“œ์—์„œ ๋ฐœ์ƒํ•œ ์—๋Ÿฌ๋ฅผ ํด๋ฆญํ•˜๋ฉด, ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฐ ์„œ๋“œํŒŒํ‹ฐ API์— ์ด๋ฅด๋Š” ์ „์ฒด ์š”์ฒญ ๊ณผ์ •์„ ๋ถ„์‚ฐ ํŠธ๋ ˆ์ด์‹ฑ(Distributed tracing)์„ ํ†ตํ•ด ์ถ”์ ํ•  ์ˆ˜ ์žˆ์–ด ๋ณต์žกํ•œ ์‹œ์Šคํ…œ์˜ ๋””๋ฒ„๊น…์„ ๋•์Šต๋‹ˆ๋‹ค [2]. +* **ํ†ตํ•ฉ ๊ด€์ธก์„ฑ(Unified Observability):** ์ตœ์‹  ๋ชจ๋‹ˆํ„ฐ๋ง ํ”Œ๋žซํผ์—์„œ RUM์€ ํ”„๋ก ํŠธ์—”๋“œ์˜ ์˜ค๋ฅ˜ ๋กœ๊ทธ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ธํ”„๋ผ ๋ชจ๋‹ˆํ„ฐ๋ง, ๋ฐฑ์—”๋“œ APM(Application Performance Monitoring) ๋“ฑ๊ณผ ํ•œ๊ณณ์—์„œ ๊ฒฐํ•ฉ๋˜์–ด ํ™œ์šฉ๋ฉ๋‹ˆ๋‹ค [4]. +* **๋น„์šฉ ๋ฐ ๋ผ์ด์„ ์Šค ๋ชจ๋ธ:** 1,000๋ช…์˜ ์œ ์ €๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•  ๋•Œ ๊ธฐ๋ณธ์ ์ธ RUM ๊ธฐ๋Šฅ์€ ์›” $15~$30 ์ˆ˜์ค€์œผ๋กœ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์œผ๋‚˜, ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘๋Ÿ‰์— ๋”ฐ๋ผ ๋น„์šฉ์ด ์ฒญ๊ตฌ๋˜๋Š” ์‚ฌ์šฉ๋Ÿ‰ ๊ธฐ๋ฐ˜ ๊ฐ€๊ฒฉ ์ •์ฑ…์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค [5]. + +## โš–๏ธ Trade-offs & Caveats +* **๋ฐ์ดํ„ฐ ๊ทœ๋ชจ์— ๋”ฐ๋ฅธ ๊ณผ๋„ํ•œ ๋น„์šฉ ์ฒญ๊ตฌ:** RUM ํ”Œ๋žซํผ(์˜ˆ: Datadog)์€ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘(Ingest)๊ณผ ๊ฒ€์ƒ‰์„ ์œ„ํ•œ ์ธ๋ฑ์‹ฑ(Index)์„ ๋ถ„๋ฆฌํ•˜์—ฌ ์š”๊ธˆ์„ ๋ถ€๊ณผํ•˜๋Š” '์ด์ค‘ ์š”๊ธˆ์ œ'๋ฅผ ์ฑ„ํƒํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ํŠธ๋ž˜ํ”ฝ์ด ๋†’์€ ์„œ๋น„์Šค์—์„œ๋Š” ๋น„์šฉ์ด ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ์ฆ๊ฐ€ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋กœ ์ธํ•ด ๋น„์šฉ ์ ˆ๊ฐ์„ ์œ„ํ•ด ๋กœ๊ทธ์˜ 20%๋งŒ ์ธ๋ฑ์‹ฑํ•˜๊ฒŒ ๋˜๋ฉด ์žฅ์•  ๋ฐœ์ƒ ์‹œ 80%์˜ ์ฃผ์š” ๋””๋ฒ„๊น… ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์—†๋Š” ์ƒํ™ฉ์— ๋†“์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5, 6]. +* **ํ”„๋ผ์ด๋ฒ„์‹œ ๋ฐ ๋ณด์•ˆ ๋ฌธ์ œ:** ์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด(Session replay) ๋“ฑ ์‚ฌ์šฉ์ž์˜ ๋ชจ๋“  ํ–‰๋™์„ ๊ธฐ๋กํ•˜๋Š” RUM ๋„๊ตฌ๋Š” ๋ฏผ๊ฐํ•œ ๊ฐœ์ธ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ํ•  ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์—„๊ฒฉํ•ด์ง€๋Š” ๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ ๊ทœ์ œ๋ฅผ ์ค€์ˆ˜ํ•˜๊ธฐ ์œ„ํ•ด ๋ฏผ๊ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ž๋™ ๋งˆ์Šคํ‚นํ•˜๋„๋ก ์„ค์ •ํ•˜๋Š” ๋ฐ ๋งŽ์€ ์‹œ๊ฐ„์ด ์†Œ์š”๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [7-9]. +* **์ดˆ๊ธฐ ๋กœ๋“œ ์„ฑ๋Šฅ ์ €ํ•˜ (์„ฑ๋Šฅ ์˜ค๋ฒ„ํ—ค๋“œ):** ํ”„๋ก ํŠธ์—”๋“œ์— ์‚ฝ์ž…๋˜๋Š” RUM ์ถ”์  ์Šคํฌ๋ฆฝํŠธ๋Š” ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ฆ๊ฐ€์‹œํ‚ต๋‹ˆ๋‹ค. ์ผ๋ถ€ ๋„๊ตฌ์˜ ๊ฒฝ์šฐ ๋กœ๋“œ ์‹œ๊ฐ„์„ ์ตœ๋Œ€ 120ms๊นŒ์ง€ ์ง€์—ฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, 1์ดˆ๊ฐ€ ์ค‘์š”ํ•œ ์ด์ปค๋จธ์Šค ๋“ฑ์˜ ์‚ฌ์ดํŠธ์—์„œ๋Š” ๊ฒฝ๋Ÿ‰ํ™”๋œ ์˜ต์…˜์„ ์‹ ์ค‘ํžˆ ์„ ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [10]. +* **๋„์ž… ๋ฐ ํ•™์Šต ๊ณก์„ :** ํ’€์Šคํƒ ๊ด€์ธก ํ”Œ๋žซํผ๊ณผ ๊ฒฐํ•ฉ๋œ RUM ๋„๊ตฌ๋Š” ๋‹จ์ˆœ ํ”„๋ก ํŠธ์—”๋“œ ๋กœ๊น…๋งŒ ํ•„์š”ํ•œ ์ž‘์€ ํŒ€์—๊ฒŒ๋Š” ์ง€๋‚˜์นœ ์˜ค๋ฒ„์—”์ง€๋‹ˆ์–ด๋ง(Overkill)์ด ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ „์ฒด ํ”Œ๋žซํผ์„ ์ดํ•ดํ•˜๋Š” ๋ฐ ๊ฐ€ํŒŒ๋ฅธ ํ•™์Šต ๊ณก์„ ์ด ์š”๊ตฌ๋ฉ๋‹ˆ๋‹ค [6, 11]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [๊ด€๊ณ„ ์œ ํ˜• A (์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ )] +- [[Synthetic Testing]] + - ์—ฐ๊ฒฐ ์ด์œ : RUM๊ณผ ๋Œ€๋น„๋˜๋Š” ๋ชจ๋‹ˆํ„ฐ๋ง ๊ฐœ๋…์œผ๋กœ, ๊ฐ€์ƒ ํ™˜๊ฒฝ์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜์—ฌ ์ธก์ •ํ•ฉ๋‹ˆ๋‹ค [1]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๋ฐ์ดํ„ฐ์™€ ์‹ค์ œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜(RUM) ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ƒํ˜ธ๋ณด์™„์ ์œผ๋กœ ์ž‘์šฉํ•˜์—ฌ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ์ฐพ์•„๋‚ด๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[Distributed Tracing]] + - ์—ฐ๊ฒฐ ์ด์œ : RUM ๋„๊ตฌ๊ฐ€ ํ”„๋ก ํŠธ์—”๋“œ์˜ ์‚ฌ์šฉ์ž ๋™์ž‘์„ ๋ฐฑ์—”๋“œ์˜ ์„œ๋น„์Šค ์š”์ฒญ๊ณผ ์—ฐ๊ด€ ์ง“๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ํ•ต์‹ฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค [2, 4, 12]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜ ํ™˜๊ฒฝ์—์„œ ํด๋ผ์ด์–ธํŠธ ์—๋Ÿฌ์˜ ๊ทผ๋ณธ ์›์ธ์„ ๋ฐฑ์—”๋“œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋‚˜ ์™ธ๋ถ€ API๊นŒ์ง€ ์–ด๋–ป๊ฒŒ ์ถ”์ ํ•˜๋Š”์ง€ ์›๋ฆฌ๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[Core Web Vitals]] + - ์—ฐ๊ฒฐ ์ด์œ : RUM์„ ํ†ตํ•ด ์ฃผ๋กœ ์ธก์ •ํ•˜๊ณ  ์ตœ์ ํ™”ํ•˜๋ ค๋Š” ๋Œ€์ƒ์ธ ์‹ค์ œ ์‚ฌ์šฉ์ž ์ค‘์‹ฌ์˜ ๋กœ๋”ฉ ์†๋„, ์ƒํ˜ธ์ž‘์šฉ, ์‹œ๊ฐ์  ์•ˆ์ •์„ฑ ์ง€ํ‘œ์ž…๋‹ˆ๋‹ค [13, 14]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: RUM ๋ฐ์ดํ„ฐ๊ฐ€ ์›น ์„ฑ๋Šฅ ์ตœ์ ํ™”์˜ ๊ธฐ์ค€(LCP, FID, CLS, INP)๊ณผ ์–ด๋–ป๊ฒŒ ๋งคํ•‘๋˜์–ด ์‚ฌ์šฉ์ž ๊ฒฝํ—˜(UX)์„ ์ˆ˜์น˜ํ™”ํ•˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +#### [๊ด€๊ณ„ ์œ ํ˜• B (๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ)] +- [[Datadog RUM]] + - ์—ฐ๊ฒฐ ์ด์œ : ์†Œ์Šค์—์„œ ์—”๋“œํˆฌ์—”๋“œ ํ”„๋ก ํŠธ์—”๋“œ-๋ฐฑ์—”๋“œ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์—ฐ๊ฒฐํ•ด ์ฃผ๋Š” ๋Œ€ํ‘œ์ ์ธ RUM ํ”Œ๋žซํผ์œผ๋กœ ์†Œ๊ฐœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค [2]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋Œ€๊ทœ๋ชจ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์—์„œ RUM์„ ํ™œ์šฉํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ์‚ฌ๋ก€์™€, ์ธ๋ฑ์‹ฑ ๋น„์šฉ ์ตœ์ ํ™”(Trade-off) ์ „๋žต์˜ ์ค‘์š”์„ฑ์„ ํ•™์Šตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[Session Replay]] + - ์—ฐ๊ฒฐ ์ด์œ : ์‚ฌ์šฉ์ž์˜ ์ƒํƒœ ๋ณ€๊ฒฝ, ์ฝ˜์†” ๋กœ๊ทธ, ๋„คํŠธ์›Œํฌ ์š”์ฒญ ๋“ฑ์„ ๋งˆ์น˜ ํ™”๋ฉด ๋…นํ™”์ฒ˜๋Ÿผ ์žฌํ˜„ํ•˜๋Š” RUM์˜ ๊ณ ๊ธ‰ ๋””๋ฒ„๊น… ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค [7, 12, 15]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์Šคํƒ ํŠธ๋ ˆ์ด์Šค๋งŒ์œผ๋กœ ์ฐพ๊ธฐ ํž˜๋“  ๋ณต์žกํ•œ ์‚ฌ์šฉ์ž ์ƒํ˜ธ์ž‘์šฉ ์˜ค๋ฅ˜์˜ ๋””๋ฒ„๊น… ๋ฐฉ๋ฒ•๋ก ๊ณผ ์ด์— ๋”ฐ๋ฅธ ํ”„๋ผ์ด๋ฒ„์‹œ ์„ค์ •์˜ ์ค‘์š”์„ฑ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### Deeper Research Questions +- ๊ฐ€์ƒ ํ™˜๊ฒฝ์˜ ์„ฑ๋Šฅ์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜๋Š” ํ•ฉ์„ฑ ํ…Œ์ŠคํŠธ(Synthetic Testing)์™€ ๋น„๊ตํ•  ๋•Œ, RUM๋งŒ์ด ๋…์ ์ ์œผ๋กœ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š” ์‹ค์ œ ๊ธฐ๊ธฐ/๋„คํŠธ์›Œํฌ ๊ธฐ๋ฐ˜์˜ ์„ฑ๋Šฅ ์ด์Šˆ ํŒจํ„ด์€ ๋ฌด์—‡์ธ๊ฐ€? +- Datadog๊ณผ ๊ฐ™์€ RUM ์†”๋ฃจ์…˜์„ ํ™œ์šฉํ•  ๋•Œ, ๋Œ€๊ทœ๋ชจ ํŠธ๋ž˜ํ”ฝ ํ•˜์—์„œ ๊ฐ€์‹œ์„ฑ ์†์‹ค ์—†์ด ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘(Ingest)๊ณผ ์ธ๋ฑ์‹ฑ(Indexing) ๋น„์šฉ์˜ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๋ฅผ ๊ทน๋ณตํ•  ์ˆ˜ ์žˆ๋Š” ๋กœ๊ทธ ํ•„ํ„ฐ๋ง ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? +- RUM ์—์ด์ „ํŠธ์˜ ์‚ฝ์ž…์ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค ํฌ๊ธฐ ๋ฐ ์ดˆ๊ธฐ ํŽ˜์ด์ง€ ๋กœ๋“œ ์†๋„(์ตœ๋Œ€ 120ms ์ถ”๊ฐ€)์— ๋ฏธ์น˜๋Š” ์„ฑ๋Šฅ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ตœ์†Œํ™”ํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? +- ๊ธ€๋กœ๋ฒŒ ํ”„๋ผ์ด๋ฒ„์‹œ ๊ทœ์ œ๋ฅผ ์ค€์ˆ˜ํ•˜๋ฉด์„œ Session Replay๋ฅผ ํฌํ•จํ•œ RUM ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ธฐ ์œ„ํ•ด, ๋ฏผ๊ฐํ•œ DOM ์š”์†Œ๋‚˜ ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ์–ด๋–ป๊ฒŒ ํšจ๊ณผ์ ์œผ๋กœ ๋งˆ์Šคํ‚น(Masking)ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- ํ”„๋ก ํŠธ์—”๋“œ React ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฐœ์ƒํ•œ ์—๋Ÿฌ๋ฅผ RUM ๋ฐ์ดํ„ฐ์™€ ๊ฒฐํ•ฉํ•˜๊ณ , ๋ฐฑ์—”๋“œ์˜ OpenTelemetry ๋ถ„์‚ฐ ํŠธ๋ ˆ์ด์Šค์™€ ์—ฐ๊ฒฐ(Trace ID ๊ณต์œ  ๋“ฑ)ํ•˜์—ฌ ์ „์ฒด ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ํ๋ฆ„์—์„œ ๊ทผ๋ณธ ์›์ธ์„ ํŒŒ์•…ํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ• ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? + +### Practical Application Contexts +- **Implementation:** React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์—”ํŠธ๋ฆฌ ํฌ์ธํŠธ์— Datadog์ด๋‚˜ Sentry์™€ ๊ฐ™์€ RUM ๋ชจ๋‹ˆํ„ฐ๋ง SDK๋ฅผ ํ†ตํ•ฉํ•˜๊ณ , Core Web Vitals ๋ฐ ์„ธ์…˜๋ณ„ ์„ฑ๋Šฅ ์ง€ํ‘œ๋ฅผ ์ž๋™์œผ๋กœ ์ˆ˜์ง‘ํ•˜๋„๋ก ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค. +- **System Design:** ์‚ฌ์šฉ์ž์˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ฐœ์ƒํ•œ ํ”„๋ก ํŠธ์—”๋“œ ๋กœ๊ทธ์™€ API ์š”์ฒญ ํ—ค๋”์— ํŠธ๋ ˆ์ด์Šค ID๋ฅผ ์‚ฝ์ž…ํ•˜์—ฌ, ๋ฐฑ์—”๋“œ ๋กœ๊น… ์‹œ์Šคํ…œ๊ณผ ๋งค์นญ์‹œํ‚ค๋Š” '์—”๋“œํˆฌ์—”๋“œ(End-to-End) ๋ชจ๋‹ˆํ„ฐ๋ง ์•„ํ‚คํ…์ฒ˜'๋ฅผ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค. +- **Operation / Maintenance:** ์›”๋ณ„ ๋ชจ๋‹ˆํ„ฐ๋ง ๋น„์šฉ(ํŠนํžˆ ๋ฐ์ดํ„ฐ ์ธ๋ฑ์‹ฑ ๋น„์šฉ)์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ์ด๋ฒคํŠธ๋Š” ์ƒ˜ํ”Œ๋งํ•˜๊ณ , ๋ฐ์ดํ„ฐ ๋งˆ์Šคํ‚น ๊ทœ์น™์„ ์ง€์†์ ์œผ๋กœ ๊ด€๋ฆฌํ•ด GDPR ๋“ฑ์˜ ๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ ์ •์ฑ…์„ ์œ„๋ฐ˜ํ•˜์ง€ ์•Š๋„๋ก ์œ ์ง€๋ณด์ˆ˜ํ•ฉ๋‹ˆ๋‹ค. +- **Learning Path:** ๋จผ์ € React์˜ ๊ธฐ๋ณธ ์—๋Ÿฌ ์ฒ˜๋ฆฌ(Error Boundaries)์™€ ๋ธŒ๋ผ์šฐ์ € DevTools๋ฅผ ์‚ฌ์šฉํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ์ธก์ •์„ ์ตํžŒ ํ›„, ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์˜ ์‹ค์‹œ๊ฐ„ ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๋Š” RUM๊ณผ ๋ฐฑ์—”๋“œ ๋ถ„์‚ฐ ํŠธ๋ ˆ์ด์‹ฑ์„ ํ•™์Šตํ•˜์—ฌ ํ’€์Šคํƒ ๊ด€์ธก์„ฑ(Observability) ์—ญ๋Ÿ‰์„ ๊ธฐ๋ฆ…๋‹ˆ๋‹ค. +- **My Project Relevance:** ํ˜„์žฌ ์ง„ํ–‰ ์ค‘์ธ ํ”„๋ก ํŠธ์—”๋“œ ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉ์ž ์ดํƒˆ๋ฅ ์ด ๋†’์€ ํŠน์ • ํ™”๋ฉด์˜ ๋ณ‘๋ชฉ ์ง€์ ์„ ์ฐพ๊ธฐ ์œ„ํ•ด, RUM์„ ์ ์šฉํ•˜์—ฌ ์‹ค์ œ ๋ชจ๋ฐ”์ผ ๊ธฐ๊ธฐ์™€ 3G/LTE ํ™˜๊ฒฝ์—์„œ์˜ INP(Interaction to Next Paint)์™€ ๋ Œ๋”๋ง ์ง€์—ฐ์„ ์ธก์ • ๋ฐ ๊ฐœ์„ ํ•  ๋•Œ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค. + +### Adjacent Topics +- [[OpenTelemetry]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ํŠน์ • ๋ฒค๋”์— ์ข…์†๋˜์ง€ ์•Š๊ณ (No vendor lock-in) ์˜คํ”ˆ ์Šคํƒ ๋‹ค๋“œ ํ”„๋กœํ† ์ฝœ์„ ์ด์šฉํ•ด RUM, ๋ฉ”ํŠธ๋ฆญ, ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ  ๋ฐฑ์—”๋“œ์™€ ์—ฐ๊ฒฐํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜๋กœ ์ง€์‹์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [16, 17]. +- [[Error Boundaries]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์—์„œ UI ๋ Œ๋”๋ง ์ค‘ ๋ฐœ์ƒํ•˜๋Š” ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๋ฅผ ์บก์ฒ˜ํ•˜์—ฌ ์ „์ฒด ์•ฑ์˜ ํฌ๋ž˜์‹œ๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ๊ฐœ๋…์œผ๋กœ, ์—ฌ๊ธฐ์„œ ํฌ์ฐฉ๋œ ์—๋Ÿฌ๋ฅผ RUM ์‹œ์Šคํ…œ์— ๋ณด๊ณ ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์—ฐ๊ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [18-20]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Development/Redux.md b/10_Wiki/Development/Redux.md new file mode 100644 index 00000000..332910b5 --- /dev/null +++ b/10_Wiki/Development/Redux.md @@ -0,0 +1,53 @@ +# [[Redux]] + +## ๐Ÿ“Œ Brief Summary +Redux๋Š” ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ์ƒํƒœ ์ปจํ…Œ์ด๋„ˆ๋กœ, ๋ถˆ๋ณ€์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ์—…๋ฐ์ดํŠธ, ์•ก์…˜ ๋””์ŠคํŒจ์น˜(action dispatch), ๊ทธ๋ฆฌ๊ณ  ๋ฆฌ๋“€์„œ(reducer)๋ฅผ ํ†ตํ•ด ์ „์—ญ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์‚ฐ์—… ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค [1]. ์ฃผ๋กœ ๋ณต์žกํ•œ ํŒŒ์ƒ ๋ฐ ๊ณ„์‚ฐ๋œ ์ƒํƒœ๊ฐ€ ์กด์žฌํ•˜๊ฑฐ๋‚˜ 500๊ฐœ ์ด์ƒ์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‹ค๋ฃจ๋Š” ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ผ๊ด€๋œ ๊ฐœ๋ฐœ ํŒจํ„ด์„ ๊ฐ•์ œํ•˜๊ธฐ ์œ„ํ•ด ์ฑ„ํƒ๋œ๋‹ค [2]. RTK Query์™€ Redux DevTools ๊ฐ™์€ ์„ฑ์ˆ™ํ•œ ์ƒํƒœ๊ณ„๋ฅผ ํ†ตํ•ด ๋น„๋™๊ธฐ ์ƒํƒœ ๊ด€๋ฆฌ์˜ ๋ณต์žก์„ฑ์„ ์ค„์ด๊ณ  ๊ฐ•๋ ฅํ•œ ๋””๋ฒ„๊น… ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค [2-4]. + +## ๐Ÿ“– Core ๋Œ€Content +* **์ƒํƒœ ๊ด€๋ฆฌ ์•„ํ‚คํ…์ฒ˜์™€ ๊ตฌ์กฐํ™”**: Redux๋Š” ๋ถˆ๋ณ€์„ฑ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋ฉฐ, ์•ก์…˜๊ณผ ๋ฆฌ๋“€์„œ ํŒจํ„ด์„ ํ†ตํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ณต์žกํ•œ ์ƒํƒœ ๋กœ์ง์„ ์ œ์–ดํ•œ๋‹ค [1]. ๋ชจ๋˜ ํ”„๋ก ํŠธ์—”๋“œ ํด๋” ๊ตฌ์กฐ์—์„œ Redux ์Šฌ๋ผ์ด์Šค(Redux slices)์™€ ๊ธ€๋กœ๋ฒŒ ์ƒํƒœ ๊ด€๋ จ ๋กœ์ง์€ ์ „๋‹ด ๋””๋ ‰ํ† ๋ฆฌ์ธ `store/`์— ๋ฐฐ์น˜๋œ๋‹ค [5-7]. 10๋ช… ์ด์ƒ์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ˜‘์—…ํ•˜๋Š” ์กฐ์ง์ด๋‚˜ ์ด์ปค๋จธ์Šค, ๊ธˆ์œต ์‹œ์Šคํ…œ๊ณผ ๊ฐ™์ด ๋ฏธ์…˜ ํฌ๋ฆฌํ‹ฐ์ปฌํ•œ ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ์ด ์ค‘์š”ํ•œ ํ”„๋กœ์ ํŠธ์—์„œ ์ฝ”๋“œ ์ž‘์„ฑ์˜ ์ผ๊ด€์„ฑ์„ ๊ฐ•์ œํ•˜๋Š” ๋ผˆ๋Œ€ ์—ญํ• ์„ ํ•œ๋‹ค [2]. +* **์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ฐ ์ƒํƒœ ๊ตฌ๋…**: ๋‚ด์žฅ๋œ React Context API๋Š” ์ƒํƒœ์˜ ์ผ๋ถ€๋งŒ ๋ณ€๊ฒฝ๋˜์–ด๋„ ํ•ด๋‹น ์ปจํ…์ŠคํŠธ๋ฅผ ๊ตฌ๋…ํ•˜๋Š” ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ์— ๋ฌด์ฐจ๋ณ„์ ์ธ ๋ฆฌ๋ Œ๋”๋ง์„ ์œ ๋ฐœํ•˜๋Š” ๋ฐ˜๋ฉด, Redux๋Š” ๊ตฌ๋… ๋กœ์ง๊ณผ ๋ Œ๋”๋ง์„ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌํ•œ๋‹ค [3, 8-10]. ์„ ํƒ์ž(Selector)๋ฅผ ์‚ฌ์šฉํ•ด ํ•„์š”ํ•œ ํŒŒ์ƒ ์ƒํƒœ๋งŒ ์ปดํฌ๋„ŒํŠธ์— ๊ณต๊ธ‰ํ•˜์—ฌ ์„ฑ๋Šฅ๊ณผ ์ตœ์ ํ™”๋ฅผ ๋ณด์žฅํ•œ๋‹ค [3]. +* **๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ (RTK Query ๋„์ž…)**: ๊ณผ๊ฑฐ Redux๋Š” ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์— ๋ง‰๋Œ€ํ•œ ์–‘์˜ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ(Thunk, Saga ๋“ฑ)๊ฐ€ ํ•„์š”ํ–ˆ์œผ๋‚˜, ํ˜„์žฌ๋Š” RTK Query๋ฅผ ํ†ตํ•ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ๋‹ค [2, 4]. RTK Query๋Š” ๋ฐ์ดํ„ฐ ์บ์‹ฑ, ์ค‘๋ณต ์š”์ฒญ ์ œ๊ฑฐ, ์ž๋™ ๋ฐ์ดํ„ฐ ์žฌ์š”์ฒญ ๊ธฐ๋Šฅ ๋“ฑ์„ ๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณตํ•˜์—ฌ ๋น„๋™๊ธฐ ์ž‘์—… ์ฝ”๋“œ๋ฅผ ํš๊ธฐ์ ์œผ๋กœ ์ค„์—ฌ์ค€๋‹ค [4]. +* **๋””๋ฒ„๊น…๊ณผ ์ถ”์ ์„ฑ**: Redux์˜ ๊ฐ€์žฅ ํฐ ์ฐจ๋ณ„์ ์€ ๋ธŒ๋ผ์šฐ์ €์˜ Redux DevTools๋ฅผ ํ™œ์šฉํ•œ '์‹œ๊ฐ„ ์—ฌํ–‰ ๋””๋ฒ„๊น…(Time-Travel Debugging)'์ด๋‹ค [2, 3]. ์ƒํƒœ ๋ณ€ํ™” ์ด๋ ฅ์„ ๊ณผ๊ฑฐ๋กœ ๋Œ๋ ค๋ณด๊ฑฐ๋‚˜ ์•ก์…˜์„ ์žฌํ˜„ํ•  ์ˆ˜ ์žˆ์–ด, ์‹ฌ์•ผ์— ๋ฐœ์ƒํ•˜๋Š” ๋ณต์žกํ•œ ์šด์˜ ํ™˜๊ฒฝ์˜ ๋น„๋™๊ธฐ ๋ฒ„๊ทธ๋„ ๋ช‡ ๋ถ„ ๋‚ด์— ์‹œ๊ฐ์ ์œผ๋กœ ํŒŒ์•…ํ•˜๊ฒŒ ํ•ด์ค€๋‹ค [3, 11, 12]. +* **ํ•œ๊ณ„์  ๋ฐ ์ฃผ์˜์‚ฌํ•ญ**: Redux๋Š” ๋„์ž… ์‹œ ๋ง‰๋Œ€ํ•œ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ, ์ •๊ทœํ™”๋œ ์ƒํƒœ ๊ด€๋ฆฌ์˜ ๋‚œํ•ดํ•จ, ๋ฏธ๋“ค์›จ์–ด ์ˆœ์„œ ์˜ค๋ฅ˜, ๊ทธ๋ฆฌ๊ณ  ๊นจ์ง€๊ธฐ ์‰ฌ์šด ์„ ํƒ์ž ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๋“ฑ์˜ ํ•œ๊ณ„๋ฅผ ๊ฐ€์ง„๋‹ค [13]. ๋˜ํ•œ ๋ชจ๋“  ์ƒํƒœ๋ฅผ ํ•˜๋‚˜์˜ ํฐ ๋ฆฌ๋“€์„œ์— ๋ชฐ์•„๋„ฃ๋Š” "God Reducer" ๊ตฌ์กฐ๋‚˜ ํŒ€ ๋‹จ์œ„์˜ ์•ก์…˜ ๊ฒฐํ•ฉ(Action Coupling)์€ ๋Œ€ํ‘œ์ ์ธ ์•ˆํ‹ฐ ํŒจํ„ด์œผ๋กœ ์ง€์ ๋œ๋‹ค [13, 14]. ์ตœ์‹  ํŠธ๋ Œ๋“œ์—์„œ๋Š” ์ด์™€ ๊ฐ™์€ ๋‹จ์ผ(monolithic) ์Šคํ† ์–ด ๊ตฌ์กฐ์˜ ๋ณต์žก์„ฑ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ์™€ ์„œ๋ฒ„ ์ƒํƒœ๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ๋“ฑ ๋ณด๋‹ค ํŒŒํŽธํ™”๋œ ๋ฐฉ์‹์œผ๋กœ ์ง„ํ™”ํ•˜๊ณ  ์žˆ๋‹ค [15]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts +- [[Context API]] + - ์—ฐ๊ฒฐ ์ด์œ : Redux์™€ ์ž์ฃผ ๋น„๊ต๋˜๋Š” React์˜ ๋‚ด์žฅ ์ƒํƒœ ๊ณต์œ  ๊ธฐ๋Šฅ์œผ๋กœ, ์†Œ๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ…Œ๋งˆ๋‚˜ ์–ธ์–ด ์„ค์ • ๋“ฑ์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์ ํ•ฉํ•˜์ง€๋งŒ, ์ƒํƒœ ๋ณ€๊ฒฝ ์‹œ ๋ฐœ์ƒํ•˜๋Š” ๋Œ€๊ทœ๋ชจ ๋ฆฌ๋ Œ๋”๋ง ํญํ’(Re-render Storm)์„ ์œ ๋ฐœํ•˜์—ฌ ๋Œ€๊ทœ๋ชจ ์•ฑ์—์„œ Redux๊ฐ€ ํ•„์š”ํ•œ ๋‹น์œ„์„ฑ์„ ์ œ๊ณตํ•œ๋‹ค [8, 9, 16]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ƒํƒœ ๊ตฌ๋… ์•„ํ‚คํ…์ฒ˜์˜ ์ฐจ์ด๊ฐ€ React ์ปดํฌ๋„ŒํŠธ์˜ ๋ฆฌ๋ Œ๋”๋ง ์„ฑ๋Šฅ์— ๋ฏธ์น˜๋Š” ์น˜๋ช…์ ์ธ ์˜ํ–ฅ์„ฑ [8, 10]. + +- [[Zustand]] + - ์—ฐ๊ฒฐ ์ด์œ : Redux์˜ ๋ฌด๊ฑฐ์šด ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ์™€ Context API์˜ ์„ฑ๋Šฅ ๋ฌธ์ œ ์‚ฌ์ด์—์„œ ์ ์ ˆํ•œ ํƒ€ํ˜‘์ ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒฝ๋Ÿ‰ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค [17-19]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๊ณผ๋„ํ•œ ์œ ์—ฐ์„ฑ(Zustand)์ด ํŒ€ ๋‹จ์œ„ ํ˜‘์—…์—์„œ ์–ด๋–ป๊ฒŒ ๋น„๋™๊ธฐ ํŒจํ„ด์˜ ํŒŒํŽธํ™”์™€ ํ˜ผ๋ž€์„ ์•ผ๊ธฐํ•  ์ˆ˜ ์žˆ๋Š”์ง€, ๋Œ€์กฐ์ ์œผ๋กœ Redux์˜ ์—„๊ฒฉํ•œ ๊ตฌ์กฐ๊ฐ€ ๊ฐ–๋Š” ๋ฐฉ์–ด์  ์ด์  [1, 11, 18, 20]. + +- [[RTK Query]] + - ์—ฐ๊ฒฐ ์ด์œ : Redux Toolkit(RTK) ์ƒํƒœ๊ณ„์— ํฌํ•จ๋œ ๋ฐ์ดํ„ฐ ํŒจ์นญ ๋ฐ ์บ์‹ฑ ๋„๊ตฌ์ด๋‹ค [4]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Redux๊ฐ€ ์–ด๋–ป๊ฒŒ ๋‹จ์ˆœํ•œ ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ๋„˜์–ด ์„œ๋ฒ„ API ์‘๋‹ต(์บ์‹ฑ, ๋ฌดํšจํ™”, ์žฌ์š”์ฒญ)์ด๋ผ๋Š” ํ˜„๋Œ€์ ์ธ ์š”๊ตฌ์‚ฌํ•ญ์„ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์—†์ด ์†Œํ™”ํ•˜๋Š”์ง€ ํŒŒ์•… [4, 21]. + +- [[Time-Travel Debugging]] + - ์—ฐ๊ฒฐ ์ด์œ : Redux DevTools๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ณ ์œ ์˜ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์œผ๋กœ, ์–ธ์ œ ์–ด๋–ค ์•ก์…˜์ด ๋””์ŠคํŒจ์น˜๋˜์–ด ์ƒํƒœ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€ ๊ธฐ๋กํ•˜๊ณ  ๋˜๊ฐ๋Š” ๊ธฐ์ˆ ์ด๋‹ค [2, 3]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: 5๋…„ ์ด์ƒ ์ง€์†๋˜๋Š” ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์•„ํ‚คํ…์ฒ˜์˜ ๋””๋ฒ„๊น… ์—ญ๋Ÿ‰์ด ๊ฐœ๋ฐœ์ž์˜ ์ƒ์‚ฐ์„ฑ ๋ฐ ์žฅ์•  ๋Œ€์‘์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ [11, 12]. + +### Deeper Research Questions +- Redux์˜ ์ƒํƒœ ๊ตฌ๋… ๋ฐ ์„ ํƒ์ž(selector) ํŒจํ„ด์€ ๋‚ด๋ถ€์ ์œผ๋กœ Context API์™€ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅด๊ฒŒ ์„ค๊ณ„๋˜์–ด ๋ถ€๋ถ„ ์ƒํƒœ ๋ณ€๊ฒฝ ์‹œ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ์ฐจ๋‹จํ•˜๋Š”๊ฐ€? +- RTK Query๋ฅผ ํ†ตํ•œ Redux ๋น„๋™๊ธฐ ์ƒํƒœ ๊ด€๋ฆฌ๋Š” Zustand ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๋Š” ๋น„๋™๊ธฐ ์บ์‹ฑ ํŒจํ„ด๊ณผ ๋น„๊ตํ•ด ์–ด๋– ํ•œ ์•„ํ‚คํ…์ฒ˜์  ์•ˆ์ •์„ฑ์„ ๋‹ด๋ณดํ•˜๋Š”๊ฐ€? +- "God Reducer" ์•ˆํ‹ฐ ํŒจํ„ด์ด ๋Œ€๊ทœ๋ชจ React ์ฝ”๋“œ๋ฒ ์ด์Šค ๋‚ด๋น„๊ฒŒ์ด์…˜ ๋ฐ ์„ฑ๋Šฅ ์ตœ์ ํ™”์— ๋ฏธ์น˜๋Š” ์น˜๋ช…์ ์ธ ๋ถ€์ž‘์šฉ์€ ๋ฌด์—‡์ธ๊ฐ€? +- ํ”„๋ก ํŠธ์—”๋“œ ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ๊ณผ๊ฑฐ์˜ ๊ฑฐ๋Œ€ํ•œ ๋‹จ์ผ ์Šคํ† ์–ด ๋ฐฉ์‹์—์„œ '์„œ๋ฒ„ ์ƒํƒœ'์™€ 'ํด๋ผ์ด์–ธํŠธ ๋กœ์ปฌ ์ƒํƒœ'๋กœ ํŒŒํŽธํ™”(Fragmentation)๋˜๋Š” ์ตœ์‹  ํŠธ๋ Œ๋“œ ์†์—์„œ, Redux์˜ ์ ์ • ์‚ฌ์šฉ ๋ฒ”์œ„๋Š” ์–ด๋–ป๊ฒŒ ์žฌ์กฐ์ •๋˜์—ˆ๋Š”๊ฐ€? +- 10๋ช… ์ด์ƒ์˜ ์‹œ๋‹ˆ์–ด ๋ฐ ์ฃผ๋‹ˆ์–ด ๊ฐœ๋ฐœ์ž๊ฐ€ ํ˜ผ์žฌ๋œ ํŒ€์—์„œ Redux์˜ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ๋Š” ๊ฐœ๋ฐœ ์†๋„๋ฅผ ์ €ํ•˜์‹œํ‚ค๋Š” ๋ถ€์ฑ„์ธ๊ฐ€, ์•„๋‹ˆ๋ฉด ๋ฒ„๊ทธ๋ฅผ ์‚ฌ์ „์— ๋ฐฉ์ง€ํ•˜๋Š” ๊ตฌ์กฐ์  ๋ฐฉ์–ด๋ง‰์ธ๊ฐ€? + +### Practical Application Contexts +- **Implementation:** React ํ”„๋กœ์ ํŠธ์˜ `store/` ๋˜๋Š” `features/` ๋””๋ ‰ํ† ๋ฆฌ์— ๋„๋ฉ”์ธ๋ณ„ Redux slice๋ฅผ ๋ฐฐ์น˜ํ•˜์—ฌ ์ „์—ญ ์ƒํƒœ ๋ฐ ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ๋ฅผ ์„ ์–ธํ•˜๊ณ  ์•ก์…˜๊ณผ ๋ณ‘ํ•ฉํ•˜์—ฌ ๊ด€๋ฆฌํ•œ๋‹ค [5-7]. +- **System Design:** ์žฅ๊ธฐ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์š”๊ตฌ๋˜๋Š” ๋Œ€๊ทœ๋ชจ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์‹œ์Šคํ…œ(์ด์ปค๋จธ์Šค ๊ฒฐ์ œ ๋“ฑ ๋ฐ์ดํ„ฐ ํ๋ฆ„์ด ์ค‘์š”ํ•œ 500๊ฐœ ์ปดํฌ๋„ŒํŠธ ์ด์ƒ์˜ ์•ฑ)์—์„œ ํŒŒ์ƒ ์ƒํƒœ ์ฒ˜๋ฆฌ์™€ ํŒ€ ๊ฐœ๋ฐœ ํŒจํ„ด ๊ฐ•์ œํ™” ๋ชฉ์ ์œผ๋กœ ์ฑ„ํƒํ•œ๋‹ค [2, 12, 13, 22]. +- **Operation / Maintenance:** ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์ด๋‚˜ ๋””๋ฒ„๊น… ์‹œ Redux DevTools๋ฅผ ์—ฐ๋™ํ•˜์—ฌ ํŠน์ • UI ๋ฒ„๊ทธ๋‚˜ ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ๊ผฌ์ž„ ํ˜„์ƒ์„ ์‹œ๊ฐ์ ์ธ ์•ก์…˜ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ํ†ตํ•ด ๋‹จ์‹œ๊ฐ„์— ํ•ด๊ฒฐํ•œ๋‹ค [11, 12]. +- **Learning Path:** ํ”„๋ก ํŠธ์—”๋“œ ๊ต์œก ์‹œ, Context API์˜ ๊ทผ๋ณธ ์›๋ฆฌ์™€ ํ•œ๊ณ„๋ฅผ ๋จผ์ € ํ•™์Šตํ•˜๊ณ , Zustand์˜ ์ƒ์‚ฐ์„ฑ์„ ๊ฒฝํ—˜ํ•œ ๋’ค, ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ํ‘œ์ค€์ด์ž ๊ฐ€์žฅ ๋ณต์žก๋„๊ฐ€ ๋†’์€ Redux์˜ ํŒจํ„ด๊ณผ ๊ตฌ์กฐ์  ์ด์ ์„ ์ตœ์ข…์ ์œผ๋กœ ํ•™์Šตํ•˜๋Š” ๋‹จ๊ณ„์  ์ ‘๊ทผ์ด ์š”๊ตฌ๋œ๋‹ค [23]. +- **My Project Relevance:** ๊ธ€๋กœ๋ฒŒ ์ƒํƒœ๊ฐ€ ๋‹ค์ˆ˜์˜ ์ปดํฌ๋„ŒํŠธ์— ๋ณต์žกํ•˜๊ฒŒ ์–ฝํ˜€ ์žˆ๊ฑฐ๋‚˜, ํŒ€์› ๊ฐ„ ๋™์ผํ•œ ๋น„๋™๊ธฐ/์ƒํƒœ ๊ด€๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๊ฐ•์ œํ•˜์—ฌ ํŒŒํŽธํ™”๋ฅผ ๋ง‰์•„์•ผ ํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•  ๋•Œ ํ•ต์‹ฌ์ ์ธ ๊ธฐ์ˆ  ์Šคํƒ์œผ๋กœ ๊ฒ€ํ† ๋  ์ˆ˜ ์žˆ๋‹ค [1, 12]. + +### Adjacent Topics +- [[Server State Management (TanStack Query ๋“ฑ)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ํด๋ผ์ด์–ธํŠธ ์ „์—ญ ์ƒํƒœ์™€ ๊ตฌ๋ณ„๋˜๋Š” "์„œ๋ฒ„ ๋ฐ์ดํ„ฐ(API ์บ์‹ฑ, ๋™๊ธฐํ™”, ๋กœ๋”ฉ/์—๋Ÿฌ ์‚ฌ์ดํด)"๋งŒ์„ ์ „๋ฌธ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ชจ๋˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ Redux์˜ ์—ญํ•  ๋น„๊ต ๋ฐ ์—ฐ๋™ ๋ฐฉ์•ˆ ํƒ์ƒ‰ [24, 25]. +- [[React Rendering Optimization]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์„ ํƒ๊ณผ ๋ณ„๊ฐœ๋กœ, React ์ปดํฌ๋„ŒํŠธ ์ƒ๋ช…์ฃผ๊ธฐ ๋ฐ ๋ฉ”๋ชจ์ด์ œ์ด์…˜(`useMemo`, `useCallback`, `React.memo`)์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํผํฌ๋จผ์Šค์— ๋ฏธ์น˜๋Š” ์›๋ฆฌ์™€ ํ”„๋กœํŒŒ์ผ๋ง ๋ฐฉ๋ฒ• ํƒ์ƒ‰ [26-28]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Development/Rollup.md b/10_Wiki/Development/Rollup.md new file mode 100644 index 00000000..5a38f732 --- /dev/null +++ b/10_Wiki/Development/Rollup.md @@ -0,0 +1,57 @@ +# [[Rollup]] + +## ๐Ÿ“Œ Brief Summary +Rollup์€ 2025๋…„ ๊ธฐ์ค€ ์ตœ์‹  ํ”„๋ก ํŠธ์—”๋“œ ๋นŒ๋“œ ๋„๊ตฌ์ธ Vite์˜ ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ๋ฅผ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๋‹ด๋‹นํ•˜๋Š” ๋ชจ๋“ˆ ๋ฒˆ๋“ค๋Ÿฌ์ž…๋‹ˆ๋‹ค [1]. ๊ฐœ๋ฐœ ๋‹จ๊ณ„์—์„œ๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ES ๋ชจ๋“ˆ(ESM)์„ ์‚ฌ์šฉํ•˜๋Š” Vite๊ฐ€ ์‹ค์ œ ๋ฐฐํฌ ์‹œ์ ์—๋Š” Rollup์œผ๋กœ ์ „ํ™˜ํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋ฅผ ๋ณ‘ํ•ฉํ•˜๊ณ  ์ตœ์ ํ™”ํ•ฉ๋‹ˆ๋‹ค [1, 2]. ์ž๋™ ์ฝ”๋“œ ๋ถ„ํ• (Code Splitting)๊ณผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ํŠธ๋ฆฌ ์‰์ดํ‚น(Tree-shaking) ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ๋งค์šฐ ์ตœ์ ํ™”๋œ ์ตœ์ข… ์—์…‹์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ ์—ญํ• ์ž…๋‹ˆ๋‹ค [1]. + +## ๐Ÿ“– Core ๋Œ€Content +* **Vite์™€์˜ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์•„ํ‚คํ…์ฒ˜:** Vite๋Š” ๋กœ์ปฌ ๊ฐœ๋ฐœ ์‹œ์—๋Š” ๋ฒˆ๋“ค๋ง ์—†์ด ๋„ค์ดํ‹ฐ๋ธŒ ESM์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ œ๊ณตํ•˜์—ฌ ๊ทน๋„๋กœ ๋น ๋ฅธ ์‹œ์ž‘๊ณผ HMR(Hot Module Replacement)์„ ์ง€์›ํ•˜์ง€๋งŒ, ํ”„๋กœ๋•์…˜ ๋ฐฐํฌ ์‹œ์—๋Š” Rollup์„ ์‚ฌ์šฉํ•˜์—ฌ ์ตœ์ ํ™”๋œ ๋ฒˆ๋“ค(Bundled build)์„ ์ƒ์„ฑํ•˜๋Š” ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๋ฐฉ์‹์„ ์ทจํ•ฉ๋‹ˆ๋‹ค [1]. +* **๋ฒˆ๋“ค ์ตœ์ ํ™” ๋ฐ ํŠธ๋ฆฌ ์‰์ดํ‚น (Tree-shaking):** Rollup์€ ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ ์‹œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์—์„œ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์ฝ”๋“œ๋ฅผ ์ž๋™์œผ๋กœ ์ œ๊ฑฐ(Tree-shaking)ํ•˜๊ณ  ํšจ์œจ์ ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๋ถ„ํ• ํ•˜์—ฌ ์ตœ์ ํ™”๋œ ์—์…‹์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [1]. +* **์ฒญํฌ ์ˆ˜๋™ ์ œ์–ด (`manualChunks`):** ๊ธฐ๋ณธ ์„ค์ • ์ƒํƒœ์—์„œ Rollup์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ์™€ `node_modules`์˜ ๋ชจ๋“  ์ข…์†์„ฑ์„ ๋‹จ์ผ ํŒŒ์ผ(`index.js`)๋กœ ๋ฌถ์–ด ๊ฑฐ๋Œ€ํ•œ ๋ฒˆ๋“ค์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3]. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” Rollup ์˜ต์…˜ ์ค‘ `manualChunks`๋ฅผ ์„ธ๋ฐ€ํ•˜๊ฒŒ ์„ค์ •ํ•˜์—ฌ, ์ž์ฃผ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ๋ฌด๊ฑฐ์šด ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(React ์ฝ”์–ด, Recharts, Lodash, ์•„์ด์ฝ˜ ๋“ฑ)๋ฅผ ๋ณ„๋„์˜ ์ฒญํฌ ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค [4-6]. +* **์บ์‹œ ํšจ์œจ์„ฑ ๊ฐœ์„ :** `manualChunks`๋ฅผ ํ†ตํ•ด ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ถ„๋ฆฌํ•˜๋ฉด, ํ•ด๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ž์ฃผ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๋Ÿฌ ๋ฒˆ ๋ฐฐํฌํ•˜๋”๋ผ๋„ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ด๋ฅผ ์บ์‹œํ•˜์—ฌ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ดˆ๊ธฐ ๋กœ๋“œ ์„ฑ๋Šฅ์ด ํฌ๊ฒŒ ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค [5-7]. + +## โš–๏ธ Trade-offs & Caveats +* **์ดˆ๊ธฐ ์„ค์ • ๋ถ€์กฑ ์‹œ ๋Œ€์šฉ๋Ÿ‰ ๋ฒˆ๋“ค ๋ฐœ์ƒ:** ๊ธฐ๋ณธ ์„ค์ •์œผ๋กœ ๋‘˜ ๊ฒฝ์šฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ชจ๋“  ์ข…์†์„ฑ์ด ํ•˜๋‚˜์˜ ํŒŒ์ผ์— Eager Import ๋˜์–ด ๊ฒฐํ•ฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3]. ์ด๋Š” ๋ฏธ๋‹ˆํŒŒ์ด(Minification) ํ›„์—๋„ 500kB๋ฅผ ์ดˆ๊ณผํ•˜๋Š” ๋Œ€๊ทœ๋ชจ ์ฒญํฌ(Large Chunks)๋ฅผ ์ƒ์„ฑํ•˜์—ฌ, ๋‹ค์šด๋กœ๋“œ ์‹œ๊ฐ„์„ ์ง€์—ฐ์‹œํ‚ค๊ณ  ์ €์‚ฌ์–‘ ๊ธฐ๊ธฐ์—์„œ ํŒŒ์‹ฑ ๋ฐ ์ปดํŒŒ์ผ์— ๋ฌด๋ฆฌ๋ฅผ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3, 8, 9]. +* **์บ์‹œ ๋ฌดํšจํ™”(Cache Invalidation) ๋ฌธ์ œ:** ๋‹จ์ผ ๊ฑฐ๋Œ€ ๋ฒˆ๋“ค๋กœ ๋นŒ๋“œํ•  ๊ฒฝ์šฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ž‘์€ ์ฝ”๋“œ ํ•˜๋‚˜๋งŒ ์ˆ˜์ •ํ•˜๋”๋ผ๋„ ์ „์ฒด ๋ฒˆ๋“ค์ด ์ƒˆ๋กœ ํ•ด์‹œ(Hash)๋˜์–ด ์‚ฌ์šฉ์ž๋Š” ๋ชจ๋“  JavaScript ํŒŒ์ผ์„ ๋‹ค์‹œ ๋‹ค์šด๋กœ๋“œํ•ด์•ผ ํ•˜๋Š” ๋น„ํšจ์œจ์„ฑ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [9]. ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๋ ค๋ฉด `manualChunks` ์„ค์ •๊ณผ `React.lazy`๋ฅผ ๊ฒฐํ•ฉํ•œ ๋ผ์šฐํŠธ ๊ธฐ๋ฐ˜ ์ฝ”๋“œ ๋ถ„ํ•  ๋“ฑ ์ถ”๊ฐ€์ ์ธ ์ตœ์ ํ™” ์ž‘์—…์ด ๊ฐ•์ œ๋ฉ๋‹ˆ๋‹ค [3, 6]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] +- [[Vite]] + - ์—ฐ๊ฒฐ ์ด์œ : Rollup์€ Vite์˜ ์•„ํ‚คํ…์ฒ˜ ๋‚ด์—์„œ ํ”„๋กœ๋•์…˜ ๋ฐฐํฌ ์‹œ ์ตœ์ ํ™”๋œ ๋นŒ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋‚ด๋ถ€ ์—”์ง„์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค [1]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ฐœ๋ฐœ ๋ชจ๋“œ(ESM)์™€ ๋ฐฐํฌ ๋ชจ๋“œ(Rollup)๋ฅผ ๋‹ค๋ฅด๊ฒŒ ๊ฐ€์ ธ๊ฐ€๋Š” Vite์˜ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๋ฒˆ๋“ค๋ง ์•„ํ‚คํ…์ฒ˜ ์ „๋žต์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1, 2]. +- [[Tree-shaking]] + - ์—ฐ๊ฒฐ ์ด์œ : Rollup์ด ๋ฐฐํฌ์šฉ ์ฝ”๋“œ๋ฅผ ์ตœ์ ํ™”ํ•  ๋•Œ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ๋ฅผ ๋œ์–ด๋‚ด๋Š” ํ•ต์‹ฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค [1]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ES ๋ชจ๋“ˆ ๊ธฐ๋ฐ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ์ด ์™œ ์ตœ์ข… ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ ์ตœ์ ํ™”์— ํ•„์ˆ˜์ ์ธ์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [10]. + +#### [๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ] +- [[manualChunks]] + - ์—ฐ๊ฒฐ ์ด์œ : Rollup์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฑฐ๋Œ€ํ•œ ๋ฉ”์ธ ๋ฒˆ๋“ค์„ ์„ธ๋ถ„ํ™”๋œ ๋ฒค๋” ์ฒญํฌ(Vendor chunk)๋กœ ์ชผ๊ฐค ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ํ•ต์‹ฌ ์„ค์ •์ž…๋‹ˆ๋‹ค [4-6]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ธŒ๋ผ์šฐ์ € ์บ์‹ฑ์„ ๊ทน๋Œ€ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์ฝ”๋“œ๋ฅผ ์„ฑ๊ฒฉ(๋ณ€๊ฒฝ ๋นˆ๋„)์— ๋”ฐ๋ผ ๋ถ„๋ฆฌํ•˜๋Š” ์ตœ์ ํ™” ์ „๋žต์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [6, 7]. +- [[Code Splitting]] + - ์—ฐ๊ฒฐ ์ด์œ : Rollup์˜ ๊ธฐ๋Šฅ๊ณผ React์˜ ์ง€์—ฐ ๋กœ๋”ฉ(`React.lazy`)์„ ๊ฒฐํ•ฉํ•˜์—ฌ ๊ตฌํ˜„๋˜๋Š” ์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค [3, 11]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ดˆ๊ธฐ ํŽ˜์ด๋กœ๋“œ(Payload)๋ฅผ ์ค„์ด๊ณ  Core Web Vitals๋ฅผ ๊ฐœ์„ ํ•˜๋Š” ๋Ÿฐํƒ€์ž„ ์ตœ์ ํ™” ๋ฐฉ๋ฒ•์„ ํ•™์Šตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [9, 12]. + +### Deeper Research Questions +- Vite๋Š” ์™œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋Š” Rollup์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋„ค์ดํ‹ฐ๋ธŒ ESM์„ ์‚ฌ์šฉํ•˜๋ฉฐ, ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ์—์„œ๋งŒ Rollup์„ ๋„์ž…ํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜๋ฅผ ์„ ํƒํ–ˆ๋Š”๊ฐ€? +- Rollup์˜ Tree-shaking ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ๋นŒ๋“œ ์‹œ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๋ฐ๋“œ ์ฝ”๋“œ(Dead code)๋ฅผ ์‹๋ณ„ํ•˜๊ณ  ์ตœ์ข… ๋ฒˆ๋“ค์—์„œ ์ œ์™ธํ•˜๋Š”๊ฐ€? +- `manualChunks`๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฒค๋”(Vendor) ํŒŒ์ผ์„ ๋ถ„ํ• ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ชจ๋“ˆ ๊ฐ„ ์ค‘๋ณต ํฌํ•จ ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ์„ค์ • ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? +- Rollup์ด ์ƒ์„ฑํ•œ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ๋ถ„์„ํ•˜๊ธฐ ์œ„ํ•ด `rollup-plugin-visualizer`๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋ฐ์ดํ„ฐ๋Š” ์‹ค์ œ ์„ฑ๋Šฅ ๊ฐœ์„ ์— ์–ด๋–ป๊ฒŒ ํ™œ์šฉ๋˜๋Š”๊ฐ€? +- Rollup์˜ ๋นŒ๋“œ ์ตœ์ ํ™”๊ฐ€ FCP, LCP, INP ๋“ฑ Core Web Vitals ์ง€ํ‘œ ํ–ฅ์ƒ์— ๋ฏธ์น˜๋Š” ๊ตฌ์ฒด์ ์ธ ์ธ๊ณผ๊ด€๊ณ„๋Š” ๋ฌด์—‡์ธ๊ฐ€? + +### Practical Application Contexts +- **Implementation:** `vite.config.js` ๋‚ด๋ถ€์— `build.rollupOptions.output.manualChunks`๋ฅผ ๊ตฌ์„ฑํ•˜์—ฌ `react`, `react-dom` ๋“ฑ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ณ„๋„์˜ ํŒŒ์ผ๋กœ ๊ฐ•์ œ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค [4, 6]. +- **System Design:** ํ”„๋ก ํŠธ์—”๋“œ ํ”„๋กœ๋•์…˜ ์‹œ์Šคํ…œ ์„ค๊ณ„ ์‹œ, ์ž์ฃผ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋ถ„๋ฆฌํ•˜์—ฌ CDN ์บ์‹œ ํžˆํŠธ์œจ์„ ๋†’์ด๋„๋ก ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค [5, 6]. +- **Operation / Maintenance:** CI/CD ํŒŒ์ดํ”„๋ผ์ธ์—์„œ "500 kB ์ด์ƒ์˜ ์ฒญํฌ" ๊ฒฝ๊ณ ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ, `rollup-plugin-visualizer`๋ฅผ ํ†ตํ•ด ๋ฒˆ๋“ค ์ƒํƒœ๋ฅผ ์ ๊ฒ€ํ•˜๊ณ  ๋ถ„ํ•  ์„ค์ •์„ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค [8, 13, 14]. +- **Learning Path:** React ์ตœ์ ํ™” ํ•™์Šต ์‹œ, ๋‹จ์ˆœํžˆ `React.lazy()`๋งŒ ๋ฐฐ์šฐ๋Š” ๊ฒƒ์„ ๋„˜์–ด ๋ฒˆ๋“ค๋Ÿฌ(Rollup) ๋ ˆ๋ฒจ์—์„œ์˜ ์ฝ”๋“œ ์ฒญํ‚น(Chunking) ์›๋ฆฌ๋ฅผ ํ•จ๊ป˜ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค [3, 6]. +- **My Project Relevance:** Vite ๊ธฐ๋ฐ˜ React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ Vercel์ด๋‚˜ AWS ์„œ๋ฒ„์— ๋ฐฐํฌํ•˜๊ธฐ ์ „์— ๋นŒ๋“œ ์†๋„ ๋ฐ ์ดˆ๊ธฐ ๋‹ค์šด๋กœ๋“œ ์†๋„๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•œ ํ•„์ˆ˜ ์ ๊ฒ€ ๋‹จ๊ณ„๋กœ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค [2, 11]. + +### Adjacent Topics +- [[ES Modules (ESM)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: Rollup์˜ ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ ์ด์ „, Vite๊ฐ€ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ์ฝ”๋“œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ฆ‰๊ฐ์ ์œผ๋กœ ๋ธŒ๋ผ์šฐ์ €์— ๋ฐ˜์˜ํ•˜๋Š” ์›๋ฆฌ ํŒŒ์•… [1, 15]. +- [[Core Web Vitals]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: Rollup์˜ ๋ฒˆ๋“ค ๋ถ„ํ•  ๋ฐ ๊ฒฝ๋Ÿ‰ํ™” ์ž‘์—…์ด LCP(Largest Contentful Paint)๋‚˜ INP(Interaction to Next Paint)์™€ ๊ฐ™์€ ๋ธŒ๋ผ์šฐ์ € ์„ฑ๋Šฅ ์ธก์ • ์ง€ํ‘œ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ฐœ์„ ํ•˜๋Š”์ง€ ์กฐ์‚ฌ [9, 14]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Development/Scalable Frontend Systems.md b/10_Wiki/Development/Scalable Frontend Systems.md new file mode 100644 index 00000000..57f7da94 --- /dev/null +++ b/10_Wiki/Development/Scalable Frontend Systems.md @@ -0,0 +1,65 @@ +# [[Scalable Frontend Systems]] + +## ๐Ÿ“Œ Brief Summary +๋Œ€๊ทœ๋ชจ ํ”„๋ก ํŠธ์—”๋“œ ์‹œ์Šคํ…œ(Scalable Frontend Systems)์€ ๋†’์€ ์œ ์ง€๋ณด์ˆ˜์„ฑ, ๊ณ ์„ฑ๋Šฅ, ํ™•์žฅ์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ์กด์˜ ๋‹จ์ˆœํ•œ ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰์„ ๋„˜์–ด ์ •๊ตํ•˜๊ฒŒ ๋ถ„์‚ฐ๋œ ์†Œํ”„ํŠธ์›จ์–ด ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋„์ž…ํ•œ ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค [1]. ๊ธฐ๋Šฅ๋ณ„ ๋˜๋Š” ๋„๋ฉ”์ธ ์ค‘์‹ฌ์˜ ๋ชจ๋“ˆํ˜• ํด๋” ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, SOLID์™€ ๊ฐ™์€ ํด๋ฆฐ ์ฝ”๋“œ ์›์น™์„ ์ค€์ˆ˜ํ•˜๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒํƒœ์™€ ์„œ๋ฒ„ ์ƒํƒœ๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค [2-4]. ๋”๋ถˆ์–ด ์ž๋™ํ™”๋œ ๋นŒ๋“œ ์ตœ์ ํ™”, ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ๋ Œ๋”๋ง ์ตœ์ ํ™”, ์ •๊ตํ•œ ์—๋Ÿฌ ์ฒ˜๋ฆฌ ๋ฐ ํ˜‘์—… ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์•ˆ์ •์ ์œผ๋กœ ์„ฑ์žฅํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•ฉ๋‹ˆ๋‹ค [1, 5]. + +## ๐Ÿ“– Core Content + +* **์•„ํ‚คํ…์ฒ˜ ํŒจ๋Ÿฌ๋‹ค์ž„๊ณผ ํด๋” ๊ตฌ์กฐ:** ํ™•์žฅ์„ฑ์„ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํŒŒ์ผ์„ ํŒŒ์ผ์˜ ์œ ํ˜•(components, hooks ๋“ฑ)๋ณ„๋กœ ๋ชจ์•„๋‘๋Š” ๊ตฌ์กฐ์—์„œ ๊ธฐ๋Šฅ(Feature)์ด๋‚˜ ๋„๋ฉ”์ธ ์ค‘์‹ฌ์œผ๋กœ ๊ตฌ์กฐ๋ฅผ ๊ฐœํŽธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [2, 6]. ํŠนํžˆ Feature-Sliced Design (FSD)์€ ์ฝ”๋“œ ๊ณ„์ธต์„ Scope์™€ ์ฑ…์ž„์— ๋”ฐ๋ผ ๋ถ„ํ• (shared, entities, features, widgets, pages, app)ํ•˜๊ณ , ํ•˜์œ„ ๊ณ„์ธต์ด ์ƒ์œ„ ๊ณ„์ธต์„ ์ฐธ์กฐํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ํ•˜๋Š” ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ๊ณผ ์บก์Аํ™”๋œ Public API ๊ทœ์น™์„ ๊ฐ•์ œํ•˜์—ฌ ๊ฒฐํ•ฉ๋„(Coupling)๋ฅผ ๊ทน์ ์œผ๋กœ ๋‚ฎ์ถฅ๋‹ˆ๋‹ค [7-10]. +* **์†Œํ”„ํŠธ์›จ์–ด ์—”์ง€๋‹ˆ์–ด๋ง ์›์น™ ์ ์šฉ:** ํ™•์žฅ ๊ฐ€๋Šฅํ•œ React ์‹œ์Šคํ…œ์€ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ•˜๋‚˜์˜ ์—ญํ• ๋งŒ ํ•˜๋„๋ก ๋ถ„๋ฆฌํ•˜๋Š” ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)์„ ๋น„๋กฏํ•˜์—ฌ ๊ฐœ๋ฐฉ/ํ์‡„ ์›์น™(OCP), DRY, KISS, YAGNI ๋“ฑ์˜ SOLID ๋ฐ ํด๋ฆฐ ์ฝ”๋“œ ์›์น™์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค [3, 11]. ์ด๋กœ ์ธํ•ด ์ฝ”๋“œ์˜ ์˜ˆ์ธก ๊ฐ€๋Šฅ์„ฑ์ด ํ–ฅ์ƒ๋˜๊ณ  ๋ถˆํ•„์š”ํ•œ ์กฐ๊ธฐ ์ตœ์ ํ™”๋‚˜ ๋ณต์žก์„ฑ์ด ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค [12]. +* **์ƒํƒœ ๊ด€๋ฆฌ์˜ ํŒŒํŽธํ™” (State Management):** ํ•˜๋‚˜์˜ ๊ฑฐ๋Œ€ํ•œ Redux ์Šคํ† ์–ด์— ์˜์กดํ•˜๊ธฐ๋ณด๋‹ค, ๋ฐ์ดํ„ฐ์˜ ์„ฑ๊ฒฉ์— ๋งž๋Š” ๋„๊ตฌ๋ฅผ ์„ ํƒํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ง„ํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค [13]. ๋ถˆํ•„์š”ํ•œ ์ „์—ญ ๋ Œ๋”๋ง์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด Context API ๋Œ€์‹  ์„ ํƒ์ž(Selector) ํŒจํ„ด์„ ์ง€์›ํ•˜๋Š” Zustand ๋“ฑ์„ ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ์— ์‚ฌ์šฉํ•˜๋ฉฐ, API์—์„œ ๊ฐ€์ ธ์˜ค๋Š” ์„œ๋ฒ„ ์ƒํƒœ๋Š” ์บ์‹ฑ๊ณผ ๋™๊ธฐํ™”๋ฅผ ์œ„ํ•ด TanStack Query(React Query)๋กœ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค [4, 14]. +* **์„ฑ๋Šฅ ์—”์ง€๋‹ˆ์–ด๋ง ๋ฐ ๋ Œ๋”๋ง ์ตœ์ ํ™”:** ์ดˆ๊ธฐ์˜ ๊ฑฐ๋Œ€ํ•œ JavaScript ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด `React.lazy`์™€ Suspense๋ฅผ ํ™œ์šฉํ•œ ๋ผ์šฐํŠธ ๋ฐ ์ปดํฌ๋„ŒํŠธ ์ˆ˜์ค€์˜ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…(Code Splitting)์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค [15-17]. ์„ฑ๋Šฅ ๋ณ‘๋ชฉ์„ ์ผ์œผํ‚ค๋Š” ๋ฌด์˜๋ฏธํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด `React.memo`, `useCallback`, `useMemo`๋ฅผ ์ ์žฌ์ ์†Œ์— ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, React Compiler์™€ ๊ฐ™์€ ๋นŒ๋“œ ํƒ€์ž„ ๋„๊ตฌ๋ฅผ ๋„์ž…ํ•ด ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์ž๋™ํ™”ํ•ฉ๋‹ˆ๋‹ค [18-21]. ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐฉ๋Œ€ํ•œ ๋ชฉ๋ก์˜ ๊ฒฝ์šฐ ๊ฐ€์ƒํ™”(Virtualization/Windowing)๋ฅผ ๋„์ž…ํ•˜์—ฌ DOM ๋ถ€ํ•˜๋ฅผ ์ค„์ž…๋‹ˆ๋‹ค [22]. +* **๋ณต์›๋ ฅ(Resilience)๊ณผ ๋ชจ๋‹ˆํ„ฐ๋ง:** ์ „์ฒด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ Œ๋”๋ง ํฌ๋ž˜์‹œ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋ถˆ์•ˆ์ •ํ•œ UI ์˜์—ญ(์จ๋“œํŒŒํ‹ฐ ์œ„์ ฏ ๋“ฑ)์„ Error Boundary๋กœ ๊ฐ์‹ธ์„œ ๊ฒฉ๋ฆฌํ•ฉ๋‹ˆ๋‹ค [23, 24]. ๋ธŒ๋ผ์šฐ์ € ๋ฉ”๋ชจ๋ฆฌ ํƒญ์˜ Heap Snapshot์„ ํ†ตํ•ด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋””๋ฒ„๊น…ํ•˜๊ณ , ๋ฐฐํฌ ์ดํ›„์—๋Š” Sentry, LogRocket, Datadog๊ณผ ๊ฐ™์€ ํด๋ผ์šฐ๋“œ ๊ด€์ธก(Observability) ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ด ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์˜ ์‚ฌ์šฉ์ž ์—๋Ÿฌ ๋ฐ ์„ธ์…˜์„ ์‹ค์‹œ๊ฐ„ ๋ชจ๋‹ˆํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค [25-27]. +* **ํŒ€ ํ˜‘์—… ๋ฐ ๊ฑฐ๋ฒ„๋„Œ์Šค ๊ทœ์น™:** ์œˆ๋„์šฐ/๋ฆฌ๋ˆ…์Šค ํ™˜๊ฒฝ ์ฐจ์ด๋กœ ์ธํ•œ CI ๋นŒ๋“œ ์—๋Ÿฌ๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด ํŒŒ์ผ๋ช…์— kebab-case๋ฅผ ๊ฐ•์ œํ•˜๊ฑฐ๋‚˜(์ปดํฌ๋„ŒํŠธ ์ด๋ฆ„์€ PascalCase ์ ์šฉ), ESLint ๋ฐ Git Hooks๋ฅผ ํ†ตํ•ด ์•„ํ‚คํ…์ฒ˜ ๊ทœ์น™ ๋ฐ ์ฝ”๋“œ ํฌ๋งท์„ ์ž๋™ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค [28-30]. Git-flow, GitHub Flow ๋“ฑ ์†Œ๊ทœ๋ชจ/๋Œ€๊ทœ๋ชจ ํŒ€ ๊ทœ๋ชจ์— ๋งž๋Š” ๋ช…ํ™•ํ•œ ๋ธŒ๋žœ์น˜ ์ „๋žต๊ณผ ํ‹ฐ์ผ“ ID ๊ธฐ๋ฐ˜ ์ถ”์  ๊ด€๋ฆฌ๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค [31, 32]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +- [[Feature-Sliced Design (FSD)]] + - ์—ฐ๊ฒฐ ์ด์œ : ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ํ”„๋ก ํŠธ์—”๋“œ ์•„ํ‚คํ…์ฒ˜์—์„œ ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ฐœ์ƒํ•˜๋Š” '๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์–ฝํž˜' ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋„์ž…๋œ ํ•ต์‹ฌ์ ์ธ ์ปดํฌ๋„ŒํŠธ/๋””๋ ‰ํ† ๋ฆฌ ๋ถ„ํ•  ๋ฐฉ๋ฒ•๋ก ์ž…๋‹ˆ๋‹ค [33, 34]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ํ๋ฆ„, ๊ณ„์ธต๋ณ„(Layered) ๋ถ„ํ• , ์บก์Аํ™”๋ฅผ ํ†ตํ•œ Public API ์ธํ„ฐํŽ˜์ด์Šค ์„ค๊ณ„ ์›๋ฆฌ [7, 9]. + +- [[State Management Fragmentation (์ƒํƒœ ๊ด€๋ฆฌ ํŒŒํŽธํ™”)]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋‹จ์ผ ์Šคํ† ์–ด๋‚˜ Context API๋งŒ์œผ๋กœ๋Š” ๋ฆฌ๋ Œ๋”๋ง ์„ฑ๋Šฅ ์ตœ์ ํ™”๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•ด์ง์— ๋”ฐ๋ผ, ์ „์—ญ ์ƒํƒœ(Zustand), ์„œ๋ฒ„ ์ƒํƒœ(React Query), ๋กœ์ปฌ ์ƒํƒœ๋กœ ์—ญํ• ์„ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ด€๋ฆฌํ•˜๋Š” ํŠธ๋ Œ๋“œ์ž…๋‹ˆ๋‹ค [4, 13, 35]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง ๋ฐฉ์ง€ ์›๋ฆฌ(Zustand์˜ ์„ ํƒ์ž ํŒจํ„ด)์™€ ์„œ๋ฒ„/ํด๋ผ์ด์–ธํŠธ ๋ฐ์ดํ„ฐ ๊ฐ„์˜ ์บ์‹ฑ ๋ฐ ๋™๊ธฐํ™” ์ „๋žต [4, 14]. + +- [[React Compiler]] + - ์—ฐ๊ฒฐ ์ด์œ : ๊ฐœ๋ฐœ์ž๊ฐ€ ์ˆ˜๋™์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋˜ `useMemo`, `useCallback`, `React.memo` ๋“ฑ์˜ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ๋นŒ๋“œ ํƒ€์ž„์— ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•ด ์ฃผ์–ด, ๊น”๋”ํ•œ ์ฝ”๋“œ๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ ์„ฑ๋Šฅ ํ™•์žฅ์„ ๊ฐ€๋Šฅ์ผ€ ํ•˜๋Š” ์ตœ์‹  ๋„๊ตฌ์ž…๋‹ˆ๋‹ค [19, 36]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: React์˜ ๋ Œ๋”๋ง ์ตœ์ ํ™” ํ•œ๊ณ„ ๋ฐ Rules of React ์ค€์ˆ˜ ์ค‘์š”์„ฑ, ์จ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€์˜ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ [37, 38]. + +- [[Error Boundaries]] + - ์—ฐ๊ฒฐ ์ด์œ : ์‹œ์Šคํ…œ์˜ ํฌ๊ธฐ๊ฐ€ ์ปค์งˆ ๋•Œ ๋‹จ์ผ ์ปดํฌ๋„ŒํŠธ์˜ ์˜ค๋ฅ˜๊ฐ€ ์ „์ฒด ์•ฑ์˜ 'ํ™”์ดํŠธ ์Šคํฌ๋ฆฐ' ํฌ๋ž˜์‹œ๋กœ ์ด์–ด์ง€์ง€ ์•Š๊ฒŒ UI์˜ ์ผ๋ถ€๋ถ„๋งŒ ๋Œ€์ฒด(Fallback)ํ•˜์—ฌ ์‹œ์Šคํ…œ ๋ณต์›๋ ฅ(Resilience)์„ ๋ณด์žฅํ•˜๋Š” ์žฅ์น˜์ž…๋‹ˆ๋‹ค [23, 24, 39]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ํ™œ์šฉํ•œ ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ ํฌ์ฐฉ ์›๋ฆฌ ๋ฐ ๋Œ€๊ทœ๋ชจ UI ๋ณดํ˜ธ ์ „๋žต [40, 41]. + +- [[Code Splitting & Lazy Loading (์ฝ”๋“œ ๋ถ„ํ• ๊ณผ ์ง€์—ฐ ๋กœ๋”ฉ)]] + - ์—ฐ๊ฒฐ ์ด์œ : ํ”„๋ก ํŠธ์—”๋“œ ์ฝ”๋“œ๊ฐ€ ๋น„๋Œ€ํ•ด์ง€๋ฉด์„œ ์ดˆ๊ธฐ ๋กœ๋”ฉ ์†๋„(TTI, LCP)๋ฅผ ์ตœ์ ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์ˆ˜์ ์œผ๋กœ ์š”๊ตฌ๋˜๋Š” ๊ธฐ์ˆ ๋กœ, Vite๋‚˜ React.lazy๋ฅผ ํ†ตํ•ด ํ•„์š”ํ•œ ์‹œ์ ์—๋งŒ ๋ชจ๋“ˆ์„ ๋‹ค์šด๋กœ๋“œํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค [15, 17, 42]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ชจ๋“ˆ ๋ฒˆ๋“ค๋Ÿฌ์˜ ์ฒญํฌ(Chunk) ๋ถ„๋ฆฌ ์›๋ฆฌ ๋ฐ ๋ธŒ๋ผ์šฐ์ € ์„ฑ๋Šฅ ์ตœ์ ํ™”(Core Web Vitals)์™€ ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ์˜ ์ƒ๊ด€๊ด€๊ณ„ [43, 44]. + +### Deeper Research Questions + +- Feature-Sliced Design (FSD) ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋„์ž…ํ•  ๋•Œ, ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ(Feature)์ด ๊ณต์œ ํ•ด์•ผ ํ•˜๋Š” ๊ต์ฐจ ๊ด€์‹ฌ์‚ฌ(Cross-cutting concerns)๋‚˜ ํ•˜์œ„ ๊ธฐ๋Šฅ ๊ฒฐํ•ฉ ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ณ„์ธต ๋ถ„๋ฆฌ์™€ ์บก์Аํ™”๋ฅผ ํ›ผ์†ํ•˜์ง€ ์•Š๊ณ  ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? [45, 46] +- React Context API๊ฐ€ ์•ผ๊ธฐํ•˜๋Š” ๋ถˆํ•„์š”ํ•œ ๋ Œ๋” ํŠธ๋ฆฌ ๋ฆฌ๋ Œ๋”๋ง ๋ฌธ์ œ๋ฅผ Zustand๋‚˜ Redux ๊ฐ™์€ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์„ ํƒ์ž(Selector) ํŒจํ„ด ๋ฐ ์™ธ๋ถ€ ์Šคํ† ์–ด ๊ตฌ๋… ๋ฐฉ์‹๊ณผ ๋น„๊ตํ–ˆ์„ ๋•Œ, ์„ฑ๋Šฅ๊ณผ ํ™•์žฅ์„ฑ ์ธก๋ฉด์—์„œ ๊ตฌ์ฒด์ ์ธ ์ฐจ์ด๋Š” ๋ฌด์—‡์ธ๊ฐ€? [14, 35, 47] +- Vite ๋นŒ๋“œ ํ™˜๊ฒฝ์—์„œ ๋ฒˆ๋“ค ํฌ๊ธฐ ๊ฒฝ๊ณ ("Large Chunks")๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด `manualChunks`์™€ `React.lazy`๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…์„ ๊ตฌํ˜„ํ•  ๋•Œ, ์ดˆ๊ธฐ ๋ Œ๋”๋ง ์„ฑ๋Šฅ ๊ฐœ์„ ๊ณผ ๋ธŒ๋ผ์šฐ์ € ์บ์‹ฑ ํšจ์œจ์€ ๊ฐ๊ฐ ์–ด๋–ป๊ฒŒ ์ž‘์šฉํ•˜๋Š”๊ฐ€? [42, 48, 49] +- Next.js์˜ React Server Components (RSC)๋ฅผ ์ฑ„ํƒํ•จ์œผ๋กœ์จ ์„œ๋ฒ„์—์„œ ๋ฏธ๋ฆฌ ๋ Œ๋”๋งํ•˜๊ณ  ํด๋ผ์ด์–ธํŠธ ์ธก JavaScript ํŽ˜์ด๋กœ๋“œ๋ฅผ ์ค„์ด๋Š” ์ ‘๊ทผ๋ฒ•์ด, ๊ฑฐ๋Œ€ํ•œ ํ”„๋ก ํŠธ์—”๋“œ ์•ฑ์˜ ํ™•์žฅ์„ฑ์— ์–ด๋–ค ์•„ํ‚คํ…์ฒ˜์  ํŒจ๋Ÿฌ๋‹ค์ž„ ์ „ํ™˜์„ ๊ฐ€์ ธ์˜ค๋Š”๊ฐ€? [50, 51] +- React Compiler์˜ ์ž๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๋กœ์ง์ด ์„œ๋“œํŒŒํ‹ฐ ํ›…(์˜ˆ: ๋ถˆ์•ˆ์ •ํ•œ ์ฐธ์กฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ›…)๊ณผ ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ๊ธฐ์ˆ  ๋ถ€์ฑ„ ํ™˜๊ฒฝ์—์„œ ์–ด๋–ค ์ตœ์ ํ™” ์‹คํŒจ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋ฉฐ, ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๋ฆฌํŒฉํ† ๋ง ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? [38, 52] + +### Practical Application Contexts + +- **Implementation:** ๊ฑฐ๋Œ€ํ•œ React ํ”„๋กœ์ ํŠธ๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•  ๋•Œ ํŒŒ์ผ์„ ํŒŒ์ผ ์†์„ฑ ๋‹จ์œ„๊ฐ€ ์•„๋‹Œ FSD์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ(Feature) ๋ฐ ๋„๋ฉ”์ธ ๊ตฌ์กฐ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•ฉ๋‹ˆ๋‹ค. ์ƒํƒœ๊ฐ€ ์ž์ฃผ ๋ณ€๊ฒฝ๋˜๋Š” ๊ธฐ๋Šฅ์—๋Š” Zustand ์Šคํ† ์–ด๋ฅผ ์ ์šฉํ•˜๊ณ , ์„œ๋ฒ„ API ์š”์ฒญ์—๋Š” TanStack Query๋ฅผ ๋„์ž…ํ•˜์—ฌ ๋กœ์ปฌ ์ƒํƒœ์™€ ์„œ๋ฒ„ ์ƒํƒœ๋ฅผ ์™„๋ฒฝํžˆ ๋ถ„๋ฆฌ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค [2, 10, 53]. +- **System Design:** ์ปดํฌ๋„ŒํŠธ ๊ฐ„์˜ ์ˆœํ™˜ ์ฐธ์กฐ๋‚˜ ๊ฐ•ํ•œ ๊ฒฐํ•ฉ(Coupling)์„ ๋ง‰๊ธฐ ์œ„ํ•ด ์บก์Аํ™”๋œ `index.ts` ํ˜•ํƒœ์˜ Public API ์„ค๊ณ„ ํŒจํ„ด์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ Œ๋”๋ง ๋ถ€ํ•˜๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด ๋ฐ์ดํ„ฐ ๋ฆฌ์ŠคํŠธ์—๋Š” ๊ฐ€์ƒํ™”(Virtualization) ์„ค๊ณ„๋ฅผ ๋„์ž…ํ•ฉ๋‹ˆ๋‹ค [11, 22]. +- **Operation / Maintenance:** ํ”„๋กœ๋•์…˜ ๋ฐฐํฌ ํ›„ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ํฌ๋ž˜์‹œ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด Error Boundary๋ฅผ ์œ„์ ฏ ๋ฐ ์ค‘์š” UI ์„น์…˜๋งˆ๋‹ค ๊ฐ์‹ธ๋ฉฐ, LogRocket ๋˜๋Š” Sentry๋ฅผ ๋„์ž…ํ•ด ์—๋Ÿฌ ์ถ”์  ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ๋ฆญ(Memory Leaks) ์ƒํ™ฉ์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋””๋ฒ„๊น…ํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜ํ•ฉ๋‹ˆ๋‹ค [23, 26, 27]. +- **Learning Path:** ์†Œ๊ทœ๋ชจ ์žฅ๋‚œ๊ฐ ํ”„๋กœ์ ํŠธ๋กœ React์˜ ๊ธฐ์ดˆ๋ฅผ ๋‹ค์ง„ ํ›„, Context API์˜ ํ•œ๊ณ„๋ฅผ ํŒŒ์•…ํ•˜๊ณ  Zustand ๋“ฑ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ๋ฐฐ์›๋‹ˆ๋‹ค. ์ดํ›„ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ, Typescript ์ „ํ™˜, ๊ทธ๋ฆฌ๊ณ  ํด๋ฆฐ ์ฝ”๋“œ ์›์น™(SOLID, DRY) ๊ธฐ๋ฐ˜์˜ ์•„ํ‚คํ…์ฒ˜๋ง(Feature-Sliced Design) ์ตœ์ ํ™”๋กœ ๋‚˜์•„๊ฐ€๋Š” ๋‹จ๊ณ„์  ํ•™์Šต์„ ๊ฑฐ์นฉ๋‹ˆ๋‹ค [54-57]. +- **My Project Relevance:** ์†Œ์Šค์— ๊ด€๋ จ ์ •๋ณด๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. + +### Adjacent Topics + +- [[Frontend Cloud Logging Tools (ํ”„๋ก ํŠธ์—”๋“œ ํด๋ผ์šฐ๋“œ ๋กœ๊น… ๋„๊ตฌ)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์‹œ์Šคํ…œ์ด ํ”„๋กœ๋•์…˜ ๋‹จ๊ณ„์— ๋“ค์–ด๊ฐ”์„ ๋•Œ, Sentry๋‚˜ Datadog, SigNoz ๊ฐ™์€ ๋ชจ๋‹ˆํ„ฐ๋ง ํˆด์„ ํ™œ์šฉํ•ด ์‚ฌ์šฉ์ž ์„ธ์…˜๊ณผ ์—๋Ÿฌ ๋กœ๊ทธ๋ฅผ ์—ฐ๋™ํ•˜์—ฌ ๊ฐ€์‹œ์„ฑ(Observability)์„ ํ™•๋ณดํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [58-60]. +- [[Storybook Visual Regression Testing (Storybook ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋Œ€๊ทœ๋ชจ ํŒ€์—์„œ UI ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ, ๊ธฐ์กด ํ™”๋ฉด(baseline)์˜ ๋ ˆ์ด์•„์›ƒ์ด๋‚˜ ํ”ฝ์…€์ด ์˜๋„์น˜ ์•Š๊ฒŒ ๊นจ์ง€๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์ž๋™ํ™”๋œ ์‹œ๊ฐ์  ํšŒ๊ท€ ๊ฒ€์ฆ(Happo, Chromatic) ๋ฐ CI ํŒŒ์ดํ”„๋ผ์ธ ์—ฐ๋™ ๋ฐฉํ–ฅ์œผ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [61-63]. +- [[Git Branching Strategies & Workflows (Git ๋ธŒ๋žœ์น˜ ์ „๋žต ๋ฐ ์›Œํฌํ”Œ๋กœ์šฐ)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ™•์žฅ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ฐธ์—ฌํ•˜๋Š” ๊ฐœ๋ฐœ์ž ์ˆ˜๊ฐ€ ๋งŽ์•„์งˆ ๋•Œ, Trunk-based ๊ฐœ๋ฐœ์ด๋‚˜ GitHub Flow ๋“ฑ์„ ๋„์ž…ํ•˜์—ฌ ์ถฉ๋Œ์„ ์ค„์ด๊ณ  ํ‹ฐ์ผ“ ๊ธฐ๋ฐ˜ ์ถ”์ ์„ฑ์„ ํ™•๋ณดํ•˜๋Š” ํ˜•์ƒ๊ด€๋ฆฌ ๋ฐฉํ–ฅ์œผ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [31, 64]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Development/Storybook.md b/10_Wiki/Development/Storybook.md new file mode 100644 index 00000000..6d872c98 --- /dev/null +++ b/10_Wiki/Development/Storybook.md @@ -0,0 +1,66 @@ +# [[Storybook]] + +## ๐Ÿ“Œ Brief ์ฃผSummary +Storybook์€ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ ์‹œ UI ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ฃผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ๊ฒฉ๋ฆฌํ•˜์—ฌ ๊ฐœ๋ฐœํ•˜๊ณ  ๋ฌธ์„œํ™”ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค [1-3]. ํŠนํžˆ ๊ฐœ๋ฐœ๋œ ์ปดํฌ๋„ŒํŠธ์˜ ๋‹ค์–‘ํ•œ ์ƒํƒœ(์Šคํ† ๋ฆฌ)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž๋™ํ™”๋œ ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ(Visual Regression Testing) ๋ฐ ์ƒํ˜ธ์ž‘์šฉ ํ…Œ์ŠคํŠธ(Interaction Testing)๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ ์˜๋„์น˜ ์•Š์€ UI ๋ณ€๊ฒฝ์ด๋‚˜ ์ ‘๊ทผ์„ฑ ์œ„๋ฐ˜์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค [4-6]. Pull Request ๊ณผ์ •์— ๊ฒฐํ•ฉ๋˜์–ด ์•ˆ์ „ํ•œ UI ์—…๋ฐ์ดํŠธ์™€ ๋ฆฌ๋ทฐ๋ฅผ ์ง€์›ํ•˜๋Š” ํ•„์ˆ˜์ ์ธ ํ”Œ๋žซํผ์œผ๋กœ ํ™œ์šฉ๋ฉ๋‹ˆ๋‹ค [1, 7]. + +## ๐Ÿ“– Core Content +* **์ปดํฌ๋„ŒํŠธ์˜ ๊ฒฉ๋ฆฌ๋œ ๊ฐœ๋ฐœ ๋ฐ ๋ฌธ์„œํ™”** + Storybook์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฉ”์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ณต์žกํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด๋‚˜ ์ปจํ…์ŠคํŠธ์—์„œ ๋ฒ—์–ด๋‚˜ UI ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค [1]. ์ด๋Š” ๋ชจ๋…ธ๋ ˆํฌ(Monorepo) ํ™˜๊ฒฝ์ด๋‚˜ ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ฒ˜(Feature-Sliced Design ๋“ฑ)์—์„œ ๊ฐ ๊ธฐ๋Šฅ์„ ๋…๋ฆฝ์ ์œผ๋กœ ๊ฐœ๋ฐœํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•  ๋•Œ ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค [3]. ์ด๋ฏธ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฌธ์„œํ™”ํ•˜๊ณ  ๊ฐœ๋ฐœํ•˜๋Š” ์šฉ๋„๋กœ Storybook์„ ์‚ฌ์šฉ ์ค‘์ด๋ผ๋ฉด, ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ๋ฅผ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ๋น ๋ฅธ UI ๊ฒ€์ฆ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค [2]. + +* **์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ (Visual Regression Testing)** + Storybook์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜๋Š” ๊ฐ ์Šคํ† ๋ฆฌ์˜ ์Šค๋ƒ…์ƒท์„ ์บก์ฒ˜ํ•˜๊ณ  ์ด๋ฅผ ์ด์ „์— ์Šน์ธ๋œ '๋ฒ ์ด์Šค๋ผ์ธ(Baseline)'๊ณผ ๋น„๊ตํ•˜์—ฌ ์‹œ๊ฐ์  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ฐ์ง€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค [8]. ์ „ํ†ต์ ์ธ ์Šค๋ƒ…์ƒท ํ…Œ์ŠคํŠธ๊ฐ€ HTML ๋งˆํฌ์—… ๋ธ”๋กญ์„ ๋น„๊ตํ•˜์—ฌ ์‹œ๊ฐ์  ๋ณ€ํ™”๊ฐ€ ์—†์Œ์—๋„ ์˜คํƒ(false positive)์„ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๊ฒƒ๊ณผ ๋‹ฌ๋ฆฌ, Storybook์˜ ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์‹ค์ œ๋กœ ๊ฒฝํ—˜ํ•˜๋Š” '๋ Œ๋”๋ง๋œ ํ”ฝ์…€'์„ ์ง์ ‘ ๋น„๊ตํ•˜๋ฏ€๋กœ ํ›จ์”ฌ ๋” ํ’๋ถ€ํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค [9]. + +* **์ƒํ˜ธ์ž‘์šฉ ๋ฐ ์ ‘๊ทผ์„ฑ ํ…Œ์ŠคํŠธ (Interaction & Accessibility Tests)** + Storybook์€ ์ปดํฌ๋„ŒํŠธ์˜ ์™ธํ˜•๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋™์ž‘(Behavior)๊นŒ์ง€ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒํ˜ธ์ž‘์šฉ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด ๋กœ๋”ฉ, ์—๋Ÿฌ, ํ˜ธ๋ฒ„, ๋ฉ”๋‰ด ์—ด๋ฆผ ๋“ฑ ๋‹ค์–‘ํ•œ UI ์ƒํƒœ๋ฅผ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ [5], ์ด๋Ÿฌํ•œ ์ƒํƒœ ๋ณ€ํ™”์— ๋งž์ถฐ ์Šคํฌ๋ฆฐ์ƒท์„ ์ฐ์Œ์œผ๋กœ์จ ํ–‰๋™ ํ…Œ์ŠคํŠธ์™€ ์‹œ๊ฐ์  ๊ฒ€์ฆ์„ ๋™์ผํ•œ ์›Œํฌํ”Œ๋กœ์šฐ ๋‚ด์—์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5, 6]. ๋ถ€๊ฐ€์ ์œผ๋กœ ์ถ”๊ฐ€์ ์ธ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ ์—†์ด๋„ ์ ‘๊ทผ์„ฑ ํšŒ๊ท€ ํ…Œ์ŠคํŠธ๋ฅผ ํ•จ๊ป˜ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [4, 10]. + +* **CI/CD ๋ฐ ๋„๊ตฌ ํ†ตํ•ฉ (CI/CD Integrations)** + Storybook์€ Chromatic์ด๋‚˜ Happo ๊ฐ™์€ ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค ๋„๊ตฌ๋“ค๊ณผ ์›ํ™œํ•˜๊ฒŒ ํ†ตํ•ฉ๋ฉ๋‹ˆ๋‹ค [1, 4, 8]. ์ด๋Ÿฌํ•œ ๋„๊ตฌ๋ฅผ CI ํŒŒ์ดํ”„๋ผ์ธ์— ์—ฐ๋™ํ•˜๋ฉด, PR(Pull Request)์ด ์ƒ์„ฑ๋  ๋•Œ๋งˆ๋‹ค Chrome, Firefox, Safari ๋“ฑ ๋‹ค์–‘ํ•œ ์‹ค์ œ ๋ธŒ๋ผ์šฐ์ €์™€ ์—ฌ๋Ÿฌ ๋ทฐํฌํŠธ ํฌ๊ธฐ์—์„œ ์ž๋™์œผ๋กœ ์Šคํฌ๋ฆฐ์ƒท์ด ์บก์ฒ˜๋˜๊ณ  ๋ฒ ์ด์Šค๋ผ์ธ๊ณผ ๋น„๊ต๋ฉ๋‹ˆ๋‹ค [1, 4, 11]. ์ด๋ฅผ ํ†ตํ•ด ๋ฆฌ๋ทฐ์–ด๋Š” ๊ฐ ์ƒํƒœ๋ฅผ ์ˆ˜๋™์œผ๋กœ ํ™•์ธํ•  ํ•„์š” ์—†์ด ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„(Diff)์—๋งŒ ์ง‘์ค‘ํ•˜์—ฌ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์Šน์ธ(Accept)ํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2, 12, 13]. + +## โš–๏ธ Trade-offs & Caveats +* **ํ…Œ์ŠคํŠธ์˜ ๋ถˆ์•ˆ์ •์„ฑ(Flakiness) ๋ฐ ๋…ธ์ด์ฆˆ ๋ฌธ์ œ:** ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜, ๋น„๋™๊ธฐ ์ž์‚ฐ(Asset), ํฐํŠธ ๋กœ๋”ฉ ๋“ฑ์œผ๋กœ ์ธํ•ด ๊นจ์ง€๊ธฐ ์‰ฝ๊ฑฐ๋‚˜ ๋ถˆ์•ˆ์ •ํ•ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [10, 11]. ๋˜ํ•œ ์ด๋ฏธ์ง€ ์••์ถ• ๋…ธ์ด์ฆˆ๋‚˜ ์•ˆํ‹ฐ์•จ๋ฆฌ์–ด์‹ฑ(anti-aliasing)๊ณผ ๊ฐ™์€ ๋ฏธ์„ธํ•œ ์ฐจ์ด๋กœ ์ธํ•ด ์‹คํŒจํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค [10, 14]. ์ด๋ฅผ ์™„ํ™”ํ•˜๊ธฐ ์œ„ํ•ด Happo ๋“ฑ์€ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ž๋™์œผ๋กœ ๋ฌดํšจํ™”ํ•˜๊ณ  ๋น„๋™๊ธฐ ์ž์‚ฐ์„ ๋Œ€๊ธฐํ•˜๋ฉฐ, ์‹œ๊ฐ์  ๋ณ€๊ฒฝ์— ๋Œ€ํ•œ ์ƒ‰์ƒ ํ—ˆ์šฉ ์˜ค์ฐจ(color-delta tolerance)๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•˜๋Š” ์ œ์•ฝ๊ณผ ์„ค์ • ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค [11, 14]. +* **์ถ”๊ฐ€์ ์ธ ๋ฆฌ๋ทฐ ๋ณ‘๋ชฉ ๋ฐ CI ์„ค์ • ์˜ค๋ฒ„ํ—ค๋“œ:** ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ๊ฐ€ ์œ ํšจํ•˜๋ ค๋ฉด ๋ณ€๊ฒฝ๋œ ์Šคํฌ๋ฆฐ์ƒท์ด ์˜๋„๋œ ๊ฒƒ์ธ์ง€(์ƒˆ๋กœ์šด ๋ฒ ์ด์Šค๋ผ์ธ์œผ๋กœ ์ˆ˜๋ฝ) ์•„๋‹ˆ๋ฉด ๋ฒ„๊ทธ์ธ์ง€ ํŒ๋‹จํ•˜๋Š” ํŒ€์›์˜ ์ˆ˜๋™ ๋ฆฌ๋ทฐ ๊ณผ์ •์ด ๋ฐ˜๋“œ์‹œ ์ˆ˜๋ฐ˜๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [12, 13]. ๋˜ํ•œ CI/CD์—์„œ ์›ํ™œํ•˜๊ฒŒ ๋™์ž‘ํ•˜๋„๋ก ํ”„๋กœ์ ํŠธ ํ† ํฐ ๋“ฑ ์ธ์ฆ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ  ํŒŒ์ดํ”„๋ผ์ธ์„ ์„ค์ •ํ•˜๋Š” ์ดˆ๊ธฐ ์ž‘์—…์ด ์š”๊ตฌ๋ฉ๋‹ˆ๋‹ค [7]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [ํ…Œ์ŠคํŠธ ๋ฐ ๊ฒ€์ฆ ๊ธฐ๋ฒ• (Testing Methods)] +- [[Visual Regression Testing]] + - ์—ฐ๊ฒฐ ์ด์œ : Storybook์ด ์ปดํฌ๋„ŒํŠธ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํ”ฝ์…€ ๋‹จ์œ„๋กœ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ํ•ต์‹ฌ ํ…Œ์ŠคํŠธ ๋ฐฉ๋ฒ•๋ก ์ž…๋‹ˆ๋‹ค [4, 8]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: HTML ๋งˆํฌ์—…์„ ๋น„๊ตํ•˜๋Š” Snapshot Test์˜ ํ•œ๊ณ„์ ๊ณผ ์˜คํƒ(False Positive)์˜ ์›๋ฆฌ, ๊ทธ๋ฆฌ๊ณ  ํ”ฝ์…€ ๋ Œ๋”๋ง ๊ธฐ๋ฐ˜ ๋น„๊ต์˜ ์žฅ์ ์„ ๋ช…ํ™•ํžˆ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [9]. + +- [[Interaction Testing]] + - ์—ฐ๊ฒฐ ์ด์œ : ์ปดํฌ๋„ŒํŠธ์˜ ๋‹จ์ˆœํ•œ ๋ Œ๋”๋ง๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์œ ์ €์˜ ํ–‰๋™(์ด๋ฒคํŠธ, ์ƒํƒœ ๋“ฑ)์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜์—ฌ ๋‹ค์–‘ํ•œ UI ์ƒํƒœ(๋กœ๋”ฉ, ํ˜ธ๋ฒ„ ๋“ฑ)๋ฅผ ๊ฒ€์ฆํ•˜๋Š” Storybook์˜ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค [5, 6]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ƒํƒœ ์ „์ด์— ๋”ฐ๋ผ ๋™์ ์œผ๋กœ ๋ณ€ํ•˜๋Š” UI๋ฅผ ์–ด๋–ป๊ฒŒ ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ์™€ ๊ฒฐํ•ฉํ•˜์—ฌ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์›๋ฆฌ๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5]. + +#### [ํ†ตํ•ฉ ๋ฐ ์ž๋™ํ™” ๋„๊ตฌ (Integration Tools)] +- [[Chromatic]] + - ์—ฐ๊ฒฐ ์ด์œ : Storybook ์œ ์ง€๋ณด์ˆ˜ ํŒ€์ด ๋งŒ๋“  ๊ณต์‹ ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค๋กœ, ํฌ๋กœ์Šค ๋ธŒ๋ผ์šฐ์ € ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ์™€ CI ํ†ตํ•ฉ์„ ๋„ค์ดํ‹ฐ๋ธŒ๋กœ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค [8, 15]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ์—์„œ ๋ฒ ์ด์Šค๋ผ์ธ(Baseline) ์ด๋ฏธ์ง€๊ฐ€ ์–ด๋–ป๊ฒŒ ์ €์žฅ, ๋น„๊ต, ๋™๊ธฐํ™”๋˜๋Š”์ง€ CI/CD ํŒŒ์ดํ”„๋ผ์ธ ํ†ตํ•ฉ ๊ณผ์ •์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [7, 13]. + +- [[Happo]] + - ์—ฐ๊ฒฐ ์ด์œ : Storybook๊ณผ ํ†ตํ•ฉ๋˜์–ด ๋‹ค์ค‘ ๋ธŒ๋ผ์šฐ์ € ์Šคํฌ๋ฆฐ์ƒท ํ…Œ์ŠคํŠธ ๋ฐ ์ ‘๊ทผ์„ฑ ํšŒ๊ท€ ํ…Œ์ŠคํŠธ๋ฅผ ๋ณ‘๋ ฌ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค [4]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Flakiness ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ •์ง€ํ•˜๊ฑฐ๋‚˜ ์ƒ‰์ƒ ์˜ค์ฐจ ๋ฒ”์œ„(color-delta tolerance)๋ฅผ ์„ค์ •ํ•˜์—ฌ ์‹œ๊ฐ์  ๋…ธ์ด์ฆˆ๋ฅผ ์ค„์ด๋Š” ๊ตฌ์ฒด์  ์ตœ์ ํ™” ๊ธฐ๋ฒ•์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [11, 14]. + +### Deeper Research Questions +- Storybook์˜ Visual Test์™€ ์ „ํ†ต์ ์ธ HTML Snapshot Test๋ฅผ ๋น„๊ตํ–ˆ์„ ๋•Œ, ์‹ค์ œ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์œ ์ง€๋ณด์ˆ˜ ์˜ค๋ฒ„ํ—ค๋“œ์™€ ์˜คํƒ(false positive) ๋น„์œจ์˜ ์ฐจ์ด๋Š” ์–ด๋– ํ•œ๊ฐ€? +- ์• ๋‹ˆ๋ฉ”์ด์…˜, ๋น„๋™๊ธฐ ํฐํŠธ ๋กœ๋”ฉ ๋“ฑ์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” Visual Test์˜ Flakiness๋ฅผ ์™„์ „ํžˆ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•ด Chromatic์ด๋‚˜ Happo๋Š” ์–ด๋–ค ๋ Œ๋”๋ง ํŒŒ์ดํ”„๋ผ์ธ ์ œ์–ด ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜๋Š”๊ฐ€? +- Storybook์˜ Interaction Test๋กœ ๋ณต์žกํ•œ ์‚ฌ์šฉ์ž ์—ฌ์ •(User Journey)์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•  ๋•Œ, ์ƒํƒœ๋ณ„ ์Šคํฌ๋ฆฐ์ƒท ์บก์ฒ˜๊ฐ€ CI ๋นŒ๋“œ ์‹œ๊ฐ„์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ๊ณผ ์ด๋ฅผ ๋ณ‘๋ ฌํ™”ํ•˜์—ฌ ์ตœ์ ํ™”ํ•˜๋Š” ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? +- ๋ชจ๋…ธ๋ ˆํฌ(Monorepo) ํ™˜๊ฒฝ์ด๋‚˜ Feature-Sliced Design ์•„ํ‚คํ…์ฒ˜์—์„œ ์ˆ˜๋ฐฑ ๊ฐœ์˜ ๊ธฐ๋Šฅ ๋ชจ๋“ˆ์ด ๊ฐ๊ฐ ๋ถ„๋ฆฌ๋œ Storybook์„ ๊ฐ€์งˆ ๋•Œ, ์ด๋ฅผ ํ†ตํ•ฉ์ ์œผ๋กœ ๋นŒ๋“œํ•˜๊ณ  ์‹œ๊ฐ์  ํšŒ๊ท€๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ๋ฒ ์ŠคํŠธ ํ”„๋ž™ํ‹ฐ์Šค๋Š” ๋ฌด์—‡์ธ๊ฐ€? +- Storybook์„ ์‚ฌ์šฉํ•œ ์‹œ๊ฐ์  ์ ‘๊ทผ์„ฑ ํ…Œ์ŠคํŠธ(Accessibility regression testing)๊ฐ€ ์‹ค์ œ DOM ๊ธฐ๋ฐ˜์˜ ์ ‘๊ทผ์„ฑ ๊ฐ์‚ฌ ๋„๊ตฌ(aXe ๋“ฑ)์™€ ๋น„๊ตํ•˜์—ฌ ๊ฐ–๋Š” ํ•œ๊ณ„์ ๊ณผ ๋ณด์™„์ ์€ ๋ฌด์—‡์ธ๊ฐ€? + +### Practical Application Contexts +- **Implementation:** React ๋“ฑ UI ํ”„๋ ˆ์ž„์›Œํฌ ๊ธฐ๋ฐ˜ ํ”„๋กœ์ ํŠธ์—์„œ ๋ณต์žกํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์•ฑ์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ๋ถ„๋ฆฌํ•˜์—ฌ `Button`, `Modal` ๋“ฑ์˜ ์š”์†Œ๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ๋ Œ๋”๋งํ•˜๊ณ , ํ˜ธ๋ฒ„ ๋ฐ ์—๋Ÿฌ ์ƒํƒœ์˜ Story๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. +- **System Design:** Feature-Sliced Design์ฒ˜๋Ÿผ ๋„๋ฉ”์ธ๊ณผ ํ”ผ์ฒ˜๊ฐ€ ๋šœ๋ ทํ•˜๊ฒŒ ๋‚˜๋‰œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋„์ž…ํ•  ๋•Œ, ๊ฐ ํ”ผ์ฒ˜ ํด๋”๋ณ„๋กœ Storybook ํ™˜๊ฒฝ์„ ์„ธํŒ…ํ•˜์—ฌ ๊ฒฉ๋ฆฌ๋œ ๊ฐœ๋ฐœ ๋ฐ ํ…Œ์ŠคํŠธ ๊ตฌ์กฐ๋ฅผ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค. +- **Operation / Maintenance:** CI/CD ์›Œํฌํ”Œ๋กœ์šฐ์— Chromatic ๋˜๋Š” Happo๋ฅผ ์—ฐ๋™ํ•˜์—ฌ, ํŒ€์›์ด PR์„ ์˜ฌ๋ฆด ๋•Œ๋งˆ๋‹ค ์ž๋™์œผ๋กœ ์‹œ๊ฐ์  ๋ณ€๊ฒฝ ์‚ฌํ•ญ(Visual Diff)์ด ์บก์ฒ˜๋˜๊ณ  ์ด๋ฅผ ๋ฆฌ๋ทฐ์–ด๊ฐ€ ์ง์ ‘ ํ™•์ธ ํ›„ ๋ณ‘ํ•ฉ(Merge)ํ•˜๋Š” ์šด์˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ตฌ์ถ•ํ•ฉ๋‹ˆ๋‹ค. +- **Learning Path:** ๊ธฐ๋ณธ UI ์ปดํฌ๋„ŒํŠธ ๊ฒฉ๋ฆฌ ๊ฐœ๋ฐœ -> Story ์ž‘์„ฑ์„ ํ†ตํ•œ ๋ฌธ์„œํ™” -> Interaction Test ์ž‘์„ฑ -> ์ž๋™ํ™”๋œ Visual Regression Test ๊ตฌ์ถ•์œผ๋กœ ์ด์–ด์ง€๋Š” ํ”„๋ก ํŠธ์—”๋“œ ํ’ˆ์งˆ ๋ณด์ฆ ํ•™์Šต ๊ฒฝ๋กœ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. +- **My Project Relevance:** ํ˜„์žฌ ์œ ์ง€๋ณด์ˆ˜ ์ค‘์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฆฌํŒฉํ† ๋ง์ด๋‚˜ ์ƒˆ๋กœ์šด ๋””์ž์ธ ์‹œ์Šคํ…œ(UI ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ) ๊ตฌ์ถ• ์ž‘์—… ์‹œ, ์‹ค์ˆ˜๋กœ ๋ฐœ์ƒํ•˜๋Š” CSS/๋ ˆ์ด์•„์›ƒ ๊นจ์ง์„ ์‚ฌ์ „์— ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์•ˆ์ „์žฅ์น˜๋กœ ๋„์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### Adjacent Topics +- [[Pull Request Workflow]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: Storybook ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ์˜ ๊ฒฐ๊ณผ๋ฅผ GitHub, GitLab ๋“ฑ์˜ ๋ฆฌ๋ทฐ ํ”„๋กœ์„ธ์Šค์™€ ๊ฒฐํ•ฉํ•˜์—ฌ, ๋ฒ„๊ทธ ์—†๋Š” UI ์ฝ”๋“œ๋ฅผ ๋ฐฐํฌํ•˜๊ธฐ ์œ„ํ•œ ํ˜‘์—… ๋ฐ ๊ฒ€์ฆ ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ• ์ „๋žต์œผ๋กœ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค. +- [[Feature-Sliced Design]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ํ”„๋ก ํŠธ์—”๋“œ ์ฝ”๋“œ๋ฅผ ๊ธฐ๋Šฅ(Feature) ๋‹จ์œ„๋กœ ๋ถ„๋ฆฌํ•  ๋•Œ, Storybook์„ ์ด์šฉํ•ด ๊ฐ ๊ธฐ๋Šฅ์˜ UI ์ปดํฌ๋„ŒํŠธ๋“ค์„ ๋ฉ”์ธ ์•ฑ์— ์˜์กดํ•˜์ง€ ์•Š๊ณ  ๋…๋ฆฝ์ ์œผ๋กœ ์ž‘๋™ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ์„ค๊ณ„ ์›์น™์œผ๋กœ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Development/Visual Regression Testing.md b/10_Wiki/Development/Visual Regression Testing.md new file mode 100644 index 00000000..7711b648 --- /dev/null +++ b/10_Wiki/Development/Visual Regression Testing.md @@ -0,0 +1,57 @@ +# [[Visual Regression Testing]] + +## ๐Ÿ“Œ Brief Summary +์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ(Visual Regression Testing)๋Š” ์Šคํ† ๋ฆฌ๋ถ(Storybook) ๋“ฑ์˜ ๋„๊ตฌ๋กœ ๋ Œ๋”๋ง๋œ ์ปดํฌ๋„ŒํŠธ์˜ ํ”ฝ์…€ ๋‹จ์œ„ ์Šคํฌ๋ฆฐ์ƒท์„ ์บก์ฒ˜ํ•˜์—ฌ ์ด์ „์— ์•Œ๋ ค์ง„ "์ •์ƒ(baseline)" ์ƒํƒœ์˜ ์Šคํฌ๋ฆฐ์ƒท๊ณผ ์ž๋™์œผ๋กœ ๋น„๊ตํ•˜๋Š” ํ…Œ์ŠคํŠธ ๋ฐฉ์‹์ด๋‹ค [1, 2]. ์ด๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๋Š” ํ’€ ๋ฆฌํ€˜์ŠคํŠธ(PR) ๊ณผ์ •์—์„œ ์˜๋„์น˜ ์•Š์€ UI ๋ ˆ์ด์•„์›ƒ, ์ƒ‰์ƒ, ํƒ€์ดํฌ๊ทธ๋ž˜ํ”ผ ๋“ฑ์˜ ์‹œ๊ฐ์  ๋ณ€๊ฒฝ์ด๋‚˜ ๊ฒฐํ•จ์„ ์ฐพ์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค [3-5]. HTML ๋งˆํฌ์—…๋งŒ ๋น„๊ตํ•˜๋Š” ๊ธฐ์กด์˜ ์Šค๋ƒ…์ƒท ํ…Œ์ŠคํŠธ์™€ ๋‹ฌ๋ฆฌ, ์‹ค์ œ ์‚ฌ์šฉ์ž๊ฐ€ ๊ฒฝํ—˜ํ•˜๋Š” ํ™”๋ฉด ํ”ฝ์…€์„ ์ง์ ‘ ๊ฒ€์ฆํ•˜๋ฏ€๋กœ ์ถ”๊ฐ€์ ์ธ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ์ด๋‚˜ ์œ ์ง€๋ณด์ˆ˜ ๋ถ€๋‹ด์„ ์ค„์ด๋ฉด์„œ๋„ ์˜คํƒ(false positive)์„ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ํŠน์ง•์ด๋‹ค [1, 2]. + +## ๐Ÿ“– Core Content +* **์ž‘๋™ ์›๋ฆฌ ๋ฐ ํ”„๋กœ์„ธ์Šค:** ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ๋Š” ์ฝ”๋“œ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ ๋ชจ๋“  ์Šคํ† ๋ฆฌ(story)๋ฅผ ์‹ค์ œ ๋ธŒ๋ผ์šฐ์ €(Chrome, Firefox, Safari ๋“ฑ) ํ™˜๊ฒฝ์—์„œ ๋ Œ๋”๋งํ•˜๊ณ , ํ•ด๋‹น ํ™”๋ฉด์„ ์บก์ฒ˜ํ•˜์—ฌ ๊ธฐ์กด์˜ ๊ธฐ์ค€์„ (baseline)๊ณผ ๋น„๊ตํ•œ๋‹ค [4, 6]. ๋งŒ์•ฝ ๋ ˆ์ด์•„์›ƒ์ด๋‚˜ ์ƒ‰์ƒ ๋“ฑ์— ์˜๋„์น˜ ์•Š์€ ๋ณ€ํ™”๊ฐ€ ๊ฐ์ง€๋˜๋ฉด ํ•ด๋‹น ์ฐจ์ด์ ์„ ๊ฐ•์กฐํ•˜์—ฌ PR์—์„œ ์ˆ˜๋™ ๊ฒ€ํ† ๋ฅผ ๊ฑฐ์น˜๊ฒŒ ํ•จ์œผ๋กœ์จ ์‹œ๊ฐ์  ๊ฒฐํ•จ์ด ํ”„๋กœ๋•์…˜์œผ๋กœ ๋ฐฐํฌ๋˜๋Š” ๊ฒƒ์„ ์ฐจ๋‹จํ•œ๋‹ค [3, 6, 7]. ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์˜๋„๋œ ๊ฒƒ์ด๋ผ๋ฉด ๊ฐœ๋ฐœ์ž๊ฐ€ ์ƒˆ๋กœ์šด ๊ธฐ์ค€์„ ์œผ๋กœ ์Šน์ธ(accept)ํ•˜์—ฌ ๋กœ์ปฌ ๋ฐ CI ํ™˜๊ฒฝ์— ๋™๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค [7, 8]. +* **์Šค๋ƒ…์ƒท ํ…Œ์ŠคํŠธ(Snapshot Testing)์™€์˜ ์ฐจ์ด์ :** ๊ธฐ์กด ์Šค๋ƒ…์ƒท ํ…Œ์ŠคํŠธ๋Š” ๋ Œ๋”๋ง๋œ HTML ๋งˆํฌ์—… ๋ธ”๋ก์„ ๋น„๊ตํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ฝ”๋“œ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์œผ๋‚˜ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์ด๋Š” ์‹ค์ œ ์‹œ๊ฐ์  ๋ณ€๊ฒฝ์ด ์—†๋Š” ๊ฒฝ์šฐ์—๋„ ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ•˜๋Š” ์˜คํƒ(false positive)์ด ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฝ๋‹ค [2]. ๋ฐ˜๋ฉด ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ๋Š” ๋ Œ๋”๋ง๋œ ํ”ฝ์…€ ์ž์ฒด๋ฅผ ๋น„๊ตํ•˜๋ฏ€๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ์‹ค์ œ๋กœ ๊ฒฝํ—˜ํ•˜๋Š” UI์˜ ๋ชจ์–‘, ๊ฐ„๊ฒฉ, ๋ฐ˜์‘ํ˜• ๋™์ž‘ ๋“ฑ์„ ํ›จ์”ฌ ๋” ์ •ํ™•ํ•˜๊ณ  ํ’๋ถ€ํ•˜๊ฒŒ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๋‹ค [2, 5]. +* **์ธํ„ฐ๋ž™์…˜(Interaction) ๊ธฐ๋ฐ˜ ์ƒํƒœ ๊ฒ€์ฆ:** ์ปดํฌ๋„ŒํŠธ์˜ ๋กœ๋”ฉ, ์—๋Ÿฌ, ํ˜ธ๋ฒ„(hover), ๋ฉ”๋‰ด ์—ด๋ฆผ ๋“ฑ์˜ ๋‹ค์–‘ํ•œ UI ์ƒํƒœ๋ฅผ ๊ฒ€์ฆํ•˜๊ธฐ ์œ„ํ•ด ์Šคํ† ๋ฆฌ๋ถ์˜ ์ธํ„ฐ๋ž™์…˜ ํ…Œ์ŠคํŠธ์™€ ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ๋ฅผ ๊ฒฐํ•ฉํ•  ์ˆ˜ ์žˆ๋‹ค [9]. ์ธํ„ฐ๋ž™์…˜ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด ์ปดํฌ๋„ŒํŠธ๋ฅผ ํŠน์ • ์ƒํƒœ๋กœ ๋งŒ๋“  ํ›„ ์Šคํฌ๋ฆฐ์ƒท์„ ์ฐ์Œ์œผ๋กœ์จ ๋™์ ์ธ ํ–‰๋™์— ๋Œ€ํ•œ ์‹œ๊ฐ์  ๊ฒฐํ•จ ์œ ๋ฌด๊นŒ์ง€ ํ•˜๋‚˜์˜ ์›Œํฌํ”Œ๋กœ์šฐ ์•ˆ์—์„œ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค [9, 10]. +* **CI ํŒŒ์ดํ”„๋ผ์ธ ์ž๋™ํ™”:** ์ด ํ…Œ์ŠคํŠธ๋Š” GitHub Actions, GitLab Pipelines ๋“ฑ CI ํ™˜๊ฒฝ๊ณผ ์›ํ™œํ•˜๊ฒŒ ํ†ตํ•ฉ๋˜์–ด ํ’€ ๋ฆฌํ€˜์ŠคํŠธ(PR)๋งˆ๋‹ค ์ž๋™์œผ๋กœ ์‹คํ–‰๋œ๋‹ค [11, 12]. ํ…Œ์ŠคํŠธ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด PR์— UI ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•œ ์•Œ๋ฆผ(badge)์„ ์ œ๊ณตํ•˜์—ฌ, ๋ฆฌ๋ทฐ์–ด๊ฐ€ ๋ชจ๋“  ์ƒํƒœ๋ฅผ ์ผ์ผ์ด ํ™•์ธํ•˜๋Š” ๋Œ€์‹  ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„(diffs)์—๋งŒ ์ง‘์ค‘ํ•ด์„œ ๋ฆฌ๋ทฐํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š”๋‹ค [6, 12]. + +## โš–๏ธ Trade-offs & Caveats +* **๋ฏธ์„ธํ•œ ํ”ฝ์…€ ์ฐจ์ด๋กœ ์ธํ•œ ๋…ธ์ด์ฆˆ(Flakiness):** ๋ธŒ๋ผ์šฐ์ €์˜ ์ด๋ฏธ์ง€ ์••์ถ• ๋…ธ์ด์ฆˆ๋‚˜ ์•ˆํ‹ฐ์•จ๋ฆฌ์–ด์‹ฑ(anti-aliasing) ์ฒ˜๋ฆฌ ๋“ฑ ์•„์ฃผ ๋ฏธ์„ธํ•œ ํ”ฝ์…€ ์ฐจ์ด ๋•Œ๋ฌธ์— ์‹ค์ œ๋กœ๋Š” ๊ฒฐํ•จ์ด ์•„๋‹˜์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์‹œ๊ฐ์  ๋ณ€๊ฒฝ์œผ๋กœ ๊ฐ์ง€๋˜๋Š” ํ…Œ์ŠคํŠธ ๋ถˆ์•ˆ์ •์„ฑ(Flake)์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค [11, 13]. ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ ๋„๊ตฌ์—์„œ๋Š” ์ƒ‰์ƒ ์ฐจ์ด ํ—ˆ์šฉ์น˜(color-delta tolerance) ์ž„๊ณ„๊ฐ’์„ ์„ค์ •ํ•˜์—ฌ ํ•ด๋‹น ๋ฒ”์ฃผ ์•„๋ž˜์˜ ์ฐจ์ด๋Š” ๋…ธ์ด์ฆˆ๋กœ ๋ฌด์‹œํ•˜๋Š” ์ตœ์ ํ™” ์ž‘์—…์ด ์š”๊ตฌ๋œ๋‹ค [10, 13]. +* **๋น„๋™๊ธฐ ์š”์†Œ ๋ฐ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ œ์–ด์˜ ํ•„์š”์„ฑ:** ์ปดํฌ๋„ŒํŠธ์— ํฌํ•จ๋œ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด๋‚˜ ๋น„๋™๊ธฐ ์—์…‹, ํฐํŠธ ๋“ฑ์ด ์™„์ „ํžˆ ๋ Œ๋”๋ง๋˜๊ธฐ ์ „์— ์Šคํฌ๋ฆฐ์ƒท์ด ์บก์ฒ˜๋˜๋ฉด ๋งค๋ฒˆ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์™€ ์ผ๊ด€๋œ ํ…Œ์ŠคํŠธ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•ด์ง„๋‹ค [10, 11]. ๋”ฐ๋ผ์„œ ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ ๋„๊ตฌ(Happo ๋“ฑ)๋Š” ์บก์ฒ˜ ์ „ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ž๋™์œผ๋กœ ์Œ์†Œ๊ฑฐ(silence) ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜ ๋น„๋™๊ธฐ ์š”์†Œ์˜ ๋กœ๋”ฉ์„ ๊ฐ•์ œ๋กœ ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๋Š” ๊ธฐ์ˆ ์  ์ œ์•ฝ๊ณผ ์ถ”๊ฐ€ ์„ค์ •์ด ํ•„์š”ํ•˜๋‹ค [10, 11]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [ํ…Œ์ŠคํŠธ ๋ฐ ๊ฒ€์ฆ ๊ธฐ์ˆ ] +- [[Snapshot Testing]] + - ์—ฐ๊ฒฐ ์ด์œ : ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ์™€ ๋Œ€์กฐ๋˜๋Š” ํ…Œ์ŠคํŠธ ๋ฐฉ์‹์œผ๋กœ, ํ”ฝ์…€์ด ์•„๋‹Œ ๋ Œ๋”๋ง๋œ HTML ๋งˆํฌ์—… ์ฝ”๋“œ ๋ฉ์–ด๋ฆฌ๋ฅผ ๋น„๊ตํ•œ๋‹ค [2]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: HTML ๊ตฌ์กฐ ๋น„๊ต ๋ฐฉ์‹์ด ์™œ ๋นˆ๋ฒˆํ•˜๊ฒŒ ์˜คํƒ(False Positive)์„ ๋ฐœ์ƒ์‹œํ‚ค๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ํ”ฝ์…€ ๊ธฐ๋ฐ˜ ๋น„๊ต๊ฐ€ ์œ ์ง€๋ณด์ˆ˜์— ์™œ ๋” ์œ ๋ฆฌํ•œ์ง€ ๋ช…ํ™•ํ•˜๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค [2]. +- [[Interaction Testing]] + - ์—ฐ๊ฒฐ ์ด์œ : ์‚ฌ์šฉ์ž์˜ ์ƒํ˜ธ์ž‘์šฉ์ด๋‚˜ ์ด๋ฒคํŠธ๋ฅผ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ์˜ ํŠน์ • UI ์ƒํƒœ๋ฅผ ์œ ๋„ํ•˜๋Š” ํ…Œ์ŠคํŠธ ๋ฐฉ์‹์ด๋‹ค [5, 10]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ •์  UI ํ™”๋ฉด๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋กœ๋”ฉ, ์—๋Ÿฌ, ํด๋ฆญ ์‹œ ๋“œ๋กญ๋‹ค์šด ์˜คํ”ˆ ๋“ฑ ๋™์ ์œผ๋กœ ๋ณ€ํ™”ํ•˜๋Š” UI ์ƒํƒœ๋ฅผ ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ๊ฐ€ ์–ด๋–ป๊ฒŒ ์บก์ฒ˜ํ•˜๊ณ  ๊ฒ€์ฆํ•˜๋Š”์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค [9, 10]. + +#### [๊ตฌํ˜„ ๋ฐ ํ™œ์šฉ ๋„๊ตฌ] +- [[Storybook]] + - ์—ฐ๊ฒฐ ์ด์œ : UI ์ปดํฌ๋„ŒํŠธ๋ฅผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ณต์žกํ•œ ๋กœ์ง๊ณผ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ฒฉ๋ฆฌ๋œ ํ™˜๊ฒฝ์—์„œ ์‹œ๊ฐ์ ์œผ๋กœ ๊ฐœ๋ฐœํ•˜๊ณ  ๋ฌธ์„œํ™”ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋„๊ตฌ์ด๋‹ค [3, 6]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ๊ฐ€ ์ „์ฒด ํŽ˜์ด์ง€ ๋‹จ์œ„๊ฐ€ ์•„๋‹Œ ๊ฐœ๋ณ„ ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ(Story) ๋‹จ์œ„๋กœ ๋ Œ๋”๋ง๋˜๊ณ  ๊ธฐ์ค€์„ ๊ณผ ๋น„๊ต๋˜๋Š” ์•„ํ‚คํ…์ฒ˜์  ๊ธฐ๋ฐ˜์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค [1]. +- [[Chromatic]] / [[Happo]] + - ์—ฐ๊ฒฐ ์ด์œ : Storybook๊ณผ ์—ฐ๊ฒฐ๋˜์–ด ์‹ค์ œ ๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋ฐ˜์˜ ์Šคํฌ๋ฆฐ์ƒท ์บก์ฒ˜, ๋ฒ ์ด์Šค๋ผ์ธ ํ”ฝ์…€ ๋น„๊ต, CI/CD ์—ฐ๋™ ๋“ฑ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค(๋„๊ตฌ)์ด๋‹ค [1, 3, 4]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ž๋™ํ™”๋œ ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ๊ฐ€ ๋ธŒ๋ผ์šฐ์ € ๊ฐ„์˜ ๋ Œ๋”๋ง ์ฐจ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ๋ณ‘๋ ฌ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ  ํ’€ ๋ฆฌํ€˜์ŠคํŠธ(PR) ํ”„๋กœ์„ธ์Šค์™€ ์–ด๋–ป๊ฒŒ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค [4, 12]. + +### Deeper Research Questions +- Snapshot Testing์—์„œ Visual Regression Testing์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ๋•Œ, ๋Œ€๊ทœ๋ชจ ์ปดํฌ๋„ŒํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ™˜๊ฒฝ์—์„œ ์ดˆ๊ธฐ ๊ธฐ์ค€์„ (baseline) ๊ตฌ์ถ• ๋ฐ ์Šคํ† ๋ฆฌ์ง€ ์œ ์ง€๋ณด์ˆ˜ ๋น„์šฉ์€ ์–ด๋–ป๊ฒŒ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- Chromatic์ด๋‚˜ Happo์™€ ๊ฐ™์€ ๋„๊ตฌ๊ฐ€ ํฌ๋กœ์Šค ๋ธŒ๋ผ์šฐ์ €(Chrome, Safari, Firefox ๋“ฑ)์—์„œ ๋™์ผํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋งํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” OS/๋ธŒ๋ผ์šฐ์ € ์—”์ง„๋ณ„ ๋ฏธ์„ธํ•œ ๋ Œ๋”๋ง ์ฐจ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋ณด์ •ํ•˜๋Š”๊ฐ€? +- ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ ํŒŒ์ดํ”„๋ผ์ธ์„ CI/CD์— ํ†ตํ•ฉํ–ˆ์„ ๋•Œ ๋นŒ๋“œ ์‹œ๊ฐ„ ์ง€์—ฐ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ(Parallelization) ๋ฐ ์ตœ์ ํ™” ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? +- ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋ฐ ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๋ณต์žกํ•œ ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ์ปดํฌ๋„ŒํŠธ์—์„œ ํ…Œ์ŠคํŠธ์˜ ๋ถˆ์•ˆ์ •์„ฑ(Flakiness)์„ ์ฝ”๋“œ ๋ ˆ๋ฒจ์—์„œ ๊ทผ๋ณธ์ ์œผ๋กœ ์ œ๊ฑฐํ•˜๋ ค๋ฉด ์ปดํฌ๋„ŒํŠธ๋ฅผ ์–ด๋–ป๊ฒŒ ์„ค๊ณ„ํ•ด์•ผ ํ•˜๋Š”๊ฐ€? +- Visual Regression Testing๊ณผ Accessibility Regression Testing์„ ํ•˜๋‚˜์˜ ์›Œํฌํ”Œ๋กœ์šฐ๋กœ ๊ฒฐํ•ฉํ–ˆ์„ ๋•Œ, ์ ‘๊ทผ์„ฑ ์œ„๋ฐ˜ ์‚ฌํ•ญ์ด ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ค ์‹œ๊ฐ์  ์ง€ํ‘œ์™€ ํ•จ๊ป˜ ๋ฆฌํฌํŠธ๋˜๋ฉฐ PR ๋ฆฌ๋ทฐ ํ”„๋กœ์„ธ์Šค๋Š” ์–ด๋–ป๊ฒŒ ํšจ์œจํ™”๋˜๋Š”๊ฐ€? + +### Practical Application Contexts +- **Implementation:** Storybook์œผ๋กœ UI ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฐœ๋ฐœํ•œ ํ›„, Chromatic์ด๋‚˜ Happo ๋“ฑ์˜ ์• ๋“œ์˜จ์„ ์„ค์น˜ํ•˜์—ฌ ์ฝ”๋“œ ๋ณ€๊ฒฝ ์‹œ๋งˆ๋‹ค ๊ฐ ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ๋ณ„ ์Šคํฌ๋ฆฐ์ƒท์„ ์ž๋™์œผ๋กœ ์บก์ฒ˜ํ•˜๊ณ  ๊ธฐ์ค€์„ ๊ณผ ๋น„๊ตํ•˜๋„๋ก ์„ค์ •ํ•œ๋‹ค [4, 14]. +- **System Design:** ํ”„๋ก ํŠธ์—”๋“œ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ ์‹œ, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ UI๋ฅผ ์ฒ ์ €ํžˆ ๋ถ„๋ฆฌํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ตฌ์ถ•ํ•˜๊ณ , ์‹œ๊ฐ์  ๊ฒ€์ฆ ์‹œ์Šคํ…œ์„ ๋„์ž…ํ•˜์—ฌ ๋Œ€๊ทœ๋ชจ ํŒ€์ด ๋™์‹œ์— ๊ฐœ๋ฐœํ•˜๋”๋ผ๋„ ์ผ๊ด€๋œ ๋””์ž์ธ ์‹œ์Šคํ…œ์ด ํ›ผ์†๋˜์ง€ ์•Š๋„๋ก ๋ฐฉ์–ด ์ฒด๊ณ„๋ฅผ ๋งˆ๋ จํ•œ๋‹ค [3, 4]. +- **Operation / Maintenance:** CI ํŒŒ์ดํ”„๋ผ์ธ(GitHub Actions ๋“ฑ)์— ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ๋ฅผ ํ•„์ˆ˜ ๋‹จ๊ณ„๋กœ ์ถ”๊ฐ€ํ•˜์—ฌ, ๋ณ€๊ฒฝ๋œ ๋””์ž์ธ ์ฝ”๋“œ๊ฐ€ PR์— ์˜ฌ๋ผ์˜ฌ ๋•Œ๋งˆ๋‹ค ์˜๋„์น˜ ์•Š์€ ๋ ˆ์ด์•„์›ƒ ๊นจ์ง ํ˜„์ƒ์„ ์ž๋™์œผ๋กœ ๊ฐ์ง€ํ•˜๊ณ  ๋ฆฌ๋ทฐ์–ด์—๊ฒŒ ์‹œ๊ฐ์  Diff๋ฅผ ์ œ๊ณตํ•˜์—ฌ ์šด์˜ ์œ ์ง€๋ณด์ˆ˜ ๋ถ€๋‹ด์„ ์ค„์ธ๋‹ค [3, 6, 12]. +- **Learning Path:** React ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜ UI ์ž‘์„ฑ โ†’ Storybook์„ ํ™œ์šฉํ•œ ์ปดํฌ๋„ŒํŠธ ๋ฌธ์„œํ™” ๋ฐ CDD(Component-Driven Development) โ†’ ์ธํ„ฐ๋ž™์…˜(Interaction) ํ…Œ์ŠคํŠธ ์ž‘์„ฑ โ†’ ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ ์ž๋™ํ™” ์ˆœ์œผ๋กœ ํ”„๋ก ํŠธ์—”๋“œ ํ’ˆ์งˆ ๊ฒ€์ฆ ํŒŒ์ดํ”„๋ผ์ธ์„ ํ•™์Šตํ•œ๋‹ค [9, 15]. +- **My Project Relevance:** ํ”„๋ก ํŠธ์—”๋“œ ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•˜๊ฑฐ๋‚˜ ์ˆ˜๋ฐฑ ๊ฐœ์˜ ํ™”๋ฉด์—์„œ ๊ณต์œ ๋˜๋Š” ์ฝ”์–ด UI ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฒ„์ „์„ ์—…๊ทธ๋ ˆ์ด๋“œํ•  ๋•Œ, ๋‹ค๋ฅธ ํŒ€์˜ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์˜๋„์น˜ ์•Š์€ ํŒŒ๊ธ‰ ํšจ๊ณผ(Side Effect) ๋ฐ ์‹œ๊ฐ์  ๊นจ์ง์„ ์•ˆ์ „ํ•˜๊ฒŒ ๊ฐ์ง€ํ•˜๊ณ  ํ™•์‹ ์„ ๊ฐ–๊ณ  ๋ฐฐํฌํ•˜๋Š” ๋ฐ ํ•ต์‹ฌ์ ์ธ ์—ญํ• ์„ ํ•œ๋‹ค [3, 16]. + +### Adjacent Topics +- [[Accessibility Regression Testing]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ ์›Œํฌํ”Œ๋กœ์šฐ์™€ ๊ฒฐํ•ฉํ•˜์—ฌ, ์ƒˆ๋กœ์šด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๋ณ„๋„๋กœ ์ž‘์„ฑํ•  ํ•„์š” ์—†์ด ์Šคํฌ๋ฆฐ์ƒท ์‹คํ–‰ ๋‹จ๊ณ„์—์„œ UI์˜ ์ ‘๊ทผ์„ฑ ์œ„๋ฐ˜(๋ช…๋„ ๋Œ€๋น„ ๋ถ€์กฑ, ํ‚ค๋ณด๋“œ ํฌ์ปค์Šค ๋ˆ„๋ฝ ๋“ฑ)๊นŒ์ง€ ๋™์‹œ์— ์ž๋™ ๊ฒ€์ฆํ•˜๋Š” ์˜์—ญ์œผ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋‹ค [9, 10]. +- [[Continuous Integration (CI) Pipelines]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: GitHub Actions, CircleCI ๋“ฑ์˜ CI ๋„๊ตฌ์—์„œ ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ ์ธํ”„๋ผ๊ฐ€ ์–ด๋–ป๊ฒŒ ์—ฐ๋™๋˜๋ฉฐ, ์ฝ”๋“œ๊ฐ€ ๋ณ‘ํ•ฉ๋˜๊ธฐ ์ „์— PR์˜ ์ƒํƒœ ์ฒดํฌ(Status Check)๋ฅผ ํ•„์ˆ˜๋กœ ์ œ์–ดํ•˜๋Š” ์ž๋™ํ™” ํŒŒ์ดํ”„๋ผ์ธ ๋ฐ DevOps ํ”„๋กœ์„ธ์Šค๋กœ ํ•™์Šต์„ ๋„“ํž ์ˆ˜ ์žˆ๋‹ค [12]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Development/Vite + React ์„ฑ๋Šฅ ์ตœ์ ํ™”.md b/10_Wiki/Development/Vite + React ์„ฑ๋Šฅ ์ตœ์ ํ™”.md new file mode 100644 index 00000000..5fbe3306 --- /dev/null +++ b/10_Wiki/Development/Vite + React ์„ฑ๋Šฅ ์ตœ์ ํ™”.md @@ -0,0 +1,75 @@ +# [[Vite + React ์„ฑ๋Šฅ ์ตœ์ ํ™”]] + +## ๐Ÿ“Œ Brief Summary +Vite์™€ React ํ™˜๊ฒฝ์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๋Š” ๊ฒƒ์€ ์ดˆ๊ธฐ ๋กœ๋”ฉ ์†๋„๋ฅผ ๋†’์ด๊ณ  ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œ์ผœ ์ „๋ฐ˜์ ์ธ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๊ฐœ์„ ํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋Š” ๊ธฐ๋ณธ ES ๋ชจ๋“ˆ(ESM)์„, ์šด์˜ ํ™˜๊ฒฝ์—์„œ๋Š” Rollup์„ ํ†ตํ•œ ๋ฒˆ๋“ค๋ง์„ ํ™œ์šฉํ•˜๋Š” Vite์˜ ๊ตฌ์กฐ์  ์ด์ ์„ ๊ทน๋Œ€ํ™”ํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค. ์ฃผ์š” ์ตœ์ ํ™” ๊ธฐ๋ฒ•์œผ๋กœ๋Š” ๋น ๋ฅธ ์ปดํŒŒ์ผ์„ ์œ„ํ•œ SWC ๋„์ž…, ๋™์  ์ž„ํฌํŠธ๋ฅผ ํ†ตํ•œ ์ฝ”๋“œ ๋ถ„ํ• , `manualChunks`๋ฅผ ํ™œ์šฉํ•œ ๋ฌด๊ฑฐ์šด ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ถ„๋ฆฌ, ๊ทธ๋ฆฌ๊ณ  ๋ฒˆ๋“ค ์‹œ๊ฐํ™” ๋„๊ตฌ๋ฅผ ํ†ตํ•œ ๋ถˆํ•„์š”ํ•œ ์˜์กด์„ฑ ์ œ๊ฑฐ ๋“ฑ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. + +## ๐Ÿ“– Core Content +* **Vite์˜ ์•„ํ‚คํ…์ฒ˜ ์ดํ•ด ๋ฐ SWC ํ™œ์šฉ** + ๊ฐœ๋ฐœ ์ค‘์—๋Š” ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ๋ฏธ๋ฆฌ ๋ฒˆ๋“ค๋งํ•˜์ง€ ์•Š๊ณ  ๋ธŒ๋ผ์šฐ์ €์— ๋„ค์ดํ‹ฐ๋ธŒ ES ๋ชจ๋“ˆ(ESM)๋กœ ์ง์ ‘ ์ œ๊ณตํ•˜์—ฌ ๋งค์šฐ ๋น ๋ฅธ ์„œ๋ฒ„ ์‹œ์ž‘๊ณผ HMR(Hot Module Replacement)์„ ๋‹ฌ์„ฑํ•ฉ๋‹ˆ๋‹ค [1, 2]. ์ปดํŒŒ์ผ ์†๋„๋ฅผ ๊ทน๋Œ€ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ์กด์˜ Babel ๋Œ€์‹  Rust ๊ธฐ๋ฐ˜ ์ปดํŒŒ์ผ๋Ÿฌ์ธ SWC(`@vitejs/plugin-react-swc`)๋ฅผ ์ฑ„ํƒํ•˜๋ฉด, ์ปค์Šคํ…€ Babel ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ํ•„์š” ์—†๋Š” ๋Œ€๊ทœ๋ชจ React ํ”„๋กœ์ ํŠธ์—์„œ ๋นŒ๋“œ ๋ฐ ์ƒˆ๋กœ๊ณ ์นจ ์‹œ๊ฐ„์„ ํš๊ธฐ์ ์œผ๋กœ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3-5]. +* **์ฝ”๋“œ ๋ถ„ํ• (Code Splitting) ๋ฐ ์ง€์—ฐ ๋กœ๋”ฉ(Lazy Loading)** + ์ดˆ๊ธฐ ๋กœ๋“œ ์†๋„๋ฅผ ๋†’์ด๊ณ  LCP(Largest Contentful Paint)์™€ ๊ฐ™์€ ์›น ์ง€ํ‘œ๋ฅผ ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ๋ฌด๊ฑฐ์šด ๋ฒˆ๋“ค์„ ์—ฌ๋Ÿฌ ์ฒญํฌ๋กœ ๋ถ„ํ• ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [6, 7]. `React.lazy()`์™€ ``๋ฅผ ์‚ฌ์šฉํ•œ ๋™์  ์ž„ํฌํŠธ๋กœ ๋ผ์šฐํŠธ ๋ ˆ๋ฒจ์ด๋‚˜ ์ฐจํŠธ ๋“ฑ ํฐ ์œ„์ ฏ์„ ์‚ฌ์šฉ์ž๊ฐ€ ์ ‘๊ทผํ•  ๋•Œ๋งŒ ๋กœ๋“œํ•˜๋„๋ก ์„ค์ •ํ•˜๋ฉด ๋ฉ”์ธ ๋ฒˆ๋“ค์˜ ํฌ๊ธฐ๋ฅผ ๋Œ€ํญ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [6, 8-13]. +* **`manualChunks`๋ฅผ ํ™œ์šฉํ•œ ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ถ„ํ• ** + ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ ์‹œ 500kB ์ด์ƒ์˜ ๊ฑฐ๋Œ€ํ•œ ์ฒญํฌ ๊ฒฝ๊ณ ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด `vite.config.js`์˜ Rollup ์˜ต์…˜์—์„œ `manualChunks`๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค [12, 14-17]. React ์ฝ”์–ด๋‚˜ Lodash, ์ฐจํŠธ, ์•„์ด์ฝ˜ ๋“ฑ ์žฆ์€ ๋ณ€๊ฒฝ์ด ์—†๋Š” ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์„ ๋ณ„๋„์˜ ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌํ•˜๋ฉด, ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์€ ์ฝ”๋“œ๋ฅผ ์žฅ๊ธฐ๊ฐ„ ์บ์‹ฑ(Long-term caching)ํ•  ์ˆ˜ ์žˆ์–ด ์žฌ๋ฐฉ๋ฌธ ๋ฐ ๋ฐฐํฌ ์‹œ ๋กœ๋”ฉ ํšจ์œจ์ด ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค [12, 15, 18, 19]. +* **์˜์กด์„ฑ ์‚ฌ์ „ ๋ฒˆ๋“ค๋ง(`optimizeDeps`)๊ณผ ํŠธ๋ฆฌ ์‰์ดํ‚น** + ๋Œ€๊ทœ๋ชจ ์•ฑ์ด๋‚˜ ๋น„์ •์ƒ์ ์ธ ์˜์กด์„ฑ ๋กœ๋”ฉ์œผ๋กœ ์ธํ•œ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด `optimizeDeps`๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5, 6]. ๋˜ํ•œ ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ ๋กœ๋“œ๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด `lodash` ๋Œ€์‹  `lodash-es`์ฒ˜๋Ÿผ ํŠธ๋ฆฌ ์‰์ดํ‚น(Tree-shaking)์ด ์ง€์›๋˜๋Š” ์ตœ์‹  ES ๋ชจ๋“ˆ ๊ธฐ๋ฐ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์šฐ์„ ์ ์œผ๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [20]. +* **๋ฒˆ๋“ค ์‹œ๊ฐํ™” ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง** + `rollup-plugin-visualizer` ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์—ฐ๋™ํ•˜์—ฌ ๋นŒ๋“œ ์‹œ ๊ฑฐ๋Œ€ํ•œ ๋ฒˆ๋“ค์˜ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‹œ๊ฐ์ ์ธ ํŠธ๋ฆฌ๋งต ํ˜•ํƒœ๋กœ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค [6, 13, 21]. ์ด๋ฅผ ํ†ตํ•ด ๋ฒˆ๋“ค ๋‚ด ์ฐจ์ง€ํ•˜๋Š” ๋น„์ค‘์ด ๋ถˆํ•„์š”ํ•˜๊ฒŒ ํฐ ์ฝ”๋“œ๋ฅผ ์ฐพ์•„๋‚ด์–ด ์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜ ์ง€์—ฐ ๋กœ๋”ฉ์œผ๋กœ ๋ถ„๋ฆฌํ•  ๊ธฐํšŒ๋ฅผ ์‹ ์†ํ•˜๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [13, 20, 22]. + +## โš–๏ธ Trade-offs & Caveats +* **๊ณผ๋„ํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ ์‚ฌ์šฉ:** Vite๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ ๋„ˆ๋ฌด ๋งŽ์€ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋‚จ์šฉํ•˜๋ฉด ๊ฐœ๋ฐœ ์„œ๋ฒ„์˜ ์„ฑ๋Šฅ์ด ํ˜„์ €ํžˆ ๋А๋ ค์งˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ ์œ„์ฃผ๋กœ ๊ฐ€๋ณ๊ฒŒ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [20]. +* **์บ์‹ฑ ๋ฌดํšจํ™” ์ฃผ์˜:** ๋ชจ๋“ˆ ๋กœ๋”ฉ ์„ฑ๋Šฅ์„ ์œ„ํ•ด Vite๋Š” ๋ธŒ๋ผ์šฐ์ € ์บ์‹ฑ์— ํฌ๊ฒŒ ์˜์กดํ•˜๋ฏ€๋กœ, ๊ฐœ๋ฐœ ์‹œ ๋ธŒ๋ผ์šฐ์ € ๊ฐœ๋ฐœ์ž ๋„๊ตฌ์—์„œ ์บ์‹œ๋ฅผ ๋ฌดํšจํ™”(Disable cache)ํ•˜๋ฉด ์„ฑ๋Šฅ์ด ๊ธ‰๊ฒฉํ•˜๊ฒŒ ์ €ํ•˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [20]. +* **์ง€์—ฐ ๋กœ๋”ฉ์˜ ๊ณผ์šฉ ๋ฐ ์ž˜๋ชป๋œ ๋ฐฐ์น˜:** ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ์— ์ง€์—ฐ ๋กœ๋”ฉ์„ ๋‚จ๋ฐœํ•˜๊ฑฐ๋‚˜, ์Šคํฌ๋กค ์—†์ด ๋ฐ”๋กœ ๋ณด์—ฌ์•ผ ํ•˜๋Š” ํ•ต์‹ฌ(Above-the-fold) ์š”์†Œ๋‚˜ ์ฆ‰์‹œ ๋ Œ๋”๋งํ•ด์•ผ ํ•˜๋Š” UI๊นŒ์ง€ ์ง€์—ฐ ๋กœ๋”ฉ์„ ์ ์šฉํ•˜๋ฉด ์ดˆ๊ธฐ ํ™”๋ฉด ํ‘œ์‹œ๊ฐ€ ์ง€์—ฐ๋˜์–ด ์˜คํžˆ๋ ค ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๋ง์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [23, 24]. +* **๋ฉ”๋ชจ์ด์ œ์ด์…˜(`React.memo`, `useMemo` ๋“ฑ) ์˜ค๋ฒ„ํ—ค๋“œ:** ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ง‰๊ธฐ ์œ„ํ•œ ๋„๊ตฌ์ง€๋งŒ, ๋น„๊ต ์—ฐ์‚ฐ๊ณผ ์ด์ „ ์ƒํƒœ๋ฅผ ์บ์‹ฑํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋น„์šฉ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [25]. ๋ Œ๋”๋ง์ด ์•„์ฃผ ๋น ๋ฅด๊ณ  ๋‹จ์ˆœํ•œ ์ปดํฌ๋„ŒํŠธ๋‚˜, ์ „๋‹ฌ๋˜๋Š” props๊ฐ€ ๋นˆ๋ฒˆํžˆ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒฝ์šฐ(์˜ˆ: ์ธ๋ผ์ธ ๊ฐ์ฒด, ํ•จ์ˆ˜ ์ „๋‹ฌ)์— ์‚ฌ์šฉํ•˜๋ฉด ๋ Œ๋”๋ง ์ž์ฒด๋ณด๋‹ค ์ƒํƒœ ๋น„๊ต ๋น„์šฉ์ด ๋” ์ปค์ ธ ์„ฑ๋Šฅ์ด ์˜คํžˆ๋ ค ์•…ํ™”๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [25-28]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [๊ด€๊ณ„ ์œ ํ˜• A (์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ )] +- [[๋„ค์ดํ‹ฐ๋ธŒ ES ๋ชจ๋“ˆ(ESM)]] + - ์—ฐ๊ฒฐ ์ด์œ : Vite๊ฐ€ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ์ฝ”๋“œ ๋ชจ๋“ˆ์„ ์„œ๋น™ํ•˜๋Š” ๋ฐฉ์‹์˜ ํ•ต์‹ฌ ๊ธฐ๋ฐ˜ ์›๋ฆฌ์ž…๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ฒˆ๋“ค๋Ÿฌ๊ฐ€ ์ „์ฒด ์•ฑ์„ ๋งค๋ฒˆ ๋นŒ๋“œํ•˜์ง€ ์•Š๊ณ  ๋ณ€๊ฒฝ๋œ ๋ชจ๋“ˆ๋งŒ ์š”์ฒญ/๋กœ๋“œํ•จ์œผ๋กœ์จ ํ”„๋กœ์ ํŠธ ํฌ๊ธฐ์— ์ƒ๊ด€์—†์ด ๋น ๋ฅธ HMR๊ณผ ์‘๋‹ต์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1, 29, 30]. + +- [[Rollup]] + - ์—ฐ๊ฒฐ ์ด์œ : Vite ํ™˜๊ฒฝ์—์„œ ํ”„๋กœ๋•์…˜ ๋ฐฐํฌ ์‹œ ์ฝ”๋“œ๋ฅผ ํ•˜๋‚˜๋กœ ๋ชจ์œผ๊ณ  ์ตœ์ ํ™”ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋ฒˆ๋“ค๋Ÿฌ์ž…๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Vite์˜ ์„ค์ • ํŒŒ์ผ(`vite.config.js`)์—์„œ `manualChunks` ๋“ฑ Rollup ์ „์šฉ ๋นŒ๋“œ ์˜ต์…˜์„ ํ†ตํ•ด ์–ด๋–ป๊ฒŒ ํšจ์œจ์ ์ธ ์ •์  ์• ์…‹(Asset)์„ ์ƒ์„ฑํ•˜๊ณ , ์ฝ”๋“œ ๋ถ„ํ• ๊ณผ ํŠธ๋ฆฌ ์‰์ดํ‚น์„ ์ˆ˜ํ–‰ํ•˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [14, 18, 31, 32]. + +#### [๊ด€๊ณ„ ์œ ํ˜• B (๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ)] +- [[SWC ์ปดํŒŒ์ผ๋Ÿฌ]] + - ์—ฐ๊ฒฐ ์ด์œ : Vite์˜ ๊ธฐ๋ณธ ๊ตฌ์„ฑ์„ ํ™•์žฅํ•ด ์†๋„๋ฅผ ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•œ ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ณผ๊ฑฐ Babel์ด ์ฒ˜๋ฆฌํ•˜๋˜ JSX/TypeScript ๋ณ€ํ™˜ ์ž‘์—…์„ Rust ๊ธฐ๋ฐ˜์˜ ๋น ๋ฅธ ๋„๊ตฌ(`@vitejs/plugin-react-swc`)๋กœ ๊ต์ฒดํ•˜์—ฌ ๋Œ€ํ˜• React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์žฌ๋นŒ๋“œ ์‹œ๊ฐ„์„ ์ฆ‰๊ฐ์ ์œผ๋กœ ๋‹จ์ถ•์‹œํ‚ค๋Š” ๋ฐฉ์‹์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1, 3, 5]. + +- [[React.lazy & Suspense]] + - ์—ฐ๊ฒฐ ์ด์œ : React ๋‚ด๋ถ€์—์„œ ๋™์  ์ž„ํฌํŠธ๋ฅผ ํ†ตํ•œ ์ปดํฌ๋„ŒํŠธ ๋ ˆ๋ฒจ ์ง€์—ฐ ๋กœ๋”ฉ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ API์ž…๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ผ์šฐํŠธ๋‚˜ ๋ฌด๊ฑฐ์šด ๋ชจ๋“ˆ์„ ๋ถ„๋ฆฌํ•˜๊ณ , ๋ฒˆ๋“ค์ด ๋กœ๋“œ๋˜๋Š” ๋™์•ˆ ``๋ฅผ ํ†ตํ•ด ํด๋ฐฑ(Fallback) UI๋ฅผ ์ฒ˜๋ฆฌํ•จ์œผ๋กœ์จ ์ดˆ๊ธฐ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŽ˜์ด๋กœ๋“œ ์šฉ๋Ÿ‰์„ ๋Œ€ํญ ์ค„์ด๋Š” ์‹ค๋ฌด ๊ธฐ๋ฒ•์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [6, 9, 11, 12, 33]. + +- [[rollup-plugin-visualizer]] + - ์—ฐ๊ฒฐ ์ด์œ : ์ตœ์ ํ™” ์ž‘์—… ์ „ํ›„๋กœ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์‹œ๊ฐํ™”ํ•˜๊ณ  ๋ฌธ์ œ๋ฅผ ์ง„๋‹จํ•˜๋Š” ํ•„์ˆ˜ ๋ถ„์„ ํ”Œ๋Ÿฌ๊ทธ์ธ์ž…๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํฐ ์ฒญํฌ๊ฐ€ ์™œ ๋ฐœ์ƒํ•˜๋Š”์ง€, ์–ด๋–ค ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(๋ฒค๋”)๊ฐ€ ์˜๋„์น˜ ์•Š๊ฒŒ ์šฉ๋Ÿ‰์„ ๊ณผ๋„ํ•˜๊ฒŒ ์ ์œ ํ•˜๋Š”์ง€ ๋ถ„์„ํ•˜์—ฌ `manualChunks`๋‚˜ ์ฝ”๋“œ ๊ต์ฒด๋ฅผ ๊ฒฐ๋‹จํ•˜๋Š” ์ธก์ •/๋””๋ฒ„๊น… ๊ธฐ๋ฐ˜์„ ํ™•๋ฆฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [6, 13, 21]. + +### Deeper Research Questions + +- ๋Œ€๊ทœ๋ชจ ์™ธ๋ถ€ ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ Vite์˜ `optimizeDeps`๋ฅผ ์„ธ๋ฐ€ํ•˜๊ฒŒ ํŠœ๋‹ํ•˜๋ ค๋ฉด ์–ด๋– ํ•œ ๊ธฐ์ค€๊ณผ ์„ค์ • ๋ฐฉ์‹์„ ์ ์šฉํ•ด์•ผ ํ•˜๋Š”๊ฐ€? +- SWC ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋„์ž…ํ•  ๋•Œ ๊ธฐ์กด์— ์‚ฌ์šฉ ์ค‘์ธ ํŠน์ • ์ปค์Šคํ…€ Babel ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์˜จ์ „ํžˆ ๋Œ€์ฒดํ•˜๊ฑฐ๋‚˜ ๋ณ‘ํ–‰ํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์˜ ํ•œ๊ณ„ ๋ฐ ํ•ด๊ฒฐ์ฑ…์€ ๋ฌด์—‡์ธ๊ฐ€? +- Rollup์˜ `manualChunks`๋กœ ๋ฌด๊ฑฐ์šด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ถ„๋ฆฌํ•  ๋•Œ, ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ณ‘๋ ฌ๋กœ ๋‹ค์šด๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋Š” ํ•œ๊ณ„์ ๊ณผ ์žฅ๊ธฐ ์บ์‹ฑ(Long-term caching)์˜ ์ด์ ์„ ๊ณ ๋ คํ•œ ์ตœ์ ์˜ ๋ถ„ํ•  ๋‹จ์œ„(Chunk size)๋Š” ์–ด๋А ์ •๋„์ธ๊ฐ€? +- `React.lazy`์™€ ``๋ฅผ ๋ผ์šฐํŠธ ๋ ˆ๋ฒจ์ด ์•„๋‹Œ ์„ธ๋ถ€ ์ปดํฌ๋„ŒํŠธ ๋ ˆ๋ฒจ(์˜ˆ: ๋ฌด๊ฑฐ์šด ๋ชจ๋‹ฌ ์ฐฝ์ด๋‚˜ ์ฐจํŠธ)์— ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์ ์šฉํ•  ๋•Œ, ๋ถˆํ•„์š”ํ•œ ๋กœ๋”ฉ ์ƒํƒœ ๋‚จ๋ฐœ์„ ๋ง‰๊ณ  ์ž์—ฐ์Šค๋Ÿฌ์šด ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์œ ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? +- ๋ฒˆ๋“ค ์‹œ๊ฐํ™”๋ฅผ ํ†ตํ•ด ๋ฐœ๊ฒฌ๋œ, ํŠธ๋ฆฌ ์‰์ดํ‚น์ด ์ „ํ˜€ ์ ์šฉ๋˜์ง€ ์•Š๋Š” ๋ ˆ๊ฑฐ์‹œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์˜์กด์„ฑ์„ ์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜ ๋ชจ๋˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ๋•Œ ๋”ฐ๋ผ์•ผ ํ•  ๋ฆฌํŒฉํ† ๋ง ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? + +### Practical Application Contexts + +- **Implementation:** `vite.config.ts` ํŒŒ์ผ์—์„œ SWC ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์ • ๋ฐ `rollupOptions` ๋‚ด `manualChunks`๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•˜์—ฌ React ๋Ÿฐํƒ€์ž„, ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ, ์ฐจํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋“ฑ์„ ๊ฐ๊ฐ์˜ ์ฒญํฌ๋กœ ์ถ”์ถœํ•˜๋„๋ก ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. +- **System Design:** ์ดˆ๊ธฐ ์•„ํ‚คํ…์ฒ˜ ์ˆ˜๋ฆฝ ์‹œ, ๋ผ์šฐํŠธ ๋ณ„๋กœ ์ง€์—ฐ ๋กœ๋”ฉ๋  ๊ธฐ๋Šฅ๊ณผ ์•ฑ ๊ตฌ๋™ ์‹œ ์ฆ‰์‹œ ํ•„์š”ํ•œ ์ฝ”์–ด ๋ ˆ์ด์–ด๋ฅผ ์—„๊ฒฉํ•˜๊ฒŒ ๋ถ„๋ฆฌํ•˜์—ฌ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…์„ ์ „์ œ๋กœ ํ•œ ์ปดํฌ๋„ŒํŠธ ๊ณ„์ธต ํŠธ๋ฆฌ๋ฅผ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค. +- **Operation / Maintenance:** CI/CD ํŒŒ์ดํ”„๋ผ์ธ์— `rollup-plugin-visualizer`์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํฌํŠธ๋กœ ๋‚จ๊ธฐ๋„๋ก ๊ตฌ์„ฑํ•˜์—ฌ, ํŒ€์›์ด ์ƒˆ๋กœ์šด ํŒจํ‚ค์ง€๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ ๋ฉ”์ธ ๋ฒˆ๋“ค ํฌ๊ธฐ๊ฐ€ ๋น„์ •์ƒ์ ์œผ๋กœ ์ปค์ง€์ง€ ์•Š๋Š”์ง€ ์ง€์†์ ์œผ๋กœ ๊ฐ์‹œํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜ํ•ฉ๋‹ˆ๋‹ค. +- **Learning Path:** ์šฐ์„  React์˜ ๋ Œ๋”๋ง ์›๋ฆฌ ๋ฐ ํ”„๋กœํŒŒ์ผ๋Ÿฌ ์‚ฌ์šฉ๋ฒ•์„ ํ•™์Šตํ•œ ํ›„, ๋นŒ๋“œ ํˆด(Vite/Rollup)์˜ ๋ฒˆ๋“ค๋ง ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ดํ•ดํ•˜๊ณ , ์ดํ›„ ์ง€์—ฐ ๋กœ๋”ฉ ๊ธฐ๋ฒ• ๋ฐ ๋ฒˆ๋“ค ์ตœ์ ํ™” ํ”Œ๋Ÿฌ๊ทธ์ธ ์‹ค์Šต์œผ๋กœ ์ด์–ด์ง€๋Š” ๋กœ๋“œ๋งต์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. +- **My Project Relevance:** ๊ฑฐ๋Œ€ํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ ์ „์†ก์œผ๋กœ ์ธํ•ด ๋ Œ๋”๋ง์ด ์ง€์—ฐ๋˜๋Š” ํ”„๋กœ์ ํŠธ๋‚˜, ๋นŒ๋“œ ํ›„ "500kB ์ดˆ๊ณผ" ๊ฒฝ๊ณ ๊ฐ€ ๋œจ๋Š” ํ”„๋ก ํŠธ์—”๋“œ ํ™˜๊ฒฝ์—์„œ ์ฆ‰๊ฐ์ ์ธ ํŒŒ์ผ ๋ถ„ํ• ๊ณผ ์บ์‹ฑ ์ „๋žต์„ ์ ์šฉํ•˜์—ฌ ํŽ˜์ด์ง€ ๋กœ๋“œ ์„ฑ๋Šฅ(FCP, LCP)์„ ๊ฐ€์‹œ์ ์œผ๋กœ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### Adjacent Topics + +- [[Core Web Vitals]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: Vite์™€ React ์ตœ์ ํ™”๋ฅผ ํ†ตํ•ด ์–ป์–ด๋‚ธ ๋ฉ”์ธ ๋ฒˆ๋“ค ํฌ๊ธฐ ๊ฐ์†Œ ๋ฐ ๋ Œ๋”๋ง ์†๋„ ํ–ฅ์ƒ์ด ์‹ค์ œ ์‚ฌ์šฉ์ž ์ฒด๊ฐ ์„ฑ๋Šฅ ์ง€ํ‘œ(LCP, FID/INP ๋“ฑ)์— ์–ด๋–ค ์ˆ˜์น˜์  ๊ฐœ์„ ์œผ๋กœ ๋‚˜ํƒ€๋‚˜๋Š”์ง€๋ฅผ ๊ตฌ์ฒด์ ์œผ๋กœ ์—ฐ๊ตฌํ•ฉ๋‹ˆ๋‹ค [11, 34, 35]. + +- [[Concurrent Rendering (๋™์‹œ์„ฑ ๋ Œ๋”๋ง)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋กœ๋”ฉ๊ณผ ๋ฒˆ๋“ค๋ง ์ตœ์ ํ™”๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, `useTransition` ๋ฐ `useDeferredValue` ํ›…์„ ์ด์šฉํ•˜์—ฌ ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ๋ณ€ํ™” ์‹œ์—๋„ ์‚ฌ์šฉ์ž ์ž…๋ ฅ ๋“ฑ์˜ UI ๋ฐ˜์‘์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๋Ÿฐํƒ€์ž„ ์ฐจ์›์˜ ์„ฑ๋Šฅ ํ–ฅ์ƒ ์ „๋žต์œผ๋กœ ์ง€์‹์„ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค [36-38]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Development/Vite Build System.md b/10_Wiki/Development/Vite Build System.md new file mode 100644 index 00000000..9ee03e7c --- /dev/null +++ b/10_Wiki/Development/Vite Build System.md @@ -0,0 +1,52 @@ +# [[Vite Build System]] + +## ๐Ÿ“Œ Brief Summary +Vite๋Š” ํ˜„๋Œ€ ํ”„๋ก ํŠธ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(ํŠนํžˆ React) ๊ฐœ๋ฐœ์„ ์œ„ํ•œ ์ƒˆ๋กœ์šด ์‚ฐ์—… ํ‘œ์ค€ ๋นŒ๋“œ ๋„๊ตฌ๋กœ, ๊ฑฐ์˜ ์ฆ‰๊ฐ์ ์ธ ์„œ๋ฒ„ ์‹œ์ž‘๊ณผ ์ดˆ๊ณ ์† HMR(Hot Module Replacement)์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [1, 2]. ๊ธฐ์กด ๋ฒˆ๋“ค๋Ÿฌ์™€ ๋‹ฌ๋ฆฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋Š” ๋ธŒ๋ผ์šฐ์ €์— ๋„ค์ดํ‹ฐ๋ธŒ ES ๋ชจ๋“ˆ ํ˜•ํƒœ๋กœ ์ฝ”๋“œ๋ฅผ ์ œ๊ณตํ•˜๊ณ , ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋Š” Rollup์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ณ ๋„๋กœ ์ตœ์ ํ™”๋œ ๋ฒˆ๋“ค์„ ์ƒ์„ฑํ•˜๋Š” ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค [3, 4]. ๋˜ํ•œ SWC๋‚˜ esbuild์™€ ๊ฐ™์€ Rust ๊ธฐ๋ฐ˜ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ๋„ ๋น ๋ฅด๊ณ  ์›ํ™œํ•œ ๊ฐœ๋ฐœ์ž ๊ฒฝํ—˜์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค [3, 5, 6]. + +## ๐Ÿ“– Core Content +* **ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์•„ํ‚คํ…์ฒ˜ (๊ฐœ๋ฐœ ๋ฐ ํ”„๋กœ๋•์…˜)**: Vite๋Š” ๊ฐœ๋ฐœ ์‹œ ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ์‚ฌ์ „์— ๋ฒˆ๋“ค๋งํ•˜๋Š” ๋Œ€์‹ , ์ฝ”๋“œ๋ฅผ ๋„ค์ดํ‹ฐ๋ธŒ ES ๋ชจ๋“ˆ(ESM) ํ˜•ํƒœ๋กœ ๋ธŒ๋ผ์šฐ์ €์— ์ง์ ‘ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [2, 3]. ์ด ๋ฐฉ์‹์€ ํ•„์š”ํ•  ๋•Œ ํ•„์š”ํ•œ ํŒŒ์ผ๋งŒ ๋กœ๋“œํ•˜๋ฏ€๋กœ ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๊ฐ€ ์ปค์ ธ๋„ ์„œ๋ฒ„ ์‹œ์ž‘ ๋ฐ ๊ฐฑ์‹  ์†๋„๊ฐ€ ๋งค์šฐ ๋น ๋ฆ…๋‹ˆ๋‹ค [3, 7]. ๋ฐ˜๋ฉด, ํ”„๋กœ๋•์…˜ ๋ฐฐํฌ ์‹œ์—๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ Rollup์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž๋™ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…, ๋ฏธ์‚ฌ์šฉ ์ฝ”๋“œ ์ œ๊ฑฐ(Tree-shaking), ์ž์‚ฐ ์ตœ์ ํ™” ๋“ฑ์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ์„ฑ๋Šฅ์ด ๋›ฐ์–ด๋‚œ ๋ฒˆ๋“ค์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค [4, 8]. +* **์ดˆ๊ณ ์† ์ปดํŒŒ์ผ๋Ÿฌ ๋ฐ ํ”Œ๋Ÿฌ๊ทธ์ธ ํ™œ์šฉ**: Vite๋Š” ์ปดํŒŒ์ผ ์†๋„๋ฅผ ๋†’์ด๊ธฐ ์œ„ํ•ด Rust ๊ธฐ๋ฐ˜์˜ ์ปดํŒŒ์ผ๋Ÿฌ์ธ SWC ๋˜๋Š” esbuild๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค [3]. ๊ธฐ์กด Babel ๋Œ€์‹  `@vitejs/plugin-react-swc`๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด JSX ๋ฐ TypeScript ์ปดํŒŒ์ผ ์†๋„๊ฐ€ ๋น„์•ฝ์ ์œผ๋กœ ํ–ฅ์ƒ๋˜์–ด ์žฌ๋นŒ๋“œ ์‹œ๊ฐ„์ด ๋‹จ์ถ•๋ฉ๋‹ˆ๋‹ค [5, 6, 9]. ์ด์™ธ์—๋„ `vite-plugin-svgr`(SVG ์ปดํฌ๋„ŒํŠธํ™”), `vite-plugin-pwa`์™€ ๊ฐ™์€ ์œ ์—ฐํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ƒํƒœ๊ณ„๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค [10]. +* **๊ณ ๊ธ‰ ๊ตฌ์„ฑ (vite.config.js)**: Vite๋Š” `vite.config.js`๋ฅผ ํ†ตํ•ด ๋ณต์žกํ•œ ํ”„๋กœ์ ํŠธ ์„ค์ •์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๊ฒฝ๋กœ ๋ณ„์นญ(Path Aliases)์„ ์„ค์ •ํ•˜์—ฌ ์ž„ํฌํŠธ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•˜๊ฑฐ๋‚˜, `VITE_` ์ ‘๋‘์‚ฌ๊ฐ€ ๋ถ™์€ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋งŒ์„ ์•ˆ์ „ํ•˜๊ฒŒ ๋…ธ์ถœํ•˜๋ฉฐ, ๊ฐœ๋ฐœ ์ค‘ CORS ๋ฌธ์ œ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•œ ๋‚ด์žฅ ํ”„๋ก์‹œ ์„œ๋ฒ„ ์„ค์ •์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค [5, 9, 11]. +* **์„ฑ๋Šฅ ํŠœ๋‹ ๋ฐ ๋Œ€์šฉ๋Ÿ‰ ์ฒญํฌ(Chunk) ๊ด€๋ฆฌ**: ๋Œ€๊ทœ๋ชจ ์•ฑ์—์„œ๋Š” ๋ฌด๊ฑฐ์šด ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์ธํ•ด ๋ฉ”์ธ ๋ฒˆ๋“ค์ด ๊ณผ๋„ํ•˜๊ฒŒ ์ปค์ง€๋Š” ๋ฌธ์ œ("chunks are larger than 500 kB")๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [12-14]. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด `manualChunks`๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ React, ์ฐจํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋“ฑ ์ž์ฃผ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ๋ฒค๋” ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌํ•ด ๋ธŒ๋ผ์šฐ์ € ์บ์‹ฑ์„ ๊ทน๋Œ€ํ™”ํ•ฉ๋‹ˆ๋‹ค [8, 11, 14-16]. ์ด์™€ ํ•จ๊ป˜ `React.lazy`์™€ ``๋ฅผ ์ด์šฉํ•œ ๋ผ์šฐํŠธ ๋ ˆ๋ฒจ์˜ ๋™์  ์ž„ํฌํŠธ(์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…)๋ฅผ ์ ์šฉํ•˜๊ณ , `rollup-plugin-visualizer`๋กœ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ๋ถ„์„ํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ด ๋ชจ๋ฒ” ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค [16-19]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts +- [[Native ES Modules (ESM)]] + - ์—ฐ๊ฒฐ ์ด์œ : Vite๊ฐ€ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ํŒŒ์ผ ์ „์ฒด๋ฅผ ์‚ฌ์ „ ๋ฒˆ๋“ค๋งํ•˜์ง€ ์•Š๊ณ , ํ•„์š”ํ•  ๋•Œ ๋ธŒ๋ผ์šฐ์ €์— ์ฝ”๋“œ๋ฅผ ์ œ๊ณตํ•˜๋Š” ํ•ต์‹ฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [3, 7]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Vite๊ฐ€ ๊ธฐ์กด ๋„๊ตฌ(Webpack ๋“ฑ)์— ๋น„ํ•ด ์–ด๋–ป๊ฒŒ ์ดˆ๊ธฐ ๊ตฌ๋™ ์†๋„์™€ HMR ์‘๋‹ต์„ฑ์„ ๊ทน์ ์œผ๋กœ ๋‹จ์ถ•ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ทธ ์›๋ฆฌ๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2, 3]. + +- [[Rollup]] + - ์—ฐ๊ฒฐ ์ด์œ : Vite๊ฐ€ ํ”„๋กœ๋•์…˜์šฉ ๋นŒ๋“œ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๋‚ด๋ถ€์ ์œผ๋กœ ์ฑ„ํƒํ•˜๊ณ  ์žˆ๋Š” ๋ฒˆ๋“ค๋Ÿฌ ๋„๊ตฌ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [4]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ์ฒญํฌ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋‚˜๋‰˜๋ฉฐ(`manualChunks`), ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…๊ณผ ํŠธ๋ฆฌ ์‰์ดํ‚น์„ ํ†ตํ•ด ์ตœ์ ํ™”๋œ ์ •์  ์ž์‚ฐ์ด ๋งŒ๋“ค์–ด์ง€๋Š” ๊ณผ์ •์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [4, 8, 11]. + +- [[SWC (Speedy Web Compiler)]] + - ์—ฐ๊ฒฐ ์ด์œ : Vite ํ™˜๊ฒฝ์—์„œ ๊ธฐ์กด์˜ Babel์„ ๋Œ€์ฒดํ•˜์—ฌ JSX์™€ TypeScript๋ฅผ ์‹ค์‹œ๊ฐ„์— ๊ฐ€๊น๊ฒŒ ๋ณ€ํ™˜ํ•˜๋Š” Rust ๊ธฐ๋ฐ˜ ์ปดํŒŒ์ผ๋Ÿฌ ๊ธฐ์ˆ ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [3, 5, 6]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋Œ€๊ทœ๋ชจ React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ ์‹œ ์ปดํŒŒ์ผ ์†๋„์™€ ํ•ซ ๋ฆฌ๋กœ๋“œ ์†๋„๋ฅผ ํ–ฅ์ƒํ•˜๋Š” ๊ธฐ์ˆ ์  ๋ฐฐ๊ฒฝ์„ ๊นŠ์ด ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3, 6]. + +- [[Code Splitting & manualChunks]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋Œ€์šฉ๋Ÿ‰ ๋ฉ”์ธ ๋ฒˆ๋“ค ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ , ์ดˆ๊ธฐ ํŽ˜์ด์ง€ ๋กœ๋“œ ์†๋„๋ฅผ ๋†’์ด๊ธฐ ์œ„ํ•œ Vite ์„ฑ๋Šฅ ์ตœ์ ํ™”์˜ ํ•ต์‹ฌ ๊ธฐ๋ฒ•์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [12, 14]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋™์  ์ž„ํฌํŠธ์™€ ๊ฒฐํ•ฉํ•˜์—ฌ ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(์•ˆ์ •์ ์ธ ์ฝ”๋“œ)๋ฅผ ๋ณ„๋„ ํŒŒ์ผ๋กœ ์บ์‹ฑํ•˜๊ณ  ๊ธฐ๋Šฅ ๋‹จ์œ„๋กœ ์ฒญํฌ๋ฅผ ๋‚˜๋ˆ„๋Š” ์ „๋žต์„ ํ•™์Šตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [8, 16]. + +### Deeper Research Questions +- ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์˜ ๋„ค์ดํ‹ฐ๋ธŒ ESM ์ฒ˜๋ฆฌ ๋ฐฉ์‹๊ณผ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์˜ Rollup ๋ฒˆ๋“ค๋ง ๊ฐ„์˜ ์•„ํ‚คํ…์ฒ˜ ์ฐจ์ด๊ฐ€ ๋Ÿฐํƒ€์ž„ ๋™์ž‘์ด๋‚˜ ๋ชจ๋“ˆ ํ•ด์„(Module Resolution)์— ์–ด๋–ค ์ฐจ์ด์™€ ์ž ์žฌ์  ๋ฒ„๊ทธ๋ฅผ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- Vite์˜ `optimizeDeps`๋ฅผ ํ†ตํ•œ ์‚ฌ์ „ ๋ฒˆ๋“ค๋ง(Pre-bundling) ํ”„๋กœ์„ธ์Šค๋Š” ๊ฑฐ๋Œ€ํ•œ ์™ธ๋ถ€ ์˜์กด์„ฑ ํŒจํ‚ค์ง€๋ฅผ ๋กœ๋“œํ•  ๋•Œ ๋ธŒ๋ผ์šฐ์ €์˜ ๋„คํŠธ์›Œํฌ ๋ณ‘๋ชฉ์„ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•˜๋Š”๊ฐ€? +- ๋Œ€๊ทœ๋ชจ React ์•ฑ์„ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•  ๋•Œ ์ปค์Šคํ…€ Babel ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉ ์ค‘์ธ ํ™˜๊ฒฝ์—์„œ SWC ์ปดํŒŒ์ผ๋Ÿฌ(`@vitejs/plugin-react-swc`)๋กœ ์ „ํ™˜ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ํ˜ธํ™˜์„ฑ ํ•œ๊ณ„์™€ ๋Œ€์•ˆ์€ ๋ฌด์—‡์ธ๊ฐ€? +- `manualChunks`๋ฅผ ํ™œ์šฉํ•ด ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ธ๋ฐ€ํ•˜๊ฒŒ ๋ถ„ํ• ํ•  ๋•Œ, ์ƒ์„ฑ๋œ ํ•ด์‹œ(hash) ํŒŒ์ผ๋ช… ๊ธฐ๋ฐ˜์˜ ์žฅ๊ธฐ ์บ์‹ฑ(Long-term Caching) ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ์ตœ์ ํ™”๋˜๋Š”๊ฐ€? +- `rollup-plugin-visualizer`๋ฅผ ํ†ตํ•œ ๋ฒˆ๋“ค ์‹œ๊ฐํ™” ์ดํ›„, ์˜๋„์น˜ ์•Š๊ฒŒ ๋ฉ”์ธ ์ฒญํฌ์— ํฌํ•จ๋œ ๊ณผ๋„ํ•œ ํŠธ๋žœ์ง€ํ‹ฐ๋ธŒ ์˜์กด์„ฑ(Transitive Dependencies)์„ ํšจ๊ณผ์ ์œผ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ์ฝ”๋“œ ๋ ˆ๋ฒจ ํŒจํ„ด์€ ๋ฌด์—‡์ธ๊ฐ€? + +### Practical Application Contexts +- **Implementation:** `vite.config.js`๋ฅผ ๊ตฌ์„ฑํ•˜์—ฌ `@vitejs/plugin-react-swc`๋ฅผ ๋„์ž…ํ•˜๊ณ , ์ƒ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•œ ๊ฒฝ๋กœ ๋ณ„์นญ(Path Aliases) ์„ค์ •, `VITE_` ์ ‘๋‘์‚ฌ๋ฅผ ์ด์šฉํ•œ ์•ˆ์ „ํ•œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋ฐ”์ธ๋”ฉ, CORS๋ฅผ ์šฐํšŒํ•˜๊ธฐ ์œ„ํ•œ ํ”„๋ก์‹œ(Proxy) ์„ค์ •์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค [5, 9, 11]. +- **System Design:** ๋Œ€๊ทœ๋ชจ ํ”„๋ก ํŠธ์—”๋“œ ์‹œ์Šคํ…œ ์„ค๊ณ„ ์‹œ, ๋ฌด๊ฑฐ์šด ์ดˆ๊ธฐ ๋ฒˆ๋“ค ํฌ๊ธฐ ์ด์Šˆ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด Webpack ๋Œ€์‹  Vite๋ฅผ ๋„์ž…ํ•˜๊ณ  ๊ฐœ๋ฐœ(๋„ค์ดํ‹ฐ๋ธŒ ESM)๊ณผ ํ”„๋กœ๋•์…˜(Rollup ์ตœ์ ํ™”)์˜ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๋นŒ๋“œ ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌ์ถ•ํ•ฉ๋‹ˆ๋‹ค [2-4, 8]. +- **Operation / Maintenance:** `rollup-plugin-visualizer`๋ฅผ ๋นŒ๋“œ ํ”„๋กœ์„ธ์Šค์— ์—ฐ๋™ํ•ด ์ •๊ธฐ์ ์œผ๋กœ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ , `manualChunks`๋ฅผ ์œ ์ง€๋ณด์ˆ˜ํ•˜์—ฌ React ์ฝ”์–ด ๊ฐ™์€ ๋ฒค๋” ํŒจํ‚ค์ง€์˜ ๋ธŒ๋ผ์šฐ์ € ์บ์‹ฑ ์ด์ ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค [16-19]. +- **Learning Path:** ์šฐ์„  Vite์˜ ๊ณต์‹ ์Šค์บํด๋“œ ํˆด๋กœ React ์•ฑ์„ ์ƒ์„ฑํ•˜์—ฌ ๊ธฐ์กด CRA(Create React App) ๊ตฌ์กฐ์™€์˜ ์ฐจ์ด๋ฅผ ์ฒดํ—˜ํ•œ ํ›„, ๋™์  ์ž„ํฌํŠธ(`React.lazy`)์™€ `optimizeDeps` ๋“ฑ์˜ ๊ณ ๊ธ‰ ์„ค์ • ๋ฐ ํ”Œ๋Ÿฌ๊ทธ์ธ ํ™•์žฅ์„ ์ ์ง„์ ์œผ๋กœ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค [6, 7, 10, 16, 20]. +- **My Project Relevance:** ์†Œ์Šค์— ๊ด€๋ จ ์ •๋ณด๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. (๊ฐœ์ธ์˜ ํ˜„์žฌ ์ง„ํ–‰ ์ค‘์ธ ํŠน์ • ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ์†Œ์Šค ํ…์ŠคํŠธ์— ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.) + +### Adjacent Topics +- [[React Server Components (RSC) & Next.js App Router]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: Vite๋ฅผ ์ด์šฉํ•œ ๋นŒ๋“œ ํˆด ์ฒด์ธ ์ตœ์ ํ™”(CSR/SPA ์„ฑ๋Šฅ ์ตœ์ ํ™”)๋ฅผ ๋„˜์–ด, ํด๋ผ์ด์–ธํŠธ ์ธก ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค ์ž์ฒด๋ฅผ ์ „์†กํ•˜์ง€ ์•Š๊ณ  ์„œ๋ฒ„์—์„œ ๋ฏธ๋ฆฌ ๋ Œ๋”๋งํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜ ์ˆ˜์ค€์˜ ์„ฑ๋Šฅ ์ตœ์ ํ™” ํŒจ๋Ÿฌ๋‹ค์ž„์œผ๋กœ ์ดํ•ด๋ฅผ ๋„“ํž™๋‹ˆ๋‹ค [21-23]. +- [[Performance Metrics (Core Web Vitals)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: Vite์˜ ์ฒญํฌ ์ตœ์ ํ™”์™€ ๋ ˆ์ด์ง€ ๋กœ๋”ฉ ๊ธฐ๋ฒ•์ด ์‹ค์ œ ์‚ฌ์šฉ์ž ์ฒด๊ฐ ์„ฑ๋Šฅ ์ง€ํ‘œ์ธ FCP(First Contentful Paint), LCP(Largest Contentful Paint), INP(Interaction to Next Paint)์— ์–ด๋–ค ์ง์ ‘์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”์ง€ ์—ฐ๊ฒฐํ•˜์—ฌ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค [13, 24, 25]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Development/Vite Build Tool.md b/10_Wiki/Development/Vite Build Tool.md new file mode 100644 index 00000000..de593fe3 --- /dev/null +++ b/10_Wiki/Development/Vite Build Tool.md @@ -0,0 +1,72 @@ +# [[Vite Build Tool]] + +## ๐Ÿ“Œ Brief ์ž„๋ฌด +Vite๋Š” ํ˜„๋Œ€ ํ”„๋ก ํŠธ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(์ฃผ๋กœ React)์„ ์œ„ํ•œ ํ‘œ์ค€ ๋นŒ๋“œ ๋„๊ตฌ๋กœ, ๊ธฐ์กด Webpack ๋ฐ Create React App(CRA)์„ ๋Œ€์ฒดํ•˜๋ฉฐ ๋น ๋ฅด๊ฒŒ ์ž๋ฆฌ ์žก์•˜์Šต๋‹ˆ๋‹ค [1, 2]. ์ด ๋„๊ตฌ๋Š” ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋Š” ๋ธŒ๋ผ์šฐ์ €์˜ ๋„ค์ดํ‹ฐ๋ธŒ ES ๋ชจ๋“ˆ(ESM)์„ ํ™œ์šฉํ•ด ์ฆ‰๊ฐ์ ์ธ ์„œ๋ฒ„ ์‹œ์ž‘๊ณผ ์ดˆ๊ณ ์† HMR(Hot Module Replacement)์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [2-4]. ํ”„๋กœ๋•์…˜ ๋ฐฐํฌ ์‹œ์—๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ Rollup์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…๊ณผ ํŠธ๋ฆฌ ์‰์ดํ‚น์ด ์ ์šฉ๋œ ๊ณ ๋„๋กœ ์ตœ์ ํ™”๋œ ๋ฒˆ๋“ค์„ ์ƒ์„ฑํ•˜๋Š” ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ํŠน์ง•์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค [5, 6]. + +## ๐Ÿ“– Core Content +* **ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์•„ํ‚คํ…์ฒ˜ (Hybrid Architecture)** + * **๊ฐœ๋ฐœ ํ™˜๊ฒฝ:** ์ฝ”๋“œ๋ฅผ ์‚ฌ์ „์— ์ „์ฒด ๋ฒˆ๋“ค๋งํ•˜์ง€ ์•Š๊ณ  ๋ธŒ๋ผ์šฐ์ €์— ๋„ค์ดํ‹ฐ๋ธŒ ES ๋ชจ๋“ˆ(ESM)๋กœ ์ง์ ‘ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ํŒŒ์ผ๋งŒ ๋กœ๋“œ๋˜๋ฏ€๋กœ ํ”„๋กœ์ ํŠธ ํฌ๊ธฐ๊ฐ€ ์ปค์ ธ๋„ ๊ฐœ๋ฐœ ์„œ๋ฒ„๊ฐ€ ์ฆ‰๊ฐ์ ์œผ๋กœ ๋ฐ˜์‘ํ•ฉ๋‹ˆ๋‹ค [2-4]. + * **ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ:** ๋ฐฐํฌ ์‹œ์—๋Š” Rollup์„ ์‚ฌ์šฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฒˆ๋“ค๋งํ•˜๋ฉฐ, ์ž๋™ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ… ๋ฐ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ํŠธ๋ฆฌ ์‰์ดํ‚น(Tree-shaking)์„ ํ†ตํ•ด ์ตœ์ ํ™”๋œ ์ •์  ์—์…‹์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [5, 6]. +* **์ดˆ๊ณ ์† ์ปดํŒŒ์ผ ๋ฐ ์‚ฌ์ „ ๋ฒˆ๋“ค๋ง (Fast Compilation & Pre-bundling)** + * Vite๋Š” esbuild๋‚˜ ์ตœ์‹  Rust ๊ธฐ๋ฐ˜ ํŠธ๋žœ์Šคํฌ๋จธ์ธ SWC(Speedy Web Compiler)๋ฅผ ํ™œ์šฉํ•˜์—ฌ JSX ๋ฐ TypeScript ํŒŒ์ผ์„ ์‚ฌ์‹ค์ƒ ์ฆ‰์‹œ ์ปดํŒŒ์ผํ•ฉ๋‹ˆ๋‹ค [4, 7]. ๊ธฐ์กด Babel์„ SWC๋กœ ๋Œ€์ฒดํ•˜๋ฉด ํ•ซ ๋ชจ๋“ˆ ๋ฆฌ๋กœ๋“œ ์‹œ๊ฐ„์ด ํฌ๊ฒŒ ๋‹จ์ถ•๋ฉ๋‹ˆ๋‹ค [8]. + * ๊ฐœ๋ฐœ ์ค‘ ์ƒˆ๋กœ๊ณ ์นจ ์†๋„๋ฅผ ์ตœ์ ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์ข…์†์„ฑ์„ ์‚ฌ์ „ ๋ฒˆ๋“ค๋ง(Pre-bundling, `optimizeDeps`)ํ•ฉ๋‹ˆ๋‹ค [8]. +* **์„ค์ • ๋ฐ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ƒํƒœ๊ณ„ (Configuration & Plugins)** + * `vite.config.js`๋ฅผ ํ†ตํ•ด ๊ฒฝ๋กœ ๋ณ„์นญ(Path Aliases), CORS ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ๊ฐœ๋ฐœ ์„œ๋ฒ„ ํ”„๋ก์‹œ, `VITE_` ์ ‘๋‘์‚ฌ๊ฐ€ ๋ถ™์€ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋“ฑ์„ ์œ ์—ฐํ•˜๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [7, 9, 10]. + * SVG๋ฅผ React ์ปดํฌ๋„ŒํŠธ๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•œ `vite-plugin-svgr`, ์˜คํ”„๋ผ์ธ PWA ์ง€์›์„ ์œ„ํ•œ `vite-plugin-pwa`, ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ๋ถ„์„ํ•˜๋Š” `rollup-plugin-visualizer` ๋“ฑ ๊ฐ•๋ ฅํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ƒํƒœ๊ณ„๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค [11-13]. +* **๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ ์ตœ์ ํ™” (Bundle Optimization)** + * ๊ธฐ๋ณธ์ ์œผ๋กœ Vite๋Š” ์•ฑ ์ฝ”๋“œ์™€ ๋ชจ๋“  ์ข…์†์„ฑ(node_modules)์„ ํ•˜๋‚˜์˜ `index.js`์— ๋‹ด์•„ ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด `vite.config.ts`์˜ Rollup ์˜ต์…˜์—์„œ `manualChunks`๋ฅผ ์„ค์ •ํ•˜์—ฌ React ์ฝ”์–ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋“ฑ ๋ฌด๊ฑฐ์šด ๋ฒค๋”๋ฅผ ๋ถ„๋ฆฌํ•˜๊ณ  ๋ธŒ๋ผ์šฐ์ € ์บ์‹ฑ ํšจ์œจ์„ ๋†’์ž…๋‹ˆ๋‹ค [6, 14, 15]. + * `React.lazy()`์™€ ``๋ฅผ ๊ฒฐํ•ฉํ•œ ๋ผ์šฐํŠธ ๋ ˆ๋ฒจ ๋™์  ์ž„ํฌํŠธ๋ฅผ ํ†ตํ•ด ์ดˆ๊ธฐ ๋ฉ”์ธ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ๊ทน์ ์œผ๋กœ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [11, 14, 15]. + +## โš–๏ธ Trade-offs & Caveats +* **๋Œ€ํ˜• ์ฒญํฌ ๊ฒฝ๊ณ  ๋ฐ ์ดˆ๊ธฐ ๋ฒˆ๋“ค ๋น„๋Œ€ํ™” (Large Chunks Warning):** Vite๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ์ข…์†์„ฑ์„ ๋‹จ์ผ ํŒŒ์ผ๋กœ ๋นŒ๋“œํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ˆ˜๋™์œผ๋กœ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…์„ ํ•˜์ง€ ์•Š์œผ๋ฉด ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ ์‹œ "500kB ์ดˆ๊ณผ" ๊ฒฝ๊ณ ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋‹ค์šด๋กœ๋“œ ์‹œ๊ฐ„์„ ์ง€์—ฐ์‹œํ‚ค๊ณ  ๋‚ฎ์€ ์„ฑ๋Šฅ์˜ ๋ชจ๋ฐ”์ผ ๊ธฐ๊ธฐ์—์„œ ํŒŒ์‹ฑ ๋ฐ ์ปดํŒŒ์ผ์— ๋ฌด๋ฆฌ๋ฅผ ์ฃผ์–ด FCP, LCP, INP์™€ ๊ฐ™์€ Core Web Vitals ์ง€ํ‘œ๋ฅผ ์•…ํ™”์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [14, 16, 17]. +* **๊ฐœ๋ฐœ์ž ๋„๊ตฌ ์บ์‹ฑ ์˜์กด์„ฑ:** Vite๋Š” ๋ชจ๋“ˆ ๋กœ๋”ฉ ์„ฑ๋Šฅ์„ ์œ„ํ•ด ๋ธŒ๋ผ์šฐ์ €์˜ ์บ์‹ฑ์— ํฌ๊ฒŒ ์˜์กดํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐœ๋ฐœ ์ค‘ ๋ธŒ๋ผ์šฐ์ € ๊ฐœ๋ฐœ์ž ๋„๊ตฌ์—์„œ "์บ์‹œ ์‚ฌ์šฉ ์•ˆ ํ•จ(Disable cache)"์„ ์„ค์ •ํ•˜๋ฉด ๊ฐœ๋ฐœ ์„œ๋ฒ„๊ฐ€ ๋А๋ ค์ง€๋Š” ๋ถ€์ž‘์šฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [18]. +* **ํ”Œ๋Ÿฌ๊ทธ์ธ ๋‚จ์šฉ์œผ๋กœ ์ธํ•œ ์„ฑ๋Šฅ ์ €ํ•˜:** ๊ณผ๋„ํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ ์‚ฌ์šฉ์€ ๊ฐœ๋ฐœ ์„œ๋ฒ„์˜ ์†๋„๋ฅผ ์ €ํ•˜์‹œํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๊ตฌ์„ฑ์„ ์ตœ์†Œํ™”ํ•˜๊ณ  ํ•„์š”ํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ๋งŒ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [18]. +* **์‚ฌ์ „ ๋ฒˆ๋“ค๋ง ๊ด€๋ฆฌ ํ•„์š”์„ฑ:** ๊ทœ๋ชจ๊ฐ€ ํฌ๊ฑฐ๋‚˜ ํŠน์ดํ•œ ์™ธ๋ถ€ ์ข…์†์„ฑ์˜ ๊ฒฝ์šฐ, `optimizeDeps` ์„ค์ •์„ ์ˆ˜๋™์œผ๋กœ ์ œ์–ดํ•˜์ง€ ์•Š์œผ๋ฉด ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์ „ ๋ฒˆ๋“ค๋ง์œผ๋กœ ์ธํ•œ ์†๋„ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [8, 11]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] +- [[Native ES Modules (ESM)]] + - ์—ฐ๊ฒฐ ์ด์œ : Vite๊ฐ€ ๊ฐœ๋ฐœ ๋‹จ๊ณ„์—์„œ ๋น ๋ฅธ ๊ตฌ๋™ ์†๋„๋ฅผ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ํ™œ์šฉํ•˜๋Š” ๋ธŒ๋ผ์šฐ์ €์˜ ๊ธฐ๋ณธ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค [2, 4]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ณผ๊ฑฐ ๋„๊ตฌ(Webpack)์˜ ๋ฌด๊ฑฐ์šด ์‚ฌ์ „ ๋ฒˆ๋“ค๋ง ๋ฐฉ์‹๊ณผ ๋Œ€๋น„๋˜๋Š” Vite์˜ '์š”์ฒญ ์‹œ ์ œ๊ณต(On-demand serving)' ๋ฉ”์ปค๋‹ˆ์ฆ˜์˜ ์›๋ฆฌ. + +- [[Rollup]] + - ์—ฐ๊ฒฐ ์ด์œ : Vite์˜ ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ๋‚ด๋ถ€ ๋ฒˆ๋“ค๋Ÿฌ์ž…๋‹ˆ๋‹ค [5, 6]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ฐฐํฌ ํ™˜๊ฒฝ์—์„œ ์–ด๋–ป๊ฒŒ `manualChunks`๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฒˆ๋“ค์„ ๋ถ„ํ• ํ•˜๊ณ , ํŠธ๋ฆฌ ์‰์ดํ‚น์„ ํ†ตํ•ด ์ตœ์ ํ™”๋œ ๊ฒฐ๊ณผ๋ฌผ์„ ๋„์ถœํ•˜๋Š”์ง€ ๊ทธ ๊ณผ์ • [10, 16]. + +- [[SWC]] + - ์—ฐ๊ฒฐ ์ด์œ : ๊ธฐ์กด์˜ Babel์„ ๋Œ€์ฒดํ•˜์—ฌ JSX์™€ TypeScript ์ปดํŒŒ์ผ์„ ์—„์ฒญ๋‚˜๊ฒŒ ๋น ๋ฅธ ์†๋„๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” Rust ๊ธฐ๋ฐ˜ ํŠธ๋žœ์Šคํฌ๋จธ์ž…๋‹ˆ๋‹ค [4, 7, 8]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Vite ํ™˜๊ฒฝ์—์„œ React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ•ซ ๋ฆฌ๋กœ๋“œ์™€ ๋นŒ๋“œ ํผํฌ๋จผ์Šค๋ฅผ ํ•œ ์ฐจ์› ๋Œ์–ด์˜ฌ๋ฆฌ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ์˜ ์—ญํ• . + +#### [์ตœ์ ํ™” ๊ธฐ๋ฒ•] +- [[Code Splitting & manualChunks]] + - ์—ฐ๊ฒฐ ์ด์œ : 500kB ์ด์ƒ์˜ ๊ฑฐ๋Œ€ํ•œ ๋ฉ”์ธ ๋ฒˆ๋“ค ๊ฒฝ๊ณ  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Vite/Rollup ํ™˜๊ฒฝ์—์„œ ๋ฒค๋” ์ฝ”๋“œ์™€ ์•ฑ ์ฝ”๋“œ๋ฅผ ๋‚˜๋ˆ„๋Š” ํ•ต์‹ฌ ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค [6, 14, 15]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ธŒ๋ผ์šฐ์ € ๋ณ‘๋ ฌ ๋‹ค์šด๋กœ๋“œ์™€ ํšจ์œจ์ ์ธ ์บ์‹œ ๋ฌดํšจํ™” ์ „๋žต, ์ดˆ๊ธฐ ํŽ˜์ด๋กœ๋“œ ์ตœ์†Œํ™” ๋ฐฉ๋ฒ• [17, 19]. + +### Deeper Research Questions + +- Vite์˜ ๋„ค์ดํ‹ฐ๋ธŒ ESM ๊ธฐ๋ฐ˜ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ๊ณผ Rollup ๊ธฐ๋ฐ˜ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ ์‚ฌ์ด์˜ ์ฐจ์ด๋กœ ์ธํ•ด, ๋Ÿฐํƒ€์ž„ ๋˜๋Š” ๋นŒ๋“œ ํƒ€์ž„์— ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๋‚˜ ์˜ˆ์™ธ ์ผ€์ด์Šค๋Š” ๋ฌด์—‡์ธ๊ฐ€? +- ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ `optimizeDeps`๋ฅผ ํ†ตํ•œ ์‚ฌ์ „ ๋ฒˆ๋“ค๋ง ๋ฉ”์ปค๋‹ˆ์ฆ˜ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ค ๊ธฐ์ค€์„ ๊ฐ€์ง€๊ณ  ์ข…์†์„ฑ์„ ๋ถ„๋ฆฌ/ํฌํ•จํ•ด์•ผ ํ•˜๋Š”๊ฐ€? +- `@vitejs/plugin-react-swc` ์‚ฌ์šฉ ์‹œ, ๊ธฐ์กด Babel ์ƒํƒœ๊ณ„์˜ ์ปค์Šคํ…€ ํ”Œ๋Ÿฌ๊ทธ์ธ๋“ค์„ ์–ด๋–ป๊ฒŒ ์ด๊ด€ํ•˜๊ฑฐ๋‚˜ ๋Œ€์ฒดํ•ด์•ผ ํ•˜๋Š”๊ฐ€? +- `manualChunks`๋ฅผ ์„ธ๋ฐ€ํ•˜๊ฒŒ ์„ค์ •ํ•  ๋•Œ ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ค‘๋ณต ํฌํ•จ์„ ๋ง‰๊ณ  ๊ฐ€์žฅ ์ด์ƒ์ ์ธ ์ฒญํฌ ํฌ๊ธฐ๋ฅผ ์œ ์ง€ํ•˜๋Š” ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? +- Vite ํ™˜๊ฒฝ์—์„œ ๋ผ์šฐํŠธ ๋ ˆ๋ฒจ ์ง€์—ฐ ๋กœ๋”ฉ(`React.lazy`) ์ ์šฉ ์‹œ ๋ฐœ์ƒํ•˜๋Š” ์›Œํ„ฐํด(Waterfall) ๋„คํŠธ์›Œํฌ ์š”์ฒญ ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด `preload` ๋˜๋Š” `prefetch` ํžŒํŠธ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ฒฐํ•ฉํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? + +### Practical Application Contexts + +- **Implementation:** `npm create vite@latest`๋ฅผ ์‚ฌ์šฉํ•ด ๋ถˆํ•„์š”ํ•œ ์„ค์ • ์—†๋Š” ๊ฐ€๋ฒผ์šด ์ดˆ๊ธฐ ๊ตฌ์กฐ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , `vite.config.js`์— `@vitejs/plugin-react-swc`์™€ ๊ฐ™์€ ํ”Œ๋Ÿฌ๊ทธ์ธ, ๊ฒฝ๋กœ ๋ณ„์นญ(`@/components` ๋“ฑ), ๋ฐฑ์—”๋“œ API ์—ฐ๋™์„ ์œ„ํ•œ proxy ์„ค์ •์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค [3, 7, 9, 10]. +- **System Design:** ํ”„๋ก ํŠธ์—”๋“œ ์‹œ์Šคํ…œ ์„ค๊ณ„ ์‹œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ(๋น ๋ฅธ ํ”ผ๋“œ๋ฐฑ ๋ฃจํ”„ ๋ณด์žฅ)๊ณผ ๋ฐฐํฌ ํ™˜๊ฒฝ(๊ณ ๋„์˜ ์••์ถ• ๋ฐ ๋ณ‘๋ ฌ ๋กœ๋“œ๋ฅผ ์œ„ํ•œ ๋ชจ๋“ˆํ™” ๋ณด์žฅ)์— ๋‹ค๋ฅธ ์ „๋žต์„ ์ทจํ•˜๋Š” Vite์˜ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์ฒ ํ•™์„ ์•„ํ‚คํ…์ฒ˜์— ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค [5]. +- **Operation / Maintenance:** CI/CD ํŒŒ์ดํ”„๋ผ์ธ์ด๋‚˜ ๋กœ์ปฌ ๋นŒ๋“œ ํ›„ `rollup-plugin-visualizer` ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ํ™œ์šฉํ•˜์—ฌ ์–ด๋–ค ํŒจํ‚ค์ง€๊ฐ€ ๋ฉ”์ธ ๋ฒˆ๋“ค ์šฉ๋Ÿ‰์„ ์ฐจ์ง€ํ•˜๋Š”์ง€ ์‹œ๊ฐ์  ํŠธ๋ฆฌ๋งต์œผ๋กœ ์ •๊ธฐ ์ ๊ฒ€ํ•˜๊ณ  ์ตœ์ ํ™”ํ•ฉ๋‹ˆ๋‹ค [11, 13, 18]. +- **Learning Path:** ๋ชจ๋“ˆ ๋ฒˆ๋“ค๋Ÿฌ์˜ ๋ฐœ์ „ ๊ณผ์ •(Webpack -> ES Modules ๋„ค์ดํ‹ฐ๋ธŒ ๋„์ž… -> Vite)์„ ํ•™์Šตํ•œ ํ›„, ๋นŒ๋“œ ๋„๊ตฌ ์ฐจ์›์˜ ์ตœ์ ํ™”(`manualChunks`)์™€ React ํ”„๋ ˆ์ž„์›Œํฌ ์ฐจ์›์˜ ์ตœ์ ํ™”(`React.lazy`)๊ฐ€ ๊ฒฐํ•ฉ๋˜์—ˆ์„ ๋•Œ์˜ ์‹œ๋„ˆ์ง€๋ฅผ ์ดํ•ดํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ํ•™์Šต์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค [2, 6, 15]. +- **My Project Relevance:** Vite ๋นŒ๋“œ ์‹œ "Some chunks are larger than 500 kB" ๊ฒฝ๊ณ ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ๋‹นํ™ฉํ•˜์ง€ ์•Š๊ณ , ์ž์ฃผ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ๋ฒค๋” ์ฝ”๋“œ(React ์ฝ”์–ด, ์ฐจํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋“ฑ)๋ฅผ ๋ถ„๋ฆฌํ•˜๊ณ  ๋ผ์šฐํ„ฐ ๋ ˆ๋ฒจ์—์„œ ์ง€์—ฐ ๋กœ๋”ฉ์„ ๋„์ž…ํ•˜์—ฌ ๋‹ค์šด๋กœ๋“œ ์†๋„ ๋ฐ FCP, LCP๋ฅผ ๊ฐœ์„ ํ•˜๋Š” ๋ฐ ์ง์ ‘์ ์œผ๋กœ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค [14-16]. + +### Adjacent Topics + +- [[Webpack]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: Vite๊ฐ€ ๋“ฑ์žฅํ•˜๊ธฐ ์ „ ์—…๊ณ„ ํ‘œ์ค€์ด์—ˆ์œผ๋‚˜ ์‹œ์ž‘ ์ „ ์ „์ฒด ๋ฒˆ๋“ค๋ง ๊ณผ์ •์œผ๋กœ ์ธํ•ด ๋ฌด๊ฑฐ์šด ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„ Webpack์˜ ํ•œ๊ณ„์™€ Vite์™€์˜ ์•„ํ‚คํ…์ฒ˜ ๋น„๊ต [1, 2]. +- [[Core Web Vitals]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: Vite์˜ ์ฒญํฌ ๋ถ„ํ•  ๋ฐ ์ง€์—ฐ ๋กœ๋”ฉ ๊ธฐ๋ฒ•์ด ์‹ค์ œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ์ง€ํ‘œ์ธ FCP(First Contentful Paint), LCP(Largest Contentful Paint), INP(Interaction to Next Paint)์— ์–ด๋–ป๊ฒŒ ์ง๊ฒฐ๋˜๋Š”์ง€ ํƒ๊ตฌ [17, 20]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Development/๋Œ€๊ทœ๋ชจ ํ”„๋ก ํŠธ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜.md b/10_Wiki/Development/๋Œ€๊ทœ๋ชจ ํ”„๋ก ํŠธ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜.md new file mode 100644 index 00000000..b3e02b9e --- /dev/null +++ b/10_Wiki/Development/๋Œ€๊ทœ๋ชจ ํ”„๋ก ํŠธ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜.md @@ -0,0 +1,64 @@ +# [[๋Œ€๊ทœ๋ชจ ํ”„๋ก ํŠธ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜]] + +## ๐Ÿ“Œ Brief Summary +๋Œ€๊ทœ๋ชจ ํ”„๋ก ํŠธ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋‹จ์ˆœํ•œ ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰์„ ๋„˜์–ด ํ™•์žฅ์„ฑ, ์œ ์ง€๋ณด์ˆ˜์„ฑ, ๊ณ ์„ฑ๋Šฅ์„ ์š”๊ตฌํ•˜๋Š” ๊ณ ๋„๋กœ ์ •๊ตํ•œ ๋ถ„์‚ฐ ์†Œํ”„ํŠธ์›จ์–ด ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค. ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ UI์˜ ๋ถ„๋ฆฌ, ๋ช…ํ™•ํ•œ ์ƒํƒœ ์†Œ์œ ๊ถŒ, ์—„๊ฒฉํ•œ ํด๋” ๊ตฌ์กฐ(Feature-Sliced Design ๋“ฑ)๋ฅผ ํ†ตํ•ด ์•„ํ‚คํ…์ฒ˜์˜ ๋ถ•๊ดด๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…, ์ž๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜, ์„ธ๋ถ„ํ™”๋œ ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ตœ์ ์˜ ๋ Œ๋”๋ง ์„ฑ๋Šฅ๊ณผ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค. + +## ๐Ÿ“– Core Content + +* **์•„ํ‚คํ…์ฒ˜ ๋ฐ ํด๋” ๊ตฌ์กฐ (Architecture & Folder Structure)** + * ๊ณผ๊ฑฐ์˜ ํŒŒ์ผ ํƒ€์ž… ๊ธฐ๋ฐ˜(MVC ๋“ฑ) ํด๋” ๊ตฌ์กฐ๋Š” ๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ๋กœ์ง์ด ํŒŒํŽธํ™”๋˜๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€๊ทœ๋ชจ ์•ฑ์—์„œ๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๊ธฐ๋Šฅ๋ณ„๋กœ ์ฝ”๋“œ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” **๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜(Feature-based)** ๋˜๋Š” **FSD(Feature-Sliced Design)** ์•„ํ‚คํ…์ฒ˜๊ฐ€ ํ‘œ์ค€์œผ๋กœ ์ž๋ฆฌ ์žก์•˜์Šต๋‹ˆ๋‹ค [1-13]. + * FSD๋Š” ์•ฑ์„ ๊ณต์œ (shared), ์—”ํ‹ฐํ‹ฐ(entities), ๊ธฐ๋Šฅ(features), ์œ„์ ฏ(widgets), ํŽ˜์ด์ง€(pages), ์•ฑ(app) ๋“ฑ์˜ ๊ณ„์ธต์œผ๋กœ ๋‚˜๋ˆ„๊ณ , **๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ๊ทœ์น™**(ํ•˜์œ„ ๊ณ„์ธต๋งŒ ์ฐธ์กฐ ๊ฐ€๋Šฅ)๊ณผ **Public API ๊ทœ์น™**(index.ts๋ฅผ ํ†ตํ•œ ์บก์Аํ™”)์„ ๊ฐ•์ œํ•˜์—ฌ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถฅ๋‹ˆ๋‹ค [6, 9, 10, 14, 15]. +* **์ƒํƒœ ๊ด€๋ฆฌ์˜ ํŒŒํŽธํ™” (Fragmentation of Global State)** + * ๊ฑฐ๋Œ€ํ•œ ๋‹จ์ผ ์Šคํ† ์–ด(Monolithic Redux) ๋Œ€์‹ , ๋ฐ์ดํ„ฐ ์œ ํ˜•์— ๋”ฐ๋ผ ์ตœ์ ์˜ ๋„๊ตฌ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๋กœ์ปฌ ์ƒํƒœ๋Š” `useState`, ์ „์—ญ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒํƒœ๋Š” `Zustand`๋‚˜ `Jotai`, ์„œ๋ฒ„(API) ์ƒํƒœ๋Š” `TanStack Query`๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์บ์‹ฑ ๋ฐ ๋™๊ธฐํ™”๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค [16-24]. + * ํŠนํžˆ Context API๋Š” ๊ฐ’์ด ๋ณ€ํ•  ๋•Œ๋งˆ๋‹ค ๋ชจ๋“  ๊ตฌ๋… ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฆฌ๋ Œ๋”๋งํ•˜๋Š” '๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ' ๋ฐฉ์‹์ด๋ฏ€๋กœ ์ •์  ๋ฐ์ดํ„ฐ(ํ…Œ๋งˆ ๋“ฑ)์— ์ ํ•ฉํ•˜๋ฉฐ, ์ž์ฃผ ๋ณ€๊ฒฝ๋˜๋Š” ๋™์  ์ƒํƒœ๋Š” ์„ ํƒ์ž(Selector) ํŒจํ„ด์œผ๋กœ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ฐฉ์ง€ํ•˜๋Š” Zustand ๋“ฑ์ด ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค [16, 17, 25-28]. +* **์„ฑ๋Šฅ ์ตœ์ ํ™” (Performance Optimization)** + * **๋นŒ๋“œ/๋Ÿฐํƒ€์ž„ ์ตœ์ ํ™”:** Vite์™€ Rollup์„ ํ™œ์šฉํ•˜์—ฌ ์ž์ฃผ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(React ๋“ฑ)๋ฅผ `manualChunks`๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ์บ์‹œ ํšจ์œจ์„ ๋†’์ด๊ณ , `React.lazy`์™€ `Suspense`๋ฅผ ํ†ตํ•ด ๋ผ์šฐํŠธ ๋˜๋Š” ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„์˜ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค [29-37]. + * **๋ Œ๋”๋ง ์„ฑ๋Šฅ:** React 19/2025 ์ƒํƒœ๊ณ„์—์„œ๋Š” ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜(React.memo, useMemo)์˜ ํ•œ๊ณ„๋ฅผ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด **React Compiler**๋ฅผ ๋„์ž…ํ•˜์—ฌ ๋นŒ๋“œ ํƒ€์ž„์— ์ž๋™์œผ๋กœ ๋ Œ๋”๋ง ์ตœ์ ํ™”๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๋Ÿ‰์˜ ๋ฆฌ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋Š” ๊ฐ€์ƒํ™”(Virtualization) ๊ธฐ์ˆ ์„ ํ†ตํ•ด DOM ๋น„๋Œ€ํ™”๋ฅผ ๋ง‰์Šต๋‹ˆ๋‹ค [30-32, 38-44]. +* **๋ณต์›๋ ฅ ๋ฐ ๋””๋ฒ„๊น… (Resilience & Debugging)** + * ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๋กœ ์ธํ•œ '๋ฐฑ์ง€ ํ™”๋ฉด(White screen of death)'์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด **์—๋Ÿฌ ๋ฐ”์šด๋”๋ฆฌ(Error Boundaries)**๋ฅผ ๋Œ€์‹œ๋ณด๋“œ๋‚˜ ์„œ๋“œํŒŒํ‹ฐ ์œ„์ ฏ ๋“ฑ ๋ถˆ์•ˆ์ •ํ•œ UI ์„น์…˜์— ์ „๋žต์ ์œผ๋กœ ๋ฐฐ์น˜ํ•˜์—ฌ Fallback UI๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [45-53]. + * ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜(Detached DOM nodes ๋“ฑ)๋Š” ์„ฑ๋Šฅ ์ €ํ•˜์˜ ์ฃผ์›์ธ์ด๋ฏ€๋กœ Chrome DevTools์˜ Heap Snapshot ๋ฐ Allocation Timeline์„ ํ†ตํ•ด ์ถ”์ ํ•˜๋ฉฐ, ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋Š” Sentry, LogRocket, Datadog ๋“ฑ์˜ ๊ฐ€์‹œ์„ฑ(Observability) ๋„๊ตฌ๋กœ ๋ชจ๋‹ˆํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค [54-63]. +* **ํด๋ฆฐ ์ฝ”๋“œ ๋ฐ ๊ฑฐ๋ฒ„๋„Œ์Šค (Clean Code & Governance)** + * React์˜ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—๋„ SOLID ์›์น™(๋‹จ์ผ ์ฑ…์ž„ ์›์น™, ๊ฐœ๋ฐฉ-ํ์‡„ ์›์น™ ๋“ฑ), DRY, KISS, YAGNI ์›์น™์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ปดํฌ๋„ŒํŠธ๋Š” ๋‹จ์ผ ์ฑ…์ž„์„ ๊ฐ€์ ธ์•ผ ํ•˜๋ฉฐ ๊ณผ๋„ํ•œ ์ถ”์ƒํ™”๋Š” ์ง€์–‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [64-69]. + * ์šด์˜์ฒด์ œ ๊ฐ„ ํ˜ธํ™˜์„ฑ ๋ฐ ๋นŒ๋“œ ์˜ค๋ฅ˜ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด ํŒŒ์ผ ๋ฐ ํด๋”๋ช…์€ `kebab-case`, ์ปดํฌ๋„ŒํŠธ๋Š” `PascalCase` ์‚ฌ์šฉ์„ ํ‘œ์ค€ํ™”ํ•˜๋ฉฐ, ESLint, Prettier, Husky๋ฅผ ํ†ตํ•ด CI/CD ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ์•„ํ‚คํ…์ฒ˜ ๊ฒฝ๊ณ„์™€ ์ฝ”๋“œ ํ’ˆ์งˆ์„ ์ž๋™ ๊ฐ•์ œํ•ฉ๋‹ˆ๋‹ค [70-73]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts +- [[Feature-Sliced Design (FSD)]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋Œ€๊ทœ๋ชจ ํ”„๋ก ํŠธ์—”๋“œ ํ”„๋กœ์ ํŠธ์˜ ํด๋” ๊ตฌ์กฐ์™€ ๋ชจ๋“ˆ ์˜์กด์„ฑ์„ ํ†ต์ œํ•˜๋Š” ํ•ต์‹ฌ ์•„ํ‚คํ…์ฒ˜ ๋ฐฉ๋ฒ•๋ก ์ž…๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ๊ณผ UI๋ฅผ ์–ด๋–ป๊ฒŒ ๊ณ„์ธต์ ์œผ๋กœ ๋ถ„๋ฆฌํ•˜๊ณ , ์ˆœํ™˜ ์ฐธ์กฐ ๋ฐ ๊ฐ•ํ•œ ๊ฒฐํ•ฉ์„ ์–ด๋–ป๊ฒŒ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[์ƒํƒœ ๊ด€๋ฆฌ (State Management)]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋Œ€๊ทœ๋ชจ ์•ฑ์—์„œ๋Š” ์ „์—ญ ์ƒํƒœ, ์„œ๋ฒ„ ์ƒํƒœ, ๋กœ์ปฌ ์ƒํƒœ๋ฅผ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌํ•ด์•ผ ํ™•์žฅ ๋ฐ ์„ฑ๋Šฅ ์œ ์ง€๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Context API์˜ ์„ฑ๋Šฅ์  ํ•œ๊ณ„(๋ฆฌ๋ Œ๋”๋ง ํญํ’)์™€ Zustand์˜ Selector ํŒจํ„ด, TanStack Query๋ฅผ ํ†ตํ•œ ์„œ๋ฒ„ ์ƒํƒœ ์บ์‹ฑ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[์„ฑ๋Šฅ ์ตœ์ ํ™” (Performance Optimization)]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋Œ€๊ทœ๋ชจ ์ฝ”๋“œ๋ฒ ์ด์Šค๋Š” ํ•„์—ฐ์ ์œผ๋กœ ๋ฒˆ๋“ค ํฌ๊ธฐ ์ฆ๊ฐ€์™€ ๋ Œ๋”๋ง ๋ณ‘๋ชฉ์„ ์ดˆ๋ž˜ํ•˜๋ฏ€๋กœ ์ด๋ฅผ ์ œ์–ดํ•˜๋Š” ๊ธฐ์ˆ ์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: React Compiler์˜ ์ž๋™ํ™”๋œ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ์›๋ฆฌ, Vite์˜ manualChunks๋ฅผ ํ†ตํ•œ ๋ฒˆ๋“ค ๋ถ„ํ• , React.lazy ๊ธฐ๋ฐ˜์˜ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ… ์ ์šฉ ๋ฐฉ์‹์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[์—๋Ÿฌ ๋ฐ”์šด๋”๋ฆฌ (Error Boundaries)]] + - ์—ฐ๊ฒฐ ์ด์œ : ์ปดํฌ๋„ŒํŠธ ํ•˜๋‚˜์˜ ์˜ค๋ฅ˜๊ฐ€ ์ „์ฒด ์•ฑ์˜ ํฌ๋ž˜์‹œ๋กœ ์ด์–ด์ง€์ง€ ์•Š๊ฒŒ ๋ง‰์•„์ฃผ๋Š” ๋Œ€๊ทœ๋ชจ ์‹œ์Šคํ…œ์˜ ํ•„์ˆ˜ ์•ˆ์ „๋ง์ž…๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ ๋‚ด์—์„œ ์—๋Ÿฌ๋ฅผ ๊ฒฉ๋ฆฌํ•˜๋Š” ์›๋ฆฌ์™€ ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๋ฅผ ์šฐ์•„ํ•˜๊ฒŒ ์ฒ˜๋ฆฌ(Graceful degradation)ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ (Memory Leaks)]] + - ์—ฐ๊ฒฐ ์ด์œ : ์•ฑ ์‚ฌ์šฉ ์‹œ๊ฐ„์ด ๊ธธ์–ด์งˆ์ˆ˜๋ก ์„ฑ๋Šฅ์„ ์‹ฌ๊ฐํ•˜๊ฒŒ ์ €ํ•˜์‹œํ‚ค๋Š” ์ˆจ์€ ์›์ธ์ž…๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํด๋กœ์ €(Closure)๋‚˜ Detached DOM์— ์˜ํ•ด ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํšŒ์ˆ˜ํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ตฌ์กฐ์  ์›์ธ๊ณผ DevTools๋ฅผ ํ™œ์šฉํ•œ ๋””๋ฒ„๊น… ๊ธฐ๋ฒ•์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### Deeper Research Questions +- FSD(Feature-Sliced Design) ๋„์ž… ์‹œ '์ธ์ฆ(Auth)'์ด๋‚˜ '๋ผ์šฐํŒ…'๊ณผ ๊ฐ™์€ Cross-cutting concern(๊ณตํ†ต ๊ด€์‹ฌ์‚ฌ)์€ ๊ณ„์ธต(Layer) ๊ตฌ์กฐ์˜ ์–ด๋А ๋ถ€๋ถ„์— ๋ฐฐ์น˜ํ•˜๊ณ  ์–ด๋–ป๊ฒŒ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ ํ•ฉํ•œ๊ฐ€? +- React Compiler๊ฐ€ ์ž๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์ˆ˜ํ–‰ํ•  ๋•Œ, ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(์˜ˆ: ๋ถˆ์•ˆ์ •ํ•œ ๊ฐ์ฒด ์ฐธ์กฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ปค์Šคํ…€ ํ›…)์™€์˜ ํ˜ธํ™˜์„ฑ ์ถฉ๋Œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๊ตฌ์ฒด์  ๋ฐฉ์•ˆ์€ ๋ฌด์—‡์ธ๊ฐ€? +- ๋Œ€๊ทœ๋ชจ ๋ฆฌ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ Œ๋”๋งํ•  ๋•Œ Virtualization(์œˆ๋„์œ™) ๊ธฐ์ˆ ์ด DOM ๋…ธ๋“œ ์ฆ๊ฐ€๋ฅผ ๋ง‰๋Š” ์›๋ฆฌ๋Š” ๋ฌด์—‡์ด๋ฉฐ, ์ด ๊ณผ์ •์—์„œ `key` ํ”„๋กญ(prop)์ด ์„ฑ๋Šฅ์— ๋ฏธ์น˜๋Š” ์ •ํ™•ํ•œ ์˜ํ–ฅ์€ ๋ฌด์—‡์ธ๊ฐ€? +- ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์˜ ํ”„๋ก ํŠธ์—”๋“œ ๋ชจ๋‹ˆํ„ฐ๋ง(Sentry, Datadog ๋“ฑ)์ด ์ œ๊ณตํ•˜๋Š” ์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด(Session Replay) ๊ธฐ๋Šฅ์ด ๊ฐœ๋ฐœ์ž์˜ ๋””๋ฒ„๊น…์— ์–ด๋–ป๊ฒŒ ๊ธฐ์—ฌํ•˜๋ฉฐ, ์ด๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฏผ๊ฐ ๋ฐ์ดํ„ฐ ์œ ์ถœ ๋ฐ ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ ์ฆ๊ฐ€๋ผ๋Š” ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๋Š” ์–ด๋–ป๊ฒŒ ๊ทน๋ณตํ•˜๋Š”๊ฐ€? +- Zustand, Jotai์™€ ๊ฐ™์€ ์ตœ์‹  ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๊ธฐ์กด์˜ Redux๋‚˜ Context API์™€ ๋น„๊ตํ•˜์—ฌ ๋™์ /์‹ค์‹œ๊ฐ„ ๋ Œ๋”๋ง ์ตœ์ ํ™”(์˜ˆ: ๋ฆฌ๋ Œ๋”๋ง ์Šคํ‚ต)๋ฅผ ๋‚ด๋ถ€์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ๋Š”๊ฐ€? + +### Practical Application Contexts +- **Implementation:** ํŒŒ์ผ๊ณผ ํด๋” ๋„ค์ด๋ฐ ๊ทœ์น™(ํŒŒ์ผ: kebab-case, ์ปดํฌ๋„ŒํŠธ: PascalCase)์„ ํ†ต์ผํ•˜๊ณ , 300์ค„์ด ๋„˜์–ด๊ฐ€๋Š” ์ปดํฌ๋„ŒํŠธ๋Š” ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)์— ๋”ฐ๋ผ ๋” ์ž‘์€ ํ›…(Hook)๊ณผ ์„œ๋ธŒ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ฆฌํŒฉํ† ๋งํ•ฉ๋‹ˆ๋‹ค. +- **System Design:** ํ”„๋กœ์ ํŠธ ์„ค๊ณ„ ์‹œ ํด๋” ๊ตฌ์กฐ๋ฅผ ๊ธฐ์ˆ  ์Šคํƒ(components, hooks) ๊ธฐ๋ฐ˜์ด ์•„๋‹Œ ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ(features/auth, features/dashboard ๋“ฑ) ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์„ฑํ•˜์—ฌ ๊ฐ ๋ชจ๋“ˆ์˜ ์บก์Аํ™”๋ฅผ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. +- **Operation / Maintenance:** ๊ฐœ๋ณ„ ์„œ๋“œํŒŒํ‹ฐ ์œ„์ ฏ์ด๋‚˜ ๋ถˆ์•ˆ์ •ํ•œ UI ํŒŒํŠธ์— Error Boundary๋ฅผ ์”Œ์›Œ ๋ฉ”์ธ ์„œ๋น„์Šค์˜ ๋™์ž‘์„ ๋ณด์žฅํ•˜๋ฉฐ, Memory Profiler๋ฅผ ์‚ฌ์šฉํ•ด Detached DOM node ๋“ฑ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ์š”์ธ์„ ์ •๊ธฐ์ ์œผ๋กœ ๊ฐ์‚ฌ(Audit)ํ•ฉ๋‹ˆ๋‹ค. +- **Learning Path:** ๋ฆฌ์•กํŠธ ํ•ต์‹ฌ ์›๋ฆฌ(๋ Œ๋”๋ง ํŠธ๋ฆฌ๊ฑฐ ์ดํ•ด) โ†’ ํด๋” ๊ตฌ์กฐ/์•„ํ‚คํ…์ฒ˜(FSD) ์„ค๊ณ„ โ†’ ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ ๋น„๊ต ๋ฐ ๋„์ž… โ†’ ์›น ์„ฑ๋Šฅ ์ง€ํ‘œ(Core Web Vitals) ๋ฐ ๋ฒˆ๋“ค๋Ÿฌ(Vite) ์ตœ์ ํ™” ๋„๊ตฌ ์ฒด๋“์˜ ์ˆœ์„œ๋กœ ํ•™์Šต์„ ๊ณ ๋„ํ™”ํ•ฉ๋‹ˆ๋‹ค. +- **My Project Relevance:** ํŒ€ ๋‹จ์œ„์˜ ํ˜‘์—… ์‹œ ESLint, Prettier, Husky๋ฅผ ๋„์ž…ํ•ด ์•„ํ‚คํ…์ฒ˜ ๊ทœ์น™(๋‹ค๋ฅธ Feature์— ์ง์ ‘ ์ ‘๊ทผ ๊ธˆ์ง€ ๋“ฑ)์„ ์ž๋™ ๊ฐ•์ œํ•˜๊ณ , ์ฝ”๋“œ ๋ฆฌ๋ทฐ ์‹œ ์ผ๊ด€๋œ ์•„ํ‚คํ…์ฒ˜ ์›์น™์„ ๊ธฐ์ค€์œผ๋กœ ์‚ผ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### Adjacent Topics +- [[๋งˆ์ดํฌ๋กœ ํ”„๋ก ํŠธ์—”๋“œ (Micro-Frontends)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋‹จ์ผ ์ €์žฅ์†Œ(Monorepo) ๋ฐ ๋ชจ๋“ˆํ™”์˜ ํ•œ๊ณ„๋ฅผ ๋„˜์–ด, ์ดˆ๋Œ€ํ˜• ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ํ™˜๊ฒฝ์—์„œ ์—ฌ๋Ÿฌ ํŒ€์ด ํ”„๋ก ํŠธ์—”๋“œ๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ๋ฐฐํฌํ•˜๊ณ  ์šด์˜ํ•˜๊ธฐ ์œ„ํ•œ ๋Ÿฐํƒ€์ž„ ํ†ตํ•ฉ ์•„ํ‚คํ…์ฒ˜๋กœ ์ง€์‹์„ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค. +- [[์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ (Visual Regression Testing)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: Storybook์„ ํ™œ์šฉํ•œ ์ปดํฌ๋„ŒํŠธ ๊ณ ๋ฆฝ ๊ฐœ๋ฐœ์„ ๋„˜์–ด์„œ, Happo, Chromatic ๋“ฑ์˜ ๋„๊ตฌ๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ ๋ณ€๊ฒฝ์ด UI๋‚˜ ์ ‘๊ทผ์„ฑ(Accessibility)์— ์˜๋„์น˜ ์•Š์€ ํŒŒ๊ดด์  ์˜ํ–ฅ์„ ๋ฏธ์ณค๋Š”์ง€ ์ž๋™ ๊ฒ€์ฆํ•˜๋Š” QA ๊ณ ๋„ํ™” ์˜์—ญ์œผ๋กœ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Development/๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ.md b/10_Wiki/Development/๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ.md new file mode 100644 index 00000000..a26dcf51 --- /dev/null +++ b/10_Wiki/Development/๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ.md @@ -0,0 +1,63 @@ +# [[๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ]] + +## ๐Ÿ“Œ Brief Summary +๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ(์„œ๋ฒ„ ์ƒํƒœ ๊ด€๋ฆฌ)๋Š” API์—์„œ ๊ฐ€์ ธ์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ํด๋ผ์ด์–ธํŠธ ์ธก ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒํƒœ์™€ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌํ•˜์—ฌ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค [1]. ์ด๋Š” ๋„คํŠธ์›Œํฌ ์š”์ฒญ์— ๋”ฐ๋ฅธ ๋ฐ์ดํ„ฐ ์บ์‹ฑ, ๋™๊ธฐํ™”, ๋กœ๋”ฉ ๋ฐ ์—๋Ÿฌ ์‚ฌ์ดํด ๊ด€๋ฆฌ๋ฅผ ํฌํ•จํ•˜๋ฉฐ, ํ˜„๋Œ€ ํ”„๋ก ํŠธ์—”๋“œ ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜์˜ ํ•ต์‹ฌ ์š”์†Œ์ž…๋‹ˆ๋‹ค [1, 2]. ๋Œ€๊ทœ๋ชจ ์•ฑ์—์„œ๋Š” RTK Query๋‚˜ TanStack Query(React Query)์™€ ๊ฐ™์€ ํŠนํ™”๋œ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ๋ฅผ ์ค„์ด๊ณ  ํšจ์œจ์ ์ธ ์บ์‹œ ๊ด€๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค [1, 3, 4]. + +## ๐Ÿ“– Core Content + +* **์„œ๋ฒ„ ์ƒํƒœ์™€ ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ์˜ ๋ถ„๋ฆฌ:** + ์ตœ๊ทผ ํ”„๋ก ํŠธ์—”๋“œ ์•„ํ‚คํ…์ฒ˜์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ณ€ํ™” ์ค‘ ํ•˜๋‚˜๋Š” "์„œ๋ฒ„ ์ƒํƒœ(Server State)"๋ฅผ "์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒํƒœ"์™€ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. API์—์„œ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐ์ดํ„ฐ๋Š” ํด๋ผ์ด์–ธํŠธ ๋ฐ์ดํ„ฐ์™€ ๊ทผ๋ณธ์ ์œผ๋กœ ๋‹ค๋ฅด๋ฉฐ, ์บ์‹ฑ, ๋™๊ธฐํ™”, ๋กœ๋”ฉ ๋ฐ ์—๋Ÿฌ ์ฒ˜๋ฆฌ๊ฐ€ ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค [1]. Zustand์™€ ๊ฐ™์ด ์œ ์—ฐํ•œ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋น„๋™๊ธฐ(Async) ์ž‘์—…์„ ์ง์ ‘ ๋‹ค๋ฃจ๊ฒŒ ๋˜๋ฉด, ํŒ€์›๋งˆ๋‹ค ์ฝœ๋ฐฑ, ํ”„๋กœ๋ฏธ์Šค, ๋ฏธ๋“ค์›จ์–ด ๋“ฑ ์„œ๋กœ ๋‹ค๋ฅธ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์—ฌ ์ผ๊ด€์„ฑ์ด ๋–จ์–ด์ง€๊ณ  ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ค์›Œ์ง€๋Š” ํ•œ๊ณ„๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3, 5]. + +* **๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ ์ตœ์ ํ™” ๋„๊ตฌ:** + ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด TanStack Query(React Query)์™€ RTK Query ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์‚ฌ์‹ค์ƒ์˜ ํ‘œ์ค€์œผ๋กœ ์ž๋ฆฌ ์žก์•˜์Šต๋‹ˆ๋‹ค [1]. + * **TanStack Query:** ๊ฐ•๋ ฅํ•œ ์บ์‹ฑ ๋ ˆ์ด์–ด๋ฅผ ์ œ๊ณตํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ๋„คํŠธ์›Œํฌ ์ค‘๋ณต ์š”์ฒญ์„ ์ค„์ด๊ณ  ๋ฐ์ดํ„ฐ์˜ ์ตœ์‹  ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๋ฌดํ•œ ์Šคํฌ๋กค(infinite scrolling)์ด๋‚˜ ๋‚™๊ด€์  ์—…๋ฐ์ดํŠธ(optimistic updates)์™€ ๊ฐ™์€ ๋ณต์žกํ•œ ๋น„๋™๊ธฐ ๊ธฐ๋Šฅ์„ ๋‹จ์ˆœํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2]. + * **RTK Query:** Redux ์ƒํƒœ๊ณ„์—์„œ ๋น„๋™๊ธฐ ์ž‘์—…์ด ๋งŽ์€ ์•ฑ์„ ์œ„ํ•ด ์บ์‹ฑ, ์ค‘๋ณต ์ œ๊ฑฐ, ์ž๋™ ๋ฐ์ดํ„ฐ ์žฌ์š”์ฒญ(refetching), ์บ์‹œ ๋ฌดํšจํ™” ๊ธฐ๋Šฅ์„ ๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณตํ•˜์—ฌ ๋น„๋™๊ธฐ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ๋ฅผ ์‚ฌ์‹ค์ƒ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค [3, 4]. + +* **๊ตฌ์กฐ์  ๋ถ„๋ฆฌ์™€ ์•„ํ‚คํ…์ฒ˜:** + API ๊ณ„์ธต์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋…๋ฆฝ์ ์ธ ๊ฒฝ๊ณ„๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ, ์š”์ฒญ ์„ ์–ธ๋ถ€์™€ ์ปค์Šคํ…€ ํ›…(Custom Hooks)์€ ํŠน์ • ๊ธฐ๋Šฅ(feature) ํด๋” ๋‚ด์— ํ•จ๊ป˜ ๋ฐฐ์น˜(colocate)๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋„คํŠธ์›Œํฌ ๊ด€๋ จ ๋น„๋™๊ธฐ ๋กœ์ง์„ UI ์ปดํฌ๋„ŒํŠธ์™€ ์™„๋ฒฝํžˆ ๋””์ปคํ”Œ๋ง(decoupling)ํ•˜์—ฌ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค [2]. + +* **์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ฐ ์•ˆ์ •์„ฑ:** + * **๋””๋ฐ”์šด์‹ฑ๊ณผ ์“ฐ๋กœํ‹€๋ง:** ์‚ฌ์šฉ์ž ์ž…๋ ฅ(์˜ˆ: ๊ฒ€์ƒ‰)์— ์˜ํ•ด ํŠธ๋ฆฌ๊ฑฐ๋˜๋Š” ๊ฐ’๋น„์‹ผ ๋น„๋™๊ธฐ API ํ˜ธ์ถœ์€ ๋””๋ฐ”์šด์‹ฑ(debouncing)์ด๋‚˜ ์“ฐ๋กœํ‹€๋ง(throttling)์„ ํ†ตํ•ด ํšŸ์ˆ˜๋ฅผ ์ œํ•œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ณผ๋„ํ•œ API ํ˜ธ์ถœ์„ ๋ฐฉ์ง€ํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ณ  ์„œ๋ฒ„ ๋ถ€ํ•˜๋ฅผ ์ค„์—ฌ์ค๋‹ˆ๋‹ค [6, 7]. + * **๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฐฉ์ง€:** ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋‚˜ ๊ตฌ๋…(subscriptions) ๋“ฑ ์ •๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๋น„๋™๊ธฐ ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ์˜ ๊ฒฝ์šฐ, ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ธ๋งˆ์šดํŠธ๋  ๋•Œ ๋ฆฌ์†Œ์Šค๋ฅผ ํ•ด์ œํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜(memory leaks)๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด ๋ฐ˜๋“œ์‹œ `useEffect`์—์„œ ํด๋ฆฐ์—…(cleanup) ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [8, 9]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts +- [[TanStack Query ๋ฐ RTK Query]] + - ์—ฐ๊ฒฐ ์ด์œ : ์„œ๋ฒ„ ์ƒํƒœ(API ๋ฐ์ดํ„ฐ) ๊ด€๋ฆฌ์— ์žˆ์–ด ์บ์‹ฑ, ์ค‘๋ณต ์š”์ฒญ ์ œ๊ฑฐ, ์ž๋™ ์žฌ์š”์ฒญ ๋“ฑ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ํ˜„๋Œ€์ ์ธ ํ•„์ˆ˜ ํ‘œ์ค€ ๋„๊ตฌ๋กœ ์†Œ์Šค์—์„œ ๊ฐ•์กฐ๋˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [1, 2, 4]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ๊ฐ์†Œ ์›๋ฆฌ์™€ ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™” ๋ฉ”์ปค๋‹ˆ์ฆ˜. + +- [[์„œ๋ฒ„ ์ƒํƒœ (Server State)]] + - ์—ฐ๊ฒฐ ์ด์œ : API๋กœ๋ถ€ํ„ฐ ํŒจ์น˜(fetch)๋˜๋Š” ๋ฐ์ดํ„ฐ๋Š” ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ์™€ ์„ฑ๊ฒฉ์ด ์™„์ „ํžˆ ๋‹ฌ๋ผ ๋ณ„๋„์˜ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ๋น„๋™๊ธฐ ๊ด€๋ฆฌ์˜ ํ•ต์‹ฌ ์ „์ œ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [1]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์บ์‹ฑ ๋กœ๋”ฉ, ์—๋Ÿฌ ์‚ฌ์ดํด, ์„œ๋ฒ„ ๋ฐ์ดํ„ฐ ์ตœ์‹ ํ™” ๊ธฐ๋ฒ•. + +- [[๋””๋ฐ”์šด์‹ฑ(Debouncing) ๋ฐ ์“ฐ๋กœํ‹€๋ง(Throttling)]] + - ์—ฐ๊ฒฐ ์ด์œ : ์žฆ์€ ์‚ฌ์šฉ์ž ์ด๋ฒคํŠธ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ๋ฌด๋ถ„๋ณ„ํ•œ ๋น„๋™๊ธฐ API ํ˜ธ์ถœ์„ ์ œ์–ดํ•˜์—ฌ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ์ „๋žต์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [6, 7]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํ”„๋ก ํŠธ์—”๋“œ์—์„œ์˜ ๋„คํŠธ์›Œํฌ ์ตœ์ ํ™” ๋ฐ ๋Ÿฐํƒ€์ž„ ๋ณ‘๋ชฉ ํ˜„์ƒ ๋ฐฉ์ง€. + +- [[ํด๋ฆฐ์—… (Cleanup) ํ•จ์ˆ˜์™€ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋น„๋™๊ธฐ ์ž‘์—… ์™„๋ฃŒ ์ „ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ธ๋งˆ์šดํŠธ๋˜์—ˆ์„ ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์ž์› ๋‚ญ๋น„์™€ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋ง‰๋Š” ํ•„์ˆ˜ ๊ทœ์น™์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [8, 9]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: React ์ƒ๋ช…์ฃผ๊ธฐ(Lifecycle)์™€ ๊ฒฐํ•ฉ๋œ ์•ˆ์ „ํ•œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•. + +### Deeper Research Questions +- Zustand์™€ ๊ฐ™์€ ๊ฐ€๋ฒผ์šด ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋Œ€๊ทœ๋ชจ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜์  ํ•œ๊ณ„์™€ ํŒŒํŽธํ™” ๋ฌธ์ œ๋Š” ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ๋‚˜ํƒ€๋‚˜๋Š”๊ฐ€? [3, 5] +- RTK Query๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์บ์‹œ ๋ฌดํšจํ™”(cache invalidation) ๋ฐ ์ž๋™ ๋ฐ์ดํ„ฐ ์žฌ์š”์ฒญ ๊ธฐ๋Šฅ์˜ ๋‚ด๋ถ€ ์ž‘๋™ ๋ฐฉ์‹์€ ๋ฌด์—‡์ธ๊ฐ€? [4] +- TanStack Query๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฌดํ•œ ์Šคํฌ๋กค ๋ฐ ๋‚™๊ด€์  ์—…๋ฐ์ดํŠธ๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ, ์บ์‹œ ๋ ˆ์ด์–ด๋Š” ์–ด๋–ป๊ฒŒ ๋ฌด๊ฒฐ์„ฑ์„ ๋ณด์žฅํ•˜๋Š”๊ฐ€? [2] +- Feature-Sliced Design ๊ฐ™์€ ๋ชจ๋“ˆํ™”๋œ ํด๋” ๊ตฌ์กฐ์—์„œ API ์„ ์–ธ๊ณผ ๋น„๋™๊ธฐ ์ปค์Šคํ…€ ํ›…์€ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์บก์Аํ™”๋˜๊ณ  ํ˜ธ์ถœ๋˜๋Š”๊ฐ€? [2] +- `useEffect` ๋‚ด์˜ ๋น„๋™๊ธฐ ํ˜ธ์ถœ ์‹œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ์žก๊ธฐ ์œ„ํ•œ DevTools Heap Snapshot ๋ถ„์„ ๋ฐฉ๋ฒ•์€ ์–ด๋–ป๊ฒŒ ์ ์šฉ๋˜๋Š”๊ฐ€? [9] + +### Practical Application Contexts +- **Implementation:** UI ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ ๋น„๋™๊ธฐ ๋กœ์ง์„ ์ง์ ‘ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๊ณ , API ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋„คํŠธ์›Œํฌ ๋กœ์ง์„ ์ปค์Šคํ…€ ํ›…์œผ๋กœ ์ถ”์ถœํ•˜์—ฌ `features/` ํด๋” ํ•˜์œ„์— ๊ฒฉ๋ฆฌํ•˜์—ฌ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค [2, 10]. ๋˜ํ•œ `useEffect`๋ฅผ ํ†ตํ•œ ๊ตฌ๋… ์‹œ ํด๋ฆฐ์—… ํ•จ์ˆ˜๋ฅผ ๋ฐ˜๋“œ์‹œ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค [8]. +- **System Design:** ํ”„๋กœ์ ํŠธ ์„ค๊ณ„ ์‹œ ํด๋ผ์ด์–ธํŠธ ์ „์—ญ ์ƒํƒœ(์˜ˆ: UI ํ…Œ๋งˆ, ์–ธ์–ด)์™€ ์„œ๋ฒ„์—์„œ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋น„๋™๊ธฐ ์ƒํƒœ(์˜ˆ: ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ, ์•Œ๋ฆผ)๋ฅผ ์™„์ „ํžˆ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ฐ๊ธฐ ๋‹ค๋ฅธ ๋„๊ตฌ(Zustand + TanStack Query)๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค [1, 11]. +- **Operation / Maintenance:** Redux DevTools์™€ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ ์•ก์…˜์ด ์–ธ์ œ ํ˜ธ์ถœ๋˜์—ˆ๊ณ  ์„œ๋ฒ„ ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋–ป๊ฒŒ ์—…๋ฐ์ดํŠธ๋˜์—ˆ๋Š”์ง€ ํƒ€์ž„ํŠธ๋ž˜๋ธ” ๋””๋ฒ„๊น…(Time-travel debugging)์„ ์ง„ํ–‰ํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ์‹ ์†ํžˆ ํŒŒ์•…ํ•ฉ๋‹ˆ๋‹ค [12, 13]. +- **Learning Path:** ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„์˜ `useState`/`useEffect`๋ฅผ ํ†ตํ•œ ๋ฐ์ดํ„ฐ ํŒจ์นญ์˜ ํ•œ๊ณ„ ํ•™์Šต โ†’ ๋””๋ฐ”์šด์‹ฑ/๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฐฉ์ง€ ์›๋ฆฌ ์ดํ•ด โ†’ ์„œ๋ฒ„ ์ƒํƒœ์™€ ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ์˜ ์ฐจ์ด ์ธ์ง€ โ†’ TanStack Query/RTK Query๋ฅผ ํ†ตํ•œ ์ „๋ฌธ์ ์ธ ๋น„๋™๊ธฐ ์ƒํƒœ ๊ด€๋ฆฌ ๋งˆ์Šคํ„ฐ๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค [1, 3, 7, 8]. +- **My Project Relevance:** ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ, ๋ฐฉ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ์˜ ๋ฌดํ•œ ์Šคํฌ๋กค, ์‚ฌ์šฉ์ž ๊ฒ€์ƒ‰ ์‹œ์˜ ์ž๋™์™„์„ฑ(๋””๋ฐ”์šด์Šค ์ ์šฉ) ๊ธฐ๋Šฅ ๋“ฑ ๋ณต์žกํ•œ API ๊ธฐ๋ฐ˜ ๊ธฐ๋Šฅ์ด ์žˆ๋Š” ํ”„๋กœ์ ํŠธ์˜ ์„ฑ๋Šฅ ๋ฐ ์•„ํ‚คํ…์ฒ˜ ๊ฐœ์„ ์— ์ง์ ‘ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค [2, 6, 7]. + +### Adjacent Topics +- [[์ƒํƒœ ๊ด€๋ฆฌ ์•„ํ‚คํ…์ฒ˜ (State Management Architecture)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ(์„œ๋ฒ„ ์ƒํƒœ)์™€ ๋กœ์ปฌ ์ƒํƒœ, ์ „์—ญ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒํƒœ๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์—์„œ ์–ด๋–ป๊ฒŒ ์ƒํ˜ธ์ž‘์šฉํ•˜๊ณ  ์กฐํ™”๋กญ๊ฒŒ ๊ตฌ์„ฑ๋˜๋Š”์ง€ ํ™•์žฅํ•ด์„œ ์•Œ์•„๋ด…๋‹ˆ๋‹ค [1, 14]. +- [[์„ฑ๋Šฅ ํ”„๋กœํŒŒ์ผ๋ง ๋ฐ ๋ Œ๋”๋ง ์ตœ์ ํ™” (Performance Profiling & Rendering Optimization)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ์ž˜๋ชป๋œ ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง ํญํ’(re-render storm)์ด๋‚˜ ๋ณ‘๋ชฉ์„ ์ผ์œผํ‚ค๋Š”์ง€ ํŒŒ์•…ํ•˜๊ณ , React Profiler๋ฅผ ํ†ตํ•ด ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ํƒ์ง€ํ•˜๋Š”์ง€ ์•Œ์•„๋ด…๋‹ˆ๋‹ค [15-17]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Development/ํ”„๋ก ํŠธ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ Œ๋”๋ง ๋ณ‘๋ชฉ ๊ฐœ์„ .md b/10_Wiki/Development/ํ”„๋ก ํŠธ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ Œ๋”๋ง ๋ณ‘๋ชฉ ๊ฐœ์„ .md new file mode 100644 index 00000000..600727cc --- /dev/null +++ b/10_Wiki/Development/ํ”„๋ก ํŠธ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ Œ๋”๋ง ๋ณ‘๋ชฉ ๊ฐœ์„ .md @@ -0,0 +1,70 @@ +# [[ํ”„๋ก ํŠธ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ Œ๋”๋ง ๋ณ‘๋ชฉ ๊ฐœ์„ ]] + +## ๐Ÿ“Œ Brief Summary +ํ”„๋ก ํŠธ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ Œ๋”๋ง ๋ณ‘๋ชฉ์€ ๋ถˆํ•„์š”ํ•˜๊ฑฐ๋‚˜ ๊ณผ๋„ํ•œ ์ปดํฌ๋„ŒํŠธ ๋ฆฌ๋ Œ๋”๋ง์œผ๋กœ ์ธํ•ด UI ๋ฐ˜์‘์„ฑ์ด ๋–จ์–ด์ง€๊ณ  ์ƒํ˜ธ์ž‘์šฉ ์†๋„๊ฐ€ ์ง€์—ฐ๋˜๋Š” ํ˜„์ƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค [1, 2]. ์ด๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ Œ๋”๋ง ํŠธ๋ฆฌ๊ฑฐ(์ƒํƒœ, Props, Context ๋“ฑ)๋ฅผ ์‹๋ณ„ํ•˜๊ณ  ๋ฉ”๋ชจ์ด์ œ์ด์…˜, ๋ฆฌ์ŠคํŠธ ๊ฐ€์ƒํ™”, ์ƒํƒœ ๋ถ„๋ฆฌ, ๋™์‹œ์„ฑ ๋ Œ๋”๋ง(Concurrent Rendering) ๊ธฐ๋Šฅ ๋“ฑ์„ ํ™œ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [3, 4]. ์ง€์†์ ์ธ ํ”„๋กœํŒŒ์ผ๋ง์„ ํ†ตํ•ด ๋ Œ๋”๋ง ๋น„์šฉ์ด ๋†’์€ ๋ถ€๋ถ„์„ ์ธก์ •ํ•˜๊ณ  ์ „๋žต์ ์œผ๋กœ ์ตœ์ ํ™”๋ฅผ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค [5, 6]. + +## ๐Ÿ“– Core Content +* **๋ Œ๋”๋ง ๋ฐœ์ƒ ์›์ธ ํŒŒ์•… ๋ฐ ํ”„๋กœํŒŒ์ผ๋ง** + React ์ปดํฌ๋„ŒํŠธ๋Š” ์ƒํƒœ(State), Props, Context์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๊ฑฐ๋‚˜ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง๋  ๋•Œ ๋ฆฌ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค [4]. ์ด๋Ÿฌํ•œ ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํŠธ๋ฆฌ๊ฐ€ ๊นŠ์„ ๊ฒฝ์šฐ ์Šคํฌ๋ฆฝํŒ… ์‹œ๊ฐ„์„ 30~60% ์ฆ๊ฐ€์‹œ์ผœ ์„ฑ๋Šฅ์„ ์ €ํ•˜์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2]. ๋”ฐ๋ผ์„œ React DevTools Profiler๋‚˜ `why-did-you-render` ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ด ๋ Œ๋”๋ง ๋นˆ๋„์™€ ๋น„์šฉ์„ ์ธก์ •ํ•œ ๋’ค ์ตœ์ ํ™”๋ฅผ ์ง„ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [5, 7, 8]. +* **๋ฉ”๋ชจ์ด์ œ์ด์…˜(Memoization)๊ณผ ์ฐธ์กฐ ์•ˆ์ •์„ฑ** + `React.memo()`, `useCallback`, `useMemo`๋ฅผ ์ ์ ˆํžˆ ํ™œ์šฉํ•˜๋ฉด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์€ ์ปดํฌ๋„ŒํŠธ์˜ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ง‰์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [9, 10]. ๋‹จ, JSX ๋‚ด๋ถ€์— ์ต๋ช… ํ•จ์ˆ˜๋‚˜ ์ธ๋ผ์ธ ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์ •์˜ํ•˜์—ฌ Props๋กœ ๋„˜๊ธฐ๋ฉด ์–•์€ ๋น„๊ต(Shallow comparison) ํŠน์„ฑ์ƒ ๋งค ๋ Œ๋”๋ง๋งˆ๋‹ค ์ƒˆ๋กœ์šด ์ฐธ์กฐ๊ฐ€ ์ƒ์„ฑ๋˜์–ด ๋ฉ”๋ชจ์ด์ œ์ด์…˜์ด ๋ฌด๋ ฅํ™”๋˜๋ฏ€๋กœ ์ฐธ์กฐ๋ฅผ ์•ˆ์ •ํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [10-12]. +* **React Compiler๋ฅผ ํ†ตํ•œ ์ž๋™ํ™”** + 2025๋…„ ๊ธฐ์ค€ React Compiler๋Š” ๋นŒ๋“œ ํƒ€์ž„์— ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ •์ ์œผ๋กœ ๋ถ„์„ํ•˜์—ฌ JSX ์š”์†Œ ๋‹จ์œ„๊นŒ์ง€ ์„ธ๋ฐ€ํ•˜๊ฒŒ ์ž๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค [13, 14]. ์ด๋ฅผ ํ†ตํ•ด ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์˜ ๋ฒˆ๊ฑฐ๋กœ์›€์„ ์ค„์ด๊ณ  ๋ Œ๋”๋ง ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [15]. +* **Context API ์ตœ์ ํ™”์™€ ๊ธ€๋กœ๋ฒŒ ์ƒํƒœ ๋ถ„๋ฆฌ** + Context API๋Š” ๊ฐ’์ด ๋ณ€ํ•  ๋•Œ ํ•ด๋‹น ์ปจํ…์ŠคํŠธ๋ฅผ ๊ตฌ๋…ํ•˜๋Š” ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” "๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ์‹œ์Šคํ…œ"์œผ๋กœ ์ž‘๋™ํ•˜์—ฌ ํฐ ๋ณ‘๋ชฉ์„ ์œ ๋ฐœํ•ฉ๋‹ˆ๋‹ค [16, 17]. ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ปจํ…์ŠคํŠธ๋ฅผ ์ž‘์€ ๋„๋ฉ”์ธ ๋‹จ์œ„๋กœ ์ชผ๊ฐœ๊ฑฐ๋‚˜, Zustand ๋“ฑ ํŠน์ • ์ƒํƒœ ์Šฌ๋ผ์ด์Šค(Slice)๋งŒ ์„ ํƒ์ ์œผ๋กœ ๊ตฌ๋…(Selector)ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋ฒผ์šด ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฆฌ๋ Œ๋”๋ง์„ ์ œ์–ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [16, 18-20]. +* **๋™์‹œ์„ฑ ๊ธฐ๋Šฅ(Concurrent Features)์˜ ํ™œ์šฉ** + `useTransition`์„ ์‚ฌ์šฉํ•ด ์ค‘์š”ํ•˜์ง€ ์•Š์€ ์—…๋ฐ์ดํŠธ๋ฅผ ์ง€์—ฐ์‹œํ‚ด์œผ๋กœ์จ ํƒ€์ดํ•‘๊ณผ ๊ฐ™์€ ์ฆ‰๊ฐ์ ์ธ ์ƒํ˜ธ์ž‘์šฉ์ด ์ฐจ๋‹จ๋˜์ง€ ์•Š๊ฒŒ ํ•˜๊ณ , `useDeferredValue`๋กœ ๋ฌด๊ฑฐ์šด ํŒŒ์ƒ ๋ฐ์ดํ„ฐ์˜ ๋ Œ๋”๋ง์„ ๋ฏธ๋ฃจ์–ด UI์˜ ๋ฐ˜์‘์„ฑ์„ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [21-23]. +* **๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ ๊ฐ€์ƒํ™”(Virtualization) ๋ฐ ๋ฆฌ์ŠคํŠธ ์ตœ์ ํ™”** + 50~100๊ฐœ ์ด์ƒ์˜ ํ•ญ๋ชฉ์ด ์žˆ๋Š” ๊ธด ๋ชฉ๋ก์€ ๋‹ค์ˆ˜์˜ DOM ๋…ธ๋“œ ๋ Œ๋”๋ง์„ ์œ ๋ฐœํ•˜์—ฌ ๋ณ‘๋ชฉ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค [24, 25]. `react-window` ๋“ฑ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ™œ์šฉํ•ด ๋ทฐํฌํŠธ์— ๋ณด์ด๋Š” ํ•ญ๋ชฉ๋งŒ ๋ Œ๋”๋งํ•˜๋Š” ์œˆ๋„์œ™(Windowing) ๊ธฐ๋ฒ•์„ ์ ์šฉํ•˜๊ณ , ์•ˆ์ •์ ์ด๊ณ  ๊ณ ์œ ํ•œ `key`๋ฅผ ๋ถ€์—ฌํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ DOM ์žฌ์ƒ์„ฑ์„ ๋ง‰์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค [25-27]. + +## โš–๏ธ Trade-offs & Caveats +* **๋ฉ”๋ชจ์ด์ œ์ด์…˜ ์˜ค๋ฒ„ํ—ค๋“œ:** `React.memo()`, `useCallback`, `useMemo`๋Š” ๋‚จ์šฉ๋  ๊ฒฝ์šฐ ์„ฑ๋Šฅ์„ ์˜คํžˆ๋ ค ์•…ํ™”์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [28, 29]. ์ด์ „ Props์™€ ์ƒˆ Props๋ฅผ ๋น„๊ตํ•˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๋Š” ๊ณผ์ •์— ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋ Œ๋”๋ง ๋น„์šฉ์ด ์ €๋ ดํ•œ ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” ๋ Œ๋”๋ง ์ž์ฒด๋ณด๋‹ค ๋น„๊ต ์—ฐ์‚ฐ์˜ ๋น„์šฉ์ด ๋” ํด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [29]. +* **React Compiler์˜ ์ œ์•ฝ ์‚ฌํ•ญ:** React Compiler๋Š” ์ž๋™ ์ตœ์ ํ™”๋ฅผ ์ œ๊ณตํ•˜์ง€๋งŒ, 'Rules of React'๋ฅผ ์—„๊ฒฉํžˆ ์ค€์ˆ˜ํ•ด์•ผ ์ •์ƒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค [30, 31]. ๋˜ํ•œ ๋งค ๋ Œ๋”๋ง๋งˆ๋‹ค ์ƒˆ๋กœ์šด ์ฐธ์กฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ผ๋ถ€ ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ›…(์˜ˆ: TanStack Query์˜ `useMutation` ๋“ฑ)๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ์ฒด์ธ์ด ๋Š์–ด์ง€๋Š” ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [32, 33]. +* **Context API vs ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋„์ž…:** Context API๋Š” ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ถ”๊ฐ€ ์—†์ด ํ…Œ๋งˆ, ๋‹ค๊ตญ์–ด ๋“ฑ ์ •์  ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ์— ์šฉ์ดํ•˜์ง€๋งŒ [34], ์žฆ์€ ์ƒํƒœ ๋ณ€๊ฒฝ์—๋Š” ์„ฑ๋Šฅ ์ทจ์•ฝ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค [35]. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์™ธ๋ถ€ ์ƒํƒœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(Zustand ๋“ฑ)๋ฅผ ๋ฌด์กฐ๊ฑด ๋„์ž…ํ•˜๋ฉด ์ถ”๊ฐ€์ ์ธ ๋ฒˆ๋“ค ์šฉ๋Ÿ‰ ์ฆ๊ฐ€ ๋ฐ ํŒ€์˜ ํ•™์Šต ๊ณก์„ ์ด ์ˆ˜๋ฐ˜๋œ๋‹ค๋Š” ๋ฐ˜๋Œ€ ๊ธ‰๋ถ€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค [36, 37]. +* **์ต๋ช… ํ•จ์ˆ˜ ์ œ๊ฑฐ์— ๋”ฐ๋ฅธ ์ฝ”๋“œ ๋ณต์žก๋„ ์ฆ๊ฐ€:** ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ง‰๊ณ ์ž ๋ชจ๋“  ์ธ๋ผ์ธ ํ•จ์ˆ˜๋ฅผ ์™ธ๋ถ€๋กœ ๋นผ๊ฑฐ๋‚˜ `useCallback`์œผ๋กœ ๊ฐ์‹ธ๋ฉด ์ฝ”๋“œ๊ฐ€ ๊ธธ์–ด์ง€๊ณ  ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [38]. ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ž‘๊ณ  ์„ฑ๋Šฅ ์˜ํ–ฅ์ด ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” ์ต๋ช… ํ•จ์ˆ˜ ์‚ฌ์šฉ์ด ์‹ค์šฉ์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [38]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] +- [[Context API]] + - ์—ฐ๊ฒฐ ์ด์œ : ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ ๊นŠ์€ ๊ณณ๊นŒ์ง€ ์ƒํƒœ๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์œผ๋‚˜ ๊ตฌ๋… ์ค‘์ธ ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฆฌ๋ Œ๋”๋ง์‹œํ‚ค๋Š” ํŠน์„ฑ์ƒ ๋ Œ๋”๋ง ๋ณ‘๋ชฉ์˜ ์ฃผ์š” ์›์ธ์ด ๋ฉ๋‹ˆ๋‹ค [17]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ๊ธฐ๋ฐ˜ ์ƒํƒœ ๊ด€๋ฆฌ์˜ ํ•œ๊ณ„์™€ ๋ฆฌ๋ Œ๋”๋ง ๋ฐœ์ƒ ๋ฒ”์œ„๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[Concurrent Rendering]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋ Œ๋”๋ง ์ž‘์—…์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋ถ€์—ฌํ•˜๊ณ  ์ค‘๋‹จ/์žฌ๊ฐœํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ์ˆ ๋กœ, `useTransition` ๋“ฑ์„ ํ†ตํ•ด ๋ฌด๊ฑฐ์šด ๋ Œ๋”๋ง์ด ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋ฅผ ๋ง‰๋Š” ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค [21]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ฐ˜์‘์„ฑ ์ง€ํ‘œ(INP ๋“ฑ)๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•œ ๋ Œ๋”๋ง ์Šค์ผ€์ค„๋ง ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[React Compiler]] + - ์—ฐ๊ฒฐ ์ด์œ : ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์˜ ํ•œ๊ณ„๋ฅผ ๊ทน๋ณตํ•˜๊ณ  ๋นŒ๋“œ ํƒ€์ž„์— ์ž๋™์œผ๋กœ JSX ์š”์†Œ ๋‹จ์œ„์˜ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์ ์šฉํ•˜์—ฌ ๋ Œ๋”๋ง ์ตœ์ ํ™”๋ฅผ ๋‹ฌ์„ฑํ•ฉ๋‹ˆ๋‹ค [13, 14]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ตœ์‹  React์˜ ๋ Œ๋”๋ง ์ตœ์ ํ™”๊ฐ€ ๋Ÿฐํƒ€์ž„ ์ œ์–ด์—์„œ ์ปดํŒŒ์ผ๋Ÿฌ ๊ธฐ๋ฐ˜ ์ •์  ๋ถ„์„์œผ๋กœ ๋„˜์–ด๊ฐ€๋Š” ๊ธฐ์ˆ ์  ์ง„ํ™”๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +#### [๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ] +- [[Zustand]] + - ์—ฐ๊ฒฐ ์ด์œ : ์…€๋ ‰ํ„ฐ(Selector) ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•ด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ž์‹ ์ด ํ•„์š”ํ•œ ์ƒํƒœ ์กฐ๊ฐ(Slice)์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งŒ ๋ฆฌ๋ Œ๋”๋ง๋˜๋„๋ก ๋ณด์žฅํ•˜์—ฌ ๋ณ‘๋ชฉ์„ ์ค„์ด๋Š” ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค [18]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ „์—ญ ์ƒํƒœ์˜ ํŒŒํŽธํ™” ๊ด€๋ฆฌ์™€ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ์ฐจ๋‹จํ•˜๋Š” ๊ตฌ๋… ์ตœ์ ํ™” ํŒจํ„ด์„ ํ•™์Šตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[List Virtualization (Windowing)]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋Œ€๊ทœ๋ชจ ๋ฆฌ์ŠคํŠธ์—์„œ ์‚ฌ์šฉ์ž์˜ ํ™”๋ฉด ๋ทฐํฌํŠธ์— ์กด์žฌํ•˜๋Š” DOM ๋…ธ๋“œ๋งŒ ์ œํ•œ์ ์œผ๋กœ ๋ Œ๋”๋งํ•˜์—ฌ DOM ํŠธ๋ฆฌ ๋น„๋Œ€ํ™”๋ฅผ ๋ง‰์Šต๋‹ˆ๋‹ค [25, 26]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋‹ค์ˆ˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ Œ๋”๋งํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ฐ ๋ ˆ์ด์•„์›ƒ ํŽ˜์ธํŒ… ๋ณ‘๋ชฉ์„ ์ œ์–ดํ•˜๋Š” ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### Deeper Research Questions +- React Compiler๋Š” ๋นŒ๋“œ ํƒ€์ž„์— ๋ช…์‹œ์ ์ธ ์˜์กด์„ฑ ๋ฐฐ์—ด ์—†์ด ์–ด๋–ป๊ฒŒ ๋‚ด๋ถ€ JSX ๋…ธ๋“œ๋ณ„ ์บ์‹ฑ ๋ฐ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๋‹จ์œ„๋ฅผ ๊ฒฐ์ •ํ•˜๋Š”๊ฐ€? +- Context API์˜ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ๋ฆฌ๋ Œ๋”๋ง ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” `use-context-selector`์˜ ์›๋ฆฌ๋Š” ๋ฌด์—‡์ด๋ฉฐ, Zustand์˜ ๊ตฌ๋… ์ตœ์ ํ™” ๋ฐฉ์‹๊ณผ ๊ตฌ์กฐ์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ๊ฐ€? +- `useTransition`๊ณผ `useDeferredValue`๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ์‚ฌ์šฉํ•  ๋•Œ, ๋ธŒ๋ผ์šฐ์ €์˜ ํŽ˜์ธํŠธ ์ฃผ๊ธฐ(Paint Cycle) ๊ด€์ ์—์„œ ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง์€ ์–ด๋–ป๊ฒŒ ์Šค์ผ€์ค„๋ง ๋ฐ ์ง€์—ฐ๋˜๋Š”๊ฐ€? +- ๋Œ€ํ˜• ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ List Virtualization๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ์Šคํฌ๋กค ์ด๋ฒคํŠธ ๋””๋ฐ”์šด์‹ฑ(Debouncing) ํ˜น์€ ์“ฐ๋กœํ‹€๋ง(Throttling) ์ตœ์ ํ™”์˜ ๊ธฐ์ˆ ์  ํ•œ๊ณ„์ ์€ ๋ฌด์—‡์ธ๊ฐ€? +- ์ƒํƒœ ๊ด€๋ฆฌ ์•„ํ‚คํ…์ฒ˜ ๊ด€์ ์—์„œ, Feature-Sliced Design(FSD)๊ณผ ๊ฐ™์ด ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ํด๋” ๋ฐ ๊ตฌ์กฐ์  ์„ค๊ณ„๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฆฌ๋ Œ๋”๋ง ๋ฒ”์œ„๋ฅผ ์ œํ•œํ•˜๋Š” ๋ฐ ์–ด๋–ป๊ฒŒ ๊ธฐ์—ฌํ•˜๋Š”๊ฐ€? + +### Practical Application Contexts +- **Implementation:** Props๋กœ ์ „๋‹ฌํ•˜๋Š” ํ•จ์ˆ˜๋‚˜ ๊ฐ์ฒด๋Š” ์ต๋ช… ์ƒ์„ฑ(์ธ๋ผ์ธ)์„ ์ง€์–‘ํ•˜๊ณ  `useCallback`์ด๋‚˜ ์™ธ๋ถ€ ์„ ์–ธ์œผ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ์ฐธ์กฐ ๋ฌด๊ฒฐ์„ฑ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜๋ฐฑ ๊ฐœ ์ด์ƒ์˜ ํ•ญ๋ชฉ์„ ๋ Œ๋”๋งํ•  ๊ฒฝ์šฐ `react-window`์™€ ๊ฐ™์€ ๊ฐ€์ƒํ™” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์˜๋ฌด์ ์œผ๋กœ ๋„์ž…ํ•ฉ๋‹ˆ๋‹ค. +- **System Design:** ๋นˆ๋ฒˆํžˆ ์—…๋ฐ์ดํŠธ๋˜๋Š” ์ƒํƒœ(์˜ˆ: ์•Œ๋ฆผ ๊ฐœ์ˆ˜, ์žฅ๋ฐ”๊ตฌ๋‹ˆ)๋Š” Context API ๋Œ€์‹  Zustand ๋“ฑ์˜ ์„ ํƒ์  ๊ตฌ๋…์ด ๊ฐ€๋Šฅํ•œ ์Šคํ† ์–ด์— ๋ฐฐ์น˜ํ•˜๊ณ , ์ •์  ๋ฐ์ดํ„ฐ(ํ…Œ๋งˆ ๋“ฑ)๋Š” Context๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ Œ๋”๋ง ์ „ํŒŒ ๋ฒ”์œ„๋ฅผ ์‹œ์Šคํ…œ ๋ ˆ๋ฒจ์—์„œ ๊ฒฉ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. +- **Operation / Maintenance:** `why-did-you-render` ํŒจํ‚ค์ง€์™€ React DevTools์˜ Profiler ํŒจ๋„์„ ์ด์šฉํ•ด ๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ฐ˜๋ณต ๋ Œ๋”๋ง๋˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ฐพ์•„๋‚ด๊ณ , ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋Š” Core Web Vitals(INP, FCP ๋“ฑ)๋ฅผ ์ถ”์ ํ•˜์—ฌ ์ƒํ˜ธ์ž‘์šฉ ์ง€์—ฐ์ด ์žˆ๋Š”์ง€ ๋ชจ๋‹ˆํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค. +- **Learning Path:** React์˜ ๋ Œ๋”๋ง ์กฐ๊ฑด(State, Props, Parent) ์ดํ•ด -> ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๋„๊ตฌ ์ˆ™๋‹ฌ -> Context API์˜ ์„ฑ๋Šฅ ํ•œ๊ณ„ ์ฒด๊ฐ ๋ฐ Zustand ํ™œ์šฉ -> Concurrent Features ์ ์šฉ -> React Compiler๋ฅผ ์ด์šฉํ•œ ์ž๋™ํ™” ํ๋ฆ„์œผ๋กœ ๋ Œ๋”๋ง ์ตœ์ ํ™” ์ง€์‹์„ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค. +- **My Project Relevance:** ํ˜„์žฌ ์œ ์ง€ ๋ณด์ˆ˜ํ•˜๊ฑฐ๋‚˜ ์‹ ๊ทœ ๊ตฌ์ถ•ํ•˜๋Š” React ์›น ์•ฑ์—์„œ ์Šคํฌ๋กค ๋Š๊น€์ด๋‚˜ ํด๋ฆญ ์‹œ ๋ฐ˜์‘ ์ง€์—ฐ์ด ๋ฐœ์ƒํ•  ๋•Œ, ํ•ด๋‹น ๊ฐœ๋…์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ณ‘๋ชฉ์ด ๋˜๋Š” ์ปดํฌ๋„ŒํŠธ์˜ ๋ Œ๋”๋ง ํšŸ์ˆ˜๋ฅผ ์ธก์ •ํ•˜๊ณ  ์ ์ ˆํ•œ ์ตœ์ ํ™” ๋„๊ตฌ๋ฅผ ์ฆ‰๊ฐ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### Adjacent Topics +- [[Server Components (Next.js)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋ธŒ๋ผ์šฐ์ €์—์„œ์˜ ๋ Œ๋”๋ง ๋ถ€ํ•˜๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด ํด๋ผ์ด์–ธํŠธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค์„ ์ตœ์†Œํ™”ํ•˜๊ณ  ์„œ๋ฒ„์—์„œ ์ •์  UI๋ฅผ ๋ Œ๋”๋งํ•˜์—ฌ ๋„˜๊ฒจ์ฃผ๋Š” ์•„ํ‚คํ…์ฒ˜์  ์ตœ์ ํ™”์— ๋Œ€ํ•ด ์‹ฌ๋„ ์žˆ๊ฒŒ ์กฐ์‚ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [39-41]. +- [[JavaScript Memory Leaks]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๊ณผ๋„ํ•œ ๋ Œ๋”๋ง ์™ธ์—๋„ ํด๋กœ์ €๋‚˜ ๋ถ„๋ฆฌ๋œ DOM ๋…ธ๋“œ์— ์˜ํ•ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•ด์ œ๋˜์ง€ ์•Š๊ณ  ๋ˆ„์ ๋˜์–ด ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์ผ์œผํ‚ค๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ์‹๋ณ„ ๋ฐ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์œผ๋กœ ์ดํ•ด๋ฅผ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค [42-44]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Management/Agile Environments.md b/10_Wiki/Management/Agile Environments.md new file mode 100644 index 00000000..dbf3a829 --- /dev/null +++ b/10_Wiki/Management/Agile Environments.md @@ -0,0 +1,47 @@ +# [[Agile Environments]] + +## ๐Ÿ“Œ Brief Summary +Agile Environments(์• ์ž์ผ ํ™˜๊ฒฝ)๋Š” ์š”๊ตฌ์‚ฌํ•ญ์ด ์ง€์†์ ์œผ๋กœ ๋ณ€ํ™”ํ•˜๋Š” ํ”„๋กœ์ ํŠธ๋‚˜ ์Šคํƒ€ํŠธ์—… ํ™˜๊ฒฝ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค [1]. ์ด๋Ÿฌํ•œ ํ™˜๊ฒฝ์—์„œ๋Š” ๋ฏธ๋ž˜์— ํ•„์š”ํ• ์ง€๋„ ๋ชจ๋ฅด๋Š” ๋ณต์žกํ•œ ๊ธฐ๋Šฅ์„ ๋ฏธ๋ฆฌ ๊ฐœ๋ฐœํ•˜๊ธฐ๋ณด๋‹ค๋Š” ์˜ค์ง ํ˜„์žฌ์˜ ์š”๊ตฌ์‚ฌํ•ญ์— ์ง‘์ค‘ํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค [2]. ๋”ฐ๋ผ์„œ ๊ฐ ๊ธฐ๋Šฅ์„ ๋…๋ฆฝ์ ์œผ๋กœ ์ƒ์„ฑํ•˜๊ณ  ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์—ฐํ•˜๊ณ  ๋ชจ๋“ˆํ™”๋œ ์ ‘๊ทผ ๋ฐฉ์‹์ด ๋งค์šฐ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค [3]. + +## ๐Ÿ“– Core ์†Œ์Šค์— ๊ด€๋ จ ์ •๋ณด๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค.Content +์• ์ž์ผ ํ™˜๊ฒฝ(Agile Environments)๊ณผ ๊ด€๋ จํ•˜์—ฌ ์ œ๊ณต๋œ ์†Œ์Šค์—์„œ ๋‹ค๋ฃจ๊ณ  ์žˆ๋Š” ๊ตฌ์ฒด์ ์ธ ์„ค๋ช…์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. + +* **YAGNI ์›์น™์˜ ์ค‘์š”์„ฑ**: ์• ์ž์ผ ํ™˜๊ฒฝ์—์„œ๋Š” "You Aren't Gonna Need It (YAGNI)" ์›์น™์ด ํŠนํžˆ ํ•„์ˆ˜์ ์œผ๋กœ ์ž‘์šฉํ•ฉ๋‹ˆ๋‹ค [2]. ๋ณ€ํ™”ํ•˜๋Š” ์š”๊ตฌ์‚ฌํ•ญ์„ ๊ฐ€์ง„ ์Šคํƒ€ํŠธ์—…์ด๋‚˜ ์• ์ž์ผ ํ”„๋กœ์ ํŠธ์—์„œ๋Š”, ๋ฏธ๋ž˜์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๋Œ€๋น„ํ•˜์—ฌ ๋ณต์žกํ•œ ๊ธฐ๋Šฅ์„ ๋ฏธ๋ฆฌ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์„ ํ”ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [1, 2]. ๊ฐœ๋ฐœํŒ€์€ ์˜ค์ง ํ˜„์žฌ์˜ ์š”๊ตฌ์‚ฌํ•ญ์—๋งŒ ์ง‘์ค‘ํ•จ์œผ๋กœ์จ ๋‚˜์ค‘์— ์œ ์ง€๋ณด์ˆ˜ํ•ด์•ผ ํ•  ๋ณต์žก์„ฑ๊ณผ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์ฝ”๋“œ(dead code)์˜ ์–‘์„ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2]. +* **๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ(Feature-Based Structure)์˜ ์ ํ•ฉ์„ฑ**: ํ”„๋ก ํŠธ์—”๋“œ ์•„ํ‚คํ…์ฒ˜ ์ธก๋ฉด์—์„œ ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ํด๋” ๊ตฌ์กฐ๋Š” ์• ์ž์ผ ๊ฐœ๋ฐœ ๋ฐฉ๋ฒ•๋ก ๊ณผ ๋งค์šฐ ์ž˜ ๋งž์Šต๋‹ˆ๋‹ค [3]. ์ด ๊ตฌ์กฐ์—์„œ๋Š” ๊ฐ๊ฐ์˜ ๊ธฐ๋Šฅ(feature)์ด ๋…๋ฆฝ์ ์œผ๋กœ ๋ถ„๋ฆฌ๋˜์–ด ์ƒ์„ฑ ๋ฐ ๊ตฌํ˜„๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์• ์ž์ผ ํ™˜๊ฒฝ์—์„œ ์š”๊ตฌํ•˜๋Š” ์œ ์—ฐ์„ฑ๊ณผ ๋ณ‘๋ ฌ์ ์ธ ๊ฐœ๋ฐœ์„ ํšจ๊ณผ์ ์œผ๋กœ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค [3]. +* *์ฐธ๊ณ : ์ฃผ์–ด์ง„ ์†Œ์Šค์—๋Š” ๊ฐœ๋ฐœ ์›์น™(YAGNI) ๋ฐ ํด๋” ๊ตฌ์กฐ(Feature-Based)์™€ ์• ์ž์ผ์˜ ์—ฐ๊ด€์„ฑ๋งŒ ์–ธ๊ธ‰๋˜์–ด ์žˆ์œผ๋ฉฐ, ์Šคํฌ๋Ÿผ์ด๋‚˜ ์Šคํ”„๋ฆฐํŠธ ๋“ฑ ์• ์ž์ผ ํ™˜๊ฒฝ ์ž์ฒด์˜ ์ „๋ฐ˜์ ์ธ ํ”„๋กœ์„ธ์Šค๋‚˜ ์ด๋ก ์— ๋Œ€ํ•ด์„œ๋Š” ์†Œ์Šค์— ๊ด€๋ จ ์ •๋ณด๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค.* + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts +- [[YAGNI]] + - ์—ฐ๊ฒฐ ์ด์œ : ์• ์ž์ผ ํ™˜๊ฒฝ์—์„œ ๋ฏธ๋ž˜์˜ ๋ถˆํ™•์‹คํ•œ ๊ธฐ๋Šฅ์„ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์ง€ ์•Š๊ณ  ํ˜„์žฌ์˜ ์š”๊ตฌ์‚ฌํ•ญ์— ์ง‘์ค‘ํ•˜๋„๋ก ์ด๋„๋Š” ๊ฐ€์žฅ ํ•ต์‹ฌ์ ์ธ ๊ฐœ๋ฐœ ์›์น™์ž…๋‹ˆ๋‹ค [1, 2]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์• ์ž์ผ ํ™˜๊ฒฝ์—์„œ ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ(Dead Code)์˜ ์ƒ์„ฑ์„ ๋ฐฉ์ง€ํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜ ๋น„์šฉ์„ ์ตœ์†Œํ™”ํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ํŒ๋‹จ ๊ธฐ์ค€์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2]. +- [[Feature-Based Structure]] + - ์—ฐ๊ฒฐ ์ด์œ : ์• ์ž์ผ ๋ฐฉ๋ฒ•๋ก ๊ณผ ๊ฐ€์žฅ ์ž˜ ์–ด์šธ๋ฆฌ๋Š” ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด์œผ๋กœ, ์ฝ”๋“œ ๋ฒ ์ด์Šค๋ฅผ ๊ธฐ๋Šฅ ๋‹จ์œ„๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ๋…๋ฆฝ์ ์ธ ๊ฐœ๋ฐœ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค [3]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์• ์ž์ผ ํŒ€์ด ์š”๊ตฌ์‚ฌํ•ญ ๋ณ€๊ฒฝ์— ๋งž์ถฐ ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ์„ ๋…๋ฆฝ์ ์œผ๋กœ ํ™•์žฅํ•˜๊ณ  ๊ฐœ๋ฐœํ•  ๋•Œ ํŒŒ์ผ๊ณผ ํด๋”๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑํ•ด์•ผ ํ•˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3]. +- [[Startup Projects]] + - ์—ฐ๊ฒฐ ์ด์œ : ์• ์ž์ผ ํ™˜๊ฒฝ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์š”๊ตฌ์‚ฌํ•ญ์ด ์ง€์†์ ์œผ๋กœ ๋ณ€ํ™”ํ•˜๋Š” ํŠน์„ฑ์„ ๊ณต์œ ํ•˜๋ฉฐ, YAGNI ์›์น™์ด ๊ฐ•ํ•˜๊ฒŒ ์ ์šฉ๋˜๋Š” ๋Œ€ํ‘œ์ ์ธ ๋น„์ฆˆ๋‹ˆ์Šค ํ™˜๊ฒฝ์ž…๋‹ˆ๋‹ค [1]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์• ์ž์ผ ์›์น™์ด ์‹ค๋ฌด์—์„œ ์–ด๋– ํ•œ ํ˜•ํƒœ์˜ ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๋‚˜ ์ƒํ™ฉ(๋น ๋ฅธ ๋ณ€ํ™”์™€ ์œ ์—ฐ์„ฑ ์š”๊ตฌ)์—์„œ ์ฃผ๋กœ ์ฑ„ํƒ๋˜๋Š”์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1]. + +### Deeper Research Questions +- ์• ์ž์ผ ํ™˜๊ฒฝ์—์„œ YAGNI ์›์น™์„ ์—„๊ฒฉํ•˜๊ฒŒ ์ ์šฉํ•˜์—ฌ ๋‹น์žฅ์˜ ๊ธฐ๋Šฅ๋งŒ ๊ฐœ๋ฐœํ•  ๋•Œ, ํ–ฅํ›„ ์‹œ์Šคํ…œ์ด ํ™•์žฅ๋˜๋ฉด์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ์ˆ  ๋ถ€์ฑ„(Technical Debt)๋Š” ์–ด๋–ป๊ฒŒ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋Š”๊ฐ€? +- ์š”๊ตฌ์‚ฌํ•ญ์ด ๋Š์ž„์—†์ด ๋ณ€ํ™”ํ•˜๋Š” ์• ์ž์ผ ํ”„๋กœ์ ํŠธ์—์„œ Feature-Based Structure๊ฐ€ ๊ธฐ์กด์˜ ํŒŒ์ผ ์œ ํ˜• ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ(File-Type Based Structure)๋ณด๋‹ค ํŒ€ ํ˜‘์—… ๋ฐ ์œ ์ง€๋ณด์ˆ˜์— ์œ ๋ฆฌํ•œ ๊ตฌ์ฒด์  ์ด์œ ๋Š” ๋ฌด์—‡์ธ๊ฐ€? +- ์Šคํƒ€ํŠธ์—… ํ”„๋กœ์ ํŠธ์˜ ์ดˆ๊ธฐ ๋‹จ๊ณ„์—์„œ ์• ์ž์ผ ์›์น™(YAGNI, KISS ๋“ฑ)์„ ์ ์šฉํ•  ๋•Œ์™€, ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ํ™˜๊ฒฝ์œผ๋กœ ํ™•์žฅ(Scaling)๋  ๋•Œ ์•„ํ‚คํ…์ฒ˜ ์›์น™(SOLID ๋“ฑ)์˜ ์ ์šฉ ๋น„์ค‘์€ ์–ด๋–ป๊ฒŒ ๋ณ€ํ™”ํ•ด์•ผ ํ•˜๋Š”๊ฐ€? +- ๊ธฐ๋Šฅ(Feature)์„ ๋…๋ฆฝ์ ์œผ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ฐœ๋ฐœํ•˜๋Š” ์• ์ž์ผ ํ™˜๊ฒฝ์—์„œ, ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ ๊ฐ„์— ๊ณต์œ ๋˜๋Š” ๊ต์ฐจ ์˜์กด์„ฑ(Cross-cutting concerns)์€ ๊ตฌ์กฐ์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•ด์•ผ ํ•˜๋Š”๊ฐ€? +- ์• ์ž์ผ ํ™˜๊ฒฝ์˜ 'ํ˜„์žฌ ์š”๊ตฌ์‚ฌํ•ญ์— ๋Œ€ํ•œ ์ง‘์ค‘'๊ณผ '์žฅ๊ธฐ์ ์ธ ์†Œํ”„ํŠธ์›จ์–ด ์•„ํ‚คํ…์ฒ˜์˜ ๊ฒฌ๊ณ ํ•จ' ์‚ฌ์ด์˜ ๊ท ํ˜•์„ ๋งž์ถ”๊ธฐ ์œ„ํ•œ ๊ฐœ๋ฐœ ๊ฑฐ๋ฒ„๋„Œ์Šค๋Š” ์–ด๋–ป๊ฒŒ ๊ตฌ์ถ•ํ•ด์•ผ ํ•˜๋Š”๊ฐ€? + +### Practical Application Contexts +- **Implementation:** ์ฃผ์–ด์ง„ ์Šคํ† ๋ฆฌ๋‚˜ ํƒœ์Šคํฌ์˜ ์š”๊ตฌ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ตœ์†Œํ•œ์˜ ์ฝ”๋“œ๋งŒ ์šฐ์„ ์ ์œผ๋กœ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค (์˜ค๋ฒ„์—”์ง€๋‹ˆ์–ด๋ง ๊ธˆ์ง€) [2]. +- **System Design:** ํ”„๋กœ์ ํŠธ ํด๋”์™€ ๋ชจ๋“ˆ์„ ๊ธฐ๋Šฅ(Feature)์„ ์ค‘์‹ฌ์œผ๋กœ ์„ค๊ณ„ํ•˜์—ฌ, ์š”๊ตฌ์‚ฌํ•ญ์ด ๋ณ€๊ฒฝ๋˜๋”๋ผ๋„ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ์ตœ์†Œํ™”ํ•˜๊ณ  ๋…๋ฆฝ์ ์ธ ๋ฐฐํฌ ๋ฐ ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค [3]. +- **Operation / Maintenance:** ์–ธ์  ๊ฐ€ ์“ฐ์ผ ๊ฒƒ์ด๋ผ ์˜ˆ์ƒํ•˜๊ณ  ์ž‘์„ฑํ•œ ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ๋ฅผ ๋ฐฐ์ œํ•จ์œผ๋กœ์จ, ์šด์˜ ๋‹จ๊ณ„์—์„œ ํŒ€์ด ๊ด€๋ฆฌํ•˜๊ณ  ํŒŒ์•…ํ•ด์•ผ ํ•  ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ์˜ ๋ณต์žก์„ฑ์„ ๋Œ€ํญ ๋‚ฎ์ถฅ๋‹ˆ๋‹ค [2]. +- **Learning Path:** ์• ์ž์ผ ํ™˜๊ฒฝ์— ํ•ฉ๋ฅ˜ํ•˜๊ธฐ ์œ„ํ•ด YAGNI ์›์น™์˜ ์ ์šฉ๋ฒ•๊ณผ Feature-Sliced Design๊ณผ ๊ฐ™์€ ์ตœ์‹  ๊ธฐ๋Šฅ ๋‹จ์œ„์˜ ๋ชจ๋“ˆํ˜• ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด์„ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค [2, 3]. +- **My Project Relevance:** ์žฆ์€ ๊ธฐํš ๋ณ€๊ฒฝ์ด ์˜ˆ์ƒ๋˜๋Š” ์ดˆ๊ธฐ ๋‹จ๊ณ„์˜ ์Šคํƒ€ํŠธ์—… ํ”„๋กœ์ ํŠธ๋‚˜ ์• ์ž์ผ ์กฐ์ง์„ ์„ธํŒ…ํ•  ๋•Œ, ์ดˆ๊ธฐ ๊ฐœ๋ฐœ ์†๋„๋ฅผ ๋†’์ด๋ฉด์„œ๋„ ๋ณ€๊ฒฝ์— ์œ ์—ฐํ•˜๊ฒŒ ๋Œ€์‘ํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ€์ด๋“œ๋ผ์ธ์œผ๋กœ ์ง๊ฒฐ๋ฉ๋‹ˆ๋‹ค [1, 3]. + +### Adjacent Topics +- [[SOLID Principles]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ์• ์ž์ผ ํ™˜๊ฒฝ์—์„œ ๋‹น์žฅ์˜ ๊ธฐ๋Šฅ์„ ๋‹จ์ˆœํ•˜๊ฒŒ ๊ฐœ๋ฐœ(YAGNI)ํ•˜๋ฉด์„œ๋„, ์žฅ๊ธฐ์ ์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ทœ๋ชจ๊ฐ€ ์ปค์กŒ์„ ๋•Œ ์ฝ”๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ์œ ์ง€๋ณด์ˆ˜ ๊ฐ€๋Šฅํ•˜๊ฒŒ ์„ค๊ณ„ํ• ์ง€ ๊ฐ์ฒด ์ง€ํ–ฅ์ /๊ตฌ์กฐ์  ๊ด€์ ์—์„œ ์ดํ•ด๋ฅผ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1, 4]. +- [[Clean Code]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋น ๋ฅธ ๋ณ€ํ™”์™€ ๋ฐ˜๋ณต ๊ฐœ๋ฐœ(Iteration)์ด ์ผ์–ด๋‚˜๋Š” ์• ์ž์ผ ํ™˜๊ฒฝ ์†์—์„œ, ์—ฌ๋Ÿฌ ๋ช…์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ฝ”๋“œ๋ฅผ ์‰ฝ๊ฒŒ ์ฝ๊ณ  ํ˜‘์—…ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ธฐ๋ณธ์ ์ธ ์ฝ”๋“œ ํ’ˆ์งˆ ์œ ์ง€ ๊ธฐ๋ฒ•์œผ๋กœ ํ™•์žฅ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค [4, 5]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Management/Branching Strategies.md b/10_Wiki/Management/Branching Strategies.md new file mode 100644 index 00000000..0c39642f --- /dev/null +++ b/10_Wiki/Management/Branching Strategies.md @@ -0,0 +1,71 @@ +# [[Branching Strategies]] + +## ๐Ÿ“Œ Brief ์†ŒSummary +Branching Strategies(๋ธŒ๋žœ์นญ ์ „๋žต)๋Š” ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ ์ฝ”๋“œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ด€๋ฆฌํ•˜๊ณ  ํŒ€์› ๊ฐ„์˜ ํ˜‘์—…์„ ์กฐ์œจํ•˜๊ธฐ ์œ„ํ•ด ๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ(Git ๋“ฑ)์—์„œ ๋ธŒ๋žœ์น˜๋ฅผ ์ƒ์„ฑ, ๋ณ‘ํ•ฉ, ์œ ์ง€๋ณด์ˆ˜ํ•˜๋Š” ๊ทœ์น™๊ณผ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ํŒ€์˜ ๊ทœ๋ชจ์™€ ํ”„๋กœ์ ํŠธ ์š”๊ตฌ์‚ฌํ•ญ์— ๋”ฐ๋ผ Git Flow, GitHub Flow, Trunk-Based Development, Feature Branch Workflow ๋“ฑ ๋‹ค์–‘ํ•œ ์ „๋žต์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋ช…ํ™•ํ•œ ๋ธŒ๋žœ์นญ ์ „๋žต์˜ ๋„์ž…์€ ๋ฉ”์ธ ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•˜๊ณ  ๋ณ‘ํ•ฉ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๋ฉฐ ์ฝ”๋“œ ๋ฆฌ๋ทฐ์™€ ์ถ”์ ์„ฑ์„ ๊ฐ•ํ™”ํ•˜๋Š” ํ•ต์‹ฌ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค [1-3]. + +## ๐Ÿ“– Core Content +* **์ฃผ์š” ๋ธŒ๋žœ์นญ ์ „๋žต ์œ ํ˜•** + * **Feature Branch Workflow (๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜ ์›Œํฌํ”Œ๋กœ์šฐ):** 2~5๋ช… ๊ทœ๋ชจ์˜ ์†Œ๊ทœ๋ชจ ํŒ€์— ๊ฐ€์žฅ ์ดˆ๋ณด์ž ์นœํ™”์ ์ด๊ณ  ์ถฉ๋Œ์ด ์ ์€ ์›Œํฌํ”Œ๋กœ์šฐ์ž…๋‹ˆ๋‹ค [4]. `main` ๋ธŒ๋žœ์น˜๋Š” ํ•ญ์ƒ ์•ˆ์ •์ ์ด๊ณ  ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋ฉฐ, ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด๋‚˜ ๋ฒ„๊ทธ ์ˆ˜์ • ์‹œ `main`์—์„œ ํŒŒ์ƒ๋œ ์งง์€ ์ˆ˜๋ช…์˜ ๋ธŒ๋žœ์น˜๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค [5]. ๊ฐœ๋ฐœ ์™„๋ฃŒ ํ›„ Pull Request(PR)๋ฅผ ์—ด๊ณ  ์ตœ์†Œ 1๋ช… ์ด์ƒ์˜ ๋™๋ฃŒ ๋ฆฌ๋ทฐ์™€ ํ…Œ์ŠคํŠธ๋ฅผ ๊ฑฐ์นœ ํ›„ Squash Merge ๋ฐฉ์‹์œผ๋กœ ๋ณ‘ํ•ฉํ•ฉ๋‹ˆ๋‹ค [6, 7]. + * **Trunk-Based Development (ํŠธ๋ ํฌ ๊ธฐ๋ฐ˜ ๊ฐœ๋ฐœ):** ๊ฐ•๋ ฅํ•œ CI(์ง€์†์  ํ†ตํ•ฉ) ํ™˜๊ฒฝ์„ ๊ฐ–์ถ˜ ์ˆ™๋ จ๋œ ํŒ€์— ์ ํ•ฉํ•œ ๊ฐ€๋ฒผ์šด ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค [8, 9]. ์ˆ˜๋ช…์ด ๋งค์šฐ ์งง์€ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์— ์ž‘์€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ž์ฃผ ์ปค๋ฐ‹ํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์ตœ์†Œํ™”๋˜๊ณ  ํ”ผ๋“œ๋ฐฑ์ด ๋น ๋ฅด๋ฉฐ ๋Œ€๊ทœ๋ชจ ๋ณ‘ํ•ฉ ์ถฉ๋Œ์„ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [8, 10]. + * **Git Flow:** ์ •๊ธฐ์ ์ธ ๋ฆด๋ฆฌ์Šค ์ผ์ •์„ ๊ฐ€์ง„ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค [9]. ํ•˜์ง€๋งŒ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜ ์™ธ์—๋„ `develop`, `release` ๋“ฑ ๊ด€๋ฆฌํ•ด์•ผ ํ•  ๋ธŒ๋žœ์น˜๊ฐ€ ๋งŽ์•„ ์†Œ๊ทœ๋ชจ ํŒ€์—๊ฒŒ๋Š” ๋ฌด๊ฒ๊ณ  ๊ณผ๋„ํ•œ ๋ณต์žก์„ฑ์„ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [9, 11, 12]. + * **GitHub Flow:** `main` ๋ธŒ๋žœ์น˜๋กœ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜๋ฅผ ์ง์ ‘ ๋ณ‘ํ•ฉํ•˜๋Š” ๋‹จ์ˆœํ™”๋œ ๊ตฌ์กฐ๋กœ, Git Flow๋ณด๋‹ค ๋น ๋ฅด๊ณ  ์ง€์†์ ์ธ ๋ฐฐํฌ ํ™˜๊ฒฝ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค [11, 13]. + +* **๋ชจ๋“  ์ „๋žต์— ์ ์šฉ๋˜๋Š” ๋ชจ๋ฒ” ์‚ฌ๋ก€ (Best Practices)** + * **ํ‹ฐ์ผ“ ID ๋ฐ ๋ช…๋ช… ๊ทœ์น™ ์‚ฌ์šฉ:** ๋ธŒ๋žœ์น˜ ์ด๋ฆ„๊ณผ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€์— ์š”๊ตฌ์‚ฌํ•ญ ์ถ”์ ์„ ์œ„ํ•œ ํ‹ฐ์ผ“ ID(์˜ˆ: `feature/PROJ-123-user-auth`)๋ฅผ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [14, 15]. ๋ธŒ๋žœ์น˜ ์ด๋ฆ„์€ ์ผ€๋ฐฅ ์ผ€์ด์Šค(kebab-case)๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์งง๊ณ  ๋ช…ํ™•ํ•˜๊ฒŒ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค [16, 17]. + * **์›์ž์  ์ปค๋ฐ‹ (Atomic Commits):** ํ•˜๋‚˜์˜ ์ปค๋ฐ‹์—๋Š” ํ•˜๋‚˜์˜ ๋…ผ๋ฆฌ์  ๋ณ€๊ฒฝ ์‚ฌํ•ญ๋งŒ ํฌํ•จํ•˜์—ฌ ์ฝ”๋“œ ๋ฆฌ๋ทฐ์™€ ํžˆ์Šคํ† ๋ฆฌ ์ถ”์ ์„ ๋‹จ์ˆœํ™”ํ•ฉ๋‹ˆ๋‹ค [7, 18]. + * **Conventional Commits ๊ทœ์น™:** ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๋Š” `feat:`, `fix:`, `chore:` ๋“ฑ์˜ ํ‘œ์ค€ํ™”๋œ ์ ‘๋‘์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€๊ฒฝ์˜ ๋ชฉ์ ์„ ๋ช…ํ™•ํžˆ ํ•ฉ๋‹ˆ๋‹ค [19-21]. + * **PR ๋ฐ ๋ณ‘ํ•ฉ ๊ทœ์น™:** ์ฝ”๋“œ๋ฅผ ์ ˆ๋Œ€ `main`์— ์ง์ ‘ ํ‘ธ์‹œํ•ด์„œ๋Š” ์•ˆ ๋˜๋ฉฐ, ๋ฐ˜๋“œ์‹œ PR์„ ํ†ตํ•œ ๋ฆฌ๋ทฐ๋ฅผ ๊ฑฐ์ณ์•ผ ํ•ฉ๋‹ˆ๋‹ค [6, 22]. ๋ณ‘ํ•ฉ ํ›„์—๋Š” ์‚ฌ์šฉ์ด ๋๋‚œ ๋ธŒ๋žœ์น˜๋ฅผ ์ฆ‰์‹œ ์‚ญ์ œํ•˜์—ฌ ์ €์žฅ์†Œ๋ฅผ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค [6, 23]. + +* **์ „๋žต ๊ฐ„ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋ฐฉ๋ฒ•** + * ํ”„๋กœ์ ํŠธ๊ฐ€ ๋ณ€ํ™”ํ•จ์— ๋”ฐ๋ผ ์ „๋žต๋„ ์ง„ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํ†ตํ•ฉ ์†๋„๋ฅผ ๋†’์ด๋ ค๋ฉด Feature Branch์—์„œ Trunk-Based(๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ ์‚ฌ์šฉ ๋ฐ ์ˆ˜๋ช… ๋‹จ์ถ•)๋กœ ์ „ํ™˜ํ•˜๊ณ , ๋” ๋งŽ์€ ์ฒด๊ณ„๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด GitHub Flow์—์„œ Git Flow(`develop` ๋ธŒ๋žœ์น˜ ๋ฐ ๋ฆด๋ฆฌ์Šค ๋ธŒ๋žœ์น˜ ์ถ”๊ฐ€)๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [11, 12]. + +## โš–๏ธ Trade-offs & Caveats +* **๊ตฌ์กฐ์  ์˜ค๋ฒ„ํ—ค๋“œ vs. ์•ˆ์ •์„ฑ:** Git Flow๋Š” ๊ตฌ์กฐ๊ฐ€ ๋ช…ํ™•ํ•˜๊ณ  ์ •๊ธฐ์ ์ธ ๋ฆด๋ฆฌ์Šค์— ๊ฐ•์ ์ด ์žˆ์ง€๋งŒ, ๋ธŒ๋žœ์น˜์˜ ์ˆ˜๊ฐ€ ๋งŽ์•„ ์œ ์ง€๋ณด์ˆ˜ ๋น„์šฉ(์˜ค๋ฒ„ํ—ค๋“œ)์ด ๋†’์Šต๋‹ˆ๋‹ค [9]. ๋ฐ˜๋ฉด Feature Branch๋‚˜ Trunk-Based ๋ฐฉ์‹์€ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ฐ€๋ฒผ์šด ๋Œ€์‹  ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์˜ ๋ณดํ˜ธ(`main` ๋ธŒ๋žœ์น˜ ์ง์ ‘ ํ‘ธ์‹œ ๊ธˆ์ง€, ์—„๊ฒฉํ•œ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๋“ฑ) ๊ทœ์น™์ด ๊ฐ•์ œ๋˜์ง€ ์•Š์œผ๋ฉด ์ฝ”๋“œ๊ฐ€ ์‰ฝ๊ฒŒ ๊นจ์งˆ ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค [6, 22]. +* **๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜์˜ ์ˆ˜๋ช…(Long-lived branches) ๋ฌธ์ œ:** ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜๋‚˜ GitHub Flow๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ, ๋ธŒ๋žœ์น˜์˜ ์ˆ˜๋ช…์ด ๋ช‡ ์ฃผ ์ด์ƒ ๊ธธ์–ด์ง€๋ฉด ๋‹ค๋ฅธ ์ž‘์—…์ž์™€์˜ ์ฝ”๋“œ ๋ถ„๊ธฐ๊ฐ€ ์‹ฌํ•ด์ ธ ๊ฑฐ๋Œ€ํ•œ ๋ณ‘ํ•ฉ ์ถฉ๋Œ(Merge conflicts)์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [17]. ๋”ฐ๋ผ์„œ ๋งค์ผ `main`์˜ ์ตœ์‹  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ Pull ํ•˜๊ฑฐ๋‚˜ Rebaseํ•˜์—ฌ ์ถฉ๋Œ์„ ์˜ˆ๋ฐฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [7]. +* **Trunk-Based ๊ฐœ๋ฐœ์˜ ์˜์กด์„ฑ:** ๋น ๋ฅธ ๋ณ‘ํ•ฉ์„ ์ง€ํ–ฅํ•˜๋Š” Trunk-Based Development๋Š” ์ง€์†์ ์ด๊ณ  ์ž๋™ํ™”๋œ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ(CI)๊ณผ ๋ฏธ์™„์„ฑ ๊ธฐ๋Šฅ์„ ํ”„๋กœ๋•์…˜์—์„œ ์ˆจ๊ธฐ๊ธฐ ์œ„ํ•œ ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ(Feature Flags) ๊ตฌํ˜„ ๋“ฑ ๊ธฐ์ˆ ์  ๋’ท๋ฐ›์นจ์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค [9, 11]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [๊ด€๊ณ„ ์œ ํ˜• A: ์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๋ฐฉ๋ฒ•๋ก ] +- [[Feature Branch Workflow]] + - ์—ฐ๊ฒฐ ์ด์œ : ์†Œ๊ทœ๋ชจ 3~5์ธ ๊ฐœ๋ฐœ ํŒ€์— ๊ฐ€์žฅ ์ถ”์ฒœ๋˜๋Š” ๋‹จ์ˆœํ•˜๊ณ  ์ง๊ด€์ ์ธ ๋ธŒ๋žœ์นญ ์ „๋žต์˜ ๊ธฐ๋ฐ˜ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ฉ”์ธ ๋ธŒ๋žœ์น˜๋ฅผ ์˜ค์—ผ์‹œํ‚ค์ง€ ์•Š๊ณ  ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ๊ฒฉ๋ฆฌ๋œ ํ™˜๊ฒฝ์—์„œ ๊ฐœ๋ฐœํ•˜๊ณ  ๋ณ‘ํ•ฉํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก ์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[Trunk-Based Development]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋ฌด๊ฑฐ์šด ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ํƒˆํ”ผํ•˜์—ฌ ๋ธŒ๋žœ์น˜ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๊ทนํ•œ์œผ๋กœ ์ค„์ด๊ณ  ๋น ๋ฅธ ํ†ตํ•ฉ์„ ์ค‘์‹œํ•˜๋Š” ์ตœ์‹  ํŠธ๋ Œ๋“œ ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: CI/CD ํ™˜๊ฒฝ์—์„œ์˜ ์žฆ์€ ์†Œ๊ทœ๋ชจ ๋ฐฐํฌ ๋ฐฉ์‹๊ณผ ์ถฉ๋Œ ์ตœ์†Œํ™” ์ „๋žต์„ ํ•™์Šตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[Git Flow]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋ธŒ๋žœ์นญ ์ „๋žต์˜ ๊ณ ์ „์ ์ด๊ณ  ์ฒด๊ณ„์ ์ธ ํ˜•ํƒœ๋กœ์„œ, ๋Œ€ํ˜• ํ”„๋กœ์ ํŠธ์˜ ์ •๊ธฐ์  ๋ฒ„์ €๋‹ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: `develop`, `release`, `hotfix` ๋“ฑ ๊ฐœ๋ฐœ ํŒŒ์ดํ”„๋ผ์ธ์— ๋”ฐ๋ฅธ ๋ธŒ๋žœ์น˜์˜ ์—ญํ•  ๋ถ„๋ฆฌ ๊ธฐ๋ฒ•์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +#### [๊ด€๊ณ„ ์œ ํ˜• B: ๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ ๋ฐ ๊ทœ์น™] +- [[Pull Request & Code Review]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋ธŒ๋žœ์นญ ์ „๋žต์ด ์•ˆ์ „ํ•˜๊ฒŒ ๋™์ž‘ํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋“  ๋ณ‘ํ•ฉ ์ „์— ํ•„์ˆ˜์ ์œผ๋กœ ๊ฑฐ์ณ์•ผ ํ•˜๋Š” ํ’ˆ์งˆ ๊ฒ€์ฆ ๊ด€๋ฌธ์ž…๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํŒ€์› ๊ฐ„์˜ ๋น„๋™๊ธฐ์  ํ”ผ๋“œ๋ฐฑ ์ˆ˜๋ ด, ์‹œ๊ฐ์  ๊ฒ€์ฆ, ๊ทธ๋ฆฌ๊ณ  CI ํ†ต๊ณผ๋ฅผ ์ „์ œ๋กœ ํ•œ ์•ˆ์ „ํ•œ ๋ณ‘ํ•ฉ ๊ณผ์ •์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[Conventional Commits]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋ธŒ๋žœ์น˜ ๋ณ‘ํ•ฉ ๋‚ด์—ญ์„ ์ถ”์ ํ•˜๊ณ  ๊ฐ€๋…์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ์ „ ์„ธ๊ณ„์ ์œผ๋กœ ํ†ต์šฉ๋˜๋Š” ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ์ž‘์„ฑ ํ‘œ์ค€์ž…๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: `feat(scope): message` ์™€ ๊ฐ™์€ ํ˜•์‹์˜ ๊ตฌ๋ฌธ์„ ํ†ตํ•ด ์ฝ”๋“œ ํžˆ์Šคํ† ๋ฆฌ ํŒŒ์•… ๋ฐ ๋ฌธ์„œ ์ž๋™ํ™”๋ฅผ ์–ด๋–ป๊ฒŒ ์ด๋ฃฐ ์ˆ˜ ์žˆ๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### Deeper Research Questions +- Trunk-Based Development๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด ํ•„์ˆ˜์ ์ธ ์ž๋™ํ™” ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ(CI)๊ณผ ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ(Feature flags)์˜ ๊ตฌํ˜„ ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? +- ์†Œ๊ทœ๋ชจ ํŒ€์ด ๋‹จ์ผ `main` ๋ธŒ๋žœ์น˜ ์ „๋žต์„ ์‚ฌ์šฉํ•  ๋•Œ, ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๋ฒ„๊ทธ๊ฐ€ ๋ฐฐํฌ๋˜๋Š” ๊ฒƒ์„ ๋ง‰๊ธฐ ์œ„ํ•œ GitHub ์ €์žฅ์†Œ์˜ ๋ธŒ๋žœ์น˜ ๋ณดํ˜ธ ๊ทœ์น™(Branch Protection Rules) ์ตœ์ ํ™” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? +- ์žฅ๊ธฐ ์ฒด๋ฅ˜ ๋ธŒ๋žœ์น˜(Long-lived branch)์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๊ฑฐ๋Œ€ํ•œ ๋ณ‘ํ•ฉ ์ถฉ๋Œ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด `main` ๋ธŒ๋žœ์น˜์˜ ์ตœ์‹  ๋‚ด์šฉ์„ ๊ฐ€์ ธ์˜ฌ ๋•Œ `merge`์™€ `rebase` ์ค‘ ์–ด๋–ค ๋ฐฉ์‹์ด ์ด๋ ฅ ๊ด€๋ฆฌ์— ๋” ํšจ๊ณผ์ ์ธ๊ฐ€? +- ์›์ž์  ์ปค๋ฐ‹(Atomic Commits)์„ ๊ฐ•์ œํ•˜๋Š” ์ •์ฑ…์ด Pull Request ๋ฆฌ๋ทฐ ์‹œ๊ฐ„๊ณผ ๋ฒ„๊ทธ ์ถ”์ ์„ฑ์— ์–ด๋– ํ•œ ์ •๋Ÿ‰์ /์ •์„ฑ์  ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”๊ฐ€? +- Git Flow ๋ฐฉ์‹์—์„œ GitHub Flow ๋ฐฉ์‹์œผ๋กœ ํŒ€์˜ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ๋•Œ ์˜ˆ์ƒ๋˜๋Š” ํ˜ผ๋ž€ ์š”์†Œ์™€ ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ CI/CD ํŒŒ์ดํ”„๋ผ์ธ์˜ ์žฌ๊ตฌ์„ฑ ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? + +### Practical Application Contexts +- **Implementation:** ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ์„ ์‹œ์ž‘ํ•  ๋•Œ, ์ตœ์‹  `main` ๋ธŒ๋žœ์น˜์—์„œ `feature/ํ‹ฐ์ผ“ID-๊ฐ„๋‹จํ•œ-์„ค๋ช…` ์ด๋ฆ„์œผ๋กœ ๋ธŒ๋žœ์น˜๋ฅผ ํŒŒ์ƒํ•˜๊ณ , ์›์ž์  ๋‹จ์œ„๋กœ ์ž‘์€ ์ปค๋ฐ‹์„ ์ž์ฃผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. +- **System Design:** ํ”„๋ก ํŠธ์—”๋“œ ๋ชจ๋“ˆ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ ์‹œ, ๋…๋ฆฝ์ ์ธ ํ”ผ์ฒ˜(Feature) ํด๋”๋ณ„๋กœ ๋ธŒ๋žœ์น˜๋ฅผ ๋‚˜๋ˆ„์–ด ๊ฐœ๋ฐœํ•จ์œผ๋กœ์จ ํŠน์ • ์ฝ”๋“œ ์˜์—ญ ๋ฐ–์œผ๋กœ ๋ณ‘ํ•ฉ ์ถฉ๋Œ์˜ ํญ๋ฐœ ๋ฐ˜๊ฒฝ(Blast radius)์ด ํผ์ง€์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. +- **Operation / Maintenance:** ๋ธŒ๋žœ์น˜๊ฐ€ `main`์œผ๋กœ ๋ณ‘ํ•ฉ๋˜๋Š” ์ฆ‰์‹œ GitHub Action ๋“ฑ CI ์„œ๋ฒ„์—์„œ ์ž๋™์œผ๋กœ ๋ฆฐํŠธ(ESLint), ํ…Œ์ŠคํŠธ(Jest), ํฌ๋งทํŒ…์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ๋ฐฉ์–ด๋ง‰์„ ๊ตฌ์ถ•ํ•˜์—ฌ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์˜ ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋ฅผ ์˜๊ตฌ์ ์œผ๋กœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. +- **Learning Path:** Git์˜ ๊ธฐ์ดˆ ๋ช…๋ น์–ด๋ฅผ ์Šต๋“ํ•œ ํ›„, ์†Œ๊ทœ๋ชจ ํŒ€ ๋‹จ์œ„์˜ Feature Branch Workflow๋ฅผ ์‹ค์Šตํ•˜๊ณ , ์ดํ›„ CI/CD ๋„๊ตฌ๋ฅผ ์—ฐ๋™ํ•œ Trunk-Based ํ™˜๊ฒฝ์œผ๋กœ ๋ฐœ์ „ํ•˜๋Š” ์ˆœ์„œ๋กœ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค. +- **My Project Relevance:** 3~5์ธ ๊ทœ๋ชจ์˜ ํ”„๋กœ์ ํŠธ์—์„œ ๋ฌด๊ฑฐ์šด Git Flow์˜ ๋„์ž…์„ ์ง€์–‘ํ•˜๊ณ , '๋‹จ๊ธฐ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜ โ†’ PR ๋ฐ 1์ธ ์ด์ƒ ํ”ผ์–ด ๋ฆฌ๋ทฐ ์Šน์ธ โ†’ Squash Merge ๋ฐ ๋ธŒ๋žœ์น˜ ์ฆ‰์‹œ ์‚ญ์ œ'๋ผ๋Š” ๋‹จ์ˆœํ™”๋œ ๋ฃฐ์„ ์ ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœ ์†๋„์™€ ์ฝ”๋“œ ํ’ˆ์งˆ์„ ๋™์‹œ์— ์ฑ™๊น๋‹ˆ๋‹ค. + +### Adjacent Topics +- [[Continuous Integration / Continuous Deployment (CI/CD)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋ธŒ๋žœ์นญ ์ „๋žต์— ์˜ํ•ด ํŠธ๋ฆฌ๊ฑฐ(Trigger)๋˜์–ด ์‹คํ–‰๋˜๋Š” ๋นŒ๋“œ, ํ…Œ์ŠคํŠธ, ๋ฐฐํฌ ํŒŒ์ดํ”„๋ผ์ธ์˜ ์ž๋™ํ™” ํ”„๋กœ์„ธ์Šค๋ฅผ ๊นŠ์ด ์•Œ์•„๋ด…๋‹ˆ๋‹ค. +- [[Feature-Sliced Design (FSD)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋„๋ฉ”์ธ๊ณผ ๊ธฐ๋Šฅ ๋‹จ์œ„๋กœ ์ฝ”๋“œ๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ํ”„๋ก ํŠธ์—”๋“œ ์•„ํ‚คํ…์ฒ˜ ๋ฐฉ๋ฒ•๋ก ์œผ๋กœ, ๋ธŒ๋žœ์น˜๋ฅผ ๊ธฐ๋Šฅ๋ณ„๋กœ ๋‚˜๋ˆŒ ๋•Œ ์ถฉ๋Œ์„ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ์ตœ์†Œํ™”ํ•˜๋Š” ์ฝ”๋“œ ๊ตฌ์กฐ ์„ค๊ณ„๋ฒ•์„ ํƒ๊ตฌํ•ฉ๋‹ˆ๋‹ค. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Management/Code Review.md b/10_Wiki/Management/Code Review.md new file mode 100644 index 00000000..5436d57b --- /dev/null +++ b/10_Wiki/Management/Code Review.md @@ -0,0 +1,56 @@ +# [[Code Review]] + +## ๐Ÿ“Œ Brief Summary +์ฝ”๋“œ ๋ฆฌ๋ทฐ(Code Review)๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋ฅผ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์— ๋ณ‘ํ•ฉํ•˜๊ธฐ ์ „์— ํŒ€์›(๋™๋ฃŒ)์ด ๊ฒ€ํ† ํ•˜์—ฌ ์Šน์ธํ•˜๋Š” ํ’ˆ์งˆ ๊ด€๋ฆฌ ๋ฐ ํ˜‘์—… ํ”„๋กœ์„ธ์Šค์ž…๋‹ˆ๋‹ค [1, 2]. ์ฃผ๋กœ Pull Request(PR) ๋‹จ๊ณ„๋ฅผ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง€๋ฉฐ, ๋‹จ๋…์œผ๋กœ ์ž˜๋ชป๋œ ์ฝ”๋“œ๊ฐ€ ๋ณ‘ํ•ฉ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ณ  ํŒ€ ๋‚ด ๋น ๋ฅธ ํ”ผ๋“œ๋ฐฑ ๋ฃจํ”„๋ฅผ ํ˜•์„ฑํ•ฉ๋‹ˆ๋‹ค [1]. ์ตœ๊ทผ ํ”„๋ก ํŠธ์—”๋“œ ํ™˜๊ฒฝ์—์„œ๋Š” ๋‹จ์ˆœํ•œ ์ฝ”๋“œ ๊ฒ€ํ† ๋ฅผ ๋„˜์–ด Storybook๊ณผ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ CI ํŒŒ์ดํ”„๋ผ์ธ๊ณผ ๊ฒฐํ•ฉํ•œ '์‹œ๊ฐ์  ๋ฆฌ๋ทฐ(Visual Review)'๋กœ ํ™•์žฅ๋˜์–ด ์˜๋„์น˜ ์•Š์€ UI ๋ณ€๊ฒฝ์„ ๋ฐฉ์ง€ํ•˜๋Š” ์—ญํ• ๋„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค [3]. + +## ๐Ÿ“– Core ์†Œ์Šค์— ๊ธฐ๋ฐ˜ํ•œ Core Content +- **๋™๋ฃŒ ๊ฒ€ํ† (Peer Review)์˜ ์—ญํ•  ๋ฐ ์ด์ **: ๊ฐœ๋ฐœ์ž๋Š” ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜(feature branch)์—์„œ ์ž‘์—…์„ ๋งˆ์นœ ํ›„ ๋ณ‘ํ•ฉ์„ ์œ„ํ•œ Pull Request(PR)๋ฅผ ์ƒ์„ฑํ•˜๋ฉฐ, ์ด๋•Œ ์ตœ์†Œ 1๋ช… ์ด์ƒ์˜ ํŒ€์›์—๊ฒŒ ๊ฒ€ํ† ์™€ ์Šน์ธ์„ ๋ฐ›์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค [1, 4]. ๋ฆฌ๋ทฐ์–ด๋Š” ๋ณ€๊ฒฝ๋œ ์ฝ”๋“œ์— ๋Œ€ํ•ด ์ฝ”๋ฉ˜ํŠธ๋ฅผ ๋‚จ๊ธฐ๋ฉฐ, ์ž‘์„ฑ์ž๊ฐ€ ์ด๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  ์žฌํ‘ธ์‹œ(push)ํ•˜์—ฌ ์ตœ์ข… ์Šน์ธ์„ ๋ฐ›์œผ๋ฉด ๋ณ‘ํ•ฉ์ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค [5]. ์ด๋Š” ๋‹จ์ผ ๊ฐœ๋ฐœ์ž์˜ ์‹ค์ˆ˜๋กœ ์ธํ•œ ์ž˜๋ชป๋œ ๋ณ‘ํ•ฉ์„ ๋ง‰๊ณ , ํŒ€์› ๊ฐ„์˜ ๊ฑด์ „ํ•œ ๋ฆฌ๋ทฐ ์Šต๊ด€๊ณผ ํ˜‘์—…์„ ์ด‰์ง„ํ•ฉ๋‹ˆ๋‹ค [1, 6]. +- **ํšจ์œจ์ ์ธ PR ์—ํ‹ฐ์ผ“**: ์›ํ™œํ•œ ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ์œ„ํ•ด์„œ๋Š” PR์„ ์ž‘๊ฒŒ ์œ ์ง€ํ•˜๊ณ  ๋‹จ์ผ ์ž‘์—…(Single task)์— ์ง‘์ค‘ํ•˜๋Š” ๊ฒƒ์ด ๋ชจ๋ฒ” ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค [2]. ๋ฆฌ๋ทฐ์–ด๊ฐ€ ํ•œ ๋ฒˆ์— 2,000์ค„ ์ด์ƒ์˜ ๋ฐฉ๋Œ€ํ•œ ์ฝ”๋“œ๋ฅผ ๊ฒ€์‚ฌํ•˜๋„๋ก ์š”๊ตฌํ•ด์„œ๋Š” ์•ˆ ๋˜๋ฉฐ, PR ๊ทœ๋ชจ๊ฐ€ ์ž‘์„์ˆ˜๋ก ๋” ๋น ๋ฅด๊ณ  ์ฒ ์ €ํ•˜๊ฒŒ ๊ฒ€ํ† ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2, 7]. +- **์‹œ๊ฐ์  ๋ฆฌ๋ทฐ(Visual Review)์˜ ๋„์ž…**: ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์˜ PR ํ”„๋กœ์„ธ์Šค์—์„œ๋Š” ์ฝ”๋“œ์˜ ๋…ผ๋ฆฌ ๊ฒ€ํ† ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์‹œ๊ฐ์  ํšŒ๊ท€(Visual Regression) ๊ฒ€ํ† ๊ฐ€ ํ•„์ˆ˜๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค [3]. ๊ฐœ๋ฐœ์ž๋Š” Storybook์„ ํ™œ์šฉํ•ด ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ตฌ์ถ•ํ•˜๊ณ , Chromatic์ด๋‚˜ Happo ๋“ฑ์˜ ๋„๊ตฌ๋ฅผ CI ํŒŒ์ดํ”„๋ผ์ธ์— ํ†ตํ•ฉํ•ฉ๋‹ˆ๋‹ค [3, 8]. +- **์ž๋™ํ™”๋œ ์‹œ๊ฐ์  ํšŒ๊ท€ ๊ฐ์ง€**: PR์ด ์—ด๋ฆฌ๋ฉด ์ด ๋„๊ตฌ๋“ค์ด ์—ฌ๋Ÿฌ ๋ธŒ๋ผ์šฐ์ € ๋ฐ ๋ทฐํฌํŠธ ํ™˜๊ฒฝ์—์„œ ์ž๋™์œผ๋กœ ๋ชจ๋“  UI ์ƒํƒœ์˜ ์Šคํฌ๋ฆฐ์ƒท์„ ์บก์ฒ˜ํ•˜๊ณ  ์ด์ „ ๊ธฐ์ค€์„ (baseline)๊ณผ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค [9, 10]. ๋ ˆ์ด์•„์›ƒ์ด๋‚˜ ์ƒ‰์ƒ ๋“ฑ์— ์˜๋„์น˜ ์•Š์€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋ฐœ๊ฒฌ๋˜๋ฉด PR์— ํ•ด๋‹น ์‚ฌํ•ญ์ด ์ˆ˜๋™ ๊ฒ€ํ†  ๋Œ€์ƒ์œผ๋กœ ํ‘œ์‹œ(flagged)๋˜์–ด ๋ฒ„๊ทธ๊ฐ€ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์œผ๋กœ ๋ฐฐํฌ๋˜๋Š” ๊ฒƒ์„ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค [3]. ๋”๋ถˆ์–ด, ์‹œ๊ฐ์  ๊ฒ€ํ†  ๋„๊ตฌ๋Š” ์‹œ๊ฐ์  ๋ณ€๊ฒฝ ์‚ฌํ•ญ๊ณผ ํ•จ๊ป˜ ์ƒˆ๋กœ์šด ์ ‘๊ทผ์„ฑ ์œ„๋ฐ˜(accessibility violations)๊นŒ์ง€ ํฌ์ฐฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [9, 11]. + +## โš–๏ธ Trade-offs & Caveats +- **๋ฆฌ๋ทฐ ๋ณ‘๋ชฉ ํ˜„์ƒ ๋ฐ ๋ณต์žก๋„ ์ฆ๊ฐ€**: ํ•œ ๋ฒˆ์— ์ˆ˜์ฒœ ์ค„์— ๋‹ฌํ•˜๋Š” ํฐ ๊ทœ๋ชจ์˜ ์ฝ”๋“œ(PR)๋ฅผ ๋ฆฌ๋ทฐํ•˜๋„๋ก ์š”์ฒญํ•  ๊ฒฝ์šฐ, ๋ฆฌ๋ทฐ์–ด๊ฐ€ ์ฝ”๋“œ๋ฅผ ์ฒ ์ €ํžˆ ๊ฐ์‚ฌ(audit)ํ•˜๊ธฐ ์–ด๋ ค์›Œ ๋ฆฌ๋ทฐ ์†๋„์™€ ํ’ˆ์งˆ์ด ๋ชจ๋‘ ์ €ํ•˜๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [2]. ์ด๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” PR์„ ๋งค์šฐ ์ž‘๊ฒŒ ๋‚˜๋ˆ„์–ด ์ง€์†์ ์œผ๋กœ ๋ฆฌ๋ทฐํ•ด์•ผ ํ•˜๋ฏ€๋กœ, ๊ฐœ๋ฐœ์ž๋Š” ์ž‘์—… ๋‹จ์œ„๋ฅผ ์„ธ๋ฐ€ํ•˜๊ฒŒ ์ชผ๊ฐœ์•ผ ํ•˜๋Š” ์ถ”๊ฐ€์ ์ธ ๋…ธ๋ ฅ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค [2, 7]. +- **์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ์˜ ๋ถˆ์•ˆ์ •์„ฑ(Flake) ์ด์Šˆ**: ์‹œ๊ฐ์  ๋ฆฌ๋ทฐ๋ฅผ ์œ„ํ•ด ์Šคํฌ๋ฆฐ์ƒท ๊ธฐ๋ฐ˜ ํ…Œ์ŠคํŠธ๋ฅผ ๋„์ž…ํ•  ๋•Œ, ์ปดํฌ๋„ŒํŠธ์˜ ๊ธฐ๋Šฅ์  ๋ณ€๊ฒฝ์ด ์—†๋”๋ผ๋„ ์••์ถ• ๋…ธ์ด์ฆˆ, ์•ˆํ‹ฐ์•จ๋ฆฌ์–ด์‹ฑ, ๋น„๋™๊ธฐ ์—์…‹(ํฐํŠธ ๋“ฑ), ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋“ฑ์œผ๋กœ ์ธํ•ด ๋ฏธ์„ธํ•œ ํ”ฝ์…€ ์ฐจ์ด๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ์˜ค๋ฅ˜๋กœ ์ฒ˜๋ฆฌ๋˜๋Š” ๊ฑฐ์ง“ ์–‘์„ฑ(False positive) ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [8, 12]. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ƒ‰์ƒ ์˜ค์ฐจ ํ—ˆ์šฉ ๋ฒ”์œ„(color-delta tolerance)๋ฅผ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์Œ์†Œ๊ฑฐํ•˜๋Š” ๋“ฑ์˜ ์ถ”๊ฐ€์ ์ธ ๊ตฌ์„ฑ(Configuration)๊ณผ ๊ด€๋ฆฌ๊ฐ€ ์š”๊ตฌ๋ฉ๋‹ˆ๋‹ค [8, 12, 13]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [ํ˜‘์—… ๋ฐ ํ˜•์ƒ ๊ด€๋ฆฌ ์›Œํฌํ”Œ๋กœ์šฐ] +- [[Pull Request (PR)]] + - ์—ฐ๊ฒฐ ์ด์œ : ์ฝ”๋“œ ๋ฆฌ๋ทฐ๊ฐ€ ์‹ค์งˆ์ ์œผ๋กœ ์š”์ฒญ๋˜๊ณ , ๊ฒ€ํ†  ํ”ผ๋“œ๋ฐฑ์ด ์˜ค๊ฐ€๋Š” ํ•ต์‹ฌ ํ”Œ๋žซํผ์ด์ž ๋‹จ์œ„์ž…๋‹ˆ๋‹ค [1, 2]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ธŒ๋žœ์น˜ ๋ณ‘ํ•ฉ ์ „ ํ’ˆ์งˆ ๊ด€๋ฆฌ ๊ฒŒ์ดํŠธ๋กœ์„œ์˜ ๊ธฐ๋Šฅ๊ณผ ์งง๊ณ  ๋ช…ํ™•ํ•œ ์ž‘์—… ๋‹จ์œ„ ๋ถ„ํ• ์˜ ์ค‘์š”์„ฑ์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +- [[Feature Branch Workflow]] + - ์—ฐ๊ฒฐ ์ด์œ : ์ฝ”๋“œ ๋ฆฌ๋ทฐ ์‹œ์Šคํ…œ์„ ์‰ฝ๊ฒŒ ๋„์ž…ํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ด๊ณ  ์ถฉ๋Œ์ด ์ ์€ ๋ธŒ๋žœ์น˜ ์ „๋žต์ž…๋‹ˆ๋‹ค [14, 15]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ฉ”์ธ ๋ธŒ๋žœ์น˜๋ฅผ ํ•ญ์ƒ ์•ˆ์ •์ ์œผ๋กœ ์œ ์ง€ํ•˜๋ฉด์„œ, ๊ฐ๊ฐ์˜ ํƒœ์Šคํฌ๋ฅผ ๋…๋ฆฝ๋œ ๋ธŒ๋žœ์น˜์—์„œ ์ž‘์—…ํ•˜๊ณ  ๋ฆฌ๋ทฐ๋ฅผ ํ†ตํ•ด ๊ฒ€์ฆํ•˜๋Š” ์ „์ฒด ํ๋ฆ„์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +#### [์ž๋™ํ™” ๋ฐ ํ’ˆ์งˆ ๊ฒ€์ฆ ๋„๊ตฌ] +- [[Visual Regression Testing]] + - ์—ฐ๊ฒฐ ์ด์œ : ํ”„๋ก ํŠธ์—”๋“œ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ์‹œ ์œก์•ˆ์œผ๋กœ ํ™•์ธํ•˜๊ธฐ ํž˜๋“  ์˜๋„์น˜ ์•Š์€ ๋ ˆ์ด์•„์›ƒ/์ƒ‰์ƒ ๋ณ€๊ฒฝ์„ ์ž๋™ํ™” ๋„๊ตฌ๊ฐ€ ์‹œ๊ฐ์ ์œผ๋กœ ์ฐพ์•„๋‚ด์–ด ๋ฆฌ๋ทฐ์–ด์—๊ฒŒ ์ œ์‹œํ•ฉ๋‹ˆ๋‹ค [3, 9]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Chromatic์ด๋‚˜ Happo๋ฅผ CI ํŒŒ์ดํ”„๋ผ์ธ๊ณผ ๊ฒฐํ•ฉํ•˜์—ฌ PR ๋ฆฌ๋ทฐ์˜ ์ •ํ™•๋„๋ฅผ ๋†’์ด๊ณ  ์•ˆ์ •์ ์ธ UI๋ฅผ ๋ฐฐํฌํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### Deeper Research Questions + +- PR์˜ ํฌ๊ธฐ๋ฅผ ์ž‘๊ฒŒ ์œ ์ง€ํ•˜๊ณ  ๋‹จ์ผ ์ž‘์—…(Single task)์— ์ง‘์ค‘ํ•˜๋„๋ก ๋…ผ๋ฆฌ์ ์œผ๋กœ ์ž‘์—…์„ ๋ถ„ํ• ํ•˜๋Š” ๊ฐ€์žฅ ํšจ๊ณผ์ ์ธ ๋ฐฉ๋ฒ•๋ก ๊ณผ ๊ธฐ์ค€์€ ๋ฌด์—‡์ธ๊ฐ€? +- ๋Œ€๊ทœ๋ชจ ํŒ€์—์„œ ์Ÿ์•„์ง€๋Š” ์ˆ˜๋งŽ์€ PR๊ณผ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ์š”์ฒญ์„ ๋ณ‘๋ชฉ ํ˜„์ƒ ์—†์ด ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋ฐฐํฌ ์†๋„๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? +- ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ(Visual Regression Testing) ์‹œ ๋ฐœ์ƒํ•˜๋Š” ๋ฏธ์„ธํ•œ ๋ Œ๋”๋ง ์ฐจ์ด(Flake)๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ  ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ์ค€์„ (Baseline)์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๊ตฌ์ฒด์ ์ธ ๊ตฌ์„ฑ ์ตœ์ ํ™” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? +- ์ฝ”๋“œ ๋ฆฌ๋ทฐ ์‹œ ์‹œ๊ฐ์  ํšŒ๊ท€(Visual changes) ๊ฐ์ง€๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ์ ‘๊ทผ์„ฑ ํ…Œ์ŠคํŠธ(Accessibility tests)๋ฅผ ํ•จ๊ป˜ ์ž๋™ํ™”ํ–ˆ์„ ๋•Œ ์–ป๊ฒŒ ๋˜๋Š” ์ด์ ๊ณผ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋‚ด๋ถ€ ๋™์ž‘ ์›๋ฆฌ๋Š” ๋ฌด์—‡์ธ๊ฐ€? +- ๊ธฐ๋Šฅ ๋ถ„๊ธฐ(Feature branch)์˜ ์ˆ˜๋ช…์ด ๊ธธ์–ด์กŒ์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ฆฌ๋ทฐ ๋ฐ ๋ณ‘ํ•ฉ ์ถฉ๋Œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ , ์ง€์†์ ์œผ๋กœ ์งง์€ ์ฃผ๊ธฐ์˜ ๋ฆฌ๋ทฐ๋ฅผ ์œ ๋„ํ•˜๋Š” ๋ฌธํ™”๋Š” ์–ด๋–ป๊ฒŒ ์ •์ฐฉ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š”๊ฐ€? + +### Practical Application Contexts + +- **Implementation:** ์ฝ”๋“œ๋ฅผ ์ปค๋ฐ‹ํ•˜๊ณ  PR์„ ์ƒ์„ฑํ•  ๋•Œ, ๋ฆฌ๋ทฐ์–ด๊ฐ€ ์‰ฝ๊ฒŒ ์ฝ”๋“œ๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋„๋ก 200์ค„ ๋ฏธ๋งŒ์˜ ์ž‘์€ ๋‹จ์œ„๋กœ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ชผ๊ฐœ์–ด ์˜ฌ๋ฆฌ๊ณ  ๋ฌด์—‡์ด ์™œ ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€ ๋ช…ํ™•ํžˆ ๋ช…์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [2, 7]. +- **System Design:** ํ”„๋ก ํŠธ์—”๋“œ ์„ค๊ณ„ ์‹œ Storybook์„ ํ™œ์šฉํ•˜์—ฌ ๋ชจ๋“  UI ์ปดํฌ๋„ŒํŠธ์˜ ๋‹ค์–‘ํ•œ ์ƒํƒœ(loading, error ๋“ฑ)๋ฅผ ์บก์Аํ™”ํ•ด ๋‘๋ฉด, ์ฝ”๋“œ ๋ฆฌ๋ทฐ ์‹œ์— ์ด ์ƒํƒœ๋“ค์„ ์ž๋™์œผ๋กœ ์Šคํฌ๋ฆฐ์ƒท์œผ๋กœ ์ฐ์–ด ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ฐ˜ ์‹œ์Šคํ…œ์ด ๋งŒ๋“ค์–ด์ง‘๋‹ˆ๋‹ค [16]. +- **Operation / Maintenance:** CI/CD ํŒŒ์ดํ”„๋ผ์ธ ๋‹จ๊ณ„์— Chromatic์ด๋‚˜ Happo ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์—ฐ๋™์‹œ์ผœ, ํŒ€์›์ด PR์„ ์ƒ์„ฑํ•  ๋•Œ๋งˆ๋‹ค ์‹œ๊ฐ์  ๋ณ€๋™ ์‚ฌํ•ญ(diff)์ด๋‚˜ ์ ‘๊ทผ์„ฑ ์œ„๋ฐ˜ ๋‚ด์—ญ์ด PR ์ฒดํฌ ๋ฆฌ์ŠคํŠธ์— ๋ฐฐ์ง€๋กœ ์ž๋™ ๋ณด๊ณ ๋˜๋„๋ก ์šด์˜ ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•ฉ๋‹ˆ๋‹ค [17]. +- **Learning Path:** Git์˜ ๊ธฐ์ดˆ์ ์ธ ๋ธŒ๋žœ์น˜ ์‚ฌ์šฉ๋ฒ•์„ ๋ฐฐ์šด ํ›„, ํŒ€ ํ˜‘์—…์˜ ํ•ต์‹ฌ์ธ PR ์ƒ์„ฑ ๋ฐ ๋ฆฌ๋ทฐ ์š”์ฒญ ๊ณผ์ •(GitHub Flow ๋“ฑ)์„ ์ตํžˆ๊ณ , ๋‚˜์•„๊ฐ€ ์‹œ๊ฐ์  ํ…Œ์ŠคํŒ… ๋„๊ตฌ๊ฐ€ PR์— ์–ด๋–ป๊ฒŒ ํ”ผ๋“œ๋ฐฑ์„ ์ฃผ๋Š”์ง€๋ฅผ ์‹ค์Šตํ•ด๋ณด๋Š” ํ๋ฆ„์œผ๋กœ ํ•™์Šตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [8, 18]. +- **My Project Relevance:** ์†Œ๊ทœ๋ชจ 3์ธ ํŒ€ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•  ๋•Œ ๋ณต์žกํ•œ Git-Flow ๋Œ€์‹  ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์ฑ„ํƒํ•˜๊ณ , ์ฝ”๋“œ ๋ณ‘ํ•ฉ ์‹œ ๋ฐ˜๋“œ์‹œ 1๋ช… ์ด์ƒ์˜ ํ”ผ์–ด ๋ฆฌ๋ทฐ(Peer review)๋ฅผ ๋ฐ›๋„๋ก ๊ทœ์น™์„ ์ •ํ•ด ๋ฒ„๊ทธ ์—†๋Š” ์•ˆ์ •์  ๋ฉ”์ธ ๋ธŒ๋žœ์น˜๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1, 14]. + +### Adjacent Topics + +- [[Continuous Integration (CI)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: PR์ด ์˜ฌ๋ผ์™”์„ ๋•Œ ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ๋•๊ธฐ ์œ„ํ•ด ์‚ฌ์ „์— ํ…Œ์ŠคํŠธ ํ†ต๊ณผ ์—ฌ๋ถ€, ๋นŒ๋“œ ์„ฑ๊ณต ์—ฌ๋ถ€ ๋“ฑ์„ ์ž๋™์œผ๋กœ ๊ฒ€์‚ฌํ•ด์ฃผ๋Š” ์ž๋™ํ™” ํŒŒ์ดํ”„๋ผ์ธ์˜ ๊ตฌ์ถ•์— ๋Œ€ํ•ด ํ•™์Šตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [7, 19]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Management/Git Workflow.md b/10_Wiki/Management/Git Workflow.md new file mode 100644 index 00000000..5dc64fac --- /dev/null +++ b/10_Wiki/Management/Git Workflow.md @@ -0,0 +1,75 @@ +# [[Git Workflow]] + +## ๐Ÿ“Œ Brief Summary +Git Workflow(๊นƒ ์›Œํฌํ”Œ๋กœ์šฐ)๋Š” ํŒ€ ํ™˜๊ฒฝ์—์„œ ์ฝ”๋“œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ด€๋ฆฌํ•˜๊ณ  ํ˜‘์—…ํ•˜๊ธฐ ์œ„ํ•œ ์ฒด๊ณ„์ ์ด๊ณ  ๊ตฌ์กฐํ™”๋œ ์ ‘๊ทผ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค [1, 2]. ์ด๋Š” ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜(Feature-branch), ํŠธ๋ ํฌ ๊ธฐ๋ฐ˜(Trunk-based), Git Flow ๋“ฑ ๋‹ค์–‘ํ•œ ์ „๋žต์„ ํฌ๊ด„ํ•˜๋ฉฐ, ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๊ณ  `main` ๋ธŒ๋žœ์น˜์˜ ๋ฐฐํฌ ๊ฐ€๋Šฅ ์ƒํƒœ๋ฅผ ๋ณด์žฅํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค [2-4]. ์ผ๊ด€๋œ ๋ธŒ๋žœ์น˜ ๋ช…๋ช… ๊ทœ์น™, ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ๊ทœ์•ฝ, ํ’€ ๋ฆฌํ€˜์ŠคํŠธ(PR)์™€ ๋ฆฌ๋ทฐ ์ ˆ์ฐจ๋ฅผ ๋„์ž…ํ•จ์œผ๋กœ์จ ์ž ์žฌ์ ์ธ ํ˜ผ๋ˆ์„ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ๋ฆด๋ฆฌ์Šค ํ๋ฆ„์œผ๋กœ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1, 5, 6]. + +## ๐Ÿ“– Core Content +* **์ฃผ์š” ๋ธŒ๋žœ์นญ ์ „๋žต (Main Branching Strategies):** + * **Feature-Branch Workflow (๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜ ์›Œํฌํ”Œ๋กœ์šฐ):** ์ฃผ ๋ธŒ๋žœ์น˜(`main`)๋ฅผ ํ•ญ์ƒ ์•ˆ์ •์ ์ด๊ณ  ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜๋ฉฐ, ์ƒˆ๋กœ์šด ์ž‘์—…์ด๋‚˜ ๋ฒ„๊ทธ ์ˆ˜์ •๋งˆ๋‹ค ์งง์€ ์ˆ˜๋ช…์˜ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜(์˜ˆ: `feature/login`)๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ž‘์—…ํ•ฉ๋‹ˆ๋‹ค [3, 4, 7]. ์†Œ๊ทœ๋ชจ ํŒ€์— ๋งค์šฐ ์ ํ•ฉํ•˜๋ฉฐ, ์˜ค๋ฒ„ํ—ค๋“œ ์—†์ด ์ฝ”๋“œ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [4, 8]. + * **Trunk-Based Development (ํŠธ๋ ํฌ ๊ธฐ๋ฐ˜ ๊ฐœ๋ฐœ):** ๊ฐ•๋ ฅํ•œ CI(์ง€์†์  ํ†ตํ•ฉ) ํ™˜๊ฒฝ์„ ๊ฐ–์ถ˜ ๊ฒฝํ—˜ ๋งŽ์€ ํŒ€์— ์ ํ•ฉํ•œ ๋ฐฉ์‹์œผ๋กœ, ์•„์ฃผ ์งง์€ ์ˆ˜๋ช…์˜ ๋ธŒ๋žœ์น˜๋ฅผ ์‚ฌ์šฉํ•ด ์ž์ฃผ `main`์— ์ฝ”๋“œ๋ฅผ ๋ณ‘ํ•ฉํ•˜์—ฌ ํ†ตํ•ฉ ์†๋„๋ฅผ ๋†’์ž…๋‹ˆ๋‹ค [8, 9]. + * **Git Flow:** `develop` ๋ฐ `release` ๋“ฑ ๋‹ค์ˆ˜์˜ ๋ธŒ๋žœ์น˜๋ฅผ ์šด์˜ํ•˜๋ฉฐ ์Šค์ผ€์ค„๋œ ๋ฆด๋ฆฌ์Šค๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์— ์ ํ•ฉํ•˜์ง€๋งŒ, ์†Œ๊ทœ๋ชจ ํŒ€์—๊ฒŒ๋Š” ๋„ˆ๋ฌด ๋ณต์žกํ•˜๊ณ  ๋ฌด๊ฑฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [8, 10]. + * **GitHub Flow:** ๊ธฐ๋Šฅ์„ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜์—์„œ ์ž‘์—…ํ•œ ๋’ค ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ํ†ตํ•ด ๋ฆฌ๋ทฐ๋ฐ›๊ณ  ๋ณ‘ํ•ฉํ•˜์—ฌ, `main`์—์„œ ๋ฐ”๋กœ ๋ฐฐํฌํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค [11, 12]. + +* **๋ช…๋ช… ๊ทœ์น™ ๋ฐ ์ถ”์ ์„ฑ (Naming Conventions & Traceability):** + * **๋ธŒ๋žœ์น˜ ์ด๋ฆ„:** ๋ธŒ๋žœ์น˜ ๋ชฉ์ ์„ ๋ช…ํ™•ํžˆ ํ•˜๊ธฐ ์œ„ํ•ด `feature/`, `bugfix/`์™€ ๊ฐ™์€ ์ ‘๋‘์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ํ‹ฐ์ผ“ ID๋ฅผ ํ•จ๊ป˜ ํฌํ•จ(์˜ˆ: `feature/PROJ-123-user-auth`)ํ•˜์—ฌ ์ด์Šˆ ํŠธ๋ž˜์ปค์™€์˜ ์ถ”์ ์„ฑ์„ ํ™•๋ณดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [13-15]. + * **์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€:** `type(scope): description` ํ˜•ํƒœ๋ฅผ ๋”ฐ๋ฅด๋Š” "Conventional Commits" ๊ทœ์•ฝ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค [6, 16]. ์˜ˆ๋ฅผ ๋“ค์–ด ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์€ `feat:`, ๋ฒ„๊ทธ ์ˆ˜์ •์€ `fix:`, ๋ฌธ์„œ ์ˆ˜์ •์€ `docs:` ๋“ฑ์œผ๋กœ ์‹œ์ž‘ํ•˜์—ฌ ๋ณ€๊ฒฝ์˜ ์˜๋„๋ฅผ ๋ช…ํ™•ํžˆ ํ•ฉ๋‹ˆ๋‹ค [6, 16]. + +* **ํ’€ ๋ฆฌํ€˜์ŠคํŠธ์™€ ๋ณ‘ํ•ฉ (Pull Requests & Merging):** + * `main` ๋ธŒ๋žœ์น˜์— ์ง์ ‘ ํ‘ธ์‹œ(Push)ํ•˜๋Š” ๊ฒƒ์„ ๊ธˆ์ง€ํ•˜๊ณ , ๋ฐ˜๋“œ์‹œ ํ’€ ๋ฆฌํ€˜์ŠคํŠธ(PR)๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ตœ์†Œ 1๋ช… ์ด์ƒ์˜ ๋™๋ฃŒ์—๊ฒŒ ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ›์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค [13, 17]. + * ์ฝ”๋“œ ๋ฆฌ๋ทฐ ์†๋„์™€ ํ’ˆ์งˆ์„ ์œ„ํ•ด PR์€ ์ž‘๊ณ  ๋…ผ๋ฆฌ์ ์ธ ๋‹จ์ผ ๋ณ€๊ฒฝ ์‚ฌํ•ญ(Atomic Commits) ๋‹จ์œ„๋กœ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [16, 18]. + * ๋ณ‘ํ•ฉ ์‹œ์—๋Š” ์Šค์ฟผ์‹œ ๋ณ‘ํ•ฉ(Squash merge)์„ ์‚ฌ์šฉํ•˜์—ฌ ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ณ , ๋ณ‘ํ•ฉ์ด ์™„๋ฃŒ๋œ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜๋Š” ์ž๋™์œผ๋กœ ์‚ญ์ œํ•˜์—ฌ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค [17-19]. + +## โš–๏ธ Trade-offs & Caveats +* **๊ตฌ์กฐ์˜ ๋ณต์žก์„ฑ vs. ํŒ€์˜ ๊ทœ๋ชจ:** Git Flow๋Š” ๋Œ€๊ทœ๋ชจ์˜ ๋ณต์žกํ•œ ๋ฆด๋ฆฌ์Šค ๊ณ„ํš์„ ์•ˆ์ „ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ํ”„๋กœ์„ธ์Šค ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ํฌ๊ณ  ๋ณ‘ํ•ฉ ์ง€์—ฐ์„ ์ดˆ๋ž˜ํ•ฉ๋‹ˆ๋‹ค [8, 20]. ๋ฐ˜๋ฉด, Feature-Branch ์›Œํฌํ”Œ๋กœ์šฐ๋‚˜ Trunk-Based ๋ฐฉ์‹์€ ์†Œ๊ทœ๋ชจ ํŒ€์ด ๋น ๋ฅด๊ณ  ๊ฐ€๋ณ๊ฒŒ ์›€์ง์ผ ์ˆ˜ ์žˆ๋„๋ก ๋•์ง€๋งŒ, ๊ทœ๋ชจ๊ฐ€ ์ปค์ง€๊ฑฐ๋‚˜ ์—„๊ฒฉํ•œ ๋ฆด๋ฆฌ์Šค ๋ฒ„์ „ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํ•œ๊ณ„์— ๋ถ€๋”ชํž ์ˆ˜ ์žˆ์–ด ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์ง„ํ™”(Migration)์‹œ์ผœ์•ผ ํ•ฉ๋‹ˆ๋‹ค [8, 10]. +* **๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜์˜ ์ˆ˜๋ช…๊ณผ ์ถฉ๋Œ:** ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜ ๋ฐฉ์‹์˜ ๊ฐ€์žฅ ํฐ ๋ถ€์ž‘์šฉ์€ ๋ธŒ๋žœ์น˜์˜ ์ˆ˜๋ช…์ด ๊ธธ์–ด์งˆ ๊ฒฝ์šฐ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์™€์˜ ์ฐจ์ด๊ฐ€ ์ปค์ ธ ์‹ฌ๊ฐํ•œ ๋ณ‘ํ•ฉ ์ถฉ๋Œ(Merge Conflict)์ด ๋ฐœ์ƒํ•œ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค [20, 21]. ์ด๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๊ฐœ๋ฐœ์ž๋Š” ์ž์ฃผ `main` ๋ธŒ๋žœ์น˜๋ฅผ ํ’€(Pull) ๋ฐ›๊ฑฐ๋‚˜ ๋ฆฌ๋ฒ ์ด์Šค(Rebase)ํ•˜์—ฌ ์ตœ์‹  ์ƒํƒœ๋ฅผ ๋™๊ธฐํ™”ํ•˜๋Š” ๋ถ€๊ฐ€์ ์ธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [19, 20]. +* **์™„์ „ํ•œ ์ถ”์ ์„ฑ์˜ ๋Œ€๊ฐ€:** ๋ชจ๋“  ๋ธŒ๋žœ์น˜์™€ ์ปค๋ฐ‹์— ํ‹ฐ์ผ“ ID ๋ถ€์—ฌ๋ฅผ ๊ฐ•์ œํ•˜๋ฉด ๋ฒ„๊ทธ ์ถ”์ ์ด๋‚˜ ๋ฆฌ๋ทฐ์— ์žˆ์–ด ์ปจํ…์ŠคํŠธ ํ™•๋ณด์—๋Š” ํƒ์›”ํ•˜๋‚˜ [5, 22], ์•„์ฃผ ๋‹จ์ˆœํ•˜๊ณ  ์‚ฌ์†Œํ•œ ์ฝ”๋“œ ์ˆ˜์ • ์ž‘์—…์—๋„ ๋ฐ˜๋“œ์‹œ ํ‹ฐ์ผ“์„ ์ƒ์„ฑํ•˜๊ณ  ์ ˆ์ฐจ๋ฅผ ๋ฐŸ์•„์•ผ ํ•˜๋Š” ์†๋„ ์ €ํ•˜์˜ ๋‹จ์ ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [23]. +* **Trunk-Based ์ „ํ™˜์˜ ์ „์ œ ์กฐ๊ฑด:** Trunk-Based Development๋กœ ์ „ํ™˜ํ•˜์—ฌ ๋น ๋ฅธ ํ†ตํ•ฉ์˜ ์ด์ ์„ ์–ป๊ณ ์ž ํ•œ๋‹ค๋ฉด, ์ฝ”๋“œ์˜ ๋ถˆ์•ˆ์ •์„ฑ์„ ๊ฐ์ถ”๊ธฐ ์œ„ํ•œ ๊ธฐ๋Šฅ ํ† ๊ธ€(Feature flags) ๊ธฐ๋ฒ•๊ณผ ๋ณ‘ํ•ฉ ์ „ ๊ฒฐํ•จ์„ ์žก์•„๋‚ผ ๊ฐ•๋ ฅํ•œ ํ…Œ์ŠคํŠธ ์ž๋™ํ™”(CI)๊ฐ€ ํ•„์ˆ˜์ ์œผ๋กœ ์š”๊ตฌ๋œ๋‹ค๋Š” ์ œ์•ฝ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค [12]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [๊ด€๊ณ„ ์œ ํ˜• A (์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ )] +- `[[Trunk-Based Development]]` + - ์—ฐ๊ฒฐ ์ด์œ : Git Workflow๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ํ•ต์‹ฌ ์ „๋žต ์ค‘ ํ•˜๋‚˜๋กœ, ๋น ๋ฅธ ํ†ตํ•ฉ์„ ๋ชฉ์ ์œผ๋กœ ํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก ์ž…๋‹ˆ๋‹ค [2]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์งง์€ ์ˆ˜๋ช…์˜ ๋ธŒ๋žœ์น˜, ๋นˆ๋ฒˆํ•œ ๋ณ‘ํ•ฉ, ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ(Feature Flags) ํ™œ์šฉ์ด ํ”„๋กœ์ ํŠธ ๋ฐฐํฌ ์†๋„์— ์–ด๋–ป๊ฒŒ ๊ธฐ์—ฌํ•˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [9, 12]. + +- `[[Git Flow]]` + - ์—ฐ๊ฒฐ ์ด์œ : ๊ตฌ์กฐ๊ฐ€ ๋ณต์žกํ•œ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์˜ ๋ฆด๋ฆฌ์Šค๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ์ „ํ†ต์  ๋ธŒ๋žœ์นญ ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค [2, 10]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: `develop`, `release`, `hotfix` ๋“ฑ ๋‹ค์ค‘ ๋ธŒ๋žœ์น˜ ์ „๋žต์ด ์™œ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์œ ๋ฐœํ•˜๋ฉด์„œ๋„ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉ๋˜๋Š”์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [8, 10]. + +#### [๊ด€๊ณ„ ์œ ํ˜• B (๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ)] +- `[[Conventional Commits]]` + - ์—ฐ๊ฒฐ ์ด์œ : ํŒ€์˜ ์ผ๊ด€๋œ ์ฝ”๋“œ๋ฒ ์ด์Šค ํžˆ์Šคํ† ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด Git ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ์ž‘์„ฑ์— ์ ์šฉ๋˜๋Š” ์—…๊ณ„ ํ‘œ์ค€ ๊ทœ์น™์ž…๋‹ˆ๋‹ค [6, 16]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: `feat:`, `fix:`, `chore:`์™€ ๊ฐ™์€ ์ ‘๋‘์‚ฌ๊ฐ€ ๋ฆฌ๋ทฐ์–ด์˜ ์ฝ”๋“œ ์ดํ•ด๋„๋ฅผ ์–ด๋–ป๊ฒŒ ๋†’์ด๊ณ  ์ž๋™ํ™”๋œ ๋ฆด๋ฆฌ์Šค์— ๊ธฐ์—ฌํ•˜๋Š”์ง€ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [6, 16]. + +- `[[Pull Requests (PR)]]` + - ์—ฐ๊ฒฐ ์ด์œ : ๋ธŒ๋žœ์น˜์˜ ์ฝ”๋“œ๋ฅผ `main`์œผ๋กœ ๋ณ‘ํ•ฉํ•˜๊ธฐ ์ „, ํ˜‘์—… ํŒ€์›๋“ค์ด ์ฝ”๋“œ๋ฅผ ๊ฒ€ํ† ํ•˜๋Š” ํ•ต์‹ฌ ๊ด€๋ฌธ์ž…๋‹ˆ๋‹ค [13, 16]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ธŒ๋žœ์น˜ ๋ณดํ˜ธ ์„ค์ •, ๋™๋ฃŒ ๋ฆฌ๋ทฐ ์š”๊ตฌ(1 review required), ์ง€์†์  ํ†ตํ•ฉ(CI) ์ฒดํฌ๊ฐ€ ์‹œ์Šคํ…œ ์•ˆ์ •์„ฑ ์œ ์ง€์— ์–ด๋–ป๊ฒŒ ํ•„์ˆ˜์ ์œผ๋กœ ์ž‘์šฉํ•˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [16, 17]. + +- `[[Ticket IDs (Traceability)]]` + - ์—ฐ๊ฒฐ ์ด์œ : ์ฝ”๋“œ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์–ด๋–ค ๋น„์ฆˆ๋‹ˆ์Šค ์š”๊ตฌ์‚ฌํ•ญ(์˜ˆ: Jira ํ‹ฐ์ผ“)์— ์˜ํ•ด ๋ฐœ์ƒํ–ˆ๋Š”์ง€๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๋„๊ตฌ์  ์žฅ์น˜์ž…๋‹ˆ๋‹ค [5, 22]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: `PROJ-123` ํ˜•ํƒœ์˜ ํ‹ฐ์ผ“ ๋ฒˆํ˜ธ๋ฅผ ๋ธŒ๋žœ์น˜์™€ ์ปค๋ฐ‹์— ์‚ฝ์ž…ํ•จ์œผ๋กœ์จ ๋ฆฌ๋ทฐ์–ด์—๊ฒŒ ๋งฅ๋ฝ์„ ์ œ๊ณตํ•˜๊ณ , ๋ฌธ์„œํ™” ๋ฐ ์ž‘์—… ์ถ”์ (Traceability)์„ ์–ด๋–ป๊ฒŒ ๋‹ฌ์„ฑํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5, 22]. + +### Deeper Research Questions +- ์†Œ๊ทœ๋ชจ ํŒ€์ด ์„ฑ์žฅํ•˜์—ฌ ๋ณต์žก์„ฑ์ด ์ฆ๊ฐ€ํ•  ๋•Œ, Feature Branch Workflow์—์„œ Git Flow๋กœ ์•ˆ์ „ํ•˜๊ฒŒ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋ ค๋ฉด ์–ด๋–ค ์ ˆ์ฐจ์™€ ํŒ€ ๋‚ด ๊ต์œก์ด ํ•„์š”ํ•œ๊ฐ€? +- Trunk-Based Development๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ๋„์ž…ํ•˜๊ธฐ ์œ„ํ•ด CI/CD(์ง€์†์  ํ†ตํ•ฉ/๋ฐฐํฌ) ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ๋ฐ˜๋“œ์‹œ ๊ตฌ์„ฑํ•ด์•ผ ํ•˜๋Š” ์ž๋™ํ™” ํ…Œ์ŠคํŠธ ์กฐ๊ฑด์€ ๋ฌด์—‡์ธ๊ฐ€? +- Conventional Commits ์‹œ์Šคํ…œ๊ณผ ์—ฐ๋™ํ•˜์—ฌ ์ž๋™ ๋ฆด๋ฆฌ์Šค ๋…ธํŠธ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์‹œ๋งจํ‹ฑ ๋ฒ„์ €๋‹(Semantic Versioning)์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ธฐ์ˆ ์  ์›๋ฆฌ๋Š” ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”๊ฐ€? +- ๋‹ค์ˆ˜์˜ ์ž‘์—…์ž๊ฐ€ ๊ฒน์น˜๋Š” ์˜์—ญ์„ ์ˆ˜์ •ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” Merge Conflict๋ฅผ ์˜ˆ๋ฐฉํ•˜๊ธฐ ์œ„ํ•ด, 'Atomic Commits'์™€ '์ž์ฃผ ๋ณ‘ํ•ฉํ•˜๊ธฐ' ์›์น™์€ ์‹ค๋ฌด์—์„œ ์–ด๋–ป๊ฒŒ ๊ตฌ์ฒด์ ์œผ๋กœ ์ ์šฉ๋˜์–ด์•ผ ํ•˜๋Š”๊ฐ€? +- ์ฝ”๋“œ ๋ฆฌ๋ทฐ์˜ ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด PR์˜ ๊ทœ๋ชจ๋ฅผ ์ž‘๊ฒŒ(์˜ˆ: 200์ค„ ์ดํ•˜) ์œ ์ง€ํ•˜๋ฉด์„œ๋„ ๋…ผ๋ฆฌ์ ์ธ ๊ธฐ๋Šฅ ๋‹จ์œ„๋ฅผ ํ›ผ์†ํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ ๋ถ„ํ•  ๊ธฐ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? + +### Practical Application Contexts +- **Implementation:** ์ƒˆ๋กœ์šด ์ž‘์—…์„ ์‹œ์ž‘ํ•  ๋•Œ ๋ฌด์กฐ๊ฑด `git checkout -b feature/ํ‹ฐ์ผ“ID-์ž‘์—…๋ช…`์œผ๋กœ ๋…๋ฆฝ์ ์ธ ๋ธŒ๋žœ์น˜๋ฅผ ํŒŒ๊ณ , ์™„๋ฃŒ ํ›„ `feat:` ๋“ฑ์˜ ๊ทœ์น™์„ ๋”ฐ๋ฅธ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๋ฅผ ์ž‘์„ฑํ•œ ๋’ค `main` ๋ธŒ๋žœ์น˜์— PR์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค [6, 7, 13, 22]. +- **System Design:** GitHub์™€ ๊ฐ™์€ ํ˜ธ์ŠคํŒ… ํ”Œ๋žซํผ์—์„œ `main` ๋ธŒ๋žœ์น˜ ๋ณดํ˜ธ(Branch Protection) ์˜ต์…˜์„ ํ™œ์„ฑํ™”ํ•˜์—ฌ ์ง์ ‘ ํ‘ธ์‹œ๋ฅผ ๋ง‰๊ณ , CI ๋นŒ๋“œ ํ†ต๊ณผ์™€ ์ตœ์†Œ 1์ธ์˜ ์Šน์ธ์ด ์žˆ์–ด์•ผ ๋ณ‘ํ•ฉ๋˜๋„๋ก ์‹œ์Šคํ…œ์„ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค [17]. +- **Operation / Maintenance:** ๋ธŒ๋žœ์น˜๊ฐ€ ๋ณ‘ํ•ฉ๋  ๋•Œ๋งˆ๋‹ค ์Šค์ฟผ์‹œ ๋ณ‘ํ•ฉ(Squash and merge)์„ ๊ฐ•์ œํ•˜์—ฌ ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๋‹จ์ผ ํ•ญ๋ชฉ์œผ๋กœ ์••์ถ•ํ•˜๊ณ , ๋ณ‘ํ•ฉ ํ›„ ๋‚จ์€ ๋ธŒ๋žœ์น˜๋ฅผ ์ž๋™ ์‚ญ์ œ(Auto-delete) ์„ค์ •ํ•˜์—ฌ ์ €์žฅ์†Œ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์šด์˜ํ•ฉ๋‹ˆ๋‹ค [17-19]. +- **Learning Path:** Git์— ์ž…๋ฌธํ•˜๋Š” ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ์šฐ, ๋ณต์žกํ•œ `develop` ๋ธŒ๋žœ์น˜ ์—†์ด `main` ๋ธŒ๋žœ์น˜ ํ•˜๋‚˜์™€ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜๋“ค๋กœ๋งŒ ๊ตฌ์„ฑ๋œ ๊ฐ€๋ฒผ์šด ์›Œํฌํ”Œ๋กœ์šฐ(Feature-Branch Workflow)๋ฅผ ๋จผ์ € ํ•™์Šตํ•˜๊ณ  ์ฒดํ™”ํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค [4, 8]. +- **My Project Relevance:** ํ˜„์žฌ ์ง„ํ–‰ํ•˜๋Š” 3์ธ ๊ทœ๋ชจ์˜ ํ”„๋กœ์ ํŠธ ๋“ฑ์—์„œ๋Š” Git Flow์˜ ๋ฌด๊ฑฐ์šด ์ ˆ์ฐจ๋ฅผ ํ”ผํ•˜๊ณ , ํ•ญ์ƒ ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ ์•ˆ์ •์ ์ธ `main` ๋ธŒ๋žœ์น˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์งง์€ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋น ๋ฅธ ๋ฆฌ๋ทฐ์™€ ํ”ผ๋“œ๋ฐฑ์„ ์ฃผ๊ณ ๋ฐ›๋Š” ๋ฐฉ์‹์„ ์ฆ‰๊ฐ ๋„์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [4, 8]. + +### Adjacent Topics +- `[[CI/CD (Continuous Integration/Continuous Deployment)]]` + - ํ™•์žฅ ๋ฐฉํ–ฅ: PR์„ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ๋ณ‘ํ•ฉํ•  ๋•Œ ์ฝ”๋“œ๋ฅผ ์ž๋™์œผ๋กœ ํ…Œ์ŠคํŠธํ•˜๊ณ  ๋นŒ๋“œ, ๋ฐฐํฌํ•˜๋Š” ์ธํ”„๋ผ ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์„ฑ ๋ฐฉ๋ฒ•๋ก ์œผ๋กœ ํ™•์žฅํ•˜์—ฌ ์กฐ์‚ฌ. +- `[[Semantic Versioning (SemVer)]]` + - ํ™•์žฅ ๋ฐฉํ–ฅ: Git ํƒœ๊ทธ(Tag)์™€ Conventional Commits๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์†Œํ”„ํŠธ์›จ์–ด์˜ ๋ฒ„์ „์„ ์ฒด๊ณ„์ ์ด๊ณ  ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ๋ถ€์—ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ํ™•์žฅ. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Management/GitHub Flow.md b/10_Wiki/Management/GitHub Flow.md new file mode 100644 index 00000000..2214b4bc --- /dev/null +++ b/10_Wiki/Management/GitHub Flow.md @@ -0,0 +1,64 @@ +# [[GitHub Flow]] + +## ๐Ÿ“Œ Brief Summary +GitHub Flow๋Š” ๋ณต์žกํ•œ Git Flow์˜ ๋Œ€์•ˆ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ฐ€๋ณ๊ณ  ๋‹จ์ˆœํ•œ ๋ธŒ๋žœ์น˜ ๊ธฐ๋ฐ˜ ์›Œํฌํ”Œ๋กœ์šฐ์ž…๋‹ˆ๋‹ค [1, 2]. ์ด ๋ฐฉ์‹์€ ํ•ญ์ƒ ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ(deployable)๋ฅผ ์œ ์ง€ํ•˜๋Š” `main` ๋ธŒ๋žœ์น˜๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ์ž‘๋™ํ•˜๋ฉฐ, ๊ฐœ๋ฐœ์ž๋Š” ์ƒˆ๋กœ์šด ์ž‘์—…์„ ์œ„ํ•ด ์งง์€ ์ฃผ๊ธฐ์˜ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜(feature branch)๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค [3-5]. ๋ณ€๊ฒฝ๋œ ์ฝ”๋“œ๋Š” ๋™๋ฃŒ์˜ ์ฝ”๋“œ ๋ฆฌ๋ทฐ์™€ CI/CD ํ…Œ์ŠคํŠธ๋ฅผ ๋ชจ๋‘ ํ†ต๊ณผํ•œ ํ›„ ์˜ค์ง Pull Request(PR)๋ฅผ ํ†ตํ•ด์„œ๋งŒ `main`์— ๋ณ‘ํ•ฉ๋ฉ๋‹ˆ๋‹ค [1, 6]. + +## ๐Ÿ“– Core Content +* **์•ˆ์ •์ ์ธ `main` ๋ธŒ๋žœ์น˜ ์œ ์ง€** + GitHub Flow์˜ ํ•ต์‹ฌ์€ `main` (๋˜๋Š” `master`) ๋ธŒ๋žœ์น˜๊ฐ€ ํ•ญ์ƒ ์•ˆ์ •์ ์ด๊ณ  ์–ธ์ œ๋“  ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ์—ฌ์•ผ ํ•œ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค [3-5]. ๊ฐœ๋ฐœ์ž๋Š” ์–ด๋– ํ•œ ๊ฒฝ์šฐ์—๋„ `main` ๋ธŒ๋žœ์น˜์— ์ง์ ‘ ์ปค๋ฐ‹(direct commit)ํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค [1, 6, 7]. +* **๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜(Feature Branch) ๊ธฐ๋ฐ˜ ์ž‘์—…** + ๋ชจ๋“  ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ, ๋ฒ„๊ทธ ์ˆ˜์ •, ๋ฌธ์„œ ์ž‘์—… ๋“ฑ์€ `main`์—์„œ ํŒŒ์ƒ๋œ ์งง์€ ์ˆ˜๋ช…(short-lived)์˜ ์ „์šฉ ๋ธŒ๋žœ์น˜์—์„œ ์ˆ˜ํ–‰๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [3-5]. ๋ธŒ๋žœ์น˜ ์ด๋ฆ„์€ `feature/user-auth` ๋˜๋Š” `bugfix/login-error`์™€ ๊ฐ™์ด ์„ค๋ช…์ ์ด์–ด์•ผ ํ•˜๋ฉฐ, ๊ฐ€๋Šฅํ•˜๋ฉด ํ‹ฐ์ผ“ ID(์˜ˆ: `PROJ-123`)๋ฅผ ํฌํ•จํ•˜์—ฌ ์ถ”์ ์„ฑ์„ ๋†’์ด๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค [8, 9]. +* **Pull Request (PR) ๋ฐ ์ฝ”๋“œ ๋ฆฌ๋ทฐ** + ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด `main` ๋ธŒ๋žœ์น˜๋กœ ๋ณ‘ํ•ฉํ•˜๊ธฐ ์œ„ํ•ด PR์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค [6, 10]. ๋ณ‘ํ•ฉ ์ „์—๋Š” ๋ฐ˜๋“œ์‹œ ์ตœ์†Œ 1๋ช… ์ด์ƒ์˜ ํŒ€์›์—๊ฒŒ ์ฝ”๋“œ ๋ฆฌ๋ทฐ(Peer Review)๋ฅผ ๋ฐ›์•„์•ผ ํ•˜๋ฉฐ, CI/CD ํ™˜๊ฒฝ์—์„œ์˜ ์ž๋™ํ™” ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [1, 6, 8]. ์ด๋Š” ํ˜ผ์ž์„œ ์ž˜๋ชป๋œ ์ฝ”๋“œ๋ฅผ ๋ณ‘ํ•ฉํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๋Š” ์•ˆ์ „์žฅ์น˜์ž…๋‹ˆ๋‹ค [8]. +* **๋ณ‘ํ•ฉ ๊ทœ์น™๊ณผ ์ •๋ฆฌ** + ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด PR์„ ๋ณ‘ํ•ฉํ•  ๋•Œ๋Š” 'Squash Merge' ๋ฐฉ์‹์„ ์ฃผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค [6, 7, 11]. ์„ฑ๊ณต์ ์œผ๋กœ ๋ณ‘ํ•ฉ๋œ ์ดํ›„์—๋Š” ๋ถˆํ•„์š”ํ•œ ๋ธŒ๋žœ์น˜๊ฐ€ ์Œ“์ด์ง€ ์•Š๋„๋ก ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜๋ฅผ ์ฆ‰์‹œ ์‚ญ์ œ(auto-delete)ํ•ฉ๋‹ˆ๋‹ค [6, 8, 11]. +* **์›Œํฌํ”Œ๋กœ์šฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ (Migration)** + ํŒ€์ด ๊ธฐ์กด์˜ ๋ณต์žกํ•œ Git Flow์—์„œ GitHub Flow๋กœ ์ „ํ™˜ํ•˜์—ฌ ํ†ตํ•ฉ ์†๋„๋ฅผ ๋†’์ด๊ณ  ๋‹จ์ˆœํ™”ํ•˜๋ ค๋ฉด, ๋ฆด๋ฆฌ์Šค ๋ธŒ๋žœ์น˜(release branch) ์ƒ์„ฑ์„ ์ค‘๋‹จํ•˜๊ณ , `develop` ๋ธŒ๋žœ์น˜๋ฅผ `main`์œผ๋กœ ํ†ตํ•ฉํ•œ ๋’ค, `main` ๋ธŒ๋žœ์น˜์—์„œ ์ง์ ‘ ๋ฐฐํฌํ•˜๋„๋ก CI/CD ํŒŒ์ดํ”„๋ผ์ธ์„ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [2]. ๋ฐ˜๋Œ€๋กœ ํ”„๋กœ์ ํŠธ์˜ ๊ตฌ์กฐ๊ฐ€ ๋” ๋ณต์žกํ•ด์ง€๋ฉด `develop` ๋ธŒ๋žœ์น˜ ๋“ฑ์„ ์ถ”๊ฐ€ํ•ด Git Flow๋กœ ๋˜๋Œ์•„๊ฐˆ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค [12]. + +## โš–๏ธ Trade-offs & Caveats +* **๋ณ‘ํ•ฉ ์ฝ”๋“œ์˜ ์ฆ‰๊ฐ์ ์ธ ๋ฆฌ์Šคํฌ**: `main` ๋ธŒ๋žœ์น˜๊ฐ€ ์œ ์ผํ•œ ๋ฐฐํฌ ๊ธฐ์ค€์ ์ด ๋˜๋ฏ€๋กœ, ๋ฆฌ๋ทฐ๋‚˜ ํ…Œ์ŠคํŠธ๊ฐ€ ๋ˆ„๋ฝ๋˜์–ด ๋ฒ„๊ทธ๊ฐ€ ํฌํ•จ๋œ ์ฝ”๋“œ๊ฐ€ ๋ณ‘ํ•ฉ๋  ๊ฒฝ์šฐ ํ”„๋กœ๋•์…˜(์šด์˜) ํ™˜๊ฒฝ์— ์น˜๋ช…์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [13, 14]. ๋”ฐ๋ผ์„œ ๊ฐ•๋ ฅํ•œ CI/CD ์ž๋™ํ™” ํ™˜๊ฒฝ๊ณผ Branch Protection Rule(๋ณดํ˜ธ ๊ทœ์น™)์ด ํ•„์ˆ˜์ ์œผ๋กœ ๋’ท๋ฐ›์นจ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [1, 6]. +* **๋ธŒ๋žœ์น˜ ์ˆ˜๋ช… ๊ด€๋ฆฌ์˜ ์–ด๋ ค์›€**: ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜๊ฐ€ ๋„ˆ๋ฌด ์˜ค๋ž˜ ์œ ์ง€(Long-lived)๋˜๋ฉด `main` ๋ธŒ๋žœ์น˜์™€์˜ ์ฐจ์ด๊ฐ€ ๋ฒŒ์–ด์ ธ ์‹ฌ๊ฐํ•œ ๋ณ‘ํ•ฉ ์ถฉ๋Œ(Merge Conflict)์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [13, 15]. ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐœ๋ฐœ์ž๋Š” ๋งค์ผ ์ž‘์—… ์ „ `main` ๋ธŒ๋žœ์น˜์˜ ์ตœ์‹  ์ƒํƒœ๋ฅผ ๋‹น๊ฒจ์˜ค๊ณ (pull/rebase) ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ž‘๊ฒŒ ์œ ์ง€ํ•˜๋Š” ๊ทœ์œจ์„ ์—„๊ฒฉํžˆ ์ง€์ผœ์•ผ ํ•ฉ๋‹ˆ๋‹ค [11, 13]. +* **๋Œ€๊ทœ๋ชจ/์ •๊ธฐ ๋ฆด๋ฆฌ์Šค ํ”„๋กœ์ ํŠธ์—์„œ์˜ ํ•œ๊ณ„**: ์ •ํ•ด์ง„ ์ผ์ •์— ๋”ฐ๋ผ ๋ฒ„์ „์„ ๋ฌถ์–ด์„œ ๋ฐฐํฌํ•ด์•ผ ํ•˜๊ฑฐ๋‚˜, ์œ ์ง€๋ณด์ˆ˜ํ•ด์•ผ ํ•  ๊ณผ๊ฑฐ ๋ฆด๋ฆฌ์Šค ๋ฒ„์ „์ด ์—ฌ๋Ÿฌ ๊ฐœ์ธ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ์šฐ, ๋ฆด๋ฆฌ์Šค ๋ธŒ๋žœ์น˜๊ฐ€ ์—†๋Š” GitHub Flow๋Š” ๊ตฌ์กฐ์  ํ•œ๊ณ„๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ์—๋Š” ๋ฌด๊ฒ๋”๋ผ๋„ Git Flow๊ฐ€ ๋” ์ ํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [12, 16]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [๊ด€๊ณ„ ์œ ํ˜• A: ์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ  (๊ฐœ๋ฐœ ์›Œํฌํ”Œ๋กœ์šฐ)] +- [[Git Flow]] + - ์—ฐ๊ฒฐ ์ด์œ : GitHub Flow์™€ ์ž์ฃผ ๋น„๊ต๋˜๋Š” ๋ถ„๊ธฐ ์ „๋žต์œผ๋กœ, ํ”„๋กœ์ ํŠธ์˜ ๋ณต์žก์„ฑ์— ๋”ฐ๋ผ ๋‘ ์ „๋žต ์‚ฌ์ด๋ฅผ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค [2, 12]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: `develop`, `release`, `hotfix` ๋ธŒ๋žœ์น˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” Git Flow๋ฅผ ์ดํ•ดํ•จ์œผ๋กœ์จ, ์ƒ๋Œ€์ ์œผ๋กœ GitHub Flow๊ฐ€ ์ƒ๋žตํ•œ ๊ตฌ์กฐ์  ๋ณต์žก์„ฑ๊ณผ ๊ทธ์— ๋”ฐ๋ฅธ ์†๋„/๋‹จ์ˆœ์„ฑ์˜ ์ด์ ์„ ๋ช…ํ™•ํžˆ ๋น„๊ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[Trunk-Based Development]] + - ์—ฐ๊ฒฐ ์ด์œ : ์†Œ๊ทœ๋ชจ ํŒ€์—์„œ ๋น ๋ฅด๊ณ  ์ถฉ๋Œ ์—†๋Š” ๋ณ‘ํ•ฉ์„ ์œ„ํ•ด ๋„์ž…ํ•  ์ˆ˜ ์žˆ๋Š” ๋˜ ๋‹ค๋ฅธ ๊ฒฝ๋Ÿ‰ ์›Œํฌํ”Œ๋กœ์šฐ์ž…๋‹ˆ๋‹ค [3, 16]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ทน๋‹จ์ ์œผ๋กœ ์งง์€ ์ƒ๋ช…์ฃผ๊ธฐ์˜ ๋ธŒ๋žœ์น˜๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋ฉ”์ธ์— ๋นˆ๋ฒˆํžˆ ์ง์ ‘ ๋ณ‘ํ•ฉํ•˜๋Š” ์ฒ ํ•™์„ ํ†ตํ•ด CI(์ง€์†์  ํ†ตํ•ฉ)์˜ ๋ณธ์งˆ์„ ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +#### [๊ด€๊ณ„ ์œ ํ˜• B: ๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ] +- [[Pull Request]] + - ์—ฐ๊ฒฐ ์ด์œ : GitHub Flow์—์„œ ์ฝ”๋“œ ๋ณ‘ํ•ฉ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ํŒ€์› ๊ฐ„์˜ ํ˜‘์—… ๋ฐ ๋ฆฌ๋ทฐ๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ๊ฐ€์žฅ ํ•ต์‹ฌ์ ์ธ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค [8, 10]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ฝ”๋“œ ํ’ˆ์งˆ ํ†ต์ œ, ํ”ผ์–ด ๋ฆฌ๋ทฐ(Peer Review)์˜ ์—ญํ•  ๋ฐ CI/CD ํ›…(Hook)์ด ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์„ ๊ตฌ์ฒด์ ์œผ๋กœ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[CI/CD]] + - ์—ฐ๊ฒฐ ์ด์œ : `main` ๋ธŒ๋žœ์น˜๋ฅผ ํ•ญ์ƒ ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐฐํ›„์—์„œ ์ฝ”๋“œ๋ฅผ ๊ฒ€์ฆํ•˜๋Š” ํ•„์ˆ˜ ์ž๋™ํ™” ํŒŒ์ดํ”„๋ผ์ธ์ž…๋‹ˆ๋‹ค [1, 6]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์™œ ์ˆ˜๋™ ๋ณ‘ํ•ฉ์ด ์œ„ํ—˜ํ•œ์ง€, PR ๋ฆฌ๋ทฐ๊ฐ€ ๋๋‚œ ์ฝ”๋“œ๊ฐ€ ์–ด๋–ป๊ฒŒ ์•ˆ์ „ํ•˜๊ฒŒ ํ”„๋กœ๋•์…˜ ๋ ˆ๋ฒจ๊นŒ์ง€ ๋ฐฐํฌ๋˜๋Š”์ง€์˜ ์ „ ๊ณผ์ •์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### Deeper Research Questions +- Git Flow ๊ธฐ๋ฐ˜ ํ”„๋กœ์ ํŠธ์—์„œ GitHub Flow๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ๋•Œ, ๊ธฐ์กด์˜ ๋ฒ„์ „ ๊ด€๋ฆฌ ์ฒด๊ณ„ ๋ฐ ๋ฐฐํฌ ์ž๋™ํ™” ํŒŒ์ดํ”„๋ผ์ธ์„ ์–ด๋–ป๊ฒŒ ์žฌ์„ค๊ณ„ํ•ด์•ผ ํ•˜๋Š”๊ฐ€? +- GitHub Flow ํ™˜๊ฒฝ์—์„œ ๊ธฐ๋Šฅ์ด ๋ฏธ์™„์„ฑ๋œ ์ƒํƒœ๋กœ `main`์— ๋ณ‘ํ•ฉ๋˜์–ด์•ผ ํ•  ๋•Œ, Feature Flag(๊ธฐ๋Šฅ ํ† ๊ธ€)๋ฅผ ์–ด๋–ป๊ฒŒ ํšจ๊ณผ์ ์œผ๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- ํŒ€ ๊ทœ๋ชจ๊ฐ€ 3~5์ธ์—์„œ 20์ธ ์ด์ƒ์œผ๋กœ ๊ธ‰๊ฒฉํžˆ ์„ฑ์žฅํ•  ๋•Œ, GitHub Flow์˜ ํ•œ๊ณ„์ ์€ ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ๋‚˜ํƒ€๋‚˜๋ฉฐ ์–ด๋–ค ์‹œ์ ์— ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์ „ํ™˜ํ•ด์•ผ ํ•˜๋Š”๊ฐ€? +- ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ์ •๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๊ถŒ์žฅ๋˜๋Š” Squash Merge ๋ฐฉ์‹์ด ์žฅ๊ธฐ์ ์ธ ๋ฒ„๊ทธ ์ถ”์ ์„ฑ(Traceability) ๊ด€์ ์—์„œ๋Š” ์–ด๋–ค ๋‹จ์ ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- Branch Protection์„ ํ†ตํ•ด '์ตœ์†Œ 1์ธ์˜ ๋ฆฌ๋ทฐ'์™€ 'CI ํ†ต๊ณผ'๋ฅผ ๊ฐ•์ œํ•  ๋•Œ, ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ํ”„๋กœ์„ธ์Šค์  ์ตœ์ ํ™” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? + +### Practical Application Contexts +- **Implementation:** ๊ฐœ๋ฐœ์ž๋Š” JIRA ๋“ฑ์—์„œ ํ• ๋‹น๋ฐ›์€ ํ‹ฐ์ผ“ ID๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ `feature/PROJ-123-login` ํ˜•์‹์˜ ๋ธŒ๋žœ์น˜๋ฅผ ๋”ฐ๊ณ , ํ•œ ๊ฐ€์ง€ ๋…ผ๋ฆฌ์  ๋ณ€๊ฒฝ์‚ฌํ•ญ๋งŒ ๋‹ด์€ Atomic Commit์„ ์ˆ˜ํ–‰ํ•œ ๋’ค PR์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. +- **System Design:** GitHub/GitLab ๋“ฑ์˜ ๋ ˆํฌ์ง€ํ† ๋ฆฌ ์„ค์ •์—์„œ `main` ๋ธŒ๋žœ์น˜์— ๋Œ€ํ•ด ์ง์ ‘ ํ‘ธ์‹œ(Direct Push)๋ฅผ ์ฐจ๋‹จํ•˜๊ณ , Status Check(ํ…Œ์ŠคํŠธ ํ†ต๊ณผ) ๋ฐ ์ง€์ •๋œ ๋ฆฌ๋ทฐ์–ด์˜ Approve๋ฅผ ๊ฐ•์ œํ•˜๋Š” ๋ณดํ˜ธ ๊ทœ์น™(Branch Protection)์„ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค. +- **Operation / Maintenance:** CI/CD ํŒŒ์ดํ”„๋ผ์ธ์ด `main` ๋ธŒ๋žœ์น˜์˜ ๋ณ€๊ฒฝ์„ ๊ฐ์ง€ํ•˜๋ฉด ์ž๋™์œผ๋กœ ํ”„๋กœ๋•์…˜์— ๋ฐฐํฌ๋˜๋„๋ก ๊ตฌ์„ฑํ•˜๊ณ , ์ €์žฅ์†Œ์˜ ๊น”๋”ํ•œ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ๋ณ‘ํ•ฉ๋œ ๋ธŒ๋žœ์น˜๋Š” ์‹œ์Šคํ…œ์—์„œ ์ž๋™ ์‚ญ์ œ๋˜๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. +- **Learning Path:** Git ๋ธŒ๋žœ์น˜ ๊ธฐ์ดˆ ๋ช…๋ น์–ด ์ˆ™์ง€ -> 1๊ธฐ๋Šฅ 1๋ธŒ๋žœ์น˜ ์›์น™ ์‹ค์Šต -> PR ์ž‘์„ฑ ๋ฐ ๋™๋ฃŒ ๋ฆฌ๋ทฐ ๊ฒฝํ—˜ -> ์ž๋™ํ™”๋œ CI/CD์™€์˜ ์—ฐ๋™ ์ดํ•ด์˜ ์ˆœ์„œ๋กœ ํ˜‘์—… ๋Šฅ๋ ฅ์„ ์„ฑ์žฅ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- **My Project Relevance:** 3~5๋ช…์˜ ์†Œ๊ทœ๋ชจ ํŒ€์—์„œ ์ถฉ๋Œ์„ ์ตœ์†Œํ™”ํ•˜๋ฉด์„œ๋„ ๋น ๋ฅธ ํ”ผ๋“œ๋ฐฑ๊ณผ ๋ฆด๋ฆฌ์Šค๊ฐ€ ํ•„์š”ํ•œ ํ˜„์žฌ ํ”„๋กœ์ ํŠธ ์ƒํ™ฉ์—, ๋ถˆํ•„์š”ํ•œ ์ ˆ์ฐจ๋ฅผ ์—†์• ๊ณ  ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•˜๋Š” ๊ฐ€์žฅ ์ด์ƒ์ ์ธ ํ˜‘์—… ๋ชจ๋ธ๋กœ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### Adjacent Topics +- [[Conventional Commits]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๋ฅผ `feat:`, `fix:`, `chore:` ๋“ฑ์˜ ๊ทœ๊ฒฉ์œผ๋กœ ํ†ต์ผํ•จ์œผ๋กœ์จ, PR ๋‚ด์šฉ์˜ ๊ฐ€๋…์„ฑ์„ ๋†’์ด๊ณ  ํ–ฅํ›„ ๋ฆด๋ฆฌ์Šค ๋…ธํŠธ๋ฅผ ์ž๋™ํ™”ํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์ง€์‹์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[Issue Tracking System]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ์ฝ”๋“œ ๊ตฌํ˜„(GitHub)๊ณผ ์š”๊ตฌ์‚ฌํ•ญ ์ •์˜(JIRA, Linear ๋“ฑ)๋ฅผ ์—ฐ๊ฒฐํ•˜์—ฌ ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ ์ˆ˜์ค€์„ ๋†’์ด๊ณ  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋งฅ๋ฝ(Traceability)์„ ์ถ”์ ํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก ์œผ๋กœ ํ™•์žฅ๋ฉ๋‹ˆ๋‹ค. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Management/Team Collaboration.md b/10_Wiki/Management/Team Collaboration.md new file mode 100644 index 00000000..cd5d477d --- /dev/null +++ b/10_Wiki/Management/Team Collaboration.md @@ -0,0 +1,70 @@ +# [[Team Collaboration]] + +## ๐Ÿ“Œ Brief Summary +ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์—์„œ 'Team Collaboration(ํŒ€ ํ˜‘์—…)'์ด๋ž€ ๋‹ค์ˆ˜์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋™์ผํ•œ ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ํšจ์œจ์ ์œผ๋กœ ํ•จ๊ป˜ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•˜๋Š” ์‹ค์ฒœ ๋ฐฉ์‹, ์•„ํ‚คํ…์ฒ˜, ๊ทธ๋ฆฌ๊ณ  ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์˜๋ฏธํ•œ๋‹ค [1, 2]. ์ด๋Š” ์ผ๊ด€๋œ ํด๋” ๊ตฌ์กฐ, ๋ช…๋ช… ๊ทœ์น™, ์ƒํƒœ ๊ด€๋ฆฌ ํŒจํ„ด ๋ฐ Git ๋ธŒ๋žœ์นญ ์ „๋žต์„ ํ™•๋ฆฝํ•˜์—ฌ ๊ฐœ๋ฐœ์ž ๊ฐ„์˜ ์ถฉ๋Œ๊ณผ ์†Œํ†ต ๋น„์šฉ์„ ์ตœ์†Œํ™”ํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•œ๋‹ค [2-4]. ์„ฑ๊ณต์ ์ธ ํ˜‘์—…์€ ๋ฆฐํŒ…์ด๋‚˜ ํฌ๋งคํŒ…๊ณผ ๊ฐ™์€ ์ž๋™ํ™”๋œ ๋„๊ตฌ๋ฅผ ํ†ตํ•œ ์—„๊ฒฉํ•œ ์ฝ”๋“œ ๊ฑฐ๋ฒ„๋„Œ์Šค์™€ ๋ช…ํ™•ํ•œ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๋ฌธํ™”๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ํŒ€์ด ํ™•์žฅ๋  ๋•Œ ์•ˆ์ •์„ฑ์„ ์œ ์ง€ํ•˜๋„๋ก ๋•๋Š”๋‹ค [5-7]. + +## ๐Ÿ“– Core Content +* **Git ์›Œํฌํ”Œ๋กœ์šฐ ๋ฐ ๋ธŒ๋žœ์นญ ์ „๋žต:** + ์†Œ๊ทœ๋ชจ ํŒ€์—์„œ๋Š” ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์ ์œผ๋ฉด์„œ๋„ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๋Š” '๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜(Feature-branch) ์›Œํฌํ”Œ๋กœ์šฐ'๋‚˜ 'ํŠธ๋ ํฌ ๊ธฐ๋ฐ˜(Trunk-based) ๊ฐœ๋ฐœ'์ด ์ฃผ๋กœ ๊ถŒ์žฅ๋œ๋‹ค [8-10]. ๋ชจ๋“  ์ž‘์—…์€ `main` ๋ธŒ๋žœ์น˜์— ์ง์ ‘ ์ปค๋ฐ‹ํ•˜์ง€ ์•Š๊ณ  ์งง์€ ์ˆ˜๋ช…์˜ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜์—์„œ ์ง„ํ–‰๋˜๋ฉฐ, Pull Request(PR)์™€ ์ตœ์†Œ 1๋ช… ์ด์ƒ์˜ ๋™๋ฃŒ ๋ฆฌ๋ทฐ(Peer review) ๋ฐ ํ…Œ์ŠคํŠธ ํ†ต๊ณผ ํ›„ ๋ณ‘ํ•ฉ๋˜์–ด์•ผ ํ•œ๋‹ค [7, 11, 12]. ๋˜ํ•œ, ๋ธŒ๋žœ์น˜๋ช…๊ณผ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€์— ํ‹ฐ์ผ“ ID(์˜ˆ: `PROJ-123`)๋ฅผ ํฌํ•จํ•˜๋ฉด ์š”๊ตฌ์‚ฌํ•ญ๊ณผ ์ฝ”๋“œ ๋ณ€๊ฒฝ ์ด๋ ฅ ๊ฐ„์˜ ์ถ”์ ์„ฑ(Traceability)์„ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ๋‹ค [13, 14]. +* **์•„ํ‚คํ…์ฒ˜ ๋ฐ ํด๋” ๊ตฌ์กฐ์˜ ํ‘œ์ค€ํ™”:** + ํ‘œ์ค€ํ™”๋œ ํด๋” ๊ตฌ์กฐ(์˜ˆ: ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ ๋˜๋Š” Feature-Sliced Design)๋Š” ํŒŒ์ผ์˜ ์œ„์น˜๋ฅผ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜์—ฌ ํŒ€ ํ˜‘์—…์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚จ๋‹ค [2]. ๊ตฌ์กฐ๊ฐ€ ์ž˜ ์žกํ˜€ ์žˆ์œผ๋ฉด ๊ฐœ๋ฐœ์ž๋“ค์ด ํŒŒ์ผ์„ ์ฐพ๋Š” ์‹œ๊ฐ„์„ ์ค„์ด๊ณ , ํŒ€์› ๊ฐ„ ๋ถˆํ•„์š”ํ•œ ์†Œํ†ต์„ ์ค„์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์‹ ๊ทœ ๊ฐœ๋ฐœ์ž์˜ ์˜จ๋ณด๋”ฉ์ด ๋นจ๋ผ์ง„๋‹ค [2, 15]. ๋˜ํ•œ ๊ฐ ๊ธฐ๋Šฅ์ด ๋…๋ฆฝ๋œ ํด๋”๋กœ ๊ฒฉ๋ฆฌ๋˜์–ด ์žˆ์–ด ์„œ๋กœ์˜ ์ฝ”๋“œ๋ฅผ ๊ฐ„์„ญํ•  ํ™•๋ฅ ์ด ๋‚ฎ์•„์ง„๋‹ค [16]. +* **๋ช…๋ช… ๊ทœ์น™(Naming Conventions) ๋ฐ ์ž๋™ํ™”๋œ ๊ฑฐ๋ฒ„๋„Œ์Šค:** + ์ปดํฌ๋„ŒํŠธ ์ด๋ฆ„์€ ํŒŒ์Šค์นผ ์ผ€์ด์Šค(PascalCase), ํŒŒ์ผ ๋ฐ ํด๋” ์ด๋ฆ„์€ ์ผ€๋ฐฅ ์ผ€์ด์Šค(kebab-case)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋“ฑ ์ผ๊ด€๋œ ๋ช…๋ช… ๊ทœ์น™์€ OS ํ™˜๊ฒฝ ๊ฐ„์˜ ๋นŒ๋“œ ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ  ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์„ ๋†’์ธ๋‹ค [17-19]. ๋” ๋‚˜์•„๊ฐ€ ์ˆ˜๋™ ๊ฒ€์‚ฌ์— ์˜์กดํ•˜๊ธฐ๋ณด๋‹ค ESLint, Prettier, Husky๋ฅผ ํ™œ์šฉํ•ด ์ปค๋ฐ‹ ์ด์ „์— ๋ฆฐํŒ…, ํฌ๋งคํŒ… ๋ฐ ํƒ€์ž… ๊ฒ€์‚ฌ๋ฅผ ์ž๋™์œผ๋กœ ๊ฐ•์ œํ•˜๋Š” ๊ฒƒ์ด ๊ณ ํ’ˆ์งˆ ์ฝ”๋“œ ํ˜‘์—…์˜ ๊ธฐ๋ฐ˜์ด๋‹ค [6, 20, 21]. +* **์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ์™€ ํŒ€ ๊ทœ๋ชจ์˜ ์ƒ๊ด€๊ด€๊ณ„:** + ํŒ€์˜ ๊ทœ๋ชจ๊ฐ€ ํด์ˆ˜๋ก(10๋ช… ์ด์ƒ) ๊ตฌ์กฐ๋ฅผ ๊ฐ•์ œํ•˜๋Š” ๋„๊ตฌ๊ฐ€ ํ˜‘์—…์— ์œ ๋ฆฌํ•˜๋‹ค [5]. Zustand์™€ ๊ฐ™์€ ๋„๊ตฌ๋Š” ์œ ์—ฐํ•˜๊ณ  ๋น ๋ฅด์ง€๋งŒ, ๊ทœ์œจ์ด ๋ถ€์กฑํ•˜๋ฉด ๊ฐœ๋ฐœ์ž๋งˆ๋‹ค ๋น„๋™๊ธฐ ์ž‘์—…์„ ๋‹ค๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•˜์—ฌ ์ฝ”๋“œ๋ฒ ์ด์Šค์— ํ˜ผ๋ž€(integration chaos)์„ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ๋‹ค [22, 23]. ๋ฐ˜๋ฉด Redux๋Š” ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ๊ฐ€ ๋งŽ์ง€๋งŒ, ํŒ€ ์ „์›์ด ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” '๋‹จ์ผ ์ง„์‹ค ๊ณต๊ธ‰์›'๊ณผ ๊ตฌ์กฐ๋ฅผ ์ œ๊ณตํ•˜์—ฌ ๋Œ€๊ทœ๋ชจ ํ˜‘์—…์—์„œ ๋ฒ„๊ทธ๋ฅผ ์ค„์ธ๋‹ค [5, 24, 25]. + +## โš–๏ธ Trade-offs & Caveats +* **์œ ์—ฐ์„ฑ vs. ๊ตฌ์กฐ์  ๊ฐ•์ œ์„ฑ (์ƒํƒœ ๊ด€๋ฆฌ):** Zustand ๊ฐ™์ด ๊ฐ€๋ฒผ์šด ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ๊ฐ€ ์ ์–ด ๋น ๋ฅธ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ(์Šคํƒ€ํŠธ์—… ๋“ฑ)์— ์ ํ•ฉํ•˜์ง€๋งŒ, ์œ ์—ฐ์„ฑ์ด ๋„ˆ๋ฌด ์ปค์„œ ํŒ€์ด ์ปค์งˆ ๊ฒฝ์šฐ ํŒŒํŽธํ™”๋œ ํŒจํ„ด์„ ๋‚ณ์„ ์ˆ˜ ์žˆ๋‹ค [22, 23, 26, 27]. ๋ฐ˜๋ฉด Redux๋Š” ์ผ๊ด€์„ฑ์„ ๊ฐ•์ œํ•˜์—ฌ ๋””๋ฒ„๊น…๊ณผ ํ˜‘์—…์„ ํŽธํ•˜๊ฒŒ ํ•ด์ฃผ์ง€๋งŒ, ์ดˆ๊ธฐ ์„ค์ •๊ณผ ๊ตฌ์กฐํ™”์— ๋“œ๋Š” ์‹œ๊ฐ„์ด ์†Œ๊ทœ๋ชจ ํŒ€์—๊ฒŒ๋Š” ๊ณผ๋„ํ•œ ์˜ค๋ฒ„ํ—ค๋“œ๋กœ ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๋‹ค [5, 24, 28]. +* **๋ธŒ๋žœ์นญ ์›Œํฌํ”Œ๋กœ์šฐ์˜ ๋ฌด๊ฒŒ๊ฐ:** Git Flow๋Š” ์˜ˆ์ •๋œ ๋ฆด๋ฆฌ์Šค๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฑฐ๋Œ€ ํ”„๋กœ์ ํŠธ์—๋Š” ์œ ์šฉํ•˜์ง€๋งŒ, ์†Œ๊ทœ๋ชจ ํŒ€์—๊ฒŒ๋Š” ๋ธŒ๋žœ์น˜ ๊ด€๋ฆฌ ๋น„์šฉ์ด ๋„ˆ๋ฌด ์ปค์„œ ๊ฐœ๋ฐœ ์†๋„๋ฅผ ๋Šฆ์ถœ ์ˆ˜ ์žˆ๋‹ค [8, 29]. ๊ฐ€๋ฒผ์šด Feature-branch ์›Œํฌํ”Œ๋กœ์šฐ๋‚˜ Trunk-based ๊ฐœ๋ฐœ์ด ๋Œ€์•ˆ์ด์ง€๋งŒ, ์ด๋Š” ๊ฐœ๋ฐœ์ž๋“ค์ด ๋ธŒ๋žœ์น˜๋ฅผ ์งง๊ฒŒ ์œ ์ง€ํ•˜๊ณ  ๋นˆ๋ฒˆํžˆ ๋ณ‘ํ•ฉ(Merge)ํ•˜๋Š” ๊ทœ์œจ์„ ์Šค์Šค๋กœ ์ง€์ผœ์•ผ๋งŒ ์„ฑ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค [30, 31]. +* **์ดˆ๊ธฐ ํ•™์Šต ๊ณก์„ ๊ณผ ์˜ค๋ฒ„ํ—ค๋“œ:** Feature-Sliced Design(FSD) ๊ฐ™์€ ์—„๊ฒฉํ•œ ์•„ํ‚คํ…์ฒ˜๋Š” ์ฝ”๋“œ์˜ ๋ชจ๋“ˆํ™”์™€ ๋…๋ฆฝ์  ์ž‘์—…(๋ณ‘๋ ฌ ์ž‘์—…)์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜์ง€๋งŒ, ์ดˆ๊ธฐ ๋„์ž… ์‹œ ํŒ€์› ์ „์ฒด๊ฐ€ ํ•ด๋‹น ๋ฐฉ๋ฒ•๋ก (Layer, Slice ๋“ฑ์˜ ๊ฐœ๋…)์„ ์ดํ•ดํ•˜๊ณ  ๋™์˜ํ•ด์•ผ ํ•˜๋Š” ํ•™์Šต ๋น„์šฉ์ด ๋ฐœ์ƒํ•œ๋‹ค [32, 33]. ๊ทœ์น™์— ๋Œ€ํ•œ ์ง€์‹ ๊ณต์œ ์™€ ๋ฌธ์„œํ™”๊ฐ€ ๋™๋ฐ˜๋˜์ง€ ์•Š์œผ๋ฉด, ๊ฐœ๋ฐœ์ž๋“ค์ด ์ž„์˜๋กœ ํ•˜์œ„ ํด๋”๋‚˜ `/shared` ๋“ฑ์— ์ฝ”๋“œ๋ฅผ ์Ÿ์•„๋ถ€์–ด ์˜คํžˆ๋ ค ์•„ํ‚คํ…์ฒ˜๊ฐ€ ๋ง๊ฐ€์ง€๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋‚ณ์„ ์ˆ˜ ์žˆ๋‹ค [33]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [๊ด€๊ณ„ ์œ ํ˜• A (ํ˜‘์—…/์ฝ”๋“œ ๊ด€๋ฆฌ ํ”„๋กœ์„ธ์Šค)] +- [[Git Branching Strategies]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋‹ค์ˆ˜์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋™์‹œ์— ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๊ณ  ํ†ตํ•ฉ ๊ณผ์ •์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ํ•ต์‹ฌ ๊ทœ์•ฝ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค [3, 34]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Pull Request, ์ฝ”๋“œ ๋ฆฌ๋ทฐ, ๋ธŒ๋žœ์น˜ ๋ช…๋ช… ๊ทœ์น™, Trunk-based ์›Œํฌํ”Œ๋กœ์šฐ ๋“ฑ ์‹ค์ œ ํŒ€ ์šด์˜ ๋ฐฉ์‹ [7, 35]. +- [[Commit Message Conventions]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋ณ€๊ฒฝ ์‚ฌํ•ญ์˜ ์˜๋„์™€ ์ž‘์—… ๋‚ด์—ญ(๋ฒ„๊ทธ ํ”ฝ์Šค, ๊ธฐ๋Šฅ ์ถ”๊ฐ€ ๋“ฑ)์„ ๋‹ค๋ฅธ ํŒ€์›๋“ค์—๊ฒŒ ๋ช…ํ™•ํžˆ ์ „๋‹ฌํ•˜๋Š” ์†Œํ†ต์˜ ๋„๊ตฌ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค [36]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํ‹ฐ์ผ“ ID ํ†ตํ•ฉ, `feat:`, `fix:`์™€ ๊ฐ™์€ ์ ‘๋‘์‚ฌ๋ฅผ ํ†ตํ•œ ๋ณ€๊ฒฝ ์ด๋ ฅ์˜ ์ž๋™ํ™” ๋ฐ ์Šค์บ๋‹ [14, 36, 37]. + +#### [๊ด€๊ณ„ ์œ ํ˜• B (์•„ํ‚คํ…์ฒ˜ ๋ฐ ๊ฑฐ๋ฒ„๋„Œ์Šค ๋„๊ตฌ)] +- [[Feature-Sliced Design]] + - ์—ฐ๊ฒฐ ์ด์œ : ์ฝ”๋“œ๋ฅผ ๊ธฐ์ˆ ์  ๊ณ„์ธต์ด ์•„๋‹Œ ๋น„์ฆˆ๋‹ˆ์Šค ๊ธฐ๋Šฅ(Feature) ์ค‘์‹ฌ์œผ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ, ์—ฌ๋Ÿฌ ํŒ€์ด ์„œ๋กœ ๊ฐ„์„ญ ์—†์ด ๋…๋ฆฝ์ ์œผ๋กœ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ๋Š” ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•œ๋‹ค [16, 38]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋„๋ฉ”์ธ ์ฃผ๋„ ์„ค๊ณ„์˜ ํ”„๋ก ํŠธ์—”๋“œ ์ ์šฉ, ๋ช…์‹œ์  ํผ๋ธ”๋ฆญ API๋ฅผ ํ†ตํ•œ ๋ชจ๋“ˆ ์บก์Аํ™”์™€ ๊ฒฐํ•ฉ๋„ ๋‚ฎ์ถ”๊ธฐ [38-40]. +- [[Automated Governance]] + - ์—ฐ๊ฒฐ ์ด์œ : ์‚ฌ๋žŒ์˜ ์ˆ˜๋™ ํ™•์ธ์— ์˜์กดํ•˜์ง€ ์•Š๊ณ  ESLint, Prettier, Husky ๋“ฑ์œผ๋กœ ์ฝ”๋“œ ์ปจ๋ฒค์…˜๊ณผ ์•„ํ‚คํ…์ฒ˜ ๋ฃฐ(์˜์กด์„ฑ ๋ฐฉํ–ฅ ๋“ฑ)์„ ์‹œ์Šคํ…œ์ ์œผ๋กœ ๊ฐ•์ œํ•œ๋‹ค [6, 20]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: CI/CD ํŒŒ์ดํ”„๋ผ์ธ์—์„œ์˜ ์ฝ”๋“œ ํ’ˆ์งˆ ๋ณด์ฆ ๋ฐ ํŒ€์› ๊ฐ„์˜ ์Šคํƒ€์ผ ๋ถ„์Ÿ ๋ฐฉ์ง€ [20]. +- [[Redux vs Zustand in Teams]] + - ์—ฐ๊ฒฐ ์ด์œ : ํŒ€์˜ ๊ทœ๋ชจ(์†Œ๊ทœ๋ชจ vs ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ)์— ๋”ฐ๋ผ ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ์˜ ์„ ํƒ์ด ํ˜‘์—…์˜ ์ผ๊ด€์„ฑ์— ๊ฒฐ์ •์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค [5, 24, 27]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ฐœ๋ฐœ์ž์˜ ์ž์œจ์„ฑ ๋ถ€์—ฌ์™€ ์ผ๊ด€์„ฑ ๊ฐ•์ œ(Boilerplate) ์‚ฌ์ด์˜ ์•„ํ‚คํ…์ฒ˜์  ํŠธ๋ ˆ์ด๋“œ์˜คํ”„ [22, 41]. + +### Deeper Research Questions + +- ์†Œ๊ทœ๋ชจ ํŒ€(2~5์ธ)์—์„œ ๋Œ€๊ทœ๋ชจ ํŒ€(10์ธ ์ด์ƒ)์œผ๋กœ ํ™•์žฅํ•  ๋•Œ Git ์›Œํฌํ”Œ๋กœ์šฐ์™€ ๋ธŒ๋žœ์นญ ์ „๋žต์€ ์–ด๋–ป๊ฒŒ ์ง„ํ™”ํ•ด์•ผ ํ•˜๋Š”๊ฐ€? +- Feature-Sliced Design(FSD)์„ ํ”„๋กœ์ ํŠธ์— ๋„์ž…ํ•  ๋•Œ, ํŒ€์›๋“ค์ด ๊ณตํ†ต ๋ชจ๋“ˆ์„ `/shared` ํด๋”์— ๋ฌด๋ถ„๋ณ„ํ•˜๊ฒŒ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์ฒด์ ์ธ ๊ฑฐ๋ฒ„๋„Œ์Šค ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? +- ESLint์™€ Husky๋ฅผ ํ™œ์šฉํ•œ ์ž๋™ํ™” ๊ฑฐ๋ฒ„๋„Œ์Šค ์„ค์ • ์‹œ, ๊ฐœ๋ฐœ ์†๋„๋ฅผ ๋Šฆ์ถ”์ง€ ์•Š์œผ๋ฉด์„œ ๋ชจ๋“ˆ ๊ฐ„ ์ž˜๋ชป๋œ ์˜์กด์„ฑ(์ƒ์œ„ ๋ ˆ์ด์–ด ์ฐธ์กฐ ๋“ฑ)์„ ์›์ฒœ ์ฐจ๋‹จํ•˜๋Š” ์ตœ์ ์˜ ๊ทœ์น™ ๊ตฌ์„ฑ์€ ๋ฌด์—‡์ธ๊ฐ€? +- ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(Redux vs Zustand)์˜ ์„ ํƒ์ด ํŒ€์› ๊ฐ„์˜ ๋น„๋™๊ธฐ ๋กœ์ง ๋ฐ ๋ฐ์ดํ„ฐ ํŒจ์นญ(Fetching) ํŒจํ„ด์˜ ํŒŒํŽธํ™”์— ๋ฏธ์น˜๋Š” ์‹ค์ œ ์˜ํ–ฅ์€ ๋ฌด์—‡์ธ๊ฐ€? +- Pull Request ๊ธฐ๋ฐ˜์˜ ํ˜‘์—… ํ™˜๊ฒฝ์—์„œ, ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ ๋„๊ตฌ(์˜ˆ: Storybook, Chromatic)๊ฐ€ ์ฝ”๋“œ ๋ฆฌ๋ทฐ์˜ ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ์–ด๋–ป๊ฒŒ ํ•ด์†Œํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? + +### Practical Application Contexts + +- **Implementation:** ์ฝ”๋“œ๋ฅผ ์ปค๋ฐ‹ํ•˜๊ณ  PR์„ ์ƒ์„ฑํ•  ๋•Œ, ๋ฐ˜๋“œ์‹œ ์ •ํ•ด์ง„ Conventional Commits ๊ทœ์น™์„ ๋”ฐ๋ฅด๊ณ  JIRA ๋“ฑ์˜ ์ด์Šˆ ํ‹ฐ์ผ“ ๋ฒˆํ˜ธ๋ฅผ ๋ธŒ๋žœ์น˜์™€ ์ปค๋ฐ‹์— ๊ธฐ์ž…ํ•˜์—ฌ ์ถ”์ ์„ฑ์„ ๋ณด์žฅํ•œ๋‹ค [14, 37]. +- **System Design:** ํ”„๋กœ์ ํŠธ ํด๋” ๊ตฌ์กฐ ์„ค๊ณ„ ์‹œ ๊ธฐ์ˆ ์  ํŒŒ์ผ ํƒ€์ž…(์ปดํฌ๋„ŒํŠธ, ํ›… ๋“ฑ)์˜ ๋‚˜์—ด์ด ์•„๋‹Œ, ์ธ์ฆ, ๋Œ€์‹œ๋ณด๋“œ ๋“ฑ ๊ธฐ๋Šฅ(Feature) ๋„๋ฉ”์ธ ๋‹จ์œ„๋กœ ๊ฒฉ๋ฆฌ์‹œ์ผœ ๊ฐ ๊ธฐ๋Šฅ๋ณ„๋กœ ์ „๋‹ด ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ณ‘๋ ฌ๋กœ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค [2, 42, 43]. +- **Operation / Maintenance:** CI/CD ํŒŒ์ดํ”„๋ผ์ธ๊ณผ Git Hooks(Husky)๋ฅผ ์„ธํŒ…ํ•˜์—ฌ, ๋ˆ„๊ตฐ๊ฐ€ ์ปจ๋ฒค์…˜์„ ์–ด๊ธด ์ฝ”๋“œ๋ฅผ ํ‘ธ์‹œํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์‚ฌ์ „์— ๋ฆฐํ„ฐ์™€ ํฌ๋งคํ„ฐ๊ฐ€ ์ž‘๋™ํ•ด ์ž˜๋ชป๋œ ์ฝ”๋“œ๊ฐ€ ์›๊ฒฉ ๋ธŒ๋žœ์น˜์— ์˜ฌ๋ผ๊ฐ€๋Š” ๊ฒƒ์„ ์ฐจ๋‹จํ•œ๋‹ค [20]. +- **Learning Path:** ์‹ ๊ทœ ์ž…์‚ฌ์ž๋‚˜ ํŒ€์›์ด ๋ฐฐ์ •๋˜์—ˆ์„ ๋•Œ, `README`์— ๋ช…์‹œ๋œ ํŒ€์˜ ๋ธŒ๋žœ์นญ ์ „๋žต ๊ทœ์น™๊ณผ ํด๋” ๋””๋ ‰ํ† ๋ฆฌ ์„ค๊ณ„ ์˜๋„๋ฅผ ๋จผ์ € ํ•™์Šตํ•˜๊ฒŒ ํ•˜์—ฌ ํ”„๋กœ์ ํŠธ ์˜จ๋ณด๋”ฉ ์‹œ๊ฐ„์„ ๋‹จ์ถ•ํ•œ๋‹ค [2, 44]. +- **My Project Relevance:** ๋‹ค์ˆ˜์˜ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•จ๊ป˜ ์ฐธ์—ฌํ•˜๋Š” ๋ฆฌ์•กํŠธ ํ”„๋กœ์ ํŠธ์—์„œ, ์ฝ”๋“œ ์ถฉ๋Œ๊ณผ ๊ธฐ์ˆ  ๋ถ€์ฑ„๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ  ์ผ๊ด€๋œ ์ œํ’ˆ ํ’ˆ์งˆ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์ˆ˜์ ์œผ๋กœ ์ˆ˜๋ฆฝํ•ด์•ผ ํ•˜๋Š” ํ˜‘์—… ๊ทธ๋ผ์šด๋“œ ๋ฃฐ(Ground Rules)์ด๋‹ค. + +### Adjacent Topics + +- [[Code Review Practices]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ์ž‘์€ ๋‹จ์œ„์˜ Pull Request ์œ ์ง€, ์‹œ๊ฐ์  ๋ฆฌ๋ทฐ ๋„๊ตฌ์˜ ๋„์ž…, ํšจ์œจ์ ์ธ ๋™๋ฃŒ ํ”ผ๋“œ๋ฐฑ ์ œ๊ณต ๋“ฑ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ์ž์ฒด์˜ ํ’ˆ์งˆ๊ณผ ์†๋„๋ฅผ ๋†’์ด๋Š” ๋ฐฉ๋ฒ•๋ก  [37, 45]. +- [[CI/CD Pipelines]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ํŒ€์›์˜ ์ฝ”๋“œ๊ฐ€ `main`์— ๋ณ‘ํ•ฉ๋˜๊ธฐ ์ „, ์ž๋™์œผ๋กœ ํ…Œ์ŠคํŠธ์™€ ๋ฆฐํŒ…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋ฐฐํฌ๊นŒ์ง€ ์ด์–ด์ง€๋Š” ์ธํ”„๋ผ ๋ฐ ๋ฐ๋ธŒ์˜ต์Šค ํ™˜๊ฒฝ [7]. +- [[Visual Regression Testing]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: Storybook ๋ฐ Chromatic์„ ํ™œ์šฉํ•ด UI ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ฆฌ๋ทฐ์–ด๊ฐ€ ์‹œ๊ฐ์ ์œผ๋กœ ์ง์ ‘ ํ™•์ธํ•˜๊ณ , ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๋ ˆ์ด์•„์›ƒ ๊นจ์ง์„ ๋ฐฉ์ง€ํ•˜๋Š” ํ˜‘์—… ๊ธฐ์ˆ  [45, 46]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Management/Version Control.md b/10_Wiki/Management/Version Control.md new file mode 100644 index 00000000..2da5260d --- /dev/null +++ b/10_Wiki/Management/Version Control.md @@ -0,0 +1,69 @@ +# [[Version Control]] + +## ๐Ÿ“Œ Brief Summary +๋ฒ„์ „ ๊ด€๋ฆฌ(Version Control)๋Š” ์†Œ๊ทœ๋ชจ๋ถ€ํ„ฐ ๋Œ€๊ทœ๋ชจ ํŒ€์— ์ด๋ฅด๊ธฐ๊นŒ์ง€ ์ฝ”๋“œ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ถ”์ ํ•˜๊ณ , ๋ณ‘ํ•ฉ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๋ฉฐ ์•ˆ์ •์ ์ธ ๋ฐฐํฌ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ํ•„์ˆ˜์ ์ธ ํ˜‘์—… ๋„๊ตฌ ๋ฐ ๊ฑฐ๋ฒ„๋„Œ์Šค ํ”„๋กœ์„ธ์Šค์ž…๋‹ˆ๋‹ค [1, 2]. ๊ฐœ๋ฐœํŒ€์€ ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ์™€ ํŒ€์˜ ์ˆ™๋ จ๋„์— ๋”ฐ๋ผ Feature-Branch ์›Œํฌํ”Œ๋กœ์šฐ, Trunk-based ๊ฐœ๋ฐœ, Git Flow ๋“ฑ ๋‹ค์–‘ํ•œ ๋ธŒ๋žœ์นญ ์ „๋žต์„ ์„ ํƒํ•˜์—ฌ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค [3, 4]. ํšจ๊ณผ์ ์ธ ๋ฒ„์ „ ๊ด€๋ฆฌ๋Š” ๋ธŒ๋žœ์น˜์™€ ์ปค๋ฐ‹์— ํ‹ฐ์ผ“ ID ์—ฐ๋™, ์˜๋ฏธ ์žˆ๋Š” ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ์ž‘์„ฑ, ์ž‘๊ณ  ๋นˆ๋ฒˆํ•œ ์ปค๋ฐ‹, ๊ทธ๋ฆฌ๊ณ  ์—„๊ฒฉํ•œ ํ’€ ๋ฆฌํ€˜์ŠคํŠธ(PR) ๋ฆฌ๋ทฐ ๋“ฑ์˜ ๋ชจ๋ฒ” ์‚ฌ๋ก€๋ฅผ ์ค€์ˆ˜ํ•˜์—ฌ ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ํ’ˆ์งˆ๊ณผ ์ถ”์ ์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค [2, 5]. + +## ๐Ÿ“– Core Content +* **์ฃผ์š” ๋ธŒ๋žœ์นญ ์ „๋žต (Branching Strategies)** + * **Feature-Branch Workflow**: 2~5์ธ ๊ทœ๋ชจ์˜ ์†Œ๊ทœ๋ชจ ํŒ€์—๊ฒŒ ๊ฐ€์žฅ ๊ถŒ์žฅ๋˜๋Š” ๋‹จ์ˆœํ•˜๊ณ  ์ถฉ๋Œ์ด ์ ์€ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค [6]. `main` ๋ธŒ๋žœ์น˜๋Š” ํ•ญ์ƒ ์•ˆ์ •์ ์ด๊ณ  ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋ฉฐ, ๊ฐ ๊ธฐ๋Šฅ์ด๋‚˜ ๋ฒ„๊ทธ ์ˆ˜์ •์€ `main`์—์„œ ๋ถ„๊ธฐ๋œ ์งง์€ ์ˆ˜๋ช…์˜ ๊ฐœ๋ณ„ ๋ธŒ๋žœ์น˜์—์„œ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค [6, 7]. + * **Trunk-Based Development**: ์งง์€ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜(Trunk)์— ์ฝ”๋“œ๋ฅผ ๋น ๋ฅด๊ณ  ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ณ‘ํ•ฉํ•˜๋Š” ์ „๋žต์œผ๋กœ, ๊ฐ•๋ ฅํ•œ CI/CD ํ™˜๊ฒฝ๊ณผ ๊ฒฝํ—˜์ด ๋งŽ์€ ํŒ€์—๊ฒŒ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค [8, 9]. + * **Git Flow & GitHub Flow**: Git Flow๋Š” ๋ณ„๋„์˜ ๋ฆด๋ฆฌ์Šค ๋ธŒ๋žœ์น˜ ๋“ฑ์„ ๋‘์–ด ์Šค์ผ€์ค„์— ๋”ฐ๋ฅธ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์ข‹์ง€๋งŒ, ์ž‘์€ ํŒ€์—๊ฒŒ๋Š” ์ ˆ์ฐจ๊ฐ€ ๋ฌด๊ฒ์Šต๋‹ˆ๋‹ค [9]. ๋ฐ˜๋ฉด GitHub Flow๋Š” ๋” ๋‹จ์ˆœํ•˜๋ฉฐ ๋น ๋ฅธ ํ†ตํ•ฉ์„ ์ง€ํ–ฅํ•ฉ๋‹ˆ๋‹ค [10]. + +* **๋ช…๋ช… ๊ทœ์น™ ๋ฐ ์ถ”์ ์„ฑ (Naming Conventions & Traceability)** + * **๋ธŒ๋žœ์น˜ ๋ช…๋ช… (Branch Naming)**: ๋ธŒ๋žœ์น˜ ์ด๋ฆ„์—๋Š” ์ž‘์—…์˜ ์œ ํ˜•๊ณผ ํ‹ฐ์ผ“ ID, ์งง์€ ์„ค๋ช…์„ ํฌํ•จํ•˜๋Š” ๊ฒƒ(์˜ˆ: `feature/PROJ-123-user-auth`)์ด ๊ถŒ์žฅ๋˜๋ฉฐ, ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ์†Œ๋ฌธ์ž์™€ ํ•˜์ดํ”ˆ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [11, 12]. + * **์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ (Commit Messages)**: 'Conventional Commits' ์‚ฌ์–‘์„ ๋”ฐ๋ผ `feat:`, `fix:`, `docs:`, `refactor:`, `chore:` ๋“ฑ์˜ ์ ‘๋‘์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€๊ฒฝ ๋ชฉ์ ์„ ๋ช…ํ™•ํžˆ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [5, 13]. ์ปค๋ฐ‹์€ ๋…ผ๋ฆฌ์ ์ธ ๋‹จ์ผ ๋ณ€๊ฒฝ ์‚ฌํ•ญ๋งŒ์„ ํฌํ•จํ•˜๋Š” '์›์ž์  ์ปค๋ฐ‹(Atomic Commits)' ํ˜•ํƒœ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค [14]. + +* **๋ณ‘ํ•ฉ ๋ฐ ๋ฆฌ๋ทฐ ํ”„๋กœ์„ธ์Šค (Merging and Code Review)** + * **Pull Request (PR)**: ์ฝ”๋“œ๋ฅผ `main`์— ๋ณ‘ํ•ฉํ•˜๊ธฐ ์ „ ๋ฐ˜๋“œ์‹œ PR์„ ์—ด์–ด ์ตœ์†Œ 1๋ช… ์ด์ƒ์˜ ๋™๋ฃŒ ๋ฆฌ๋ทฐ๋ฅผ ๊ฑฐ์น˜๊ณ  CI ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [15, 16]. ๋ฆฌ๋ทฐ๊ฐ€ ์‰ฝ๊ฒŒ ์ง„ํ–‰๋˜๋„๋ก PR์€ ์ž‘๊ฒŒ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [13]. + * **์ถฉ๋Œ ์˜ˆ๋ฐฉ ๋ฐ ์ •๋ฆฌ**: ๋ณ‘ํ•ฉ ์ถฉ๋Œ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด `main` ๋ธŒ๋žœ์น˜์˜ ์ตœ์‹  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ž์ฃผ ๊ฐ€์ ธ์™€ ๋™๊ธฐํ™”(pull/rebase)ํ•ด์•ผ ํ•˜๋ฉฐ, ๋ณ‘ํ•ฉํ•  ๋•Œ๋Š” 'Squash & Merge'๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ณ  ๋ณ‘ํ•ฉ ํ›„์—๋Š” ์‚ฌ์šฉํ•œ ๋ธŒ๋žœ์น˜๋ฅผ ์ž๋™ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค [15, 17, 18]. + +## โš–๏ธ Trade-offs & Caveats +* **์˜ค๋ฒ„ํ—ค๋“œ vs. ์ œ์–ด๋ ฅ**: Git Flow์™€ ๊ฐ™์ด ๊ตฌ์กฐํ™”๋˜๊ณ  ๋ฌด๊ฑฐ์šด ํ”„๋กœ์„ธ์Šค๋Š” ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฆด๋ฆฌ์Šค ์ผ์ •์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์ข‹์ง€๋งŒ, ์†Œ๊ทœ๋ชจ ํŒ€์—๊ฒŒ๋Š” ํ”„๋กœ์„ธ์Šค ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋„ˆ๋ฌด ์ปค์„œ ๊ฐœ๋ฐœ ์†๋„๋ฅผ ์ €ํ•˜์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [9, 19]. ๋ฐ˜๋Œ€๋กœ ๋„ˆ๋ฌด ๋‹จ์ˆœํ•œ ์ „๋žต์€ ์—„๊ฒฉํ•œ ์ œ์–ด๊ฐ€ ํ•„์š”ํ•œ ๋Œ€ํ˜• ํ”„๋กœ์ ํŠธ์—์„œ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํŒ€ ๊ทœ๋ชจ์™€ ์š”๊ตฌ์‚ฌํ•ญ์— ๋งž์ถ˜ ์ „๋žต ์„ ํƒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค [20]. +* **Trunk-Based ๊ฐœ๋ฐœ์˜ ์ œ์•ฝ์‚ฌํ•ญ**: ๋ณ‘ํ•ฉ ์ถฉ๋Œ์„ ์ตœ์†Œํ™”ํ•˜๊ณ  ๋น ๋ฅธ ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•˜์ง€๋งŒ, ๊ฐœ๋ฐœํŒ€์˜ ๋†’์€ ์ˆ™๋ จ๋„์™€ ๊ฐ•๋ ฅํ•œ CI ๊ฒ€์ฆ ํŒŒ์ดํ”„๋ผ์ธ์ด ์ „์ œ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [9]. ๋˜ํ•œ, ๋ฏธ์™„์„ฑ๋œ ๊ธฐ๋Šฅ์ด ๋ณ‘ํ•ฉ๋  ์œ„ํ—˜์ด ์žˆ์œผ๋ฏ€๋กœ ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ(Feature flags)๋ฅผ ์ถ”๊ฐ€๋กœ ๋„์ž…ํ•ด์•ผ ํ•˜๋Š” ์ œ์•ฝ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [19]. +* **์žฅ๊ธฐ ๋ธŒ๋žœ์น˜(Long-lived Branches)์˜ ๋ฐ˜๋Œ€๊ธ‰๋ถ€**: ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ์„ ์œ„ํ•ด ๋ธŒ๋žœ์น˜๋ฅผ ๋„ˆ๋ฌด ์˜ค๋ž˜ ์œ ์ง€ํ•˜๋ฉด ๋ณ‘ํ•ฉ ์‹œ์ ์— ์—„์ฒญ๋‚œ ์ฝ”๋“œ ์ถฉ๋Œ(merge conflicts)์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค [12, 21]. ๋”ฐ๋ผ์„œ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ž‘์—…์ž๊ฐ€ ๋งค์ผ `main` ๋ธŒ๋žœ์น˜์™€ ๋™๊ธฐํ™”ํ•˜๋Š” ์ง€์†์ ์ธ ์œ ์ง€๋ณด์ˆ˜ ๋…ธ๋ ฅ์„ ๊ธฐ์šธ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค [18]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [์›Œํฌํ”Œ๋กœ์šฐ ๋ฐ ๋ฐฉ๋ฒ•๋ก  (Workflow Strategies)] +- [[Feature Branch Workflow]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋ฒ„๊ทธ ์ˆ˜์ •์ด๋‚˜ ์ƒˆ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ ์‹œ `main`๊ณผ ๋ถ„๋ฆฌ๋œ ๋…๋ฆฝ์ ์ด๊ณ  ์งง์€ ์ˆ˜๋ช…์˜ ๋ธŒ๋žœ์น˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ „๋žต์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. [6, 7] + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์–ด๋–ป๊ฒŒ `main` ๋ธŒ๋žœ์น˜์˜ ์•ˆ์ •์„ฑ์„ ํ›ผ์†ํ•˜์ง€ ์•Š์œผ๋ฉด์„œ๋„ ๋‹ค์ˆ˜์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[Trunk-Based Development]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋ชจ๋“  ๊ฐœ๋ฐœ์ž๊ฐ€ ๋นˆ๋ฒˆํ•˜๊ฒŒ ์งง์€ ์ฃผ๊ธฐ๋กœ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜(Trunk)์— ์ฝ”๋“œ๋ฅผ ๋ณ‘ํ•ฉํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. [8, 9] + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ง€์†์  ํ†ตํ•ฉ(CI)์„ ์–ด๋–ป๊ฒŒ ๋ณด์žฅํ•˜๋ฉฐ, ์žฅ๊ธฐ ๋ธŒ๋žœ์น˜๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ํšŒํ”ผํ•˜๋Š”์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[Git Flow]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋ฆด๋ฆฌ์Šค์šฉ ๋ธŒ๋žœ์น˜์™€ ๊ฐœ๋ฐœ์šฉ ๋ธŒ๋žœ์น˜๋ฅผ ๋ช…ํ™•ํžˆ ๋‚˜๋ˆ„์–ด ๋ณต์žกํ•œ ํ”„๋กœ์ ํŠธ ๋ฆด๋ฆฌ์Šค๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. [9, 19] + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํŒ€์˜ ๊ทœ๋ชจ์™€ ๋ฐฐํฌ ์Šค์ผ€์ค„์— ๋”ฐ๋ผ ์›Œํฌํ”Œ๋กœ์šฐ์— ์–ด๋–ค ๊ตฌ์กฐ์  ๋ ˆ์ด์–ด๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +#### [ํ˜‘์—… ๋ฐ ํ’ˆ์งˆ ๊ด€๋ฆฌ (Quality Assurance & Collaboration)] +- [[Pull Request (PR)]] + - ์—ฐ๊ฒฐ ์ด์œ : ์ฝ”๋“œ๋ฅผ ์ฃผ ๋ธŒ๋žœ์น˜์— ๋ณ‘ํ•ฉํ•˜๊ธฐ ์ „, ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋™๋ฃŒ์—๊ฒŒ ๊ฒ€ํ† ๋ฐ›๋Š” ํ•ต์‹ฌ ํ’ˆ์งˆ ํ†ต์ œ ์ ˆ์ฐจ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. [13, 16] + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ฝ”๋“œ ๋ฆฌ๋ทฐ์™€ CI ํ…Œ์ŠคํŠธ ์ž๋™ํ™”๊ฐ€ ์–ด๋–ป๊ฒŒ ์‹ค์ œ ์ฝ”๋“œ ํ’ˆ์งˆ์„ ์œ ์ง€ํ•˜๊ณ  ํŒ€ ๋‚ด ์ง€์‹ ๊ณต์œ ๋ฅผ ๋•๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[Conventional Commits]] + - ์—ฐ๊ฒฐ ์ด์œ : `feat:`, `fix:`์™€ ๊ฐ™์ด ํ‘œ์ค€ํ™”๋œ ์ ‘๋‘์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€์˜ ์˜๋„๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ตฌ๋ฌธ ๊ทœ์น™์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. [5, 13] + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ํ†ตํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์ถ”์ ์„ฑ ํ™•๋ณด์™€ ๋ฆด๋ฆฌ์Šค ๋…ธํŠธ ์ž๋™ํ™”์— ์–ด๋–ป๊ฒŒ ๊ธฐ์—ฌํ•˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### Deeper Research Questions +- ์†Œ๊ทœ๋ชจ ํŒ€(2~5๋ช…)์ด ์„ฑ์žฅํ•˜์—ฌ 10๋ช… ์ด์ƒ์˜ ๋Œ€๊ทœ๋ชจ ์กฐ์ง์ด ๋  ๋•Œ, Feature-Branch ์›Œํฌํ”Œ๋กœ์šฐ์—์„œ Git Flow ๋“ฑ ๋” ๋ณต์žกํ•œ ์ „๋žต์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋Š” ๊ตฌ์ฒด์ ์ด๊ณ  ์•ˆ์ „ํ•œ ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? [9, 20] +- Trunk-based ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ๋ถˆ์™„์ „ํ•œ ์ฝ”๋“œ๋ฅผ ๋ฐฐํฌํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ(Feature Flags)๋Š” ๋ฒ„์ „ ๊ด€๋ฆฌ ๋ฐ ๋ธŒ๋žœ์นญ ์ „๋žต์˜ ๋ณต์žก์„ฑ์— ์–ด๋–ค ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”๊ฐ€? [19] +- Pull Request ์™„๋ฃŒ ์‹œ 'Squash & Merge' ๋ฐฉ์‹๊ณผ 'Merge Commit' ๋ฐฉ์‹ ๊ฐ„์˜ ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ ๊ฐ€๋…์„ฑ ๋ฐ ๋กค๋ฐฑ ์šฉ์ด์„ฑ ์ฐจ์ด๋Š” ์–ด๋–ป๊ฒŒ ๋‚˜ํƒ€๋‚˜๋Š”๊ฐ€? [15, 17, 18] +- ๋ธŒ๋žœ์น˜ ์ด๋ฆ„๊ณผ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€์— ํ‹ฐ์ผ“ ID๋ฅผ ์˜๋ฌด์ ์œผ๋กœ ํฌํ•จํ•˜๋Š” ๊ฑฐ๋ฒ„๋„Œ์Šค๋Š”, ์‹ค์ œ ์ด์Šˆ ํŠธ๋ž˜ํ‚น ๋„๊ตฌ(์˜ˆ: JIRA) ๋ฐ CI/CD ํŒŒ์ดํ”„๋ผ์ธ๊ณผ ๊ฒฐํ•ฉ ์‹œ ์–ด๋–ค ์ž๋™ํ™” ํ˜œํƒ์„ ์ œ๊ณตํ•˜๋Š”๊ฐ€? [2, 10] +- ์žฅ๊ธฐ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜(Long-lived feature branches)๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ๊ฑฐ๋Œ€ํ•œ ๋ณ‘ํ•ฉ ์ถฉ๋Œ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ํŒ€์€ ์ผ์ผ ์ž‘์—…์—์„œ ์–ด๋–ค ๋™๊ธฐํ™” ํŒจํ„ด์„ ์Šต๊ด€ํ™”ํ•ด์•ผ ํ•˜๋Š”๊ฐ€? [18, 21] + +### Practical Application Contexts +- **Implementation:** ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ ์‹œ `feature/PROJ-123-user-auth`์ฒ˜๋Ÿผ ํ‹ฐ์ผ“ ID๋ฅผ ํฌํ•จํ•˜๋Š” ๋ช…๋ช… ๊ทœ์น™์„ ์ ์šฉํ•˜๊ณ , `feat: add login form` ๋“ฑ์˜ Conventional Commits ํ˜•์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„ ์ด๋ ฅ์„ ์ฒด๊ณ„์ ์œผ๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค [10, 11]. +- **System Design:** ์ฝ”๋“œ๋ฅผ ํ•˜๋‚˜์˜ ๋…ผ๋ฆฌ์  ๋‹จ์œ„๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ์›์ž์  ์ปค๋ฐ‹(Atomic Commits) ๊ทœ์น™์„ ๋„์ž…ํ•˜๊ณ , CI/CD ์ฒดํฌ๊ฐ€ ํ†ต๊ณผ๋˜๊ณ  1์ธ ์ด์ƒ์ด ์Šน์ธํ•ด์•ผ๋งŒ `main`์— ๋ณ‘ํ•ฉ ๊ฐ€๋Šฅํ•˜๋„๋ก ๋ธŒ๋žœ์น˜ ๋ณดํ˜ธ(Branch Protection) ์‹œ์Šคํ…œ์„ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค [14, 15]. +- **Operation / Maintenance:** `main` ๋ธŒ๋žœ์น˜๋Š” ํ•ญ์ƒ ์•ˆ์ •์ ์ด๊ณ  ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ(deployable) ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋„๋ก ์šด์˜ํ•˜๋ฉฐ, ๋ณ‘ํ•ฉ ์™„๋ฃŒ ํ›„ ์‚ฌ์šฉ์ด ๋๋‚œ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜๋ฅผ ์ž๋™ ์‚ญ์ œ ์„ค์ •ํ•˜์—ฌ ์ €์žฅ์†Œ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค [7, 15, 18]. +- **Learning Path:** ์ฒ˜์Œ์—๋Š” ๋ณต์žกํ•œ ๋ฃฐ ์—†์ด ๋‹จ์ˆœํ•œ Feature-Branch ์›Œํฌํ”Œ๋กœ์šฐ์™€ ๋ช…ํ™•ํ•œ ๋„ค์ด๋ฐ ๊ทœ์น™์„ ์ตํžˆ๊ณ , ์ˆ™๋ จ๋„๊ฐ€ ๋†’์•„์ง€๋ฉด ์ž๋™ํ™”๋œ CI ํ™˜๊ฒฝ ํ•˜์˜ Trunk-Based ๊ฐœ๋ฐœ ๋˜๋Š” ๋ณต์žกํ•œ ๋ฒ„์ „ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ Git Flow๋กœ ํ•™์Šต์„ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค [9, 19, 20]. +- **My Project Relevance:** ํ”„๋ก ํŠธ์—”๋“œ/React ๊ฐœ๋ฐœ ํ”„๋กœ์ ํŠธ ๋“ฑ์˜ ํŒ€ ๋‹จ์œ„ ํ˜‘์—… ์‹œ, ๋ถˆํ•„์š”ํ•œ ์ ˆ์ฐจ ์—†์ด ์ฝ”๋“œ ์ถฉ๋Œ์„ ์ตœ์†Œํ™”ํ•˜๊ณ  ์ถ”์  ๊ฐ€๋Šฅํ•œ ๋ณ€๊ฒฝ ๋‚ด์—ญ์„ ๋ณด์žฅํ•˜๋Š” ํ˜‘์—… ๊ธฐ์ค€์„ ๋งˆ๋ จํ•˜๋Š” ๋ฐ ์ฆ‰๊ฐ์ ์œผ๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1, 22]. + +### Adjacent Topics +- [[Continuous Integration / Continuous Deployment (CI/CD)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: PR ๋‹จ๊ณ„์—์„œ ์ž๋™ํ™”๋œ ํ…Œ์ŠคํŠธ ๋ฐ ๋ฆฐํŒ…์„ ์‹คํ–‰ํ•˜๊ณ , ๋ฉ”์ธ ๋ธŒ๋žœ์น˜ ๋ณ‘ํ•ฉ ์‹œ ๋ฐฐํฌ๋ฅผ ์ž๋™ํ™”ํ•˜์—ฌ ๋ฒ„์ „ ๊ด€๋ฆฌ ๋„๊ตฌ์™€ ์–ด๋–ป๊ฒŒ ์‹œ๋„ˆ์ง€๋ฅผ ๋‚ด๋Š”์ง€ ์กฐ์‚ฌ. [1, 19] +- [[Issue Tracking Systems]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: JIRA๋‚˜ GitHub Issues ๋“ฑ์˜ ๋„๊ตฌ๊ฐ€ Git์˜ ํ‹ฐ์ผ“ ID ๊ฑฐ๋ฒ„๋„Œ์Šค์™€ ๊ฒฐํ•ฉ๋˜์–ด ์š”๊ตฌ์‚ฌํ•ญ๋ถ€ํ„ฐ ์ฝ”๋“œ ๋ณ€๊ฒฝ๊นŒ์ง€ ์–ด๋–ป๊ฒŒ ์™„๋ฒฝํ•œ ์ถ”์ ์„ฑ(Traceability)์„ ๋ณด์žฅํ•˜๋Š”์ง€ ์กฐ์‚ฌ. [2, 23] + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Technical_Reports/system_analysis_and_improvement_plan.md b/10_Wiki/Technical_Reports/system_analysis_and_improvement_plan.md new file mode 100644 index 00000000..cf92d5ac --- /dev/null +++ b/10_Wiki/Technical_Reports/system_analysis_and_improvement_plan.md @@ -0,0 +1,27 @@ +# 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/10_Wiki/Topics_Art/Visual Regression Testing.md b/10_Wiki/Topics_Art/Visual Regression Testing.md new file mode 100644 index 00000000..7711b648 --- /dev/null +++ b/10_Wiki/Topics_Art/Visual Regression Testing.md @@ -0,0 +1,57 @@ +# [[Visual Regression Testing]] + +## ๐Ÿ“Œ Brief Summary +์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ(Visual Regression Testing)๋Š” ์Šคํ† ๋ฆฌ๋ถ(Storybook) ๋“ฑ์˜ ๋„๊ตฌ๋กœ ๋ Œ๋”๋ง๋œ ์ปดํฌ๋„ŒํŠธ์˜ ํ”ฝ์…€ ๋‹จ์œ„ ์Šคํฌ๋ฆฐ์ƒท์„ ์บก์ฒ˜ํ•˜์—ฌ ์ด์ „์— ์•Œ๋ ค์ง„ "์ •์ƒ(baseline)" ์ƒํƒœ์˜ ์Šคํฌ๋ฆฐ์ƒท๊ณผ ์ž๋™์œผ๋กœ ๋น„๊ตํ•˜๋Š” ํ…Œ์ŠคํŠธ ๋ฐฉ์‹์ด๋‹ค [1, 2]. ์ด๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๋Š” ํ’€ ๋ฆฌํ€˜์ŠคํŠธ(PR) ๊ณผ์ •์—์„œ ์˜๋„์น˜ ์•Š์€ UI ๋ ˆ์ด์•„์›ƒ, ์ƒ‰์ƒ, ํƒ€์ดํฌ๊ทธ๋ž˜ํ”ผ ๋“ฑ์˜ ์‹œ๊ฐ์  ๋ณ€๊ฒฝ์ด๋‚˜ ๊ฒฐํ•จ์„ ์ฐพ์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค [3-5]. HTML ๋งˆํฌ์—…๋งŒ ๋น„๊ตํ•˜๋Š” ๊ธฐ์กด์˜ ์Šค๋ƒ…์ƒท ํ…Œ์ŠคํŠธ์™€ ๋‹ฌ๋ฆฌ, ์‹ค์ œ ์‚ฌ์šฉ์ž๊ฐ€ ๊ฒฝํ—˜ํ•˜๋Š” ํ™”๋ฉด ํ”ฝ์…€์„ ์ง์ ‘ ๊ฒ€์ฆํ•˜๋ฏ€๋กœ ์ถ”๊ฐ€์ ์ธ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ์ด๋‚˜ ์œ ์ง€๋ณด์ˆ˜ ๋ถ€๋‹ด์„ ์ค„์ด๋ฉด์„œ๋„ ์˜คํƒ(false positive)์„ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ํŠน์ง•์ด๋‹ค [1, 2]. + +## ๐Ÿ“– Core Content +* **์ž‘๋™ ์›๋ฆฌ ๋ฐ ํ”„๋กœ์„ธ์Šค:** ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ๋Š” ์ฝ”๋“œ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ ๋ชจ๋“  ์Šคํ† ๋ฆฌ(story)๋ฅผ ์‹ค์ œ ๋ธŒ๋ผ์šฐ์ €(Chrome, Firefox, Safari ๋“ฑ) ํ™˜๊ฒฝ์—์„œ ๋ Œ๋”๋งํ•˜๊ณ , ํ•ด๋‹น ํ™”๋ฉด์„ ์บก์ฒ˜ํ•˜์—ฌ ๊ธฐ์กด์˜ ๊ธฐ์ค€์„ (baseline)๊ณผ ๋น„๊ตํ•œ๋‹ค [4, 6]. ๋งŒ์•ฝ ๋ ˆ์ด์•„์›ƒ์ด๋‚˜ ์ƒ‰์ƒ ๋“ฑ์— ์˜๋„์น˜ ์•Š์€ ๋ณ€ํ™”๊ฐ€ ๊ฐ์ง€๋˜๋ฉด ํ•ด๋‹น ์ฐจ์ด์ ์„ ๊ฐ•์กฐํ•˜์—ฌ PR์—์„œ ์ˆ˜๋™ ๊ฒ€ํ† ๋ฅผ ๊ฑฐ์น˜๊ฒŒ ํ•จ์œผ๋กœ์จ ์‹œ๊ฐ์  ๊ฒฐํ•จ์ด ํ”„๋กœ๋•์…˜์œผ๋กœ ๋ฐฐํฌ๋˜๋Š” ๊ฒƒ์„ ์ฐจ๋‹จํ•œ๋‹ค [3, 6, 7]. ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์˜๋„๋œ ๊ฒƒ์ด๋ผ๋ฉด ๊ฐœ๋ฐœ์ž๊ฐ€ ์ƒˆ๋กœ์šด ๊ธฐ์ค€์„ ์œผ๋กœ ์Šน์ธ(accept)ํ•˜์—ฌ ๋กœ์ปฌ ๋ฐ CI ํ™˜๊ฒฝ์— ๋™๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค [7, 8]. +* **์Šค๋ƒ…์ƒท ํ…Œ์ŠคํŠธ(Snapshot Testing)์™€์˜ ์ฐจ์ด์ :** ๊ธฐ์กด ์Šค๋ƒ…์ƒท ํ…Œ์ŠคํŠธ๋Š” ๋ Œ๋”๋ง๋œ HTML ๋งˆํฌ์—… ๋ธ”๋ก์„ ๋น„๊ตํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ฝ”๋“œ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์œผ๋‚˜ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์ด๋Š” ์‹ค์ œ ์‹œ๊ฐ์  ๋ณ€๊ฒฝ์ด ์—†๋Š” ๊ฒฝ์šฐ์—๋„ ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ•˜๋Š” ์˜คํƒ(false positive)์ด ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฝ๋‹ค [2]. ๋ฐ˜๋ฉด ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ๋Š” ๋ Œ๋”๋ง๋œ ํ”ฝ์…€ ์ž์ฒด๋ฅผ ๋น„๊ตํ•˜๋ฏ€๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ์‹ค์ œ๋กœ ๊ฒฝํ—˜ํ•˜๋Š” UI์˜ ๋ชจ์–‘, ๊ฐ„๊ฒฉ, ๋ฐ˜์‘ํ˜• ๋™์ž‘ ๋“ฑ์„ ํ›จ์”ฌ ๋” ์ •ํ™•ํ•˜๊ณ  ํ’๋ถ€ํ•˜๊ฒŒ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๋‹ค [2, 5]. +* **์ธํ„ฐ๋ž™์…˜(Interaction) ๊ธฐ๋ฐ˜ ์ƒํƒœ ๊ฒ€์ฆ:** ์ปดํฌ๋„ŒํŠธ์˜ ๋กœ๋”ฉ, ์—๋Ÿฌ, ํ˜ธ๋ฒ„(hover), ๋ฉ”๋‰ด ์—ด๋ฆผ ๋“ฑ์˜ ๋‹ค์–‘ํ•œ UI ์ƒํƒœ๋ฅผ ๊ฒ€์ฆํ•˜๊ธฐ ์œ„ํ•ด ์Šคํ† ๋ฆฌ๋ถ์˜ ์ธํ„ฐ๋ž™์…˜ ํ…Œ์ŠคํŠธ์™€ ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ๋ฅผ ๊ฒฐํ•ฉํ•  ์ˆ˜ ์žˆ๋‹ค [9]. ์ธํ„ฐ๋ž™์…˜ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด ์ปดํฌ๋„ŒํŠธ๋ฅผ ํŠน์ • ์ƒํƒœ๋กœ ๋งŒ๋“  ํ›„ ์Šคํฌ๋ฆฐ์ƒท์„ ์ฐ์Œ์œผ๋กœ์จ ๋™์ ์ธ ํ–‰๋™์— ๋Œ€ํ•œ ์‹œ๊ฐ์  ๊ฒฐํ•จ ์œ ๋ฌด๊นŒ์ง€ ํ•˜๋‚˜์˜ ์›Œํฌํ”Œ๋กœ์šฐ ์•ˆ์—์„œ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค [9, 10]. +* **CI ํŒŒ์ดํ”„๋ผ์ธ ์ž๋™ํ™”:** ์ด ํ…Œ์ŠคํŠธ๋Š” GitHub Actions, GitLab Pipelines ๋“ฑ CI ํ™˜๊ฒฝ๊ณผ ์›ํ™œํ•˜๊ฒŒ ํ†ตํ•ฉ๋˜์–ด ํ’€ ๋ฆฌํ€˜์ŠคํŠธ(PR)๋งˆ๋‹ค ์ž๋™์œผ๋กœ ์‹คํ–‰๋œ๋‹ค [11, 12]. ํ…Œ์ŠคํŠธ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด PR์— UI ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•œ ์•Œ๋ฆผ(badge)์„ ์ œ๊ณตํ•˜์—ฌ, ๋ฆฌ๋ทฐ์–ด๊ฐ€ ๋ชจ๋“  ์ƒํƒœ๋ฅผ ์ผ์ผ์ด ํ™•์ธํ•˜๋Š” ๋Œ€์‹  ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„(diffs)์—๋งŒ ์ง‘์ค‘ํ•ด์„œ ๋ฆฌ๋ทฐํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š”๋‹ค [6, 12]. + +## โš–๏ธ Trade-offs & Caveats +* **๋ฏธ์„ธํ•œ ํ”ฝ์…€ ์ฐจ์ด๋กœ ์ธํ•œ ๋…ธ์ด์ฆˆ(Flakiness):** ๋ธŒ๋ผ์šฐ์ €์˜ ์ด๋ฏธ์ง€ ์••์ถ• ๋…ธ์ด์ฆˆ๋‚˜ ์•ˆํ‹ฐ์•จ๋ฆฌ์–ด์‹ฑ(anti-aliasing) ์ฒ˜๋ฆฌ ๋“ฑ ์•„์ฃผ ๋ฏธ์„ธํ•œ ํ”ฝ์…€ ์ฐจ์ด ๋•Œ๋ฌธ์— ์‹ค์ œ๋กœ๋Š” ๊ฒฐํ•จ์ด ์•„๋‹˜์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์‹œ๊ฐ์  ๋ณ€๊ฒฝ์œผ๋กœ ๊ฐ์ง€๋˜๋Š” ํ…Œ์ŠคํŠธ ๋ถˆ์•ˆ์ •์„ฑ(Flake)์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค [11, 13]. ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ ๋„๊ตฌ์—์„œ๋Š” ์ƒ‰์ƒ ์ฐจ์ด ํ—ˆ์šฉ์น˜(color-delta tolerance) ์ž„๊ณ„๊ฐ’์„ ์„ค์ •ํ•˜์—ฌ ํ•ด๋‹น ๋ฒ”์ฃผ ์•„๋ž˜์˜ ์ฐจ์ด๋Š” ๋…ธ์ด์ฆˆ๋กœ ๋ฌด์‹œํ•˜๋Š” ์ตœ์ ํ™” ์ž‘์—…์ด ์š”๊ตฌ๋œ๋‹ค [10, 13]. +* **๋น„๋™๊ธฐ ์š”์†Œ ๋ฐ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ œ์–ด์˜ ํ•„์š”์„ฑ:** ์ปดํฌ๋„ŒํŠธ์— ํฌํ•จ๋œ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด๋‚˜ ๋น„๋™๊ธฐ ์—์…‹, ํฐํŠธ ๋“ฑ์ด ์™„์ „ํžˆ ๋ Œ๋”๋ง๋˜๊ธฐ ์ „์— ์Šคํฌ๋ฆฐ์ƒท์ด ์บก์ฒ˜๋˜๋ฉด ๋งค๋ฒˆ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์™€ ์ผ๊ด€๋œ ํ…Œ์ŠคํŠธ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•ด์ง„๋‹ค [10, 11]. ๋”ฐ๋ผ์„œ ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ ๋„๊ตฌ(Happo ๋“ฑ)๋Š” ์บก์ฒ˜ ์ „ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ž๋™์œผ๋กœ ์Œ์†Œ๊ฑฐ(silence) ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜ ๋น„๋™๊ธฐ ์š”์†Œ์˜ ๋กœ๋”ฉ์„ ๊ฐ•์ œ๋กœ ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๋Š” ๊ธฐ์ˆ ์  ์ œ์•ฝ๊ณผ ์ถ”๊ฐ€ ์„ค์ •์ด ํ•„์š”ํ•˜๋‹ค [10, 11]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [ํ…Œ์ŠคํŠธ ๋ฐ ๊ฒ€์ฆ ๊ธฐ์ˆ ] +- [[Snapshot Testing]] + - ์—ฐ๊ฒฐ ์ด์œ : ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ์™€ ๋Œ€์กฐ๋˜๋Š” ํ…Œ์ŠคํŠธ ๋ฐฉ์‹์œผ๋กœ, ํ”ฝ์…€์ด ์•„๋‹Œ ๋ Œ๋”๋ง๋œ HTML ๋งˆํฌ์—… ์ฝ”๋“œ ๋ฉ์–ด๋ฆฌ๋ฅผ ๋น„๊ตํ•œ๋‹ค [2]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: HTML ๊ตฌ์กฐ ๋น„๊ต ๋ฐฉ์‹์ด ์™œ ๋นˆ๋ฒˆํ•˜๊ฒŒ ์˜คํƒ(False Positive)์„ ๋ฐœ์ƒ์‹œํ‚ค๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ํ”ฝ์…€ ๊ธฐ๋ฐ˜ ๋น„๊ต๊ฐ€ ์œ ์ง€๋ณด์ˆ˜์— ์™œ ๋” ์œ ๋ฆฌํ•œ์ง€ ๋ช…ํ™•ํ•˜๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค [2]. +- [[Interaction Testing]] + - ์—ฐ๊ฒฐ ์ด์œ : ์‚ฌ์šฉ์ž์˜ ์ƒํ˜ธ์ž‘์šฉ์ด๋‚˜ ์ด๋ฒคํŠธ๋ฅผ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ์˜ ํŠน์ • UI ์ƒํƒœ๋ฅผ ์œ ๋„ํ•˜๋Š” ํ…Œ์ŠคํŠธ ๋ฐฉ์‹์ด๋‹ค [5, 10]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ •์  UI ํ™”๋ฉด๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋กœ๋”ฉ, ์—๋Ÿฌ, ํด๋ฆญ ์‹œ ๋“œ๋กญ๋‹ค์šด ์˜คํ”ˆ ๋“ฑ ๋™์ ์œผ๋กœ ๋ณ€ํ™”ํ•˜๋Š” UI ์ƒํƒœ๋ฅผ ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ๊ฐ€ ์–ด๋–ป๊ฒŒ ์บก์ฒ˜ํ•˜๊ณ  ๊ฒ€์ฆํ•˜๋Š”์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค [9, 10]. + +#### [๊ตฌํ˜„ ๋ฐ ํ™œ์šฉ ๋„๊ตฌ] +- [[Storybook]] + - ์—ฐ๊ฒฐ ์ด์œ : UI ์ปดํฌ๋„ŒํŠธ๋ฅผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ณต์žกํ•œ ๋กœ์ง๊ณผ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ฒฉ๋ฆฌ๋œ ํ™˜๊ฒฝ์—์„œ ์‹œ๊ฐ์ ์œผ๋กœ ๊ฐœ๋ฐœํ•˜๊ณ  ๋ฌธ์„œํ™”ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋„๊ตฌ์ด๋‹ค [3, 6]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ๊ฐ€ ์ „์ฒด ํŽ˜์ด์ง€ ๋‹จ์œ„๊ฐ€ ์•„๋‹Œ ๊ฐœ๋ณ„ ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ(Story) ๋‹จ์œ„๋กœ ๋ Œ๋”๋ง๋˜๊ณ  ๊ธฐ์ค€์„ ๊ณผ ๋น„๊ต๋˜๋Š” ์•„ํ‚คํ…์ฒ˜์  ๊ธฐ๋ฐ˜์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค [1]. +- [[Chromatic]] / [[Happo]] + - ์—ฐ๊ฒฐ ์ด์œ : Storybook๊ณผ ์—ฐ๊ฒฐ๋˜์–ด ์‹ค์ œ ๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋ฐ˜์˜ ์Šคํฌ๋ฆฐ์ƒท ์บก์ฒ˜, ๋ฒ ์ด์Šค๋ผ์ธ ํ”ฝ์…€ ๋น„๊ต, CI/CD ์—ฐ๋™ ๋“ฑ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค(๋„๊ตฌ)์ด๋‹ค [1, 3, 4]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ž๋™ํ™”๋œ ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ๊ฐ€ ๋ธŒ๋ผ์šฐ์ € ๊ฐ„์˜ ๋ Œ๋”๋ง ์ฐจ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ๋ณ‘๋ ฌ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ  ํ’€ ๋ฆฌํ€˜์ŠคํŠธ(PR) ํ”„๋กœ์„ธ์Šค์™€ ์–ด๋–ป๊ฒŒ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค [4, 12]. + +### Deeper Research Questions +- Snapshot Testing์—์„œ Visual Regression Testing์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ๋•Œ, ๋Œ€๊ทœ๋ชจ ์ปดํฌ๋„ŒํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ™˜๊ฒฝ์—์„œ ์ดˆ๊ธฐ ๊ธฐ์ค€์„ (baseline) ๊ตฌ์ถ• ๋ฐ ์Šคํ† ๋ฆฌ์ง€ ์œ ์ง€๋ณด์ˆ˜ ๋น„์šฉ์€ ์–ด๋–ป๊ฒŒ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- Chromatic์ด๋‚˜ Happo์™€ ๊ฐ™์€ ๋„๊ตฌ๊ฐ€ ํฌ๋กœ์Šค ๋ธŒ๋ผ์šฐ์ €(Chrome, Safari, Firefox ๋“ฑ)์—์„œ ๋™์ผํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋งํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” OS/๋ธŒ๋ผ์šฐ์ € ์—”์ง„๋ณ„ ๋ฏธ์„ธํ•œ ๋ Œ๋”๋ง ์ฐจ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋ณด์ •ํ•˜๋Š”๊ฐ€? +- ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ ํŒŒ์ดํ”„๋ผ์ธ์„ CI/CD์— ํ†ตํ•ฉํ–ˆ์„ ๋•Œ ๋นŒ๋“œ ์‹œ๊ฐ„ ์ง€์—ฐ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ(Parallelization) ๋ฐ ์ตœ์ ํ™” ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? +- ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋ฐ ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๋ณต์žกํ•œ ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ์ปดํฌ๋„ŒํŠธ์—์„œ ํ…Œ์ŠคํŠธ์˜ ๋ถˆ์•ˆ์ •์„ฑ(Flakiness)์„ ์ฝ”๋“œ ๋ ˆ๋ฒจ์—์„œ ๊ทผ๋ณธ์ ์œผ๋กœ ์ œ๊ฑฐํ•˜๋ ค๋ฉด ์ปดํฌ๋„ŒํŠธ๋ฅผ ์–ด๋–ป๊ฒŒ ์„ค๊ณ„ํ•ด์•ผ ํ•˜๋Š”๊ฐ€? +- Visual Regression Testing๊ณผ Accessibility Regression Testing์„ ํ•˜๋‚˜์˜ ์›Œํฌํ”Œ๋กœ์šฐ๋กœ ๊ฒฐํ•ฉํ–ˆ์„ ๋•Œ, ์ ‘๊ทผ์„ฑ ์œ„๋ฐ˜ ์‚ฌํ•ญ์ด ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ค ์‹œ๊ฐ์  ์ง€ํ‘œ์™€ ํ•จ๊ป˜ ๋ฆฌํฌํŠธ๋˜๋ฉฐ PR ๋ฆฌ๋ทฐ ํ”„๋กœ์„ธ์Šค๋Š” ์–ด๋–ป๊ฒŒ ํšจ์œจํ™”๋˜๋Š”๊ฐ€? + +### Practical Application Contexts +- **Implementation:** Storybook์œผ๋กœ UI ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฐœ๋ฐœํ•œ ํ›„, Chromatic์ด๋‚˜ Happo ๋“ฑ์˜ ์• ๋“œ์˜จ์„ ์„ค์น˜ํ•˜์—ฌ ์ฝ”๋“œ ๋ณ€๊ฒฝ ์‹œ๋งˆ๋‹ค ๊ฐ ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ๋ณ„ ์Šคํฌ๋ฆฐ์ƒท์„ ์ž๋™์œผ๋กœ ์บก์ฒ˜ํ•˜๊ณ  ๊ธฐ์ค€์„ ๊ณผ ๋น„๊ตํ•˜๋„๋ก ์„ค์ •ํ•œ๋‹ค [4, 14]. +- **System Design:** ํ”„๋ก ํŠธ์—”๋“œ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ ์‹œ, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ UI๋ฅผ ์ฒ ์ €ํžˆ ๋ถ„๋ฆฌํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ตฌ์ถ•ํ•˜๊ณ , ์‹œ๊ฐ์  ๊ฒ€์ฆ ์‹œ์Šคํ…œ์„ ๋„์ž…ํ•˜์—ฌ ๋Œ€๊ทœ๋ชจ ํŒ€์ด ๋™์‹œ์— ๊ฐœ๋ฐœํ•˜๋”๋ผ๋„ ์ผ๊ด€๋œ ๋””์ž์ธ ์‹œ์Šคํ…œ์ด ํ›ผ์†๋˜์ง€ ์•Š๋„๋ก ๋ฐฉ์–ด ์ฒด๊ณ„๋ฅผ ๋งˆ๋ จํ•œ๋‹ค [3, 4]. +- **Operation / Maintenance:** CI ํŒŒ์ดํ”„๋ผ์ธ(GitHub Actions ๋“ฑ)์— ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ๋ฅผ ํ•„์ˆ˜ ๋‹จ๊ณ„๋กœ ์ถ”๊ฐ€ํ•˜์—ฌ, ๋ณ€๊ฒฝ๋œ ๋””์ž์ธ ์ฝ”๋“œ๊ฐ€ PR์— ์˜ฌ๋ผ์˜ฌ ๋•Œ๋งˆ๋‹ค ์˜๋„์น˜ ์•Š์€ ๋ ˆ์ด์•„์›ƒ ๊นจ์ง ํ˜„์ƒ์„ ์ž๋™์œผ๋กœ ๊ฐ์ง€ํ•˜๊ณ  ๋ฆฌ๋ทฐ์–ด์—๊ฒŒ ์‹œ๊ฐ์  Diff๋ฅผ ์ œ๊ณตํ•˜์—ฌ ์šด์˜ ์œ ์ง€๋ณด์ˆ˜ ๋ถ€๋‹ด์„ ์ค„์ธ๋‹ค [3, 6, 12]. +- **Learning Path:** React ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜ UI ์ž‘์„ฑ โ†’ Storybook์„ ํ™œ์šฉํ•œ ์ปดํฌ๋„ŒํŠธ ๋ฌธ์„œํ™” ๋ฐ CDD(Component-Driven Development) โ†’ ์ธํ„ฐ๋ž™์…˜(Interaction) ํ…Œ์ŠคํŠธ ์ž‘์„ฑ โ†’ ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ ์ž๋™ํ™” ์ˆœ์œผ๋กœ ํ”„๋ก ํŠธ์—”๋“œ ํ’ˆ์งˆ ๊ฒ€์ฆ ํŒŒ์ดํ”„๋ผ์ธ์„ ํ•™์Šตํ•œ๋‹ค [9, 15]. +- **My Project Relevance:** ํ”„๋ก ํŠธ์—”๋“œ ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•˜๊ฑฐ๋‚˜ ์ˆ˜๋ฐฑ ๊ฐœ์˜ ํ™”๋ฉด์—์„œ ๊ณต์œ ๋˜๋Š” ์ฝ”์–ด UI ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฒ„์ „์„ ์—…๊ทธ๋ ˆ์ด๋“œํ•  ๋•Œ, ๋‹ค๋ฅธ ํŒ€์˜ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์˜๋„์น˜ ์•Š์€ ํŒŒ๊ธ‰ ํšจ๊ณผ(Side Effect) ๋ฐ ์‹œ๊ฐ์  ๊นจ์ง์„ ์•ˆ์ „ํ•˜๊ฒŒ ๊ฐ์ง€ํ•˜๊ณ  ํ™•์‹ ์„ ๊ฐ–๊ณ  ๋ฐฐํฌํ•˜๋Š” ๋ฐ ํ•ต์‹ฌ์ ์ธ ์—ญํ• ์„ ํ•œ๋‹ค [3, 16]. + +### Adjacent Topics +- [[Accessibility Regression Testing]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ ์›Œํฌํ”Œ๋กœ์šฐ์™€ ๊ฒฐํ•ฉํ•˜์—ฌ, ์ƒˆ๋กœ์šด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๋ณ„๋„๋กœ ์ž‘์„ฑํ•  ํ•„์š” ์—†์ด ์Šคํฌ๋ฆฐ์ƒท ์‹คํ–‰ ๋‹จ๊ณ„์—์„œ UI์˜ ์ ‘๊ทผ์„ฑ ์œ„๋ฐ˜(๋ช…๋„ ๋Œ€๋น„ ๋ถ€์กฑ, ํ‚ค๋ณด๋“œ ํฌ์ปค์Šค ๋ˆ„๋ฝ ๋“ฑ)๊นŒ์ง€ ๋™์‹œ์— ์ž๋™ ๊ฒ€์ฆํ•˜๋Š” ์˜์—ญ์œผ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋‹ค [9, 10]. +- [[Continuous Integration (CI) Pipelines]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: GitHub Actions, CircleCI ๋“ฑ์˜ CI ๋„๊ตฌ์—์„œ ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ ์ธํ”„๋ผ๊ฐ€ ์–ด๋–ป๊ฒŒ ์—ฐ๋™๋˜๋ฉฐ, ์ฝ”๋“œ๊ฐ€ ๋ณ‘ํ•ฉ๋˜๊ธฐ ์ „์— PR์˜ ์ƒํƒœ ์ฒดํฌ(Status Check)๋ฅผ ํ•„์ˆ˜๋กœ ์ œ์–ดํ•˜๋Š” ์ž๋™ํ™” ํŒŒ์ดํ”„๋ผ์ธ ๋ฐ DevOps ํ”„๋กœ์„ธ์Šค๋กœ ํ•™์Šต์„ ๋„“ํž ์ˆ˜ ์žˆ๋‹ค [12]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Topics_Biz/Agile Environments.md b/10_Wiki/Topics_Biz/Agile Environments.md new file mode 100644 index 00000000..dbf3a829 --- /dev/null +++ b/10_Wiki/Topics_Biz/Agile Environments.md @@ -0,0 +1,47 @@ +# [[Agile Environments]] + +## ๐Ÿ“Œ Brief Summary +Agile Environments(์• ์ž์ผ ํ™˜๊ฒฝ)๋Š” ์š”๊ตฌ์‚ฌํ•ญ์ด ์ง€์†์ ์œผ๋กœ ๋ณ€ํ™”ํ•˜๋Š” ํ”„๋กœ์ ํŠธ๋‚˜ ์Šคํƒ€ํŠธ์—… ํ™˜๊ฒฝ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค [1]. ์ด๋Ÿฌํ•œ ํ™˜๊ฒฝ์—์„œ๋Š” ๋ฏธ๋ž˜์— ํ•„์š”ํ• ์ง€๋„ ๋ชจ๋ฅด๋Š” ๋ณต์žกํ•œ ๊ธฐ๋Šฅ์„ ๋ฏธ๋ฆฌ ๊ฐœ๋ฐœํ•˜๊ธฐ๋ณด๋‹ค๋Š” ์˜ค์ง ํ˜„์žฌ์˜ ์š”๊ตฌ์‚ฌํ•ญ์— ์ง‘์ค‘ํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค [2]. ๋”ฐ๋ผ์„œ ๊ฐ ๊ธฐ๋Šฅ์„ ๋…๋ฆฝ์ ์œผ๋กœ ์ƒ์„ฑํ•˜๊ณ  ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์—ฐํ•˜๊ณ  ๋ชจ๋“ˆํ™”๋œ ์ ‘๊ทผ ๋ฐฉ์‹์ด ๋งค์šฐ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค [3]. + +## ๐Ÿ“– Core ์†Œ์Šค์— ๊ด€๋ จ ์ •๋ณด๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค.Content +์• ์ž์ผ ํ™˜๊ฒฝ(Agile Environments)๊ณผ ๊ด€๋ จํ•˜์—ฌ ์ œ๊ณต๋œ ์†Œ์Šค์—์„œ ๋‹ค๋ฃจ๊ณ  ์žˆ๋Š” ๊ตฌ์ฒด์ ์ธ ์„ค๋ช…์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. + +* **YAGNI ์›์น™์˜ ์ค‘์š”์„ฑ**: ์• ์ž์ผ ํ™˜๊ฒฝ์—์„œ๋Š” "You Aren't Gonna Need It (YAGNI)" ์›์น™์ด ํŠนํžˆ ํ•„์ˆ˜์ ์œผ๋กœ ์ž‘์šฉํ•ฉ๋‹ˆ๋‹ค [2]. ๋ณ€ํ™”ํ•˜๋Š” ์š”๊ตฌ์‚ฌํ•ญ์„ ๊ฐ€์ง„ ์Šคํƒ€ํŠธ์—…์ด๋‚˜ ์• ์ž์ผ ํ”„๋กœ์ ํŠธ์—์„œ๋Š”, ๋ฏธ๋ž˜์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๋Œ€๋น„ํ•˜์—ฌ ๋ณต์žกํ•œ ๊ธฐ๋Šฅ์„ ๋ฏธ๋ฆฌ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์„ ํ”ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [1, 2]. ๊ฐœ๋ฐœํŒ€์€ ์˜ค์ง ํ˜„์žฌ์˜ ์š”๊ตฌ์‚ฌํ•ญ์—๋งŒ ์ง‘์ค‘ํ•จ์œผ๋กœ์จ ๋‚˜์ค‘์— ์œ ์ง€๋ณด์ˆ˜ํ•ด์•ผ ํ•  ๋ณต์žก์„ฑ๊ณผ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์ฝ”๋“œ(dead code)์˜ ์–‘์„ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2]. +* **๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ(Feature-Based Structure)์˜ ์ ํ•ฉ์„ฑ**: ํ”„๋ก ํŠธ์—”๋“œ ์•„ํ‚คํ…์ฒ˜ ์ธก๋ฉด์—์„œ ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ํด๋” ๊ตฌ์กฐ๋Š” ์• ์ž์ผ ๊ฐœ๋ฐœ ๋ฐฉ๋ฒ•๋ก ๊ณผ ๋งค์šฐ ์ž˜ ๋งž์Šต๋‹ˆ๋‹ค [3]. ์ด ๊ตฌ์กฐ์—์„œ๋Š” ๊ฐ๊ฐ์˜ ๊ธฐ๋Šฅ(feature)์ด ๋…๋ฆฝ์ ์œผ๋กœ ๋ถ„๋ฆฌ๋˜์–ด ์ƒ์„ฑ ๋ฐ ๊ตฌํ˜„๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์• ์ž์ผ ํ™˜๊ฒฝ์—์„œ ์š”๊ตฌํ•˜๋Š” ์œ ์—ฐ์„ฑ๊ณผ ๋ณ‘๋ ฌ์ ์ธ ๊ฐœ๋ฐœ์„ ํšจ๊ณผ์ ์œผ๋กœ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค [3]. +* *์ฐธ๊ณ : ์ฃผ์–ด์ง„ ์†Œ์Šค์—๋Š” ๊ฐœ๋ฐœ ์›์น™(YAGNI) ๋ฐ ํด๋” ๊ตฌ์กฐ(Feature-Based)์™€ ์• ์ž์ผ์˜ ์—ฐ๊ด€์„ฑ๋งŒ ์–ธ๊ธ‰๋˜์–ด ์žˆ์œผ๋ฉฐ, ์Šคํฌ๋Ÿผ์ด๋‚˜ ์Šคํ”„๋ฆฐํŠธ ๋“ฑ ์• ์ž์ผ ํ™˜๊ฒฝ ์ž์ฒด์˜ ์ „๋ฐ˜์ ์ธ ํ”„๋กœ์„ธ์Šค๋‚˜ ์ด๋ก ์— ๋Œ€ํ•ด์„œ๋Š” ์†Œ์Šค์— ๊ด€๋ จ ์ •๋ณด๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค.* + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts +- [[YAGNI]] + - ์—ฐ๊ฒฐ ์ด์œ : ์• ์ž์ผ ํ™˜๊ฒฝ์—์„œ ๋ฏธ๋ž˜์˜ ๋ถˆํ™•์‹คํ•œ ๊ธฐ๋Šฅ์„ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์ง€ ์•Š๊ณ  ํ˜„์žฌ์˜ ์š”๊ตฌ์‚ฌํ•ญ์— ์ง‘์ค‘ํ•˜๋„๋ก ์ด๋„๋Š” ๊ฐ€์žฅ ํ•ต์‹ฌ์ ์ธ ๊ฐœ๋ฐœ ์›์น™์ž…๋‹ˆ๋‹ค [1, 2]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์• ์ž์ผ ํ™˜๊ฒฝ์—์„œ ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ(Dead Code)์˜ ์ƒ์„ฑ์„ ๋ฐฉ์ง€ํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜ ๋น„์šฉ์„ ์ตœ์†Œํ™”ํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ํŒ๋‹จ ๊ธฐ์ค€์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2]. +- [[Feature-Based Structure]] + - ์—ฐ๊ฒฐ ์ด์œ : ์• ์ž์ผ ๋ฐฉ๋ฒ•๋ก ๊ณผ ๊ฐ€์žฅ ์ž˜ ์–ด์šธ๋ฆฌ๋Š” ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด์œผ๋กœ, ์ฝ”๋“œ ๋ฒ ์ด์Šค๋ฅผ ๊ธฐ๋Šฅ ๋‹จ์œ„๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ๋…๋ฆฝ์ ์ธ ๊ฐœ๋ฐœ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค [3]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์• ์ž์ผ ํŒ€์ด ์š”๊ตฌ์‚ฌํ•ญ ๋ณ€๊ฒฝ์— ๋งž์ถฐ ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ์„ ๋…๋ฆฝ์ ์œผ๋กœ ํ™•์žฅํ•˜๊ณ  ๊ฐœ๋ฐœํ•  ๋•Œ ํŒŒ์ผ๊ณผ ํด๋”๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑํ•ด์•ผ ํ•˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3]. +- [[Startup Projects]] + - ์—ฐ๊ฒฐ ์ด์œ : ์• ์ž์ผ ํ™˜๊ฒฝ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์š”๊ตฌ์‚ฌํ•ญ์ด ์ง€์†์ ์œผ๋กœ ๋ณ€ํ™”ํ•˜๋Š” ํŠน์„ฑ์„ ๊ณต์œ ํ•˜๋ฉฐ, YAGNI ์›์น™์ด ๊ฐ•ํ•˜๊ฒŒ ์ ์šฉ๋˜๋Š” ๋Œ€ํ‘œ์ ์ธ ๋น„์ฆˆ๋‹ˆ์Šค ํ™˜๊ฒฝ์ž…๋‹ˆ๋‹ค [1]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์• ์ž์ผ ์›์น™์ด ์‹ค๋ฌด์—์„œ ์–ด๋– ํ•œ ํ˜•ํƒœ์˜ ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๋‚˜ ์ƒํ™ฉ(๋น ๋ฅธ ๋ณ€ํ™”์™€ ์œ ์—ฐ์„ฑ ์š”๊ตฌ)์—์„œ ์ฃผ๋กœ ์ฑ„ํƒ๋˜๋Š”์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1]. + +### Deeper Research Questions +- ์• ์ž์ผ ํ™˜๊ฒฝ์—์„œ YAGNI ์›์น™์„ ์—„๊ฒฉํ•˜๊ฒŒ ์ ์šฉํ•˜์—ฌ ๋‹น์žฅ์˜ ๊ธฐ๋Šฅ๋งŒ ๊ฐœ๋ฐœํ•  ๋•Œ, ํ–ฅํ›„ ์‹œ์Šคํ…œ์ด ํ™•์žฅ๋˜๋ฉด์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ์ˆ  ๋ถ€์ฑ„(Technical Debt)๋Š” ์–ด๋–ป๊ฒŒ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋Š”๊ฐ€? +- ์š”๊ตฌ์‚ฌํ•ญ์ด ๋Š์ž„์—†์ด ๋ณ€ํ™”ํ•˜๋Š” ์• ์ž์ผ ํ”„๋กœ์ ํŠธ์—์„œ Feature-Based Structure๊ฐ€ ๊ธฐ์กด์˜ ํŒŒ์ผ ์œ ํ˜• ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ(File-Type Based Structure)๋ณด๋‹ค ํŒ€ ํ˜‘์—… ๋ฐ ์œ ์ง€๋ณด์ˆ˜์— ์œ ๋ฆฌํ•œ ๊ตฌ์ฒด์  ์ด์œ ๋Š” ๋ฌด์—‡์ธ๊ฐ€? +- ์Šคํƒ€ํŠธ์—… ํ”„๋กœ์ ํŠธ์˜ ์ดˆ๊ธฐ ๋‹จ๊ณ„์—์„œ ์• ์ž์ผ ์›์น™(YAGNI, KISS ๋“ฑ)์„ ์ ์šฉํ•  ๋•Œ์™€, ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ํ™˜๊ฒฝ์œผ๋กœ ํ™•์žฅ(Scaling)๋  ๋•Œ ์•„ํ‚คํ…์ฒ˜ ์›์น™(SOLID ๋“ฑ)์˜ ์ ์šฉ ๋น„์ค‘์€ ์–ด๋–ป๊ฒŒ ๋ณ€ํ™”ํ•ด์•ผ ํ•˜๋Š”๊ฐ€? +- ๊ธฐ๋Šฅ(Feature)์„ ๋…๋ฆฝ์ ์œผ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ฐœ๋ฐœํ•˜๋Š” ์• ์ž์ผ ํ™˜๊ฒฝ์—์„œ, ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ ๊ฐ„์— ๊ณต์œ ๋˜๋Š” ๊ต์ฐจ ์˜์กด์„ฑ(Cross-cutting concerns)์€ ๊ตฌ์กฐ์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•ด์•ผ ํ•˜๋Š”๊ฐ€? +- ์• ์ž์ผ ํ™˜๊ฒฝ์˜ 'ํ˜„์žฌ ์š”๊ตฌ์‚ฌํ•ญ์— ๋Œ€ํ•œ ์ง‘์ค‘'๊ณผ '์žฅ๊ธฐ์ ์ธ ์†Œํ”„ํŠธ์›จ์–ด ์•„ํ‚คํ…์ฒ˜์˜ ๊ฒฌ๊ณ ํ•จ' ์‚ฌ์ด์˜ ๊ท ํ˜•์„ ๋งž์ถ”๊ธฐ ์œ„ํ•œ ๊ฐœ๋ฐœ ๊ฑฐ๋ฒ„๋„Œ์Šค๋Š” ์–ด๋–ป๊ฒŒ ๊ตฌ์ถ•ํ•ด์•ผ ํ•˜๋Š”๊ฐ€? + +### Practical Application Contexts +- **Implementation:** ์ฃผ์–ด์ง„ ์Šคํ† ๋ฆฌ๋‚˜ ํƒœ์Šคํฌ์˜ ์š”๊ตฌ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ตœ์†Œํ•œ์˜ ์ฝ”๋“œ๋งŒ ์šฐ์„ ์ ์œผ๋กœ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค (์˜ค๋ฒ„์—”์ง€๋‹ˆ์–ด๋ง ๊ธˆ์ง€) [2]. +- **System Design:** ํ”„๋กœ์ ํŠธ ํด๋”์™€ ๋ชจ๋“ˆ์„ ๊ธฐ๋Šฅ(Feature)์„ ์ค‘์‹ฌ์œผ๋กœ ์„ค๊ณ„ํ•˜์—ฌ, ์š”๊ตฌ์‚ฌํ•ญ์ด ๋ณ€๊ฒฝ๋˜๋”๋ผ๋„ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ์ตœ์†Œํ™”ํ•˜๊ณ  ๋…๋ฆฝ์ ์ธ ๋ฐฐํฌ ๋ฐ ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค [3]. +- **Operation / Maintenance:** ์–ธ์  ๊ฐ€ ์“ฐ์ผ ๊ฒƒ์ด๋ผ ์˜ˆ์ƒํ•˜๊ณ  ์ž‘์„ฑํ•œ ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ๋ฅผ ๋ฐฐ์ œํ•จ์œผ๋กœ์จ, ์šด์˜ ๋‹จ๊ณ„์—์„œ ํŒ€์ด ๊ด€๋ฆฌํ•˜๊ณ  ํŒŒ์•…ํ•ด์•ผ ํ•  ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ์˜ ๋ณต์žก์„ฑ์„ ๋Œ€ํญ ๋‚ฎ์ถฅ๋‹ˆ๋‹ค [2]. +- **Learning Path:** ์• ์ž์ผ ํ™˜๊ฒฝ์— ํ•ฉ๋ฅ˜ํ•˜๊ธฐ ์œ„ํ•ด YAGNI ์›์น™์˜ ์ ์šฉ๋ฒ•๊ณผ Feature-Sliced Design๊ณผ ๊ฐ™์€ ์ตœ์‹  ๊ธฐ๋Šฅ ๋‹จ์œ„์˜ ๋ชจ๋“ˆํ˜• ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด์„ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค [2, 3]. +- **My Project Relevance:** ์žฆ์€ ๊ธฐํš ๋ณ€๊ฒฝ์ด ์˜ˆ์ƒ๋˜๋Š” ์ดˆ๊ธฐ ๋‹จ๊ณ„์˜ ์Šคํƒ€ํŠธ์—… ํ”„๋กœ์ ํŠธ๋‚˜ ์• ์ž์ผ ์กฐ์ง์„ ์„ธํŒ…ํ•  ๋•Œ, ์ดˆ๊ธฐ ๊ฐœ๋ฐœ ์†๋„๋ฅผ ๋†’์ด๋ฉด์„œ๋„ ๋ณ€๊ฒฝ์— ์œ ์—ฐํ•˜๊ฒŒ ๋Œ€์‘ํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ€์ด๋“œ๋ผ์ธ์œผ๋กœ ์ง๊ฒฐ๋ฉ๋‹ˆ๋‹ค [1, 3]. + +### Adjacent Topics +- [[SOLID Principles]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ์• ์ž์ผ ํ™˜๊ฒฝ์—์„œ ๋‹น์žฅ์˜ ๊ธฐ๋Šฅ์„ ๋‹จ์ˆœํ•˜๊ฒŒ ๊ฐœ๋ฐœ(YAGNI)ํ•˜๋ฉด์„œ๋„, ์žฅ๊ธฐ์ ์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ทœ๋ชจ๊ฐ€ ์ปค์กŒ์„ ๋•Œ ์ฝ”๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ์œ ์ง€๋ณด์ˆ˜ ๊ฐ€๋Šฅํ•˜๊ฒŒ ์„ค๊ณ„ํ• ์ง€ ๊ฐ์ฒด ์ง€ํ–ฅ์ /๊ตฌ์กฐ์  ๊ด€์ ์—์„œ ์ดํ•ด๋ฅผ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1, 4]. +- [[Clean Code]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋น ๋ฅธ ๋ณ€ํ™”์™€ ๋ฐ˜๋ณต ๊ฐœ๋ฐœ(Iteration)์ด ์ผ์–ด๋‚˜๋Š” ์• ์ž์ผ ํ™˜๊ฒฝ ์†์—์„œ, ์—ฌ๋Ÿฌ ๋ช…์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ฝ”๋“œ๋ฅผ ์‰ฝ๊ฒŒ ์ฝ๊ณ  ํ˜‘์—…ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ธฐ๋ณธ์ ์ธ ์ฝ”๋“œ ํ’ˆ์งˆ ์œ ์ง€ ๊ธฐ๋ฒ•์œผ๋กœ ํ™•์žฅ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค [4, 5]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Topics_Biz/Branching Strategies.md b/10_Wiki/Topics_Biz/Branching Strategies.md new file mode 100644 index 00000000..0c39642f --- /dev/null +++ b/10_Wiki/Topics_Biz/Branching Strategies.md @@ -0,0 +1,71 @@ +# [[Branching Strategies]] + +## ๐Ÿ“Œ Brief ์†ŒSummary +Branching Strategies(๋ธŒ๋žœ์นญ ์ „๋žต)๋Š” ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ ์ฝ”๋“œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ด€๋ฆฌํ•˜๊ณ  ํŒ€์› ๊ฐ„์˜ ํ˜‘์—…์„ ์กฐ์œจํ•˜๊ธฐ ์œ„ํ•ด ๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ(Git ๋“ฑ)์—์„œ ๋ธŒ๋žœ์น˜๋ฅผ ์ƒ์„ฑ, ๋ณ‘ํ•ฉ, ์œ ์ง€๋ณด์ˆ˜ํ•˜๋Š” ๊ทœ์น™๊ณผ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ํŒ€์˜ ๊ทœ๋ชจ์™€ ํ”„๋กœ์ ํŠธ ์š”๊ตฌ์‚ฌํ•ญ์— ๋”ฐ๋ผ Git Flow, GitHub Flow, Trunk-Based Development, Feature Branch Workflow ๋“ฑ ๋‹ค์–‘ํ•œ ์ „๋žต์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋ช…ํ™•ํ•œ ๋ธŒ๋žœ์นญ ์ „๋žต์˜ ๋„์ž…์€ ๋ฉ”์ธ ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•˜๊ณ  ๋ณ‘ํ•ฉ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๋ฉฐ ์ฝ”๋“œ ๋ฆฌ๋ทฐ์™€ ์ถ”์ ์„ฑ์„ ๊ฐ•ํ™”ํ•˜๋Š” ํ•ต์‹ฌ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค [1-3]. + +## ๐Ÿ“– Core Content +* **์ฃผ์š” ๋ธŒ๋žœ์นญ ์ „๋žต ์œ ํ˜•** + * **Feature Branch Workflow (๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜ ์›Œํฌํ”Œ๋กœ์šฐ):** 2~5๋ช… ๊ทœ๋ชจ์˜ ์†Œ๊ทœ๋ชจ ํŒ€์— ๊ฐ€์žฅ ์ดˆ๋ณด์ž ์นœํ™”์ ์ด๊ณ  ์ถฉ๋Œ์ด ์ ์€ ์›Œํฌํ”Œ๋กœ์šฐ์ž…๋‹ˆ๋‹ค [4]. `main` ๋ธŒ๋žœ์น˜๋Š” ํ•ญ์ƒ ์•ˆ์ •์ ์ด๊ณ  ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋ฉฐ, ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด๋‚˜ ๋ฒ„๊ทธ ์ˆ˜์ • ์‹œ `main`์—์„œ ํŒŒ์ƒ๋œ ์งง์€ ์ˆ˜๋ช…์˜ ๋ธŒ๋žœ์น˜๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค [5]. ๊ฐœ๋ฐœ ์™„๋ฃŒ ํ›„ Pull Request(PR)๋ฅผ ์—ด๊ณ  ์ตœ์†Œ 1๋ช… ์ด์ƒ์˜ ๋™๋ฃŒ ๋ฆฌ๋ทฐ์™€ ํ…Œ์ŠคํŠธ๋ฅผ ๊ฑฐ์นœ ํ›„ Squash Merge ๋ฐฉ์‹์œผ๋กœ ๋ณ‘ํ•ฉํ•ฉ๋‹ˆ๋‹ค [6, 7]. + * **Trunk-Based Development (ํŠธ๋ ํฌ ๊ธฐ๋ฐ˜ ๊ฐœ๋ฐœ):** ๊ฐ•๋ ฅํ•œ CI(์ง€์†์  ํ†ตํ•ฉ) ํ™˜๊ฒฝ์„ ๊ฐ–์ถ˜ ์ˆ™๋ จ๋œ ํŒ€์— ์ ํ•ฉํ•œ ๊ฐ€๋ฒผ์šด ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค [8, 9]. ์ˆ˜๋ช…์ด ๋งค์šฐ ์งง์€ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์— ์ž‘์€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ž์ฃผ ์ปค๋ฐ‹ํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์ตœ์†Œํ™”๋˜๊ณ  ํ”ผ๋“œ๋ฐฑ์ด ๋น ๋ฅด๋ฉฐ ๋Œ€๊ทœ๋ชจ ๋ณ‘ํ•ฉ ์ถฉ๋Œ์„ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [8, 10]. + * **Git Flow:** ์ •๊ธฐ์ ์ธ ๋ฆด๋ฆฌ์Šค ์ผ์ •์„ ๊ฐ€์ง„ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค [9]. ํ•˜์ง€๋งŒ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜ ์™ธ์—๋„ `develop`, `release` ๋“ฑ ๊ด€๋ฆฌํ•ด์•ผ ํ•  ๋ธŒ๋žœ์น˜๊ฐ€ ๋งŽ์•„ ์†Œ๊ทœ๋ชจ ํŒ€์—๊ฒŒ๋Š” ๋ฌด๊ฒ๊ณ  ๊ณผ๋„ํ•œ ๋ณต์žก์„ฑ์„ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [9, 11, 12]. + * **GitHub Flow:** `main` ๋ธŒ๋žœ์น˜๋กœ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜๋ฅผ ์ง์ ‘ ๋ณ‘ํ•ฉํ•˜๋Š” ๋‹จ์ˆœํ™”๋œ ๊ตฌ์กฐ๋กœ, Git Flow๋ณด๋‹ค ๋น ๋ฅด๊ณ  ์ง€์†์ ์ธ ๋ฐฐํฌ ํ™˜๊ฒฝ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค [11, 13]. + +* **๋ชจ๋“  ์ „๋žต์— ์ ์šฉ๋˜๋Š” ๋ชจ๋ฒ” ์‚ฌ๋ก€ (Best Practices)** + * **ํ‹ฐ์ผ“ ID ๋ฐ ๋ช…๋ช… ๊ทœ์น™ ์‚ฌ์šฉ:** ๋ธŒ๋žœ์น˜ ์ด๋ฆ„๊ณผ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€์— ์š”๊ตฌ์‚ฌํ•ญ ์ถ”์ ์„ ์œ„ํ•œ ํ‹ฐ์ผ“ ID(์˜ˆ: `feature/PROJ-123-user-auth`)๋ฅผ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [14, 15]. ๋ธŒ๋žœ์น˜ ์ด๋ฆ„์€ ์ผ€๋ฐฅ ์ผ€์ด์Šค(kebab-case)๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์งง๊ณ  ๋ช…ํ™•ํ•˜๊ฒŒ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค [16, 17]. + * **์›์ž์  ์ปค๋ฐ‹ (Atomic Commits):** ํ•˜๋‚˜์˜ ์ปค๋ฐ‹์—๋Š” ํ•˜๋‚˜์˜ ๋…ผ๋ฆฌ์  ๋ณ€๊ฒฝ ์‚ฌํ•ญ๋งŒ ํฌํ•จํ•˜์—ฌ ์ฝ”๋“œ ๋ฆฌ๋ทฐ์™€ ํžˆ์Šคํ† ๋ฆฌ ์ถ”์ ์„ ๋‹จ์ˆœํ™”ํ•ฉ๋‹ˆ๋‹ค [7, 18]. + * **Conventional Commits ๊ทœ์น™:** ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๋Š” `feat:`, `fix:`, `chore:` ๋“ฑ์˜ ํ‘œ์ค€ํ™”๋œ ์ ‘๋‘์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€๊ฒฝ์˜ ๋ชฉ์ ์„ ๋ช…ํ™•ํžˆ ํ•ฉ๋‹ˆ๋‹ค [19-21]. + * **PR ๋ฐ ๋ณ‘ํ•ฉ ๊ทœ์น™:** ์ฝ”๋“œ๋ฅผ ์ ˆ๋Œ€ `main`์— ์ง์ ‘ ํ‘ธ์‹œํ•ด์„œ๋Š” ์•ˆ ๋˜๋ฉฐ, ๋ฐ˜๋“œ์‹œ PR์„ ํ†ตํ•œ ๋ฆฌ๋ทฐ๋ฅผ ๊ฑฐ์ณ์•ผ ํ•ฉ๋‹ˆ๋‹ค [6, 22]. ๋ณ‘ํ•ฉ ํ›„์—๋Š” ์‚ฌ์šฉ์ด ๋๋‚œ ๋ธŒ๋žœ์น˜๋ฅผ ์ฆ‰์‹œ ์‚ญ์ œํ•˜์—ฌ ์ €์žฅ์†Œ๋ฅผ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค [6, 23]. + +* **์ „๋žต ๊ฐ„ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋ฐฉ๋ฒ•** + * ํ”„๋กœ์ ํŠธ๊ฐ€ ๋ณ€ํ™”ํ•จ์— ๋”ฐ๋ผ ์ „๋žต๋„ ์ง„ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํ†ตํ•ฉ ์†๋„๋ฅผ ๋†’์ด๋ ค๋ฉด Feature Branch์—์„œ Trunk-Based(๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ ์‚ฌ์šฉ ๋ฐ ์ˆ˜๋ช… ๋‹จ์ถ•)๋กœ ์ „ํ™˜ํ•˜๊ณ , ๋” ๋งŽ์€ ์ฒด๊ณ„๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด GitHub Flow์—์„œ Git Flow(`develop` ๋ธŒ๋žœ์น˜ ๋ฐ ๋ฆด๋ฆฌ์Šค ๋ธŒ๋žœ์น˜ ์ถ”๊ฐ€)๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [11, 12]. + +## โš–๏ธ Trade-offs & Caveats +* **๊ตฌ์กฐ์  ์˜ค๋ฒ„ํ—ค๋“œ vs. ์•ˆ์ •์„ฑ:** Git Flow๋Š” ๊ตฌ์กฐ๊ฐ€ ๋ช…ํ™•ํ•˜๊ณ  ์ •๊ธฐ์ ์ธ ๋ฆด๋ฆฌ์Šค์— ๊ฐ•์ ์ด ์žˆ์ง€๋งŒ, ๋ธŒ๋žœ์น˜์˜ ์ˆ˜๊ฐ€ ๋งŽ์•„ ์œ ์ง€๋ณด์ˆ˜ ๋น„์šฉ(์˜ค๋ฒ„ํ—ค๋“œ)์ด ๋†’์Šต๋‹ˆ๋‹ค [9]. ๋ฐ˜๋ฉด Feature Branch๋‚˜ Trunk-Based ๋ฐฉ์‹์€ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ฐ€๋ฒผ์šด ๋Œ€์‹  ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์˜ ๋ณดํ˜ธ(`main` ๋ธŒ๋žœ์น˜ ์ง์ ‘ ํ‘ธ์‹œ ๊ธˆ์ง€, ์—„๊ฒฉํ•œ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๋“ฑ) ๊ทœ์น™์ด ๊ฐ•์ œ๋˜์ง€ ์•Š์œผ๋ฉด ์ฝ”๋“œ๊ฐ€ ์‰ฝ๊ฒŒ ๊นจ์งˆ ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค [6, 22]. +* **๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜์˜ ์ˆ˜๋ช…(Long-lived branches) ๋ฌธ์ œ:** ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜๋‚˜ GitHub Flow๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ, ๋ธŒ๋žœ์น˜์˜ ์ˆ˜๋ช…์ด ๋ช‡ ์ฃผ ์ด์ƒ ๊ธธ์–ด์ง€๋ฉด ๋‹ค๋ฅธ ์ž‘์—…์ž์™€์˜ ์ฝ”๋“œ ๋ถ„๊ธฐ๊ฐ€ ์‹ฌํ•ด์ ธ ๊ฑฐ๋Œ€ํ•œ ๋ณ‘ํ•ฉ ์ถฉ๋Œ(Merge conflicts)์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [17]. ๋”ฐ๋ผ์„œ ๋งค์ผ `main`์˜ ์ตœ์‹  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ Pull ํ•˜๊ฑฐ๋‚˜ Rebaseํ•˜์—ฌ ์ถฉ๋Œ์„ ์˜ˆ๋ฐฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [7]. +* **Trunk-Based ๊ฐœ๋ฐœ์˜ ์˜์กด์„ฑ:** ๋น ๋ฅธ ๋ณ‘ํ•ฉ์„ ์ง€ํ–ฅํ•˜๋Š” Trunk-Based Development๋Š” ์ง€์†์ ์ด๊ณ  ์ž๋™ํ™”๋œ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ(CI)๊ณผ ๋ฏธ์™„์„ฑ ๊ธฐ๋Šฅ์„ ํ”„๋กœ๋•์…˜์—์„œ ์ˆจ๊ธฐ๊ธฐ ์œ„ํ•œ ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ(Feature Flags) ๊ตฌํ˜„ ๋“ฑ ๊ธฐ์ˆ ์  ๋’ท๋ฐ›์นจ์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค [9, 11]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [๊ด€๊ณ„ ์œ ํ˜• A: ์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๋ฐฉ๋ฒ•๋ก ] +- [[Feature Branch Workflow]] + - ์—ฐ๊ฒฐ ์ด์œ : ์†Œ๊ทœ๋ชจ 3~5์ธ ๊ฐœ๋ฐœ ํŒ€์— ๊ฐ€์žฅ ์ถ”์ฒœ๋˜๋Š” ๋‹จ์ˆœํ•˜๊ณ  ์ง๊ด€์ ์ธ ๋ธŒ๋žœ์นญ ์ „๋žต์˜ ๊ธฐ๋ฐ˜ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ฉ”์ธ ๋ธŒ๋žœ์น˜๋ฅผ ์˜ค์—ผ์‹œํ‚ค์ง€ ์•Š๊ณ  ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ๊ฒฉ๋ฆฌ๋œ ํ™˜๊ฒฝ์—์„œ ๊ฐœ๋ฐœํ•˜๊ณ  ๋ณ‘ํ•ฉํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก ์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[Trunk-Based Development]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋ฌด๊ฑฐ์šด ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ํƒˆํ”ผํ•˜์—ฌ ๋ธŒ๋žœ์น˜ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๊ทนํ•œ์œผ๋กœ ์ค„์ด๊ณ  ๋น ๋ฅธ ํ†ตํ•ฉ์„ ์ค‘์‹œํ•˜๋Š” ์ตœ์‹  ํŠธ๋ Œ๋“œ ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: CI/CD ํ™˜๊ฒฝ์—์„œ์˜ ์žฆ์€ ์†Œ๊ทœ๋ชจ ๋ฐฐํฌ ๋ฐฉ์‹๊ณผ ์ถฉ๋Œ ์ตœ์†Œํ™” ์ „๋žต์„ ํ•™์Šตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[Git Flow]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋ธŒ๋žœ์นญ ์ „๋žต์˜ ๊ณ ์ „์ ์ด๊ณ  ์ฒด๊ณ„์ ์ธ ํ˜•ํƒœ๋กœ์„œ, ๋Œ€ํ˜• ํ”„๋กœ์ ํŠธ์˜ ์ •๊ธฐ์  ๋ฒ„์ €๋‹ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: `develop`, `release`, `hotfix` ๋“ฑ ๊ฐœ๋ฐœ ํŒŒ์ดํ”„๋ผ์ธ์— ๋”ฐ๋ฅธ ๋ธŒ๋žœ์น˜์˜ ์—ญํ•  ๋ถ„๋ฆฌ ๊ธฐ๋ฒ•์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +#### [๊ด€๊ณ„ ์œ ํ˜• B: ๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ ๋ฐ ๊ทœ์น™] +- [[Pull Request & Code Review]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋ธŒ๋žœ์นญ ์ „๋žต์ด ์•ˆ์ „ํ•˜๊ฒŒ ๋™์ž‘ํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋“  ๋ณ‘ํ•ฉ ์ „์— ํ•„์ˆ˜์ ์œผ๋กœ ๊ฑฐ์ณ์•ผ ํ•˜๋Š” ํ’ˆ์งˆ ๊ฒ€์ฆ ๊ด€๋ฌธ์ž…๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํŒ€์› ๊ฐ„์˜ ๋น„๋™๊ธฐ์  ํ”ผ๋“œ๋ฐฑ ์ˆ˜๋ ด, ์‹œ๊ฐ์  ๊ฒ€์ฆ, ๊ทธ๋ฆฌ๊ณ  CI ํ†ต๊ณผ๋ฅผ ์ „์ œ๋กœ ํ•œ ์•ˆ์ „ํ•œ ๋ณ‘ํ•ฉ ๊ณผ์ •์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[Conventional Commits]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋ธŒ๋žœ์น˜ ๋ณ‘ํ•ฉ ๋‚ด์—ญ์„ ์ถ”์ ํ•˜๊ณ  ๊ฐ€๋…์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ์ „ ์„ธ๊ณ„์ ์œผ๋กœ ํ†ต์šฉ๋˜๋Š” ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ์ž‘์„ฑ ํ‘œ์ค€์ž…๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: `feat(scope): message` ์™€ ๊ฐ™์€ ํ˜•์‹์˜ ๊ตฌ๋ฌธ์„ ํ†ตํ•ด ์ฝ”๋“œ ํžˆ์Šคํ† ๋ฆฌ ํŒŒ์•… ๋ฐ ๋ฌธ์„œ ์ž๋™ํ™”๋ฅผ ์–ด๋–ป๊ฒŒ ์ด๋ฃฐ ์ˆ˜ ์žˆ๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### Deeper Research Questions +- Trunk-Based Development๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด ํ•„์ˆ˜์ ์ธ ์ž๋™ํ™” ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ(CI)๊ณผ ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ(Feature flags)์˜ ๊ตฌํ˜„ ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? +- ์†Œ๊ทœ๋ชจ ํŒ€์ด ๋‹จ์ผ `main` ๋ธŒ๋žœ์น˜ ์ „๋žต์„ ์‚ฌ์šฉํ•  ๋•Œ, ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๋ฒ„๊ทธ๊ฐ€ ๋ฐฐํฌ๋˜๋Š” ๊ฒƒ์„ ๋ง‰๊ธฐ ์œ„ํ•œ GitHub ์ €์žฅ์†Œ์˜ ๋ธŒ๋žœ์น˜ ๋ณดํ˜ธ ๊ทœ์น™(Branch Protection Rules) ์ตœ์ ํ™” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? +- ์žฅ๊ธฐ ์ฒด๋ฅ˜ ๋ธŒ๋žœ์น˜(Long-lived branch)์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๊ฑฐ๋Œ€ํ•œ ๋ณ‘ํ•ฉ ์ถฉ๋Œ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด `main` ๋ธŒ๋žœ์น˜์˜ ์ตœ์‹  ๋‚ด์šฉ์„ ๊ฐ€์ ธ์˜ฌ ๋•Œ `merge`์™€ `rebase` ์ค‘ ์–ด๋–ค ๋ฐฉ์‹์ด ์ด๋ ฅ ๊ด€๋ฆฌ์— ๋” ํšจ๊ณผ์ ์ธ๊ฐ€? +- ์›์ž์  ์ปค๋ฐ‹(Atomic Commits)์„ ๊ฐ•์ œํ•˜๋Š” ์ •์ฑ…์ด Pull Request ๋ฆฌ๋ทฐ ์‹œ๊ฐ„๊ณผ ๋ฒ„๊ทธ ์ถ”์ ์„ฑ์— ์–ด๋– ํ•œ ์ •๋Ÿ‰์ /์ •์„ฑ์  ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”๊ฐ€? +- Git Flow ๋ฐฉ์‹์—์„œ GitHub Flow ๋ฐฉ์‹์œผ๋กœ ํŒ€์˜ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ๋•Œ ์˜ˆ์ƒ๋˜๋Š” ํ˜ผ๋ž€ ์š”์†Œ์™€ ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ CI/CD ํŒŒ์ดํ”„๋ผ์ธ์˜ ์žฌ๊ตฌ์„ฑ ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? + +### Practical Application Contexts +- **Implementation:** ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ์„ ์‹œ์ž‘ํ•  ๋•Œ, ์ตœ์‹  `main` ๋ธŒ๋žœ์น˜์—์„œ `feature/ํ‹ฐ์ผ“ID-๊ฐ„๋‹จํ•œ-์„ค๋ช…` ์ด๋ฆ„์œผ๋กœ ๋ธŒ๋žœ์น˜๋ฅผ ํŒŒ์ƒํ•˜๊ณ , ์›์ž์  ๋‹จ์œ„๋กœ ์ž‘์€ ์ปค๋ฐ‹์„ ์ž์ฃผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. +- **System Design:** ํ”„๋ก ํŠธ์—”๋“œ ๋ชจ๋“ˆ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ ์‹œ, ๋…๋ฆฝ์ ์ธ ํ”ผ์ฒ˜(Feature) ํด๋”๋ณ„๋กœ ๋ธŒ๋žœ์น˜๋ฅผ ๋‚˜๋ˆ„์–ด ๊ฐœ๋ฐœํ•จ์œผ๋กœ์จ ํŠน์ • ์ฝ”๋“œ ์˜์—ญ ๋ฐ–์œผ๋กœ ๋ณ‘ํ•ฉ ์ถฉ๋Œ์˜ ํญ๋ฐœ ๋ฐ˜๊ฒฝ(Blast radius)์ด ํผ์ง€์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. +- **Operation / Maintenance:** ๋ธŒ๋žœ์น˜๊ฐ€ `main`์œผ๋กœ ๋ณ‘ํ•ฉ๋˜๋Š” ์ฆ‰์‹œ GitHub Action ๋“ฑ CI ์„œ๋ฒ„์—์„œ ์ž๋™์œผ๋กœ ๋ฆฐํŠธ(ESLint), ํ…Œ์ŠคํŠธ(Jest), ํฌ๋งทํŒ…์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ๋ฐฉ์–ด๋ง‰์„ ๊ตฌ์ถ•ํ•˜์—ฌ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์˜ ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋ฅผ ์˜๊ตฌ์ ์œผ๋กœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. +- **Learning Path:** Git์˜ ๊ธฐ์ดˆ ๋ช…๋ น์–ด๋ฅผ ์Šต๋“ํ•œ ํ›„, ์†Œ๊ทœ๋ชจ ํŒ€ ๋‹จ์œ„์˜ Feature Branch Workflow๋ฅผ ์‹ค์Šตํ•˜๊ณ , ์ดํ›„ CI/CD ๋„๊ตฌ๋ฅผ ์—ฐ๋™ํ•œ Trunk-Based ํ™˜๊ฒฝ์œผ๋กœ ๋ฐœ์ „ํ•˜๋Š” ์ˆœ์„œ๋กœ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค. +- **My Project Relevance:** 3~5์ธ ๊ทœ๋ชจ์˜ ํ”„๋กœ์ ํŠธ์—์„œ ๋ฌด๊ฑฐ์šด Git Flow์˜ ๋„์ž…์„ ์ง€์–‘ํ•˜๊ณ , '๋‹จ๊ธฐ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜ โ†’ PR ๋ฐ 1์ธ ์ด์ƒ ํ”ผ์–ด ๋ฆฌ๋ทฐ ์Šน์ธ โ†’ Squash Merge ๋ฐ ๋ธŒ๋žœ์น˜ ์ฆ‰์‹œ ์‚ญ์ œ'๋ผ๋Š” ๋‹จ์ˆœํ™”๋œ ๋ฃฐ์„ ์ ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœ ์†๋„์™€ ์ฝ”๋“œ ํ’ˆ์งˆ์„ ๋™์‹œ์— ์ฑ™๊น๋‹ˆ๋‹ค. + +### Adjacent Topics +- [[Continuous Integration / Continuous Deployment (CI/CD)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋ธŒ๋žœ์นญ ์ „๋žต์— ์˜ํ•ด ํŠธ๋ฆฌ๊ฑฐ(Trigger)๋˜์–ด ์‹คํ–‰๋˜๋Š” ๋นŒ๋“œ, ํ…Œ์ŠคํŠธ, ๋ฐฐํฌ ํŒŒ์ดํ”„๋ผ์ธ์˜ ์ž๋™ํ™” ํ”„๋กœ์„ธ์Šค๋ฅผ ๊นŠ์ด ์•Œ์•„๋ด…๋‹ˆ๋‹ค. +- [[Feature-Sliced Design (FSD)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋„๋ฉ”์ธ๊ณผ ๊ธฐ๋Šฅ ๋‹จ์œ„๋กœ ์ฝ”๋“œ๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ํ”„๋ก ํŠธ์—”๋“œ ์•„ํ‚คํ…์ฒ˜ ๋ฐฉ๋ฒ•๋ก ์œผ๋กœ, ๋ธŒ๋žœ์น˜๋ฅผ ๊ธฐ๋Šฅ๋ณ„๋กœ ๋‚˜๋ˆŒ ๋•Œ ์ถฉ๋Œ์„ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ์ตœ์†Œํ™”ํ•˜๋Š” ์ฝ”๋“œ ๊ตฌ์กฐ ์„ค๊ณ„๋ฒ•์„ ํƒ๊ตฌํ•ฉ๋‹ˆ๋‹ค. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Topics_Biz/Code Review.md b/10_Wiki/Topics_Biz/Code Review.md new file mode 100644 index 00000000..5436d57b --- /dev/null +++ b/10_Wiki/Topics_Biz/Code Review.md @@ -0,0 +1,56 @@ +# [[Code Review]] + +## ๐Ÿ“Œ Brief Summary +์ฝ”๋“œ ๋ฆฌ๋ทฐ(Code Review)๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋ฅผ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์— ๋ณ‘ํ•ฉํ•˜๊ธฐ ์ „์— ํŒ€์›(๋™๋ฃŒ)์ด ๊ฒ€ํ† ํ•˜์—ฌ ์Šน์ธํ•˜๋Š” ํ’ˆ์งˆ ๊ด€๋ฆฌ ๋ฐ ํ˜‘์—… ํ”„๋กœ์„ธ์Šค์ž…๋‹ˆ๋‹ค [1, 2]. ์ฃผ๋กœ Pull Request(PR) ๋‹จ๊ณ„๋ฅผ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง€๋ฉฐ, ๋‹จ๋…์œผ๋กœ ์ž˜๋ชป๋œ ์ฝ”๋“œ๊ฐ€ ๋ณ‘ํ•ฉ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ณ  ํŒ€ ๋‚ด ๋น ๋ฅธ ํ”ผ๋“œ๋ฐฑ ๋ฃจํ”„๋ฅผ ํ˜•์„ฑํ•ฉ๋‹ˆ๋‹ค [1]. ์ตœ๊ทผ ํ”„๋ก ํŠธ์—”๋“œ ํ™˜๊ฒฝ์—์„œ๋Š” ๋‹จ์ˆœํ•œ ์ฝ”๋“œ ๊ฒ€ํ† ๋ฅผ ๋„˜์–ด Storybook๊ณผ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ CI ํŒŒ์ดํ”„๋ผ์ธ๊ณผ ๊ฒฐํ•ฉํ•œ '์‹œ๊ฐ์  ๋ฆฌ๋ทฐ(Visual Review)'๋กœ ํ™•์žฅ๋˜์–ด ์˜๋„์น˜ ์•Š์€ UI ๋ณ€๊ฒฝ์„ ๋ฐฉ์ง€ํ•˜๋Š” ์—ญํ• ๋„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค [3]. + +## ๐Ÿ“– Core ์†Œ์Šค์— ๊ธฐ๋ฐ˜ํ•œ Core Content +- **๋™๋ฃŒ ๊ฒ€ํ† (Peer Review)์˜ ์—ญํ•  ๋ฐ ์ด์ **: ๊ฐœ๋ฐœ์ž๋Š” ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜(feature branch)์—์„œ ์ž‘์—…์„ ๋งˆ์นœ ํ›„ ๋ณ‘ํ•ฉ์„ ์œ„ํ•œ Pull Request(PR)๋ฅผ ์ƒ์„ฑํ•˜๋ฉฐ, ์ด๋•Œ ์ตœ์†Œ 1๋ช… ์ด์ƒ์˜ ํŒ€์›์—๊ฒŒ ๊ฒ€ํ† ์™€ ์Šน์ธ์„ ๋ฐ›์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค [1, 4]. ๋ฆฌ๋ทฐ์–ด๋Š” ๋ณ€๊ฒฝ๋œ ์ฝ”๋“œ์— ๋Œ€ํ•ด ์ฝ”๋ฉ˜ํŠธ๋ฅผ ๋‚จ๊ธฐ๋ฉฐ, ์ž‘์„ฑ์ž๊ฐ€ ์ด๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  ์žฌํ‘ธ์‹œ(push)ํ•˜์—ฌ ์ตœ์ข… ์Šน์ธ์„ ๋ฐ›์œผ๋ฉด ๋ณ‘ํ•ฉ์ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค [5]. ์ด๋Š” ๋‹จ์ผ ๊ฐœ๋ฐœ์ž์˜ ์‹ค์ˆ˜๋กœ ์ธํ•œ ์ž˜๋ชป๋œ ๋ณ‘ํ•ฉ์„ ๋ง‰๊ณ , ํŒ€์› ๊ฐ„์˜ ๊ฑด์ „ํ•œ ๋ฆฌ๋ทฐ ์Šต๊ด€๊ณผ ํ˜‘์—…์„ ์ด‰์ง„ํ•ฉ๋‹ˆ๋‹ค [1, 6]. +- **ํšจ์œจ์ ์ธ PR ์—ํ‹ฐ์ผ“**: ์›ํ™œํ•œ ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ์œ„ํ•ด์„œ๋Š” PR์„ ์ž‘๊ฒŒ ์œ ์ง€ํ•˜๊ณ  ๋‹จ์ผ ์ž‘์—…(Single task)์— ์ง‘์ค‘ํ•˜๋Š” ๊ฒƒ์ด ๋ชจ๋ฒ” ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค [2]. ๋ฆฌ๋ทฐ์–ด๊ฐ€ ํ•œ ๋ฒˆ์— 2,000์ค„ ์ด์ƒ์˜ ๋ฐฉ๋Œ€ํ•œ ์ฝ”๋“œ๋ฅผ ๊ฒ€์‚ฌํ•˜๋„๋ก ์š”๊ตฌํ•ด์„œ๋Š” ์•ˆ ๋˜๋ฉฐ, PR ๊ทœ๋ชจ๊ฐ€ ์ž‘์„์ˆ˜๋ก ๋” ๋น ๋ฅด๊ณ  ์ฒ ์ €ํ•˜๊ฒŒ ๊ฒ€ํ† ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2, 7]. +- **์‹œ๊ฐ์  ๋ฆฌ๋ทฐ(Visual Review)์˜ ๋„์ž…**: ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์˜ PR ํ”„๋กœ์„ธ์Šค์—์„œ๋Š” ์ฝ”๋“œ์˜ ๋…ผ๋ฆฌ ๊ฒ€ํ† ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์‹œ๊ฐ์  ํšŒ๊ท€(Visual Regression) ๊ฒ€ํ† ๊ฐ€ ํ•„์ˆ˜๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค [3]. ๊ฐœ๋ฐœ์ž๋Š” Storybook์„ ํ™œ์šฉํ•ด ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ตฌ์ถ•ํ•˜๊ณ , Chromatic์ด๋‚˜ Happo ๋“ฑ์˜ ๋„๊ตฌ๋ฅผ CI ํŒŒ์ดํ”„๋ผ์ธ์— ํ†ตํ•ฉํ•ฉ๋‹ˆ๋‹ค [3, 8]. +- **์ž๋™ํ™”๋œ ์‹œ๊ฐ์  ํšŒ๊ท€ ๊ฐ์ง€**: PR์ด ์—ด๋ฆฌ๋ฉด ์ด ๋„๊ตฌ๋“ค์ด ์—ฌ๋Ÿฌ ๋ธŒ๋ผ์šฐ์ € ๋ฐ ๋ทฐํฌํŠธ ํ™˜๊ฒฝ์—์„œ ์ž๋™์œผ๋กœ ๋ชจ๋“  UI ์ƒํƒœ์˜ ์Šคํฌ๋ฆฐ์ƒท์„ ์บก์ฒ˜ํ•˜๊ณ  ์ด์ „ ๊ธฐ์ค€์„ (baseline)๊ณผ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค [9, 10]. ๋ ˆ์ด์•„์›ƒ์ด๋‚˜ ์ƒ‰์ƒ ๋“ฑ์— ์˜๋„์น˜ ์•Š์€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋ฐœ๊ฒฌ๋˜๋ฉด PR์— ํ•ด๋‹น ์‚ฌํ•ญ์ด ์ˆ˜๋™ ๊ฒ€ํ†  ๋Œ€์ƒ์œผ๋กœ ํ‘œ์‹œ(flagged)๋˜์–ด ๋ฒ„๊ทธ๊ฐ€ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์œผ๋กœ ๋ฐฐํฌ๋˜๋Š” ๊ฒƒ์„ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค [3]. ๋”๋ถˆ์–ด, ์‹œ๊ฐ์  ๊ฒ€ํ†  ๋„๊ตฌ๋Š” ์‹œ๊ฐ์  ๋ณ€๊ฒฝ ์‚ฌํ•ญ๊ณผ ํ•จ๊ป˜ ์ƒˆ๋กœ์šด ์ ‘๊ทผ์„ฑ ์œ„๋ฐ˜(accessibility violations)๊นŒ์ง€ ํฌ์ฐฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [9, 11]. + +## โš–๏ธ Trade-offs & Caveats +- **๋ฆฌ๋ทฐ ๋ณ‘๋ชฉ ํ˜„์ƒ ๋ฐ ๋ณต์žก๋„ ์ฆ๊ฐ€**: ํ•œ ๋ฒˆ์— ์ˆ˜์ฒœ ์ค„์— ๋‹ฌํ•˜๋Š” ํฐ ๊ทœ๋ชจ์˜ ์ฝ”๋“œ(PR)๋ฅผ ๋ฆฌ๋ทฐํ•˜๋„๋ก ์š”์ฒญํ•  ๊ฒฝ์šฐ, ๋ฆฌ๋ทฐ์–ด๊ฐ€ ์ฝ”๋“œ๋ฅผ ์ฒ ์ €ํžˆ ๊ฐ์‚ฌ(audit)ํ•˜๊ธฐ ์–ด๋ ค์›Œ ๋ฆฌ๋ทฐ ์†๋„์™€ ํ’ˆ์งˆ์ด ๋ชจ๋‘ ์ €ํ•˜๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [2]. ์ด๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” PR์„ ๋งค์šฐ ์ž‘๊ฒŒ ๋‚˜๋ˆ„์–ด ์ง€์†์ ์œผ๋กœ ๋ฆฌ๋ทฐํ•ด์•ผ ํ•˜๋ฏ€๋กœ, ๊ฐœ๋ฐœ์ž๋Š” ์ž‘์—… ๋‹จ์œ„๋ฅผ ์„ธ๋ฐ€ํ•˜๊ฒŒ ์ชผ๊ฐœ์•ผ ํ•˜๋Š” ์ถ”๊ฐ€์ ์ธ ๋…ธ๋ ฅ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค [2, 7]. +- **์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ์˜ ๋ถˆ์•ˆ์ •์„ฑ(Flake) ์ด์Šˆ**: ์‹œ๊ฐ์  ๋ฆฌ๋ทฐ๋ฅผ ์œ„ํ•ด ์Šคํฌ๋ฆฐ์ƒท ๊ธฐ๋ฐ˜ ํ…Œ์ŠคํŠธ๋ฅผ ๋„์ž…ํ•  ๋•Œ, ์ปดํฌ๋„ŒํŠธ์˜ ๊ธฐ๋Šฅ์  ๋ณ€๊ฒฝ์ด ์—†๋”๋ผ๋„ ์••์ถ• ๋…ธ์ด์ฆˆ, ์•ˆํ‹ฐ์•จ๋ฆฌ์–ด์‹ฑ, ๋น„๋™๊ธฐ ์—์…‹(ํฐํŠธ ๋“ฑ), ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋“ฑ์œผ๋กœ ์ธํ•ด ๋ฏธ์„ธํ•œ ํ”ฝ์…€ ์ฐจ์ด๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ์˜ค๋ฅ˜๋กœ ์ฒ˜๋ฆฌ๋˜๋Š” ๊ฑฐ์ง“ ์–‘์„ฑ(False positive) ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [8, 12]. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ƒ‰์ƒ ์˜ค์ฐจ ํ—ˆ์šฉ ๋ฒ”์œ„(color-delta tolerance)๋ฅผ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์Œ์†Œ๊ฑฐํ•˜๋Š” ๋“ฑ์˜ ์ถ”๊ฐ€์ ์ธ ๊ตฌ์„ฑ(Configuration)๊ณผ ๊ด€๋ฆฌ๊ฐ€ ์š”๊ตฌ๋ฉ๋‹ˆ๋‹ค [8, 12, 13]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [ํ˜‘์—… ๋ฐ ํ˜•์ƒ ๊ด€๋ฆฌ ์›Œํฌํ”Œ๋กœ์šฐ] +- [[Pull Request (PR)]] + - ์—ฐ๊ฒฐ ์ด์œ : ์ฝ”๋“œ ๋ฆฌ๋ทฐ๊ฐ€ ์‹ค์งˆ์ ์œผ๋กœ ์š”์ฒญ๋˜๊ณ , ๊ฒ€ํ†  ํ”ผ๋“œ๋ฐฑ์ด ์˜ค๊ฐ€๋Š” ํ•ต์‹ฌ ํ”Œ๋žซํผ์ด์ž ๋‹จ์œ„์ž…๋‹ˆ๋‹ค [1, 2]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ธŒ๋žœ์น˜ ๋ณ‘ํ•ฉ ์ „ ํ’ˆ์งˆ ๊ด€๋ฆฌ ๊ฒŒ์ดํŠธ๋กœ์„œ์˜ ๊ธฐ๋Šฅ๊ณผ ์งง๊ณ  ๋ช…ํ™•ํ•œ ์ž‘์—… ๋‹จ์œ„ ๋ถ„ํ• ์˜ ์ค‘์š”์„ฑ์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +- [[Feature Branch Workflow]] + - ์—ฐ๊ฒฐ ์ด์œ : ์ฝ”๋“œ ๋ฆฌ๋ทฐ ์‹œ์Šคํ…œ์„ ์‰ฝ๊ฒŒ ๋„์ž…ํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ด๊ณ  ์ถฉ๋Œ์ด ์ ์€ ๋ธŒ๋žœ์น˜ ์ „๋žต์ž…๋‹ˆ๋‹ค [14, 15]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ฉ”์ธ ๋ธŒ๋žœ์น˜๋ฅผ ํ•ญ์ƒ ์•ˆ์ •์ ์œผ๋กœ ์œ ์ง€ํ•˜๋ฉด์„œ, ๊ฐ๊ฐ์˜ ํƒœ์Šคํฌ๋ฅผ ๋…๋ฆฝ๋œ ๋ธŒ๋žœ์น˜์—์„œ ์ž‘์—…ํ•˜๊ณ  ๋ฆฌ๋ทฐ๋ฅผ ํ†ตํ•ด ๊ฒ€์ฆํ•˜๋Š” ์ „์ฒด ํ๋ฆ„์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +#### [์ž๋™ํ™” ๋ฐ ํ’ˆ์งˆ ๊ฒ€์ฆ ๋„๊ตฌ] +- [[Visual Regression Testing]] + - ์—ฐ๊ฒฐ ์ด์œ : ํ”„๋ก ํŠธ์—”๋“œ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ์‹œ ์œก์•ˆ์œผ๋กœ ํ™•์ธํ•˜๊ธฐ ํž˜๋“  ์˜๋„์น˜ ์•Š์€ ๋ ˆ์ด์•„์›ƒ/์ƒ‰์ƒ ๋ณ€๊ฒฝ์„ ์ž๋™ํ™” ๋„๊ตฌ๊ฐ€ ์‹œ๊ฐ์ ์œผ๋กœ ์ฐพ์•„๋‚ด์–ด ๋ฆฌ๋ทฐ์–ด์—๊ฒŒ ์ œ์‹œํ•ฉ๋‹ˆ๋‹ค [3, 9]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Chromatic์ด๋‚˜ Happo๋ฅผ CI ํŒŒ์ดํ”„๋ผ์ธ๊ณผ ๊ฒฐํ•ฉํ•˜์—ฌ PR ๋ฆฌ๋ทฐ์˜ ์ •ํ™•๋„๋ฅผ ๋†’์ด๊ณ  ์•ˆ์ •์ ์ธ UI๋ฅผ ๋ฐฐํฌํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### Deeper Research Questions + +- PR์˜ ํฌ๊ธฐ๋ฅผ ์ž‘๊ฒŒ ์œ ์ง€ํ•˜๊ณ  ๋‹จ์ผ ์ž‘์—…(Single task)์— ์ง‘์ค‘ํ•˜๋„๋ก ๋…ผ๋ฆฌ์ ์œผ๋กœ ์ž‘์—…์„ ๋ถ„ํ• ํ•˜๋Š” ๊ฐ€์žฅ ํšจ๊ณผ์ ์ธ ๋ฐฉ๋ฒ•๋ก ๊ณผ ๊ธฐ์ค€์€ ๋ฌด์—‡์ธ๊ฐ€? +- ๋Œ€๊ทœ๋ชจ ํŒ€์—์„œ ์Ÿ์•„์ง€๋Š” ์ˆ˜๋งŽ์€ PR๊ณผ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ์š”์ฒญ์„ ๋ณ‘๋ชฉ ํ˜„์ƒ ์—†์ด ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋ฐฐํฌ ์†๋„๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? +- ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ(Visual Regression Testing) ์‹œ ๋ฐœ์ƒํ•˜๋Š” ๋ฏธ์„ธํ•œ ๋ Œ๋”๋ง ์ฐจ์ด(Flake)๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ  ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ์ค€์„ (Baseline)์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๊ตฌ์ฒด์ ์ธ ๊ตฌ์„ฑ ์ตœ์ ํ™” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? +- ์ฝ”๋“œ ๋ฆฌ๋ทฐ ์‹œ ์‹œ๊ฐ์  ํšŒ๊ท€(Visual changes) ๊ฐ์ง€๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ์ ‘๊ทผ์„ฑ ํ…Œ์ŠคํŠธ(Accessibility tests)๋ฅผ ํ•จ๊ป˜ ์ž๋™ํ™”ํ–ˆ์„ ๋•Œ ์–ป๊ฒŒ ๋˜๋Š” ์ด์ ๊ณผ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋‚ด๋ถ€ ๋™์ž‘ ์›๋ฆฌ๋Š” ๋ฌด์—‡์ธ๊ฐ€? +- ๊ธฐ๋Šฅ ๋ถ„๊ธฐ(Feature branch)์˜ ์ˆ˜๋ช…์ด ๊ธธ์–ด์กŒ์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ฆฌ๋ทฐ ๋ฐ ๋ณ‘ํ•ฉ ์ถฉ๋Œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ , ์ง€์†์ ์œผ๋กœ ์งง์€ ์ฃผ๊ธฐ์˜ ๋ฆฌ๋ทฐ๋ฅผ ์œ ๋„ํ•˜๋Š” ๋ฌธํ™”๋Š” ์–ด๋–ป๊ฒŒ ์ •์ฐฉ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š”๊ฐ€? + +### Practical Application Contexts + +- **Implementation:** ์ฝ”๋“œ๋ฅผ ์ปค๋ฐ‹ํ•˜๊ณ  PR์„ ์ƒ์„ฑํ•  ๋•Œ, ๋ฆฌ๋ทฐ์–ด๊ฐ€ ์‰ฝ๊ฒŒ ์ฝ”๋“œ๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋„๋ก 200์ค„ ๋ฏธ๋งŒ์˜ ์ž‘์€ ๋‹จ์œ„๋กœ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ชผ๊ฐœ์–ด ์˜ฌ๋ฆฌ๊ณ  ๋ฌด์—‡์ด ์™œ ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€ ๋ช…ํ™•ํžˆ ๋ช…์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [2, 7]. +- **System Design:** ํ”„๋ก ํŠธ์—”๋“œ ์„ค๊ณ„ ์‹œ Storybook์„ ํ™œ์šฉํ•˜์—ฌ ๋ชจ๋“  UI ์ปดํฌ๋„ŒํŠธ์˜ ๋‹ค์–‘ํ•œ ์ƒํƒœ(loading, error ๋“ฑ)๋ฅผ ์บก์Аํ™”ํ•ด ๋‘๋ฉด, ์ฝ”๋“œ ๋ฆฌ๋ทฐ ์‹œ์— ์ด ์ƒํƒœ๋“ค์„ ์ž๋™์œผ๋กœ ์Šคํฌ๋ฆฐ์ƒท์œผ๋กœ ์ฐ์–ด ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ฐ˜ ์‹œ์Šคํ…œ์ด ๋งŒ๋“ค์–ด์ง‘๋‹ˆ๋‹ค [16]. +- **Operation / Maintenance:** CI/CD ํŒŒ์ดํ”„๋ผ์ธ ๋‹จ๊ณ„์— Chromatic์ด๋‚˜ Happo ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์—ฐ๋™์‹œ์ผœ, ํŒ€์›์ด PR์„ ์ƒ์„ฑํ•  ๋•Œ๋งˆ๋‹ค ์‹œ๊ฐ์  ๋ณ€๋™ ์‚ฌํ•ญ(diff)์ด๋‚˜ ์ ‘๊ทผ์„ฑ ์œ„๋ฐ˜ ๋‚ด์—ญ์ด PR ์ฒดํฌ ๋ฆฌ์ŠคํŠธ์— ๋ฐฐ์ง€๋กœ ์ž๋™ ๋ณด๊ณ ๋˜๋„๋ก ์šด์˜ ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•ฉ๋‹ˆ๋‹ค [17]. +- **Learning Path:** Git์˜ ๊ธฐ์ดˆ์ ์ธ ๋ธŒ๋žœ์น˜ ์‚ฌ์šฉ๋ฒ•์„ ๋ฐฐ์šด ํ›„, ํŒ€ ํ˜‘์—…์˜ ํ•ต์‹ฌ์ธ PR ์ƒ์„ฑ ๋ฐ ๋ฆฌ๋ทฐ ์š”์ฒญ ๊ณผ์ •(GitHub Flow ๋“ฑ)์„ ์ตํžˆ๊ณ , ๋‚˜์•„๊ฐ€ ์‹œ๊ฐ์  ํ…Œ์ŠคํŒ… ๋„๊ตฌ๊ฐ€ PR์— ์–ด๋–ป๊ฒŒ ํ”ผ๋“œ๋ฐฑ์„ ์ฃผ๋Š”์ง€๋ฅผ ์‹ค์Šตํ•ด๋ณด๋Š” ํ๋ฆ„์œผ๋กœ ํ•™์Šตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [8, 18]. +- **My Project Relevance:** ์†Œ๊ทœ๋ชจ 3์ธ ํŒ€ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•  ๋•Œ ๋ณต์žกํ•œ Git-Flow ๋Œ€์‹  ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์ฑ„ํƒํ•˜๊ณ , ์ฝ”๋“œ ๋ณ‘ํ•ฉ ์‹œ ๋ฐ˜๋“œ์‹œ 1๋ช… ์ด์ƒ์˜ ํ”ผ์–ด ๋ฆฌ๋ทฐ(Peer review)๋ฅผ ๋ฐ›๋„๋ก ๊ทœ์น™์„ ์ •ํ•ด ๋ฒ„๊ทธ ์—†๋Š” ์•ˆ์ •์  ๋ฉ”์ธ ๋ธŒ๋žœ์น˜๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1, 14]. + +### Adjacent Topics + +- [[Continuous Integration (CI)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: PR์ด ์˜ฌ๋ผ์™”์„ ๋•Œ ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ๋•๊ธฐ ์œ„ํ•ด ์‚ฌ์ „์— ํ…Œ์ŠคํŠธ ํ†ต๊ณผ ์—ฌ๋ถ€, ๋นŒ๋“œ ์„ฑ๊ณต ์—ฌ๋ถ€ ๋“ฑ์„ ์ž๋™์œผ๋กœ ๊ฒ€์‚ฌํ•ด์ฃผ๋Š” ์ž๋™ํ™” ํŒŒ์ดํ”„๋ผ์ธ์˜ ๊ตฌ์ถ•์— ๋Œ€ํ•ด ํ•™์Šตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [7, 19]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Topics_Biz/Git Workflow.md b/10_Wiki/Topics_Biz/Git Workflow.md new file mode 100644 index 00000000..5dc64fac --- /dev/null +++ b/10_Wiki/Topics_Biz/Git Workflow.md @@ -0,0 +1,75 @@ +# [[Git Workflow]] + +## ๐Ÿ“Œ Brief Summary +Git Workflow(๊นƒ ์›Œํฌํ”Œ๋กœ์šฐ)๋Š” ํŒ€ ํ™˜๊ฒฝ์—์„œ ์ฝ”๋“œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ด€๋ฆฌํ•˜๊ณ  ํ˜‘์—…ํ•˜๊ธฐ ์œ„ํ•œ ์ฒด๊ณ„์ ์ด๊ณ  ๊ตฌ์กฐํ™”๋œ ์ ‘๊ทผ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค [1, 2]. ์ด๋Š” ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜(Feature-branch), ํŠธ๋ ํฌ ๊ธฐ๋ฐ˜(Trunk-based), Git Flow ๋“ฑ ๋‹ค์–‘ํ•œ ์ „๋žต์„ ํฌ๊ด„ํ•˜๋ฉฐ, ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๊ณ  `main` ๋ธŒ๋žœ์น˜์˜ ๋ฐฐํฌ ๊ฐ€๋Šฅ ์ƒํƒœ๋ฅผ ๋ณด์žฅํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค [2-4]. ์ผ๊ด€๋œ ๋ธŒ๋žœ์น˜ ๋ช…๋ช… ๊ทœ์น™, ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ๊ทœ์•ฝ, ํ’€ ๋ฆฌํ€˜์ŠคํŠธ(PR)์™€ ๋ฆฌ๋ทฐ ์ ˆ์ฐจ๋ฅผ ๋„์ž…ํ•จ์œผ๋กœ์จ ์ž ์žฌ์ ์ธ ํ˜ผ๋ˆ์„ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ๋ฆด๋ฆฌ์Šค ํ๋ฆ„์œผ๋กœ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1, 5, 6]. + +## ๐Ÿ“– Core Content +* **์ฃผ์š” ๋ธŒ๋žœ์นญ ์ „๋žต (Main Branching Strategies):** + * **Feature-Branch Workflow (๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜ ์›Œํฌํ”Œ๋กœ์šฐ):** ์ฃผ ๋ธŒ๋žœ์น˜(`main`)๋ฅผ ํ•ญ์ƒ ์•ˆ์ •์ ์ด๊ณ  ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜๋ฉฐ, ์ƒˆ๋กœ์šด ์ž‘์—…์ด๋‚˜ ๋ฒ„๊ทธ ์ˆ˜์ •๋งˆ๋‹ค ์งง์€ ์ˆ˜๋ช…์˜ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜(์˜ˆ: `feature/login`)๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ž‘์—…ํ•ฉ๋‹ˆ๋‹ค [3, 4, 7]. ์†Œ๊ทœ๋ชจ ํŒ€์— ๋งค์šฐ ์ ํ•ฉํ•˜๋ฉฐ, ์˜ค๋ฒ„ํ—ค๋“œ ์—†์ด ์ฝ”๋“œ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [4, 8]. + * **Trunk-Based Development (ํŠธ๋ ํฌ ๊ธฐ๋ฐ˜ ๊ฐœ๋ฐœ):** ๊ฐ•๋ ฅํ•œ CI(์ง€์†์  ํ†ตํ•ฉ) ํ™˜๊ฒฝ์„ ๊ฐ–์ถ˜ ๊ฒฝํ—˜ ๋งŽ์€ ํŒ€์— ์ ํ•ฉํ•œ ๋ฐฉ์‹์œผ๋กœ, ์•„์ฃผ ์งง์€ ์ˆ˜๋ช…์˜ ๋ธŒ๋žœ์น˜๋ฅผ ์‚ฌ์šฉํ•ด ์ž์ฃผ `main`์— ์ฝ”๋“œ๋ฅผ ๋ณ‘ํ•ฉํ•˜์—ฌ ํ†ตํ•ฉ ์†๋„๋ฅผ ๋†’์ž…๋‹ˆ๋‹ค [8, 9]. + * **Git Flow:** `develop` ๋ฐ `release` ๋“ฑ ๋‹ค์ˆ˜์˜ ๋ธŒ๋žœ์น˜๋ฅผ ์šด์˜ํ•˜๋ฉฐ ์Šค์ผ€์ค„๋œ ๋ฆด๋ฆฌ์Šค๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์— ์ ํ•ฉํ•˜์ง€๋งŒ, ์†Œ๊ทœ๋ชจ ํŒ€์—๊ฒŒ๋Š” ๋„ˆ๋ฌด ๋ณต์žกํ•˜๊ณ  ๋ฌด๊ฑฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [8, 10]. + * **GitHub Flow:** ๊ธฐ๋Šฅ์„ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜์—์„œ ์ž‘์—…ํ•œ ๋’ค ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ํ†ตํ•ด ๋ฆฌ๋ทฐ๋ฐ›๊ณ  ๋ณ‘ํ•ฉํ•˜์—ฌ, `main`์—์„œ ๋ฐ”๋กœ ๋ฐฐํฌํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค [11, 12]. + +* **๋ช…๋ช… ๊ทœ์น™ ๋ฐ ์ถ”์ ์„ฑ (Naming Conventions & Traceability):** + * **๋ธŒ๋žœ์น˜ ์ด๋ฆ„:** ๋ธŒ๋žœ์น˜ ๋ชฉ์ ์„ ๋ช…ํ™•ํžˆ ํ•˜๊ธฐ ์œ„ํ•ด `feature/`, `bugfix/`์™€ ๊ฐ™์€ ์ ‘๋‘์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ํ‹ฐ์ผ“ ID๋ฅผ ํ•จ๊ป˜ ํฌํ•จ(์˜ˆ: `feature/PROJ-123-user-auth`)ํ•˜์—ฌ ์ด์Šˆ ํŠธ๋ž˜์ปค์™€์˜ ์ถ”์ ์„ฑ์„ ํ™•๋ณดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [13-15]. + * **์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€:** `type(scope): description` ํ˜•ํƒœ๋ฅผ ๋”ฐ๋ฅด๋Š” "Conventional Commits" ๊ทœ์•ฝ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค [6, 16]. ์˜ˆ๋ฅผ ๋“ค์–ด ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์€ `feat:`, ๋ฒ„๊ทธ ์ˆ˜์ •์€ `fix:`, ๋ฌธ์„œ ์ˆ˜์ •์€ `docs:` ๋“ฑ์œผ๋กœ ์‹œ์ž‘ํ•˜์—ฌ ๋ณ€๊ฒฝ์˜ ์˜๋„๋ฅผ ๋ช…ํ™•ํžˆ ํ•ฉ๋‹ˆ๋‹ค [6, 16]. + +* **ํ’€ ๋ฆฌํ€˜์ŠคํŠธ์™€ ๋ณ‘ํ•ฉ (Pull Requests & Merging):** + * `main` ๋ธŒ๋žœ์น˜์— ์ง์ ‘ ํ‘ธ์‹œ(Push)ํ•˜๋Š” ๊ฒƒ์„ ๊ธˆ์ง€ํ•˜๊ณ , ๋ฐ˜๋“œ์‹œ ํ’€ ๋ฆฌํ€˜์ŠคํŠธ(PR)๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ตœ์†Œ 1๋ช… ์ด์ƒ์˜ ๋™๋ฃŒ์—๊ฒŒ ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ›์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค [13, 17]. + * ์ฝ”๋“œ ๋ฆฌ๋ทฐ ์†๋„์™€ ํ’ˆ์งˆ์„ ์œ„ํ•ด PR์€ ์ž‘๊ณ  ๋…ผ๋ฆฌ์ ์ธ ๋‹จ์ผ ๋ณ€๊ฒฝ ์‚ฌํ•ญ(Atomic Commits) ๋‹จ์œ„๋กœ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [16, 18]. + * ๋ณ‘ํ•ฉ ์‹œ์—๋Š” ์Šค์ฟผ์‹œ ๋ณ‘ํ•ฉ(Squash merge)์„ ์‚ฌ์šฉํ•˜์—ฌ ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ณ , ๋ณ‘ํ•ฉ์ด ์™„๋ฃŒ๋œ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜๋Š” ์ž๋™์œผ๋กœ ์‚ญ์ œํ•˜์—ฌ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค [17-19]. + +## โš–๏ธ Trade-offs & Caveats +* **๊ตฌ์กฐ์˜ ๋ณต์žก์„ฑ vs. ํŒ€์˜ ๊ทœ๋ชจ:** Git Flow๋Š” ๋Œ€๊ทœ๋ชจ์˜ ๋ณต์žกํ•œ ๋ฆด๋ฆฌ์Šค ๊ณ„ํš์„ ์•ˆ์ „ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ํ”„๋กœ์„ธ์Šค ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ํฌ๊ณ  ๋ณ‘ํ•ฉ ์ง€์—ฐ์„ ์ดˆ๋ž˜ํ•ฉ๋‹ˆ๋‹ค [8, 20]. ๋ฐ˜๋ฉด, Feature-Branch ์›Œํฌํ”Œ๋กœ์šฐ๋‚˜ Trunk-Based ๋ฐฉ์‹์€ ์†Œ๊ทœ๋ชจ ํŒ€์ด ๋น ๋ฅด๊ณ  ๊ฐ€๋ณ๊ฒŒ ์›€์ง์ผ ์ˆ˜ ์žˆ๋„๋ก ๋•์ง€๋งŒ, ๊ทœ๋ชจ๊ฐ€ ์ปค์ง€๊ฑฐ๋‚˜ ์—„๊ฒฉํ•œ ๋ฆด๋ฆฌ์Šค ๋ฒ„์ „ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํ•œ๊ณ„์— ๋ถ€๋”ชํž ์ˆ˜ ์žˆ์–ด ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์ง„ํ™”(Migration)์‹œ์ผœ์•ผ ํ•ฉ๋‹ˆ๋‹ค [8, 10]. +* **๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜์˜ ์ˆ˜๋ช…๊ณผ ์ถฉ๋Œ:** ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜ ๋ฐฉ์‹์˜ ๊ฐ€์žฅ ํฐ ๋ถ€์ž‘์šฉ์€ ๋ธŒ๋žœ์น˜์˜ ์ˆ˜๋ช…์ด ๊ธธ์–ด์งˆ ๊ฒฝ์šฐ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์™€์˜ ์ฐจ์ด๊ฐ€ ์ปค์ ธ ์‹ฌ๊ฐํ•œ ๋ณ‘ํ•ฉ ์ถฉ๋Œ(Merge Conflict)์ด ๋ฐœ์ƒํ•œ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค [20, 21]. ์ด๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๊ฐœ๋ฐœ์ž๋Š” ์ž์ฃผ `main` ๋ธŒ๋žœ์น˜๋ฅผ ํ’€(Pull) ๋ฐ›๊ฑฐ๋‚˜ ๋ฆฌ๋ฒ ์ด์Šค(Rebase)ํ•˜์—ฌ ์ตœ์‹  ์ƒํƒœ๋ฅผ ๋™๊ธฐํ™”ํ•˜๋Š” ๋ถ€๊ฐ€์ ์ธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [19, 20]. +* **์™„์ „ํ•œ ์ถ”์ ์„ฑ์˜ ๋Œ€๊ฐ€:** ๋ชจ๋“  ๋ธŒ๋žœ์น˜์™€ ์ปค๋ฐ‹์— ํ‹ฐ์ผ“ ID ๋ถ€์—ฌ๋ฅผ ๊ฐ•์ œํ•˜๋ฉด ๋ฒ„๊ทธ ์ถ”์ ์ด๋‚˜ ๋ฆฌ๋ทฐ์— ์žˆ์–ด ์ปจํ…์ŠคํŠธ ํ™•๋ณด์—๋Š” ํƒ์›”ํ•˜๋‚˜ [5, 22], ์•„์ฃผ ๋‹จ์ˆœํ•˜๊ณ  ์‚ฌ์†Œํ•œ ์ฝ”๋“œ ์ˆ˜์ • ์ž‘์—…์—๋„ ๋ฐ˜๋“œ์‹œ ํ‹ฐ์ผ“์„ ์ƒ์„ฑํ•˜๊ณ  ์ ˆ์ฐจ๋ฅผ ๋ฐŸ์•„์•ผ ํ•˜๋Š” ์†๋„ ์ €ํ•˜์˜ ๋‹จ์ ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [23]. +* **Trunk-Based ์ „ํ™˜์˜ ์ „์ œ ์กฐ๊ฑด:** Trunk-Based Development๋กœ ์ „ํ™˜ํ•˜์—ฌ ๋น ๋ฅธ ํ†ตํ•ฉ์˜ ์ด์ ์„ ์–ป๊ณ ์ž ํ•œ๋‹ค๋ฉด, ์ฝ”๋“œ์˜ ๋ถˆ์•ˆ์ •์„ฑ์„ ๊ฐ์ถ”๊ธฐ ์œ„ํ•œ ๊ธฐ๋Šฅ ํ† ๊ธ€(Feature flags) ๊ธฐ๋ฒ•๊ณผ ๋ณ‘ํ•ฉ ์ „ ๊ฒฐํ•จ์„ ์žก์•„๋‚ผ ๊ฐ•๋ ฅํ•œ ํ…Œ์ŠคํŠธ ์ž๋™ํ™”(CI)๊ฐ€ ํ•„์ˆ˜์ ์œผ๋กœ ์š”๊ตฌ๋œ๋‹ค๋Š” ์ œ์•ฝ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค [12]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [๊ด€๊ณ„ ์œ ํ˜• A (์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ )] +- `[[Trunk-Based Development]]` + - ์—ฐ๊ฒฐ ์ด์œ : Git Workflow๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ํ•ต์‹ฌ ์ „๋žต ์ค‘ ํ•˜๋‚˜๋กœ, ๋น ๋ฅธ ํ†ตํ•ฉ์„ ๋ชฉ์ ์œผ๋กœ ํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก ์ž…๋‹ˆ๋‹ค [2]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์งง์€ ์ˆ˜๋ช…์˜ ๋ธŒ๋žœ์น˜, ๋นˆ๋ฒˆํ•œ ๋ณ‘ํ•ฉ, ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ(Feature Flags) ํ™œ์šฉ์ด ํ”„๋กœ์ ํŠธ ๋ฐฐํฌ ์†๋„์— ์–ด๋–ป๊ฒŒ ๊ธฐ์—ฌํ•˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [9, 12]. + +- `[[Git Flow]]` + - ์—ฐ๊ฒฐ ์ด์œ : ๊ตฌ์กฐ๊ฐ€ ๋ณต์žกํ•œ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์˜ ๋ฆด๋ฆฌ์Šค๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ์ „ํ†ต์  ๋ธŒ๋žœ์นญ ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค [2, 10]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: `develop`, `release`, `hotfix` ๋“ฑ ๋‹ค์ค‘ ๋ธŒ๋žœ์น˜ ์ „๋žต์ด ์™œ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์œ ๋ฐœํ•˜๋ฉด์„œ๋„ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉ๋˜๋Š”์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [8, 10]. + +#### [๊ด€๊ณ„ ์œ ํ˜• B (๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ)] +- `[[Conventional Commits]]` + - ์—ฐ๊ฒฐ ์ด์œ : ํŒ€์˜ ์ผ๊ด€๋œ ์ฝ”๋“œ๋ฒ ์ด์Šค ํžˆ์Šคํ† ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด Git ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ์ž‘์„ฑ์— ์ ์šฉ๋˜๋Š” ์—…๊ณ„ ํ‘œ์ค€ ๊ทœ์น™์ž…๋‹ˆ๋‹ค [6, 16]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: `feat:`, `fix:`, `chore:`์™€ ๊ฐ™์€ ์ ‘๋‘์‚ฌ๊ฐ€ ๋ฆฌ๋ทฐ์–ด์˜ ์ฝ”๋“œ ์ดํ•ด๋„๋ฅผ ์–ด๋–ป๊ฒŒ ๋†’์ด๊ณ  ์ž๋™ํ™”๋œ ๋ฆด๋ฆฌ์Šค์— ๊ธฐ์—ฌํ•˜๋Š”์ง€ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [6, 16]. + +- `[[Pull Requests (PR)]]` + - ์—ฐ๊ฒฐ ์ด์œ : ๋ธŒ๋žœ์น˜์˜ ์ฝ”๋“œ๋ฅผ `main`์œผ๋กœ ๋ณ‘ํ•ฉํ•˜๊ธฐ ์ „, ํ˜‘์—… ํŒ€์›๋“ค์ด ์ฝ”๋“œ๋ฅผ ๊ฒ€ํ† ํ•˜๋Š” ํ•ต์‹ฌ ๊ด€๋ฌธ์ž…๋‹ˆ๋‹ค [13, 16]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ธŒ๋žœ์น˜ ๋ณดํ˜ธ ์„ค์ •, ๋™๋ฃŒ ๋ฆฌ๋ทฐ ์š”๊ตฌ(1 review required), ์ง€์†์  ํ†ตํ•ฉ(CI) ์ฒดํฌ๊ฐ€ ์‹œ์Šคํ…œ ์•ˆ์ •์„ฑ ์œ ์ง€์— ์–ด๋–ป๊ฒŒ ํ•„์ˆ˜์ ์œผ๋กœ ์ž‘์šฉํ•˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [16, 17]. + +- `[[Ticket IDs (Traceability)]]` + - ์—ฐ๊ฒฐ ์ด์œ : ์ฝ”๋“œ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์–ด๋–ค ๋น„์ฆˆ๋‹ˆ์Šค ์š”๊ตฌ์‚ฌํ•ญ(์˜ˆ: Jira ํ‹ฐ์ผ“)์— ์˜ํ•ด ๋ฐœ์ƒํ–ˆ๋Š”์ง€๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๋„๊ตฌ์  ์žฅ์น˜์ž…๋‹ˆ๋‹ค [5, 22]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: `PROJ-123` ํ˜•ํƒœ์˜ ํ‹ฐ์ผ“ ๋ฒˆํ˜ธ๋ฅผ ๋ธŒ๋žœ์น˜์™€ ์ปค๋ฐ‹์— ์‚ฝ์ž…ํ•จ์œผ๋กœ์จ ๋ฆฌ๋ทฐ์–ด์—๊ฒŒ ๋งฅ๋ฝ์„ ์ œ๊ณตํ•˜๊ณ , ๋ฌธ์„œํ™” ๋ฐ ์ž‘์—… ์ถ”์ (Traceability)์„ ์–ด๋–ป๊ฒŒ ๋‹ฌ์„ฑํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5, 22]. + +### Deeper Research Questions +- ์†Œ๊ทœ๋ชจ ํŒ€์ด ์„ฑ์žฅํ•˜์—ฌ ๋ณต์žก์„ฑ์ด ์ฆ๊ฐ€ํ•  ๋•Œ, Feature Branch Workflow์—์„œ Git Flow๋กœ ์•ˆ์ „ํ•˜๊ฒŒ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋ ค๋ฉด ์–ด๋–ค ์ ˆ์ฐจ์™€ ํŒ€ ๋‚ด ๊ต์œก์ด ํ•„์š”ํ•œ๊ฐ€? +- Trunk-Based Development๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ๋„์ž…ํ•˜๊ธฐ ์œ„ํ•ด CI/CD(์ง€์†์  ํ†ตํ•ฉ/๋ฐฐํฌ) ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ๋ฐ˜๋“œ์‹œ ๊ตฌ์„ฑํ•ด์•ผ ํ•˜๋Š” ์ž๋™ํ™” ํ…Œ์ŠคํŠธ ์กฐ๊ฑด์€ ๋ฌด์—‡์ธ๊ฐ€? +- Conventional Commits ์‹œ์Šคํ…œ๊ณผ ์—ฐ๋™ํ•˜์—ฌ ์ž๋™ ๋ฆด๋ฆฌ์Šค ๋…ธํŠธ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์‹œ๋งจํ‹ฑ ๋ฒ„์ €๋‹(Semantic Versioning)์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ธฐ์ˆ ์  ์›๋ฆฌ๋Š” ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”๊ฐ€? +- ๋‹ค์ˆ˜์˜ ์ž‘์—…์ž๊ฐ€ ๊ฒน์น˜๋Š” ์˜์—ญ์„ ์ˆ˜์ •ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” Merge Conflict๋ฅผ ์˜ˆ๋ฐฉํ•˜๊ธฐ ์œ„ํ•ด, 'Atomic Commits'์™€ '์ž์ฃผ ๋ณ‘ํ•ฉํ•˜๊ธฐ' ์›์น™์€ ์‹ค๋ฌด์—์„œ ์–ด๋–ป๊ฒŒ ๊ตฌ์ฒด์ ์œผ๋กœ ์ ์šฉ๋˜์–ด์•ผ ํ•˜๋Š”๊ฐ€? +- ์ฝ”๋“œ ๋ฆฌ๋ทฐ์˜ ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด PR์˜ ๊ทœ๋ชจ๋ฅผ ์ž‘๊ฒŒ(์˜ˆ: 200์ค„ ์ดํ•˜) ์œ ์ง€ํ•˜๋ฉด์„œ๋„ ๋…ผ๋ฆฌ์ ์ธ ๊ธฐ๋Šฅ ๋‹จ์œ„๋ฅผ ํ›ผ์†ํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ ๋ถ„ํ•  ๊ธฐ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? + +### Practical Application Contexts +- **Implementation:** ์ƒˆ๋กœ์šด ์ž‘์—…์„ ์‹œ์ž‘ํ•  ๋•Œ ๋ฌด์กฐ๊ฑด `git checkout -b feature/ํ‹ฐ์ผ“ID-์ž‘์—…๋ช…`์œผ๋กœ ๋…๋ฆฝ์ ์ธ ๋ธŒ๋žœ์น˜๋ฅผ ํŒŒ๊ณ , ์™„๋ฃŒ ํ›„ `feat:` ๋“ฑ์˜ ๊ทœ์น™์„ ๋”ฐ๋ฅธ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๋ฅผ ์ž‘์„ฑํ•œ ๋’ค `main` ๋ธŒ๋žœ์น˜์— PR์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค [6, 7, 13, 22]. +- **System Design:** GitHub์™€ ๊ฐ™์€ ํ˜ธ์ŠคํŒ… ํ”Œ๋žซํผ์—์„œ `main` ๋ธŒ๋žœ์น˜ ๋ณดํ˜ธ(Branch Protection) ์˜ต์…˜์„ ํ™œ์„ฑํ™”ํ•˜์—ฌ ์ง์ ‘ ํ‘ธ์‹œ๋ฅผ ๋ง‰๊ณ , CI ๋นŒ๋“œ ํ†ต๊ณผ์™€ ์ตœ์†Œ 1์ธ์˜ ์Šน์ธ์ด ์žˆ์–ด์•ผ ๋ณ‘ํ•ฉ๋˜๋„๋ก ์‹œ์Šคํ…œ์„ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค [17]. +- **Operation / Maintenance:** ๋ธŒ๋žœ์น˜๊ฐ€ ๋ณ‘ํ•ฉ๋  ๋•Œ๋งˆ๋‹ค ์Šค์ฟผ์‹œ ๋ณ‘ํ•ฉ(Squash and merge)์„ ๊ฐ•์ œํ•˜์—ฌ ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๋‹จ์ผ ํ•ญ๋ชฉ์œผ๋กœ ์••์ถ•ํ•˜๊ณ , ๋ณ‘ํ•ฉ ํ›„ ๋‚จ์€ ๋ธŒ๋žœ์น˜๋ฅผ ์ž๋™ ์‚ญ์ œ(Auto-delete) ์„ค์ •ํ•˜์—ฌ ์ €์žฅ์†Œ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์šด์˜ํ•ฉ๋‹ˆ๋‹ค [17-19]. +- **Learning Path:** Git์— ์ž…๋ฌธํ•˜๋Š” ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ์šฐ, ๋ณต์žกํ•œ `develop` ๋ธŒ๋žœ์น˜ ์—†์ด `main` ๋ธŒ๋žœ์น˜ ํ•˜๋‚˜์™€ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜๋“ค๋กœ๋งŒ ๊ตฌ์„ฑ๋œ ๊ฐ€๋ฒผ์šด ์›Œํฌํ”Œ๋กœ์šฐ(Feature-Branch Workflow)๋ฅผ ๋จผ์ € ํ•™์Šตํ•˜๊ณ  ์ฒดํ™”ํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค [4, 8]. +- **My Project Relevance:** ํ˜„์žฌ ์ง„ํ–‰ํ•˜๋Š” 3์ธ ๊ทœ๋ชจ์˜ ํ”„๋กœ์ ํŠธ ๋“ฑ์—์„œ๋Š” Git Flow์˜ ๋ฌด๊ฑฐ์šด ์ ˆ์ฐจ๋ฅผ ํ”ผํ•˜๊ณ , ํ•ญ์ƒ ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ ์•ˆ์ •์ ์ธ `main` ๋ธŒ๋žœ์น˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์งง์€ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋น ๋ฅธ ๋ฆฌ๋ทฐ์™€ ํ”ผ๋“œ๋ฐฑ์„ ์ฃผ๊ณ ๋ฐ›๋Š” ๋ฐฉ์‹์„ ์ฆ‰๊ฐ ๋„์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [4, 8]. + +### Adjacent Topics +- `[[CI/CD (Continuous Integration/Continuous Deployment)]]` + - ํ™•์žฅ ๋ฐฉํ–ฅ: PR์„ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ๋ณ‘ํ•ฉํ•  ๋•Œ ์ฝ”๋“œ๋ฅผ ์ž๋™์œผ๋กœ ํ…Œ์ŠคํŠธํ•˜๊ณ  ๋นŒ๋“œ, ๋ฐฐํฌํ•˜๋Š” ์ธํ”„๋ผ ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์„ฑ ๋ฐฉ๋ฒ•๋ก ์œผ๋กœ ํ™•์žฅํ•˜์—ฌ ์กฐ์‚ฌ. +- `[[Semantic Versioning (SemVer)]]` + - ํ™•์žฅ ๋ฐฉํ–ฅ: Git ํƒœ๊ทธ(Tag)์™€ Conventional Commits๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์†Œํ”„ํŠธ์›จ์–ด์˜ ๋ฒ„์ „์„ ์ฒด๊ณ„์ ์ด๊ณ  ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ๋ถ€์—ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ํ™•์žฅ. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Topics_Biz/GitHub Flow.md b/10_Wiki/Topics_Biz/GitHub Flow.md new file mode 100644 index 00000000..2214b4bc --- /dev/null +++ b/10_Wiki/Topics_Biz/GitHub Flow.md @@ -0,0 +1,64 @@ +# [[GitHub Flow]] + +## ๐Ÿ“Œ Brief Summary +GitHub Flow๋Š” ๋ณต์žกํ•œ Git Flow์˜ ๋Œ€์•ˆ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ฐ€๋ณ๊ณ  ๋‹จ์ˆœํ•œ ๋ธŒ๋žœ์น˜ ๊ธฐ๋ฐ˜ ์›Œํฌํ”Œ๋กœ์šฐ์ž…๋‹ˆ๋‹ค [1, 2]. ์ด ๋ฐฉ์‹์€ ํ•ญ์ƒ ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ(deployable)๋ฅผ ์œ ์ง€ํ•˜๋Š” `main` ๋ธŒ๋žœ์น˜๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ์ž‘๋™ํ•˜๋ฉฐ, ๊ฐœ๋ฐœ์ž๋Š” ์ƒˆ๋กœ์šด ์ž‘์—…์„ ์œ„ํ•ด ์งง์€ ์ฃผ๊ธฐ์˜ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜(feature branch)๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค [3-5]. ๋ณ€๊ฒฝ๋œ ์ฝ”๋“œ๋Š” ๋™๋ฃŒ์˜ ์ฝ”๋“œ ๋ฆฌ๋ทฐ์™€ CI/CD ํ…Œ์ŠคํŠธ๋ฅผ ๋ชจ๋‘ ํ†ต๊ณผํ•œ ํ›„ ์˜ค์ง Pull Request(PR)๋ฅผ ํ†ตํ•ด์„œ๋งŒ `main`์— ๋ณ‘ํ•ฉ๋ฉ๋‹ˆ๋‹ค [1, 6]. + +## ๐Ÿ“– Core Content +* **์•ˆ์ •์ ์ธ `main` ๋ธŒ๋žœ์น˜ ์œ ์ง€** + GitHub Flow์˜ ํ•ต์‹ฌ์€ `main` (๋˜๋Š” `master`) ๋ธŒ๋žœ์น˜๊ฐ€ ํ•ญ์ƒ ์•ˆ์ •์ ์ด๊ณ  ์–ธ์ œ๋“  ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ์—ฌ์•ผ ํ•œ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค [3-5]. ๊ฐœ๋ฐœ์ž๋Š” ์–ด๋– ํ•œ ๊ฒฝ์šฐ์—๋„ `main` ๋ธŒ๋žœ์น˜์— ์ง์ ‘ ์ปค๋ฐ‹(direct commit)ํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค [1, 6, 7]. +* **๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜(Feature Branch) ๊ธฐ๋ฐ˜ ์ž‘์—…** + ๋ชจ๋“  ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ, ๋ฒ„๊ทธ ์ˆ˜์ •, ๋ฌธ์„œ ์ž‘์—… ๋“ฑ์€ `main`์—์„œ ํŒŒ์ƒ๋œ ์งง์€ ์ˆ˜๋ช…(short-lived)์˜ ์ „์šฉ ๋ธŒ๋žœ์น˜์—์„œ ์ˆ˜ํ–‰๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [3-5]. ๋ธŒ๋žœ์น˜ ์ด๋ฆ„์€ `feature/user-auth` ๋˜๋Š” `bugfix/login-error`์™€ ๊ฐ™์ด ์„ค๋ช…์ ์ด์–ด์•ผ ํ•˜๋ฉฐ, ๊ฐ€๋Šฅํ•˜๋ฉด ํ‹ฐ์ผ“ ID(์˜ˆ: `PROJ-123`)๋ฅผ ํฌํ•จํ•˜์—ฌ ์ถ”์ ์„ฑ์„ ๋†’์ด๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค [8, 9]. +* **Pull Request (PR) ๋ฐ ์ฝ”๋“œ ๋ฆฌ๋ทฐ** + ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด `main` ๋ธŒ๋žœ์น˜๋กœ ๋ณ‘ํ•ฉํ•˜๊ธฐ ์œ„ํ•ด PR์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค [6, 10]. ๋ณ‘ํ•ฉ ์ „์—๋Š” ๋ฐ˜๋“œ์‹œ ์ตœ์†Œ 1๋ช… ์ด์ƒ์˜ ํŒ€์›์—๊ฒŒ ์ฝ”๋“œ ๋ฆฌ๋ทฐ(Peer Review)๋ฅผ ๋ฐ›์•„์•ผ ํ•˜๋ฉฐ, CI/CD ํ™˜๊ฒฝ์—์„œ์˜ ์ž๋™ํ™” ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [1, 6, 8]. ์ด๋Š” ํ˜ผ์ž์„œ ์ž˜๋ชป๋œ ์ฝ”๋“œ๋ฅผ ๋ณ‘ํ•ฉํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๋Š” ์•ˆ์ „์žฅ์น˜์ž…๋‹ˆ๋‹ค [8]. +* **๋ณ‘ํ•ฉ ๊ทœ์น™๊ณผ ์ •๋ฆฌ** + ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด PR์„ ๋ณ‘ํ•ฉํ•  ๋•Œ๋Š” 'Squash Merge' ๋ฐฉ์‹์„ ์ฃผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค [6, 7, 11]. ์„ฑ๊ณต์ ์œผ๋กœ ๋ณ‘ํ•ฉ๋œ ์ดํ›„์—๋Š” ๋ถˆํ•„์š”ํ•œ ๋ธŒ๋žœ์น˜๊ฐ€ ์Œ“์ด์ง€ ์•Š๋„๋ก ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜๋ฅผ ์ฆ‰์‹œ ์‚ญ์ œ(auto-delete)ํ•ฉ๋‹ˆ๋‹ค [6, 8, 11]. +* **์›Œํฌํ”Œ๋กœ์šฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ (Migration)** + ํŒ€์ด ๊ธฐ์กด์˜ ๋ณต์žกํ•œ Git Flow์—์„œ GitHub Flow๋กœ ์ „ํ™˜ํ•˜์—ฌ ํ†ตํ•ฉ ์†๋„๋ฅผ ๋†’์ด๊ณ  ๋‹จ์ˆœํ™”ํ•˜๋ ค๋ฉด, ๋ฆด๋ฆฌ์Šค ๋ธŒ๋žœ์น˜(release branch) ์ƒ์„ฑ์„ ์ค‘๋‹จํ•˜๊ณ , `develop` ๋ธŒ๋žœ์น˜๋ฅผ `main`์œผ๋กœ ํ†ตํ•ฉํ•œ ๋’ค, `main` ๋ธŒ๋žœ์น˜์—์„œ ์ง์ ‘ ๋ฐฐํฌํ•˜๋„๋ก CI/CD ํŒŒ์ดํ”„๋ผ์ธ์„ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [2]. ๋ฐ˜๋Œ€๋กœ ํ”„๋กœ์ ํŠธ์˜ ๊ตฌ์กฐ๊ฐ€ ๋” ๋ณต์žกํ•ด์ง€๋ฉด `develop` ๋ธŒ๋žœ์น˜ ๋“ฑ์„ ์ถ”๊ฐ€ํ•ด Git Flow๋กœ ๋˜๋Œ์•„๊ฐˆ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค [12]. + +## โš–๏ธ Trade-offs & Caveats +* **๋ณ‘ํ•ฉ ์ฝ”๋“œ์˜ ์ฆ‰๊ฐ์ ์ธ ๋ฆฌ์Šคํฌ**: `main` ๋ธŒ๋žœ์น˜๊ฐ€ ์œ ์ผํ•œ ๋ฐฐํฌ ๊ธฐ์ค€์ ์ด ๋˜๋ฏ€๋กœ, ๋ฆฌ๋ทฐ๋‚˜ ํ…Œ์ŠคํŠธ๊ฐ€ ๋ˆ„๋ฝ๋˜์–ด ๋ฒ„๊ทธ๊ฐ€ ํฌํ•จ๋œ ์ฝ”๋“œ๊ฐ€ ๋ณ‘ํ•ฉ๋  ๊ฒฝ์šฐ ํ”„๋กœ๋•์…˜(์šด์˜) ํ™˜๊ฒฝ์— ์น˜๋ช…์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [13, 14]. ๋”ฐ๋ผ์„œ ๊ฐ•๋ ฅํ•œ CI/CD ์ž๋™ํ™” ํ™˜๊ฒฝ๊ณผ Branch Protection Rule(๋ณดํ˜ธ ๊ทœ์น™)์ด ํ•„์ˆ˜์ ์œผ๋กœ ๋’ท๋ฐ›์นจ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [1, 6]. +* **๋ธŒ๋žœ์น˜ ์ˆ˜๋ช… ๊ด€๋ฆฌ์˜ ์–ด๋ ค์›€**: ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜๊ฐ€ ๋„ˆ๋ฌด ์˜ค๋ž˜ ์œ ์ง€(Long-lived)๋˜๋ฉด `main` ๋ธŒ๋žœ์น˜์™€์˜ ์ฐจ์ด๊ฐ€ ๋ฒŒ์–ด์ ธ ์‹ฌ๊ฐํ•œ ๋ณ‘ํ•ฉ ์ถฉ๋Œ(Merge Conflict)์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [13, 15]. ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐœ๋ฐœ์ž๋Š” ๋งค์ผ ์ž‘์—… ์ „ `main` ๋ธŒ๋žœ์น˜์˜ ์ตœ์‹  ์ƒํƒœ๋ฅผ ๋‹น๊ฒจ์˜ค๊ณ (pull/rebase) ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ž‘๊ฒŒ ์œ ์ง€ํ•˜๋Š” ๊ทœ์œจ์„ ์—„๊ฒฉํžˆ ์ง€์ผœ์•ผ ํ•ฉ๋‹ˆ๋‹ค [11, 13]. +* **๋Œ€๊ทœ๋ชจ/์ •๊ธฐ ๋ฆด๋ฆฌ์Šค ํ”„๋กœ์ ํŠธ์—์„œ์˜ ํ•œ๊ณ„**: ์ •ํ•ด์ง„ ์ผ์ •์— ๋”ฐ๋ผ ๋ฒ„์ „์„ ๋ฌถ์–ด์„œ ๋ฐฐํฌํ•ด์•ผ ํ•˜๊ฑฐ๋‚˜, ์œ ์ง€๋ณด์ˆ˜ํ•ด์•ผ ํ•  ๊ณผ๊ฑฐ ๋ฆด๋ฆฌ์Šค ๋ฒ„์ „์ด ์—ฌ๋Ÿฌ ๊ฐœ์ธ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ์šฐ, ๋ฆด๋ฆฌ์Šค ๋ธŒ๋žœ์น˜๊ฐ€ ์—†๋Š” GitHub Flow๋Š” ๊ตฌ์กฐ์  ํ•œ๊ณ„๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ์—๋Š” ๋ฌด๊ฒ๋”๋ผ๋„ Git Flow๊ฐ€ ๋” ์ ํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [12, 16]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [๊ด€๊ณ„ ์œ ํ˜• A: ์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ  (๊ฐœ๋ฐœ ์›Œํฌํ”Œ๋กœ์šฐ)] +- [[Git Flow]] + - ์—ฐ๊ฒฐ ์ด์œ : GitHub Flow์™€ ์ž์ฃผ ๋น„๊ต๋˜๋Š” ๋ถ„๊ธฐ ์ „๋žต์œผ๋กœ, ํ”„๋กœ์ ํŠธ์˜ ๋ณต์žก์„ฑ์— ๋”ฐ๋ผ ๋‘ ์ „๋žต ์‚ฌ์ด๋ฅผ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค [2, 12]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: `develop`, `release`, `hotfix` ๋ธŒ๋žœ์น˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” Git Flow๋ฅผ ์ดํ•ดํ•จ์œผ๋กœ์จ, ์ƒ๋Œ€์ ์œผ๋กœ GitHub Flow๊ฐ€ ์ƒ๋žตํ•œ ๊ตฌ์กฐ์  ๋ณต์žก์„ฑ๊ณผ ๊ทธ์— ๋”ฐ๋ฅธ ์†๋„/๋‹จ์ˆœ์„ฑ์˜ ์ด์ ์„ ๋ช…ํ™•ํžˆ ๋น„๊ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[Trunk-Based Development]] + - ์—ฐ๊ฒฐ ์ด์œ : ์†Œ๊ทœ๋ชจ ํŒ€์—์„œ ๋น ๋ฅด๊ณ  ์ถฉ๋Œ ์—†๋Š” ๋ณ‘ํ•ฉ์„ ์œ„ํ•ด ๋„์ž…ํ•  ์ˆ˜ ์žˆ๋Š” ๋˜ ๋‹ค๋ฅธ ๊ฒฝ๋Ÿ‰ ์›Œํฌํ”Œ๋กœ์šฐ์ž…๋‹ˆ๋‹ค [3, 16]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ทน๋‹จ์ ์œผ๋กœ ์งง์€ ์ƒ๋ช…์ฃผ๊ธฐ์˜ ๋ธŒ๋žœ์น˜๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋ฉ”์ธ์— ๋นˆ๋ฒˆํžˆ ์ง์ ‘ ๋ณ‘ํ•ฉํ•˜๋Š” ์ฒ ํ•™์„ ํ†ตํ•ด CI(์ง€์†์  ํ†ตํ•ฉ)์˜ ๋ณธ์งˆ์„ ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +#### [๊ด€๊ณ„ ์œ ํ˜• B: ๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ] +- [[Pull Request]] + - ์—ฐ๊ฒฐ ์ด์œ : GitHub Flow์—์„œ ์ฝ”๋“œ ๋ณ‘ํ•ฉ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ํŒ€์› ๊ฐ„์˜ ํ˜‘์—… ๋ฐ ๋ฆฌ๋ทฐ๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ๊ฐ€์žฅ ํ•ต์‹ฌ์ ์ธ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค [8, 10]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ฝ”๋“œ ํ’ˆ์งˆ ํ†ต์ œ, ํ”ผ์–ด ๋ฆฌ๋ทฐ(Peer Review)์˜ ์—ญํ•  ๋ฐ CI/CD ํ›…(Hook)์ด ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์„ ๊ตฌ์ฒด์ ์œผ๋กœ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[CI/CD]] + - ์—ฐ๊ฒฐ ์ด์œ : `main` ๋ธŒ๋žœ์น˜๋ฅผ ํ•ญ์ƒ ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐฐํ›„์—์„œ ์ฝ”๋“œ๋ฅผ ๊ฒ€์ฆํ•˜๋Š” ํ•„์ˆ˜ ์ž๋™ํ™” ํŒŒ์ดํ”„๋ผ์ธ์ž…๋‹ˆ๋‹ค [1, 6]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์™œ ์ˆ˜๋™ ๋ณ‘ํ•ฉ์ด ์œ„ํ—˜ํ•œ์ง€, PR ๋ฆฌ๋ทฐ๊ฐ€ ๋๋‚œ ์ฝ”๋“œ๊ฐ€ ์–ด๋–ป๊ฒŒ ์•ˆ์ „ํ•˜๊ฒŒ ํ”„๋กœ๋•์…˜ ๋ ˆ๋ฒจ๊นŒ์ง€ ๋ฐฐํฌ๋˜๋Š”์ง€์˜ ์ „ ๊ณผ์ •์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### Deeper Research Questions +- Git Flow ๊ธฐ๋ฐ˜ ํ”„๋กœ์ ํŠธ์—์„œ GitHub Flow๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ๋•Œ, ๊ธฐ์กด์˜ ๋ฒ„์ „ ๊ด€๋ฆฌ ์ฒด๊ณ„ ๋ฐ ๋ฐฐํฌ ์ž๋™ํ™” ํŒŒ์ดํ”„๋ผ์ธ์„ ์–ด๋–ป๊ฒŒ ์žฌ์„ค๊ณ„ํ•ด์•ผ ํ•˜๋Š”๊ฐ€? +- GitHub Flow ํ™˜๊ฒฝ์—์„œ ๊ธฐ๋Šฅ์ด ๋ฏธ์™„์„ฑ๋œ ์ƒํƒœ๋กœ `main`์— ๋ณ‘ํ•ฉ๋˜์–ด์•ผ ํ•  ๋•Œ, Feature Flag(๊ธฐ๋Šฅ ํ† ๊ธ€)๋ฅผ ์–ด๋–ป๊ฒŒ ํšจ๊ณผ์ ์œผ๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- ํŒ€ ๊ทœ๋ชจ๊ฐ€ 3~5์ธ์—์„œ 20์ธ ์ด์ƒ์œผ๋กœ ๊ธ‰๊ฒฉํžˆ ์„ฑ์žฅํ•  ๋•Œ, GitHub Flow์˜ ํ•œ๊ณ„์ ์€ ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ๋‚˜ํƒ€๋‚˜๋ฉฐ ์–ด๋–ค ์‹œ์ ์— ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์ „ํ™˜ํ•ด์•ผ ํ•˜๋Š”๊ฐ€? +- ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ์ •๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๊ถŒ์žฅ๋˜๋Š” Squash Merge ๋ฐฉ์‹์ด ์žฅ๊ธฐ์ ์ธ ๋ฒ„๊ทธ ์ถ”์ ์„ฑ(Traceability) ๊ด€์ ์—์„œ๋Š” ์–ด๋–ค ๋‹จ์ ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- Branch Protection์„ ํ†ตํ•ด '์ตœ์†Œ 1์ธ์˜ ๋ฆฌ๋ทฐ'์™€ 'CI ํ†ต๊ณผ'๋ฅผ ๊ฐ•์ œํ•  ๋•Œ, ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ํ”„๋กœ์„ธ์Šค์  ์ตœ์ ํ™” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? + +### Practical Application Contexts +- **Implementation:** ๊ฐœ๋ฐœ์ž๋Š” JIRA ๋“ฑ์—์„œ ํ• ๋‹น๋ฐ›์€ ํ‹ฐ์ผ“ ID๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ `feature/PROJ-123-login` ํ˜•์‹์˜ ๋ธŒ๋žœ์น˜๋ฅผ ๋”ฐ๊ณ , ํ•œ ๊ฐ€์ง€ ๋…ผ๋ฆฌ์  ๋ณ€๊ฒฝ์‚ฌํ•ญ๋งŒ ๋‹ด์€ Atomic Commit์„ ์ˆ˜ํ–‰ํ•œ ๋’ค PR์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. +- **System Design:** GitHub/GitLab ๋“ฑ์˜ ๋ ˆํฌ์ง€ํ† ๋ฆฌ ์„ค์ •์—์„œ `main` ๋ธŒ๋žœ์น˜์— ๋Œ€ํ•ด ์ง์ ‘ ํ‘ธ์‹œ(Direct Push)๋ฅผ ์ฐจ๋‹จํ•˜๊ณ , Status Check(ํ…Œ์ŠคํŠธ ํ†ต๊ณผ) ๋ฐ ์ง€์ •๋œ ๋ฆฌ๋ทฐ์–ด์˜ Approve๋ฅผ ๊ฐ•์ œํ•˜๋Š” ๋ณดํ˜ธ ๊ทœ์น™(Branch Protection)์„ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค. +- **Operation / Maintenance:** CI/CD ํŒŒ์ดํ”„๋ผ์ธ์ด `main` ๋ธŒ๋žœ์น˜์˜ ๋ณ€๊ฒฝ์„ ๊ฐ์ง€ํ•˜๋ฉด ์ž๋™์œผ๋กœ ํ”„๋กœ๋•์…˜์— ๋ฐฐํฌ๋˜๋„๋ก ๊ตฌ์„ฑํ•˜๊ณ , ์ €์žฅ์†Œ์˜ ๊น”๋”ํ•œ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ๋ณ‘ํ•ฉ๋œ ๋ธŒ๋žœ์น˜๋Š” ์‹œ์Šคํ…œ์—์„œ ์ž๋™ ์‚ญ์ œ๋˜๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. +- **Learning Path:** Git ๋ธŒ๋žœ์น˜ ๊ธฐ์ดˆ ๋ช…๋ น์–ด ์ˆ™์ง€ -> 1๊ธฐ๋Šฅ 1๋ธŒ๋žœ์น˜ ์›์น™ ์‹ค์Šต -> PR ์ž‘์„ฑ ๋ฐ ๋™๋ฃŒ ๋ฆฌ๋ทฐ ๊ฒฝํ—˜ -> ์ž๋™ํ™”๋œ CI/CD์™€์˜ ์—ฐ๋™ ์ดํ•ด์˜ ์ˆœ์„œ๋กœ ํ˜‘์—… ๋Šฅ๋ ฅ์„ ์„ฑ์žฅ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- **My Project Relevance:** 3~5๋ช…์˜ ์†Œ๊ทœ๋ชจ ํŒ€์—์„œ ์ถฉ๋Œ์„ ์ตœ์†Œํ™”ํ•˜๋ฉด์„œ๋„ ๋น ๋ฅธ ํ”ผ๋“œ๋ฐฑ๊ณผ ๋ฆด๋ฆฌ์Šค๊ฐ€ ํ•„์š”ํ•œ ํ˜„์žฌ ํ”„๋กœ์ ํŠธ ์ƒํ™ฉ์—, ๋ถˆํ•„์š”ํ•œ ์ ˆ์ฐจ๋ฅผ ์—†์• ๊ณ  ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•˜๋Š” ๊ฐ€์žฅ ์ด์ƒ์ ์ธ ํ˜‘์—… ๋ชจ๋ธ๋กœ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### Adjacent Topics +- [[Conventional Commits]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๋ฅผ `feat:`, `fix:`, `chore:` ๋“ฑ์˜ ๊ทœ๊ฒฉ์œผ๋กœ ํ†ต์ผํ•จ์œผ๋กœ์จ, PR ๋‚ด์šฉ์˜ ๊ฐ€๋…์„ฑ์„ ๋†’์ด๊ณ  ํ–ฅํ›„ ๋ฆด๋ฆฌ์Šค ๋…ธํŠธ๋ฅผ ์ž๋™ํ™”ํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์ง€์‹์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[Issue Tracking System]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ์ฝ”๋“œ ๊ตฌํ˜„(GitHub)๊ณผ ์š”๊ตฌ์‚ฌํ•ญ ์ •์˜(JIRA, Linear ๋“ฑ)๋ฅผ ์—ฐ๊ฒฐํ•˜์—ฌ ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ ์ˆ˜์ค€์„ ๋†’์ด๊ณ  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋งฅ๋ฝ(Traceability)์„ ์ถ”์ ํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก ์œผ๋กœ ํ™•์žฅ๋ฉ๋‹ˆ๋‹ค. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Topics_Biz/Team Collaboration.md b/10_Wiki/Topics_Biz/Team Collaboration.md new file mode 100644 index 00000000..cd5d477d --- /dev/null +++ b/10_Wiki/Topics_Biz/Team Collaboration.md @@ -0,0 +1,70 @@ +# [[Team Collaboration]] + +## ๐Ÿ“Œ Brief Summary +ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์—์„œ 'Team Collaboration(ํŒ€ ํ˜‘์—…)'์ด๋ž€ ๋‹ค์ˆ˜์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋™์ผํ•œ ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ํšจ์œจ์ ์œผ๋กœ ํ•จ๊ป˜ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•˜๋Š” ์‹ค์ฒœ ๋ฐฉ์‹, ์•„ํ‚คํ…์ฒ˜, ๊ทธ๋ฆฌ๊ณ  ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์˜๋ฏธํ•œ๋‹ค [1, 2]. ์ด๋Š” ์ผ๊ด€๋œ ํด๋” ๊ตฌ์กฐ, ๋ช…๋ช… ๊ทœ์น™, ์ƒํƒœ ๊ด€๋ฆฌ ํŒจํ„ด ๋ฐ Git ๋ธŒ๋žœ์นญ ์ „๋žต์„ ํ™•๋ฆฝํ•˜์—ฌ ๊ฐœ๋ฐœ์ž ๊ฐ„์˜ ์ถฉ๋Œ๊ณผ ์†Œํ†ต ๋น„์šฉ์„ ์ตœ์†Œํ™”ํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•œ๋‹ค [2-4]. ์„ฑ๊ณต์ ์ธ ํ˜‘์—…์€ ๋ฆฐํŒ…์ด๋‚˜ ํฌ๋งคํŒ…๊ณผ ๊ฐ™์€ ์ž๋™ํ™”๋œ ๋„๊ตฌ๋ฅผ ํ†ตํ•œ ์—„๊ฒฉํ•œ ์ฝ”๋“œ ๊ฑฐ๋ฒ„๋„Œ์Šค์™€ ๋ช…ํ™•ํ•œ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๋ฌธํ™”๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ํŒ€์ด ํ™•์žฅ๋  ๋•Œ ์•ˆ์ •์„ฑ์„ ์œ ์ง€ํ•˜๋„๋ก ๋•๋Š”๋‹ค [5-7]. + +## ๐Ÿ“– Core Content +* **Git ์›Œํฌํ”Œ๋กœ์šฐ ๋ฐ ๋ธŒ๋žœ์นญ ์ „๋žต:** + ์†Œ๊ทœ๋ชจ ํŒ€์—์„œ๋Š” ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์ ์œผ๋ฉด์„œ๋„ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๋Š” '๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜(Feature-branch) ์›Œํฌํ”Œ๋กœ์šฐ'๋‚˜ 'ํŠธ๋ ํฌ ๊ธฐ๋ฐ˜(Trunk-based) ๊ฐœ๋ฐœ'์ด ์ฃผ๋กœ ๊ถŒ์žฅ๋œ๋‹ค [8-10]. ๋ชจ๋“  ์ž‘์—…์€ `main` ๋ธŒ๋žœ์น˜์— ์ง์ ‘ ์ปค๋ฐ‹ํ•˜์ง€ ์•Š๊ณ  ์งง์€ ์ˆ˜๋ช…์˜ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜์—์„œ ์ง„ํ–‰๋˜๋ฉฐ, Pull Request(PR)์™€ ์ตœ์†Œ 1๋ช… ์ด์ƒ์˜ ๋™๋ฃŒ ๋ฆฌ๋ทฐ(Peer review) ๋ฐ ํ…Œ์ŠคํŠธ ํ†ต๊ณผ ํ›„ ๋ณ‘ํ•ฉ๋˜์–ด์•ผ ํ•œ๋‹ค [7, 11, 12]. ๋˜ํ•œ, ๋ธŒ๋žœ์น˜๋ช…๊ณผ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€์— ํ‹ฐ์ผ“ ID(์˜ˆ: `PROJ-123`)๋ฅผ ํฌํ•จํ•˜๋ฉด ์š”๊ตฌ์‚ฌํ•ญ๊ณผ ์ฝ”๋“œ ๋ณ€๊ฒฝ ์ด๋ ฅ ๊ฐ„์˜ ์ถ”์ ์„ฑ(Traceability)์„ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ๋‹ค [13, 14]. +* **์•„ํ‚คํ…์ฒ˜ ๋ฐ ํด๋” ๊ตฌ์กฐ์˜ ํ‘œ์ค€ํ™”:** + ํ‘œ์ค€ํ™”๋œ ํด๋” ๊ตฌ์กฐ(์˜ˆ: ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ ๋˜๋Š” Feature-Sliced Design)๋Š” ํŒŒ์ผ์˜ ์œ„์น˜๋ฅผ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜์—ฌ ํŒ€ ํ˜‘์—…์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚จ๋‹ค [2]. ๊ตฌ์กฐ๊ฐ€ ์ž˜ ์žกํ˜€ ์žˆ์œผ๋ฉด ๊ฐœ๋ฐœ์ž๋“ค์ด ํŒŒ์ผ์„ ์ฐพ๋Š” ์‹œ๊ฐ„์„ ์ค„์ด๊ณ , ํŒ€์› ๊ฐ„ ๋ถˆํ•„์š”ํ•œ ์†Œํ†ต์„ ์ค„์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์‹ ๊ทœ ๊ฐœ๋ฐœ์ž์˜ ์˜จ๋ณด๋”ฉ์ด ๋นจ๋ผ์ง„๋‹ค [2, 15]. ๋˜ํ•œ ๊ฐ ๊ธฐ๋Šฅ์ด ๋…๋ฆฝ๋œ ํด๋”๋กœ ๊ฒฉ๋ฆฌ๋˜์–ด ์žˆ์–ด ์„œ๋กœ์˜ ์ฝ”๋“œ๋ฅผ ๊ฐ„์„ญํ•  ํ™•๋ฅ ์ด ๋‚ฎ์•„์ง„๋‹ค [16]. +* **๋ช…๋ช… ๊ทœ์น™(Naming Conventions) ๋ฐ ์ž๋™ํ™”๋œ ๊ฑฐ๋ฒ„๋„Œ์Šค:** + ์ปดํฌ๋„ŒํŠธ ์ด๋ฆ„์€ ํŒŒ์Šค์นผ ์ผ€์ด์Šค(PascalCase), ํŒŒ์ผ ๋ฐ ํด๋” ์ด๋ฆ„์€ ์ผ€๋ฐฅ ์ผ€์ด์Šค(kebab-case)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋“ฑ ์ผ๊ด€๋œ ๋ช…๋ช… ๊ทœ์น™์€ OS ํ™˜๊ฒฝ ๊ฐ„์˜ ๋นŒ๋“œ ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ  ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์„ ๋†’์ธ๋‹ค [17-19]. ๋” ๋‚˜์•„๊ฐ€ ์ˆ˜๋™ ๊ฒ€์‚ฌ์— ์˜์กดํ•˜๊ธฐ๋ณด๋‹ค ESLint, Prettier, Husky๋ฅผ ํ™œ์šฉํ•ด ์ปค๋ฐ‹ ์ด์ „์— ๋ฆฐํŒ…, ํฌ๋งคํŒ… ๋ฐ ํƒ€์ž… ๊ฒ€์‚ฌ๋ฅผ ์ž๋™์œผ๋กœ ๊ฐ•์ œํ•˜๋Š” ๊ฒƒ์ด ๊ณ ํ’ˆ์งˆ ์ฝ”๋“œ ํ˜‘์—…์˜ ๊ธฐ๋ฐ˜์ด๋‹ค [6, 20, 21]. +* **์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ์™€ ํŒ€ ๊ทœ๋ชจ์˜ ์ƒ๊ด€๊ด€๊ณ„:** + ํŒ€์˜ ๊ทœ๋ชจ๊ฐ€ ํด์ˆ˜๋ก(10๋ช… ์ด์ƒ) ๊ตฌ์กฐ๋ฅผ ๊ฐ•์ œํ•˜๋Š” ๋„๊ตฌ๊ฐ€ ํ˜‘์—…์— ์œ ๋ฆฌํ•˜๋‹ค [5]. Zustand์™€ ๊ฐ™์€ ๋„๊ตฌ๋Š” ์œ ์—ฐํ•˜๊ณ  ๋น ๋ฅด์ง€๋งŒ, ๊ทœ์œจ์ด ๋ถ€์กฑํ•˜๋ฉด ๊ฐœ๋ฐœ์ž๋งˆ๋‹ค ๋น„๋™๊ธฐ ์ž‘์—…์„ ๋‹ค๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•˜์—ฌ ์ฝ”๋“œ๋ฒ ์ด์Šค์— ํ˜ผ๋ž€(integration chaos)์„ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ๋‹ค [22, 23]. ๋ฐ˜๋ฉด Redux๋Š” ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ๊ฐ€ ๋งŽ์ง€๋งŒ, ํŒ€ ์ „์›์ด ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” '๋‹จ์ผ ์ง„์‹ค ๊ณต๊ธ‰์›'๊ณผ ๊ตฌ์กฐ๋ฅผ ์ œ๊ณตํ•˜์—ฌ ๋Œ€๊ทœ๋ชจ ํ˜‘์—…์—์„œ ๋ฒ„๊ทธ๋ฅผ ์ค„์ธ๋‹ค [5, 24, 25]. + +## โš–๏ธ Trade-offs & Caveats +* **์œ ์—ฐ์„ฑ vs. ๊ตฌ์กฐ์  ๊ฐ•์ œ์„ฑ (์ƒํƒœ ๊ด€๋ฆฌ):** Zustand ๊ฐ™์ด ๊ฐ€๋ฒผ์šด ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ๊ฐ€ ์ ์–ด ๋น ๋ฅธ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ(์Šคํƒ€ํŠธ์—… ๋“ฑ)์— ์ ํ•ฉํ•˜์ง€๋งŒ, ์œ ์—ฐ์„ฑ์ด ๋„ˆ๋ฌด ์ปค์„œ ํŒ€์ด ์ปค์งˆ ๊ฒฝ์šฐ ํŒŒํŽธํ™”๋œ ํŒจํ„ด์„ ๋‚ณ์„ ์ˆ˜ ์žˆ๋‹ค [22, 23, 26, 27]. ๋ฐ˜๋ฉด Redux๋Š” ์ผ๊ด€์„ฑ์„ ๊ฐ•์ œํ•˜์—ฌ ๋””๋ฒ„๊น…๊ณผ ํ˜‘์—…์„ ํŽธํ•˜๊ฒŒ ํ•ด์ฃผ์ง€๋งŒ, ์ดˆ๊ธฐ ์„ค์ •๊ณผ ๊ตฌ์กฐํ™”์— ๋“œ๋Š” ์‹œ๊ฐ„์ด ์†Œ๊ทœ๋ชจ ํŒ€์—๊ฒŒ๋Š” ๊ณผ๋„ํ•œ ์˜ค๋ฒ„ํ—ค๋“œ๋กœ ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๋‹ค [5, 24, 28]. +* **๋ธŒ๋žœ์นญ ์›Œํฌํ”Œ๋กœ์šฐ์˜ ๋ฌด๊ฒŒ๊ฐ:** Git Flow๋Š” ์˜ˆ์ •๋œ ๋ฆด๋ฆฌ์Šค๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฑฐ๋Œ€ ํ”„๋กœ์ ํŠธ์—๋Š” ์œ ์šฉํ•˜์ง€๋งŒ, ์†Œ๊ทœ๋ชจ ํŒ€์—๊ฒŒ๋Š” ๋ธŒ๋žœ์น˜ ๊ด€๋ฆฌ ๋น„์šฉ์ด ๋„ˆ๋ฌด ์ปค์„œ ๊ฐœ๋ฐœ ์†๋„๋ฅผ ๋Šฆ์ถœ ์ˆ˜ ์žˆ๋‹ค [8, 29]. ๊ฐ€๋ฒผ์šด Feature-branch ์›Œํฌํ”Œ๋กœ์šฐ๋‚˜ Trunk-based ๊ฐœ๋ฐœ์ด ๋Œ€์•ˆ์ด์ง€๋งŒ, ์ด๋Š” ๊ฐœ๋ฐœ์ž๋“ค์ด ๋ธŒ๋žœ์น˜๋ฅผ ์งง๊ฒŒ ์œ ์ง€ํ•˜๊ณ  ๋นˆ๋ฒˆํžˆ ๋ณ‘ํ•ฉ(Merge)ํ•˜๋Š” ๊ทœ์œจ์„ ์Šค์Šค๋กœ ์ง€์ผœ์•ผ๋งŒ ์„ฑ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค [30, 31]. +* **์ดˆ๊ธฐ ํ•™์Šต ๊ณก์„ ๊ณผ ์˜ค๋ฒ„ํ—ค๋“œ:** Feature-Sliced Design(FSD) ๊ฐ™์€ ์—„๊ฒฉํ•œ ์•„ํ‚คํ…์ฒ˜๋Š” ์ฝ”๋“œ์˜ ๋ชจ๋“ˆํ™”์™€ ๋…๋ฆฝ์  ์ž‘์—…(๋ณ‘๋ ฌ ์ž‘์—…)์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜์ง€๋งŒ, ์ดˆ๊ธฐ ๋„์ž… ์‹œ ํŒ€์› ์ „์ฒด๊ฐ€ ํ•ด๋‹น ๋ฐฉ๋ฒ•๋ก (Layer, Slice ๋“ฑ์˜ ๊ฐœ๋…)์„ ์ดํ•ดํ•˜๊ณ  ๋™์˜ํ•ด์•ผ ํ•˜๋Š” ํ•™์Šต ๋น„์šฉ์ด ๋ฐœ์ƒํ•œ๋‹ค [32, 33]. ๊ทœ์น™์— ๋Œ€ํ•œ ์ง€์‹ ๊ณต์œ ์™€ ๋ฌธ์„œํ™”๊ฐ€ ๋™๋ฐ˜๋˜์ง€ ์•Š์œผ๋ฉด, ๊ฐœ๋ฐœ์ž๋“ค์ด ์ž„์˜๋กœ ํ•˜์œ„ ํด๋”๋‚˜ `/shared` ๋“ฑ์— ์ฝ”๋“œ๋ฅผ ์Ÿ์•„๋ถ€์–ด ์˜คํžˆ๋ ค ์•„ํ‚คํ…์ฒ˜๊ฐ€ ๋ง๊ฐ€์ง€๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋‚ณ์„ ์ˆ˜ ์žˆ๋‹ค [33]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [๊ด€๊ณ„ ์œ ํ˜• A (ํ˜‘์—…/์ฝ”๋“œ ๊ด€๋ฆฌ ํ”„๋กœ์„ธ์Šค)] +- [[Git Branching Strategies]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋‹ค์ˆ˜์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋™์‹œ์— ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๊ณ  ํ†ตํ•ฉ ๊ณผ์ •์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ํ•ต์‹ฌ ๊ทœ์•ฝ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค [3, 34]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Pull Request, ์ฝ”๋“œ ๋ฆฌ๋ทฐ, ๋ธŒ๋žœ์น˜ ๋ช…๋ช… ๊ทœ์น™, Trunk-based ์›Œํฌํ”Œ๋กœ์šฐ ๋“ฑ ์‹ค์ œ ํŒ€ ์šด์˜ ๋ฐฉ์‹ [7, 35]. +- [[Commit Message Conventions]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋ณ€๊ฒฝ ์‚ฌํ•ญ์˜ ์˜๋„์™€ ์ž‘์—… ๋‚ด์—ญ(๋ฒ„๊ทธ ํ”ฝ์Šค, ๊ธฐ๋Šฅ ์ถ”๊ฐ€ ๋“ฑ)์„ ๋‹ค๋ฅธ ํŒ€์›๋“ค์—๊ฒŒ ๋ช…ํ™•ํžˆ ์ „๋‹ฌํ•˜๋Š” ์†Œํ†ต์˜ ๋„๊ตฌ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค [36]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํ‹ฐ์ผ“ ID ํ†ตํ•ฉ, `feat:`, `fix:`์™€ ๊ฐ™์€ ์ ‘๋‘์‚ฌ๋ฅผ ํ†ตํ•œ ๋ณ€๊ฒฝ ์ด๋ ฅ์˜ ์ž๋™ํ™” ๋ฐ ์Šค์บ๋‹ [14, 36, 37]. + +#### [๊ด€๊ณ„ ์œ ํ˜• B (์•„ํ‚คํ…์ฒ˜ ๋ฐ ๊ฑฐ๋ฒ„๋„Œ์Šค ๋„๊ตฌ)] +- [[Feature-Sliced Design]] + - ์—ฐ๊ฒฐ ์ด์œ : ์ฝ”๋“œ๋ฅผ ๊ธฐ์ˆ ์  ๊ณ„์ธต์ด ์•„๋‹Œ ๋น„์ฆˆ๋‹ˆ์Šค ๊ธฐ๋Šฅ(Feature) ์ค‘์‹ฌ์œผ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ, ์—ฌ๋Ÿฌ ํŒ€์ด ์„œ๋กœ ๊ฐ„์„ญ ์—†์ด ๋…๋ฆฝ์ ์œผ๋กœ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ๋Š” ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•œ๋‹ค [16, 38]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋„๋ฉ”์ธ ์ฃผ๋„ ์„ค๊ณ„์˜ ํ”„๋ก ํŠธ์—”๋“œ ์ ์šฉ, ๋ช…์‹œ์  ํผ๋ธ”๋ฆญ API๋ฅผ ํ†ตํ•œ ๋ชจ๋“ˆ ์บก์Аํ™”์™€ ๊ฒฐํ•ฉ๋„ ๋‚ฎ์ถ”๊ธฐ [38-40]. +- [[Automated Governance]] + - ์—ฐ๊ฒฐ ์ด์œ : ์‚ฌ๋žŒ์˜ ์ˆ˜๋™ ํ™•์ธ์— ์˜์กดํ•˜์ง€ ์•Š๊ณ  ESLint, Prettier, Husky ๋“ฑ์œผ๋กœ ์ฝ”๋“œ ์ปจ๋ฒค์…˜๊ณผ ์•„ํ‚คํ…์ฒ˜ ๋ฃฐ(์˜์กด์„ฑ ๋ฐฉํ–ฅ ๋“ฑ)์„ ์‹œ์Šคํ…œ์ ์œผ๋กœ ๊ฐ•์ œํ•œ๋‹ค [6, 20]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: CI/CD ํŒŒ์ดํ”„๋ผ์ธ์—์„œ์˜ ์ฝ”๋“œ ํ’ˆ์งˆ ๋ณด์ฆ ๋ฐ ํŒ€์› ๊ฐ„์˜ ์Šคํƒ€์ผ ๋ถ„์Ÿ ๋ฐฉ์ง€ [20]. +- [[Redux vs Zustand in Teams]] + - ์—ฐ๊ฒฐ ์ด์œ : ํŒ€์˜ ๊ทœ๋ชจ(์†Œ๊ทœ๋ชจ vs ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ)์— ๋”ฐ๋ผ ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ์˜ ์„ ํƒ์ด ํ˜‘์—…์˜ ์ผ๊ด€์„ฑ์— ๊ฒฐ์ •์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค [5, 24, 27]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ฐœ๋ฐœ์ž์˜ ์ž์œจ์„ฑ ๋ถ€์—ฌ์™€ ์ผ๊ด€์„ฑ ๊ฐ•์ œ(Boilerplate) ์‚ฌ์ด์˜ ์•„ํ‚คํ…์ฒ˜์  ํŠธ๋ ˆ์ด๋“œ์˜คํ”„ [22, 41]. + +### Deeper Research Questions + +- ์†Œ๊ทœ๋ชจ ํŒ€(2~5์ธ)์—์„œ ๋Œ€๊ทœ๋ชจ ํŒ€(10์ธ ์ด์ƒ)์œผ๋กœ ํ™•์žฅํ•  ๋•Œ Git ์›Œํฌํ”Œ๋กœ์šฐ์™€ ๋ธŒ๋žœ์นญ ์ „๋žต์€ ์–ด๋–ป๊ฒŒ ์ง„ํ™”ํ•ด์•ผ ํ•˜๋Š”๊ฐ€? +- Feature-Sliced Design(FSD)์„ ํ”„๋กœ์ ํŠธ์— ๋„์ž…ํ•  ๋•Œ, ํŒ€์›๋“ค์ด ๊ณตํ†ต ๋ชจ๋“ˆ์„ `/shared` ํด๋”์— ๋ฌด๋ถ„๋ณ„ํ•˜๊ฒŒ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์ฒด์ ์ธ ๊ฑฐ๋ฒ„๋„Œ์Šค ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? +- ESLint์™€ Husky๋ฅผ ํ™œ์šฉํ•œ ์ž๋™ํ™” ๊ฑฐ๋ฒ„๋„Œ์Šค ์„ค์ • ์‹œ, ๊ฐœ๋ฐœ ์†๋„๋ฅผ ๋Šฆ์ถ”์ง€ ์•Š์œผ๋ฉด์„œ ๋ชจ๋“ˆ ๊ฐ„ ์ž˜๋ชป๋œ ์˜์กด์„ฑ(์ƒ์œ„ ๋ ˆ์ด์–ด ์ฐธ์กฐ ๋“ฑ)์„ ์›์ฒœ ์ฐจ๋‹จํ•˜๋Š” ์ตœ์ ์˜ ๊ทœ์น™ ๊ตฌ์„ฑ์€ ๋ฌด์—‡์ธ๊ฐ€? +- ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(Redux vs Zustand)์˜ ์„ ํƒ์ด ํŒ€์› ๊ฐ„์˜ ๋น„๋™๊ธฐ ๋กœ์ง ๋ฐ ๋ฐ์ดํ„ฐ ํŒจ์นญ(Fetching) ํŒจํ„ด์˜ ํŒŒํŽธํ™”์— ๋ฏธ์น˜๋Š” ์‹ค์ œ ์˜ํ–ฅ์€ ๋ฌด์—‡์ธ๊ฐ€? +- Pull Request ๊ธฐ๋ฐ˜์˜ ํ˜‘์—… ํ™˜๊ฒฝ์—์„œ, ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ ๋„๊ตฌ(์˜ˆ: Storybook, Chromatic)๊ฐ€ ์ฝ”๋“œ ๋ฆฌ๋ทฐ์˜ ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ์–ด๋–ป๊ฒŒ ํ•ด์†Œํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? + +### Practical Application Contexts + +- **Implementation:** ์ฝ”๋“œ๋ฅผ ์ปค๋ฐ‹ํ•˜๊ณ  PR์„ ์ƒ์„ฑํ•  ๋•Œ, ๋ฐ˜๋“œ์‹œ ์ •ํ•ด์ง„ Conventional Commits ๊ทœ์น™์„ ๋”ฐ๋ฅด๊ณ  JIRA ๋“ฑ์˜ ์ด์Šˆ ํ‹ฐ์ผ“ ๋ฒˆํ˜ธ๋ฅผ ๋ธŒ๋žœ์น˜์™€ ์ปค๋ฐ‹์— ๊ธฐ์ž…ํ•˜์—ฌ ์ถ”์ ์„ฑ์„ ๋ณด์žฅํ•œ๋‹ค [14, 37]. +- **System Design:** ํ”„๋กœ์ ํŠธ ํด๋” ๊ตฌ์กฐ ์„ค๊ณ„ ์‹œ ๊ธฐ์ˆ ์  ํŒŒ์ผ ํƒ€์ž…(์ปดํฌ๋„ŒํŠธ, ํ›… ๋“ฑ)์˜ ๋‚˜์—ด์ด ์•„๋‹Œ, ์ธ์ฆ, ๋Œ€์‹œ๋ณด๋“œ ๋“ฑ ๊ธฐ๋Šฅ(Feature) ๋„๋ฉ”์ธ ๋‹จ์œ„๋กœ ๊ฒฉ๋ฆฌ์‹œ์ผœ ๊ฐ ๊ธฐ๋Šฅ๋ณ„๋กœ ์ „๋‹ด ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ณ‘๋ ฌ๋กœ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค [2, 42, 43]. +- **Operation / Maintenance:** CI/CD ํŒŒ์ดํ”„๋ผ์ธ๊ณผ Git Hooks(Husky)๋ฅผ ์„ธํŒ…ํ•˜์—ฌ, ๋ˆ„๊ตฐ๊ฐ€ ์ปจ๋ฒค์…˜์„ ์–ด๊ธด ์ฝ”๋“œ๋ฅผ ํ‘ธ์‹œํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์‚ฌ์ „์— ๋ฆฐํ„ฐ์™€ ํฌ๋งคํ„ฐ๊ฐ€ ์ž‘๋™ํ•ด ์ž˜๋ชป๋œ ์ฝ”๋“œ๊ฐ€ ์›๊ฒฉ ๋ธŒ๋žœ์น˜์— ์˜ฌ๋ผ๊ฐ€๋Š” ๊ฒƒ์„ ์ฐจ๋‹จํ•œ๋‹ค [20]. +- **Learning Path:** ์‹ ๊ทœ ์ž…์‚ฌ์ž๋‚˜ ํŒ€์›์ด ๋ฐฐ์ •๋˜์—ˆ์„ ๋•Œ, `README`์— ๋ช…์‹œ๋œ ํŒ€์˜ ๋ธŒ๋žœ์นญ ์ „๋žต ๊ทœ์น™๊ณผ ํด๋” ๋””๋ ‰ํ† ๋ฆฌ ์„ค๊ณ„ ์˜๋„๋ฅผ ๋จผ์ € ํ•™์Šตํ•˜๊ฒŒ ํ•˜์—ฌ ํ”„๋กœ์ ํŠธ ์˜จ๋ณด๋”ฉ ์‹œ๊ฐ„์„ ๋‹จ์ถ•ํ•œ๋‹ค [2, 44]. +- **My Project Relevance:** ๋‹ค์ˆ˜์˜ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•จ๊ป˜ ์ฐธ์—ฌํ•˜๋Š” ๋ฆฌ์•กํŠธ ํ”„๋กœ์ ํŠธ์—์„œ, ์ฝ”๋“œ ์ถฉ๋Œ๊ณผ ๊ธฐ์ˆ  ๋ถ€์ฑ„๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ  ์ผ๊ด€๋œ ์ œํ’ˆ ํ’ˆ์งˆ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์ˆ˜์ ์œผ๋กœ ์ˆ˜๋ฆฝํ•ด์•ผ ํ•˜๋Š” ํ˜‘์—… ๊ทธ๋ผ์šด๋“œ ๋ฃฐ(Ground Rules)์ด๋‹ค. + +### Adjacent Topics + +- [[Code Review Practices]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ์ž‘์€ ๋‹จ์œ„์˜ Pull Request ์œ ์ง€, ์‹œ๊ฐ์  ๋ฆฌ๋ทฐ ๋„๊ตฌ์˜ ๋„์ž…, ํšจ์œจ์ ์ธ ๋™๋ฃŒ ํ”ผ๋“œ๋ฐฑ ์ œ๊ณต ๋“ฑ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ์ž์ฒด์˜ ํ’ˆ์งˆ๊ณผ ์†๋„๋ฅผ ๋†’์ด๋Š” ๋ฐฉ๋ฒ•๋ก  [37, 45]. +- [[CI/CD Pipelines]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ํŒ€์›์˜ ์ฝ”๋“œ๊ฐ€ `main`์— ๋ณ‘ํ•ฉ๋˜๊ธฐ ์ „, ์ž๋™์œผ๋กœ ํ…Œ์ŠคํŠธ์™€ ๋ฆฐํŒ…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋ฐฐํฌ๊นŒ์ง€ ์ด์–ด์ง€๋Š” ์ธํ”„๋ผ ๋ฐ ๋ฐ๋ธŒ์˜ต์Šค ํ™˜๊ฒฝ [7]. +- [[Visual Regression Testing]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: Storybook ๋ฐ Chromatic์„ ํ™œ์šฉํ•ด UI ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ฆฌ๋ทฐ์–ด๊ฐ€ ์‹œ๊ฐ์ ์œผ๋กœ ์ง์ ‘ ํ™•์ธํ•˜๊ณ , ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๋ ˆ์ด์•„์›ƒ ๊นจ์ง์„ ๋ฐฉ์ง€ํ•˜๋Š” ํ˜‘์—… ๊ธฐ์ˆ  [45, 46]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Topics_Biz/Version Control.md b/10_Wiki/Topics_Biz/Version Control.md new file mode 100644 index 00000000..2da5260d --- /dev/null +++ b/10_Wiki/Topics_Biz/Version Control.md @@ -0,0 +1,69 @@ +# [[Version Control]] + +## ๐Ÿ“Œ Brief Summary +๋ฒ„์ „ ๊ด€๋ฆฌ(Version Control)๋Š” ์†Œ๊ทœ๋ชจ๋ถ€ํ„ฐ ๋Œ€๊ทœ๋ชจ ํŒ€์— ์ด๋ฅด๊ธฐ๊นŒ์ง€ ์ฝ”๋“œ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ถ”์ ํ•˜๊ณ , ๋ณ‘ํ•ฉ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๋ฉฐ ์•ˆ์ •์ ์ธ ๋ฐฐํฌ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ํ•„์ˆ˜์ ์ธ ํ˜‘์—… ๋„๊ตฌ ๋ฐ ๊ฑฐ๋ฒ„๋„Œ์Šค ํ”„๋กœ์„ธ์Šค์ž…๋‹ˆ๋‹ค [1, 2]. ๊ฐœ๋ฐœํŒ€์€ ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ์™€ ํŒ€์˜ ์ˆ™๋ จ๋„์— ๋”ฐ๋ผ Feature-Branch ์›Œํฌํ”Œ๋กœ์šฐ, Trunk-based ๊ฐœ๋ฐœ, Git Flow ๋“ฑ ๋‹ค์–‘ํ•œ ๋ธŒ๋žœ์นญ ์ „๋žต์„ ์„ ํƒํ•˜์—ฌ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค [3, 4]. ํšจ๊ณผ์ ์ธ ๋ฒ„์ „ ๊ด€๋ฆฌ๋Š” ๋ธŒ๋žœ์น˜์™€ ์ปค๋ฐ‹์— ํ‹ฐ์ผ“ ID ์—ฐ๋™, ์˜๋ฏธ ์žˆ๋Š” ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ์ž‘์„ฑ, ์ž‘๊ณ  ๋นˆ๋ฒˆํ•œ ์ปค๋ฐ‹, ๊ทธ๋ฆฌ๊ณ  ์—„๊ฒฉํ•œ ํ’€ ๋ฆฌํ€˜์ŠคํŠธ(PR) ๋ฆฌ๋ทฐ ๋“ฑ์˜ ๋ชจ๋ฒ” ์‚ฌ๋ก€๋ฅผ ์ค€์ˆ˜ํ•˜์—ฌ ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ํ’ˆ์งˆ๊ณผ ์ถ”์ ์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค [2, 5]. + +## ๐Ÿ“– Core Content +* **์ฃผ์š” ๋ธŒ๋žœ์นญ ์ „๋žต (Branching Strategies)** + * **Feature-Branch Workflow**: 2~5์ธ ๊ทœ๋ชจ์˜ ์†Œ๊ทœ๋ชจ ํŒ€์—๊ฒŒ ๊ฐ€์žฅ ๊ถŒ์žฅ๋˜๋Š” ๋‹จ์ˆœํ•˜๊ณ  ์ถฉ๋Œ์ด ์ ์€ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค [6]. `main` ๋ธŒ๋žœ์น˜๋Š” ํ•ญ์ƒ ์•ˆ์ •์ ์ด๊ณ  ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋ฉฐ, ๊ฐ ๊ธฐ๋Šฅ์ด๋‚˜ ๋ฒ„๊ทธ ์ˆ˜์ •์€ `main`์—์„œ ๋ถ„๊ธฐ๋œ ์งง์€ ์ˆ˜๋ช…์˜ ๊ฐœ๋ณ„ ๋ธŒ๋žœ์น˜์—์„œ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค [6, 7]. + * **Trunk-Based Development**: ์งง์€ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜(Trunk)์— ์ฝ”๋“œ๋ฅผ ๋น ๋ฅด๊ณ  ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ณ‘ํ•ฉํ•˜๋Š” ์ „๋žต์œผ๋กœ, ๊ฐ•๋ ฅํ•œ CI/CD ํ™˜๊ฒฝ๊ณผ ๊ฒฝํ—˜์ด ๋งŽ์€ ํŒ€์—๊ฒŒ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค [8, 9]. + * **Git Flow & GitHub Flow**: Git Flow๋Š” ๋ณ„๋„์˜ ๋ฆด๋ฆฌ์Šค ๋ธŒ๋žœ์น˜ ๋“ฑ์„ ๋‘์–ด ์Šค์ผ€์ค„์— ๋”ฐ๋ฅธ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์ข‹์ง€๋งŒ, ์ž‘์€ ํŒ€์—๊ฒŒ๋Š” ์ ˆ์ฐจ๊ฐ€ ๋ฌด๊ฒ์Šต๋‹ˆ๋‹ค [9]. ๋ฐ˜๋ฉด GitHub Flow๋Š” ๋” ๋‹จ์ˆœํ•˜๋ฉฐ ๋น ๋ฅธ ํ†ตํ•ฉ์„ ์ง€ํ–ฅํ•ฉ๋‹ˆ๋‹ค [10]. + +* **๋ช…๋ช… ๊ทœ์น™ ๋ฐ ์ถ”์ ์„ฑ (Naming Conventions & Traceability)** + * **๋ธŒ๋žœ์น˜ ๋ช…๋ช… (Branch Naming)**: ๋ธŒ๋žœ์น˜ ์ด๋ฆ„์—๋Š” ์ž‘์—…์˜ ์œ ํ˜•๊ณผ ํ‹ฐ์ผ“ ID, ์งง์€ ์„ค๋ช…์„ ํฌํ•จํ•˜๋Š” ๊ฒƒ(์˜ˆ: `feature/PROJ-123-user-auth`)์ด ๊ถŒ์žฅ๋˜๋ฉฐ, ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ์†Œ๋ฌธ์ž์™€ ํ•˜์ดํ”ˆ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [11, 12]. + * **์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ (Commit Messages)**: 'Conventional Commits' ์‚ฌ์–‘์„ ๋”ฐ๋ผ `feat:`, `fix:`, `docs:`, `refactor:`, `chore:` ๋“ฑ์˜ ์ ‘๋‘์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€๊ฒฝ ๋ชฉ์ ์„ ๋ช…ํ™•ํžˆ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [5, 13]. ์ปค๋ฐ‹์€ ๋…ผ๋ฆฌ์ ์ธ ๋‹จ์ผ ๋ณ€๊ฒฝ ์‚ฌํ•ญ๋งŒ์„ ํฌํ•จํ•˜๋Š” '์›์ž์  ์ปค๋ฐ‹(Atomic Commits)' ํ˜•ํƒœ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค [14]. + +* **๋ณ‘ํ•ฉ ๋ฐ ๋ฆฌ๋ทฐ ํ”„๋กœ์„ธ์Šค (Merging and Code Review)** + * **Pull Request (PR)**: ์ฝ”๋“œ๋ฅผ `main`์— ๋ณ‘ํ•ฉํ•˜๊ธฐ ์ „ ๋ฐ˜๋“œ์‹œ PR์„ ์—ด์–ด ์ตœ์†Œ 1๋ช… ์ด์ƒ์˜ ๋™๋ฃŒ ๋ฆฌ๋ทฐ๋ฅผ ๊ฑฐ์น˜๊ณ  CI ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [15, 16]. ๋ฆฌ๋ทฐ๊ฐ€ ์‰ฝ๊ฒŒ ์ง„ํ–‰๋˜๋„๋ก PR์€ ์ž‘๊ฒŒ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [13]. + * **์ถฉ๋Œ ์˜ˆ๋ฐฉ ๋ฐ ์ •๋ฆฌ**: ๋ณ‘ํ•ฉ ์ถฉ๋Œ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด `main` ๋ธŒ๋žœ์น˜์˜ ์ตœ์‹  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ž์ฃผ ๊ฐ€์ ธ์™€ ๋™๊ธฐํ™”(pull/rebase)ํ•ด์•ผ ํ•˜๋ฉฐ, ๋ณ‘ํ•ฉํ•  ๋•Œ๋Š” 'Squash & Merge'๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ณ  ๋ณ‘ํ•ฉ ํ›„์—๋Š” ์‚ฌ์šฉํ•œ ๋ธŒ๋žœ์น˜๋ฅผ ์ž๋™ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค [15, 17, 18]. + +## โš–๏ธ Trade-offs & Caveats +* **์˜ค๋ฒ„ํ—ค๋“œ vs. ์ œ์–ด๋ ฅ**: Git Flow์™€ ๊ฐ™์ด ๊ตฌ์กฐํ™”๋˜๊ณ  ๋ฌด๊ฑฐ์šด ํ”„๋กœ์„ธ์Šค๋Š” ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฆด๋ฆฌ์Šค ์ผ์ •์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์ข‹์ง€๋งŒ, ์†Œ๊ทœ๋ชจ ํŒ€์—๊ฒŒ๋Š” ํ”„๋กœ์„ธ์Šค ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋„ˆ๋ฌด ์ปค์„œ ๊ฐœ๋ฐœ ์†๋„๋ฅผ ์ €ํ•˜์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [9, 19]. ๋ฐ˜๋Œ€๋กœ ๋„ˆ๋ฌด ๋‹จ์ˆœํ•œ ์ „๋žต์€ ์—„๊ฒฉํ•œ ์ œ์–ด๊ฐ€ ํ•„์š”ํ•œ ๋Œ€ํ˜• ํ”„๋กœ์ ํŠธ์—์„œ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํŒ€ ๊ทœ๋ชจ์™€ ์š”๊ตฌ์‚ฌํ•ญ์— ๋งž์ถ˜ ์ „๋žต ์„ ํƒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค [20]. +* **Trunk-Based ๊ฐœ๋ฐœ์˜ ์ œ์•ฝ์‚ฌํ•ญ**: ๋ณ‘ํ•ฉ ์ถฉ๋Œ์„ ์ตœ์†Œํ™”ํ•˜๊ณ  ๋น ๋ฅธ ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•˜์ง€๋งŒ, ๊ฐœ๋ฐœํŒ€์˜ ๋†’์€ ์ˆ™๋ จ๋„์™€ ๊ฐ•๋ ฅํ•œ CI ๊ฒ€์ฆ ํŒŒ์ดํ”„๋ผ์ธ์ด ์ „์ œ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [9]. ๋˜ํ•œ, ๋ฏธ์™„์„ฑ๋œ ๊ธฐ๋Šฅ์ด ๋ณ‘ํ•ฉ๋  ์œ„ํ—˜์ด ์žˆ์œผ๋ฏ€๋กœ ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ(Feature flags)๋ฅผ ์ถ”๊ฐ€๋กœ ๋„์ž…ํ•ด์•ผ ํ•˜๋Š” ์ œ์•ฝ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [19]. +* **์žฅ๊ธฐ ๋ธŒ๋žœ์น˜(Long-lived Branches)์˜ ๋ฐ˜๋Œ€๊ธ‰๋ถ€**: ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ์„ ์œ„ํ•ด ๋ธŒ๋žœ์น˜๋ฅผ ๋„ˆ๋ฌด ์˜ค๋ž˜ ์œ ์ง€ํ•˜๋ฉด ๋ณ‘ํ•ฉ ์‹œ์ ์— ์—„์ฒญ๋‚œ ์ฝ”๋“œ ์ถฉ๋Œ(merge conflicts)์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค [12, 21]. ๋”ฐ๋ผ์„œ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ž‘์—…์ž๊ฐ€ ๋งค์ผ `main` ๋ธŒ๋žœ์น˜์™€ ๋™๊ธฐํ™”ํ•˜๋Š” ์ง€์†์ ์ธ ์œ ์ง€๋ณด์ˆ˜ ๋…ธ๋ ฅ์„ ๊ธฐ์šธ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค [18]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [์›Œํฌํ”Œ๋กœ์šฐ ๋ฐ ๋ฐฉ๋ฒ•๋ก  (Workflow Strategies)] +- [[Feature Branch Workflow]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋ฒ„๊ทธ ์ˆ˜์ •์ด๋‚˜ ์ƒˆ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ ์‹œ `main`๊ณผ ๋ถ„๋ฆฌ๋œ ๋…๋ฆฝ์ ์ด๊ณ  ์งง์€ ์ˆ˜๋ช…์˜ ๋ธŒ๋žœ์น˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ „๋žต์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. [6, 7] + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์–ด๋–ป๊ฒŒ `main` ๋ธŒ๋žœ์น˜์˜ ์•ˆ์ •์„ฑ์„ ํ›ผ์†ํ•˜์ง€ ์•Š์œผ๋ฉด์„œ๋„ ๋‹ค์ˆ˜์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[Trunk-Based Development]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋ชจ๋“  ๊ฐœ๋ฐœ์ž๊ฐ€ ๋นˆ๋ฒˆํ•˜๊ฒŒ ์งง์€ ์ฃผ๊ธฐ๋กœ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜(Trunk)์— ์ฝ”๋“œ๋ฅผ ๋ณ‘ํ•ฉํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. [8, 9] + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ง€์†์  ํ†ตํ•ฉ(CI)์„ ์–ด๋–ป๊ฒŒ ๋ณด์žฅํ•˜๋ฉฐ, ์žฅ๊ธฐ ๋ธŒ๋žœ์น˜๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ํšŒํ”ผํ•˜๋Š”์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[Git Flow]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋ฆด๋ฆฌ์Šค์šฉ ๋ธŒ๋žœ์น˜์™€ ๊ฐœ๋ฐœ์šฉ ๋ธŒ๋žœ์น˜๋ฅผ ๋ช…ํ™•ํžˆ ๋‚˜๋ˆ„์–ด ๋ณต์žกํ•œ ํ”„๋กœ์ ํŠธ ๋ฆด๋ฆฌ์Šค๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. [9, 19] + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํŒ€์˜ ๊ทœ๋ชจ์™€ ๋ฐฐํฌ ์Šค์ผ€์ค„์— ๋”ฐ๋ผ ์›Œํฌํ”Œ๋กœ์šฐ์— ์–ด๋–ค ๊ตฌ์กฐ์  ๋ ˆ์ด์–ด๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +#### [ํ˜‘์—… ๋ฐ ํ’ˆ์งˆ ๊ด€๋ฆฌ (Quality Assurance & Collaboration)] +- [[Pull Request (PR)]] + - ์—ฐ๊ฒฐ ์ด์œ : ์ฝ”๋“œ๋ฅผ ์ฃผ ๋ธŒ๋žœ์น˜์— ๋ณ‘ํ•ฉํ•˜๊ธฐ ์ „, ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋™๋ฃŒ์—๊ฒŒ ๊ฒ€ํ† ๋ฐ›๋Š” ํ•ต์‹ฌ ํ’ˆ์งˆ ํ†ต์ œ ์ ˆ์ฐจ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. [13, 16] + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ฝ”๋“œ ๋ฆฌ๋ทฐ์™€ CI ํ…Œ์ŠคํŠธ ์ž๋™ํ™”๊ฐ€ ์–ด๋–ป๊ฒŒ ์‹ค์ œ ์ฝ”๋“œ ํ’ˆ์งˆ์„ ์œ ์ง€ํ•˜๊ณ  ํŒ€ ๋‚ด ์ง€์‹ ๊ณต์œ ๋ฅผ ๋•๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[Conventional Commits]] + - ์—ฐ๊ฒฐ ์ด์œ : `feat:`, `fix:`์™€ ๊ฐ™์ด ํ‘œ์ค€ํ™”๋œ ์ ‘๋‘์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€์˜ ์˜๋„๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ตฌ๋ฌธ ๊ทœ์น™์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. [5, 13] + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ํ†ตํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์ถ”์ ์„ฑ ํ™•๋ณด์™€ ๋ฆด๋ฆฌ์Šค ๋…ธํŠธ ์ž๋™ํ™”์— ์–ด๋–ป๊ฒŒ ๊ธฐ์—ฌํ•˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### Deeper Research Questions +- ์†Œ๊ทœ๋ชจ ํŒ€(2~5๋ช…)์ด ์„ฑ์žฅํ•˜์—ฌ 10๋ช… ์ด์ƒ์˜ ๋Œ€๊ทœ๋ชจ ์กฐ์ง์ด ๋  ๋•Œ, Feature-Branch ์›Œํฌํ”Œ๋กœ์šฐ์—์„œ Git Flow ๋“ฑ ๋” ๋ณต์žกํ•œ ์ „๋žต์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋Š” ๊ตฌ์ฒด์ ์ด๊ณ  ์•ˆ์ „ํ•œ ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? [9, 20] +- Trunk-based ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ๋ถˆ์™„์ „ํ•œ ์ฝ”๋“œ๋ฅผ ๋ฐฐํฌํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ(Feature Flags)๋Š” ๋ฒ„์ „ ๊ด€๋ฆฌ ๋ฐ ๋ธŒ๋žœ์นญ ์ „๋žต์˜ ๋ณต์žก์„ฑ์— ์–ด๋–ค ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”๊ฐ€? [19] +- Pull Request ์™„๋ฃŒ ์‹œ 'Squash & Merge' ๋ฐฉ์‹๊ณผ 'Merge Commit' ๋ฐฉ์‹ ๊ฐ„์˜ ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ ๊ฐ€๋…์„ฑ ๋ฐ ๋กค๋ฐฑ ์šฉ์ด์„ฑ ์ฐจ์ด๋Š” ์–ด๋–ป๊ฒŒ ๋‚˜ํƒ€๋‚˜๋Š”๊ฐ€? [15, 17, 18] +- ๋ธŒ๋žœ์น˜ ์ด๋ฆ„๊ณผ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€์— ํ‹ฐ์ผ“ ID๋ฅผ ์˜๋ฌด์ ์œผ๋กœ ํฌํ•จํ•˜๋Š” ๊ฑฐ๋ฒ„๋„Œ์Šค๋Š”, ์‹ค์ œ ์ด์Šˆ ํŠธ๋ž˜ํ‚น ๋„๊ตฌ(์˜ˆ: JIRA) ๋ฐ CI/CD ํŒŒ์ดํ”„๋ผ์ธ๊ณผ ๊ฒฐํ•ฉ ์‹œ ์–ด๋–ค ์ž๋™ํ™” ํ˜œํƒ์„ ์ œ๊ณตํ•˜๋Š”๊ฐ€? [2, 10] +- ์žฅ๊ธฐ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜(Long-lived feature branches)๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ๊ฑฐ๋Œ€ํ•œ ๋ณ‘ํ•ฉ ์ถฉ๋Œ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ํŒ€์€ ์ผ์ผ ์ž‘์—…์—์„œ ์–ด๋–ค ๋™๊ธฐํ™” ํŒจํ„ด์„ ์Šต๊ด€ํ™”ํ•ด์•ผ ํ•˜๋Š”๊ฐ€? [18, 21] + +### Practical Application Contexts +- **Implementation:** ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ ์‹œ `feature/PROJ-123-user-auth`์ฒ˜๋Ÿผ ํ‹ฐ์ผ“ ID๋ฅผ ํฌํ•จํ•˜๋Š” ๋ช…๋ช… ๊ทœ์น™์„ ์ ์šฉํ•˜๊ณ , `feat: add login form` ๋“ฑ์˜ Conventional Commits ํ˜•์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„ ์ด๋ ฅ์„ ์ฒด๊ณ„์ ์œผ๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค [10, 11]. +- **System Design:** ์ฝ”๋“œ๋ฅผ ํ•˜๋‚˜์˜ ๋…ผ๋ฆฌ์  ๋‹จ์œ„๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ์›์ž์  ์ปค๋ฐ‹(Atomic Commits) ๊ทœ์น™์„ ๋„์ž…ํ•˜๊ณ , CI/CD ์ฒดํฌ๊ฐ€ ํ†ต๊ณผ๋˜๊ณ  1์ธ ์ด์ƒ์ด ์Šน์ธํ•ด์•ผ๋งŒ `main`์— ๋ณ‘ํ•ฉ ๊ฐ€๋Šฅํ•˜๋„๋ก ๋ธŒ๋žœ์น˜ ๋ณดํ˜ธ(Branch Protection) ์‹œ์Šคํ…œ์„ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค [14, 15]. +- **Operation / Maintenance:** `main` ๋ธŒ๋žœ์น˜๋Š” ํ•ญ์ƒ ์•ˆ์ •์ ์ด๊ณ  ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ(deployable) ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋„๋ก ์šด์˜ํ•˜๋ฉฐ, ๋ณ‘ํ•ฉ ์™„๋ฃŒ ํ›„ ์‚ฌ์šฉ์ด ๋๋‚œ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜๋ฅผ ์ž๋™ ์‚ญ์ œ ์„ค์ •ํ•˜์—ฌ ์ €์žฅ์†Œ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค [7, 15, 18]. +- **Learning Path:** ์ฒ˜์Œ์—๋Š” ๋ณต์žกํ•œ ๋ฃฐ ์—†์ด ๋‹จ์ˆœํ•œ Feature-Branch ์›Œํฌํ”Œ๋กœ์šฐ์™€ ๋ช…ํ™•ํ•œ ๋„ค์ด๋ฐ ๊ทœ์น™์„ ์ตํžˆ๊ณ , ์ˆ™๋ จ๋„๊ฐ€ ๋†’์•„์ง€๋ฉด ์ž๋™ํ™”๋œ CI ํ™˜๊ฒฝ ํ•˜์˜ Trunk-Based ๊ฐœ๋ฐœ ๋˜๋Š” ๋ณต์žกํ•œ ๋ฒ„์ „ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ Git Flow๋กœ ํ•™์Šต์„ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค [9, 19, 20]. +- **My Project Relevance:** ํ”„๋ก ํŠธ์—”๋“œ/React ๊ฐœ๋ฐœ ํ”„๋กœ์ ํŠธ ๋“ฑ์˜ ํŒ€ ๋‹จ์œ„ ํ˜‘์—… ์‹œ, ๋ถˆํ•„์š”ํ•œ ์ ˆ์ฐจ ์—†์ด ์ฝ”๋“œ ์ถฉ๋Œ์„ ์ตœ์†Œํ™”ํ•˜๊ณ  ์ถ”์  ๊ฐ€๋Šฅํ•œ ๋ณ€๊ฒฝ ๋‚ด์—ญ์„ ๋ณด์žฅํ•˜๋Š” ํ˜‘์—… ๊ธฐ์ค€์„ ๋งˆ๋ จํ•˜๋Š” ๋ฐ ์ฆ‰๊ฐ์ ์œผ๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1, 22]. + +### Adjacent Topics +- [[Continuous Integration / Continuous Deployment (CI/CD)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: PR ๋‹จ๊ณ„์—์„œ ์ž๋™ํ™”๋œ ํ…Œ์ŠคํŠธ ๋ฐ ๋ฆฐํŒ…์„ ์‹คํ–‰ํ•˜๊ณ , ๋ฉ”์ธ ๋ธŒ๋žœ์น˜ ๋ณ‘ํ•ฉ ์‹œ ๋ฐฐํฌ๋ฅผ ์ž๋™ํ™”ํ•˜์—ฌ ๋ฒ„์ „ ๊ด€๋ฆฌ ๋„๊ตฌ์™€ ์–ด๋–ป๊ฒŒ ์‹œ๋„ˆ์ง€๋ฅผ ๋‚ด๋Š”์ง€ ์กฐ์‚ฌ. [1, 19] +- [[Issue Tracking Systems]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: JIRA๋‚˜ GitHub Issues ๋“ฑ์˜ ๋„๊ตฌ๊ฐ€ Git์˜ ํ‹ฐ์ผ“ ID ๊ฑฐ๋ฒ„๋„Œ์Šค์™€ ๊ฒฐํ•ฉ๋˜์–ด ์š”๊ตฌ์‚ฌํ•ญ๋ถ€ํ„ฐ ์ฝ”๋“œ ๋ณ€๊ฒฝ๊นŒ์ง€ ์–ด๋–ป๊ฒŒ ์™„๋ฒฝํ•œ ์ถ”์ ์„ฑ(Traceability)์„ ๋ณด์žฅํ•˜๋Š”์ง€ ์กฐ์‚ฌ. [2, 23] + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Topics_Biz/system_analysis_and_improvement_plan.md b/10_Wiki/Topics_Biz/system_analysis_and_improvement_plan.md new file mode 100644 index 00000000..cf92d5ac --- /dev/null +++ b/10_Wiki/Topics_Biz/system_analysis_and_improvement_plan.md @@ -0,0 +1,27 @@ +# 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/10_Wiki/Topics_Blog/Code Splitting.md b/10_Wiki/Topics_Blog/Code Splitting.md new file mode 100644 index 00000000..96aa31b1 --- /dev/null +++ b/10_Wiki/Topics_Blog/Code Splitting.md @@ -0,0 +1,58 @@ +# [[Code Splitting]] + +## ๐Ÿ“Œ Brief Summary +ํฐ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค์„ ๋” ์ž‘์€ ์ฒญํฌ(chunk) ๋‹จ์œ„๋กœ ๋‚˜๋ˆ„์–ด ์‚ฌ์šฉ์ž๊ฐ€ ํ•„์š”๋กœ ํ•  ๋•Œ(on demand) ๋กœ๋“œํ•˜๋Š” ํ”„๋กœ์„ธ์Šค์ž…๋‹ˆ๋‹ค [1, 2]. ๋ชจ๋“  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋ฅผ ์ดˆ๊ธฐ์— ํ•œ ๋ฒˆ์— ๋‹ค์šด๋กœ๋“œํ•˜๋Š” ๋Œ€์‹ , ํ•„์š”ํ•œ ํŒŒ์ผ๋งŒ ๋จผ์ € ๋ถˆ๋Ÿฌ์˜ค๊ฒŒ ํ•˜์—ฌ ์ดˆ๊ธฐ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ๊ทน์ ์œผ๋กœ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2, 3]. ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ดˆ๊ธฐ ํŽ˜์ด์ง€ ๋กœ๋“œ ์†๋„๋ฅผ ํ–ฅ์ƒ์‹œํ‚ค๊ณ , ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ฒด๊ฐ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•˜๋Š” ํ•ต์‹ฌ์ ์ธ ํ”„๋ก ํŠธ์—”๋“œ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค [1, 4]. + +## ๐Ÿ“– Core Content +* **๋ผ์šฐํŠธ ๊ธฐ๋ฐ˜ ๋ถ„ํ•  (Route-level Code Splitting):** ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ด๊ณ  ํšจ๊ณผ์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ํŠน์ • ๋ผ์šฐํŠธ๋กœ ์ด๋™ํ•  ๋•Œ๋งŒ ํ•ด๋‹น ํŽ˜์ด์ง€์˜ ์ฝ”๋“œ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๋„๋ก ํ•˜์—ฌ ์ดˆ๊ธฐ ๋กœ๋”ฉ ์‹œ ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ ๋‹ค์šด๋กœ๋“œ๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค [1, 2, 5]. +* **์ปดํฌ๋„ŒํŠธ ์ˆ˜์ค€ ์ง€์—ฐ ๋กœ๋”ฉ (Component-level Lazy Loading):** ์ฐจํŠธ, ์ง€๋„, ๋ฆฌ์น˜ ํ…์ŠคํŠธ ์—๋””ํ„ฐ์ฒ˜๋Ÿผ ํฌ๊ณ  ๋ฌด๊ฑฐ์šด ์ปดํฌ๋„ŒํŠธ๋‚˜ ๋“œ๋ฌผ๊ฒŒ ์‚ฌ์šฉ๋˜๋Š” ๋ชจ๋‹ฌ, ์„ค์ • ํŒจ๋„ ๋“ฑ์„ ๋ Œ๋”๋ง์ด ํ•„์š”ํ•œ ์‹œ์ ์—๋งŒ ๋กœ๋“œํ•˜๋„๋ก ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค [6, 7]. React์—์„œ๋Š” `React.lazy()`์™€ ๋™์  ์ž„ํฌํŠธ(dynamic imports), ๊ทธ๋ฆฌ๊ณ  ``๋ฅผ ํ™œ์šฉํ•ด ์ด๋ฅผ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [4, 6, 8]. +* **๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ถ„ํ•  (Vendor Splitting):** Vite(๋‚ด๋ถ€์ ์œผ๋กœ Rollup ์‚ฌ์šฉ) ๋“ฑ์˜ ๋ฒˆ๋“ค๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ `manualChunks` ์˜ต์…˜์„ ํ†ตํ•ด React ์ฝ”์–ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜ ์ฐจํŠธ ๋“ฑ ๋ฌด๊ฑฐ์šด ๋ฒค๋” ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ ํŒŒ์ผ๋กœ ๋ถ„ํ• ํ•ฉ๋‹ˆ๋‹ค [5, 9, 10]. ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ž์ฃผ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ธŒ๋ผ์šฐ์ € ์บ์‹ฑ ํšจ์œจ์„ ๊ทน๋Œ€ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5, 11]. +* **๋ฒˆ๋“ค๋Ÿฌ์˜ ์ž๋™ํ™” ์ง€์›:** ์ตœ์‹  ๋ฒˆ๋“ค๋Ÿฌ(Webpack, Vite)๋Š” ์ฝ”๋“œ ๋‚ด์— ์ž‘์„ฑ๋œ ๋™์  ์ž„ํฌํŠธ(`import()`)๋ฅผ ๊ฐ์ง€ํ•˜๋ฉด ์ž๋™์œผ๋กœ ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ ์ฒญํฌ๋กœ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค [4, 6]. + +## โš–๏ธ Trade-offs & Caveats +* **ํ•„์ˆ˜ ์ปดํฌ๋„ŒํŠธ์— ๋Œ€ํ•œ ์˜ค๋‚จ์šฉ ๊ธˆ์ง€:** ํŽ˜์ด์ง€์— ์ฆ‰์‹œ ํ•„์š”ํ•œ ์Šคํฌ๋กค ์—†์ด ๋ณผ ์ˆ˜ ์žˆ๋Š”(above-the-fold) ํ•ต์‹ฌ ์ปดํฌ๋„ŒํŠธ๋‚˜, ๋ Œ๋”๋ง ์†๋„๊ฐ€ ๋นจ๋ผ์•ผ ํ•˜๋Š” ์š”์†Œ์—๋Š” ์ง€์—ฐ ๋กœ๋”ฉ๊ณผ ์ฝ”๋“œ ๋ถ„ํ• ์„ ํ”ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [7]. ์˜คํžˆ๋ ค ์ฒซ ํ™”๋ฉด์„ ๊ทธ๋ฆฌ๋Š” ์‹œ๊ฐ„์„ ์ง€์—ฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +* **์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ์ €ํ•˜ ๋ฐฉ์ง€ (Fallback UI ํ•„์š”):** ์ฝ”๋“œ๋ฅผ ๋™์ ์œผ๋กœ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋™์•ˆ ๋„คํŠธ์›Œํฌ ์ง€์—ฐ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ``๋ฅผ ์‚ฌ์šฉํ•ด ๋ชจ๋“ˆ์ด ๋กœ๋“œ๋˜๋Š” ๋™์•ˆ ์Šคํ”ผ๋„ˆ๋‚˜ ์Šค์ผˆ๋ ˆํ†ค๊ณผ ๊ฐ™์€ Fallback UI๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [5, 8]. +* **๋„คํŠธ์›Œํฌ ์š”์ฒญ ์ฆ๊ฐ€์˜ ์œ„ํ—˜:** ๋„ˆ๋ฌด ์ž˜๊ฒŒ ์ฝ”๋“œ๋ฅผ ๋ถ„ํ• ํ•˜๋ฉด ์˜คํžˆ๋ ค ์ˆ˜๋งŽ์€ ๋„คํŠธ์›Œํฌ ์š”์ฒญ์ด ๋ฐœ์ƒํ•ด ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ๋Š” `rollup-plugin-visualizer` ๋“ฑ์˜ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ด 500kB ์ด์ƒ์˜ ํฐ ์ฒญํฌ๋ฅผ ํƒ€๊ฒŸ์œผ๋กœ ์‹๋ณ„ํ•˜๊ณ  ์ ์ ˆํ•˜๊ฒŒ ๋ถ„ํ• ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [12, 13]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] +- [[Lazy Loading]] + - ์—ฐ๊ฒฐ ์ด์œ : ์ฝ”๋“œ ๋ถ„ํ• ์ด ๋ฒˆ๋“ค์„ ์ชผ๊ฐœ๋Š” ํ–‰์œ„๋ผ๋ฉด, ์ง€์—ฐ ๋กœ๋”ฉ(Lazy Loading)์€ ๊ทธ ์ชผ๊ฐœ์ง„ ์ฝ”๋“œ๋ฅผ ํ•„์š” ์‹œ์ ์— ๋กœ๋“œํ•˜๋Š” ๊ธฐ์ˆ ์  ๋ฐฉ๋ฒ•๋ก ์ž…๋‹ˆ๋‹ค [2, 3]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ถ„ํ• ๋œ ์ฝ”๋“œ๊ฐ€ ์–ธ์ œ ๋ธŒ๋ผ์šฐ์ €๋กœ ์ „์†ก๋˜๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋ณ‘ํ•ฉ๋˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [8]. +- [[Core Web Vitals]] + - ์—ฐ๊ฒฐ ์ด์œ : ์ฝ”๋“œ ๋ถ„ํ• ์„ ์ ์šฉํ•˜๋Š” ์ฃผ๋œ ์„ฑ๋Šฅ์  ๋ชฉ์ ์€ ์ดˆ๊ธฐ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰์„ ์ตœ์†Œํ™”ํ•˜์—ฌ LCP(Largest Contentful Paint)์™€ INP(Interaction to Next Paint) ๊ฐ™์€ ํ•ต์‹ฌ ์›น ์ง€ํ‘œ๋ฅผ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๋ฐ ์žˆ์Šต๋‹ˆ๋‹ค [1, 8, 14]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ตœ์ ํ™” ๊ฒฐ๊ณผ๊ฐ€ ์‹ค์ œ ์‚ฌ์šฉ์ž์˜ ์ฒด๊ฐ ์„ฑ๋Šฅ ๋ฐ ํŽ˜์ด์ง€ ์ธก์ • ์ง€ํ‘œ์— ์–ด๋–ป๊ฒŒ ๊ธ์ •์  ์˜ํ–ฅ์„ ์ฃผ๋Š”์ง€ ํ‰๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [15]. + +#### [๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ] +- [[React.lazy() and Suspense]] + - ์—ฐ๊ฒฐ ์ด์œ : React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ปดํฌ๋„ŒํŠธ ๋ ˆ๋ฒจ ๋ฐ ๋ผ์šฐํŠธ ๋ ˆ๋ฒจ์˜ ๋™์  ์ฝ”๋“œ ๋ถ„ํ• ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๊ณต์‹ API์ž…๋‹ˆ๋‹ค [6, 8]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋™์  ์ž„ํฌํŠธ ์ฒ˜๋ฆฌ ๊ณผ์ •์—์„œ์˜ ๋น„๋™๊ธฐ UI ๋ Œ๋”๋ง ํ๋ฆ„๊ณผ ์˜ˆ์™ธ(์ง€์—ฐ) ์ฒ˜๋ฆฌ ๋ฐฉ์‹์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5]. +- [[Vite (Rollup)]] + - ์—ฐ๊ฒฐ ์ด์œ : ๊ฐœ๋ฐœ ๋ฐ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฒˆ๋“ค๋งํ•˜๊ณ  ์‹ค์ œ ๋ฌผ๋ฆฌ์ ์ธ ์ฒญํฌ ํŒŒ์ผ๋“ค๋กœ ๋ถ„๋ฆฌํ•ด ๋‚ด๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค [9, 11]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ฒˆ๋“ค๋Ÿฌ์˜ `manualChunks` ์„ค์ •์„ ํ†ตํ•ด ์–ด๋–ป๊ฒŒ ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๋‚˜๋ˆ„์–ด ๋ธŒ๋ผ์šฐ์ € ์บ์‹ฑ์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5]. + +### Deeper Research Questions +- ๋ผ์šฐํŠธ ๊ธฐ๋ฐ˜ ๋ถ„ํ• ๊ณผ ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜ ๋ถ„ํ• ์„ ์–ด๋А ์ •๋„ ๋น„์œจ๋กœ ์ ์šฉํ•ด์•ผ ์ดˆ๊ธฐ ๋ Œ๋”๋ง ์„ฑ๋Šฅ๊ณผ ์ดํ›„ ํƒ์ƒ‰ ์‹œ์˜ ๋„คํŠธ์›Œํฌ ์ง€์—ฐ ๊ฐ„์˜ ๊ท ํ˜•์„ ์ด๋ฃฐ ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- Vite๋‚˜ Webpack ํ™˜๊ฒฝ์—์„œ `manualChunks`๋ฅผ ์„ค์ •ํ•  ๋•Œ, ๋ธŒ๋ผ์šฐ์ €์˜ HTTP/2 ๋ฐ HTTP/3 ๋‹ค์ค‘ํ™”(multiplexing) ํ™˜๊ฒฝ์„ ๊ณ ๋ คํ•œ ๊ฐ€์žฅ ์ด์ƒ์ ์ธ ์ฒญํฌ ๊ฐœ์ˆ˜์™€ ํฌ๊ธฐ๋Š” ๋ฌด์—‡์ธ๊ฐ€? +- ๋™์  ์ฒญํฌ(chunk)๋ฅผ ๋กœ๋“œํ•˜๋Š” ๋„์ค‘ ์‚ฌ์šฉ์ž์˜ ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ์ด ๋Š๊ธฐ๊ฑฐ๋‚˜ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ, React Error Boundaries์™€ ๊ฒฐํ•ฉํ•˜์—ฌ ์–ด๋–ป๊ฒŒ ์•ˆ์ •์ ์ธ Fallback ๊ฒฝํ—˜์„ ์„ค๊ณ„ํ•  ๊ฒƒ์ธ๊ฐ€? +- ์ฝ”๋“œ ๋ถ„ํ• ๋กœ ์ธํ•ด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ง€์—ฐ ๋กœ๋“œ๋  ๋•Œ, ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์˜์กดํ•˜๋Š” ์ƒํƒœ(Context, Zustand ๋“ฑ)๋Š” ๋กœ๋“œ ์‹œ์ ์— ์–ด๋–ป๊ฒŒ ๋™๊ธฐํ™”๋˜๋Š”๊ฐ€? +- Above-the-fold UI์— ์ž˜๋ชป ์ง€์—ฐ ๋กœ๋”ฉ์„ ์ ์šฉํ–ˆ์„ ๋•Œ LCP ์ ์ˆ˜์— ๋ฏธ์น˜๋Š” ์•…์˜ํ–ฅ์„ ํ™•์ธํ•˜๋ ค๋ฉด ๋ธŒ๋ผ์šฐ์ € ๊ฐœ๋ฐœ์ž ๋„๊ตฌ์˜ ์„ฑ๋Šฅ(Performance) ํŒจ๋„์—์„œ ์–ด๋–ค ์ง€ํ‘œ๋ฅผ ์ค‘์ ์ ์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋งํ•ด์•ผ ํ•˜๋Š”๊ฐ€? + +### Practical Application Contexts +- **Implementation:** React ์ฝ”๋“œ์—์„œ `import { Chart } from 'chart.js'`์™€ ๊ฐ™์€ ์ •์  ์ž„ํฌํŠธ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ , `const HeavyComponent = React.lazy(() => import('./HeavyComponent'))`๋กœ ๊ฐ์‹ธ์„œ ํŠน์ • ๋ฒ„ํŠผ์ด ๋ˆŒ๋ฆฌ๊ฑฐ๋‚˜ ๋ผ์šฐํŠธ๊ฐ€ ์ „ํ™˜๋  ๋•Œ ๋ Œ๋”๋ง๋˜๊ฒŒ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค [4, 6, 8]. +- **System Design:** ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ ์‹œ, ๋ชจ๋“  ์ฝ”๋“œ๊ฐ€ ํฌํ•จ๋œ ํ•˜๋‚˜์˜ `index.js` ๋ชจ๋†€๋ฆฌ์Šค ๋ฒˆ๋“ค ๋Œ€์‹ , Vite์˜ `vite.config.ts`์—์„œ `manualChunks` ์„ค์ •์„ ํ†ตํ•ด React ์ฝ”์–ด ๋ฐ ๋ฌด๊ฑฐ์šด ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ณ„๊ฐœ์˜ ์บ์‹ฑ ๊ฐ€๋Šฅํ•œ ์ฒญํฌ๋กœ ๋ถ„๋ฆฌํ•˜๋„๋ก ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค [5, 10]. +- **Operation / Maintenance:** CI/CD ํŒŒ์ดํ”„๋ผ์ธ์ด๋‚˜ ๋กœ์ปฌ ๋นŒ๋“œ ๊ณผ์ •์— `rollup-plugin-visualizer` ๋“ฑ์˜ ๋ฒˆ๋“ค ๋ถ„์„ ๋„๊ตฌ๋ฅผ ์—ฐ๊ฒฐํ•˜์—ฌ ์‹œ๊ฐ์  ํŠธ๋ฆฌ๋งต์„ ํ™•์ธํ•˜๊ณ , 500kB๋ฅผ ์ดˆ๊ณผํ•˜๋Š” ๊ฑฐ๋Œ€ ์ฒญํฌ๊ฐ€ ๋ฐœ๊ฒฌ๋˜๋ฉด ์ถ”๊ฐ€์ ์ธ ๋ถ„ํ•  ๋Œ€์ƒ์„ ์‹๋ณ„ํ•˜์—ฌ ์ตœ์ ํ™”ํ•ฉ๋‹ˆ๋‹ค [4, 12, 13]. +- **Learning Path:** ์šฐ์„  React์˜ ๋ฒˆ๋“ค๋ง ๊ฐœ๋…์„ ์ดํ•ดํ•œ ํ›„, ๋™์  ์ž„ํฌํŠธ ๊ตฌ๋ฌธ ํ™œ์šฉ -> `React.lazy()` ๋ฐ `` ์ ์šฉ -> ๋ผ์šฐํ„ฐ์— ์ฝ”๋“œ ๋ถ„ํ•  ๊ฒฐํ•ฉ -> ๋ฒˆ๋“ค ๋ถ„์„๊ธฐ ๋ฐ Core Web Vitals ์ธก์ •์„ ํ†ตํ•œ ํšจ๊ณผ ๊ฒ€์ฆ ์ˆœ์„œ๋กœ ์ง€์‹์„ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค [6, 8]. +- **My Project Relevance:** ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๊ฐ€ ์ปค์ง์— ๋”ฐ๋ผ ๋ฉ”์ธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค์ด ์ˆ˜ ๋ฉ”๊ฐ€๋ฐ”์ดํŠธ ๋‹จ์œ„๋กœ ๋ฌด๊ฑฐ์›Œ์ ธ ๋ชจ๋ฐ”์ผ ๊ธฐ๊ธฐ ๋“ฑ์—์„œ ๋กœ๋”ฉ ์†๋„ ์ €ํ•˜ ํ˜„์ƒ์ด ๋ณด์ผ ๊ฒฝ์šฐ, ์ฆ‰๊ฐ์ ์œผ๋กœ ๋ผ์šฐํŠธ ๊ธฐ๋ฐ˜ ์ฝ”๋“œ ๋ถ„ํ• ๊ณผ ์ฐจํŠธ/์—๋””ํ„ฐ ๋“ฑ ๋ฌด๊ฑฐ์šด UI์˜ ์ง€์—ฐ ๋กœ๋”ฉ์„ ๋„์ž…ํ•˜์—ฌ LCP ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3, 14, 16]. + +### Adjacent Topics +- [[Tree Shaking]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ์ฝ”๋“œ ๋ถ„ํ• ์ด ํ•„์š”ํ•œ ์ฝ”๋“œ๋ฅผ '์ชผ๊ฐœ์–ด' ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ์‹์ด๋ผ๋ฉด, ํŠธ๋ฆฌ ์‰์ดํ‚น์€ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์ฃฝ์€ ์ฝ”๋“œ(Dead Code) ์ž์ฒด๋ฅผ ๋ฒˆ๋“ค์—์„œ '์ œ๊ฑฐ'ํ•˜์—ฌ ์ดˆ๊ธฐ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ค„์ด๋Š” ์ƒํ˜ธ ๋ณด์™„์ ์ธ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค [17, 18]. +- [[Server Components (Next.js)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ์˜ ์ฝ”๋“œ ๋ถ„ํ• ์—์„œ ๋” ๋‚˜์•„๊ฐ€, ์•„์˜ˆ ์ •์ ์ธ UI ๋ Œ๋”๋ง์„ ์„œ๋ฒ„์—์„œ ์ฒ˜๋ฆฌํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ๋กœ ๋ณด๋‚ด๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค์˜ ์–‘ ์ž์ฒด๋ฅผ ํš๊ธฐ์ ์œผ๋กœ ์ค„์ด๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•˜๋Š” ์ตœ์‹  ์•„ํ‚คํ…์ฒ˜ ์ ‘๊ทผ๋ฒ•์ž…๋‹ˆ๋‹ค [19-21]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Topics_Blog/Concurrent Features.md b/10_Wiki/Topics_Blog/Concurrent Features.md new file mode 100644 index 00000000..2c5c54ed --- /dev/null +++ b/10_Wiki/Topics_Blog/Concurrent Features.md @@ -0,0 +1,56 @@ +# [[Concurrent Features]] + +## ๐Ÿ“Œ Brief Summary +Concurrent Features๋Š” React 18๋ถ€ํ„ฐ ๋„์ž…๋œ ๊ธฐ๋Šฅ์œผ๋กœ, ๋ Œ๋”๋ง ์ž‘์—…์„ ์ผ์‹œ ์ค‘์ง€(pause), ์ค‘๋‹จ(interrupt), ์žฌ๊ฐœ(resume)ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค [1]. ์ด๋ฅผ ํ†ตํ•ด ์ค‘์š”ํ•œ ์‚ฌ์šฉ์ž ์ƒํ˜ธ์ž‘์šฉ(ํด๋ฆญ, ํƒ€์ดํ•‘ ๋“ฑ)์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋†’์ด๊ณ , ์ƒ๋Œ€์ ์œผ๋กœ ๋А๋ฆฐ ์—…๋ฐ์ดํŠธ(๋Œ€์šฉ๋Ÿ‰ ํ•„ํ„ฐ๋ง ๋“ฑ)๋ฅผ ์ง€์—ฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1]. ๊ฒฐ๊ณผ์ ์œผ๋กœ ์•ฑ์˜ ์‹ค์ œ ์—ฐ์‚ฐ ์†๋„ ์ž์ฒด๋ฅผ ๋งˆ๋ฒ•์ฒ˜๋Ÿผ ๋น ๋ฅด๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ, ์ธ์ง€๋˜๋Š” ์†๋„(perceived speed)๋ฅผ ์ตœ์ ํ™”ํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ฐ˜์‘์„ฑ ์žˆ๊ฒŒ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค [2]. + +## ๐Ÿ“– Core Content +* **๋™์‹œ์„ฑ ๋ Œ๋”๋ง(Concurrent Rendering)์˜ ์›๋ฆฌ:** ์ตœ์‹  ๋ฒ„์ „์˜ React์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ, ๋ Œ๋”๋ง ์ž‘์—…์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ง€์ •ํ•˜์—ฌ ์ค‘์š”๋„๊ฐ€ ๋†’์€ ์ƒํ˜ธ์ž‘์šฉ์ด ๋ Œ๋”๋ง์— ์˜ํ•ด ์ฐจ๋‹จ(block)๋˜์ง€ ์•Š๊ณ  ์ฆ‰์‹œ ๋ฐ˜์‘ํ•˜๋„๋ก ๋•์Šต๋‹ˆ๋‹ค [1]. +* **`useTransition`์„ ํ†ตํ•œ ์šฐ์„ ์ˆœ์œ„ ์ œ์–ด:** ํŠน์ • ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋ฅผ '๊ธด๊ธ‰ํ•˜์ง€ ์•Š์€(non-urgent)' ๊ฒƒ์œผ๋กœ ํ‘œ์‹œํ•˜์—ฌ ์ง€์—ฐ์‹œํ‚ค๋Š” ํ›…(Hook)์ž…๋‹ˆ๋‹ค [3]. ์‹ค์‹œ๊ฐ„ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋‚˜ ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ ํ•„ํ„ฐ๋ง ์‹œ, ์‚ฌ์šฉ์ž์˜ ํƒ€์ดํ•‘ ๊ฐ™์€ ์ž…๋ ฅ์€ ์ฆ‰๊ฐ์ ์œผ๋กœ ๋ฐ˜์‘ํ•˜๊ฒŒ ํ•˜๋ฉด์„œ ๋ฌด๊ฑฐ์šด ๋ Œ๋”๋ง ์ฒ˜๋ฆฌ๋Š” ๋’ค๋กœ ๋ฏธ๋ฃฐ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3]. ๋˜ํ•œ `isPending` ์ƒํƒœ๋ฅผ ํ™œ์šฉํ•ด ์ž…๋ ฅ ์ฆ‰๊ฐ์„ฑ์„ ๋ง‰์ง€ ์•Š๊ณ  ๋กœ๋”ฉ ์Šคํ”ผ๋„ˆ๋‚˜ ์Šค์ผˆ๋ ˆํ†ค UI๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค [3]. +* **`useDeferredValue`๋ฅผ ํ†ตํ•œ ๊ฐ’ ์ฐธ์กฐ ์ง€์—ฐ:** `useTransition`์ด ์—…๋ฐ์ดํŠธ๋ฅผ ์–ธ์ œ ๋ฐœ์ƒ์‹œํ‚ฌ์ง€๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค๋ฉด, `useDeferredValue`๋Š” ๋ฌด๊ฑฐ์šด ๊ฐ’์„ ์–ธ์ œ '์ฝ์„์ง€'๋ฅผ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค [4]. ์ž…๋ ฅ๊ณผ ๊ฐ™์€ UI ๋ณ€๊ฒฝ์€ ์ฆ‰์‹œ ๋ฐ˜์˜ํ•˜๋ฉด์„œ, ํŒŒ์ƒ๋˜๋Š” ๋ฌด๊ฑฐ์šด ๋กœ์ง ์ ์šฉ์€ ์‚ด์ง ์ง€์—ฐ์‹œ์ผœ ์‹ค์‹œ๊ฐ„ ํผ(form) ๋“ฑ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋Š๊น€ ํ˜„์ƒ(jank)์„ ์ค„์—ฌ์ค๋‹ˆ๋‹ค [4]. +* **ํ”„๋ ˆ์ž„์›Œํฌ ์ง€์› ํ™˜๊ฒฝ:** 2025๋…„ ๊ธฐ์ค€ Next.js(App Router), Remix, Vite + React 18+ ํ™˜๊ฒฝ ๋“ฑ ๋Œ€๋ถ€๋ถ„์˜ ํ’€์Šคํƒ ๋ฐ ๋ฒˆ๋“ค๋Ÿฌ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋™์‹œ์„ฑ ๋ Œ๋”๋ง ๊ธฐ๋Šฅ์ด ํ†ตํ•ฉ๋˜์–ด ์ง€์›๋ฉ๋‹ˆ๋‹ค [2]. + +## โš–๏ธ Trade-offs & Caveats +* **์„ฑ๋Šฅ ํ–ฅ์ƒ์˜ ๋ณธ์งˆ์  ํ•œ๊ณ„:** ์ด ๊ธฐ๋Šฅ๋“ค์€ ์•ฑ์˜ ์‹ค์ œ ์—ฐ์‚ฐ ์†๋„๋ฅผ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๋†’์—ฌ์ฃผ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ "์ธ์ง€๋˜๋Š” ์†๋„(perceived speed)"๋ฅผ ์šฐ์„ ์‹œํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค [2]. ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์ด ๊ณ„์† ์ง„ํ–‰๋˜๋Š” ๋™์•ˆ UI์˜ ๋ฐ˜์‘์„ฑ์„ ์œ ์ง€ํ•  ๋ฟ, ์‹คํ–‰ํ•ด์•ผ ํ•  ์—ฐ์‚ฐ๋Ÿ‰ ์ž์ฒด๊ฐ€ ์ค„์–ด๋“œ๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค [2]. +* **์„ ๋ณ„์  ์‚ฌ์šฉ ์š”๊ตฌ:** ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ์— ์ „์—ญ์ ์œผ๋กœ ์‚ฌ์šฉํ•ด์„œ๋Š” ์•ˆ ๋˜๋ฉฐ, ์ฃผ๋กœ '์ƒํ˜ธ์ž‘์šฉ์ด ๋งŽ์€ ๋ทฐ(interactive views)'์— ์„ ๋ณ„์ ์œผ๋กœ ์ ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [4]. +* **ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ:** ๋ Œ๋”๋ง์„ ์ฐจ๋‹จํ•˜๋Š”(render-blocking) ๊ตฌ์‹ ํŒจํ„ด(๊ฐ€๋“œ๊ฐ€ ์—†๋Š” ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ ๋“ฑ)์ด๋‚˜ ์˜ค๋ž˜๋œ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์„ž์–ด์„œ ์‚ฌ์šฉํ•˜๋ฉด ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ์•ผ๊ธฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [4]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [๊ด€๊ณ„ ์œ ํ˜• A: ์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] +- [[useTransition]] + - ์—ฐ๊ฒฐ ์ด์œ : ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋ฅผ ๊ธด๊ธ‰ํ•˜์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œํ•˜์—ฌ ์ง€์—ฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” Concurrent Feature์˜ ํ•ต์‹ฌ ์š”์†Œ์ž…๋‹ˆ๋‹ค [3]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: React๊ฐ€ ๋ Œ๋”๋ง ์šฐ์„ ์ˆœ์œ„๋ฅผ ์กฐ์ •ํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ž…๋ ฅ ๋ฐ˜์‘์„ฑ์„ ์žƒ์ง€ ์•Š๊ฒŒ ์œ ์ง€ํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ๋ฉ”์ปค๋‹ˆ์ฆ˜. + +- [[useDeferredValue]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋น„์šฉ์ด ํฐ ํŒŒ์ƒ ๋ฐ์ดํ„ฐ์˜ ๋ Œ๋”๋ง ๋ฐ˜์˜ ์‹œ์ ์„ ์ง€์—ฐ์‹œ์ผœ UI ๋Š๊น€์„ ๋ง‰๋Š” ๋˜ ๋‹ค๋ฅธ ์ฃผ์š” ์š”์†Œ์ž…๋‹ˆ๋‹ค [4]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ƒํƒœ์˜ ์—…๋ฐ์ดํŠธ ์‹œ์ ์ด ์•„๋‹Œ, ๊ณ„์‚ฐ๋œ ๊ฐ’์„ ์ฝ์–ด ๋“ค์ด๋Š” ์‹œ์ ์„ ๋ถ„๋ฆฌํ•˜๋Š” ์ตœ์ ํ™” ์ „๋žต. + +#### [๊ด€๊ณ„ ์œ ํ˜• B: ๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ] +- [[Suspense]] + - ์—ฐ๊ฒฐ ์ด์œ : Concurrent Feature(ํŠนํžˆ `useTransition`)์™€ ๊ฒฐํ•ฉํ•˜์—ฌ ๋ฌด๊ฑฐ์šด ๋ Œ๋”๋ง์ด๋‚˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋กœ๋“œ๋˜๋Š” ๋™์•ˆ Fallback UI๋ฅผ ์œ ์—ฐํ•˜๊ฒŒ ํ‘œ์‹œํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค [4]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋น„๋™๊ธฐ ๋กœ๋”ฉ ์ƒํƒœ์—์„œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜(UX)์„ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ์„ค๊ณ„ํ•˜๋Š” ์„ ์–ธ์  UI ํŒจํ„ด. + +### Deeper Research Questions +- Concurrent Rendering์ด ๋™์ž‘ํ•  ๋•Œ ๋ธŒ๋ผ์šฐ์ €์˜ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ์ž‘์—…์„ ์ผ์‹œ ์ค‘์ง€ํ•˜๊ณ  ์žฌ๊ฐœ(pause, interrupt, resume)ํ•˜๋Š”๊ฐ€? +- `useTransition`๊ณผ `useDeferredValue`๋Š” ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ค ์ƒํ™ฉ์—์„œ ๊ฐ๊ฐ ์„ ํƒ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•˜๋ฉฐ, ๋‘ ๊ฐ€์ง€๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์ œ์•ฝ ์‚ฌํ•ญ์€ ์—†๋Š”๊ฐ€? +- ๊ตฌ์‹ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(outdated state libraries)๊ฐ€ Concurrent Features์™€ ์„ž์˜€์„ ๋•Œ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜๋Š” ๊ธฐ์ˆ ์  ์›๋ฆฌ๋Š” ๋ฌด์—‡์ธ๊ฐ€? +- ์ธ์ง€๋˜๋Š” ์†๋„(perceived speed)๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด Concurrent ๊ธฐ๋Šฅ์„ ๊ณผ๋„ํ•˜๊ฒŒ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๋‚˜ ์Šค์ผ€์ค„๋ง ์˜ค๋ฒ„ํ—ค๋“œ๋Š” ์–ด๋А ์ •๋„์ธ๊ฐ€? +- Next.js๋‚˜ Remix ๊ฐ™์€ ์ตœ์‹  ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ Concurrent Features๋ฅผ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•˜์—ฌ ์ŠคํŠธ๋ฆฌ๋ฐ(streaming) ์—…๋ฐ์ดํŠธ์™€ ๊ฐ™์€ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์ด๋Œ์–ด๋‚ด๋Š”๊ฐ€? + +### Practical Application Contexts +- **Implementation:** ์‹ค์‹œ๊ฐ„ ๊ฒ€์ƒ‰์ฐฝ, ํƒ€์ž…์–ดํ—ค๋“œ(Typeahead) ์ž…๋ ฅ๊ธฐ, ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ๊ทธ๋ฆฌ๋“œ ํ•„ํ„ฐ๋ง ๋“ฑ ์‚ฌ์šฉ์ž ์ž…๋ ฅ์ด ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค ๋ฌด๊ฑฐ์šด UI๋ฅผ ๋‹ค์‹œ ๊ทธ๋ ค์•ผ ํ•˜๋Š” ๊ณณ์— ๊ตฌํ˜„ํ•˜์—ฌ ์ž…๋ ฅ์ด ๋ฒ„๋ฒ…์ด์ง€ ์•Š๋„๋ก ๋งŒ๋“ญ๋‹ˆ๋‹ค [3, 4]. +- **System Design:** ์‚ฌ์šฉ์ž์˜ ์ฆ‰๊ฐ์ ์ธ ํ”ผ๋“œ๋ฐฑ์ด ํ•„์š”ํ•œ ๋ทฐ์™€, ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์ง€์—ฐ ๋ Œ๋”๋ง๋˜์–ด๋„ ๋ฌด๋ฐฉํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ์‹œ์Šคํ…œ ๊ตฌ์กฐ ๋ฐ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ธฐํšํ•ฉ๋‹ˆ๋‹ค [4]. +- **Operation / Maintenance:** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋กœํŒŒ์ผ๋ง ์ค‘ ์ž…๋ ฅ ์ง€์—ฐ(Input Lag)์ด ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ณด๊ณ ๋˜๋Š” ๋ถ€๋ถ„์„ ์ฐพ์•„๋‚ด๊ณ , ํ•ด๋‹น ๋ถ€๋ถ„์— ๋ Œ๋”๋ง ์ฐจ๋‹จ ํŒจํ„ด์ด ์—†๋Š”์ง€ ์ ๊ฒ€ํ•˜์—ฌ Concurrent ๊ธฐ๋Šฅ์„ ์ ์ง„์ ์œผ๋กœ ๋„์ž…ํ•ฉ๋‹ˆ๋‹ค [4, 5]. +- **Learning Path:** ๋‹จ์ˆœํ•œ React Hook(`useState`, `useEffect`)์˜ ๋ Œ๋”๋ง ๊ณผ์ •์„ ์ดํ•ดํ•œ ํ›„, ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ์ตœ์ ํ™”(`React.memo`, `useCallback`)๋ฅผ ๋ฐฐ์šฐ๊ณ , ์ตœ์ข…์ ์œผ๋กœ ๋ Œ๋”๋ง์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ œ์–ดํ•˜๋Š” ๊ณ ๊ธ‰ ์ตœ์ ํ™” ๊ณผ์ •์œผ๋กœ Concurrent ๊ธฐ๋Šฅ์„ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค. +- **My Project Relevance:** ๊ฒ€์ƒ‰ ํ•„ํ„ฐ๊ฐ€ ๋งŽ์€ ๋Œ€์‹œ๋ณด๋“œ๋‚˜ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์‹œ๊ฐํ™” ์ฐจํŠธ๋ฅผ ๊ตฌ์ถ•ํ•  ๋•Œ UI ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฉˆ์ถ”๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜์—ฌ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ํฌ๊ฒŒ ๊ฐœ์„ ํ•˜๋Š” ๋ฐ ์ง์ ‘์ ์œผ๋กœ ์ ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### Adjacent Topics +- [[Server Components]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ํด๋ผ์ด์–ธํŠธ์—์„œ ๋ Œ๋”๋ง์„ ์ง€์—ฐ์‹œํ‚ค๊ฑฐ๋‚˜ ์ตœ์ ํ™”ํ•˜๋Š” ๊ฒƒ์„ ๋„˜์–ด, ๋ฌด๊ฑฐ์šด ๋ Œ๋”๋ง ์ž‘์—… ์ž์ฒด๋ฅผ ์„œ๋ฒ„๋กœ ์™„์ „ํžˆ ์˜ฎ๊ฒจ ํด๋ผ์ด์–ธํŠธ์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค ํฌ๊ธฐ์™€ ์‹คํ–‰ ๋ถ€๋‹ด์„ ๊ทผ๋ณธ์ ์œผ๋กœ ์ค„์ด๋Š” ๋ฐฉ๋ฒ•๋ก  ํƒ๊ตฌ [6, 7]. +- [[Code Splitting & Lazy Loading]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ํ™”๋ฉด์˜ ๋ Œ๋”๋ง ๊ณผ์ •์„ ๋งค๋„๋Ÿฝ๊ฒŒ ํ•˜๋Š” ๊ฒƒ์„ ๋„˜์–ด, ์ดˆ๊ธฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ๋”ฉ ์‹œ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ๋‹ค์šด๋กœ๋“œํ•˜๋Š” ์ฝ”๋“œ์˜ ์–‘ ์ž์ฒด๋ฅผ ๋ถ„ํ• ํ•˜์—ฌ ์ดˆ๊ธฐ ์‘๋‹ต์„ฑ(Time to Interactive)์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ์ „๋žต ํƒ๊ตฌ [8, 9]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Topics_Blog/Concurrent Rendering in React 18+.md b/10_Wiki/Topics_Blog/Concurrent Rendering in React 18+.md new file mode 100644 index 00000000..b20eeb11 --- /dev/null +++ b/10_Wiki/Topics_Blog/Concurrent Rendering in React 18+.md @@ -0,0 +1,62 @@ +# [[Concurrent Rendering in React 18+]] + +## ๐Ÿ“Œ Brief Summary +React 18+์˜ ๋™์‹œ์„ฑ ๋ Œ๋”๋ง(Concurrent Rendering)์€ React๊ฐ€ ๋ Œ๋”๋ง ์ž‘์—…์„ ์ผ์‹œ ์ค‘์ง€, ์ค‘๋‹จ ๋ฐ ์žฌ๊ฐœํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค [1]. ์ด๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๋Š” ์—…๋ฐ์ดํŠธ ๋ฐœ์ƒ ์‹œ๊ธฐ์™€ ๋ฐฉ์‹์„ ์„ธ๋ฐ€ํ•˜๊ฒŒ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์‚ฌ์šฉ์ž์˜ ์ƒํ˜ธ์ž‘์šฉ์„ฑ์„ ์ €ํ•˜์‹œํ‚ค์ง€ ์•Š์œผ๋ฉด์„œ๋„ ํ™”๋ฉด์ด ๋ฉˆ์ถ”์ง€ ์•Š๋Š” ๋” ๋ถ€๋“œ๋Ÿฝ๊ณ  ๋ฐ˜์‘์„ฑ ๋†’์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1, 2]. + +## ๐Ÿ“– Core Content + +**๋™์‹œ์„ฑ ๋ Œ๋”๋ง์˜ ๊ฐœ๋…๊ณผ ์ด์ ** +* React 18๋ถ€ํ„ฐ ๋„์ž…๋œ ๋™์‹œ์„ฑ ๊ธฐ๋Šฅ์€ ๋ Œ๋”๋ง ์ž‘์—…์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋™์ ์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. ๋ Œ๋”๋ง ์ž‘์—…์„ ์ฐจ๋‹จํ•˜์ง€ ์•Š๊ณ , ๋А๋ฆฐ ๋ฐ์ดํ„ฐ ํ•„ํ„ฐ๋ง ์—…๋ฐ์ดํŠธ ๋“ฑ์„ ์ง€์—ฐ์‹œํ‚ค๋Š” ๋™์‹œ์— ํด๋ฆญ์ด๋‚˜ ํƒ€์ดํ•‘๊ณผ ๊ฐ™์€ ์ค‘์š”ํ•œ ์‚ฌ์šฉ์ž ์ƒํ˜ธ์ž‘์šฉ์— ์ฆ‰๊ฐ์ ์œผ๋กœ ๋ฐ˜์‘ํ•˜๋„๋ก ๋ Œ๋”๋ง์„ ์ผ์‹œ ์ค‘์ง€ํ•˜๊ฑฐ๋‚˜ ์žฌ๊ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1]. ์ด๋Š” ์ตœ์‹  React ๋ฒ„์ „์˜ ๊ธฐ๋ณธ ๋™์ž‘์œผ๋กœ ๋‚ด์žฅ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค [1]. + +**์ฃผ์š” ๋™์‹œ์„ฑ ํ›…(Hooks)** +* **`useTransition`:** ํŠน์ • ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋ฅผ '๊ธด๊ธ‰ํ•˜์ง€ ์•Š์€(non-urgent)' ๊ฒƒ์œผ๋กœ ํ‘œ์‹œํ•˜์—ฌ ์ง€์—ฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ํ›…์ž…๋‹ˆ๋‹ค [3]. ์‹ค์‹œ๊ฐ„ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ํ‘œ์‹œ, ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ ์„ธํŠธ ํ•„ํ„ฐ๋ง, ๋ณต์žกํ•œ ์ฐจํŠธ ๋ฐ ํ…Œ์ด๋ธ” ๋ Œ๋”๋ง๊ณผ ๊ฐ™์€ ๋ฌด๊ฑฐ์šด ์ž‘์—…์ด ์‚ฌ์šฉ์ž์˜ ์ฆ‰๊ฐ์ ์ธ ์ƒํ˜ธ์ž‘์šฉ์„ ์ฐจ๋‹จํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค [3]. ์ œ๊ณต๋˜๋Š” `isPending` ์ƒํƒœ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋ฅผ ์ฐจ๋‹จํ•˜์ง€ ์•Š๊ณ  ๋กœ๋”ฉ ์Šคํ”ผ๋„ˆ๋‚˜ ์Šค์ผˆ๋ ˆํ†ค UI๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3]. +* **`useDeferredValue`:** `useTransition`์ด ์—…๋ฐ์ดํŠธ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š” ์‹œ์ ์„ ์ œ์–ดํ•œ๋‹ค๋ฉด, `useDeferredValue`๋Š” ๋น„์šฉ์ด ๋งŽ์ด ๋“œ๋Š” ๊ฐ’์„ *์ฝ๊ณ  ์ ์šฉํ•˜๋Š” ์‹œ์ *์„ ์ง€์—ฐ์‹œํ‚ต๋‹ˆ๋‹ค [4]. ๊ฒ€์ƒ‰์ฐฝ์˜ ์ž…๋ ฅ ๊ฐ’ ๋“ฑ UI ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ์ฆ‰์‹œ ๋ฐ˜์˜ํ•˜๋ฉด์„œ, ํŒŒ์ƒ๋˜๋Š” ๋ฌด๊ฑฐ์šด ๊ณ„์‚ฐ ๋กœ์ง์€ ์•ฝ๊ฐ„ ์ง€์—ฐ์‹œ์ผœ ์‹ค์‹œ๊ฐ„ ํผ์ด๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค์—์„œ์˜ ํ™”๋ฉด ๋Š๊น€(Jank) ํ˜„์ƒ์„ ์ค„์—ฌ์ค๋‹ˆ๋‹ค [4]. + +**์‚ฌ์šฉ ๋ชจ๋ฒ” ์‚ฌ๋ก€ ๋ฐ ํ”„๋ ˆ์ž„์›Œํฌ ์ง€์›** +* ๋™์‹œ์„ฑ ๊ธฐ๋Šฅ์€ ์•ฑ์˜ ๋ชจ๋“  ๊ณณ์ด ์•„๋‹Œ '์ƒํ˜ธ์ž‘์šฉ์ด ์ง‘์ค‘๋œ ๋ทฐ'์— ์ „๋žต์ ์œผ๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [4]. ๋ฐ์ดํ„ฐ๊ฐ€ ๋กœ๋“œ๋˜๋Š” ๋™์•ˆ ๋Œ€์ฒด UI๋ฅผ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด `Suspense`์™€ ๊ฒฐํ•ฉํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค [4]. +* ์ฃผ์˜ํ•  ์ ์€ ๊ตฌ์‹ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜ ๋ Œ๋”๋ง์„ ์ฐจ๋‹จํ•˜๋Š” ํŒจํ„ด(์˜ˆ: ๊ฐ€๋“œ ๋กœ์ง์ด ์—†๋Š” ์˜ค๋ž˜๋œ ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ)๊ณผ ํ˜ผ์šฉํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค [4]. +* ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ๋“ค์€ ์—ฐ์‚ฐ ์†๋„ ์ž์ฒด๋ฅผ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๋†’์ด๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์ž‘์—…์ด ๊ณ„์†๋˜๋Š” ๋™์•ˆ UI๊ฐ€ ๋ฐ˜์‘ํ•˜๋„๋ก ์œ ์ง€ํ•จ์œผ๋กœ์จ '์ฒด๊ฐ ์†๋„(perceived speed)'๋ฅผ ์šฐ์„ ์‹œํ•˜๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค [4]. +* 2025๋…„ ๊ธฐ์ค€ Next.js(App Router), Remix, Vite + React 18 ๋“ฑ ๋Œ€๋ถ€๋ถ„์˜ ์ตœ์‹  ํ’€์Šคํƒ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด ๋™์‹œ์„ฑ ๋ Œ๋”๋ง์„ ์™„์ „ํžˆ ํ†ตํ•ฉํ•˜์—ฌ ์ง€์›ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค [5]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +- [[useTransition]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋™์‹œ์„ฑ ๋ Œ๋”๋ง ํ™˜๊ฒฝ์—์„œ ํŠน์ • ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋ฅผ '๊ธด๊ธ‰ํ•˜์ง€ ์•Š์€ ์ž‘์—…'์œผ๋กœ ๋ช…์‹œ์ ์œผ๋กœ ๋ถ„๋ฅ˜ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ํ•ต์‹ฌ ํ›…์ž…๋‹ˆ๋‹ค [3]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ƒํƒœ ์—…๋ฐ์ดํŠธ์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋‚ฎ์ถ”์–ด ์‚ฌ์šฉ์ž ์ž…๋ ฅ์— ๋Œ€ํ•œ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ ์ฐจ๋‹จ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ์ œ์–ด ๋ฐฉ๋ฒ•. + +- [[useDeferredValue]] + - ์—ฐ๊ฒฐ ์ด์œ : ์—ฐ์‚ฐ ๋น„์šฉ์ด ๋†’์€ ๊ฐ’์˜ ํ™”๋ฉด ์ ์šฉ ์‹œ์ ์„ ๋Šฆ์ถ”์–ด UI์˜ ์ฆ‰๊ฐ์ ์ธ ์ฒด๊ฐ ๋ฐ˜์‘์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๋™์‹œ์„ฑ ๊ธฐ๋Šฅ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [4]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์‚ฌ์šฉ์ž ์ž…๋ ฅ(ํƒ€์ดํ•‘ ๋“ฑ)์˜ ์ฆ‰๊ฐ์ ์ธ ๋ฐ˜์˜๊ณผ ๋ฌด๊ฑฐ์šด ํŒŒ์ƒ ๋ฐ์ดํ„ฐ ๋ Œ๋”๋ง ๊ฐ„์˜ ์ฒ˜๋ฆฌ ์‹œ์ ์„ ๋ถ„๋ฆฌํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜. + +- [[Suspense]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋™์‹œ์„ฑ ํ›…(`useTransition` ๋“ฑ)๊ณผ ๊ฒฐํ•ฉํ•˜์—ฌ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋‚˜ ์ง€์—ฐ๋œ ๋ Œ๋”๋ง์ด ์™„๋ฃŒ๋˜๊ธฐ ์ „๊นŒ์ง€ ์ž์—ฐ์Šค๋Ÿฌ์šด ๋Œ€์ฒด UI(Fallback UI)๋ฅผ ํ‘œ์‹œํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค [4]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ ๊ณผ์ •์—์„œ ๋™์‹œ์„ฑ ๋ Œ๋”๋ง์„ ํ™œ์šฉํ•œ ๋ถ€๋“œ๋Ÿฌ์šด ์‚ฌ์šฉ์ž ๊ฒฝํ—˜(UX) ์„ค๊ณ„ ๋ฐฉ์‹. + +### Deeper Research Questions + +- React์˜ ๋™์‹œ์„ฑ ๋ Œ๋”๋ง ์—”์ง„์€ ๋‚ด๋ถ€์ ์œผ๋กœ ๊ธด๊ธ‰ ์—…๋ฐ์ดํŠธ์™€ ์ง€์—ฐ ์—…๋ฐ์ดํŠธ์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์–ด๋–ค ์Šค์ผ€์ค„๋ง ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š”๊ฐ€? +- `useTransition`๊ณผ `useDeferredValue`๋ฅผ ๋ณต์žกํ•œ ๋‹จ์ผ ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ Œ๋”๋ง ์—ฃ์ง€ ์ผ€์ด์Šค๋‚˜ ์„ฑ๋Šฅ์  ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๋Š” ๋ฌด์—‡์ธ๊ฐ€? +- ๊ตฌ์‹ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(Context API๋ฅผ ์ž˜๋ชป ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋“ฑ)๊ฐ€ React 18์˜ ๋™์‹œ์„ฑ ๋ Œ๋”๋ง ํŒจํ„ด์„ ๋ฐฉํ•ดํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์ •ํ™•ํ•œ ๊ธฐ์ˆ ์  ์›๋ฆฌ(์˜ˆ: Tearing ํ˜„์ƒ)๋Š” ๋ฌด์—‡์ธ๊ฐ€? +- ๋™์‹œ์„ฑ ๋ Œ๋”๋ง์˜ ๋„์ž…์ด ๋ธŒ๋ผ์šฐ์ €์˜ INP(Interaction to Next Paint)์™€ TBT(Total Blocking Time) ์ง€ํ‘œ ์ตœ์ ํ™”์— ์ˆ˜ํ•™์ ์œผ๋กœ ์–ด๋–ค ์—ฐ๊ด€์„ฑ์„ ๊ฐ€์ง€๋Š”๊ฐ€? +- ๋™์‹œ์„ฑ ๋ Œ๋”๋ง์œผ๋กœ ์ธํ•ด ๋ Œ๋”๋ง ํŠธ๋ฆฌ๊ฐ€ ์ค‘๋‹จ(Interrupt)๋˜๊ณ  ํ๊ธฐ๋œ ํ›„ ๋‹ค์‹œ ์‹œ์ž‘๋  ๋•Œ, ๋ถˆํ•„์š”ํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ React์˜ ๋‚ด๋ถ€ ์ตœ์ ํ™” ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ๋ฌด์—‡์ธ๊ฐ€? + +### Practical Application Contexts + +- **Implementation:** ๋ผ์ด๋ธŒ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์ฐฝ, ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ ์„ธํŠธ ํ•„ํ„ฐ๋ง ๊ธฐ๋Šฅ ๊ตฌํ˜„ ์‹œ `useTransition`๊ณผ `useDeferredValue`๋ฅผ ์ ๊ทน ํ™œ์šฉํ•˜์—ฌ ์ž…๋ ฅ ์ค‘ ๋ฐœ์ƒํ•˜๋Š” ํ™”๋ฉด ๋ฉˆ์ถค(Jank) ๋ฐฉ์ง€ [3, 4]. +- **System Design:** ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ ์‹œ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋™์‹œ์„ฑ ๋ Œ๋”๋ง์ด ํ™œ์„ฑํ™”๋œ Next.js App Router๋‚˜ Remix์™€ ๊ฐ™์€ ์ตœ์‹  React ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋„์ž…ํ•˜์—ฌ ๋ฐ˜์‘์„ฑ ์ด์ ์„ ๊ทน๋Œ€ํ™” [5]. +- **Operation / Maintenance:** ๊ธฐ์กด ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ๋ Œ๋”๋ง์„ ์ฐจ๋‹จํ•˜๋Š” ์š”์†Œ(์˜ค๋ž˜๋œ ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ ๋“ฑ)๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•˜๊ณ , ๋™์‹œ์„ฑ ๊ธฐ๋Šฅ์ด ์ถฉ๋Œ ์—†์ด ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋„๋ก ์œ ์ง€๋ณด์ˆ˜ ํ™˜๊ฒฝ ๊ฐœ์„  [4]. +- **Learning Path:** ์ „ํ†ต์ ์ธ '๋™๊ธฐ์  ๋ Œ๋”๋ง(Synchronous Rendering)' ๋ชจ๋ธ์ด ๊ฐ€์ง„ ํ•œ๊ณ„๋ฅผ ๋ฒ—์–ด๋‚˜, ์ž‘์—… ๋‹จ์œ„์˜ ์ผ์‹œ ์ค‘์ง€์™€ ์žฌ๊ฐœ๊ฐ€ ๊ฐ€๋Šฅํ•œ ๋ Œ๋”๋ง ํŒจ๋Ÿฌ๋‹ค์ž„์œผ๋กœ ๊ฐœ๋ฐœ์ž์˜ ์‚ฌ๊ณ  ๋ฐฉ์‹์„ ์ „ํ™˜. +- **My Project Relevance:** ํ˜„์žฌ ์ง„ํ–‰ ์ค‘์ธ ์„œ๋น„์Šค ๋‚ด ๋ฌด๊ฑฐ์šด ๋Œ€์‹œ๋ณด๋“œ ํ™”๋ฉด์ด๋‚˜ ๋ณต์žกํ•œ ๊ฒ€์ƒ‰ ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ์ฒด๊ฐํ•˜๋Š” '์ธ์‹ ์†๋„(Perceived Speed)'๋ฅผ ์ตœ์ ํ™”ํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜ ๊ฐœ์„  ์ง€ํ‘œ๋กœ ํ™œ์šฉ [3, 4]. + +### Adjacent Topics + +- [[React Server Components]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋™์‹œ์„ฑ ๋ Œ๋”๋ง๊ณผ ํ•จ๊ป˜ Next.js App Router ํ™˜๊ฒฝ์˜ ํ•ต์‹ฌ ์„ฑ๋Šฅ ์ตœ์ ํ™” ์ถ•์„ ์ด๋ฃจ๋ฉฐ, ํด๋ผ์ด์–ธํŠธ ์ธก ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค์„ ํš๊ธฐ์ ์œผ๋กœ ์ค„์—ฌ์ฃผ๋Š” ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์˜ ๋ Œ๋”๋ง ์›๋ฆฌ ํƒ๊ตฌ [5, 6]. + +- [[Core Web Vitals (INP/TBT)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋™์‹œ์„ฑ ๋ Œ๋”๋ง ๊ธฐ๋Šฅ ์ ์šฉ์ด ์›น์˜ ํ•ต์‹ฌ ๋ฐ˜์‘์„ฑ ์ง€ํ‘œ์ธ INP ๋ฐ TBT๋ฅผ ์–ด๋–ป๊ฒŒ ๊ฐœ์„ ํ•˜๋Š”์ง€ ์‹ค์ œ ์„ฑ๋Šฅ ์ธก์ • ํˆด(Chrome DevTools, Lighthouse) ๋ฐ์ดํ„ฐ์™€ ์—ฐ๊ณ„ํ•˜์—ฌ ์กฐ์‚ฌ [7-9]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Topics_Blog/Context API.md b/10_Wiki/Topics_Blog/Context API.md new file mode 100644 index 00000000..b0dfba57 --- /dev/null +++ b/10_Wiki/Topics_Blog/Context API.md @@ -0,0 +1,46 @@ +# [[Context API]] + +## ๐Ÿ“Œ Brief Summary +Context API๋Š” React์— ๋‚ด์žฅ๋œ ์ƒํƒœ ๊ณต์œ  ์†”๋ฃจ์…˜์œผ๋กœ, ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ์˜ ๋ชจ๋“  ๋ ˆ๋ฒจ์„ ํ†ตํ•ด ๋ช…์‹œ์ ์œผ๋กœ props๋ฅผ ์ „๋‹ฌํ•˜์ง€ ์•Š๊ณ ๋„ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค [1, 2]. ์ด๋Š” ๋…๋ฆฝ์ ์ธ ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ๋ผ๊ธฐ๋ณด๋‹ค๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ์ „์†ก ๋ฉ”์ปค๋‹ˆ์ฆ˜์— ๊ฐ€๊น์Šต๋‹ˆ๋‹ค [3, 4]. ์ฃผ๋กœ ํ…Œ๋งˆ, ๋‹ค๊ตญ์–ด ์„ค์ • ๋“ฑ ๋ณ€๊ฒฝ์ด ๊ฑฐ์˜ ์—†๋Š” ์ •์ ์ธ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์—ญ์ ์œผ๋กœ ๊ณต์œ ํ•  ๋•Œ ์ ํ•ฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค [5, 6]. + +## ๐Ÿ“– Core Content +* **์ž‘๋™ ๋ฐฉ์‹ ๋ฐ ๊ตฌ์กฐ:** Context API๋Š” `React.createContext()`๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ƒ์„ฑ๋˜๋ฉฐ, ์ƒํƒœ ๊ฐ’์„ ์ œ๊ณตํ•˜๋Š” `Provider`์™€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š” `Consumer`(์‹ค๋ฌด์—์„œ๋Š” ์ฃผ๋กœ `useContext` ํ›…)๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค [4]. Provider๋Š” ๊ฐ’์„ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธํ•˜๊ณ , ํŠธ๋ฆฌ์˜ ์–ด๋А ๊นŠ์ด์— ์žˆ๋“  `useContext`๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ํ•ด๋‹น ๊ฐ’์„ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [4]. ๋‹จ, ์ƒํƒœ ์ž์ฒด๋ฅผ ๊ด€๋ฆฌํ•˜๋ ค๋ฉด `useState`๋‚˜ `useReducer`์™€ ๊ฐ™์€ ํ›…๊ณผ ๋ฐ˜๋“œ์‹œ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [4, 7]. +* **์„ฑ๋Šฅ์  ํ•œ๊ณ„์™€ ๋ฆฌ๋ Œ๋”๋ง ํญํฌ:** Context์˜ ๊ฐ€์žฅ ํฐ ๋‹จ์ ์€ ์„ฑ๋Šฅ ๊ด€๋ฆฌ์ž…๋‹ˆ๋‹ค [8]. Context๋กœ ์ „๋‹ฌ๋˜๋Š” ๊ฐ’ ์ค‘ ์ผ๋ถ€๋งŒ ๋ณ€๊ฒฝ๋˜๋”๋ผ๋„, ํ•ด๋‹น Context๋ฅผ ๊ตฌ๋…ํ•˜๋Š” **๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง**๋ฉ๋‹ˆ๋‹ค [8, 9]. React๋Š” ํŠน์ • ๋ฐ์ดํ„ฐ ๋ถ€๋ถ„๋งŒ ์‚ฌ์šฉํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ตฌ๋ณ„ํ•ด ๋‚ด์ง€ ๋ชปํ•˜๋ฏ€๋กœ, ์ƒํƒœ ๋ณ€๊ฒฝ์ด ์žฆ์€ ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ์ „์ฒด ๋Œ€์‹œ๋ณด๋“œ๊ฐ€ ์ˆ˜ ์ดˆ๊ฐ„ ๋ฉˆ์ถ”๋Š” ๋“ฑ ์‹ฌ๊ฐํ•œ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ์„ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1, 10]. +* **๊ตฌ์กฐ์  ์ตœ์ ํ™” ์ „๋žต:** ์ด๋Ÿฌํ•œ ๋ฆฌ๋ Œ๋”๋ง ๋ฌธ์ œ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ชจ๋“  ์ƒํƒœ๋ฅผ ํ•˜๋‚˜์˜ 'Global Context'์— ๋‹ด๋Š” ์•ˆํ‹ฐ ํŒจํ„ด์„ ํ”ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [11, 12]. ๋Œ€์‹  `ThemeContext`, `NotificationContext`์ฒ˜๋Ÿผ ์ƒํƒœ๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž‘์€ ๋„๋ฉ”์ธ๋ณ„ Context๋กœ ๋ถ„๋ฆฌํ•˜๊ณ , ์ปค์Šคํ…€ ํ›…๊ณผ Selector ํŒจํ„ด์„ ํ™œ์šฉํ•ด ํ•„์š”ํ•œ ๊ฐ’๋งŒ ์Šค์ฝ”ํ”„๋ฅผ ์ขํ˜€ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค [12, 13]. +* **์‚ฌ์šฉ์˜ ์ ํ•ฉ์„ฑ:** ํ…Œ๋งˆ(๋ผ์ดํŠธ/๋‹คํฌ ๋ชจ๋“œ), ์–ธ์–ด ํ™˜๊ฒฝ ์„ค์ •, ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ ๋“ฑ **๋ณ€๊ฒฝ ๋นˆ๋„๊ฐ€ ๋งค์šฐ ๋‚ฎ๊ณ  ์ •์ ์ธ ๋ฐ์ดํ„ฐ**๋ฅผ ๊ณต์œ ํ•˜๊ฑฐ๋‚˜ ์™ธ๋ถ€ ์ข…์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์€ ์ž‘์€ ํ”„๋กœ์ ํŠธ ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฐœ๋ฐœ์— ์™„๋ฒฝํ•œ ์„ ํƒ์ž…๋‹ˆ๋‹ค [5, 6, 14]. ๋ฐ˜๋ฉด, ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ, ์ž์ฃผ ์—…๋ฐ์ดํŠธ๋˜๋Š” ์žฅ๋ฐ”๊ตฌ๋‹ˆ, ๋ณต์žกํ•œ ๋น„๋™๊ธฐ ์ž‘์—…์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋Š” Context๋ฅผ ํ”ผํ•˜๊ณ  Zustand๋‚˜ Redux๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค [15-18]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts +- [[Prop Drilling]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ ๊นŠ๊ฒŒ ์ค‘์ฒฉ๋œ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด ๋ถˆํ•„์š”ํ•œ ์ค‘๊ฐ„ ์ปดํฌ๋„ŒํŠธ๋“ค์„ ๊ฑฐ์ณ์•ผ ํ•˜๋Š” ํŒจํ„ด์ž…๋‹ˆ๋‹ค [2]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Context API๊ฐ€ ํƒ„์ƒํ•˜๊ฒŒ ๋œ ๊ทผ๋ณธ์ ์ธ ๋ฐฐ๊ฒฝ๊ณผ, ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ํŠธ๋ฆฌ ์•„๋ž˜๋กœ "๊ฑด๋„ˆ๋›ฐ์–ด" ์ „๋‹ฌํ•˜๋Š”์ง€ ๊ทธ ๋ชฉ์ ์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2, 19]. +- [[useContext]] + - ์—ฐ๊ฒฐ ์ด์œ : Context API์˜ Provider๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ๊ฐ’์„ ์ฝ๊ธฐ ์œ„ํ•ด ๊ฐœ๋ณ„ ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ ํ˜ธ์ถœํ•˜๋Š” React์˜ ๋‚ด์žฅ ํ›…์ž…๋‹ˆ๋‹ค [4]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ตฌ๋…(Subscription)์ด ๋ฐœ์ƒํ•˜๋Š” ์ •ํ™•ํ•œ ์ง€์ ๊ณผ, ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ ์–ด๋–ค ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฆฌ๋ Œ๋”๋ง์ด ํŠธ๋ฆฌ๊ฑฐ๋˜๋Š”์ง€ ๋ Œ๋”๋ง ๋™์ž‘ ์›๋ฆฌ๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [8]. +- [[Zustand]] + - ์—ฐ๊ฒฐ ์ด์œ : Context API์˜ ๋ฆฌ๋ Œ๋”๋ง ํ•œ๊ณ„์™€ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ๋ฅผ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด ์ž์ฃผ ๋น„๊ต๋˜๊ณ  ์ฑ„ํƒ๋˜๋Š” ๊ฒฝ๋Ÿ‰ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค [20, 21]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Zustand์˜ 'Selector ํŒจํ„ด'์ด ์–ด๋–ป๊ฒŒ ํŠน์ • ์ƒํƒœ ์Šฌ๋ผ์ด์Šค๋งŒ ๊ตฌ๋…ํ•˜๊ฒŒ ํ•˜์—ฌ Context API์˜ "์ „์ฒด ๋ฆฌ๋ Œ๋”๋ง" ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š”์ง€ ์„ฑ๋Šฅ ์ตœ์ ํ™”์˜ ์ฐจ์ด๋ฅผ ๋น„๊ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [8, 10]. + +### Deeper Research Questions +- Context API์™€ ์™ธ๋ถ€ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(Zustand, Redux)๋ฅผ ๋™์ผํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์—์„œ ํšจ์œจ์ ์œผ๋กœ ํ˜ผ์šฉ(Hybrid)ํ•˜๊ธฐ ์œ„ํ•ด, ์ •์  ์ƒํƒœ์™€ ๋™์  ์ƒํƒœ๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ์ตœ์ ์˜ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ ๊ธฐ์ค€์€ ๋ฌด์—‡์ธ๊ฐ€? +- Context API์˜ "๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ" ํŠน์„ฑ์œผ๋กœ ์ธํ•œ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋„๋ฉ”์ธ๋ณ„๋กœ Context๋ฅผ ์ชผ๊ฐค ๋•Œ, ์ฝ”๋“œ์˜ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ์žƒ์ง€ ์•Š์œผ๋ฉด์„œ๋„ ์„ฑ๋Šฅ์„ ์žก์„ ์ˆ˜ ์žˆ๋Š” ์ ์ ˆํ•œ ๋ถ„๋ฆฌ ์ž…๋„(Granularity)๋Š” ์–ด๋А ์ •๋„์ธ๊ฐ€? +- `use-context-selector`์™€ ๊ฐ™์€ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Context API์˜ ๋ฆฌ๋ Œ๋”๋ง ๋ฌธ์ œ๋ฅผ ์šฐํšŒํ•˜๋Š” ๋ฐฉ์‹์€, ์ฒ˜์Œ๋ถ€ํ„ฐ Zustand๋‚˜ Redux๋ฅผ ๋„์ž…ํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„๊ตํ•˜์—ฌ ๋„์ž… ๋น„์šฉ ๋ฐ ์žฅ๊ธฐ์  ํ™•์žฅ์„ฑ ์ธก๋ฉด์—์„œ ์–ด๋–ค ์žฅ๋‹จ์ ์„ ๊ฐ€์ง€๋Š”๊ฐ€? +- ์˜์กด์„ฑ ์ฃผ์ž…(Dependency Injection)์˜ ๋ชฉ์ ์œผ๋กœ Context API๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ, ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ(Jest ๋“ฑ)์ด๋‚˜ Storybook์—์„œ Provider ๋ชจํ‚น(Mocking)์„ ์„ค๊ณ„ํ•  ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์ทจ์•ฝ์ ๊ณผ ํ•ด๊ฒฐ์ฑ…์€ ๋ฌด์—‡์ธ๊ฐ€? +- ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฌด๋ถ„๋ณ„ํ•œ `useEffect`์™€ Context API๊ฐ€ ๊ฒฐํ•ฉ๋˜์—ˆ์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” '๋ฆฌ๋ Œ๋”๋ง ํญํ’(Re-render storm)'์„ React DevTools Profiler๋กœ ์ง„๋‹จํ•˜๊ณ  ๋ฆฌํŒฉํ† ๋งํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ๊ณผ์ •์€ ์–ด๋–ป๊ฒŒ ๋˜๋Š”๊ฐ€? + +### Practical Application Contexts +- **Implementation:** React ํ”„๋กœ์ ํŠธ์—์„œ `React.createContext()`๋กœ ํ…Œ๋งˆ๋‚˜ ๋กœ์ผ€์ผ ์ •๋ณด๋ฅผ ์ •์˜ํ•˜๊ณ , ์ตœ์ƒ์œ„ ๋ ˆ์ด์–ด(`app/` ๋˜๋Š” ์ตœ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ)๋ฅผ `Provider`๋กœ ๊ฐ์‹ผ ๋’ค, ๋‚ด๋ถ€ ์ปดํฌ๋„ŒํŠธ์—์„œ `useContext`๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ์„ค์ •๊ฐ’์„ ๋ถˆ๋Ÿฌ์™€ UI์— ์ฆ‰๊ฐ์ ์œผ๋กœ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค [4, 22, 23]. +- **System Design:** ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ ์‹œ ์ƒํƒœ์˜ '๋ณ€๊ฒฝ ๋นˆ๋„'์— ๋”ฐ๋ผ ์ €์žฅ์†Œ๋ฅผ ์ด์›ํ™”ํ•ฉ๋‹ˆ๋‹ค. ๋‹คํฌ๋ชจ๋“œ, ๋กœ๊ทธ์ธ ์—ฌ๋ถ€ ๊ฐ™์€ ์ •์ ์ธ ์„ค์ •์€ Context API์— ๋ฐฐ์น˜ํ•˜๊ณ , ์žฅ๋ฐ”๊ตฌ๋‹ˆ๋‚˜ ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ์ฒ˜๋Ÿผ ์ˆ˜์‹œ๋กœ ๋ณ€ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋Š” Zustand๋‚˜ Redux ๊ฐ™์€ ์™ธ๋ถ€ ์Šคํ† ์–ด์— ๋ฐฐ์น˜ํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง ์ „ํŒŒ๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค [24]. +- **Operation / Maintenance:** ์„ฑ๋Šฅ ํ”„๋กœํŒŒ์ผ๋ง ์‹œ ์‚ฌ์šฉ์ž ์ธํ„ฐ๋ž™์…˜ ์ดํ›„ ๋Œ€์‹œ๋ณด๋“œ๊ฐ€ ์ผ์‹œ์ ์œผ๋กœ ๋ฉˆ์ถ”๋Š” ํ˜„์ƒ์ด ๋ฐœ๊ฒฌ๋˜๋ฉด, React DevTools์˜ Profiler๋ฅผ ์ด์šฉํ•ด ์›์ธ์„ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค. ์›์ธ์ด ๋‹จ์ผ Context ์—…๋ฐ์ดํŠธ์— ์˜ํ•œ ์ˆ˜๋ฐฑ ๊ฐœ ์ปดํฌ๋„ŒํŠธ์˜ ๋ฆฌ๋ Œ๋”๋ง์œผ๋กœ ํ™•์ธ๋  ๊ฒฝ์šฐ, Context๋ฅผ ์ž˜๊ฒŒ ์ชผ๊ฐœ๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋Š” ์œ ์ง€๋ณด์ˆ˜ ๊ฒฐ์ •์„ ๋‚ด๋ฆฝ๋‹ˆ๋‹ค [1, 25]. +- **Learning Path:** React ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ์ฒ˜์Œ ๋ฐฐ์šฐ๋Š” ๋‹จ๊ณ„์—์„œ, ์ปดํฌ๋„ŒํŠธ ๊ฐ„ Props ์ „๋‹ฌ์˜ ํ”ผ๋กœ๋„๋ฅผ ์ค„์ด๋Š” ์ฒซ ๋ฒˆ์งธ ๋„๊ตฌ๋กœ ํ•™์Šต๋ฉ๋‹ˆ๋‹ค. ์ดํ›„ ์‹ค์ œ ๋ณต์žกํ•œ ์•ฑ์„ ๋งŒ๋“ค๋ฉฐ ํ•œ๊ณ„๋ฅผ ๊ฒฝํ—˜ํ•˜๊ณ , Redux์˜ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ๊ตฌ์กฐ๋‚˜ Zustand์˜ ๋…๋ฆฝ๋œ ์Šคํ† ์–ด ๊ฐœ๋…์„ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ฐ›์•„๋“ค์ด๊ฒŒ ํ•˜๋Š” ํ•ต์‹ฌ ํ•™์Šต ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค [14, 26, 27]. +- **My Project Relevance:** ๊ธฐ์กด ์ฝ”๋“œ๋ฒ ์ด์Šค์— 'Global Context' ์•ˆํ‹ฐ ํŒจํ„ด(๋ชจ๋“  ์ƒํƒœ๋ฅผ ํ•œ ๊ณณ์— ๋ชฐ์•„๋„ฃ์€ ํ˜•ํƒœ)์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š”์ง€ ์ ๊ฒ€ํ•˜๊ณ  [11], ๋ Œ๋”๋ง ๋ณ‘๋ชฉ์ด ์žˆ๋Š” ๊ฒฝ์šฐ `useMemo`, `useCallback`๊ณผ ํ•จ๊ป˜ Context๋ฅผ ์ฑ…์ž„๋ณ„๋กœ ๋ถ„ํ• ํ•˜๋Š” ๋ฆฌํŒฉํ† ๋ง ๋ชฉํ‘œ์™€ ์ง์ ‘์ ์œผ๋กœ ์—ฐ๊ด€๋ฉ๋‹ˆ๋‹ค [1, 12]. + +### Adjacent Topics +- [[React.memo]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: Context API์— ์˜ํ•ด ๋ฐœ์ƒํ•˜๋Š” ๋ถˆํ•„์š”ํ•œ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์–•์€ ๋น„๊ต(Shallow Compare) ์ตœ์ ํ™” ๋„๊ตฌ๋กœ, ๋ Œ๋”๋ง ์„ฑ๋Šฅ ์ตœ์ ํ™”(Performance Optimization) ๊ธฐ๋ฒ• ์ „๋ฐ˜์œผ๋กœ์˜ ์ดํ•ด๋ฅผ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค [28, 29]. +- [[Concurrent Rendering]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: React 18์˜ ๋™์‹œ์„ฑ ๋ Œ๋”๋ง ๊ธฐ๋Šฅ(`useTransition`, `useDeferredValue`)์„ ํ†ตํ•ด ๋ฌด๊ฑฐ์šด ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง์„ ์–ด๋–ป๊ฒŒ ์ง€์—ฐ์‹œํ‚ค๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฐ˜์‘์„ฑ์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ƒํƒœ ์—…๋ฐ์ดํŠธ ํ๋ฆ„์œผ๋กœ ํƒ๊ตฌ๋ฅผ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค [6, 30]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Topics_Blog/Debugging Frontend Applications.md b/10_Wiki/Topics_Blog/Debugging Frontend Applications.md new file mode 100644 index 00000000..51a64a0b --- /dev/null +++ b/10_Wiki/Topics_Blog/Debugging Frontend Applications.md @@ -0,0 +1,74 @@ +# [[Debugging Frontend Applications]] + +## ๐Ÿ“Œ Brief Summary +ํ”„๋ก ํŠธ์—”๋“œ ๋””๋ฒ„๊น…์€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ, ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜, ๊ทธ๋ฆฌ๊ณ  ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง๊ณผ ๊ฐ™์€ ์„ฑ๋Šฅ ์ €ํ•˜ ์š”์ธ์„ ์‹๋ณ„ํ•˜๊ณ  ํ•ด๊ฒฐํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค [1-3]. Chrome DevTools์™€ ๊ฐ™์€ ๋ธŒ๋ผ์šฐ์ € ๋‚ด์žฅ ๋„๊ตฌ๋ถ€ํ„ฐ React DevTools, ๊ทธ๋ฆฌ๊ณ  Sentry๋‚˜ LogRocket๊ณผ ๊ฐ™์€ ํ”„๋กœ๋•์…˜ ํด๋ผ์šฐ๋“œ ๋กœ๊น… ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฌธ์ œ์˜ ๊ทผ๋ณธ ์›์ธ์„ ์ถ”์ ํ•ฉ๋‹ˆ๋‹ค [4-7]. ํšจ๊ณผ์ ์ธ ๋””๋ฒ„๊น… ์ „๋žต๊ณผ ์—๋Ÿฌ ํ•ธ๋“ค๋ง ์•„ํ‚คํ…์ฒ˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•˜๊ณ  ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์ตœ์ ํ™”ํ•˜๋Š” ๋ฐ ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค [8-10]. + +## ๐Ÿ“– Core Content + +* **๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜(Memory Leaks) ํƒ์ง€ ๋ฐ ํ•ด๊ฒฐ:** + * ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋Š” ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š์Œ์—๋„ ํ•ด์ œ๋˜์ง€ ์•Š์„ ๋•Œ ๋ฐœ์ƒํ•˜๋ฉฐ, ์•ฑ ์†๋„ ์ €ํ•˜์™€ ๋ธŒ๋ผ์šฐ์ € ํƒญ ์ถฉ๋Œ์„ ์œ ๋ฐœํ•ฉ๋‹ˆ๋‹ค [2, 11]. + * Chrome DevTools์˜ Task Manager๋ฅผ ํ†ตํ•ด ์‹ค์‹œ๊ฐ„ JavaScript ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ํ™•์ธํ•˜๊ณ , Performance ํƒญ์˜ ๊ธฐ๋ก์„ ํ†ตํ•ด ์‹œ๊ฐ„ ๊ฒฝ๊ณผ์— ๋”ฐ๋ฅธ ๋ฉ”๋ชจ๋ฆฌ ์ฆ๊ฐ€ ํŒจํ„ด์„ ์‹œ๊ฐํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [12, 13]. + * Memory ํŒจ๋„์˜ **Heap Snapshots**์„ ์‚ฌ์šฉํ•˜์—ฌ ์Šค๋ƒ…์ƒท ๊ฐ„์˜ ์ฐจ์ด(Delta)๋ฅผ ๋น„๊ตํ•จ์œผ๋กœ์จ, DOM์—์„œ ์ œ๊ฑฐ๋˜์—ˆ์œผ๋‚˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฐธ์กฐ๊ฐ€ ๋‚จ์•„์žˆ๋Š” 'Detached DOM nodes'๋ฅผ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [14-17]. ๋˜ํ•œ, **Allocation Timeline**์„ ํ†ตํ•ด ์ƒˆ๋กœ์šด ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์–ธ์ œ ํ• ๋‹น๋˜๋Š”์ง€ ์ถ”์ ํ•˜์—ฌ ๋ˆ„์ˆ˜ ํ›„๋ณด๋ฅผ ์ฐพ์•„๋ƒ…๋‹ˆ๋‹ค [18, 19]. +* **React ์ปดํฌ๋„ŒํŠธ ๋ฐ ์„ฑ๋Šฅ ๋””๋ฒ„๊น…:** + * **๋ฆฌ๋ Œ๋”๋ง ์›์ธ ์ถ”์ :** React DevTools์˜ Profiler๋ฅผ ์‚ฌ์šฉํ•ด ์–ด๋–ค ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ธ์ œ, ์™œ ๋ Œ๋”๋ง๋˜์—ˆ๋Š”์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ฐœ๋ฐœ ์ „์šฉ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ `why-did-you-render`๋ฅผ ํ†ตํ•ด ์‹ค์ œ props๋‚˜ ์ƒํƒœ ๋ณ€๊ฒฝ ์—†์ด ๋ฐœ์ƒํ•˜๋Š” ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ์ฝ˜์†” ๊ฒฝ๊ณ ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [7, 20]. + * **React Error Boundaries:** React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” Error Boundary๋ผ๋Š” ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ์˜ ๋ Œ๋”๋ง, ์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ, ์ƒ์„ฑ์ž์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ๋ฅผ ํฌ์ฐฉํ•ฉ๋‹ˆ๋‹ค [1]. ์ด๋Š” UI๋ฅผ ์œ„ํ•œ `try-catch` ๋ธ”๋ก ์—ญํ• ์„ ํ•˜๋ฉฐ, ์•ฑ ์ „์ฒด๊ฐ€ ์ถฉ๋Œํ•˜๋Š” ๋Œ€์‹  Fallback UI๋ฅผ ํ‘œ์‹œํ•˜์—ฌ ์•ฑ์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์„ ์ƒํ˜ธ์ž‘์šฉ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋กœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค [1, 8, 10]. +* **์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ์™€ ๋””๋ฒ„๊น… ํŽธ์˜์„ฑ:** + * ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ์˜ ์„ ํƒ์€ ๋””๋ฒ„๊น… ๊ฒฝํ—˜์— ํฐ ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค. Context API๋Š” ์ƒํƒœ ๋ณ€๊ฒฝ ๊ธฐ๋ก ์ถ”์ ์ด๋‚˜ ์‹œ๊ฐ„ ์—ฌํ–‰(Time-travel) ๋””๋ฒ„๊น…์ด ๋ถˆ๊ฐ€๋Šฅํ•˜์—ฌ ๋ฒ„๊ทธ ์›์ธ์„ ํŒŒ์•…ํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค [21]. ๋ฐ˜๋ฉด, Redux๋Š” Redux DevTools๋ฅผ ํ†ตํ•ด ์–ด๋–ค ์•ก์…˜์ด ์–ธ์ œ ๋””์ŠคํŒจ์น˜๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ์ƒํƒœ ์ด๋ ฅ์„ ๊ฒ€์‚ฌ ๋ฐ ์žฌ์ƒ(Replay)ํ•  ์ˆ˜ ์žˆ์–ด ๋ณต์žกํ•œ ๋น„๋™๊ธฐ ์—๋Ÿฌ๋ฅผ ์‹ ์†ํ•˜๊ฒŒ ๋””๋ฒ„๊น…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [21, 22]. +* **ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ๋กœ๊น…:** + * ๋ฐฐํฌ๋œ ํ”„๋กœ๋•์…˜ ์•ฑ์—์„œ๋Š” Sentry, LogRocket, Datadog RUM ๋“ฑ์˜ ํด๋ผ์šฐ๋“œ ๋กœ๊น… ํˆด์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž๊ฐ€ ๊ฒฝํ—˜ํ•˜๋Š” ์—๋Ÿฌ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค [23-25]. + * Sentry๋Š” ์ง€๋Šฅํ˜• ์—๋Ÿฌ ๊ทธ๋ฃนํ™”(Error grouping)์™€ ์—๋Ÿฌ ๋ฐœ์ƒ ์ „์˜ ์ฝ˜์†” ๋กœ๊ทธ, ๋„คํŠธ์›Œํฌ ์š”์ฒญ ๋“ฑ์„ ๋ณด์—ฌ์ฃผ๋Š” ๋นต๋ถ€์Šค๋Ÿฌ๊ธฐ(Breadcrumb) ํŠธ๋ ˆ์ผ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [4, 25]. LogRocket์€ ์‚ฌ์šฉ์ž์˜ ์ „์ฒด ํ™”๋ฉด์„ ๋…นํ™”ํ•˜๋“ฏ DOM ๋ฐ Redux/Vuex ์ƒํƒœ ๋ณ€ํ™”๊นŒ์ง€ ์บก์ฒ˜ํ•˜๋Š” ์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด(Session replay) ๊ธฐ๋Šฅ์œผ๋กœ ์ƒ์„ธํ•œ ๋””๋ฒ„๊น… ์ปจํ…์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [5]. Datadog RUM์€ ํ”„๋ก ํŠธ์—”๋“œ ์—๋Ÿฌ๋ฅผ ๋ฐฑ์—”๋“œ ๋ถ„์‚ฐ ํŠธ๋ ˆ์ด์‹ฑ(Distributed tracing)๊ณผ ์ƒ๊ด€๊ด€๊ณ„ ์ง€์–ด(Correlation) ๋ณต์žกํ•œ ์‹œ์Šคํ…œ์˜ ์—๋Ÿฌ๋ฅผ ํŒŒ์•…ํ•˜๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค [24]. + +## โš–๏ธ Trade-offs & Caveats + +* **ํด๋ผ์šฐ๋“œ ๋กœ๊น… ๋„๊ตฌ์˜ ์„ฑ๋Šฅ ๋ฐ ๋น„์šฉ ๋ฌธ์ œ:** ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ๋“ค์€ ๋ Œ๋”๋ง ์„ฑ๋Šฅ ๋ฐ ๋ฒˆ๋“ค ํฌ๊ธฐ์— ์ง์ ‘์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค. ์ผ๋ถ€ ๋„๊ตฌ ๊ตฌํ˜„ ์‹œ ์ตœ๋Œ€ 120ms์˜ ์ถ”๊ฐ€ ๋กœ๋“œ ์‹œ๊ฐ„์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [26]. ๋˜ํ•œ, Datadog๊ณผ ๊ฐ™์€ ํˆด์€ ๋กœ๊ทธ ์ˆ˜์ง‘(Ingest)๊ณผ ๊ฒ€์ƒ‰์„ ์œ„ํ•œ ์ธ๋ฑ์‹ฑ(Index)์— ๋Œ€ํ•ด ์ด์ค‘ ๊ณผ๊ธˆ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด ๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ๋น„์šฉ์ด ๋งค์šฐ ๊ฐ€ํŒŒ๋ฅด๊ฒŒ ์ฆ๊ฐ€ํ•˜๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค [27, 28]. +* **์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด์™€ ๊ฐœ์ธ์ •๋ณด ์นจํ•ด (Privacy Concerns):** LogRocket์ฒ˜๋Ÿผ '๋ชจ๋“  ๊ฒƒ์„ ์บก์ฒ˜'ํ•˜๋Š” ์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด ๋ฐฉ์‹์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ•๋ ฅํ•œ ๋””๋ฒ„๊น… ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜์ง€๋งŒ, ๋ฏผ๊ฐํ•œ ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๊นŒ์ง€ ๋…นํ™”๋  ์ˆ˜ ์žˆ๋Š” ์‹ฌ๊ฐํ•œ ๊ฐœ์ธ์ •๋ณด ์นจํ•ด ์šฐ๋ ค๊ฐ€ ๋™๋ฐ˜๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ณ„๋„์˜ ๋งˆ์Šคํ‚น ๋ฐ ์„ค์ • ์ž‘์—…์ด ๊ฐ•์ œ๋ฉ๋‹ˆ๋‹ค [5, 29, 30]. +* **Error Boundaries์˜ ํ•œ๊ณ„:** ์„ ์–ธ์ ์ธ UI ์—๋Ÿฌ ์ฒ˜๋ฆฌ์— ๊ฐ•๋ ฅํ•˜์ง€๋งŒ, ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ๋‚ด๋ถ€์˜ ์—๋Ÿฌ, `setTimeout` ๊ฐ™์€ ๋น„๋™๊ธฐ ์ฝ”๋“œ, ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง(SSR), ๊ทธ๋ฆฌ๊ณ  Error Boundary ์ž์ฒด์—์„œ ๋ฐœ์ƒํ•œ ์—๋Ÿฌ๋Š” ํฌ์ฐฉํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ถ€๋ถ„์€ ์ „ํ†ต์ ์ธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ `try/catch` ๋ธ”๋ก์œผ๋กœ ๋””๋ฒ„๊น… ๋ฐ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์•ผ ํ•˜๋Š” ์ œ์•ฝ์ด ์žˆ์Šต๋‹ˆ๋‹ค [31, 32]. +* **React Compiler ๋„์ž…์— ๋”ฐ๋ฅธ ๋””๋ฒ„๊น… ๋‚œ์ด๋„ ์ฆ๊ฐ€:** ์ฝ”๋“œ๋ฅผ ์ž๋™์œผ๋กœ ์ตœ์ ํ™”ํ•ด์ฃผ๋Š” React Compiler๋Š” ๋‚ด๋ถ€ ๋กœ์ง์ด ๋ธ”๋ž™๋ฐ•์Šค(Black box) ํ˜•ํƒœ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” ์ตœ์ ํ™”๋œ ๋ถ€๋ถ„๊ณผ ๊ทธ ์ด์œ ์— ๋Œ€ํ•œ ๊ฐ€์‹œ์„ฑ์„ ์žƒ๊ฒŒ ๋˜๋ฉฐ, ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๋ฆฌ๋ Œ๋”๋ง ๋ฐœ์ƒ ์‹œ ์ฝ”๋“œ์ƒ์˜ `React.memo`๋‚˜ `useCallback` ํ˜ธ์ถœ์„ ํ™•์ธํ•˜๋Š” ๋Œ€์‹  React DevTools Profiler์— ์ „์ ์œผ๋กœ ์˜์กดํ•ด ์กฐ์‚ฌํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋””๋ฒ„๊น… ๋‚œ์ด๋„๊ฐ€ ์ƒ์Šนํ•ฉ๋‹ˆ๋‹ค [33]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [๊ด€๊ณ„ ์œ ํ˜• A (๋ธŒ๋ผ์šฐ์ € ๋ฐ ์„ฑ๋Šฅ ๋ถ„์„ ๊ธฐ๋ฐ˜ ๋„๊ตฌ)] +- [[Chrome DevTools]] + - ์—ฐ๊ฒฐ ์ด์œ : ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํž™ ๋ฉ”๋ชจ๋ฆฌ์™€ DOM์˜ ์ƒํƒœ๋ฅผ ํ”„๋กœํŒŒ์ผ๋งํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ์ง„๋‹จํ•˜๋Š” ๊ฐ€์žฅ ๊ทผ๋ณธ์ ์ธ ํ”„๋ก ํŠธ์—”๋“œ ๋””๋ฒ„๊น… ๋„๊ตฌ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [6, 34]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ธŒ๋ผ์šฐ์ €์˜ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜(GC) ๋™์ž‘ ์›๋ฆฌ, ๋ถ„๋ฆฌ๋œ DOM ๋…ธ๋“œ(Detached DOM nodes)์™€ ํด๋กœ์ €(Closure)๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ์œ ํ•˜์—ฌ ์„ฑ๋Šฅ์„ ์ €ํ•˜์‹œํ‚ค๋Š” ์›๋ฆฌ๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2, 14, 17, 35]. + +#### [๊ด€๊ณ„ ์œ ํ˜• B (React ์ปดํฌ๋„ŒํŠธ ๋ฐ ์—๋Ÿฌ ํ•ธ๋“ค๋ง ๋„๊ตฌ)] +- [[React Error Boundaries]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋ Œ๋”๋ง ๋ฐ ์ƒ๋ช…์ฃผ๊ธฐ ๋„์ค‘ ๋ฐœ์ƒํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๋ฅผ ๋””๋ฒ„๊น…/ํ•ธ๋“ค๋งํ•˜์—ฌ "ํ•˜์–€ ํ™”๋ฉด(White screen of death)"์„ ๋ง‰์•„์ฃผ๋Š” React๋งŒ์˜ ๊ณ ์œ ํ•œ ๋ฐฉ์–ด์  ๋””๋ฒ„๊น… ํŒจํ„ด์ž…๋‹ˆ๋‹ค [1, 36]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์„ ์–ธ์ (Declarative) UI ํŠธ๋ฆฌ์˜ ์—๋Ÿฌ ์ „ํŒŒ ๋ฐฉ์‹๊ณผ, ๋ช…๋ นํ˜•(Imperative) ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์—์„œ `try-catch`๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜์  ์ฐจ์ด๋ฅผ ๋ช…ํ™•ํžˆ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [32]. +- [[React DevTools Profiler]] + - ์—ฐ๊ฒฐ ์ด์œ : ์–ด๋–ค ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ธ์ œ, ์™œ ๋ฆฌ๋ Œ๋”๋ง๋˜์—ˆ๋Š”์ง€๋ฅผ ์ธก์ •(Profiling)ํ•˜์—ฌ ๋ Œ๋”๋ง ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ๋””๋ฒ„๊น…ํ•˜๋Š” ํ•„์ˆ˜ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค [7, 37]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: React์˜ ๋ Œ๋”๋ง ๋ผ์ดํ”„์‚ฌ์ดํด, ๋ถˆํ•„์š”ํ•œ ์ƒํƒœ ๋ฐ props ๋ณ€๊ฒฝ ์ถ”์ , ๊ทธ๋ฆฌ๊ณ  React Compiler ๋„์ž… ์ „ํ›„์˜ ๋ Œ๋”๋ง ํŒจ์Šค(Render pass) ์ฐจ์ด๋ฅผ ๊ฒ€์ฆํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [7, 38]. + +#### [๊ด€๊ณ„ ์œ ํ˜• C (ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ ๊ด€์ธก์„ฑ ๋„๊ตฌ)] +- [[Session Replay & Distributed Tracing]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋กœ์ปฌ์—์„œ ์žฌํ˜„์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ํ”„๋กœ๋•์…˜ ์—๋Ÿฌ๋ฅผ ์ถ”์ ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ์ž์˜ ๋ธŒ๋ผ์šฐ์ € ์ƒํ˜ธ์ž‘์šฉ(Sentry, LogRocket)๊ณผ ๋ฐฑ์—”๋“œ ๋ฐ์ดํ„ฐ ํ๋ฆ„(Datadog)์„ ์—ฐ๊ฒฐํ•˜์—ฌ ๋””๋ฒ„๊น… ๋‹จ์„œ๋ฅผ ์ฐพ๋Š” ํ•ต์‹ฌ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค [5, 24, 39]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํ’€์Šคํƒ ํ™˜๊ฒฝ์—์„œ์˜ ์—”๋“œํˆฌ์—”๋“œ(End-to-End) ์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง ํ•œ๊ณ„์™€ ํ”„๋ก ํŠธ์—”๋“œ ์—๋Ÿฌ๊ฐ€ ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค์— ๋ฏธ์น˜๋Š” ์—ฐ๊ด€ ๊ด€๊ณ„๋ฅผ ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [24, 25]. + +### Deeper Research Questions + +- Chrome DevTools์˜ Heap Snapshot ๋ถ„์„์—์„œ 'Shallow size'์™€ 'Retained size'์˜ ์ฐจ์ด๋Š” ํ”„๋ก ํŠธ์—”๋“œ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ์ธก๋ฉด์—์„œ ์–ด๋–ป๊ฒŒ ํ•ด์„๋˜๋ฉฐ, ๋””๋ฒ„๊น… ์‹œ ์–ด๋–ค ๊ธฐ์ค€ํ‘œ๊ฐ€ ๋˜๋Š”๊ฐ€? [40] +- React Error Boundary๊ฐ€ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋‚˜ ๋น„๋™๊ธฐ ์ฝ”๋“œ์˜ ์—๋Ÿฌ๋ฅผ ์žก์ง€ ๋ชปํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜์  ์ด์œ ๋Š” ๋ฌด์—‡์ด๋ฉฐ, ์ด๋ฅผ ๋ณด์™„ํ•˜์—ฌ ์ „์ฒด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์—๋Ÿฌ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ์บก์ฒ˜ํ•˜๊ธฐ ์œ„ํ•œ ์ตœ์ ์˜ ๋กœ๊น… ํŒจํ„ด์€ ๋ฌด์—‡์ธ๊ฐ€? [31, 32] +- Sentry, LogRocket, Datadog RUM ๋“ฑ ํด๋ผ์šฐ๋“œ ๊ธฐ๋ฐ˜ ๋กœ๊น… ๋„๊ตฌ๊ฐ€ ํ”„๋ก ํŠธ์—”๋“œ ๋ฒˆ๋“ค ํฌ๊ธฐ ์ฆ๊ฐ€ ๋ฐ ์ดˆ๊ธฐ ๋ Œ๋”๋ง ์„ฑ๋Šฅ ์ง€์—ฐ(์ตœ๋Œ€ 120ms ์ถ”๊ฐ€ ๋กœ๋“œ)์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•œ ์„ค์ • ๋ฐ ๋กœ๋“œ ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? [26, 41] +- Redux DevTools์˜ ์‹œ๊ฐ„ ์—ฌํ–‰(Time-travel) ๋””๋ฒ„๊น… ์›๋ฆฌ๋Š” ๋ฌด์—‡์ด๋ฉฐ, ์™œ Context API๋‚˜ Zustand๋ณด๋‹ค ๋ณต์žกํ•œ ๋น„๋™๊ธฐ ์ƒํƒœ์˜ ๋ฒ„๊ทธ๋ฅผ ๋” ๋น ๋ฅด๊ณ  ์ •ํ™•ํ•˜๊ฒŒ ์ฐพ์•„๋‚ผ ์ˆ˜ ์žˆ๋Š”๊ฐ€? [21, 22] +- React Compiler ๋„์ž… ์ดํ›„ ์ž๋™ํ™”๋œ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ Œ๋”๋ง ์ด์Šˆ(์˜ˆ: Library Compatibility ๋ฌธ์ œ๋กœ ์ธํ•œ ์ฐธ์กฐ ๋ณ€๊ฒฝ)๋ฅผ ๋””๋ฒ„๊น…ํ•˜๊ธฐ ์œ„ํ•ด React Profiler๋ฅผ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•ด์•ผ ํ•˜๋Š”๊ฐ€? [33, 42, 43] + +### Practical Application Contexts + +- **Implementation:** ๊ฐœ๋ฐœ์ž๋Š” `why-did-you-render` ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ”„๋กœ์ ํŠธ์— ์—ฐ๋™ํ•ด, ๋กœ์ปฌ ๊ฐœ๋ฐœ ์‹œ ๋ถˆํ•„์š”ํ•œ ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง ์›์ธ์„ ์ฝ˜์†” ๊ฒฝ๊ณ ๋ฅผ ํ†ตํ•ด ์ฆ‰๊ฐ์ ์œผ๋กœ ํŒŒ์•…ํ•˜๊ณ  ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [20, 44]. +- **System Design:** ํ”„๋ก ํŠธ์—”๋“œ ์‹œ์Šคํ…œ ์„ค๊ณ„ ์‹œ ๋Œ€์‹œ๋ณด๋“œ, ์ฐจํŠธ, ๋ณต์žกํ•œ ํผ ๋“ฑ ์žฅ์•  ๋ฐœ์ƒ ํ™•๋ฅ ์ด ๋†’์€ UI ์ปดํฌ๋„ŒํŠธ ๊ฐ๊ฐ์— ๋…๋ฆฝ์ ์ธ `Error Boundary`๋ฅผ ๋ฐฐ์น˜ํ•ด ํ•˜๋‚˜์˜ ์œ„์ ฏ ๊ฒฐํ•จ์ด ์ „์ฒด ์•ฑ์˜ ๋งˆ๋น„๋ฅผ ๊ฐ€์ ธ์˜ค์ง€ ์•Š๋„๋ก ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค [8, 45, 46]. +- **Operation / Maintenance:** ํ”„๋กœ๋•์…˜ ๋‹จ๊ณ„์—์„œ๋Š” Sentry๋‚˜ LogRocket๊ณผ ๊ฐ™์€ ๊ด€์ธก์„ฑ(Observability) ํˆด์„ ํ†ตํ•ฉํ•˜์—ฌ, ์˜ค๋ฅ˜ ๋กœ๊ทธ ๋ฐœ์ƒ ์‹œ ์‚ฌ์šฉ์ž๊ฐ€ ํด๋ฆญํ•œ ์ด๋ฒคํŠธ์™€ ํ™”๋ฉด์˜ ์ƒํƒœ(Session Replay)๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํ™•์ธํ•˜๊ณ  ๋น ๋ฅด๊ฒŒ ์ด์Šˆ๋ฅผ ๋Œ€์‘(Hotfix)ํ•ฉ๋‹ˆ๋‹ค [5, 25, 47]. +- **Learning Path:** ์ฃผ๋‹ˆ์–ด ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ํ•™์Šตํ•  ๋•Œ, Chrome DevTools์˜ Memory ํƒญ์„ ์‚ฌ์šฉํ•ด ์Šค๋ƒ…์ƒท์„ ์ฐ๊ณ  DOM ๋…ธ๋“œ๊ฐ€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ณ€์ˆ˜์— ์˜ํ•ด ์ฐธ์กฐ๋˜์–ด ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜๋˜์ง€ ์•Š๋Š” ์ƒํ™ฉ(Detached Elements)์„ ์‹ค์Šตํ•ฉ๋‹ˆ๋‹ค [14, 15, 17]. +- **My Project Relevance:** React ํ”„๋กœ์ ํŠธ์—์„œ ์ „์—ญ ์ƒํƒœ๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ, ๋‹จ์ˆœ ์„ค์ •(Theme ๋“ฑ)์€ ๋””๋ฒ„๊น…์ด ๋‹จ์ˆœํ•œ Context API๋กœ, ๋ณ€๊ฒฝ์ด ์žฆ๊ณ  ์ƒํƒœ ์ถ”์ ์ด ์ค‘์š”ํ•œ ์š”์†Œ๋Š” DevTools๋ฅผ ์ง€์›ํ•˜๋Š” Redux๋‚˜ Zustand๋ฅผ ๋„์ž…ํ•˜์—ฌ ๋””๋ฒ„๊น… ์šฉ์ด์„ฑ์„ ํ™•๋ณดํ•ฉ๋‹ˆ๋‹ค [22, 48, 49]. + +### Adjacent Topics + +- [[State Management Architecture]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(Redux, Zustand, Context API ๋“ฑ)์˜ ์•„ํ‚คํ…์ฒ˜์  ์„ ํƒ์ด ์ƒํƒœ ๋ณ€ํ™” ์ถ”์ ์„ฑ๊ณผ DevTools ๋””๋ฒ„๊น… ํ€„๋ฆฌํ‹ฐ์— ์–ด๋–ค ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”์ง€ ๋ถ„์„ [21, 22, 49]. +- [[Frontend Performance Optimization]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋””๋ฒ„๊น…์„ ํ†ตํ•ด ๋ฐœ๊ฒฌํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜์™€ ๋ถˆํ•„์š”ํ•œ ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง(Re-renders) ๋ฌธ์ œ๋ฅผ ์‹ค์งˆ์ ์ธ ์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ธฐ๋ฒ•(๊ฐ€์ƒํ™”, ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…)์œผ๋กœ ํ•ด๊ฒฐํ•˜์—ฌ Core Web Vitals๋ฅผ ๊ฐœ์„ ํ•˜๋Š” ๋ฐฉํ–ฅ [20, 50]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Topics_Blog/Large-scale Application Refactoring.md b/10_Wiki/Topics_Blog/Large-scale Application Refactoring.md new file mode 100644 index 00000000..57dc756e --- /dev/null +++ b/10_Wiki/Topics_Blog/Large-scale Application Refactoring.md @@ -0,0 +1,66 @@ +# [[Large-scale Application Refactoring]] + +## ๐Ÿ“Œ Brief Summary +๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฆฌํŒฉํ† ๋ง์€ ์ฝ”๋“œ์˜ ๋™์ž‘ ๋ฐฉ์‹์„ ๋ณด์กดํ•˜๋ฉด์„œ ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ๊ฐœ์„ ํ•˜์—ฌ ์˜ค๋ž˜๋œ ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ํ™•์žฅ์„ฑ์„ ํšŒ๋ณตํ•˜๋Š” ๊ณผ์ •์ด๋‹ค [1]. ์ด๋Š” ๋‹จ์ˆœํžˆ ์ฝ”๋“œ๋ฅผ '์ˆ˜์ •'ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๋ณต์žกํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋ถ„๋ฆฌํ•˜๊ณ  ๊ตฌ์กฐ์  ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•œ๋‹ค [2]. ์„ฑ๊ณต์ ์ธ ๋ฆฌํŒฉํ† ๋ง์„ ์œ„ํ•ด์„œ๋Š” ์ ์ง„์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹, ์—„๊ฒฉํ•œ ์•„ํ‚คํ…์ฒ˜ ์ ์šฉ, ๊ทธ๋ฆฌ๊ณ  ์ฝ”๋“œ ๋ณ€๊ฒฝ์„ ๋’ท๋ฐ›์นจํ•  ์ˆ˜ ์žˆ๋Š” ํ…Œ์ŠคํŠธ ๊ตฌ์ถ•์ด ํ•„์ˆ˜์ ์ด๋‹ค [1, 3]. + +## ๐Ÿ“– Core Content + +* **์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ „๋žต (Incremental Migration):** ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ•œ ๋ฒˆ์— ์ „๋ฉด ์žฌ์ž‘์„ฑ(Rewrite)ํ•˜๋Š” ๊ฒƒ์€ ๋ฆฌ์Šคํฌ๊ฐ€ ๋งค์šฐ ํฌ๊ธฐ ๋•Œ๋ฌธ์—, "์žฌ์ž‘์„ฑ์ด ์•„๋‹Œ ๋ฆฌํŒฉํ† ๋ง" ์ „๋žต์ด ๊ถŒ์žฅ๋œ๋‹ค [1]. ์˜ˆ๋ฅผ ๋“ค์–ด ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ๋ฅผ Context API์—์„œ Zustand๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ๋•Œ, ์•Œ๋ฆผ๊ณผ ๊ฐ™์€ ๋‹จ์ˆœํ•œ ์œ ํ‹ธ๋ฆฌํ‹ฐ ์Šคํ† ์–ด๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด ๊ฒฐ์ œ ํ๋ฆ„๊ณผ ๊ฐ™์€ ๋ณต์žกํ•œ ๋„๋ฉ”์ธ์œผ๋กœ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์Šคํ† ์–ด์”ฉ ์ ์ง„์ ์œผ๋กœ ์ด๋™ํ•ด์•ผ ํ•œ๋‹ค [1]. +* **๊ธฐ๋Šฅ ๋ฐ ๋„๋ฉ”์ธ ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ๋กœ์˜ ๊ฐœํŽธ:** ๋ ˆ๊ฑฐ์‹œ ์•ฑ์—์„œ ํ”ํžˆ ์“ฐ์ด๋Š” ํŒŒ์ผ ํƒ€์ž… ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ(components, hooks ๋“ฑ์„ ๋”ฐ๋กœ ๋ชจ์œผ๋Š” ๋ฐฉ์‹)๋Š” ์•ฑ์ด ์ปค์งˆ์ˆ˜๋ก ํƒ์ƒ‰๊ณผ ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ ๋‹ค [4, 5]. ๋”ฐ๋ผ์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๊ธฐ๋Šฅ๋ณ„๋กœ ์ฝ”๋“œ๋ฅผ ๋ชจ์œผ๋Š” ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ๋‚˜, ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ์„ ๊ฐ•์ œํ•˜๋Š” ์—„๊ฒฉํ•œ ๊ณ„์ธต ๋ชจ๋ธ์ธ Feature-Sliced Design(FSD)์œผ๋กœ ํด๋” ๊ตฌ์กฐ๋ฅผ ์žฌํŽธํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ ์ธ ๋ฆฌํŒฉํ† ๋ง ๋ชฉํ‘œ๊ฐ€ ๋œ๋‹ค [6-8]. +* **์ปค์Šคํ…€ ํ›…์„ ํ†ตํ•œ ๋กœ์ง ์บก์Аํ™”:** ํ˜„๋Œ€ React ๋ฆฌํŒฉํ† ๋ง์˜ ๊ธฐ๋ณธ ๋‹จ์œ„๋Š” ์ปค์Šคํ…€ ํ›…์ด๋‹ค [9]. ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ํŽ˜์นญ์ด๋‚˜ ํผ ํ•ธ๋“ค๋ง ๋กœ์ง์„ ๊ฑฐ๋Œ€ํ•œ UI ์ปดํฌ๋„ŒํŠธ์—์„œ ์ถ”์ถœํ•˜์—ฌ `useFetch`, `useForm` ๋“ฑ์˜ ํ›…์œผ๋กœ ๋ถ„๋ฆฌํ•˜๋ฉด, UI์™€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ๊ฒฉ๋ฆฌ๋˜์–ด ๋” ๋น ๋ฅด๊ณ  ๋…๋ฆฝ์ ์ธ ์œ ๋‹› ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง„๋‹ค [9, 10]. +* **ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•œ ์•ˆ์ „๋ง ํ™•๋ณด:** ์ฝ”๋“œ๋ฅผ ๋ณธ๊ฒฉ์ ์œผ๋กœ ์ˆ˜์ •ํ•˜๊ธฐ ์ „์— ํ…Œ์ŠคํŠธ(Unit Test, UI Test ๋“ฑ)๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ตœ์šฐ์„  ๋ฐฉ์–ด์„ ์ด๋‹ค [3, 11, 12]. ๊ธฐ์กด ๊ธฐ๋Šฅ์ด ๊นจ์ง€์ง€ ์•Š์•˜๋Š”์ง€ ๊ฒ€์ฆํ•  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ณผ์ • ์ž์ฒด๊ฐ€ ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ธฐ์กด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ํ๋ฆ„์„ ๊นŠ์ด ์ดํ•ดํ•˜๋„๋ก ๊ฐ•์ œํ•˜๋Š” ํ•™์Šต ๋„๊ตฌ๊ฐ€ ๋œ๋‹ค [13, 14]. +* **๋ ˆ๊ฑฐ์‹œ ์•ˆํ‹ฐํŒจํ„ด ๋ฐ ์Šคํƒ ์ œ๊ฑฐ:** ํšจ์œจ์ ์ธ ๊ตฌ์กฐ๋ฅผ ์œ„ํ•ด ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ Œ๋”๋ง์„ ์œ ๋ฐœํ•˜๋Š” ๋‹ค์ˆ˜์˜ `useEffect`๋ฅผ ์ œ๊ฑฐํ•˜๊ณ , ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ์ƒํƒœ๋ฅผ ๋ถ„๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด TanStack Query์™€ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ๋„์ž…ํ•ด์•ผ ํ•œ๋‹ค [15]. ๋˜ํ•œ, ๊ฐ€๋Šฅํ•  ๊ฒฝ์šฐ ํด๋ž˜์Šค ๊ธฐ๋ฐ˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์™€ ํ›…์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ , ์ผ๊ด€์„ฑ ์—†๋Š” CSS ์ ์šฉ ๋ฐฉ์‹์„ ํ•˜๋‚˜๋กœ ํ†ต์ผํ•˜๋Š” ์ž‘์—…๋„ ์ˆ˜๋ฐ˜๋œ๋‹ค [15, 16]. + +## โš–๏ธ Trade-offs & Caveats +* **DRY์™€ KISS ์›์น™์˜ ์ถฉ๋Œ:** ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๋ ค๋Š” DRY(Don't Repeat Yourself) ์›์น™์„ ๊ณผ๋„ํ•˜๊ฒŒ ์ ์šฉํ•  ๊ฒฝ์šฐ, ์ถ”์ƒํ™”๊ฐ€ ์ง€๋‚˜์น˜๊ฒŒ ๋ณต์žกํ•ด์ ธ ์ฝ”๋“œ๋ฅผ ๋‹จ์ˆœํ•˜๊ฒŒ ์œ ์ง€ํ•ด์•ผ ํ•˜๋Š” KISS(Keep It Simple, Stupid) ์›์น™์„ ์œ„๋ฐ˜ํ•˜๊ฒŒ ๋œ๋‹ค [17]. ๋”ฐ๋ผ์„œ ํŠน์ • ํŒจํ„ด์ด ์„ธ ๋ฒˆ ๋ฐ˜๋ณต๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ ์ถ”์ƒํ™”๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์กฐ๊ธฐ ์ตœ์ ํ™”๋กœ ์ธํ•œ ๋ถ€์ž‘์šฉ์„ ๋ง‰๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค [17]. +* **์žฌ์ž‘์„ฑ(Rewrite) vs ๋ฆฌํŒฉํ† ๋ง(Refactoring)์˜ ๊ธฐ๋กœ:** ๋ฆฌํŒฉํ† ๋ง ๋Œ€์ƒ์ธ ์•ฑ์˜ ๊ทœ๋ชจ๊ฐ€ ๋น„๊ต์  ์ž‘๋‹ค๋ฉด ์ฒ˜์Œ๋ถ€ํ„ฐ ์ƒˆ๋กœ ์•ฑ์„ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์ด ์˜คํžˆ๋ ค ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ๋‹ค [11]. ๊ทธ๋Ÿฌ๋‚˜ ๋Œ€ํ˜• ์•ฑ์˜ ๊ฒฝ์šฐ ์ „์ฒด ์žฌ์ž‘์„ฑ์€ ์œ„ํ—˜์ด ์ปค์„œ ์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ํ•ด์•ผ ํ•˜๋Š”๋ฐ, ์ด ๊ฒฝ์šฐ ์ „ํ™˜ ๊ธฐ๊ฐ„ ๋™์•ˆ ๋‘ ๊ฐ€์ง€ ๋‹ค๋ฅธ ๊ธฐ์ˆ ์ด๋‚˜ ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด์ด ๊ณต์กดํ•ด์•ผ ํ•˜๋Š” ๊ณผ๋„๊ธฐ์  ๊ธฐ์ˆ  ๋ถ€์ฑ„๋ฅผ ๊ฐ๋‹นํ•ด์•ผ ํ•œ๋‹ค [1]. +* **์ปดํŒŒ์ผ๋Ÿฌ ์ž๋™ํ™” ๋„์ž…์˜ ์žฅ๋ฒฝ:** React Compiler์™€ ๊ฐ™์ด ์„ฑ๋Šฅ ์ตœ์ ํ™”(๋ฉ”๋ชจ์ด์ œ์ด์…˜)๋ฅผ ์ž๋™ํ™”ํ•ด ์ฃผ๋Š” ๋„๊ตฌ๋ฅผ ๋„์ž…ํ•˜๋ฉด ์ˆ˜๋™ ์ตœ์ ํ™” ์ฝ”๋“œ๋ฅผ ์ง€์›Œ ์ฝ”๋“œ๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค [18]. ํ•˜์ง€๋งŒ ๊ธฐ์ˆ  ๋ถ€์ฑ„๊ฐ€ ๋งŽ์€ ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ๊ฒฝ์šฐ, ๊ธฐ์กด ์ฝ”๋“œ๊ฐ€ 'React์˜ ๊ทœ์น™(Rules of React)'์„ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์œ„๋ฐ˜ํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ, ๋„์ž… ์ „ ๋Œ€๋Œ€์ ์ธ ์‚ฌ์ „ ๋ฆฌํŒฉํ† ๋ง์ด ์„ ํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ์ œ์•ฝ์ด ๋”ฐ๋ฅธ๋‹ค [19]. +* **๊ณต์œ (Shared) ๋ชจ๋“ˆ์˜ ๋น„๋Œ€ํ™”:** ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ฒ˜(์˜ˆ: FSD)๋กœ ๋ถ„๋ฆฌํ•  ๋•Œ, ๊ณตํ†ต์œผ๋กœ ์“ฐ์ด๋Š” ์ฝ”๋“œ๋ฅผ ๋ฌด๋ถ„๋ณ„ํ•˜๊ฒŒ 'Shared' ๊ณ„์ธต์— ๋„ฃ์œผ๋ฉด ํ•ด๋‹น ๊ณ„์ธต์ด ๋ณต์žกํ•œ ์ŠคํŒŒ๊ฒŒํ‹ฐ ์ฝ”๋“œ๊ฐ€ ๋˜๊ณ  ๋ณ€๊ฒฝ ์‹œ ์˜ํ–ฅ ๋ฒ”์œ„(Blast Radius)๊ฐ€ ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ์ปค์ง€๋Š” ์œ„ํ—˜์ด ์žˆ๋‹ค [20, 21]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [์•„ํ‚คํ…์ฒ˜ ๋ฐ ๊ธฐ๋ฐ˜ ์›์น™] +- [[Feature-Sliced Design]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋Œ€๊ทœ๋ชจ ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ์ŠคํŒŒ๊ฒŒํ‹ฐํ™”๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ , ๋„๋ฉ”์ธ/๊ธฐ๋Šฅ ์ค‘์‹ฌ์˜ ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ๊ทœ์น™์„ ๋ถ€์—ฌํ•˜์—ฌ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฆฌํŒฉํ† ๋ง์˜ ๊ถ๊ทน์  ๋ชฉํ‘œ ๋ชจ๋ธ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค [7, 22]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ธฐ๋Šฅ(Feature)๊ณผ ๊ณ„์ธต(Layer)์„ ์–ด๋–ป๊ฒŒ ๋‚˜๋ˆ„๊ณ  ์บก์Аํ™”ํ•˜์—ฌ ์„œ๋กœ ๊ฐ„์˜ ์˜์กด์„ฑ ๊ฒฐํ•ฉ์„ ๋Š์–ด๋‚ด๋Š”์ง€์— ๋Œ€ํ•œ ์‹ค๋ฌด์  ์•„ํ‚คํ…์ฒ˜ ๊ตฌ์กฐ [6, 23]. + +- [[SOLID Principles]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP) ๋“ฑ์„ ํ†ตํ•ด ๊ฑฐ๋Œ€ํ•œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ฐ€์ง€๋Š” ์—ฌ๋Ÿฌ ์ฑ…์ž„์„ ๋ถ„๋ฆฌํ•˜๊ณ , ํ•จ์ˆ˜๋‚˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅํ•˜๊ฒŒ ์ž˜๊ฒŒ ์ชผ๊ฐœ๋Š” ๋ฆฌํŒฉํ† ๋ง์˜ ํ•ต์‹ฌ ์ด๋ก ์  ๋ฐฐ๊ฒฝ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค [24, 25]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ธฐ๋Šฅ์  ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ์ธํ„ฐํŽ˜์ด์Šค(Props)๋ฅผ ์–ด๋–ป๊ฒŒ ๋ถ„๋ฆฌํ•˜๊ณ , ํ™•์žฅ์— ์—ด๋ ค์žˆ์œผ๋ฉด์„œ ์ˆ˜์ •์—๋Š” ๋‹ซํžŒ ์ฝ”๋“œ ์ž‘์„ฑ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ• [25, 26]. + +#### [๊ตฌํ˜„ ๋ฐ ํ™œ์šฉ ๋„๊ตฌ] +- [[Unit Testing]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ ๊ตฌ์กฐ๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ ๊ธฐ๋Šฅ์ด ๋ง๊ฐ€์ง€์ง€ ์•Š์•˜์Œ์„ ๋ณด์žฅํ•˜๋Š” ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„์ด์ž ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์•ˆ์ „๋ง ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค [3, 12]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ฝ”๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ๋” ์ž‘๊ณ  ๋…ผ๋ฆฌ์ ์ธ ๋ธ”๋ก ๋‹จ์œ„๋กœ ๋‚˜๋ˆ„์–ด(Triangulation) ์˜์กด์„ฑ ์—†์ด ๋…๋ฆฝ์ ์œผ๋กœ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ๋ฐฉ๋ฒ•๋ก  [9, 12]. + +- [[Custom Hooks]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์— ๋ณต์žกํ•˜๊ฒŒ ์–ฝํžŒ ์ƒํƒœ์™€ ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ ๋กœ์ง์„ ์™ธ๋ถ€๋กœ ์ถ”์ถœํ•˜๋Š” ๋ฆฌํŒฉํ† ๋ง์˜ ์ฃผ๋œ ๋‹จ์œ„์ด์ž ๋„๊ตฌ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค [9]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: UI ๋ Œ๋”๋ง ์ฑ…์ž„๊ณผ ๋น„์ฆˆ๋‹ˆ์Šค ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์ฑ…์ž„์„ ์–ด๋–ป๊ฒŒ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๊ฒฉ๋ฆฌํ•˜์—ฌ ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋Š”์ง€์˜ ์›๋ฆฌ [9, 10]. + +### Deeper Research Questions + +- ๋ฆฌํŒฉํ† ๋ง ๊ณผ์ •์—์„œ Feature-Sliced Design(FSD) ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋„์ž…ํ•  ๋•Œ, ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ(Feature)์—์„œ ๋™์‹œ์— ์š”๊ตฌ๋˜๋Š” ๊ต์ฐจ ๊ด€์‹ฌ์‚ฌ(Cross-cutting concerns) ๋กœ์ง์€ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋Š”๊ฐ€? +- ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ์ „๋ฌดํ•œ ๊ฑฐ๋Œ€ํ•œ ๋ ˆ๊ฑฐ์‹œ React ์•ฑ์„ ๋ฆฌํŒฉํ† ๋งํ•  ๋•Œ, ์–ด๋–ค ๋ถ€๋ถ„(์˜ˆ: ๊ณตํ†ต ์œ ํ‹ธ, UI ์ปดํฌ๋„ŒํŠธ, ์ „์—ญ ์ƒํƒœ ๋“ฑ)๋ถ€ํ„ฐ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋‘๊ณ  ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€๋ฅผ ํ™•๋ณดํ•ด์•ผ ํ•˜๋Š”๊ฐ€? +- ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ Context API ๊ธฐ๋ฐ˜ ์ „์—ญ ์ƒํƒœ๋ฅผ Zustand ๋“ฑ ํ˜„๋Œ€์  ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ๋กœ ์ ์ง„์ ์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์ƒํƒœ ๋™๊ธฐํ™” ๋ฌธ์ œ๋Š” ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- ๊ธฐ์กด์˜ ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜(`useMemo`, `useCallback`) ์ฝ”๋“œ๊ฐ€ ๋งŽ์€ ๋ ˆ๊ฑฐ์‹œ ์•ฑ์— React Compiler๋ฅผ ๋„์ž…ํ•˜๊ธฐ ์œ„ํ•ด ์ฝ”๋“œ ๋‚ด์˜ 'Rules of React' ์œ„๋ฐ˜ ์‚ฌํ•ญ์„ ์ถ”์ ํ•˜๊ณ  ๊ฒ€์ฆํ•˜๋Š” ํšจ๊ณผ์ ์ธ ์ž๋™ํ™” ํ”„๋กœ์„ธ์Šค๋Š” ๋ฌด์—‡์ธ๊ฐ€? +- ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์™€ ์ปค์Šคํ…€ ํ›… ๊ตฌ์กฐ๋กœ ๋ฆฌํŒฉํ† ๋งํ•  ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜(Memory Leaks) ํŒจํ„ด์„ ๊ฐ์ง€ํ•˜๊ณ  ๋ฐฉ์ง€ํ•˜๋Š” ๋””๋ฒ„๊น… ์ „๋žต๋ก ์€ ๋ฌด์—‡์ธ๊ฐ€? + +### Practical Application Contexts + +- **Implementation:** ๊ฑฐ๋Œ€ํ•œ ํผ ์ฒ˜๋ฆฌ๋‚˜ API ํŽ˜์นญ ๋กœ์ง์ด ๋ทฐ์™€ ๊ฒฐํ•ฉํ•˜์—ฌ 300์ค„์ด ๋„˜์–ด๊ฐ€๋Š” ๊ธฐ์กด ์ปดํฌ๋„ŒํŠธ๋ฅผ, ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)์— ๋”ฐ๋ผ ์ˆœ์ˆ˜ ๋ทฐ ์ปดํฌ๋„ŒํŠธ์™€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋‹ด์€ ์ปค์Šคํ…€ ํ›…์œผ๋กœ ์ถ”์ถœํ•˜์—ฌ ๋‹ค์‹œ ์—ฐ๊ฒฐํ•œ๋‹ค [9, 25]. +- **System Design:** ํด๋” ๊ตฌ์กฐ๋ฅผ `components/`, `hooks/` ๊ฐ™์€ ํŒŒ์ผ ์œ ํ˜• ๊ตฌ๋ถ„์ด ์•„๋‹Œ, ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ(์˜ˆ: ์ธ์ฆ, ๊ฒฐ์ œ)์„ ์ค‘์‹ฌ์œผ๋กœ ๋ชจ์€ ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ํ˜น์€ FSD ๊ธฐ๋ฐ˜ ํด๋” ๊ณ„์ธต ๊ตฌ์กฐ๋กœ ์ „๋ฉด ์žฌ์„ค๊ณ„ํ•œ๋‹ค [8, 27]. +- **Operation / Maintenance:** ESLint์™€ Husky ๋“ฑ์˜ ๋„๊ตฌ๋ฅผ ํŒŒ์ดํ”„๋ผ์ธ์— ๊ตฌ์ถ•ํ•˜์—ฌ ๋ฆฌํŒฉํ† ๋ง๋œ ์ฝ”๋“œ๊ฐ€ ์ƒ์œ„ ๊ณ„์ธต์„ ์ž˜๋ชป ์ฐธ์กฐํ•˜๋Š” ์—ญ์˜์กด์„ฑ(Reverse dependency)์„ ๋ฐœ์ƒ์‹œํ‚ค๊ฑฐ๋‚˜ ์ฝ”๋“œ ์ปจ๋ฒค์…˜์ด ์–ด๊ธ‹๋‚˜์ง€ ์•Š๋„๋ก ์—„๊ฒฉํžˆ ํ†ต์ œํ•œ๋‹ค [28]. +- **Learning Path:** ๋ฆฌํŒฉํ† ๋งํ•ด์•ผ ํ•  ์ฝ”๋“œ๋ฅผ ํŒŒ์•…ํ•˜๊ธฐ ์ „, ๋จผ์ € ์ž‘์€ ๋นˆ ํ”„๋กœ์ ํŠธ๋‚˜ 'ํ† ์ด ์•ฑ'์„ ๋งŒ๋“ค์–ด ๋ฆฌํŒฉํ† ๋ง์— ๋„์ž…ํ•  ์ƒˆ๋กœ์šด ๊ธฐ์ˆ (React์˜ ์ตœ์‹  ๊ธฐ๋Šฅ ๋“ฑ)์˜ ๊ธฐ์ดˆ๋ฅผ ์‹ค์Šตํ•˜์—ฌ ๊ฐœ๋…์„ ํ™•๋ฆฝํ•œ๋‹ค [29]. +- **My Project Relevance:** ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค์ด ์ž‘์„ฑํ•œ ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฅผ ์ธ๊ณ„๋ฐ›์•„ ๋…ผ๋ฌธ ํ”„๋กœ์ ํŠธ์šฉ์œผ๋กœ ๋ฆฌํŒฉํ† ๋งํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ, ๋จผ์ € ๊ธฐ์กด ๋กœ์ง์„ ํŒŒ์•…ํ•˜๊ธฐ ์œ„ํ•œ ์œ ๋‹› ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•œ ํ›„, ๋ฌด๋ถ„๋ณ„ํ•˜๊ฒŒ ํ˜ผ์šฉ๋œ CSS ์Šคํƒ€์ผ ์ •์ฑ…์„ ํ•˜๋‚˜๋กœ ํ†ต์ผ์‹œํ‚ค๊ณ  ๋ถˆํ•„์š”ํ•œ ์ „์—ญ ์ƒํƒœ๋ฅผ ์ง€์—ญ ์ƒํƒœ๋กœ ์ „ํ™˜ํ•˜๋Š” ์‹ค๋ฌด ํ”„๋กœ์„ธ์Šค๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค [14, 16, 30, 31]. + +### Adjacent Topics + +- [[Web Performance Optimization]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋ฆฌํŒฉํ† ๋ง ์ž‘์—…๊ณผ ๋ณ‘ํ–‰ํ•˜์—ฌ ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ ๊ฐ์†Œ(์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…), ๋ฆฌ๋ Œ๋”๋ง ์ตœ์ ํ™”, ๋ถˆํ•„์š”ํ•œ ๋ Œ๋” ๋ธ”๋กœํ‚น ์ œ๊ฑฐ ๋“ฑ์„ ํ†ตํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋Ÿฐํƒ€์ž„ ๋ฐ ๋กœ๋”ฉ ์†๋„๋ฅผ ํ–ฅ์ƒํ•˜๋Š” ์ „๋žต์  ๊ธฐ๋ฒ•์„ ํƒ๊ตฌํ•œ๋‹ค. +- [[State Management Fragmentation]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋ ˆ๊ฑฐ์‹œ ์•ฑ์˜ ๊ฑฐ๋Œ€ํ•œ ๋‹จ์ผ ์ „์—ญ ์ƒํƒœ๋ฅผ ๋ถ„์„ํ•˜์—ฌ ๋กœ์ปฌ ์ปดํฌ๋„ŒํŠธ ์ƒํƒœ, ์ „์—ญ UI ์ƒํƒœ, ์„œ๋ฒ„ ์บ์‹œ ์ƒํƒœ, URL ์ƒํƒœ ๋“ฑ์œผ๋กœ ํŒŒํŽธํ™” ๋ฐ ์ „๋ฌธํ™”ํ•˜์—ฌ ๊ฐ๊ฐ์— ๋งž๋Š” ๋„๊ตฌ(Zustand, React Query ๋“ฑ)๋กœ ์ด๊ด€ํ•˜๋Š” ์„ค๊ณ„ ๋ฐฉ๋ฒ•๋ก ์„ ์กฐ์‚ฌํ•œ๋‹ค. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Topics_Blog/Lazy Loading.md b/10_Wiki/Topics_Blog/Lazy Loading.md new file mode 100644 index 00000000..8756a85b --- /dev/null +++ b/10_Wiki/Topics_Blog/Lazy Loading.md @@ -0,0 +1,63 @@ +# [[Lazy Loading]] + +## ๐Ÿ“Œ Brief Summary +Lazy Loading์€ ๋ฆฌ์†Œ์Šค๋‚˜ ์ฝ”๋“œ ์ฒญํฌ๋ฅผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ดˆ๊ธฐ ๊ตฌ๋™ ์‹œ ํ•œ ๋ฒˆ์— ๋กœ๋“œํ•˜์ง€ ์•Š๊ณ , ์‚ฌ์šฉ์ž๊ฐ€ ์‹ค์ œ๋กœ ํ•„์š”๋กœ ํ•˜๋Š” ์‹œ์ ์— ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค [1, 2]. ํ”„๋ก ํŠธ์—”๋“œ ํ™˜๊ฒฝ์—์„œ๋Š” ์ดˆ๊ธฐ JavaScript ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ตœ๋Œ€ 20~70%๊นŒ์ง€ ์ค„์—ฌ ์ดˆ๊ธฐ ํŽ˜์ด์ง€ ๋กœ๋“œ ์‹œ๊ฐ„์„ ํš๊ธฐ์ ์œผ๋กœ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค [3]. ์ฃผ๋กœ ๊ฒฝ๋กœ(Route) ๊ธฐ๋ฐ˜ ์ปดํฌ๋„ŒํŠธ, ๋ฌด๊ฑฐ์šด UI ์œ„์ ฏ(์ฐจํŠธ ๋“ฑ), ๋ทฐํฌํŠธ ํ•˜๋‹จ์˜ ์ด๋ฏธ์ง€ ๋“ฑ์— ์ ์šฉ๋˜์–ด ์•ฑ์˜ ์ „๋ฐ˜์ ์ธ ๋ฐ˜์‘์„ฑ๊ณผ Core Web Vitals ์ง€ํ‘œ๋ฅผ ๊ฐœ์„ ํ•ฉ๋‹ˆ๋‹ค [4, 5]. + +## ๐Ÿ“– Core Content +* **JavaScript ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…๊ณผ ๋™์  ์ž„ํฌํŠธ(Dynamic Imports)**: Lazy Loading์€ ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์˜จ๋””๋งจ๋“œ(on-demand)๋กœ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋Š” ๋” ์ž‘์€ ์ฒญํฌ(chunk)๋กœ ๋ถ„ํ• ํ•˜๋Š” ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…(Code Splitting) ๊ธฐ๋ฒ•์˜ ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค [2]. ๋™์  ์ž„ํฌํŠธ๋ฅผ ํ†ตํ•ด Vite๋‚˜ Webpack ๊ฐ™์€ ๋นŒ๋“œ ํˆด์ด ๋ Œ๋”๋ง์— ๋‹น์žฅ ํ•„์š”ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๋ฅผ ๋ฉ”์ธ ๋ฒˆ๋“ค์—์„œ ๋ถ„๋ฆฌํ•˜์—ฌ ๋…๋ฆฝ์ ์ธ ํŒŒ์ผ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค [1, 6, 7]. +* **React ํ™˜๊ฒฝ์—์„œ์˜ ๊ตฌํ˜„ (`React.lazy` ๋ฐ `Suspense`)**: React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” `React.lazy()` ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ปดํฌ๋„ŒํŠธ์˜ ์ง€์—ฐ ๋กœ๋”ฉ์„ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค [8]. ๋ชจ๋“ˆ์ด ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ๋‹ค์šด๋กœ๋“œ๋˜๋Š” ๋™์•ˆ ํ™”๋ฉด์ด ๋ฉˆ์ถ”๊ฑฐ๋‚˜ ๋น„์–ด ๋ณด์ด์ง€ ์•Š๋„๋ก, ``๋ฅผ ๊ฐ์‹ธ์„œ ๋กœ๋”ฉ ์Šคํ”ผ๋„ˆ์™€ ๊ฐ™์€ ๋Œ€์ฒด UI(Fallback UI)๋ฅผ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค [7, 8]. +* **๋ผ์šฐํŠธ ๋ ˆ๋ฒจ ๋ฐ ์ปดํฌ๋„ŒํŠธ ๋ ˆ๋ฒจ ์ง€์—ฐ ๋กœ๋”ฉ**: ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ๋ฐฉ์‹์€ ๋ผ์šฐํŠธ ๋ ˆ๋ฒจ์—์„œ ์ ์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ, ์‚ฌ์šฉ์ž๊ฐ€ ํŠน์ • ํŽ˜์ด์ง€๋กœ ๋„ค๋น„๊ฒŒ์ด์…˜ํ•  ๋•Œ๋งŒ ํ•ด๋‹น ํŽ˜์ด์ง€์˜ JavaScript ์ฒญํฌ๊ฐ€ ๋‹ค์šด๋กœ๋“œ๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค [2, 7]. ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„๋กœ๋Š” ์„œ๋“œํŒŒํ‹ฐ ํ†ตํ•ฉ ๊ธฐ๋Šฅ(๋น„๋””์˜ค ํ”Œ๋ ˆ์ด์–ด, PDF ๋ทฐ์–ด ๋“ฑ)์ด๋‚˜ ์ฐจํŠธ, ๋ฆฌ์น˜ ํ…์ŠคํŠธ ์—๋””ํ„ฐ ๊ฐ™์ด ๋ฌด๊ฑฐ์šด UI ๋ธ”๋ก์— ์ ์šฉํ•˜์—ฌ ๋ฉ”์ธ ๋ฒˆ๋“ค์„ ์ตœ์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค [5, 6]. +* **์ด๋ฏธ์ง€(Media) ์ตœ์ ํ™”**: JavaScript ์ฝ”๋“œ๋ฟ ์•„๋‹ˆ๋ผ ๋ฏธ๋””์–ด ๋ฆฌ์†Œ์Šค์—๋„ Lazy Loading์ด ๋„๋ฆฌ ์“ฐ์ž…๋‹ˆ๋‹ค [4]. HTML `` ํƒœ๊ทธ์— ๋„ค์ดํ‹ฐ๋ธŒ ์†์„ฑ์ธ `loading="lazy"`๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด, ์Šคํฌ๋กค์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž์˜ ๋ทฐํฌํŠธ์— ๋„๋‹ฌํ•˜๊ธฐ ์ „๊นŒ์ง€ ์ด๋ฏธ์ง€๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ดˆ๊ธฐ ํŽ˜์ด์ง€ ๋กœ๋”ฉ์˜ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ค„์ž…๋‹ˆ๋‹ค [4]. + +## โš–๏ธ Trade-offs & Caveats +* **์ดˆ๊ธฐ ๋ทฐํฌํŠธ(Above-the-fold) ์ฝ˜ํ…์ธ  ์ ์šฉ ๊ธˆ์ง€**: ์ง€์—ฐ ๋กœ๋”ฉ์€ ์Šคํฌ๋กค ์—†์ด ์ฒ˜์Œ ํ™”๋ฉด์— ๋ฐ”๋กœ ๋ณด์—ฌ์•ผ ํ•˜๋Š” ํ•ต์‹ฌ ์ฝ˜ํ…์ธ (Above-the-fold)๋‚˜ ์ฆ‰์‹œ ์ƒํ˜ธ์ž‘์šฉํ•ด์•ผ ํ•˜๋Š” ๋ Œ๋”๋ง์ด ๋น ๋ฅธ ์š”์†Œ์—๋Š” ์ ˆ๋Œ€ ์ ์šฉํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค [5]. ์ด๋ฅผ ์ ์šฉํ•  ๊ฒฝ์šฐ ์ดˆ๊ธฐ ํŽ˜์ธํŠธ ์‹œ๊ฐ„์ด ๋А๋ ค์ง€๊ณ  ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์ด ์‹ฌ๊ฐํ•˜๊ฒŒ ์ €ํ•˜๋ฉ๋‹ˆ๋‹ค [5, 9]. +* **์‚ฌ์šฉ์ž ์ธํ„ฐ๋ž™์…˜ ์‹œ ์ผ์‹œ์  ์ง€์—ฐ ๋ฐœ์ƒ**: ์ง€์—ฐ ๋กœ๋”ฉ๋œ ๊ธฐ๋Šฅ์ด๋‚˜ ํŽ˜์ด์ง€์— ์‚ฌ์šฉ์ž๊ฐ€ ์ฒ˜์Œ ์ ‘๊ทผํ•  ๋•Œ, ๋ธŒ๋ผ์šฐ์ €๋Š” ํ•„์š”ํ•œ ์Šคํฌ๋ฆฝํŠธ ์ฒญํฌ๋ฅผ ๊ทธ์ œ์•ผ ๋„คํŠธ์›Œํฌ๋กœ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค [7, 8, 10]. ์ด๋กœ ์ธํ•ด ์•ฝ๊ฐ„์˜ ๋Œ€๊ธฐ ์‹œ๊ฐ„์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ``๋ฅผ ํ†ตํ•œ ํด๋ฐฑ ์ƒํƒœ๋ฅผ ์„ธ์‹ฌํ•˜๊ฒŒ ๋””์ž์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [8, 11]. +* **๊ณผ๋„ํ•œ ํŒŒํŽธํ™”(Over-fragmentation) ์ฃผ์˜**: ํฌ๊ธฐ๊ฐ€ ์ž‘๊ณ  ๊ฐ€๋ฒผ์šด ๊ธฐ๋Šฅ๊นŒ์ง€ ๋ชจ๋‘ ์ง€์—ฐ ๋กœ๋”ฉ์œผ๋กœ ๋ถ„๋ฆฌํ•  ๊ฒฝ์šฐ, ์˜คํžˆ๋ ค ๋ธŒ๋ผ์šฐ์ €์˜ ๋„คํŠธ์›Œํฌ ์š”์ฒญ ํšŸ์ˆ˜๊ฐ€ ๊ธ‰์ฆํ•˜๊ณ  ๊ด€๋ฆฌํ•ด์•ผ ํ•  ๋กœ๋”ฉ ์ƒํƒœ(`Suspense`)๊ฐ€ ๋งŽ์•„์ ธ ์„ฑ๋Šฅ ๋ฐ ๊ฐœ๋ฐœ ํšจ์œจ์„ ๋–จ์–ด๋œจ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5, 12]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] +- [[Code Splitting]] + - ์—ฐ๊ฒฐ ์ด์œ : Lazy Loading์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋‹จ์ผ JavaScript ๋ฒˆ๋“ค์„ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž‘์€ ์ฒญํฌ ๋‹จ์œ„๋กœ ๋‚˜๋ˆ„๋Š” ๊ทผ๋ณธ์ ์ธ ๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [2, 13]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ชจ๋˜ ํ”„๋ก ํŠธ์—”๋“œ ํ™˜๊ฒฝ์—์„œ ๋นŒ๋“œ ํˆด(Vite, Webpack)์ด ๋Ÿฐํƒ€์ž„ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด ์ฝ”๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ๋ถ„ํ• ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [6, 7]. + +- [[Dynamic Imports]] + - ์—ฐ๊ฒฐ ์ด์œ : ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ชจ๋“ˆ์„ ํŒŒ์ผ์˜ ์ตœ์ƒ๋‹จ์—์„œ ์ •์ ์œผ๋กœ ๋ถˆ๋Ÿฌ์˜ค์ง€ ์•Š๊ณ , ์‹คํ–‰ ์ค‘์— ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ์œ„ํ•ด `import()` ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค [1, 7]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ผ์šฐํŠธ ์ „ํ™˜์ด๋‚˜ ํŠน์ • ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ์ ์— ํ•„์š”ํ•œ ์ฝ”๋“œ๋งŒ ๋„คํŠธ์›Œํฌ๋กœ ํ˜ธ์ถœํ•˜๋Š” ๋Ÿฐํƒ€์ž„ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [7]. + +#### [๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ] +- [[React Suspense]] + - ์—ฐ๊ฒฐ ์ด์œ : `React.lazy()`๋ฅผ ์ด์šฉํ•ด ์ง€์—ฐ ๋กœ๋”ฉ์„ ์ˆ˜ํ–‰ํ•  ๋•Œ, ์ฒญํฌ๊ฐ€ ๋กœ๋“œ๋˜๊ธฐ ์ „๊นŒ์ง€ ๋ Œ๋”๋ง์„ ์ผ์‹œ ์ค‘์ง€ํ•˜๊ณ  Fallback UI๋ฅผ ํ™”๋ฉด์— ๊ทธ๋ ค์ฃผ๋Š” ํ•ต์‹ฌ ์ปดํฌ๋„ŒํŠธ์ž…๋‹ˆ๋‹ค [7, 8]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋น„๋™๊ธฐ UI ๋กœ๋”ฉ ์‹œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜(UX)์„ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๋ Œ๋”๋ง ์ œ์–ด ๋ฐ ๋กœ๋”ฉ ์ƒํƒœ ์„ค๊ณ„ ํŒจํ„ด์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [8, 11]. + +- [[Vite manualChunks]] + - ์—ฐ๊ฒฐ ์ด์œ : Vite๋ฅผ ํ†ตํ•ด ๋นŒ๋“œํ•  ๋•Œ, ๋ณ€๊ฒฝ์ด ์žฆ์ง€ ์•Š์€ ๋ฌด๊ฑฐ์šด ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(React ์ฝ”์–ด ๋“ฑ)๋ฅผ Lazy Loading์˜ ์ฒญํฌ ๋ถ„ํ•  ์ „๋žต๊ณผ ๊ฒฐํ•ฉํ•ด ๋ณ„๋„ ํŒŒ์ผ๋กœ ๋…๋ฆฝ์‹œํ‚ค๋Š” ํ™˜๊ฒฝ ์„ค์ •์ž…๋‹ˆ๋‹ค [7, 14]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ธŒ๋ผ์šฐ์ € ์บ์‹ฑ ์ „๋žต์„ ๊ทน๋Œ€ํ™”ํ•˜๊ณ , ์ดˆ๊ธฐ ๋ฒˆ๋“ค ์šฉ๋Ÿ‰ ๊ฒฝ๊ณ ("Large Chunks") ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ๋ฒˆ๋“ค๋Ÿฌ ์ตœ์ ํ™” ๋ฐฉ๋ฒ•์„ ํ•™์Šตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [7, 15]. + +### Deeper Research Questions + +- React 18์˜ ๋™์‹œ์„ฑ ๋ Œ๋”๋ง(Concurrent Rendering) ๊ธฐ๋Šฅ์ธ `useTransition` ๋“ฑ์€ ์ง€์—ฐ ๋กœ๋”ฉ ์‹œ ๋ฐœ์ƒํ•˜๋Š” UI ๋ฉˆ์ถค ํ˜„์ƒ์„ ์–ด๋–ป๊ฒŒ ๋ณด์™„ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? [16, 17] +- ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ์ €ํ•˜๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด ์ง€์—ฐ ๋กœ๋”ฉ๋˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉ์ž๊ฐ€ ํด๋ฆญํ•˜๊ธฐ ์ง์ „์— ๋ฏธ๋ฆฌ ๊ฐ€์ ธ์˜ค๋Š” Prefetching ์ „๋žต์€ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•˜๋Š”๊ฐ€? [18, 19] +- Next.js์˜ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ ์ง€์—ฐ ๋กœ๋”ฉ๊ณผ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ(RSC) ์•„ํ‚คํ…์ฒ˜๋Š” ์ดˆ๊ธฐ ๋ฒˆ๋“ค ์ตœ์ ํ™” ์ธก๋ฉด์—์„œ ์–ด๋–ค ์ฐจ์ด์ ๊ณผ ์‹œ๋„ˆ์ง€๋ฅผ ๊ฐ€์ง€๋Š”๊ฐ€? [5, 20, 21] +- ๋ฌด๊ฑฐ์šด UI ๋ธ”๋ก์„ ์ง€์—ฐ ๋กœ๋”ฉํ•  ๋•Œ, `rollup-plugin-visualizer`์™€ ๊ฐ™์€ ๋ฒˆ๋“ค ๋ถ„์„ ๋„๊ตฌ๋ฅผ ํ†ตํ•ด ์ง€์—ฐ ๋กœ๋”ฉ ๋Œ€์ƒ์„ ์–ด๋–ป๊ฒŒ ํšจ๊ณผ์ ์œผ๋กœ ์‹๋ณ„ํ•˜๊ณ  ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ •ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? [10, 12] +- ๋„ค์ดํ‹ฐ๋ธŒ ๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋Šฅ์ธ `loading="lazy"` ์†์„ฑ๊ณผ JavaScript ๊ธฐ๋ฐ˜์˜ Intersection Observer API๋ฅผ ํ™œ์šฉํ•œ ๋ฏธ๋””์–ด ์ง€์—ฐ ๋กœ๋”ฉ์˜ ์„ฑ๋Šฅ ์ตœ์ ํ™” ํ•œ๊ณ„์ ๊ณผ Trade-off๋Š” ๋ฌด์—‡์ธ๊ฐ€? [4] + +### Practical Application Contexts + +- **Implementation:** React ์ฝ”๋“œ ์ƒ๋‹จ์˜ ๋ฌด๊ฑฐ์šด ์™ธ๋ถ€ ์ปดํฌ๋„ŒํŠธ(์˜ˆ: ์—๋””ํ„ฐ, ์ฐจํŠธ ๋“ฑ) import ๋ฌธ์„ ์ง€์šฐ๊ณ , `const Dashboard = React.lazy(() => import('./Dashboard'));`์™€ ๊ฐ™์ด ๋ณ€๊ฒฝํ•œ ํ›„ ๋ Œ๋”๋ง ์˜์—ญ์„ `}>`๋กœ ๊ฐ์Œ‰๋‹ˆ๋‹ค [1, 6-8]. +- **System Design:** ํ”„๋ก ํŠธ์—”๋“œ ๋ผ์šฐํŒ… ๋ฐ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ ์‹œ๋ถ€ํ„ฐ, ํ•„์ˆ˜ ์ดˆ๊ธฐ ์ง„์ž… ํ™”๋ฉด(Above-the-fold)์€ ์ฆ‰์‹œ ๋กœ๋“œํ•˜๊ณ , ๊ด€๋ฆฌ์ž ํŒจ๋„์ด๋‚˜ ์ž˜ ์“ฐ์ด์ง€ ์•Š๋Š” ๋ผ์šฐํŠธ๋Š” ๋ถ„๋ฆฌํ•˜์—ฌ Code Splitting๋˜๋„๋ก ์‹œ์Šคํ…œ์˜ ๋ฒˆ๋“ค๋ง ์ „๋žต์„ ๊ตฌ์ƒํ•ฉ๋‹ˆ๋‹ค [5, 12, 14]. +- **Operation / Maintenance:** ์šด์˜ ์ค‘์ธ ์„œ๋น„์Šค๊ฐ€ ๋ฌด๊ฑฐ์›Œ์ง€๊ฑฐ๋‚˜ Vite ๋นŒ๋“œ ์‹œ "500 kB ์ดˆ๊ณผ ์ฒญํฌ" ๊ฒฝ๊ณ ๊ฐ€ ๋œฐ ๊ฒฝ์šฐ, ๋ฒˆ๋“ค ๋ถ„์„ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ด ๋ฉ”์ธ ๋ฒˆ๋“ค์—์„œ ๋ถ„๋ฆฌ ๊ฐ€๋Šฅํ•œ ๋ฌด๊ฑฐ์šด ๋ฒค๋”๋‚˜ ํŠน์ • ๋ผ์šฐํŠธ๋ฅผ ์‹๋ณ„ํ•ด ์ ์ง„์ ์œผ๋กœ Lazy Loading์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค [10, 12, 15]. +- **Learning Path:** React ๊ธฐ์ดˆ ๋ Œ๋”๋ง ์‚ฌ์ดํด ํ•™์Šต โž” JavaScript ๋ชจ๋“ˆ ๋ฐ ๋ฒˆ๋“ค๋Ÿฌ ๊ตฌ์กฐ ์ดํ•ด โž” `React.lazy`์™€ `Suspense`๋ฅผ ํ†ตํ•œ ๋ผ์šฐํŠธ ์Šคํ”Œ๋ฆฌํŒ… ์ ์šฉ โž” Chrome ์„ฑ๋Šฅ ํƒญ๊ณผ Web Vitals๋กœ ์‹ค์ œ ๋กœ๋“œ ์†๋„ ์ธก์ • ๋ฐ ๊ฒ€์ฆ [13, 22, 23]. +- **My Project Relevance:** ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ทœ๋ชจ๊ฐ€ ์ปค์ง์— ๋”ฐ๋ผ ํ•„์—ฐ์ ์œผ๋กœ ์ฆ๊ฐ€ํ•˜๋Š” JavaScript ํŽ˜์ด๋กœ๋“œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ , FCP(First Contentful Paint)์™€ TTI(Time to Interactive) ๋“ฑ ํ•ต์‹ฌ ์„ฑ๋Šฅ ์ง€ํ‘œ๋ฅผ ๋ฐฉ์–ดํ•˜๊ธฐ ์œ„ํ•œ ํ•„์ˆ˜์ ์ธ ๋ Œ๋”๋ง ์ตœ์ ํ™” ์ „๋žต์ž…๋‹ˆ๋‹ค [3, 8]. + +### Adjacent Topics + +- [[Core Web Vitals]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ์ง€์—ฐ ๋กœ๋”ฉ์ด ๊ฒ€์ƒ‰ ์—”์ง„ ์ตœ์ ํ™”(SEO) ๋ฐ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ์ง€ํ‘œ์ธ FCP, LCP(Largest Contentful Paint), INP(Interaction to Next Paint) ์ˆ˜์น˜๋ฅผ ์‹ค์ œ๋กœ ์–ผ๋งˆ๋‚˜ ๊ฐœ์„ ํ•˜๋Š”์ง€ ์ธก์ • ๋ฐ ๋ถ„์„ํ•˜๋Š” ๊ด€์ ์œผ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3, 23, 24]. +- [[Server Components (RSC)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํฌ๊ธฐ๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•œ ๋˜ ๋‹ค๋ฅธ ํ˜„๋Œ€์  ํŒจ๋Ÿฌ๋‹ค์ž„์œผ๋กœ, ํด๋ผ์ด์–ธํŠธ์—์„œ ์‹คํ–‰๋  ์ฝ”๋“œ๋ฅผ ์•„์˜ˆ ์„œ๋ฒ„์—์„œ ๋ Œ๋”๋งํ•˜๊ณ  HTML๋กœ๋งŒ ๋ณด๋‚ด๋Š” ๋ฐฉ์‹๊ณผ Lazy Loading๊ณผ์˜ ์—ญํ• ์„ ๋น„๊ต/๋Œ€์กฐํ•ฉ๋‹ˆ๋‹ค [20, 21]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Topics_Blog/Next.js App Router.md b/10_Wiki/Topics_Blog/Next.js App Router.md new file mode 100644 index 00000000..43ddac1f --- /dev/null +++ b/10_Wiki/Topics_Blog/Next.js App Router.md @@ -0,0 +1,54 @@ +# [[Next.js App Router]] + +## ๐Ÿ“Œ Brief Summary +Next.js App Router๋Š” Next.js(๋ฒ„์ „ 13 ์ดํ›„)์—์„œ ๋„์ž…๋œ ์ตœ์‹  ๋ผ์šฐํŒ… ๋ฐ ์•„ํ‚คํ…์ฒ˜ ์‹œ์Šคํ…œ์œผ๋กœ, React Server Components(RSC)๋ฅผ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์›ํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ ์ธก ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ „์†ก๋Ÿ‰์„ ์ค„์ด๊ณ  ์ดˆ๊ธฐ ๋กœ๋”ฉ ์†๋„๋ฅผ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค [1, 2]. ์ด ์‹œ์Šคํ…œ์€ `app` ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•˜๋ฉฐ, `page.js`, `layout.js`์™€ ๊ฐ™์€ ํŠน์ˆ˜ ํŒŒ์ผ๋“ค์„ ํ†ตํ•ด ์ง๊ด€์ ์ด๊ณ  ๊ตฌ์กฐํ™”๋œ ๋ผ์šฐํŒ…์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [3, 4]. + +## ๐Ÿ“– Core Content + +* **ํŠน์ˆ˜ ํŒŒ์ผ์„ ํ™œ์šฉํ•œ ๊ตฌ์กฐ์  ๋ผ์šฐํŒ…**: Next.js App Router๋Š” ๋ผ์šฐํŠธ ๊ตฌ์„ฑ ๋ฐ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ํŠน์ˆ˜ ํŒŒ์ผ ๋ช…๋ช… ๊ทœ์น™์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ผ์šฐํŠธ๋Š” `page.js`๋กœ, ๊ณต์œ  ๋ ˆ์ด์•„์›ƒ์€ `layout.js`๋กœ, ์‚ฌ์šฉ์ž ์ •์˜ ์—๋Ÿฌ๋Š” `error.js`๋กœ, ๋กœ๋”ฉ ์ƒํƒœ๋Š” `loading.js`๋กœ ์ •์˜ํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋™์ž‘์„ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค [3]. +* **๋™์  ๋ผ์šฐํŠธ ๋ฐ ๋ผ์šฐํŠธ ๊ทธ๋ฃน**: ๋™์ ์ธ ๊ฒฝ๋กœ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด `[param]`์„ ์‚ฌ์šฉํ•˜๊ณ , ํฌ๊ด„์ (catch-all) ๋ผ์šฐํŠธ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด `[...param]`์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค [3]. ๋˜ํ•œ URL ๊ตฌ์กฐ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ณ  ๋…ผ๋ฆฌ์ ์œผ๋กœ ๋ผ์šฐํŠธ๋ฅผ ๊ทธ๋ฃนํ™”ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ผ์šฐํŠธ ๊ทธ๋ฃน(์˜ˆ: `(folderName)`) ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์—ฌ, ๊ธฐ๋Šฅ๋ณ„ ๋˜๋Š” ํŒ€๋ณ„๋กœ ์ฝ”๋“œ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์กฐ์งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5]. +* **React Server Components (RSC) ํ†ตํ•ฉ**: App Router๋Š” ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ •์ ์ด๊ฑฐ๋‚˜ ๋ฐ์ดํ„ฐ ์ฃผ๋„์ ์ธ(read-only) UI๋Š” ํด๋ผ์ด์–ธํŠธ ์ธก ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—†์ด ์„œ๋ฒ„์—์„œ๋งŒ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ์–ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค ํฌ๊ธฐ์™€ Hydration ์†Œ์š” ์‹œ๊ฐ„์„ ๊ทน๋Œ€ํ™”ํ•˜์—ฌ ์ค„์—ฌ์ค๋‹ˆ๋‹ค [2, 6, 7]. +* **ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„์˜ ์—ญํ•  ๋ถ„๋ฆฌ**: ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” ์ƒํƒœ(state), `useEffect`, ํด๋ผ์ด์–ธํŠธ ์ „์šฉ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค [8]. ๋”ฐ๋ผ์„œ ์ƒํ˜ธ์ž‘์šฉ์ด ์ฆ‰๊ฐ์ ์œผ๋กœ ํ•„์š”ํ•œ UI(๋ชจ๋‹ฌ, ์ž…๋ ฅ์ฐฝ ๋“ฑ)์—๋งŒ ํŒŒ์ผ ์ƒ๋‹จ์— `use client` ์ง€์‹œ์–ด๋ฅผ ์„ ์–ธํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ๋กœ ๋งŒ๋“ค๊ณ , ๋‚˜๋จธ์ง€๋Š” ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค [7, 9]. +* **๋™์‹œ์„ฑ ๋ Œ๋”๋ง(Concurrent Rendering) ์™„๋ฒฝ ์ง€์›**: App Router๋Š” React 18์˜ ๋™์‹œ์„ฑ ๊ธฐ๋Šฅ๊ณผ ์™„๋ฒฝํ•˜๊ฒŒ ํ†ตํ•ฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. `useTransition` ๋ฐ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค์˜ ์‘๋‹ต์„ฑ์„ ๋–จ์–ด๋œจ๋ฆฌ์ง€ ์•Š๊ณ  ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์„ ํšจ๊ณผ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [10]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +- [[React Server Components]] + - ์—ฐ๊ฒฐ ์ด์œ : Next.js App Router ์•„ํ‚คํ…์ฒ˜์˜ ํ•ต์‹ฌ ๊ธฐ๋ฐ˜์œผ๋กœ, ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ค„์ด๊ณ  ๋ฐ์ดํ„ฐ ํŽ˜์นญ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค [1, 2]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํด๋ผ์ด์–ธํŠธ ์ธก ๋ Œ๋”๋ง ์ฝ”๋“œ์™€ ์„œ๋ฒ„ ์ธก ๋ Œ๋”๋ง ์ฝ”๋“œ ๊ฐ„์˜ ๋ช…ํ™•ํ•œ ๊ฒฝ๊ณ„ ๊ตฌ๋ถ„ ๋ฐ Hydration ์ตœ์†Œํ™” ์ „๋žต [6, 7, 9]. + +- [[Route Groups]] + - ์—ฐ๊ฒฐ ์ด์œ : App Router ๋‚ด์—์„œ URL ๊ฒฝ๋กœ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ ๋„ ํด๋” ๊ตฌ์กฐ๋ฅผ ๋…ผ๋ฆฌ์ ์œผ๋กœ ์กฐ์งํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ํ•ต์‹ฌ ํด๋” ๋ผ์šฐํŒ… ํŒจํ„ด์ž…๋‹ˆ๋‹ค [5, 11]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ณต์žกํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ณ„๋„์˜ ๋ ˆ์ด์•„์›ƒ์„ ๊ฐ€์ง„ ์„น์…˜(์˜ˆ: ๋งˆ์ผ€ํŒ… ํŽ˜์ด์ง€์™€ ์ƒ์  ํŽ˜์ด์ง€)์„ ์ถฉ๋Œ ์—†์ด ๋…๋ฆฝ์ ์œผ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ• [5, 11]. + +- [[Concurrent Rendering]] + - ์—ฐ๊ฒฐ ์ด์œ : Next.js App Router๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์™„๋ฒฝํ•˜๊ฒŒ ์ง€์›ํ•˜๋Š” React์˜ ๋ Œ๋”๋ง ๋ฉ”์ปค๋‹ˆ์ฆ˜์œผ๋กœ, ๋ Œ๋”๋ง ์ž‘์—…์„ ์ผ์‹œ ์ค‘์ง€, ์ค‘๋‹จ ๋ฐ ์žฌ๊ฐœํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค [10, 12]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: `useTransition` ๋ฐ `useDeferredValue` ํ›…์„ ํ†ตํ•ด ๋ฌด๊ฑฐ์šด ๋ Œ๋”๋ง ์‹œ์—๋„ ์‚ฌ์šฉ์ž ์ž…๋ ฅ ๋ฐ˜์‘์„ฑ(UX)์„ ๋†’๊ฒŒ ์œ ์ง€ํ•˜๋Š” ์›๋ฆฌ [13, 14]. + +### Deeper Research Questions + +- ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฃจํŠธ ๋ ˆ์ด์•„์›ƒ์„ ๊ฐ€์ง„ Route Groups ํ™˜๊ฒฝ์—์„œ ์ตœ์ƒ์œ„ `layout.js`๊ฐ€ ์—†์„ ๋•Œ, ๋‹ค๋ฅธ ๋ฃจํŠธ ๋ ˆ์ด์•„์›ƒ ๊ฐ„์˜ ๋„ค๋น„๊ฒŒ์ด์…˜ ์‹œ ๋ฐœ์ƒํ•˜๋Š” ์ „์ฒด ํŽ˜์ด์ง€ ๋กœ๋“œ(full page load)์˜ ๋‚ด๋ถ€ ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ๋ฌด์—‡์ธ๊ฐ€? [11] +- App Router์—์„œ `[param]` ํ˜•ํƒœ์˜ ๋™์  ๋ผ์šฐํŠธ์™€ Route Group ๊ฐ„์˜ ๊ฒฝ๋กœ ์ค‘๋ณต(์˜ˆ: `(marketing)/about/page.tsx`์™€ `(shop)/about/page.tsx`) ์ถฉ๋Œ ์‹œ, Next.js์˜ ๋ผ์šฐํŠธ ํ•ด์„ ์šฐ์„ ์ˆœ์œ„๋Š” ์–ด๋–ป๊ฒŒ ๊ฒฐ์ •๋˜๋Š”๊ฐ€? [11] +- ๊ธฐ์กด Pages Router ๋ฐฉ์‹๊ณผ ๋น„๊ตํ•˜์—ฌ App Router์˜ React Server Components๋Š” ๋ฐ์ดํ„ฐ ํŽ˜์นญ ์‹œ ์–ด๋–ป๊ฒŒ 'Double Fetching' ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๋Š”๊ฐ€? [7, 8] +- ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ(`use client`)์™€ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ˜ผํ•ฉ๋œ ํ˜•ํƒœ์˜ ํŠธ๋ฆฌ์—์„œ, ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ๋ฅผ `children`์œผ๋กœ ์ „๋‹ฌํ•˜๊ฑฐ๋‚˜ ์ž„ํฌํŠธํ•  ๋•Œ ์ ์šฉ๋˜๋Š” ์ง๋ ฌํ™” ๊ทœ์น™ ๋ฐ ํ•œ๊ณ„์ ์€ ๋ฌด์—‡์ธ๊ฐ€? [6, 7, 9] +- ํŠน์ˆ˜ ๋ผ์šฐํŒ… ํŒŒ์ผ ์ค‘ `error.js`๊ฐ€ React Error Boundary๋กœ์„œ ๋™์ž‘ํ•  ๋•Œ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ ์˜ค๋ฅ˜์™€ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ ์˜ค๋ฅ˜๋ฅผ ๊ฐ๊ฐ ์ฒ˜๋ฆฌํ•˜๋Š” ํ๋ฆ„์€ ์–ด๋–ป๊ฒŒ ๊ตฌ๋ถ„๋˜๋Š”๊ฐ€? [3] + +### Practical Application Contexts + +- **Implementation:** ๋ผ์šฐํŠธ๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ๋Š” `kebab-case` ๋ช…๋ช… ๊ทœ์น™์„ ์ ์šฉํ•œ ํด๋”(์˜ˆ: `auth-provider.tsx`)๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋ผ์šฐํŒ…ํ•˜๊ณ , ๋Œ€์‹œ๋ณด๋“œ์ฒ˜๋Ÿผ ์ •์ ์ธ ๋ ˆ์ด์•„์›ƒ์€ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋กœ ๋‘๋ฉด์„œ `AddToCartButton` ๊ฐ™์ด ์ƒํ˜ธ์ž‘์šฉ์ด ํ•„์š”ํ•œ ์œ„์ ฏ๋งŒ `use client` ์ปดํฌ๋„ŒํŠธ๋กœ ์ž„ํฌํŠธํ•˜์—ฌ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค [4, 7, 15]. +- **System Design:** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋ฅผ ์กฐ์งํ•  ๋•Œ, ๊ธฐ๋Šฅ๋ณ„(Feature-Based) ํด๋” ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ, ํŽ˜์ด์ง€, ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ํ•œ ๊ธฐ๋Šฅ ํด๋”(์˜ˆ: `features/auth/`)์— ๋ชจ์œผ๊ณ , ์ด๋ฅผ ๋‹ค์‹œ `Route Groups`๋ฅผ ํ†ตํ•ด ๋ชจ๋“ˆํ™”๋œ ์•„ํ‚คํ…์ฒ˜๋กœ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค [5, 16, 17]. +- **Operation / Maintenance:** ์ดˆ๊ธฐ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค ์šฉ๋Ÿ‰์ด ์ปค์ ธ INP(Interaction to Next Paint)์™€ TTI(Time to Interactive) ๋“ฑ ์ฝ”์–ด ์›น ๋ฐ”์ดํƒˆ ์ˆ˜์น˜๊ฐ€ ์ €ํ•˜๋  ๋•Œ, ์–ด๋–ค ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ๋กœ ๋กœ๋“œ๋˜์—ˆ๋Š”์ง€ ํŒŒ์•…ํ•˜์—ฌ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•˜๋Š” ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค [6, 18]. +- **Learning Path:** ์šฐ์„  React์˜ ๋ Œ๋”๋ง ๋ชจ๋ธ ํŠธ๋ฆฌ๊ฑฐ ์š”์ธ๊ณผ ์ƒํƒœ ๋ณ€ํ™” ์›๋ฆฌ๋ฅผ ์ˆ™์ง€ํ•˜๊ณ  [19], ์ดํ›„ React 18์˜ ๋™์‹œ์„ฑ ํ›…(`useTransition`) ๋™์ž‘์„ ์‹ค์Šตํ•œ ๋’ค [12, 13], Next.js App Router์˜ Server Components๋ฅผ ํ†ตํ•œ ์„œ๋ฒ„/ํด๋ผ์ด์–ธํŠธ ๊ฒฝ๊ณ„ ๊ฐœ๋…์„ ๋ฐฐ์šฐ๋Š” ์ˆœ์„œ๋กœ ์ ‘๊ทผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [2, 7]. +- **My Project Relevance:** ์†Œ์Šค์— ๊ด€๋ จ ์ •๋ณด๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. + +### Adjacent Topics + +- [[Code Splitting & Lazy Loading]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: App Router์˜ Server Components๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, `React.lazy`์™€ `Suspense`๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ๋ผ์šฐํŠธ ๋ฐ ๋ฌด๊ฑฐ์šด ์ปดํฌ๋„ŒํŠธ(์ฐจํŠธ, ์—๋””ํ„ฐ ๋“ฑ)๋ฅผ ํ•„์š”ํ•œ ์ˆœ๊ฐ„์—๋งŒ ๋กœ๋“œํ•˜๋„๋ก ์ตœ์ ํ™”ํ•˜๋Š” ๊ธฐ๋ฒ•์œผ๋กœ์˜ ์ดํ•ด ํ™•์žฅ [20, 21]. +- [[React Context API Optimization]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: App Router ํ™˜๊ฒฝ ํ•˜์˜ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ๋ถˆ๊ฐ€ํ”ผํ•˜๊ฒŒ ์ „์—ญ ์ƒํƒœ๋ฅผ ์“ธ ๋•Œ, Context์˜ ๊ด‘๋ฒ”์œ„ํ•œ ๋ฆฌ๋ Œ๋”๋ง ์ด์Šˆ๋ฅผ ํšŒํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์ปจํ…์ŠคํŠธ๋ฅผ ๋ถ„๋ฆฌํ•˜๊ฑฐ๋‚˜ Zustand, Jotai ๋“ฑ์˜ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋„์ž…ํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ํ•™์Šต ํ™•์žฅ [22-24]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Topics_Blog/Prop Drilling.md b/10_Wiki/Topics_Blog/Prop Drilling.md new file mode 100644 index 00000000..aea73383 --- /dev/null +++ b/10_Wiki/Topics_Blog/Prop Drilling.md @@ -0,0 +1,56 @@ +# [[Prop Drilling]] + +## ๐Ÿ“Œ Brief Summary +Prop Drilling์€ ์‹ค์ œ๋กœ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์€ ์—ฌ๋Ÿฌ ์ค‘๊ฐ„ ์ปดํฌ๋„ŒํŠธ๋“ค์„ ๊ฑฐ์ณ ๊ณ„์ธต์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ์•ˆํ‹ฐ ํŒจํ„ด์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค [1]. ์ฃผ๋กœ ๊นŠ๊ฒŒ ์ค‘์ฒฉ๋œ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์— ์ƒํƒœ๋‚˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•  ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [1]. React ์ƒํƒœ๊ณ„์—์„œ๋Š” ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋‚ด์žฅ๋œ Context API๋‚˜ ์™ธ๋ถ€ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค [1, 2]. + +## ๐Ÿ“– Core Content +* **์ž‘๋™ ๋ฐฉ์‹ ๋ฐ ์›์ธ:** Prop Drilling์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ ๊นŠ์ด ์ค‘์ฒฉ๋œ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋กœ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด, ์ค‘๊ฐ„์— ์œ„์น˜ํ•œ ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ์˜ props๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ํ†ต๊ณผ์‹œํ‚ค๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค [1]. +* **๊ตฌ์กฐ์  ๋ฌธ์ œ์ :** ์ด ํŒจํ„ด์€ ์ค‘๊ฐ„ ์ปดํฌ๋„ŒํŠธ๋“ค์ด ์ž์‹ ์—๊ฒŒ ํ•„์š” ์—†๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋‹จ์ง€ ์ „๋‹ฌ(transport)ํ•˜๊ธฐ ์œ„ํ•œ ๋ชฉ์ ์œผ๋กœ ์ทจ๊ธ‰ํ•˜๊ฒŒ ๋งŒ๋“ค๋ฉฐ, ์ด๋Š” ์ฝ”๋“œ์˜ ๋ณต์žก์„ฑ์„ ๋†’์ด๊ณ  ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค [1]. +* **React์˜ ๋‚ด์žฅ ํ•ด๊ฒฐ์ฑ…:** React๋Š” ์ด๋Ÿฌํ•œ ํ˜„์ƒ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด 'Context API'๋ฅผ ๋„์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ์˜ ๋ชจ๋“  ๋ ˆ๋ฒจ์„ ๊ฑฐ์น˜์ง€ ์•Š๊ณ ๋„ ์ „์—ญ ๊ด€์‹ฌ์‚ฌ(global concerns) ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘์ ์œผ๋กœ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์™€ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1, 3, 4]. +* **ํŒŒ์ƒ ์ƒํƒœ ์ฒ˜๋ฆฌ์˜ ํ•œ๊ณ„:** Redux๋‚˜ Zustand๊ฐ€ ํŒŒ์ƒ ์ƒํƒœ๋ฅผ ์œ„ํ•œ ์„ ํƒ์ž(derived selectors)๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒƒ๊ณผ ๋‹ฌ๋ฆฌ, Context๋Š” ํŒŒ์ƒ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•  ๋•Œ ์—ฌ์ „ํžˆ Prop Drilling ๋ฐฉ์‹์— ์˜์กดํ•˜๊ฒŒ ๋˜๊ฑฐ๋‚˜ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ํ”ผํ•˜๊ธฐ ์–ด๋ ค์šด ๊ธฐ๋Šฅ์  ํ•œ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค [5]. + +## โš–๏ธ Trade-offs & Caveats +Prop Drilling์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ€์žฅ ๋จผ์ € ๊ณ ๋ ค๋˜๋Š” Context API๋Š” ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ณ€๊ฒฝ๋˜๋Š” ์ƒํƒœ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ์‹ฌ๊ฐํ•œ ์„ฑ๋Šฅ ์ œ์•ฝ(Trade-off)์„ ๋™๋ฐ˜ํ•ฉ๋‹ˆ๋‹ค [6, 7]. Context ๊ฐ’์˜ ์ผ๋ถ€๋งŒ ๋ณ€๊ฒฝ๋˜์–ด๋„ ํ•ด๋‹น Context๋ฅผ ๊ตฌ๋…ํ•˜๋Š” ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์ „์ฒด ๋ฆฌ๋ Œ๋”๋ง(re-render)์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค [6, 8]. + +๋”ฐ๋ผ์„œ ์žฅ๋ฐ”๊ตฌ๋‹ˆ๋‚˜ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ๋“ฑ ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ณ€๊ฒฝ๋˜๋Š” ์ƒํƒœ์— ๋Œ€ํ•ด Prop Drilling์„ ํ”ผํ•˜๊ฒ ๋‹ค๊ณ  ๋ฌด์ž‘์ • Context API๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ ์ €ํ•˜(Re-render storm)๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [9, 10]. ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ์—๋Š” ์„ ํƒ์ž(Selector) ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ํ•„์š”ํ•œ ์ƒํƒœ ๋ณ€๊ฒฝ ์‹œ์—๋งŒ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ฐœ์ƒ์‹œํ‚ค๋Š” Zustand๋‚˜ Redux๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ตœ์ ํ™” ์ธก๋ฉด์—์„œ ํ•„์ˆ˜์ ์ธ ๋ฐ˜๋Œ€ ๊ธ‰๋ถ€์˜ ํ•ด๊ฒฐ์ฑ…์ด ๋ฉ๋‹ˆ๋‹ค [7, 11]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [๊ธฐ๋ฐ˜ ๊ธฐ์ˆ /ํ•ด๊ฒฐ์ฑ…] +- [[Context API]] + - ์—ฐ๊ฒฐ ์ด์œ : Prop Drilling ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด React์—์„œ ์ž์ฒด์ ์œผ๋กœ ๋„์ž…ํ•œ ๋‚ด์žฅ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [1]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: props๋ฅผ ์ผ์ผ์ด ๋„˜๊ธฐ์ง€ ์•Š๊ณ  ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธํ•˜๋Š” ์›๋ฆฌ์™€ ๊ทธ์— ๋”ฐ๋ฅธ ๋ฆฌ๋ Œ๋”๋ง ํ•œ๊ณ„๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [6, 12]. + +#### [์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ/๋Œ€์•ˆ] +- [[Zustand]] + - ์—ฐ๊ฒฐ ์ด์œ : Prop Drilling์˜ ๋Œ€์•ˆ์ธ Context API๊ฐ€ ๊ฐ–๋Š” ๋ฆฌ๋ Œ๋”๋ง ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ๊ทน๋ณตํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๋Ÿ‰ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [2, 7]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์„ ํƒ์ž(Selector) ํŒจํ„ด์„ ํ™œ์šฉํ•ด ํ•„์š”ํ•œ ์ƒํƒœ์˜ ๋ณ€๊ฒฝ์—๋งŒ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฆฌ๋ Œ๋”๋งํ•˜๋„๋ก ์Šค๋งˆํŠธํ•˜๊ฒŒ ๊ตฌ๋…(subscribe)ํ•˜๋Š” ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [7, 13]. +- [[Redux]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ Prop Drilling์„ ๋ฐฉ์ง€ํ•˜๊ณ  ์ƒํƒœ๋ฅผ ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์‚ฐ์—… ํ‘œ์ค€ ์ƒํƒœ ์ปจํ…Œ์ด๋„ˆ ๋„๊ตฌ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [5, 14]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํŒŒ์ƒ ์„ ํƒ์ž(derived selectors)๊ฐ€ ์กด์žฌํ•จ์œผ๋กœ์จ Prop Drilling ์—†์ด ๋ณต์žกํ•œ ์ƒํƒœ์™€ ๋น„๋™๊ธฐ ๋กœ์ง์„ ์–ด๋–ป๊ฒŒ ํšจ์œจ์ ์œผ๋กœ ๋‹ค๋ฃจ๋Š”์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5, 15]. + +### Deeper Research Questions + +- Prop Drilling์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด Context API๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง(re-renders) ๋ฌธ์ œ๋Š” ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? [6, 8] +- Redux์™€ Zustand๊ฐ€ ์ œ๊ณตํ•˜๋Š” '์„ ํƒ์ž(Selector)' ๊ธฐ๋Šฅ์€ Prop Drilling ๋ฐฉ์‹๊ณผ ๋น„๊ตํ•˜์—ฌ ํŒŒ์ƒ ์ƒํƒœ(derived state)๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ ์–ด๋– ํ•œ ์•„ํ‚คํ…์ฒ˜์  ์ด์ ์„ ์ œ๊ณตํ•˜๋Š”๊ฐ€? [5, 7] +- Context API๊ฐ€ ์•„๋‹Œ Zustand๋‚˜ Redux ๊ฐ™์€ ์ „๋ฌธ์ ์ธ ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ๋ฅผ ๋„์ž…ํ•˜์—ฌ Prop Drilling์„ ํ•ด๊ฒฐํ•ด์•ผ ํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ณต์žก๋„ ๋ฐ ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง ๋นˆ๋„์˜ ์ •ํ™•ํ•œ ๊ธฐ์ค€์ ์€ ๋ฌด์—‡์ธ๊ฐ€? [10, 11] +- Prop Drilling์„ ๋‹จ์ˆœํžˆ ํšŒํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋“  ์ƒํƒœ๋ฅผ ์ „์—ญ ์ปจํ…์ŠคํŠธ(Global Context for Everything)์— ๋„ฃ๋Š” ์•ˆํ‹ฐ ํŒจํ„ด์€ ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜์— ์–ด๋–ค ๋ถ€์ž‘์šฉ์„ ์ผ์œผํ‚ค๋Š”๊ฐ€? [16, 17] +- ์ „์—ญ ์ƒํƒœ๊ฐ€ ์•„๋‹Œ ์ง€์—ญ ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ ๋‚ด์—์„œ ๋ฐœ์ƒํ•˜๋Š” Prop Drilling์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด, ์ปดํฌ๋„ŒํŠธ ํ•ฉ์„ฑ(Component Composition)์ด๋‚˜ ํด๋ฆฐ ์ฝ”๋“œ ์›์น™์„ ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? [18, 19] + +### Practical Application Contexts + +- **Implementation:** ๊นŠ๊ฒŒ ์ค‘์ฒฉ๋œ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ๋•Œ, ์ค‘๊ฐ„ ์ปดํฌ๋„ŒํŠธ๋“ค์ด ๋ถˆํ•„์š”ํ•œ props๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๋„๋ก `React.createContext()`๋ฅผ ํ™œ์šฉํ•ด ๋ฐ์ดํ„ฐ ์ œ๊ณต์ž(Provider)์™€ ์†Œ๋น„์ž(Consumer)๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค [1, 12]. +- **System Design:** ํ…Œ๋งˆ๋‚˜ ์–ธ์–ด ์„ค์ •๊ณผ ๊ฐ™์€ ์ •์ ์ธ ์ „์—ญ ๊ด€์‹ฌ์‚ฌ(global concerns)์— ๋Œ€ํ•œ Prop Drilling์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Context API๋ฅผ ์„ค๊ณ„์— ๋ฐ˜์˜ํ•˜์ง€๋งŒ, ์ƒํƒœ ๋ณ€๊ฒฝ์ด ์žฆ์€ ์˜์—ญ์€ Zustand๋‚˜ Redux ๊ธฐ๋ฐ˜์˜ ์Šค๋งˆํŠธ ์•Œ๋ฆผ ์‹œ์Šคํ…œ(smart notification system) ๊ตฌ์กฐ๋กœ ์„ค๊ณ„ํ•˜์—ฌ ๊ด€์‹ฌ์‚ฌ์™€ ์„ฑ๋Šฅ์„ ๋ชจ๋‘ ์ฑ™๊น๋‹ˆ๋‹ค [4, 13, 20]. +- **Operation / Maintenance:** ์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง ํˆด(์˜ˆ: React DevTools Profiler)์„ ํ†ตํ•ด Prop Drilling์„ ์šฐํšŒํ•˜๊ณ ์ž ๋„์ž…ํ•œ Context๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง ํญํ’(re-render storm)์„ ์ผ์œผํ‚ค๋Š”์ง€ ์ถ”์ ํ•˜๊ณ , ๋ณ‘๋ชฉ ๋ฐœ์ƒ ์‹œ Selector๋ฅผ ์ง€์›ํ•˜๋Š” ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ๋กœ ์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜(Incremental Migration)์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค [8, 9, 21]. +- **Learning Path:** React ์ž…๋ฌธ ์‹œ ๋ฐ์ดํ„ฐ ํ๋ฆ„์˜ ๊ธฐ๋ณธ์ธ Prop Drilling์˜ ๋ถˆํŽธํ•จ์„ ๋จผ์ € ๊ฒฝํ—˜ํ•˜๊ณ , ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” Context API๋ฅผ ํ•™์Šตํ•œ ํ›„, ์ตœ์ข…์ ์œผ๋กœ ๋Œ€๊ทœ๋ชจ ์•ฑ์„ ์œ„ํ•œ Zustand๋‚˜ Redux๋กœ ๋ฐœ์ „ํ•ด ๋‚˜๊ฐ€๋Š” ํ˜•ํƒœ์˜ ํ•™์Šต ๊ฒฝ๋กœ๋ฅผ ๋ฐŸ๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค [22]. +- **My Project Relevance:** ์†Œ์Šค์— ๊ด€๋ จ ์ •๋ณด๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. + +### Adjacent Topics + +- [[Re-renders]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: Prop Drilling์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•œ ์ˆ˜๋‹จ(Context API)์ด ์ดˆ๋ž˜ํ•˜๋Š” ๋ถ€์ž‘์šฉ์ธ ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”๋ชจ์ด์ œ์ด์…˜(`React.memo`, `useMemo`, `useCallback`) ๋“ฑ React ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์œผ๋กœ์˜ ์ดํ•ด ํ™•์žฅ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค [3, 6, 23]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Topics_Blog/Re-renders Optimization.md b/10_Wiki/Topics_Blog/Re-renders Optimization.md new file mode 100644 index 00000000..be2c3213 --- /dev/null +++ b/10_Wiki/Topics_Blog/Re-renders Optimization.md @@ -0,0 +1,54 @@ +# [[Re-renders Optimization]] + +## ๐Ÿ“Œ Brief Summary +Re-renders Optimization์€ React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ถˆํ•„์š”ํ•œ ์ปดํฌ๋„ŒํŠธ ์—…๋ฐ์ดํŠธ๋ฅผ ์ตœ์†Œํ™”ํ•˜์—ฌ ์„ฑ๋Šฅ, ๋ฐ˜์‘์„ฑ ๋ฐ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค [1, 2]. ์ฃผ๋กœ ์ƒํƒœ(state), ์†์„ฑ(props), ์ปจํ…์ŠคํŠธ(context)์˜ ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ๊ณผ๋„ํ•œ ๋ Œ๋”๋ง์„ ํƒ€๊ฒŸ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค [3]. ์ด๋ฅผ ์œ„ํ•ด ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜, ์ƒํƒœ ๊ด€๋ฆฌ ์ตœ์ ํ™”, ๊ฐ€์ƒํ™” ๊ธฐ๋ฒ•, ๊ทธ๋ฆฌ๊ณ  React Compiler์™€ ๊ฐ™์€ ์ตœ์‹  ์ž๋™ํ™” ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค [4-6]. + +## ๐Ÿ“– Core Content +* **๋ฆฌ๋ Œ๋”๋ง์˜ ์›์ธ๊ณผ ์„ฑ๋Šฅ์  ์˜ํ–ฅ:** + React ์ปดํฌ๋„ŒํŠธ๋Š” ๋‚ด๋ถ€ ์ƒํƒœ(state) ๋ณ€๊ฒฝ, ์†์„ฑ(props) ๋ณ€๊ฒฝ, ๊ตฌ๋… ์ค‘์ธ ์ปจํ…์ŠคํŠธ(context) ๊ฐ’ ๋ณ€๊ฒฝ, ํ˜น์€ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง๋  ๋•Œ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค [3]. ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์ด ๋ˆ„์ ๋˜๋ฉด UI ๋ฐ˜์‘์„ฑ ์ €ํ•˜, ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ์ฆ๊ฐ€, ์ƒํ˜ธ์ž‘์šฉ์„ฑ(TTI) ์ง€์—ฐ ๋“ฑ์„ ์ดˆ๋ž˜ํ•˜๋ฉฐ, ๊นŠ์€ ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ์—์„œ๋Š” ์Šคํฌ๋ฆฝํŒ… ์‹œ๊ฐ„์„ 30~60%๊นŒ์ง€ ์ฆ๊ฐ€์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2]. +* **์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ (Manual Memoization):** + `React.memo()`๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด props๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ด์ „ ๋ Œ๋”๋ง ๊ฒฐ๊ณผ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜์—ฌ ๋ Œ๋”๋ง ํšŸ์ˆ˜๋ฅผ 30~50%๊ฐ€๋Ÿ‰ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [7, 8]. ์ด์™€ ํ•จ๊ป˜ `useCallback`๊ณผ `useMemo` ํ›…์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ์ฒด๋‚˜ ํ•จ์ˆ˜์˜ ์ฐธ์กฐ ๋™๋“ฑ์„ฑ(Reference Equality)์„ ์œ ์ง€ํ•ด์•ผ ์ž์‹ ์ปดํฌ๋„ŒํŠธ์˜ ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง์„ ๋ง‰์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [9, 10]. ๋‹จ, ๋ฌด๋ถ„๋ณ„ํ•œ ์‚ฌ์šฉ์€ ๋น„๊ต ์—ฐ์‚ฐ์˜ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋ฏ€๋กœ ํ”„๋กœํŒŒ์ผ๋ง์„ ํ†ตํ•ด ํ™•์ธ๋œ ๋ณ‘๋ชฉ ๊ตฌ๊ฐ„์—๋งŒ ์ ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [11, 12]. +* **์ปจํ…์ŠคํŠธ ์ตœ์ ํ™” (Context Optimization):** + React์˜ ๊ธฐ๋ณธ Context API๋Š” ๊ฐ’์˜ ์ผ๋ถ€๋งŒ ๋ณ€๊ฒฝ๋˜์–ด๋„ ํ•ด๋‹น ์ปจํ…์ŠคํŠธ๋ฅผ ๊ตฌ๋…ํ•˜๋Š” ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฆฌ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค [13, 14]. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ปจํ…์ŠคํŠธ๋ฅผ ์ž‘์€ ๋„๋ฉ”์ธ ๋‹จ์œ„๋กœ ์ชผ๊ฐœ๊ฑฐ๋‚˜ [15], ์„ ํƒ์ž(Selector)๋ฅผ ํ†ตํ•ด ์ƒํƒœ์˜ ํŠน์ • ์กฐ๊ฐ์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งŒ ๋ฆฌ๋ Œ๋”๋ง์„ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š” Zustand, Jotai ๋“ฑ์˜ ์™ธ๋ถ€ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค [16-18]. +* **React Compiler์˜ ๋„์ž…:** + ๋นŒ๋“œ ํƒ€์ž„ ์ตœ์ ํ™” ๋„๊ตฌ์ธ React Compiler๋Š” ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜(`useMemo`, `useCallback`, `React.memo`) ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ ์ปดํŒŒ์ผ ๋‹จ๊ณ„์—์„œ ์ž๋™์œผ๋กœ ์บ์‹ฑ ๋กœ์ง์„ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค [4, 19]. ์ปดํฌ๋„ŒํŠธ ์ „์ฒด๊ฐ€ ์•„๋‹Œ ๊ฐœ๋ณ„ JSX ์š”์†Œ ๋‹จ์œ„๋กœ ์„ธ๋ถ„ํ™”ํ•˜์—ฌ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์ˆ˜ํ–‰ํ•จ์œผ๋กœ์จ, ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ๋†’์ด๊ณ  ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง์„ ์›์ฒœ์ ์œผ๋กœ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค [19, 20]. +* **๋ Œ๋”๋ง ํŒจํ„ด ๋ฐ ๋™์‹œ์„ฑ ์ตœ์ ํ™”:** + ์ˆ˜๋ฐฑ ๊ฐœ ์ด์ƒ์˜ ํ•ญ๋ชฉ์„ ๋ Œ๋”๋งํ•˜๋Š” ๋Œ€๊ทœ๋ชจ ๋ฆฌ์ŠคํŠธ์—์„œ๋Š” ๊ณ ์œ ํ•˜๊ณ  ์•ˆ์ •์ ์ธ `key` ์†์„ฑ์„ ๋ถ€์—ฌํ•˜๊ณ , ํ™”๋ฉด์— ๋ณด์ด๋Š” ํ•ญ๋ชฉ๋งŒ ๋ Œ๋”๋งํ•˜๋Š” ๊ฐ€์ƒํ™”(Windowing) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(์˜ˆ: `react-window`)๋ฅผ ์ ์šฉํ•˜์—ฌ DOM ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ค„์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค [6, 21]. ๋˜ํ•œ JSX ๋‚ด๋ถ€์— ์ต๋ช… ํ•จ์ˆ˜๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•˜๋ฉด ๋งค ๋ Œ๋”๋ง๋งˆ๋‹ค ์ƒˆ๋กœ์šด ์ฐธ์กฐ๊ฐ€ ์ƒ์„ฑ๋˜๋ฏ€๋กœ ์ง€์–‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [22, 23]. ๋ถ€๊ฐ€์ ์œผ๋กœ `useTransition` ๋ฐ `useDeferredValue`์™€ ๊ฐ™์€ ๋™์‹œ์„ฑ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•ด ๋ฌด๊ฑฐ์šด ์—…๋ฐ์ดํŠธ๋ฅผ ์ง€์—ฐ์‹œํ‚ค๊ณ  ์‚ฌ์šฉ์ž ์ž…๋ ฅ์— ๋Œ€ํ•œ UI ๋ฐ˜์‘์„ฑ์„ ์šฐ์„ ์ˆœ์œ„์— ๋‘˜ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [24, 25]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts +- [[React Compiler]] + - ์—ฐ๊ฒฐ ์ด์œ : ๊ฐœ๋ฐœ์ž๊ฐ€ ์ˆ˜๋™์œผ๋กœ ๋ฆฌ๋ Œ๋”๋ง์„ ์ตœ์ ํ™”ํ•˜๋˜ ๊ธฐ์กด ๋ฐฉ์‹์„ ๋Œ€์ฒดํ•˜์—ฌ, ๋นŒ๋“œ ํƒ€์ž„์— ์ž๋™์œผ๋กœ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์ ์šฉํ•˜๋Š” 2025๋…„ ๊ธฐ์ค€ ํ•ต์‹ฌ ๊ธฐ์ˆ ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [4]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ปดํฌ๋„ŒํŠธ ์ „์ฒด๊ฐ€ ์•„๋‹Œ ๊ฐœ๋ณ„ JSX ์š”์†Œ์™€ ์—ฐ์‚ฐ์ด ์–ด๋–ป๊ฒŒ ๋…๋ฆฝ์ ์œผ๋กœ ์บ์‹ฑ๋˜๋Š”์ง€์˜ ์›๋ฆฌ์™€ ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ˜ธํ™˜์„ฑ ํ•œ๊ณ„ [19, 26]. + +- [[State Management (Zustand vs Context)]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋ถˆํ•„์š”ํ•œ ์ „์ฒด ๋ฆฌ๋ Œ๋”๋ง์„ ์œ ๋ฐœํ•˜๋Š” Context API์˜ ๊ตฌ์กฐ์  ํ•œ๊ณ„๋ฅผ Zustand์˜ ์„ ํƒ์ž(Selector) ํŒจํ„ด์ด ์–ด๋–ป๊ฒŒ ๊ทน๋ณตํ•˜์—ฌ ๋ Œ๋”๋ง์„ ์ตœ์ ํ™”ํ•˜๋Š”์ง€ ์„ค๋ช…ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [13, 17]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ž์ฃผ ๋ณ€๊ฒฝ๋˜๋Š” ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ์—์„œ React ๋ Œ๋”๋ง ์‚ฌ์ดํด ์™ธ๋ถ€์˜ ์Šคํ† ์–ด๊ฐ€ ์–ด๋–ป๊ฒŒ ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง์„ ์ •๋ฐ€ํ•˜๊ฒŒ ์ œ์–ดํ•˜๋Š”์ง€ [17, 27]. + +- [[Memoization (useMemo, useCallback)]] + - ์—ฐ๊ฒฐ ์ด์œ : React์˜ ์–•์€ ๋น„๊ต(Shallow comparison) ํŠน์„ฑ์„ ๊ทน๋ณตํ•˜๊ณ  ์ฐธ์กฐ ๋™๋“ฑ์„ฑ์„ ์œ ์ง€ํ•˜์—ฌ `React.memo`์™€ ๊ฒฐํ•ฉํ•œ ๋ฆฌ๋ Œ๋”๋ง ์ตœ์ ํ™”์˜ ๊ธฐ๋ฐ˜์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [10]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ฌด๋ถ„๋ณ„ํ•œ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์ด ์˜คํžˆ๋ ค ๋ Œ๋”๋ง ๋น„์šฉ๋ณด๋‹ค ํฐ ์„ฑ๋Šฅ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์œ ๋ฐœํ•˜๋Š” ์ด์œ ์™€ ์˜ฌ๋ฐ”๋ฅธ ์ ์šฉ ์กฐ๊ฑด [11, 12]. + +### Deeper Research Questions +- React Compiler๊ฐ€ ์ ์šฉ๋œ ํ™˜๊ฒฝ์—์„œ ๊ธฐ์กด `React.memo`, `useMemo`, `useCallback`์œผ๋กœ ์ž‘์„ฑ๋œ ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ์ฝ”๋“œ๋Š” ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๋ฆฌํŒฉํ† ๋ง๋˜๊ฑฐ๋‚˜ ๊ณต์กดํ•ด์•ผ ํ•˜๋Š”๊ฐ€? +- Context API๋ฅผ ๋‹ค์ˆ˜์˜ ์ž‘์€ ๋„๋ฉ”์ธ์œผ๋กœ ๋ถ„ํ• ํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜์™€ Zustand๋ฅผ ๋„์ž…ํ•˜์—ฌ ์„ ํƒ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜ ๊ฐ„์˜ ๋ Œ๋”๋ง ์„ฑ๋Šฅ ๋ฐ ์œ ์ง€๋ณด์ˆ˜์„ฑ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๋Š” ๋ฌด์—‡์ธ๊ฐ€? +- ๋Œ€๊ทœ๋ชจ ๋ฆฌ์ŠคํŠธ์—์„œ ์•ˆ์ •์ ์ธ `key` ์†์„ฑ ๋ถ€์—ฌ์™€ ๊ฐ€์ƒํ™”(Windowing) ๊ธฐ๋ฒ•์„ ํ•จ๊ป˜ ์ ์šฉํ•  ๋•Œ, DOM ๋…ธ๋“œ ๊ด€๋ฆฌ์™€ ๋ฉ”๋ชจ๋ฆฌ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ์ธก๋ฉด์—์„œ ๋‚ด๋ถ€์ ์œผ๋กœ ์–ด๋–ค ์ตœ์ ํ™”๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”๊ฐ€? +- JSX ๋‚ด ์ต๋ช… ํ•จ์ˆ˜ ์‚ฌ์šฉ์ด ์œ ๋ฐœํ•˜๋Š” ์ฐธ์กฐ ๋ณ€๊ฒฝ(Reference change) ๋ฌธ์ œ๋ฅผ `useCallback` ์™ธ์— ์ปดํฌ๋„ŒํŠธ ์™ธ๋ถ€ ์„ ์–ธ ๋ฐฉ์‹ ๋“ฑ์œผ๋กœ ํ•ด๊ฒฐํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์ƒํƒœ ์ ‘๊ทผ์„ฑ ์ œ์•ฝ์€ ์–ด๋–ป๊ฒŒ ๊ทน๋ณตํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- `useTransition`๊ณผ `useDeferredValue`๋ฅผ ํ™œ์šฉํ•œ ๋™์‹œ์„ฑ ๋ Œ๋”๋ง(Concurrent rendering)์ด ๋ฆฌ๋ Œ๋”๋ง์„ ์ฐจ๋‹จํ•˜์ง€ ์•Š๊ณ  ์ง€์—ฐ์‹œํ‚ฌ ๋•Œ, ๋ฌด๊ฑฐ์šด ์—ฐ์‚ฐ์ด ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋ฅผ ์ ์œ ํ•˜๋Š” ํ•œ๊ณ„๋Š” ์–ด๋–ป๊ฒŒ ๋ณด์™„ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? + +### Practical Application Contexts +- **Implementation:** ๋ฌด๊ฑฐ์šด ์ปดํฌ๋„ŒํŠธ๋‚˜ ์ž์‹์—๊ฒŒ ์ „๋‹ฌ๋˜๋Š” ํ•จ์ˆ˜/๊ฐ์ฒด prop์— ๋Œ€ํ•ด `React.memo()`, `useCallback`, `useMemo`๋ฅผ ์„ ํƒ์ ์œผ๋กœ ์ ์šฉํ•˜์—ฌ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค [7, 10]. ๋Œ€๊ทœ๋ชจ ๋ฆฌ์ŠคํŠธ ๊ตฌํ˜„ ์‹œ `react-window`๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค [6]. +- **System Design:** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ „์—ญ ์ƒํƒœ๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ, ํ…Œ๋งˆ๋‚˜ ๋‹ค๊ตญ์–ด์ฒ˜๋Ÿผ ๋ณ€๊ฒฝ์ด ์ ์€ ์ •์  ๋ฐ์ดํ„ฐ๋Š” Context API๋ฅผ, ์•Œ๋ฆผ์ด๋‚˜ ์žฅ๋ฐ”๊ตฌ๋‹ˆ์ฒ˜๋Ÿผ ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ณ€๊ฒฝ๋˜๋Š” ๋™์  ๋ฐ์ดํ„ฐ๋Š” ๋ถ€๋ถ„ ๊ตฌ๋…(Selector)์„ ์ง€์›ํ•˜๋Š” ์™ธ๋ถ€ ์ƒํƒœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(Zustand ๋“ฑ)๋กœ ์„ค๊ณ„ํ•˜์—ฌ ๋ Œ๋”๋ง ๋ฒ”์œ„๋ฅผ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค [18, 28, 29]. +- **Operation / Maintenance:** React DevTools Profiler, `why-did-you-render` ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, Chrome DevTools Performance Tab์„ ํ™œ์šฉํ•˜์—ฌ ํ”„๋กœ๋•์…˜ ๋ฐฐํฌ ์ „ ๋ฐ ์šด์˜ ์ค‘์— ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง๊ณผ ๊ทธ ์›์ธ์„ ์ง€์†์ ์œผ๋กœ ์ธก์ •ํ•˜๊ณ  ๊ฐœ์„ ํ•ฉ๋‹ˆ๋‹ค [30-32]. +- **Learning Path:** React์˜ ๊ธฐ๋ณธ ๋ Œ๋”๋ง ๋™์ž‘ ์›๋ฆฌ(์ƒํƒœ, props, ์ฐธ์กฐ ๋™๋“ฑ์„ฑ)๋ฅผ ๋จผ์ € ํ•™์Šตํ•˜๊ณ  ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์˜ ๋น„์šฉ์„ ์ดํ•ดํ•œ ๋’ค, ๋™์‹œ์„ฑ ๊ธฐ๋Šฅ(Concurrent Features)๊ณผ React Compiler๋ฅผ ํ†ตํ•œ ์ž๋™ํ™” ์ตœ์ ํ™” ํŒจ๋Ÿฌ๋‹ค์ž„์œผ๋กœ ์ง€์‹์„ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค [5]. +- **My Project Relevance:** ํ˜„์žฌ ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ฑฐ๋‚˜ ์ƒˆ๋กœ ๊ตฌ์ถ•ํ•˜๋Š” React ํ”„๋กœ์ ํŠธ์—์„œ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ๊ฒช๊ณ  ์žˆ๋‹ค๋ฉด, ์ต๋ช… ํ•จ์ˆ˜ ์ธ๋ผ์ธ ์ž‘์„ฑ ํŒจํ„ด์„ ์ˆ˜์ •ํ•˜๊ณ , ๋ถˆํ•„์š”ํ•œ ๊ฑฐ๋Œ€ Context๋ฅผ ๋ถ„๋ฆฌํ•˜๋ฉฐ, ์‹๋ณ„ ๊ฐ€๋Šฅํ•œ ๋ณ‘๋ชฉ ์ง€์ ์— ํ”„๋กœํŒŒ์ผ๋ง ๊ธฐ๋ฐ˜์˜ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์ ์šฉํ•ด ์ฆ‰๊ฐ์ ์ธ ์„ฑ๋Šฅ ๊ฐœ์„ ์„ ์ด๋ฃฐ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5, 15, 22]. + +### Adjacent Topics +- [[Core Web Vitals (INP, FCP, TTI)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ํ”„๋ก ํŠธ์—”๋“œ ์ฝ”๋“œ์˜ ๋ฆฌ๋ Œ๋”๋ง ์ตœ์ ํ™”๊ฐ€ ์‹ค์ œ ์‚ฌ์šฉ์ž์˜ ์ฒด๊ฐ ์„ฑ๋Šฅ์„ ์ธก์ •ํ•˜๋Š” ์ง€ํ‘œ(ํŠนํžˆ Interaction to Next Paint)์— ๋ธŒ๋ผ์šฐ์ € ๋ ˆ๋ฒจ์—์„œ ์–ด๋–ค ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”์ง€ ํ™•์žฅํ•˜์—ฌ ์กฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค [2, 33]. +- [[Code Splitting & Lazy Loading]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ์ปดํฌ๋„ŒํŠธ ์—…๋ฐ์ดํŠธ ์‹œ์ (๋ฆฌ๋ Œ๋”๋ง)์˜ ์ตœ์ ํ™”๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ์ปดํฌ๋„ŒํŠธ ์ตœ์ดˆ ๋กœ๋“œ ์‹œ์ ์˜ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ค„์—ฌ ์ดˆ๊ธฐ ๋ Œ๋”๋ง ์„ฑ๋Šฅ์„ ๊ทน๋Œ€ํ™”ํ•˜๋Š” `React.lazy`์™€ ๋™์  ์ž„ํฌํŠธ ๊ธฐ๋ฒ•์„ ํ•จ๊ป˜ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค [34]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Topics_Blog/React 18 Concurrent Features.md b/10_Wiki/Topics_Blog/React 18 Concurrent Features.md new file mode 100644 index 00000000..a5c653e9 --- /dev/null +++ b/10_Wiki/Topics_Blog/React 18 Concurrent Features.md @@ -0,0 +1,50 @@ +# [[React 18 Concurrent Features]] + +## ๐Ÿ“Œ Brief Summary +React 18 Concurrent Features(๋™์‹œ์„ฑ ๊ธฐ๋Šฅ)๋Š” ์—…๋ฐ์ดํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์‹œ์ ๊ณผ ๋ฐฉ์‹์„ ์ œ์–ดํ•˜์—ฌ ์‘๋‹ต์„ฑ์„ ํฌ์ƒํ•˜์ง€ ์•Š์œผ๋ฉด์„œ๋„ ๋” ๋งค๋„๋Ÿฌ์šด ์•ฑ์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ด๋‹ค [1]. ์ด ๋ Œ๋”๋ง ๋ชจ๋ธ์€ React๊ฐ€ ๋ Œ๋”๋ง ์ž‘์—…์„ ์ผ์‹œ ์ค‘์ง€(pause), ์ค‘๋‹จ(interrupt), ์žฌ๊ฐœ(resume)ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•˜์—ฌ ์ค‘์š”๋„์— ๋”ฐ๋ฅธ ์—…๋ฐ์ดํŠธ ์šฐ์„ ์ˆœ์œ„ ์ง€์ •์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค [2]. ๋Œ€ํ‘œ์ ์ธ ํ›…(Hook)์ธ `useTransition`๊ณผ `useDeferredValue`๋ฅผ ํ†ตํ•ด ๋А๋ฆฐ ๋ Œ๋”๋ง์ด ์ค‘์š”ํ•œ ์‚ฌ์šฉ์ž ์ƒํ˜ธ์ž‘์šฉ์„ ์ฐจ๋‹จํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค [3, 4]. + +## ๐Ÿ“– Core Content +* **๋™์‹œ์„ฑ ๋ Œ๋”๋ง์˜ ์›๋ฆฌ์™€ ์žฅ์ ** + ๋™์‹œ์„ฑ ๋ Œ๋”๋ง์€ ๋ฌด๊ฑฐ์šด ํ•„ํ„ฐ ์—…๋ฐ์ดํŠธ์™€ ๊ฐ™์€ ์ž‘์—…์€ ์ง€์—ฐ์‹œํ‚ค๋ฉด์„œ, ํด๋ฆญ์ด๋‚˜ ํƒ€์ดํ•‘ ๋“ฑ ์ค‘์š”ํ•˜๊ณ  ์ฆ‰๊ฐ์ ์ธ ์ƒํ˜ธ์ž‘์šฉ์„ ์šฐ์„ ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค [2]. ์ตœ์‹  ๋ฒ„์ „์˜ React์—์„œ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ˆ˜๋™์œผ๋กœ ํ™œ์„ฑํ™”ํ•  ํ•„์š” ์—†์ด ๊ธฐ๋ณธ ๋™์ž‘์œผ๋กœ ๋‚ด์žฅ๋˜์–ด ์ž‘๋™ํ•œ๋‹ค [2]. ์ด ๊ธฐ๋Šฅ์€ ์•ฑ์„ ์‹ค์ œ๋กœ ๋” ๋น ๋ฅด๊ฒŒ ๋งŒ๋“ ๋‹ค๊ธฐ๋ณด๋‹ค๋Š”, ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์ด ์ง„ํ–‰๋˜๋Š” ๋™์•ˆ UI์˜ ์‘๋‹ต์„ฑ์„ ์œ ์ง€ํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ๋А๋ผ๋Š” ์ฒด๊ฐ ์†๋„(perceived speed)๋ฅผ ์šฐ์„ ์‹œํ•œ๋‹ค [4]. +* **`useTransition` (UX ์‘๋‹ต์„ฑ ์šฐ์„ ์ˆœ์œ„ ์ง€์ •)** + ์ด ํ›…์€ ํŠน์ • ์—…๋ฐ์ดํŠธ๋ฅผ '๋น„๊ธด๊ธ‰(non-urgent)'์œผ๋กœ ํ‘œ์‹œํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค [3]. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ผ์ด๋ธŒ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋‚˜ ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ๋ฅผ ํ•„ํ„ฐ๋งํ•  ๋•Œ, ๋ Œ๋”๋ง ์ฒ˜๋ฆฌ๊ฐ€ ๋А๋ ค์ง€๋”๋ผ๋„ ์‚ฌ์šฉ์ž์˜ ํƒ€์ดํ•‘์ด๋‚˜ ํด๋ฆญ ๊ฐ™์€ ์ค‘์š”ํ•œ ์ƒํ˜ธ์ž‘์šฉ์ด ์ฐจ๋‹จ๋˜์ง€ ์•Š๋Š”๋‹ค [3]. ์ฒ˜๋ฆฌ ๋Œ€๊ธฐ ์ค‘์ธ ์ƒํƒœ(`isPending`)๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ Œ๋”๋ง์„ ์ฐจ๋‹จํ•˜์ง€ ์•Š๊ณ  ๋กœ๋”ฉ ์Šคํ”ผ๋„ˆ๋‚˜ ์Šค์ผˆ๋ ˆํ†ค ์ƒํƒœ๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๋‹ค [3]. +* **`useDeferredValue` (ํŒŒ์ƒ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์ง€์—ฐ)** + `useTransition`์ด ์—…๋ฐ์ดํŠธ๊ฐ€ ํŠธ๋ฆฌ๊ฑฐ๋˜๋Š” ์‹œ์ ์„ ์ œ์–ดํ•œ๋‹ค๋ฉด, `useDeferredValue`๋Š” ๋ฌด๊ฑฐ์šด ๊ฐ’์„ '์ฝ๋Š”(read)' ์‹œ์ ์„ ์ œ์–ดํ•œ๋‹ค [4]. ์‚ฌ์šฉ์ž์˜ ํƒ€์ดํ•‘๊ณผ ๊ฐ™์€ UI ๋ณ€๊ฒฝ์€ ์ฆ‰๊ฐ์ ์œผ๋กœ ๋ฐ˜์˜ํ•˜๋˜, ํŒŒ์ƒ๋œ ๋ฌด๊ฑฐ์šด ์—ฐ์‚ฐ์ด๋‚˜ ํ•„ํ„ฐ๋ง ๋กœ์ง์€ ์•ฝ๊ฐ„ ์ง€์—ฐ์‹œ์ผœ ์ ์šฉํ•ด์•ผ ํ•  ๋•Œ ์ด์ƒ์ ์ธ ๋ฐฉ๋ฒ•์ด๋‹ค [4]. ์ฃผ๋กœ ๊ฒ€์ƒ‰ ์ƒ์ž, Typeahead ์ž…๋ ฅ๊ธฐ, ์‹ค์‹œ๊ฐ„ ํผ ๋“ฑ์—์„œ ๋Š๊น€ ํ˜„์ƒ(jank)์„ ์ค„์ด๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค [4]. +* **๋ชจ๋ฒ” ์‚ฌ๋ก€ ๋ฐ ํ”„๋ ˆ์ž„์›Œํฌ ์ƒํƒœ๊ณ„ ์ง€์›** + ๋™์‹œ์„ฑ ๊ธฐ๋Šฅ์€ ์•ฑ์˜ ๋ชจ๋“  ๊ณณ์ด ์•„๋‹Œ '์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ๋ทฐ'์— ํ•œ์ •ํ•˜์—ฌ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค [4]. ๋ฐ์ดํ„ฐ๊ฐ€ ๋กœ๋“œ๋˜๋Š” ๋™์•ˆ ๋Œ€์ฒด UI๋ฅผ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด `Suspense`์™€ ๊ฒฐํ•ฉํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋˜๋ฉฐ, ๊ตฌํ˜• ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜ ๋ Œ๋”๋ง์„ ์ฐจ๋‹จํ•˜๋Š” ์•ˆํ‹ฐ ํŒจํ„ด๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ํ”ผํ•ด์•ผ ํ•œ๋‹ค [4]. 2025๋…„ ๊ธฐ์ค€ Next.js(App Router), Remix, Vite ๊ธฐ๋ฐ˜ ํ™˜๊ฒฝ ๋“ฑ ๋Œ€๋‹ค์ˆ˜์˜ ํ’€์Šคํƒ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๋™์‹œ์„ฑ ๋ Œ๋”๋ง์„ ๊ธฐ๋ณธ์ ์œผ๋กœ ์—ฐ๋™ํ•˜๊ณ  ์ง€์›ํ•œ๋‹ค [5]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts +- [[useTransition]] + - ์—ฐ๊ฒฐ ์ด์œ : React 18 ๋™์‹œ์„ฑ ๊ธฐ๋Šฅ์˜ ํ•ต์‹ฌ ํ›…์œผ๋กœ, ๋น„๊ธด๊ธ‰ ์—…๋ฐ์ดํŠธ๋ฅผ ์ง€์—ฐ์‹œํ‚ค๋Š” ๊ตฌ์ฒด์ ์ธ ๊ตฌํ˜„์ฒด์ด๋‹ค [3]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ผ์ด๋ธŒ ๊ฒ€์ƒ‰์ด๋‚˜ ํ•„ํ„ฐ๋ง ์‹œ ๋ Œ๋”๋ง ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ๋ฐฉ์ง€ํ•˜๊ณ , ์–ด๋–ป๊ฒŒ ๋น„๊ธด๊ธ‰ ์ž‘์—…๊ณผ ๊ธด๊ธ‰ ์ƒํ˜ธ์ž‘์šฉ(ํƒ€์ดํ•‘ ๋“ฑ)์„ ๋ถ„๋ฆฌํ•˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค [3]. +- [[useDeferredValue]] + - ์—ฐ๊ฒฐ ์ด์œ : ๊ฐ’์˜ ์ฝ๊ธฐ๋ฅผ ์ง€์—ฐ์‹œ์ผœ UI ์—…๋ฐ์ดํŠธ์™€ ์—ฐ์‚ฐ ๋ถ€ํ•˜๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ๋™์‹œ์„ฑ ๊ธฐ๋Šฅ์˜ ๋˜ ๋‹ค๋ฅธ ํ•ต์‹ฌ ํ›…์ด๋‹ค [4]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ฆ‰๊ฐ์ ์ธ UI ๋ฐ˜์˜์ด ํ•„์š”ํ•œ ๋ถ€๋ถ„๊ณผ ์ง€์—ฐ์‹œ์ผœ๋„ ๋ฌด๋ฐฉํ•œ ๋ฌด๊ฑฐ์šด ๊ณ„์‚ฐ(derived data)์„ ์–ด๋–ป๊ฒŒ ๋‚˜๋ˆ„์–ด ์ฒ˜๋ฆฌํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค [4]. +- [[Suspense]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋™์‹œ์„ฑ ํ›…(`useTransition` ๋“ฑ)๊ณผ ๊ฒฐํ•ฉํ•˜์—ฌ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ๋ Œ๋”๋ง์ด ์ง„ํ–‰๋˜๊ฑฐ๋‚˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋กœ๋“œ๋  ๋•Œ ์Šค์ผˆ๋ ˆํ†ค(fallback UI)์„ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋œ ๊ธฐ๋Šฅ์ด๋‹ค [4]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ง€์—ฐ ์ค‘์ธ ๋ Œ๋”๋ง ์ƒํƒœ์—์„œ ์‚ฌ์šฉ์ž์˜ ๊ฒฝํ—˜(UX)์„ ์–ด๋–ป๊ฒŒ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ์ด์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค [4]. + +### Deeper Research Questions +- `useTransition`๊ณผ `useDeferredValue`๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ React ๋‚ด๋ถ€์ ์œผ๋กœ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์˜ ์œ ํœด ์‹œ๊ฐ„(idle time)์„ ์–ด๋–ป๊ฒŒ ํŒ๋‹จํ•˜์—ฌ ์ž‘์—…์„ ์ค‘๋‹จ ๋ฐ ์žฌ๊ฐœํ•˜๋Š”๊ฐ€? +- ๊ตฌํ˜• ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜ ํด๋ž˜์Šค ๊ธฐ๋ฐ˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋™์‹œ์„ฑ ๊ธฐ๋Šฅ๊ณผ ํ˜ผ์šฉํ–ˆ์„ ๋•Œ ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ค ๋ Œ๋”๋ง ์ฐจ๋‹จ ์ถฉ๋Œ์ด๋‚˜ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”๊ฐ€? +- ๋™์‹œ์„ฑ ๋ Œ๋”๋ง์„ ์ ์šฉํ–ˆ์„ ๋•Œ Interaction to Next Paint (INP)๋‚˜ Total Blocking Time (TBT)๊ณผ ๊ฐ™์€ Core Web Vitals ์ง€ํ‘œ๊ฐ€ ์ˆ˜์น˜์ƒ์œผ๋กœ ์–ด๋–ป๊ฒŒ ๋ณ€ํ™”ํ•˜๋Š”๊ฐ€? +- Next.js์˜ App Router์™€ ๊ฒฐํ•ฉ๋œ ๋™์‹œ์„ฑ ๋ Œ๋”๋ง์—์„œ, ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ(Server Components)์™€ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ ๊ฐ„์˜ ๋ Œ๋”๋ง ์šฐ์„ ์ˆœ์œ„๋Š” ์–ด๋–ป๊ฒŒ ๊ด€๋ฆฌ๋˜๋Š”๊ฐ€? +- `isPending` ์†์„ฑ์„ ํ™œ์šฉํ•ด ๋Œ€์ฒด UI(์Šค์ผˆ๋ ˆํ†ค, ์Šคํ”ผ๋„ˆ)๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ์‹œ๊ฐ์  ๊นœ๋นก์ž„์„ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•œ ์ด์ƒ์ ์ธ ์ง€์—ฐ ์‹œ๊ฐ„ ์„ค๊ณ„ ํŒจํ„ด์€ ๋ฌด์—‡์ธ๊ฐ€? + +### Practical Application Contexts +- **Implementation:** ๋ผ์ด๋ธŒ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ๋ Œ๋”๋ง์ด๋‚˜ ์ˆ˜์ฒœ ๊ฐœ์˜ ํ•ญ๋ชฉ์ด ์žˆ๋Š” ๋ฐ์ดํ„ฐ ๋ชฉ๋ก์„ ํ•„ํ„ฐ๋งํ•  ๋•Œ `useTransition`์„ ๋„์ž…ํ•˜์—ฌ ์ž…๋ ฅ์ฐฝ์˜ ์ž…๋ ฅ์ด ์ง€์—ฐ๋˜์ง€ ์•Š๋„๋ก ๊ตฌํ˜„ํ•œ๋‹ค [3]. +- **System Design:** ๊ฒ€์ƒ‰ ์ƒ์ž, Typeahead ์ž…๋ ฅ๊ธฐ, ๋˜๋Š” ์‹ค์‹œ๊ฐ„ ํผ์„ ์„ค๊ณ„ํ•  ๋•Œ ์ฆ‰๊ฐ์ ์ธ ์ž…๋ ฅ ๋ Œ๋”๋ง๊ณผ ์—ฐ์‚ฐ์ด ๋ฌด๊ฑฐ์šด ๋ฐ์ดํ„ฐ ๋ Œ๋”๋ง ๊ฐ„์˜ ์˜ํ–ฅ์„ ์ฐจ๋‹จํ•˜๊ธฐ ์œ„ํ•ด `useDeferredValue` ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋„์ž…ํ•œ๋‹ค [4]. +- **Operation / Maintenance:** Chrome DevTools์˜ Performance ํƒญ๊ณผ Web Vitals ์ง€ํ‘œ๋ฅผ ํ†ตํ•ด ๊ธด ์ž‘์—…(Long tasks)์ด ๋™์‹œ์„ฑ ๋ Œ๋”๋ง ๋•๋ถ„์— ์„ฑ๊ณต์ ์œผ๋กœ ์ชผ๊ฐœ์ ธ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ ์ฐจ๋‹จ์„ ์ค„์˜€๋Š”์ง€ ์ง€์†์ ์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋งํ•œ๋‹ค [6, 7]. +- **Learning Path:** React์˜ ๊ธฐ๋ณธ ๋ Œ๋”๋ง ๋ชจ๋ธ(props ๋ฐ state ๋ณ€๊ฒฝ์— ๋”ฐ๋ฅธ ๋ฆฌ๋ Œ๋”๋ง ํŠธ๋ฆฌ๊ฑฐ)์„ ๋ช…ํ™•ํžˆ ์ดํ•ดํ•œ ๋‹ค์Œ, ๋™์‹œ์„ฑ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ์ด๋Ÿฌํ•œ ๋ Œ๋”๋ง ์‚ฌ์ดํด์ด ์–ด๋–ป๊ฒŒ ์ผ์‹œ ์ค‘์ง€๋˜๊ณ  ์žฌ๊ฐœ๋  ์ˆ˜ ์žˆ๋Š”์ง€ ํ•™์Šต์„ ํ™•์žฅํ•œ๋‹ค [2, 8]. +- **My Project Relevance:** ํ˜„์žฌ ์ง„ํ–‰ ์ค‘์ธ ํ”„๋กœ์ ํŠธ์—์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์€ ์ฐจํŠธ๋‚˜ ํ…Œ์ด๋ธ” ํ•„ํ„ฐ๋ง ์‹œ UI๊ฐ€ ๋Š๊ธฐ๋Š”(Jank) ํ˜„์ƒ์ด ์žˆ๋‹ค๋ฉด, ์ด ๋™์‹œ์„ฑ ๊ธฐ๋Šฅ ํ›…์„ ๋„์ž…ํ•˜์—ฌ ์ฆ‰๊ฐ์ ์ธ ํด๋ฆญ/์ž…๋ ฅ ์‘๋‹ต์„ฑ์„ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ๋‹ค [3, 4]. + +### Adjacent Topics +- [[React Performance Optimization]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋™์‹œ์„ฑ ๋ Œ๋”๋ง ์™ธ์—๋„ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง ์ž์ฒด๋ฅผ ๋ง‰๋Š” `React.memo`, `useCallback`, `useMemo` ํ™œ์šฉ๋ฒ•๊ณผ ๊ฐ™์€ ๋‹ค์–‘ํ•œ React ์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ธฐ๋ฒ• ์ „๋ฐ˜์œผ๋กœ ์ง€์‹์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋‹ค [9-11]. +- [[Server Components]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: Next.js์—์„œ ๋™์‹œ์„ฑ ๊ธฐ๋Šฅ๊ณผ ํ•จ๊ป˜ ์„ฑ๋Šฅ ํ–ฅ์ƒ์˜ ์–‘๋Œ€ ์ถ•์„ ์ด๋ฃจ๋Š” ๊ธฐ๋Šฅ์œผ๋กœ, ํด๋ผ์ด์–ธํŠธ ์ธก JavaScript๋ฅผ ์ „์†กํ•˜์ง€ ์•Š๊ณ  ์„œ๋ฒ„์—์„œ ๋ Œ๋”๋ง์„ ์™„๋ฃŒํ•˜์—ฌ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ค„์ด๋Š” ์ „๋žต์„ ํ•™์Šตํ•  ์ˆ˜ ์žˆ๋‹ค [12, 13]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Topics_Blog/React Codebase Refactoring.md b/10_Wiki/Topics_Blog/React Codebase Refactoring.md new file mode 100644 index 00000000..53140358 --- /dev/null +++ b/10_Wiki/Topics_Blog/React Codebase Refactoring.md @@ -0,0 +1,64 @@ +# [[React Codebase Refactoring]] + +## ๐Ÿ“Œ Brief Summary +React ์ฝ”๋“œ๋ฒ ์ด์Šค ๋ฆฌํŒฉํ† ๋ง์€ ๊ธฐ์กด ์•ฑ์˜ ์™ธ๋ถ€ ๋™์ž‘์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋ฉด์„œ ์œ ์ง€๋ณด์ˆ˜์„ฑ, ์„ฑ๋Šฅ, ๊ฐ€๋…์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์ฝ”๋“œ๋ฅผ ์žฌ์„ค๊ณ„ํ•˜๊ณ  ์ •๋ฆฌํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค. ๋Œ€๊ทœ๋ชจ React ์•ฑ์—์„œ ์ž์ฃผ ๋ฐœ์ƒํ•˜๋Š” ๋…ผ๋ฆฌ ๊ฒฐํ•ฉ, ๋ถˆํ•„์š”ํ•œ ์žฌ๋ Œ๋”๋ง, ์ „์—ญ ์ƒํƒœ์˜ ๋‚จ์šฉ ๋“ฑ์˜ ์•„ํ‚คํ…์ฒ˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ์ค‘์ ์„ ๋‘ก๋‹ˆ๋‹ค. ์„ฑ๊ณต์ ์ธ ๋ฆฌํŒฉํ† ๋ง์„ ์œ„ํ•ด์„œ๋Š” ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋กœ ์•ˆ์ „๋ง์„ ํ™•๋ณดํ•œ ํ›„, ์ปดํฌ๋„ŒํŠธ ์ฑ…์ž„ ๋ถ„๋ฆฌ, TypeScript ๋„์ž…, ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ์˜ ํ˜„๋Œ€ํ™”๋ฅผ ์ ์ง„์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค [1-3]. + +## ๐Ÿ“– Core Content +* **ํ…Œ์ŠคํŠธ ์ฃผ๋„ ์ ‘๊ทผ (Test-Driven Approach):** ๋ฆฌํŒฉํ† ๋ง ๋„์ค‘ ๊ธฐ์กด ๊ธฐ๋Šฅ์ด ์†์ƒ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ€์žฅ ๋จผ์ € ๋‹จ์œ„ ํ…Œ์ŠคํŠธ(Unit Test)๋‚˜ UI ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ์˜ ๊ธฐ์กด ๋™์ž‘์„ ๋ณด์žฅํ•˜๋ฉฐ ์•ˆ์ „ํ•˜๊ฒŒ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2, 4, 5]. +* **์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ (Incremental Migration):** ์ „์ฒด ์ฝ”๋“œ๋ฅผ ํ•œ ๋ฒˆ์— ์žฌ์ž‘์„ฑ(Rewrite)ํ•˜๋Š” ๊ฒƒ์€ ์œ„ํ—˜๋„๊ฐ€ ๋†’์œผ๋ฏ€๋กœ, ์ ์ง„์ ์ธ ์ ‘๊ทผ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Context API์—์„œ Zustand๋กœ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ, ํ•˜๋‚˜์˜ ์Šคํ† ์–ด๋‚˜ ๊ธฐ๋Šฅ ๋‹จ์œ„๋กœ ๋‹จ๊ณ„๋ณ„ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์ง„ํ–‰ํ•ด์•ผ ๋น„์ฆˆ๋‹ˆ์Šค ๊ฐœ๋ฐœ์˜ ์ค‘๋‹จ ์—†์ด ์•„ํ‚คํ…์ฒ˜๋ฅผ ํ˜„๋Œ€ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1]. +* **๊ตฌ์กฐ ๋ฐ ์ปดํฌ๋„ŒํŠธ ์ฑ…์ž„ ๋ถ„๋ฆฌ (Separation of Concerns):** 300์ค„ ์ด์ƒ์˜ ๋ฐฉ๋Œ€ํ•œ ์ปดํฌ๋„ŒํŠธ๋Š” ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)์— ๋”ฐ๋ผ ๋” ์ž‘๊ณ  ์ดˆ์ ์ด ๋งž์ถฐ์ง„ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ถ„๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [6, 7]. ๋ฐ์ดํ„ฐ ํŽ˜์นญ์ด๋‚˜ ํผ ์ฒ˜๋ฆฌ์™€ ๊ฐ™์€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์€ ์ปค์Šคํ…€ ํ›…(Custom Hooks)์œผ๋กœ ์ถ”์ถœํ•˜์—ฌ UI ์ปดํฌ๋„ŒํŠธ์™€ ์™„์ „ํžˆ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค [8, 9]. +* **์ƒํƒœ ๊ด€๋ฆฌ์˜ ํ˜„๋Œ€ํ™”:** ๊ณผ๊ฑฐ์˜ ๊ฑฐ๋Œ€ํ•œ ๋‹จ์ผ ์ „์—ญ ์ƒํƒœ๋ฅผ ์—ญํ• ์— ๋งž๊ฒŒ ๋ถ„๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. API์—์„œ ๊ฐ€์ ธ์˜ค๋Š” '์„œ๋ฒ„ ์ƒํƒœ'๋Š” TanStack Query(React Query)์™€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ ํŽ˜์นญ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์œ„์ž„ํ•˜๊ณ , 'ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ'๋Š” Zustand์™€ ๊ฐ™์€ ๊ฐ€๋ฒผ์šด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜ ์ง€์—ญ ์ƒํƒœ(Local State)๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๊ด€๋ฆฌํ•˜๋„๋ก ๊ฐœ์„ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [10-12]. +* **๋„๊ตฌ ๋ฐ ์ปจ๋ฒค์…˜์˜ ์ ์šฉ:** JavaScript ๊ธฐ๋ฐ˜ ์ฝ”๋“œ๋Š” TypeScript๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜์—ฌ ํƒ€์ž… ์•ˆ์ •์„ฑ์„ ํ™•๋ณดํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค [3, 11]. ๋˜ํ•œ, ESLint์™€ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ๋„์ž…ํ•ด ์ฝ”๋“œ ํฌ๋งทํŒ…๊ณผ ์•„ํ‚คํ…์ฒ˜ ๊ทœ์น™(์˜ˆ: ๋ชจ๋“ˆ ๊ฐ„ ์˜์กด์„ฑ ๊ทœ์น™)์„ ์ž๋™์œผ๋กœ ๊ฐ•์ œํ•ด์•ผ ํ•˜๋ฉฐ, ์ธ๋ผ์ธ ์Šคํƒ€์ผ์ด๋‚˜ ์—ฌ๋Ÿฌ ๋ฐฉ์‹์ด ํ˜ผ์žฌ๋œ CSS๋ฅผ ํ•œ ๊ฐ€์ง€ ๋ฐฉ์‹(์˜ˆ: CSS Modules, Tailwind ๋“ฑ)์œผ๋กœ ํ†ต์ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [13-15]. +* **๊ณผ๊ฑฐ์˜ ํŒจํ„ด ์ œ๊ฑฐ:** ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žˆ๋‹ค๋ฉด ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์™€ ํ›…(Hooks)์œผ๋กœ ๊ต์ฒดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [11]. ์ตœ์‹  React(์˜ˆ: React 19)๋‚˜ React Compiler๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ™˜๊ฒฝ์ด๋ผ๋ฉด ๋ถˆํ•„์š”ํ•œ `useEffect`, `useMemo`, `useCallback` ๋“ฑ์„ ์ œ๊ฑฐํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ๋”์šฑ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [11, 16, 17]. + +## โš–๏ธ Trade-offs & Caveats +* **์ถ”์ƒํ™”์˜ ํ•จ์ •๊ณผ ์˜ค๋ฒ„์—”์ง€๋‹ˆ์–ด๋ง (KISS vs DRY):** DRY(Don't Repeat Yourself) ์›์น™์„ ๋”ฐ๋ฅด๊ธฐ ์œ„ํ•ด ์„ฑ๊ธ‰ํ•˜๊ฒŒ ๊ณตํ†ต ๋กœ์ง์„ ์ถ”์ƒํ™”ํ•˜๋ฉด, ์ฝ”๋“œ๊ฐ€ ์›๋ž˜์˜ ๋ฐ˜๋ณต๋œ ์ฝ”๋“œ๋ณด๋‹ค ๋” ๋ณต์žกํ•ด์ง€๊ณ  ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์›Œ์ง€๋Š” ๋ถ€์ž‘์šฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ „๋ฌธ๊ฐ€๋“ค์€ ํŒจํ„ด์ด 3๋ฒˆ ์ด์ƒ ๋ฐ˜๋ณต๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ ์ถ”์ƒํ™”(Custom Hook ๋“ฑ)๋ฅผ ์ง„ํ–‰ํ•  ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค [18]. +* **TypeScript ์ฑ„ํƒ์˜ ์ธ์ง€์  ๋ถ€ํ•˜:** ๋ฆฌํŒฉํ† ๋ง ์‹œ TypeScript๋ฅผ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์€ ์žฅ๊ธฐ์  ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•˜์ง€๋งŒ, ๊ฒฝํ—˜์ด ๋ถ€์กฑํ•œ ๊ฐœ๋ฐœํŒ€์—๊ฒŒ๋Š” ์ƒˆ๋กœ์šด ๋ณต์žก์„ฑ ๋ ˆ์ด์–ด๋กœ ์ž‘์šฉํ•˜์—ฌ ์ดˆ๊ธฐ์— ์ƒ์‚ฐ์„ฑ์„ ๋Šฆ์ถœ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ•์ œ ๋„์ž…๋ณด๋‹ค๋Š” ๊ฐœ๋ณ„ ํŒŒ์ผ๋ถ€ํ„ฐ ์ ์ง„์ ์œผ๋กœ ์ „ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ์ถ”์ฒœ๋ฉ๋‹ˆ๋‹ค [3]. +* **์•„ํ‚คํ…์ฒ˜ ๋„์ž… ๋น„์šฉ:** Feature-Sliced Design(FSD)๊ณผ ๊ฐ™์ด ์—„๊ฒฉํ•œ ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ๊ฐ•์ œํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜๋กœ ํด๋” ๊ตฌ์กฐ๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•˜๋Š” ๊ฒƒ์€ ํฐ ํ•™์Šต ๊ณก์„ ๊ณผ ์„ค์ • ๋น„์šฉ์„ ์ˆ˜๋ฐ˜ํ•ฉ๋‹ˆ๋‹ค. ํŒ€ ์ „์ฒด์˜ ์ดํ•ด๋„๊ฐ€ ์—†์œผ๋ฉด ์˜คํžˆ๋ ค ์‹œ์Šคํ…œ์ด ์—‰๋ง์ด ๋˜๊ฑฐ๋‚˜ ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๊ณผ๋„ํ•œ ์„ค๊ณ„(Overkill)๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [19-21]. +* **์™„์ „ ์žฌ์ž‘์„ฑ(Rewrite)์˜ ์œ„ํ—˜์„ฑ:** ํ”„๋กœ์ ํŠธ๊ฐ€ ๋งค์šฐ ์ž‘๋‹ค๋ฉด ์•„์˜ˆ ์ฒ˜์Œ๋ถ€ํ„ฐ ์ƒˆ๋กœ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋น ๋ฅผ ์ˆ˜๋„ ์žˆ์œผ๋‚˜ [4], ์ผ๋ฐ˜์ ์ธ ํ™˜๊ฒฝ์—์„œ๋Š” ๊ธฐ์กด ๊ธฐ๋Šฅ์„ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜๋ฉด์„œ ์ฝ”๋“œ๋ฅผ ๊ฐœ์„ ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ „๋ฉด ์žฌ์ž‘์„ฑ๋ณด๋‹ค๋Š” ์•ˆ์ „์„ฑ์„ ๋‹ด๋ณดํ•œ ์ ์ง„์  ๋ฆฌํŒฉํ† ๋ง์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค [1]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [๊ด€๊ณ„ ์œ ํ˜• A (์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ )] +- [[Feature-Sliced Design]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋ฆฌํŒฉํ† ๋ง ๊ณผ์ •์—์„œ ๊ธฐ์ˆ  ๋‹จ์œ„(Component, Hooks ๋“ฑ)๋กœ ํฉ์–ด์ง„ ๊ธฐ์กด ํด๋” ๊ตฌ์กฐ๋ฅผ ๊ธฐ๋Šฅ(Feature) ์ค‘์‹ฌ์œผ๋กœ ๋ชจ๋“ˆํ™”ํ•˜๊ณ  ์žฌํŽธํ•  ๋•Œ ๊ธฐ์ค€์ด ๋˜๋Š” ํ˜„๋Œ€์ ์ธ ํ”„๋ก ํŠธ์—”๋“œ ์•„ํ‚คํ…์ฒ˜๋ก ์ž…๋‹ˆ๋‹ค [22, 23]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํ™•์žฅ์„ฑ์„ ์œ„ํ•œ ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ๊ทœ์น™๊ณผ ๋„๋ฉ”์ธ ์ค‘์‹ฌ์˜ ์ฝ”๋“œ ์บก์Аํ™” ์„ค๊ณ„ ๋ฐฉ๋ฒ•. +- [[SOLID Principles]] + - ์—ฐ๊ฒฐ ์ด์œ : ๊ฑฐ๋Œ€ํ•œ React ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ž‘๊ฒŒ ๋ถ„๋ฆฌํ•˜๊ณ  ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ, ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)๊ณผ ๊ฐ™์€ ํด๋ฆฐ ์ฝ”๋“œ์˜ ๊ธฐ๋ฐ˜ ์ง€์นจ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [6, 24]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ์˜ ์ฑ…์ž„์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ถ„๋ฆฌํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ์‰ฌ์šด ์ถ”์ƒํ™”๋ฅผ ์„ค๊ณ„ํ•˜๋Š” ๊ธฐ์ค€. + +#### [๊ด€๊ณ„ ์œ ํ˜• B (๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ)] +- [[TanStack Query]] + - ์—ฐ๊ฒฐ ์ด์œ : ๊ธฐ์กด์˜ ๋น„ํšจ์œจ์ ์ธ Context API๋‚˜ ๊ฑฐ๋Œ€ํ•œ Redux ์Šคํ† ์–ด๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•  ๋•Œ, ์„œ๋ฒ„ ์ƒํƒœ(์บ์‹ฑ, ๋™๊ธฐํ™” ๋“ฑ)๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ๋ถ„๋ฆฌํ•ด ์ฃผ๋Š” ํ•ต์‹ฌ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค [10, 11]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์„œ๋ฒ„ ๋ฐ์ดํ„ฐ ํŽ˜์นญ ๋กœ์ง์˜ ๋ถ„๋ฆฌ์™€ ์ปดํฌ๋„ŒํŠธ ๋‚ด ๋ณต์žกํ•œ ์ƒํƒœ ๊ด€๋ฆฌ ๊ฐ์†Œ ๋ฐฉ๋ฒ•. +- [[Zustand]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋ถˆํ•„์š”ํ•œ ์žฌ๋ Œ๋”๋ง์„ ์œ ๋ฐœํ•˜๋Š” ๊ธฐ์กด์˜ Context API ๊ธฐ๋ฐ˜ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•  ๋•Œ ์ฃผ๋กœ ๋„์ž…๋˜๋Š” ๊ฒฝ๋Ÿ‰ ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค [1, 25]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ƒํƒœ ์„ ํƒ์ž(Selector)๋ฅผ ํ†ตํ•œ ๋ Œ๋”๋ง ์ตœ์ ํ™” ๊ตฌ์กฐ ๋ฐ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์—†๋Š” ์ƒํƒœ ๊ด€๋ฆฌ ๋กœ์ง ์ž‘์„ฑ๋ฒ•. +- [[Unit Testing]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋ฆฌํŒฉํ† ๋ง ์‹œ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜๋”๋ผ๋„ ๊ธฐ์กด์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ํŒŒ๊ดด๋˜์ง€ ์•Š์Œ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ๋ฆฌํŒฉํ† ๋ง ์ž‘์—…์— ์„ ํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค [2, 5]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ๊ฒ€์ฆ ๊ฐ€๋Šฅํ•œ ํ˜•ํƒœ๋กœ ์ชผ๊ฐœ๊ณ  ์•ˆ์ „์„ฑ์„ ํ™•๋ณดํ•˜๋Š” ์‹ค์งˆ์ ์ธ ์—”์ง€๋‹ˆ์–ด๋ง ์ ˆ์ฐจ. + +### Deeper Research Questions +- ๋ ˆ๊ฑฐ์‹œ React ์•ฑ์—์„œ Context API๋ฅผ Zustand๋กœ ์ ์ง„์ ์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ๋•Œ(Incremental Migration), ์ƒํƒœ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ€์žฅ ์•ˆ์ „ํ•œ ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? +- ๋Œ€๊ทœ๋ชจ ๋ฆฌํŒฉํ† ๋ง ์ง„ํ–‰ ์‹œ, Feature-Sliced Design(FSD) ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋„์ž…ํ•  ๋•Œ ๊ธฐ์กด ์ปดํฌ๋„ŒํŠธ ๊ฐ„์˜ ๊ฒฐํ•ฉ(Cross-cutting concerns)์„ ์–ด๋–ป๊ฒŒ ๊ณ„์ธต์ ์œผ๋กœ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- React Compiler ํ™˜๊ฒฝ์ด ๋„์ž…๋˜์—ˆ์„ ๋•Œ, ๋ฆฌํŒฉํ† ๋ง ์‹œ ๊ธฐ์กด ์ฝ”๋“œ์— ๋‚จ์šฉ๋œ `useMemo`์™€ `useCallback`์„ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ด ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ ๋ฐ ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์— ์–ด๋–ค ๊ตฌ์ฒด์ ์ธ ์ด์ ์„ ์ฃผ๋Š”๊ฐ€? +- ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ํ˜ผ์žฌ๋œ ๊ฑฐ๋Œ€ํ•œ ํผ(Form) ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•  ๋•Œ ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)๊ณผ YAGNI ์›์น™ ๊ฐ„์˜ ๊ท ํ˜•์„ ๋งž์ถ”๋Š” ๊ธฐ์ค€์€ ๋ฌด์—‡์ธ๊ฐ€? +- ๋Œ€๊ทœ๋ชจ TypeScript ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์ง„ํ–‰ํ•  ๋•Œ ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ ์ €ํ•˜๋ฅผ ๋ฐฉ์ง€ํ•˜๋ฉด์„œ ์ ์ง„์  ํƒ€์ž… ์ •์˜๋ฅผ ์ ์šฉํ•˜๋Š” ๋ชจ๋ฒ” ์‚ฌ๋ก€๋Š” ๋ฌด์—‡์ธ๊ฐ€? + +### Practical Application Contexts +- **Implementation:** ๋น„๋Œ€ํ•ด์ง„ React ์ปดํฌ๋„ŒํŠธ์—์„œ API ํ˜ธ์ถœ๊ณผ ์ƒํƒœ ๊ด€๋ฆฌ ๋กœ์ง์„ ๋ถ„๋ฆฌํ•˜์—ฌ Custom Hook์œผ๋กœ ์ž‘์„ฑํ•˜๊ณ , ESLint๋ฅผ ๋„์ž…ํ•˜์—ฌ ์ฝ”๋“œ ์ปจ๋ฒค์…˜๊ณผ ์•„ํ‚คํ…์ฒ˜ ๊ทœ์น™ ์œ„๋ฐ˜์„ ๋ฆฐํŠธ(Lint) ๋‹จ๊ณ„์—์„œ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค. +- **System Design:** ํ”„๋กœ์ ํŠธ์˜ ํŒŒ์ผ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๋‹จ์ˆœํ•œ ๊ธฐ๋Šฅ๋ณ„(File-type based) ๋ถ„๋ฅ˜์—์„œ Feature-Sliced Design๊ณผ ๊ฐ™์€ ๋„๋ฉ”์ธ/๋น„์ฆˆ๋‹ˆ์Šค ์ค‘์‹ฌ์˜ ๊ณ„์ธตํ˜• ๊ตฌ์กฐ๋กœ ์žฌ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค. +- **Operation / Maintenance:** ์„œ๋น„์Šค๋ฅผ ์ค‘๋‹จํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด ํ•œ ๋ฒˆ์— ๋ชจ๋“  ์‹œ์Šคํ…œ์„ ๋ฐ”๊พธ์ง€ ์•Š๊ณ , ํ•˜๋‚˜์˜ ์Šคํ† ์–ด๋‚˜ ํŠน์ • ๊ธฐ๋Šฅ ๋ชจ๋“ˆ ๋‹จ์œ„๋กœ ๋ฆฌํŒฉํ† ๋ง์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ ์ง„์  ์ ‘๊ทผ๋ฒ•์„ ์šด์˜ํ•ฉ๋‹ˆ๋‹ค. +- **Learning Path:** React ๊ธฐ์ดˆ ์Šต๋“ โž” Clean Code ๋ฐ SOLID ์›์น™ ์ดํ•ด โž” ์ƒํƒœ ๊ด€๋ฆฌ์˜ ์„ธ๋ถ„ํ™”(์„œ๋ฒ„ ๋ฐ์ดํ„ฐ vs UI ์ƒํƒœ) โž” ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ โž” ์ ์ง„์  ๋ฆฌํŒฉํ† ๋ง ์ ์šฉ ์ˆœ์œผ๋กœ ์—”์ง€๋‹ˆ์–ด๋ง ์—ญ๋Ÿ‰์„ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค. +- **My Project Relevance:** ํ˜„์žฌ ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ณ  ์žˆ๋Š” ๋ณต์žกํ•œ ๋ ˆ๊ฑฐ์‹œ React ํ”„๋กœ์ ํŠธ์˜ ์„ฑ๋Šฅ ๋ฐ ์œ ์ง€๋ณด์ˆ˜์„ฑ ์ €ํ•˜ ์›์ธ์„ ๋ถ„์„ํ•˜๊ณ , ์ปดํฌ๋„ŒํŠธ ๋ถ„๋ฆฌ์™€ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(Zustand, React Query) ๊ต์ฒด ์ž‘์—…์„ ์ฒด๊ณ„์ ์œผ๋กœ ๊ธฐํšํ•  ๋•Œ ์ง์ ‘ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### Adjacent Topics +- [[Web Performance Optimization]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋ฆฌํŒฉํ† ๋ง์˜ ๊ถ๊ทน์  ๊ฒฐ๊ณผ๋ฌผ ์ค‘ ํ•˜๋‚˜์ธ ์ดˆ๊ธฐ ๋กœ๋”ฉ ์†๋„ ํ–ฅ์ƒ, ๋ Œ๋”๋ง ์ตœ์ ํ™”, ๊ทธ๋ฆฌ๊ณ  ๋ถˆํ•„์š”ํ•œ ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ๋ฅผ ์ค„์ด๋Š” ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…(Code Splitting) ๊ธฐ๋ฒ• ๋“ฑ์œผ๋กœ ๊ฐœ๋…์„ ํ™•์žฅํ•˜์—ฌ ํ•™์Šตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[Git Workflow & CI/CD]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋Œ€๊ทœ๋ชจ ๋ฆฌํŒฉํ† ๋ง ์‹œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ธŒ๋žœ์น˜ ์ถฉ๋Œ ๋ฐฉ์ง€์™€ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ์ž๋™ํ™”, ๊ทธ๋ฆฌ๊ณ  Pull Request ๊ณผ์ •์—์„œ Visual Regression Testing์„ ์—ฐ๋™ํ•˜๋Š” ๋“ฑ ํ˜‘์—… ์ „๋žต์œผ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Topics_Blog/React DevTools Profiler.md b/10_Wiki/Topics_Blog/React DevTools Profiler.md new file mode 100644 index 00000000..0ed6a720 --- /dev/null +++ b/10_Wiki/Topics_Blog/React DevTools Profiler.md @@ -0,0 +1,52 @@ +# [[React DevTools Profiler]] + +## ๐Ÿ“Œ Brief Summary +React DevTools Profiler๋Š” React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ Œ๋”๋ง ์„ฑ๋Šฅ์„ ์ธก์ •ํ•˜๊ณ  ์ตœ์ ํ™” ๋Œ€์ƒ์„ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด React DevTools์— ๋‚ด์žฅ๋œ ํ”„๋กœํŒŒ์ผ๋ง ๋ฐ ๋””๋ฒ„๊น… ๋„๊ตฌ์ด๋‹ค [1]. ์ด ๋„๊ตฌ๋Š” ์–ด๋–ค ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ธ์ œ, ์–ผ๋งˆ๋‚˜ ์˜ค๋ž˜ ๋ Œ๋”๋ง๋˜์—ˆ๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์–ด๋–ค ์š”์ธ(props, state ๋ณ€๊ฒฝ ๋“ฑ)์ด ๋ Œ๋”๋ง์„ ์œ ๋ฐœํ–ˆ๋Š”์ง€ ํŒŒ์•…ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค [1, 2]. ์ฃผ๋กœ ๋กœ์ปฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ์‹๋ณ„ํ•˜๊ณ  ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ์ฐพ์•„๋‚ด๋Š” ๋ฐ ํ•ต์‹ฌ์ ์œผ๋กœ ํ™œ์šฉ๋œ๋‹ค [3]. + +## ๐Ÿ“– Core Content +* **๋ Œ๋”๋ง ์ถ”์  ๋ฐ ์‹œ๊ฐํ™”**: Profiler๋Š” ํŠน์ • props๋‚˜ ์ƒํƒœ(state) ๋ณ€๊ฒฝ ๋“ฑ ์ปดํฌ๋„ŒํŠธ์˜ ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•œ ์ •ํ™•ํ•œ ์›์ธ์„ ์ถ”์ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค [1, 2]. ํ”Œ๋ ˆ์ž„๊ทธ๋ž˜ํ”„(Flamegraph)์™€ ์ˆœ์œ„ ๋ทฐ(Ranked views)๋ฅผ ์ œ๊ณตํ•˜์—ฌ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ ์ง€์ ์„ ์‹œ๊ฐ์ ์œผ๋กœ ์‰ฝ๊ฒŒ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š”๋‹ค [2]. +* **์ตœ์ ํ™” ํ•„์š”์„ฑ ๊ฒ€์ฆ (์ธก์ • ๊ธฐ๋ฐ˜ ์ตœ์ ํ™”)**: `React.memo`์™€ ๊ฐ™์€ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๊ธฐ์ˆ ์„ ์ ์šฉํ•˜๊ธฐ ์ „์—, ์ปดํฌ๋„ŒํŠธ์˜ ๋ฆฌ๋ Œ๋”๋ง ๋น„์šฉ์ด ์ตœ์ ํ™” ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๊ฐ์ˆ˜ํ•  ๋งŒํผ ํฐ์ง€ ์ธก์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค [4]. ๋˜ํ•œ, ๋ฉ”๋ชจ์ด์ œ์ด์…˜๋œ ์ปดํฌ๋„ŒํŠธ ๋‚ด์˜ prop ๋ณ€๊ฒฝ์„ ์ถ”์ ํ•˜์—ฌ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ฆฌ๋ Œ๋”๋ง๋˜๋Š”์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค [5]. "์ธก์ •ํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ์ตœ์ ํ™”ํ•˜์ง€ ๋ง๋ผ"๋Š” ์›์น™์— ๋”ฐ๋ผ, ํ”„๋กœํŒŒ์ผ๋ง์€ ์„ฑ๋Šฅ ํ•ซ์ŠคํŒŸ์—๋งŒ ์ง‘์ค‘ํ•˜๋„๋ก ๋•๋Š”๋‹ค [2, 6]. +* **React Compiler ์‹œ๊ฐํ™”**: React Compiler๊ฐ€ ์ ์šฉ๋œ ํ™˜๊ฒฝ์—์„œ๋Š” Profiler ํƒญ์—์„œ ์ž๋™ ์ตœ์ ํ™”๋œ ์ปดํฌ๋„ŒํŠธ์— `Memo โœจ` ๋ฐฐ์ง€๊ฐ€ ํ‘œ์‹œ๋œ๋‹ค [7, 8]. ์ž…๋ ฅ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•„ ๋ฆฌ๋ Œ๋”๋ง์„ ๊ฑด๋„ˆ๋›ด ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋Š” ํšŒ์ƒ‰์œผ๋กœ ํ‘œ์‹œ๋˜๋ฉฐ, ๋งˆ์šฐ์Šค๋ฅผ ์˜ฌ๋ฆฌ๋ฉด ์ž๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๋ฐ ๋ฆฌ๋ Œ๋”๋ง ์ƒ๋žต ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๋Š” ํˆดํŒ์ด ๋‚˜ํƒ€๋‚œ๋‹ค [8]. +* **๋ธ”๋ž™๋ฐ•์Šค ํ™˜๊ฒฝ์—์„œ์˜ ๋””๋ฒ„๊น… ํ•„์ˆ˜์„ฑ**: React Compiler ๋„์ž… ์‹œ ๊ธฐ์กด์˜ ๋ช…์‹œ์ ์ธ `React.memo`, `useMemo`, `useCallback` ํ˜ธ์ถœ์ด ์ฝ”๋“œ์—์„œ ์‚ฌ๋ผ์ ธ ๋ Œ๋”๋ง ์ œ์–ด๊ฐ€ ๋ธ”๋ž™๋ฐ•์Šค์ฒ˜๋Ÿผ ์ž‘๋™ํ•˜๊ฒŒ ๋œ๋‹ค [9]. ๋”ฐ๋ผ์„œ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ฆฌ๋ Œ๋”๋ง ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ, ์ด๋ฅผ ์ฝ”๋“œ ์ƒ์—์„œ ํ™•์ธํ•˜๋Š” ๋Œ€์‹  Profiler๋ฅผ ํ†ตํ•ด ์ง์ ‘ ์กฐ์‚ฌํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๊ทธ ์ค‘์š”์„ฑ์ด ๋”์šฑ ์ปค์ง„๋‹ค [9]. + +## โš–๏ธ Trade-offs & Caveats +* **ํ•ด์„์ƒ์˜ ์ฃผ์˜์  (`Memo โœจ` ๋ฐฐ์ง€์˜ ํ•จ์ •)**: Profiler ํƒญ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” `Memo โœจ` ๋ฐฐ์ง€๋Š” ๋‹ค์†Œ ์˜คํ•ด๋ฅผ ๋ถˆ๋Ÿฌ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋‹ค [10]. ์ด ๋ฐฐ์ง€๋Š” React Compiler๊ฐ€ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ฒ˜๋ฆฌ(Compile)ํ–ˆ์Œ์„ ๋‚˜ํƒ€๋‚ผ ๋ฟ, ์ตœ์ ํ™”๊ฐ€ ์™„๋ฒฝํ•˜๊ฒŒ ์„ฑ๊ณตํ–ˆ์Œ์„ ์˜๋ฏธํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค [10]. ์ปดํฌ๋„ŒํŠธ์— ๋ฐฐ์ง€๊ฐ€ ํ‘œ์‹œ๋˜์–ด ์žˆ๋”๋ผ๋„, ์ธ๋ผ์ธ ๊ฐ์ฒด๋‚˜ ํ•จ์ˆ˜์™€ ๊ฐ™์€ ๋ถˆ์•ˆ์ •ํ•œ ์ฐธ์กฐ๋ฅผ ๊ฐ€์ง„ props๊ฐ€ ์ „๋‹ฌ๋œ๋‹ค๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ง‰์ง€ ๋ชปํ•ด ์—ฌ์ „ํžˆ ๋งค๋ฒˆ ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค [10]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [๊ด€๊ณ„ ์œ ํ˜• A: ์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] +- [[React Compiler]] + - ์—ฐ๊ฒฐ ์ด์œ : React Compiler๊ฐ€ ๋นŒ๋“œ ํƒ€์ž„์— ์ฃผ์ž…ํ•œ ์ž๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๋กœ์ง์˜ ์„ฑ๊ณต ์—ฌ๋ถ€์™€ ๋ Œ๋”๋ง ์Šคํ‚ต ๊ฒฐ๊ณผ๋ฅผ Profiler๋ฅผ ํ†ตํ•ด ์‹œ๊ฐ์ ์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค [7-9]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ช…์‹œ์ ์ธ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ์ฝ”๋“œ ์—†์ด๋„ ๋ Œ๋”๋ง ์„ฑ๋Šฅ์ด ์ตœ์ ํ™”๋˜๋Š” ์›๋ฆฌ์™€, ๋ธ”๋ž™๋ฐ•์Šคํ™”๋œ ๋ Œ๋”๋ง ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๋””๋ฒ„๊น…ํ•˜๋Š” ๋ฐฉ๋ฒ• [9, 11]. + +#### [๊ด€๊ณ„ ์œ ํ˜• B: ๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ] +- [[React.memo]] + - ์—ฐ๊ฒฐ ์ด์œ : Profiler๋ฅผ ํ†ตํ•ด ํŠน์ • ์ปดํฌ๋„ŒํŠธ์˜ ๋ Œ๋”๋ง ๋นˆ๋„์™€ ๋น„์šฉ์„ ์ธก์ •ํ•œ ๋’ค, ๊ทธ ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ `React.memo` ์ ์šฉ์ด ์„ฑ๋Šฅ ํ–ฅ์ƒ์— ์‹ค์งˆ์ ์ธ ๋„์›€์ด ๋ ์ง€ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๋‹ค [4]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์–•์€ ๋น„๊ต(Shallow comparison)์˜ ์›๋ฆฌ์™€ ํ”„๋กœํŒŒ์ผ๋ง ๋ฐ์ดํ„ฐ์— ๊ธฐ๋ฐ˜ํ•œ ์ „๋žต์  ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๋ฐฉ๋ฒ• [4, 12, 13]. +- [[useCallback & useMemo]] + - ์—ฐ๊ฒฐ ์ด์œ : Profiler์—์„œ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ฐธ์กฐ(Reference) ๋ณ€๊ฒฝ ๋•Œ๋ฌธ์— ๊ณ„์† ๋ฆฌ๋ Œ๋”๋ง๋˜๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ๋‹ค๋ฉด, ์ด ํ›…๋“ค์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฐธ์กฐ ์•ˆ์ •์„ฑ(Reference stability)์„ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ๋‹ค [5, 14]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํ•จ์ˆ˜๋‚˜ ๊ฐ์ฒด์˜ ์ฐธ์กฐ ๋™์ผ์„ฑ์ด ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง ํŠธ๋ฆฌ์— ๋ฏธ์น˜๋Š” ์ง์ ‘์ ์ธ ์˜ํ–ฅ [14]. + +### Deeper Research Questions +- React DevTools Profiler์˜ ํ”Œ๋ ˆ์ž„๊ทธ๋ž˜ํ”„(Flamegraph)์™€ ์ˆœ์œ„ ๋ทฐ(Ranked view)๋ฅผ ์–ด๋–ป๊ฒŒ ๋ถ„์„ํ•ด์•ผ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ๊ฐ€์žฅ ๋น ๋ฅด๊ณ  ์ •ํ™•ํ•˜๊ฒŒ ์ฐพ์•„๋‚ผ ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- ๋ช…์‹œ์ ์ธ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ํ›…์ด ์ œ๊ฑฐ๋˜๋Š” React Compiler ํ™˜๊ฒฝ์—์„œ, Profiler๋ฅผ ํ†ตํ•œ ์„ฑ๋Šฅ ๋””๋ฒ„๊น… ์›Œํฌํ”Œ๋กœ์šฐ๋Š” ๊ธฐ์กด๊ณผ ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ๋‹ฌ๋ผ์ง€๋Š”๊ฐ€? +- Profiler๋ฅผ ํ†ตํ•ด ์‹๋ณ„๋œ ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ๋•Œ, ์–ด๋–ค ์ƒํ™ฉ์—์„œ ๊ตฌ์กฐ ์žฌ์„ค๊ณ„(์˜ˆ: Context API ๋Œ€์‹  Zustand ๋„์ž…)๊ฐ€ ๋‹จ์ˆœํ•œ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ์ ์šฉ๋ณด๋‹ค ๋” ๋‚˜์€ ์„ ํƒ์ด ๋˜๋Š”๊ฐ€? +- ๋กœ์ปฌ ํ™˜๊ฒฝ์˜ Profiler์—์„œ ๊ด€์ฐฐ๋˜๋Š” ๋ Œ๋”๋ง ์‹œ๊ฐ„๊ณผ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์˜ ์‹ค์ œ ์‚ฌ์šฉ์ž ์ฒด๊ฐ ์„ฑ๋Šฅ(Core Web Vitals์˜ INP ๋“ฑ) ๊ฐ„์˜ ์ฐจ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ๋ณด์ •ํ•˜์—ฌ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? + +### Practical Application Contexts +- **Implementation:** ๋ Œ๋”๋ง ์ตœ์ ํ™” ์ฝ”๋“œ๋ฅผ ๋ฌด์ž‘์ • ์ถ”๊ฐ€ํ•˜๊ธฐ ์ „์—, Profiler๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์‹ค์ œ ๋ Œ๋”๋ง ๋นˆ๋„์™€ ์‹คํ–‰ ์‹œ๊ฐ„์„ ์ธก์ •ํ•จ์œผ๋กœ์จ ๋ Œ๋”๋ง์ด ๋ฌด๊ฑฐ์šด(expensive) ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ •ํ™•ํžˆ ์‹๋ณ„ํ•œ๋‹ค [4, 6]. +- **System Design:** Context API์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ Œ๋”๋ง๋˜๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ๊ธ€๋กœ๋ฒŒ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(Zustand ๋“ฑ) ๋„์ž…์ด๋‚˜ ์ƒํƒœ ๋„๋ฉ”์ธ ๋ถ„๋ฆฌ์˜ ๊ธฐ์ˆ ์  ํƒ€๋‹น์„ฑ์„ ๊ฒ€์ฆํ•œ๋‹ค [15-18]. +- **Operation / Maintenance:** ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ฑฐ๋‚˜ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ๋ฆด๋ฆฌ์Šคํ•œ ์งํ›„, ํ”Œ๋ ˆ์ž„๊ทธ๋ž˜ํ”„๋ฅผ ์ •๊ธฐ์ ์œผ๋กœ ๋ฆฌ๋ทฐํ•˜์—ฌ ์˜๋„์น˜ ์•Š์€ ์„ฑ๋Šฅ ํšŒ๊ท€(Regression)๋ฅผ ์‹๋ณ„ํ•˜๊ณ  ๊ด€๋ฆฌํ•œ๋‹ค [19]. +- **Learning Path:** React ์ž…๋ฌธ์ž๋‚˜ ํŒ€์›๋“ค์ด Props, State, Context๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ฐ˜์‘ํ•˜๊ณ  ์žฌ๋ Œ๋”๋ง๋˜๋Š”์ง€๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ๋ณด์—ฌ์คŒ์œผ๋กœ์จ ๋ Œ๋”๋ง ๋ชจ๋ธ์„ ๊นŠ๊ฒŒ ์ดํ•ด์‹œํ‚จ๋‹ค [1, 20]. +- **My Project Relevance:** ํ™”๋ฉด ๋‚ด ๋Œ€์šฉ๋Ÿ‰ ๋ฆฌ์ŠคํŠธ๋‚˜ ๋ณต์žกํ•œ ํ•„ํ„ฐ๋ฅผ ์กฐ์ž‘ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์ง€์—ฐ ํ˜„์ƒ(Jank)์˜ ์›์ธ์ด ๋ Œ๋”๋ง ์‹œ๊ฐ„ ์ž์ฒด์ธ์ง€, ์•„๋‹ˆ๋ฉด ๋ถˆํ•„์š”ํ•œ ์—ฐ์‡„ ๋ฆฌ๋ Œ๋”๋ง ๋•Œ๋ฌธ์ธ์ง€ ์ง„๋‹จํ•˜๊ณ  ํ•ด๊ฒฐ์ฑ…์„ ๋งˆ๋ จํ•œ๋‹ค [21, 22]. + +### Adjacent Topics +- [[why-did-you-render]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: Profiler์™€ ๊ฒฐํ•ฉํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ, ์‹ค์ œ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์ด ์—†์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง๋œ '์ •ํ™•ํ•œ ์ด์œ '๋ฅผ ์ฝ˜์†”์— ๊ฒฝ๊ณ  ํ˜•ํƒœ๋กœ ๋‚จ๊ฒจ์ฃผ์–ด ๋””๋ฒ„๊น…์„ ๋”์šฑ ์‰ฝ๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๋„๊ตฌ์— ๋Œ€ํ•ด ์กฐ์‚ฌํ•œ๋‹ค [3, 23]. +- [[Chrome DevTools Performance Tab]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: Profiler๊ฐ€ ์•Œ๋ ค์ฃผ๋Š” React ๋‚ด๋ถ€์˜ ๋ Œ๋”๋ง ์†๋„ ์ด์™ธ์—, ํ”„๋ ˆ์ž„ ๋“œ๋กญ์ด๋‚˜ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋ฅผ ๋ง‰๋Š” ๋ฌด๊ฑฐ์šด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰, ๋ ˆ์ด์•„์›ƒ ์ด๋™ ๋“ฑ ๋ธŒ๋ผ์šฐ์ € ๋ ˆ๋ฒจ์˜ ์ „์ฒด์ ์ธ ์„ฑ๋Šฅ ๋ถ„์„์œผ๋กœ ์‹œ์•ผ๋ฅผ ํ™•์žฅํ•œ๋‹ค [3, 23]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Topics_Blog/React.lazy().md b/10_Wiki/Topics_Blog/React.lazy().md new file mode 100644 index 00000000..afb49c8c --- /dev/null +++ b/10_Wiki/Topics_Blog/React.lazy().md @@ -0,0 +1,65 @@ +# [[React.lazy()]] + +## ๐Ÿ“Œ Brief Summary +`React.lazy()`๋Š” ๋ฆฌ์•กํŠธ(React)์—์„œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ•„์š”ํ•œ ์‹œ์ ์— ๋™์ ์œผ๋กœ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋‚ด์žฅ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค [1]. ์ด ๊ธฐ๋Šฅ์„ ๋™์  ์ž„ํฌํŠธ(Dynamic Imports)์™€ ๊ฒฐํ•ฉํ•˜๋ฉด ๊ฑฐ๋Œ€ํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค์„ ๋” ์ž‘์€ ์ฒญํฌ(Chunk)๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2, 3]. ๊ฒฐ๊ณผ์ ์œผ๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ์•ฑ์— ์ฒ˜์Œ ์ ‘๊ทผํ•  ๋•Œ ๋‹ค์šด๋กœ๋“œํ•ด์•ผ ํ•˜๋Š” ์ดˆ๊ธฐ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŽ˜์ด๋กœ๋“œ ํฌ๊ธฐ๋ฅผ ๋Œ€ํญ ์ค„์—ฌ ์•ฑ์˜ ์ดˆ๊ธฐ ๋กœ๋“œ ์†๋„์™€ ์ „๋ฐ˜์ ์ธ ์„ฑ๋Šฅ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค [2-4]. + +## ๐Ÿ“– Core Content +* **์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…(Code Splitting)๊ณผ ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ ๊ฐ์†Œ:** + ์ดˆ๊ธฐ ๋กœ๋“œ ์‹œ ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ํ•œ ๋ฒˆ์— ๋ถˆ๋Ÿฌ์˜ค๋ฉด ๋ฒˆ๋“ค ํฌ๊ธฐ๊ฐ€ ๋น„๋Œ€ํ•ด์ ธ ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [5]. `React.lazy()`๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฑฐ๋Œ€ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋ฅผ ์ž˜๊ฒŒ ์ชผ๊ฐœ์–ด, ํŠน์ • ๋ผ์šฐํŠธ๋‚˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง๋  ๋•Œ๋งŒ ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ๋‹ค์šด๋กœ๋“œํ•˜๋„๋ก ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1, 6, 7]. +* **Suspense์™€์˜ ๊ฒฐํ•ฉ:** + `React.lazy()`๋กœ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ปดํฌ๋„ŒํŠธ๋Š” ๋ฐ˜๋“œ์‹œ `` ์ปดํฌ๋„ŒํŠธ๋กœ ๊ฐ์‹ธ์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [1, 3]. ``๋Š” ๋ชจ๋“ˆ์ด ๋กœ๋“œ๋˜๋Š” ๋™์•ˆ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ค„ ๋Œ€์ฒด UI(์˜ˆ: ๋กœ๋”ฉ ์Šคํ”ผ๋„ˆ)๋ฅผ `fallback` ์†์„ฑ์„ ํ†ตํ•ด ์ •์˜ํ•˜์—ฌ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๋งค๋„๋Ÿฝ๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค [1, 3, 8]. +* **์ ์šฉ ๋Œ€์ƒ(Use Cases):** + * **๋ผ์šฐํŠธ ๊ธฐ๋ฐ˜ ์ปดํฌ๋„ŒํŠธ(Route-based components):** ์‚ฌ์šฉ์ž๊ฐ€ ํŠน์ • ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•  ๋•Œ๋งŒ ํ•ด๋‹น ํŽ˜์ด์ง€ ์ฝ”๋“œ๋ฅผ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค [8, 9]. + * **์‚ฌ์šฉ ๋นˆ๋„๊ฐ€ ๋‚ฎ์€ ๋ทฐ:** ๊ด€๋ฆฌ์ž ํ™”๋ฉด์ด๋‚˜ ์„ค์ • ํŒจ๋„์ฒ˜๋Ÿผ ๋“œ๋ฌผ๊ฒŒ ์‚ฌ์šฉ๋˜๋Š” ํ™”๋ฉด์— ์ ์šฉํ•ฉ๋‹ˆ๋‹ค [9]. + * **๋ฌด๊ฑฐ์šด UI ๋ธ”๋ก ๋ฐ ์„œ๋“œํŒŒํ‹ฐ ํ†ตํ•ฉ ๊ธฐ๋Šฅ:** ์ฐจํŠธ, ์ง€๋„, ๋ฆฌ์น˜ ํ…์ŠคํŠธ ์—๋””ํ„ฐ, ๋น„๋””์˜ค ํ”Œ๋ ˆ์ด์–ด ๋“ฑ ์šฉ๋Ÿ‰์ด ํฐ ์œ„์ ฏ์„ ๋ Œ๋”๋งํ•  ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค [3, 9, 10]. +* **๋นŒ๋“œ ๋„๊ตฌ์™€์˜ ์ž๋™ ํ†ตํ•ฉ:** + Vite๋‚˜ Webpack๊ณผ ๊ฐ™์€ ์ตœ์‹  ๋ฒˆ๋“ค๋Ÿฌ๋Š” `React.lazy(() => import('./Component'))` ๋ฌธ๋ฒ•์„ ์ž๋™์œผ๋กœ ์ธ์‹ํ•˜์—ฌ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ณ„๋„์˜ ํŒŒ์ผ(์ฒญํฌ)๋กœ ๋ถ„๋ฆฌํ•ด ์ปดํŒŒ์ผํ•ฉ๋‹ˆ๋‹ค [2, 3, 8]. + +## โš–๏ธ Trade-offs & Caveats +* **์–ด๋ณด๋ธŒ ๋” ํด๋“œ(Above-the-fold) ์š”์†Œ ์ ์šฉ ๊ธˆ์ง€:** ์‚ฌ์šฉ์ž๊ฐ€ ํŽ˜์ด์ง€์— ์ง„์ž…ํ•˜์ž๋งˆ์ž ์ฆ‰์‹œ ๋ณด์•„์•ผ ํ•˜๋Š” ํ•„์ˆ˜์ ์ธ ์ปดํฌ๋„ŒํŠธ๋‚˜ ๋น ๋ฅด๊ฒŒ ๋ Œ๋”๋ง๋˜์–ด์•ผ ํ•˜๋Š” ์š”์†Œ์— `React.lazy()`๋ฅผ ์ ์šฉํ•˜๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค [9]. ์ด๋ฅผ ์ง€์—ฐ ๋กœ๋”ฉํ•  ๊ฒฝ์šฐ ๋ถˆํ•„์š”ํ•œ ๋„คํŠธ์›Œํฌ ์ง€์—ฐ์ด ๋ฐœ์ƒํ•˜์—ฌ ์˜คํžˆ๋ ค ์ฒด๊ฐ ์„ฑ๋Šฅ๊ณผ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์ด ํ•˜๋ฝํ•ฉ๋‹ˆ๋‹ค [9]. +* **๋ ˆ์ด์•„์›ƒ ์‹œํ”„ํŠธ ๋ฐ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ์ €ํ•˜:** ๋น„๋™๊ธฐ ๋กœ๋”ฉ ์ค‘ ``์˜ `fallback`์ด ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚˜๋ฉด์„œ, ๋กœ๋”ฉ์ด ๋๋‚œ ํ›„ ๋ณธ๋ž˜ ์ปดํฌ๋„ŒํŠธ๋กœ ์ „ํ™˜๋  ๋•Œ ๋ ˆ์ด์•„์›ƒ์ด ๋ฐ€๋ฆฌ๊ฑฐ๋‚˜ ๊นœ๋นก๊ฑฐ๋ฆฌ๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1, 11]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] +- [[Code Splitting]] + - ์—ฐ๊ฒฐ ์ด์œ : `React.lazy()`์˜ ์กด์žฌ ๋ชฉ์ ์ด์ž ๊ทผ๋ณธ์ ์ธ ์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค [6]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ดˆ๊ธฐ ๋ Œ๋”๋ง ์‹œ ๋ถˆํ•„์š”ํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ค„์—ฌ ๋กœ๋”ฉ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ์กฐ ์›๋ฆฌ. +- [[Dynamic Imports]] + - ์—ฐ๊ฒฐ ์ด์œ : `React.lazy()` ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋ชจ๋“ˆ์„ ๋กœ๋“œํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ํ‘œ์ค€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฌธ๋ฒ•(`import()`)์ž…๋‹ˆ๋‹ค [2, 3, 8]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํŠน์ • ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜์–ด์•ผ ํ•  ์‹œ์ ์— ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ์ƒ์„ฑํ•˜์—ฌ ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์˜ค๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜. + +#### [๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ] +- [[Suspense]] + - ์—ฐ๊ฒฐ ์ด์œ : `React.lazy()`๋กœ ๋ถ„๋ฆฌ๋œ ์ฝ”๋“œ๊ฐ€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๋‹ค์šด๋กœ๋“œ๋˜๋Š” ๋™์•ˆ ์•ฑ์ด ๋ฉˆ์ถ”์ง€ ์•Š๋„๋ก ๋กœ๋”ฉ UI๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ํ•„์ˆ˜์ ์œผ๋กœ ๊ฒฐํ•ฉ๋˜๋Š” ๋ฆฌ์•กํŠธ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค [1, 3]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋น„๋™๊ธฐ ๋ Œ๋”๋ง ํ๋ฆ„์—์„œ ๋กœ๋”ฉ ์ƒํƒœ(Loading State)๋ฅผ ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ ์ƒ๋‹จ์—์„œ ์„ ์–ธ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•. +- [[Vite/Rollup]] + - ์—ฐ๊ฒฐ ์ด์œ : ์†Œ์Šค ์ฝ”๋“œ์— ์ž‘์„ฑ๋œ `React.lazy()` ๊ตฌ๋ฌธ์„ ๋ถ„์„ํ•˜์—ฌ ๋นŒ๋“œ ํƒ€์ž„์— ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๊ฐœ๋ณ„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ(์ฒญํฌ)๋กœ ๋ถ„ํ• ํ•ด ๋‚ด๋Š” ๋„๊ตฌ๋“ค์ž…๋‹ˆ๋‹ค [2, 8]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ชจ๋“ˆ ๋ฒˆ๋“ค๋Ÿฌ๊ฐ€ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…์„ ์ธ์‹ํ•˜๊ณ  ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์˜ ์ •์  ์—์…‹์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์บ์‹ฑ ํšจ์œจ์„ ๋†’์ด๋Š” ๊ณผ์ •. + +### Deeper Research Questions +- `React.lazy()`๋ฅผ ํ™œ์šฉํ•œ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…๊ณผ ์„œ๋ฒ„ ์‚ฌ์ด๋“œ์—์„œ ์ด๋ฃจ์–ด์ง€๋Š” [[React Server Components]]์˜ ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ฐฉ์‹์€ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅด๋ฉฐ ์„œ๋กœ ์–ด๋–ป๊ฒŒ ๋ณด์™„๋  ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- ``๋กœ ๊ฐ์‹ธ์ง„ ์ง€์—ฐ ๋กœ๋”ฉ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋กœ๋“œ๋  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” Cumulative Layout Shift (CLS)๋ฅผ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•œ ๊ตฌ์ฒด์ ์ธ UI ํŒจํ„ด๊ณผ ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? +- ๋ชจ๋ฐ”์ผ ํ™˜๊ฒฝ ๋“ฑ ๋„คํŠธ์›Œํฌ ์†๋„๊ฐ€ ๋А๋ฆฐ ๊ณณ์—์„œ `React.lazy()`๋กœ ๋ถ„๋ฆฌ๋œ ์ฒญํฌ๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ๋•Œ, ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ(์˜ˆ: ๋ฐฐํฌ ํ›„ ์ด์ „ ํ•ด์‹œ ์ฒญํฌ ์‚ญ์ œ๋จ) ์ด๋ฅผ Error Boundary๋กœ ์–ด๋–ป๊ฒŒ ์šฐ์•„ํ•˜๊ฒŒ ๋ณต๊ตฌํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- ์‚ฌ์šฉ์ž๊ฐ€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์š”์ฒญํ•˜๊ธฐ ์ „(์˜ˆ: ๋งํฌ์— ๋งˆ์šฐ์Šค๋ฅผ ์˜ฌ๋ฆฌ๋Š” ์‹œ์ )์— `React.lazy()`๋กœ ๋ถ„๋ฆฌ๋œ ์ฒญํฌ๋ฅผ ๋ฏธ๋ฆฌ ๊ฐ€์ ธ์˜ค๋Š” ํ”„๋ฆฌํŒจ์น˜(Prefetching/Preloading) ์ „๋žต์€ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•˜๋Š”๊ฐ€? +- Vite์˜ `manualChunks` ์„ค์ •๊ณผ `React.lazy()`๋ฅผ ๋™์‹œ์— ํ™œ์šฉํ•˜์—ฌ, ํ•ต์‹ฌ ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์บ์‹ฑ๊ณผ ํŽ˜์ด์ง€๋ณ„ ์ง€์—ฐ ๋กœ๋”ฉ์„ ๊ฒฐํ•ฉํ•˜๋Š” ์ตœ์ ์˜ ๋นŒ๋“œ ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? + +### Practical Application Contexts +- **Implementation:** React ์ฝ”๋“œ ์ƒ๋‹จ์— ๋ชจ๋“ˆ์„ ์ •์  ์ž„ํฌํŠธํ•˜๋Š” ๋Œ€์‹ , `const LazyComponent = React.lazy(() => import('./LazyComponent'))`๋กœ ์„ ์–ธํ•˜๊ณ , ๋ Œ๋” ํŠธ๋ฆฌ์— ์‚ฌ์šฉํ•  ๋•Œ `}> ` ํ˜•ํƒœ๋กœ ๊ฐ์‹ธ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค [1, 3]. +- **System Design:** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ผ์šฐํŒ… ๋ ˆ์ด์–ด ์„ค๊ณ„ ์‹œ, ๋ชจ๋“  ๋ผ์šฐํŠธ๋ฅผ ์ดˆ๊ธฐ ๋ฒˆ๋“ค์— ๋ฌถ์ง€ ์•Š๊ณ  ๊ฐ ํŽ˜์ด์ง€ ๋˜๋Š” ๋ฌด๊ฑฐ์šด ์ฐจํŠธ/์—๋””ํ„ฐ์™€ ๊ฐ™์€ ๋…๋ฆฝ์  ๋„๋ฉ”์ธ์„ ๋ถ„๋ฆฌํ•˜๋Š” ๊ธฐ์ค€์œผ๋กœ ์„ค๊ณ„ ๊ธฐ์ค€์„ ์ˆ˜๋ฆฝํ•ฉ๋‹ˆ๋‹ค [8, 9]. +- **Operation / Maintenance:** `rollup-plugin-visualizer`๋‚˜ Webpack Bundle Analyzer ๋“ฑ์˜ ๋„๊ตฌ๋ฅผ ์ด์šฉํ•ด ๋นŒ๋“œ ํ›„ 500KB๊ฐ€ ๋„˜์–ด๊ฐ€๋Š” ํฐ ์ฒญํฌ(Large chunks)๊ฐ€ ์žˆ๋Š”์ง€ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ , ๋ฐœ๊ฒฌ ์‹œ `React.lazy()`๋ฅผ ์‚ฌ์šฉํ•ด ์ง€์—ฐ ๋กœ๋”ฉ ๊ฐ€๋Šฅํ•œ ๋ถ€๋ถ„์œผ๋กœ ์ž˜๋ผ๋ƒ…๋‹ˆ๋‹ค [7, 12, 13]. +- **Learning Path:** React ์ปดํฌ๋„ŒํŠธ ์ƒ๋ช…์ฃผ๊ธฐ์™€ ๋ Œ๋”๋ง์— ๋Œ€ํ•œ ์ดํ•ด โ†’ ๋ฒˆ๋“ค ํฌ๊ธฐ๊ฐ€ ์„ฑ๋Šฅ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ ํŒŒ์•… โ†’ `React.lazy`์™€ `Suspense`๋ฅผ ํ†ตํ•œ ํด๋ผ์ด์–ธํŠธ ๋กœ๋”ฉ ์ตœ์ ํ™” โ†’ ๋” ๋‚˜์•„๊ฐ€ ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง(SSR) ๋ฐ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋กœ ํ™•์žฅํ•˜๋Š” ๊ฒฝ๋กœ๋กœ ํ•™์Šต์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค. +- **My Project Relevance:** ํ˜„์žฌ ์œ ์ง€๋ณด์ˆ˜ ์ค‘์ธ ํ”„๋กœ์ ํŠธ์— ๋ชจ๋‹ฌ, ์–ด๋“œ๋ฏผ ์„ค์ • ํŒจ๋„ ๋“ฑ ์ฆ‰์‹œ ๋ณด์ด์ง€ ์•Š๋Š” ์ปดํฌ๋„ŒํŠธ๋“ค์ด ๋ฉ”์ธ ๋ฒˆ๋“ค์— ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋ฉด, ์ด๋ฅผ `React.lazy()`๋กœ ๋ฆฌํŒฉํ† ๋งํ•˜์—ฌ Time To Interactive (TTI) ์ง€ํ‘œ๋ฅผ ๋‹น์žฅ ๊ฐœ์„ ํ•˜๋Š” ๋ฐ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### Adjacent Topics +- [[Core Web Vitals]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: `React.lazy()`๋ฅผ ์ ์šฉํ–ˆ์„ ๋•Œ First Contentful Paint (FCP)์™€ Interaction to Next Paint (INP) ๊ฐ™์€ ๊ตฌ๊ธ€์˜ ์›น ์„ฑ๋Šฅ ์ง€ํ‘œ๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ฐœ์„ ๋˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์—ฐ๊ตฌ ํ™•์žฅ [1, 5]. +- [[manualChunks]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: `React.lazy()`์— ์˜ํ•œ ์Šคํ”Œ๋ฆฌํŒ… ์™ธ์—, React ์ฝ”์–ด๋‚˜ ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค(vendor)์„ ๋ณ„๋„ ๋ถ„๋ฆฌํ•ด ๋ธŒ๋ผ์šฐ์ € ์บ์‹ฑ์„ ๊ณ ๋„ํ™”ํ•˜๋Š” ๋นŒ๋“œ ๋„๊ตฌ ์ˆ˜์ค€์˜ ์ˆ˜๋™ ์ œ์–ด ๊ธฐ๋ฒ• ํŒŒ์•… [8, 14]. +- [[React Server Components (RSC)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ํด๋ผ์ด์–ธํŠธ๋กœ ์•„์˜ˆ ๋ณด๋‚ด์ง€ ์•Š๊ณ  ์„œ๋ฒ„์—์„œ ๋ Œ๋”๋งํ•˜์—ฌ ์„ฑ๋Šฅ์„ ๊ทน๋Œ€ํ™”ํ•˜๋Š” ์ตœ์‹  Next.js ํŒจ๋Ÿฌ๋‹ค์ž„๊ณผ ํด๋ผ์ด์–ธํŠธ ๋‹จ์˜ `React.lazy`๋ฅผ ๋น„๊ต [9, 15]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Topics_Blog/Real User Monitoring (RUM).md b/10_Wiki/Topics_Blog/Real User Monitoring (RUM).md new file mode 100644 index 00000000..fafa3074 --- /dev/null +++ b/10_Wiki/Topics_Blog/Real User Monitoring (RUM).md @@ -0,0 +1,62 @@ +# [[Real User Monitoring (RUM)]] + +## ๐Ÿ“Œ Brief ์‹œ Summary +Real User Monitoring (RUM)์€ ๋‹ค์–‘ํ•œ ๊ธฐ๊ธฐ์™€ ๋„คํŠธ์›Œํฌ ์กฐ๊ฑด์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ๊ฒฝํ—˜ํ•˜๋Š” ์‹ค์ œ ์„ฑ๋Šฅ๊ณผ ์ƒํ˜ธ์ž‘์šฉ์„ ์ถ”์ ํ•˜๋Š” ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค [1]. ํ•ฉ์„ฑ ํ…Œ์ŠคํŠธ(Synthetic testing)๊ฐ€ ๋†“์น  ์ˆ˜ ์žˆ๋Š” ์‹ค์ œ ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ํŒŒ์•…ํ•˜๋Š” ๋ฐ ํ•„์ˆ˜์ ์ด๋ฉฐ [1], ํ”„๋ก ํŠธ์—”๋“œ์˜ ์‚ฌ์šฉ์ž ์•ก์…˜๊ณผ ๋ฐฑ์—”๋“œ์˜ ์ธํ”„๋ผ ํŠธ๋ ˆ์ด์Šค๋ฅผ ์—ฐ๊ฒฐํ•˜์—ฌ ์ „์ฒด ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ๊ฐ€์‹œ์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [2]. + +## ๐Ÿ“– Core Content +* **์‹ค์ œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ์ถ”์ :** RUM์€ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์ด๋‚˜ ์ธ์œ„์ ์ธ ํ•ฉ์„ฑ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์—์„œ๋Š” ํฌ์ฐฉํ•˜๊ธฐ ์–ด๋ ค์šด ๋‹ค์–‘ํ•œ ๊ธฐ๊ธฐ, ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ ๋ฐ ๋„คํŠธ์›Œํฌ ์กฐ๊ฑด์—์„œ์˜ ์‹ค์ œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค [1]. ์ด๋ฅผ ํ†ตํ•ด ํŠน์ • ๊ธฐ๊ธฐ๋‚˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ๋งŒ ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3]. +* **์—”๋“œํˆฌ์—”๋“œ(End-to-End) ํŠธ๋ ˆ์ด์‹ฑ:** Datadog RUM ๋“ฑ์˜ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ ๊ฐ„์˜ ๋ชจ๋‹ˆํ„ฐ๋ง ๊ฒฉ์ฐจ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋ก ํŠธ์—”๋“œ์—์„œ ๋ฐœ์ƒํ•œ ์—๋Ÿฌ๋ฅผ ํด๋ฆญํ•˜๋ฉด, ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฐ ์„œ๋“œํŒŒํ‹ฐ API์— ์ด๋ฅด๋Š” ์ „์ฒด ์š”์ฒญ ๊ณผ์ •์„ ๋ถ„์‚ฐ ํŠธ๋ ˆ์ด์‹ฑ(Distributed tracing)์„ ํ†ตํ•ด ์ถ”์ ํ•  ์ˆ˜ ์žˆ์–ด ๋ณต์žกํ•œ ์‹œ์Šคํ…œ์˜ ๋””๋ฒ„๊น…์„ ๋•์Šต๋‹ˆ๋‹ค [2]. +* **ํ†ตํ•ฉ ๊ด€์ธก์„ฑ(Unified Observability):** ์ตœ์‹  ๋ชจ๋‹ˆํ„ฐ๋ง ํ”Œ๋žซํผ์—์„œ RUM์€ ํ”„๋ก ํŠธ์—”๋“œ์˜ ์˜ค๋ฅ˜ ๋กœ๊ทธ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ธํ”„๋ผ ๋ชจ๋‹ˆํ„ฐ๋ง, ๋ฐฑ์—”๋“œ APM(Application Performance Monitoring) ๋“ฑ๊ณผ ํ•œ๊ณณ์—์„œ ๊ฒฐํ•ฉ๋˜์–ด ํ™œ์šฉ๋ฉ๋‹ˆ๋‹ค [4]. +* **๋น„์šฉ ๋ฐ ๋ผ์ด์„ ์Šค ๋ชจ๋ธ:** 1,000๋ช…์˜ ์œ ์ €๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•  ๋•Œ ๊ธฐ๋ณธ์ ์ธ RUM ๊ธฐ๋Šฅ์€ ์›” $15~$30 ์ˆ˜์ค€์œผ๋กœ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์œผ๋‚˜, ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘๋Ÿ‰์— ๋”ฐ๋ผ ๋น„์šฉ์ด ์ฒญ๊ตฌ๋˜๋Š” ์‚ฌ์šฉ๋Ÿ‰ ๊ธฐ๋ฐ˜ ๊ฐ€๊ฒฉ ์ •์ฑ…์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค [5]. + +## โš–๏ธ Trade-offs & Caveats +* **๋ฐ์ดํ„ฐ ๊ทœ๋ชจ์— ๋”ฐ๋ฅธ ๊ณผ๋„ํ•œ ๋น„์šฉ ์ฒญ๊ตฌ:** RUM ํ”Œ๋žซํผ(์˜ˆ: Datadog)์€ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘(Ingest)๊ณผ ๊ฒ€์ƒ‰์„ ์œ„ํ•œ ์ธ๋ฑ์‹ฑ(Index)์„ ๋ถ„๋ฆฌํ•˜์—ฌ ์š”๊ธˆ์„ ๋ถ€๊ณผํ•˜๋Š” '์ด์ค‘ ์š”๊ธˆ์ œ'๋ฅผ ์ฑ„ํƒํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ํŠธ๋ž˜ํ”ฝ์ด ๋†’์€ ์„œ๋น„์Šค์—์„œ๋Š” ๋น„์šฉ์ด ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ์ฆ๊ฐ€ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋กœ ์ธํ•ด ๋น„์šฉ ์ ˆ๊ฐ์„ ์œ„ํ•ด ๋กœ๊ทธ์˜ 20%๋งŒ ์ธ๋ฑ์‹ฑํ•˜๊ฒŒ ๋˜๋ฉด ์žฅ์•  ๋ฐœ์ƒ ์‹œ 80%์˜ ์ฃผ์š” ๋””๋ฒ„๊น… ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์—†๋Š” ์ƒํ™ฉ์— ๋†“์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5, 6]. +* **ํ”„๋ผ์ด๋ฒ„์‹œ ๋ฐ ๋ณด์•ˆ ๋ฌธ์ œ:** ์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด(Session replay) ๋“ฑ ์‚ฌ์šฉ์ž์˜ ๋ชจ๋“  ํ–‰๋™์„ ๊ธฐ๋กํ•˜๋Š” RUM ๋„๊ตฌ๋Š” ๋ฏผ๊ฐํ•œ ๊ฐœ์ธ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ํ•  ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์—„๊ฒฉํ•ด์ง€๋Š” ๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ ๊ทœ์ œ๋ฅผ ์ค€์ˆ˜ํ•˜๊ธฐ ์œ„ํ•ด ๋ฏผ๊ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ž๋™ ๋งˆ์Šคํ‚นํ•˜๋„๋ก ์„ค์ •ํ•˜๋Š” ๋ฐ ๋งŽ์€ ์‹œ๊ฐ„์ด ์†Œ์š”๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [7-9]. +* **์ดˆ๊ธฐ ๋กœ๋“œ ์„ฑ๋Šฅ ์ €ํ•˜ (์„ฑ๋Šฅ ์˜ค๋ฒ„ํ—ค๋“œ):** ํ”„๋ก ํŠธ์—”๋“œ์— ์‚ฝ์ž…๋˜๋Š” RUM ์ถ”์  ์Šคํฌ๋ฆฝํŠธ๋Š” ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ฆ๊ฐ€์‹œํ‚ต๋‹ˆ๋‹ค. ์ผ๋ถ€ ๋„๊ตฌ์˜ ๊ฒฝ์šฐ ๋กœ๋“œ ์‹œ๊ฐ„์„ ์ตœ๋Œ€ 120ms๊นŒ์ง€ ์ง€์—ฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, 1์ดˆ๊ฐ€ ์ค‘์š”ํ•œ ์ด์ปค๋จธ์Šค ๋“ฑ์˜ ์‚ฌ์ดํŠธ์—์„œ๋Š” ๊ฒฝ๋Ÿ‰ํ™”๋œ ์˜ต์…˜์„ ์‹ ์ค‘ํžˆ ์„ ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [10]. +* **๋„์ž… ๋ฐ ํ•™์Šต ๊ณก์„ :** ํ’€์Šคํƒ ๊ด€์ธก ํ”Œ๋žซํผ๊ณผ ๊ฒฐํ•ฉ๋œ RUM ๋„๊ตฌ๋Š” ๋‹จ์ˆœ ํ”„๋ก ํŠธ์—”๋“œ ๋กœ๊น…๋งŒ ํ•„์š”ํ•œ ์ž‘์€ ํŒ€์—๊ฒŒ๋Š” ์ง€๋‚˜์นœ ์˜ค๋ฒ„์—”์ง€๋‹ˆ์–ด๋ง(Overkill)์ด ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ „์ฒด ํ”Œ๋žซํผ์„ ์ดํ•ดํ•˜๋Š” ๋ฐ ๊ฐ€ํŒŒ๋ฅธ ํ•™์Šต ๊ณก์„ ์ด ์š”๊ตฌ๋ฉ๋‹ˆ๋‹ค [6, 11]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [๊ด€๊ณ„ ์œ ํ˜• A (์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ )] +- [[Synthetic Testing]] + - ์—ฐ๊ฒฐ ์ด์œ : RUM๊ณผ ๋Œ€๋น„๋˜๋Š” ๋ชจ๋‹ˆํ„ฐ๋ง ๊ฐœ๋…์œผ๋กœ, ๊ฐ€์ƒ ํ™˜๊ฒฝ์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜์—ฌ ์ธก์ •ํ•ฉ๋‹ˆ๋‹ค [1]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๋ฐ์ดํ„ฐ์™€ ์‹ค์ œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜(RUM) ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ƒํ˜ธ๋ณด์™„์ ์œผ๋กœ ์ž‘์šฉํ•˜์—ฌ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ์ฐพ์•„๋‚ด๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[Distributed Tracing]] + - ์—ฐ๊ฒฐ ์ด์œ : RUM ๋„๊ตฌ๊ฐ€ ํ”„๋ก ํŠธ์—”๋“œ์˜ ์‚ฌ์šฉ์ž ๋™์ž‘์„ ๋ฐฑ์—”๋“œ์˜ ์„œ๋น„์Šค ์š”์ฒญ๊ณผ ์—ฐ๊ด€ ์ง“๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ํ•ต์‹ฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค [2, 4, 12]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜ ํ™˜๊ฒฝ์—์„œ ํด๋ผ์ด์–ธํŠธ ์—๋Ÿฌ์˜ ๊ทผ๋ณธ ์›์ธ์„ ๋ฐฑ์—”๋“œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋‚˜ ์™ธ๋ถ€ API๊นŒ์ง€ ์–ด๋–ป๊ฒŒ ์ถ”์ ํ•˜๋Š”์ง€ ์›๋ฆฌ๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[Core Web Vitals]] + - ์—ฐ๊ฒฐ ์ด์œ : RUM์„ ํ†ตํ•ด ์ฃผ๋กœ ์ธก์ •ํ•˜๊ณ  ์ตœ์ ํ™”ํ•˜๋ ค๋Š” ๋Œ€์ƒ์ธ ์‹ค์ œ ์‚ฌ์šฉ์ž ์ค‘์‹ฌ์˜ ๋กœ๋”ฉ ์†๋„, ์ƒํ˜ธ์ž‘์šฉ, ์‹œ๊ฐ์  ์•ˆ์ •์„ฑ ์ง€ํ‘œ์ž…๋‹ˆ๋‹ค [13, 14]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: RUM ๋ฐ์ดํ„ฐ๊ฐ€ ์›น ์„ฑ๋Šฅ ์ตœ์ ํ™”์˜ ๊ธฐ์ค€(LCP, FID, CLS, INP)๊ณผ ์–ด๋–ป๊ฒŒ ๋งคํ•‘๋˜์–ด ์‚ฌ์šฉ์ž ๊ฒฝํ—˜(UX)์„ ์ˆ˜์น˜ํ™”ํ•˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +#### [๊ด€๊ณ„ ์œ ํ˜• B (๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ)] +- [[Datadog RUM]] + - ์—ฐ๊ฒฐ ์ด์œ : ์†Œ์Šค์—์„œ ์—”๋“œํˆฌ์—”๋“œ ํ”„๋ก ํŠธ์—”๋“œ-๋ฐฑ์—”๋“œ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์—ฐ๊ฒฐํ•ด ์ฃผ๋Š” ๋Œ€ํ‘œ์ ์ธ RUM ํ”Œ๋žซํผ์œผ๋กœ ์†Œ๊ฐœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค [2]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋Œ€๊ทœ๋ชจ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์—์„œ RUM์„ ํ™œ์šฉํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ์‚ฌ๋ก€์™€, ์ธ๋ฑ์‹ฑ ๋น„์šฉ ์ตœ์ ํ™”(Trade-off) ์ „๋žต์˜ ์ค‘์š”์„ฑ์„ ํ•™์Šตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[Session Replay]] + - ์—ฐ๊ฒฐ ์ด์œ : ์‚ฌ์šฉ์ž์˜ ์ƒํƒœ ๋ณ€๊ฒฝ, ์ฝ˜์†” ๋กœ๊ทธ, ๋„คํŠธ์›Œํฌ ์š”์ฒญ ๋“ฑ์„ ๋งˆ์น˜ ํ™”๋ฉด ๋…นํ™”์ฒ˜๋Ÿผ ์žฌํ˜„ํ•˜๋Š” RUM์˜ ๊ณ ๊ธ‰ ๋””๋ฒ„๊น… ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค [7, 12, 15]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์Šคํƒ ํŠธ๋ ˆ์ด์Šค๋งŒ์œผ๋กœ ์ฐพ๊ธฐ ํž˜๋“  ๋ณต์žกํ•œ ์‚ฌ์šฉ์ž ์ƒํ˜ธ์ž‘์šฉ ์˜ค๋ฅ˜์˜ ๋””๋ฒ„๊น… ๋ฐฉ๋ฒ•๋ก ๊ณผ ์ด์— ๋”ฐ๋ฅธ ํ”„๋ผ์ด๋ฒ„์‹œ ์„ค์ •์˜ ์ค‘์š”์„ฑ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### Deeper Research Questions +- ๊ฐ€์ƒ ํ™˜๊ฒฝ์˜ ์„ฑ๋Šฅ์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜๋Š” ํ•ฉ์„ฑ ํ…Œ์ŠคํŠธ(Synthetic Testing)์™€ ๋น„๊ตํ•  ๋•Œ, RUM๋งŒ์ด ๋…์ ์ ์œผ๋กœ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š” ์‹ค์ œ ๊ธฐ๊ธฐ/๋„คํŠธ์›Œํฌ ๊ธฐ๋ฐ˜์˜ ์„ฑ๋Šฅ ์ด์Šˆ ํŒจํ„ด์€ ๋ฌด์—‡์ธ๊ฐ€? +- Datadog๊ณผ ๊ฐ™์€ RUM ์†”๋ฃจ์…˜์„ ํ™œ์šฉํ•  ๋•Œ, ๋Œ€๊ทœ๋ชจ ํŠธ๋ž˜ํ”ฝ ํ•˜์—์„œ ๊ฐ€์‹œ์„ฑ ์†์‹ค ์—†์ด ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘(Ingest)๊ณผ ์ธ๋ฑ์‹ฑ(Indexing) ๋น„์šฉ์˜ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๋ฅผ ๊ทน๋ณตํ•  ์ˆ˜ ์žˆ๋Š” ๋กœ๊ทธ ํ•„ํ„ฐ๋ง ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? +- RUM ์—์ด์ „ํŠธ์˜ ์‚ฝ์ž…์ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค ํฌ๊ธฐ ๋ฐ ์ดˆ๊ธฐ ํŽ˜์ด์ง€ ๋กœ๋“œ ์†๋„(์ตœ๋Œ€ 120ms ์ถ”๊ฐ€)์— ๋ฏธ์น˜๋Š” ์„ฑ๋Šฅ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ตœ์†Œํ™”ํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? +- ๊ธ€๋กœ๋ฒŒ ํ”„๋ผ์ด๋ฒ„์‹œ ๊ทœ์ œ๋ฅผ ์ค€์ˆ˜ํ•˜๋ฉด์„œ Session Replay๋ฅผ ํฌํ•จํ•œ RUM ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ธฐ ์œ„ํ•ด, ๋ฏผ๊ฐํ•œ DOM ์š”์†Œ๋‚˜ ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ์–ด๋–ป๊ฒŒ ํšจ๊ณผ์ ์œผ๋กœ ๋งˆ์Šคํ‚น(Masking)ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- ํ”„๋ก ํŠธ์—”๋“œ React ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฐœ์ƒํ•œ ์—๋Ÿฌ๋ฅผ RUM ๋ฐ์ดํ„ฐ์™€ ๊ฒฐํ•ฉํ•˜๊ณ , ๋ฐฑ์—”๋“œ์˜ OpenTelemetry ๋ถ„์‚ฐ ํŠธ๋ ˆ์ด์Šค์™€ ์—ฐ๊ฒฐ(Trace ID ๊ณต์œ  ๋“ฑ)ํ•˜์—ฌ ์ „์ฒด ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ํ๋ฆ„์—์„œ ๊ทผ๋ณธ ์›์ธ์„ ํŒŒ์•…ํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ• ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? + +### Practical Application Contexts +- **Implementation:** React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์—”ํŠธ๋ฆฌ ํฌ์ธํŠธ์— Datadog์ด๋‚˜ Sentry์™€ ๊ฐ™์€ RUM ๋ชจ๋‹ˆํ„ฐ๋ง SDK๋ฅผ ํ†ตํ•ฉํ•˜๊ณ , Core Web Vitals ๋ฐ ์„ธ์…˜๋ณ„ ์„ฑ๋Šฅ ์ง€ํ‘œ๋ฅผ ์ž๋™์œผ๋กœ ์ˆ˜์ง‘ํ•˜๋„๋ก ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค. +- **System Design:** ์‚ฌ์šฉ์ž์˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ฐœ์ƒํ•œ ํ”„๋ก ํŠธ์—”๋“œ ๋กœ๊ทธ์™€ API ์š”์ฒญ ํ—ค๋”์— ํŠธ๋ ˆ์ด์Šค ID๋ฅผ ์‚ฝ์ž…ํ•˜์—ฌ, ๋ฐฑ์—”๋“œ ๋กœ๊น… ์‹œ์Šคํ…œ๊ณผ ๋งค์นญ์‹œํ‚ค๋Š” '์—”๋“œํˆฌ์—”๋“œ(End-to-End) ๋ชจ๋‹ˆํ„ฐ๋ง ์•„ํ‚คํ…์ฒ˜'๋ฅผ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค. +- **Operation / Maintenance:** ์›”๋ณ„ ๋ชจ๋‹ˆํ„ฐ๋ง ๋น„์šฉ(ํŠนํžˆ ๋ฐ์ดํ„ฐ ์ธ๋ฑ์‹ฑ ๋น„์šฉ)์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ์ด๋ฒคํŠธ๋Š” ์ƒ˜ํ”Œ๋งํ•˜๊ณ , ๋ฐ์ดํ„ฐ ๋งˆ์Šคํ‚น ๊ทœ์น™์„ ์ง€์†์ ์œผ๋กœ ๊ด€๋ฆฌํ•ด GDPR ๋“ฑ์˜ ๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ ์ •์ฑ…์„ ์œ„๋ฐ˜ํ•˜์ง€ ์•Š๋„๋ก ์œ ์ง€๋ณด์ˆ˜ํ•ฉ๋‹ˆ๋‹ค. +- **Learning Path:** ๋จผ์ € React์˜ ๊ธฐ๋ณธ ์—๋Ÿฌ ์ฒ˜๋ฆฌ(Error Boundaries)์™€ ๋ธŒ๋ผ์šฐ์ € DevTools๋ฅผ ์‚ฌ์šฉํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ์ธก์ •์„ ์ตํžŒ ํ›„, ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์˜ ์‹ค์‹œ๊ฐ„ ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๋Š” RUM๊ณผ ๋ฐฑ์—”๋“œ ๋ถ„์‚ฐ ํŠธ๋ ˆ์ด์‹ฑ์„ ํ•™์Šตํ•˜์—ฌ ํ’€์Šคํƒ ๊ด€์ธก์„ฑ(Observability) ์—ญ๋Ÿ‰์„ ๊ธฐ๋ฆ…๋‹ˆ๋‹ค. +- **My Project Relevance:** ํ˜„์žฌ ์ง„ํ–‰ ์ค‘์ธ ํ”„๋ก ํŠธ์—”๋“œ ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉ์ž ์ดํƒˆ๋ฅ ์ด ๋†’์€ ํŠน์ • ํ™”๋ฉด์˜ ๋ณ‘๋ชฉ ์ง€์ ์„ ์ฐพ๊ธฐ ์œ„ํ•ด, RUM์„ ์ ์šฉํ•˜์—ฌ ์‹ค์ œ ๋ชจ๋ฐ”์ผ ๊ธฐ๊ธฐ์™€ 3G/LTE ํ™˜๊ฒฝ์—์„œ์˜ INP(Interaction to Next Paint)์™€ ๋ Œ๋”๋ง ์ง€์—ฐ์„ ์ธก์ • ๋ฐ ๊ฐœ์„ ํ•  ๋•Œ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค. + +### Adjacent Topics +- [[OpenTelemetry]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ํŠน์ • ๋ฒค๋”์— ์ข…์†๋˜์ง€ ์•Š๊ณ (No vendor lock-in) ์˜คํ”ˆ ์Šคํƒ ๋‹ค๋“œ ํ”„๋กœํ† ์ฝœ์„ ์ด์šฉํ•ด RUM, ๋ฉ”ํŠธ๋ฆญ, ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ  ๋ฐฑ์—”๋“œ์™€ ์—ฐ๊ฒฐํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜๋กœ ์ง€์‹์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [16, 17]. +- [[Error Boundaries]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์—์„œ UI ๋ Œ๋”๋ง ์ค‘ ๋ฐœ์ƒํ•˜๋Š” ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๋ฅผ ์บก์ฒ˜ํ•˜์—ฌ ์ „์ฒด ์•ฑ์˜ ํฌ๋ž˜์‹œ๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ๊ฐœ๋…์œผ๋กœ, ์—ฌ๊ธฐ์„œ ํฌ์ฐฉ๋œ ์—๋Ÿฌ๋ฅผ RUM ์‹œ์Šคํ…œ์— ๋ณด๊ณ ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์—ฐ๊ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [18-20]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Topics_Blog/Redux.md b/10_Wiki/Topics_Blog/Redux.md new file mode 100644 index 00000000..332910b5 --- /dev/null +++ b/10_Wiki/Topics_Blog/Redux.md @@ -0,0 +1,53 @@ +# [[Redux]] + +## ๐Ÿ“Œ Brief Summary +Redux๋Š” ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ์ƒํƒœ ์ปจํ…Œ์ด๋„ˆ๋กœ, ๋ถˆ๋ณ€์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ์—…๋ฐ์ดํŠธ, ์•ก์…˜ ๋””์ŠคํŒจ์น˜(action dispatch), ๊ทธ๋ฆฌ๊ณ  ๋ฆฌ๋“€์„œ(reducer)๋ฅผ ํ†ตํ•ด ์ „์—ญ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์‚ฐ์—… ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค [1]. ์ฃผ๋กœ ๋ณต์žกํ•œ ํŒŒ์ƒ ๋ฐ ๊ณ„์‚ฐ๋œ ์ƒํƒœ๊ฐ€ ์กด์žฌํ•˜๊ฑฐ๋‚˜ 500๊ฐœ ์ด์ƒ์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‹ค๋ฃจ๋Š” ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ผ๊ด€๋œ ๊ฐœ๋ฐœ ํŒจํ„ด์„ ๊ฐ•์ œํ•˜๊ธฐ ์œ„ํ•ด ์ฑ„ํƒ๋œ๋‹ค [2]. RTK Query์™€ Redux DevTools ๊ฐ™์€ ์„ฑ์ˆ™ํ•œ ์ƒํƒœ๊ณ„๋ฅผ ํ†ตํ•ด ๋น„๋™๊ธฐ ์ƒํƒœ ๊ด€๋ฆฌ์˜ ๋ณต์žก์„ฑ์„ ์ค„์ด๊ณ  ๊ฐ•๋ ฅํ•œ ๋””๋ฒ„๊น… ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค [2-4]. + +## ๐Ÿ“– Core ๋Œ€Content +* **์ƒํƒœ ๊ด€๋ฆฌ ์•„ํ‚คํ…์ฒ˜์™€ ๊ตฌ์กฐํ™”**: Redux๋Š” ๋ถˆ๋ณ€์„ฑ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋ฉฐ, ์•ก์…˜๊ณผ ๋ฆฌ๋“€์„œ ํŒจํ„ด์„ ํ†ตํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ณต์žกํ•œ ์ƒํƒœ ๋กœ์ง์„ ์ œ์–ดํ•œ๋‹ค [1]. ๋ชจ๋˜ ํ”„๋ก ํŠธ์—”๋“œ ํด๋” ๊ตฌ์กฐ์—์„œ Redux ์Šฌ๋ผ์ด์Šค(Redux slices)์™€ ๊ธ€๋กœ๋ฒŒ ์ƒํƒœ ๊ด€๋ จ ๋กœ์ง์€ ์ „๋‹ด ๋””๋ ‰ํ† ๋ฆฌ์ธ `store/`์— ๋ฐฐ์น˜๋œ๋‹ค [5-7]. 10๋ช… ์ด์ƒ์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ˜‘์—…ํ•˜๋Š” ์กฐ์ง์ด๋‚˜ ์ด์ปค๋จธ์Šค, ๊ธˆ์œต ์‹œ์Šคํ…œ๊ณผ ๊ฐ™์ด ๋ฏธ์…˜ ํฌ๋ฆฌํ‹ฐ์ปฌํ•œ ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ์ด ์ค‘์š”ํ•œ ํ”„๋กœ์ ํŠธ์—์„œ ์ฝ”๋“œ ์ž‘์„ฑ์˜ ์ผ๊ด€์„ฑ์„ ๊ฐ•์ œํ•˜๋Š” ๋ผˆ๋Œ€ ์—ญํ• ์„ ํ•œ๋‹ค [2]. +* **์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ฐ ์ƒํƒœ ๊ตฌ๋…**: ๋‚ด์žฅ๋œ React Context API๋Š” ์ƒํƒœ์˜ ์ผ๋ถ€๋งŒ ๋ณ€๊ฒฝ๋˜์–ด๋„ ํ•ด๋‹น ์ปจํ…์ŠคํŠธ๋ฅผ ๊ตฌ๋…ํ•˜๋Š” ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ์— ๋ฌด์ฐจ๋ณ„์ ์ธ ๋ฆฌ๋ Œ๋”๋ง์„ ์œ ๋ฐœํ•˜๋Š” ๋ฐ˜๋ฉด, Redux๋Š” ๊ตฌ๋… ๋กœ์ง๊ณผ ๋ Œ๋”๋ง์„ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌํ•œ๋‹ค [3, 8-10]. ์„ ํƒ์ž(Selector)๋ฅผ ์‚ฌ์šฉํ•ด ํ•„์š”ํ•œ ํŒŒ์ƒ ์ƒํƒœ๋งŒ ์ปดํฌ๋„ŒํŠธ์— ๊ณต๊ธ‰ํ•˜์—ฌ ์„ฑ๋Šฅ๊ณผ ์ตœ์ ํ™”๋ฅผ ๋ณด์žฅํ•œ๋‹ค [3]. +* **๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ (RTK Query ๋„์ž…)**: ๊ณผ๊ฑฐ Redux๋Š” ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์— ๋ง‰๋Œ€ํ•œ ์–‘์˜ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ(Thunk, Saga ๋“ฑ)๊ฐ€ ํ•„์š”ํ–ˆ์œผ๋‚˜, ํ˜„์žฌ๋Š” RTK Query๋ฅผ ํ†ตํ•ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ๋‹ค [2, 4]. RTK Query๋Š” ๋ฐ์ดํ„ฐ ์บ์‹ฑ, ์ค‘๋ณต ์š”์ฒญ ์ œ๊ฑฐ, ์ž๋™ ๋ฐ์ดํ„ฐ ์žฌ์š”์ฒญ ๊ธฐ๋Šฅ ๋“ฑ์„ ๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณตํ•˜์—ฌ ๋น„๋™๊ธฐ ์ž‘์—… ์ฝ”๋“œ๋ฅผ ํš๊ธฐ์ ์œผ๋กœ ์ค„์—ฌ์ค€๋‹ค [4]. +* **๋””๋ฒ„๊น…๊ณผ ์ถ”์ ์„ฑ**: Redux์˜ ๊ฐ€์žฅ ํฐ ์ฐจ๋ณ„์ ์€ ๋ธŒ๋ผ์šฐ์ €์˜ Redux DevTools๋ฅผ ํ™œ์šฉํ•œ '์‹œ๊ฐ„ ์—ฌํ–‰ ๋””๋ฒ„๊น…(Time-Travel Debugging)'์ด๋‹ค [2, 3]. ์ƒํƒœ ๋ณ€ํ™” ์ด๋ ฅ์„ ๊ณผ๊ฑฐ๋กœ ๋Œ๋ ค๋ณด๊ฑฐ๋‚˜ ์•ก์…˜์„ ์žฌํ˜„ํ•  ์ˆ˜ ์žˆ์–ด, ์‹ฌ์•ผ์— ๋ฐœ์ƒํ•˜๋Š” ๋ณต์žกํ•œ ์šด์˜ ํ™˜๊ฒฝ์˜ ๋น„๋™๊ธฐ ๋ฒ„๊ทธ๋„ ๋ช‡ ๋ถ„ ๋‚ด์— ์‹œ๊ฐ์ ์œผ๋กœ ํŒŒ์•…ํ•˜๊ฒŒ ํ•ด์ค€๋‹ค [3, 11, 12]. +* **ํ•œ๊ณ„์  ๋ฐ ์ฃผ์˜์‚ฌํ•ญ**: Redux๋Š” ๋„์ž… ์‹œ ๋ง‰๋Œ€ํ•œ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ, ์ •๊ทœํ™”๋œ ์ƒํƒœ ๊ด€๋ฆฌ์˜ ๋‚œํ•ดํ•จ, ๋ฏธ๋“ค์›จ์–ด ์ˆœ์„œ ์˜ค๋ฅ˜, ๊ทธ๋ฆฌ๊ณ  ๊นจ์ง€๊ธฐ ์‰ฌ์šด ์„ ํƒ์ž ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๋“ฑ์˜ ํ•œ๊ณ„๋ฅผ ๊ฐ€์ง„๋‹ค [13]. ๋˜ํ•œ ๋ชจ๋“  ์ƒํƒœ๋ฅผ ํ•˜๋‚˜์˜ ํฐ ๋ฆฌ๋“€์„œ์— ๋ชฐ์•„๋„ฃ๋Š” "God Reducer" ๊ตฌ์กฐ๋‚˜ ํŒ€ ๋‹จ์œ„์˜ ์•ก์…˜ ๊ฒฐํ•ฉ(Action Coupling)์€ ๋Œ€ํ‘œ์ ์ธ ์•ˆํ‹ฐ ํŒจํ„ด์œผ๋กœ ์ง€์ ๋œ๋‹ค [13, 14]. ์ตœ์‹  ํŠธ๋ Œ๋“œ์—์„œ๋Š” ์ด์™€ ๊ฐ™์€ ๋‹จ์ผ(monolithic) ์Šคํ† ์–ด ๊ตฌ์กฐ์˜ ๋ณต์žก์„ฑ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ์™€ ์„œ๋ฒ„ ์ƒํƒœ๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ๋“ฑ ๋ณด๋‹ค ํŒŒํŽธํ™”๋œ ๋ฐฉ์‹์œผ๋กœ ์ง„ํ™”ํ•˜๊ณ  ์žˆ๋‹ค [15]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts +- [[Context API]] + - ์—ฐ๊ฒฐ ์ด์œ : Redux์™€ ์ž์ฃผ ๋น„๊ต๋˜๋Š” React์˜ ๋‚ด์žฅ ์ƒํƒœ ๊ณต์œ  ๊ธฐ๋Šฅ์œผ๋กœ, ์†Œ๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ…Œ๋งˆ๋‚˜ ์–ธ์–ด ์„ค์ • ๋“ฑ์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์ ํ•ฉํ•˜์ง€๋งŒ, ์ƒํƒœ ๋ณ€๊ฒฝ ์‹œ ๋ฐœ์ƒํ•˜๋Š” ๋Œ€๊ทœ๋ชจ ๋ฆฌ๋ Œ๋”๋ง ํญํ’(Re-render Storm)์„ ์œ ๋ฐœํ•˜์—ฌ ๋Œ€๊ทœ๋ชจ ์•ฑ์—์„œ Redux๊ฐ€ ํ•„์š”ํ•œ ๋‹น์œ„์„ฑ์„ ์ œ๊ณตํ•œ๋‹ค [8, 9, 16]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ƒํƒœ ๊ตฌ๋… ์•„ํ‚คํ…์ฒ˜์˜ ์ฐจ์ด๊ฐ€ React ์ปดํฌ๋„ŒํŠธ์˜ ๋ฆฌ๋ Œ๋”๋ง ์„ฑ๋Šฅ์— ๋ฏธ์น˜๋Š” ์น˜๋ช…์ ์ธ ์˜ํ–ฅ์„ฑ [8, 10]. + +- [[Zustand]] + - ์—ฐ๊ฒฐ ์ด์œ : Redux์˜ ๋ฌด๊ฑฐ์šด ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ์™€ Context API์˜ ์„ฑ๋Šฅ ๋ฌธ์ œ ์‚ฌ์ด์—์„œ ์ ์ ˆํ•œ ํƒ€ํ˜‘์ ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒฝ๋Ÿ‰ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค [17-19]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๊ณผ๋„ํ•œ ์œ ์—ฐ์„ฑ(Zustand)์ด ํŒ€ ๋‹จ์œ„ ํ˜‘์—…์—์„œ ์–ด๋–ป๊ฒŒ ๋น„๋™๊ธฐ ํŒจํ„ด์˜ ํŒŒํŽธํ™”์™€ ํ˜ผ๋ž€์„ ์•ผ๊ธฐํ•  ์ˆ˜ ์žˆ๋Š”์ง€, ๋Œ€์กฐ์ ์œผ๋กœ Redux์˜ ์—„๊ฒฉํ•œ ๊ตฌ์กฐ๊ฐ€ ๊ฐ–๋Š” ๋ฐฉ์–ด์  ์ด์  [1, 11, 18, 20]. + +- [[RTK Query]] + - ์—ฐ๊ฒฐ ์ด์œ : Redux Toolkit(RTK) ์ƒํƒœ๊ณ„์— ํฌํ•จ๋œ ๋ฐ์ดํ„ฐ ํŒจ์นญ ๋ฐ ์บ์‹ฑ ๋„๊ตฌ์ด๋‹ค [4]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Redux๊ฐ€ ์–ด๋–ป๊ฒŒ ๋‹จ์ˆœํ•œ ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ๋„˜์–ด ์„œ๋ฒ„ API ์‘๋‹ต(์บ์‹ฑ, ๋ฌดํšจํ™”, ์žฌ์š”์ฒญ)์ด๋ผ๋Š” ํ˜„๋Œ€์ ์ธ ์š”๊ตฌ์‚ฌํ•ญ์„ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์—†์ด ์†Œํ™”ํ•˜๋Š”์ง€ ํŒŒ์•… [4, 21]. + +- [[Time-Travel Debugging]] + - ์—ฐ๊ฒฐ ์ด์œ : Redux DevTools๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ณ ์œ ์˜ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์œผ๋กœ, ์–ธ์ œ ์–ด๋–ค ์•ก์…˜์ด ๋””์ŠคํŒจ์น˜๋˜์–ด ์ƒํƒœ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€ ๊ธฐ๋กํ•˜๊ณ  ๋˜๊ฐ๋Š” ๊ธฐ์ˆ ์ด๋‹ค [2, 3]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: 5๋…„ ์ด์ƒ ์ง€์†๋˜๋Š” ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์•„ํ‚คํ…์ฒ˜์˜ ๋””๋ฒ„๊น… ์—ญ๋Ÿ‰์ด ๊ฐœ๋ฐœ์ž์˜ ์ƒ์‚ฐ์„ฑ ๋ฐ ์žฅ์•  ๋Œ€์‘์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ [11, 12]. + +### Deeper Research Questions +- Redux์˜ ์ƒํƒœ ๊ตฌ๋… ๋ฐ ์„ ํƒ์ž(selector) ํŒจํ„ด์€ ๋‚ด๋ถ€์ ์œผ๋กœ Context API์™€ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅด๊ฒŒ ์„ค๊ณ„๋˜์–ด ๋ถ€๋ถ„ ์ƒํƒœ ๋ณ€๊ฒฝ ์‹œ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ์ฐจ๋‹จํ•˜๋Š”๊ฐ€? +- RTK Query๋ฅผ ํ†ตํ•œ Redux ๋น„๋™๊ธฐ ์ƒํƒœ ๊ด€๋ฆฌ๋Š” Zustand ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๋Š” ๋น„๋™๊ธฐ ์บ์‹ฑ ํŒจํ„ด๊ณผ ๋น„๊ตํ•ด ์–ด๋– ํ•œ ์•„ํ‚คํ…์ฒ˜์  ์•ˆ์ •์„ฑ์„ ๋‹ด๋ณดํ•˜๋Š”๊ฐ€? +- "God Reducer" ์•ˆํ‹ฐ ํŒจํ„ด์ด ๋Œ€๊ทœ๋ชจ React ์ฝ”๋“œ๋ฒ ์ด์Šค ๋‚ด๋น„๊ฒŒ์ด์…˜ ๋ฐ ์„ฑ๋Šฅ ์ตœ์ ํ™”์— ๋ฏธ์น˜๋Š” ์น˜๋ช…์ ์ธ ๋ถ€์ž‘์šฉ์€ ๋ฌด์—‡์ธ๊ฐ€? +- ํ”„๋ก ํŠธ์—”๋“œ ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ๊ณผ๊ฑฐ์˜ ๊ฑฐ๋Œ€ํ•œ ๋‹จ์ผ ์Šคํ† ์–ด ๋ฐฉ์‹์—์„œ '์„œ๋ฒ„ ์ƒํƒœ'์™€ 'ํด๋ผ์ด์–ธํŠธ ๋กœ์ปฌ ์ƒํƒœ'๋กœ ํŒŒํŽธํ™”(Fragmentation)๋˜๋Š” ์ตœ์‹  ํŠธ๋ Œ๋“œ ์†์—์„œ, Redux์˜ ์ ์ • ์‚ฌ์šฉ ๋ฒ”์œ„๋Š” ์–ด๋–ป๊ฒŒ ์žฌ์กฐ์ •๋˜์—ˆ๋Š”๊ฐ€? +- 10๋ช… ์ด์ƒ์˜ ์‹œ๋‹ˆ์–ด ๋ฐ ์ฃผ๋‹ˆ์–ด ๊ฐœ๋ฐœ์ž๊ฐ€ ํ˜ผ์žฌ๋œ ํŒ€์—์„œ Redux์˜ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ๋Š” ๊ฐœ๋ฐœ ์†๋„๋ฅผ ์ €ํ•˜์‹œํ‚ค๋Š” ๋ถ€์ฑ„์ธ๊ฐ€, ์•„๋‹ˆ๋ฉด ๋ฒ„๊ทธ๋ฅผ ์‚ฌ์ „์— ๋ฐฉ์ง€ํ•˜๋Š” ๊ตฌ์กฐ์  ๋ฐฉ์–ด๋ง‰์ธ๊ฐ€? + +### Practical Application Contexts +- **Implementation:** React ํ”„๋กœ์ ํŠธ์˜ `store/` ๋˜๋Š” `features/` ๋””๋ ‰ํ† ๋ฆฌ์— ๋„๋ฉ”์ธ๋ณ„ Redux slice๋ฅผ ๋ฐฐ์น˜ํ•˜์—ฌ ์ „์—ญ ์ƒํƒœ ๋ฐ ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ๋ฅผ ์„ ์–ธํ•˜๊ณ  ์•ก์…˜๊ณผ ๋ณ‘ํ•ฉํ•˜์—ฌ ๊ด€๋ฆฌํ•œ๋‹ค [5-7]. +- **System Design:** ์žฅ๊ธฐ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์š”๊ตฌ๋˜๋Š” ๋Œ€๊ทœ๋ชจ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์‹œ์Šคํ…œ(์ด์ปค๋จธ์Šค ๊ฒฐ์ œ ๋“ฑ ๋ฐ์ดํ„ฐ ํ๋ฆ„์ด ์ค‘์š”ํ•œ 500๊ฐœ ์ปดํฌ๋„ŒํŠธ ์ด์ƒ์˜ ์•ฑ)์—์„œ ํŒŒ์ƒ ์ƒํƒœ ์ฒ˜๋ฆฌ์™€ ํŒ€ ๊ฐœ๋ฐœ ํŒจํ„ด ๊ฐ•์ œํ™” ๋ชฉ์ ์œผ๋กœ ์ฑ„ํƒํ•œ๋‹ค [2, 12, 13, 22]. +- **Operation / Maintenance:** ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์ด๋‚˜ ๋””๋ฒ„๊น… ์‹œ Redux DevTools๋ฅผ ์—ฐ๋™ํ•˜์—ฌ ํŠน์ • UI ๋ฒ„๊ทธ๋‚˜ ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ๊ผฌ์ž„ ํ˜„์ƒ์„ ์‹œ๊ฐ์ ์ธ ์•ก์…˜ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ํ†ตํ•ด ๋‹จ์‹œ๊ฐ„์— ํ•ด๊ฒฐํ•œ๋‹ค [11, 12]. +- **Learning Path:** ํ”„๋ก ํŠธ์—”๋“œ ๊ต์œก ์‹œ, Context API์˜ ๊ทผ๋ณธ ์›๋ฆฌ์™€ ํ•œ๊ณ„๋ฅผ ๋จผ์ € ํ•™์Šตํ•˜๊ณ , Zustand์˜ ์ƒ์‚ฐ์„ฑ์„ ๊ฒฝํ—˜ํ•œ ๋’ค, ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ํ‘œ์ค€์ด์ž ๊ฐ€์žฅ ๋ณต์žก๋„๊ฐ€ ๋†’์€ Redux์˜ ํŒจํ„ด๊ณผ ๊ตฌ์กฐ์  ์ด์ ์„ ์ตœ์ข…์ ์œผ๋กœ ํ•™์Šตํ•˜๋Š” ๋‹จ๊ณ„์  ์ ‘๊ทผ์ด ์š”๊ตฌ๋œ๋‹ค [23]. +- **My Project Relevance:** ๊ธ€๋กœ๋ฒŒ ์ƒํƒœ๊ฐ€ ๋‹ค์ˆ˜์˜ ์ปดํฌ๋„ŒํŠธ์— ๋ณต์žกํ•˜๊ฒŒ ์–ฝํ˜€ ์žˆ๊ฑฐ๋‚˜, ํŒ€์› ๊ฐ„ ๋™์ผํ•œ ๋น„๋™๊ธฐ/์ƒํƒœ ๊ด€๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๊ฐ•์ œํ•˜์—ฌ ํŒŒํŽธํ™”๋ฅผ ๋ง‰์•„์•ผ ํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•  ๋•Œ ํ•ต์‹ฌ์ ์ธ ๊ธฐ์ˆ  ์Šคํƒ์œผ๋กœ ๊ฒ€ํ† ๋  ์ˆ˜ ์žˆ๋‹ค [1, 12]. + +### Adjacent Topics +- [[Server State Management (TanStack Query ๋“ฑ)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ํด๋ผ์ด์–ธํŠธ ์ „์—ญ ์ƒํƒœ์™€ ๊ตฌ๋ณ„๋˜๋Š” "์„œ๋ฒ„ ๋ฐ์ดํ„ฐ(API ์บ์‹ฑ, ๋™๊ธฐํ™”, ๋กœ๋”ฉ/์—๋Ÿฌ ์‚ฌ์ดํด)"๋งŒ์„ ์ „๋ฌธ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ชจ๋˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ Redux์˜ ์—ญํ•  ๋น„๊ต ๋ฐ ์—ฐ๋™ ๋ฐฉ์•ˆ ํƒ์ƒ‰ [24, 25]. +- [[React Rendering Optimization]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์„ ํƒ๊ณผ ๋ณ„๊ฐœ๋กœ, React ์ปดํฌ๋„ŒํŠธ ์ƒ๋ช…์ฃผ๊ธฐ ๋ฐ ๋ฉ”๋ชจ์ด์ œ์ด์…˜(`useMemo`, `useCallback`, `React.memo`)์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํผํฌ๋จผ์Šค์— ๋ฏธ์น˜๋Š” ์›๋ฆฌ์™€ ํ”„๋กœํŒŒ์ผ๋ง ๋ฐฉ๋ฒ• ํƒ์ƒ‰ [26-28]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Topics_Blog/Rollup.md b/10_Wiki/Topics_Blog/Rollup.md new file mode 100644 index 00000000..5a38f732 --- /dev/null +++ b/10_Wiki/Topics_Blog/Rollup.md @@ -0,0 +1,57 @@ +# [[Rollup]] + +## ๐Ÿ“Œ Brief Summary +Rollup์€ 2025๋…„ ๊ธฐ์ค€ ์ตœ์‹  ํ”„๋ก ํŠธ์—”๋“œ ๋นŒ๋“œ ๋„๊ตฌ์ธ Vite์˜ ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ๋ฅผ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๋‹ด๋‹นํ•˜๋Š” ๋ชจ๋“ˆ ๋ฒˆ๋“ค๋Ÿฌ์ž…๋‹ˆ๋‹ค [1]. ๊ฐœ๋ฐœ ๋‹จ๊ณ„์—์„œ๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ES ๋ชจ๋“ˆ(ESM)์„ ์‚ฌ์šฉํ•˜๋Š” Vite๊ฐ€ ์‹ค์ œ ๋ฐฐํฌ ์‹œ์ ์—๋Š” Rollup์œผ๋กœ ์ „ํ™˜ํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋ฅผ ๋ณ‘ํ•ฉํ•˜๊ณ  ์ตœ์ ํ™”ํ•ฉ๋‹ˆ๋‹ค [1, 2]. ์ž๋™ ์ฝ”๋“œ ๋ถ„ํ• (Code Splitting)๊ณผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ํŠธ๋ฆฌ ์‰์ดํ‚น(Tree-shaking) ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ๋งค์šฐ ์ตœ์ ํ™”๋œ ์ตœ์ข… ์—์…‹์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ ์—ญํ• ์ž…๋‹ˆ๋‹ค [1]. + +## ๐Ÿ“– Core ๋Œ€Content +* **Vite์™€์˜ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์•„ํ‚คํ…์ฒ˜:** Vite๋Š” ๋กœ์ปฌ ๊ฐœ๋ฐœ ์‹œ์—๋Š” ๋ฒˆ๋“ค๋ง ์—†์ด ๋„ค์ดํ‹ฐ๋ธŒ ESM์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ œ๊ณตํ•˜์—ฌ ๊ทน๋„๋กœ ๋น ๋ฅธ ์‹œ์ž‘๊ณผ HMR(Hot Module Replacement)์„ ์ง€์›ํ•˜์ง€๋งŒ, ํ”„๋กœ๋•์…˜ ๋ฐฐํฌ ์‹œ์—๋Š” Rollup์„ ์‚ฌ์šฉํ•˜์—ฌ ์ตœ์ ํ™”๋œ ๋ฒˆ๋“ค(Bundled build)์„ ์ƒ์„ฑํ•˜๋Š” ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๋ฐฉ์‹์„ ์ทจํ•ฉ๋‹ˆ๋‹ค [1]. +* **๋ฒˆ๋“ค ์ตœ์ ํ™” ๋ฐ ํŠธ๋ฆฌ ์‰์ดํ‚น (Tree-shaking):** Rollup์€ ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ ์‹œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์—์„œ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์ฝ”๋“œ๋ฅผ ์ž๋™์œผ๋กœ ์ œ๊ฑฐ(Tree-shaking)ํ•˜๊ณ  ํšจ์œจ์ ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๋ถ„ํ• ํ•˜์—ฌ ์ตœ์ ํ™”๋œ ์—์…‹์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [1]. +* **์ฒญํฌ ์ˆ˜๋™ ์ œ์–ด (`manualChunks`):** ๊ธฐ๋ณธ ์„ค์ • ์ƒํƒœ์—์„œ Rollup์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ์™€ `node_modules`์˜ ๋ชจ๋“  ์ข…์†์„ฑ์„ ๋‹จ์ผ ํŒŒ์ผ(`index.js`)๋กœ ๋ฌถ์–ด ๊ฑฐ๋Œ€ํ•œ ๋ฒˆ๋“ค์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3]. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” Rollup ์˜ต์…˜ ์ค‘ `manualChunks`๋ฅผ ์„ธ๋ฐ€ํ•˜๊ฒŒ ์„ค์ •ํ•˜์—ฌ, ์ž์ฃผ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ๋ฌด๊ฑฐ์šด ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(React ์ฝ”์–ด, Recharts, Lodash, ์•„์ด์ฝ˜ ๋“ฑ)๋ฅผ ๋ณ„๋„์˜ ์ฒญํฌ ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค [4-6]. +* **์บ์‹œ ํšจ์œจ์„ฑ ๊ฐœ์„ :** `manualChunks`๋ฅผ ํ†ตํ•ด ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ถ„๋ฆฌํ•˜๋ฉด, ํ•ด๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ž์ฃผ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๋Ÿฌ ๋ฒˆ ๋ฐฐํฌํ•˜๋”๋ผ๋„ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ด๋ฅผ ์บ์‹œํ•˜์—ฌ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ดˆ๊ธฐ ๋กœ๋“œ ์„ฑ๋Šฅ์ด ํฌ๊ฒŒ ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค [5-7]. + +## โš–๏ธ Trade-offs & Caveats +* **์ดˆ๊ธฐ ์„ค์ • ๋ถ€์กฑ ์‹œ ๋Œ€์šฉ๋Ÿ‰ ๋ฒˆ๋“ค ๋ฐœ์ƒ:** ๊ธฐ๋ณธ ์„ค์ •์œผ๋กœ ๋‘˜ ๊ฒฝ์šฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ชจ๋“  ์ข…์†์„ฑ์ด ํ•˜๋‚˜์˜ ํŒŒ์ผ์— Eager Import ๋˜์–ด ๊ฒฐํ•ฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3]. ์ด๋Š” ๋ฏธ๋‹ˆํŒŒ์ด(Minification) ํ›„์—๋„ 500kB๋ฅผ ์ดˆ๊ณผํ•˜๋Š” ๋Œ€๊ทœ๋ชจ ์ฒญํฌ(Large Chunks)๋ฅผ ์ƒ์„ฑํ•˜์—ฌ, ๋‹ค์šด๋กœ๋“œ ์‹œ๊ฐ„์„ ์ง€์—ฐ์‹œํ‚ค๊ณ  ์ €์‚ฌ์–‘ ๊ธฐ๊ธฐ์—์„œ ํŒŒ์‹ฑ ๋ฐ ์ปดํŒŒ์ผ์— ๋ฌด๋ฆฌ๋ฅผ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3, 8, 9]. +* **์บ์‹œ ๋ฌดํšจํ™”(Cache Invalidation) ๋ฌธ์ œ:** ๋‹จ์ผ ๊ฑฐ๋Œ€ ๋ฒˆ๋“ค๋กœ ๋นŒ๋“œํ•  ๊ฒฝ์šฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ž‘์€ ์ฝ”๋“œ ํ•˜๋‚˜๋งŒ ์ˆ˜์ •ํ•˜๋”๋ผ๋„ ์ „์ฒด ๋ฒˆ๋“ค์ด ์ƒˆ๋กœ ํ•ด์‹œ(Hash)๋˜์–ด ์‚ฌ์šฉ์ž๋Š” ๋ชจ๋“  JavaScript ํŒŒ์ผ์„ ๋‹ค์‹œ ๋‹ค์šด๋กœ๋“œํ•ด์•ผ ํ•˜๋Š” ๋น„ํšจ์œจ์„ฑ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [9]. ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๋ ค๋ฉด `manualChunks` ์„ค์ •๊ณผ `React.lazy`๋ฅผ ๊ฒฐํ•ฉํ•œ ๋ผ์šฐํŠธ ๊ธฐ๋ฐ˜ ์ฝ”๋“œ ๋ถ„ํ•  ๋“ฑ ์ถ”๊ฐ€์ ์ธ ์ตœ์ ํ™” ์ž‘์—…์ด ๊ฐ•์ œ๋ฉ๋‹ˆ๋‹ค [3, 6]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] +- [[Vite]] + - ์—ฐ๊ฒฐ ์ด์œ : Rollup์€ Vite์˜ ์•„ํ‚คํ…์ฒ˜ ๋‚ด์—์„œ ํ”„๋กœ๋•์…˜ ๋ฐฐํฌ ์‹œ ์ตœ์ ํ™”๋œ ๋นŒ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋‚ด๋ถ€ ์—”์ง„์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค [1]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ฐœ๋ฐœ ๋ชจ๋“œ(ESM)์™€ ๋ฐฐํฌ ๋ชจ๋“œ(Rollup)๋ฅผ ๋‹ค๋ฅด๊ฒŒ ๊ฐ€์ ธ๊ฐ€๋Š” Vite์˜ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๋ฒˆ๋“ค๋ง ์•„ํ‚คํ…์ฒ˜ ์ „๋žต์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1, 2]. +- [[Tree-shaking]] + - ์—ฐ๊ฒฐ ์ด์œ : Rollup์ด ๋ฐฐํฌ์šฉ ์ฝ”๋“œ๋ฅผ ์ตœ์ ํ™”ํ•  ๋•Œ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ๋ฅผ ๋œ์–ด๋‚ด๋Š” ํ•ต์‹ฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค [1]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ES ๋ชจ๋“ˆ ๊ธฐ๋ฐ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ์ด ์™œ ์ตœ์ข… ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ ์ตœ์ ํ™”์— ํ•„์ˆ˜์ ์ธ์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [10]. + +#### [๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ] +- [[manualChunks]] + - ์—ฐ๊ฒฐ ์ด์œ : Rollup์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฑฐ๋Œ€ํ•œ ๋ฉ”์ธ ๋ฒˆ๋“ค์„ ์„ธ๋ถ„ํ™”๋œ ๋ฒค๋” ์ฒญํฌ(Vendor chunk)๋กœ ์ชผ๊ฐค ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ํ•ต์‹ฌ ์„ค์ •์ž…๋‹ˆ๋‹ค [4-6]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ธŒ๋ผ์šฐ์ € ์บ์‹ฑ์„ ๊ทน๋Œ€ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์ฝ”๋“œ๋ฅผ ์„ฑ๊ฒฉ(๋ณ€๊ฒฝ ๋นˆ๋„)์— ๋”ฐ๋ผ ๋ถ„๋ฆฌํ•˜๋Š” ์ตœ์ ํ™” ์ „๋žต์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [6, 7]. +- [[Code Splitting]] + - ์—ฐ๊ฒฐ ์ด์œ : Rollup์˜ ๊ธฐ๋Šฅ๊ณผ React์˜ ์ง€์—ฐ ๋กœ๋”ฉ(`React.lazy`)์„ ๊ฒฐํ•ฉํ•˜์—ฌ ๊ตฌํ˜„๋˜๋Š” ์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค [3, 11]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ดˆ๊ธฐ ํŽ˜์ด๋กœ๋“œ(Payload)๋ฅผ ์ค„์ด๊ณ  Core Web Vitals๋ฅผ ๊ฐœ์„ ํ•˜๋Š” ๋Ÿฐํƒ€์ž„ ์ตœ์ ํ™” ๋ฐฉ๋ฒ•์„ ํ•™์Šตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [9, 12]. + +### Deeper Research Questions +- Vite๋Š” ์™œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋Š” Rollup์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋„ค์ดํ‹ฐ๋ธŒ ESM์„ ์‚ฌ์šฉํ•˜๋ฉฐ, ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ์—์„œ๋งŒ Rollup์„ ๋„์ž…ํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜๋ฅผ ์„ ํƒํ–ˆ๋Š”๊ฐ€? +- Rollup์˜ Tree-shaking ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ๋นŒ๋“œ ์‹œ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๋ฐ๋“œ ์ฝ”๋“œ(Dead code)๋ฅผ ์‹๋ณ„ํ•˜๊ณ  ์ตœ์ข… ๋ฒˆ๋“ค์—์„œ ์ œ์™ธํ•˜๋Š”๊ฐ€? +- `manualChunks`๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฒค๋”(Vendor) ํŒŒ์ผ์„ ๋ถ„ํ• ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ชจ๋“ˆ ๊ฐ„ ์ค‘๋ณต ํฌํ•จ ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ์„ค์ • ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? +- Rollup์ด ์ƒ์„ฑํ•œ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ๋ถ„์„ํ•˜๊ธฐ ์œ„ํ•ด `rollup-plugin-visualizer`๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋ฐ์ดํ„ฐ๋Š” ์‹ค์ œ ์„ฑ๋Šฅ ๊ฐœ์„ ์— ์–ด๋–ป๊ฒŒ ํ™œ์šฉ๋˜๋Š”๊ฐ€? +- Rollup์˜ ๋นŒ๋“œ ์ตœ์ ํ™”๊ฐ€ FCP, LCP, INP ๋“ฑ Core Web Vitals ์ง€ํ‘œ ํ–ฅ์ƒ์— ๋ฏธ์น˜๋Š” ๊ตฌ์ฒด์ ์ธ ์ธ๊ณผ๊ด€๊ณ„๋Š” ๋ฌด์—‡์ธ๊ฐ€? + +### Practical Application Contexts +- **Implementation:** `vite.config.js` ๋‚ด๋ถ€์— `build.rollupOptions.output.manualChunks`๋ฅผ ๊ตฌ์„ฑํ•˜์—ฌ `react`, `react-dom` ๋“ฑ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ณ„๋„์˜ ํŒŒ์ผ๋กœ ๊ฐ•์ œ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค [4, 6]. +- **System Design:** ํ”„๋ก ํŠธ์—”๋“œ ํ”„๋กœ๋•์…˜ ์‹œ์Šคํ…œ ์„ค๊ณ„ ์‹œ, ์ž์ฃผ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋ถ„๋ฆฌํ•˜์—ฌ CDN ์บ์‹œ ํžˆํŠธ์œจ์„ ๋†’์ด๋„๋ก ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค [5, 6]. +- **Operation / Maintenance:** CI/CD ํŒŒ์ดํ”„๋ผ์ธ์—์„œ "500 kB ์ด์ƒ์˜ ์ฒญํฌ" ๊ฒฝ๊ณ ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ, `rollup-plugin-visualizer`๋ฅผ ํ†ตํ•ด ๋ฒˆ๋“ค ์ƒํƒœ๋ฅผ ์ ๊ฒ€ํ•˜๊ณ  ๋ถ„ํ•  ์„ค์ •์„ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค [8, 13, 14]. +- **Learning Path:** React ์ตœ์ ํ™” ํ•™์Šต ์‹œ, ๋‹จ์ˆœํžˆ `React.lazy()`๋งŒ ๋ฐฐ์šฐ๋Š” ๊ฒƒ์„ ๋„˜์–ด ๋ฒˆ๋“ค๋Ÿฌ(Rollup) ๋ ˆ๋ฒจ์—์„œ์˜ ์ฝ”๋“œ ์ฒญํ‚น(Chunking) ์›๋ฆฌ๋ฅผ ํ•จ๊ป˜ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค [3, 6]. +- **My Project Relevance:** Vite ๊ธฐ๋ฐ˜ React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ Vercel์ด๋‚˜ AWS ์„œ๋ฒ„์— ๋ฐฐํฌํ•˜๊ธฐ ์ „์— ๋นŒ๋“œ ์†๋„ ๋ฐ ์ดˆ๊ธฐ ๋‹ค์šด๋กœ๋“œ ์†๋„๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•œ ํ•„์ˆ˜ ์ ๊ฒ€ ๋‹จ๊ณ„๋กœ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค [2, 11]. + +### Adjacent Topics +- [[ES Modules (ESM)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: Rollup์˜ ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ ์ด์ „, Vite๊ฐ€ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ์ฝ”๋“œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ฆ‰๊ฐ์ ์œผ๋กœ ๋ธŒ๋ผ์šฐ์ €์— ๋ฐ˜์˜ํ•˜๋Š” ์›๋ฆฌ ํŒŒ์•… [1, 15]. +- [[Core Web Vitals]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: Rollup์˜ ๋ฒˆ๋“ค ๋ถ„ํ•  ๋ฐ ๊ฒฝ๋Ÿ‰ํ™” ์ž‘์—…์ด LCP(Largest Contentful Paint)๋‚˜ INP(Interaction to Next Paint)์™€ ๊ฐ™์€ ๋ธŒ๋ผ์šฐ์ € ์„ฑ๋Šฅ ์ธก์ • ์ง€ํ‘œ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ฐœ์„ ํ•˜๋Š”์ง€ ์กฐ์‚ฌ [9, 14]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Topics_Blog/Vite + React ์„ฑ๋Šฅ ์ตœ์ ํ™”.md b/10_Wiki/Topics_Blog/Vite + React ์„ฑ๋Šฅ ์ตœ์ ํ™”.md new file mode 100644 index 00000000..5fbe3306 --- /dev/null +++ b/10_Wiki/Topics_Blog/Vite + React ์„ฑ๋Šฅ ์ตœ์ ํ™”.md @@ -0,0 +1,75 @@ +# [[Vite + React ์„ฑ๋Šฅ ์ตœ์ ํ™”]] + +## ๐Ÿ“Œ Brief Summary +Vite์™€ React ํ™˜๊ฒฝ์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๋Š” ๊ฒƒ์€ ์ดˆ๊ธฐ ๋กœ๋”ฉ ์†๋„๋ฅผ ๋†’์ด๊ณ  ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œ์ผœ ์ „๋ฐ˜์ ์ธ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๊ฐœ์„ ํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋Š” ๊ธฐ๋ณธ ES ๋ชจ๋“ˆ(ESM)์„, ์šด์˜ ํ™˜๊ฒฝ์—์„œ๋Š” Rollup์„ ํ†ตํ•œ ๋ฒˆ๋“ค๋ง์„ ํ™œ์šฉํ•˜๋Š” Vite์˜ ๊ตฌ์กฐ์  ์ด์ ์„ ๊ทน๋Œ€ํ™”ํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค. ์ฃผ์š” ์ตœ์ ํ™” ๊ธฐ๋ฒ•์œผ๋กœ๋Š” ๋น ๋ฅธ ์ปดํŒŒ์ผ์„ ์œ„ํ•œ SWC ๋„์ž…, ๋™์  ์ž„ํฌํŠธ๋ฅผ ํ†ตํ•œ ์ฝ”๋“œ ๋ถ„ํ• , `manualChunks`๋ฅผ ํ™œ์šฉํ•œ ๋ฌด๊ฑฐ์šด ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ถ„๋ฆฌ, ๊ทธ๋ฆฌ๊ณ  ๋ฒˆ๋“ค ์‹œ๊ฐํ™” ๋„๊ตฌ๋ฅผ ํ†ตํ•œ ๋ถˆํ•„์š”ํ•œ ์˜์กด์„ฑ ์ œ๊ฑฐ ๋“ฑ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. + +## ๐Ÿ“– Core Content +* **Vite์˜ ์•„ํ‚คํ…์ฒ˜ ์ดํ•ด ๋ฐ SWC ํ™œ์šฉ** + ๊ฐœ๋ฐœ ์ค‘์—๋Š” ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ๋ฏธ๋ฆฌ ๋ฒˆ๋“ค๋งํ•˜์ง€ ์•Š๊ณ  ๋ธŒ๋ผ์šฐ์ €์— ๋„ค์ดํ‹ฐ๋ธŒ ES ๋ชจ๋“ˆ(ESM)๋กœ ์ง์ ‘ ์ œ๊ณตํ•˜์—ฌ ๋งค์šฐ ๋น ๋ฅธ ์„œ๋ฒ„ ์‹œ์ž‘๊ณผ HMR(Hot Module Replacement)์„ ๋‹ฌ์„ฑํ•ฉ๋‹ˆ๋‹ค [1, 2]. ์ปดํŒŒ์ผ ์†๋„๋ฅผ ๊ทน๋Œ€ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ์กด์˜ Babel ๋Œ€์‹  Rust ๊ธฐ๋ฐ˜ ์ปดํŒŒ์ผ๋Ÿฌ์ธ SWC(`@vitejs/plugin-react-swc`)๋ฅผ ์ฑ„ํƒํ•˜๋ฉด, ์ปค์Šคํ…€ Babel ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ํ•„์š” ์—†๋Š” ๋Œ€๊ทœ๋ชจ React ํ”„๋กœ์ ํŠธ์—์„œ ๋นŒ๋“œ ๋ฐ ์ƒˆ๋กœ๊ณ ์นจ ์‹œ๊ฐ„์„ ํš๊ธฐ์ ์œผ๋กœ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3-5]. +* **์ฝ”๋“œ ๋ถ„ํ• (Code Splitting) ๋ฐ ์ง€์—ฐ ๋กœ๋”ฉ(Lazy Loading)** + ์ดˆ๊ธฐ ๋กœ๋“œ ์†๋„๋ฅผ ๋†’์ด๊ณ  LCP(Largest Contentful Paint)์™€ ๊ฐ™์€ ์›น ์ง€ํ‘œ๋ฅผ ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ๋ฌด๊ฑฐ์šด ๋ฒˆ๋“ค์„ ์—ฌ๋Ÿฌ ์ฒญํฌ๋กœ ๋ถ„ํ• ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [6, 7]. `React.lazy()`์™€ ``๋ฅผ ์‚ฌ์šฉํ•œ ๋™์  ์ž„ํฌํŠธ๋กœ ๋ผ์šฐํŠธ ๋ ˆ๋ฒจ์ด๋‚˜ ์ฐจํŠธ ๋“ฑ ํฐ ์œ„์ ฏ์„ ์‚ฌ์šฉ์ž๊ฐ€ ์ ‘๊ทผํ•  ๋•Œ๋งŒ ๋กœ๋“œํ•˜๋„๋ก ์„ค์ •ํ•˜๋ฉด ๋ฉ”์ธ ๋ฒˆ๋“ค์˜ ํฌ๊ธฐ๋ฅผ ๋Œ€ํญ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [6, 8-13]. +* **`manualChunks`๋ฅผ ํ™œ์šฉํ•œ ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ถ„ํ• ** + ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ ์‹œ 500kB ์ด์ƒ์˜ ๊ฑฐ๋Œ€ํ•œ ์ฒญํฌ ๊ฒฝ๊ณ ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด `vite.config.js`์˜ Rollup ์˜ต์…˜์—์„œ `manualChunks`๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค [12, 14-17]. React ์ฝ”์–ด๋‚˜ Lodash, ์ฐจํŠธ, ์•„์ด์ฝ˜ ๋“ฑ ์žฆ์€ ๋ณ€๊ฒฝ์ด ์—†๋Š” ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์„ ๋ณ„๋„์˜ ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌํ•˜๋ฉด, ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์€ ์ฝ”๋“œ๋ฅผ ์žฅ๊ธฐ๊ฐ„ ์บ์‹ฑ(Long-term caching)ํ•  ์ˆ˜ ์žˆ์–ด ์žฌ๋ฐฉ๋ฌธ ๋ฐ ๋ฐฐํฌ ์‹œ ๋กœ๋”ฉ ํšจ์œจ์ด ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค [12, 15, 18, 19]. +* **์˜์กด์„ฑ ์‚ฌ์ „ ๋ฒˆ๋“ค๋ง(`optimizeDeps`)๊ณผ ํŠธ๋ฆฌ ์‰์ดํ‚น** + ๋Œ€๊ทœ๋ชจ ์•ฑ์ด๋‚˜ ๋น„์ •์ƒ์ ์ธ ์˜์กด์„ฑ ๋กœ๋”ฉ์œผ๋กœ ์ธํ•œ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด `optimizeDeps`๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5, 6]. ๋˜ํ•œ ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ ๋กœ๋“œ๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด `lodash` ๋Œ€์‹  `lodash-es`์ฒ˜๋Ÿผ ํŠธ๋ฆฌ ์‰์ดํ‚น(Tree-shaking)์ด ์ง€์›๋˜๋Š” ์ตœ์‹  ES ๋ชจ๋“ˆ ๊ธฐ๋ฐ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์šฐ์„ ์ ์œผ๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [20]. +* **๋ฒˆ๋“ค ์‹œ๊ฐํ™” ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง** + `rollup-plugin-visualizer` ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์—ฐ๋™ํ•˜์—ฌ ๋นŒ๋“œ ์‹œ ๊ฑฐ๋Œ€ํ•œ ๋ฒˆ๋“ค์˜ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‹œ๊ฐ์ ์ธ ํŠธ๋ฆฌ๋งต ํ˜•ํƒœ๋กœ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค [6, 13, 21]. ์ด๋ฅผ ํ†ตํ•ด ๋ฒˆ๋“ค ๋‚ด ์ฐจ์ง€ํ•˜๋Š” ๋น„์ค‘์ด ๋ถˆํ•„์š”ํ•˜๊ฒŒ ํฐ ์ฝ”๋“œ๋ฅผ ์ฐพ์•„๋‚ด์–ด ์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜ ์ง€์—ฐ ๋กœ๋”ฉ์œผ๋กœ ๋ถ„๋ฆฌํ•  ๊ธฐํšŒ๋ฅผ ์‹ ์†ํ•˜๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [13, 20, 22]. + +## โš–๏ธ Trade-offs & Caveats +* **๊ณผ๋„ํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ ์‚ฌ์šฉ:** Vite๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ ๋„ˆ๋ฌด ๋งŽ์€ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋‚จ์šฉํ•˜๋ฉด ๊ฐœ๋ฐœ ์„œ๋ฒ„์˜ ์„ฑ๋Šฅ์ด ํ˜„์ €ํžˆ ๋А๋ ค์งˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ ์œ„์ฃผ๋กœ ๊ฐ€๋ณ๊ฒŒ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [20]. +* **์บ์‹ฑ ๋ฌดํšจํ™” ์ฃผ์˜:** ๋ชจ๋“ˆ ๋กœ๋”ฉ ์„ฑ๋Šฅ์„ ์œ„ํ•ด Vite๋Š” ๋ธŒ๋ผ์šฐ์ € ์บ์‹ฑ์— ํฌ๊ฒŒ ์˜์กดํ•˜๋ฏ€๋กœ, ๊ฐœ๋ฐœ ์‹œ ๋ธŒ๋ผ์šฐ์ € ๊ฐœ๋ฐœ์ž ๋„๊ตฌ์—์„œ ์บ์‹œ๋ฅผ ๋ฌดํšจํ™”(Disable cache)ํ•˜๋ฉด ์„ฑ๋Šฅ์ด ๊ธ‰๊ฒฉํ•˜๊ฒŒ ์ €ํ•˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [20]. +* **์ง€์—ฐ ๋กœ๋”ฉ์˜ ๊ณผ์šฉ ๋ฐ ์ž˜๋ชป๋œ ๋ฐฐ์น˜:** ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ์— ์ง€์—ฐ ๋กœ๋”ฉ์„ ๋‚จ๋ฐœํ•˜๊ฑฐ๋‚˜, ์Šคํฌ๋กค ์—†์ด ๋ฐ”๋กœ ๋ณด์—ฌ์•ผ ํ•˜๋Š” ํ•ต์‹ฌ(Above-the-fold) ์š”์†Œ๋‚˜ ์ฆ‰์‹œ ๋ Œ๋”๋งํ•ด์•ผ ํ•˜๋Š” UI๊นŒ์ง€ ์ง€์—ฐ ๋กœ๋”ฉ์„ ์ ์šฉํ•˜๋ฉด ์ดˆ๊ธฐ ํ™”๋ฉด ํ‘œ์‹œ๊ฐ€ ์ง€์—ฐ๋˜์–ด ์˜คํžˆ๋ ค ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๋ง์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [23, 24]. +* **๋ฉ”๋ชจ์ด์ œ์ด์…˜(`React.memo`, `useMemo` ๋“ฑ) ์˜ค๋ฒ„ํ—ค๋“œ:** ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ง‰๊ธฐ ์œ„ํ•œ ๋„๊ตฌ์ง€๋งŒ, ๋น„๊ต ์—ฐ์‚ฐ๊ณผ ์ด์ „ ์ƒํƒœ๋ฅผ ์บ์‹ฑํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋น„์šฉ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [25]. ๋ Œ๋”๋ง์ด ์•„์ฃผ ๋น ๋ฅด๊ณ  ๋‹จ์ˆœํ•œ ์ปดํฌ๋„ŒํŠธ๋‚˜, ์ „๋‹ฌ๋˜๋Š” props๊ฐ€ ๋นˆ๋ฒˆํžˆ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒฝ์šฐ(์˜ˆ: ์ธ๋ผ์ธ ๊ฐ์ฒด, ํ•จ์ˆ˜ ์ „๋‹ฌ)์— ์‚ฌ์šฉํ•˜๋ฉด ๋ Œ๋”๋ง ์ž์ฒด๋ณด๋‹ค ์ƒํƒœ ๋น„๊ต ๋น„์šฉ์ด ๋” ์ปค์ ธ ์„ฑ๋Šฅ์ด ์˜คํžˆ๋ ค ์•…ํ™”๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [25-28]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [๊ด€๊ณ„ ์œ ํ˜• A (์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ )] +- [[๋„ค์ดํ‹ฐ๋ธŒ ES ๋ชจ๋“ˆ(ESM)]] + - ์—ฐ๊ฒฐ ์ด์œ : Vite๊ฐ€ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ์ฝ”๋“œ ๋ชจ๋“ˆ์„ ์„œ๋น™ํ•˜๋Š” ๋ฐฉ์‹์˜ ํ•ต์‹ฌ ๊ธฐ๋ฐ˜ ์›๋ฆฌ์ž…๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ฒˆ๋“ค๋Ÿฌ๊ฐ€ ์ „์ฒด ์•ฑ์„ ๋งค๋ฒˆ ๋นŒ๋“œํ•˜์ง€ ์•Š๊ณ  ๋ณ€๊ฒฝ๋œ ๋ชจ๋“ˆ๋งŒ ์š”์ฒญ/๋กœ๋“œํ•จ์œผ๋กœ์จ ํ”„๋กœ์ ํŠธ ํฌ๊ธฐ์— ์ƒ๊ด€์—†์ด ๋น ๋ฅธ HMR๊ณผ ์‘๋‹ต์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1, 29, 30]. + +- [[Rollup]] + - ์—ฐ๊ฒฐ ์ด์œ : Vite ํ™˜๊ฒฝ์—์„œ ํ”„๋กœ๋•์…˜ ๋ฐฐํฌ ์‹œ ์ฝ”๋“œ๋ฅผ ํ•˜๋‚˜๋กœ ๋ชจ์œผ๊ณ  ์ตœ์ ํ™”ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋ฒˆ๋“ค๋Ÿฌ์ž…๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Vite์˜ ์„ค์ • ํŒŒ์ผ(`vite.config.js`)์—์„œ `manualChunks` ๋“ฑ Rollup ์ „์šฉ ๋นŒ๋“œ ์˜ต์…˜์„ ํ†ตํ•ด ์–ด๋–ป๊ฒŒ ํšจ์œจ์ ์ธ ์ •์  ์• ์…‹(Asset)์„ ์ƒ์„ฑํ•˜๊ณ , ์ฝ”๋“œ ๋ถ„ํ• ๊ณผ ํŠธ๋ฆฌ ์‰์ดํ‚น์„ ์ˆ˜ํ–‰ํ•˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [14, 18, 31, 32]. + +#### [๊ด€๊ณ„ ์œ ํ˜• B (๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ)] +- [[SWC ์ปดํŒŒ์ผ๋Ÿฌ]] + - ์—ฐ๊ฒฐ ์ด์œ : Vite์˜ ๊ธฐ๋ณธ ๊ตฌ์„ฑ์„ ํ™•์žฅํ•ด ์†๋„๋ฅผ ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•œ ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ณผ๊ฑฐ Babel์ด ์ฒ˜๋ฆฌํ•˜๋˜ JSX/TypeScript ๋ณ€ํ™˜ ์ž‘์—…์„ Rust ๊ธฐ๋ฐ˜์˜ ๋น ๋ฅธ ๋„๊ตฌ(`@vitejs/plugin-react-swc`)๋กœ ๊ต์ฒดํ•˜์—ฌ ๋Œ€ํ˜• React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์žฌ๋นŒ๋“œ ์‹œ๊ฐ„์„ ์ฆ‰๊ฐ์ ์œผ๋กœ ๋‹จ์ถ•์‹œํ‚ค๋Š” ๋ฐฉ์‹์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1, 3, 5]. + +- [[React.lazy & Suspense]] + - ์—ฐ๊ฒฐ ์ด์œ : React ๋‚ด๋ถ€์—์„œ ๋™์  ์ž„ํฌํŠธ๋ฅผ ํ†ตํ•œ ์ปดํฌ๋„ŒํŠธ ๋ ˆ๋ฒจ ์ง€์—ฐ ๋กœ๋”ฉ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ API์ž…๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ผ์šฐํŠธ๋‚˜ ๋ฌด๊ฑฐ์šด ๋ชจ๋“ˆ์„ ๋ถ„๋ฆฌํ•˜๊ณ , ๋ฒˆ๋“ค์ด ๋กœ๋“œ๋˜๋Š” ๋™์•ˆ ``๋ฅผ ํ†ตํ•ด ํด๋ฐฑ(Fallback) UI๋ฅผ ์ฒ˜๋ฆฌํ•จ์œผ๋กœ์จ ์ดˆ๊ธฐ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŽ˜์ด๋กœ๋“œ ์šฉ๋Ÿ‰์„ ๋Œ€ํญ ์ค„์ด๋Š” ์‹ค๋ฌด ๊ธฐ๋ฒ•์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [6, 9, 11, 12, 33]. + +- [[rollup-plugin-visualizer]] + - ์—ฐ๊ฒฐ ์ด์œ : ์ตœ์ ํ™” ์ž‘์—… ์ „ํ›„๋กœ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์‹œ๊ฐํ™”ํ•˜๊ณ  ๋ฌธ์ œ๋ฅผ ์ง„๋‹จํ•˜๋Š” ํ•„์ˆ˜ ๋ถ„์„ ํ”Œ๋Ÿฌ๊ทธ์ธ์ž…๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํฐ ์ฒญํฌ๊ฐ€ ์™œ ๋ฐœ์ƒํ•˜๋Š”์ง€, ์–ด๋–ค ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(๋ฒค๋”)๊ฐ€ ์˜๋„์น˜ ์•Š๊ฒŒ ์šฉ๋Ÿ‰์„ ๊ณผ๋„ํ•˜๊ฒŒ ์ ์œ ํ•˜๋Š”์ง€ ๋ถ„์„ํ•˜์—ฌ `manualChunks`๋‚˜ ์ฝ”๋“œ ๊ต์ฒด๋ฅผ ๊ฒฐ๋‹จํ•˜๋Š” ์ธก์ •/๋””๋ฒ„๊น… ๊ธฐ๋ฐ˜์„ ํ™•๋ฆฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [6, 13, 21]. + +### Deeper Research Questions + +- ๋Œ€๊ทœ๋ชจ ์™ธ๋ถ€ ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ Vite์˜ `optimizeDeps`๋ฅผ ์„ธ๋ฐ€ํ•˜๊ฒŒ ํŠœ๋‹ํ•˜๋ ค๋ฉด ์–ด๋– ํ•œ ๊ธฐ์ค€๊ณผ ์„ค์ • ๋ฐฉ์‹์„ ์ ์šฉํ•ด์•ผ ํ•˜๋Š”๊ฐ€? +- SWC ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋„์ž…ํ•  ๋•Œ ๊ธฐ์กด์— ์‚ฌ์šฉ ์ค‘์ธ ํŠน์ • ์ปค์Šคํ…€ Babel ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์˜จ์ „ํžˆ ๋Œ€์ฒดํ•˜๊ฑฐ๋‚˜ ๋ณ‘ํ–‰ํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์˜ ํ•œ๊ณ„ ๋ฐ ํ•ด๊ฒฐ์ฑ…์€ ๋ฌด์—‡์ธ๊ฐ€? +- Rollup์˜ `manualChunks`๋กœ ๋ฌด๊ฑฐ์šด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ถ„๋ฆฌํ•  ๋•Œ, ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ณ‘๋ ฌ๋กœ ๋‹ค์šด๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋Š” ํ•œ๊ณ„์ ๊ณผ ์žฅ๊ธฐ ์บ์‹ฑ(Long-term caching)์˜ ์ด์ ์„ ๊ณ ๋ คํ•œ ์ตœ์ ์˜ ๋ถ„ํ•  ๋‹จ์œ„(Chunk size)๋Š” ์–ด๋А ์ •๋„์ธ๊ฐ€? +- `React.lazy`์™€ ``๋ฅผ ๋ผ์šฐํŠธ ๋ ˆ๋ฒจ์ด ์•„๋‹Œ ์„ธ๋ถ€ ์ปดํฌ๋„ŒํŠธ ๋ ˆ๋ฒจ(์˜ˆ: ๋ฌด๊ฑฐ์šด ๋ชจ๋‹ฌ ์ฐฝ์ด๋‚˜ ์ฐจํŠธ)์— ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์ ์šฉํ•  ๋•Œ, ๋ถˆํ•„์š”ํ•œ ๋กœ๋”ฉ ์ƒํƒœ ๋‚จ๋ฐœ์„ ๋ง‰๊ณ  ์ž์—ฐ์Šค๋Ÿฌ์šด ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์œ ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? +- ๋ฒˆ๋“ค ์‹œ๊ฐํ™”๋ฅผ ํ†ตํ•ด ๋ฐœ๊ฒฌ๋œ, ํŠธ๋ฆฌ ์‰์ดํ‚น์ด ์ „ํ˜€ ์ ์šฉ๋˜์ง€ ์•Š๋Š” ๋ ˆ๊ฑฐ์‹œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์˜์กด์„ฑ์„ ์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜ ๋ชจ๋˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ๋•Œ ๋”ฐ๋ผ์•ผ ํ•  ๋ฆฌํŒฉํ† ๋ง ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? + +### Practical Application Contexts + +- **Implementation:** `vite.config.ts` ํŒŒ์ผ์—์„œ SWC ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์ • ๋ฐ `rollupOptions` ๋‚ด `manualChunks`๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•˜์—ฌ React ๋Ÿฐํƒ€์ž„, ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ, ์ฐจํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋“ฑ์„ ๊ฐ๊ฐ์˜ ์ฒญํฌ๋กœ ์ถ”์ถœํ•˜๋„๋ก ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. +- **System Design:** ์ดˆ๊ธฐ ์•„ํ‚คํ…์ฒ˜ ์ˆ˜๋ฆฝ ์‹œ, ๋ผ์šฐํŠธ ๋ณ„๋กœ ์ง€์—ฐ ๋กœ๋”ฉ๋  ๊ธฐ๋Šฅ๊ณผ ์•ฑ ๊ตฌ๋™ ์‹œ ์ฆ‰์‹œ ํ•„์š”ํ•œ ์ฝ”์–ด ๋ ˆ์ด์–ด๋ฅผ ์—„๊ฒฉํ•˜๊ฒŒ ๋ถ„๋ฆฌํ•˜์—ฌ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…์„ ์ „์ œ๋กœ ํ•œ ์ปดํฌ๋„ŒํŠธ ๊ณ„์ธต ํŠธ๋ฆฌ๋ฅผ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค. +- **Operation / Maintenance:** CI/CD ํŒŒ์ดํ”„๋ผ์ธ์— `rollup-plugin-visualizer`์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํฌํŠธ๋กœ ๋‚จ๊ธฐ๋„๋ก ๊ตฌ์„ฑํ•˜์—ฌ, ํŒ€์›์ด ์ƒˆ๋กœ์šด ํŒจํ‚ค์ง€๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ ๋ฉ”์ธ ๋ฒˆ๋“ค ํฌ๊ธฐ๊ฐ€ ๋น„์ •์ƒ์ ์œผ๋กœ ์ปค์ง€์ง€ ์•Š๋Š”์ง€ ์ง€์†์ ์œผ๋กœ ๊ฐ์‹œํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜ํ•ฉ๋‹ˆ๋‹ค. +- **Learning Path:** ์šฐ์„  React์˜ ๋ Œ๋”๋ง ์›๋ฆฌ ๋ฐ ํ”„๋กœํŒŒ์ผ๋Ÿฌ ์‚ฌ์šฉ๋ฒ•์„ ํ•™์Šตํ•œ ํ›„, ๋นŒ๋“œ ํˆด(Vite/Rollup)์˜ ๋ฒˆ๋“ค๋ง ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ดํ•ดํ•˜๊ณ , ์ดํ›„ ์ง€์—ฐ ๋กœ๋”ฉ ๊ธฐ๋ฒ• ๋ฐ ๋ฒˆ๋“ค ์ตœ์ ํ™” ํ”Œ๋Ÿฌ๊ทธ์ธ ์‹ค์Šต์œผ๋กœ ์ด์–ด์ง€๋Š” ๋กœ๋“œ๋งต์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. +- **My Project Relevance:** ๊ฑฐ๋Œ€ํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ ์ „์†ก์œผ๋กœ ์ธํ•ด ๋ Œ๋”๋ง์ด ์ง€์—ฐ๋˜๋Š” ํ”„๋กœ์ ํŠธ๋‚˜, ๋นŒ๋“œ ํ›„ "500kB ์ดˆ๊ณผ" ๊ฒฝ๊ณ ๊ฐ€ ๋œจ๋Š” ํ”„๋ก ํŠธ์—”๋“œ ํ™˜๊ฒฝ์—์„œ ์ฆ‰๊ฐ์ ์ธ ํŒŒ์ผ ๋ถ„ํ• ๊ณผ ์บ์‹ฑ ์ „๋žต์„ ์ ์šฉํ•˜์—ฌ ํŽ˜์ด์ง€ ๋กœ๋“œ ์„ฑ๋Šฅ(FCP, LCP)์„ ๊ฐ€์‹œ์ ์œผ๋กœ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### Adjacent Topics + +- [[Core Web Vitals]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: Vite์™€ React ์ตœ์ ํ™”๋ฅผ ํ†ตํ•ด ์–ป์–ด๋‚ธ ๋ฉ”์ธ ๋ฒˆ๋“ค ํฌ๊ธฐ ๊ฐ์†Œ ๋ฐ ๋ Œ๋”๋ง ์†๋„ ํ–ฅ์ƒ์ด ์‹ค์ œ ์‚ฌ์šฉ์ž ์ฒด๊ฐ ์„ฑ๋Šฅ ์ง€ํ‘œ(LCP, FID/INP ๋“ฑ)์— ์–ด๋–ค ์ˆ˜์น˜์  ๊ฐœ์„ ์œผ๋กœ ๋‚˜ํƒ€๋‚˜๋Š”์ง€๋ฅผ ๊ตฌ์ฒด์ ์œผ๋กœ ์—ฐ๊ตฌํ•ฉ๋‹ˆ๋‹ค [11, 34, 35]. + +- [[Concurrent Rendering (๋™์‹œ์„ฑ ๋ Œ๋”๋ง)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋กœ๋”ฉ๊ณผ ๋ฒˆ๋“ค๋ง ์ตœ์ ํ™”๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, `useTransition` ๋ฐ `useDeferredValue` ํ›…์„ ์ด์šฉํ•˜์—ฌ ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ๋ณ€ํ™” ์‹œ์—๋„ ์‚ฌ์šฉ์ž ์ž…๋ ฅ ๋“ฑ์˜ UI ๋ฐ˜์‘์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๋Ÿฐํƒ€์ž„ ์ฐจ์›์˜ ์„ฑ๋Šฅ ํ–ฅ์ƒ ์ „๋žต์œผ๋กœ ์ง€์‹์„ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค [36-38]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Topics_Blog/Vite Build System.md b/10_Wiki/Topics_Blog/Vite Build System.md new file mode 100644 index 00000000..9ee03e7c --- /dev/null +++ b/10_Wiki/Topics_Blog/Vite Build System.md @@ -0,0 +1,52 @@ +# [[Vite Build System]] + +## ๐Ÿ“Œ Brief Summary +Vite๋Š” ํ˜„๋Œ€ ํ”„๋ก ํŠธ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(ํŠนํžˆ React) ๊ฐœ๋ฐœ์„ ์œ„ํ•œ ์ƒˆ๋กœ์šด ์‚ฐ์—… ํ‘œ์ค€ ๋นŒ๋“œ ๋„๊ตฌ๋กœ, ๊ฑฐ์˜ ์ฆ‰๊ฐ์ ์ธ ์„œ๋ฒ„ ์‹œ์ž‘๊ณผ ์ดˆ๊ณ ์† HMR(Hot Module Replacement)์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [1, 2]. ๊ธฐ์กด ๋ฒˆ๋“ค๋Ÿฌ์™€ ๋‹ฌ๋ฆฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋Š” ๋ธŒ๋ผ์šฐ์ €์— ๋„ค์ดํ‹ฐ๋ธŒ ES ๋ชจ๋“ˆ ํ˜•ํƒœ๋กœ ์ฝ”๋“œ๋ฅผ ์ œ๊ณตํ•˜๊ณ , ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋Š” Rollup์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ณ ๋„๋กœ ์ตœ์ ํ™”๋œ ๋ฒˆ๋“ค์„ ์ƒ์„ฑํ•˜๋Š” ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค [3, 4]. ๋˜ํ•œ SWC๋‚˜ esbuild์™€ ๊ฐ™์€ Rust ๊ธฐ๋ฐ˜ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ๋„ ๋น ๋ฅด๊ณ  ์›ํ™œํ•œ ๊ฐœ๋ฐœ์ž ๊ฒฝํ—˜์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค [3, 5, 6]. + +## ๐Ÿ“– Core Content +* **ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์•„ํ‚คํ…์ฒ˜ (๊ฐœ๋ฐœ ๋ฐ ํ”„๋กœ๋•์…˜)**: Vite๋Š” ๊ฐœ๋ฐœ ์‹œ ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ์‚ฌ์ „์— ๋ฒˆ๋“ค๋งํ•˜๋Š” ๋Œ€์‹ , ์ฝ”๋“œ๋ฅผ ๋„ค์ดํ‹ฐ๋ธŒ ES ๋ชจ๋“ˆ(ESM) ํ˜•ํƒœ๋กœ ๋ธŒ๋ผ์šฐ์ €์— ์ง์ ‘ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [2, 3]. ์ด ๋ฐฉ์‹์€ ํ•„์š”ํ•  ๋•Œ ํ•„์š”ํ•œ ํŒŒ์ผ๋งŒ ๋กœ๋“œํ•˜๋ฏ€๋กœ ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๊ฐ€ ์ปค์ ธ๋„ ์„œ๋ฒ„ ์‹œ์ž‘ ๋ฐ ๊ฐฑ์‹  ์†๋„๊ฐ€ ๋งค์šฐ ๋น ๋ฆ…๋‹ˆ๋‹ค [3, 7]. ๋ฐ˜๋ฉด, ํ”„๋กœ๋•์…˜ ๋ฐฐํฌ ์‹œ์—๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ Rollup์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž๋™ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…, ๋ฏธ์‚ฌ์šฉ ์ฝ”๋“œ ์ œ๊ฑฐ(Tree-shaking), ์ž์‚ฐ ์ตœ์ ํ™” ๋“ฑ์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ์„ฑ๋Šฅ์ด ๋›ฐ์–ด๋‚œ ๋ฒˆ๋“ค์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค [4, 8]. +* **์ดˆ๊ณ ์† ์ปดํŒŒ์ผ๋Ÿฌ ๋ฐ ํ”Œ๋Ÿฌ๊ทธ์ธ ํ™œ์šฉ**: Vite๋Š” ์ปดํŒŒ์ผ ์†๋„๋ฅผ ๋†’์ด๊ธฐ ์œ„ํ•ด Rust ๊ธฐ๋ฐ˜์˜ ์ปดํŒŒ์ผ๋Ÿฌ์ธ SWC ๋˜๋Š” esbuild๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค [3]. ๊ธฐ์กด Babel ๋Œ€์‹  `@vitejs/plugin-react-swc`๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด JSX ๋ฐ TypeScript ์ปดํŒŒ์ผ ์†๋„๊ฐ€ ๋น„์•ฝ์ ์œผ๋กœ ํ–ฅ์ƒ๋˜์–ด ์žฌ๋นŒ๋“œ ์‹œ๊ฐ„์ด ๋‹จ์ถ•๋ฉ๋‹ˆ๋‹ค [5, 6, 9]. ์ด์™ธ์—๋„ `vite-plugin-svgr`(SVG ์ปดํฌ๋„ŒํŠธํ™”), `vite-plugin-pwa`์™€ ๊ฐ™์€ ์œ ์—ฐํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ƒํƒœ๊ณ„๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค [10]. +* **๊ณ ๊ธ‰ ๊ตฌ์„ฑ (vite.config.js)**: Vite๋Š” `vite.config.js`๋ฅผ ํ†ตํ•ด ๋ณต์žกํ•œ ํ”„๋กœ์ ํŠธ ์„ค์ •์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๊ฒฝ๋กœ ๋ณ„์นญ(Path Aliases)์„ ์„ค์ •ํ•˜์—ฌ ์ž„ํฌํŠธ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•˜๊ฑฐ๋‚˜, `VITE_` ์ ‘๋‘์‚ฌ๊ฐ€ ๋ถ™์€ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋งŒ์„ ์•ˆ์ „ํ•˜๊ฒŒ ๋…ธ์ถœํ•˜๋ฉฐ, ๊ฐœ๋ฐœ ์ค‘ CORS ๋ฌธ์ œ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•œ ๋‚ด์žฅ ํ”„๋ก์‹œ ์„œ๋ฒ„ ์„ค์ •์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค [5, 9, 11]. +* **์„ฑ๋Šฅ ํŠœ๋‹ ๋ฐ ๋Œ€์šฉ๋Ÿ‰ ์ฒญํฌ(Chunk) ๊ด€๋ฆฌ**: ๋Œ€๊ทœ๋ชจ ์•ฑ์—์„œ๋Š” ๋ฌด๊ฑฐ์šด ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์ธํ•ด ๋ฉ”์ธ ๋ฒˆ๋“ค์ด ๊ณผ๋„ํ•˜๊ฒŒ ์ปค์ง€๋Š” ๋ฌธ์ œ("chunks are larger than 500 kB")๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [12-14]. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด `manualChunks`๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ React, ์ฐจํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋“ฑ ์ž์ฃผ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ๋ฒค๋” ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌํ•ด ๋ธŒ๋ผ์šฐ์ € ์บ์‹ฑ์„ ๊ทน๋Œ€ํ™”ํ•ฉ๋‹ˆ๋‹ค [8, 11, 14-16]. ์ด์™€ ํ•จ๊ป˜ `React.lazy`์™€ ``๋ฅผ ์ด์šฉํ•œ ๋ผ์šฐํŠธ ๋ ˆ๋ฒจ์˜ ๋™์  ์ž„ํฌํŠธ(์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…)๋ฅผ ์ ์šฉํ•˜๊ณ , `rollup-plugin-visualizer`๋กœ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ๋ถ„์„ํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ด ๋ชจ๋ฒ” ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค [16-19]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts +- [[Native ES Modules (ESM)]] + - ์—ฐ๊ฒฐ ์ด์œ : Vite๊ฐ€ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ํŒŒ์ผ ์ „์ฒด๋ฅผ ์‚ฌ์ „ ๋ฒˆ๋“ค๋งํ•˜์ง€ ์•Š๊ณ , ํ•„์š”ํ•  ๋•Œ ๋ธŒ๋ผ์šฐ์ €์— ์ฝ”๋“œ๋ฅผ ์ œ๊ณตํ•˜๋Š” ํ•ต์‹ฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [3, 7]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Vite๊ฐ€ ๊ธฐ์กด ๋„๊ตฌ(Webpack ๋“ฑ)์— ๋น„ํ•ด ์–ด๋–ป๊ฒŒ ์ดˆ๊ธฐ ๊ตฌ๋™ ์†๋„์™€ HMR ์‘๋‹ต์„ฑ์„ ๊ทน์ ์œผ๋กœ ๋‹จ์ถ•ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ทธ ์›๋ฆฌ๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2, 3]. + +- [[Rollup]] + - ์—ฐ๊ฒฐ ์ด์œ : Vite๊ฐ€ ํ”„๋กœ๋•์…˜์šฉ ๋นŒ๋“œ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๋‚ด๋ถ€์ ์œผ๋กœ ์ฑ„ํƒํ•˜๊ณ  ์žˆ๋Š” ๋ฒˆ๋“ค๋Ÿฌ ๋„๊ตฌ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [4]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ์ฒญํฌ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋‚˜๋‰˜๋ฉฐ(`manualChunks`), ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…๊ณผ ํŠธ๋ฆฌ ์‰์ดํ‚น์„ ํ†ตํ•ด ์ตœ์ ํ™”๋œ ์ •์  ์ž์‚ฐ์ด ๋งŒ๋“ค์–ด์ง€๋Š” ๊ณผ์ •์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [4, 8, 11]. + +- [[SWC (Speedy Web Compiler)]] + - ์—ฐ๊ฒฐ ์ด์œ : Vite ํ™˜๊ฒฝ์—์„œ ๊ธฐ์กด์˜ Babel์„ ๋Œ€์ฒดํ•˜์—ฌ JSX์™€ TypeScript๋ฅผ ์‹ค์‹œ๊ฐ„์— ๊ฐ€๊น๊ฒŒ ๋ณ€ํ™˜ํ•˜๋Š” Rust ๊ธฐ๋ฐ˜ ์ปดํŒŒ์ผ๋Ÿฌ ๊ธฐ์ˆ ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [3, 5, 6]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋Œ€๊ทœ๋ชจ React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ ์‹œ ์ปดํŒŒ์ผ ์†๋„์™€ ํ•ซ ๋ฆฌ๋กœ๋“œ ์†๋„๋ฅผ ํ–ฅ์ƒํ•˜๋Š” ๊ธฐ์ˆ ์  ๋ฐฐ๊ฒฝ์„ ๊นŠ์ด ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3, 6]. + +- [[Code Splitting & manualChunks]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋Œ€์šฉ๋Ÿ‰ ๋ฉ”์ธ ๋ฒˆ๋“ค ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ , ์ดˆ๊ธฐ ํŽ˜์ด์ง€ ๋กœ๋“œ ์†๋„๋ฅผ ๋†’์ด๊ธฐ ์œ„ํ•œ Vite ์„ฑ๋Šฅ ์ตœ์ ํ™”์˜ ํ•ต์‹ฌ ๊ธฐ๋ฒ•์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [12, 14]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋™์  ์ž„ํฌํŠธ์™€ ๊ฒฐํ•ฉํ•˜์—ฌ ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(์•ˆ์ •์ ์ธ ์ฝ”๋“œ)๋ฅผ ๋ณ„๋„ ํŒŒ์ผ๋กœ ์บ์‹ฑํ•˜๊ณ  ๊ธฐ๋Šฅ ๋‹จ์œ„๋กœ ์ฒญํฌ๋ฅผ ๋‚˜๋ˆ„๋Š” ์ „๋žต์„ ํ•™์Šตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [8, 16]. + +### Deeper Research Questions +- ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์˜ ๋„ค์ดํ‹ฐ๋ธŒ ESM ์ฒ˜๋ฆฌ ๋ฐฉ์‹๊ณผ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์˜ Rollup ๋ฒˆ๋“ค๋ง ๊ฐ„์˜ ์•„ํ‚คํ…์ฒ˜ ์ฐจ์ด๊ฐ€ ๋Ÿฐํƒ€์ž„ ๋™์ž‘์ด๋‚˜ ๋ชจ๋“ˆ ํ•ด์„(Module Resolution)์— ์–ด๋–ค ์ฐจ์ด์™€ ์ž ์žฌ์  ๋ฒ„๊ทธ๋ฅผ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- Vite์˜ `optimizeDeps`๋ฅผ ํ†ตํ•œ ์‚ฌ์ „ ๋ฒˆ๋“ค๋ง(Pre-bundling) ํ”„๋กœ์„ธ์Šค๋Š” ๊ฑฐ๋Œ€ํ•œ ์™ธ๋ถ€ ์˜์กด์„ฑ ํŒจํ‚ค์ง€๋ฅผ ๋กœ๋“œํ•  ๋•Œ ๋ธŒ๋ผ์šฐ์ €์˜ ๋„คํŠธ์›Œํฌ ๋ณ‘๋ชฉ์„ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•˜๋Š”๊ฐ€? +- ๋Œ€๊ทœ๋ชจ React ์•ฑ์„ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•  ๋•Œ ์ปค์Šคํ…€ Babel ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉ ์ค‘์ธ ํ™˜๊ฒฝ์—์„œ SWC ์ปดํŒŒ์ผ๋Ÿฌ(`@vitejs/plugin-react-swc`)๋กœ ์ „ํ™˜ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ํ˜ธํ™˜์„ฑ ํ•œ๊ณ„์™€ ๋Œ€์•ˆ์€ ๋ฌด์—‡์ธ๊ฐ€? +- `manualChunks`๋ฅผ ํ™œ์šฉํ•ด ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ธ๋ฐ€ํ•˜๊ฒŒ ๋ถ„ํ• ํ•  ๋•Œ, ์ƒ์„ฑ๋œ ํ•ด์‹œ(hash) ํŒŒ์ผ๋ช… ๊ธฐ๋ฐ˜์˜ ์žฅ๊ธฐ ์บ์‹ฑ(Long-term Caching) ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ์ตœ์ ํ™”๋˜๋Š”๊ฐ€? +- `rollup-plugin-visualizer`๋ฅผ ํ†ตํ•œ ๋ฒˆ๋“ค ์‹œ๊ฐํ™” ์ดํ›„, ์˜๋„์น˜ ์•Š๊ฒŒ ๋ฉ”์ธ ์ฒญํฌ์— ํฌํ•จ๋œ ๊ณผ๋„ํ•œ ํŠธ๋žœ์ง€ํ‹ฐ๋ธŒ ์˜์กด์„ฑ(Transitive Dependencies)์„ ํšจ๊ณผ์ ์œผ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ์ฝ”๋“œ ๋ ˆ๋ฒจ ํŒจํ„ด์€ ๋ฌด์—‡์ธ๊ฐ€? + +### Practical Application Contexts +- **Implementation:** `vite.config.js`๋ฅผ ๊ตฌ์„ฑํ•˜์—ฌ `@vitejs/plugin-react-swc`๋ฅผ ๋„์ž…ํ•˜๊ณ , ์ƒ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•œ ๊ฒฝ๋กœ ๋ณ„์นญ(Path Aliases) ์„ค์ •, `VITE_` ์ ‘๋‘์‚ฌ๋ฅผ ์ด์šฉํ•œ ์•ˆ์ „ํ•œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋ฐ”์ธ๋”ฉ, CORS๋ฅผ ์šฐํšŒํ•˜๊ธฐ ์œ„ํ•œ ํ”„๋ก์‹œ(Proxy) ์„ค์ •์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค [5, 9, 11]. +- **System Design:** ๋Œ€๊ทœ๋ชจ ํ”„๋ก ํŠธ์—”๋“œ ์‹œ์Šคํ…œ ์„ค๊ณ„ ์‹œ, ๋ฌด๊ฑฐ์šด ์ดˆ๊ธฐ ๋ฒˆ๋“ค ํฌ๊ธฐ ์ด์Šˆ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด Webpack ๋Œ€์‹  Vite๋ฅผ ๋„์ž…ํ•˜๊ณ  ๊ฐœ๋ฐœ(๋„ค์ดํ‹ฐ๋ธŒ ESM)๊ณผ ํ”„๋กœ๋•์…˜(Rollup ์ตœ์ ํ™”)์˜ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๋นŒ๋“œ ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌ์ถ•ํ•ฉ๋‹ˆ๋‹ค [2-4, 8]. +- **Operation / Maintenance:** `rollup-plugin-visualizer`๋ฅผ ๋นŒ๋“œ ํ”„๋กœ์„ธ์Šค์— ์—ฐ๋™ํ•ด ์ •๊ธฐ์ ์œผ๋กœ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ , `manualChunks`๋ฅผ ์œ ์ง€๋ณด์ˆ˜ํ•˜์—ฌ React ์ฝ”์–ด ๊ฐ™์€ ๋ฒค๋” ํŒจํ‚ค์ง€์˜ ๋ธŒ๋ผ์šฐ์ € ์บ์‹ฑ ์ด์ ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค [16-19]. +- **Learning Path:** ์šฐ์„  Vite์˜ ๊ณต์‹ ์Šค์บํด๋“œ ํˆด๋กœ React ์•ฑ์„ ์ƒ์„ฑํ•˜์—ฌ ๊ธฐ์กด CRA(Create React App) ๊ตฌ์กฐ์™€์˜ ์ฐจ์ด๋ฅผ ์ฒดํ—˜ํ•œ ํ›„, ๋™์  ์ž„ํฌํŠธ(`React.lazy`)์™€ `optimizeDeps` ๋“ฑ์˜ ๊ณ ๊ธ‰ ์„ค์ • ๋ฐ ํ”Œ๋Ÿฌ๊ทธ์ธ ํ™•์žฅ์„ ์ ์ง„์ ์œผ๋กœ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค [6, 7, 10, 16, 20]. +- **My Project Relevance:** ์†Œ์Šค์— ๊ด€๋ จ ์ •๋ณด๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. (๊ฐœ์ธ์˜ ํ˜„์žฌ ์ง„ํ–‰ ์ค‘์ธ ํŠน์ • ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ์†Œ์Šค ํ…์ŠคํŠธ์— ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.) + +### Adjacent Topics +- [[React Server Components (RSC) & Next.js App Router]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: Vite๋ฅผ ์ด์šฉํ•œ ๋นŒ๋“œ ํˆด ์ฒด์ธ ์ตœ์ ํ™”(CSR/SPA ์„ฑ๋Šฅ ์ตœ์ ํ™”)๋ฅผ ๋„˜์–ด, ํด๋ผ์ด์–ธํŠธ ์ธก ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค ์ž์ฒด๋ฅผ ์ „์†กํ•˜์ง€ ์•Š๊ณ  ์„œ๋ฒ„์—์„œ ๋ฏธ๋ฆฌ ๋ Œ๋”๋งํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜ ์ˆ˜์ค€์˜ ์„ฑ๋Šฅ ์ตœ์ ํ™” ํŒจ๋Ÿฌ๋‹ค์ž„์œผ๋กœ ์ดํ•ด๋ฅผ ๋„“ํž™๋‹ˆ๋‹ค [21-23]. +- [[Performance Metrics (Core Web Vitals)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: Vite์˜ ์ฒญํฌ ์ตœ์ ํ™”์™€ ๋ ˆ์ด์ง€ ๋กœ๋”ฉ ๊ธฐ๋ฒ•์ด ์‹ค์ œ ์‚ฌ์šฉ์ž ์ฒด๊ฐ ์„ฑ๋Šฅ ์ง€ํ‘œ์ธ FCP(First Contentful Paint), LCP(Largest Contentful Paint), INP(Interaction to Next Paint)์— ์–ด๋–ค ์ง์ ‘์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”์ง€ ์—ฐ๊ฒฐํ•˜์—ฌ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค [13, 24, 25]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Topics_Blog/Vite Build Tool.md b/10_Wiki/Topics_Blog/Vite Build Tool.md new file mode 100644 index 00000000..de593fe3 --- /dev/null +++ b/10_Wiki/Topics_Blog/Vite Build Tool.md @@ -0,0 +1,72 @@ +# [[Vite Build Tool]] + +## ๐Ÿ“Œ Brief ์ž„๋ฌด +Vite๋Š” ํ˜„๋Œ€ ํ”„๋ก ํŠธ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(์ฃผ๋กœ React)์„ ์œ„ํ•œ ํ‘œ์ค€ ๋นŒ๋“œ ๋„๊ตฌ๋กœ, ๊ธฐ์กด Webpack ๋ฐ Create React App(CRA)์„ ๋Œ€์ฒดํ•˜๋ฉฐ ๋น ๋ฅด๊ฒŒ ์ž๋ฆฌ ์žก์•˜์Šต๋‹ˆ๋‹ค [1, 2]. ์ด ๋„๊ตฌ๋Š” ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋Š” ๋ธŒ๋ผ์šฐ์ €์˜ ๋„ค์ดํ‹ฐ๋ธŒ ES ๋ชจ๋“ˆ(ESM)์„ ํ™œ์šฉํ•ด ์ฆ‰๊ฐ์ ์ธ ์„œ๋ฒ„ ์‹œ์ž‘๊ณผ ์ดˆ๊ณ ์† HMR(Hot Module Replacement)์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [2-4]. ํ”„๋กœ๋•์…˜ ๋ฐฐํฌ ์‹œ์—๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ Rollup์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…๊ณผ ํŠธ๋ฆฌ ์‰์ดํ‚น์ด ์ ์šฉ๋œ ๊ณ ๋„๋กœ ์ตœ์ ํ™”๋œ ๋ฒˆ๋“ค์„ ์ƒ์„ฑํ•˜๋Š” ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ํŠน์ง•์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค [5, 6]. + +## ๐Ÿ“– Core Content +* **ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์•„ํ‚คํ…์ฒ˜ (Hybrid Architecture)** + * **๊ฐœ๋ฐœ ํ™˜๊ฒฝ:** ์ฝ”๋“œ๋ฅผ ์‚ฌ์ „์— ์ „์ฒด ๋ฒˆ๋“ค๋งํ•˜์ง€ ์•Š๊ณ  ๋ธŒ๋ผ์šฐ์ €์— ๋„ค์ดํ‹ฐ๋ธŒ ES ๋ชจ๋“ˆ(ESM)๋กœ ์ง์ ‘ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ํŒŒ์ผ๋งŒ ๋กœ๋“œ๋˜๋ฏ€๋กœ ํ”„๋กœ์ ํŠธ ํฌ๊ธฐ๊ฐ€ ์ปค์ ธ๋„ ๊ฐœ๋ฐœ ์„œ๋ฒ„๊ฐ€ ์ฆ‰๊ฐ์ ์œผ๋กœ ๋ฐ˜์‘ํ•ฉ๋‹ˆ๋‹ค [2-4]. + * **ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ:** ๋ฐฐํฌ ์‹œ์—๋Š” Rollup์„ ์‚ฌ์šฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฒˆ๋“ค๋งํ•˜๋ฉฐ, ์ž๋™ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ… ๋ฐ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ํŠธ๋ฆฌ ์‰์ดํ‚น(Tree-shaking)์„ ํ†ตํ•ด ์ตœ์ ํ™”๋œ ์ •์  ์—์…‹์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [5, 6]. +* **์ดˆ๊ณ ์† ์ปดํŒŒ์ผ ๋ฐ ์‚ฌ์ „ ๋ฒˆ๋“ค๋ง (Fast Compilation & Pre-bundling)** + * Vite๋Š” esbuild๋‚˜ ์ตœ์‹  Rust ๊ธฐ๋ฐ˜ ํŠธ๋žœ์Šคํฌ๋จธ์ธ SWC(Speedy Web Compiler)๋ฅผ ํ™œ์šฉํ•˜์—ฌ JSX ๋ฐ TypeScript ํŒŒ์ผ์„ ์‚ฌ์‹ค์ƒ ์ฆ‰์‹œ ์ปดํŒŒ์ผํ•ฉ๋‹ˆ๋‹ค [4, 7]. ๊ธฐ์กด Babel์„ SWC๋กœ ๋Œ€์ฒดํ•˜๋ฉด ํ•ซ ๋ชจ๋“ˆ ๋ฆฌ๋กœ๋“œ ์‹œ๊ฐ„์ด ํฌ๊ฒŒ ๋‹จ์ถ•๋ฉ๋‹ˆ๋‹ค [8]. + * ๊ฐœ๋ฐœ ์ค‘ ์ƒˆ๋กœ๊ณ ์นจ ์†๋„๋ฅผ ์ตœ์ ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์ข…์†์„ฑ์„ ์‚ฌ์ „ ๋ฒˆ๋“ค๋ง(Pre-bundling, `optimizeDeps`)ํ•ฉ๋‹ˆ๋‹ค [8]. +* **์„ค์ • ๋ฐ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ƒํƒœ๊ณ„ (Configuration & Plugins)** + * `vite.config.js`๋ฅผ ํ†ตํ•ด ๊ฒฝ๋กœ ๋ณ„์นญ(Path Aliases), CORS ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ๊ฐœ๋ฐœ ์„œ๋ฒ„ ํ”„๋ก์‹œ, `VITE_` ์ ‘๋‘์‚ฌ๊ฐ€ ๋ถ™์€ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋“ฑ์„ ์œ ์—ฐํ•˜๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [7, 9, 10]. + * SVG๋ฅผ React ์ปดํฌ๋„ŒํŠธ๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•œ `vite-plugin-svgr`, ์˜คํ”„๋ผ์ธ PWA ์ง€์›์„ ์œ„ํ•œ `vite-plugin-pwa`, ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ๋ถ„์„ํ•˜๋Š” `rollup-plugin-visualizer` ๋“ฑ ๊ฐ•๋ ฅํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ƒํƒœ๊ณ„๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค [11-13]. +* **๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ ์ตœ์ ํ™” (Bundle Optimization)** + * ๊ธฐ๋ณธ์ ์œผ๋กœ Vite๋Š” ์•ฑ ์ฝ”๋“œ์™€ ๋ชจ๋“  ์ข…์†์„ฑ(node_modules)์„ ํ•˜๋‚˜์˜ `index.js`์— ๋‹ด์•„ ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด `vite.config.ts`์˜ Rollup ์˜ต์…˜์—์„œ `manualChunks`๋ฅผ ์„ค์ •ํ•˜์—ฌ React ์ฝ”์–ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋“ฑ ๋ฌด๊ฑฐ์šด ๋ฒค๋”๋ฅผ ๋ถ„๋ฆฌํ•˜๊ณ  ๋ธŒ๋ผ์šฐ์ € ์บ์‹ฑ ํšจ์œจ์„ ๋†’์ž…๋‹ˆ๋‹ค [6, 14, 15]. + * `React.lazy()`์™€ ``๋ฅผ ๊ฒฐํ•ฉํ•œ ๋ผ์šฐํŠธ ๋ ˆ๋ฒจ ๋™์  ์ž„ํฌํŠธ๋ฅผ ํ†ตํ•ด ์ดˆ๊ธฐ ๋ฉ”์ธ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ๊ทน์ ์œผ๋กœ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [11, 14, 15]. + +## โš–๏ธ Trade-offs & Caveats +* **๋Œ€ํ˜• ์ฒญํฌ ๊ฒฝ๊ณ  ๋ฐ ์ดˆ๊ธฐ ๋ฒˆ๋“ค ๋น„๋Œ€ํ™” (Large Chunks Warning):** Vite๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ์ข…์†์„ฑ์„ ๋‹จ์ผ ํŒŒ์ผ๋กœ ๋นŒ๋“œํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ˆ˜๋™์œผ๋กœ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…์„ ํ•˜์ง€ ์•Š์œผ๋ฉด ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ ์‹œ "500kB ์ดˆ๊ณผ" ๊ฒฝ๊ณ ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋‹ค์šด๋กœ๋“œ ์‹œ๊ฐ„์„ ์ง€์—ฐ์‹œํ‚ค๊ณ  ๋‚ฎ์€ ์„ฑ๋Šฅ์˜ ๋ชจ๋ฐ”์ผ ๊ธฐ๊ธฐ์—์„œ ํŒŒ์‹ฑ ๋ฐ ์ปดํŒŒ์ผ์— ๋ฌด๋ฆฌ๋ฅผ ์ฃผ์–ด FCP, LCP, INP์™€ ๊ฐ™์€ Core Web Vitals ์ง€ํ‘œ๋ฅผ ์•…ํ™”์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [14, 16, 17]. +* **๊ฐœ๋ฐœ์ž ๋„๊ตฌ ์บ์‹ฑ ์˜์กด์„ฑ:** Vite๋Š” ๋ชจ๋“ˆ ๋กœ๋”ฉ ์„ฑ๋Šฅ์„ ์œ„ํ•ด ๋ธŒ๋ผ์šฐ์ €์˜ ์บ์‹ฑ์— ํฌ๊ฒŒ ์˜์กดํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐœ๋ฐœ ์ค‘ ๋ธŒ๋ผ์šฐ์ € ๊ฐœ๋ฐœ์ž ๋„๊ตฌ์—์„œ "์บ์‹œ ์‚ฌ์šฉ ์•ˆ ํ•จ(Disable cache)"์„ ์„ค์ •ํ•˜๋ฉด ๊ฐœ๋ฐœ ์„œ๋ฒ„๊ฐ€ ๋А๋ ค์ง€๋Š” ๋ถ€์ž‘์šฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [18]. +* **ํ”Œ๋Ÿฌ๊ทธ์ธ ๋‚จ์šฉ์œผ๋กœ ์ธํ•œ ์„ฑ๋Šฅ ์ €ํ•˜:** ๊ณผ๋„ํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ ์‚ฌ์šฉ์€ ๊ฐœ๋ฐœ ์„œ๋ฒ„์˜ ์†๋„๋ฅผ ์ €ํ•˜์‹œํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๊ตฌ์„ฑ์„ ์ตœ์†Œํ™”ํ•˜๊ณ  ํ•„์š”ํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ๋งŒ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [18]. +* **์‚ฌ์ „ ๋ฒˆ๋“ค๋ง ๊ด€๋ฆฌ ํ•„์š”์„ฑ:** ๊ทœ๋ชจ๊ฐ€ ํฌ๊ฑฐ๋‚˜ ํŠน์ดํ•œ ์™ธ๋ถ€ ์ข…์†์„ฑ์˜ ๊ฒฝ์šฐ, `optimizeDeps` ์„ค์ •์„ ์ˆ˜๋™์œผ๋กœ ์ œ์–ดํ•˜์ง€ ์•Š์œผ๋ฉด ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์ „ ๋ฒˆ๋“ค๋ง์œผ๋กœ ์ธํ•œ ์†๋„ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [8, 11]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] +- [[Native ES Modules (ESM)]] + - ์—ฐ๊ฒฐ ์ด์œ : Vite๊ฐ€ ๊ฐœ๋ฐœ ๋‹จ๊ณ„์—์„œ ๋น ๋ฅธ ๊ตฌ๋™ ์†๋„๋ฅผ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ํ™œ์šฉํ•˜๋Š” ๋ธŒ๋ผ์šฐ์ €์˜ ๊ธฐ๋ณธ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค [2, 4]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ณผ๊ฑฐ ๋„๊ตฌ(Webpack)์˜ ๋ฌด๊ฑฐ์šด ์‚ฌ์ „ ๋ฒˆ๋“ค๋ง ๋ฐฉ์‹๊ณผ ๋Œ€๋น„๋˜๋Š” Vite์˜ '์š”์ฒญ ์‹œ ์ œ๊ณต(On-demand serving)' ๋ฉ”์ปค๋‹ˆ์ฆ˜์˜ ์›๋ฆฌ. + +- [[Rollup]] + - ์—ฐ๊ฒฐ ์ด์œ : Vite์˜ ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ๋‚ด๋ถ€ ๋ฒˆ๋“ค๋Ÿฌ์ž…๋‹ˆ๋‹ค [5, 6]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ฐฐํฌ ํ™˜๊ฒฝ์—์„œ ์–ด๋–ป๊ฒŒ `manualChunks`๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฒˆ๋“ค์„ ๋ถ„ํ• ํ•˜๊ณ , ํŠธ๋ฆฌ ์‰์ดํ‚น์„ ํ†ตํ•ด ์ตœ์ ํ™”๋œ ๊ฒฐ๊ณผ๋ฌผ์„ ๋„์ถœํ•˜๋Š”์ง€ ๊ทธ ๊ณผ์ • [10, 16]. + +- [[SWC]] + - ์—ฐ๊ฒฐ ์ด์œ : ๊ธฐ์กด์˜ Babel์„ ๋Œ€์ฒดํ•˜์—ฌ JSX์™€ TypeScript ์ปดํŒŒ์ผ์„ ์—„์ฒญ๋‚˜๊ฒŒ ๋น ๋ฅธ ์†๋„๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” Rust ๊ธฐ๋ฐ˜ ํŠธ๋žœ์Šคํฌ๋จธ์ž…๋‹ˆ๋‹ค [4, 7, 8]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Vite ํ™˜๊ฒฝ์—์„œ React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ•ซ ๋ฆฌ๋กœ๋“œ์™€ ๋นŒ๋“œ ํผํฌ๋จผ์Šค๋ฅผ ํ•œ ์ฐจ์› ๋Œ์–ด์˜ฌ๋ฆฌ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ์˜ ์—ญํ• . + +#### [์ตœ์ ํ™” ๊ธฐ๋ฒ•] +- [[Code Splitting & manualChunks]] + - ์—ฐ๊ฒฐ ์ด์œ : 500kB ์ด์ƒ์˜ ๊ฑฐ๋Œ€ํ•œ ๋ฉ”์ธ ๋ฒˆ๋“ค ๊ฒฝ๊ณ  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Vite/Rollup ํ™˜๊ฒฝ์—์„œ ๋ฒค๋” ์ฝ”๋“œ์™€ ์•ฑ ์ฝ”๋“œ๋ฅผ ๋‚˜๋ˆ„๋Š” ํ•ต์‹ฌ ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค [6, 14, 15]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ธŒ๋ผ์šฐ์ € ๋ณ‘๋ ฌ ๋‹ค์šด๋กœ๋“œ์™€ ํšจ์œจ์ ์ธ ์บ์‹œ ๋ฌดํšจํ™” ์ „๋žต, ์ดˆ๊ธฐ ํŽ˜์ด๋กœ๋“œ ์ตœ์†Œํ™” ๋ฐฉ๋ฒ• [17, 19]. + +### Deeper Research Questions + +- Vite์˜ ๋„ค์ดํ‹ฐ๋ธŒ ESM ๊ธฐ๋ฐ˜ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ๊ณผ Rollup ๊ธฐ๋ฐ˜ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ ์‚ฌ์ด์˜ ์ฐจ์ด๋กœ ์ธํ•ด, ๋Ÿฐํƒ€์ž„ ๋˜๋Š” ๋นŒ๋“œ ํƒ€์ž„์— ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๋‚˜ ์˜ˆ์™ธ ์ผ€์ด์Šค๋Š” ๋ฌด์—‡์ธ๊ฐ€? +- ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ `optimizeDeps`๋ฅผ ํ†ตํ•œ ์‚ฌ์ „ ๋ฒˆ๋“ค๋ง ๋ฉ”์ปค๋‹ˆ์ฆ˜ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ค ๊ธฐ์ค€์„ ๊ฐ€์ง€๊ณ  ์ข…์†์„ฑ์„ ๋ถ„๋ฆฌ/ํฌํ•จํ•ด์•ผ ํ•˜๋Š”๊ฐ€? +- `@vitejs/plugin-react-swc` ์‚ฌ์šฉ ์‹œ, ๊ธฐ์กด Babel ์ƒํƒœ๊ณ„์˜ ์ปค์Šคํ…€ ํ”Œ๋Ÿฌ๊ทธ์ธ๋“ค์„ ์–ด๋–ป๊ฒŒ ์ด๊ด€ํ•˜๊ฑฐ๋‚˜ ๋Œ€์ฒดํ•ด์•ผ ํ•˜๋Š”๊ฐ€? +- `manualChunks`๋ฅผ ์„ธ๋ฐ€ํ•˜๊ฒŒ ์„ค์ •ํ•  ๋•Œ ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ค‘๋ณต ํฌํ•จ์„ ๋ง‰๊ณ  ๊ฐ€์žฅ ์ด์ƒ์ ์ธ ์ฒญํฌ ํฌ๊ธฐ๋ฅผ ์œ ์ง€ํ•˜๋Š” ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? +- Vite ํ™˜๊ฒฝ์—์„œ ๋ผ์šฐํŠธ ๋ ˆ๋ฒจ ์ง€์—ฐ ๋กœ๋”ฉ(`React.lazy`) ์ ์šฉ ์‹œ ๋ฐœ์ƒํ•˜๋Š” ์›Œํ„ฐํด(Waterfall) ๋„คํŠธ์›Œํฌ ์š”์ฒญ ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด `preload` ๋˜๋Š” `prefetch` ํžŒํŠธ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ฒฐํ•ฉํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? + +### Practical Application Contexts + +- **Implementation:** `npm create vite@latest`๋ฅผ ์‚ฌ์šฉํ•ด ๋ถˆํ•„์š”ํ•œ ์„ค์ • ์—†๋Š” ๊ฐ€๋ฒผ์šด ์ดˆ๊ธฐ ๊ตฌ์กฐ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , `vite.config.js`์— `@vitejs/plugin-react-swc`์™€ ๊ฐ™์€ ํ”Œ๋Ÿฌ๊ทธ์ธ, ๊ฒฝ๋กœ ๋ณ„์นญ(`@/components` ๋“ฑ), ๋ฐฑ์—”๋“œ API ์—ฐ๋™์„ ์œ„ํ•œ proxy ์„ค์ •์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค [3, 7, 9, 10]. +- **System Design:** ํ”„๋ก ํŠธ์—”๋“œ ์‹œ์Šคํ…œ ์„ค๊ณ„ ์‹œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ(๋น ๋ฅธ ํ”ผ๋“œ๋ฐฑ ๋ฃจํ”„ ๋ณด์žฅ)๊ณผ ๋ฐฐํฌ ํ™˜๊ฒฝ(๊ณ ๋„์˜ ์••์ถ• ๋ฐ ๋ณ‘๋ ฌ ๋กœ๋“œ๋ฅผ ์œ„ํ•œ ๋ชจ๋“ˆํ™” ๋ณด์žฅ)์— ๋‹ค๋ฅธ ์ „๋žต์„ ์ทจํ•˜๋Š” Vite์˜ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์ฒ ํ•™์„ ์•„ํ‚คํ…์ฒ˜์— ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค [5]. +- **Operation / Maintenance:** CI/CD ํŒŒ์ดํ”„๋ผ์ธ์ด๋‚˜ ๋กœ์ปฌ ๋นŒ๋“œ ํ›„ `rollup-plugin-visualizer` ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ํ™œ์šฉํ•˜์—ฌ ์–ด๋–ค ํŒจํ‚ค์ง€๊ฐ€ ๋ฉ”์ธ ๋ฒˆ๋“ค ์šฉ๋Ÿ‰์„ ์ฐจ์ง€ํ•˜๋Š”์ง€ ์‹œ๊ฐ์  ํŠธ๋ฆฌ๋งต์œผ๋กœ ์ •๊ธฐ ์ ๊ฒ€ํ•˜๊ณ  ์ตœ์ ํ™”ํ•ฉ๋‹ˆ๋‹ค [11, 13, 18]. +- **Learning Path:** ๋ชจ๋“ˆ ๋ฒˆ๋“ค๋Ÿฌ์˜ ๋ฐœ์ „ ๊ณผ์ •(Webpack -> ES Modules ๋„ค์ดํ‹ฐ๋ธŒ ๋„์ž… -> Vite)์„ ํ•™์Šตํ•œ ํ›„, ๋นŒ๋“œ ๋„๊ตฌ ์ฐจ์›์˜ ์ตœ์ ํ™”(`manualChunks`)์™€ React ํ”„๋ ˆ์ž„์›Œํฌ ์ฐจ์›์˜ ์ตœ์ ํ™”(`React.lazy`)๊ฐ€ ๊ฒฐํ•ฉ๋˜์—ˆ์„ ๋•Œ์˜ ์‹œ๋„ˆ์ง€๋ฅผ ์ดํ•ดํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ํ•™์Šต์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค [2, 6, 15]. +- **My Project Relevance:** Vite ๋นŒ๋“œ ์‹œ "Some chunks are larger than 500 kB" ๊ฒฝ๊ณ ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ๋‹นํ™ฉํ•˜์ง€ ์•Š๊ณ , ์ž์ฃผ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ๋ฒค๋” ์ฝ”๋“œ(React ์ฝ”์–ด, ์ฐจํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋“ฑ)๋ฅผ ๋ถ„๋ฆฌํ•˜๊ณ  ๋ผ์šฐํ„ฐ ๋ ˆ๋ฒจ์—์„œ ์ง€์—ฐ ๋กœ๋”ฉ์„ ๋„์ž…ํ•˜์—ฌ ๋‹ค์šด๋กœ๋“œ ์†๋„ ๋ฐ FCP, LCP๋ฅผ ๊ฐœ์„ ํ•˜๋Š” ๋ฐ ์ง์ ‘์ ์œผ๋กœ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค [14-16]. + +### Adjacent Topics + +- [[Webpack]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: Vite๊ฐ€ ๋“ฑ์žฅํ•˜๊ธฐ ์ „ ์—…๊ณ„ ํ‘œ์ค€์ด์—ˆ์œผ๋‚˜ ์‹œ์ž‘ ์ „ ์ „์ฒด ๋ฒˆ๋“ค๋ง ๊ณผ์ •์œผ๋กœ ์ธํ•ด ๋ฌด๊ฑฐ์šด ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„ Webpack์˜ ํ•œ๊ณ„์™€ Vite์™€์˜ ์•„ํ‚คํ…์ฒ˜ ๋น„๊ต [1, 2]. +- [[Core Web Vitals]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: Vite์˜ ์ฒญํฌ ๋ถ„ํ•  ๋ฐ ์ง€์—ฐ ๋กœ๋”ฉ ๊ธฐ๋ฒ•์ด ์‹ค์ œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ์ง€ํ‘œ์ธ FCP(First Contentful Paint), LCP(Largest Contentful Paint), INP(Interaction to Next Paint)์— ์–ด๋–ป๊ฒŒ ์ง๊ฒฐ๋˜๋Š”์ง€ ํƒ๊ตฌ [17, 20]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Topics_Blog/๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ.md b/10_Wiki/Topics_Blog/๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ.md new file mode 100644 index 00000000..a26dcf51 --- /dev/null +++ b/10_Wiki/Topics_Blog/๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ.md @@ -0,0 +1,63 @@ +# [[๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ]] + +## ๐Ÿ“Œ Brief Summary +๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ(์„œ๋ฒ„ ์ƒํƒœ ๊ด€๋ฆฌ)๋Š” API์—์„œ ๊ฐ€์ ธ์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ํด๋ผ์ด์–ธํŠธ ์ธก ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒํƒœ์™€ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌํ•˜์—ฌ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค [1]. ์ด๋Š” ๋„คํŠธ์›Œํฌ ์š”์ฒญ์— ๋”ฐ๋ฅธ ๋ฐ์ดํ„ฐ ์บ์‹ฑ, ๋™๊ธฐํ™”, ๋กœ๋”ฉ ๋ฐ ์—๋Ÿฌ ์‚ฌ์ดํด ๊ด€๋ฆฌ๋ฅผ ํฌํ•จํ•˜๋ฉฐ, ํ˜„๋Œ€ ํ”„๋ก ํŠธ์—”๋“œ ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜์˜ ํ•ต์‹ฌ ์š”์†Œ์ž…๋‹ˆ๋‹ค [1, 2]. ๋Œ€๊ทœ๋ชจ ์•ฑ์—์„œ๋Š” RTK Query๋‚˜ TanStack Query(React Query)์™€ ๊ฐ™์€ ํŠนํ™”๋œ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ๋ฅผ ์ค„์ด๊ณ  ํšจ์œจ์ ์ธ ์บ์‹œ ๊ด€๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค [1, 3, 4]. + +## ๐Ÿ“– Core Content + +* **์„œ๋ฒ„ ์ƒํƒœ์™€ ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ์˜ ๋ถ„๋ฆฌ:** + ์ตœ๊ทผ ํ”„๋ก ํŠธ์—”๋“œ ์•„ํ‚คํ…์ฒ˜์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ณ€ํ™” ์ค‘ ํ•˜๋‚˜๋Š” "์„œ๋ฒ„ ์ƒํƒœ(Server State)"๋ฅผ "์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒํƒœ"์™€ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. API์—์„œ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐ์ดํ„ฐ๋Š” ํด๋ผ์ด์–ธํŠธ ๋ฐ์ดํ„ฐ์™€ ๊ทผ๋ณธ์ ์œผ๋กœ ๋‹ค๋ฅด๋ฉฐ, ์บ์‹ฑ, ๋™๊ธฐํ™”, ๋กœ๋”ฉ ๋ฐ ์—๋Ÿฌ ์ฒ˜๋ฆฌ๊ฐ€ ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค [1]. Zustand์™€ ๊ฐ™์ด ์œ ์—ฐํ•œ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋น„๋™๊ธฐ(Async) ์ž‘์—…์„ ์ง์ ‘ ๋‹ค๋ฃจ๊ฒŒ ๋˜๋ฉด, ํŒ€์›๋งˆ๋‹ค ์ฝœ๋ฐฑ, ํ”„๋กœ๋ฏธ์Šค, ๋ฏธ๋“ค์›จ์–ด ๋“ฑ ์„œ๋กœ ๋‹ค๋ฅธ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์—ฌ ์ผ๊ด€์„ฑ์ด ๋–จ์–ด์ง€๊ณ  ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ค์›Œ์ง€๋Š” ํ•œ๊ณ„๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3, 5]. + +* **๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ ์ตœ์ ํ™” ๋„๊ตฌ:** + ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด TanStack Query(React Query)์™€ RTK Query ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์‚ฌ์‹ค์ƒ์˜ ํ‘œ์ค€์œผ๋กœ ์ž๋ฆฌ ์žก์•˜์Šต๋‹ˆ๋‹ค [1]. + * **TanStack Query:** ๊ฐ•๋ ฅํ•œ ์บ์‹ฑ ๋ ˆ์ด์–ด๋ฅผ ์ œ๊ณตํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ๋„คํŠธ์›Œํฌ ์ค‘๋ณต ์š”์ฒญ์„ ์ค„์ด๊ณ  ๋ฐ์ดํ„ฐ์˜ ์ตœ์‹  ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๋ฌดํ•œ ์Šคํฌ๋กค(infinite scrolling)์ด๋‚˜ ๋‚™๊ด€์  ์—…๋ฐ์ดํŠธ(optimistic updates)์™€ ๊ฐ™์€ ๋ณต์žกํ•œ ๋น„๋™๊ธฐ ๊ธฐ๋Šฅ์„ ๋‹จ์ˆœํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2]. + * **RTK Query:** Redux ์ƒํƒœ๊ณ„์—์„œ ๋น„๋™๊ธฐ ์ž‘์—…์ด ๋งŽ์€ ์•ฑ์„ ์œ„ํ•ด ์บ์‹ฑ, ์ค‘๋ณต ์ œ๊ฑฐ, ์ž๋™ ๋ฐ์ดํ„ฐ ์žฌ์š”์ฒญ(refetching), ์บ์‹œ ๋ฌดํšจํ™” ๊ธฐ๋Šฅ์„ ๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณตํ•˜์—ฌ ๋น„๋™๊ธฐ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ๋ฅผ ์‚ฌ์‹ค์ƒ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค [3, 4]. + +* **๊ตฌ์กฐ์  ๋ถ„๋ฆฌ์™€ ์•„ํ‚คํ…์ฒ˜:** + API ๊ณ„์ธต์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋…๋ฆฝ์ ์ธ ๊ฒฝ๊ณ„๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ, ์š”์ฒญ ์„ ์–ธ๋ถ€์™€ ์ปค์Šคํ…€ ํ›…(Custom Hooks)์€ ํŠน์ • ๊ธฐ๋Šฅ(feature) ํด๋” ๋‚ด์— ํ•จ๊ป˜ ๋ฐฐ์น˜(colocate)๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋„คํŠธ์›Œํฌ ๊ด€๋ จ ๋น„๋™๊ธฐ ๋กœ์ง์„ UI ์ปดํฌ๋„ŒํŠธ์™€ ์™„๋ฒฝํžˆ ๋””์ปคํ”Œ๋ง(decoupling)ํ•˜์—ฌ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค [2]. + +* **์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ฐ ์•ˆ์ •์„ฑ:** + * **๋””๋ฐ”์šด์‹ฑ๊ณผ ์“ฐ๋กœํ‹€๋ง:** ์‚ฌ์šฉ์ž ์ž…๋ ฅ(์˜ˆ: ๊ฒ€์ƒ‰)์— ์˜ํ•ด ํŠธ๋ฆฌ๊ฑฐ๋˜๋Š” ๊ฐ’๋น„์‹ผ ๋น„๋™๊ธฐ API ํ˜ธ์ถœ์€ ๋””๋ฐ”์šด์‹ฑ(debouncing)์ด๋‚˜ ์“ฐ๋กœํ‹€๋ง(throttling)์„ ํ†ตํ•ด ํšŸ์ˆ˜๋ฅผ ์ œํ•œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ณผ๋„ํ•œ API ํ˜ธ์ถœ์„ ๋ฐฉ์ง€ํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ณ  ์„œ๋ฒ„ ๋ถ€ํ•˜๋ฅผ ์ค„์—ฌ์ค๋‹ˆ๋‹ค [6, 7]. + * **๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฐฉ์ง€:** ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋‚˜ ๊ตฌ๋…(subscriptions) ๋“ฑ ์ •๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๋น„๋™๊ธฐ ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ์˜ ๊ฒฝ์šฐ, ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ธ๋งˆ์šดํŠธ๋  ๋•Œ ๋ฆฌ์†Œ์Šค๋ฅผ ํ•ด์ œํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜(memory leaks)๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด ๋ฐ˜๋“œ์‹œ `useEffect`์—์„œ ํด๋ฆฐ์—…(cleanup) ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [8, 9]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts +- [[TanStack Query ๋ฐ RTK Query]] + - ์—ฐ๊ฒฐ ์ด์œ : ์„œ๋ฒ„ ์ƒํƒœ(API ๋ฐ์ดํ„ฐ) ๊ด€๋ฆฌ์— ์žˆ์–ด ์บ์‹ฑ, ์ค‘๋ณต ์š”์ฒญ ์ œ๊ฑฐ, ์ž๋™ ์žฌ์š”์ฒญ ๋“ฑ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ํ˜„๋Œ€์ ์ธ ํ•„์ˆ˜ ํ‘œ์ค€ ๋„๊ตฌ๋กœ ์†Œ์Šค์—์„œ ๊ฐ•์กฐ๋˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [1, 2, 4]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ๊ฐ์†Œ ์›๋ฆฌ์™€ ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™” ๋ฉ”์ปค๋‹ˆ์ฆ˜. + +- [[์„œ๋ฒ„ ์ƒํƒœ (Server State)]] + - ์—ฐ๊ฒฐ ์ด์œ : API๋กœ๋ถ€ํ„ฐ ํŒจ์น˜(fetch)๋˜๋Š” ๋ฐ์ดํ„ฐ๋Š” ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ์™€ ์„ฑ๊ฒฉ์ด ์™„์ „ํžˆ ๋‹ฌ๋ผ ๋ณ„๋„์˜ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ๋น„๋™๊ธฐ ๊ด€๋ฆฌ์˜ ํ•ต์‹ฌ ์ „์ œ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [1]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์บ์‹ฑ ๋กœ๋”ฉ, ์—๋Ÿฌ ์‚ฌ์ดํด, ์„œ๋ฒ„ ๋ฐ์ดํ„ฐ ์ตœ์‹ ํ™” ๊ธฐ๋ฒ•. + +- [[๋””๋ฐ”์šด์‹ฑ(Debouncing) ๋ฐ ์“ฐ๋กœํ‹€๋ง(Throttling)]] + - ์—ฐ๊ฒฐ ์ด์œ : ์žฆ์€ ์‚ฌ์šฉ์ž ์ด๋ฒคํŠธ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ๋ฌด๋ถ„๋ณ„ํ•œ ๋น„๋™๊ธฐ API ํ˜ธ์ถœ์„ ์ œ์–ดํ•˜์—ฌ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ์ „๋žต์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [6, 7]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํ”„๋ก ํŠธ์—”๋“œ์—์„œ์˜ ๋„คํŠธ์›Œํฌ ์ตœ์ ํ™” ๋ฐ ๋Ÿฐํƒ€์ž„ ๋ณ‘๋ชฉ ํ˜„์ƒ ๋ฐฉ์ง€. + +- [[ํด๋ฆฐ์—… (Cleanup) ํ•จ์ˆ˜์™€ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋น„๋™๊ธฐ ์ž‘์—… ์™„๋ฃŒ ์ „ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ธ๋งˆ์šดํŠธ๋˜์—ˆ์„ ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์ž์› ๋‚ญ๋น„์™€ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋ง‰๋Š” ํ•„์ˆ˜ ๊ทœ์น™์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [8, 9]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: React ์ƒ๋ช…์ฃผ๊ธฐ(Lifecycle)์™€ ๊ฒฐํ•ฉ๋œ ์•ˆ์ „ํ•œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•. + +### Deeper Research Questions +- Zustand์™€ ๊ฐ™์€ ๊ฐ€๋ฒผ์šด ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋Œ€๊ทœ๋ชจ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜์  ํ•œ๊ณ„์™€ ํŒŒํŽธํ™” ๋ฌธ์ œ๋Š” ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ๋‚˜ํƒ€๋‚˜๋Š”๊ฐ€? [3, 5] +- RTK Query๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์บ์‹œ ๋ฌดํšจํ™”(cache invalidation) ๋ฐ ์ž๋™ ๋ฐ์ดํ„ฐ ์žฌ์š”์ฒญ ๊ธฐ๋Šฅ์˜ ๋‚ด๋ถ€ ์ž‘๋™ ๋ฐฉ์‹์€ ๋ฌด์—‡์ธ๊ฐ€? [4] +- TanStack Query๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฌดํ•œ ์Šคํฌ๋กค ๋ฐ ๋‚™๊ด€์  ์—…๋ฐ์ดํŠธ๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ, ์บ์‹œ ๋ ˆ์ด์–ด๋Š” ์–ด๋–ป๊ฒŒ ๋ฌด๊ฒฐ์„ฑ์„ ๋ณด์žฅํ•˜๋Š”๊ฐ€? [2] +- Feature-Sliced Design ๊ฐ™์€ ๋ชจ๋“ˆํ™”๋œ ํด๋” ๊ตฌ์กฐ์—์„œ API ์„ ์–ธ๊ณผ ๋น„๋™๊ธฐ ์ปค์Šคํ…€ ํ›…์€ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์บก์Аํ™”๋˜๊ณ  ํ˜ธ์ถœ๋˜๋Š”๊ฐ€? [2] +- `useEffect` ๋‚ด์˜ ๋น„๋™๊ธฐ ํ˜ธ์ถœ ์‹œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ์žก๊ธฐ ์œ„ํ•œ DevTools Heap Snapshot ๋ถ„์„ ๋ฐฉ๋ฒ•์€ ์–ด๋–ป๊ฒŒ ์ ์šฉ๋˜๋Š”๊ฐ€? [9] + +### Practical Application Contexts +- **Implementation:** UI ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ ๋น„๋™๊ธฐ ๋กœ์ง์„ ์ง์ ‘ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๊ณ , API ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋„คํŠธ์›Œํฌ ๋กœ์ง์„ ์ปค์Šคํ…€ ํ›…์œผ๋กœ ์ถ”์ถœํ•˜์—ฌ `features/` ํด๋” ํ•˜์œ„์— ๊ฒฉ๋ฆฌํ•˜์—ฌ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค [2, 10]. ๋˜ํ•œ `useEffect`๋ฅผ ํ†ตํ•œ ๊ตฌ๋… ์‹œ ํด๋ฆฐ์—… ํ•จ์ˆ˜๋ฅผ ๋ฐ˜๋“œ์‹œ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค [8]. +- **System Design:** ํ”„๋กœ์ ํŠธ ์„ค๊ณ„ ์‹œ ํด๋ผ์ด์–ธํŠธ ์ „์—ญ ์ƒํƒœ(์˜ˆ: UI ํ…Œ๋งˆ, ์–ธ์–ด)์™€ ์„œ๋ฒ„์—์„œ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋น„๋™๊ธฐ ์ƒํƒœ(์˜ˆ: ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ, ์•Œ๋ฆผ)๋ฅผ ์™„์ „ํžˆ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ฐ๊ธฐ ๋‹ค๋ฅธ ๋„๊ตฌ(Zustand + TanStack Query)๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค [1, 11]. +- **Operation / Maintenance:** Redux DevTools์™€ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ ์•ก์…˜์ด ์–ธ์ œ ํ˜ธ์ถœ๋˜์—ˆ๊ณ  ์„œ๋ฒ„ ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋–ป๊ฒŒ ์—…๋ฐ์ดํŠธ๋˜์—ˆ๋Š”์ง€ ํƒ€์ž„ํŠธ๋ž˜๋ธ” ๋””๋ฒ„๊น…(Time-travel debugging)์„ ์ง„ํ–‰ํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ์‹ ์†ํžˆ ํŒŒ์•…ํ•ฉ๋‹ˆ๋‹ค [12, 13]. +- **Learning Path:** ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„์˜ `useState`/`useEffect`๋ฅผ ํ†ตํ•œ ๋ฐ์ดํ„ฐ ํŒจ์นญ์˜ ํ•œ๊ณ„ ํ•™์Šต โ†’ ๋””๋ฐ”์šด์‹ฑ/๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฐฉ์ง€ ์›๋ฆฌ ์ดํ•ด โ†’ ์„œ๋ฒ„ ์ƒํƒœ์™€ ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ์˜ ์ฐจ์ด ์ธ์ง€ โ†’ TanStack Query/RTK Query๋ฅผ ํ†ตํ•œ ์ „๋ฌธ์ ์ธ ๋น„๋™๊ธฐ ์ƒํƒœ ๊ด€๋ฆฌ ๋งˆ์Šคํ„ฐ๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค [1, 3, 7, 8]. +- **My Project Relevance:** ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ, ๋ฐฉ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ์˜ ๋ฌดํ•œ ์Šคํฌ๋กค, ์‚ฌ์šฉ์ž ๊ฒ€์ƒ‰ ์‹œ์˜ ์ž๋™์™„์„ฑ(๋””๋ฐ”์šด์Šค ์ ์šฉ) ๊ธฐ๋Šฅ ๋“ฑ ๋ณต์žกํ•œ API ๊ธฐ๋ฐ˜ ๊ธฐ๋Šฅ์ด ์žˆ๋Š” ํ”„๋กœ์ ํŠธ์˜ ์„ฑ๋Šฅ ๋ฐ ์•„ํ‚คํ…์ฒ˜ ๊ฐœ์„ ์— ์ง์ ‘ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค [2, 6, 7]. + +### Adjacent Topics +- [[์ƒํƒœ ๊ด€๋ฆฌ ์•„ํ‚คํ…์ฒ˜ (State Management Architecture)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ(์„œ๋ฒ„ ์ƒํƒœ)์™€ ๋กœ์ปฌ ์ƒํƒœ, ์ „์—ญ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒํƒœ๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์—์„œ ์–ด๋–ป๊ฒŒ ์ƒํ˜ธ์ž‘์šฉํ•˜๊ณ  ์กฐํ™”๋กญ๊ฒŒ ๊ตฌ์„ฑ๋˜๋Š”์ง€ ํ™•์žฅํ•ด์„œ ์•Œ์•„๋ด…๋‹ˆ๋‹ค [1, 14]. +- [[์„ฑ๋Šฅ ํ”„๋กœํŒŒ์ผ๋ง ๋ฐ ๋ Œ๋”๋ง ์ตœ์ ํ™” (Performance Profiling & Rendering Optimization)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ์ž˜๋ชป๋œ ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง ํญํ’(re-render storm)์ด๋‚˜ ๋ณ‘๋ชฉ์„ ์ผ์œผํ‚ค๋Š”์ง€ ํŒŒ์•…ํ•˜๊ณ , React Profiler๋ฅผ ํ†ตํ•ด ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ํƒ์ง€ํ•˜๋Š”์ง€ ์•Œ์•„๋ด…๋‹ˆ๋‹ค [15-17]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Topics_GD/Engineering Scalable Frontend Systems.md b/10_Wiki/Topics_GD/Engineering Scalable Frontend Systems.md new file mode 100644 index 00000000..387ef5fb --- /dev/null +++ b/10_Wiki/Topics_GD/Engineering Scalable Frontend Systems.md @@ -0,0 +1,84 @@ +# [[Engineering Scalable Frontend Systems]] + +## ๐Ÿ“Œ Brief Summary +ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ํ”„๋ก ํŠธ์—”๋“œ ์‹œ์Šคํ…œ(Engineering Scalable Frontend Systems)์€ ๋‹จ์ˆœํ•œ ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰์„ ๋„˜์–ด ์œ ์ง€๋ณด์ˆ˜์„ฑ, ๊ณ ์„ฑ๋Šฅ, ๊ฒฌ๊ณ ์„ฑ์„ ๊ฐ–์ถ˜ ๋ถ„์‚ฐ ์†Œํ”„ํŠธ์›จ์–ด ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค [1]. ์ด๋Š” ๊ธฐ์ˆ ์  ํŒŒ์ผ ๊ธฐ๋ฐ˜ ํด๋” ๊ตฌ์กฐ์—์„œ ๊ธฐ๋Šฅ ์ค‘์‹ฌ(Feature-Based) ๋ฐ ๋„๋ฉ”์ธ ๊ธฐ๋ฐ˜ ์„ค๊ณ„๋กœ์˜ ์ „ํ™˜์„ ์š”๊ตฌํ•˜๋ฉฐ, ์—„๊ฒฉํ•œ ์ฝ”๋“œ ์ปจ๋ฒค์…˜๊ณผ ๊ฑฐ๋ฒ„๋„Œ์Šค๋ฅผ ๋™๋ฐ˜ํ•ฉ๋‹ˆ๋‹ค [2, 3]. ๋˜ํ•œ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์— SOLID์™€ ๊ฐ™์€ ์†Œํ”„ํŠธ์›จ์–ด ๊ณตํ•™ ์›์น™์„ ๊ฒฐํ•ฉํ•˜๊ณ , ์„œ๋ฒ„/ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ์˜ ๋ถ„๋ฆฌ, ๊ทธ๋ฆฌ๊ณ  ๋นŒ๋“œ ํƒ€์ž„ ๋ฐ ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ํ†ตํ•ด ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ์„ฑ์žฅ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค [1, 4, 5]. + +## ๐Ÿ“– Core Content + +* **์•„ํ‚คํ…์ฒ˜ ๋ฐ ํด๋” ๊ตฌ์กฐ์˜ ์ง„ํ™”** + ๊ธฐ์กด์˜ ์ปดํฌ๋„ŒํŠธ, ํ›…, ์Šคํƒ€์ผ ๋“ฑ์„ ํŒŒ์ผ ํƒ€์ž…๋ณ„๋กœ ๋ชจ์•„๋‘๋Š” ๊ตฌ์กฐ๋Š” ์•ฑ์ด ์ปค์งˆ์ˆ˜๋ก ์ธ์ง€ ๋ถ€ํ•˜๋ฅผ ๋†’์ด๊ณ  ํ™•์žฅ์„ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค [2, 6]. 2025๋…„์˜ ํ”„๋ก ํŠธ์—”๋“œ ์‹œ์Šคํ…œ์€ ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ๊ณผ ๊ธฐ๋Šฅ(Feature)์„ ์ค‘์‹ฌ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์‘์ง‘์‹œํ‚ค๋Š” ๊ตฌ์กฐ๋ฅผ ํ‘œ์ค€์œผ๋กœ ์‚ผ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค [3, 7]. ํŠนํžˆ **Feature-Sliced Design (FSD)** ๊ฐ™์€ ์•„ํ‚คํ…์ฒ˜๋Š” ์ฝ”๋“œ๋ฅผ ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ๋ณ„ ๋ ˆ์ด์–ด(shared, entities, features, widgets, pages, app)๋กœ ๋‚˜๋ˆ„๊ณ , ์ƒ์œ„ ๊ณ„์ธต์—์„œ ํ•˜์œ„ ๊ณ„์ธต์œผ๋กœ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์—„๊ฒฉํ•œ ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ๊ทœ์น™์„ ๊ฐ•์ œํ•ฉ๋‹ˆ๋‹ค [8-10]. ๊ฐ ์Šฌ๋ผ์ด์Šค๋Š” `index.ts`๋ฅผ ํ†ตํ•ด ํผ๋ธ”๋ฆญ API(Public API)๋งŒ ์™ธ๋ถ€์— ๋…ธ์ถœํ•˜์—ฌ ๋‚ด๋ถ€ ๊ตฌํ˜„์„ ์บก์Аํ™”ํ•ฉ๋‹ˆ๋‹ค [4, 11, 12]. +* **์†Œํ”„ํŠธ์›จ์–ด ๊ณตํ•™ ์›์น™์˜ ์ ์šฉ (SOLID & Clean Code)** + ํ”„๋ก ํŠธ์—”๋“œ ์ฝ”๋“œ์˜ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ์œ„ํ•ด SOLID, DRY, KISS, YAGNI ์›์น™์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค [4, 13]. + * ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)์— ๋”ฐ๋ผ ๋„ˆ๋ฌด ๋งŽ์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋Œ€ํ˜• ์ปดํฌ๋„ŒํŠธ(์˜ˆ: 300์ค„ ์ด์ƒ)๋Š” ๋ฐ์ดํ„ฐ ํŒจ์นญ, ์ƒํƒœ ๊ด€๋ฆฌ, UI ๋ Œ๋”๋ง ๋“ฑ์˜ ์ฑ…์ž„์— ๋งž๊ฒŒ ๋” ์ž‘๊ณ  ๋…๋ฆฝ์ ์ธ ๋‹จ์œ„๋กœ ๋ถ„๋ฆฌ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [14]. + * ๊ฐœ๋ฐฉ-ํ์‡„ ์›์น™(OCP)์€ ๊ธฐ์กด ์ปดํฌ๋„ŒํŠธ ์†Œ์Šค๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  `children` prop์ด๋‚˜ Render Props ํŒจํ„ด์„ ์ด์šฉํ•œ ์ปดํฌ๋„ŒํŠธ ํ•ฉ์„ฑ(Composition)์œผ๋กœ ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค [15, 16]. + * ์ค‘๋ณต์„ ์ค„์ด๋Š” DRY ์›์น™์€ ๊ณตํ†ต ๋กœ์ง์„ ์ปค์Šคํ…€ ํ›…์œผ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•˜์ง€๋งŒ, ์ง€๋‚˜์นœ ์ถ”์ƒํ™”๋Š” ์ฝ”๋“œ ํŒŒ์•…์„ ์–ด๋ ต๊ฒŒ ํ•˜๋ฏ€๋กœ ๋‹จ์ˆœ์„ฑ์„ ์œ ์ง€ํ•˜๋Š” KISS ์›์น™๊ณผ ๊ท ํ˜•์„ ์ด๋ฃจ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [17]. +* **์ƒํƒœ ๊ด€๋ฆฌ ํŒจ๋Ÿฌ๋‹ค์ž„์˜ ์„ธ๋ถ„ํ™”** + ๊ฑฐ๋Œ€ํ•œ ๋‹จ์ผ ์ƒํƒœ ์ €์žฅ์†Œ(์˜ˆ: ๊ณผ๊ฑฐ์˜ Redux)์— ์˜์กดํ•˜๊ธฐ๋ณด๋‹ค๋Š” ๋ฐ์ดํ„ฐ์˜ ์„ฑ๊ฒฉ์— ๋”ฐ๋ผ ์ตœ์ ์˜ ๋„๊ตฌ๋ฅผ ์„ ํƒํ•˜์—ฌ ์ƒํƒœ๋ฅผ ํŒŒํŽธํ™” ๋ฐ ์ „๋ฌธํ™”ํ•ฉ๋‹ˆ๋‹ค [5]. + * **์ „์—ญ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒํƒœ:** Context API๋Š” ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ ์ „์ฒด๋ฅผ ๋ฆฌ๋ Œ๋”๋งํ•˜๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ [18, 19], ์ƒํƒœ ๋ณ€๊ฒฝ์ด ์žฆ๊ณ  ๊ทœ๋ชจ๊ฐ€ ํฐ ์•ฑ์—์„œ๋Š” ๋ถ€๋ถ„ ๊ตฌ๋…(Selector)์„ ์ง€์›ํ•˜์—ฌ ๋ Œ๋”๋ง ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๋Š” **Zustand**๋‚˜ **Jotai**๊ฐ€ ์„ ํ˜ธ๋ฉ๋‹ˆ๋‹ค [5, 20, 21]. + * **์„œ๋ฒ„ ์ƒํƒœ (API Layer):** API์—์„œ ๊ฐ€์ ธ์˜จ ๋ฐ์ดํ„ฐ๋Š” ์บ์‹ฑ, ๋™๊ธฐํ™”, ๋กœ๋”ฉ/์—๋Ÿฌ ์‚ฌ์ดํด ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋ฏ€๋กœ, ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ์™€ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌํ•˜์—ฌ **TanStack Query (React Query)** ๋“ฑ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค [18, 22]. +* **์„ฑ๋Šฅ ์—”์ง€๋‹ˆ์–ด๋ง ๋ฐ ๋นŒ๋“œ ์ตœ์ ํ™”** + ์ดˆ๊ธฐ ๋กœ๋”ฉ ์‹œ๊ฐ„๊ณผ Core Web Vitals ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด ๋‹ค์–‘ํ•œ ๊ธฐ๋ฒ•์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค [23, 24]. + * **๋นŒ๋“œ/์ปดํŒŒ์ผ ํƒ€์ž„:** Vite์™€ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ES ๋ชจ๋“ˆ์„ ์ œ๊ณตํ•˜๊ณ , ํ”„๋กœ๋•์…˜์—์„œ๋Š” Rollup์˜ `manualChunks`๋ฅผ ํ™œ์šฉํ•ด ์šฉ๋Ÿ‰์ด ํฐ ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(React, Recharts ๋“ฑ)๋ฅผ ๋ถ„ํ•  ์บ์‹ฑํ•˜์—ฌ ์บ์‹œ ํšจ์œจ์„ ๋†’์ž…๋‹ˆ๋‹ค [23, 25-27]. ๋˜ํ•œ **React Compiler**์˜ ๋„์ž…์œผ๋กœ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ž๋™์œผ๋กœ ์ฝ”๋“œ์˜ ๋ฆฌ๋ Œ๋”๋ง ๋ฐฉ์ง€(๋ฉ”๋ชจ์ด์ œ์ด์…˜)๋ฅผ ์ฒ˜๋ฆฌํ•˜์—ฌ ์ˆ˜๋™ ์ตœ์ ํ™”(`useMemo`, `useCallback`)์˜ ์˜ค๋ฅ˜๋ฅผ ์ค„์—ฌ์ค๋‹ˆ๋‹ค [25, 28, 29]. + * **๋Ÿฐํƒ€์ž„ ์ตœ์ ํ™”:** ๋™์  ์ž„ํฌํŠธ๋ฅผ ์ด์šฉํ•œ ๋ผ์šฐํŠธ ๋ฐ ์ปดํฌ๋„ŒํŠธ ๋ ˆ๋ฒจ์˜ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…(Code Splitting & Lazy Loading), ๊ทธ๋ฆฌ๊ณ  ์ˆ˜์ฒœ ๊ฐœ์˜ ๋ฆฌ์ŠคํŠธ ์•„์ดํ…œ ๋ Œ๋”๋ง ์‹œ DOM ๋น„๋Œ€๋ฅผ ๋ง‰๋Š” ๊ฐ€์ƒํ™”(Virtualization) ๊ธฐ์ˆ ์ด ํ•„์ˆ˜์ ์œผ๋กœ ์š”๊ตฌ๋ฉ๋‹ˆ๋‹ค [30-32]. +* **๋ณต์›๋ ฅ(Resilience) ๋ฐ ์‹œ์Šคํ…œ ๊ฑฐ๋ฒ„๋„Œ์Šค** + ๊ฒฌ๊ณ ํ•œ ์‹œ์Šคํ…œ์€ ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜๊ฐ€ ์ „์ฒด ์•ฑ์˜ ํฌ๋ž˜์‹œ๋กœ ์ด์–ด์ง€๋Š” ๊ฒƒ์„ ๋ง‰์Šต๋‹ˆ๋‹ค. UI์˜ ๋ถˆ์•ˆ์ •ํ•œ ์˜์—ญ์ด๋‚˜ ์„œ๋“œํŒŒํ‹ฐ ์œ„์ ฏ์€ **Error Boundaries**๋กœ ๊ฐ์‹ธ ํด๋ฐฑ UI๋ฅผ ์ œ๊ณตํ•˜์—ฌ ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค [33-35]. ๋˜ํ•œ, ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•œ DevTools ํž™ ์Šค๋ƒ…์ƒท ๋””๋ฒ„๊น…๊ณผ Sentry, LogRocket ๊ฐ™์€ ํด๋ผ์šฐ๋“œ ๋„๊ตฌ๋ฅผ ์ด์šฉํ•œ ํ”„๋กœ๋•์…˜ ์—๋Ÿฌ ๋ชจ๋‹ˆํ„ฐ๋ง์ด ํ™œ์šฉ๋ฉ๋‹ˆ๋‹ค [36-38]. ํ˜‘์—… ์ฐจ์›์—์„œ๋Š” ์ผ๊ด€๋œ ๋„ค์ด๋ฐ ๊ทœ์น™(์˜ˆ: ํŒŒ์ผ๋ช…์€ kebab-case, ์ปดํฌ๋„ŒํŠธ๋Š” PascalCase)๊ณผ ESLint, Prettier, Husky๋ฅผ ํ†ตํ•œ ์ž๋™ํ™”๋œ ๊ฑฐ๋ฒ„๋„Œ์Šค, ๊ทธ๋ฆฌ๊ณ  Storybook์„ ํ™œ์šฉํ•œ ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ๊ฐ€ ์ฝ”๋“œ ํ’ˆ์งˆ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค [39-41]. + +## โš–๏ธ Trade-offs & Caveats +* **Feature-Sliced Design (FSD)์˜ ์ดˆ๊ธฐ ๋„์ž… ๋น„์šฉ ๋ฐ ๋ณต์žก์„ฑ:** FSD๋Š” ํ™•์žฅ์„ฑ๊ณผ ๋ชจ๋“ˆํ™”์— ๋›ฐ์–ด๋‚˜์ง€๋งŒ ๋Ÿฌ๋‹ ์ปค๋ธŒ๊ฐ€ ๋†’์œผ๋ฉฐ, ์ž‘์€ ๊ทœ๋ชจ์˜ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์˜ค๋ฒ„์—”์ง€๋‹ˆ์–ด๋ง์œผ๋กœ ๋А๊ปด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [42, 43]. ๋˜ํ•œ '์ธ์ฆ(Auth)' ๊ฐ™์€ ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ(Cross-cutting concerns)๋ฅผ ์ •ํ™•ํžˆ ์–ด๋–ค ๊ธฐ๋Šฅ์ด๋‚˜ ์Šฌ๋ผ์ด์Šค์— ๋ฐฐ์น˜ํ• ์ง€ ๊ฒฝ๊ณ„๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ์–ด๋ ค์›Œ ํŒ€ ๋‚ด ๊ทœ์น™ ํ•ฉ์˜์™€ ์ง€์†์ ์ธ ๋ฌธ์„œํ™”๊ฐ€ ์š”๊ตฌ๋ฉ๋‹ˆ๋‹ค [44, 45]. +* **React Compiler ์ ์šฉ์˜ ์ œ์•ฝ:** React Compiler๊ฐ€ ์ž๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ์„ฑ๋Šฅ์„ ๋†’์—ฌ์ฃผ์ง€๋งŒ, ์ด๋Š” ๋ธ”๋ž™๋ฐ•์Šค๋กœ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜ˆ๊ธฐ์น˜ ์•Š๊ฒŒ ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์›์ธ์„ ๋””๋ฒ„๊น…ํ•˜๊ธฐ ๋” ์–ด๋ ค์›Œ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [46]. ๋˜ํ•œ ๋งค ๋ Œ๋”๋ง๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๊ฐ์ฒด ์ฐธ์กฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์ถฉ๋Œํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ๊ฒฝ์šฐ React์˜ ๋ถˆ๋ณ€์„ฑ ๋ฐ ๋ถ€์ˆ˜ ํšจ๊ณผ ๊ทœ์น™(Rules of React)์„ ์—„๊ฒฉํžˆ ์ค€์ˆ˜ํ•˜๋„๋ก ๋Œ€๋Œ€์ ์ธ ๋ฆฌํŒฉํ† ๋ง์ด ์„ ํ–‰๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [28, 47, 48]. +* **Context API vs. ์™ธ๋ถ€ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„:** Context API๋Š” ๋‚ด์žฅ ๊ธฐ๋Šฅ์ด๋ฏ€๋กœ ์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๋Š” ์žฅ์ ์ด ์žˆ์ง€๋งŒ, ๋ณ€๊ฒฝ์ด ์žฆ์€ ์ƒํƒœ์— ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ๋ถˆํ•„์š”ํ•œ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์˜ ์—ฐ์‡„ ๋ฆฌ๋ Œ๋”๋ง์„ ์œ ๋ฐœํ•˜๋Š” ์น˜๋ช…์ ์ธ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ์„ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค [19, 20]. ๋ฐ˜๋Œ€๋กœ Zustand๋‚˜ TanStack Query๋ฅผ ๋„์ž…ํ•˜๋ฉด ๋ฆฌ๋ Œ๋”๋ง ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์œผ๋‚˜, ์‹œ์Šคํ…œ์— ์ƒˆ๋กœ์šด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์˜์กด์„ฑ๊ณผ ํ•™์Šต ๊ณก์„ ์ด ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค [21, 49]. +* **DRY์™€ KISS ์›์น™์˜ ์ƒ์ถฉ:** ์ค‘๋ณต์„ ์ค„์ด๊ธฐ(DRY) ์œ„ํ•ด ๊ณตํ†ต ๋กœ์ง์„ ๊ณ ์ฐจ ์ปดํฌ๋„ŒํŠธ(HOC)๋‚˜ ์ปค์Šคํ…€ ํ›…์œผ๋กœ ์ง€๋‚˜์น˜๊ฒŒ ์ถ”์ƒํ™”ํ•˜๋ฉด, ์ฝ”๋“œ๊ฐ€ ์›๋ž˜์˜ ๋‹จ์ˆœํ•œ ํ˜•ํƒœ๋ณด๋‹ค ์ดํ•ดํ•˜๊ณ  ๋””๋ฒ„๊น…ํ•˜๊ธฐ ํ›จ์”ฌ ์–ด๋ ค์›Œ์ ธ ๊ฒฐ๊ตญ KISS ์›์น™์„ ์œ„๋ฐฐํ•˜๊ฒŒ ๋˜๋Š” ๋ถ€์ž‘์šฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [17]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [๊ด€๊ณ„ ์œ ํ˜• A: ์•„ํ‚คํ…์ฒ˜ ๋ฐ ์‹œ์Šคํ…œ ๊ตฌ์กฐ (Architecture & Structural Design)] +* `[[Feature-Sliced Design (FSD)]]` + * ์—ฐ๊ฒฐ ์ด์œ : ํ˜„๋Œ€ ํ”„๋ก ํŠธ์—”๋“œ์˜ ๋ชจ๋“ˆํ™” ๋ฐ ํ™•์žฅ์„ฑ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋„๋ฆฌ ์ฑ„ํƒ๋˜๋Š” ์•„ํ‚คํ…์ฒ˜ ๋ฐฉ๋ฒ•๋ก ์˜ ํ•ต์‹ฌ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [9, 10]. + * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ ๊ธฐ๋ฐ˜์˜ ์ฝ”๋“œ ๋ถ„ํ• , ์—„๊ฒฉํ•œ ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ๊ทœ์น™ ์ ์šฉ ๋ฐฉ๋ฒ•, ๊ทธ๋ฆฌ๊ณ  ํผ๋ธ”๋ฆญ API๋ฅผ ํ†ตํ•œ ๋ชจ๋“ˆ ์บก์Аํ™” ์›๋ฆฌ [4, 8, 50]. +* `[[Error Boundaries]]` + * ์—ฐ๊ฒฐ ์ด์œ : ๋ถ€๋ถ„์ ์ธ UI ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๊ฐ€ ์‹œ์Šคํ…œ ์ „์ฒด์˜ ์žฅ์• (White screen of death)๋กœ ํ™•์‚ฐ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๊ตฌ์กฐ์  ์•ˆ์ „ ์žฅ์น˜์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [33, 34]. + * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ Œ๋”๋ง ํŠธ๋ฆฌ์—์„œ ์ปดํฌ๋„ŒํŠธ ๊ฒฐํ•จ์„ ๊ฒฉ๋ฆฌํ•˜๋Š” ์›๋ฆฌ์™€ ์‹œ์Šคํ…œ ๋ณต์›๋ ฅ์„ ๋†’์ด๋Š” ์—๋Ÿฌ ์ฒ˜๋ฆฌ ์ „๋žต [33, 35]. + +#### [๊ด€๊ณ„ ์œ ํ˜• B: ์ƒํƒœ ๊ด€๋ฆฌ ํŒจ๋Ÿฌ๋‹ค์ž„ (State Management Paradigms)] +* `[[Zustand vs Context API]]` + * ์—ฐ๊ฒฐ ์ด์œ : ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ์—์„œ ์„ฑ๋Šฅ๊ณผ ํ™•์žฅ์„ฑ์„ ๊ฒฐ์ •์ง“๋Š” ๊ฐ€์žฅ ๋นˆ๋ฒˆํ•œ ์•„ํ‚คํ…์ฒ˜ ๊ฒฐ์ • ์ง€์ ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [5, 19]. + * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Context API์˜ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ๋ Œ๋”๋ง ๋ฌธ์ œ์ ๊ณผ ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ Zustand์˜ ๊ตฌ๋…/์„ ํƒ์ž(Selector) ๊ธฐ๋ฐ˜ ๋ Œ๋”๋ง ์ตœ์ ํ™” ๊ธฐ๋ฒ• [19, 20, 51]. +* `[[TanStack Query (React Query)]]` + * ์—ฐ๊ฒฐ ์ด์œ : ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ์™€ ์„œ๋ฒ„ ์ƒํƒœ(Server State)๋ฅผ ๊ตฌ์กฐ์ ์œผ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ API ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ์˜ ๋ณ‘๋ชฉ์„ ์—†์• ์ฃผ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [18, 22]. + * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ฐ์ดํ„ฐ ์บ์‹ฑ, ๋ฐฑ๊ทธ๋ผ์šด๋“œ ๋™๊ธฐํ™” ๋ฐ API ๊ณ„์ธต์˜ ๊ด€์‹ฌ์‚ฌ ๋ถ„๋ฆฌ(Separation of Concerns) [18, 22]. + +#### [๊ด€๊ณ„ ์œ ํ˜• C: ์„ฑ๋Šฅ ๋ฐ ๋นŒ๋“œ ์ตœ์ ํ™” (Performance & Build Optimization)] +* `[[React Compiler]]` + * ์—ฐ๊ฒฐ ์ด์œ : ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์˜ ๋ณต์žก์„ฑ์„ ์ค„์ด๊ณ  ๋นŒ๋“œ ํƒ€์ž„์— ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง ์„ฑ๋Šฅ์„ ์ž๋™์œผ๋กœ ์ตœ์ ํ™”ํ•˜๋Š” ์ตœ์‹  ํ•ต์‹ฌ ๋„๊ตฌ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [25, 28, 29]. + * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์„ ์–ธ์  UI ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ์˜ ๋นŒ๋“œ ํƒ€์ž„ ์ตœ์ ํ™” ํ•œ๊ณ„ ๋ฐ React์˜ ๊ทœ์น™(Rules of React)์ด ๊ฐ•์ œํ•˜๋Š” ๋ถˆ๋ณ€์„ฑ์˜ ์ค‘์š”์„ฑ [52, 53]. +* `[[Code Splitting & Lazy Loading]]` + * ์—ฐ๊ฒฐ ์ด์œ : ์ดˆ๊ธฐ ๋กœ๋“œ(First Paint) ์†๋„ ํ–ฅ์ƒ๊ณผ JavaScript ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ œ์–ดํ•˜๋Š” ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์‹œ์Šคํ…œ์˜ ํ•„์ˆ˜ ์„ฑ๋Šฅ ์ „๋žต์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [30, 31, 54]. + * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Vite๋‚˜ Webpack ๊ฐ™์€ ๋ฒˆ๋“ค๋Ÿฌ ํ™˜๊ฒฝ์—์„œ ๋™์  ์ž„ํฌํŠธ๋ฅผ ํ†ตํ•œ ๋ผ์šฐํŠธ ๋‹จ์œ„ ๋ถ„ํ•  ๋ฐ ๋ฌด๊ฑฐ์šด ๋ฒค๋” ์ฒญํฌ(`manualChunks`)์˜ ์บ์‹ฑ ๋ถ„๋ฆฌ ์ „๋žต [26, 27, 31]. + +### Deeper Research Questions + +* ๊ฑฐ๋Œ€ํ•œ ๋ชจ๋†€๋ฆฌ์‹ ๊ตฌ์กฐ ํ˜น์€ ๋‹จ์ผ ํŒŒ์ผ ํƒ€์ž…(components/, hooks/) ๊ธฐ๋ฐ˜์˜ ๋ ˆ๊ฑฐ์‹œ React ์•ฑ์„ Feature-Sliced Design(FSD) ์•„ํ‚คํ…์ฒ˜๋กœ ์ ์ง„์ ์œผ๋กœ ๋ฆฌํŒฉํ† ๋งํ•  ๋•Œ ๊ณ ๋ คํ•ด์•ผ ํ•  ์ตœ์ ์˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? +* React Compiler๊ฐ€ ๋„์ž…๋˜์–ด ์ปดํฌ๋„ŒํŠธ์˜ ๋ฆฌ๋ Œ๋”๋ง์„ ์ž๋™์œผ๋กœ ์ œ์–ดํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด, ๊ฐœ๋ฐœ์ž๋Š” ๋” ์ด์ƒ `useMemo`๋‚˜ `useCallback`์„ ์ž‘์„ฑํ•  ํ•„์š”๊ฐ€ ์™„์ „ํžˆ ์—†์–ด์ง€๋Š”๊ฐ€? ํ˜น์€ ์—ฌ์ „ํžˆ ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์ด ํ•„์ˆ˜์ ์ธ ์—ฃ์ง€ ์ผ€์ด์Šค๋Š” ๋ฌด์—‡์ธ๊ฐ€? +* Zustand์™€ ๊ฐ™์€ ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ ๊ด€๋ฆฌ์™€ TanStack Query์™€ ๊ฐ™์€ ์„œ๋ฒ„ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋™์‹œ ์‚ฌ์šฉํ•  ๋•Œ, ๋‘ ์ƒํƒœ ์‚ฌ์ด์˜ ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™”์™€ ์˜์กด์„ฑ ์ฃผ์ž…์€ ์–ด๋–ป๊ฒŒ ์„ค๊ณ„ํ•ด์•ผ ์‘์ง‘๋„๋ฅผ ๋†’์ผ ์ˆ˜ ์žˆ๋Š”๊ฐ€? +* ํ”„๋ก ํŠธ์—”๋“œ ์„ฑ๋Šฅ ์ตœ์ ํ™” ์ค‘ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜(Memory Leak)๋ฅผ ์˜ˆ๋ฐฉํ•˜๊ธฐ ์œ„ํ•ด Chrome DevTools ํž™ ์Šค๋ƒ…์ƒท์—์„œ ์‹๋ณ„๋˜๋Š” '๋ถ„๋ฆฌ๋œ DOM ๋…ธ๋“œ(Detached DOM Nodes)'์™€ ํด๋กœ์ €(Closure) ์ž”๋ฅ˜ ๋ฌธ์ œ๋ฅผ ํ”„๋กœ๋•์…˜์—์„œ ์–ด๋–ป๊ฒŒ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? +* Vite๋ฅผ ํ™œ์šฉํ•œ ๋นŒ๋“œ ์‹œ ๋Œ€๊ทœ๋ชจ ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์ธํ•œ ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ ๊ฒฝ๊ณ ("Large Chunks")๋ฅผ ๊ทผ๋ณธ์ ์œผ๋กœ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด `manualChunks` ์„ค์ •์„ ์–ด๋–ป๊ฒŒ ๋ถ„ํ• ํ•ด์•ผ ๋ธŒ๋ผ์šฐ์ €์˜ ๋ณ‘๋ ฌ ๋‹ค์šด๋กœ๋“œ ๋ฐ ์บ์‹ฑ ํšจ์œจ์„ ๊ทน๋Œ€ํ™”ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? + +### Practical Application Contexts + +* **Implementation:** ์‹ ๊ทœ ๋„๋ฉ”์ธ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ๋•Œ ๋กœ์ง, UI, ์ปค์Šคํ…€ ํ›…์„ ํ•˜๋‚˜์˜ ํ”ผ์ฒ˜(Feature) ํด๋”์— ์‘์ง‘์‹œํ‚ค๊ณ  ๋‹ค๋ฅธ ํ”ผ์ฒ˜์—์„œ์˜ ์ง์ ‘ ์ž„ํฌํŠธ๋ฅผ ์ œํ•œํ•˜์—ฌ ์ฒ ์ €ํžˆ ์บก์Аํ™”๋œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค [3, 4]. ๋นˆ๋ฒˆํžˆ ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ๋‚˜ ๋ Œ๋”๋ง ๋กœ์ง ์•ˆ์—์„œ๋Š” ์ธ๋ผ์ธ ์ต๋ช… ํ•จ์ˆ˜ ์‚ฌ์šฉ์„ ์ง€์–‘ํ•˜๊ณ  ๋ถˆํ•„์š”ํ•œ ์žฌํ• ๋‹น์„ ๋ง‰์Šต๋‹ˆ๋‹ค [55, 56]. +* **System Design:** ์‹œ์Šคํ…œ ์ดˆ๊ธฐ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ ์ƒํƒœ์˜ ์œ ํ˜•์„ ๋ช…ํ™•ํžˆ ๋ถ„๋ฅ˜ํ•˜์—ฌ, ์ž์ฃผ ๋ฐ”๋€Œ์ง€ ์•Š๋Š” ํ…Œ๋งˆ/์„ค์ •์€ Context API์—, ์ƒํ˜ธ์ž‘์šฉ์ด ์žฆ์€ ์žฅ๋ฐ”๊ตฌ๋‹ˆ/UI ์ƒํƒœ๋Š” Zustand์—, ์„œ๋ฒ„ ๋ฐ์ดํ„ฐ๋Š” TanStack Query์— ์œ„์ž„ํ•˜๋Š” ๋‹ค์ธต์  ์ƒํƒœ ํŠธ๋ฆฌ๋ฅผ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค [5, 18, 57]. +* **Operation / Maintenance:** ํ”„๋กœ๋•์…˜ ๋ฐฐํฌ ํ›„ Sentry, LogRocket, Datadog๊ณผ ๊ฐ™์€ ๊ฐ€์‹œ์„ฑ(Observability) ๋ฐ ํด๋ผ์šฐ๋“œ ๋กœ๊น… ๋„๊ตฌ๋ฅผ ์—ฐ๋™ํ•ด ์‚ฌ์šฉ์ž ์„ธ์…˜์„ ๋ฆฌํ”Œ๋ ˆ์ดํ•˜๊ณ  ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜ ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ์ด์Šˆ๋ฅผ ์‚ฌ์ „์— ํƒ์ง€ํ•ฉ๋‹ˆ๋‹ค [36, 37]. +* **Learning Path:** React ๊ธฐ์ดˆ(useState, Props)์™€ ์ปดํฌ๋„ŒํŠธ ๋ถ„๋ฆฌ(SOLID, Clean Code) ๊ฐœ๋…์„ ์ˆ™์ง€ํ•œ ํ›„, ์ ์ง„์ ์œผ๋กœ Context API์˜ ํ•œ๊ณ„๋ฅผ ์ฒดํ—˜ํ•˜๊ณ  Zustand๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋Š” ๊ณผ์ •์„ ๊ฑฐ์น˜๋ฉฐ ๋ Œ๋”๋ง ์ตœ์ ํ™”์™€ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์˜ ์›๋ฆฌ๋ฅผ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค [4, 14, 58]. +* **My Project Relevance:** ํ˜„์žฌ ์œ ์ง€๋ณด์ˆ˜ ์ค‘์ธ ๊ฑฐ๋Œ€ํ•œ React ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ๋‹ค๋ฉด, ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ ์ƒ๋‹จ์— ๋ฌด๋ถ„๋ณ„ํ•˜๊ฒŒ ๋ฐฐ์น˜๋œ Context Provider๋ฅผ ๊ฑท์–ด๋‚ด๊ณ  Zustand ๊ธฐ๋ฐ˜์˜ ๋ถ€๋ถ„ ๊ตฌ๋… ํŒจํ„ด์œผ๋กœ ๋ฆฌํŒฉํ† ๋งํ•˜๊ฑฐ๋‚˜ [21], Storybook ๋ฐ Chromatic์„ CI ํŒŒ์ดํ”„๋ผ์ธ์— ๋„์ž…ํ•˜์—ฌ PR ๋‹จ๊ณ„์—์„œ ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ(Visual Test)๋ฅผ ์ž๋™ํ™”ํ•˜์—ฌ ํ’ˆ์งˆ์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [41, 59]. + +### Adjacent Topics + +* `[[Core Web Vitals]]` + * ํ™•์žฅ ๋ฐฉํ–ฅ: LCP(Largest Contentful Paint), INP(Interaction to Next Paint), CLS(Cumulative Layout Shift) ๋“ฑ ๊ตฌ๊ธ€์ด ์ •์˜ํ•œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ์ค‘์‹ฌ์˜ ์„ฑ๋Šฅ ์ธก์ • ์ง€ํ‘œ๋ฅผ ์ดํ•ดํ•˜๊ณ , ์•ž์„œ ๋‹ค๋ฃฌ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…, ๋ ˆ์ด์ง€ ๋กœ๋”ฉ, ๋ Œ๋”๋ง ์ตœ์ ํ™” ๊ธฐ๋ฒ•์ด ์‹ค์ œ ์‚ฌ์šฉ์ž ์ฒด๊ฐ ์†๋„ ํ–ฅ์ƒ์— ์–ด๋–ป๊ฒŒ ์ง๊ฒฐ๋˜๋Š”์ง€ ์‹ฌ์ธต ๋ถ„์„ํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์—ฐ๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [23, 60, 61]. +* `[[Git Branching Strategies & CI/CD Governance]]` + * ํ™•์žฅ ๋ฐฉํ–ฅ: ๋ณต์žกํ•œ ํ”„๋ก ํŠธ์—”๋“œ ์‹œ์Šคํ…œ์„ ๋‹ค์ˆ˜์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ˜‘์—…ํ•˜์—ฌ ๊ตฌ์ถ•ํ•  ๋•Œ ์ถฉ๋Œ์„ ์ตœ์†Œํ™”ํ•˜๊ณ  ๋ฆด๋ฆฌ์Šค ์•ˆ์ •์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•œ GitHub Flow, Trunk-Based Development ๋“ฑ์˜ ๋ธŒ๋žœ์นญ ์ „๋žต๊ณผ, ESLint/Prettier ์ž๋™ํ™”, Conventional Commits๋ฅผ ํ™œ์šฉํ•œ ๋ฐฐํฌ ํŒŒ์ดํ”„๋ผ์ธ(CI/CD) ํ†ต์ œ ๋ฐฉ๋ฒ•์„ ํ™•์žฅํ•ด์„œ ์กฐ์‚ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [62-64]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Topics_GD/Folder Structure Best Practices.md b/10_Wiki/Topics_GD/Folder Structure Best Practices.md new file mode 100644 index 00000000..c340d218 --- /dev/null +++ b/10_Wiki/Topics_GD/Folder Structure Best Practices.md @@ -0,0 +1,69 @@ +# [[Folder Structure Best Practices]] + +## ๐Ÿ“Œ Brief Summary +React ๋“ฑ ํ”„๋ก ํŠธ์—”๋“œ ํ”„๋กœ์ ํŠธ์—์„œ ์ฝ”๋“œ์˜ ์œ ์ง€๋ณด์ˆ˜์„ฑ, ํ™•์žฅ์„ฑ, ๊ทธ๋ฆฌ๊ณ  ํ˜‘์—… ํšจ์œจ์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ํŒŒ์ผ๊ณผ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ฒด๊ณ„์ ์œผ๋กœ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก ์ž…๋‹ˆ๋‹ค [1]. ํ˜„๋Œ€์ ์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ๊ณผ๊ฑฐ์˜ ํŒŒ์ผ ์œ ํ˜• ๊ธฐ๋ฐ˜(์œ ํ˜•๋ณ„ ๋ถ„๋ฅ˜) ๊ตฌ์กฐ์—์„œ ๋ฒ—์–ด๋‚˜, ๊ธฐ๋Šฅ(Feature)์ด๋‚˜ ๋„๋ฉ”์ธ ์ค‘์‹ฌ์œผ๋กœ ๊ด€๋ จ๋œ ๋กœ์ง์„ ๋ฌถ๋Š” ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๋˜๋Š” ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ๋ฐฉ์‹์ด ๋ชจ๋ฒ” ์‚ฌ๋ก€๋กœ ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค [2, 3]. ์ด๋ฅผ ํ†ตํ•ด UI, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง, ์ƒํƒœ ๊ด€๋ฆฌ ๋“ฑ์˜ ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌํ•˜๊ณ  ํ”„๋กœ์ ํŠธ๊ฐ€ ์ปค์ง์— ๋”ฐ๋ผ ๋ฐœ์ƒํ•˜๋Š” ๊ธฐ์ˆ  ๋ถ€์ฑ„๋ฅผ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [4]. + +## ๐Ÿ“– Core ์†Œ์Šค Content + +* **๊ตฌ์กฐ์˜ ์ง„ํ™”์™€ ํ•œ๊ณ„:** + * ์ดˆ๊ธฐ ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ๋Š” ์ฃผ๋กœ ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๋ฅผ `components` ํด๋”์—, ๋ชจ๋“  ํ›…์„ `hooks` ํด๋”์— ๋„ฃ๋Š” ํ”Œ๋žซ(Flat) ๊ตฌ์กฐ๋‚˜ ํŒŒ์ผ ์œ ํ˜• ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค [5, 6]. + * ํ•˜์ง€๋งŒ ์•ฑ์˜ ๊ทœ๋ชจ๊ฐ€ ์ปค์ง€๋ฉด ๋‹จ์ผ ๊ธฐ๋Šฅ์„ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ํด๋”๋ฅผ ๋„˜๋‚˜๋“ค์–ด์•ผ ํ•˜๋ฏ€๋กœ, ๊ฐœ๋ฐœ ์†๋„๊ฐ€ ๋А๋ ค์ง€๊ณ  ๋””๋ฒ„๊น…์ด ์–ด๋ ค์›Œ์ง€๋ฉฐ ์ฝ”๋“œ๋ฒ ์ด์Šค๊ฐ€ ๋ณต์žกํ•ด์ง€๋Š” ํ•œ๊ณ„๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [3, 6, 7]. +* **๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜(Feature-based) ๋ฐ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๊ตฌ์กฐ:** + * 2025๋…„ ๊ธฐ์ค€ ๊ฐ€์žฅ ๊ถŒ์žฅ๋˜๋Š” ์ ‘๊ทผ ๋ฐฉ์‹์€ ํŒŒ์ผ ์œ ํ˜•์ด ์•„๋‹Œ ๋น„์ฆˆ๋‹ˆ์Šค ๊ธฐ๋Šฅ์ด๋‚˜ ๋ชจ๋“ˆ์„ ์ค‘์‹ฌ์œผ๋กœ ํด๋”๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค [2, 8, 9]. + * ๊ฐ ๊ธฐ๋Šฅ(Feature)์€ ์บก์Аํ™”๋˜์–ด ๋‹ค๋ฅธ ๊ธฐ๋Šฅ๊ณผ ๋…๋ฆฝ์ ์œผ๋กœ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๊ทœ๋ชจ ํ™•์žฅ ์‹œ ๊ธฐ์กด ์ฝ”๋“œ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ณ  ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ๋งค๋„๋Ÿฝ๊ฒŒ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [8, 10]. +* **๊ถŒ์žฅ ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ตฌ์„ฑ (src/ ํ•˜์œ„):** + * `assets/`: ์ด๋ฏธ์ง€, ํฐํŠธ ๋“ฑ ์ •์  ๋ฏธ๋””์–ด ๋ฆฌ์†Œ์Šค ๋ณด๊ด€ [11, 12]. + * `components/`: ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ์—์„œ ๊ณตํ†ต์œผ๋กœ ์žฌ์‚ฌ์šฉ๋˜๋Š” ๋„๋ฉ”์ธ์— ๊ตฌ์• ๋ฐ›์ง€ ์•Š๋Š” UI ์š”์†Œ (์˜ˆ: ๋ฒ„ํŠผ, ๋ชจ๋‹ฌ, ๋„ค๋น„๊ฒŒ์ด์…˜ ๋ฐ” ๋“ฑ) [2, 12, 13]. + * `features/` (๋˜๋Š” `modules/`): ์ธ์ฆ(Auth), ๋Œ€์‹œ๋ณด๋“œ(Dashboard) ๋“ฑ ๋„๋ฉ”์ธ๋ณ„ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง. ์ด ํด๋” ๋‚ด๋ถ€์—๋Š” ํ•ด๋‹น ๊ธฐ๋Šฅ์—๋งŒ ์“ฐ์ด๋Š” ์ปดํฌ๋„ŒํŠธ, ํ›…, API ๋“ฑ์„ ์บก์Аํ™”ํ•˜์—ฌ ๋ณด๊ด€ํ•ฉ๋‹ˆ๋‹ค [2, 9, 13]. + * `hooks/`: ํผ ์ฒ˜๋ฆฌ, ๋ฐ์ดํ„ฐ ํŽ˜์นญ ๋“ฑ ์•ฑ ์ „๋ฐ˜์—์„œ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ปค์Šคํ…€ ํ›… [9, 14]. + * `pages/` (๋˜๋Š” `routes/`): ๋ผ์šฐํŒ…์— ๋งคํ•‘๋˜๋Š” ํŽ˜์ด์ง€ ๋ ˆ๋ฒจ ์ปดํฌ๋„ŒํŠธ [15, 16]. + * `services/`: ์„œ๋“œํŒŒํ‹ฐ ์„œ๋น„์Šค ์—ฐ๋™์ด๋‚˜ API ์š”์ฒญ ๋“ฑ ์™ธ๋ถ€ ํ†ต์‹  ๋กœ์ง [16, 17]. + * `store/` (๋˜๋Š” `context/`): Redux, Zustand, Context API๋ฅผ ํ™œ์šฉํ•˜๋Š” ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ ๋กœ์ง [14-16]. + * `utils/`: ๋‚ ์งœ ํฌ๋งทํŒ…, ๋ฐ์ดํ„ฐ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๋“ฑ ์ƒํƒœ๋ฅผ ๊ฐ€์ง€์ง€ ์•Š๋Š” ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜ [17, 18]. + * `styles/`: ๊ธ€๋กœ๋ฒŒ CSS, ํ…Œ๋งˆ(Theme) ๋“ฑ ์ „์—ญ ์Šคํƒ€์ผ๋ง ํŒŒ์ผ [18, 19]. + * `types/`: TypeScript ์‚ฌ์šฉ ์‹œ ์ „์—ญ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ํƒ€์ž… ๋ฐ ์ธํ„ฐํŽ˜์ด์Šค ๋ณด๊ด€ [18]. + * `config/`: ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋‚˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์—ญ ์„ค์ •(API ๊ธฐ๋ณธ URL ๋“ฑ) ๊ด€๋ฆฌ [18, 20]. +* **Feature-Sliced Design (FSD):** + * ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ํด๋” ๊ตฌ์กฐ๋ณด๋‹ค ๋” ์—„๊ฒฉํ•˜๊ฒŒ ์˜์กด์„ฑ์˜ ๋ฐฉํ–ฅ์„ ํ†ต์ œํ•˜๋Š” ํ”„๋ก ํŠธ์—”๋“œ ์•„ํ‚คํ…์ฒ˜ ๋ฐฉ๋ฒ•๋ก ์ž…๋‹ˆ๋‹ค [21]. + * `shared` -> `entities` -> `features` -> `widgets` -> `pages` -> `app` ์ด๋ผ๋Š” ๊ณ ์ •๋œ ๋‹ค์ธต ๊ณ„์ธต(Layer)์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค [22, 23]. + * ์ƒ์œ„ ๊ณ„์ธต์€ ํ•˜์œ„ ๊ณ„์ธต์˜ ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์ง€๋งŒ(Import), ํ•˜์œ„ ๊ณ„์ธต์€ ์ƒ์œ„ ๊ณ„์ธต์„ ์ฐธ์กฐํ•  ์ˆ˜ ์—†๋Š” ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ๊ทœ์น™์„ ํ†ตํ•ด ์ˆœํ™˜ ์˜์กด์„ฑ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค [22, 24]. +* **Next.js ํ™˜๊ฒฝ์—์„œ์˜ ๋ผ์šฐํŠธ ๊ทธ๋ฃน (Route Groups):** + * Next.js ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•œ ํด๋”๋ช… `(folderName)` ๋ฐฉ์‹์„ ํ†ตํ•ด, ์‹ค์ œ URL ๊ฒฝ๋กœ์—๋Š” ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์œผ๋ฉด์„œ๋„ ๊ด€๋ จ ๊ธฐ๋Šฅ์ด๋‚˜ ๋…ผ๋ฆฌ์— ๋”ฐ๋ผ ๋ผ์šฐํŠธ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ๊ทธ๋ฃนํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [25-27]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts +- [[Feature-Sliced Design]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋Œ€๊ทœ๋ชจ React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํด๋” ๊ตฌ์กฐ๋ฅผ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•ด ๊ณ ์•ˆ๋œ ์ „๋ฌธ์ ์ธ ํ”„๋ก ํŠธ์—”๋“œ ์•„ํ‚คํ…์ฒ˜ ๋ฐฉ๋ฒ•๋ก ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [21]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํด๋” ๊ฐ„์˜ ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ๊ทœ์น™๊ณผ ๊ฐ ํด๋”(Layer, Slice, Segment)๊ฐ€ ๋‹ด๋‹นํ•ด์•ผ ํ•˜๋Š” ์—ญํ• ์˜ ์—„๊ฒฉํ•œ ๋ถ„๋ฆฌ ๋ฐฉ์‹ [22, 28]. + +- [[Separation of Concerns]] (๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ) + - ์—ฐ๊ฒฐ ์ด์œ : ํด๋” ๊ตฌ์กฐ๋ฅผ ์„ค๊ณ„ํ•˜๋Š” ๊ทผ๋ณธ์ ์ธ ๋ชฉ์ ์ด UI ๋ Œ๋”๋ง, ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ, ๋ฐ์ดํ„ฐ ํ†ต์‹ (API) ๋“ฑ์˜ ์ฑ…์ž„์„ ๊ฐ๊ธฐ ๋‹ค๋ฅธ ์œ„์น˜๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๋ฐ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [4, 29]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: `services/`, `store/`, `components/` ๋“ฑ์˜ ํด๋”๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)์„ ํ”„๋ก ํŠธ์—”๋“œ ์•„ํ‚คํ…์ฒ˜ ์ „๋ฐ˜์— ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ• [4, 30]. + +- [[Naming Conventions]] (๋ช…๋ช… ๊ทœ์น™) + - ์—ฐ๊ฒฐ ์ด์œ : ์ผ๊ด€๋œ ํด๋” ๋ฐ ํŒŒ์ผ ๋ช…๋ช… ๊ทœ์น™(์˜ˆ: ํด๋”๋ช…์€ kebab-case, ์ปดํฌ๋„ŒํŠธ๋Š” PascalCase)์€ ํด๋” ๊ตฌ์กฐ ๋‚ด์—์„œ ํŒŒ์ผ์„ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๊ฒŒ ์ฐพ๊ณ  ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๋Š” ํ•ต์‹ฌ ๊ทœ์น™์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [31-33]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋‹ค์–‘ํ•œ ์šด์˜์ฒด์ œ์™€ CI/CD ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ๋นŒ๋“œ ์—๋Ÿฌ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ  ํŒ€ ๋‚ด ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ• [34, 35]. + +### Deeper Research Questions +- ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜(Feature-based) ํด๋” ๊ตฌ์กฐ์—์„œ ๊ฐ ๊ธฐ๋Šฅ์ด ์ƒํ˜ธ์ž‘์šฉํ•ด์•ผ ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๊ต์ฐจ ๊ด€์‹ฌ์‚ฌ(Cross-cutting concerns)๋‚˜ ๊ณต์œ  ์˜์กด์„ฑ์„ ์–ด๋–ป๊ฒŒ ๊ด€๋ฆฌํ•˜๊ณ  ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- ๋ ˆ๊ฑฐ์‹œ ํŒŒ์ผ ์œ ํ˜• ๊ธฐ๋ฐ˜(File-type based) React ํ”„๋กœ์ ํŠธ๋ฅผ ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ํ˜น์€ Feature-Sliced Design์œผ๋กœ ์ ์ง„์ ์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ€์žฅ ์•ˆ์ „ํ•˜๊ณ  ํšจ์œจ์ ์ธ ๋‹จ๊ณ„๋Š” ๋ฌด์—‡์ธ๊ฐ€? +- Feature-Sliced Design์˜ ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ์›์น™์„ ESLint์™€ ๊ฐ™์€ ์ •์  ๋ถ„์„ ๋„๊ตฌ๋กœ ์ž๋™ ๊ฐ•์ œํ™”(Governance)ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? +- ํด๋” ๊ตฌ์กฐ๋ฅผ ๋ชจ๋“ˆํ™”ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ํŒŒ์ผ ์ค‘์ฒฉ ๋ฌธ์ œ์™€ ์ด๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•œ ์ ์ ˆํ•œ ์ธ๋ฑ์Šค(Barrel) ํŒŒ์ผ ์‚ฌ์šฉ ์ „๋žต์˜ ์žฅ๋‹จ์ ์€ ๋ฌด์—‡์ธ๊ฐ€? +- ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(Context API, Zustand, Redux ๋“ฑ)์˜ ์ข…๋ฅ˜์— ๋”ฐ๋ผ ๊ถŒ์žฅ๋˜๋Š” `store/` ํด๋” ๋‚ด๋ถ€์˜ ๊ตฌ์กฐ๋Š” ์–ด๋–ป๊ฒŒ ๋‹ฌ๋ผ์ ธ์•ผ ํ•˜๋Š”๊ฐ€? + +### Practical Application Contexts +- **Implementation:** React ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ, ๋ชจ๋“  ์š”์†Œ๋ฅผ `components/` ํด๋”์— ๋„ฃ์ง€ ์•Š๊ณ  ํŠน์ • ๋„๋ฉ”์ธ(์˜ˆ: ์ธ์ฆ)์—๋งŒ ์“ฐ์ด๋Š” ์š”์†Œ๋Š” `features/auth/components/`๋กœ ๊ฒฉ๋ฆฌํ•˜์—ฌ ์บก์Аํ™”๋ฅผ ์‹ค์ฒœํ•ฉ๋‹ˆ๋‹ค. +- **System Design:** ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐ ์„ธํŒ… ๋‹จ๊ณ„์—์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ์„ ๋ถ„์„ํ•˜์—ฌ ์–ด๋–ค ์ฝ”๋“œ๊ฐ€ ์ „์—ญ(`shared/` ๋˜๋Š” `components/`)์— ์†ํ•˜๊ณ  ์–ด๋–ค ์ฝ”๋“œ๊ฐ€ ๋กœ์ปฌ(`features/`)์— ์†ํ• ์ง€ ๊ธฐ์ค€์„ ๋งˆ๋ จํ•ฉ๋‹ˆ๋‹ค. +- **Operation / Maintenance:** ๊ธฐ๋Šฅ์— ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ, ํ•ด๋‹น ๊ธฐ๋Šฅ์˜ ํด๋”(`features/feature-name/`)๋งŒ ํ™•์ธํ•˜๋ฉด UI, ์ƒํƒœ, API ์š”์ฒญ ๋กœ์ง์ด ๋ชจ์—ฌ ์žˆ์–ด ๋””๋ฒ„๊น… ๋ฐ ์œ ์ง€๋ณด์ˆ˜ ์†๋„๊ฐ€ ํฌ๊ฒŒ ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค. +- **Learning Path:** ์ฒ˜์Œ์—๋Š” ๋‹จ์ˆœํ•œ ํ”Œ๋žซ ๊ตฌ์กฐ๋กœ React๋ฅผ ํ•™์Šตํ•œ ํ›„, ์ปดํฌ๋„ŒํŠธ๊ฐ€ 30๊ฐœ ์ด์ƒ์œผ๋กœ ๋Š˜์–ด๋‚˜๋Š” ์‹œ์ ์— ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ํด๋” ๊ตฌ์กฐ๋ฅผ ๋„์ž…ํ•˜์—ฌ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ ์—ญ๋Ÿ‰์„ ๊ธฐ๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- **My Project Relevance:** ํ˜„์žฌ ์ง„ํ–‰ ์ค‘์ด๊ฑฐ๋‚˜ ๋ฆฌํŒฉํ† ๋งํ•ด์•ผ ํ•  React ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ, ๊ฑฐ๋Œ€ํ•ด์ง„ `components/` ํด๋”๋ฅผ ๋„๋ฉ”์ธ ๋‹จ์œ„์˜ `features/` ํด๋”๋กœ ๋‚˜๋ˆ„๊ณ  ์žฌ์‚ฌ์šฉ ๋ถˆ๊ฐ€ ๋กœ์ง๋“ค์„ ๋ถ„๋ฆฌํ•˜๋Š” ๋ฐ ์ง์ ‘์ ์œผ๋กœ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. + +### Adjacent Topics +- [[State Management]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ์ „์—ญ ์ƒํƒœ(Global State)์™€ ๋กœ์ปฌ ์ƒํƒœ(Local State)๋ฅผ ์–ด๋””์— ๋ณด๊ด€ํ•ด์•ผ ํ•˜๋Š”์ง€, Zustand์™€ ๊ฐ™์€ ๋„๊ตฌ๊ฐ€ `store/` ํด๋”์˜ ๊ตฌ์กฐ๋ฅผ ์–ด๋–ป๊ฒŒ ๋‹จ์ˆœํ™”ํ•˜๋Š”์ง€ ํ™•์žฅํ•˜์—ฌ ์กฐ์‚ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[Code Splitting]] (์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…) + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋ผ์šฐํŠธ ํ˜น์€ ํด๋”(Feature) ๋‹จ์œ„๋กœ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…๊ณผ ์ง€์—ฐ ๋กœ๋”ฉ(Lazy Loading)์„ ์ ์šฉํ•˜์—ฌ ์ดˆ๊ธฐ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ค„์ด๊ณ  ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๋Š” ์ „๋žต๊ณผ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Topics_GD/Frontend Performance Debugging.md b/10_Wiki/Topics_GD/Frontend Performance Debugging.md new file mode 100644 index 00000000..e8479bfa --- /dev/null +++ b/10_Wiki/Topics_GD/Frontend Performance Debugging.md @@ -0,0 +1,72 @@ +# [[Frontend Performance Debugging]] + +## ๐Ÿ“Œ Brief Summary +ํ”„๋ก ํŠธ์—”๋“œ ์„ฑ๋Šฅ ๋””๋ฒ„๊น…(Frontend Performance Debugging)์€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜, ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง, ์žฆ์€ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ๋“ฑ์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ์„ฑ๋Šฅ ์ €ํ•˜์™€ ์‘๋‹ต ์ง€์—ฐ์„ ์‹๋ณ„ํ•˜๊ณ  ํ•ด๊ฒฐํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค [1-3]. ๊ฐœ๋ฐœ์ž๋Š” ๋ธŒ๋ผ์šฐ์ €์˜ ๋‚ด์žฅ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ(Chrome DevTools)๋ฅผ ํ™œ์šฉํ•ด ๋ฉ”๋ชจ๋ฆฌ ์ƒํƒœ์™€ ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง ๋น„์šฉ์„ ๋กœ์ปฌ์—์„œ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค [4, 5]. ๋” ๋‚˜์•„๊ฐ€ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋Š” ํด๋ผ์šฐ๋“œ ๊ธฐ๋ฐ˜ ๋กœ๊น… ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹ค์ œ ์‚ฌ์šฉ์ž์˜ ์„ธ์…˜๊ณผ ์—๋Ÿฌ๋ฅผ ์ถ”์ ํ•จ์œผ๋กœ์จ ๋ณต์žกํ•œ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ์˜ ๊ทผ๋ณธ ์›์ธ์„ ํŒŒ์•…ํ•ฉ๋‹ˆ๋‹ค [6-8]. + +## ๐Ÿ“– Core ์†Œ์Šค Content +**๋ฉ”๋ชจ๋ฆฌ ๋ฌธ์ œ ์ง„๋‹จ (Memory Issues Diagnosis)** +ํ”„๋ก ํŠธ์—”๋“œ ์„ฑ๋Šฅ ์ €ํ•˜์˜ ์ฃผ์š” ์›์ธ ์ค‘ ํ•˜๋‚˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜(Memory Leak)์™€ ๋ฉ”๋ชจ๋ฆฌ ํŒฝ์ฐฝ(Memory Bloat)์ž…๋‹ˆ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” ์‚ฌ์šฉ์ด ๋๋‚œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๊ฐ€ ํšŒ์ˆ˜ํ•˜์ง€๋งŒ, DOM ๋…ธ๋“œ๊ฐ€ ๋ฌธ์„œ์—์„œ ์ œ๊ฑฐ๋œ ํ›„์—๋„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฐธ์กฐ๊ฐ€ ๋‚จ์•„์žˆ๋Š” '๋ถ„๋ฆฌ๋œ DOM ๋…ธ๋“œ(Detached DOM Nodes)', ๋ˆ„์ ๋œ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ, ํด๋กœ์ €(Closure)์— ์˜ํ•ด ์œ ์ง€๋˜๋Š” ์ฐธ์กฐ ๋“ฑ์ด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ์œ ๋ฐœํ•ฉ๋‹ˆ๋‹ค [2, 9, 10]. Chrome DevTools์˜ Task Manager๋ฅผ ํ†ตํ•ด ์‹ค์‹œ๊ฐ„ DOM ๋…ธ๋“œ์™€ JS ํž™(Heap) ๋ฉ”๋ชจ๋ฆฌ ์ฆ๊ฐ€๋ฅผ ํ™•์ธํ•˜๊ณ , Memory ํŒจ๋„์˜ Heap Snapshot์„ ๋น„๊ตํ•˜์—ฌ ๋ถ„๋ฆฌ๋œ DOM ํŠธ๋ฆฌ๋ฅผ ์‹๋ณ„ํ•˜๋ฉฐ, Allocation Timeline์„ ์‚ฌ์šฉํ•ด ์–ธ์ œ ์ƒˆ๋กœ์šด ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ• ๋‹น๋˜๋Š”์ง€ ์ถ”์ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [4, 11, 12]. ๋นˆ๋ฒˆํ•œ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์€ ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰์„ ์ž์ฃผ ์ผ์‹œ ์ •์ง€์‹œ์ผœ ํ™”๋ฉด์˜ ๋Š๊น€(Jank)์„ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค [1]. + +**React ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง ํ”„๋กœํŒŒ์ผ๋ง (React Rendering Profiling)** +React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ์ƒํƒœ(State), ํ”„๋กœํผํ‹ฐ(Props), ์ปจํ…์ŠคํŠธ(Context) ๋ณ€๊ฒฝ ๋˜๋Š” ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์˜ ๋ Œ๋”๋ง์— ์˜ํ•ด ๋ฆฌ๋ Œ๋”๋ง์ด ํŠธ๋ฆฌ๊ฑฐ๋ฉ๋‹ˆ๋‹ค [13]. ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์€ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋ฅผ ์ฐจ๋‹จํ•˜๊ณ  ์ƒํ˜ธ์ž‘์šฉ ์‹œ๊ฐ„์„ ์ง€์—ฐ์‹œํ‚ต๋‹ˆ๋‹ค [3]. ์ด๋ฅผ ๋””๋ฒ„๊น…ํ•˜๊ธฐ ์œ„ํ•ด React DevTools Profiler๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์–ด๋–ค ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ธ์ œ, ์™œ ๋ Œ๋”๋ง๋˜์—ˆ๋Š”์ง€, ์–ผ๋งˆ๋‚˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ๋Š”์ง€(Flamegraph ๋ทฐ ๋“ฑ)๋ฅผ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค [5, 14]. ๋˜ํ•œ, ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์ „์šฉ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ `why-did-you-render`๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์‹ค์ œ ์ƒํƒœ๋‚˜ prop ๋ณ€๊ฒฝ ์—†์ด ๋ฐœ์ƒํ•˜๋Š” ๋ฆฌ๋ Œ๋”๋ง์— ๋Œ€ํ•œ ์ฝ˜์†” ๊ฒฝ๊ณ ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [15, 16]. + +**ํ”„๋กœ๋•์…˜ ๊ด€์ธก์„ฑ๊ณผ ํด๋ผ์šฐ๋“œ ๋กœ๊น… (Production Observability and Logging)** +๋กœ์ปฌ ํ™˜๊ฒฝ์„ ๋„˜์–ด ์‹ค์ œ ์šด์˜ ํ™˜๊ฒฝ์˜ ์„ฑ๋Šฅ์„ ๋””๋ฒ„๊น…ํ•˜๊ธฐ ์œ„ํ•ด Sentry, LogRocket, Datadog RUM, SigNoz์™€ ๊ฐ™์€ ํ”„๋ก ํŠธ์—”๋“œ ํด๋ผ์šฐ๋“œ ๋กœ๊น… ๋„๊ตฌ๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค [17, 18]. ์ด ๋„๊ตฌ๋“ค์€ ๋‹จ์ˆœํ•œ ์—๋Ÿฌ ๋กœ๊น…์„ ๋„˜์–ด ์‚ฌ์šฉ์ž๊ฐ€ ์—๋Ÿฌ๋‚˜ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ๊ฒช๊ธฐ ์ง์ „์˜ ํ–‰๋™์„ ๋น„๋””์˜ค์ฒ˜๋Ÿผ ๋‹ค์‹œ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด(Session Replay), ํ”„๋ก ํŠธ์—”๋“œ ์—๋Ÿฌ๋ฅผ ๋ฐฑ์—”๋“œ ํŠธ๋ ˆ์ด์Šค์™€ ์—ฐ๊ด€ ์ง€์–ด ๋ถ„์„ํ•˜๋Š” ๋ถ„์‚ฐ ํŠธ๋ ˆ์ด์‹ฑ(Distributed Tracing), ๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ ์‚ฌ์šฉ์ž์˜ Core Web Vitals(LCP, FID, INP ๋“ฑ) ๋ชจ๋‹ˆํ„ฐ๋ง ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์—ฌ ๋งน์  ์—†๋Š” ๋””๋ฒ„๊น…์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค [7, 8, 19-21]. + +## โš–๏ธ Trade-offs & Caveats +* **๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ์˜ ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ฐ˜๋Œ€ ๊ธ‰๋ถ€:** LogRocket์ด๋‚˜ Sentry ๊ฐ™์€ ๊ฐ•๋ ฅํ•œ ๋กœ๊น… ๋ฐ ์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ๋“ค์„ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ์— ํƒ‘์žฌํ•˜๋ฉด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ๊ฐ€ ์ปค์ง€๊ณ  ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค. ์ผ๋ถ€ ๋„๊ตฌ๋Š” ์ตœ๋Œ€ 120ms์˜ ์ถ”๊ฐ€ ๋กœ๋“œ ์‹œ๊ฐ„์„ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ 1์ดˆ๊ฐ€ ์ค‘์š”ํ•œ ์„œ๋น„์Šค์—์„œ๋Š” ๊ฐ€๋ฒผ์šด ์˜ต์…˜์„ ์„ ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [22-24]. +* **์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด์™€ ํ”„๋ผ์ด๋ฒ„์‹œ ๋ฌธ์ œ:** ๋ชจ๋“  ์‚ฌ์šฉ์ž ์„ธ์…˜๊ณผ DOM/์ƒํƒœ ๋ณ€ํ™”๋ฅผ ๊ธฐ๋กํ•˜๋Š” ๋„๊ตฌ(์˜ˆ: LogRocket)์˜ ๊ธฐ๋ณธ '๋ชจ๋‘ ์บก์ฒ˜' ๋ฐฉ์‹์€ ๋ฏผ๊ฐํ•œ ๊ฐœ์ธ์ •๋ณด๋ฅผ ๋…ธ์ถœํ•  ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋งˆ์Šคํ‚น ์„ค์ •์„ ์ˆ˜๋™์œผ๋กœ ์—„๊ฒฉํžˆ ๊ตฌ์„ฑํ•ด์•ผ ํ•˜๋Š” ๊ด€๋ฆฌ ๋น„์šฉ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [19, 23, 25, 26]. +* **๋น„์šฉ๊ณผ ๊ฐ€์‹œ์„ฑ์˜ ํƒ€ํ˜‘ (Cost vs. Visibility):** Datadog๊ณผ ๊ฐ™์€ ๋Œ€๊ทœ๋ชจ ์˜ต์ €๋ฒ„๋นŒ๋ฆฌํ‹ฐ ํ”Œ๋žซํผ์€ ์ˆ˜์ง‘(Ingestion)๊ณผ ์ƒ‰์ธ(Indexing) ๋‹จ๊ณ„์—์„œ ์ด์ค‘ ๊ณผ๊ธˆ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ํŠธ๋ž˜ํ”ฝ์ด ๋งŽ์€ ๊ฒฝ์šฐ ์—„์ฒญ๋‚œ ๋น„์šฉ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋น„์šฉ ์ ˆ๊ฐ์„ ์œ„ํ•ด ๋กœ๊ทธ์˜ 20%๋งŒ ์ƒ‰์ธํ•˜๊ฒŒ ๋˜๋ฉด, ์‹ค์ œ ์žฅ์•  ๋ฐœ์ƒ ์‹œ ๋””๋ฒ„๊น…์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ์˜ 80%๊ฐ€ ๊ฒ€์ƒ‰๋˜์ง€ ์•Š๋Š” ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [27-29]. +* **์ตœ์ ํ™” ๊ธฐ๋ฒ• ์ž์ฒด์˜ ์˜ค๋ฒ„ํ—ค๋“œ:** `React.memo()`, `useCallback`, `useMemo`์™€ ๊ฐ™์€ ์ตœ์ ํ™” ํ›…์€ ์ด์ „ ์ฐธ์กฐ๊ฐ’์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜๊ณ  ๋น„๊ตํ•˜๋Š” ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ๋ Œ๋”๋ง ๋น„์šฉ๋ณด๋‹ค ๋น„๊ต ๋น„์šฉ์ด ๋” ํฐ ๊ฐ€๋ฒผ์šด ์ปดํฌ๋„ŒํŠธ์— ๋‚จ์šฉํ•˜๋ฉด ์˜คํžˆ๋ ค ์„ฑ๋Šฅ์„ ์ €ํ•˜์‹œํ‚ค๋Š” ์›์ธ์ด ๋ฉ๋‹ˆ๋‹ค [30, 31]. +* **์ปดํŒŒ์ผ๋Ÿฌ ์ž๋™ํ™”๋กœ ์ธํ•œ ๋””๋ฒ„๊น… ๋‚œ์ด๋„ ์ƒ์Šน:** React Compiler ๊ฐ™์€ ๋นŒ๋“œ ํƒ€์ž„ ์ž๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ช…์‹œ์ ์ธ ํ›… ์ž‘์„ฑ์„ ์ค„์ผ ์ˆ˜ ์žˆ์ง€๋งŒ, ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ธ”๋ž™๋ฐ•์Šค๋กœ ์ž‘๋™ํ•˜๋ฏ€๋กœ ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ ์ฝ”๋“œ ์ƒ์—์„œ ์›์ธ์„ ์ฐพ๊ธฐ ์–ด๋ ค์›Œ React DevTools Profiler์— ์ „์ ์œผ๋กœ ์˜์กดํ•ด์•ผ ํ•˜๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค [32]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [๊ด€๊ณ„ ์œ ํ˜• A (๋กœ์ปฌ ๋””๋ฒ„๊น… ๋ฐ ๋ถ„์„ ๋„๊ตฌ)] +- [[Chrome DevTools Memory Profiler]] + - ์—ฐ๊ฒฐ ์ด์œ : ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜์™€ ๊ฐ์ฒด ๋ณด์กด ์ƒํƒœ๋ฅผ ํ”„๋กœํŒŒ์ผ๋งํ•˜๋Š” ๋ธŒ๋ผ์šฐ์ € ๋‚ด์žฅ ๋„๊ตฌ. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Heap Snapshots ๋น„๊ต, Allocation Timeline์„ ํ†ตํ•œ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ์ถ”์ , Detached DOM tree ํŒŒ์•… ๊ธฐ๋ฒ• [9, 12, 33]. +- [[React DevTools Profiler]] + - ์—ฐ๊ฒฐ ์ด์œ : React ํŠน์œ ์˜ ๋ Œ๋”๋ง ์‚ฌ์ดํด๊ณผ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ์„ ์‹œ๊ฐํ™”ํ•˜๋Š” ํ•ต์‹ฌ ๋„๊ตฌ. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง ์†Œ์š” ์‹œ๊ฐ„, ๋ Œ๋”๋ง ๋ฐœ์ƒ ์›์ธ(Props/State ๋ณ€๊ฒฝ ์—ฌ๋ถ€ ํŒ๋ณ„) [5, 14]. + +#### [๊ด€๊ณ„ ์œ ํ˜• B (ํ”„๋กœ๋•์…˜ ๊ด€์ธก์„ฑ ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง)] +- [[Frontend Cloud Logging Tools]] + - ์—ฐ๊ฒฐ ์ด์œ : Sentry, LogRocket, Datadog RUM, SigNoz ๋“ฑ ๋ฐฐํฌ ์ดํ›„ ๋ฐœ์ƒํ•˜๋Š” ์„ฑ๋Šฅ ์ €ํ•˜์™€ ๋ฒ„๊ทธ๋ฅผ ์ถ”์ ํ•˜๋Š” ํ”Œ๋žซํผ. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํ”„๋กœ๋•์…˜ ๋ ˆ๋ฒจ์—์„œ์˜ ์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด, ์ž๋™ ์—๋Ÿฌ ๊ทธ๋ฃนํ™”, ์—”๋“œํˆฌ์—”๋“œ ๋ถ„์‚ฐ ํŠธ๋ ˆ์ด์‹ฑ, Core Web Vitals ์ถ”์  [7, 8, 20, 21, 34]. + +#### [๊ด€๊ณ„ ์œ ํ˜• C (์•„ํ‚คํ…์ฒ˜ ๋ฐ ์•ˆํ‹ฐํŒจํ„ด)] +- [[JavaScript Memory Leaks]] + - ์—ฐ๊ฒฐ ์ด์œ : ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ฑ๋Šฅ์„ ์ ์ง„์ ์œผ๋กœ ํŒŒ๊ดดํ•˜๋Š” ํ˜„์ƒ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ํŒฝ์ฐฝ, ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ๋“ฑ๊ณผ ์—ฐ๊ด€. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํด๋กœ์ € ์ž”๋ฅ˜ ์ฐธ์กฐ(Closure-Retained References), ํ•ด์ œ๋˜์ง€ ์•Š์€ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ์˜ ๋™์ž‘ ๋ฉ”์ปค๋‹ˆ์ฆ˜ [2, 10, 35]. +- [[React Re-render Optimization]] + - ์—ฐ๊ฒฐ ์ด์œ : React์˜ ๋ Œ๋”๋ง ํŠน์„ฑ์ƒ ๋ฐœ์ƒํ•˜๋Š” ๋ฉ”์ธ ์Šค๋ ˆ๋“œ ๋ธ”๋กœํ‚น ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์ฝ”๋“œ ๋ ˆ๋ฒจ ๊ธฐ๋ฒ•. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ฐธ์กฐ ์•ˆ์ •์„ฑ(Reference stability), ์ต๋ช… ํ•จ์ˆ˜์˜ ๋ถ€์ž‘์šฉ, `useMemo` ๋ฐ `useCallback`์˜ ์˜ฌ๋ฐ”๋ฅธ ํ™œ์šฉ๋ฒ• [36-38]. + +### Deeper Research Questions + +- ํ”„๋ก ํŠธ์—”๋“œ ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ ์ˆ˜์ง‘ํ•˜๋Š” Sentry, LogRocket ๋“ฑ์˜ ํˆด์ด ์œ ๋ฐœํ•˜๋Š” ์„ฑ๋Šฅ ์ €ํ•˜(๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ ๋ฐ ์‹คํ–‰ ์˜ค๋ฒ„ํ—ค๋“œ)๋ฅผ ์ตœ์†Œํ™”ํ•˜๋ฉด์„œ๋„ Core Web Vitals ๋“ฑ ์œ ์˜๋ฏธํ•œ ๋””๋ฒ„๊น… ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๋Š” ์ตœ์ ์˜ ์„ค์ • ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? +- JavaScript ํ™˜๊ฒฝ์˜ Allocation Timeline ์ƒ์—์„œ ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ฐœ์ƒํ•˜๋Š” ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜(GC) ์ŠคํŒŒ์ดํฌ์™€ ์‹ค์ œ ๋ธŒ๋ผ์šฐ์ €์˜ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ ๋ฉˆ์ถค ํ˜„์ƒ(Jank/INP ์ €ํ•˜) ๊ฐ„์˜ ์ƒ๊ด€๊ด€๊ณ„๋ฅผ ์–ด๋–ป๊ฒŒ ์ •๋Ÿ‰์ ์œผ๋กœ ํ”„๋กœํŒŒ์ผ๋งํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- React Compiler๊ฐ€ ์ž๋™ํ™”ํ•˜๋Š” ์˜์—ญ๊ณผ ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(์˜ˆ: ํ•ญ์ƒ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” `useLocation`, `useMutation`)๋กœ ์ธํ•ด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ตœ์ ํ™”๋ฅผ ์šฐํšŒํ•˜๋Š” ๊ฒฝ์šฐ, ์ด ์ถฉ๋Œ์„ ๋””๋ฒ„๊น…ํ•˜๊ณ  ํ•ด๊ฒฐํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ํŒจํ„ด์€ ๋ฌด์—‡์ธ๊ฐ€? +- Puppeteer ๊ธฐ๋ฐ˜์˜ Automated Memory Testing์„ CI/CD ํŒŒ์ดํ”„๋ผ์ธ์— ํ†ตํ•ฉํ•˜์—ฌ, Detached DOM node๋‚˜ Event Listener ๋ˆ„์ ๊ณผ ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ํ”„๋กœ๋•์…˜ ๋ฐฐํฌ ์ „์— ์ฐจ๋‹จํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? +- Context API ์‚ฌ์šฉ ์‹œ ๋ฐœ์ƒํ•˜๋Š” ๊ด‘๋ฒ”์œ„ํ•œ ๋ฆฌ๋ Œ๋”๋ง ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Zustand์™€ ๊ฐ™์€ ์™ธ๋ถ€ ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ์˜ 'Selector' ํŒจํ„ด์„ ์‚ฌ์šฉํ•  ๋•Œ, ๋””๋ฒ„๊น… ๊ณผ์ •์—์„œ Redux DevTools ์—ฐ๋™์ด ์ œ๊ณตํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ์ด์ ์€ ๋ฌด์—‡์ธ๊ฐ€? + +### Practical Application Contexts + +- **Implementation:** React ์ปดํฌ๋„ŒํŠธ ๋งˆ์šดํŠธ ํ•ด์ œ ์‹œ `useEffect` ํด๋ฆฐ์—… ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ์ œ๊ฑฐํ•จ์œผ๋กœ์จ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ , ๋กœ์ปฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ `why-did-you-render` ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ์ฝ˜์†” ๊ฒฝ๊ณ ๋กœ ์กฐ๊ธฐ ๊ฐ์ง€ํ•œ๋‹ค [15, 39]. +- **System Design:** ์ดˆ๊ธฐ ํ”„๋ก ํŠธ์—”๋“œ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ ๋‹จ๊ณ„๋ถ€ํ„ฐ SigNoz(OpenTelemetry ๊ธฐ๋ฐ˜)๋‚˜ Sentry์™€ ๊ฐ™์€ ๋กœ๊น… ๋„๊ตฌ ๋„์ž…์„ ์ธํ”„๋ผ ๊ตฌ์„ฑ ์š”์†Œ๋กœ ๊ฒฐ์ •ํ•˜๊ณ , ์‚ฌ์šฉ์ž ์ •๋ณด ๋ณดํ˜ธ๋ฅผ ์œ„ํ•ด ์„ธ์…˜ ์บก์ฒ˜ ์‹œ ๋ฏผ๊ฐ ๋ฐ์ดํ„ฐ ๋งˆ์Šคํ‚น ์ •์ฑ…์„ ์‚ฌ์ „ ์„ค๊ณ„ํ•œ๋‹ค [21, 25, 26, 40]. +- **Operation / Maintenance:** ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ์•ฑ์ด ๋ฌด๊ฑฐ์›Œ์ง€๊ฑฐ๋‚˜ ๋А๋ ค์ง„๋‹ค๋Š” ์‚ฌ์šฉ์ž ์ œ๋ณด๊ฐ€ ๋“ค์–ด์˜ฌ ๊ฒฝ์šฐ, Chrome DevTools Memory ํŒจ๋„์˜ Heap Snapshot์„ ํ†ตํ•ด ๋ถ„๋ฆฌ๋œ DOM ๋…ธ๋“œ๊ฐ€ ์ ์ง„์ ์œผ๋กœ ๋ˆ„์ ๋˜๋Š”์ง€ ๊ฒ€์‚ฌํ•˜๊ณ  ์›์ธ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•œ๋‹ค [1, 9, 41]. +- **Learning Path:** ์šฐ์„  JavaScript ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ์˜ ๋™์ž‘ ์›๋ฆฌ์™€ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ํŒจํ„ด์„ ํ•™์Šตํ•œ ๋’ค, Chrome DevTools์˜ Task Manager์™€ Memory ํŒจ๋„ ์‚ฌ์šฉ๋ฒ•์„ ์ตํžˆ๊ณ , ์ตœ์ข…์ ์œผ๋กœ React Profiler์™€ ํ”„๋กœ๋•์…˜ ๋กœ๊น… ๋„๊ตฌ ํ™œ์šฉ๋ฒ•์œผ๋กœ ํ•™์Šต์„ ํ™•์žฅํ•œ๋‹ค. +- **My Project Relevance:** ํ˜„์žฌ ์ง„ํ–‰ํ•˜๋Š” React ๊ธฐ๋ฐ˜ ๋Œ€์‹œ๋ณด๋“œ ํ”„๋กœ์ ํŠธ์—์„œ ํ…Œ์ด๋ธ” ๋ฐ์ดํ„ฐ๋‚˜ ์ฐจํŠธ ์—…๋ฐ์ดํŠธ ์‹œ ํ™”๋ฉด ๋ฉˆ์ถค์ด ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ, Chrome DevTools Performance ํƒญ์„ ํ†ตํ•ด ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰ ์‹œ๊ฐ„์„ ํ™•์ธํ•˜๊ณ  React Profiler๋ฅผ ๋ถ™์—ฌ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ฆฌ๋ Œ๋”๋ง๋˜๋Š” ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‹๋ณ„, `React.memo` ๋˜๋Š” ์‹๋ณ„์ž(Key)๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ์ตœ์ ํ™” ์ž‘์—…์— ์ง์ ‘ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. + +### Adjacent Topics + +- [[Core Web Vitals]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ํ”„๋ก ํŠธ์—”๋“œ ์„ฑ๋Šฅ ์ตœ์ ํ™”์™€ ๋””๋ฒ„๊น…์˜ ๊ถ๊ทน์ ์ธ ์„ฑ๊ณผ ์ง€ํ‘œ์ด์ž ๊ธฐ์ค€์ ์ด ๋˜๋Š” ์‹ค์ œ ์‚ฌ์šฉ์ž ์ฒด๊ฐ ์†๋„ ์ง€ํ‘œ(LCP, FID, INP, CLS ๋“ฑ) ์‹ฌ์ธต ํƒ๊ตฌ [8]. +- [[React Server Components (RSC)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: Next.js ํ™˜๊ฒฝ์—์„œ ํด๋ผ์ด์–ธํŠธ ์ธก ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ ์ž์ฒด๋ฅผ ์ค„์ด๊ณ  ์ƒํ˜ธ์ž‘์šฉ ์—†๋Š” UI๋ฅผ ์„œ๋ฒ„์—์„œ ๋ Œ๋”๋งํ•จ์œผ๋กœ์จ ๊ทผ๋ณธ์ ์ธ ํด๋ผ์ด์–ธํŠธ ๋””๋ฒ„๊น… ์š”์†Œ ๋ฐ ๋ฆฌ๋ Œ๋”๋ง ๋น„์šฉ์„ ์ œ๊ฑฐํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜ [42, 43]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Topics_GD/React Application Scaling.md b/10_Wiki/Topics_GD/React Application Scaling.md new file mode 100644 index 00000000..3baf9301 --- /dev/null +++ b/10_Wiki/Topics_GD/React Application Scaling.md @@ -0,0 +1,29 @@ +# [[React Application Scaling]] + +## ๐Ÿ“Œ Brief Summary +๋ฆฌ์•กํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์Šค์ผ€์ผ๋ง(React Application Scaling)์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํฌ๊ธฐ์™€ ๋ณต์žก์„ฑ์ด ์ฆ๊ฐ€ํ•จ์— ๋”ฐ๋ผ ๋ฐœ์ƒํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜, ์„ฑ๋Šฅ, ์ƒํƒœ ๊ด€๋ฆฌ, ๊ทธ๋ฆฌ๊ณ  ํ˜‘์—… ๋ฌธ์ œ๋ฅผ ์ฒด๊ณ„์ ์œผ๋กœ ํ•ด๊ฒฐํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค [1-3]. ์ด๋Š” ๋‹จ์ˆœํžˆ ๋ Œ๋”๋ง ์†๋„๋ฅผ ๋†’์ด๋Š” ๊ฒƒ์„ ๋„˜์–ด, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ UI์˜ ๊ฒฐํ•ฉ์„ ๋ง‰๊ณ , ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ํด๋” ๊ตฌ์กฐ๋ฅผ ๋„์ž…ํ•˜๋ฉฐ, ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง๊ณผ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ตœ์ ํ™”ํ•˜๋Š” ๊ฒƒ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค [2-5]. ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋Œ€๊ทœ๋ชจ ํŒ€์ด ์•ˆ์ •์ ์ด๊ณ  ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ์‰ฌ์šด ํ”„๋ก ํŠธ์—”๋“œ ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š” ํ•ต์‹ฌ ์—”์ง€๋‹ˆ์–ด๋ง ํŒจ๋Ÿฌ๋‹ค์ž„์ž…๋‹ˆ๋‹ค [3, 6]. + +## ๐Ÿ“– Core Content +* **๊ตฌ์กฐ์  ์•„ํ‚คํ…์ฒ˜ ๋ฐ ํด๋” ๊ตฌ์„ฑ (Architectural Paradigms):** + ์ดˆ๊ธฐ ๋ฆฌ์•กํŠธ ์•ฑ์€ ์ปดํฌ๋„ŒํŠธ๋‚˜ ํ›…์„ ๊ธฐ์ˆ ์  ํŒŒ์ผ ํƒ€์ž…(Type-Based)์œผ๋กœ ๋ถ„๋ฆฌํ•˜์ง€๋งŒ, ์•ฑ์ด ์ปค์ง€๋ฉด ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜(Feature-Based) ๋˜๋Š” ๋„๋ฉ”์ธ ์ฃผ๋„ ๊ตฌ์กฐ๋กœ ์ „ํ™˜ํ•ด์•ผ ํ™•์žฅ์„ฑ์„ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [7, 8]. ํŠนํžˆ **FSD(Feature-Sliced Design)**๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ `app`, `pages`, `widgets`, `features`, `entities`, `shared` ๋“ฑ์˜ ๊ณ„์ธตํ™”๋œ ์Šฌ๋ผ์ด์Šค๋กœ ๋‚˜๋ˆ„๊ณ , ํ•˜์œ„ ๊ณ„์ธต๋งŒ ์ฐธ์กฐํ•˜๋„๋ก ํ•˜๋Š” ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ์„ ๊ฐ•์ œํ•˜์—ฌ ์ฝ”๋“œ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ณ  ๋ฆฌํŒฉํ† ๋ง์„ ์šฉ์ดํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค [9-11]. +* **์ƒํƒœ ๊ด€๋ฆฌ ์•„ํ‚คํ…์ฒ˜ (State Management Evolution):** + ๋‹จ์ผํ•œ ์ „์—ญ ์ƒํƒœ ๋„๊ตฌ์—์„œ ๋ฒ—์–ด๋‚˜ ๋ฐ์ดํ„ฐ ํŠน์„ฑ์— ๋งž๋Š” ๋„๊ตฌ๋ฅผ ์„ ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [12]. ํ…Œ๋งˆ๋‚˜ ๋กœ์ผ€์ผ์ฒ˜๋Ÿผ ์ •์ ์ด๊ณ  ๋ณ€๊ฒฝ์ด ์ ์€ ๋ฐ์ดํ„ฐ๋Š” Context API๊ฐ€ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค [13]. ๋ฐ˜๋ฉด ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ณ€๊ฒฝ๋˜๋Š” ๋™์  ์ƒํƒœ๋Š” ์„ ํƒ์ž(Selector) ํŒจํ„ด์„ ํ†ตํ•ด ๋ฆฌ๋ Œ๋”๋ง์„ ๋ฐฉ์ง€ํ•˜๋Š” Zustand๊ฐ€ ์œ ๋ฆฌํ•˜๋ฉฐ, ๋ณต์žกํ•œ ๋น„๋™๊ธฐ ๋กœ์ง๊ณผ ๋Œ€๊ทœ๋ชจ ํŒ€ ํ˜‘์—…์—๋Š” ๊ตฌ์กฐ๋ฅผ ๊ฐ•์ œํ•˜๋Š” Redux๊ฐ€ ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค [14-17]. ์„œ๋ฒ„ ์ƒํƒœ ์ฒ˜๋ฆฌ๋Š” TanStack Query์™€ ๊ฐ™์€ API ๊ณ„์ธต์šฉ ๋„๊ตฌ๋กœ ์™„์ „ํžˆ ๋ถ„๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [16, 18]. +* **์„ฑ๋Šฅ ๋ฐ ๋ฒˆ๋“ค๋ง ์ตœ์ ํ™” (Performance & Bundling):** + ๋ฆฌ์•กํŠธ๋Š” ์ƒํƒœ๋‚˜ ํ”„๋กญ์Šค๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ํ•˜์œ„ ํŠธ๋ฆฌ๋ฅผ ๋ฆฌ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค [19]. ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด `React.memo`, `useCallback`, `useMemo`๋ฅผ ์ „๋žต์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ์ฐธ์กฐ ์•ˆ์ •์„ฑ(Reference Equality)์„ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [20, 21]. ์ดˆ๊ธฐ ๋กœ๋”ฉ ์†๋„ ๊ฐœ์„ ์„ ์œ„ํ•ด์„œ๋Š” `React.lazy`์™€ ๋ผ์šฐํŠธ ๋ ˆ๋ฒจ์˜ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…์„ ์ ์šฉํ•˜๊ณ , Vite์˜ `manualChunks`๋ฅผ ํ™œ์šฉํ•ด React ์ฝ”์–ด ๋“ฑ ๋ฌด๊ฑฐ์šด ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ณ„๋„ ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ์บ์‹ฑ ํšจ์œจ์„ ๋†’์ž…๋‹ˆ๋‹ค [22-25]. ์ตœ๊ทผ์—๋Š” React Compiler๋ฅผ ๋„์ž…ํ•ด ๋นŒ๋“œ ํƒ€์ž„์— ์ž๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ธฐ๋ฒ•๋„ ํ™œ์šฉ๋ฉ๋‹ˆ๋‹ค [26-29]. +* **์ฝ”๋“œ ํ’ˆ์งˆ ๋ฐ ๋ณต์›๋ ฅ (Quality & Resilience):** + SOLID, DRY, KISS, YAGNI ์›์น™์„ ์ค€์ˆ˜ํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‹จ์ผ ์ฑ…์ž„(SRP)์„ ๊ฐ–๋„๋ก ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค [30-32]. ํŒŒ์ผ๋ช…์€ ์šด์˜์ฒด์ œ ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด `kebab-case`๋ฅผ, ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ๋Š” `PascalCase`๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋“ฑ ๋„ค์ด๋ฐ ์ปจ๋ฒค์…˜์„ ํ†ต์ผํ•ฉ๋‹ˆ๋‹ค [33-36]. ๋˜ํ•œ ํŠน์ • ์ปดํฌ๋„ŒํŠธ์˜ ๋ Œ๋”๋ง ์˜ค๋ฅ˜๊ฐ€ ์ „์ฒด ์•ฑ์„ ๋‹ค์šด์‹œํ‚ค๋Š” ๊ฒƒ์„ ๋ง‰๊ธฐ ์œ„ํ•ด ์—๋Ÿฌ ๋ฐ”์šด๋”๋ฆฌ(Error Boundaries)๋ฅผ ์ค‘์š” UI ์„น์…˜๋งˆ๋‹ค ๋ฐฐ์น˜ํ•˜์—ฌ Fallback UI๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ณต์›๋ ฅ ์žˆ๋Š” ์„ค๊ณ„๊ฐ€ ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค [37-39]. + +## โš–๏ธ Trade-offs & Caveats +* **๊ณผ๋„ํ•œ ์—”์ง€๋‹ˆ์–ด๋ง (Over-Engineering):** FSD๋‚˜ Redux์™€ ๊ฐ™์€ ๊ณ ๋„ํ™”๋œ ์•„ํ‚คํ…์ฒ˜์™€ ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ๋ฅผ ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ๋‚˜ ๊ฒฝํ—˜์ด ์ ์€ ํŒ€์— ๋„์ž…ํ•˜๋ฉด, ํ•™์Šต ๊ณก์„ ์ด ํฌ๊ฒŒ ์ƒ์Šนํ•˜๊ณ  ๋ถˆํ•„์š”ํ•œ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ๊ฐ€ ์–‘์‚ฐ๋˜์–ด ์˜คํžˆ๋ ค ๊ฐœ๋ฐœ ์†๋„๋ฅผ ๋Šฆ์ถœ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [40-43]. +* **๋ฉ”๋ชจ์ด์ œ์ด์…˜์˜ ์˜ค์šฉ์— ๋”ฐ๋ฅธ ์„ฑ๋Šฅ ์ €ํ•˜:** `React.memo`๋‚˜ `useMemo`๋ฅผ ๋ฌด๋ถ„๋ณ„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด, ์ด์ „ props ๋ฐ ์ƒํƒœ๋ฅผ ๋น„๊ตํ•˜๋Š” ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์—ฐ์‚ฐ ๋น„์šฉ์ด ๋ Œ๋”๋ง ๋น„์šฉ ์ž์ฒด๋ฅผ ์ดˆ๊ณผํ•˜์—ฌ ์˜คํžˆ๋ ค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ์„ ์•…ํ™”์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [44, 45]. +* **React Compiler์˜ ๊ฐ€์‹œ์„ฑ ์ €ํ•˜ ๋ฐ ํ˜ธํ™˜์„ฑ ์ œ์•ฝ:** ์ž๋™ํ™”๋œ ์ตœ์ ํ™” ๋„๊ตฌ์ธ React Compiler๋Š” ๋ธ”๋ž™๋ฐ•์Šค์ฒ˜๋Ÿผ ์ž‘๋™ํ•˜๋ฏ€๋กœ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ ๋ฐœ์ƒ ์‹œ ๋””๋ฒ„๊น…์ด ๋” ๊นŒ๋‹ค๋กœ์›Œ์ง‘๋‹ˆ๋‹ค [46]. ๋˜ํ•œ ๋งค ๋ Œ๋”๋ง ์‹œ ์˜๋„์ ์œผ๋กœ ๋ถˆ์•ˆ์ •ํ•œ ์ฐธ์กฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(์˜ˆ: React Router, TanStack Query ์ผ๋ถ€ ํ›…)์™€๋Š” ์ตœ์ ํ™” ํ˜ธํ™˜์ด ๊นจ์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ, React ๊ทœ์น™์„ ์ง€ํ‚ค์ง€ ์•Š์€ ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ๋Š” ์ ์šฉ์ด ์–ด๋ ต์Šต๋‹ˆ๋‹ค [47, 48]. +* **Context API์˜ ๋ฆฌ๋ Œ๋”๋ง ํญํ’ (Re-render Storm):** Context API๋ฅผ ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ณ€ํ•˜๋Š” ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ์— ์‚ฌ์šฉํ•˜๋ฉด, ๋ฐ์ดํ„ฐ ์ค‘ ์ผ๋ถ€๋ถ„๋งŒ ๋ณ€๊ฒฝ๋˜๋”๋ผ๋„ ํ•ด๋‹น ์ปจํ…์ŠคํŠธ๋ฅผ ๊ตฌ๋…ํ•˜๋Š” ๋ชจ๋“  ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ฆฌ๋ Œ๋”๋ง๋˜๋Š” ์น˜๋ช…์ ์ธ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ์œ ๋ฐœํ•ฉ๋‹ˆ๋‹ค [49, 50]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [์•„ํ‚คํ…์ฒ˜ ๋ฐ ํด๋” ๊ตฌ์กฐ (Architecture & Structure)] +- [[Feature-Sliced Design (FSD)]] + - ์—ฐ๊ฒฐ ์ด์œ : ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ๋ฆฌ์•กํŠธ ์•ฑ์„ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•œ ํ•ต์‹ฌ ๋„๋ฉ”์ธ ์ฃผ๋„ ์•„ํ‚คํ…์ฒ˜ ๋ฐฉ๋ฒ•๋ก ์ž…๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ธฐ๋Šฅ, ์œ„์ ฏ, ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋ถ„๋ฆฌํ•˜๊ณ  ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ๊ทœ์น™์„ ๊ฐ•์ œํ•˜์—ฌ ๊ฒฐ \ No newline at end of file diff --git a/10_Wiki/Topics_GD/React Frontend Architecture.md b/10_Wiki/Topics_GD/React Frontend Architecture.md new file mode 100644 index 00000000..76200a99 --- /dev/null +++ b/10_Wiki/Topics_GD/React Frontend Architecture.md @@ -0,0 +1,64 @@ +# [[React Frontend Architecture]] + +## ๐Ÿ“Œ Brief Summary +React ํ”„๋ก ํŠธ์—”๋“œ ์•„ํ‚คํ…์ฒ˜๋Š” ํ™•์žฅ ๊ฐ€๋Šฅํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ์‰ฌ์šด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•œ ๊ตฌ์กฐ์  ๋ผˆ๋Œ€์ด์ž ์กฐ์งํ™” ๋ฐฉ๋ฒ•๋ก ์ด๋‹ค [1, 2]. ๊ธฐ์กด์˜ ๊ธฐ์ˆ ์  ํŒŒ์ผ ๋‹จ์œ„ ๋ถ„๋ฆฌ์—์„œ ๋ฒ—์–ด๋‚˜, ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ๊ณผ ๊ธฐ๋Šฅ(Feature-Based)์„ ์ค‘์‹ฌ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๊ตฌ์„ฑํ•˜์—ฌ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ณ  ์‘์ง‘๋„๋ฅผ ๋†’์ด๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•œ๋‹ค [3-5]. ์ด๋ฅผ ํ†ตํ•ด ๋ฌด๋ถ„๋ณ„ํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์˜ UI ๋ˆ„์ˆ˜๋ฅผ ๋ง‰๊ณ  ๋ช…ํ™•ํ•œ ์ƒํƒœ ์†Œ์œ ๊ถŒ์„ ํ™•๋ฆฝํ•˜๋ฉฐ, ํŒ€๊ณผ ์ฝ”๋“œ๋ฒ ์ด์Šค๊ฐ€ ์„ฑ์žฅํ•จ์— ๋”ฐ๋ผ ์‹œ์Šคํ…œ์ด ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š”๋‹ค [6-8]. + +## ๐Ÿ“– Core Content + +* **ํด๋” ๊ตฌ์กฐ์™€ ๋ชจ๋“ˆํ™”์˜ ์ง„ํ™”**: ๊ณผ๊ฑฐ์—๋Š” ์ปดํฌ๋„ŒํŠธ, ํ›…, ์Šคํƒ€์ผ ๋“ฑ์„ ํŒŒ์ผ ์œ ํ˜•๋ณ„๋กœ ๊ทธ๋ฃนํ™”ํ–ˆ์œผ๋‚˜, ํ”„๋กœ์ ํŠธ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ๋…ผ๋ฆฌ์  ๊ธฐ๋Šฅ์ด ํŒŒํŽธํ™”๋˜์–ด ํƒ์ƒ‰๊ณผ ํ™•์žฅ์ด ์–ด๋ ค์› ๋‹ค [4, 9]. 2025๋…„ ๊ธฐ์ค€ ํ”„๋ก ํŠธ์—”๋“œ ์—…๊ณ„ ํ‘œ์ค€์€ ๋น„์ฆˆ๋‹ˆ์Šค ๊ธฐ๋Šฅ์„ ์ค‘์‹ฌ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๋ฌถ๋Š” '๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜(Feature-Based)' ๊ตฌ์กฐ๋กœ ์ „ํ™˜๋˜์—ˆ๋‹ค [5, 10]. ํŠน์ • ๊ธฐ๋Šฅ๊ณผ ๊ด€๋ จ๋œ ์ปดํฌ๋„ŒํŠธ, ํ›…, API ๋กœ์ง ๋“ฑ์„ ๋‹จ์ผ ๋””๋ ‰ํ† ๋ฆฌ์— ์บก์Аํ™”ํ•จ์œผ๋กœ์จ ๋ชจ๋“ˆ์˜ ๋…๋ฆฝ์„ฑ๊ณผ ํ™•์žฅ์„ฑ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚จ๋‹ค [11, 12]. +* **๊ธฐ๋Šฅ ๋ถ„ํ•  ์„ค๊ณ„ (Feature-Sliced Design, FSD)**: FSD๋Š” ๋„๋ฉ”์ธ ์ฃผ๋„ ์„ค๊ณ„(DDD)์™€ ๋ชจ๋“ˆํ˜• ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ฒฐํ•ฉํ•œ ํ”„๋ก ํŠธ์—”๋“œ ์ „์šฉ ๋ฐฉ๋ฒ•๋ก ์ด๋‹ค [3, 13]. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ `app`, `pages`, `widgets`, `features`, `entities`, `shared`์˜ ๊ณ„์ธต(Layer)์œผ๋กœ ๋‚˜๋ˆ„๊ณ , ์ƒ์œ„ ๊ณ„์ธต์€ ํ•˜์œ„ ๊ณ„์ธต์—๋งŒ ์˜์กดํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์—„๊ฒฉํ•œ '๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ' ๊ทœ์น™์„ ๊ฐ•์ œํ•œ๋‹ค [11, 14, 15]. ๊ฐ ์Šฌ๋ผ์ด์Šค๋Š” `index.ts` ํ˜•ํƒœ์˜ 'Public API'๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์™ธ๋ถ€์— ๊ธฐ๋Šฅ๊ณผ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋…ธ์ถœํ•˜์—ฌ ๋‚ด๋ถ€ ๊ตฌํ˜„์„ ์•ˆ์ „ํ•˜๊ฒŒ ์บก์Аํ™”ํ•œ๋‹ค [16-18]. +* **์ƒํƒœ ๊ด€๋ฆฌ ์•„ํ‚คํ…์ฒ˜์˜ ์„ธ๋ถ„ํ™”**: ๋‹จ์ผ ๋ชจ๋†€๋ฆฌ์‹ ์Šคํ† ์–ด(์˜ˆ: ๋Œ€๊ทœ๋ชจ Redux)์— ์˜์กดํ•˜๋˜ ๋ฐฉ์‹์—์„œ ๋ฒ—์–ด๋‚˜, ๋ฐ์ดํ„ฐ์˜ ์„ฑ๊ฒฉ์— ๋”ฐ๋ผ ์ตœ์ ์˜ ๋„๊ตฌ๋ฅผ ์„ ํƒํ•˜๋„๋ก ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ํŒŒํŽธํ™”๋˜์—ˆ๋‹ค [19, 20]. ์„œ๋ฒ„์—์„œ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐ์ดํ„ฐ์ธ '์„œ๋ฒ„ ์ƒํƒœ'๋Š” TanStack Query(React Query)๋ฅผ ์ด์šฉํ•ด ์บ์‹ฑ ๋ฐ ๋„คํŠธ์›Œํฌ ๋กœ์ง์„ ๊ฒฉ๋ฆฌํ•˜๊ณ , ํ…Œ๋งˆ๋‚˜ ์„ค์ • ๋“ฑ ์ •์ ์ธ '์ „์—ญ ์ƒํƒœ'๋Š” Context API๋กœ, ์žฅ๋ฐ”๊ตฌ๋‹ˆ๋‚˜ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ์ฒ˜๋Ÿผ ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ณ€ํ•˜๋Š” ์ƒํƒœ๋Š” Zustand๋‚˜ Jotai ๋“ฑ ์„ ํƒ์  ๋ Œ๋”๋ง์„ ์ง€์›ํ•˜๋Š” ๋„๊ตฌ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค [20-24]. +* **์†Œํ”„ํŠธ์›จ์–ด ๊ณตํ•™ ์›์น™์˜ ์ ์šฉ (SOLID & Clean Code)**: React์˜ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ ๊ฐœ๋ฐœ์—๋„ ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)์„ ์ ์šฉํ•˜์—ฌ, ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ปค์ง€๋ฉด ์ƒํƒœ ๊ด€๋ฆฌ, ๋ฐ์ดํ„ฐ ํŽ˜์นญ, ๋ Œ๋”๋ง ๋“ฑ ๊ฐ๊ธฐ ๋‹ค๋ฅธ ์ฑ…์ž„์„ ๊ฐ€์ง„ ์ž‘์€ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ถ„๋ฆฌํ•ด์•ผ ํ•œ๋‹ค [25, 26]. ์ค‘๋ณต์„ ํ”ผํ•˜๋Š” DRY ์›์น™์„ ํ†ตํ•ด ๊ณตํ†ต ๋กœ์ง์„ ์ปค์Šคํ…€ ํ›…์œผ๋กœ ์ถ”์ถœํ•˜๋ฉด์„œ๋„, ์ฝ”๋“œ๋ฅผ ๋‹จ์ˆœํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋Š” KISS ์›์น™๊ณผ ๋ฏธ๋ž˜๋ฅผ ์œ„ํ•œ ๊ณผ๋„ํ•œ ์ตœ์ ํ™”๋ฅผ ํ”ผํ•˜๋Š” YAGNI ์›์น™ ๊ฐ„์˜ ๊ท ํ˜•์„ ๋งž์ถ”๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ด๋‹ค [27, 28]. +* **๋ช…๋ช… ๊ทœ์น™๊ณผ ๊ฑฐ๋ฒ„๋„Œ์Šค ๋„๊ตฌ**: ํด๋”์™€ ํŒŒ์ผ ์‹œ์Šคํ…œ์€ OS ํ™˜๊ฒฝ์— ๋”ฐ๋ฅธ ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด `kebab-case`๋ฅผ, React ์ปดํฌ๋„ŒํŠธ๋Š” `PascalCase`๋ฅผ, ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜๋Š” `camelCase`๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ณดํŽธ์ ์ธ ์ปจ๋ฒค์…˜์ด๋‹ค [29-33]. ์ด๋Ÿฌํ•œ ๊ทœ์น™๊ณผ ์•„ํ‚คํ…์ฒ˜ ์˜์กด์„ฑ ๊ฒฝ๊ณ„๋Š” ESLint๋‚˜ Prettier, Husky์™€ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•ด ๋นŒ๋“œ ํƒ€์ž„ ๋ฐ ์ปค๋ฐ‹ ๋‹จ๊ณ„์—์„œ ์ž๋™์œผ๋กœ ๊ฐ•์ œ(Linting)๋œ๋‹ค [30, 34]. + +## โš–๏ธ Trade-offs & Caveats + +* **FSD ๋ฐ ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ๋ชจ๋“ˆํ™”์˜ ๋ณต์žก์„ฑ ์˜ค๋ฒ„ํ—ค๋“œ**: Feature-Sliced Design์€ ๊ตฌ์กฐ์  ์•ˆ์ •์„ฑ์„ ์ œ๊ณตํ•˜์ง€๋งŒ "๋ฌด์—‡์ด ํ•˜๋‚˜์˜ ๊ธฐ๋Šฅ(Feature)์ธ๊ฐ€?"๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒฝ๊ณ„๋ฅผ ์„ค์ •ํ•˜๊ธฐ ๋งค์šฐ ๊นŒ๋‹ค๋กญ๋‹ค๋Š” ๊ทผ๋ณธ์  ์–ด๋ ค์›€์ด ์žˆ๋‹ค [35]. ์ธ์ฆ(Auth)๊ณผ ๊ฐ™์€ ๊ต์ฐจ ๊ด€์‹ฌ์‚ฌ(Cross-cutting concern)๋Š” ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ์— ๊ฑธ์ณ ์žˆ์–ด ์ ์ ˆํ•œ ๊ณ„์ธต์„ ์ฐพ๊ธฐ ๋ชจํ˜ธํ•˜๋ฉฐ [35, 36], ์—„๊ฒฉํ•œ ๋ถ„ํ•  ๊ทœ์น™์„ ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์— ๋„์ž…ํ•˜๋ฉด ์˜คํžˆ๋ ค ๋ถˆํ•„์š”ํ•œ ํด๋” ๊ตฌ์กฐ์™€ ์˜ค๋ฒ„์—”์ง€๋‹ˆ์–ด๋ง์œผ๋กœ ์ธํ•œ ๊ฐœ๋ฐœ ์†๋„ ์ €ํ•˜๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ๋‹ค [12, 37]. ๋˜ํ•œ, ๊ทœ์น™์„ ์ œ๋Œ€๋กœ ์ˆ™์ง€ํ•˜์ง€ ์•Š์œผ๋ฉด ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ 'Shared' ๊ณ„์ธต์— ์Ÿ์•„๋ถ€์–ด ์ตœ์•…์˜ ํŒŒ๊ธ‰ ํšจ๊ณผ๋ฅผ ๋‚ณ๋Š” ์ŠคํŒŒ๊ฒŒํ‹ฐ ์ฝ”๋“œ๊ฐ€ ๋  ์œ„ํ—˜์ด ์กด์žฌํ•œ๋‹ค [38, 39]. +* **์ถ”์ƒํ™”(DRY)์™€ ๋‹จ์ˆœํ•จ(KISS)์˜ ์ƒ์ถฉ**: DRY ์›์น™์— ์ง‘์ฐฉํ•˜์—ฌ ์ฝ”๋“œ ์ค‘๋ณต์„ ๋ฌด์กฐ๊ฑด ํ”ผํ•˜๋ ค๊ณ  ํ•˜๋ฉด, ์ˆ˜๋งŽ์€ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ์™€ ๋ถ„๊ธฐ๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฑฐ๋Œ€ํ•˜๊ณ  ๋ณต์žกํ•œ ์ปค์Šคํ…€ ํ›…์ด๋‚˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํƒ„์ƒํ•˜๊ฒŒ ๋œ๋‹ค [27]. ์ด๋Ÿฌํ•œ ๊ณผ๋„ํ•œ ์ถ”์ƒํ™”๋Š” ๋‹จ์ˆœํ•œ ์ฝ”๋“œ ๋ฐ˜๋ณต๋ณด๋‹ค ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋–จ์–ด๋œจ๋ ค KISS ์›์น™์„ ์œ„๋ฐ˜ํ•˜๋Š” ๋ฐ˜๋Œ€ ๊ธ‰๋ถ€๋ฅผ ๋‚ณ์œผ๋ฏ€๋กœ, ๋ช…ํ™•ํ•œ ํŒจํ„ด์ด 3๋ฒˆ ์ด์ƒ ๋ฐ˜๋ณต๋  ๋•Œ๊นŒ์ง€๋Š” ์ถ”์ƒํ™”๋ฅผ ๋ฏธ๋ฃจ๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋œ๋‹ค [27, 40, 41]. +* **์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ ์„ ํƒ์— ๋”ฐ๋ฅธ ๋ถ€์ž‘์šฉ**: React ๋‚ด์žฅ Context API๋Š” ์™ธ๋ถ€ ์˜์กด์„ฑ ์—†์ด ์ƒํƒœ๋ฅผ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ƒํƒœ๊ฐ’์˜ ์ผ๋ถ€๋งŒ ๋ณ€๊ฒฝ๋˜์–ด๋„ ํ•ด๋‹น ์ปจํ…์ŠคํŠธ๋ฅผ ๊ตฌ๋…ํ•˜๋Š” ๋ชจ๋“  ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ฐ•์ œ๋กœ ๋ฆฌ๋ Œ๋”๋ง๋œ๋‹ค๋Š” ์น˜๋ช…์ ์ธ ์„ฑ๋Šฅ ์ œ์•ฝ์ด ์žˆ๋‹ค [42, 43]. ๋ฐ˜๋Œ€๋กœ Redux๋Š” ๋ช…ํ™•ํ•œ ๊ตฌ์กฐ์™€ ๊ฐ•๋ ฅํ•œ ๋””๋ฒ„๊น… ํˆด์„ ์ œ๊ณตํ•˜์ง€๋งŒ, ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ์˜ ํญ๋ฐœ์  ์ฆ๊ฐ€๋ฅผ ๋™๋ฐ˜ํ•˜์—ฌ ์†Œ๊ทœ๋ชจ ํŒ€์ด๋‚˜ ๊ฐ„๋‹จํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ๊ณผ๋„ํ•œ ๊ธฐ์ˆ  ๋ถ€์ฑ„๋กœ ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๋‹ค [44, 45]. +* **์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์˜ ์ˆจ์€ ๋น„์šฉ**: `React.memo`, `useMemo`, `useCallback`์€ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ง‰์•„์ฃผ์ง€๋งŒ ๊ทธ ์ž์ฒด๊ฐ€ ๊ณต์งœ๋Š” ์•„๋‹ˆ๋‹ค [46]. ์ด์ „ Props๋‚˜ ์˜์กด์„ฑ ๋ฐฐ์—ด์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜๊ณ  ๋ณ€๊ฒฝ ์—ฌ๋ถ€๋ฅผ ์–•์€ ๋น„๊ต(Shallow compare)ํ•˜๋Š” ์—ฐ์‚ฐ ๋น„์šฉ์ด ์ถ”๊ฐ€๋œ๋‹ค [46]. ๋งŒ์•ฝ ๋ Œ๋”๋ง ๋น„์šฉ์ด ๋งค์šฐ ์‹ผ ์ปดํฌ๋„ŒํŠธ์— ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋ถˆ์•ˆ์ •ํ•œ ์ฐธ์กฐ๊ฐ’(์ธ๋ผ์ธ ํ•จ์ˆ˜, ๊ฐ์ฒด)์„ ์ง€์†์ ์œผ๋กœ ์ „๋‹ฌํ•˜์—ฌ ๋ฆฌ๋ Œ๋”๋ง ์ฐจ๋‹จ์— ์‹คํŒจํ•œ๋‹ค๋ฉด, ์ตœ์ ํ™” ์ฝ”๋“œ ์ž์ฒด๊ฐ€ ์˜คํžˆ๋ ค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋” ๋А๋ฆฌ๊ฒŒ ๋งŒ๋“œ๋Š” ๋ถ€์ž‘์šฉ์ด ๋ฐœ์ƒํ•œ๋‹ค [46, 47]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [์•„ํ‚คํ…์ฒ˜ ๋ฐ ๋””์ž์ธ ํŒจํ„ด] +- [[Feature-Sliced Design]] + - ์—ฐ๊ฒฐ ์ด์œ : ํ˜„๋Œ€ React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ชจ๋“ˆํ™” ๋ฐ ๊ณ„์ธตํ™”๋ฅผ ์œ„ํ•ด ๊ณ ์•ˆ๋œ ๊ฐ€์žฅ ๋Œ€ํ‘œ์ ์ด๊ณ  ๊ตฌ์ฒด์ ์ธ ํ”„๋ก ํŠธ์—”๋“œ ์•„ํ‚คํ…์ฒ˜ ๋ฐฉ๋ฒ•๋ก ์ด๊ธฐ ๋•Œ๋ฌธ [3, 13]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋„๋ฉ”์ธ ๊ธฐ๋ฐ˜ ๋ถ„ํ• , ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ๊ทœ์น™ ์ ์šฉ ๋ฐฉ๋ฒ•, ๊ทธ๋ฆฌ๊ณ  Public API๋ฅผ ํ†ตํ•œ ์ปดํฌ๋„ŒํŠธ์˜ ์บก์Аํ™” ์›๋ฆฌ [14, 16, 17]. +- [[SOLID Principles]] + - ์—ฐ๊ฒฐ ์ด์œ : ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ํ”„๋ก ํŠธ์—”๋“œ ๊ตฌ์กฐ๋ฅผ ์งœ๊ธฐ ์œ„ํ•ด ํด๋ž˜์Šค ๊ธฐ๋ฐ˜ OOP๋ฅผ ๋„˜์–ด React์˜ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—๋„ ์ ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ทผ๋ณธ์ ์ธ ์†Œํ”„ํŠธ์›จ์–ด ์„ค๊ณ„ ์›์น™์ด๊ธฐ ๋•Œ๋ฌธ [17, 48]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)์„ ์ด์šฉํ•œ ๋น„๋Œ€ํ•ด์ง„ ์ปดํฌ๋„ŒํŠธ์˜ ๋ฆฌํŒฉํ† ๋ง ๋ฐฉ์‹ ๋ฐ ๊ฐœ๋ฐฉ-ํ์‡„ ์›์น™(OCP)์„ ํ™œ์šฉํ•œ UI ์ปดํฌ๋„ŒํŠธ ํ•ฉ์„ฑ(Composition) ์ „๋žต [25, 49]. + +#### [์ƒํƒœ ๊ด€๋ฆฌ ๋ฐ ์ตœ์ ํ™” ์ „๋žต] +- [[State Management]] + - ์—ฐ๊ฒฐ ์ด์œ : ์•„ํ‚คํ…์ฒ˜ ๋‚ด์—์„œ ๋ฐ์ดํ„ฐ(์„œ๋ฒ„ ๋ฐ์ดํ„ฐ, ๋กœ์ปฌ ์ƒํƒœ, ์ „์—ญ UI ์ƒํƒœ)์˜ ์„ฑ๊ฒฉ์— ๋”ฐ๋ผ ์ฑ…์ž„๊ณผ ์ €์žฅ์†Œ๋ฅผ ์–ด๋–ป๊ฒŒ ๋‚˜๋ˆŒ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ํ•ต์‹ฌ ๋ถ„์•ผ์ด๊ธฐ ๋•Œ๋ฌธ [20, 50]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Context API์˜ ๋ Œ๋”๋ง ํ•œ๊ณ„๋ฅผ ๋ŒํŒŒํ•˜๊ธฐ ์œ„ํ•œ Zustand/Jotai์˜ Selector ํŒจํ„ด ์ž‘๋™ ์›๋ฆฌ ๋ฐ TanStack Query๋ฅผ ํ™œ์šฉํ•œ ์„œ๋ฒ„ ์ƒํƒœ ๊ฒฉ๋ฆฌ ๊ธฐ๋ฒ• [21, 43, 51]. +- [[Performance Optimization]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋Œ€๊ทœ๋ชจ ์•„ํ‚คํ…์ฒ˜๊ฐ€ ์‹ค์ œ๋กœ ์‚ฌ์šฉ์ž ๋ธŒ๋ผ์šฐ์ €์—์„œ ํšจ์œจ์ ์œผ๋กœ ๋™์ž‘ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์ˆ˜์ ์œผ๋กœ ์ˆ˜๋ฐ˜๋˜์–ด์•ผ ํ•˜๋Š” ์„ฑ๋Šฅ ์ง€ํ‘œ(Web Vitals) ๊ด€๋ฆฌ ๋ฐฉ๋ฒ•์ด๊ธฐ ๋•Œ๋ฌธ [52, 53]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ง€์—ฐ ๋กœ๋”ฉ(Lazy Loading) ๋ฐ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…์„ ํ†ตํ•œ ์ดˆ๊ธฐ ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ ์ตœ์ ํ™”, ๊ทธ๋ฆฌ๊ณ  ๋™์‹œ์„ฑ ๋ Œ๋”๋ง(Concurrent Rendering) ํ›…์˜ ํ™œ์šฉ๋ฒ• [54-56]. + +### Deeper Research Questions +- Feature-Sliced Design(FSD)์—์„œ ์ธ์ฆ(Auth)์ด๋‚˜ ๋ถ„์„(Analytics) ๊ฐ™์€ ๋„๋ฉ”์ธ ๊ฐ„์˜ ๊ต์ฐจ ๊ด€์‹ฌ์‚ฌ(Cross-cutting concerns)๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ, ๊ฒฐํ•ฉ๋„๋ฅผ ๋†’์ด์ง€ ์•Š๊ณ  ์ฃผ์ž…/๊ณต์œ ํ•˜๋Š” ๊ฐ€์žฅ ์ด์ƒ์ ์ธ ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? +- React Compiler๊ฐ€ ํ”„๋กœ์ ํŠธ์— ์„ฑ๊ณต์ ์œผ๋กœ ๋„์ž…๋˜์–ด ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๋กœ์ง(`useMemo`, `useCallback`)์ด ๋Œ€๊ฑฐ ์‚ญ์ œ๋  ๋•Œ, ํ”„๋ก ํŠธ์—”๋“œ ํด๋” ๊ตฌ์กฐ์™€ ์ฝ”๋“œ ์‘์ง‘๋„์— ์–ด๋–ค ํ˜•ํƒœ์˜ ๊ตฌ์กฐ์  ๋ณ€ํ™”๊ฐ€ ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- ์„œ๋ฒ„ ์ƒํƒœ(Server State) ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํด๋ผ์ด์–ธํŠธ ๊ธ€๋กœ๋ฒŒ ์ƒํƒœ(Client State) ๋„๊ตฌ๋ฅผ ์™„๋ฒฝํžˆ ๋ถ„๋ฆฌํ•œ ์•„ํ‚คํ…์ฒ˜์—์„œ, ๋‘ ์ƒํƒœ๊ฐ€ ๋ถˆ๊ฐ€ํ”ผํ•˜๊ฒŒ ๋™๊ธฐํ™”๋˜๊ฑฐ๋‚˜ ์ƒํ˜ธ์ž‘์šฉํ•ด์•ผ ํ•˜๋Š” ์—ฃ์ง€ ์ผ€์ด์Šค๋ฅผ ๊นจ๋—ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š” ํŒจํ„ด์€ ๋ฌด์—‡์ธ๊ฐ€? +- ๋Œ€๊ทœ๋ชจ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ํ™˜๊ฒฝ์—์„œ Micro-Frontends ์•„ํ‚คํ…์ฒ˜์™€ Feature-Sliced Design์€ ์–ด๋–ป๊ฒŒ ํ˜ธํ™˜๋˜๋ฉฐ, ๊ฐ ๋…๋ฆฝ ์„œ๋น„์Šค ๊ฐ„์˜ ์ค‘๋ณต ์ฝ”๋“œ(Shared ๋ ˆ์ด์–ด) ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ํ†ต์ œํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- ๋ณต์žก๋„ ๋†’์€ ์ˆœ์ˆ˜ ํ•จ์ˆ˜ํ˜• React ์ปดํฌ๋„ŒํŠธ์— ์˜์กด์„ฑ ์—ญ์ „ ์›์น™(DIP)์„ ์ ์šฉํ•  ๋•Œ, ์ปจํ…์ŠคํŠธ(Context API)๋‚˜ ํ”„๋กญ ๋“œ๋ฆด๋ง(Prop Drilling)์„ ํ”ผํ•˜๋ฉด์„œ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ˜„๋Œ€์ ์ธ ์ œ์–ด ์—ญ์ „(IoC) ๊ตฌํ˜„ ํŒจํ„ด์€ ๋ฌด์—‡์ด ์žˆ๋Š”๊ฐ€? + +### Practical Application Contexts + +- **Implementation:** ๊ธฐ์ˆ ์  ํŒŒ์ผ ์œ ํ˜•(์ปดํฌ๋„ŒํŠธ, ํ›…) ์ค‘์‹ฌ์˜ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ์—์„œ ๋ฒ—์–ด๋‚˜, `src/features/` ๋‚ด์— ํŠน์ • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง(์˜ˆ: ์žฅ๋ฐ”๊ตฌ๋‹ˆ, ์œ ์ € ํ”„๋กœํ•„)์— ์—ฐ๊ด€๋œ UI, API ํ†ต์‹ , ๋กœ์ปฌ ํ›…์„ ์บก์Аํ™”ํ•˜์—ฌ ๊ตฌํ˜„ํ•œ๋‹ค [5, 11, 57]. +- **System Design:** ๋ชจ๋†€๋ฆฌ์‹ ๊ธ€๋กœ๋ฒŒ ์Šคํ† ์–ด ์„ค๊ณ„ ์ง€์–‘. API ์บ์‹ฑ ๋ฐ ์„œ๋ฒ„ ๋ฐ์ดํ„ฐ๋Š” TanStack Query๋ฅผ ์‚ฌ์šฉํ•ด ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๊ฒฝ๊ณ„๋กœ ๋ถ„๋ฆฌํ•˜๊ณ , ๋‹คํฌ ๋ชจ๋“œ ๊ฐ™์€ ์•ฑ ์„ค์ •์€ Context API๋กœ, ์‹ค์‹œ๊ฐ„ UI ์ƒํƒœ ๋ณ€๊ฒฝ์€ Zustand ๋“ฑ์œผ๋กœ ์ชผ๊ฐœ์–ด ์‹œ์Šคํ…œ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ์ตœ์ ํ™”ํ•œ๋‹ค [20, 21, 24]. +- **Operation / Maintenance:** ๋Ÿฐํƒ€์ž„ ํฌ๋ž˜์‹œ์— ๋Œ€๋น„ํ•˜๊ธฐ ์œ„ํ•ด Error Boundary ์ปดํฌ๋„ŒํŠธ๋ฅผ ์•ฑ์˜ ์ตœ์ƒ๋‹จ๋ฟ ์•„๋‹ˆ๋ผ ๋ถˆ์•ˆ์ •ํ•œ ์„œ๋“œํŒŒํ‹ฐ ์œ„์ ฏ์ด๋‚˜ ๊ฐœ๋ณ„ ๋ผ์šฐํŠธ ๋‹จ์œ„์— ๊ฐ์‹ธ, ํŠน์ • ๋ชจ๋“ˆ์˜ ์—๋Ÿฌ๊ฐ€ ์•ฑ ์ „์ฒด์˜ "ํ™”์ดํŠธ ์Šคํฌ๋ฆฐ" ์žฅ์• ๋กœ ๋ฒˆ์ง€๋Š” ๊ฒƒ์„ ์ฐจ๋‹จํ•œ๋‹ค [58-60]. +- **Learning Path:** React ๊ธฐ์ดˆ ๋ฌธ๋ฒ• ๋ฐ ๋ Œ๋”๋ง ์›๋ฆฌ ํŒŒ์•… -> ์ปดํฌ๋„ŒํŠธ ์žฌ์‚ฌ์šฉ๊ณผ SRP ์›์น™(SOLID) ํ•™์Šต -> ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ํด๋” ๊ตฌ์กฐ ๋ฐ FSD ์ ์šฉ ๋ฐฉ์‹ ์ดํ•ด -> ๋ฒˆ๋“ค ์ตœ์ ํ™” ๋ฐ ๋ Œ๋”๋ง ๋ฆฌํŒฉํ† ๋ง ์Šคํ‚ฌ ํ–ฅ์ƒ์˜ ํ๋ฆ„์œผ๋กœ ์—ญ๋Ÿ‰์„ ๋ฐœ์ „์‹œํ‚จ๋‹ค [6, 17, 25]. +- **My Project Relevance:** ๊ธฐ์กด ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ `components/` ํด๋”์— ์ˆ˜์‹ญ ๊ฐœ์˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฐฉ์น˜๋˜์–ด ์žˆ๊ฑฐ๋‚˜, `useCallback` ๋“ฑ์ด ๊ณผ๋„ํ•˜๊ฒŒ ์‚ฌ์šฉ๋œ ๊ฒฝ์šฐ, ์ด๋ฅผ ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ ๋‹จ์œ„์˜ ํด๋”๋กœ ์žฌ๋ฐฐ์น˜ํ•˜๊ณ  ํ”„๋กœํŒŒ์ผ๋Ÿฌ(Profiler)๋ฅผ ํ†ตํ•ด ์‹ค์ œ ๋ณ‘๋ชฉ ์ง€์ ์„ ์ธก์ •ํ•œ ๋’ค ์ตœ์ ํ™”๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜ ๋ฆฌํŒฉํ† ๋ง์— ์ง๊ฒฐ๋œ๋‹ค [12, 61, 62]. + +### Adjacent Topics + +- [[Micro-Frontends]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋‹จ์ผ React SPA ์•„ํ‚คํ…์ฒ˜์˜ ํ•œ๊ณ„๋ฅผ ๋„˜์–ด, ๋…๋ฆฝ์ ์œผ๋กœ ๋ฐฐํฌ ๋ฐ ๊ด€๋ฆฌ ๊ฐ€๋Šฅํ•œ ์—ฌ๋Ÿฌ ํ”„๋ก ํŠธ์—”๋“œ ํŒ€๊ณผ ์„œ๋น„์Šค๋ฅผ ํ•˜๋‚˜๋กœ ์กฐ์œจํ•˜๋Š” ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ๊ธ‰ ์ธํ”„๋ผ ํ™•์žฅ ๊ด€์ ์œผ๋กœ ์—ฐ๊ฒฐ [3, 63]. +- [[Observability and Monitoring]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ์„ค๊ณ„ํ•œ ์•„ํ‚คํ…์ฒ˜๊ฐ€ ์‹ค์ œ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๊ณ  ์–ด๋””์„œ ๋ณ‘๋ชฉ์„ ์ผ์œผํ‚ค๋Š”์ง€ ์ธก์ •ํ•˜๊ธฐ ์œ„ํ•œ ๊ตฌ์กฐ์  ๋กœ๊น…, ์„ฑ๋Šฅ ํ”„๋กœํŒŒ์ผ๋ง(Web Vitals), ๊ทธ๋ฆฌ๊ณ  Sentry๋ฅผ ํ™œ์šฉํ•œ ์„ธ์…˜ ๋ชจ๋‹ˆํ„ฐ๋ง ๊ธฐ๋ฒ•์œผ๋กœ ํ™•์žฅ [64-66]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Topics_GD/React Scalability.md b/10_Wiki/Topics_GD/React Scalability.md new file mode 100644 index 00000000..6bd3e18d --- /dev/null +++ b/10_Wiki/Topics_GD/React Scalability.md @@ -0,0 +1,67 @@ +# [[React Scalability]] + +## ๐Ÿ“Œ Brief Summary +React Scalability(React ํ™•์žฅ์„ฑ)๋Š” ๊ธฐ๋Šฅ, ํŒ€ ๊ทœ๋ชจ, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์˜ ๋ณต์žก์„ฑ์ด ์ฆ๊ฐ€ํ•จ์— ๋”ฐ๋ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ, ์œ ์ง€๋ณด์ˆ˜์„ฑ, ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ์„ฑ์žฅ์„ ์œ ์ง€ํ•˜๋Š” ๋Šฅ๋ ฅ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋‹จ์ˆœํžˆ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ๊ฒƒ์„ ๋„˜์–ด, ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ณ  ์‘์ง‘๋„๋ฅผ ๋†’์ด๋Š” ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„, ์ƒํƒœ ๊ด€๋ฆฌ์˜ ์ตœ์ ํ™”, ๊ทธ๋ฆฌ๊ณ  ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…๊ณผ ๋ Œ๋”๋ง ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ํฌ๊ด„ํ•ฉ๋‹ˆ๋‹ค. ํ™•์žฅ ๊ฐ€๋Šฅํ•œ React ์‹œ์Šคํ…œ์€ ๋ช…ํ™•ํ•œ ํด๋” ๊ตฌ์กฐ(์˜ˆ: Feature-Sliced Design)์™€ ์—„๊ฒฉํ•œ ๊ด€์‹ฌ์‚ฌ ๋ถ„๋ฆฌ๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ๋ฒ ์ด์Šค๊ฐ€ ์ž์ฒด์ ์ธ ๋ฌด๊ฒŒ๋กœ ์ธํ•ด ๋ถ•๊ดด๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. [1-4] + +## ๐Ÿ“– Core Content +- **์•„ํ‚คํ…์ฒ˜ ๋ฐ ํด๋” ๊ตฌ์กฐ์˜ ์ง„ํ™”:** React๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ฐ•์ œํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ํ”„๋กœ์ ํŠธ๊ฐ€ ์ปค์ง€๋ฉด ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด UI์— ์Šค๋ฉฐ๋“ค๊ณ  ์˜์กด์„ฑ์ด ์—‰ํ‚ค๋Š” ์•„ํ‚คํ…์ฒ˜ ๋ถ•๊ดด๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค [2]. ๊ณผ๊ฑฐ์˜ ํŒŒ์ผ ์œ ํ˜•๋ณ„ ํด๋” ๊ตฌ์กฐ(components, hooks, styles ๋“ฑ)๋Š” ๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค [5, 6]. ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•ด์„œ๋Š” ๋„๋ฉ”์ธ/๊ธฐ๋Šฅ ์ค‘์‹ฌ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” Feature-Based ๊ตฌ์กฐ ๋˜๋Š” **Feature-Sliced Design(FSD)**๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•๋ก ์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค. FSD๋Š” ์•ฑ์„ layers(app, pages, widgets, features, entities, shared)๋กœ ๋‚˜๋ˆ„๊ณ  ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ๊ทœ์น™๊ณผ ํผ๋ธ”๋ฆญ API ์บก์Аํ™”๋ฅผ ๊ฐ•์ œํ•˜์—ฌ ๋ชจ๋“ˆ์˜ ๋…๋ฆฝ์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค [7-11]. +- **ํด๋ฆฐ ์ฝ”๋“œ์™€ ์†Œํ”„ํŠธ์›จ์–ด ์—”์ง€๋‹ˆ์–ด๋ง ์›์น™:** ๋Œ€๊ทœ๋ชจ React ์‹œ์Šคํ…œ์—์„œ๋Š” SOLID, DRY, KISS, YAGNI์™€ ๊ฐ™์€ ์›์น™์ด ์ ์šฉ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)์— ๋”ฐ๋ผ ๊ฑฐ๋Œ€ํ•œ ์ปดํฌ๋„ŒํŠธ๋Š” ์ž‘๊ณ  ์ง‘์ค‘๋œ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ถ„๋ฆฌ๋˜์–ด์•ผ ํ•˜๋ฉฐ [12], DRY ์›์น™์„ ํ†ตํ•ด ๊ณตํ†ต ๋กœ์ง์€ ์ปค์Šคํ…€ ํ›…์œผ๋กœ ์ถ”์ถœํ•˜์—ฌ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค [13]. ๋”๋ถˆ์–ด ํŒŒ์ผ ๋ฐ ์ปดํฌ๋„ŒํŠธ ๋ช…๋ช… ๊ทœ์น™(์˜ˆ: ํŒŒ์ผ์€ kebab-case, ์ปดํฌ๋„ŒํŠธ๋Š” PascalCase)์„ ์ผ๊ด€๋˜๊ฒŒ ์œ ์ง€ํ•˜๊ณ  ESLint๋ฅผ ํ†ตํ•ด ์•„ํ‚คํ…์ฒ˜ ๊ฒฝ๊ณ„๋ฅผ ๊ฐ•์ œํ•˜๋Š” ๊ฒƒ์ด ๋Œ€๊ทœ๋ชจ ํŒ€ ํ˜‘์—…์— ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค [14, 15]. +- **๊ทœ๋ชจ์— ๋”ฐ๋ฅธ ์ƒํƒœ ๊ด€๋ฆฌ ์ „๋žต:** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ปค์ง€๋ฉด ๋‹จ์ผ ์ „์—ญ ์ƒํƒœ๋งŒ์œผ๋กœ๋Š” ๋ถ€์กฑํ•˜๋ฉฐ ์ƒํƒœ์˜ ์—ญํ• ์— ๋”ฐ๋ผ ๋„๊ตฌ๊ฐ€ ๋ถ„๋ฆฌ๋ฉ๋‹ˆ๋‹ค [16]. React์˜ Context API๋Š” ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ ์ „์ฒด๋ฅผ ๋ฆฌ๋ Œ๋”๋ง์‹œํ‚ค๋ฏ€๋กœ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žฆ์€ ์ƒํƒœ ๊ด€๋ฆฌ์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค [17, 18]. ์ค‘๊ฐ„ ๊ทœ๋ชจ์˜ ์•ฑ์—์„œ๋Š” Selector ํŒจํ„ด์„ ํ†ตํ•ด ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ง‰๋Š” Zustand๊ฐ€ ์œ ์šฉํ•˜๋ฉฐ [19-21], 500๊ฐœ ์ด์ƒ์˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žˆ๋Š” ๋Œ€๊ทœ๋ชจ ์•ฑ์ด๋‚˜ ๋น„๋™๊ธฐ ์ž‘์—…์ด ๋ณต์žกํ•œ ๊ฒฝ์šฐ ์ผ๊ด€๋œ ํŒจํ„ด๊ณผ ๊ฐ•๋ ฅํ•œ ๋””๋ฒ„๊น…์„ ์ œ๊ณตํ•˜๋Š” Redux๊ฐ€ ์‚ฐ์—… ํ‘œ์ค€์œผ๋กœ ์ž‘์šฉํ•ฉ๋‹ˆ๋‹ค [22, 23]. ์„œ๋ฒ„ ์ƒํƒœ ๊ด€๋ฆฌ๋Š” TanStack Query(React Query) ๋“ฑ์œผ๋กœ ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ์™€ ๋ถ„๋ฆฌํ•˜์—ฌ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค [20, 24]. +- **์„ฑ๋Šฅ ์—”์ง€๋‹ˆ์–ด๋ง (Performance Optimization):** ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์•ฑ์€ ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ๊ณผ ๋กœ๋”ฉ ์†๋„ ์ตœ์ ํ™”๊ฐ€ ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค. `React.lazy`์™€ ๋™์  ์ž„ํฌํŠธ(Dynamic Imports)๋ฅผ ํ™œ์šฉํ•œ ๋ผ์šฐํŠธ ๋ฐ ์ปดํฌ๋„ŒํŠธ ๋ ˆ๋ฒจ์˜ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…์€ ์ดˆ๊ธฐ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ํš๊ธฐ์ ์œผ๋กœ ์ค„์—ฌ์ค๋‹ˆ๋‹ค [25-27]. ๋˜ํ•œ Vite์˜ `manualChunks`๋ฅผ ์ด์šฉํ•ด ์ž์ฃผ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” Vendor ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ์บ์‹ฑ ํšจ์œจ์„ ๋†’์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค [28-30]. ๋Ÿฐํƒ€์ž„ ์‹œ์—๋Š” ๋Œ€๊ทœ๋ชจ ๋ฆฌ์ŠคํŠธ๋ฅผ ์œ„ํ•œ Virtualization(๊ฐ€์ƒํ™”) ์ฒ˜๋ฆฌ, ์•ˆ์ •์ ์ธ ์ฐธ์กฐ ์œ ์ง€๋ฅผ ์œ„ํ•œ `useCallback`๊ณผ `useMemo` ์‚ฌ์šฉ, ๊ทธ๋ฆฌ๊ณ  React 18์˜ ๋™์‹œ์„ฑ ๊ธฐ๋Šฅ(`useTransition`, `useDeferredValue`)์„ ํ™œ์šฉํ•ด ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์˜ ์‘๋‹ต์„ฑ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค [31-34]. + +## โš–๏ธ Trade-offs & Caveats +- **์•„ํ‚คํ…์ฒ˜์˜ ์˜ค๋ฒ„ํ—ค๋“œ:** Feature-Sliced Design์ด๋‚˜ ๋„๋ฉ”์ธ ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ๋ฅผ ๋„์ž…ํ•˜๋ฉด ์ปดํฌ๋„ŒํŠธ๊ฐ€ '๊ธฐ๋Šฅ'์ธ์ง€ '์œ„์ ฏ'์ธ์ง€ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•œ ์˜๋ฏธ๋ก ์  ๋…ผ์˜๊ฐ€ ํ•„์š”ํ•ด์ง€๋Š” ๋“ฑ ์ดˆ๊ธฐ ํ•™์Šต ๊ณก์„ ๊ณผ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [35, 36]. ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์ด๋Ÿฌํ•œ ๊ตฌ์กฐ๊ฐ€ ์˜คํžˆ๋ ค ๊ณผ๋„ํ•œ ๋ณต์žก์„ฑ(Overkill)์„ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [37]. +- **๋ฉ”๋ชจ์ด์ œ์ด์…˜์˜ ๋น„์šฉ:** `React.memo`, `useMemo`, `useCallback`์„ ๋‚จ์šฉํ•˜๋ฉด ์˜คํžˆ๋ ค ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. React๊ฐ€ ์ด์ „ props๋ฅผ ์ €์žฅํ•˜๊ณ  ๋น„๊ตํ•˜๋Š” ์ž‘์—…์— ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉฐ, ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง ๋น„์šฉ์ด ๋งค์šฐ ์ž‘์€ ๊ฒฝ์šฐ ์ด ๋น„๊ต ์ž‘์—…์ด ๋ Œ๋”๋ง ์ž์ฒด๋ณด๋‹ค ๋” ๋งŽ์€ ๋น„์šฉ์„ ์†Œ๋ชจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [38, 39]. +- **์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ์˜ ์œ ์—ฐ์„ฑ vs ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ:** Zustand์˜ ๊ทน๋‹จ์ ์ธ ์œ ์—ฐ์„ฑ์€ ๊ทœ์œจ ์—†์ด ์‚ฌ์šฉ๋  ๊ฒฝ์šฐ ํŒ€์›๋งˆ๋‹ค ์„œ๋กœ ๋‹ค๋ฅธ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ํŒจํ„ด์„ ์ž‘์„ฑํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๋“ฑ ํ˜ผ๋ž€์„ ์•ผ๊ธฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [19, 40]. ๋ฐ˜๋ฉด Redux๋Š” ์ดˆ๊ธฐ์— ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š” ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ๊ฐ€ ๋งค์šฐ ๋งŽ์•„ ๊ฐœ๋ฐœ ์†๋„๋ฅผ ๋Šฆ์ถ”์ง€๋งŒ, ๋Œ€๊ทœ๋ชจ ํŒ€์—์„œ๋Š” ์˜คํžˆ๋ ค ์ด ๊ตฌ์กฐ๊ฐ€ ๋ฒ„๊ทธ๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ๊ธฐ๋Šฅ์œผ๋กœ ์ž‘์šฉํ•ฉ๋‹ˆ๋‹ค [22, 41]. +- **React Compiler์™€ ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ˜ธํ™˜์„ฑ:** React Compiler๋ฅผ ๋„์ž…ํ•˜๋ฉด ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์˜ ํ•„์š”์„ฑ์„ ํฌ๊ฒŒ ์ค„์ผ ์ˆ˜ ์žˆ์ง€๋งŒ, `useMutation`์ด๋‚˜ `useLocation`์ฒ˜๋Ÿผ ๋ Œ๋”๋ง ์‹œ๋งˆ๋‹ค ์˜๋„์ ์œผ๋กœ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ›…๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์บ์‹ฑ ์ฒด์ธ์ด ๋Š์–ด์ง€๊ณ  ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•˜๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค [42, 43]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] +- [[Feature-Sliced Design]] + - ์—ฐ๊ฒฐ ์ด์œ : React์˜ ํ•œ๊ณ„์ธ ๊ตฌ์ฒด์ ์ธ ์•„ํ‚คํ…์ฒ˜ ๋ถ€์žฌ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์„ค๊ณ„๋œ ๋Œ€๊ทœ๋ชจ ํ”„๋ก ํŠธ์—”๋“œ ๋ฐฉ๋ฒ•๋ก ์ž…๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ ˆ์ด์–ด(Layer) ๊ฐ„์˜ ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ์›์น™๊ณผ Public API๋ฅผ ํ™œ์šฉํ•œ ๋ชจ๋“ˆ์˜ ์บก์Аํ™” ๋ฐ ๊ฒฐํ•ฉ๋„ ์ตœ์†Œํ™” ๋ฐฉ๋ฒ•. +- [[SOLID Principles]] + - ์—ฐ๊ฒฐ ์ด์œ : ํ™•์žฅ ๊ฐ€๋Šฅํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฌ์šด React ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•œ ํ•ต์‹ฌ ์†Œํ”„ํŠธ์›จ์–ด ์—”์ง€๋‹ˆ์–ด๋ง ์›์น™์ž…๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ฑฐ๋Œ€ํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)์— ๋”ฐ๋ผ ์ž‘์€ ๊ธฐ๋Šฅ์œผ๋กœ ๋ถ„๋ฆฌํ•˜๊ณ , ์ปค์Šคํ…€ ํ›…์„ ํ™œ์šฉํ•˜์—ฌ ๋กœ์ง์„ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ตฌ์กฐ์  ์‚ฌ๊ณ . + +#### [๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ] +- [[State Management Libraries (Redux, Zustand, Context API)]] + - ์—ฐ๊ฒฐ ์ด์œ : ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํฌ๊ธฐ์™€ ์ƒํƒœ ์—…๋ฐ์ดํŠธ ๋นˆ๋„์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ๋„๊ตฌ๋ฅผ ์„ ํƒํ•˜๋Š” ๊ฒƒ์€ ํ™•์žฅ์„ฑ์— ์ง€๋Œ€ํ•œ ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง ๋ฐฉ์ง€๋ฅผ ์œ„ํ•œ Selector ํŒจํ„ด์˜ ๋™์ž‘ ์›๋ฆฌ์™€, ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ ๊ฐ•์ œ๋˜๋Š” ์ƒํƒœ ๊ด€๋ฆฌ ์•„ํ‚คํ…์ฒ˜์˜ ์ค‘์š”์„ฑ. +- [[Code Splitting & Lazy Loading]] + - ์—ฐ๊ฒฐ ์ด์œ : ์ฝ”๋“œ๊ฐ€ ๋น„๋Œ€ํ•ด์ง์— ๋”ฐ๋ผ ๋ฐœ์ƒํ•˜๋Š” ์„ฑ๋Šฅ ์ €ํ•˜(๋ฒˆ๋“ค ํฌ๊ธฐ ์ฆ๊ฐ€)๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ํ•ต์‹ฌ ๋Ÿฐํƒ€์ž„ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: `React.lazy`์™€ Vite์˜ `manualChunks`๋ฅผ ์ด์šฉํ•œ ๋ฒˆ๋“ค ํฌ๊ธฐ ์ถ•์†Œ ๋ฐ ๋ธŒ๋ผ์šฐ์ € ์บ์‹ฑ ์ „๋žต. +- [[React Error Boundaries]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋Œ€๊ทœ๋ชจ ์•ฑ์—์„œ ํ•˜๋‚˜์˜ ๊ฒฐํ•จ ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ๋กœ ์ธํ•ด ์ „์ฒด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ถ•๊ดด๋˜๋Š” ๊ฒƒ์„ ๋ง‰์•„์ฃผ๋Š” ์•ˆ์ „ ์žฅ์น˜์ž…๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋Ÿฐํƒ€์ž„ ๋ Œ๋”๋ง ์—๋Ÿฌ๋ฅผ ๊ฒฉ๋ฆฌ(Isolate)ํ•˜๊ณ  ํด๋ฐฑ(Fallback) UI๋ฅผ ์ œ๊ณตํ•˜์—ฌ ์‹œ์Šคํ…œ ๋ณต์›๋ ฅ์„ ๋†’์ด๋Š” ๋ฐฉ๋ฒ•. + +### Deeper Research Questions + +- ๋Œ€๊ทœ๋ชจ ํŒ€ ํ™˜๊ฒฝ์—์„œ Feature-Sliced Design์„ ์ ์šฉํ•  ๋•Œ, 'Shared' ๋ ˆ์ด์–ด๊ฐ€ ๋น„๋Œ€ํ•ด์ง€๊ณ  ๊ธฐ๋Šฅ ๊ฐ„ ๊ต์ฐจ ๊ด€์‹ฌ์‚ฌ(Cross-cutting concerns)๊ฐ€ ์–ฝํžˆ๋Š” ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋Š”๊ฐ€? +- React Context API์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ฆฌ๋ Œ๋”๋ง ํญํฌ(Re-render storm) ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Zustand์˜ Selector ํŒจํ„ด์€ ๋‚ด๋ถ€์ ์œผ๋กœ ๊ตฌ๋…(Subscription) ๋ชจ๋ธ์„ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š”๊ฐ€? +- React Compiler์˜ ์ž๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๊ธฐ๋Šฅ์ด ๋„์ž…๋จ์— ๋”ฐ๋ผ ๊ธฐ์กด ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ๊ธฐ์ˆ  ๋ถ€์ฑ„(์˜ˆ: Rules of React ์œ„๋ฐ˜ ์‚ฌํ•ญ)๋Š” ์ปดํŒŒ์ผ ์ตœ์ ํ™” ๊ณผ์ •์—์„œ ์–ด๋– ํ•œ ๋ถ€์ž‘์šฉ์„ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- Vite์˜ `manualChunks`๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฑฐ๋Œ€ํ•œ ๋ฒˆ๋“ค์„ ๋ถ„๋ฆฌํ•  ๋•Œ, ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(React core, UI Kits ๋“ฑ)์˜ ํŠน์„ฑ์— ๋”ฐ๋ฅธ ์ตœ์ ์˜ ์ฒญํฌ ๋ถ„ํ•  ๋ฐ ๋ธŒ๋ผ์šฐ์ € ์บ์‹ฑ ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? +- ๋Œ€๊ทœ๋ชจ ๋ฆฌ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ Œ๋”๋งํ•  ๋•Œ ๊ฐ€์ƒํ™”(Virtualization)๋ฅผ ์ ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ๋ธŒ๋ผ์šฐ์ € ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น(Detached DOM nodes ๋“ฑ) ์ธก๋ฉด์—์„œ ์–ด๋–ค ์น˜๋ช…์ ์ธ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”๊ฐ€? + +### Practical Application Contexts + +- **Implementation:** ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐ ์„ค์ • ์‹œ ๊ธฐ์ˆ  ํŒŒ์ผ ๋‹จ์œ„(components, hooks) ๊ตฌ์กฐ๋ฅผ ํ”ผํ•˜๊ณ , ๋„๋ฉ”์ธ/๊ธฐ๋Šฅ ์ค‘์‹ฌ์˜ ํด๋” ๊ตฌ์กฐ๋ฅผ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ๋ช…์€ ์šด์˜์ฒด์ œ ๊ฐ„ ์ถฉ๋Œ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด kebab-case๋กœ, ์ปดํฌ๋„ŒํŠธ๋Š” PascalCase๋กœ ์ผ๊ด€๋˜๊ฒŒ ๋ช…๋ช…ํ•ฉ๋‹ˆ๋‹ค. +- **System Design:** ์ „์—ญ ์ƒํƒœ(Zustand/Redux), ์„œ๋ฒ„ ์ƒํƒœ(TanStack Query), ๋กœ์ปฌ ์ƒํƒœ(useState)์˜ ์ฑ…์ž„์„ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์žฆ์€ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ƒํƒœ๋Š” ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ์˜ ์ตœ์ƒ๋‹จ Context์— ๋‘๋Š” ๊ฒƒ์„ ํ”ผํ•ฉ๋‹ˆ๋‹ค. +- **Operation / Maintenance:** Sentry๋‚˜ LogRocket๊ณผ ๊ฐ™์€ ํ”„๋ก ํŠธ์—”๋“œ ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ์™€ React Error Boundaries๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ, ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง ์—๋Ÿฌ๋ฅผ ์บก์ฒ˜ํ•˜๊ณ  ์•ฑ์˜ ํฌ๋ž˜์‹œ๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. +- **Learning Path:** ๋‹จ์ˆœํ•œ React ๋ฌธ๋ฒ• ํ•™์Šต์„ ๋„˜์–ด, ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ๋ณ„ ๋ Œ๋”๋ง ์ตœ์ ํ™” ์ฐจ์ด๋ฅผ ๋ถ„์„ํ•˜๊ณ  Chrome DevTools ํ”„๋กœํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ Œ๋”๋ง ๋ณ‘๋ชฉ์„ ํ™•์ธํ•˜๋Š” ์Šต๊ด€์„ ๊ธธ๋Ÿฌ ์•„ํ‚คํ…ํŠธ ์ˆ˜์ค€์œผ๋กœ ์„ฑ์žฅํ•ฉ๋‹ˆ๋‹ค. +- **My Project Relevance:** ํ˜„์žฌ ์œ ์ง€๋ณด์ˆ˜ ์ค‘์ธ React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฌด๊ฑฐ์šด ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์ธํ•ด ๋ฉ”์ธ ๋ฒˆ๋“ค ํฌ๊ธฐ๊ฐ€ ๋น„๋Œ€ํ•ด์ง„ ์ƒํ™ฉ์ด๋ผ๋ฉด, `React.lazy` ๊ธฐ๋ฐ˜์˜ ๋ผ์šฐํŠธ ๋ ˆ๋ฒจ ์Šคํ”Œ๋ฆฌํŒ…๊ณผ Vite `manualChunks` ์ ์šฉ์„ ๊ฒ€ํ† ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### Adjacent Topics + +- [[Server Components (Next.js)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ํด๋ผ์ด์–ธํŠธ ์ธก์œผ๋กœ ์ „์†ก๋˜๋Š” JavaScript ๋ฒˆ๋“ค ์ž์ฒด๋ฅผ ์ œ๊ฑฐํ•˜์—ฌ ํ•˜์ด๋“œ๋ ˆ์ด์…˜(Hydration) ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ค„์ด๊ณ  ํ™•์žฅ์„ฑ๊ณผ ์„ฑ๋Šฅ์„ ๋™์‹œ์— ์žก๋Š” ์ตœ์‹  ๋ Œ๋”๋ง ํŒจ๋Ÿฌ๋‹ค์ž„. +- [[Memory Leak Detection in JavaScript]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์žฅ์‹œ๊ฐ„ ์‚ฌ์šฉ ์‹œ ์„ฑ๋Šฅ์„ ์ €ํ•˜์‹œํ‚ค๋Š” Detached DOM Nodes๋‚˜ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๋ˆ„์ˆ˜ ๋“ฑ์„ Chrome DevTools Heap Snapshot์„ ํ†ตํ•ด ๋””๋ฒ„๊น…ํ•˜๋Š” ๋ฐฉ๋ฒ•. +- [[Git Branching Workflows for Small & Large Teams]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๊ทœ๋ชจ๊ฐ€ ํ™•์žฅ๋˜๋Š” ํ”„๋ก ํŠธ์—”๋“œ ํŒ€์ด ์ถฉ๋Œ ์—†์ด ์ฝ”๋“œ๋ฅผ ํ†ตํ•ฉํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” GitHub Flow, Trunk-Based Development ๋ฐ PR(Pull Request) ๋ฆฌ๋ทฐ ์—ํ‹ฐ์ผ“. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Topics_GD/Scalable Frontend Systems.md b/10_Wiki/Topics_GD/Scalable Frontend Systems.md new file mode 100644 index 00000000..57f7da94 --- /dev/null +++ b/10_Wiki/Topics_GD/Scalable Frontend Systems.md @@ -0,0 +1,65 @@ +# [[Scalable Frontend Systems]] + +## ๐Ÿ“Œ Brief Summary +๋Œ€๊ทœ๋ชจ ํ”„๋ก ํŠธ์—”๋“œ ์‹œ์Šคํ…œ(Scalable Frontend Systems)์€ ๋†’์€ ์œ ์ง€๋ณด์ˆ˜์„ฑ, ๊ณ ์„ฑ๋Šฅ, ํ™•์žฅ์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ์กด์˜ ๋‹จ์ˆœํ•œ ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰์„ ๋„˜์–ด ์ •๊ตํ•˜๊ฒŒ ๋ถ„์‚ฐ๋œ ์†Œํ”„ํŠธ์›จ์–ด ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋„์ž…ํ•œ ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค [1]. ๊ธฐ๋Šฅ๋ณ„ ๋˜๋Š” ๋„๋ฉ”์ธ ์ค‘์‹ฌ์˜ ๋ชจ๋“ˆํ˜• ํด๋” ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, SOLID์™€ ๊ฐ™์€ ํด๋ฆฐ ์ฝ”๋“œ ์›์น™์„ ์ค€์ˆ˜ํ•˜๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒํƒœ์™€ ์„œ๋ฒ„ ์ƒํƒœ๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค [2-4]. ๋”๋ถˆ์–ด ์ž๋™ํ™”๋œ ๋นŒ๋“œ ์ตœ์ ํ™”, ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ๋ Œ๋”๋ง ์ตœ์ ํ™”, ์ •๊ตํ•œ ์—๋Ÿฌ ์ฒ˜๋ฆฌ ๋ฐ ํ˜‘์—… ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์•ˆ์ •์ ์œผ๋กœ ์„ฑ์žฅํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•ฉ๋‹ˆ๋‹ค [1, 5]. + +## ๐Ÿ“– Core Content + +* **์•„ํ‚คํ…์ฒ˜ ํŒจ๋Ÿฌ๋‹ค์ž„๊ณผ ํด๋” ๊ตฌ์กฐ:** ํ™•์žฅ์„ฑ์„ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํŒŒ์ผ์„ ํŒŒ์ผ์˜ ์œ ํ˜•(components, hooks ๋“ฑ)๋ณ„๋กœ ๋ชจ์•„๋‘๋Š” ๊ตฌ์กฐ์—์„œ ๊ธฐ๋Šฅ(Feature)์ด๋‚˜ ๋„๋ฉ”์ธ ์ค‘์‹ฌ์œผ๋กœ ๊ตฌ์กฐ๋ฅผ ๊ฐœํŽธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [2, 6]. ํŠนํžˆ Feature-Sliced Design (FSD)์€ ์ฝ”๋“œ ๊ณ„์ธต์„ Scope์™€ ์ฑ…์ž„์— ๋”ฐ๋ผ ๋ถ„ํ• (shared, entities, features, widgets, pages, app)ํ•˜๊ณ , ํ•˜์œ„ ๊ณ„์ธต์ด ์ƒ์œ„ ๊ณ„์ธต์„ ์ฐธ์กฐํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ํ•˜๋Š” ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ๊ณผ ์บก์Аํ™”๋œ Public API ๊ทœ์น™์„ ๊ฐ•์ œํ•˜์—ฌ ๊ฒฐํ•ฉ๋„(Coupling)๋ฅผ ๊ทน์ ์œผ๋กœ ๋‚ฎ์ถฅ๋‹ˆ๋‹ค [7-10]. +* **์†Œํ”„ํŠธ์›จ์–ด ์—”์ง€๋‹ˆ์–ด๋ง ์›์น™ ์ ์šฉ:** ํ™•์žฅ ๊ฐ€๋Šฅํ•œ React ์‹œ์Šคํ…œ์€ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ•˜๋‚˜์˜ ์—ญํ• ๋งŒ ํ•˜๋„๋ก ๋ถ„๋ฆฌํ•˜๋Š” ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)์„ ๋น„๋กฏํ•˜์—ฌ ๊ฐœ๋ฐฉ/ํ์‡„ ์›์น™(OCP), DRY, KISS, YAGNI ๋“ฑ์˜ SOLID ๋ฐ ํด๋ฆฐ ์ฝ”๋“œ ์›์น™์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค [3, 11]. ์ด๋กœ ์ธํ•ด ์ฝ”๋“œ์˜ ์˜ˆ์ธก ๊ฐ€๋Šฅ์„ฑ์ด ํ–ฅ์ƒ๋˜๊ณ  ๋ถˆํ•„์š”ํ•œ ์กฐ๊ธฐ ์ตœ์ ํ™”๋‚˜ ๋ณต์žก์„ฑ์ด ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค [12]. +* **์ƒํƒœ ๊ด€๋ฆฌ์˜ ํŒŒํŽธํ™” (State Management):** ํ•˜๋‚˜์˜ ๊ฑฐ๋Œ€ํ•œ Redux ์Šคํ† ์–ด์— ์˜์กดํ•˜๊ธฐ๋ณด๋‹ค, ๋ฐ์ดํ„ฐ์˜ ์„ฑ๊ฒฉ์— ๋งž๋Š” ๋„๊ตฌ๋ฅผ ์„ ํƒํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ง„ํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค [13]. ๋ถˆํ•„์š”ํ•œ ์ „์—ญ ๋ Œ๋”๋ง์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด Context API ๋Œ€์‹  ์„ ํƒ์ž(Selector) ํŒจํ„ด์„ ์ง€์›ํ•˜๋Š” Zustand ๋“ฑ์„ ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ์— ์‚ฌ์šฉํ•˜๋ฉฐ, API์—์„œ ๊ฐ€์ ธ์˜ค๋Š” ์„œ๋ฒ„ ์ƒํƒœ๋Š” ์บ์‹ฑ๊ณผ ๋™๊ธฐํ™”๋ฅผ ์œ„ํ•ด TanStack Query(React Query)๋กœ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค [4, 14]. +* **์„ฑ๋Šฅ ์—”์ง€๋‹ˆ์–ด๋ง ๋ฐ ๋ Œ๋”๋ง ์ตœ์ ํ™”:** ์ดˆ๊ธฐ์˜ ๊ฑฐ๋Œ€ํ•œ JavaScript ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด `React.lazy`์™€ Suspense๋ฅผ ํ™œ์šฉํ•œ ๋ผ์šฐํŠธ ๋ฐ ์ปดํฌ๋„ŒํŠธ ์ˆ˜์ค€์˜ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…(Code Splitting)์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค [15-17]. ์„ฑ๋Šฅ ๋ณ‘๋ชฉ์„ ์ผ์œผํ‚ค๋Š” ๋ฌด์˜๋ฏธํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด `React.memo`, `useCallback`, `useMemo`๋ฅผ ์ ์žฌ์ ์†Œ์— ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, React Compiler์™€ ๊ฐ™์€ ๋นŒ๋“œ ํƒ€์ž„ ๋„๊ตฌ๋ฅผ ๋„์ž…ํ•ด ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์ž๋™ํ™”ํ•ฉ๋‹ˆ๋‹ค [18-21]. ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐฉ๋Œ€ํ•œ ๋ชฉ๋ก์˜ ๊ฒฝ์šฐ ๊ฐ€์ƒํ™”(Virtualization/Windowing)๋ฅผ ๋„์ž…ํ•˜์—ฌ DOM ๋ถ€ํ•˜๋ฅผ ์ค„์ž…๋‹ˆ๋‹ค [22]. +* **๋ณต์›๋ ฅ(Resilience)๊ณผ ๋ชจ๋‹ˆํ„ฐ๋ง:** ์ „์ฒด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ Œ๋”๋ง ํฌ๋ž˜์‹œ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋ถˆ์•ˆ์ •ํ•œ UI ์˜์—ญ(์จ๋“œํŒŒํ‹ฐ ์œ„์ ฏ ๋“ฑ)์„ Error Boundary๋กœ ๊ฐ์‹ธ์„œ ๊ฒฉ๋ฆฌํ•ฉ๋‹ˆ๋‹ค [23, 24]. ๋ธŒ๋ผ์šฐ์ € ๋ฉ”๋ชจ๋ฆฌ ํƒญ์˜ Heap Snapshot์„ ํ†ตํ•ด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋””๋ฒ„๊น…ํ•˜๊ณ , ๋ฐฐํฌ ์ดํ›„์—๋Š” Sentry, LogRocket, Datadog๊ณผ ๊ฐ™์€ ํด๋ผ์šฐ๋“œ ๊ด€์ธก(Observability) ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ด ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์˜ ์‚ฌ์šฉ์ž ์—๋Ÿฌ ๋ฐ ์„ธ์…˜์„ ์‹ค์‹œ๊ฐ„ ๋ชจ๋‹ˆํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค [25-27]. +* **ํŒ€ ํ˜‘์—… ๋ฐ ๊ฑฐ๋ฒ„๋„Œ์Šค ๊ทœ์น™:** ์œˆ๋„์šฐ/๋ฆฌ๋ˆ…์Šค ํ™˜๊ฒฝ ์ฐจ์ด๋กœ ์ธํ•œ CI ๋นŒ๋“œ ์—๋Ÿฌ๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด ํŒŒ์ผ๋ช…์— kebab-case๋ฅผ ๊ฐ•์ œํ•˜๊ฑฐ๋‚˜(์ปดํฌ๋„ŒํŠธ ์ด๋ฆ„์€ PascalCase ์ ์šฉ), ESLint ๋ฐ Git Hooks๋ฅผ ํ†ตํ•ด ์•„ํ‚คํ…์ฒ˜ ๊ทœ์น™ ๋ฐ ์ฝ”๋“œ ํฌ๋งท์„ ์ž๋™ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค [28-30]. Git-flow, GitHub Flow ๋“ฑ ์†Œ๊ทœ๋ชจ/๋Œ€๊ทœ๋ชจ ํŒ€ ๊ทœ๋ชจ์— ๋งž๋Š” ๋ช…ํ™•ํ•œ ๋ธŒ๋žœ์น˜ ์ „๋žต๊ณผ ํ‹ฐ์ผ“ ID ๊ธฐ๋ฐ˜ ์ถ”์  ๊ด€๋ฆฌ๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค [31, 32]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +- [[Feature-Sliced Design (FSD)]] + - ์—ฐ๊ฒฐ ์ด์œ : ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ํ”„๋ก ํŠธ์—”๋“œ ์•„ํ‚คํ…์ฒ˜์—์„œ ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ฐœ์ƒํ•˜๋Š” '๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์–ฝํž˜' ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋„์ž…๋œ ํ•ต์‹ฌ์ ์ธ ์ปดํฌ๋„ŒํŠธ/๋””๋ ‰ํ† ๋ฆฌ ๋ถ„ํ•  ๋ฐฉ๋ฒ•๋ก ์ž…๋‹ˆ๋‹ค [33, 34]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ํ๋ฆ„, ๊ณ„์ธต๋ณ„(Layered) ๋ถ„ํ• , ์บก์Аํ™”๋ฅผ ํ†ตํ•œ Public API ์ธํ„ฐํŽ˜์ด์Šค ์„ค๊ณ„ ์›๋ฆฌ [7, 9]. + +- [[State Management Fragmentation (์ƒํƒœ ๊ด€๋ฆฌ ํŒŒํŽธํ™”)]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋‹จ์ผ ์Šคํ† ์–ด๋‚˜ Context API๋งŒ์œผ๋กœ๋Š” ๋ฆฌ๋ Œ๋”๋ง ์„ฑ๋Šฅ ์ตœ์ ํ™”๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•ด์ง์— ๋”ฐ๋ผ, ์ „์—ญ ์ƒํƒœ(Zustand), ์„œ๋ฒ„ ์ƒํƒœ(React Query), ๋กœ์ปฌ ์ƒํƒœ๋กœ ์—ญํ• ์„ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ด€๋ฆฌํ•˜๋Š” ํŠธ๋ Œ๋“œ์ž…๋‹ˆ๋‹ค [4, 13, 35]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง ๋ฐฉ์ง€ ์›๋ฆฌ(Zustand์˜ ์„ ํƒ์ž ํŒจํ„ด)์™€ ์„œ๋ฒ„/ํด๋ผ์ด์–ธํŠธ ๋ฐ์ดํ„ฐ ๊ฐ„์˜ ์บ์‹ฑ ๋ฐ ๋™๊ธฐํ™” ์ „๋žต [4, 14]. + +- [[React Compiler]] + - ์—ฐ๊ฒฐ ์ด์œ : ๊ฐœ๋ฐœ์ž๊ฐ€ ์ˆ˜๋™์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋˜ `useMemo`, `useCallback`, `React.memo` ๋“ฑ์˜ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ๋นŒ๋“œ ํƒ€์ž„์— ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•ด ์ฃผ์–ด, ๊น”๋”ํ•œ ์ฝ”๋“œ๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ ์„ฑ๋Šฅ ํ™•์žฅ์„ ๊ฐ€๋Šฅ์ผ€ ํ•˜๋Š” ์ตœ์‹  ๋„๊ตฌ์ž…๋‹ˆ๋‹ค [19, 36]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: React์˜ ๋ Œ๋”๋ง ์ตœ์ ํ™” ํ•œ๊ณ„ ๋ฐ Rules of React ์ค€์ˆ˜ ์ค‘์š”์„ฑ, ์จ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€์˜ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ [37, 38]. + +- [[Error Boundaries]] + - ์—ฐ๊ฒฐ ์ด์œ : ์‹œ์Šคํ…œ์˜ ํฌ๊ธฐ๊ฐ€ ์ปค์งˆ ๋•Œ ๋‹จ์ผ ์ปดํฌ๋„ŒํŠธ์˜ ์˜ค๋ฅ˜๊ฐ€ ์ „์ฒด ์•ฑ์˜ 'ํ™”์ดํŠธ ์Šคํฌ๋ฆฐ' ํฌ๋ž˜์‹œ๋กœ ์ด์–ด์ง€์ง€ ์•Š๊ฒŒ UI์˜ ์ผ๋ถ€๋ถ„๋งŒ ๋Œ€์ฒด(Fallback)ํ•˜์—ฌ ์‹œ์Šคํ…œ ๋ณต์›๋ ฅ(Resilience)์„ ๋ณด์žฅํ•˜๋Š” ์žฅ์น˜์ž…๋‹ˆ๋‹ค [23, 24, 39]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ํ™œ์šฉํ•œ ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ ํฌ์ฐฉ ์›๋ฆฌ ๋ฐ ๋Œ€๊ทœ๋ชจ UI ๋ณดํ˜ธ ์ „๋žต [40, 41]. + +- [[Code Splitting & Lazy Loading (์ฝ”๋“œ ๋ถ„ํ• ๊ณผ ์ง€์—ฐ ๋กœ๋”ฉ)]] + - ์—ฐ๊ฒฐ ์ด์œ : ํ”„๋ก ํŠธ์—”๋“œ ์ฝ”๋“œ๊ฐ€ ๋น„๋Œ€ํ•ด์ง€๋ฉด์„œ ์ดˆ๊ธฐ ๋กœ๋”ฉ ์†๋„(TTI, LCP)๋ฅผ ์ตœ์ ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์ˆ˜์ ์œผ๋กœ ์š”๊ตฌ๋˜๋Š” ๊ธฐ์ˆ ๋กœ, Vite๋‚˜ React.lazy๋ฅผ ํ†ตํ•ด ํ•„์š”ํ•œ ์‹œ์ ์—๋งŒ ๋ชจ๋“ˆ์„ ๋‹ค์šด๋กœ๋“œํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค [15, 17, 42]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ชจ๋“ˆ ๋ฒˆ๋“ค๋Ÿฌ์˜ ์ฒญํฌ(Chunk) ๋ถ„๋ฆฌ ์›๋ฆฌ ๋ฐ ๋ธŒ๋ผ์šฐ์ € ์„ฑ๋Šฅ ์ตœ์ ํ™”(Core Web Vitals)์™€ ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ์˜ ์ƒ๊ด€๊ด€๊ณ„ [43, 44]. + +### Deeper Research Questions + +- Feature-Sliced Design (FSD) ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋„์ž…ํ•  ๋•Œ, ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ(Feature)์ด ๊ณต์œ ํ•ด์•ผ ํ•˜๋Š” ๊ต์ฐจ ๊ด€์‹ฌ์‚ฌ(Cross-cutting concerns)๋‚˜ ํ•˜์œ„ ๊ธฐ๋Šฅ ๊ฒฐํ•ฉ ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ณ„์ธต ๋ถ„๋ฆฌ์™€ ์บก์Аํ™”๋ฅผ ํ›ผ์†ํ•˜์ง€ ์•Š๊ณ  ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? [45, 46] +- React Context API๊ฐ€ ์•ผ๊ธฐํ•˜๋Š” ๋ถˆํ•„์š”ํ•œ ๋ Œ๋” ํŠธ๋ฆฌ ๋ฆฌ๋ Œ๋”๋ง ๋ฌธ์ œ๋ฅผ Zustand๋‚˜ Redux ๊ฐ™์€ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์„ ํƒ์ž(Selector) ํŒจํ„ด ๋ฐ ์™ธ๋ถ€ ์Šคํ† ์–ด ๊ตฌ๋… ๋ฐฉ์‹๊ณผ ๋น„๊ตํ–ˆ์„ ๋•Œ, ์„ฑ๋Šฅ๊ณผ ํ™•์žฅ์„ฑ ์ธก๋ฉด์—์„œ ๊ตฌ์ฒด์ ์ธ ์ฐจ์ด๋Š” ๋ฌด์—‡์ธ๊ฐ€? [14, 35, 47] +- Vite ๋นŒ๋“œ ํ™˜๊ฒฝ์—์„œ ๋ฒˆ๋“ค ํฌ๊ธฐ ๊ฒฝ๊ณ ("Large Chunks")๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด `manualChunks`์™€ `React.lazy`๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…์„ ๊ตฌํ˜„ํ•  ๋•Œ, ์ดˆ๊ธฐ ๋ Œ๋”๋ง ์„ฑ๋Šฅ ๊ฐœ์„ ๊ณผ ๋ธŒ๋ผ์šฐ์ € ์บ์‹ฑ ํšจ์œจ์€ ๊ฐ๊ฐ ์–ด๋–ป๊ฒŒ ์ž‘์šฉํ•˜๋Š”๊ฐ€? [42, 48, 49] +- Next.js์˜ React Server Components (RSC)๋ฅผ ์ฑ„ํƒํ•จ์œผ๋กœ์จ ์„œ๋ฒ„์—์„œ ๋ฏธ๋ฆฌ ๋ Œ๋”๋งํ•˜๊ณ  ํด๋ผ์ด์–ธํŠธ ์ธก JavaScript ํŽ˜์ด๋กœ๋“œ๋ฅผ ์ค„์ด๋Š” ์ ‘๊ทผ๋ฒ•์ด, ๊ฑฐ๋Œ€ํ•œ ํ”„๋ก ํŠธ์—”๋“œ ์•ฑ์˜ ํ™•์žฅ์„ฑ์— ์–ด๋–ค ์•„ํ‚คํ…์ฒ˜์  ํŒจ๋Ÿฌ๋‹ค์ž„ ์ „ํ™˜์„ ๊ฐ€์ ธ์˜ค๋Š”๊ฐ€? [50, 51] +- React Compiler์˜ ์ž๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๋กœ์ง์ด ์„œ๋“œํŒŒํ‹ฐ ํ›…(์˜ˆ: ๋ถˆ์•ˆ์ •ํ•œ ์ฐธ์กฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ›…)๊ณผ ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ๊ธฐ์ˆ  ๋ถ€์ฑ„ ํ™˜๊ฒฝ์—์„œ ์–ด๋–ค ์ตœ์ ํ™” ์‹คํŒจ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋ฉฐ, ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๋ฆฌํŒฉํ† ๋ง ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? [38, 52] + +### Practical Application Contexts + +- **Implementation:** ๊ฑฐ๋Œ€ํ•œ React ํ”„๋กœ์ ํŠธ๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•  ๋•Œ ํŒŒ์ผ์„ ํŒŒ์ผ ์†์„ฑ ๋‹จ์œ„๊ฐ€ ์•„๋‹Œ FSD์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ(Feature) ๋ฐ ๋„๋ฉ”์ธ ๊ตฌ์กฐ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•ฉ๋‹ˆ๋‹ค. ์ƒํƒœ๊ฐ€ ์ž์ฃผ ๋ณ€๊ฒฝ๋˜๋Š” ๊ธฐ๋Šฅ์—๋Š” Zustand ์Šคํ† ์–ด๋ฅผ ์ ์šฉํ•˜๊ณ , ์„œ๋ฒ„ API ์š”์ฒญ์—๋Š” TanStack Query๋ฅผ ๋„์ž…ํ•˜์—ฌ ๋กœ์ปฌ ์ƒํƒœ์™€ ์„œ๋ฒ„ ์ƒํƒœ๋ฅผ ์™„๋ฒฝํžˆ ๋ถ„๋ฆฌ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค [2, 10, 53]. +- **System Design:** ์ปดํฌ๋„ŒํŠธ ๊ฐ„์˜ ์ˆœํ™˜ ์ฐธ์กฐ๋‚˜ ๊ฐ•ํ•œ ๊ฒฐํ•ฉ(Coupling)์„ ๋ง‰๊ธฐ ์œ„ํ•ด ์บก์Аํ™”๋œ `index.ts` ํ˜•ํƒœ์˜ Public API ์„ค๊ณ„ ํŒจํ„ด์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ Œ๋”๋ง ๋ถ€ํ•˜๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด ๋ฐ์ดํ„ฐ ๋ฆฌ์ŠคํŠธ์—๋Š” ๊ฐ€์ƒํ™”(Virtualization) ์„ค๊ณ„๋ฅผ ๋„์ž…ํ•ฉ๋‹ˆ๋‹ค [11, 22]. +- **Operation / Maintenance:** ํ”„๋กœ๋•์…˜ ๋ฐฐํฌ ํ›„ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ํฌ๋ž˜์‹œ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด Error Boundary๋ฅผ ์œ„์ ฏ ๋ฐ ์ค‘์š” UI ์„น์…˜๋งˆ๋‹ค ๊ฐ์‹ธ๋ฉฐ, LogRocket ๋˜๋Š” Sentry๋ฅผ ๋„์ž…ํ•ด ์—๋Ÿฌ ์ถ”์  ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ๋ฆญ(Memory Leaks) ์ƒํ™ฉ์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋””๋ฒ„๊น…ํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜ํ•ฉ๋‹ˆ๋‹ค [23, 26, 27]. +- **Learning Path:** ์†Œ๊ทœ๋ชจ ์žฅ๋‚œ๊ฐ ํ”„๋กœ์ ํŠธ๋กœ React์˜ ๊ธฐ์ดˆ๋ฅผ ๋‹ค์ง„ ํ›„, Context API์˜ ํ•œ๊ณ„๋ฅผ ํŒŒ์•…ํ•˜๊ณ  Zustand ๋“ฑ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ๋ฐฐ์›๋‹ˆ๋‹ค. ์ดํ›„ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ, Typescript ์ „ํ™˜, ๊ทธ๋ฆฌ๊ณ  ํด๋ฆฐ ์ฝ”๋“œ ์›์น™(SOLID, DRY) ๊ธฐ๋ฐ˜์˜ ์•„ํ‚คํ…์ฒ˜๋ง(Feature-Sliced Design) ์ตœ์ ํ™”๋กœ ๋‚˜์•„๊ฐ€๋Š” ๋‹จ๊ณ„์  ํ•™์Šต์„ ๊ฑฐ์นฉ๋‹ˆ๋‹ค [54-57]. +- **My Project Relevance:** ์†Œ์Šค์— ๊ด€๋ จ ์ •๋ณด๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. + +### Adjacent Topics + +- [[Frontend Cloud Logging Tools (ํ”„๋ก ํŠธ์—”๋“œ ํด๋ผ์šฐ๋“œ ๋กœ๊น… ๋„๊ตฌ)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์‹œ์Šคํ…œ์ด ํ”„๋กœ๋•์…˜ ๋‹จ๊ณ„์— ๋“ค์–ด๊ฐ”์„ ๋•Œ, Sentry๋‚˜ Datadog, SigNoz ๊ฐ™์€ ๋ชจ๋‹ˆํ„ฐ๋ง ํˆด์„ ํ™œ์šฉํ•ด ์‚ฌ์šฉ์ž ์„ธ์…˜๊ณผ ์—๋Ÿฌ ๋กœ๊ทธ๋ฅผ ์—ฐ๋™ํ•˜์—ฌ ๊ฐ€์‹œ์„ฑ(Observability)์„ ํ™•๋ณดํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [58-60]. +- [[Storybook Visual Regression Testing (Storybook ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋Œ€๊ทœ๋ชจ ํŒ€์—์„œ UI ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ, ๊ธฐ์กด ํ™”๋ฉด(baseline)์˜ ๋ ˆ์ด์•„์›ƒ์ด๋‚˜ ํ”ฝ์…€์ด ์˜๋„์น˜ ์•Š๊ฒŒ ๊นจ์ง€๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์ž๋™ํ™”๋œ ์‹œ๊ฐ์  ํšŒ๊ท€ ๊ฒ€์ฆ(Happo, Chromatic) ๋ฐ CI ํŒŒ์ดํ”„๋ผ์ธ ์—ฐ๋™ ๋ฐฉํ–ฅ์œผ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [61-63]. +- [[Git Branching Strategies & Workflows (Git ๋ธŒ๋žœ์น˜ ์ „๋žต ๋ฐ ์›Œํฌํ”Œ๋กœ์šฐ)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ™•์žฅ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ฐธ์—ฌํ•˜๋Š” ๊ฐœ๋ฐœ์ž ์ˆ˜๊ฐ€ ๋งŽ์•„์งˆ ๋•Œ, Trunk-based ๊ฐœ๋ฐœ์ด๋‚˜ GitHub Flow ๋“ฑ์„ ๋„์ž…ํ•˜์—ฌ ์ถฉ๋Œ์„ ์ค„์ด๊ณ  ํ‹ฐ์ผ“ ๊ธฐ๋ฐ˜ ์ถ”์ ์„ฑ์„ ํ™•๋ณดํ•˜๋Š” ํ˜•์ƒ๊ด€๋ฆฌ ๋ฐฉํ–ฅ์œผ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [31, 64]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Topics_GD/Storybook.md b/10_Wiki/Topics_GD/Storybook.md new file mode 100644 index 00000000..6d872c98 --- /dev/null +++ b/10_Wiki/Topics_GD/Storybook.md @@ -0,0 +1,66 @@ +# [[Storybook]] + +## ๐Ÿ“Œ Brief ์ฃผSummary +Storybook์€ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ ์‹œ UI ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ฃผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ๊ฒฉ๋ฆฌํ•˜์—ฌ ๊ฐœ๋ฐœํ•˜๊ณ  ๋ฌธ์„œํ™”ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค [1-3]. ํŠนํžˆ ๊ฐœ๋ฐœ๋œ ์ปดํฌ๋„ŒํŠธ์˜ ๋‹ค์–‘ํ•œ ์ƒํƒœ(์Šคํ† ๋ฆฌ)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž๋™ํ™”๋œ ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ(Visual Regression Testing) ๋ฐ ์ƒํ˜ธ์ž‘์šฉ ํ…Œ์ŠคํŠธ(Interaction Testing)๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ ์˜๋„์น˜ ์•Š์€ UI ๋ณ€๊ฒฝ์ด๋‚˜ ์ ‘๊ทผ์„ฑ ์œ„๋ฐ˜์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค [4-6]. Pull Request ๊ณผ์ •์— ๊ฒฐํ•ฉ๋˜์–ด ์•ˆ์ „ํ•œ UI ์—…๋ฐ์ดํŠธ์™€ ๋ฆฌ๋ทฐ๋ฅผ ์ง€์›ํ•˜๋Š” ํ•„์ˆ˜์ ์ธ ํ”Œ๋žซํผ์œผ๋กœ ํ™œ์šฉ๋ฉ๋‹ˆ๋‹ค [1, 7]. + +## ๐Ÿ“– Core Content +* **์ปดํฌ๋„ŒํŠธ์˜ ๊ฒฉ๋ฆฌ๋œ ๊ฐœ๋ฐœ ๋ฐ ๋ฌธ์„œํ™”** + Storybook์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฉ”์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ณต์žกํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด๋‚˜ ์ปจํ…์ŠคํŠธ์—์„œ ๋ฒ—์–ด๋‚˜ UI ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค [1]. ์ด๋Š” ๋ชจ๋…ธ๋ ˆํฌ(Monorepo) ํ™˜๊ฒฝ์ด๋‚˜ ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ฒ˜(Feature-Sliced Design ๋“ฑ)์—์„œ ๊ฐ ๊ธฐ๋Šฅ์„ ๋…๋ฆฝ์ ์œผ๋กœ ๊ฐœ๋ฐœํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•  ๋•Œ ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค [3]. ์ด๋ฏธ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฌธ์„œํ™”ํ•˜๊ณ  ๊ฐœ๋ฐœํ•˜๋Š” ์šฉ๋„๋กœ Storybook์„ ์‚ฌ์šฉ ์ค‘์ด๋ผ๋ฉด, ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ๋ฅผ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ๋น ๋ฅธ UI ๊ฒ€์ฆ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค [2]. + +* **์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ (Visual Regression Testing)** + Storybook์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜๋Š” ๊ฐ ์Šคํ† ๋ฆฌ์˜ ์Šค๋ƒ…์ƒท์„ ์บก์ฒ˜ํ•˜๊ณ  ์ด๋ฅผ ์ด์ „์— ์Šน์ธ๋œ '๋ฒ ์ด์Šค๋ผ์ธ(Baseline)'๊ณผ ๋น„๊ตํ•˜์—ฌ ์‹œ๊ฐ์  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ฐ์ง€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค [8]. ์ „ํ†ต์ ์ธ ์Šค๋ƒ…์ƒท ํ…Œ์ŠคํŠธ๊ฐ€ HTML ๋งˆํฌ์—… ๋ธ”๋กญ์„ ๋น„๊ตํ•˜์—ฌ ์‹œ๊ฐ์  ๋ณ€ํ™”๊ฐ€ ์—†์Œ์—๋„ ์˜คํƒ(false positive)์„ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๊ฒƒ๊ณผ ๋‹ฌ๋ฆฌ, Storybook์˜ ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์‹ค์ œ๋กœ ๊ฒฝํ—˜ํ•˜๋Š” '๋ Œ๋”๋ง๋œ ํ”ฝ์…€'์„ ์ง์ ‘ ๋น„๊ตํ•˜๋ฏ€๋กœ ํ›จ์”ฌ ๋” ํ’๋ถ€ํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค [9]. + +* **์ƒํ˜ธ์ž‘์šฉ ๋ฐ ์ ‘๊ทผ์„ฑ ํ…Œ์ŠคํŠธ (Interaction & Accessibility Tests)** + Storybook์€ ์ปดํฌ๋„ŒํŠธ์˜ ์™ธํ˜•๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋™์ž‘(Behavior)๊นŒ์ง€ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒํ˜ธ์ž‘์šฉ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด ๋กœ๋”ฉ, ์—๋Ÿฌ, ํ˜ธ๋ฒ„, ๋ฉ”๋‰ด ์—ด๋ฆผ ๋“ฑ ๋‹ค์–‘ํ•œ UI ์ƒํƒœ๋ฅผ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ [5], ์ด๋Ÿฌํ•œ ์ƒํƒœ ๋ณ€ํ™”์— ๋งž์ถฐ ์Šคํฌ๋ฆฐ์ƒท์„ ์ฐ์Œ์œผ๋กœ์จ ํ–‰๋™ ํ…Œ์ŠคํŠธ์™€ ์‹œ๊ฐ์  ๊ฒ€์ฆ์„ ๋™์ผํ•œ ์›Œํฌํ”Œ๋กœ์šฐ ๋‚ด์—์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5, 6]. ๋ถ€๊ฐ€์ ์œผ๋กœ ์ถ”๊ฐ€์ ์ธ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ ์—†์ด๋„ ์ ‘๊ทผ์„ฑ ํšŒ๊ท€ ํ…Œ์ŠคํŠธ๋ฅผ ํ•จ๊ป˜ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [4, 10]. + +* **CI/CD ๋ฐ ๋„๊ตฌ ํ†ตํ•ฉ (CI/CD Integrations)** + Storybook์€ Chromatic์ด๋‚˜ Happo ๊ฐ™์€ ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค ๋„๊ตฌ๋“ค๊ณผ ์›ํ™œํ•˜๊ฒŒ ํ†ตํ•ฉ๋ฉ๋‹ˆ๋‹ค [1, 4, 8]. ์ด๋Ÿฌํ•œ ๋„๊ตฌ๋ฅผ CI ํŒŒ์ดํ”„๋ผ์ธ์— ์—ฐ๋™ํ•˜๋ฉด, PR(Pull Request)์ด ์ƒ์„ฑ๋  ๋•Œ๋งˆ๋‹ค Chrome, Firefox, Safari ๋“ฑ ๋‹ค์–‘ํ•œ ์‹ค์ œ ๋ธŒ๋ผ์šฐ์ €์™€ ์—ฌ๋Ÿฌ ๋ทฐํฌํŠธ ํฌ๊ธฐ์—์„œ ์ž๋™์œผ๋กœ ์Šคํฌ๋ฆฐ์ƒท์ด ์บก์ฒ˜๋˜๊ณ  ๋ฒ ์ด์Šค๋ผ์ธ๊ณผ ๋น„๊ต๋ฉ๋‹ˆ๋‹ค [1, 4, 11]. ์ด๋ฅผ ํ†ตํ•ด ๋ฆฌ๋ทฐ์–ด๋Š” ๊ฐ ์ƒํƒœ๋ฅผ ์ˆ˜๋™์œผ๋กœ ํ™•์ธํ•  ํ•„์š” ์—†์ด ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„(Diff)์—๋งŒ ์ง‘์ค‘ํ•˜์—ฌ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์Šน์ธ(Accept)ํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2, 12, 13]. + +## โš–๏ธ Trade-offs & Caveats +* **ํ…Œ์ŠคํŠธ์˜ ๋ถˆ์•ˆ์ •์„ฑ(Flakiness) ๋ฐ ๋…ธ์ด์ฆˆ ๋ฌธ์ œ:** ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜, ๋น„๋™๊ธฐ ์ž์‚ฐ(Asset), ํฐํŠธ ๋กœ๋”ฉ ๋“ฑ์œผ๋กœ ์ธํ•ด ๊นจ์ง€๊ธฐ ์‰ฝ๊ฑฐ๋‚˜ ๋ถˆ์•ˆ์ •ํ•ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [10, 11]. ๋˜ํ•œ ์ด๋ฏธ์ง€ ์••์ถ• ๋…ธ์ด์ฆˆ๋‚˜ ์•ˆํ‹ฐ์•จ๋ฆฌ์–ด์‹ฑ(anti-aliasing)๊ณผ ๊ฐ™์€ ๋ฏธ์„ธํ•œ ์ฐจ์ด๋กœ ์ธํ•ด ์‹คํŒจํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค [10, 14]. ์ด๋ฅผ ์™„ํ™”ํ•˜๊ธฐ ์œ„ํ•ด Happo ๋“ฑ์€ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ž๋™์œผ๋กœ ๋ฌดํšจํ™”ํ•˜๊ณ  ๋น„๋™๊ธฐ ์ž์‚ฐ์„ ๋Œ€๊ธฐํ•˜๋ฉฐ, ์‹œ๊ฐ์  ๋ณ€๊ฒฝ์— ๋Œ€ํ•œ ์ƒ‰์ƒ ํ—ˆ์šฉ ์˜ค์ฐจ(color-delta tolerance)๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•˜๋Š” ์ œ์•ฝ๊ณผ ์„ค์ • ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค [11, 14]. +* **์ถ”๊ฐ€์ ์ธ ๋ฆฌ๋ทฐ ๋ณ‘๋ชฉ ๋ฐ CI ์„ค์ • ์˜ค๋ฒ„ํ—ค๋“œ:** ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ๊ฐ€ ์œ ํšจํ•˜๋ ค๋ฉด ๋ณ€๊ฒฝ๋œ ์Šคํฌ๋ฆฐ์ƒท์ด ์˜๋„๋œ ๊ฒƒ์ธ์ง€(์ƒˆ๋กœ์šด ๋ฒ ์ด์Šค๋ผ์ธ์œผ๋กœ ์ˆ˜๋ฝ) ์•„๋‹ˆ๋ฉด ๋ฒ„๊ทธ์ธ์ง€ ํŒ๋‹จํ•˜๋Š” ํŒ€์›์˜ ์ˆ˜๋™ ๋ฆฌ๋ทฐ ๊ณผ์ •์ด ๋ฐ˜๋“œ์‹œ ์ˆ˜๋ฐ˜๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [12, 13]. ๋˜ํ•œ CI/CD์—์„œ ์›ํ™œํ•˜๊ฒŒ ๋™์ž‘ํ•˜๋„๋ก ํ”„๋กœ์ ํŠธ ํ† ํฐ ๋“ฑ ์ธ์ฆ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ  ํŒŒ์ดํ”„๋ผ์ธ์„ ์„ค์ •ํ•˜๋Š” ์ดˆ๊ธฐ ์ž‘์—…์ด ์š”๊ตฌ๋ฉ๋‹ˆ๋‹ค [7]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [ํ…Œ์ŠคํŠธ ๋ฐ ๊ฒ€์ฆ ๊ธฐ๋ฒ• (Testing Methods)] +- [[Visual Regression Testing]] + - ์—ฐ๊ฒฐ ์ด์œ : Storybook์ด ์ปดํฌ๋„ŒํŠธ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํ”ฝ์…€ ๋‹จ์œ„๋กœ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ํ•ต์‹ฌ ํ…Œ์ŠคํŠธ ๋ฐฉ๋ฒ•๋ก ์ž…๋‹ˆ๋‹ค [4, 8]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: HTML ๋งˆํฌ์—…์„ ๋น„๊ตํ•˜๋Š” Snapshot Test์˜ ํ•œ๊ณ„์ ๊ณผ ์˜คํƒ(False Positive)์˜ ์›๋ฆฌ, ๊ทธ๋ฆฌ๊ณ  ํ”ฝ์…€ ๋ Œ๋”๋ง ๊ธฐ๋ฐ˜ ๋น„๊ต์˜ ์žฅ์ ์„ ๋ช…ํ™•ํžˆ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [9]. + +- [[Interaction Testing]] + - ์—ฐ๊ฒฐ ์ด์œ : ์ปดํฌ๋„ŒํŠธ์˜ ๋‹จ์ˆœํ•œ ๋ Œ๋”๋ง๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์œ ์ €์˜ ํ–‰๋™(์ด๋ฒคํŠธ, ์ƒํƒœ ๋“ฑ)์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜์—ฌ ๋‹ค์–‘ํ•œ UI ์ƒํƒœ(๋กœ๋”ฉ, ํ˜ธ๋ฒ„ ๋“ฑ)๋ฅผ ๊ฒ€์ฆํ•˜๋Š” Storybook์˜ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค [5, 6]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ƒํƒœ ์ „์ด์— ๋”ฐ๋ผ ๋™์ ์œผ๋กœ ๋ณ€ํ•˜๋Š” UI๋ฅผ ์–ด๋–ป๊ฒŒ ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ์™€ ๊ฒฐํ•ฉํ•˜์—ฌ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์›๋ฆฌ๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5]. + +#### [ํ†ตํ•ฉ ๋ฐ ์ž๋™ํ™” ๋„๊ตฌ (Integration Tools)] +- [[Chromatic]] + - ์—ฐ๊ฒฐ ์ด์œ : Storybook ์œ ์ง€๋ณด์ˆ˜ ํŒ€์ด ๋งŒ๋“  ๊ณต์‹ ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค๋กœ, ํฌ๋กœ์Šค ๋ธŒ๋ผ์šฐ์ € ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ์™€ CI ํ†ตํ•ฉ์„ ๋„ค์ดํ‹ฐ๋ธŒ๋กœ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค [8, 15]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ์—์„œ ๋ฒ ์ด์Šค๋ผ์ธ(Baseline) ์ด๋ฏธ์ง€๊ฐ€ ์–ด๋–ป๊ฒŒ ์ €์žฅ, ๋น„๊ต, ๋™๊ธฐํ™”๋˜๋Š”์ง€ CI/CD ํŒŒ์ดํ”„๋ผ์ธ ํ†ตํ•ฉ ๊ณผ์ •์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [7, 13]. + +- [[Happo]] + - ์—ฐ๊ฒฐ ์ด์œ : Storybook๊ณผ ํ†ตํ•ฉ๋˜์–ด ๋‹ค์ค‘ ๋ธŒ๋ผ์šฐ์ € ์Šคํฌ๋ฆฐ์ƒท ํ…Œ์ŠคํŠธ ๋ฐ ์ ‘๊ทผ์„ฑ ํšŒ๊ท€ ํ…Œ์ŠคํŠธ๋ฅผ ๋ณ‘๋ ฌ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค [4]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Flakiness ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ •์ง€ํ•˜๊ฑฐ๋‚˜ ์ƒ‰์ƒ ์˜ค์ฐจ ๋ฒ”์œ„(color-delta tolerance)๋ฅผ ์„ค์ •ํ•˜์—ฌ ์‹œ๊ฐ์  ๋…ธ์ด์ฆˆ๋ฅผ ์ค„์ด๋Š” ๊ตฌ์ฒด์  ์ตœ์ ํ™” ๊ธฐ๋ฒ•์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [11, 14]. + +### Deeper Research Questions +- Storybook์˜ Visual Test์™€ ์ „ํ†ต์ ์ธ HTML Snapshot Test๋ฅผ ๋น„๊ตํ–ˆ์„ ๋•Œ, ์‹ค์ œ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์œ ์ง€๋ณด์ˆ˜ ์˜ค๋ฒ„ํ—ค๋“œ์™€ ์˜คํƒ(false positive) ๋น„์œจ์˜ ์ฐจ์ด๋Š” ์–ด๋– ํ•œ๊ฐ€? +- ์• ๋‹ˆ๋ฉ”์ด์…˜, ๋น„๋™๊ธฐ ํฐํŠธ ๋กœ๋”ฉ ๋“ฑ์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” Visual Test์˜ Flakiness๋ฅผ ์™„์ „ํžˆ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•ด Chromatic์ด๋‚˜ Happo๋Š” ์–ด๋–ค ๋ Œ๋”๋ง ํŒŒ์ดํ”„๋ผ์ธ ์ œ์–ด ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜๋Š”๊ฐ€? +- Storybook์˜ Interaction Test๋กœ ๋ณต์žกํ•œ ์‚ฌ์šฉ์ž ์—ฌ์ •(User Journey)์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•  ๋•Œ, ์ƒํƒœ๋ณ„ ์Šคํฌ๋ฆฐ์ƒท ์บก์ฒ˜๊ฐ€ CI ๋นŒ๋“œ ์‹œ๊ฐ„์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ๊ณผ ์ด๋ฅผ ๋ณ‘๋ ฌํ™”ํ•˜์—ฌ ์ตœ์ ํ™”ํ•˜๋Š” ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? +- ๋ชจ๋…ธ๋ ˆํฌ(Monorepo) ํ™˜๊ฒฝ์ด๋‚˜ Feature-Sliced Design ์•„ํ‚คํ…์ฒ˜์—์„œ ์ˆ˜๋ฐฑ ๊ฐœ์˜ ๊ธฐ๋Šฅ ๋ชจ๋“ˆ์ด ๊ฐ๊ฐ ๋ถ„๋ฆฌ๋œ Storybook์„ ๊ฐ€์งˆ ๋•Œ, ์ด๋ฅผ ํ†ตํ•ฉ์ ์œผ๋กœ ๋นŒ๋“œํ•˜๊ณ  ์‹œ๊ฐ์  ํšŒ๊ท€๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ๋ฒ ์ŠคํŠธ ํ”„๋ž™ํ‹ฐ์Šค๋Š” ๋ฌด์—‡์ธ๊ฐ€? +- Storybook์„ ์‚ฌ์šฉํ•œ ์‹œ๊ฐ์  ์ ‘๊ทผ์„ฑ ํ…Œ์ŠคํŠธ(Accessibility regression testing)๊ฐ€ ์‹ค์ œ DOM ๊ธฐ๋ฐ˜์˜ ์ ‘๊ทผ์„ฑ ๊ฐ์‚ฌ ๋„๊ตฌ(aXe ๋“ฑ)์™€ ๋น„๊ตํ•˜์—ฌ ๊ฐ–๋Š” ํ•œ๊ณ„์ ๊ณผ ๋ณด์™„์ ์€ ๋ฌด์—‡์ธ๊ฐ€? + +### Practical Application Contexts +- **Implementation:** React ๋“ฑ UI ํ”„๋ ˆ์ž„์›Œํฌ ๊ธฐ๋ฐ˜ ํ”„๋กœ์ ํŠธ์—์„œ ๋ณต์žกํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์•ฑ์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ๋ถ„๋ฆฌํ•˜์—ฌ `Button`, `Modal` ๋“ฑ์˜ ์š”์†Œ๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ๋ Œ๋”๋งํ•˜๊ณ , ํ˜ธ๋ฒ„ ๋ฐ ์—๋Ÿฌ ์ƒํƒœ์˜ Story๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. +- **System Design:** Feature-Sliced Design์ฒ˜๋Ÿผ ๋„๋ฉ”์ธ๊ณผ ํ”ผ์ฒ˜๊ฐ€ ๋šœ๋ ทํ•˜๊ฒŒ ๋‚˜๋‰œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋„์ž…ํ•  ๋•Œ, ๊ฐ ํ”ผ์ฒ˜ ํด๋”๋ณ„๋กœ Storybook ํ™˜๊ฒฝ์„ ์„ธํŒ…ํ•˜์—ฌ ๊ฒฉ๋ฆฌ๋œ ๊ฐœ๋ฐœ ๋ฐ ํ…Œ์ŠคํŠธ ๊ตฌ์กฐ๋ฅผ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค. +- **Operation / Maintenance:** CI/CD ์›Œํฌํ”Œ๋กœ์šฐ์— Chromatic ๋˜๋Š” Happo๋ฅผ ์—ฐ๋™ํ•˜์—ฌ, ํŒ€์›์ด PR์„ ์˜ฌ๋ฆด ๋•Œ๋งˆ๋‹ค ์ž๋™์œผ๋กœ ์‹œ๊ฐ์  ๋ณ€๊ฒฝ ์‚ฌํ•ญ(Visual Diff)์ด ์บก์ฒ˜๋˜๊ณ  ์ด๋ฅผ ๋ฆฌ๋ทฐ์–ด๊ฐ€ ์ง์ ‘ ํ™•์ธ ํ›„ ๋ณ‘ํ•ฉ(Merge)ํ•˜๋Š” ์šด์˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ตฌ์ถ•ํ•ฉ๋‹ˆ๋‹ค. +- **Learning Path:** ๊ธฐ๋ณธ UI ์ปดํฌ๋„ŒํŠธ ๊ฒฉ๋ฆฌ ๊ฐœ๋ฐœ -> Story ์ž‘์„ฑ์„ ํ†ตํ•œ ๋ฌธ์„œํ™” -> Interaction Test ์ž‘์„ฑ -> ์ž๋™ํ™”๋œ Visual Regression Test ๊ตฌ์ถ•์œผ๋กœ ์ด์–ด์ง€๋Š” ํ”„๋ก ํŠธ์—”๋“œ ํ’ˆ์งˆ ๋ณด์ฆ ํ•™์Šต ๊ฒฝ๋กœ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. +- **My Project Relevance:** ํ˜„์žฌ ์œ ์ง€๋ณด์ˆ˜ ์ค‘์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฆฌํŒฉํ† ๋ง์ด๋‚˜ ์ƒˆ๋กœ์šด ๋””์ž์ธ ์‹œ์Šคํ…œ(UI ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ) ๊ตฌ์ถ• ์ž‘์—… ์‹œ, ์‹ค์ˆ˜๋กœ ๋ฐœ์ƒํ•˜๋Š” CSS/๋ ˆ์ด์•„์›ƒ ๊นจ์ง์„ ์‚ฌ์ „์— ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์•ˆ์ „์žฅ์น˜๋กœ ๋„์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### Adjacent Topics +- [[Pull Request Workflow]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: Storybook ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ์˜ ๊ฒฐ๊ณผ๋ฅผ GitHub, GitLab ๋“ฑ์˜ ๋ฆฌ๋ทฐ ํ”„๋กœ์„ธ์Šค์™€ ๊ฒฐํ•ฉํ•˜์—ฌ, ๋ฒ„๊ทธ ์—†๋Š” UI ์ฝ”๋“œ๋ฅผ ๋ฐฐํฌํ•˜๊ธฐ ์œ„ํ•œ ํ˜‘์—… ๋ฐ ๊ฒ€์ฆ ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ• ์ „๋žต์œผ๋กœ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค. +- [[Feature-Sliced Design]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ํ”„๋ก ํŠธ์—”๋“œ ์ฝ”๋“œ๋ฅผ ๊ธฐ๋Šฅ(Feature) ๋‹จ์œ„๋กœ ๋ถ„๋ฆฌํ•  ๋•Œ, Storybook์„ ์ด์šฉํ•ด ๊ฐ ๊ธฐ๋Šฅ์˜ UI ์ปดํฌ๋„ŒํŠธ๋“ค์„ ๋ฉ”์ธ ์•ฑ์— ์˜์กดํ•˜์ง€ ์•Š๊ณ  ๋…๋ฆฝ์ ์œผ๋กœ ์ž‘๋™ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ์„ค๊ณ„ ์›์น™์œผ๋กœ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Topics_GD/๋Œ€๊ทœ๋ชจ ํ”„๋ก ํŠธ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜.md b/10_Wiki/Topics_GD/๋Œ€๊ทœ๋ชจ ํ”„๋ก ํŠธ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜.md new file mode 100644 index 00000000..b3e02b9e --- /dev/null +++ b/10_Wiki/Topics_GD/๋Œ€๊ทœ๋ชจ ํ”„๋ก ํŠธ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜.md @@ -0,0 +1,64 @@ +# [[๋Œ€๊ทœ๋ชจ ํ”„๋ก ํŠธ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜]] + +## ๐Ÿ“Œ Brief Summary +๋Œ€๊ทœ๋ชจ ํ”„๋ก ํŠธ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋‹จ์ˆœํ•œ ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰์„ ๋„˜์–ด ํ™•์žฅ์„ฑ, ์œ ์ง€๋ณด์ˆ˜์„ฑ, ๊ณ ์„ฑ๋Šฅ์„ ์š”๊ตฌํ•˜๋Š” ๊ณ ๋„๋กœ ์ •๊ตํ•œ ๋ถ„์‚ฐ ์†Œํ”„ํŠธ์›จ์–ด ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค. ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ UI์˜ ๋ถ„๋ฆฌ, ๋ช…ํ™•ํ•œ ์ƒํƒœ ์†Œ์œ ๊ถŒ, ์—„๊ฒฉํ•œ ํด๋” ๊ตฌ์กฐ(Feature-Sliced Design ๋“ฑ)๋ฅผ ํ†ตํ•ด ์•„ํ‚คํ…์ฒ˜์˜ ๋ถ•๊ดด๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…, ์ž๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜, ์„ธ๋ถ„ํ™”๋œ ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ตœ์ ์˜ ๋ Œ๋”๋ง ์„ฑ๋Šฅ๊ณผ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค. + +## ๐Ÿ“– Core Content + +* **์•„ํ‚คํ…์ฒ˜ ๋ฐ ํด๋” ๊ตฌ์กฐ (Architecture & Folder Structure)** + * ๊ณผ๊ฑฐ์˜ ํŒŒ์ผ ํƒ€์ž… ๊ธฐ๋ฐ˜(MVC ๋“ฑ) ํด๋” ๊ตฌ์กฐ๋Š” ๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ๋กœ์ง์ด ํŒŒํŽธํ™”๋˜๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€๊ทœ๋ชจ ์•ฑ์—์„œ๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๊ธฐ๋Šฅ๋ณ„๋กœ ์ฝ”๋“œ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” **๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜(Feature-based)** ๋˜๋Š” **FSD(Feature-Sliced Design)** ์•„ํ‚คํ…์ฒ˜๊ฐ€ ํ‘œ์ค€์œผ๋กœ ์ž๋ฆฌ ์žก์•˜์Šต๋‹ˆ๋‹ค [1-13]. + * FSD๋Š” ์•ฑ์„ ๊ณต์œ (shared), ์—”ํ‹ฐํ‹ฐ(entities), ๊ธฐ๋Šฅ(features), ์œ„์ ฏ(widgets), ํŽ˜์ด์ง€(pages), ์•ฑ(app) ๋“ฑ์˜ ๊ณ„์ธต์œผ๋กœ ๋‚˜๋ˆ„๊ณ , **๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ๊ทœ์น™**(ํ•˜์œ„ ๊ณ„์ธต๋งŒ ์ฐธ์กฐ ๊ฐ€๋Šฅ)๊ณผ **Public API ๊ทœ์น™**(index.ts๋ฅผ ํ†ตํ•œ ์บก์Аํ™”)์„ ๊ฐ•์ œํ•˜์—ฌ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถฅ๋‹ˆ๋‹ค [6, 9, 10, 14, 15]. +* **์ƒํƒœ ๊ด€๋ฆฌ์˜ ํŒŒํŽธํ™” (Fragmentation of Global State)** + * ๊ฑฐ๋Œ€ํ•œ ๋‹จ์ผ ์Šคํ† ์–ด(Monolithic Redux) ๋Œ€์‹ , ๋ฐ์ดํ„ฐ ์œ ํ˜•์— ๋”ฐ๋ผ ์ตœ์ ์˜ ๋„๊ตฌ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๋กœ์ปฌ ์ƒํƒœ๋Š” `useState`, ์ „์—ญ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒํƒœ๋Š” `Zustand`๋‚˜ `Jotai`, ์„œ๋ฒ„(API) ์ƒํƒœ๋Š” `TanStack Query`๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์บ์‹ฑ ๋ฐ ๋™๊ธฐํ™”๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค [16-24]. + * ํŠนํžˆ Context API๋Š” ๊ฐ’์ด ๋ณ€ํ•  ๋•Œ๋งˆ๋‹ค ๋ชจ๋“  ๊ตฌ๋… ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฆฌ๋ Œ๋”๋งํ•˜๋Š” '๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ' ๋ฐฉ์‹์ด๋ฏ€๋กœ ์ •์  ๋ฐ์ดํ„ฐ(ํ…Œ๋งˆ ๋“ฑ)์— ์ ํ•ฉํ•˜๋ฉฐ, ์ž์ฃผ ๋ณ€๊ฒฝ๋˜๋Š” ๋™์  ์ƒํƒœ๋Š” ์„ ํƒ์ž(Selector) ํŒจํ„ด์œผ๋กœ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ฐฉ์ง€ํ•˜๋Š” Zustand ๋“ฑ์ด ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค [16, 17, 25-28]. +* **์„ฑ๋Šฅ ์ตœ์ ํ™” (Performance Optimization)** + * **๋นŒ๋“œ/๋Ÿฐํƒ€์ž„ ์ตœ์ ํ™”:** Vite์™€ Rollup์„ ํ™œ์šฉํ•˜์—ฌ ์ž์ฃผ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(React ๋“ฑ)๋ฅผ `manualChunks`๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ์บ์‹œ ํšจ์œจ์„ ๋†’์ด๊ณ , `React.lazy`์™€ `Suspense`๋ฅผ ํ†ตํ•ด ๋ผ์šฐํŠธ ๋˜๋Š” ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„์˜ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค [29-37]. + * **๋ Œ๋”๋ง ์„ฑ๋Šฅ:** React 19/2025 ์ƒํƒœ๊ณ„์—์„œ๋Š” ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜(React.memo, useMemo)์˜ ํ•œ๊ณ„๋ฅผ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด **React Compiler**๋ฅผ ๋„์ž…ํ•˜์—ฌ ๋นŒ๋“œ ํƒ€์ž„์— ์ž๋™์œผ๋กœ ๋ Œ๋”๋ง ์ตœ์ ํ™”๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๋Ÿ‰์˜ ๋ฆฌ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋Š” ๊ฐ€์ƒํ™”(Virtualization) ๊ธฐ์ˆ ์„ ํ†ตํ•ด DOM ๋น„๋Œ€ํ™”๋ฅผ ๋ง‰์Šต๋‹ˆ๋‹ค [30-32, 38-44]. +* **๋ณต์›๋ ฅ ๋ฐ ๋””๋ฒ„๊น… (Resilience & Debugging)** + * ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๋กœ ์ธํ•œ '๋ฐฑ์ง€ ํ™”๋ฉด(White screen of death)'์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด **์—๋Ÿฌ ๋ฐ”์šด๋”๋ฆฌ(Error Boundaries)**๋ฅผ ๋Œ€์‹œ๋ณด๋“œ๋‚˜ ์„œ๋“œํŒŒํ‹ฐ ์œ„์ ฏ ๋“ฑ ๋ถˆ์•ˆ์ •ํ•œ UI ์„น์…˜์— ์ „๋žต์ ์œผ๋กœ ๋ฐฐ์น˜ํ•˜์—ฌ Fallback UI๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [45-53]. + * ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜(Detached DOM nodes ๋“ฑ)๋Š” ์„ฑ๋Šฅ ์ €ํ•˜์˜ ์ฃผ์›์ธ์ด๋ฏ€๋กœ Chrome DevTools์˜ Heap Snapshot ๋ฐ Allocation Timeline์„ ํ†ตํ•ด ์ถ”์ ํ•˜๋ฉฐ, ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋Š” Sentry, LogRocket, Datadog ๋“ฑ์˜ ๊ฐ€์‹œ์„ฑ(Observability) ๋„๊ตฌ๋กœ ๋ชจ๋‹ˆํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค [54-63]. +* **ํด๋ฆฐ ์ฝ”๋“œ ๋ฐ ๊ฑฐ๋ฒ„๋„Œ์Šค (Clean Code & Governance)** + * React์˜ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—๋„ SOLID ์›์น™(๋‹จ์ผ ์ฑ…์ž„ ์›์น™, ๊ฐœ๋ฐฉ-ํ์‡„ ์›์น™ ๋“ฑ), DRY, KISS, YAGNI ์›์น™์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ปดํฌ๋„ŒํŠธ๋Š” ๋‹จ์ผ ์ฑ…์ž„์„ ๊ฐ€์ ธ์•ผ ํ•˜๋ฉฐ ๊ณผ๋„ํ•œ ์ถ”์ƒํ™”๋Š” ์ง€์–‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [64-69]. + * ์šด์˜์ฒด์ œ ๊ฐ„ ํ˜ธํ™˜์„ฑ ๋ฐ ๋นŒ๋“œ ์˜ค๋ฅ˜ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด ํŒŒ์ผ ๋ฐ ํด๋”๋ช…์€ `kebab-case`, ์ปดํฌ๋„ŒํŠธ๋Š” `PascalCase` ์‚ฌ์šฉ์„ ํ‘œ์ค€ํ™”ํ•˜๋ฉฐ, ESLint, Prettier, Husky๋ฅผ ํ†ตํ•ด CI/CD ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ์•„ํ‚คํ…์ฒ˜ ๊ฒฝ๊ณ„์™€ ์ฝ”๋“œ ํ’ˆ์งˆ์„ ์ž๋™ ๊ฐ•์ œํ•ฉ๋‹ˆ๋‹ค [70-73]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts +- [[Feature-Sliced Design (FSD)]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋Œ€๊ทœ๋ชจ ํ”„๋ก ํŠธ์—”๋“œ ํ”„๋กœ์ ํŠธ์˜ ํด๋” ๊ตฌ์กฐ์™€ ๋ชจ๋“ˆ ์˜์กด์„ฑ์„ ํ†ต์ œํ•˜๋Š” ํ•ต์‹ฌ ์•„ํ‚คํ…์ฒ˜ ๋ฐฉ๋ฒ•๋ก ์ž…๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ๊ณผ UI๋ฅผ ์–ด๋–ป๊ฒŒ ๊ณ„์ธต์ ์œผ๋กœ ๋ถ„๋ฆฌํ•˜๊ณ , ์ˆœํ™˜ ์ฐธ์กฐ ๋ฐ ๊ฐ•ํ•œ ๊ฒฐํ•ฉ์„ ์–ด๋–ป๊ฒŒ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[์ƒํƒœ ๊ด€๋ฆฌ (State Management)]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋Œ€๊ทœ๋ชจ ์•ฑ์—์„œ๋Š” ์ „์—ญ ์ƒํƒœ, ์„œ๋ฒ„ ์ƒํƒœ, ๋กœ์ปฌ ์ƒํƒœ๋ฅผ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌํ•ด์•ผ ํ™•์žฅ ๋ฐ ์„ฑ๋Šฅ ์œ ์ง€๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Context API์˜ ์„ฑ๋Šฅ์  ํ•œ๊ณ„(๋ฆฌ๋ Œ๋”๋ง ํญํ’)์™€ Zustand์˜ Selector ํŒจํ„ด, TanStack Query๋ฅผ ํ†ตํ•œ ์„œ๋ฒ„ ์ƒํƒœ ์บ์‹ฑ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[์„ฑ๋Šฅ ์ตœ์ ํ™” (Performance Optimization)]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋Œ€๊ทœ๋ชจ ์ฝ”๋“œ๋ฒ ์ด์Šค๋Š” ํ•„์—ฐ์ ์œผ๋กœ ๋ฒˆ๋“ค ํฌ๊ธฐ ์ฆ๊ฐ€์™€ ๋ Œ๋”๋ง ๋ณ‘๋ชฉ์„ ์ดˆ๋ž˜ํ•˜๋ฏ€๋กœ ์ด๋ฅผ ์ œ์–ดํ•˜๋Š” ๊ธฐ์ˆ ์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: React Compiler์˜ ์ž๋™ํ™”๋œ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ์›๋ฆฌ, Vite์˜ manualChunks๋ฅผ ํ†ตํ•œ ๋ฒˆ๋“ค ๋ถ„ํ• , React.lazy ๊ธฐ๋ฐ˜์˜ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ… ์ ์šฉ ๋ฐฉ์‹์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[์—๋Ÿฌ ๋ฐ”์šด๋”๋ฆฌ (Error Boundaries)]] + - ์—ฐ๊ฒฐ ์ด์œ : ์ปดํฌ๋„ŒํŠธ ํ•˜๋‚˜์˜ ์˜ค๋ฅ˜๊ฐ€ ์ „์ฒด ์•ฑ์˜ ํฌ๋ž˜์‹œ๋กœ ์ด์–ด์ง€์ง€ ์•Š๊ฒŒ ๋ง‰์•„์ฃผ๋Š” ๋Œ€๊ทœ๋ชจ ์‹œ์Šคํ…œ์˜ ํ•„์ˆ˜ ์•ˆ์ „๋ง์ž…๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ ๋‚ด์—์„œ ์—๋Ÿฌ๋ฅผ ๊ฒฉ๋ฆฌํ•˜๋Š” ์›๋ฆฌ์™€ ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๋ฅผ ์šฐ์•„ํ•˜๊ฒŒ ์ฒ˜๋ฆฌ(Graceful degradation)ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ (Memory Leaks)]] + - ์—ฐ๊ฒฐ ์ด์œ : ์•ฑ ์‚ฌ์šฉ ์‹œ๊ฐ„์ด ๊ธธ์–ด์งˆ์ˆ˜๋ก ์„ฑ๋Šฅ์„ ์‹ฌ๊ฐํ•˜๊ฒŒ ์ €ํ•˜์‹œํ‚ค๋Š” ์ˆจ์€ ์›์ธ์ž…๋‹ˆ๋‹ค. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํด๋กœ์ €(Closure)๋‚˜ Detached DOM์— ์˜ํ•ด ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํšŒ์ˆ˜ํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ตฌ์กฐ์  ์›์ธ๊ณผ DevTools๋ฅผ ํ™œ์šฉํ•œ ๋””๋ฒ„๊น… ๊ธฐ๋ฒ•์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### Deeper Research Questions +- FSD(Feature-Sliced Design) ๋„์ž… ์‹œ '์ธ์ฆ(Auth)'์ด๋‚˜ '๋ผ์šฐํŒ…'๊ณผ ๊ฐ™์€ Cross-cutting concern(๊ณตํ†ต ๊ด€์‹ฌ์‚ฌ)์€ ๊ณ„์ธต(Layer) ๊ตฌ์กฐ์˜ ์–ด๋А ๋ถ€๋ถ„์— ๋ฐฐ์น˜ํ•˜๊ณ  ์–ด๋–ป๊ฒŒ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ ํ•ฉํ•œ๊ฐ€? +- React Compiler๊ฐ€ ์ž๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์ˆ˜ํ–‰ํ•  ๋•Œ, ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(์˜ˆ: ๋ถˆ์•ˆ์ •ํ•œ ๊ฐ์ฒด ์ฐธ์กฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ปค์Šคํ…€ ํ›…)์™€์˜ ํ˜ธํ™˜์„ฑ ์ถฉ๋Œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๊ตฌ์ฒด์  ๋ฐฉ์•ˆ์€ ๋ฌด์—‡์ธ๊ฐ€? +- ๋Œ€๊ทœ๋ชจ ๋ฆฌ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ Œ๋”๋งํ•  ๋•Œ Virtualization(์œˆ๋„์œ™) ๊ธฐ์ˆ ์ด DOM ๋…ธ๋“œ ์ฆ๊ฐ€๋ฅผ ๋ง‰๋Š” ์›๋ฆฌ๋Š” ๋ฌด์—‡์ด๋ฉฐ, ์ด ๊ณผ์ •์—์„œ `key` ํ”„๋กญ(prop)์ด ์„ฑ๋Šฅ์— ๋ฏธ์น˜๋Š” ์ •ํ™•ํ•œ ์˜ํ–ฅ์€ ๋ฌด์—‡์ธ๊ฐ€? +- ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์˜ ํ”„๋ก ํŠธ์—”๋“œ ๋ชจ๋‹ˆํ„ฐ๋ง(Sentry, Datadog ๋“ฑ)์ด ์ œ๊ณตํ•˜๋Š” ์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด(Session Replay) ๊ธฐ๋Šฅ์ด ๊ฐœ๋ฐœ์ž์˜ ๋””๋ฒ„๊น…์— ์–ด๋–ป๊ฒŒ ๊ธฐ์—ฌํ•˜๋ฉฐ, ์ด๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฏผ๊ฐ ๋ฐ์ดํ„ฐ ์œ ์ถœ ๋ฐ ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ ์ฆ๊ฐ€๋ผ๋Š” ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๋Š” ์–ด๋–ป๊ฒŒ ๊ทน๋ณตํ•˜๋Š”๊ฐ€? +- Zustand, Jotai์™€ ๊ฐ™์€ ์ตœ์‹  ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๊ธฐ์กด์˜ Redux๋‚˜ Context API์™€ ๋น„๊ตํ•˜์—ฌ ๋™์ /์‹ค์‹œ๊ฐ„ ๋ Œ๋”๋ง ์ตœ์ ํ™”(์˜ˆ: ๋ฆฌ๋ Œ๋”๋ง ์Šคํ‚ต)๋ฅผ ๋‚ด๋ถ€์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ๋Š”๊ฐ€? + +### Practical Application Contexts +- **Implementation:** ํŒŒ์ผ๊ณผ ํด๋” ๋„ค์ด๋ฐ ๊ทœ์น™(ํŒŒ์ผ: kebab-case, ์ปดํฌ๋„ŒํŠธ: PascalCase)์„ ํ†ต์ผํ•˜๊ณ , 300์ค„์ด ๋„˜์–ด๊ฐ€๋Š” ์ปดํฌ๋„ŒํŠธ๋Š” ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)์— ๋”ฐ๋ผ ๋” ์ž‘์€ ํ›…(Hook)๊ณผ ์„œ๋ธŒ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ฆฌํŒฉํ† ๋งํ•ฉ๋‹ˆ๋‹ค. +- **System Design:** ํ”„๋กœ์ ํŠธ ์„ค๊ณ„ ์‹œ ํด๋” ๊ตฌ์กฐ๋ฅผ ๊ธฐ์ˆ  ์Šคํƒ(components, hooks) ๊ธฐ๋ฐ˜์ด ์•„๋‹Œ ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ(features/auth, features/dashboard ๋“ฑ) ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์„ฑํ•˜์—ฌ ๊ฐ ๋ชจ๋“ˆ์˜ ์บก์Аํ™”๋ฅผ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. +- **Operation / Maintenance:** ๊ฐœ๋ณ„ ์„œ๋“œํŒŒํ‹ฐ ์œ„์ ฏ์ด๋‚˜ ๋ถˆ์•ˆ์ •ํ•œ UI ํŒŒํŠธ์— Error Boundary๋ฅผ ์”Œ์›Œ ๋ฉ”์ธ ์„œ๋น„์Šค์˜ ๋™์ž‘์„ ๋ณด์žฅํ•˜๋ฉฐ, Memory Profiler๋ฅผ ์‚ฌ์šฉํ•ด Detached DOM node ๋“ฑ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ์š”์ธ์„ ์ •๊ธฐ์ ์œผ๋กœ ๊ฐ์‚ฌ(Audit)ํ•ฉ๋‹ˆ๋‹ค. +- **Learning Path:** ๋ฆฌ์•กํŠธ ํ•ต์‹ฌ ์›๋ฆฌ(๋ Œ๋”๋ง ํŠธ๋ฆฌ๊ฑฐ ์ดํ•ด) โ†’ ํด๋” ๊ตฌ์กฐ/์•„ํ‚คํ…์ฒ˜(FSD) ์„ค๊ณ„ โ†’ ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ ๋น„๊ต ๋ฐ ๋„์ž… โ†’ ์›น ์„ฑ๋Šฅ ์ง€ํ‘œ(Core Web Vitals) ๋ฐ ๋ฒˆ๋“ค๋Ÿฌ(Vite) ์ตœ์ ํ™” ๋„๊ตฌ ์ฒด๋“์˜ ์ˆœ์„œ๋กœ ํ•™์Šต์„ ๊ณ ๋„ํ™”ํ•ฉ๋‹ˆ๋‹ค. +- **My Project Relevance:** ํŒ€ ๋‹จ์œ„์˜ ํ˜‘์—… ์‹œ ESLint, Prettier, Husky๋ฅผ ๋„์ž…ํ•ด ์•„ํ‚คํ…์ฒ˜ ๊ทœ์น™(๋‹ค๋ฅธ Feature์— ์ง์ ‘ ์ ‘๊ทผ ๊ธˆ์ง€ ๋“ฑ)์„ ์ž๋™ ๊ฐ•์ œํ•˜๊ณ , ์ฝ”๋“œ ๋ฆฌ๋ทฐ ์‹œ ์ผ๊ด€๋œ ์•„ํ‚คํ…์ฒ˜ ์›์น™์„ ๊ธฐ์ค€์œผ๋กœ ์‚ผ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### Adjacent Topics +- [[๋งˆ์ดํฌ๋กœ ํ”„๋ก ํŠธ์—”๋“œ (Micro-Frontends)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋‹จ์ผ ์ €์žฅ์†Œ(Monorepo) ๋ฐ ๋ชจ๋“ˆํ™”์˜ ํ•œ๊ณ„๋ฅผ ๋„˜์–ด, ์ดˆ๋Œ€ํ˜• ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ํ™˜๊ฒฝ์—์„œ ์—ฌ๋Ÿฌ ํŒ€์ด ํ”„๋ก ํŠธ์—”๋“œ๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ๋ฐฐํฌํ•˜๊ณ  ์šด์˜ํ•˜๊ธฐ ์œ„ํ•œ ๋Ÿฐํƒ€์ž„ ํ†ตํ•ฉ ์•„ํ‚คํ…์ฒ˜๋กœ ์ง€์‹์„ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค. +- [[์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ (Visual Regression Testing)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: Storybook์„ ํ™œ์šฉํ•œ ์ปดํฌ๋„ŒํŠธ ๊ณ ๋ฆฝ ๊ฐœ๋ฐœ์„ ๋„˜์–ด์„œ, Happo, Chromatic ๋“ฑ์˜ ๋„๊ตฌ๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ ๋ณ€๊ฒฝ์ด UI๋‚˜ ์ ‘๊ทผ์„ฑ(Accessibility)์— ์˜๋„์น˜ ์•Š์€ ํŒŒ๊ดด์  ์˜ํ–ฅ์„ ๋ฏธ์ณค๋Š”์ง€ ์ž๋™ ๊ฒ€์ฆํ•˜๋Š” QA ๊ณ ๋„ํ™” ์˜์—ญ์œผ๋กœ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค. + +--- +*Last updated: 2026-04-30* \ No newline at end of file diff --git a/10_Wiki/Topics_GD/ํ”„๋ก ํŠธ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ Œ๋”๋ง ๋ณ‘๋ชฉ ๊ฐœ์„ .md b/10_Wiki/Topics_GD/ํ”„๋ก ํŠธ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ Œ๋”๋ง ๋ณ‘๋ชฉ ๊ฐœ์„ .md new file mode 100644 index 00000000..600727cc --- /dev/null +++ b/10_Wiki/Topics_GD/ํ”„๋ก ํŠธ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ Œ๋”๋ง ๋ณ‘๋ชฉ ๊ฐœ์„ .md @@ -0,0 +1,70 @@ +# [[ํ”„๋ก ํŠธ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ Œ๋”๋ง ๋ณ‘๋ชฉ ๊ฐœ์„ ]] + +## ๐Ÿ“Œ Brief Summary +ํ”„๋ก ํŠธ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ Œ๋”๋ง ๋ณ‘๋ชฉ์€ ๋ถˆํ•„์š”ํ•˜๊ฑฐ๋‚˜ ๊ณผ๋„ํ•œ ์ปดํฌ๋„ŒํŠธ ๋ฆฌ๋ Œ๋”๋ง์œผ๋กœ ์ธํ•ด UI ๋ฐ˜์‘์„ฑ์ด ๋–จ์–ด์ง€๊ณ  ์ƒํ˜ธ์ž‘์šฉ ์†๋„๊ฐ€ ์ง€์—ฐ๋˜๋Š” ํ˜„์ƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค [1, 2]. ์ด๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ Œ๋”๋ง ํŠธ๋ฆฌ๊ฑฐ(์ƒํƒœ, Props, Context ๋“ฑ)๋ฅผ ์‹๋ณ„ํ•˜๊ณ  ๋ฉ”๋ชจ์ด์ œ์ด์…˜, ๋ฆฌ์ŠคํŠธ ๊ฐ€์ƒํ™”, ์ƒํƒœ ๋ถ„๋ฆฌ, ๋™์‹œ์„ฑ ๋ Œ๋”๋ง(Concurrent Rendering) ๊ธฐ๋Šฅ ๋“ฑ์„ ํ™œ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [3, 4]. ์ง€์†์ ์ธ ํ”„๋กœํŒŒ์ผ๋ง์„ ํ†ตํ•ด ๋ Œ๋”๋ง ๋น„์šฉ์ด ๋†’์€ ๋ถ€๋ถ„์„ ์ธก์ •ํ•˜๊ณ  ์ „๋žต์ ์œผ๋กœ ์ตœ์ ํ™”๋ฅผ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค [5, 6]. + +## ๐Ÿ“– Core Content +* **๋ Œ๋”๋ง ๋ฐœ์ƒ ์›์ธ ํŒŒ์•… ๋ฐ ํ”„๋กœํŒŒ์ผ๋ง** + React ์ปดํฌ๋„ŒํŠธ๋Š” ์ƒํƒœ(State), Props, Context์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๊ฑฐ๋‚˜ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง๋  ๋•Œ ๋ฆฌ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค [4]. ์ด๋Ÿฌํ•œ ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํŠธ๋ฆฌ๊ฐ€ ๊นŠ์„ ๊ฒฝ์šฐ ์Šคํฌ๋ฆฝํŒ… ์‹œ๊ฐ„์„ 30~60% ์ฆ๊ฐ€์‹œ์ผœ ์„ฑ๋Šฅ์„ ์ €ํ•˜์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2]. ๋”ฐ๋ผ์„œ React DevTools Profiler๋‚˜ `why-did-you-render` ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ด ๋ Œ๋”๋ง ๋นˆ๋„์™€ ๋น„์šฉ์„ ์ธก์ •ํ•œ ๋’ค ์ตœ์ ํ™”๋ฅผ ์ง„ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [5, 7, 8]. +* **๋ฉ”๋ชจ์ด์ œ์ด์…˜(Memoization)๊ณผ ์ฐธ์กฐ ์•ˆ์ •์„ฑ** + `React.memo()`, `useCallback`, `useMemo`๋ฅผ ์ ์ ˆํžˆ ํ™œ์šฉํ•˜๋ฉด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์€ ์ปดํฌ๋„ŒํŠธ์˜ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ง‰์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [9, 10]. ๋‹จ, JSX ๋‚ด๋ถ€์— ์ต๋ช… ํ•จ์ˆ˜๋‚˜ ์ธ๋ผ์ธ ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์ •์˜ํ•˜์—ฌ Props๋กœ ๋„˜๊ธฐ๋ฉด ์–•์€ ๋น„๊ต(Shallow comparison) ํŠน์„ฑ์ƒ ๋งค ๋ Œ๋”๋ง๋งˆ๋‹ค ์ƒˆ๋กœ์šด ์ฐธ์กฐ๊ฐ€ ์ƒ์„ฑ๋˜์–ด ๋ฉ”๋ชจ์ด์ œ์ด์…˜์ด ๋ฌด๋ ฅํ™”๋˜๋ฏ€๋กœ ์ฐธ์กฐ๋ฅผ ์•ˆ์ •ํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [10-12]. +* **React Compiler๋ฅผ ํ†ตํ•œ ์ž๋™ํ™”** + 2025๋…„ ๊ธฐ์ค€ React Compiler๋Š” ๋นŒ๋“œ ํƒ€์ž„์— ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ •์ ์œผ๋กœ ๋ถ„์„ํ•˜์—ฌ JSX ์š”์†Œ ๋‹จ์œ„๊นŒ์ง€ ์„ธ๋ฐ€ํ•˜๊ฒŒ ์ž๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค [13, 14]. ์ด๋ฅผ ํ†ตํ•ด ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์˜ ๋ฒˆ๊ฑฐ๋กœ์›€์„ ์ค„์ด๊ณ  ๋ Œ๋”๋ง ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [15]. +* **Context API ์ตœ์ ํ™”์™€ ๊ธ€๋กœ๋ฒŒ ์ƒํƒœ ๋ถ„๋ฆฌ** + Context API๋Š” ๊ฐ’์ด ๋ณ€ํ•  ๋•Œ ํ•ด๋‹น ์ปจํ…์ŠคํŠธ๋ฅผ ๊ตฌ๋…ํ•˜๋Š” ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” "๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ์‹œ์Šคํ…œ"์œผ๋กœ ์ž‘๋™ํ•˜์—ฌ ํฐ ๋ณ‘๋ชฉ์„ ์œ ๋ฐœํ•ฉ๋‹ˆ๋‹ค [16, 17]. ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ปจํ…์ŠคํŠธ๋ฅผ ์ž‘์€ ๋„๋ฉ”์ธ ๋‹จ์œ„๋กœ ์ชผ๊ฐœ๊ฑฐ๋‚˜, Zustand ๋“ฑ ํŠน์ • ์ƒํƒœ ์Šฌ๋ผ์ด์Šค(Slice)๋งŒ ์„ ํƒ์ ์œผ๋กœ ๊ตฌ๋…(Selector)ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋ฒผ์šด ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฆฌ๋ Œ๋”๋ง์„ ์ œ์–ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [16, 18-20]. +* **๋™์‹œ์„ฑ ๊ธฐ๋Šฅ(Concurrent Features)์˜ ํ™œ์šฉ** + `useTransition`์„ ์‚ฌ์šฉํ•ด ์ค‘์š”ํ•˜์ง€ ์•Š์€ ์—…๋ฐ์ดํŠธ๋ฅผ ์ง€์—ฐ์‹œํ‚ด์œผ๋กœ์จ ํƒ€์ดํ•‘๊ณผ ๊ฐ™์€ ์ฆ‰๊ฐ์ ์ธ ์ƒํ˜ธ์ž‘์šฉ์ด ์ฐจ๋‹จ๋˜์ง€ ์•Š๊ฒŒ ํ•˜๊ณ , `useDeferredValue`๋กœ ๋ฌด๊ฑฐ์šด ํŒŒ์ƒ ๋ฐ์ดํ„ฐ์˜ ๋ Œ๋”๋ง์„ ๋ฏธ๋ฃจ์–ด UI์˜ ๋ฐ˜์‘์„ฑ์„ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [21-23]. +* **๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ ๊ฐ€์ƒํ™”(Virtualization) ๋ฐ ๋ฆฌ์ŠคํŠธ ์ตœ์ ํ™”** + 50~100๊ฐœ ์ด์ƒ์˜ ํ•ญ๋ชฉ์ด ์žˆ๋Š” ๊ธด ๋ชฉ๋ก์€ ๋‹ค์ˆ˜์˜ DOM ๋…ธ๋“œ ๋ Œ๋”๋ง์„ ์œ ๋ฐœํ•˜์—ฌ ๋ณ‘๋ชฉ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค [24, 25]. `react-window` ๋“ฑ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ™œ์šฉํ•ด ๋ทฐํฌํŠธ์— ๋ณด์ด๋Š” ํ•ญ๋ชฉ๋งŒ ๋ Œ๋”๋งํ•˜๋Š” ์œˆ๋„์œ™(Windowing) ๊ธฐ๋ฒ•์„ ์ ์šฉํ•˜๊ณ , ์•ˆ์ •์ ์ด๊ณ  ๊ณ ์œ ํ•œ `key`๋ฅผ ๋ถ€์—ฌํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ DOM ์žฌ์ƒ์„ฑ์„ ๋ง‰์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค [25-27]. + +## โš–๏ธ Trade-offs & Caveats +* **๋ฉ”๋ชจ์ด์ œ์ด์…˜ ์˜ค๋ฒ„ํ—ค๋“œ:** `React.memo()`, `useCallback`, `useMemo`๋Š” ๋‚จ์šฉ๋  ๊ฒฝ์šฐ ์„ฑ๋Šฅ์„ ์˜คํžˆ๋ ค ์•…ํ™”์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [28, 29]. ์ด์ „ Props์™€ ์ƒˆ Props๋ฅผ ๋น„๊ตํ•˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๋Š” ๊ณผ์ •์— ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋ Œ๋”๋ง ๋น„์šฉ์ด ์ €๋ ดํ•œ ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” ๋ Œ๋”๋ง ์ž์ฒด๋ณด๋‹ค ๋น„๊ต ์—ฐ์‚ฐ์˜ ๋น„์šฉ์ด ๋” ํด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [29]. +* **React Compiler์˜ ์ œ์•ฝ ์‚ฌํ•ญ:** React Compiler๋Š” ์ž๋™ ์ตœ์ ํ™”๋ฅผ ์ œ๊ณตํ•˜์ง€๋งŒ, 'Rules of React'๋ฅผ ์—„๊ฒฉํžˆ ์ค€์ˆ˜ํ•ด์•ผ ์ •์ƒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค [30, 31]. ๋˜ํ•œ ๋งค ๋ Œ๋”๋ง๋งˆ๋‹ค ์ƒˆ๋กœ์šด ์ฐธ์กฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ผ๋ถ€ ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ›…(์˜ˆ: TanStack Query์˜ `useMutation` ๋“ฑ)๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ์ฒด์ธ์ด ๋Š์–ด์ง€๋Š” ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [32, 33]. +* **Context API vs ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋„์ž…:** Context API๋Š” ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ถ”๊ฐ€ ์—†์ด ํ…Œ๋งˆ, ๋‹ค๊ตญ์–ด ๋“ฑ ์ •์  ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ์— ์šฉ์ดํ•˜์ง€๋งŒ [34], ์žฆ์€ ์ƒํƒœ ๋ณ€๊ฒฝ์—๋Š” ์„ฑ๋Šฅ ์ทจ์•ฝ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค [35]. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์™ธ๋ถ€ ์ƒํƒœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(Zustand ๋“ฑ)๋ฅผ ๋ฌด์กฐ๊ฑด ๋„์ž…ํ•˜๋ฉด ์ถ”๊ฐ€์ ์ธ ๋ฒˆ๋“ค ์šฉ๋Ÿ‰ ์ฆ๊ฐ€ ๋ฐ ํŒ€์˜ ํ•™์Šต ๊ณก์„ ์ด ์ˆ˜๋ฐ˜๋œ๋‹ค๋Š” ๋ฐ˜๋Œ€ ๊ธ‰๋ถ€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค [36, 37]. +* **์ต๋ช… ํ•จ์ˆ˜ ์ œ๊ฑฐ์— ๋”ฐ๋ฅธ ์ฝ”๋“œ ๋ณต์žก๋„ ์ฆ๊ฐ€:** ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ง‰๊ณ ์ž ๋ชจ๋“  ์ธ๋ผ์ธ ํ•จ์ˆ˜๋ฅผ ์™ธ๋ถ€๋กœ ๋นผ๊ฑฐ๋‚˜ `useCallback`์œผ๋กœ ๊ฐ์‹ธ๋ฉด ์ฝ”๋“œ๊ฐ€ ๊ธธ์–ด์ง€๊ณ  ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [38]. ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ž‘๊ณ  ์„ฑ๋Šฅ ์˜ํ–ฅ์ด ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” ์ต๋ช… ํ•จ์ˆ˜ ์‚ฌ์šฉ์ด ์‹ค์šฉ์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [38]. + +## ๐Ÿ”— Knowledge Connections + +### Related Concepts + +#### [์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] +- [[Context API]] + - ์—ฐ๊ฒฐ ์ด์œ : ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ ๊นŠ์€ ๊ณณ๊นŒ์ง€ ์ƒํƒœ๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์œผ๋‚˜ ๊ตฌ๋… ์ค‘์ธ ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฆฌ๋ Œ๋”๋ง์‹œํ‚ค๋Š” ํŠน์„ฑ์ƒ ๋ Œ๋”๋ง ๋ณ‘๋ชฉ์˜ ์ฃผ์š” ์›์ธ์ด ๋ฉ๋‹ˆ๋‹ค [17]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ๊ธฐ๋ฐ˜ ์ƒํƒœ ๊ด€๋ฆฌ์˜ ํ•œ๊ณ„์™€ ๋ฆฌ๋ Œ๋”๋ง ๋ฐœ์ƒ ๋ฒ”์œ„๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[Concurrent Rendering]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋ Œ๋”๋ง ์ž‘์—…์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋ถ€์—ฌํ•˜๊ณ  ์ค‘๋‹จ/์žฌ๊ฐœํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ์ˆ ๋กœ, `useTransition` ๋“ฑ์„ ํ†ตํ•ด ๋ฌด๊ฑฐ์šด ๋ Œ๋”๋ง์ด ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋ฅผ ๋ง‰๋Š” ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค [21]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ฐ˜์‘์„ฑ ์ง€ํ‘œ(INP ๋“ฑ)๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•œ ๋ Œ๋”๋ง ์Šค์ผ€์ค„๋ง ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[React Compiler]] + - ์—ฐ๊ฒฐ ์ด์œ : ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์˜ ํ•œ๊ณ„๋ฅผ ๊ทน๋ณตํ•˜๊ณ  ๋นŒ๋“œ ํƒ€์ž„์— ์ž๋™์œผ๋กœ JSX ์š”์†Œ ๋‹จ์œ„์˜ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์ ์šฉํ•˜์—ฌ ๋ Œ๋”๋ง ์ตœ์ ํ™”๋ฅผ ๋‹ฌ์„ฑํ•ฉ๋‹ˆ๋‹ค [13, 14]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ตœ์‹  React์˜ ๋ Œ๋”๋ง ์ตœ์ ํ™”๊ฐ€ ๋Ÿฐํƒ€์ž„ ์ œ์–ด์—์„œ ์ปดํŒŒ์ผ๋Ÿฌ ๊ธฐ๋ฐ˜ ์ •์  ๋ถ„์„์œผ๋กœ ๋„˜์–ด๊ฐ€๋Š” ๊ธฐ์ˆ ์  ์ง„ํ™”๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +#### [๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ] +- [[Zustand]] + - ์—ฐ๊ฒฐ ์ด์œ : ์…€๋ ‰ํ„ฐ(Selector) ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•ด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ž์‹ ์ด ํ•„์š”ํ•œ ์ƒํƒœ ์กฐ๊ฐ(Slice)์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งŒ ๋ฆฌ๋ Œ๋”๋ง๋˜๋„๋ก ๋ณด์žฅํ•˜์—ฌ ๋ณ‘๋ชฉ์„ ์ค„์ด๋Š” ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค [18]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ „์—ญ ์ƒํƒœ์˜ ํŒŒํŽธํ™” ๊ด€๋ฆฌ์™€ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ์ฐจ๋‹จํ•˜๋Š” ๊ตฌ๋… ์ตœ์ ํ™” ํŒจํ„ด์„ ํ•™์Šตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [[List Virtualization (Windowing)]] + - ์—ฐ๊ฒฐ ์ด์œ : ๋Œ€๊ทœ๋ชจ ๋ฆฌ์ŠคํŠธ์—์„œ ์‚ฌ์šฉ์ž์˜ ํ™”๋ฉด ๋ทฐํฌํŠธ์— ์กด์žฌํ•˜๋Š” DOM ๋…ธ๋“œ๋งŒ ์ œํ•œ์ ์œผ๋กœ ๋ Œ๋”๋งํ•˜์—ฌ DOM ํŠธ๋ฆฌ ๋น„๋Œ€ํ™”๋ฅผ ๋ง‰์Šต๋‹ˆ๋‹ค [25, 26]. + - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋‹ค์ˆ˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ Œ๋”๋งํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ฐ ๋ ˆ์ด์•„์›ƒ ํŽ˜์ธํŒ… ๋ณ‘๋ชฉ์„ ์ œ์–ดํ•˜๋Š” ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### Deeper Research Questions +- React Compiler๋Š” ๋นŒ๋“œ ํƒ€์ž„์— ๋ช…์‹œ์ ์ธ ์˜์กด์„ฑ ๋ฐฐ์—ด ์—†์ด ์–ด๋–ป๊ฒŒ ๋‚ด๋ถ€ JSX ๋…ธ๋“œ๋ณ„ ์บ์‹ฑ ๋ฐ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๋‹จ์œ„๋ฅผ ๊ฒฐ์ •ํ•˜๋Š”๊ฐ€? +- Context API์˜ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ๋ฆฌ๋ Œ๋”๋ง ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” `use-context-selector`์˜ ์›๋ฆฌ๋Š” ๋ฌด์—‡์ด๋ฉฐ, Zustand์˜ ๊ตฌ๋… ์ตœ์ ํ™” ๋ฐฉ์‹๊ณผ ๊ตฌ์กฐ์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ๊ฐ€? +- `useTransition`๊ณผ `useDeferredValue`๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ์‚ฌ์šฉํ•  ๋•Œ, ๋ธŒ๋ผ์šฐ์ €์˜ ํŽ˜์ธํŠธ ์ฃผ๊ธฐ(Paint Cycle) ๊ด€์ ์—์„œ ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง์€ ์–ด๋–ป๊ฒŒ ์Šค์ผ€์ค„๋ง ๋ฐ ์ง€์—ฐ๋˜๋Š”๊ฐ€? +- ๋Œ€ํ˜• ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ List Virtualization๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ์Šคํฌ๋กค ์ด๋ฒคํŠธ ๋””๋ฐ”์šด์‹ฑ(Debouncing) ํ˜น์€ ์“ฐ๋กœํ‹€๋ง(Throttling) ์ตœ์ ํ™”์˜ ๊ธฐ์ˆ ์  ํ•œ๊ณ„์ ์€ ๋ฌด์—‡์ธ๊ฐ€? +- ์ƒํƒœ ๊ด€๋ฆฌ ์•„ํ‚คํ…์ฒ˜ ๊ด€์ ์—์„œ, Feature-Sliced Design(FSD)๊ณผ ๊ฐ™์ด ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ํด๋” ๋ฐ ๊ตฌ์กฐ์  ์„ค๊ณ„๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฆฌ๋ Œ๋”๋ง ๋ฒ”์œ„๋ฅผ ์ œํ•œํ•˜๋Š” ๋ฐ ์–ด๋–ป๊ฒŒ ๊ธฐ์—ฌํ•˜๋Š”๊ฐ€? + +### Practical Application Contexts +- **Implementation:** Props๋กœ ์ „๋‹ฌํ•˜๋Š” ํ•จ์ˆ˜๋‚˜ ๊ฐ์ฒด๋Š” ์ต๋ช… ์ƒ์„ฑ(์ธ๋ผ์ธ)์„ ์ง€์–‘ํ•˜๊ณ  `useCallback`์ด๋‚˜ ์™ธ๋ถ€ ์„ ์–ธ์œผ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ์ฐธ์กฐ ๋ฌด๊ฒฐ์„ฑ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜๋ฐฑ ๊ฐœ ์ด์ƒ์˜ ํ•ญ๋ชฉ์„ ๋ Œ๋”๋งํ•  ๊ฒฝ์šฐ `react-window`์™€ ๊ฐ™์€ ๊ฐ€์ƒํ™” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์˜๋ฌด์ ์œผ๋กœ ๋„์ž…ํ•ฉ๋‹ˆ๋‹ค. +- **System Design:** ๋นˆ๋ฒˆํžˆ ์—…๋ฐ์ดํŠธ๋˜๋Š” ์ƒํƒœ(์˜ˆ: ์•Œ๋ฆผ ๊ฐœ์ˆ˜, ์žฅ๋ฐ”๊ตฌ๋‹ˆ)๋Š” Context API ๋Œ€์‹  Zustand ๋“ฑ์˜ ์„ ํƒ์  ๊ตฌ๋…์ด ๊ฐ€๋Šฅํ•œ ์Šคํ† ์–ด์— ๋ฐฐ์น˜ํ•˜๊ณ , ์ •์  ๋ฐ์ดํ„ฐ(ํ…Œ๋งˆ ๋“ฑ)๋Š” Context๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ Œ๋”๋ง ์ „ํŒŒ ๋ฒ”์œ„๋ฅผ ์‹œ์Šคํ…œ ๋ ˆ๋ฒจ์—์„œ ๊ฒฉ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. +- **Operation / Maintenance:** `why-did-you-render` ํŒจํ‚ค์ง€์™€ React DevTools์˜ Profiler ํŒจ๋„์„ ์ด์šฉํ•ด ๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ฐ˜๋ณต ๋ Œ๋”๋ง๋˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ฐพ์•„๋‚ด๊ณ , ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋Š” Core Web Vitals(INP, FCP ๋“ฑ)๋ฅผ ์ถ”์ ํ•˜์—ฌ ์ƒํ˜ธ์ž‘์šฉ ์ง€์—ฐ์ด ์žˆ๋Š”์ง€ ๋ชจ๋‹ˆํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค. +- **Learning Path:** React์˜ ๋ Œ๋”๋ง ์กฐ๊ฑด(State, Props, Parent) ์ดํ•ด -> ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๋„๊ตฌ ์ˆ™๋‹ฌ -> Context API์˜ ์„ฑ๋Šฅ ํ•œ๊ณ„ ์ฒด๊ฐ ๋ฐ Zustand ํ™œ์šฉ -> Concurrent Features ์ ์šฉ -> React Compiler๋ฅผ ์ด์šฉํ•œ ์ž๋™ํ™” ํ๋ฆ„์œผ๋กœ ๋ Œ๋”๋ง ์ตœ์ ํ™” ์ง€์‹์„ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค. +- **My Project Relevance:** ํ˜„์žฌ ์œ ์ง€ ๋ณด์ˆ˜ํ•˜๊ฑฐ๋‚˜ ์‹ ๊ทœ ๊ตฌ์ถ•ํ•˜๋Š” React ์›น ์•ฑ์—์„œ ์Šคํฌ๋กค ๋Š๊น€์ด๋‚˜ ํด๋ฆญ ์‹œ ๋ฐ˜์‘ ์ง€์—ฐ์ด ๋ฐœ์ƒํ•  ๋•Œ, ํ•ด๋‹น ๊ฐœ๋…์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ณ‘๋ชฉ์ด ๋˜๋Š” ์ปดํฌ๋„ŒํŠธ์˜ ๋ Œ๋”๋ง ํšŸ์ˆ˜๋ฅผ ์ธก์ •ํ•˜๊ณ  ์ ์ ˆํ•œ ์ตœ์ ํ™” ๋„๊ตฌ๋ฅผ ์ฆ‰๊ฐ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### Adjacent Topics +- [[Server Components (Next.js)]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋ธŒ๋ผ์šฐ์ €์—์„œ์˜ ๋ Œ๋”๋ง ๋ถ€ํ•˜๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด ํด๋ผ์ด์–ธํŠธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค์„ ์ตœ์†Œํ™”ํ•˜๊ณ  ์„œ๋ฒ„์—์„œ ์ •์  UI๋ฅผ ๋ Œ๋”๋งํ•˜์—ฌ ๋„˜๊ฒจ์ฃผ๋Š” ์•„ํ‚คํ…์ฒ˜์  ์ตœ์ ํ™”์— ๋Œ€ํ•ด ์‹ฌ๋„ ์žˆ๊ฒŒ ์กฐ์‚ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [39-41]. +- [[JavaScript Memory Leaks]] + - ํ™•์žฅ ๋ฐฉํ–ฅ: ๊ณผ๋„ํ•œ ๋ Œ๋”๋ง ์™ธ์—๋„ ํด๋กœ์ €๋‚˜ ๋ถ„๋ฆฌ๋œ DOM ๋…ธ๋“œ์— ์˜ํ•ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•ด์ œ๋˜์ง€ ์•Š๊ณ  ๋ˆ„์ ๋˜์–ด ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์ผ์œผํ‚ค๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ์‹๋ณ„ ๋ฐ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์œผ๋กœ ์ดํ•ด๋ฅผ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค [42-44]. + +--- +*Last updated: 2026-04-30* \ No newline at end of file