From b84595920098abf0d87ddd7c78411d0098d5bdd5 Mon Sep 17 00:00:00 2001 From: Antigravity Agent Date: Thu, 30 Apr 2026 23:01:12 +0900 Subject: [PATCH] Update: 2026-04-30 22:59 --- .DS_Store | Bin 8196 -> 8196 bytes .../Frontend_Mastery/Bulletproof React.md | 42 +++++++++++ .../Frontend_Mastery/Error Boundaries.md | 42 +++++++++++ .../Frontend_Mastery/Frontend Architecture.md | 41 +++++++++++ .../Frontend_Mastery/Frontend Scalability.md | 42 +++++++++++ .../Frontend System Design.md | 42 +++++++++++ 10_Wiki/Topics/Frontend_Mastery/JSX.md | 41 +++++++++++ .../Large-scale React Systems.md | 42 +++++++++++ .../Frontend_Mastery/React Architecture.md | 44 ++++++++++++ .../React Component Design.md | 45 ++++++++++++ .../React Folder Structure.md | 45 ++++++++++++ .../React Frontend Development.md | 65 ++++++++++-------- .../Frontend_Mastery/React Refactoring.md | 42 +++++++++++ .../React Server Components.md | 48 +++++++++---- 10_Wiki/Topics/Frontend_Mastery/React.md | 42 +++++++++++ .../Scalable Frontend Architecture.md | 44 ++++++++++++ .../Git Branching Strategy.md | 43 ++++++++++++ .../Programming & Tools/Debugging Methods.md | 41 +++++++++++ .../Programming & Tools/Naming Conventions.md | 46 +++++++++++++ .../Refactoring Techniques.md | 41 +++++++++++ .../Topics/Programming & Tools/Refactoring.md | 45 ++++++++++++ .../Agile Development.md | 38 ++++++++++ .../Clean Code & SOLID Principles.md | 43 ++++++++++++ .../Legacy System Migration.md | 43 ++++++++++++ .../Open-Closed Principle (OCP).md | 41 +++++++++++ .../Software Engineering Principles.md | 44 ++++++++++++ .../Software Architecture/Startup Projects.md | 40 +++++++++++ .../system_analysis_and_improvement_plan.md | 52 ++++++++++++++ .../Bundle Size Optimization.md | 44 ++++++++++++ .../Frontend Observability & Logging.md | 43 ++++++++++++ .../Vite Build Optimization.md | 39 +++++++++++ 31 files changed, 1268 insertions(+), 42 deletions(-) create mode 100644 10_Wiki/Topics/Frontend_Mastery/Bulletproof React.md create mode 100644 10_Wiki/Topics/Frontend_Mastery/Error Boundaries.md create mode 100644 10_Wiki/Topics/Frontend_Mastery/Frontend Architecture.md create mode 100644 10_Wiki/Topics/Frontend_Mastery/Frontend Scalability.md create mode 100644 10_Wiki/Topics/Frontend_Mastery/Frontend System Design.md create mode 100644 10_Wiki/Topics/Frontend_Mastery/JSX.md create mode 100644 10_Wiki/Topics/Frontend_Mastery/Large-scale React Systems.md create mode 100644 10_Wiki/Topics/Frontend_Mastery/React Architecture.md create mode 100644 10_Wiki/Topics/Frontend_Mastery/React Component Design.md create mode 100644 10_Wiki/Topics/Frontend_Mastery/React Folder Structure.md create mode 100644 10_Wiki/Topics/Frontend_Mastery/React Refactoring.md create mode 100644 10_Wiki/Topics/Frontend_Mastery/React.md create mode 100644 10_Wiki/Topics/Frontend_Mastery/Scalable Frontend Architecture.md create mode 100644 10_Wiki/Topics/Infrastructure & Automation/Git Branching Strategy.md create mode 100644 10_Wiki/Topics/Programming & Tools/Debugging Methods.md create mode 100644 10_Wiki/Topics/Programming & Tools/Naming Conventions.md create mode 100644 10_Wiki/Topics/Programming & Tools/Refactoring Techniques.md create mode 100644 10_Wiki/Topics/Programming & Tools/Refactoring.md create mode 100644 10_Wiki/Topics/Software Architecture/Agile Development.md create mode 100644 10_Wiki/Topics/Software Architecture/Clean Code & SOLID Principles.md create mode 100644 10_Wiki/Topics/Software Architecture/Legacy System Migration.md create mode 100644 10_Wiki/Topics/Software Architecture/Open-Closed Principle (OCP).md create mode 100644 10_Wiki/Topics/Software Architecture/Software Engineering Principles.md create mode 100644 10_Wiki/Topics/Software Architecture/Startup Projects.md create mode 100644 10_Wiki/Topics/System Design & Modeling/system_analysis_and_improvement_plan.md create mode 100644 10_Wiki/Topics/Web & Performance/Bundle Size Optimization.md create mode 100644 10_Wiki/Topics/Web & Performance/Frontend Observability & Logging.md create mode 100644 10_Wiki/Topics/Web & Performance/Vite Build Optimization.md diff --git a/.DS_Store b/.DS_Store index 08e190804bfbf19ceaf5390b6a65b6c45d3b3fb8..af78cf1c25c1d1b88f03deab259c5318083ba190 100644 GIT binary patch delta 35 rcmZp1XmOa}&&azmU^hP_?_?eU?akQ&bJ!;~m~3X3_|CGil8qSv%+Cuy delta 79 zcmZp1XmOa}&&aniU^hP_-((&EZA~r)J%)6KOokF5PG`tt$Y&^GNcGIgPfp6oPhwzT f5CCE)AfC5bM_@VoW_F41ER&r?WHvt&dBp?(2ptr1 diff --git a/10_Wiki/Topics/Frontend_Mastery/Bulletproof React.md b/10_Wiki/Topics/Frontend_Mastery/Bulletproof React.md new file mode 100644 index 00000000..e712e380 --- /dev/null +++ b/10_Wiki/Topics/Frontend_Mastery/Bulletproof React.md @@ -0,0 +1,42 @@ +## ๐Ÿ“Œ Brief Summary +'Bulletproof React'๋Š” ํ”„๋กœ๋•์…˜ ์ˆ˜์ค€์˜ React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•œ ํ™•์žฅ ๊ฐ€๋Šฅํ•˜๊ณ  ๊ฐ•๋ ฅํ•œ ์•„ํ‚คํ…์ฒ˜ ๊ฐ€์ด๋“œ๋ผ์ธ์ด๋‹ค. React์˜ ์ž์œ ๋„๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ์ผ๊ด€์„ฑ ์—†๋Š” ๊ตฌ์กฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ๋Šฅ(Feature) ๊ธฐ๋ฐ˜์˜ ๋ชจ๋“ˆํ™”์™€ ๋ช…ํ™•ํ•œ ๊ณ„์ธต ๋ถ„๋ฆฌ๋ผ๋Š” ์ฃผ๊ด€์ ์ธ(Opinionated) ๋ฒ ์ŠคํŠธ ํ”„๋ž™ํ‹ฐ์Šค๋ฅผ ์ œ์‹œํ•œ๋‹ค. + +## ๐Ÿ“– Core Content +1. **์•„ํ‚คํ…์ฒ˜ ์ฒ ํ•™ (Scalability & Predictability)** + - React๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์•„๋‹Œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋ฏ€๋กœ ๊ตฌ์กฐ์  ์„ ํƒ์˜ ์ฑ…์ž„์ด ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์žˆ๋‹ค. + - Bulletproof React๋Š” ํŒ€ ๊ทœ๋ชจ์™€ ์ฝ”๋“œ๋ฒ ์ด์Šค๊ฐ€ ์ปค์ ธ๋„ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ๊ฐ€๋Šฅํ•˜๋„๋ก ๋ช…ํ™•ํ•œ ๊ฒฝ๊ณ„(Boundaries)์™€ ์ผ๊ด€๋œ ์ž‘์—… ๋ฐฉ์‹์„ ์ œ๊ณตํ•œ๋‹ค. +2. **๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ (Feature-Based Structure)** + - ๊ธฐ์ˆ ์  ์—ญํ• (Components, Hooks, Styles)์ด ์•„๋‹Œ ๋น„์ฆˆ๋‹ˆ์Šค ๊ธฐ๋Šฅ(Feature) ๋‹จ์œ„๋กœ ์ฝ”๋“œ๋ฅผ ๊ทธ๋ฃนํ™”ํ•œ๋‹ค. + - ๊ฐ ๊ธฐ๋Šฅ ํด๋” ๋‚ด์— ํ•ด๋‹น ๊ธฐ๋Šฅ์— ํ•„์š”ํ•œ ์ปดํฌ๋„ŒํŠธ, API, ์ƒํƒœ, ํƒ€์ž…, ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ๋ฐฐ์น˜ํ•˜์—ฌ ์‘์ง‘๋„๋ฅผ ๋†’์ธ๋‹ค. +3. **๊ณ„์ธตํ™”๋œ ์•„ํ‚คํ…์ฒ˜ (Layered Architecture)** + - ํ”„๋กœ์ ํŠธ ํ‘œ์ค€, ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ, ์ปดํฌ๋„ŒํŠธ/์Šคํƒ€์ผ๋ง, API ๊ณ„์ธต, ์ƒํƒœ ๊ด€๋ฆฌ, ํ…Œ์ŠคํŠธ, ๋ณด์•ˆ ๋“ฑ ํ”„๋ก ํŠธ์—”๋“œ ์ „๋ฐ˜์˜ ๋ ˆ์ด์–ด๋ฅผ ๊ทœ๊ฒฉํ™”ํ•œ๋‹ค. + - ํŠน์ • ๊ธฐ์ˆ ์— ์–ฝ๋งค์ด์ง€ ์•Š๊ณ  ์›์น™(Principles)์— ์ง‘์ค‘ํ•˜์—ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ต์ฒด๊ฐ€ ์šฉ์ดํ•œ ๊ตฌ์กฐ๋ฅผ ์ง€ํ–ฅํ•œ๋‹ค. +4. **์œ ์—ฐํ•œ ์ ์šฉ (Guideline, Not Template)** + - ๊ฐ•์ œ์ ์ธ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ๊ฐ€ ์•„๋‹ˆ๋ฉฐ, ํŒ€์˜ ์š”๊ตฌ์‚ฌํ•ญ๊ณผ ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ์— ๋งž๊ฒŒ ์„ ํƒ์ ์œผ๋กœ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์ด๋“œ๋ผ์ธ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. + +## โš–๏ธ Trade-offs & Caveats +- **๊ทœ์น™์˜ ํŒŒํŽธํ™” ์œ„ํ—˜**: ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์•„๋‹Œ ๊ฐ€์ด๋“œ๋ผ์ธ์ด๋ฏ€๋กœ, ํŒ€ ๋‚ด์—์„œ ํ•ฉ์˜๋œ ์ˆ˜์ค€์„ ๋„˜์–ด์„œ๋Š” ์ž์˜์ ์ธ ํ•ด์„์ด ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ ๊ตฌ์กฐ์  ์ผ๊ด€์„ฑ์ด ๊นจ์งˆ ์ˆ˜ ์žˆ๋‹ค. +- **์ดˆ๊ธฐ ํ•™์Šต ๊ณก์„ **: ํด๋” ๊ตฌ์กฐ๊ฐ€ ๊นŠ์–ด์ง€๊ณ  ๊ด€์‹ฌ์‚ฌ ๋ถ„๋ฆฌ๊ฐ€ ์—„๊ฒฉํ•ด์ง์— ๋”ฐ๋ผ, ๊ธฐ์กด์˜ ํ”Œ๋žซํ•œ ๊ตฌ์กฐ์— ์ต์ˆ™ํ•œ ๊ฐœ๋ฐœ์ž๋“ค์—๊ฒŒ๋Š” ์ดˆ๊ธฐ ์ ์‘ ์‹œ๊ฐ„์ด ํ•„์š”ํ•˜๋‹ค. +- **์˜ค๋ฒ„ํ—ค๋“œ**: ๋งค์šฐ ์ž‘์€ ๊ทœ๋ชจ์˜ ํ”„๋กœ์ ํŠธ๋‚˜ ๋‹จ์ˆœํ•œ MVP ๋‹จ๊ณ„์—์„œ๋Š” ์ด๋Ÿฌํ•œ ์—„๊ฒฉํ•œ ๋ถ„๋ฆฌ๊ฐ€ ์˜คํžˆ๋ ค ๊ณผ๋„ํ•œ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ๋กœ ๋А๊ปด์งˆ ์ˆ˜ ์žˆ๋‹ค. + +## ๐Ÿ”— Knowledge Connections +### Related Concepts +- **Feature-Based Structure**: ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ ๋‹จ์œ„์˜ ์ฝ”๋“œ ์‘์ง‘๋„ ํ–ฅ์ƒ ๊ธฐ๋ฒ• (๊ด€๊ณ„: ํ•ต์‹ฌ ๊ตฌํ˜„ ํŒจํ„ด) +- **Feature-Sliced Design (FSD)**: ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ๋ฅผ ๋” ์ฒด๊ณ„ํ™”ํ•œ ๊ณ ๊ธ‰ ์•„ํ‚คํ…์ฒ˜ ๋ฐฉ๋ฒ•๋ก  (๊ด€๊ณ„: ํ™•์žฅ ๋ฐœ์ „ ํ˜•ํƒœ) +- **Scalable React Architecture**: ๋Œ€๊ทœ๋ชจ ์‹œ์Šคํ…œ์„ ์œ„ํ•œ ์„ค๊ณ„ ์ฒ ํ•™ (๊ด€๊ณ„: ์ƒ์œ„ ๋ชฉํ‘œ) + +### Deeper Research Questions +1. ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ์—์„œ ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ ๊ฐ„์— ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋กœ์ง(Shared)์˜ ์˜์กด์„ฑ ์—ญ์ „์€ ์–ด๋–ป๊ฒŒ ๊ด€๋ฆฌํ•˜๋Š”๊ฐ€? +2. API ๊ณ„์ธต๊ณผ ์ƒํƒœ ๊ด€๋ฆฌ ๋ ˆ์ด์–ด์˜ ๋ฌผ๋ฆฌ์  ๋ถ„๋ฆฌ๊ฐ€ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์˜ ๊ณ ๋ฆฝ์„ฑ ํ™•๋ณด์— ์–ด๋–ค ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”๊ฐ€? +3. ๋Œ€๊ทœ๋ชจ ๋ฆฌํŒฉํ† ๋ง ์‹œ, ๊ธฐ๋Šฅ ๋‹จ์œ„๋กœ ์ชผ๊ฐœ์ง„ ๋ชจ๋“ˆ์ด ํŒŒ์ผ ์œ ํ˜• ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ๋ณด๋‹ค ์•ˆ์ „ํ•œ ์ด์œ ๋Š” ๋ฌด์—‡์ธ๊ฐ€? +4. ์•„ํ‚คํ…์ฒ˜๊ฐ€ ์ œ์‹œํ•˜๋Š” '๋ช…ํ™•ํ•œ ๊ฒฝ๊ณ„'๋ฅผ ๊ฐ•์ œํ•˜๊ธฐ ์œ„ํ•ด ESLint ๋“ฑ์˜ ๋„๊ตฌ๋ฅผ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? +5. ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ(RSC) ํ™˜๊ฒฝ์—์„œ Bulletproof React์˜ ํด๋” ๊ตฌ์กฐ ์ „๋žต์€ ์–ด๋–ป๊ฒŒ ์ง„ํ™”ํ•ด์•ผ ํ•˜๋Š”๊ฐ€? + +### Practical Application Contexts +- **์‹ ๊ทœ ํ”„๋กœ์ ํŠธ ์…‹์—…**: ์ดˆ๊ธฐ ํด๋” ๊ตฌ์กฐ ๋ฐ ๋ ˆ์ด์–ด๋ง ํ‘œ์ค€์•ˆ์œผ๋กœ ์ฑ„ํƒ. +- **๋ ˆ๊ฑฐ์‹œ ๋ฆฌํŒฉํ† ๋ง**: ๋ณต์žกํ•ด์ง„ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ๊ธฐ๋Šฅ ๋‹จ์œ„๋กœ ์ ์ง„์ ์œผ๋กœ ๊ฒฉ๋ฆฌ ๋ฐ ๊ตฌ์กฐํ™”. + +### Adjacent Topics +- **Clean Architecture in Frontend** +- **Domain-Driven Design (DDD)** +- **Monorepo Management Strategies** diff --git a/10_Wiki/Topics/Frontend_Mastery/Error Boundaries.md b/10_Wiki/Topics/Frontend_Mastery/Error Boundaries.md new file mode 100644 index 00000000..08a33f3e --- /dev/null +++ b/10_Wiki/Topics/Frontend_Mastery/Error Boundaries.md @@ -0,0 +1,42 @@ +## ๐Ÿ“Œ Brief Summary +Error Boundaries๋Š” React ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ ํ•˜์œ„์—์„œ ๋ฐœ์ƒํ•˜๋Š” JavaScript ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๋ฅผ ํฌ์ฐฉํ•˜์—ฌ ์ „์ฒด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํฌ๋ž˜์‹œ(White Screen)๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ์„ ์–ธ์  ์—๋Ÿฌ ์ฒ˜๋ฆฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด๋‹ค. ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ ์ง€์ ์„ ๊ฒฉ๋ฆฌํ•˜๊ณ  ๋Œ€์ฒด UI(Fallback UI)๋ฅผ ๋ Œ๋”๋งํ•จ์œผ๋กœ์จ ์‹œ์Šคํ…œ์˜ ๊ฐ€์šฉ์„ฑ๊ณผ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๋ณดํ˜ธํ•œ๋‹ค. + +## ๐Ÿ“– Core Content +1. **์ž‘๋™ ๋ฉ”์ปค๋‹ˆ์ฆ˜ ๋ฐ ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ ์˜์กด์„ฑ** + - React 16๋ถ€ํ„ฐ ๋„์ž…๋˜์—ˆ์œผ๋ฉฐ, ์ž์‹ ์ปดํฌ๋„ŒํŠธ์˜ ๋ Œ๋”๋ง, ์ˆ˜๋ช… ์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ, ์ƒ์„ฑ์ž ๋‚ด๋ถ€์˜ ์—๋Ÿฌ๋ฅผ ๊ฐ์ง€ํ•œ๋‹ค. + - ๋ฐ˜๋“œ์‹œ ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ๋กœ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋ฉฐ, `static getDerivedStateFromError()`๋กœ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ  `componentDidCatch()`๋กœ ์—๋Ÿฌ๋ฅผ ๋กœ๊น…ํ•œ๋‹ค. +2. **์„ ์–ธ์  ์—๋Ÿฌ ๊ฒฉ๋ฆฌ (Isolation)** + - ๋ช…๋ นํ˜• `try/catch`์™€ ๋‹ฌ๋ฆฌ React์˜ ์„ ์–ธ์  ํŠน์„ฑ์„ ์œ ์ง€ํ•˜๋ฉฐ ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ ์ˆ˜์ค€์—์„œ ์—๋Ÿฌ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค. + - ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด๊ฐ€ ์•„๋‹Œ, ์‹คํŒจ ์œ„ํ—˜์ด ๋†’์€ ํŠน์ • ์œ„์ ฏ(์ฐจํŠธ, ์„œ๋“œํŒŒํ‹ฐ ํผ ๋“ฑ)์„ ๋…๋ฆฝ๋œ Boundary๋กœ ๊ฐ์‹ธ '์žฅ์•  ๊ฒฉ๋ฆฌ'๋ฅผ ์‹คํ˜„ํ•œ๋‹ค. +3. **ํฌ์ฐฉ ๋ถˆ๊ฐ€๋Šฅํ•œ ์˜์—ญ (Limitations)** + - ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ, ๋น„๋™๊ธฐ ์ฝ”๋“œ(setTimeout, Fetch), ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง(SSR), Error Boundary ์ž์ฒด ๋‚ด์˜ ์—๋Ÿฌ๋Š” ํฌ์ฐฉํ•˜์ง€ ๋ชปํ•œ๋‹ค. + - ์ด๋Ÿฌํ•œ ์˜์—ญ์€ ์—ฌ์ „ํžˆ `try/catch`๋‚˜ ์ „์—ญ ์—๋Ÿฌ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ํ†ตํ•œ ๋ณด์™„์ด ํ•„์š”ํ•˜๋‹ค. +4. **๋ฏธ์ฒ˜๋ฆฌ ์—๋Ÿฌ์˜ ๊ฒฐ๊ณผ** + - ํฌ์ฐฉ๋˜์ง€ ์•Š์€ ์—๋Ÿฌ๋Š” ์ „์ฒด ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ์˜ ๋งˆ์šดํŠธ ํ•ด์ œ(Unmounting)๋ฅผ ์œ ๋ฐœํ•˜๋ฉฐ, ์ด๋Š” ์†์ƒ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋…ธ์ถœ๋˜๋Š” ๊ฒƒ๋ณด๋‹ค ์•ˆ์ „ํ•œ ์„ ํƒ์œผ๋กœ ๊ฐ„์ฃผ๋œ๋‹ค. + +## โš–๏ธ Trade-offs & Caveats +- **ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ ์œ ์ง€ ํ•„์š”์„ฑ**: ์ตœ์‹  React๊ฐ€ Hooks ์ค‘์‹ฌ์ž„์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  Error Boundary ๊ตฌํ˜„์„ ์œ„ํ•ด ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ๋ฅผ ์œ ์ง€ํ•ด์•ผ ํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜์  ์ผ๊ด€์„ฑ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. +- **์„ฑ๋Šฅ ๋ฐ ๋ Œ๋”๋ง ์˜ค๋ฒ„ํ—ค๋“œ**: ๋„ˆ๋ฌด ๋งŽ์€ Error Boundary๋ฅผ ์ค‘์ฒฉํ•  ๊ฒฝ์šฐ ํŠธ๋ฆฌ ๊นŠ์ด๊ฐ€ ๊นŠ์–ด์ง€๊ณ  ์—๋Ÿฌ ์ „ํŒŒ ์ฒดํฌ ๋กœ์ง์— ๋”ฐ๋ฅธ ๋ฏธ์„ธํ•œ ์„ฑ๋Šฅ ์˜ํ–ฅ์ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. +- **๋น„๋™๊ธฐ ์—๋Ÿฌ ์ฒ˜๋ฆฌ์˜ ๊ณต๋ฐฑ**: ๋ Œ๋”๋ง ์—๋Ÿฌ๋งŒ ํฌ์ฐฉํ•˜๋ฏ€๋กœ, ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ํ†ต์‹ ์ด ๋นˆ๋ฒˆํ•œ ํ˜„๋Œ€ ์•ฑ์—์„œ๋Š” `react-error-boundary`์™€ ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ†ตํ•œ ์ถ”๊ฐ€ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์ˆ˜์ ์ด๋‹ค. + +## ๐Ÿ”— Knowledge Connections +### Related Concepts +- **Fallback UI**: ์—๋Ÿฌ ๋ฐœ์ƒ ์‹œ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋…ธ์ถœ๋˜๋Š” ๋ฐฉ์–ด์  ์ธํ„ฐํŽ˜์ด์Šค (๊ด€๊ณ„: ์ถœ๋ ฅ ๊ฒฐ๊ณผ๋ฌผ) +- **Component Stack Traces**: ์—๋Ÿฌ ๋ฐœ์ƒ ์œ„์น˜๋ฅผ ์ถ”์ ํ•˜๋Š” ๋Ÿฐํƒ€์ž„ ์ •๋ณด (๊ด€๊ณ„: ๋””๋ฒ„๊น… ํ•ต์‹ฌ ๋ฐ์ดํ„ฐ) +- **Sentry / LogRocket**: ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์˜ ์—๋Ÿฌ ์ˆ˜์ง‘ ๋ฐ ๋ถ„์„ ํ”Œ๋žซํผ (๊ด€๊ณ„: ์šด์˜ ๋ชจ๋‹ˆํ„ฐ๋ง ์—ฐ๋™) + +### Deeper Research Questions +1. React์˜ ๋‚ด๋ถ€ Fiber ์•„ํ‚คํ…์ฒ˜๋Š” Error Boundary๋ฅผ ๋งŒ๋‚ฌ์„ ๋•Œ ์–ด๋–ป๊ฒŒ ๋ Œ๋”๋ง ์ž‘์—…์„ ์ค‘๋‹จํ•˜๊ณ  ์ปค๋ฐ‹ ๋‹จ๊ณ„๋กœ ์ „์ดํ•˜๋Š”๊ฐ€? +2. ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ๋‚ด์˜ ์—๋Ÿฌ๋ฅผ Error Boundary๋กœ ๊ฐ•์ œ ์ „ํŒŒํ•˜๊ธฐ ์œ„ํ•œ 'setState' ํŠธ๋ฆญ์˜ ์›๋ฆฌ์™€ ํ•œ๊ณ„๋Š”? +3. `react-error-boundary` ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ ํ™˜๊ฒฝ์—์„œ ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ์˜ ํ•œ๊ณ„๋ฅผ ๊ทน๋ณตํ•˜๋Š” ๋ฐฉ์‹์€? +4. ๋‹จ์ผ ์ „์—ญ Error Boundary์™€ ๋‹ค์ค‘ ์ง€์—ญ Error Boundary ๊ฐ„์˜ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ๋ฐ ๋ฆฌ๋ Œ๋”๋ง ๋ฒ”์œ„ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๋Š”? +5. ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง(SSR) ํ™˜๊ฒฝ์—์„œ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ Error Boundary๊ฐ€ ํ™œ์„ฑํ™”๋˜๊ธฐ ์ „์˜ ์—๋Ÿฌ๋Š” ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š”๊ฐ€? + +### Practical Application Contexts +- **๊ฒฐ์ œ ๋ฐ ๊ธˆ์œต ๋ชจ๋“ˆ**: ์ž…๋ ฅ ํผ์˜ ์ž‘์€ ๋ Œ๋”๋ง ์˜ค๋ฅ˜๊ฐ€ ์ „์ฒด ๊ฒฐ์ œ ํ”„๋กœ์„ธ์Šค ๋งˆ๋น„๋กœ ์ด์–ด์ง€์ง€ ์•Š๋„๋ก ๊ฒฉ๋ฆฌ. +- **์„œ๋“œํŒŒํ‹ฐ ์œ„์ ฏ ํ†ตํ•ฉ**: ์•ˆ์ •์„ฑ์ด ๊ฒ€์ฆ๋˜์ง€ ์•Š์€ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ธฐ๋ฐ˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ Boundary๋กœ ๋ณดํ˜ธ. + +### Adjacent Topics +- **Try/Catch Statement in JS** +- **Observability in Frontend** +- **Graceful Degradation Design** diff --git a/10_Wiki/Topics/Frontend_Mastery/Frontend Architecture.md b/10_Wiki/Topics/Frontend_Mastery/Frontend Architecture.md new file mode 100644 index 00000000..77184d7d --- /dev/null +++ b/10_Wiki/Topics/Frontend_Mastery/Frontend Architecture.md @@ -0,0 +1,41 @@ +## ๐Ÿ“Œ Brief Summary +ํ”„๋ก ํŠธ์—”๋“œ ์•„ํ‚คํ…์ฒ˜๋Š” ํ˜„๋Œ€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ณต์žก์„ฑ์„ ๊ด€๋ฆฌํ•˜๊ณ  ์ง€์† ๊ฐ€๋Šฅํ•œ ์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ํ™•์žฅ์„ฑ์„ ํ™•๋ณดํ•˜๊ธฐ ์œ„ํ•œ ๊ตฌ์กฐ์  ์„ค๊ณ„ ๊ธฐ๋ฐ˜์ด๋‹ค. ๋‹จ์ˆœํ•œ UI ๋ Œ๋”๋ง์„ ๋„˜์–ด ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ UI์˜ ๋ถ„๋ฆฌ, ์—„๊ฒฉํ•œ ์˜์กด์„ฑ ๊ด€๋ฆฌ, ๊ทธ๋ฆฌ๊ณ  ๊ธฐ๋Šฅ(Feature) ๊ธฐ๋ฐ˜์˜ ๋ชจ๋“ˆํ™”๋ฅผ ํ†ตํ•ด ๊ฒฌ๊ณ ํ•œ ์†Œํ”„ํŠธ์›จ์–ด ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•œ๋‹ค. + +## ๐Ÿ“– Core Content +1. **๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ์„ค๊ณ„ ๋ฐ FSD (Feature-Sliced Design)** + - ๊ธฐ์ˆ ์  ํƒ€์ž…(์ปดํฌ๋„ŒํŠธ, ํ›… ๋“ฑ)์ด ์•„๋‹Œ ๋น„์ฆˆ๋‹ˆ์Šค ๊ธฐ๋Šฅ(๋„๋ฉ”์ธ) ์ค‘์‹ฌ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๊ตฌ์„ฑํ•˜์—ฌ ์‘์ง‘๋„๋ฅผ ๋†’์ธ๋‹ค. + - FSD ์•„ํ‚คํ…์ฒ˜๋ฅผ ํ†ตํ•ด ๊ณ„์ธต(Layer) ๊ฐ„ ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ์„ ๊ฐ•์ œํ•˜๊ณ , ๋ชจ๋“ˆ ๊ฐ„์˜ ์ˆœํ™˜ ์ฐธ์กฐ์™€ ์•„ํ‚คํ…์ฒ˜ ๋ถ•๊ดด๋ฅผ ์›์ฒœ์ ์œผ๋กœ ๋ฐฉ์ง€ํ•œ๋‹ค. +2. **์†Œํ”„ํŠธ์›จ์–ด ๊ณตํ•™ ์›์น™์˜ ์ ์šฉ** + - **SOLID**: ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)์œผ๋กœ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์„ธ๋ถ„ํ™”ํ•˜๊ณ , ์ปดํฌ๋„ŒํŠธ ํ•ฉ์„ฑ(Composition)์œผ๋กœ ๊ฐœ๋ฐฉ-ํ์‡„ ์›์น™(OCP)์„ ์ค€์ˆ˜ํ•œ๋‹ค. + - **KISS, DRY, YAGNI**: ์ฝ”๋“œ๋ฅผ ๋‹จ์ˆœํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ณ  ๋ถˆํ•„์š”ํ•œ ์ถ”์ƒํ™”์™€ ์˜ค๋ฒ„์—”์ง€๋‹ˆ์–ด๋ง์„ ๊ฒฝ๊ณ„ํ•˜์—ฌ ์‹ค์šฉ์ ์ธ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ์œ ์ง€ํ•œ๋‹ค. +3. **๊ณ„์ธตํ™”๋œ ์ƒํƒœ ๊ด€๋ฆฌ** + - ์ƒํƒœ์˜ ์„ฑ๊ฒฉ์— ๋”ฐ๋ผ ๋กœ์ปฌ(React State), ๊ธ€๋กœ๋ฒŒ ์•ฑ ์ƒํƒœ(Zustand), ์„œ๋ฒ„ ์บ์‹œ ์ƒํƒœ(TanStack Query)๋กœ ๋ ˆ์ด์–ด๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ๋ฆฌ๋ Œ๋”๋ง ์„ฑ๋Šฅ๊ณผ ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™” ํšจ์œจ์„ ์ตœ์ ํ™”ํ•œ๋‹ค. +4. **์„ฑ๋Šฅ ๋ฐ ํšŒ๋ณต์„ฑ ์„ค๊ณ„** + - Vite ๊ธฐ๋ฐ˜์˜ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…๊ณผ ์ง€์—ฐ ๋กœ๋”ฉ์„ ํ†ตํ•ด ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ตœ์ ํ™”ํ•˜๊ณ , Error Boundary๋ฅผ ๋ฐฐ์น˜ํ•˜์—ฌ ํŠน์ • ๋ชจ๋“ˆ์˜ ์˜ค๋ฅ˜๊ฐ€ ์‹œ์Šคํ…œ ์ „์ฒด๋กœ ์ „ํŒŒ๋˜๋Š” ๊ฒƒ์„ ์ฐจ๋‹จํ•œ๋‹ค. + +## โš–๏ธ Trade-offs & Caveats +- **์„ค๊ณ„ ์˜ค๋ฒ„ํ—ค๋“œ**: ์—„๊ฒฉํ•œ ์•„ํ‚คํ…์ฒ˜(FSD ๋“ฑ) ๋„์ž… ์‹œ ์ดˆ๊ธฐ ํด๋” ๊ตฌ์„ฑ๊ณผ ๊ณ„์ธต ๋ถ„๋ฆฌ์— ๋”ฐ๋ฅธ ์ธ์ง€์  ๋ถ€ํ•˜ ๋ฐ ํŒŒ์ผ ์ˆ˜ ์ฆ๊ฐ€๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. +- **์ถ”์ƒํ™”์˜ ์–‘๋‚ ์˜ ๊ฒ€**: DRY ์›์น™์„ ๋ฌด๋ฆฌํ•˜๊ฒŒ ์ ์šฉํ•˜์—ฌ ์ง€๋‚˜์น˜๊ฒŒ ์ถ”์ƒํ™”๋œ ๊ณตํ†ต ๋กœ์ง์€ ์˜คํžˆ๋ ค ์ฝ”๋“œ ๋…ํ•ด๋ฅผ ๋ฐฉํ•ดํ•˜๊ณ  ๋ณ€๊ฒฝ์— ์ทจ์•ฝํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค(KISS ์›์น™๊ณผ์˜ ์ถฉ๋Œ). +- **๊ธฐ์ˆ  ๋ถ€์ฑ„์˜ ์ ์ง„์  ํ•ด๊ฒฐ**: ๊ธฐ์กด์˜ ๋ชจ๋†€๋ฆฌ์‹ ๊ตฌ์กฐ์—์„œ ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ฒ˜๋กœ ์ „ํ™˜ํ•  ๋•Œ, ๊ณผ๋„ํ•œ ๋น…๋ฑ… ๋ฐฉ์‹์˜ ๋ฆฌํŒฉํ† ๋ง๋ณด๋‹ค๋Š” ์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ „๋žต์ด ๊ถŒ์žฅ๋œ๋‹ค. + +## ๐Ÿ”— Knowledge Connections +### Related Concepts +- **Feature-Sliced Design**: ํ”„๋ก ํŠธ์—”๋“œ ๋ชจ๋“ˆํ™”์˜ ์ตœ์‹  ํ‘œ์ค€ ๋ฐฉ๋ฒ•๋ก  (๊ด€๊ณ„: ํ•ต์‹ฌ ์•„ํ‚คํ…์ฒ˜ ๋ชจ๋ธ) +- **State Management**: ๋ฐ์ดํ„ฐ ํ๋ฆ„์˜ ์ค‘์•™ ํ†ต์ œ ๋ฐ ์ตœ์ ํ™” (๊ด€๊ณ„: ๋ฐ์ดํ„ฐ ๋ ˆ์ด์–ด ์„ค๊ณ„) +- **SOLID Principles**: ๊ฐ์ฒด ์ง€ํ–ฅ ๋ฐ ์ปดํฌ๋„ŒํŠธ ์„ค๊ณ„์˜ ๊ทผ๊ฐ„ (๊ด€๊ณ„: ์ฝ”๋“œ ํ’ˆ์งˆ ๊ธฐ์ค€) + +### Deeper Research Questions +1. FSD์˜ 'Widgets' ๊ณ„์ธต๊ณผ 'Features' ๊ณ„์ธต ์‚ฌ์ด์˜ ์ฑ…์ž„ ๋ถ„๋ฐฐ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๊ฐ€์žฅ ๋ช…ํ™•ํ•œ ๊ธฐ์ค€์€ ๋ฌด์—‡์ธ๊ฐ€? +2. ๋งˆ์ดํฌ๋กœ ํ”„๋ก ํŠธ์—”๋“œ ์ „ํ™˜ ์‹œ, ์ค‘์•™ ์ง‘์ค‘์‹ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์„œ๋น„์Šค๋ณ„ ๊ฒฉ๋ฆฌ๋œ ์ƒํƒœ ๊ด€๋ฆฌ ์ค‘ ์–ด๋–ค ๊ฒƒ์ด ์œ ๋ฆฌํ•œ๊ฐ€? +3. ์ปดํฌ๋„ŒํŠธ ํ•ฉ์„ฑ(Composition) ํŒจํ„ด์ด ๊ฐœ๋ฐฉ-ํ์‡„ ์›์น™(OCP)์„ ํ”„๋ก ํŠธ์—”๋“œ ํ™˜๊ฒฝ์—์„œ ์–ด๋–ป๊ฒŒ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๊ตฌํ˜„ํ•˜๋Š”๊ฐ€? +4. ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ฐ์ดํ„ฐ(RSC) ๋น„์ค‘์ด ๋Š˜์–ด๋‚  ๋•Œ, ํด๋ผ์ด์–ธํŠธ ์•„ํ‚คํ…์ฒ˜์˜ ์ƒํƒœ ๊ด€๋ฆฌ ๋ ˆ์ด์–ด๋Š” ์–ด๋–ป๊ฒŒ ๊ฐ„์†Œํ™”๋˜์–ด์•ผ ํ•˜๋Š”๊ฐ€? +5. ์•„ํ‚คํ…์ฒ˜์˜ ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ๊ทœ์น™์„ ์ •์  ๋ถ„์„ ๋„๊ตฌ(ESLint plugin-import ๋“ฑ)๋ฅผ ํ†ตํ•ด ์ž๋™ํ™”ํ•˜์—ฌ ๊ฐ•์ œํ•˜๋Š” ๋ฐฉ์•ˆ์€? + +### Practical Application Contexts +- **๋Œ€๊ทœ๋ชจ ์•ฑ ๋ฆฌํŒฉํ† ๋ง**: ํฉ์–ด์ ธ ์žˆ๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๊ธฐ๋Šฅ๋ณ„ ํด๋”๋กœ ์บก์Аํ™”ํ•˜์—ฌ ์œ ์ง€๋ณด์ˆ˜์„ฑ ํ™•๋ณด. +- **์‹ ๊ทœ ํ”„๋กœ์ ํŠธ ์„ค๊ณ„**: ์ดˆ๊ธฐ ์•„ํ‚คํ…์ฒ˜ ์ˆ˜๋ฆฝ ๋‹จ๊ณ„์—์„œ ์ƒํƒœ ๋ ˆ์ด์–ด์™€ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์ „๋žต ์ •์˜. + +### Adjacent Topics +- **Micro-Frontends** +- **Server Components (RSC)** +- **Test-Driven Development (TDD) in Frontend** diff --git a/10_Wiki/Topics/Frontend_Mastery/Frontend Scalability.md b/10_Wiki/Topics/Frontend_Mastery/Frontend Scalability.md new file mode 100644 index 00000000..3b625184 --- /dev/null +++ b/10_Wiki/Topics/Frontend_Mastery/Frontend Scalability.md @@ -0,0 +1,42 @@ +## ๐Ÿ“Œ Brief Summary +ํ”„๋ก ํŠธ์—”๋“œ ์Šค์ผ€์ผ๋Ÿฌ๋นŒ๋ฆฌํ‹ฐ(Frontend Scalability)๋Š” ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ํŒฝ์ฐฝ๊ณผ ํŒ€ ๊ทœ๋ชจ์˜ ํ™•์žฅ์— ๋Œ€์‘ํ•˜์—ฌ ์‹œ์Šคํ…œ์˜ ๋ณต์žก๋„๋ฅผ ์ œ์–ดํ•˜๊ณ  ์„ฑ๋Šฅ์„ ์œ ์ง€ํ•˜๋Š” ์—”์ง€๋‹ˆ์–ด๋ง ์—ญ๋Ÿ‰์ด๋‹ค. ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜์˜ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„, ๊ณ„์ธตํ™”๋œ ์ƒํƒœ ๊ด€๋ฆฌ, ์ตœ์ ํ™”๋œ ๋นŒ๋“œ ํŒŒ์ดํ”„๋ผ์ธ, ๊ทธ๋ฆฌ๊ณ  ์—„๊ฒฉํ•œ ์ฝ”๋“œ ๊ฑฐ๋ฒ„๋„Œ์Šค๋ฅผ ํ†ตํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ง€์† ๊ฐ€๋Šฅํ•œ ์„ฑ์žฅ์„ ๋ณด์žฅํ•œ๋‹ค. + +## ๐Ÿ“– Core Content +1. **์•„ํ‚คํ…์ฒ˜ ๊ตฌ์กฐํ™” (Architecture Organization)** + - ํŒŒ์ผ ์œ ํ˜• ์ค‘์‹ฌ์˜ ๊ตฌ์กฐ๋ฅผ ํƒˆํ”ผํ•˜๊ณ  ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ ์ค‘์‹ฌ์˜ **Feature-Based Structure**๋ฅผ ์ฑ„ํƒํ•˜์—ฌ ์‘์ง‘๋„๋ฅผ ๊ฐ•ํ™”ํ•œ๋‹ค. + - **Feature-Sliced Design (FSD)**์„ ๋„์ž…ํ•˜์—ฌ ๊ณ„์ธต ๊ฐ„ ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ๊ณผ Public API ๊ทœ์น™์„ ๊ฐ•์ œํ•จ์œผ๋กœ์จ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ณ  ์ธ์ง€์  ๋ถ€ํ•˜๋ฅผ ์ค„์ธ๋‹ค. +2. **์ƒํƒœ ๊ด€๋ฆฌ์˜ ์ตœ์  ํ™•์žฅ (Scaling State Management)** + - ๋ฆฌ๋ Œ๋”๋ง ์ตœ์ ํ™”๊ฐ€ ํ•„์š”ํ•œ ์ค‘๋Œ€ํ˜• ์•ฑ์—์„œ๋Š” Selector ํŒจํ„ด์„ ์ง€์›ํ•˜๋Š” **Zustand** ๋˜๋Š” ๋””๋ฒ„๊น… ํ™˜๊ฒฝ์ด ๊ฐ•๋ ฅํ•œ **Redux**๋ฅผ ์„ ํƒํ•œ๋‹ค. + - ์„œ๋ฒ„ ์ƒํƒœ(TanStack Query)์™€ ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™”์™€ ์บ์‹ฑ์˜ ๋ณต์žก์„ฑ์„ ๊ด€๋ฆฌํ•œ๋‹ค. +3. **๋Ÿฐํƒ€์ž„ ๋ฐ ๋นŒ๋“œ ์„ฑ๋Šฅ (Performance Scalability)** + - **์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…(Code Splitting)**๊ณผ ์ง€์—ฐ ๋กœ๋”ฉ(Lazy Loading)์„ ํ†ตํ•ด ๋ฒˆ๋“ค ํŒฝ์ฐฝ์„ ๋ฐฉ์–ดํ•˜๊ณ  ์ดˆ๊ธฐ ๋กœ๋”ฉ ์„ฑ๋Šฅ์„ ์œ ์ง€ํ•œ๋‹ค. + - ๋Œ€๊ทœ๋ชจ ๋ฆฌ์ŠคํŠธ ๋ Œ๋”๋ง ์‹œ ๊ฐ€์ƒํ™”(Virtualization)๋ฅผ ์ ์šฉํ•˜์—ฌ DOM ๋…ธ๋“œ ์ˆ˜์˜ ํญ๋ฐœ์„ ๋ฐฉ์ง€ํ•œ๋‹ค. +4. **์ฝ”๋“œ ๊ฑฐ๋ฒ„๋„Œ์Šค ๋ฐ ์ž๋™ํ™” (Governance)** + - SOLID ์›์น™(ํŠนํžˆ SRP)์„ ์ ์šฉํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ถ„๋ฆฌํ•˜๊ณ , ESLint์™€ Husky ๋“ฑ์„ ํ†ตํ•ด ์•„ํ‚คํ…์ฒ˜ ๊ทœ์น™๊ณผ ์ปจ๋ฒค์…˜์„ ์ž๋™ ๊ฒ€์ฆํ•œ๋‹ค. + +## โš–๏ธ Trade-offs & Caveats +- **์„ค๊ณ„ ๋ณต์žก๋„ vs ์œ ์—ฐ์„ฑ**: ์—„๊ฒฉํ•œ FSD ์•„ํ‚คํ…์ฒ˜๋Š” ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”์ง€๋งŒ, ์ดˆ๊ธฐ ๋„์ž… ์‹œ ํŒŒ์ผ ์ˆ˜๊ฐ€ ๊ธ‰๊ฒฉํžˆ ๋Š˜์–ด๋‚˜๊ณ  ๋‹จ์ˆœํ•œ ๊ธฐ๋Šฅ ์ถ”๊ฐ€์—๋„ ์—ฌ๋Ÿฌ ๋ ˆ์ด์–ด๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•˜๋Š” ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. +- **๋„๊ตฌ ์„ ํƒ์˜ ๋ฌด๊ฒŒ**: Redux์™€ ๊ฐ™์€ ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ๋Š” ๋Œ€๊ทœ๋ชจ ํŒ€์˜ ์ผ๊ด€์„ฑ์—๋Š” ์œ ๋ฆฌํ•˜๋‚˜, ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ๊ฐ€ ๋งŽ์•„ ์†Œ๊ทœ๋ชจ/๊ณ ์† ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋Š” ์ƒ์‚ฐ์„ฑ์„ ์ €ํ•˜์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. +- **๊ณผ๋„ํ•œ ์ถ”์ƒํ™” ๊ฒฝ๊ณ„**: ์Šค์ผ€์ผ๋ง์„ ์œ„ํ•ด ๋„์ž…ํ•œ ๊ณตํ†ต ํ›…์ด๋‚˜ ์œ ํ‹ธ๋ฆฌํ‹ฐ๊ฐ€ ๋„ˆ๋ฌด ๋ฒ”์šฉ์ ์œผ๋กœ ์„ค๊ณ„๋  ๊ฒฝ์šฐ, ์˜คํžˆ๋ ค ๋‚ด๋ถ€ ๋กœ์ง์„ ํŒŒ์•…ํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“œ๋Š” KISS ์›์น™ ์œ„๋ฐฐ ์ƒํ™ฉ์„ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ๋‹ค. + +## ๐Ÿ”— Knowledge Connections +### Related Concepts +- **Feature-Sliced Design**: ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ํ”„๋ก ํŠธ์—”๋“œ ๊ตฌ์กฐ์˜ ํ‘œ์ค€ (๊ด€๊ณ„: ๊ตฌ์กฐ์  ํ† ๋Œ€) +- **Code Splitting**: ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ ์ตœ์ ํ™” ํ•„์ˆ˜ ๊ธฐ์ˆ  (๊ด€๊ณ„: ์„ฑ๋Šฅ ํ™•์žฅ ์ „๋žต) +- **SOLID Principles**: ์œ ์ง€๋ณด์ˆ˜ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ์˜ ๊ทผ๊ฐ„ (๊ด€๊ณ„: ์„ค๊ณ„ ์›์น™) + +### Deeper Research Questions +1. FSD ๊ตฌ์กฐ ๋‚ด์—์„œ ๋‘ ๊ฐœ ์ด์ƒ์˜ ๊ธฐ๋Šฅ(Features)์ด ์ƒํ˜ธ ์ฐธ์กฐํ•ด์•ผ ํ•  ๋•Œ, ์˜์กด์„ฑ ์ˆœํ™˜์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ '์ƒ์œ„ ๊ณ„์ธต์œผ๋กœ์˜ ๋กœ์ง ์Šน๊ฒฉ' ํŒจํ„ด์€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”๊ฐ€? +2. Zustand์˜ Selector ํŒจํ„ด์ด ๋Œ€๊ทœ๋ชจ ์ƒํƒœ ํŠธ๋ฆฌ์—์„œ ์„ฑ๋Šฅ์  ์ด์ ์„ ๊ฐ–๋Š” ๋‚ด๋ถ€์  ์›๋ฆฌ๋Š” ๋ฌด์—‡์ธ๊ฐ€? +3. Vite์˜ `manualChunks` ์„ค์ • ์ตœ์ ํ™”๋ฅผ ํ†ตํ•ด ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์บ์‹ฑ ํšจ์œจ์„ ์ •๋Ÿ‰์ ์œผ๋กœ ์–ผ๋งˆ๋‚˜ ๋†’์ผ ์ˆ˜ ์žˆ๋Š”๊ฐ€? +4. ์•„ํ‚คํ…์ฒ˜ ๊ทœ์น™์„ ์œ„๋ฐ˜ํ•˜๋Š” ์ž„ํฌํŠธ(Import) ์‹œ๋„๋ฅผ ๋ฆฐํŠธ ๋‹จ๊ณ„์—์„œ ์›์ฒœ ์ฐจ๋‹จํ•˜๋Š” ๊ฐ€์žฅ ํšจ์œจ์ ์ธ ์ปค์Šคํ…€ ๊ทœ์น™ ์„ค์ • ๋ฐฉ๋ฒ•์€? +5. ์„œ๋ฒ„ ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ ๋„์ž… ์‹œ ํด๋ผ์ด์–ธํŠธ ์Šคํ† ์–ด์˜ ์—ญํ• ์ด ์ถ•์†Œ๋˜๋Š” ๊ฒฝํ–ฅ์— ๋”ฐ๋ฅธ ์•„ํ‚คํ…์ฒ˜ ์Šฌ๋ฆผํ™” ์ „๋žต์€? + +### Practical Application Contexts +- **์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์•ฑ ์„ค๊ณ„**: ๋‹ค์ˆ˜์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ˜‘์—…ํ•˜๋Š” ๋Œ€๊ทœ๋ชจ ๋Œ€์‹œ๋ณด๋“œ ๋ฐ ๋ณต์žกํ•œ ์›Œํฌํ”Œ๋กœ์šฐ ์‹œ์Šคํ…œ ๊ตฌ์ถ•. +- **๋ ˆ๊ฑฐ์‹œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜**: ๋น„๋Œ€ํ•ด์ง„ Context API ๊ธฐ๋ฐ˜ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ Zustand/Redux๋กœ ์ „ํ™˜ํ•˜์—ฌ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ ํ•ด์†Œ. + +### Adjacent Topics +- **React Performance Optimization** +- **Micro-Frontends Architecture** +- **Monorepo Management (Turborepo / Nx)** diff --git a/10_Wiki/Topics/Frontend_Mastery/Frontend System Design.md b/10_Wiki/Topics/Frontend_Mastery/Frontend System Design.md new file mode 100644 index 00000000..eeaf7a7d --- /dev/null +++ b/10_Wiki/Topics/Frontend_Mastery/Frontend System Design.md @@ -0,0 +1,42 @@ +## ๐Ÿ“Œ Brief Summary +ํ”„๋ก ํŠธ์—”๋“œ ์‹œ์Šคํ…œ ๋””์ž์ธ์€ ํ˜„๋Œ€์˜ ๋Œ€๊ทœ๋ชจ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ™•์žฅ ๊ฐ€๋Šฅํ•˜๊ณ (Scalable), ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์šฉ์ดํ•˜๋ฉฐ(Maintainable), ๊ณ ์„ฑ๋Šฅ์ธ(Performant) ์‹œ์Šคํ…œ์œผ๋กœ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•œ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„๋ก ์ด๋‹ค. UI ๊ตฌํ˜„์„ ๋„˜์–ด ์ƒํƒœ ๊ด€๋ฆฌ, ๋ชจ๋“ˆํ™”, ๋นŒ๋“œ ์ตœ์ ํ™”, ๊ฑฐ๋ฒ„๋„Œ์Šค ๋“ฑ์„ ํ†ตํ•ฉ์ ์œผ๋กœ ์—”์ง€๋‹ˆ์–ด๋งํ•˜์—ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๊ฐ€์น˜๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•œ๋‹ค. + +## ๐Ÿ“– Core Content +1. **์•„ํ‚คํ…์ฒ˜ ํŒจ๋Ÿฌ๋‹ค์ž„: FSD (Feature-Sliced Design)** + - ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ ์ค‘์‹ฌ์˜ ๊ณ„์ธตํ™”(App, Pages, Widgets, Features, Entities, Shared)๋ฅผ ํ†ตํ•ด ๋ชจ๋“ˆ์˜ ๋…๋ฆฝ์„ฑ์„ ํ™•๋ณดํ•œ๋‹ค. + - ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ๊ทœ์น™๊ณผ Public API(`index.ts`)๋ฅผ ๊ฐ•์ œํ•˜์—ฌ ๊ธฐ๋Šฅ ๊ฐ„์˜ ์•”์‹œ์  ๊ฒฐํ•ฉ์„ ๋ฐฉ์ง€ํ•˜๊ณ  ์ฝ”๋“œ์˜ ์˜ˆ์ธก ๊ฐ€๋Šฅ์„ฑ์„ ๋†’์ธ๋‹ค. +2. **์—”์ง€๋‹ˆ์–ด๋ง ์›์น™์˜ ์ ์šฉ** + - **SOLID (ํŠนํžˆ SRP)**: ์ปดํฌ๋„ŒํŠธ์˜ ์ฑ…์ž„์„ ๋‹จ์ผํ™”ํ•˜๊ณ  ๋น„๋Œ€ํ•œ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ปค์Šคํ…€ ํ›…์œผ๋กœ ์ถ”์ถœํ•œ๋‹ค. + - **KISS & DRY**: ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๋˜ ๊ณผ๋„ํ•œ ์ถ”์ƒํ™”๋ฅผ ๊ฒฝ๊ณ„ํ•˜์—ฌ ์ฝ”๋“œ์˜ ๋‹จ์ˆœ์„ฑ๊ณผ ๊ฐ€๋…์„ฑ์„ ์œ ์ง€ํ•œ๋‹ค. +3. **์ƒํƒœ ๊ด€๋ฆฌ ์•„ํ‚คํ…์ฒ˜** + - ์ƒํƒœ์˜ ์ˆ˜๋ช…๊ณผ ์„ฑ๊ฒฉ์— ๋”ฐ๋ผ ๋กœ์ปฌ, ์ „์—ญ(Zustand/Redux), ์„œ๋ฒ„ ์บ์‹œ(TanStack Query)๋กœ ๋ช…ํ™•ํžˆ ๋ ˆ์ด์–ด๋ฅผ ๋ถ„๋ฆฌํ•œ๋‹ค. + - ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด Context API์˜ ๋ฆฌ๋ Œ๋”๋ง ํ•œ๊ณ„๋ฅผ ์ดํ•ดํ•˜๊ณ  ์ตœ์ ํ™”๋œ ์ƒํƒœ ๊ตฌ๋…(Selector) ํŒจํ„ด์„ ์ ์šฉํ•œ๋‹ค. +4. **์„ฑ๋Šฅ ์—”์ง€๋‹ˆ์–ด๋ง** + - ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ ์ตœ์ ํ™”(Code Splitting)์™€ ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ(Virtualization, Memoization)์„ ์•„ํ‚คํ…์ฒ˜ ์ˆ˜์ค€์—์„œ ๊ณ ๋ คํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ฒด๊ฐ ์„ฑ๋Šฅ์„ ๊ทน๋Œ€ํ™”ํ•œ๋‹ค. + +## โš–๏ธ Trade-offs & Caveats +- **์œ ์—ฐ์„ฑ vs ๊ทœ๊ฒฉํ™”**: ์—„๊ฒฉํ•œ ์‹œ์Šคํ…œ ๋””์ž์ธ์€ ํ˜‘์—…๊ณผ ์œ ์ง€๋ณด์ˆ˜์— ์œ ๋ฆฌํ•˜์ง€๋งŒ, ๋น ๋ฅธ ์‹คํ—˜๊ณผ ํ”„๋กœํ† ํƒ€์ดํ•‘์ด ํ•„์š”ํ•œ ์ดˆ๊ธฐ ๋‹จ๊ณ„์—์„œ๋Š” ๊ฐœ๋ฐœ ์†๋„๋ฅผ ์ €ํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค. +- **๋„๊ตฌ์˜ ์ข…์†์„ฑ**: ํŠน์ • ์ƒํƒœ ๊ด€๋ฆฌ๋‚˜ ๋นŒ๋“œ ๋„๊ตฌ์— ๊ธฐ๋ฐ˜ํ•œ ๋””์ž์ธ์€ ๋„๊ตฌ์˜ ๋ฒ„์ „ ์—…๊ทธ๋ ˆ์ด๋“œ๋‚˜ ํŒจ๋Ÿฌ๋‹ค์ž„ ๋ณ€ํ™” ์‹œ ํฐ ์ „ํ™˜ ๋น„์šฉ์„ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค. +- **์ธ์ง€์  ๋ถ€ํ•˜**: ์•„ํ‚คํ…์ฒ˜๊ฐ€ ๋ณต์žกํ•ด์งˆ์ˆ˜๋ก ์‹ ๊ทœ ํŒ€์›์˜ ์˜จ๋ณด๋”ฉ ๋น„์šฉ์ด ์ฆ๊ฐ€ํ•˜๋ฏ€๋กœ, ๋ฌธ์„œํ™”์™€ ์ž๋™ํ™”๋œ ๋ฆฐํŠธ ๊ทœ์น™์ด ๋ฐ˜๋“œ์‹œ ์ˆ˜๋ฐ˜๋˜์–ด์•ผ ํ•œ๋‹ค. + +## ๐Ÿ”— Knowledge Connections +### Related Concepts +- **Feature-Sliced Design**: ์‹œ์Šคํ…œ ๊ตฌ์กฐํ™”์˜ ํ•ต์‹ฌ ๋ฐฉ๋ฒ•๋ก  (๊ด€๊ณ„: ๊ตฌ์กฐ์  ๋ผˆ๋Œ€) +- **State Management Architecture**: ๋ฐ์ดํ„ฐ ํ๋ฆ„์˜ ๊ณ„์ธตํ™” (๊ด€๊ณ„: ํ˜ˆ์•ก ์ˆœํ™˜ ์ฒด๊ณ„) +- **Performance Engineering**: ์‹œ์Šคํ…œ ํšจ์œจ์„ฑ ๊ทน๋Œ€ํ™” (๊ด€๊ณ„: ํ’ˆ์งˆ ์ง€ํ‘œ) + +### Deeper Research Questions +1. FSD ๊ตฌ์กฐ์—์„œ ๊ณ„์ธต ๊ฐ„ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ์‹œ 'Prop Drilling'์„ ์ตœ์†Œํ™”ํ•˜๋ฉด์„œ๋„ ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ์„ ์ง€ํ‚ค๋Š” ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? +2. ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ(RSC) ํ™˜๊ฒฝ์—์„œ ์‹œ์Šคํ…œ ๋””์ž์ธ์˜ 'Client State' ๋ ˆ์ด์–ด๋Š” ์–ด๋–ป๊ฒŒ ์žฌ์„ค๊ณ„๋˜์–ด์•ผ ํ•˜๋Š”๊ฐ€? +3. ์•„ํ‚คํ…์ฒ˜์˜ Public API ๊ทœ์น™์„ ์œ„๋ฐ˜ํ•˜๋Š” '์‹ฌ์ธต ์ž„ํฌํŠธ(Deep Import)'๋ฅผ ์ •์  ๋ถ„์„์œผ๋กœ ์™„๋ฒฝํžˆ ์ฐจ๋‹จํ•˜๋Š” ๋ฐฉ๋ฒ•์€? +4. ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฐ„์˜ ์•„ํ‚คํ…์ฒ˜์  ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ์ •๋Ÿ‰์  ๊ธฐ์ค€(ํŒ€ ๊ทœ๋ชจ, ์ปดํฌ๋„ŒํŠธ ์ˆ˜ ๋“ฑ)์€ ์กด์žฌํ•˜๋Š”๊ฐ€? +5. ์‹œ์Šคํ…œ ๋””์ž์ธ ๋‹จ๊ณ„์—์„œ ๊ณ ๋ คํ•ด์•ผ ํ•  '์›น ์ ‘๊ทผ์„ฑ(A11y)'๊ณผ '๊ตญ์ œํ™”(i18n)' ๋ ˆ์ด์–ด์˜ ๋ฐฐ์น˜ ์ „๋žต์€? + +### Practical Application Contexts +- **์‹ ๊ทœ ํ”Œ๋žซํผ ์•„ํ‚คํ…์ฒ˜ ์ˆ˜๋ฆฝ**: ์ œํ’ˆ ๊ฐœ๋ฐœ ์ดˆ๊ธฐ ๋‹จ๊ณ„์—์„œ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ํด๋” ๊ตฌ์กฐ ๋ฐ ๊ธฐ์ˆ  ์Šคํƒ ๋ ˆ์ด์–ด๋ง ์ •์˜. +- **๊ธฐ์ˆ  ๋ถ€์ฑ„ ํ•ด์†Œ**: ์ŠคํŒŒ๊ฒŒํ‹ฐ ์ฝ”๋“œ๋กœ ๋ณ€ํ•œ ๋Œ€๊ทœ๋ชจ ๋ฆฌ์•กํŠธ ์•ฑ์„ ๊ธฐ๋Šฅ๋ณ„๋กœ ๋ชจ๋“ˆํ™”ํ•˜์—ฌ ์‹œ์Šคํ…œ ์•ˆ์ •์„ฑ ํšŒ๋ณต. + +### Adjacent Topics +- **Micro-Frontends Architecture** +- **Design Systems & Component Library Design** +- **Frontend Observability & Monitoring** diff --git a/10_Wiki/Topics/Frontend_Mastery/JSX.md b/10_Wiki/Topics/Frontend_Mastery/JSX.md new file mode 100644 index 00000000..a7b294ab --- /dev/null +++ b/10_Wiki/Topics/Frontend_Mastery/JSX.md @@ -0,0 +1,41 @@ +## ๐Ÿ“Œ Brief Summary +JSX๋Š” UI๋ฅผ ์ƒํƒœ(state)์™€ ์†์„ฑ(props)์˜ ์ˆœ์ˆ˜ ํ•จ์ˆ˜๋กœ ํ‘œํ˜„ํ•˜๋Š” ์„ ์–ธํ˜•(declarative) ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ ์ž‘์„ฑ ๋ฌธ๋ฒ•์ด๋‹ค. HTML๊ณผ ์œ ์‚ฌํ•œ ๊ตฌ๋ฌธ์„ ํ†ตํ•ด UI ๊ตฌ์กฐ๋ฅผ ์ง๊ด€์ ์œผ๋กœ ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋ฉฐ, React Compiler์™€ ๊ฐ™์€ ํ˜„๋Œ€์ ์ธ ๋„๊ตฌ๋“ค์„ ํ†ตํ•ด ๊ณ ์„ฑ๋Šฅ ๋ Œ๋”๋ง ์ตœ์ ํ™”๋ฅผ ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰ํ•œ๋‹ค. + +## ๐Ÿ“– Core Content +1. **์„ ์–ธ์  ์ปดํฌ๋„ŒํŠธ ํ•ฉ์„ฑ (Composition)** + - UI๋ฅผ ๋…๋ฆฝ์ ์ธ ์—˜๋ฆฌ๋จผํŠธ๋“ค์˜ ํŠธ๋ฆฌ ๊ตฌ์กฐ๋กœ ์‚ฌ๊ณ ํ•˜๊ณ  ์กฐ๋ฆฝํ•˜๋„๋ก ์œ ๋„ํ•˜์—ฌ ์ฝ”๋“œ์˜ ์˜ˆ์ธก ๊ฐ€๋Šฅ์„ฑ์„ ๋†’์ธ๋‹ค. + - JSX ์ž์ฒด๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์˜ ์œ„์น˜๋ฅผ ๊ฐ•์ œํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ, ์•„ํ‚คํ…์ฒ˜์  ์ œ์•ฝ(FSD ๋“ฑ)์„ ํ†ตํ•ด ๋กœ์ง ๋ˆ„์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•ด์•ผ ํ•œ๋‹ค. +2. **๋ชจ๋˜ ๋นŒ๋“œ ์‹œ์Šคํ…œ๊ณผ JSX ์ปดํŒŒ์ผ** + - Vite ํ™˜๊ฒฝ์—์„œ๋Š” esbuild ๋˜๋Š” SWC(Rust ๊ธฐ๋ฐ˜)๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ๋„ ์‹ค์‹œ๊ฐ„์— ๊ฐ€๊นŒ์šด ์ปดํŒŒ์ผ ์†๋„๋ฅผ ์ œ๊ณตํ•œ๋‹ค. + - `@vitejs/plugin-react-swc` ์ ์šฉ ์‹œ HMR(Hot Module Replacement) ์„ฑ๋Šฅ์ด ๊ทน๋Œ€ํ™”๋œ๋‹ค. +3. **React Compiler๋ฅผ ํ†ตํ•œ ์ž๋™ ์ตœ์ ํ™”** + - ๊ธฐ์กด์˜ ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜(useMemo ๋“ฑ) ํ•œ๊ณ„๋ฅผ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด, ๋นŒ๋“œ ํƒ€์ž„์— JSX ๋‚ด์˜ ๊ฐœ๋ณ„ ์—˜๋ฆฌ๋จผํŠธ ๋‹จ์œ„๋กœ ๋…๋ฆฝ์ ์ด๊ณ  ์ •๋ฐ€ํ•œ ์บ์‹ฑ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. +4. **์ธ๋ผ์ธ ํ•จ์ˆ˜ ์‚ฌ์šฉ ์‹œ ์ฃผ์˜์ ** + - JSX ๋‚ด๋ถ€์—์„œ ์ต๋ช… ํ•จ์ˆ˜๋ฅผ ์ง์ ‘ ์ •์˜ํ•˜๋Š” ํ–‰์œ„๋Š” ๋งค ๋ Œ๋”๋ง๋งˆ๋‹ค ์ƒˆ๋กœ์šด ์ฐธ์กฐ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ž์‹ ์ปดํฌ๋„ŒํŠธ์˜ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ์œ ๋ฐœํ•˜๋ฏ€๋กœ ์ง€์–‘ํ•ด์•ผ ํ•œ๋‹ค. + +## โš–๏ธ Trade-offs & Caveats +- **๋กœ์ง ํ˜ผ์žฌ์˜ ์œ„ํ—˜**: JSX์˜ ์ž์œ ๋กœ์šด ํŠน์„ฑ์œผ๋กœ ์ธํ•ด UI ๋งˆํฌ์—… ์‚ฌ์ด์— ๋ณต์žกํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™์ด ์„ž์—ฌ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋น„๋Œ€ํ•ด์ง€๊ณ  ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ค์›Œ์งˆ ์ˆ˜ ์žˆ๋‹ค. +- **๋„๊ตฌ ์˜์กด์„ฑ**: React Compiler์™€ ๊ฐ™์€ ์ž๋™ ์ตœ์ ํ™” ๋„๊ตฌ๋Š” 'Rules of React'(์ˆœ์ˆ˜์„ฑ ๋“ฑ)๋ฅผ ์—„๊ฒฉํžˆ ์ค€์ˆ˜ํ•˜๋Š” ์ฝ”๋“œ์—์„œ๋งŒ ์•ˆ์ „ํ•˜๊ฒŒ ์ž‘๋™ํ•˜๋ฏ€๋กœ, ๊ธฐ์กด ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ์™€์˜ ํ˜ธํ™˜์„ฑ ๊ฒ€ํ† ๊ฐ€ ํ•„์š”ํ•˜๋‹ค. +- **์ถ”์ƒํ™” ๋น„์šฉ**: JSX ์„ฑ๋Šฅ์„ ์œ„ํ•ด ๋ชจ๋“  ํ•จ์ˆ˜๋ฅผ useCallback์œผ๋กœ ๊ฐ์‹ธ๋Š” ์ˆ˜๋™ ์ตœ์ ํ™”๋Š” ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ํ•ด์น˜๊ณ  ๊ด€๋ฆฌ ๋น„์šฉ์„ ์ฆ๊ฐ€์‹œํ‚ค๋Š” ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๊ฐ€ ์žˆ๋‹ค. + +## ๐Ÿ”— Knowledge Connections +### Related Concepts +* **Component Trees**: JSX๋กœ ์กฐ๋ฆฝ๋œ UI์˜ ๋…ผ๋ฆฌ์  ๊ตฌ์กฐ (๊ด€๊ณ„: ํ•ต์‹ฌ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ) +* **React Compiler**: JSX ๋ Œ๋”๋ง ์ž๋™ ์ตœ์ ํ™” ์—”์ง„ (๊ด€๊ณ„: ์„ฑ๋Šฅ ๊ฐœ์„  ๋„๊ตฌ) +* **SWC**: ์ดˆ๊ณ ์† JSX ์ปดํŒŒ์ผ๋Ÿฌ (๊ด€๊ณ„: ๋นŒ๋“œ ํƒ€์ž„ ์ธํ”„๋ผ) + +### Deeper Research Questions +1. React Compiler๊ฐ€ JSX ๋‚ด์˜ ๊ฐœ๋ณ„ ํƒœ๊ทธ๋ฅผ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” '์˜์กด์„ฑ ๋ถ„์„' ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ํ•ต์‹ฌ ์›๋ฆฌ๋Š” ๋ฌด์—‡์ธ๊ฐ€? +2. JSX ๋‚ด๋ถ€ ์ธ๋ผ์ธ ํ•จ์ˆ˜๊ฐ€ ์„ฑ๋Šฅ์— ๋ฏธ์น˜๋Š” ์•…์˜ํ–ฅ์ด React Compiler ๋„์ž… ์ดํ›„์—๋„ ์—ฌ์ „ํžˆ ์œ ํšจํ•œ ์ œ์•ฝ ์‚ฌํ•ญ์ธ๊ฐ€? +3. Vite + SWC ํ™˜๊ฒฝ์—์„œ JSX ์ปดํŒŒ์ผ ์‹œ ๋ฐœ์ƒํ•˜๋Š” 'Fast Refresh'์˜ ๋‚ด๋ถ€ ์ž‘๋™ ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ๋ฌด์—‡์ธ๊ฐ€? +4. ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ JSX ๋งˆํฌ์—…์„ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ์™„์ „ํžˆ ๋ถ„๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ 'View-Model' ํŒจํ„ด์˜ ํ”„๋ก ํŠธ์—”๋“œ์  ํ•ด์„์€? +5. JSX์—์„œ 'Fragment'์™€ 'Wrapper Div'๊ฐ€ ๋ Œ๋”๋ง ์„ฑ๋Šฅ ๋ฐ DOM ํŠธ๋ฆฌ ๊นŠ์ด์— ๋ฏธ์น˜๋Š” ์‹ค์งˆ์ ์ธ ์ฐจ์ด๋Š”? + +### Practical Application Contexts +* **๋ Œ๋”๋ง ์ตœ์ ํ™”**: JSX ๋‚ด ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋ฐ–์œผ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ์ฐธ์กฐ ์•ˆ์ •์„ฑ ํ™•๋ณด. +* **๋นŒ๋“œ ์†๋„ ๊ฐœ์„ **: Vite ์„ค์ •์—์„œ SWC ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋„์ž…ํ•˜์—ฌ ๋กœ์ปฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์˜ ํ•ซ ๋ฆฌ๋กœ๋”ฉ ์†๋„ ๊ฐœ์„ . + +### Adjacent Topics +* **Memoization (useMemo, useCallback)** +* **Feature-Sliced Design (FSD)** +* **Virtual DOM vs Incremental DOM** diff --git a/10_Wiki/Topics/Frontend_Mastery/Large-scale React Systems.md b/10_Wiki/Topics/Frontend_Mastery/Large-scale React Systems.md new file mode 100644 index 00000000..37a439f6 --- /dev/null +++ b/10_Wiki/Topics/Frontend_Mastery/Large-scale React Systems.md @@ -0,0 +1,42 @@ +## ๐Ÿ“Œ Brief Summary +๋Œ€๊ทœ๋ชจ React ์‹œ์Šคํ…œ์€ ๋›ฐ์–ด๋‚œ ์œ ์ง€๋ณด์ˆ˜์„ฑ, ํ™•์žฅ์„ฑ, ๊ทธ๋ฆฌ๊ณ  ๊ณ ์„ฑ๋Šฅ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ์„ค๊ณ„๋œ ์ •๊ตํ•œ ์†Œํ”„ํŠธ์›จ์–ด ์•„ํ‚คํ…์ฒ˜์˜ ์ง‘ํ•ฉ์ฒด์ด๋‹ค. ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ UI์˜ ์—„๊ฒฉํ•œ ๋ถ„๋ฆฌ, ๋„๋ฉ”์ธ ์ค‘์‹ฌ์˜ ๋ชจ๋“ˆ ๊ตฌ์กฐ(FSD), ๊ทธ๋ฆฌ๊ณ  ๋ฉ€ํ‹ฐ ๋ ˆ์ด์–ด ์ƒํƒœ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์„ ํ†ตํ•ด ์ˆ˜๋ฐฑ ๋ช…์˜ ๊ฐœ๋ฐœ์ž์™€ ๋ฐฉ๋Œ€ํ•œ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ์ˆ˜์šฉํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•œ๋‹ค. + +## ๐Ÿ“– Core Content +1. **๋„๋ฉ”์ธ ์ค‘์‹ฌ ์•„ํ‚คํ…์ฒ˜: FSD (Feature-Sliced Design)** + - ๊ธฐ์ˆ ์  ํƒ€์ž…์ด ์•„๋‹Œ ๋น„์ฆˆ๋‹ˆ์Šค ๊ธฐ๋Šฅ(Feature) ๋‹จ์œ„๋กœ ์ฝ”๋“œ๋ฅผ ๊ทธ๋ฃนํ™”ํ•˜์—ฌ ์‘์ง‘๋„๋ฅผ ๋†’์ด๊ณ  ์˜์กด์„ฑ ์ŠคํŒŒ๊ฒŒํ‹ฐ๋ฅผ ๋ฐฉ์ง€ํ•œ๋‹ค. + - ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ๊ทœ์น™๊ณผ Public API(`index.ts`)๋ฅผ ํ†ตํ•ด ๋ชจ๋“ˆ ๊ฐ„์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ณ  ๋…๋ฆฝ์  ๋ฐฐํฌ์™€ ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ๋ฅผ ๊ตฌ์ถ•ํ•œ๋‹ค. +2. **๋ฉ€ํ‹ฐ ๋ ˆ์ด์–ด ์ƒํƒœ ๊ด€๋ฆฌ ์ „๋žต** + - **์ „์—ญ ์ƒํƒœ**: ๋ฆฌ๋ Œ๋”๋ง ์ตœ์ ํ™”๊ฐ€ ๊ฐ•๋ ฅํ•œ Zustand ๋˜๋Š” ์—„๊ฒฉํ•œ ๊ฑฐ๋ฒ„๋„Œ์Šค์˜ Redux๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•ฑ ์ „๋ฐ˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ์–ดํ•œ๋‹ค. + - **์„œ๋ฒ„ ์ƒํƒœ**: TanStack Query๋ฅผ ํ†ตํ•ด API ํ†ต์‹ , ์บ์‹ฑ, ๋™๊ธฐํ™” ๋กœ์ง์„ UI์™€ ์™„์ „ํžˆ ๋””์ปคํ”Œ๋งํ•œ๋‹ค. +3. **์ž๋™ํ™”๋œ ์„ฑ๋Šฅ ์—”์ง€๋‹ˆ์–ด๋ง** + - **React Compiler**: ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์˜ ํ•œ๊ณ„๋ฅผ ๊ทน๋ณตํ•˜๊ณ  ๋นŒ๋“œ ํƒ€์ž„์— ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ž๋™ ์บ์‹ฑํ•˜์—ฌ ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ์„ ๊ทน๋Œ€ํ™”ํ•œ๋‹ค. + - **์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…**: Vite์™€ `React.lazy`๋ฅผ ํ™œ์šฉํ•œ ์ง€์—ฐ ๋กœ๋”ฉ์œผ๋กœ ์ดˆ๊ธฐ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ตœ์ ํ™”ํ•œ๋‹ค. +4. **ํšŒ๋ณต ํƒ„๋ ฅ์„ฑ(Resilience) ์„ค๊ณ„** + - Error Boundary๋ฅผ ํ†ตํ•œ ์žฅ์•  ๊ฒฉ๋ฆฌ์™€ Sentry/LogRocket ๊ธฐ๋ฐ˜์˜ ์‹ค์‹œ๊ฐ„ ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด๋กœ ํ”„๋กœ๋•์…˜ ์ด์Šˆ ๋Œ€์‘๋ ฅ์„ ํ™•๋ณดํ•œ๋‹ค. + +## โš–๏ธ Trade-offs & Caveats +- **์•„ํ‚คํ…์ฒ˜ ์ธ์ง€ ๋ถ€ํ•˜**: FSD์™€ ๊ฐ™์€ ์—„๊ฒฉํ•œ ์•„ํ‚คํ…์ฒ˜๋Š” ์ฝ”๋“œ ํ™•์žฅ์„ฑ์—๋Š” ์œ ๋ฆฌํ•˜์ง€๋งŒ, ์‹ ๊ทœ ๊ฐœ๋ฐœ์ž์˜ ์˜จ๋ณด๋”ฉ ๋น„์šฉ๊ณผ ์ดˆ๊ธฐ ์„ค๊ณ„ ๋ณต์žก๋„๊ฐ€ ๋†’๋‹ค. +- **์ˆ˜๋™ vs ์ž๋™ ์ตœ์ ํ™”**: React Compiler๊ฐ€ ๋„์ž…๋˜์–ด๋„ ์จ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€์˜ ์ฐธ์กฐ ๋ถˆ์ผ์น˜๋กœ ์ธํ•œ ์บ์‹œ ๊นจ์ง ํ˜„์ƒ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์–ด ์—ฌ์ „ํžˆ ์ •๋ฐ€ํ•œ ๋””๋ฒ„๊น… ๋Šฅ๋ ฅ์ด ์š”๊ตฌ๋œ๋‹ค. +- **๋„๊ตฌ ๋น„๋Œ€ํ™”**: ๊ฐ•๋ ฅํ•œ ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ๋“ค์˜ ๋„์ž…์€ ๊ทธ ์ž์ฒด๋กœ ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ๋ฅผ ํ‚ค์šฐ๋Š” ์š”์ธ์ด ๋˜๋ฏ€๋กœ ์ƒ˜ํ”Œ๋ง๊ณผ ์ตœ์ ํ™”๋œ ์ž„ํฌํŠธ ์ „๋žต์ด ์ˆ˜๋ฐ˜๋˜์–ด์•ผ ํ•œ๋‹ค. + +## ๐Ÿ”— Knowledge Connections +### Related Concepts +- **Feature-Sliced Design**: ๋Œ€๊ทœ๋ชจ ์‹œ์Šคํ…œ์˜ ๊ตฌ์กฐ์  ๋ผˆ๋Œ€ (๊ด€๊ณ„: ํ•ต์‹ฌ ์•„ํ‚คํ…์ฒ˜) +- **React Compiler**: ์ฐจ์„ธ๋Œ€ ์„ฑ๋Šฅ ์ตœ์ ํ™” ์—”์ง„ (๊ด€๊ณ„: ์„ฑ๋Šฅ ๋ณด์žฅ ์žฅ์น˜) +- **Error Boundaries**: ์‹œ์Šคํ…œ ๊ฐ€์šฉ์„ฑ ๋ณดํ˜ธ ์žฅ์น˜ (๊ด€๊ณ„: ์•ˆ์ •์„ฑ ๋ฉ”์ปค๋‹ˆ์ฆ˜) + +### Deeper Research Questions +1. FSD ๊ตฌ์กฐ์—์„œ ๋ณต์ˆ˜์˜ 'Features' ๊ณ„์ธต์ด ๊ณตํ†ต ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•ด์•ผ ํ•  ๋•Œ, ์˜์กด์„ฑ ๊ทœ์น™์„ ์œ„๋ฐ˜ํ•˜์ง€ ์•Š๋Š” ์ตœ์ ์˜ ์ƒํƒœ ์Šน๊ฒฉ(State Lifting) ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? +2. React Compiler๊ฐ€ ์จ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ๋ฐ˜ํ™˜๋œ ๋ถˆ์•ˆ์ •ํ•œ ๊ฐ์ฒด ์ฐธ์กฐ๋ฅผ ๋งŒ๋‚ฌ์„ ๋•Œ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ์—ฐ์‡„๋ฅผ ์–ด๋–ป๊ฒŒ ๋ณดํ˜ธํ•˜๋Š”๊ฐ€? +3. ๋Œ€๊ทœ๋ชจ ๋ฒˆ๋“ค์—์„œ `manualChunks`๋ฅผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์—…๋ฐ์ดํŠธ ๋นˆ๋„๋ณ„๋กœ ์„ธ๋ถ„ํ™”ํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ € ์บ์‹œ ํšจ์œจ์„ ๊ทน๋Œ€ํ™”ํ•˜๋Š” ์ •๋Ÿ‰์  ๋ถ„์„ ๋ชจ๋ธ์€? +4. ๋ถ„๋ฆฌ๋œ DOM ๋…ธ๋“œ(Detached DOM nodes)๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํƒ์ง€ํ•˜์—ฌ ์ž๋™ ๋กค๋ฐฑ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํ”„๋กœ๋•์…˜ ๋ ˆ๋ฒจ์˜ ๋ชจ๋‹ˆํ„ฐ๋ง ์ž๋™ํ™”๋Š” ๊ฐ€๋Šฅํ•œ๊ฐ€? +5. ๋Œ€๊ทœ๋ชจ ํŒ€์—์„œ ์•„ํ‚คํ…์ฒ˜ ๊ทœ์น™(๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ๋“ฑ)์„ ๊ฐ•์ œํ•˜๊ธฐ ์œ„ํ•œ ์ปค์Šคํ…€ ESLint ๊ทœ์น™์˜ ์œ ์ง€๋ณด์ˆ˜ ์ „๋žต์€? + +### Practical Application Contexts +- **์—”ํ„ฐํ”„๋ผ์ด์ฆˆ๊ธ‰ SaaS ๊ฐœ๋ฐœ**: ๋‹ค์ˆ˜์˜ ๋„๋ฉ”์ธ์ด ์–ฝํžŒ ๋ณต์žกํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„. +- **์„ฑ๋Šฅ ์ค‘์‹ฌ ์•ฑ ๋ฆฌํŒฉํ† ๋ง**: ๋ Œ๋”๋ง ๋ณ‘๋ชฉ์ด ์‹ฌํ•œ ๋Œ€๊ทœ๋ชจ React ์•ฑ์„ ์ž๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜๊ณผ ๊ณ„์ธตํ™”๋œ ์ƒํƒœ ๊ด€๋ฆฌ๋กœ ๊ฐœ์„ . + +### Adjacent Topics +- **Micro-Frontends Architecture** +- **Monorepo Management (Nx / Turborepo)** +- **Visual Regression Testing in CI/CD** diff --git a/10_Wiki/Topics/Frontend_Mastery/React Architecture.md b/10_Wiki/Topics/Frontend_Mastery/React Architecture.md new file mode 100644 index 00000000..269cdd65 --- /dev/null +++ b/10_Wiki/Topics/Frontend_Mastery/React Architecture.md @@ -0,0 +1,44 @@ +## ๐Ÿ“Œ Brief Summary +React Architecture๋Š” ์ปดํฌ๋„ŒํŠธ, ์ƒํƒœ ๊ด€๋ฆฌ, ํŒŒ์ผ ๊ตฌ์กฐ๋ฅผ ์ฒด๊ณ„์ ์œผ๋กœ ์„ค๊ณ„ํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ™•์žฅ์„ฑ, ์œ ์ง€๋ณด์ˆ˜์„ฑ, ์„ฑ๋Šฅ์„ ๊ทน๋Œ€ํ™”ํ•˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด ์‹œ์Šคํ…œ ๋””์ž์ธ์ด๋‹ค. ํŠน์ • ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ฐ•์ œํ•˜์ง€ ์•Š๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํŠน์„ฑ์„ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ๋Šฅ(Feature) ์ค‘์‹ฌ์˜ ๋ชจ๋“ˆํ™”์™€ ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ๊ทœ์น™์„ ์ ์šฉํ•˜์—ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ UI์˜ ๊ฒฐํ•ฉ์„ ์ตœ์†Œํ™”ํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•œ๋‹ค. + +## ๐Ÿ“– Core Content +1. **๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ (Feature-based Structure)** + - ๊ธฐ์ˆ ์  ํƒ€์ž…(์ปดํฌ๋„ŒํŠธ, ํ›…) ์ค‘์‹ฌ์˜ ๊ตฌ์กฐ์—์„œ ๋ฒ—์–ด๋‚˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ๋ณ„๋กœ ์ฝ”๋“œ๋ฅผ ์บก์Аํ™”ํ•˜์—ฌ ์‘์ง‘๋„๋ฅผ ๋†’์ธ๋‹ค. + - ๊ด€๋ จ๋œ API, ์ƒํƒœ, ํƒ€์ž…, ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ•˜๋‚˜์˜ ๊ธฐ๋Šฅ ํด๋” ๋‚ด์— ๋ฐฐ์น˜ํ•˜์—ฌ ์ˆ˜์ • ๋ฒ”์œ„๋ฅผ ๋ช…ํ™•ํžˆ ํ•œ๋‹ค. +2. **Feature-Sliced Design (FSD)** + - ํ˜„๋Œ€ React ์•„ํ‚คํ…์ฒ˜์˜ ํ‘œ์ค€์œผ๋กœ, ์•ฑ์„ `Shared`, `Entities`, `Features`, `Widgets`, `Pages`, `App` ๊ณ„์ธต์œผ๋กœ ๋‚˜๋ˆˆ๋‹ค. + - ์ƒ์œ„ ๊ณ„์ธต์ด ํ•˜์œ„ ๊ณ„์ธต์—๋งŒ ์˜์กดํ•˜๋Š” **๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ**๊ณผ `index.ts`๋ฅผ ํ†ตํ•œ **Public API** ๊ทœ์น™์„ ๊ฐ•์ œํ•˜์—ฌ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ˜๋‹ค. +3. **๋ถ„์‚ฐํ˜• ์ƒํƒœ ๊ด€๋ฆฌ ์•„ํ‚คํ…์ฒ˜** + - ์ƒํƒœ๋ฅผ ์„ฑ๊ฒฉ์— ๋”ฐ๋ผ ๋กœ์ปฌ, ์ „์—ญ ์•ฑ ์ƒํƒœ(Zustand/Redux), ์„œ๋ฒ„ ์ƒํƒœ(TanStack Query), URL ์ƒํƒœ๋กœ ์„ธ๋ถ„ํ™”ํ•˜์—ฌ ๊ด€๋ฆฌํ•œ๋‹ค. + - Context API์˜ ๋ฆฌ๋ Œ๋”๋ง ํ•œ๊ณ„๋ฅผ ์ดํ•ดํ•˜๊ณ , ์„ฑ๋Šฅ์ด ์ค‘์š”ํ•œ ์ „์—ญ ์ƒํƒœ์—๋Š” Selector ํŒจํ„ด์ด ์ง€์›๋˜๋Š” ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. +4. **ํด๋ฆฐ ์ฝ”๋“œ ๋ฐ SOLID ์›์น™** + - ์ปดํฌ๋„ŒํŠธ๋‹น ๋‹จ์ผ ์ฑ…์ž„(SRP)์„ ๋ถ€์—ฌํ•˜๊ณ , ์ปดํฌ๋„ŒํŠธ ํ•ฉ์„ฑ์„ ํ†ตํ•ด ์ˆ˜์ • ์—†์ด ๊ธฐ๋Šฅ์„ ํ™•์žฅ(OCP)ํ•œ๋‹ค. +5. **์„ฑ๋Šฅ ๋ฐ ๋ณต์›๋ ฅ ์„ค๊ณ„** + - React Server Components(RSC)๋ฅผ ํ†ตํ•œ ๋ฒˆ๋“ค ์ตœ์ ํ™”์™€ Error Boundary๋ฅผ ํ™œ์šฉํ•œ ์žฅ์•  ๊ฒฉ๋ฆฌ ์ „๋žต์„ ์•„ํ‚คํ…์ฒ˜ ์ˆ˜์ค€์—์„œ ์ˆ˜๋ฆฝํ•œ๋‹ค. + +## โš–๏ธ Trade-offs & Caveats +- **์•„ํ‚คํ…์ฒ˜ ์ธ์ง€ ๋ถ€ํ•˜**: FSD์™€ ๊ฐ™์€ ์—„๊ฒฉํ•œ ๋ ˆ์ด์–ด๋ง์€ ํŒ€์˜ ํ•™์Šต ๊ณก์„ ์„ ๋†’์ด๋ฉฐ, ๊ฐ„๋‹จํ•œ ์ˆ˜์ •์—๋„ ์—ฌ๋Ÿฌ ํŒŒ์ผ์„ ๊ฑด๋“œ๋ ค์•ผ ํ•˜๋Š” 'Boilerplate' ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ๋‹ค. +- **๊ณผ๋„ํ•œ ์บก์Аํ™”**: ๊ธฐ๋Šฅ์„ ๋„ˆ๋ฌด ์ž˜๊ฒŒ ์ชผ๊ฐค ๊ฒฝ์šฐ ๊ธฐ๋Šฅ ๊ฐ„ ๊ณตํ†ต ๋กœ์ง(Shared)์˜ ๋น„๋Œ€ํ™”๋ฅผ ์ดˆ๋ž˜ํ•˜๊ฑฐ๋‚˜, ๋ชจ๋“ˆ ๊ฐ„ ๋ฐ์ดํ„ฐ ํ†ต์‹ ์ด ๋ณต์žกํ•ด์ง€๋Š” ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๊ฐ€ ์žˆ๋‹ค. +- **๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ข…์†์„ฑ**: ํŠน์ • ์•„ํ‚คํ…์ฒ˜์— ์ตœ์ ํ™”๋œ ๋„๊ตฌ(์˜ˆ: Next.js์™€ RSC)๋ฅผ ์„ ํƒํ•  ๊ฒฝ์šฐ, ํ–ฅํ›„ ๋‹ค๋ฅธ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ์˜ ์ „ํ™˜ ๋น„์šฉ์ด ๋งค์šฐ ๋†’์•„์ง„๋‹ค. + +## ๐Ÿ”— Knowledge Connections +### Related Concepts +- **Feature-Sliced Design (FSD)**: ๊ตฌ์กฐ์  ์บก์Аํ™”์™€ ์˜์กด์„ฑ ์ œ์–ด์˜ ํ•ต์‹ฌ (๊ด€๊ณ„: ํ•ต์‹ฌ ๋ฐฉ๋ฒ•๋ก ) +- **State Management Architecture**: ๋ฐ์ดํ„ฐ ํ๋ฆ„์˜ ๊ณ„์ธตํ™” (๊ด€๊ณ„: ๋ฐ์ดํ„ฐ ๋ ˆ์ด์–ด ์„ค๊ณ„) +- **SOLID Principles**: ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์ปดํฌ๋„ŒํŠธ ์„ค๊ณ„์˜ ๊ทผ๊ฐ„ (๊ด€๊ณ„: ์„ค๊ณ„ ์ฒ ํ•™) + +### Deeper Research Questions +1. FSD ๊ตฌ์กฐ์—์„œ 'Features'์™€ 'Widgets' ๊ณ„์ธต์˜ ์ฑ…์ž„ ๊ฒฝ๊ณ„๊ฐ€ ๋ชจํ˜ธํ•  ๋•Œ, ์–ด๋–ค ๋น„์ฆˆ๋‹ˆ์Šค ๊ธฐ์ค€์„ ์ ์šฉํ•ด์•ผ ์•„ํ‚คํ…์ฒ˜์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? +2. RSC(์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ) ๋„์ž…์ด ๊ธฐ์กด์˜ ํด๋ผ์ด์–ธํŠธ ์ค‘์‹ฌ ์ƒํƒœ ๊ด€๋ฆฌ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์–ด๋–ป๊ฒŒ ๋‹จ์ˆœํ™”ํ•˜๊ฑฐ๋‚˜ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“œ๋Š”๊ฐ€? +3. ์•„ํ‚คํ…์ฒ˜ ๊ทœ์น™(๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ๋“ฑ)์„ ์–ด๊ธฐ๋Š” ์ฝ”๋“œ ์ž‘์„ฑ์„ CI ๋‹จ๊ณ„์—์„œ ์›์ฒœ์ ์œผ๋กœ ์ฐจ๋‹จํ•˜๊ธฐ ์œ„ํ•œ ๋ฆฐํŠธ ๊ทœ์น™ ์ปค์Šคํ„ฐ๋งˆ์ด์ง• ๋ฐฉ์•ˆ์€? +4. ๋Œ€๊ทœ๋ชจ ํŒ€์—์„œ ๋งˆ์ดํฌ๋กœ ํ”„๋ก ํŠธ์—”๋“œ๋กœ ์ „ํ™˜ํ•  ๋•Œ, ์ค‘์•™ ์ง‘์ค‘์‹ ์•„ํ‚คํ…์ฒ˜ ๊ฑฐ๋ฒ„๋„Œ์Šค์™€ ํŒ€๋ณ„ ์ž์œจ์„ฑ ์‚ฌ์ด์˜ ๊ท ํ˜•์ ์€ ์–ด๋””์ธ๊ฐ€? +5. React Compiler๊ฐ€ ์ž๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์ˆ˜ํ–‰ํ•  ๋•Œ, ์•„ํ‚คํ…์ฒ˜์ ์œผ๋กœ '๋ถˆ๋ณ€์„ฑ(Immutability)'์„ ๊ฐ•์ œํ•˜๋Š” ๊ฒƒ์ด ์„ฑ๋Šฅ์— ๋ฏธ์น˜๋Š” ์ •๋Ÿ‰์  ์˜ํ–ฅ์€? + +### Practical Application Contexts +- **๋Œ€๊ทœ๋ชจ ์ œํ’ˆ ์„ค๊ณ„**: ์ˆ˜๋ฐฑ ๊ฐœ์˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ฝํžŒ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ๊ธ‰ SaaS์˜ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ๋ผˆ๋Œ€ ๊ตฌ์ถ•. +- **์„ฑ๋Šฅ ๋ฐ ํ’ˆ์งˆ ๊ฐœ์„ **: ์ŠคํŒŒ๊ฒŒํ‹ฐ ์ฝ”๋“œ๋กœ ๋ณ€ํ•œ ๋ ˆ๊ฑฐ์‹œ React ์•ฑ์„ ๊ธฐ๋Šฅ๋ณ„ ๋ชจ๋“ˆ๋กœ ๊ฒฉ๋ฆฌ ๋ฐ ๋ฆฌํŒฉํ† ๋ง. + +### Adjacent Topics +- **Micro-Frontends** +- **Server Components (RSC)** +- **Test-Driven Development (TDD) in React** diff --git a/10_Wiki/Topics/Frontend_Mastery/React Component Design.md b/10_Wiki/Topics/Frontend_Mastery/React Component Design.md new file mode 100644 index 00000000..078ad918 --- /dev/null +++ b/10_Wiki/Topics/Frontend_Mastery/React Component Design.md @@ -0,0 +1,45 @@ +## ๐Ÿ“Œ Brief Summary +React Component Design์€ ์ธํ„ฐํŽ˜์ด์Šค ์š”์†Œ๋ฅผ ๊ตฌ์กฐํ™”ํ•˜์—ฌ ํ™•์žฅ์„ฑ, ์œ ์ง€๋ณด์ˆ˜์„ฑ, ์„ฑ๋Šฅ์„ ํ™•๋ณดํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜ ์‹ค์ฒœ๋ฒ•์ด๋‹ค. ์ปดํฌ๋„ŒํŠธ์— SOLID, DRY, KISS์™€ ๊ฐ™์€ ์†Œํ”„ํŠธ์›จ์–ด ๊ณตํ•™ ์›์น™์„ ์ ์šฉํ•˜์—ฌ ๊ฐ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ช…ํ™•ํ•œ ์ฑ…์ž„์„ ๊ฐ–๊ณ , ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ UI๊ฐ€ ๋ถ„๋ฆฌ๋˜๋ฉฐ, ์ƒํ˜ธ ๋…๋ฆฝ์ ์œผ๋กœ ํ•ฉ์„ฑ๋  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•œ๋‹ค. + +## ๐Ÿ“– Core Content +1. **SOLID ์›์น™์˜ ์ปดํฌ๋„ŒํŠธ์  ํ•ด์„** + - **SRP (๋‹จ์ผ ์ฑ…์ž„)**: ์ปดํฌ๋„ŒํŠธ๋Š” ํ•˜๋‚˜์˜ ๊ตฌ์ฒด์  ์—ญํ• ๋งŒ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋ฉฐ, ๋น„๋Œ€ํ•ด์ง„ ๋กœ์ง์€ ์ปค์Šคํ…€ ํ›…์œผ๋กœ ๋ถ„๋ฆฌํ•œ๋‹ค. + - **OCP (๊ฐœ๋ฐฉ-ํ์‡„)**: ๋‚ด๋ถ€ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๋Œ€์‹  ์ปดํฌ๋„ŒํŠธ ํ•ฉ์„ฑ(Composition)์ด๋‚˜ `children`์„ ํ†ตํ•ด ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•œ๋‹ค. + - **ISP (์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ)**: ์ปดํฌ๋„ŒํŠธ๋Š” ์ž์‹ ์ด ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์ตœ์†Œํ•œ์˜ prop์—๋งŒ ์˜์กดํ•ด์•ผ ํ•œ๋‹ค. +2. **๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ (Separation of Concerns)** + - UI ์ปดํฌ๋„ŒํŠธ์—์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง, ๋ฐ์ดํ„ฐ ํŒจ์นญ, ๋ถ€์ˆ˜ ํšจ๊ณผ๋ฅผ ์ถ”์ถœํ•˜์—ฌ ์ปค์Šคํ…€ ํ›…์œผ๋กœ ์บก์Аํ™”ํ•œ๋‹ค. + - ์ด๋ฅผ ํ†ตํ•ด UI๋Š” ํ”„๋ Œ์  ํ…Œ์ด์…˜ ์—ญํ• ์—๋งŒ ์ง‘์ค‘ํ•˜๊ณ  ๋กœ์ง์€ ๋…๋ฆฝ์ ์œผ๋กœ ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ๋ฅผ ํ™•๋ณดํ•œ๋‹ค. +3. **๊ณ„์ธต์  ์•„ํ‚คํ…์ฒ˜ (FSD)** + - ๋ฒ”์šฉ UI(Shared), ๋น„์ฆˆ๋‹ˆ์Šค ์—”ํ‹ฐํ‹ฐ(Entities), ์‚ฌ์šฉ์ž ์‹œ๋‚˜๋ฆฌ์˜ค(Features) ๋“ฑ์œผ๋กœ ์ปดํฌ๋„ŒํŠธ์˜ ๋ฒ”์œ„๋ฅผ ๊ณ„์ธตํ™”ํ•˜์—ฌ ๊ด€๋ฆฌํ•œ๋‹ค. +4. **์•ˆ์ •์„ฑ ๋ฐ ์„ฑ๋Šฅ ์„ค๊ณ„** + - **Error Boundaries**: ํŠน์ • ์ปดํฌ๋„ŒํŠธ์˜ ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜๊ฐ€ ์•ฑ ์ „์ฒด๋ฅผ ๋ฉˆ์ถ”์ง€ ์•Š๋„๋ก ์„ ์–ธ์ ์œผ๋กœ ์žฅ์• ๋ฅผ ๊ฒฉ๋ฆฌํ•œ๋‹ค. + - **๋ฉ”๋ชจ์ด์ œ์ด์…˜**: ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด `React.memo`์™€ ์•ˆ์ •์ ์ธ `key` ์ „๋žต์„ ์‚ฌ์šฉํ•œ๋‹ค. +5. **๋ช…๋ช… ์ปจ๋ฒค์…˜** + - ํŒŒ์ผ๋ช…์€ `kebab-case`, ์ปดํฌ๋„ŒํŠธ ๋ฐ ํƒ€์ž…์€ `PascalCase`, ๋ณ€์ˆ˜ ๋ฐ ํ›…์€ `camelCase`๋ฅผ ์ค€์ˆ˜ํ•˜์—ฌ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•œ๋‹ค. + +## โš–๏ธ Trade-offs & Caveats +- **์ถ”์ƒํ™” vs ๋‹จ์ˆœํ•จ**: ๋กœ์ง ๋ถ„๋ฆฌ์™€ ์ถ”์ƒํ™”๋Š” ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์ด์ง€๋งŒ, ๋„ˆ๋ฌด ๋งŽ์€ ์ปค์Šคํ…€ ํ›…๊ณผ ์ปดํฌ๋„ŒํŠธ ๋ถ„๋ฆฌ๋Š” ์ฝ”๋“œ๋ฅผ ํ•œ๋ˆˆ์— ํŒŒ์•…ํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“œ๋Š” '์ธ์ง€์  ํŒŒํŽธํ™”'๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ๋‹ค(KISS ์›์น™๊ณผ์˜ ์ถฉ๋Œ). +- **์„ฑ๋Šฅ ์˜ค๋ฒ„ํ—ค๋“œ**: `React.memo` ๋“ฑ์˜ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ๋‚จ๋ฐœํ•  ๊ฒฝ์šฐ, ๋น„๊ต ์—ฐ์‚ฐ ์ž์ฒด์˜ ๋น„์šฉ์ด ๋ Œ๋”๋ง ๋น„์šฉ๋ณด๋‹ค ์ปค์ง€๋Š” ์—ญํšจ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. +- **์„ค๊ณ„ ์‹œ๊ฐ„ ๋น„์šฉ**: ํ™•์žฅ์„ ๊ณ ๋ คํ•œ OCP ์„ค๊ณ„๋Š” ์ดˆ๊ธฐ ๊ฐœ๋ฐœ ์‹œ๊ฐ„์„ ์ฆ๊ฐ€์‹œํ‚ค๋ฉฐ, ์‹ค์ œ๋กœ ๋ฐœ์ƒํ•˜์ง€ ์•Š์„ ํ™•์žฅ์„ ๋Œ€๋น„ํ•˜๋Š” ๊ณผ์ž‰ ์—”์ง€๋‹ˆ์–ด๋ง(YAGNI ์œ„๋ฐ˜)์ด ๋  ์œ„ํ—˜์ด ์žˆ๋‹ค. + +## ๐Ÿ”— Knowledge Connections +### Related Concepts +- **SOLID Principles**: ๊ณ ํ’ˆ์งˆ ์ปดํฌ๋„ŒํŠธ ์„ค๊ณ„์˜ ๊ธฐ์ค€ (๊ด€๊ณ„: ์„ค๊ณ„ ์›์น™) +- **Custom Hooks**: ๋กœ์ง ๋ถ„๋ฆฌ์™€ ์žฌ์‚ฌ์šฉ์˜ ํ•ต์‹ฌ ๋„๊ตฌ (๊ด€๊ณ„: ์‹ค์ฒœ ์ˆ˜๋‹จ) +- **Error Boundaries**: ์‹œ์Šคํ…œ ๋ณต์›๋ ฅ ํ™•๋ณด (๊ด€๊ณ„: ๋ฐฉ์–ด์  ์„ค๊ณ„) + +### Deeper Research Questions +1. ์ปดํฌ๋„ŒํŠธ ํ•ฉ์„ฑ(Composition)์„ ํ†ตํ•ด OCP๋ฅผ ์ง€ํ‚ฌ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” 'Prop Drilling' ๋ฌธ์ œ๋ฅผ ์•„ํ‚คํ…์ฒ˜์ ์œผ๋กœ ์šฐ์•„ํ•˜๊ฒŒ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์€? +2. React Server Components ํ™˜๊ฒฝ์—์„œ 'ํ”„๋ ˆ์  ํ…Œ์ด์…˜๊ณผ ๋กœ์ง์˜ ๋ถ„๋ฆฌ' ํŒจํ„ด์€ ์–ด๋–ป๊ฒŒ ๋ณ€ํ™”ํ•ด์•ผ ํ•˜๋Š”๊ฐ€? +3. `React.memo`๋ฅผ ํ†ตํ•œ ์ตœ์ ํ™”๊ฐ€ ์‹ค์งˆ์ ์ธ ์„ฑ๋Šฅ ์ด๋“์„ ์ฃผ๋Š”์ง€ ํŒ๋‹จํ•˜๊ธฐ ์œ„ํ•œ ์ •๋Ÿ‰์  ํ”„๋กœํŒŒ์ผ๋ง ๊ธฐ์ค€์€? +4. ๋Œ€๊ทœ๋ชจ ํผ(Form) ์„ค๊ณ„ ์‹œ, ISP๋ฅผ ์ค€์ˆ˜ํ•˜๋ฉด์„œ๋„ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๋กœ์ง์˜ ์‘์ง‘๋„๋ฅผ ์œ ์ง€ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ ์ธํ„ฐํŽ˜์ด์Šค ์„ค๊ณ„๋ฒ•์€? +5. Error Boundary๊ฐ€ ํฌ์ฐฉํ•˜์ง€ ๋ชปํ•˜๋Š” ๋น„๋™๊ธฐ ์—๋Ÿฌ๋ฅผ ์ปดํฌ๋„ŒํŠธ ์ƒ๋ช…์ฃผ๊ธฐ ๋‚ด๋ถ€๋กœ ๋Œ์–ด๋“ค์—ฌ ํ†ตํ•ฉ ์ฒ˜๋ฆฌํ•˜๋Š” ํŒจํ„ด์€? + +### Practical Application Contexts +- **UI ์ปดํฌ๋„ŒํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ตฌ์ถ•**: ๋‹ค์–‘ํ•œ ํ”„๋กœ์ ํŠธ์—์„œ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ณ ๋„๋กœ ์œ ์—ฐํ•œ ๋ฒ ์ด์Šค ์ปดํฌ๋„ŒํŠธ ์„ค๊ณ„. +- **๋ ˆ๊ฑฐ์‹œ ์ปดํฌ๋„ŒํŠธ ๋ฆฌํŒฉํ† ๋ง**: 1000์ค„ ์ด์ƒ์˜ ๊ฑฐ๋Œ€ํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ธฐ๋Šฅ๋ณ„๋กœ ์ชผ๊ฐœ๊ณ  ๋กœ์ง์„ ํ›…์œผ๋กœ ์ถ”์ถœํ•˜์—ฌ ์œ ์ง€๋ณด์ˆ˜์„ฑ ํ™•๋ณด. + +### Adjacent Topics +- **React Hooks & Lifecycle** +- **Feature-Sliced Design (FSD)** +- **Design Systems & Atomic Design** diff --git a/10_Wiki/Topics/Frontend_Mastery/React Folder Structure.md b/10_Wiki/Topics/Frontend_Mastery/React Folder Structure.md new file mode 100644 index 00000000..55c31f0f --- /dev/null +++ b/10_Wiki/Topics/Frontend_Mastery/React Folder Structure.md @@ -0,0 +1,45 @@ +## ๐Ÿ“Œ Brief Summary +React ํด๋” ๊ตฌ์กฐ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋””๋ ‰ํ„ฐ๋ฆฌ์™€ ํŒŒ์ผ์„ ์ฒด๊ณ„์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜์—ฌ ์œ ์ง€๋ณด์ˆ˜์„ฑ, ํ™•์žฅ์„ฑ, ํ˜‘์—… ํšจ์œจ์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•œ ์กฐ์งํ™” ํ”„๋ ˆ์ž„์›Œํฌ๋‹ค. ํ˜„๋Œ€ React ์ƒํƒœ๊ณ„์—์„œ๋Š” ํŒŒ์ผ ์œ ํ˜• ์ค‘์‹ฌ์˜ ๋‹จ์ˆœ ๋ถ„๋ฆฌ๋ฅผ ๋„˜์–ด, ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ๊ณผ ๊ธฐ๋Šฅ์„ ์ค‘์‹ฌ์œผ๋กœ ๋กœ์ง๊ณผ UI๋ฅผ ์‘์ง‘์‹œํ‚ค๋Š” **Feature-based** ๋˜๋Š” **Feature-Sliced Design (FSD)** ๊ตฌ์กฐ๊ฐ€ ๊ถŒ์žฅ๋œ๋‹ค. + +## ๐Ÿ“– Core Content +1. **์ผ๋ฐ˜์ ์ธ ํด๋” ๊ตฌ์กฐ ์ ‘๊ทผ ๋ฐฉ์‹** + - **File-Type Based**: ์ปดํฌ๋„ŒํŠธ, ํ›…, ์œ ํ‹ธ๋ฆฌํ‹ฐ ๋“ฑ ๊ธฐ์ˆ ์  ์—ญํ• ์— ๋”ฐ๋ผ ๋ถ„๋ฅ˜ (์†Œ๊ทœ๋ชจ์— ์ ํ•ฉ). + - **Feature-Based**: ์ธ์ฆ, ๋Œ€์‹œ๋ณด๋“œ ๋“ฑ ๋น„์ฆˆ๋‹ˆ์Šค ๊ธฐ๋Šฅ๋ณ„๋กœ ํด๋”๋ฅผ ๊ตฌ์„ฑํ•˜์—ฌ ์บก์Аํ™”์™€ ๋…๋ฆฝ์  ๊ฐœ๋ฐœ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•จ. +2. **2025 ๊ถŒ์žฅ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๊ตฌ์กฐ** + - `assets/`: ์ •์  ์ž์› ์ค‘์•™ ๊ด€๋ฆฌ. + - `components/`: ์ „์—ญ ๊ณต์œ  ๊ณตํ†ต UI ์ปดํฌ๋„ŒํŠธ. + - `features/`: ๋„๋ฉ”์ธ ๊ธฐ๋ฐ˜ ๊ธฐ๋Šฅ ์ฝ”๋“œ (API, ๊ณ ์œ  ์ปดํฌ๋„ŒํŠธ, ํ›… ํฌํ•จ). + - `services/` (๋˜๋Š” `api/`): ์™ธ๋ถ€ ํ†ต์‹  ๋กœ์ง ๊ฒฉ๋ฆฌ. + - `store/` ๋˜๋Š” `context/`: ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ ๋กœ์ง. +3. **Feature-Sliced Design (FSD) ์•„ํ‚คํ…์ฒ˜** + - ์ฑ…์ž„๊ณผ ๋ฒ”์œ„์— ๋”ฐ๋ผ `app`, `pages`, `widgets`, `features`, `entities`, `shared` ๊ณ„์ธต์œผ๋กœ ๋ถ„๋ฆฌ. + - **๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ**๊ณผ **Public API(`index.ts`)** ๊ทœ์น™์„ ํ†ตํ•ด ๋ชจ๋“ˆ ๋…๋ฆฝ์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•œ๋‹ค. +4. **๋„ค์ด๋ฐ ์ปจ๋ฒค์…˜๊ณผ์˜ ์—ฐ๊ณ„** + - ์ปดํฌ๋„ŒํŠธ๋Š” `PascalCase`, ํŒŒ์ผ ๋ฐ ํด๋” ์ด๋ฆ„์€ ์šด์˜์ฒด์ œ ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด `kebab-case`๋ฅผ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ‘œ์ค€์ด๋‹ค. + +## โš–๏ธ Trade-offs & Caveats +- **๊ตฌ์กฐ์  ๋ณต์žก๋„**: FSD์™€ ๊ฐ™์€ ์—„๊ฒฉํ•œ ์•„ํ‚คํ…์ฒ˜๋Š” ์ฝ”๋“œ์˜ ์˜ˆ์ธก ๊ฐ€๋Šฅ์„ฑ์„ ๋†’์ด์ง€๋งŒ, ์ดˆ๊ธฐ ์„ค๊ณ„ ๋น„์šฉ์ด ํฌ๊ณ  ํŒŒ์ผ ์ด๋™ ์‹œ ์ธ์ง€์  ๋ถ€ํ•˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. +- **๊ณตํ†ต ์ž์› ๋น„๋Œ€ํ™”**: ๊ธฐ๋Šฅ๋ณ„๋กœ ๋‚˜๋ˆ„๋‹ค ๋ณด๋ฉด `shared` ํด๋”๊ฐ€ ์“ฐ๋ ˆ๊ธฐํ†ต์ฒ˜๋Ÿผ ๋น„๋Œ€ํ•ด์งˆ ์œ„ํ—˜์ด ์žˆ์œผ๋ฏ€๋กœ ์ •๊ธฐ์ ์ธ ๊ฑฐ๋ฒ„๋„Œ์Šค๊ฐ€ ํ•„์š”ํ•˜๋‹ค. +- **ํ•™์Šต ๊ณก์„ **: ์ƒˆ๋กœ์šด ํŒ€์›์ด ๋ณต์žกํ•œ ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•˜๊ณ  ์˜ฌ๋ฐ”๋ฅธ ์œ„์น˜์— ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ๊นŒ์ง€ ์˜จ๋ณด๋”ฉ ์‹œ๊ฐ„์ด ์†Œ์š”๋œ๋‹ค. + +## ๐Ÿ”— Knowledge Connections +### Related Concepts +- **Feature-Sliced Design (FSD)**: ๋Œ€๊ทœ๋ชจ ์‹œ์Šคํ…œ ๊ตฌ์กฐํ™”์˜ ํ‘œ์ค€ (๊ด€๊ณ„: ์ƒ์œ„ ์•„ํ‚คํ…์ฒ˜) +- **Separation of Concerns**: ํด๋” ๋ถ„๋ฆฌ์˜ ๊ทผ๋ณธ์  ์ฒ ํ•™ (๊ด€๊ณ„: ์„ค๊ณ„ ์›๋ฆฌ) +- **Single Responsibility Principle (SRP)**: ํŒŒ์ผ ๋‹จ์œ„ ๋ชจ๋“ˆํ™”์˜ ๊ธฐ์ค€ (๊ด€๊ณ„: ๊ฐœ๋ณ„ ์ปดํฌ๋„ŒํŠธ ์„ค๊ณ„ ์›์น™) + +### Deeper Research Questions +1. ํ”„๋กœ์ ํŠธ์˜ ๋ณต์žก๋„๊ฐ€ ์–ด๋А ์ž„๊ณ„์ ์— ๋„๋‹ฌํ–ˆ์„ ๋•Œ File-type ๊ธฐ๋ฐ˜์—์„œ Feature-based ๊ตฌ์กฐ๋กœ ์ „ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ๋น„์šฉ ํšจ์œจ์ ์ธ๊ฐ€? +2. FSD ๊ตฌ์กฐ ๋‚ด์—์„œ ๋ณต์ˆ˜์˜ 'Features'๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•ด์•ผ ํ•  ๋•Œ, ์˜์กด์„ฑ ์ˆœํ™˜์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ 'Entities' ๋ ˆ์ด์–ด ํ™œ์šฉ๋ฒ•์€? +3. Next.js์˜ App Router ํŒŒ์ผ ๊ทœ์•ฝ(`page.tsx`, `layout.tsx`)๊ณผ ์ปค์Šคํ…€ ํด๋” ๊ตฌ์กฐ๋ฅผ ์ถฉ๋Œ ์—†์ด ํ†ตํ•ฉํ•˜๋Š” ์ „๋žต์€? +4. `index.ts`๋ฅผ ํ†ตํ•œ ์บก์Аํ™”๊ฐ€ ํŠธ๋ฆฌ ์‰์ดํ‚น(Tree Shaking) ์„ฑ๋Šฅ์— ๋ฏธ์น˜๋Š” ๊ตฌ์ฒด์ ์ธ ์˜ํ–ฅ์€ ๋ฌด์—‡์ธ๊ฐ€? +5. ๋Œ€๊ทœ๋ชจ ํŒ€์—์„œ ๋ฆฐํŠธ ๊ทœ์น™(ESLint)์„ ํ†ตํ•ด ํด๋” ๊ณ„์ธต ๊ฐ„์˜ ์ž˜๋ชป๋œ ์ฐธ์กฐ๋ฅผ ์ž๋™์œผ๋กœ ๊ฐ์ง€ํ•˜๊ณ  ์ฐจ๋‹จํ•˜๋Š” ์„ค์ • ๋ฐฉ์•ˆ์€? + +### Practical Application Contexts +- **์‹ ๊ทœ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ ์…‹์—…**: ํ™•์žฅ์„ฑ์„ ๊ณ ๋ คํ•œ FSD ๊ธฐ๋ฐ˜ ํด๋” ๊ตฌ์กฐ ์„ค๊ณ„ ๋ฐ ํ…œํ”Œ๋ฆฟํ™”. +- **๋ ˆ๊ฑฐ์‹œ ๊ตฌ์กฐ ๊ฐœ์„ **: ์—‰๋ง์œผ๋กœ ์„ž์ธ `components` ํด๋”๋ฅผ ๋„๋ฉ”์ธ ์ค‘์‹ฌ์˜ `features` ํด๋”๋กœ ์ ์ง„์  ์žฌ๋ฐฐ์น˜. + +### Adjacent Topics +- **State Management Architectures** +- **Frontend Naming Conventions** +- **Micro-Frontends Project Structure** diff --git a/10_Wiki/Topics/Frontend_Mastery/React Frontend Development.md b/10_Wiki/Topics/Frontend_Mastery/React Frontend Development.md index cb3cd3de..ce2d3c3a 100644 --- a/10_Wiki/Topics/Frontend_Mastery/React Frontend Development.md +++ b/10_Wiki/Topics/Frontend_Mastery/React Frontend Development.md @@ -1,35 +1,42 @@ -# [[React [[Frontend]] Development]] - -## ๐Ÿ“Œ[[ brief]] Summary -React๋Š” ๊ฐ€์ƒ DOM([[Virtual DOM]])๊ณผ ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ฒ˜(CBA)๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํšจ์œจ์ ์ด๊ณ  ์„ ์–ธ์ ์œผ๋กœ ๊ตฌ์ถ•ํ•˜๋Š” ํ”„๋ก ํŠธ์—”๋“œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค [1-3]. ๋ธŒ๋ผ์šฐ์ €์˜ ๋น„์šฉ์ด ๋งŽ์ด ๋“œ๋Š” Reflow์™€ Repaint ์ž‘์—…์„ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•ด '์žฌ์กฐ์ •([[Reconciliation]])' ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜๋ฉฐ, ์ตœ์‹  ๋ฒ„์ „์—์„œ๋Š” Fiber ์•„ํ‚คํ…์ฒ˜์™€ ์ž๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜([[React Compiler]])์„ ํ†ตํ•ด ๋ Œ๋”๋ง ์„ฑ๋Šฅ์„ ๊ทน๋Œ€ํ™”ํ•ฉ๋‹ˆ๋‹ค [1, 3-5]. ๋˜ํ•œ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํŠน์„ฑ์— ๋งž์ถฐ CSR, SSR, SSG ๋ฐ [[React Server Components]](RSC) ๋“ฑ ๋‹ค์–‘ํ•œ ๋ Œ๋”๋ง ์ „๋žต์„ ์ง€์›ํ•˜์—ฌ ์ดˆ๊ธฐ ๋กœ๋”ฉ ์†๋„, SEO, ์ƒํ˜ธ์ž‘์šฉ(Interactivity)์˜ ๊ท ํ˜•์„ ๋งž์ถฅ๋‹ˆ๋‹ค [6-9]. +## ๐Ÿ“Œ Brief Summary +React ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์€ ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ฒ˜๋ฅผ ํ†ตํ•ด ํ˜„๋Œ€์ ์ธ ์›น ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๊ณต์ •์ด๋‹ค. ๋น„์ฆˆ๋‹ˆ์Šค ๊ธฐ๋Šฅ ์ค‘์‹ฌ์˜ ํด๋” ๊ตฌ์กฐ(FSD), ๊ณ„์ธตํ™”๋œ ์ƒํƒœ ๊ด€๋ฆฌ, ๊ทธ๋ฆฌ๊ณ  ์ž๋™ํ™”๋œ ์„ฑ๋Šฅ ์ตœ์ ํ™”์™€ ์—๋Ÿฌ ํ•ธ๋“ค๋ง์„ ๊ฒฐํ•ฉํ•˜์—ฌ ์œ ์ง€๋ณด์ˆ˜ ๊ฐ€๋Šฅํ•˜๊ณ  ํ™•์žฅ์„ฑ ์žˆ๋Š” ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•œ๋‹ค. ## ๐Ÿ“– Core Content -* **๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง ๊ณผ์ • (CRP) ๋ฐ ๋น„์šฉ ์ตœ์†Œํ™”** - ๋ธŒ๋ผ์šฐ์ €์˜ ์ค‘์š” ๋ Œ๋”๋ง ๊ฒฝ๋กœ([[Critical Rendering Path]])๋Š” HTML๊ณผ CSS๋ฅผ ํŒŒ์‹ฑํ•˜์—ฌ DOM๊ณผ [[CSSOM]] ํŠธ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์ด๋ฅผ ๊ฒฐํ•ฉํ•ด ๋ Œ๋” ํŠธ๋ฆฌ([[Render Tree]])๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค [10, 11]. ์ดํ›„ ์š”์†Œ์˜ ์ •ํ™•ํ•œ ์œ„์น˜์™€ ํฌ๊ธฐ๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๋ ˆ์ด์•„์›ƒ(Reflow) ๋‹จ๊ณ„์™€ ํ™”๋ฉด์— ํ”ฝ์…€์„ ๊ทธ๋ฆฌ๋Š” ํŽ˜์ธํŠธ(Repaint) ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์นฉ๋‹ˆ๋‹ค [12, 13]. Reflow๋Š” ์—ฐ์‚ฐ ๋น„์šฉ์ด ๋งค์šฐ ๋†’์œผ๋ฉฐ, ์žฆ์€ Reflow์™€ Repaint๋Š” ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์œ ๋ฐœํ•˜๋ฏ€๋กœ DOM ์ ‘๊ทผ๊ณผ ์กฐ์ž‘์„ ์ตœ์†Œํ™”ํ•˜๋Š” ๊ฒƒ์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค [14-16]. +1. **์•„ํ‚คํ…์ฒ˜ ๋ฐ ์„ค๊ณ„ ์›์น™** + - **FSD (Feature-Sliced Design)**: ๋„๋ฉ”์ธ ๊ณ„์ธตํ™”์™€ ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ์„ ํ†ตํ•ด ์‹œ์Šคํ…œ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ˜๋‹ค. + - **SOLID & Clean Code**: ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋น„๋Œ€ํ•ด์ง„ ๋กœ์ง์„ ์ปค์Šคํ…€ ํ›…์œผ๋กœ ์ถ”์ถœํ•˜์—ฌ ์บก์Аํ™”ํ•œ๋‹ค. +2. **์„ธ๋ถ„ํ™”๋œ ์ƒํƒœ ๊ด€๋ฆฌ** + - ์ •์ /๊ธ€๋กœ๋ฒŒ ์ƒํƒœ(Context), ๋นˆ๋ฒˆํ•œ ์—…๋ฐ์ดํŠธ(Zustand), ์„œ๋ฒ„ ๋™๊ธฐํ™”(TanStack Query)๋กœ ์—ญํ• ์„ ๋ถ„๋ฆฌํ•˜์—ฌ ๋ฆฌ๋ Œ๋”๋ง ์„ฑ๋Šฅ์„ ๊ทน๋Œ€ํ™”ํ•œ๋‹ค. +3. **์„ฑ๋Šฅ ๋ฐ ๋ฆฌ์†Œ์Šค ์ตœ์ ํ™”** + - **React Compiler**: ๋นŒ๋“œ ํƒ€์ž„ ์ž๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ํ†ตํ•ด ์ˆ˜๋™ ์ตœ์ ํ™”์˜ ์ธ์  ์˜ค๋ฅ˜๋ฅผ ์ค„์ธ๋‹ค. + - **Code Splitting**: `React.lazy`์™€ Vite ์„ค์ •์„ ํ†ตํ•ด ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ตœ์ ํ™”ํ•˜๊ณ  ์‚ฌ์šฉ์ž ์ฒด๊ฐ ๋กœ๋”ฉ ์†๋„๋ฅผ ๊ฐœ์„ ํ•œ๋‹ค. +4. **์•ˆ์ •์„ฑ ๋ฐ ๊ด€์ธก์„ฑ (Observability)** + - **Error Boundaries**: ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜ ๊ฒฉ๋ฆฌ๋กœ ์‹œ์Šคํ…œ ๋ณต์›๋ ฅ์„ ํ™•๋ณดํ•œ๋‹ค. + - **๋ชจ๋‹ˆํ„ฐ๋ง**: Sentry, LogRocket ๋ฐ ๋ธŒ๋ผ์šฐ์ € ๋ฉ”๋ชจ๋ฆฌ ํ”„๋กœํŒŒ์ผ๋ง์„ ํ†ตํ•ด ์‹ค์‹œ๊ฐ„ ์—๋Ÿฌ์™€ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ์ถ”์ ํ•œ๋‹ค. -* **Virtual DOM ๋ฐ ์žฌ์กฐ์ • (Reconciliation)** - ์‹ค์ œ DOM์˜ ์ง์ ‘์ ์ธ ์กฐ์ž‘์œผ๋กœ ์ธํ•œ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด, React๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ๊ฐ€๋ฒผ์šด UI ํ‘œํ˜„์ธ Virtual DOM์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค [1, 3]. ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ์ƒˆ๋กœ์šด Virtual DOM์„ ์ƒ์„ฑํ•˜๊ณ  ์ด์ „ ํŠธ๋ฆฌ์™€ ๋น„๊ต(Diffing)ํ•˜์—ฌ ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„๋งŒ ์‹ค์ œ DOM์— ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค [1, 3]. ์ด ์žฌ์กฐ์ • ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์š”์†Œ์˜ ํƒ€์ž… ๋น„๊ต ๋ฐ ๋ฆฌ์ŠคํŠธ์˜ `key` ์†์„ฑ์„ ํ™œ์šฉํ•ด $O(n^3)$์˜ ๋ณต์žก๋„๋ฅผ $O(n)$์œผ๋กœ ์ตœ์ ํ™”ํ•ฉ๋‹ˆ๋‹ค [17-20]. - -* **[[React Fiber]] ์•„ํ‚คํ…์ฒ˜์™€ ๋™์‹œ์„ฑ ๋ Œ๋”๋ง ([[Concurrent Rendering]])** - React 16์— ๋„์ž…๋œ Fiber ์•„ํ‚คํ…์ฒ˜๋Š” ๋ Œ๋”๋ง ์ž‘์—…์„ 'Fiber ๋…ธ๋“œ'๋ผ๋Š” ์ž‘์€ ์ž‘์—… ๋‹จ์œ„๋กœ ๋ถ„ํ• ํ•˜์—ฌ ๋™์‹œ์„ฑ ๋ Œ๋”๋ง์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค [21-23]. ์šฐ์„ ์ˆœ์œ„ ๊ธฐ๋ฐ˜ ๋ชจ๋ธ([[Lane Model]])๊ณผ ์‹œ๊ฐ„ ๋ถ„ํ• ([[Time-Slicing]])์„ ์ ์šฉํ•˜์—ฌ, ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ(ํƒ€์ดํ•‘, ํด๋ฆญ ๋“ฑ)๊ณผ ๊ฐ™์€ ๊ธด๊ธ‰ํ•œ ์ž‘์—…์ด ๋“ค์–ด์˜ค๋ฉด ๋ฌด๊ฑฐ์šด ๋ Œ๋”๋ง ์ž‘์—…์„ ์ž ์‹œ ์ค‘๋‹จ(Yield)ํ•˜๊ณ  ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋ฅผ ๋น„์›Œ๋‘์–ด UI์˜ ๋ฐ˜์‘์„ฑ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค [22, 24-26]. - -* **์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ฒ˜ ([[Component-Based Architecture]])** - ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋…๋ฆฝ์ ์ด๊ณ  ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„๋กœ ๋ถ„ํ• ํ•˜์—ฌ ๊ตฌ์ถ•ํ•ฉ๋‹ˆ๋‹ค [27-29]. ๊ฐ ์ปดํฌ๋„ŒํŠธ๋Š” ์ž์ฒด ๋กœ์ง๊ณผ UI ์ƒํƒœ๋ฅผ ์บก์Аํ™”ํ•˜์—ฌ ๋ Œ๋”๋งํ•˜๋ฏ€๋กœ ์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ํ™•์žฅ์„ฑ์ด ๋†’์œผ๋ฉฐ, ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์—์„œ๋„ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค [30-32]. - -* **๋ Œ๋”๋ง ์ „๋žต: [[CSR vs SSR vs SSG]] vs RSC** - * **CSR (Client-Side Rendering):** ์„œ๋ฒ„์—์„œ ๋นˆ HTML์„ ๋ฐ›๊ณ  ๋ธŒ๋ผ์šฐ์ €๊ฐ€ [[JavaScript]]๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜์—ฌ UI๋ฅผ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค. ๋™์  ์ƒํ˜ธ์ž‘์šฉ์— ์œ ๋ฆฌํ•˜์ง€๋งŒ, JS ๋‹ค์šด๋กœ๋“œ ์ „๊นŒ์ง€ ํ™”๋ฉด์ด ๋ณด์ด์ง€ ์•Š์•„ ์ดˆ๊ธฐ ๋กœ๋”ฉ๊ณผ SEO์— ๋ถˆ๋ฆฌํ•ฉ๋‹ˆ๋‹ค [6, 33-35]. - * **SSR (Server-Side Rendering):** ์„œ๋ฒ„์—์„œ HTML์„ ๋ฏธ๋ฆฌ ๋ Œ๋”๋งํ•˜์—ฌ ์ „์†กํ•˜๋ฏ€๋กœ ์ดˆ๊ธฐ ์ฝ˜ํ…์ธ  ํ‘œ์‹œ๊ฐ€ ๋น ๋ฅด๊ณ  SEO์— ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค [7, 36, 37]. ์ดํ›„ ๋ธŒ๋ผ์šฐ์ €์—์„œ JS๋ฅผ ์—ฐ๊ฒฐํ•ด ์ƒํ˜ธ์ž‘์šฉ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ์ˆ˜ํ™”([[Hydration]]) ๊ณผ์ •์„ ๊ฑฐ์นฉ๋‹ˆ๋‹ค [7, 36, 38]. - * **SSG (Static Site Generation):** ๋นŒ๋“œ ํƒ€์ž„์— HTML์„ ์ƒ์„ฑํ•˜์—ฌ CDN์œผ๋กœ ๋ฐฐํฌํ•˜๋ฏ€๋กœ ๋กœ๋”ฉ ์†๋„๊ฐ€ ๊ฐ€์žฅ ๋น ๋ฆ…๋‹ˆ๋‹ค [8, 39]. - * **[[React [[Server Components]] (RSC)]]:** ์„œ๋ฒ„์—์„œ๋งŒ ๋ Œ๋”๋ง๋˜๋ฉฐ ํด๋ผ์ด์–ธํŠธ๋กœ JavaScript ๋ฒˆ๋“ค์„ ์ „ํ˜€ ๋ณด๋‚ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค [9, 40]. ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ค„์ด๊ณ  ์„œ๋ฒ„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ƒํ˜ธ์ž‘์šฉ์ด ํ•„์š”ํ•œ ๊ณณ์—๋งŒ Client Component๋ฅผ ํ˜ผํ•ฉํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [41-43]. - -* **์ตœ์‹  ๋ Œ๋”๋ง ์ตœ์ ํ™” ๊ธฐ๋ฒ• ([[React 18]] & 19)** - * **์ž๋™ ๋ฐฐ์นญ ([[Automatic Batching]]):** React 18๋ถ€ํ„ฐ๋Š” ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ Promise, setTimeout ๋“ฑ ๋น„๋™๊ธฐ ์ž‘์—… ๋‚ด์˜ ์—ฌ๋Ÿฌ ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋ฅผ ํ•˜๋‚˜๋กœ ๋ฌถ์–ด([[Batching]]) ๋‹จ์ผ ๋ฆฌ๋ Œ๋”๋ง๋งŒ ์œ ๋ฐœํ•ฉ๋‹ˆ๋‹ค [44-46]. - * **React Compiler:** [[React 19]]์— ๋„์ž…๋œ ๋นŒ๋“œ ํƒ€์ž„ ์ตœ์ ํ™” ๋„๊ตฌ๋กœ, ๊ฐœ๋ฐœ์ž๊ฐ€ ์ˆ˜๋™์œผ๋กœ ์ž‘์„ฑํ•˜๋˜ `useMemo`, `useCallback`์„ ์ œ๊ฑฐํ•˜๊ณ  AST๋ฅผ ๋ถ„์„ํ•ด ์ž๋™์œผ๋กœ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๊ฒฝ๊ณ„๋ฅผ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค [5, 47-49]. ์ด๋ฅผ ํ†ตํ•ด ๋ถˆํ•„์š”ํ•œ ์—ฐ์‚ฐ๊ณผ ๋ฆฌ๋ Œ๋”๋ง์„ ์ง€๋Šฅ์ ์œผ๋กœ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค [49, 50]. +## โš–๏ธ Trade-offs & Caveats +- **๊ธฐ์ˆ  ์Šคํƒ ํŒŒํŽธํ™”**: ์ƒํƒœ ๊ด€๋ฆฌ๋‚˜ ๋ Œ๋”๋ง ๋ฐฉ์‹(SSR vs CSR)์— ๋”ฐ๋ผ ๋„ˆ๋ฌด ๋งŽ์€ ๋„๊ตฌ๋ฅผ ๋„์ž…ํ•  ๊ฒฝ์šฐ, ํ”„๋กœ์ ํŠธ์˜ ๋ณต์žก๋„๊ฐ€ ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ์ƒ์Šนํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜ ๋น„์šฉ์ด ์ฆ๊ฐ€ํ•œ๋‹ค. +- **์„ฑ๋Šฅ ์ตœ์ ํ™”์˜ ํ•จ์ •**: `useMemo`๋‚˜ `useCallback`์˜ ๋‚จ๋ฐœ์€ ์˜คํžˆ๋ ค ๋น„๊ต ์—ฐ์‚ฐ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์‹ค์ œ ๋ณ‘๋ชฉ ์ง€์ ์„ ํ”„๋กœํŒŒ์ผ๋งํ•œ ํ›„ ์ ์šฉํ•ด์•ผ ํ•œ๋‹ค. +- **๊ทœ๊ฒฉํ™”์˜ ์ธ์ง€์  ๋น„์šฉ**: ์—„๊ฒฉํ•œ ๋„ค์ด๋ฐ ๊ทœ์น™๊ณผ ์•„ํ‚คํ…์ฒ˜๋Š” ์‹ ๊ทœ ๊ฐœ๋ฐœ์ž์˜ ์˜จ๋ณด๋”ฉ์„ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์ž๋™ํ™”๋œ ๋ฆฐํŠธ ๊ทœ์น™๊ณผ ๋ฌธ์„œํ™”๊ฐ€ ํ•„์ˆ˜์ ์ด๋‹ค. ## ๐Ÿ”— Knowledge Connections -- **Related Topics:** [[Virtual DOM]], [[Critical Rendering Path (CRP)]], [[React Fiber]], [[Component-Based Architecture]], [[Client-Side Rendering (CSR)]], [[Server-Side Rendering (SSR)]], [[React Server Components (RSC)]] -- **Projects/Contexts:** [[Next.js]], Single-Page Applications (SPA) -- **Contradictions/Notes:** React Compiler์˜ ๋„์ž…์œผ๋กœ `React.memo`, `useMemo`, `useCallback`๊ณผ ๊ฐ™์€ ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์ด 90% ์ด์ƒ ๋ถˆํ•„์š”ํ•ด์กŒ์œผ๋‚˜, ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋ถˆ์•ˆ์ •ํ•œ ๊ฐ์ฒด ์ฐธ์กฐ๋ฅผ ๋‹ค๋ฃจ๊ฑฐ๋‚˜ ํŠน์ • Effect ์˜์กด์„ฑ์„ ๋ช…์‹œ์ ์œผ๋กœ ์ œ์–ดํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์—ฌ์ „ํžˆ ํƒˆ์ถœ๊ตฌ(Escape Hatch)๋กœ์จ ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์˜ ์‚ฌ์šฉ์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [51-53]. +### Related Concepts +- **Feature-Sliced Design (FSD)**: ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ ์„ค๊ณ„ ๋ฐฉ๋ฒ•๋ก  (๊ด€๊ณ„: ๊ตฌ์กฐ์  ๊ฐ€์ด๋“œ๋ผ์ธ) +- **Zustand & TanStack Query**: ์„ฑ๋Šฅ ์ค‘์‹ฌ์˜ ์ƒํƒœ ๊ด€๋ฆฌ ์ „๋žต (๊ด€๊ณ„: ๋ฐ์ดํ„ฐ ๋ ˆ์ด์–ด ๋„๊ตฌ) +- **React Compiler**: ์ฐจ์„ธ๋Œ€ ์ž๋™ ์ตœ์ ํ™” ๋ฉ”์ปค๋‹ˆ์ฆ˜ (๊ด€๊ณ„: ์„ฑ๋Šฅ ์ตœ์‹ ํ™”) ---- -*Last updated: 2026-04-25* \ No newline at end of file +### Deeper Research Questions +1. FSD ์•„ํ‚คํ…์ฒ˜์—์„œ ์ธ์ฆ(Auth)๊ณผ ๊ฐ™์€ ์ „์—ญ ๊ด€์‹ฌ์‚ฌ๋ฅผ ํŠน์ • ๋ ˆ์ด์–ด์— ๋ฐฐ์น˜ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์˜์กด์„ฑ ๋”œ๋ ˆ๋งˆ๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•˜๋Š”๊ฐ€? +2. React Compiler ๋„์ž… ์‹œ, ์ฐธ์กฐ ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•˜์ง€ ์•Š๋Š” ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค๊ณผ์˜ ์ƒํ˜ธ ์šด์šฉ์„ฑ ํ•œ๊ณ„๋Š” ๋ฌด์—‡์ธ๊ฐ€? +3. Zustand์˜ ์™ธ๋ถ€ ์Šคํ† ์–ด ๋ชจ๋ธ์ด React์˜ Concurrent Rendering ๋ชจ๋“œ์™€ ์ถฉ๋Œํ•  ๊ฐ€๋Šฅ์„ฑ๊ณผ ๊ทธ ํ•ด๊ฒฐ์ฑ…์€? +4. ๋ชจ๋ฐ”์ผ ๋ฐ ์ €์‚ฌ์–‘ ๊ธฐ๊ธฐ์—์„œ Hydration ๋น„์šฉ์„ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•œ 'Partial Hydration' ๋˜๋Š” 'Islands Architecture'์˜ React์  ๊ตฌํ˜„ ๋ฐฉ์•ˆ์€? +5. ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ 'Detached DOM nodes'๋กœ ์ธํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๊ฐ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์ž๋™ํ™”๋œ ํšŒ๊ท€ ํ…Œ์ŠคํŠธ ๊ตฌ์ถ•์ด ๊ฐ€๋Šฅํ•œ๊ฐ€? + +### Practical Application Contexts +- **๋Œ€๊ทœ๋ชจ ์›น ์•ฑ ๊ตฌ์ถ•**: ์ˆ˜์ฒœ ๊ฐœ์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฐ€์ง„ ๋ณต์žกํ•œ ๋Œ€์‹œ๋ณด๋“œ๋‚˜ SaaS ํ”Œ๋žซํผ์˜ ์•ˆ์ •์  ๊ฐœ๋ฐœ. +- **์„ฑ๋Šฅ ์ค‘์‹ฌ ๋ฆฌํŒฉํ† ๋ง**: ๋กœ๋”ฉ ์†๋„๊ฐ€ ๋А๋ฆฌ๊ณ  ๋ฆฌ๋ Œ๋”๋ง์ด ๋นˆ๋ฒˆํ•œ ๊ธฐ์กด ํ”„๋กœ์ ํŠธ๋ฅผ ์ตœ์‹  ์•„ํ‚คํ…์ฒ˜์™€ ๋„๊ตฌ๋กœ ํ˜„๋Œ€ํ™”. + +### Adjacent Topics +- **Vite Build Optimization** +- **Frontend Observability & Logging** +- **Web Accessibility (A11y) & Core Web Vitals** \ No newline at end of file diff --git a/10_Wiki/Topics/Frontend_Mastery/React Refactoring.md b/10_Wiki/Topics/Frontend_Mastery/React Refactoring.md new file mode 100644 index 00000000..0e250f3a --- /dev/null +++ b/10_Wiki/Topics/Frontend_Mastery/React Refactoring.md @@ -0,0 +1,42 @@ +## ๐Ÿ“Œ Brief Summary +React Refactoring์€ ๊ธฐ์กด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์™ธ๋ถ€ ๋™์ž‘์„ ์œ ์ง€ํ•˜๋ฉด์„œ ๋‚ด๋ถ€ ๊ตฌ์กฐ, ๊ฐ€๋…์„ฑ, ๋ชจ๋“ˆ์„ฑ์„ ํ˜„๋Œ€์  ํ‘œ์ค€์— ๋งž๊ฒŒ ๊ฐœ์„ ํ•˜๋Š” ์ž‘์—…์ด๋‹ค. ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์˜ ํ˜„๋Œ€ํ™”, ๋น„๋Œ€ํ•œ ์ปดํฌ๋„ŒํŠธ์˜ ๋ถ„๋ฆฌ, ์ตœ์‹  ์ƒํƒœ ๊ด€๋ฆฌ ์Šคํƒ(Zustand, Query) ๋„์ž…์„ ํ†ตํ•ด ๊ธฐ์ˆ  ๋ถ€์ฑ„๋ฅผ ์ƒํ™˜ํ•˜๊ณ  ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์‹œ์Šคํ…œ์œผ๋กœ ์ง„ํ™”์‹œํ‚ค๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•œ๋‹ค. + +## ๐Ÿ“– Core Content +1. **์•ˆ์ „๋ง ํ™•๋ณด (Testing First)** + - ๋ฆฌํŒฉํ† ๋ง ์ „ ๊ธฐ๋Šฅ ๊นจ์ง์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์™€ UI ํ…Œ์ŠคํŠธ ์ˆ˜ํŠธ๋ฅผ ๋จผ์ € ๊ตฌ์ถ•ํ•œ๋‹ค. +2. **ํ˜„๋Œ€์  ํŒจ๋Ÿฌ๋‹ค์ž„ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜** + - ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์™€ ํ›…์œผ๋กœ ์ „ํ™˜ํ•˜๊ณ , ๋ถˆํ•„์š”ํ•œ `useEffect`๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค. + - JavaScript ์ฝ”๋“œ๋ฅผ TypeScript๋กœ ์ ์ง„์ ์œผ๋กœ ์ „ํ™˜ํ•˜์—ฌ ์ •์  ์•ˆ์ •์„ฑ์„ ํ™•๋ณดํ•œ๋‹ค. +3. **์ปค์Šคํ…€ ํ›…์„ ํ†ตํ•œ ๋กœ์ง ๋ถ„๋ฆฌ (SRP)** + - 300์ค„ ์ด์ƒ์˜ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง(๋ฐ์ดํ„ฐ ํŒจ์นญ, ํผ ์ฒ˜๋ฆฌ ๋“ฑ)์„ ์ถ”์ถœํ•˜์—ฌ ์ปค์Šคํ…€ ํ›…์œผ๋กœ ์บก์Аํ™”ํ•œ๋‹ค. +4. **์ƒํƒœ ๊ด€๋ฆฌ ์ตœ์‹ ํ™”** + - ๋ฌด๊ฑฐ์šด ๋‹จ์ผ ์Šคํ† ์–ด(Redux ๋“ฑ)๋ฅผ ๊ฑท์–ด๋‚ด๊ณ  ์„œ๋ฒ„ ์ƒํƒœ(TanStack Query)์™€ ํด๋ผ์ด์–ธํŠธ ์ „์—ญ ์ƒํƒœ(Zustand/Context)๋กœ ๋ถ„๋ฆฌํ•œ๋‹ค. +5. **์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ „๋žต** + - ์ „์ฒด ์žฌ์ž‘์„ฑ๋ณด๋‹ค๋Š” "Refactor, do not rewrite" ์ฒ ํ•™์„ ๋ฐ”ํƒ•์œผ๋กœ ๊ธฐ๋Šฅ ๋‹จ์œ„์˜ ๋‹จ๊ณ„์  ์ „ํ™˜์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. + +## โš–๏ธ Trade-offs & Caveats +- **์ผ์‹œ์  ์ฝ”๋“œ ์ค‘๋ณต**: ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ณผ๋„๊ธฐ์—๋Š” ๊ตฌํ˜• ๋กœ์ง๊ณผ ์‹ ๊ทœ ๋กœ์ง์ด ๊ณต์กดํ•˜์—ฌ ์ฝ”๋“œ๋ฒ ์ด์Šค๊ฐ€ ์ผ์‹œ์ ์œผ๋กœ ์ง€์ €๋ถ„ํ•ด์งˆ ์ˆ˜ ์žˆ๋‹ค. +- **์„ฑ๋Šฅ ํšŒ๊ท€ ์œ„ํ—˜**: ํด๋ž˜์Šค ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ `useEffect`๋กœ ์˜ฎ๊ธฐ๋Š” ๊ณผ์ •์—์„œ ์˜๋„์น˜ ์•Š์€ ๋ฌดํ•œ ๋ฃจํ”„๋‚˜ ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ฉด๋ฐ€ํ•œ ๊ฒ€์ฆ์ด ํ•„์š”ํ•˜๋‹ค. +- **๋ฆฌํŒฉํ† ๋ง ๋น„์šฉ**: ๋‹น์žฅ์˜ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ๋ณด๋‹ค ์‹œ๊ฐ„์ด ๋งŽ์ด ์†Œ์š”๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๋น„์ฆˆ๋‹ˆ์Šค ๊ฐ€์น˜์™€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ณ ๋ คํ•œ ๋ฆฌํŒฉํ† ๋ง ๋ฒ”์œ„ ์„ค์ •์ด ์ค‘์š”ํ•˜๋‹ค. + +## ๐Ÿ”— Knowledge Connections +### Related Concepts +- **Custom Hooks**: ๋กœ์ง ๋ถ„๋ฆฌ์˜ ํ•ต์‹ฌ ๋‹จ์œ„ (๊ด€๊ณ„: ์‹ค์ฒœ ๋„๊ตฌ) +- **SOLID Principles**: ๊ตฌ์กฐ ๊ฐœ์„ ์˜ ์„ค๊ณ„ ๊ธฐ์ค€ (๊ด€๊ณ„: ์ด๋ก ์  ๊ทผ๊ฑฐ) +- **TanStack Query**: ์„œ๋ฒ„ ์ƒํƒœ ๊ด€๋ฆฌ์— ์ตœ์ ํ™”๋œ ๋ฆฌํŒฉํ† ๋ง ๋Œ€์ƒ (๊ด€๊ณ„: ์ฃผ์š” ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์Šคํƒ) + +### Deeper Research Questions +1. ๋Œ€๊ทœ๋ชจ ๋ฆฌํŒฉํ† ๋ง ์‹œ ์‹ /๊ตฌ ์ƒํƒœ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™”๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ 'Adapter' ํŒจํ„ด์˜ ์ ์šฉ ๋ฐฉ์•ˆ์€? +2. `useEffect`๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ์ƒํƒœ ์—…๋ฐ์ดํŠธ ๋กœ์ง์„ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋‚˜ ํ›… ๋‚ด๋ถ€๋กœ ์˜ฎ๊ธธ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋™๊ธฐํ™” ์‹œ์  ์ฐจ์ด ๋ฌธ์ œ ํ•ด๊ฒฐ๋ฒ•์€? +3. FSD ์•„ํ‚คํ…์ฒ˜๋กœ ๋ฆฌํŒฉํ† ๋ง ์‹œ, ๊ธฐ์กด์— ์–ฝํ˜€์žˆ๋˜ ๊ต์ฐจ ๊ด€์‹ฌ์‚ฌ(Cross-cutting concerns)๋ฅผ ์–ด๋–ป๊ฒŒ ์•ˆ์ „ํ•˜๊ฒŒ ๋ถ„๋ฆฌํ•  ๊ฒƒ์ธ๊ฐ€? +4. ๋ฆฌํŒฉํ† ๋ง ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•˜๋Š” 'Breaking Changes'๋ฅผ ํŒ€์›๋“ค์—๊ฒŒ ๊ณต์œ ํ•˜๊ณ  ์ฝ”๋“œ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์ž๋™ํ™”๋œ ๋ฌธ์„œํ™” ๋ฐฉ์•ˆ์€? +5. TypeScript ์ „ํ™˜ ์‹œ 'Any' ํƒ€์ž…์„ ์ ์ง„์ ์œผ๋กœ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•œ ์ •์  ๋ถ„์„ ๋„๊ตฌ ํ™œ์šฉ ์ „๋žต์€? + +### Practical Application Contexts +- **๋ ˆ๊ฑฐ์‹œ React ์•ฑ ํ˜„๋Œ€ํ™”**: ์˜ค๋ž˜๋œ ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜ ํ”„๋กœ์ ํŠธ๋ฅผ ์ตœ์‹  ํ›… ๋ฐ ์ƒํƒœ ๊ด€๋ฆฌ ์ฒด๊ณ„๋กœ ๊ฐœ์„ . +- **์„ฑ๋Šฅ ๋ฐ ์œ ์ง€๋ณด์ˆ˜์„ฑ ๊ฐ•ํ™”**: ๋ณต์žกํ•˜๊ฒŒ ์–ฝํžŒ ์ปดํฌ๋„ŒํŠธ๋“ค์„ SRP ์›์น™์— ๋”ฐ๋ผ ์ž‘๊ณ  ๋ช…ํ™•ํ•œ ๋‹จ์œ„๋กœ ๋ถ„ํ•ด. + +### Adjacent Topics +- **Legacy System Migration** +- **Clean Code & Refactoring Patterns** +- **Frontend Observability** diff --git a/10_Wiki/Topics/Frontend_Mastery/React Server Components.md b/10_Wiki/Topics/Frontend_Mastery/React Server Components.md index 9ca6318c..e6dc215b 100644 --- a/10_Wiki/Topics/Frontend_Mastery/React Server Components.md +++ b/10_Wiki/Topics/Frontend_Mastery/React Server Components.md @@ -1,18 +1,40 @@ -# [[React Server Components]] - -## ๐Ÿ“Œ[[ brief]] Summary -React [[Server Components]](RSC)๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์•„๋‹Œ ์„œ๋ฒ„์—์„œ๋งŒ ๋…์ ์ ์œผ๋กœ ๋ Œ๋”๋ง๋˜์–ด ํด๋ผ์ด์–ธํŠธ๋กœ [[JavaScript]] ๋ฒˆ๋“ค์„ ์ „์†กํ•˜์ง€ ์•Š๋Š” React์˜ ํ˜์‹ ์ ์ธ ๋ Œ๋”๋ง ์•„ํ‚คํ…์ฒ˜์ž…๋‹ˆ๋‹ค [1]. ์ด ํ™˜๊ฒฝ์—์„œ๋Š” [[React Context]]์— ๋Œ€ํ•œ ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ์กด์˜ ๋Ÿฐํƒ€์ž„ ๊ธฐ๋ฐ˜ ์Šคํƒ€์ผ๋ง ๋„๊ตฌ์™€์˜ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๋ฅผ ์•ผ๊ธฐํ–ˆ์œผ๋ฉฐ, ํ”„๋ก ํŠธ์—”๋“œ์˜ ์Šคํƒ€์ผ๋ง ํŒจ๋Ÿฌ๋‹ค์ž„์— ํฐ ๋ณ€ํ™”๋ฅผ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค [2, 3]. ๊ฒฐ๊ณผ์ ์œผ๋กœ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ํ”„๋ก ํŠธ์—”๋“œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ตฌ์ถ•ํ•˜๋ ค๋ฉด ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ์˜ ์—ญํ• ์„ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌํ•˜๊ณ  RSC ํ™˜๊ฒฝ์— ์ตœ์ ํ™”๋œ ์Šคํƒ€์ผ๋ง ์ „๋žต์„ ์ฑ„ํƒํ•˜๋Š” ๊ฒƒ์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค [4, 5]. +## ๐Ÿ“Œ Brief Summary +React Server Components(RSC)๋Š” ์„œ๋ฒ„์—์„œ๋งŒ ์‹คํ–‰๋˜์–ด ํด๋ผ์ด์–ธํŠธ๋กœ ์ „์†ก๋˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ํš๊ธฐ์ ์œผ๋กœ ์ค„์ด๋Š” ์„ฑ๋Šฅ ์ตœ์ ํ™” ์•„ํ‚คํ…์ฒ˜๋‹ค. ์ƒํ˜ธ์ž‘์šฉ์ด ์—†๋Š” ์ •์  UI๋Š” ์„œ๋ฒ„์—์„œ ์™„์ „ํžˆ ๋ Œ๋”๋งํ•˜๊ณ  ํ•„์š”ํ•œ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ๋งŒ ๋ธŒ๋ผ์šฐ์ €๋กœ ์ „์†กํ•จ์œผ๋กœ์จ, ํ•˜์ด๋“œ๋ ˆ์ด์…˜ ๋น„์šฉ์„ ์ ˆ๊ฐํ•˜๊ณ  ์ดˆ๊ธฐ ๋กœ๋”ฉ ์†๋„๋ฅผ ๊ทน๋Œ€ํ™”ํ•œ๋‹ค. ## ๐Ÿ“– Core Content -* **RSC์˜ ๋™์ž‘ ์›๋ฆฌ์™€ ์ปดํฌ๋„ŒํŠธ ๊ตฌ์„ฑ**: ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋Š” ์™„์ „ํžˆ ์„œ๋ฒ„์—์„œ ์‹คํ–‰๋˜์–ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ Œ๋”๋ง๋œ ์ •์  HTML๋งŒ์„ ํด๋ผ์ด์–ธํŠธ์— ์ „๋‹ฌํ•˜๋ฏ€๋กœ ์„ฑ๋Šฅ ์ตœ์ ํ™”์™€ ๋ณด์•ˆ ์œ ์ง€์— ํƒ์›”ํ•ฉ๋‹ˆ๋‹ค [1]. ๋ฐ˜๋ฉด, ์ปดํฌ๋„ŒํŠธ์— ์ƒํƒœ([[State]])๋‚˜ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ๊ฐ™์€ ๋ธŒ๋ผ์šฐ์ € ์ƒํ˜ธ์ž‘์šฉ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์— ํ•œํ•ด `'use client'` ์ง€์‹œ์–ด๋ฅผ ๋ช…์‹œํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ถ„๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [6]. ๋ชจ๋ฒ”์ ์ธ ์•„ํ‚คํ…์ฒ˜ ๊ตฌ์„ฑ์„ ์œ„ํ•ด์„œ๋Š” ๋ฐ์ดํ„ฐ ํŒจ์นญ์„ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ฒ˜๋ฆฌํ•˜๊ณ  ์ƒํ˜ธ์ž‘์šฉ์ด ํ•„์š”ํ•œ ์ตœ์†Œํ•œ์˜ ์˜์—ญ๋งŒ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ๋กœ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [5, 7]. -* **๊ธฐ์กด [[CSS-in-JS]] ์•„ํ‚คํ…์ฒ˜์™€์˜ ๋งˆ์ฐฐ**: RSC์˜ ์„œ๋ฒ„ ์ „์šฉ ๋ Œ๋”๋ง ํ™˜๊ฒฝ์€ ๊ธฐ์กด ํ”„๋ก ํŠธ์—”๋“œ ์ƒํƒœ๊ณ„์— ํฐ ์˜ํ–ฅ์„ ๋ฏธ์ณค์Šต๋‹ˆ๋‹ค. ํŠนํžˆ `[[styled-components]]`๋‚˜ `Emotion`๊ณผ ๊ฐ™์€ ๋Ÿฐํƒ€์ž„ CSS-in-JS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ํ…Œ๋งˆ ์ฃผ์ž…์„ ์œ„ํ•ด ๋‚ด๋ถ€์ ์œผ๋กœ React Context์— ํฌ๊ฒŒ ์˜์กดํ•˜๋Š”๋ฐ, RSC ํ™˜๊ฒฝ์—๋Š” React Context๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๊ตฌ์กฐ์ ์ธ ๋น„ํ˜ธํ™˜์„ฑ(incompatibility)์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [2, 3, 8]. -* **ํ˜„๋Œ€์ ์ธ ์Šคํƒ€์ผ๋ง ๋ฐ ๋ Œ๋”๋ง ์ „๋žต**: ์œ„์™€ ๊ฐ™์€ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๋กœ ์ธํ•ด ํ˜„์žฌ [[Next.js App Router]]๋ฅผ ๋น„๋กฏํ•œ RSC ํ™˜๊ฒฝ์—์„œ๋Š” ๋Ÿฐํƒ€์ž„ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์—†๋Š” ๋นŒ๋“œ ํƒ€์ž„ ์Šคํƒ€์ผ๋ง ๋ฐฉ์‹์ด ๊ฐ•๋ ฅํžˆ ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค [2, 9]. ์ •์  CSS๋ฅผ ์ƒ์„ฑํ•˜๋Š” `[[Tailwind CSS]]`, `[[CSS Modules]]` ๋˜๋Š” [[Zero-Runtime CSS-in-JS]]์ธ `[[vanilla-extract]]`๋ฅผ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์ด ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ณ  ๋ณต์žก์„ฑ์„ ์ค„์ด๋Š” ํ•ต์‹ฌ ์ „๋žต์ž…๋‹ˆ๋‹ค [3, 4, 9]. RSC ํ™˜๊ฒฝ์—์„œ๋Š” ์ˆ˜๋งŽ์€ ๊ณ ์œ  ํด๋ž˜์Šค๋ฅผ ๋Ÿฐํƒ€์ž„์— ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•˜๊ธฐ๋ณด๋‹ค, ์ •์ ์ธ ์Šคํƒ€์ผ์„ ์œ ์ง€ํ•˜๋˜ ๋ฐ์ดํ„ฐ ์†์„ฑ(`data-*` attributes)์„ ๋ณ€๊ฒฝํ•˜์—ฌ ์ƒํƒœ ๋ณ€ํ˜•์„ ์ œ์–ดํ•˜๋Š” ๋ฐฉ์‹์ด ์„ฑ๋Šฅ ์ตœ์ ํ™”์— ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค [10]. -* **Styled-components์˜ RSC ์ง€์› ๋ฐ ์šฐํšŒ ๋ฐฉ์‹**: ์™„์ „ํ•œ ๋Œ€์•ˆ์œผ๋กœ ์ „ํ™˜ํ•˜์ง€ ๋ชปํ•˜๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•ด `styled-components`๋Š” v6.3.0๋ถ€ํ„ฐ RSC ํ™˜๊ฒฝ์„ ์ž๋™ ๊ฐ์ง€ํ•˜๋Š” ํŒจ์น˜๋ฅผ ์ ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค [11]. RSC ํ™˜๊ฒฝ์—์„œ๋Š” `ThemeProvider`๊ฐ€ ์•„๋ฌด ๋™์ž‘๋„ ํ•˜์ง€ ์•Š๋Š” ํŒจ์Šค์Šค๋ฃจ(no-op)๋กœ ๋ณ€ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ด๋ฅผ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋„๋ก CSS Custom Properties(๋ณ€์ˆ˜) ๊ธฐ๋ฐ˜์˜ ํ…Œ๋งˆ๋ฅผ ์ƒ์„ฑํ•˜๋Š” `createTheme` ํ—ฌํผ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค [12, 13]. ๋˜ํ•œ SSR ์‹œ ์Šคํƒ€์ผ์ด ์œ ์‹ค๋˜์ง€ ์•Š๋„๋ก ์„œ๋ฒ„์—์„œ ๋ Œ๋”๋ง ์ค‘ CSS๋ฅผ ์ˆ˜์ง‘ํ•˜์—ฌ ์‚ฝ์ž…ํ•˜๋Š” `[[Style Registry]]` ํŒจํ„ด์„ ๊ตฌ์„ฑํ•ด์•ผ ํ•˜๋ฉฐ, ์ธ๋ผ์ธ ์Šคํƒ€์ผ ํƒœ๊ทธ ์‚ฝ์ž…์œผ๋กœ ์ธํ•ด ๊นจ์งˆ ์ˆ˜ ์žˆ๋Š” ์ž์‹ ์ธ๋ฑ์Šค ์„ ํƒ์ž ๋ฌธ์ œ(`:first-child` ๋“ฑ)๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ `stylisPluginRSC` ํ”Œ๋Ÿฌ๊ทธ์ธ๋„ ํ•จ๊ป˜ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค [14, 15]. +1. **์„œ๋ฒ„ ์‚ฌ์ด๋“œ ์ „์šฉ ๋ Œ๋”๋ง** + - ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋Š” ํด๋ผ์ด์–ธํŠธ ๋ฒˆ๋“ค์— ํฌํ•จ๋˜์ง€ ์•Š์•„ ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ๊ฐ€ ์ค„์–ด๋“ค๊ณ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค/API์— ์ง์ ‘ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. +2. **๋ฒˆ๋“ค ๋ฐ ํ•˜์ด๋“œ๋ ˆ์ด์…˜ ์ตœ์ ํ™”** + - ์ •์  UI๋ฅผ ์„œ๋ฒ„์—์„œ ๋ฏธ๋ฆฌ ๋ Œ๋”๋งํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ์˜ JS ์‹คํ–‰ ๋น„์šฉ(TTI, Total Blocking Time)์„ ์ตœ์†Œํ™”ํ•œ๋‹ค. +3. **์ปดํฌ๋„ŒํŠธ ์กฐํ•ฉ ํŒจํ„ด** + - `use client` ์ง€์‹œ์–ด๋ฅผ ํ†ตํ•ด ์ƒํ˜ธ์ž‘์šฉ์ด ํ•„์š”ํ•œ ์˜์—ญ๋งŒ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ๋กœ ์„ ํƒ์ ์œผ๋กœ ์ •์˜ํ•œ๋‹ค. + - ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ์‚ฌ์šฉํ•˜๋˜, ์‚ฌ์šฉ์ž ์ธํ„ฐ๋ž™์…˜์ด ํ•„์š”ํ•œ ์ง€์ ์—์„œ๋งŒ ํด๋ผ์ด์–ธํŠธ ๊ฒฝ๊ณ„๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋œ๋‹ค. +4. **์ด์ค‘ ํŽ˜์นญ(Double Fetching) ํ•ด๊ฒฐ** + - ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๊ณ  ๋ฐ›๋Š” ๋Œ€๊ธฐ ์‹œ๊ฐ„์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ์„œ๋ฒ„ ๋‚ด๋ถ€์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ํŽ˜์นญํ•˜์—ฌ ๋ Œ๋”๋ง์— ๋ฐ˜์˜ํ•œ๋‹ค. + +## โš–๏ธ Trade-offs & Caveats +- **ํ™˜๊ฒฝ ๋ฐ ๋„๊ตฌ ์ œ์•ฝ**: ํ˜„์žฌ ์ฃผ๋กœ Next.js App Router์™€ ๊ฐ™์€ ํŠน์ • ํ”„๋ ˆ์ž„์›Œํฌ ํ™˜๊ฒฝ์—์„œ๋งŒ ์•ˆ์ •์ ์œผ๋กœ ์ž‘๋™ํ•˜๋ฉฐ, ๊ธฐ์กด Pages Router์™€๋Š” ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š”๋‹ค. +- **์ƒํƒœ ๋ฐ ํ›…์˜ ํ•œ๊ณ„**: ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ๋Š” `useState`, `useEffect` ๋“ฑ์˜ ํด๋ผ์ด์–ธํŠธ ์ „์šฉ ํ›…๊ณผ ๋ธŒ๋ผ์šฐ์ € API๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค. +- **๊ตฌ์กฐ์  ๋ณต์žก์„ฑ**: ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ ๊ฐ„์˜ ๊ฒฝ๊ณ„ ์„ค๊ณ„ ๋ฐ ๋ฐ์ดํ„ฐ ์ง๋ ฌํ™”(Serialization) ์ด์Šˆ๋ฅผ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋Š” ์„ค๊ณ„์  ๋ถ€๋‹ด์ด ์กด์žฌํ•œ๋‹ค. ## ๐Ÿ”— Knowledge Connections -- **Related Topics:** [[Tailwind CSS]], [[Styled-components]], [[CSS-in-JS]], Zero-runtime CSS -- **Projects/Contexts:** [[Next.js App Router]] -- **Contradictions/Notes:** ์†Œ์Šค [2, 3, 8]์—์„œ๋Š” `styled-components` ๋“ฑ ๋Ÿฐํƒ€์ž„ CSS-in-JS๊ฐ€ React Context ๋ถ€์žฌ๋กœ ์ธํ•ด RSC์™€ ๊ทผ๋ณธ์ ์œผ๋กœ ํ˜ธํ™˜๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ [[Next.js]] App Router ํ™˜๊ฒฝ์—์„œ ํ”ผํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์†Œ์Šค [11-14]์— ๋”ฐ๋ฅด๋ฉด, `styled-components`๋Š” ์ตœ์‹  ์—…๋ฐ์ดํŠธ๋ฅผ ํ†ตํ•ด RSC ํ™˜๊ฒฝ์„ ์Šค์Šค๋กœ ๊ฐ์ง€ํ•˜๊ณ  Context ์˜์กด์„ ํƒˆํ”ผํ•˜์—ฌ CSS Custom Properties๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ƒˆ๋กœ์šด API ๋ฐ ์ž๋™ ์Šคํƒ€์ผ ์ธ๋ผ์ธ ์ฃผ์ž… ๊ธฐ๋Šฅ์œผ๋กœ RSC ํ™˜๊ฒฝ์—์„œ์˜ ์‚ฌ์šฉ์„ ๊ณ„์†ํ•ด์„œ ์ง€์›ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. +### Related Concepts +- **Next.js App Router**: RSC์˜ ํ‘œ์ค€ ๊ตฌํ˜„์ฒด (๊ด€๊ณ„: ๊ตฌ๋™ ํ™˜๊ฒฝ) +- **Hydration**: RSC๋ฅผ ํ†ตํ•ด ๋น„์šฉ์„ ์ ˆ๊ฐํ•˜๊ณ ์ž ํ•˜๋Š” ๋Œ€์ƒ ๊ณผ์ • (๊ด€๊ณ„: ์ตœ์ ํ™” ๋ชฉํ‘œ) +- **Client Components**: ์ƒํ˜ธ์ž‘์šฉ์„ ์œ„ํ•œ RSC์˜ ๋ณด์™„์žฌ (๊ด€๊ณ„: ์ƒํ˜ธ ์šด์šฉ ๊ด€๊ณ„) ---- -*Last updated: 2026-04-26* \ No newline at end of file +### Deeper Research Questions +1. RSC์™€ ๊ธฐ์กด SSR(Server Side Rendering)์€ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ๋ฐฉ์‹๊ณผ ๋ฒˆ๋“ค๋ง ๋ฉ”์ปค๋‹ˆ์ฆ˜์—์„œ ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ค ๊ธฐ์ˆ ์  ์ฐจ์ด๊ฐ€ ์žˆ๋Š”๊ฐ€? +2. ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ๊ฒฝ๊ณ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ Props๋กœ ๋„˜๊ธธ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” '์ง๋ ฌํ™” ๊ฐ€๋Šฅ์„ฑ' ์ œ์•ฝ ์กฐ๊ฑด์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ํŒจํ„ด์€? +3. RSC๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์„œ๋ฒ„ ๋ถ€ํ•˜๋ฅผ ์ œ์–ดํ•˜๊ณ  ํšจ์œจ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์บ์‹ฑํ•˜๊ธฐ ์œ„ํ•œ 'Request Memoization' ์ „๋žต์€? +4. ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(์˜ˆ: CSS-in-JS, UI Kits)๊ฐ€ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ ํ™˜๊ฒฝ์„ ์ง€์›ํ•˜์ง€ ์•Š์„ ๋•Œ์˜ ์šฐํšŒ ๋ฐฉ๋ฒ•๋ก ์€? +5. RSC ํ™˜๊ฒฝ์—์„œ ๋ณด์•ˆ ๋ฏผ๊ฐ ์ •๋ณด(API Key ๋“ฑ)๊ฐ€ ํด๋ผ์ด์–ธํŠธ๋กœ ์œ ์ถœ๋˜์ง€ ์•Š๋„๋ก ๋ณด์žฅํ•˜๋Š” 'Server-only' ๋ชจ๋“ˆ ํ™œ์šฉ ๋ฐฉ์•ˆ์€? + +### Practical Application Contexts +- **๊ณ ์„ฑ๋Šฅ ์›น ์„œ๋น„์Šค ๊ตฌ์ถ•**: ๋Œ€๊ทœ๋ชจ ์ด์ปค๋จธ์Šค๋‚˜ ๋‰ด์Šค ๋ฏธ๋””์–ด ๊ฐ™์ด ์ดˆ๊ธฐ ๋กœ๋”ฉ ์†๋„๊ฐ€ ๋น„์ฆˆ๋‹ˆ์Šค ์ง€ํ‘œ์— ์ง๊ฒฐ๋˜๋Š” ์‚ฌ์ดํŠธ ๊ฐœ๋ฐœ. +- **๋ฒˆ๋“ค ๋‹ค์ด์–ดํŠธ**: ๋ฌด๊ฑฐ์šด ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„œ๋ฒ„ ์ธก์—์„œ๋งŒ ์‹คํ–‰ํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ ์ž์‚ฐ ์ตœ์†Œํ™”. + +### Adjacent Topics +- **Code Splitting & Streaming SSR** +- **Core Web Vitals Optimization** +- **Edge Computing & Serverless Functions** \ No newline at end of file diff --git a/10_Wiki/Topics/Frontend_Mastery/React.md b/10_Wiki/Topics/Frontend_Mastery/React.md new file mode 100644 index 00000000..c75e6db5 --- /dev/null +++ b/10_Wiki/Topics/Frontend_Mastery/React.md @@ -0,0 +1,42 @@ +## ๐Ÿ“Œ Brief Summary +React๋Š” ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒํƒœ(State)์™€ ์†์„ฑ(Props)์˜ ์ˆœ์ˆ˜ ํ•จ์ˆ˜๋กœ ํ‘œํ˜„ํ•˜์—ฌ ์˜ˆ์ธก ๊ฐ€๋Šฅ์„ฑ๊ณผ ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•˜๋Š” ์„ ์–ธํ˜•(Declarative) UI ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‹ค. ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ฒ˜์™€ ํ›…(Hooks) ์‹œ์Šคํ…œ์„ ํ†ตํ•ด ๋ชจ๋“ˆํ™”๋œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ์ถ•์„ ์ง€์›ํ•˜๋ฉฐ, ํ˜„๋Œ€์ ์ธ ์•„ํ‚คํ…์ฒ˜(FSD) ๋ฐ ์ตœ์ ํ™” ๋„๊ตฌ(React Compiler)๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ๋Œ€๊ทœ๋ชจ ์‹œ์Šคํ…œ์œผ๋กœ ํ™•์žฅ ๊ฐ€๋Šฅํ•˜๋‹ค. + +## ๐Ÿ“– Core Content +1. **ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์•„ํ‚คํ…์ฒ˜ (FSD)** + - ๋‹จ์ˆœ ํŒŒ์ผ ํƒ€์ž… ๋ถ„๋ฆฌ์—์„œ ๋ฒ—์–ด๋‚˜ ๋น„์ฆˆ๋‹ˆ์Šค ๊ธฐ๋Šฅ(Feature) ์ค‘์‹ฌ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๊ทธ๋ฃนํ™”ํ•˜์—ฌ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ณ  ์บก์Аํ™”๋ฅผ ๊ฐ•ํ™”ํ•œ๋‹ค. +2. **์„ธ๋ถ„ํ™”๋œ ์ƒํƒœ ๊ด€๋ฆฌ** + - ๋กœ์ปฌ ์ƒํƒœ, ์ „์—ญ ์•ฑ ์ƒํƒœ(Zustand/Redux), ์„œ๋ฒ„ ์ƒํƒœ(TanStack Query)๋กœ ์—ญํ• ์„ ๋ถ„๋ฆฌํ•˜์—ฌ ๋ฆฌ๋ Œ๋”๋ง ํญํฌ ํ˜„์ƒ์„ ๋ฐฉ์ง€ํ•œ๋‹ค. +3. **์ž๋™ํ™”๋œ ์„ฑ๋Šฅ ์ตœ์ ํ™”** + - **React Compiler**: ๋นŒ๋“œ ํƒ€์ž„ ์ž๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์œผ๋กœ ์ˆ˜๋™ `useMemo` ๋“ฑ์˜ ์˜ค๋ฅ˜๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•œ๋‹ค. + - **์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…**: `React.lazy`์™€ Suspense๋ฅผ ํ†ตํ•ด ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ตœ์ ํ™”ํ•œ๋‹ค. +4. **๋ณต์›๋ ฅ ์žˆ๋Š” ์—๋Ÿฌ ํ•ธ๋“ค๋ง** + - **Error Boundaries**: ๋Ÿฐํƒ€์ž„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—๋Ÿฌ๋ฅผ ํฌ์ฐฉํ•˜์—ฌ ์ „์ฒด ์•ฑ ๋‹ค์šด์„ ๋ฐฉ์ง€ํ•˜๊ณ  Fallback UI๋ฅผ ์ œ๊ณตํ•œ๋‹ค. +5. **์—”์ง€๋‹ˆ์–ด๋ง ์›์น™์˜ ์ค€์ˆ˜** + - SOLID, DRY, KISS, YAGNI ์›์น™์„ ์ปดํฌ๋„ŒํŠธ ๋ฐ ์ปค์Šคํ…€ ํ›… ์„ค๊ณ„์— ์ฒ ์ €ํžˆ ์ ์šฉํ•˜์—ฌ ๊ธฐ์ˆ  ๋ถ€์ฑ„๋ฅผ ์ตœ์†Œํ™”ํ•œ๋‹ค. + +## โš–๏ธ Trade-offs & Caveats +- **์ž์œ ๋„์˜ ๋Œ€๊ฐ€**: ํŠน์ • ๊ตฌ์กฐ๋ฅผ ๊ฐ•์ œํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ, ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐ ๋‹จ๊ณ„์—์„œ ๋ช…ํ™•ํ•œ ์•„ํ‚คํ…์ฒ˜ ๊ฐ€์ด๋“œ๋ผ์ธ์ด ๋ถ€์žฌํ•  ๊ฒฝ์šฐ ์ฝ”๋“œ๋ฒ ์ด์Šค๊ฐ€ ๋น ๋ฅด๊ฒŒ ์ŠคํŒŒ๊ฒŒํ‹ฐํ™”๋  ์ˆ˜ ์žˆ๋‹ค. +- **์ถ”์ƒํ™” ๋น„์šฉ**: ํ›…๊ณผ ์ปดํฌ๋„ŒํŠธ ํ•ฉ์„ฑ์„ ํ†ตํ•œ ๊ณ ๋„์˜ ์ถ”์ƒํ™”๋Š” ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์ด์ง€๋งŒ, ๊ณผํ•  ๊ฒฝ์šฐ ์ฝ”๋“œ์˜ ํ๋ฆ„์„ ํŒŒ์•…ํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“œ๋Š” ์ธ์ง€์  ๋ถ€ํ•˜๋ฅผ ์ดˆ๋ž˜ํ•œ๋‹ค. +- **๋ฒ„์ „ ๋ณ€ํ™”์˜ ์†๋„**: Server Components, React Compiler ๋“ฑ ํŒจ๋Ÿฌ๋‹ค์ž„์ด ๋น ๋ฅด๊ฒŒ ๋ณ€ํ™”ํ•˜๋ฏ€๋กœ ํŒ€์˜ ๊ธฐ์ˆ  ์Šคํƒ์„ ์ง€์†์ ์œผ๋กœ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•˜๋Š” ์šด์˜ ๋ถ€๋‹ด์ด ์žˆ๋‹ค. + +## ๐Ÿ”— Knowledge Connections +### Related Concepts +- **Feature-Sliced Design (FSD)**: ๋Œ€๊ทœ๋ชจ ๊ตฌ์กฐํ™”์˜ ํ‘œ์ค€ (๊ด€๊ณ„: ์•„ํ‚คํ…์ฒ˜ ๋ชจ๋ธ) +- **React Compiler**: ์ฐจ์„ธ๋Œ€ ์ž๋™ ์ตœ์ ํ™” ์žฅ์น˜ (๊ด€๊ณ„: ์„ฑ๋Šฅ ๊ฐœ์„  ๋„๊ตฌ) +- **State Management**: ๋ฐ์ดํ„ฐ ํ๋ฆ„ ์ œ์–ด์˜ ํ•ต์‹ฌ (๊ด€๊ณ„: ์‹œ์Šคํ…œ ์‹ ๊ฒฝ๋ง) + +### Deeper Research Questions +1. React Compiler ์•ˆ์ •ํ™” ์ดํ›„, ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜(useMemo ๋“ฑ)์ด ์—ฌ์ „ํžˆ ํ•„์š”ํ•œ ์œ ์ผํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค๋Š” ๋ฌด์—‡์ธ๊ฐ€? +2. FSD ์•„ํ‚คํ…์ฒ˜์—์„œ 'Entities'์™€ 'Features' ๊ฐ„์˜ ์˜์กด์„ฑ ์—ญ์ „์„ ํ†ตํ•ด ๋„๋ฉ”์ธ ์ˆœ์ˆ˜์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๊ฐ€์žฅ ์šฐ์•„ํ•œ ๋ฐฉ๋ฒ•์€? +3. Context API์˜ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ 'Context Splitting' ํŒจํ„ด์˜ ํ•œ๊ณ„์™€ ๋Œ€์•ˆ์€? +4. Error Boundary๊ฐ€ ์žก์ง€ ๋ชปํ•˜๋Š” ๋น„๋™๊ธฐ ์—๋Ÿฌ๋ฅผ ์ „์—ญ ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ๊ณผ ํ†ตํ•ฉํ•˜๊ธฐ ์œ„ํ•œ ์ตœ์ ์˜ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„๋Š”? +5. Concurrent Mode์—์„œ `useTransition`๊ณผ `useDeferredValue`๊ฐ€ ์‹ค์ œ ์‚ฌ์šฉ์ž ์ฒด๊ฐ ์„ฑ๋Šฅ(INP)์— ๋ฏธ์น˜๋Š” ์ •๋Ÿ‰์  ์˜ํ–ฅ์€? + +### Practical Application Contexts +- **์‹ ๊ทœ ํ”„๋กœ์ ํŠธ ์„ค๊ณ„**: FSD ํด๋” ๊ตฌ์กฐ์™€ ์ƒํƒœ ๊ด€๋ฆฌ ์Šคํƒ(Zustand/Query) ์„ ์ •์„ ํ†ตํ•œ ์•ˆ์ •์  ๊ฐœ๋ฐœ ๊ธฐ๋ฐ˜ ๋งˆ๋ จ. +- **๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ ํ˜„๋Œ€ํ™”**: ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ›… ๊ธฐ๋ฐ˜์œผ๋กœ ์ „ํ™˜ํ•˜๊ณ  ๋ถˆํ•„์š”ํ•œ ์ดํŽ™ํŠธ๋ฅผ ์ œ๊ฑฐํ•˜์—ฌ ์„ฑ๋Šฅ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ ๊ฐ•ํ™”. + +### Adjacent Topics +- **Vite & Modern Build Tooling** +- **Design Systems & Storybook** +- **Server Components (RSC) & Streaming** diff --git a/10_Wiki/Topics/Frontend_Mastery/Scalable Frontend Architecture.md b/10_Wiki/Topics/Frontend_Mastery/Scalable Frontend Architecture.md new file mode 100644 index 00000000..8dfe7736 --- /dev/null +++ b/10_Wiki/Topics/Frontend_Mastery/Scalable Frontend Architecture.md @@ -0,0 +1,44 @@ +## ๐Ÿ“Œ Brief Summary +Scalable Frontend Architecture๋Š” ๋‹จ์ˆœํ•œ ์Šคํฌ๋ฆฝํŠธ ๋ชจ์Œ์„ ๋„˜์–ด ๊ณ ์„ฑ๋Šฅ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๊ฐ–์ถ˜ ์ •๊ตํ•œ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•˜๋Š” ์„ค๊ณ„ ๋ฐฉ์‹์ด๋‹ค. ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ UI์˜ ๋ถ„๋ฆฌ, ๋ช…ํ™•ํ•œ ์ƒํƒœ ์†Œ์œ ๊ถŒ, ๋ชจ๋“ˆ ๊ฐ„ ๋‚ฎ์€ ๊ฒฐํ•ฉ๋„๋ฅผ ํ†ตํ•ด ํŒ€์˜ ๊ทœ๋ชจ์™€ ์ œํ’ˆ์˜ ๊ธฐ๋Šฅ์ด ํ™•์žฅ๋˜์–ด๋„ ์•ˆ์ „ํ•˜๊ฒŒ ์„ฑ์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ฐ˜์„ ์ œ๊ณตํ•œ๋‹ค. + +## ๐Ÿ“– Core Content +1. **๊ธฐ๋Šฅ ์ค‘์‹ฌ ์กฐ์ง (Feature-Sliced Design)** + - ์•ฑ์„ `app`, `pages`, `widgets`, `features`, `entities`, `shared` ๊ณ„์ธต์œผ๋กœ ๋‚˜๋ˆ„์–ด ๋„๋ฉ”์ธ ๊ฒฝ๊ณ„๋ฅผ ๋ช…ํ™•ํžˆ ํ•œ๋‹ค. + - ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ๊ทœ์น™๊ณผ Public API(`index.ts`)๋ฅผ ํ†ตํ•ด ์บก์Аํ™”๋ฅผ ์‹คํ˜„ํ•˜๊ณ  ๋ชจ๋“ˆ ๊ฐ„ ๊ฐ„์„ญ์„ ์ฐจ๋‹จํ•œ๋‹ค. +2. **์†Œํ”„ํŠธ์›จ์–ด ์—”์ง€๋‹ˆ์–ด๋ง ์›์น™ ์ ์šฉ** + - **SOLID**: ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‹จ์ผ ์ฑ…์ž„(SRP)์œผ๋กœ ๋ถ„ํ•ดํ•˜๊ณ  ํ•ฉ์„ฑ(OCP)์„ ํ†ตํ•ด ํ™•์žฅํ•œ๋‹ค. + - **DRY & KISS**: ์ปค์Šคํ…€ ํ›…์œผ๋กœ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๋˜, ๊ณผ๋„ํ•œ ์ถ”์ƒํ™”๋กœ ์ธํ•œ ๋ณต์žก์„ฑ์€ ๊ฒฝ๊ณ„ํ•œ๋‹ค. +3. **๋ถ„์—…ํ™”๋œ ์ƒํƒœ ๊ด€๋ฆฌ ์•„ํ‚คํ…์ฒ˜** + - ๋ฐ์ดํ„ฐ ์„ฑ๊ฒฉ์— ๋”ฐ๋ผ ์ •์  ์ƒํƒœ(Context), ๋™์  ์ƒํƒœ(Zustand), ์„œ๋ฒ„ ์ƒํƒœ(TanStack Query)๋กœ ๋„๊ตฌ๋ฅผ ์„ธ๋ถ„ํ™”ํ•˜์—ฌ ๋ฆฌ๋ Œ๋”๋ง ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•œ๋‹ค. +4. **์„ฑ๋Šฅ ๋ฐ ๋ Œ๋”๋ง ๊ฑฐ๋ฒ„๋„Œ์Šค** + - Vite์˜ `manualChunks`๋ฅผ ํ†ตํ•œ ๋ฒˆ๋“ค ๋ถ„ํ• ๊ณผ `React.lazy`๋ฅผ ์ด์šฉํ•œ ๋ผ์šฐํŠธ ๋ ˆ๋ฒจ์˜ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…์„ ์ ์šฉํ•œ๋‹ค. + - React Compiler ๋˜๋Š” ์ˆ˜๋™ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ํ†ตํ•ด ๋ถˆํ•„์š”ํ•œ ์—ฐ์‚ฐ ๋น„์šฉ์„ ์ตœ์†Œํ™”ํ•œ๋‹ค. +5. **์žฅ์•  ๊ฒฉ๋ฆฌ ๋ฐ ๋ณต์›๋ ฅ (Resilience)** + - Error Boundaries๋ฅผ ์ „๋žต์ ์œผ๋กœ ๋ฐฐ์น˜ํ•˜์—ฌ ํŠน์ • ๋ชจ๋“ˆ์˜ ์˜ค๋ฅ˜๊ฐ€ ์ „์ฒด ์‹œ์Šคํ…œ ๋‹ค์šด์œผ๋กœ ์ด์–ด์ง€์ง€ ์•Š๋„๋ก ๋ฐฉ์–ดํ•œ๋‹ค. + +## โš–๏ธ Trade-offs & Caveats +- **์•„ํ‚คํ…์ฒ˜ ์˜ค๋ฒ„ํ—ค๋“œ**: FSD์™€ ๊ฐ™์€ ์—„๊ฒฉํ•œ ๋ ˆ์ด์–ด๋ง์€ ๊ฐ„๋‹จํ•œ ๊ธฐ๋Šฅ ์ถ”๊ฐ€์—๋„ ์—ฌ๋Ÿฌ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ฒŒ ๋งŒ๋“ค์–ด ์ดˆ๊ธฐ ๊ฐœ๋ฐœ ์†๋„๋ฅผ ๋Šฆ์ถœ ์ˆ˜ ์žˆ๋‹ค. +- **๋„์ž… ๋น„์šฉ ๋ฐ ํ•™์Šต ๊ณก์„ **: ํŒ€ ์ „์ฒด๊ฐ€ ์•„ํ‚คํ…์ฒ˜ ์›์น™์„ ์ดํ•ดํ•˜๊ณ  ์ค€์ˆ˜ํ•˜๊ธฐ๊นŒ์ง€ ์ƒ๋‹นํ•œ ์˜จ๋ณด๋”ฉ ์‹œ๊ฐ„๊ณผ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๋น„์šฉ์ด ์†Œ์š”๋œ๋‹ค. +- **์œ ์—ฐ์„ฑ ๊ฐ์†Œ**: ๋„ˆ๋ฌด ์—„๊ฒฉํ•œ ๊ทœ์น™์€ ๋•Œ๋กœ ๋น ๋ฅธ ์‹คํ—˜์ด ํ•„์š”ํ•œ ์Šคํƒ€ํŠธ์—… ํ™˜๊ฒฝ์—์„œ ๋ฏผ์ฒฉ์„ฑ์„ ์ €ํ•ดํ•˜๋Š” ์กฑ์‡„๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค. + +## ๐Ÿ”— Knowledge Connections +### Related Concepts +- **Feature-Sliced Design (FSD)**: ๊ตฌ์กฐ์  ์บก์Аํ™”์˜ ํ•ต์‹ฌ (๊ด€๊ณ„: ํ•ต์‹ฌ ๋ฐฉ๋ฒ•๋ก ) +- **SOLID Principles**: ๊ฒฌ๊ณ ํ•œ ์ปดํฌ๋„ŒํŠธ ์„ค๊ณ„์˜ ๊ทผ๊ฐ„ (๊ด€๊ณ„: ์„ค๊ณ„ ์ฒ ํ•™) +- **Error Boundaries**: ์‹œ์Šคํ…œ ๋ณต์›๋ ฅ ํ™•๋ณด (๊ด€๊ณ„: ๋ฐฉ์–ด์  ์„ค๊ณ„) + +### Deeper Research Questions +1. FSD ๊ณ„์ธต ๊ตฌ์กฐ์—์„œ 'Features'์™€ 'Widgets' ๊ฐ„์˜ ์ˆœํ™˜ ์ฐธ์กฐ๋ฅผ ๋ฐฉ์ง€ํ•˜๋ฉด์„œ ๋ณต์žกํ•œ UI๋ฅผ ์กฐํ•ฉํ•˜๋Š” ์ตœ์ ์˜ ํŒจํ„ด์€? +2. ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ์˜ ์„ ํƒ์ด ์‹ค์ œ ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ(TBT, INP)์— ๋ฏธ์น˜๋Š” ์ •๋Ÿ‰์  ์˜ํ–ฅ๊ณผ ์•„ํ‚คํ…์ฒ˜์  ๊ฐ€์น˜๋Š”? +3. React Compiler ๋„์ž…์ด ๊ธฐ์กด์˜ ์ˆ˜๋™ ์ตœ์ ํ™” ๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ ์›์น™์„ ์–ด๋–ป๊ฒŒ ๊ทผ๋ณธ์ ์œผ๋กœ ๋ณ€ํ™”์‹œํ‚ค๋Š”๊ฐ€? +4. ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ… ์ ์šฉ ์‹œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” 'Network Waterfall' ํ˜„์ƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๋ฆฌ์†Œ์Šค ํ”„๋ฆฌํŒจ์นญ ์ „๋žต์€? +5. ๋งˆ์ดํฌ๋กœ ํ”„๋ก ํŠธ์—”๋“œ ํ™˜๊ฒฝ์—์„œ ๊ฐ ํŒ€์ด ๋…๋ฆฝ์ ์ธ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ๋„ ์ „์—ญ์ ์ธ ์ผ๊ด€์„ฑ์„ ํ™•๋ณดํ•˜๋Š” ๋ฐฉ๋ฒ•์€? + +### Practical Application Contexts +- **์—”ํ„ฐํ”„๋ผ์ด์ฆˆ๊ธ‰ ์ œํ’ˆ ๊ฐœ๋ฐœ**: ์ˆ˜๋ฐฑ ๋ช…์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ˜‘์—…ํ•˜๋Š” ๋Œ€๊ทœ๋ชจ SaaS ํ”Œ๋žซํผ์˜ ์•ˆ์ •์  ๊ตฌ์กฐ ์„ค๊ณ„. +- **๋ชจ๋…ธ๋ ˆํฌ ํ™˜๊ฒฝ ๊ตฌ์ถ•**: ์—ฌ๋Ÿฌ ์„œ๋น„์Šค๊ฐ€ ๊ณตํ†ต ๋ชจ๋“ˆ์„ ๊ณต์œ ํ•˜๋ฉด์„œ๋„ ๋…๋ฆฝ์ ์œผ๋กœ ๋ฐฐํฌ๋˜๋Š” ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜ ์ˆ˜๋ฆฝ. + +### Adjacent Topics +- **Micro-Frontends Architecture** +- **React Server Components (RSC)** +- **CI/CD & Automated Governance** diff --git a/10_Wiki/Topics/Infrastructure & Automation/Git Branching Strategy.md b/10_Wiki/Topics/Infrastructure & Automation/Git Branching Strategy.md new file mode 100644 index 00000000..903817e7 --- /dev/null +++ b/10_Wiki/Topics/Infrastructure & Automation/Git Branching Strategy.md @@ -0,0 +1,43 @@ +## ๐Ÿ“Œ Brief Summary +Git Branching Strategy ๋ฐ ํ˜‘์—… ์›Œํฌํ”Œ๋กœ์šฐ๋Š” ๋‹ค์ˆ˜์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•˜๋‚˜์˜ ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ์•ˆ์ „ํ•˜๊ณ  ํšจ์œจ์ ์œผ๋กœ ํ˜‘์—…ํ•˜๊ธฐ ์œ„ํ•œ ์ฒด๊ณ„์ ์ธ ์•ฝ์†์ด๋‹ค. ๋ธŒ๋žœ์น˜ ๋ช…๋ช… ๊ทœ์น™, ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ํ‘œ์ค€ํ™”, Pull Request(PR) ๊ธฐ๋ฐ˜์˜ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ํ”„๋กœ์„ธ์Šค๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ์˜ ์•ˆ์ •์„ฑ์„ ์œ ์ง€ํ•˜๊ณ  ๋ณ€๊ฒฝ ์ด๋ ฅ์˜ ์ถ”์ ์„ฑ(Traceability)์„ ํ™•๋ณดํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•œ๋‹ค. + +## ๐Ÿ“– Core Content +1. **์ฃผ์š” ๋ธŒ๋žœ์นญ ์ „๋žต** + - **Feature-Branch Workflow**: ์งง์€ ์ˆ˜๋ช…์˜ ๋ธŒ๋žœ์น˜๋ฅผ ํ†ตํ•ด ๊ธฐ๋Šฅ์„ ๊ฒฉ๋ฆฌ ๊ฐœ๋ฐœํ•˜๊ณ  `main`์˜ ์•ˆ์ •์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ์†Œ๊ทœ๋ชจ ํŒ€ ์ตœ์ ํ™” ๋ฐฉ์‹. + - **Trunk-Based Development**: ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์— ๋งค์šฐ ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ณ‘ํ•ฉํ•˜์—ฌ ๋น ๋ฅธ ํ”ผ๋“œ๋ฐฑ์„ ์ถ”๊ตฌํ•˜๋Š” ๊ฒฝ๋Ÿ‰ํ™” ์ „๋žต. + - **GitHub Flow**: ์ง€์†์  ๋ฐฐํฌ์— ์ ํ•ฉํ•œ ๋‹จ์ˆœํ•œ ๊ตฌ์กฐ๋กœ `main` ๋ธŒ๋žœ์น˜๋Š” ํ•ญ์ƒ ๋ฐฐํฌ ๊ฐ€๋Šฅ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•œ๋‹ค. +2. **๋ธŒ๋žœ์น˜ ๋ฐ ์ปค๋ฐ‹ ๊ฑฐ๋ฒ„๋„Œ์Šค** + - **๋ช…๋ช… ๊ทœ์น™**: `{type}/{ticket-id}-{description}` ํ˜•์‹์„ ์ค€์ˆ˜ํ•˜์—ฌ ์ž‘์—…์˜ ์„ฑ๊ฒฉ๊ณผ ๋น„์ฆˆ๋‹ˆ์Šค ๋งฅ๋ฝ(ํ‹ฐ์ผ“ ID)์„ ์—ฐ๊ฒฐํ•œ๋‹ค. + - **Conventional Commits**: `feat:`, `fix:`, `refactor:` ๋“ฑ ํ‘œ์ค€ ์ ‘๋‘์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€๊ฒฝ์˜ ์˜๋„๋ฅผ ๋ช…ํ™•ํžˆ ํ•˜๊ณ  ๋ฆด๋ฆฌ์ฆˆ ๋…ธํŠธ๋ฅผ ์ž๋™ํ™”ํ•œ๋‹ค. + - **์›์ž์  ์ปค๋ฐ‹ (Atomic Commits)**: ํ•˜๋‚˜์˜ ์ปค๋ฐ‹์—๋Š” ํ•˜๋‚˜์˜ ๋…ผ๋ฆฌ์  ๋ณ€๊ฒฝ๋งŒ ๋‹ด์•„ ๋กค๋ฐฑ ๋ฐ ๋””๋ฒ„๊น…์„ ์šฉ์ดํ•˜๊ฒŒ ํ•œ๋‹ค. +3. **Pull Request(PR) ๋ฐ ์ฝ”๋“œ ๋ฆฌ๋ทฐ** + - ์ตœ์†Œ 1๋ช… ์ด์ƒ์˜ ์Šน์ธ์„ ๊ฑฐ์น˜๋Š” ๊ฒŒ์ดํŠธ์›จ์ด ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ตฌ์ถ•ํ•œ๋‹ค. + - **Squash Merge**: ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜์˜ ์ž์ž˜ํ•œ ์ด๋ ฅ์„ ์••์ถ•ํ•˜์—ฌ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์˜ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•œ๋‹ค. + - **CI ์—ฐ๋™**: PR ์ƒ์„ฑ ์‹œ ๋นŒ๋“œ ๋ฐ ํ…Œ์ŠคํŠธ ์ž๋™ ํ†ต๊ณผ๋ฅผ ํ•„์ˆ˜ ์กฐ๊ฑด์œผ๋กœ ์„ค์ •ํ•œ๋‹ค. + +## โš–๏ธ Trade-offs & Caveats +- **์†๋„ vs ์•ˆ์ •์„ฑ**: ์—„๊ฒฉํ•œ PR ๋ฆฌ๋ทฐ์™€ ๋ธŒ๋žœ์นญ ์ „๋žต์€ ์•ˆ์ •์„ฑ์„ ๋†’์ด์ง€๋งŒ, ๊ธด๊ธ‰ํ•œ ๋ฐฐํฌ๊ฐ€ ํ•„์š”ํ•œ ์ƒํ™ฉ์—์„œ๋Š” ๋ณ‘๋ชฉ ์ง€์ ์ด ๋  ์ˆ˜ ์žˆ๋‹ค. +- **์ˆ˜๋ช…์ด ๊ธด ๋ธŒ๋žœ์น˜์˜ ์œ„ํ—˜**: ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์™€ ์žฅ์‹œ๊ฐ„ ๋™๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ธŒ๋žœ์น˜๋Š” ๋ณ‘ํ•ฉ ์‹œ '๋จธ์ง€ ์ง€์˜ฅ(Merge Hell)'์„ ์œ ๋ฐœํ•˜๋ฏ€๋กœ ์žฆ์€ ๋ฆฌ๋ฒ ์ด์Šค์™€ ๋™๊ธฐํ™”๊ฐ€ ํ•„์ˆ˜์ ์ด๋‹ค. +- **์ปค๋ฐ‹ ์••์ถ•์˜ ์ •๋ณด ์†Œ์‹ค**: Squash Merge๋Š” ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๊นจ๋—ํ•˜๊ฒŒ ๋งŒ๋“ค์ง€๋งŒ, ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜ ๋‚ด๋ถ€์˜ ์„ธ๋ถ€์ ์ธ ๊ฒฐ์ • ๊ณผ์ •์„ ์ถ”์ ํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. + +## ๐Ÿ”— Knowledge Connections +### Related Concepts +- **Pull Request (PR)**: ์ฝ”๋“œ ํ’ˆ์งˆ์˜ ์ตœ์ข… ๊ด€๋ฌธ (๊ด€๊ณ„: ์‹ค์ฒœ ํ”„๋กœ์„ธ์Šค) +- **Conventional Commits**: ๋ณ€๊ฒฝ ์ด๋ ฅ์˜ ํ‘œ์ค€ํ™” (๊ด€๊ณ„: ์ปค๋ฐ‹ ๊ฐ€์ด๋“œ๋ผ์ธ) +- **Trunk-Based Development**: ๊ณ ์† ๋ฐ˜๋ณต ๊ฐœ๋ฐœ์„ ์œ„ํ•œ ์ „๋žต (๊ด€๊ณ„: ๋Œ€์•ˆ ๋ฐฉ๋ฒ•๋ก ) + +### Deeper Research Questions +1. ํ‹ฐ์ผ“ ID(Jira/GitHub)์™€ Git ์ปค๋ฐ‹์„ ์—ฐ๋™ํ•˜์—ฌ ๊ฐœ๋ฐœ ์ง„์ฒ™๋„๋ฅผ ์ž๋™์œผ๋กœ ๋Œ€์‹œ๋ณด๋“œํ™”ํ•˜๋Š” ์ตœ์ ์˜ CI ์„ค์ •์€? +2. 'Merge'์™€ 'Rebase' ์ค‘ ํŒ€์˜ ํžˆ์Šคํ† ๋ฆฌ ๊ด€๋ฆฌ ์ฒ ํ•™์— ๋”ฐ๋ผ ์–ด๋–ค ๊ฒƒ์„ ๊ธฐ๋ณธ ์ „๋žต์œผ๋กœ ์‚ผ์•„์•ผ ํ•˜๋Š”๊ฐ€? +3. ๋Œ€๊ทœ๋ชจ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด Feature Flag๋ฅผ ๋„์ž…ํ•˜์—ฌ ์ˆ˜๋ช…์ด ๊ธด ๋ธŒ๋žœ์น˜๋ฅผ Trunk-Based๋กœ ์ „ํ™˜ํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ์ ˆ์ฐจ๋Š”? +4. ์ฝ”๋“œ ๋ฆฌ๋ทฐ ์‹œ ๊ธฐ์ˆ ์  ๊ฒฐํ•จ ์™ธ์— ์•„ํ‚คํ…์ฒ˜์  ์ผ๊ด€์„ฑ์„ ๊ฒ€์ฆํ•˜๊ธฐ ์œ„ํ•œ '์ฒดํฌ๋ฆฌ์ŠคํŠธ'์˜ ๊ตฌ์„ฑ ์š”์†Œ๋Š” ๋ฌด์—‡์ธ๊ฐ€? +5. ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ๊ทœ์น™ ์ค€์ˆ˜๋ฅผ ๊ฐ•์ œํ•˜๊ธฐ ์œ„ํ•ด Git Hooks(Husky)์™€ commitlint๋ฅผ ์—ฐ๋™ํ•˜๋Š” ์ตœ์ ์˜ ํ™˜๊ฒฝ ๊ตฌ์„ฑ์€? + +### Practical Application Contexts +- **ํŒ€ ํ˜‘์—… ํ‘œ์ค€ํ™”**: 3์ธ ์ด์ƒ ํŒ€ ํ”„๋กœ์ ํŠธ ์‹œ์ž‘ ์‹œ ๋ธŒ๋žœ์นญ ์ „๋žต๊ณผ ์ปค๋ฐ‹ ์ปจ๋ฒค์…˜ ํ•ฉ์˜ ๋ฐ ๋ฌธ์„œํ™”. +- **์ด์Šˆ ์ถ”์ ์„ฑ ๊ฐ•ํ™”**: ์žฅ์•  ๋ฐœ์ƒ ์‹œ ํŠน์ • ํ‹ฐ์ผ“ ID์™€ ์—ฐ๊ด€๋œ ์ปค๋ฐ‹์„ ์—ญ์ถ”์ ํ•˜์—ฌ ๊ทผ๋ณธ ์›์ธ ์‹ ์† ํŒŒ์•…. + +### Adjacent Topics +- **CI/CD Pipeline Automation** +- **GitHub Actions / GitLab CI** +- **Semantic Versioning (SemVer)** diff --git a/10_Wiki/Topics/Programming & Tools/Debugging Methods.md b/10_Wiki/Topics/Programming & Tools/Debugging Methods.md new file mode 100644 index 00000000..cb65b167 --- /dev/null +++ b/10_Wiki/Topics/Programming & Tools/Debugging Methods.md @@ -0,0 +1,41 @@ +## ๐Ÿ“Œ Brief Summary +ํ˜„๋Œ€ ํ”„๋ก ํŠธ์—”๋“œ ๋””๋ฒ„๊น…์€ ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ ํฌ์ฐฉ, ์„ฑ๋Šฅ ๋ณ‘๋ชฉ ์ง„๋‹จ, ์ƒํƒœ ๋ถˆ์ผ์น˜ ํ•ด๊ฒฐ์„ ์•„์šฐ๋ฅด๋Š” ์ฒด๊ณ„์ ์ธ ๋ถ„์„ ๊ณผ์ •์ด๋‹ค. ๋ธŒ๋ผ์šฐ์ € ๊ฐœ๋ฐœ์ž ๋„๊ตฌ(Chrome DevTools)๋ฅผ ํ†ตํ•œ ๋กœ์ปฌ ๋ถ„์„๋ถ€ํ„ฐ Sentry, Datadog๊ณผ ๊ฐ™์€ ๊ด€์ธก์„ฑ(Observability) ํ”Œ๋žซํผ์„ ํ™œ์šฉํ•œ ํ”„๋กœ๋•์…˜ ๋ชจ๋‹ˆํ„ฐ๋ง๊นŒ์ง€ ํ†ตํ•ฉ์ ์ธ ์ ‘๊ทผ์„ ํ†ตํ•ด ์‹œ์Šคํ…œ์˜ ์‹ ๋ขฐ์„ฑ์„ ํ™•๋ณดํ•œ๋‹ค. + +## ๐Ÿ“– Core Content +1. **ํ”„๋กœ๋•์…˜ ๊ด€์ธก์„ฑ (Observability Platforms)** + - Sentry, LogRocket ๋“ฑ์„ ํ†ตํ•œ ์‹ค์‹œ๊ฐ„ ์—๋Ÿฌ ๊ทธ๋ฃนํ™” ๋ฐ ์‚ฌ์šฉ์ž ์—ฌ์ •(Breadcrumbs) ์ถ”์ . + - **์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด(Session Replay)**: ์—๋Ÿฌ ๋ฐœ์ƒ ์ „์˜ ์‚ฌ์šฉ์ž ์กฐ์ž‘๊ณผ ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ์žฌํ˜„ํ•˜์—ฌ ์žฌํ˜„ ๋ถˆ๊ฐ€๋Šฅํ•œ ๋ฒ„๊ทธ ์ฐจ๋‹จ. + - **๋ถ„์‚ฐ ํŠธ๋ ˆ์ด์‹ฑ**: ํ”„๋ก ํŠธ์—”๋“œ ์—๋Ÿฌ์™€ ๋ฐฑ์—”๋“œ ํŠธ๋ ˆ์ด์Šค ID๋ฅผ ์—ฐ๊ฒฐํ•˜์—ฌ ์—”๋“œ-ํˆฌ-์—”๋“œ ๋ฌธ์ œ ์ง„๋‹จ. +2. **๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ์ง„๋‹จ (Memory Profiling)** + - Chrome DevTools์˜ **Heap Snapshots**์„ ๋น„๊ตํ•˜์—ฌ ๋ถ„๋ฆฌ๋œ DOM ๋…ธ๋“œ(Detached DOM nodes)์™€ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜(GC)๋˜์ง€ ์•Š๋Š” ๊ฐ์ฒด ์‹๋ณ„. + - **Allocation Timelines**: ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ์‹œ์ ๊ณผ ๋ฆฌํ…Œ์ด๋„ˆ ๊ฒฝ๋กœ(Retainer paths)๋ฅผ ๋ถ„์„ํ•˜์—ฌ ๊ฐ์ฒด ๋ณด์กด ์›์ธ ํŒŒ์•…. +3. **์ƒํƒœ ๋ฐ ๋ Œ๋”๋ง ๋””๋ฒ„๊น…** + - **Time-travel Debugging**: Redux DevTools ๋“ฑ์„ ํ†ตํ•ด ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ๊ธฐ๋กํ•˜๊ณ  ํŠน์ • ์‹œ์ ์œผ๋กœ ์•ก์…˜์„ ์žฌ์ƒํ•˜์—ฌ ๋น„๋™๊ธฐ ๋ฒ„๊ทธ ์ถ”์ . + - **Error Boundaries**: React์˜ ๋ Œ๋”๋ง ์—๋Ÿฌ๋ฅผ ์„ ์–ธ์ ์œผ๋กœ ํฌ์ฐฉํ•˜์—ฌ ์ „์ฒด ์•ฑ ํฌ๋ž˜์‹œ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ  ์—๋Ÿฌ ์Šคํƒ ์ •๋ณด๋ฅผ ํ™•๋ณด. + +## โš–๏ธ Trade-offs & Caveats +- **๋กœ๊น… ์˜ค๋ฒ„ํ—ค๋“œ**: ๊ณผ๋„ํ•œ ๋กœ๊น… ๋ฐ ๊ด€์ธก์„ฑ ๋„๊ตฌ ๋„์ž…์€ ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ ์ฆ๊ฐ€์™€ ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ƒ˜ํ”Œ๋ง ์ „๋žต์ด ํ•„์š”ํ•˜๋‹ค. +- **๋ฐ์ดํ„ฐ ํ”„๋ผ์ด๋ฒ„์‹œ**: ์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด ๋ฐ ํด๋ผ์šฐ๋“œ ๋กœ๊น… ์‹œ ์‚ฌ์šฉ์ž ๋ฏผ๊ฐ ์ •๋ณด(๋น„๋ฐ€๋ฒˆํ˜ธ, PII)๊ฐ€ ๋…ธ์ถœ๋˜์ง€ ์•Š๋„๋ก ์—„๊ฒฉํ•œ ๋งˆ์Šคํ‚น ์ฒ˜๋ฆฌ๊ฐ€ ์„ ํ–‰๋˜์–ด์•ผ ํ•œ๋‹ค. +- **๋””๋ฒ„๊น… ๋„๊ตฌ์˜ ์ œ์•ฝ**: React Context ๋“ฑ ํŠน์ • ์ƒํƒœ ๊ด€๋ฆฌ ๋ชจ๋ธ์€ ์ „์šฉ ๋””๋ฒ„๊น… ํˆด์˜ ๋ถ€์žฌ๋กœ ์ธํ•ด ๋ฌธ์ œ ์ถ”์ ์ด ์ƒ๋Œ€์ ์œผ๋กœ ์–ด๋ ต๋‹ค. + +## ๐Ÿ”— Knowledge Connections +### Related Concepts +- **Heap Snapshots**: ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ์˜ ์ •์  ๋ถ„์„ ๋„๊ตฌ (๊ด€๊ณ„: ๋ฉ”๋ชจ๋ฆฌ ์ง„๋‹จ ํ•ต์‹ฌ) +- **Error Boundaries**: ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ ์ „ํŒŒ๋ฅผ ์ฐจ๋‹จํ•˜๋Š” ์„ ์–ธ์  ๊ฒฉ๋ฆฌ ์žฅ์น˜ (๊ด€๊ณ„: ์•ˆ์ •์„ฑ ํ™•๋ณด) +- **Time-Travel Debugging**: ์ƒํƒœ ๋ถˆ์ผ์น˜ ์›์ธ์„ ๊ทœ๋ช…ํ•˜๋Š” ์‹œ๊ณ„์—ด ๋ถ„์„ ๊ธฐ๋ฒ• (๊ด€๊ณ„: ๋น„๋™๊ธฐ ๋กœ์ง ๊ฒ€์ฆ) + +### Deeper Research Questions +1. OpenTelemetry๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ๋ฐฑ์—”๋“œ ๊ฐ„์˜ ํŠธ๋ ˆ์ด์Šค ์ปจํ…์ŠคํŠธ๋ฅผ ์–ด๋–ป๊ฒŒ ์•ˆ์ „ํ•˜๊ฒŒ ์ „ํŒŒํ•˜๋Š”๊ฐ€? +2. Heap Snapshot ๋ถ„์„ ์‹œ 'Shallow Size'์™€ 'Retained Size'์˜ ์ฐจ์ด๊ฐ€ ์˜๋ฏธํ•˜๋Š” ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์˜ ์‹ค์ œ ์ž‘๋™ ์›๋ฆฌ๋Š”? +3. ์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด ๋„๊ตฌ๊ฐ€ ์บ”๋ฒ„์Šค(Canvas)๋‚˜ WebGL ๊ธฐ๋ฐ˜ ๋ Œ๋”๋ง์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ์–ด๋–ป๊ฒŒ ๊ธฐ๋กํ•˜๊ณ  ์žฌํ˜„ํ•˜๋Š”๊ฐ€? +4. ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ์†Œ์Šค ๋งต(Source Map) ๋…ธ์ถœ ์—†์ด ์—๋Ÿฌ ์Šคํƒ์„ ์ •ํ™•ํžˆ ๋ณต๊ตฌํ•˜๋Š” ๋ณด์•ˆ ๊ฐ€์ด๋“œ๋ผ์ธ์€? +5. ๋ฉ”๋ชจ๋ฆฌ ๋ฆฌํ…Œ์ด๋„ˆ ๊ฒฝ๋กœ ๋ถ„์„์„ ํ†ตํ•ด ๋ฐœ๊ฒฌ๋œ 'ํด๋กœ์ €(Closure)์— ์˜ํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜'๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ์ฝ”๋“œ ํŒจํ„ด์€? + +### Practical Application Contexts +- **์ด์Šˆ ์žฌํ˜„์„ฑ ํ™•๋ณด**: ๊ณ ๊ฐ์‚ฌ์—์„œ ๋ณด๊ณ ๋œ ๋ถˆ๋ถ„๋ช…ํ•œ ์˜ค๋ฅ˜๋ฅผ LogRocket ๋ฆฌํ”Œ๋ ˆ์ด๋กœ ํ™•์ธํ•˜์—ฌ ์žฌํ˜„ ๋‹จ๊ณ„ ์ƒ๋žต. +- **์„ฑ๋Šฅ ํŠœ๋‹**: ์žฅ์‹œ๊ฐ„ ์‹คํ–‰๋˜๋Š” ๋Œ€์‹œ๋ณด๋“œ ์•ฑ์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ Allocation Timeline์œผ๋กœ ์ถ”์ ํ•˜์—ฌ ์ˆ˜์ •. + +### Adjacent Topics +- **Performance Profiling (Lighthouse / Core Web Vitals)** +- **Static Application Security Testing (SAST)** +- **Unit & Integration Testing Strategies** diff --git a/10_Wiki/Topics/Programming & Tools/Naming Conventions.md b/10_Wiki/Topics/Programming & Tools/Naming Conventions.md new file mode 100644 index 00000000..cd983d57 --- /dev/null +++ b/10_Wiki/Topics/Programming & Tools/Naming Conventions.md @@ -0,0 +1,46 @@ +## ๐Ÿ“Œ Brief Summary +Naming Conventions(๋ช…๋ช… ๊ทœ์น™)์€ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ, ์œ ์ง€๋ณด์ˆ˜์„ฑ, ๊ทธ๋ฆฌ๊ณ  ํ˜‘์—… ํšจ์œจ์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ํŒŒ์ผ, ์ปดํฌ๋„ŒํŠธ, ๋ณ€์ˆ˜ ๋“ฑ์˜ ์ด๋ฆ„์„ ์ง“๋Š” ํ•ฉ์˜๋œ ํ‘œ์ค€์ด๋‹ค. ๋ช…ํ™•ํ•œ ๊ทœ์น™์„ ํ†ตํ•ด ์ฝ”๋“œ์˜ ์—ญํ• ์„ ์ง๊ด€์ ์œผ๋กœ ํŒŒ์•…ํ•˜๊ฒŒ ํ•˜๋ฉฐ, ํŠนํžˆ ์šด์˜์ฒด์ œ ๊ฐ„์˜ ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„ ์ฐจ์ด๋กœ ์ธํ•œ ๋นŒ๋“œ ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ์‹ค์งˆ์ ์ธ ์—”์ง€๋‹ˆ์–ด๋ง ๋ชฉ์ ์„ ๊ฐ–๋Š”๋‹ค. + +## ๐Ÿ“– Core Content +1. **ํŒŒ์ผ ๋ฐ ํด๋” (kebab-case)** + - ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„์ด ์—†๋Š” OS(Windows, macOS)์™€ ์—„๊ฒฉํ•œ OS(Linux) ๊ฐ„์˜ CI/CD ๋นŒ๋“œ ์ถฉ๋Œ์„ ๋ง‰๊ธฐ ์œ„ํ•ด ์†Œ๋ฌธ์ž์™€ ํ•˜์ดํ”ˆ์„ ์‚ฌ์šฉํ•˜๋Š” `kebab-case`๋ฅผ ๊ถŒ์žฅํ•œ๋‹ค. + - Next.js์˜ ์˜ˆ์•ฝ์–ด(`page.js`, `layout.js`)๋‚˜ ๋ผ์šฐํŠธ ๊ทธ๋ฃน(`(folder)`) ๋“ฑ์˜ ๊ทœ์น™์„ ์ค€์ˆ˜ํ•œ๋‹ค. +2. **React ์ปดํฌ๋„ŒํŠธ ๋ฐ ํƒ€์ž… (PascalCase)** + - ์ปดํฌ๋„ŒํŠธ๋ช…๊ณผ TypeScript์˜ Type/Interface, Enum ๋“ฑ์€ ์ฒซ ๊ธ€์ž๋ฅผ ๋Œ€๋ฌธ์ž๋กœ ํ•˜๋Š” `PascalCase`๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ผ๋ฐ˜ ๋ณ€์ˆ˜์™€ ๊ตฌ๋ณ„ํ•œ๋‹ค. +3. **๋ณ€์ˆ˜, ํ•จ์ˆ˜, ํ”„๋กœํผํ‹ฐ (camelCase)** + - JavaScript ํ‘œ์ค€์— ๋”ฐ๋ผ ์ฒซ ๋‹จ์–ด๋Š” ์†Œ๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•˜๋Š” `camelCase`๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. + - Boolean ๊ฐ’์€ `is`, `has`, `should` ์ ‘๋‘์‚ฌ๋ฅผ, ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋Š” `handle`, `on` ์ ‘๋‘์‚ฌ๋ฅผ ๋ถ™์—ฌ ์˜๋ฏธ๋ฅผ ๋ช…ํ™•ํžˆ ํ•œ๋‹ค. +4. **์ปค์Šคํ…€ ํ›… (use ์ ‘๋‘์‚ฌ)** + - React์˜ Rules of Hooks๋ฅผ ์ค€์ˆ˜ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ˜๋“œ์‹œ `use` ์ ‘๋‘์‚ฌ๋กœ ์‹œ์ž‘ํ•˜๋Š” `camelCase`๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. +5. **์ƒ์ˆ˜ (UPPER_SNAKE_CASE)** + - ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ๊ณ ์ • ๊ฐ’์€ ๋Œ€๋ฌธ์ž์™€ ๋ฐ‘์ค„์„ ์‚ฌ์šฉํ•˜๋Š” `UPPER_SNAKE_CASE`๋กœ ์ž‘์„ฑํ•˜์—ฌ ์‹๋ณ„๋ ฅ์„ ๋†’์ธ๋‹ค. +6. **Git ๋ฐ ์›Œํฌํ”Œ๋กœ์šฐ** + - ๋ธŒ๋žœ์น˜๋ช…: `{type}/{ticket-id}-{description}` ํ˜•์‹์˜ ์†Œ๋ฌธ์ž kebab-case ์‚ฌ์šฉ. + - ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€: Conventional Commits(`feat:`, `fix:` ๋“ฑ) ํ˜•์‹์„ ์ค€์ˆ˜ํ•˜์—ฌ ์ถ”์ ์„ฑ์„ ํ™•๋ณดํ•œ๋‹ค. + +## โš–๏ธ Trade-offs & Caveats +- **์—„๊ฒฉํ•จ vs ์œ ์—ฐ์„ฑ**: ๋„ˆ๋ฌด ๋ณต์žกํ•œ ๋„ค์ด๋ฐ ๊ทœ์น™์€ ๊ฐœ๋ฐœ์ž์˜ ์ธ์ง€ ๋ถ€ํ•˜๋ฅผ ๋Š˜๋ฆฌ๊ณ  ์ƒ์‚ฐ์„ฑ์„ ์ €ํ•˜์‹œํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ํŒ€ ๊ทœ๋ชจ์— ๋งž๋Š” ์ ์ ˆํ•œ ์ˆ˜์ค€์˜ ํ•ฉ์˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค. +- **์ž๋™ํ™” ๋„๊ตฌ์˜ ํ•œ๊ณ„**: ESLint ๋“ฑ์œผ๋กœ ๋งŽ์€ ๋„ค์ด๋ฐ ๊ทœ์น™์„ ๊ฐ•์ œํ•  ์ˆ˜ ์žˆ์œผ๋‚˜, '์˜๋ฏธ๋ก ์ (Semantic) ์ ์ ˆ์„ฑ'๊นŒ์ง€๋Š” ๋„๊ตฌ๊ฐ€ ํŒ๋‹จํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์—ฌ์ „ํžˆ ์ฝ”๋“œ ๋ฆฌ๋ทฐ๊ฐ€ ์ค‘์š”ํ•˜๋‹ค. +- **ํ”„๋ ˆ์ž„์›Œํฌ ์ œ์•ฝ**: ์‚ฌ์šฉ ์ค‘์ธ ํ”„๋ ˆ์ž„์›Œํฌ(์˜ˆ: Next.js)์˜ ์˜ˆ์•ฝ์–ด ๊ทœ์น™์ด ํŒ€์˜ ์ปจ๋ฒค์…˜๊ณผ ์ถฉ๋Œํ•  ๊ฒฝ์šฐ, ํ”„๋ ˆ์ž„์›Œํฌ์˜ ๊ทœ์น™์„ ์šฐ์„ ์‹œํ•ด์•ผ ์‹œ์Šคํ…œ ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค. + +## ๐Ÿ”— Knowledge Connections +### Related Concepts +- **kebab-case**: ํŒŒ์ผ ์‹œ์Šคํ…œ ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•œ ์†Œ๋ฌธ์ž-ํ•˜์ดํ”ˆ ์กฐํ•ฉ (๊ด€๊ณ„: ๋ฌผ๋ฆฌ์  ์ €์žฅ ํ‘œ์ค€) +- **Conventional Commits**: ๋ณ€๊ฒฝ ์ด๋ ฅ ๊ฐ€๋…์„ฑ์„ ์œ„ํ•œ ํ‘œ์ค€ (๊ด€๊ณ„: ํ˜‘์—… ์›Œํฌํ”Œ๋กœ์šฐ ๊ทœ์น™) +- **PascalCase**: ์ปดํฌ๋„ŒํŠธ ๋ฐ ํƒ€์ž… ์‹๋ณ„์„ ์œ„ํ•œ ๋Œ€๋ฌธ์ž ์‹œ์ž‘ ์กฐํ•ฉ (๊ด€๊ณ„: ๋…ผ๋ฆฌ์  ์‹๋ณ„ ํ‘œ์ค€) + +### Deeper Research Questions +1. OS๋ณ„ ๋Œ€์†Œ๋ฌธ์ž ์ธ์‹ ์ฐจ์ด๊ฐ€ ์‹ค์ œ ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ ํ™˜๊ฒฝ์—์„œ ์œ ๋ฐœํ•˜๋Š” 'Silent failure' ์‚ฌ๋ก€์™€ ๊ทธ ๋””๋ฒ„๊น… ๋ฐฉ๋ฒ•์€? +2. ๋„ค์ด๋ฐ ๊ทœ์น™ ์ค€์ˆ˜๊ฐ€ TypeScript์˜ ํƒ€์ž… ์ถ”๋ก  ์„ฑ๋Šฅ์ด๋‚˜ ํŠธ๋ฆฌ ์‰์ดํ‚น(Tree Shaking) ํšจ์œจ์— ๊ฐ„์ ‘์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”๊ฐ€? +3. ๋Œ€๊ทœ๋ชจ ๋ฆฌํŒฉํ† ๋ง ์‹œ, ๊ธฐ์กด์˜ ๋„ค์ด๋ฐ ์ปจ๋ฒค์…˜์„ ์ผ๊ด„ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•œ AST(Abstract Syntax Tree) ๊ธฐ๋ฐ˜ ์ž๋™ํ™” ๋„๊ตฌ ํ™œ์šฉ ๋ฐฉ์•ˆ์€? +4. `isVisible` vs `showComponent`์™€ ๊ฐ™์ด ์ƒํƒœ ์ค‘์‹ฌ ๋„ค์ด๋ฐ๊ณผ ๋ช…๋ น ์ค‘์‹ฌ ๋„ค์ด๋ฐ ์ค‘ ์–ด๋–ค ๊ฒƒ์ด ์œ ์ง€๋ณด์ˆ˜์— ๋” ์œ ๋ฆฌํ•œ๊ฐ€? +5. ๋‹ค๊ตญ์–ด ์ง€์›(i18n) ํ”„๋กœ์ ํŠธ์—์„œ ํ‚ค๊ฐ’(Key) ๋„ค์ด๋ฐ์„ ๋„๋ฉ”์ธ ์ค‘์‹ฌ์œผ๋กœ ์ง“๋Š” ๊ฒƒ๊ณผ ํŽ˜์ด์ง€ ์ค‘์‹ฌ์œผ๋กœ ์ง“๋Š” ๊ฒƒ์˜ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๋Š”? + +### Practical Application Contexts +- **ํ˜‘์—… ํ™˜๊ฒฝ ๊ตฌ์ถ•**: ESLint ๋ฐ Prettier ์„ค์ •์„ ํ†ตํ•ด ํŒ€์› ์ „์ฒด๊ฐ€ ๋™์ผํ•œ ๋„ค์ด๋ฐ ์ผ€์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์ž๋™ ๊ฐ•์ œ. +- **์ด์Šˆ ์ถ”์ **: ๋ธŒ๋žœ์น˜๋ช…์— ํ‹ฐ์ผ“ ID๋ฅผ ํฌํ•จํ•˜์—ฌ Jira/GitHub Issues์™€ ์ฝ”๋“œ๋ฅผ ์œ ๊ธฐ์ ์œผ๋กœ ์—ฐ๊ฒฐ. + +### Adjacent Topics +- **Clean Code & Meaningful Names** +- **Feature-Sliced Design (FSD)** +- **Git Branching Strategies** diff --git a/10_Wiki/Topics/Programming & Tools/Refactoring Techniques.md b/10_Wiki/Topics/Programming & Tools/Refactoring Techniques.md new file mode 100644 index 00000000..fd2c4711 --- /dev/null +++ b/10_Wiki/Topics/Programming & Tools/Refactoring Techniques.md @@ -0,0 +1,41 @@ +## ๐Ÿ“Œ Brief Summary +๋ฆฌํŒฉํ† ๋ง(Refactoring)์€ ์†Œํ”„ํŠธ์›จ์–ด์˜ ์™ธ๋ถ€ ๋™์ž‘์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋ฉด์„œ ๋‚ด๋ถ€ ๊ตฌ์กฐ, ๊ฐ€๋…์„ฑ, ๋ชจ๋“ˆ์„ฑ์„ ๊ฐœ์„ ํ•˜๋Š” ์ •๊ตํ•œ ๊ณตํ•™์  ์ž‘์—…์ด๋‹ค. React ํ™˜๊ฒฝ์—์„œ๋Š” ๋น„๋Œ€ํ•œ ์ปดํฌ๋„ŒํŠธ ๋ถ„ํ• , ์ปค์Šคํ…€ ํ›…์„ ํ†ตํ•œ ๋กœ์ง ์ถ”์ถœ, ๊ทธ๋ฆฌ๊ณ  ๊ธฐ์ˆ  ๋ถ€์ฑ„ ์ƒํ™˜์„ ์œ„ํ•œ ์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ํ†ตํ•ด ์‹œ์Šคํ…œ์˜ ํ™•์žฅ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•œ๋‹ค. + +## ๐Ÿ“– Core Content +1. **์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ (Refactor, Do Not Rewrite)** + - ์ „์ฒด ์‹œ์Šคํ…œ์„ ํ•œ ๋ฒˆ์— ์žฌ์ž‘์„ฑํ•˜๋Š” ์œ„ํ—˜์„ ํ”ผํ•˜๊ณ , ๊ธฐ๋Šฅ ๋‹จ์œ„๋‚˜ ๋„๋ฉ”์ธ ๋‹จ์œ„๋กœ ํ•˜๋‚˜์”ฉ ์ƒˆ๋กœ์šด ์•„ํ‚คํ…์ฒ˜๋กœ ์˜ฎ๊ธด๋‹ค. +2. **์ปค์Šคํ…€ ํ›…์„ ํ†ตํ•œ ๋กœ์ง ์ถ”์ถœ** + - ๋น„๋Œ€ํ•œ ์ปดํฌ๋„ŒํŠธ ๋‚ด์˜ ๋ฐ์ดํ„ฐ ํŒจ์นญ, ํผ ์ฒ˜๋ฆฌ, ๋ณต์žกํ•œ ๊ณ„์‚ฐ ๋กœ์ง์„ ์ปค์Šคํ…€ ํ›…์œผ๋กœ ์ถ”์ถœํ•˜์—ฌ UI์™€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋ถ„๋ฆฌํ•œ๋‹ค. + - ์ด๋ฅผ ํ†ตํ•ด ๋…๋ฆฝ์ ์ด๊ณ  ๋น ๋ฅธ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ(Unit Testing) ํ™˜๊ฒฝ์„ ํ™•๋ณดํ•œ๋‹ค. +3. **์•ˆ์ „๋ง์œผ๋กœ์„œ์˜ ํ…Œ์ŠคํŠธ ๊ตฌ์ถ•** + - ๋ฆฌํŒฉํ† ๋ง ์ „ ๊ธฐ์กด ๊ธฐ๋Šฅ์˜ ๋™์ž‘์„ ๋ณด์žฅํ•˜๋Š” ํ…Œ์ŠคํŠธ ์ˆ˜ํŠธ๋ฅผ ๋จผ์ € ์ž‘์„ฑํ•˜์—ฌ, ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•œ ๊ธฐ๋Šฅ ํŒŒ์†์„ ์ฆ‰๊ฐ ํƒ์ง€ํ•œ๋‹ค. +4. **๊ตฌ์กฐ์  ํ‘œ์ค€ํ™” ๋ฐ ๊ฑฐ๋ฒ„๋„Œ์Šค** + - ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ•จ์ˆ˜ํ˜•์œผ๋กœ ์ „ํ™˜ํ•˜๊ณ , TypeScript๋ฅผ ๋„์ž…ํ•˜์—ฌ ์ •์  ์•ˆ์ •์„ฑ์„ ๊ฐ•ํ™”ํ•œ๋‹ค. + - ESLint ๋ฐ Prettier ๋“ฑ ์ž๋™ํ™” ๋„๊ตฌ๋ฅผ ํ†ตํ•ด ํŒ€์˜ ์ฝ”๋“œ ์ปจ๋ฒค์…˜๊ณผ ์•„ํ‚คํ…์ฒ˜ ๊ทœ์น™์„ ๊ฐ•์ œํ•œ๋‹ค. + +## โš–๏ธ Trade-offs & Caveats +- **๋‹จ๊ธฐ ์ƒ์‚ฐ์„ฑ ์ €ํ•˜**: ๋ฆฌํŒฉํ† ๋ง์€ ๋‹น์žฅ์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๊ธฐ๋Šฅ ์ถ”๊ฐ€๋ณด๋‹ค ๋งŽ์€ ์‹œ๊ฐ„์„ ์†Œ์š”ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์ ์ ˆํ•œ ์ผ์ • ์กฐ์œจ๊ณผ ๊ฒฝ์˜์ง„์˜ ํ•ฉ์˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค. +- **๊ณผ๋„ํ•œ ์ถ”์ƒํ™”์˜ ์œ„ํ—˜**: ๋ฆฌํŒฉํ† ๋ง ๊ณผ์ •์—์„œ DRY ์›์น™์—๋งŒ ์ง‘์ฐฉํ•˜์—ฌ ๋งŒ๋“  ์ง€๋‚˜์น˜๊ฒŒ ๋ณต์žกํ•œ ์ถ”์ƒํ™”๋Š” ์˜คํžˆ๋ ค ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์„ ํ•ด์น  ์ˆ˜ ์žˆ๋‹ค(KISS ์›์น™๊ณผ์˜ ์ถฉ๋Œ). +- **๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ค‘๋‹จ์˜ ์œ„ํ—˜**: ๋ถ€๋ถ„์ ์ธ ๋ฆฌํŒฉํ† ๋ง์ด ์™„๋ฃŒ๋˜์ง€ ์•Š๊ณ  ์ค‘๋‹จ๋  ๊ฒฝ์šฐ, ์‹œ์Šคํ…œ ๋‚ด์— ๋‘ ๊ฐ€์ง€ ์ด์ƒ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ํŒจํ„ด์ด ํ˜ผ์žฌ๋˜์–ด ์œ ์ง€๋ณด์ˆ˜ ๋‚œ์ด๋„๊ฐ€ ์ƒ์Šนํ•  ์ˆ˜ ์žˆ๋‹ค. + +## ๐Ÿ”— Knowledge Connections +### Related Concepts +- **Custom Hooks**: ๋กœ์ง ๋ถ„๋ฆฌ์˜ ๋ฌผ๋ฆฌ์  ๋‹จ์œ„ (๊ด€๊ณ„: ์‹ค์ฒœ ๋„๊ตฌ) +- **Incremental Migration**: ์•ˆ์ „ํ•œ ์•„ํ‚คํ…์ฒ˜ ์ „ํ™˜ ์ „๋žต (๊ด€๊ณ„: ํ•ต์‹ฌ ๋ฐฉ๋ฒ•๋ก ) +- **Unit Testing**: ๋ฆฌํŒฉํ† ๋ง์˜ ์•ˆ์ „์„ ๋ณด์žฅํ•˜๋Š” ์žฅ์น˜ (๊ด€๊ณ„: ํ•„์ˆ˜ ์„ ํ–‰ ์กฐ๊ฑด) + +### Deeper Research Questions +1. ๋ฆฌํŒฉํ† ๋ง ๊ณผ์ •์—์„œ ๊ธฐ์กด์˜ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ(E2E)๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ ๋‚ด๋ถ€ ๋กœ์ง์„ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋กœ ๋ถ„๋ฆฌํ•ด ๋‚˜๊ฐ€๋Š” ์ตœ์ ์˜ ํ”„๋กœ์„ธ์Šค๋Š”? +2. 300์ค„ ์ด์ƒ์˜ ๊ฑฐ๋Œ€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ถ„ํ• ํ•  ๋•Œ, ์ƒํƒœ(State) ์ „๋‹ฌ์„ ์œ„ํ•ด Prop Drilling์„ ๊ฐ์ˆ˜ํ•  ๊ฒƒ์ธ๊ฐ€, ์•„๋‹ˆ๋ฉด ์ „์—ญ ์ƒํƒœ๋กœ ์Šน๊ฒฉํ•  ๊ฒƒ์ธ๊ฐ€์— ๋Œ€ํ•œ ํŒ๋‹จ ๊ธฐ์ค€์€? +3. ๋ฆฌํŒฉํ† ๋ง ์ค‘ ๋ฐœ๊ฒฌ๋œ ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ์˜ '์ž ์žฌ์  ๋ฒ„๊ทธ'๋ฅผ ์ฆ‰์‹œ ์ˆ˜์ •ํ•  ๊ฒƒ์ธ๊ฐ€, ์•„๋‹ˆ๋ฉด ๋ฆฌํŒฉํ† ๋ง ์™„๋ฃŒ ํ›„ ๋ณ„๋„ ์ž‘์—…์œผ๋กœ ์ฒ˜๋ฆฌํ•  ๊ฒƒ์ธ๊ฐ€? +4. ์•„ํ‚คํ…์ฒ˜ ์บก์Аํ™”(FSD ๋“ฑ)๊ฐ€ ๋ฆฌํŒฉํ† ๋ง ์‹œ ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ๋ฅผ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ์ฐจ๋‹จํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ๋ฉ”์ปค๋‹ˆ์ฆ˜์€? +5. ์„ฑ๋Šฅ ๋ฆฌํŒฉํ† ๋ง ์‹œ, ๊ฐ€๋…์„ฑ ์ข‹์€ ์ฝ”๋“œ์™€ ๊ณ ์„ฑ๋Šฅ(๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๋‚จ๋ฐœ ๋“ฑ) ์ฝ”๋“œ ์‚ฌ์ด์˜ ์ ์ ˆํ•œ ํƒ€ํ˜‘์ ์€ ์–ด๋””์ธ๊ฐ€? + +### Practical Application Contexts +- **๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ ํ˜„๋Œ€ํ™”**: ์˜ค๋ž˜๋œ React ํ”„๋กœ์ ํŠธ์˜ ๊ธฐ์ˆ  ์Šคํƒ(Redux -> Zustand ๋“ฑ) ๋ฐ ์ปดํฌ๋„ŒํŠธ ์Šคํƒ€์ผ ๊ฐœ์„ . +- **์ง€์†์  ํ’ˆ์งˆ ๊ด€๋ฆฌ**: ๊ธฐ๋Šฅ ์ถ”๊ฐ€ ์ „ํ›„๋กœ ๊ด€๋ จ ๋ชจ๋“ˆ์„ SRP ์›์น™์— ๋งž๊ฒŒ ์ •๋ˆํ•˜์—ฌ ๊ธฐ์ˆ  ๋ถ€์ฑ„ ๋ˆ„์  ๋ฐฉ์ง€. + +### Adjacent Topics +- **Software Engineering Principles (SOLID)** +- **Technical Debt Management** +- **Automated Governance & Linting** diff --git a/10_Wiki/Topics/Programming & Tools/Refactoring.md b/10_Wiki/Topics/Programming & Tools/Refactoring.md new file mode 100644 index 00000000..5ea5f35e --- /dev/null +++ b/10_Wiki/Topics/Programming & Tools/Refactoring.md @@ -0,0 +1,45 @@ +## ๐Ÿ“Œ Brief Summary +๋ฆฌํŒฉํ† ๋ง(Refactoring)์€ ์†Œํ”„ํŠธ์›จ์–ด์˜ ์™ธ๋ถ€ ๋™์ž‘์„ ์œ ์ง€ํ•˜๋ฉด์„œ ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ๊ฐœ์„ ํ•˜์—ฌ ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ๊ฑด๊ฐ•ํ•จ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ํ™•๋ณดํ•˜๋Š” ์ „๋ฌธ์ ์ธ ๊ฐœ๋ฐœ ๊ณผ์ •์ด๋‹ค. ๋‚ก์€ ํŒจ๋Ÿฌ๋‹ค์ž„์„ ํ˜„๋Œ€ํ™”ํ•˜๊ณ  ์ฑ…์ž„์„ ๋ถ„๋ฆฌํ•˜๋ฉฐ, ๊ฐ•๋ ฅํ•œ ํ…Œ์ŠคํŠธ ์•ˆ์ „๋ง์„ ๊ตฌ์ถ•ํ•จ์œผ๋กœ์จ ๊ธฐ์ˆ  ๋ถ€์ฑ„๋ฅผ ์ƒํ™˜ํ•˜๊ณ  ์‹œ์Šคํ…œ์˜ ๋ณต์žก๋„๋ฅผ ์ œ์–ดํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•œ๋‹ค. + +## ๐Ÿ“– Core Content +1. **๋ฆฌํŒฉํ† ๋ง ์ฒ ํ•™: ์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜** + - ์œ„ํ—˜์ด ํฐ ์ „๋ฉด ์žฌ์ž‘์„ฑ ๋Œ€์‹ , ๊ธฐ๋Šฅ ๋‹จ์œ„๋กœ ํ•˜๋‚˜์”ฉ ์ƒˆ๋กœ์šด ์•„ํ‚คํ…์ฒ˜๋กœ ์˜ฎ๊ธฐ๋Š” ์ ์ง„์  ๋ฐฉ์‹์„ ์ทจํ•œ๋‹ค. + - ์ด๋ฅผ ํ†ตํ•ด ์‹œ์Šคํ…œ ํ˜„๋Œ€ํ™” ์ค‘์—๋„ ์‹ ๊ทœ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ์„ ์ง€์†ํ•  ์ˆ˜ ์žˆ๋‹ค. +2. **React ๋ฆฌํŒฉํ† ๋ง์˜ ํ•ต์‹ฌ: ์ปค์Šคํ…€ ํ›…** + - ๋น„๋Œ€ํ•œ UI ์ปดํฌ๋„ŒํŠธ์—์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ถ”์ถœํ•˜์—ฌ ์ปค์Šคํ…€ ํ›…์œผ๋กœ ๋ถ„๋ฆฌํ•œ๋‹ค. + - UI์™€ ๋กœ์ง์˜ ๋ถ„๋ฆฌ๋ฅผ ํ†ตํ•ด ๋ชจ๋“ˆ์„ฑ์„ ๋†’์ด๊ณ , ๋…๋ฆฝ์ ์ด๊ณ  ๋น ๋ฅธ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ(Unit Testing) ํ™˜๊ฒฝ์„ ํ™•๋ณดํ•œ๋‹ค. +3. **์‹ค๋ฌด์  ๊ฐœ์„  ๊ธฐ๋ฒ•** + - ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์˜ ํ•จ์ˆ˜ํ˜• ์ „ํ™˜, JavaScript์˜ TypeScript ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜. + - ๋ถˆํ•„์š”ํ•œ `useEffect` ์ œ๊ฑฐ ๋ฐ ์„œ๋ฒ„ ์ƒํƒœ ๊ด€๋ฆฌ(TanStack Query) ๋„์ž…. + - DRY(์ค‘๋ณต ์ œ๊ฑฐ) ๋ฐ YAGNI(๋ถˆํ•„์š” ๊ธฐ๋Šฅ ์ œ๊ฑฐ) ์›์น™์„ ํ†ตํ•œ ์ฝ”๋“œ ์ •๋ฆฌ. +4. **ํ‘œ์ค€ํ™” ๋ฐ ๊ฑฐ๋ฒ„๋„Œ์Šค** + - CSS ์ž‘์„ฑ ๋ฐฉ์‹ ํ‘œ์ค€ํ™”, ํด๋” ๊ตฌ์กฐ(FSD ๋“ฑ) ์žฌ์ •๋ ฌ, ์ง๊ด€์  ๋„ค์ด๋ฐ ์ ์šฉ. + - ESLint ๋“ฑ ์ž๋™ํ™” ๋„๊ตฌ๋ฅผ ํ†ตํ•ด ํŒ€์˜ ๋ชจ๋ฒ” ์‚ฌ๋ก€๋ฅผ ๊ฐ•์ œํ•œ๋‹ค. + +## โš–๏ธ Trade-offs & Caveats +- **๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ณผ๋„๊ธฐ ๋ณต์žก์„ฑ**: ๊ตฌํ˜•๊ณผ ์‹ ๊ทœ ํŒจํ„ด์ด ๊ณต์กดํ•˜๋Š” ๊ธฐ๊ฐ„ ๋™์•ˆ ์‹œ์Šคํ…œ์˜ ์ผ๊ด€์„ฑ์ด ์ผ์‹œ์ ์œผ๋กœ ๊นจ์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ฐœ๋ฐœ์ž์˜ ์ธ์ง€ ๋ถ€ํ•˜๊ฐ€ ์ฆ๊ฐ€ํ•œ๋‹ค. +- **ํ…Œ์ŠคํŠธ ๋ถ€์žฌ์˜ ์œ„ํ—˜**: ์ถฉ๋ถ„ํ•œ ํ…Œ์ŠคํŠธ ์•ˆ์ „๋ง ์—†์ด ์ง„ํ–‰๋˜๋Š” ๋ฆฌํŒฉํ† ๋ง์€ ์˜คํžˆ๋ ค ์˜ˆ๊ธฐ์น˜ ๋ชปํ•œ ํšŒ๊ท€(Regression) ์˜ค๋ฅ˜๋ฅผ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ๋‹ค. +- **๊ณผ๋„ํ•œ ์ถ”์ƒํ™”**: ์ค‘๋ณต ์ œ๊ฑฐ(DRY)์— ๋„ˆ๋ฌด ์ง‘์ฐฉํ•  ๊ฒฝ์šฐ, ์˜คํžˆ๋ ค ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•ด์ ธ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์›Œ์ง€๋Š” 'KISS ์›์น™ ์œ„๋ฐ˜' ์‚ฌ๋ก€๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. + +## ๐Ÿ”— Knowledge Connections +### Related Concepts +- **Incremental Migration**: ์•ˆ์ „ํ•œ ์•„ํ‚คํ…์ฒ˜ ์ „ํ™˜ ์ „๋žต (๊ด€๊ณ„: ํ•ต์‹ฌ ๋ฐฉ๋ฒ•๋ก ) +- **Custom Hooks**: ๋กœ์ง ๋ถ„๋ฆฌ์˜ ๊ธฐ๋ณธ ๋‹จ์œ„ (๊ด€๊ณ„: ์‹ค์ฒœ ๋„๊ตฌ) +- **Unit Testing**: ๋ฆฌํŒฉํ† ๋ง์˜ ์•ˆ์ •์„ฑ ๋ณด์žฅ (๊ด€๊ณ„: ํ•„์ˆ˜ ์ „์ œ ์กฐ๊ฑด) +- **Feature-Sliced Design (FSD)**: ์บก์Аํ™”๋ฅผ ํ†ตํ•œ ๋ถ€์ž‘์šฉ ์ฐจ๋‹จ (๊ด€๊ณ„: ๊ตฌ์กฐ์  ๋ชฉํ‘œ) + +### Deeper Research Questions +1. ๋Œ€๊ทœ๋ชจ ๋ฆฌํŒฉํ† ๋ง ์‹œ ๊ตฌ/์‹ ๊ทœ ์•„ํ‚คํ…์ฒ˜ ๊ณต์กด ๊ธฐ๊ฐ„์„ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•œ 'Feature Toggle' ํ™œ์šฉ ๋ฐฉ์•ˆ์€? +2. ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ์ „ํ˜€ ์—†๋Š” ๋ ˆ๊ฑฐ์‹œ ์‹œ์Šคํ…œ์—์„œ '์•ˆ์ „ํ•œ ๋ฆฌํŒฉํ† ๋ง'์„ ์‹œ์ž‘ํ•˜๊ธฐ ์œ„ํ•œ ์ตœ์†Œํ•œ์˜ ํ…Œ์ŠคํŠธ ์ „๋žต์€? +3. ์ˆœํ™˜ ๋ณต์žก๋„๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•œ ์กฐ๊ฑด๋ฌธ ๋ฆฌํŒฉํ† ๋ง(Guard Clauses ๋“ฑ)์ด React JSX ๋‚ด๋ถ€ ๊ตฌ์กฐ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์€? +4. ๋ฆฌํŒฉํ† ๋ง ์ค‘ ๋ฐœ๊ฒฌ๋œ '๊ธฐ์กด์˜ ์˜๋„๋œ ๋ฒ„๊ทธ(Legacy Bug)'๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜์  ์˜์‚ฌ๊ฒฐ์ • ๊ธฐ์ค€์€? +5. AI ๋„๊ตฌ(LLM)๋ฅผ ํ™œ์šฉํ•œ ๋Œ€๊ทœ๋ชจ ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง ์‹œ, ๋กœ์ง ๋ณ€์งˆ ์—ฌ๋ถ€๋ฅผ ์ž๋™์œผ๋กœ ๊ฒ€์ฆํ•˜๋Š” ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ• ๋ฐฉ๋ฒ•์€? + +### Practical Application Contexts +- **๊ธฐ์ˆ  ๋ถ€์ฑ„ ์ƒํ™˜**: ์ŠคํŒŒ๊ฒŒํ‹ฐ ์ฝ”๋“œ๋กœ ๋ณ€ํ•œ ๋ ˆ๊ฑฐ์‹œ ํ”„๋กœ์ ํŠธ์˜ ๊ตฌ์กฐ ๊ฐœ์„  ๋ฐ ํ˜„๋Œ€ํ™”. +- **์‹œ์Šคํ…œ ์•ˆ์ •์„ฑ ๊ฐ•ํ™”**: ์žฆ์€ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๋ชจ๋“ˆ์„ SRP ์›์น™์— ๋”ฐ๋ผ ๋ถ„ํ•ดํ•˜๊ณ  ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๋ณด๊ฐ•. + +### Adjacent Topics +- **Technical Debt Management** +- **Clean Code & Code Smells** +- **SOLID Principles** diff --git a/10_Wiki/Topics/Software Architecture/Agile Development.md b/10_Wiki/Topics/Software Architecture/Agile Development.md new file mode 100644 index 00000000..9aa66b3b --- /dev/null +++ b/10_Wiki/Topics/Software Architecture/Agile Development.md @@ -0,0 +1,38 @@ +## ๐Ÿ“Œ Brief Summary +์• ์ž์ผ ๊ฐœ๋ฐœ(Agile Development)์€ ๋ถˆํ™•์‹คํ•œ ์š”๊ตฌ์‚ฌํ•ญ๊ณผ ๊ธ‰๋ณ€ํ•˜๋Š” ํ™˜๊ฒฝ ์†์—์„œ ๋ฐ˜๋ณต์ ์ด๊ณ  ์ ์ง„์ ์ธ ํ”„๋กœ์„ธ์Šค๋ฅผ ํ†ตํ•ด ๊ฐ€์น˜๋ฅผ ์ฐฝ์ถœํ•˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ ๋ฐฉ๋ฒ•๋ก ์ด๋‹ค. ๋ถˆํ•„์š”ํ•œ ์‚ฌ์ „ ์„ค๊ณ„๋ฅผ ์ง€์–‘ํ•˜๋Š” YAGNI ์›์น™๊ณผ ๊ธฐ๋Šฅ ์ค‘์‹ฌ์˜ ์ฝ”๋“œ ๊ตฌ์กฐํ™”๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ ์†๋„์™€ ์œ ์—ฐ์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•˜๋Š” ๊ฒƒ์„ ํ•ต์‹ฌ์œผ๋กœ ํ•œ๋‹ค. + +## ๐Ÿ“– Core Content +1. **YAGNI ์›์น™์˜ ์ฒ ์ €ํ•œ ์ค€์ˆ˜ (You Aren't Gonna Need It)** + - ์• ์ž์ผ ํ™˜๊ฒฝ์—์„œ๋Š” ๋ฏธ๋ž˜์˜ ๋ถˆํ™•์‹คํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์œ„ํ•ด ๋ฏธ๋ฆฌ ๋ณต์žกํ•œ ๊ธฐ๋Šฅ์„ ๊ตฌ์ถ•ํ•˜๋Š” ์˜ค๋ฒ„์—”์ง€๋‹ˆ์–ด๋ง์„ ์ง€์–‘ํ•ด์•ผ ํ•œ๋‹ค. + - ํ˜„์žฌ์˜ ์š”๊ตฌ์‚ฌํ•ญ์— ์ง‘์ค‘ํ•จ์œผ๋กœ์จ ๋ถˆํ•„์š”ํ•œ ๋ณต์žก์„ฑ์„ ์ œ๊ฑฐํ•˜๊ณ  ์ž‘์—… ๋‚ญ๋น„๋ฅผ ์ตœ์†Œํ™”ํ•œ๋‹ค. +2. **๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ(Feature-Based Structure) ์„ค๊ณ„** + - ํŒŒ์ผ ์œ ํ˜•(Type)์ด ์•„๋‹Œ ๋น„์ฆˆ๋‹ˆ์Šค ๊ธฐ๋Šฅ(Feature) ๋˜๋Š” ๋ชจ๋“ˆ์„ ์ค‘์‹ฌ์œผ๋กœ ํด๋” ๊ตฌ์กฐ๋ฅผ ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์ด ์• ์ž์ผ ๋ฐฉ๋ฒ•๋ก ๊ณผ ๋†’์€ ์ •ํ•ฉ์„ฑ์„ ๊ฐ–๋Š”๋‹ค. + - ๊ฐ ๊ธฐ๋Šฅ์ด ๋…๋ฆฝ์ ์œผ๋กœ ์ƒ์„ฑ, ๊ตฌํ˜„, ๋ฐฐํฌ๋  ์ˆ˜ ์žˆ๋„๋ก ๋ณด์žฅํ•˜์—ฌ ํŒ€ ๊ฐ„์˜ ๋ณ‘๋ ฌ ํ˜‘์—… ํšจ์œจ์„ฑ์„ ๋†’์ธ๋‹ค. +3. **๋ฐ˜๋ณต์  ํ’ˆ์งˆ ํ™•๋ณด** + - ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)๊ณผ ๊ฐ™์€ SOLID ์›์น™์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์„ค๊ณ„ํ•˜์—ฌ, ๋น ๋ฅธ ์Šคํ”„๋ฆฐํŠธ ์ฃผ๊ธฐ ์†์—์„œ๋„ ์ฝ”๋“œ์˜ ์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ํ™•์žฅ์„ฑ์„ ์œ ์ง€ํ•œ๋‹ค. + +## โš–๏ธ Trade-offs & Caveats +- **๊ธฐ์ˆ  ๋ถ€์ฑ„์˜ ์œ„ํ—˜**: YAGNI๋ฅผ ์ง€๋‚˜์น˜๊ฒŒ ์—„๊ฒฉํ•˜๊ฒŒ ์ ์šฉํ•  ๊ฒฝ์šฐ, ๋ฏธ๋ž˜์˜ ํ™•์žฅ์„ฑ์„ ๊ณ ๋ คํ•˜์ง€ ์•Š์€ ์„ค๊ณ„๋กœ ์ธํ•ด ์ถ”ํ›„ ๋Œ€๊ทœ๋ชจ ๋ฆฌํŒฉํ† ๋ง ๋น„์šฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๊ฐ€ ์กด์žฌํ•œ๋‹ค. +- **์ดˆ๊ธฐ ์„ค๊ณ„ ์˜ค๋ฒ„ํ—ค๋“œ**: ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ๋ฅผ ์ฑ„ํƒํ•  ๊ฒฝ์šฐ, ๋‹จ์ˆœํ•œ ํŒŒ์ผ ์œ ํ˜• ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ๋ณด๋‹ค ํด๋” ๊นŠ์ด๊ฐ€ ๊นŠ์–ด์ง€๊ณ  ์ดˆ๊ธฐ ๊ตฌ์„ฑ ๋น„์šฉ์ด ์ฆ๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค. + +## ๐Ÿ”— Knowledge Connections +### Related Concepts +- **YAGNI**: ์• ์ž์ผ ๊ฐœ๋ฐœ์˜ ํ•ต์‹ฌ์ ์ธ ํšจ์œจ์„ฑ ์ถ”๊ตฌ ์›์น™ (๊ด€๊ณ„: ํ•˜์œ„ ์‹ค์ฒœ ์ง€์นจ) +- **Feature-Based Structure**: ์• ์ž์ผ ํŒ€์˜ ๋…๋ฆฝ์  ํ˜‘์—…์„ ๋•๋Š” ์•„ํ‚คํ…์ฒ˜ (๊ด€๊ณ„: ๊ตฌ์กฐ์  ๊ตฌํ˜„์ฒด) +- **KISS Principle**: ๋ณต์žก์„ฑ์„ ์ตœ์†Œํ™”ํ•˜์—ฌ ๋ณ€๊ฒฝ์— ์‹ ์†ํžˆ ๋Œ€์‘ํ•˜๋Š” ์ฒ ํ•™ (๊ด€๊ณ„: ๊ฐ€์น˜ ๊ณต์œ ) + +### Deeper Research Questions +1. ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ํด๋” ๊ตฌ์กฐ๊ฐ€ ๋งˆ์ดํฌ๋กœ ํ”„๋ก ํŠธ์—”๋“œ ์•„ํ‚คํ…์ฒ˜๋กœ์˜ ์ „ํ™˜ ์‹œ ์–ด๋–ค ์ด์ ์„ ์ œ๊ณตํ•˜๋Š”๊ฐ€? +2. YAGNI ์›์น™๊ณผ ์žฅ๊ธฐ์ ์ธ ์ฝ”๋“œ ํ’ˆ์งˆ(Clean Code) ์‚ฌ์ด์˜ ๊ท ํ˜•์„ ๋งž์ถ”๋Š” ๊ตฌ์ฒด์ ์ธ ๊ฒฐ์ • ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๋ฌด์—‡์ธ๊ฐ€? +3. ์• ์ž์ผ ๋ฐ˜๋ณต ์ฃผ๊ธฐ ๋‚ด์—์„œ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์™€ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ์˜ ๋น„์ค‘์„ ์–ด๋–ป๊ฒŒ ์กฐ์ ˆํ•ด์•ผ ํ•˜๋Š”๊ฐ€? +4. ์Šคํ”„๋ฆฐํŠธ ์ค‘ ๋ฐœ์ƒํ•˜๋Š” ๊ธฐ์ˆ  ๋ถ€์ฑ„๋ฅผ ๋ฐฑ๋กœ๊ทธ์— ํšจ๊ณผ์ ์œผ๋กœ ๋ฐ˜์˜ํ•˜๊ณ  ํ•ด์†Œํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋Š”? +5. ๊ธฐ๋Šฅ ๋…๋ฆฝ์„ฑ์ด ๊ฐ•ํ™”๋œ ๊ตฌ์กฐ์—์„œ ๊ณตํ†ต ๋ชจ๋“ˆ(Shared)์˜ ๋น„๋Œ€ํ™”๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•œ ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? + +### Practical Application Contexts +- **์Šคํ”„๋ฆฐํŠธ ์„ค๊ณ„**: ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ๋•Œ ๋ฏธ๋ž˜์˜ ํ™•์žฅ์„ฑ๋ณด๋‹ค๋Š” ํ˜„์žฌ ์Šคํ”„๋ฆฐํŠธ ๋ชฉํ‘œ ๋‹ฌ์„ฑ์— ์ง‘์ค‘ํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ๋‹จ์ˆœํ•˜๊ฒŒ ์œ ์ง€. +- **ํŒ€ ํ˜‘์—… ๊ตฌ์กฐ**: ๊ธฐ๋Šฅ๋ณ„๋กœ ํด๋”๋ฅผ ๋‚˜๋ˆ„์–ด ๊ฐœ๋ฐœ์ž ๊ฐ„์˜ ์ฝ”๋“œ ์ถฉ๋Œ์„ ์ตœ์†Œํ™”ํ•˜๊ณ  ๋…๋ฆฝ์ ์ธ ๊ธฐ๋Šฅ ๋ฐฐํฌ ํ™˜๊ฒฝ ๊ตฌ์ถ•. + +### Adjacent Topics +- **SOLID Principles** +- **Lean Software Development** +- **Extreme Programming (XP)** diff --git a/10_Wiki/Topics/Software Architecture/Clean Code & SOLID Principles.md b/10_Wiki/Topics/Software Architecture/Clean Code & SOLID Principles.md new file mode 100644 index 00000000..553856d1 --- /dev/null +++ b/10_Wiki/Topics/Software Architecture/Clean Code & SOLID Principles.md @@ -0,0 +1,43 @@ +## ๐Ÿ“Œ Brief Summary +Clean Code์™€ SOLID ์›์น™์€ ์œ ์ง€๋ณด์ˆ˜์„ฑ, ๊ฐ€๋…์„ฑ, ํ™•์žฅ์„ฑ์„ ํ™•๋ณดํ•˜๊ธฐ ์œ„ํ•œ ์†Œํ”„ํŠธ์›จ์–ด ๊ณตํ•™์˜ ํ•ต์‹ฌ ์„ค๊ณ„ ์ง€์นจ์ด๋‹ค. ํ˜„๋Œ€์˜ React ์ƒํƒœ๊ณ„์—์„œ ์ด๋Ÿฌํ•œ ์›์น™๋“ค์€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ UI์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ณ , ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ์ปดํฌ๋„ŒํŠธ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ตฌ์ถ•ํ•˜๋ฉฐ, ๊ธฐ์ˆ  ๋ถ€์ฑ„ ๋ˆ„์ ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๊ธฐ๋ฐ˜ ์—ญํ• ์„ ํ•œ๋‹ค. + +## ๐Ÿ“– Core Content +1. **SOLID Principles in React** + - **SRP (๋‹จ์ผ ์ฑ…์ž„)**: ์ปดํฌ๋„ŒํŠธ๋‚˜ ํ›…์€ ํ•˜๋‚˜์˜ ๋ช…ํ™•ํ•œ ๋ชฉ์ ๋งŒ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค (300์ค„ ๊ธฐ์ค€). + - **OCP (๊ฐœ๋ฐฉ-ํ์‡„)**: ์ฝ”๋“œ ์ˆ˜์ • ๋Œ€์‹  ์ปดํฌ๋„ŒํŠธ ํ•ฉ์„ฑ(Composition)์„ ํ†ตํ•ด ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•œ๋‹ค. + - **ISP (์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ)**: ํ•„์š”ํ•œ Props๋งŒ ์ „๋‹ฌํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ ๊ฐ„ ๋ถˆํ•„์š”ํ•œ ๊ฒฐํ•ฉ์„ ์ฐจ๋‹จํ•œ๋‹ค. + - **DIP (์˜์กด์„ฑ ์—ญ์ „)**: ๊ตฌ์ฒด์  ๊ตฌํ˜„์ด ์•„๋‹Œ ์ถ”์ƒํ™”(Context, Props)์— ์˜์กดํ•˜์—ฌ ์ฃผ์ž…๋ฐ›๋Š”๋‹ค. +2. **Clean Code & ํ•ต์‹ฌ ์›์น™** + - **DRY (์ค‘๋ณต ์ œ๊ฑฐ)**: ์ปค์Šคํ…€ ํ›…์œผ๋กœ ๊ณตํ†ต ๋กœ์ง์„ ์ถ”์ถœํ•˜๋˜, ๊ณผ๋„ํ•œ ์ถ”์ƒํ™”๋Š” ๊ฒฝ๊ณ„ํ•œ๋‹ค. + - **KISS (๋‹จ์ˆœ์„ฑ ์œ ์ง€)**: ๋ณต์žกํ•œ ๋กœ์ง๋ณด๋‹ค ์ง๊ด€์ ์ด๊ณ  ๋‹จ์ˆœํ•œ ์ฝ”๋“œ๋ฅผ ์šฐ์„ ์‹œํ•œ๋‹ค. + - **YAGNI (๋ถˆํ•„์š” ๊ธฐ๋Šฅ ๋ฐฐ์ œ)**: ๋‹น์žฅ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๋ฏธ๋ž˜์˜ ํ™•์žฅ์„ฑ์„ ๋ฏธ๋ฆฌ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋Š”๋‹ค. +3. **์‹ค๋ฌด์  ๊ฐ€์ด๋“œ๋ผ์ธ** + - ๋ช…ํ™•ํ•œ ๋„ค์ด๋ฐ(PascalCase, camelCase)๊ณผ ๋‚ฎ์€ ์ค‘์ฒฉ ๊ตฌ์กฐ๋ฅผ ์œ ์ง€ํ•œ๋‹ค. + - ๋™์ผ ํŒจํ„ด์ด 3๋ฒˆ ์ด์ƒ ๋ฐ˜๋ณต๋  ๋•Œ(`Rule of Three`) ๋น„๋กœ์†Œ ์ถ”์ƒํ™”๋ฅผ ์ง„ํ–‰ํ•˜์—ฌ ์„ฃ๋ถ€๋ฅธ ์ตœ์ ํ™”๋ฅผ ๋ฐฉ์ง€ํ•œ๋‹ค. + +## โš–๏ธ Trade-offs & Caveats +- **์ถ”์ƒํ™” vs ๋‹จ์ˆœํ•จ**: DRY ์›์น™์„ ์ง€ํ‚ค๋ ค๋‹ค ๋งŒ๋“  ๊ณ ์ฐจ์›์ ์ธ ์ถ”์ƒํ™”๊ฐ€ ์˜คํžˆ๋ ค ์ฝ”๋“œ์˜ ํ๋ฆ„์„ ํŒŒ์•…ํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค์–ด KISS ์›์น™์„ ์œ„๋ฐ˜ํ•  ์ˆ˜ ์žˆ๋‹ค. +- **์ดˆ๊ธฐ ๊ฐœ๋ฐœ ์†๋„**: ์—„๊ฒฉํ•œ ์›์น™ ์ค€์ˆ˜๋Š” ์ดˆ๊ธฐ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ์™€ ์„ค๊ณ„ ์‹œ๊ฐ„์„ ์ฆ๊ฐ€์‹œํ‚ค๋‚˜, ์žฅ๊ธฐ์ ์ธ ์œ ์ง€๋ณด์ˆ˜ ๋น„์šฉ์„ ํš๊ธฐ์ ์œผ๋กœ ์ค„์—ฌ์ค€๋‹ค. +- **์˜ค๋ฒ„์—”์ง€๋‹ˆ์–ด๋ง์˜ ์œ„ํ—˜**: YAGNI๋ฅผ ๋ฌด์‹œํ•˜๊ณ  ์„ค๊ณ„ํ•œ '๋ฏธ๋ž˜ ๋Œ€๋น„์šฉ' ์ฝ”๋“œ๋Š” ๊ฒฐ๊ตญ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” 'Dead Code'๊ฐ€ ๋˜์–ด ์‹œ์Šคํ…œ์˜ ์ง์ด ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค. + +## ๐Ÿ”— Knowledge Connections +### Related Concepts +- **Component Composition**: OCP ์‹คํ˜„์˜ ํ•ต์‹ฌ (๊ด€๊ณ„: ๊ตฌํ˜„ ํŒจํ„ด) +- **Custom Hooks**: DRY ๋ฐ SRP๋ฅผ ์œ„ํ•œ ๋ฌผ๋ฆฌ์  ๋‹จ์œ„ (๊ด€๊ณ„: ์‹ค์ฒœ ๋„๊ตฌ) +- **Feature-Sliced Design (FSD)**: ์›์น™์˜ ๊ตฌ์กฐ์  ๊ฐ•์ œ (๊ด€๊ณ„: ์•„ํ‚คํ…์ฒ˜ ํ”„๋ ˆ์ž„์›Œํฌ) + +### Deeper Research Questions +1. ํ•จ์ˆ˜ํ˜• React ํ™˜๊ฒฝ์—์„œ ์ƒ์† ์—†์ด ๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™(LSP)์„ ์ค€์ˆ˜ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค ์„ค๊ณ„ ์ „๋žต์€? +2. ์„ฃ๋ถ€๋ฅธ ์ถ”์ƒํ™”(Premature Abstraction)๊ฐ€ ์ „์ฒด ํ”„๋กœ์ ํŠธ์˜ ์ธ์ง€ ๋ถ€ํ•˜์™€ ์œ ์ง€๋ณด์ˆ˜ ๋น„์šฉ์— ๋ฏธ์น˜๋Š” ์ •๋Ÿ‰์  ์˜ํ–ฅ์€? +3. DIP(์˜์กด์„ฑ ์—ญ์ „)๋ฅผ ์œ„ํ•ด Context๋ฅผ ๋‚จ๋ฐœํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์„ฑ๋Šฅ ์ €ํ•˜์™€ ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ 'Inversion of Control' ํŒจํ„ด์˜ ์กฐํ™”๋Š”? +4. Clean Code๋ฅผ ๊ฐ•์ œํ•˜๊ธฐ ์œ„ํ•œ ์ •์  ๋ถ„์„ ๋„๊ตฌ(ESLint, SonarQube)์˜ ๊ทœ์น™์„ ํŒ€์˜ ๊ธฐ์ˆ ์  ์„ฑ์ˆ™๋„์— ๋”ฐ๋ผ ์–ด๋–ป๊ฒŒ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•ํ•˜๋Š”๊ฐ€? +5. YAGNI ์›์น™ ํ•˜์—์„œ '๋‚˜์ค‘์— ๊ณ ์น˜๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ'๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•œ ์•„ํ‚คํ…์ฒ˜์  ์œ ์—ฐ์„ฑ(Flexibility)์˜ ์ตœ์†Œ ๋‹จ์œ„๋Š”? + +### Practical Application Contexts +- **์ฝ”๋“œ ๋ฆฌ๋ทฐ ๊ธฐ์ค€ ์ˆ˜๋ฆฝ**: ํŒ€ ์ „์ฒด์˜ ์ฝ”๋“œ ํ’ˆ์งˆ ์ƒํ–ฅ ํ‰์ค€ํ™”๋ฅผ ์œ„ํ•œ ๋ช…ํ™•ํ•œ ์ฒดํฌ๋ฆฌ์ŠคํŠธ ์ œ๊ณต. +- **๋Œ€๊ทœ๋ชจ ๋ฆฌํŒฉํ† ๋ง ๊ฐ€์ด๋“œ**: ๋ณต์žกํ•˜๊ฒŒ ์–ฝํžŒ ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฅผ ๋‹จ์ผ ์ฑ…์ž„ ์›์น™์— ๋”ฐ๋ผ ๋ถ„ํ•ดํ•˜๊ณ  ์ •๋ˆ. + +### Adjacent Topics +- **Software Engineering Principles** +- **Refactoring Techniques** +- **Test Driven Development (TDD)** diff --git a/10_Wiki/Topics/Software Architecture/Legacy System Migration.md b/10_Wiki/Topics/Software Architecture/Legacy System Migration.md new file mode 100644 index 00000000..f38c9703 --- /dev/null +++ b/10_Wiki/Topics/Software Architecture/Legacy System Migration.md @@ -0,0 +1,43 @@ +## ๐Ÿ“Œ Brief Summary +๋ ˆ๊ฑฐ์‹œ ์‹œ์Šคํ…œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์€ ๋‚ก์€ ์•„ํ‚คํ…์ฒ˜์™€ ์ฝ”๋“œ๋ฅผ ์ตœ์‹  ๊ธฐ์ˆ  ํ‘œ์ค€์œผ๋กœ ์ „ํ™˜ํ•˜์—ฌ ์‹œ์Šคํ…œ์˜ ์œ ์ง€๋ณด์ˆ˜์„ฑ, ์•ˆ์ •์„ฑ, ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•˜๋Š” ๊ณต์ •์ด๋‹ค. ํ”„๋ก ํŠธ์—”๋“œ ํ™˜๊ฒฝ์—์„œ๋Š” ์ „์ฒด ์‹œ์Šคํ…œ์„ ํ•œ ๋ฒˆ์— ์žฌ์ž‘์„ฑํ•˜๋Š” ์œ„ํ—˜์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด, ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ๊ณผ ๋ณ‘ํ–‰ ๊ฐ€๋Šฅํ•œ **์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜(Incremental Migration)** ์ „๋žต์„ ํ•ต์‹ฌ์œผ๋กœ ํ•œ๋‹ค. + +## ๐Ÿ“– Core Content +1. **์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ „๋žต (Refactor, Do Not Rewrite)** + - ์‹œ์Šคํ…œ ์ „์ฒด๋ฅผ ์ค‘๋‹จ์‹œํ‚ค์ง€ ์•Š๊ณ  ๊ธฐ๋Šฅ ๋‹จ์œ„๋กœ ํ•˜๋‚˜์”ฉ ์ƒˆ๋กœ์šด ์Šคํƒ์œผ๋กœ ์˜ฎ๊ธฐ๋Š” ๋ฐฉ์‹์„ ์ทจํ•œ๋‹ค. + - ์˜ˆ: Context API์—์„œ Zustand๋กœ ์ „ํ™˜ ์‹œ, ๋‹จ์ˆœํ•œ ์ „์—ญ ์•Œ๋ฆผ ๊ธฐ๋Šฅ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ ์ ์ง„์ ์œผ๋กœ ๋ณต์žกํ•œ ๊ฒฐ์ œ/์ƒํƒœ ๋กœ์ง์œผ๋กœ ๋ฒ”์œ„๋ฅผ ํ™•๋Œ€ํ•œ๋‹ค. +2. **ํ˜„๋Œ€ํ™” ์ฒดํฌ๋ฆฌ์ŠคํŠธ (Solid Wins)** + - JavaScript ์ฝ”๋“œ๋ฅผ TypeScript๋กœ ์ „ํ™˜ํ•˜์—ฌ ์ •์  ์•ˆ์ •์„ฑ ํ™•๋ณด. + - ํด๋ž˜์Šค ๊ธฐ๋ฐ˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ ๋ฐ Hooks๋กœ ํ˜„๋Œ€ํ™”. + - ๋ถˆํ•„์š”ํ•œ `useEffect`๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ์„œ๋ฒ„ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ Tanstack Query๋กœ ์ด๊ด€. +3. **์ปค์Šคํ…€ ํ›…์„ ํ†ตํ•œ ๋กœ์ง ๊ฒฉ๋ฆฌ** + - ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์— ๋ณต์žกํ•˜๊ฒŒ ์–ฝํžŒ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ปค์Šคํ…€ ํ›…์œผ๋กœ ์ถ”์ถœํ•˜์—ฌ UI์™€ ๋ถ„๋ฆฌํ•œ๋‹ค. + - ์ด๋ฅผ ํ†ตํ•ด UI์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— ๋Œ€ํ•œ ๊ณ ์† ๋‹จ์œ„ ํ…Œ์ŠคํŠธ(Unit Test) ์ˆ˜ํ–‰์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค. +4. **์•ˆ์ „๋ง์œผ๋กœ์„œ์˜ ํ…Œ์ŠคํŠธ** + - ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์‹œ์ž‘ ์ „ ๊ธฐ์กด ๋™์ž‘์„ ๊ฒ€์ฆํ•˜๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์šฐ์„  ์ž‘์„ฑํ•˜์—ฌ, ๋ณ€๊ฒฝ ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ ํšŒ๊ท€(Regression)๋ฅผ ๋ฐฉ์ง€ํ•œ๋‹ค. + +## โš–๏ธ Trade-offs & Caveats +- **๊ณผ๋„๊ธฐ์  ๋ณต์žก์„ฑ**: ์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ค‘์—๋Š” ๋‘ ๊ฐ€์ง€ ์ด์ƒ์˜ ๊ธฐ์ˆ  ์Šคํƒ(์˜ˆ: Redux์™€ Zustand)์ด ๊ณต์กดํ•˜๊ฒŒ ๋˜์–ด ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ๊ฐ€ ์ผ์‹œ์ ์œผ๋กœ ์ฆ๊ฐ€ํ•˜๊ณ  ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™” ๋กœ์ง์ด ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ๋‹ค. +- **๊ฐœ๋ฐœ ์†๋„ ์ €ํ•˜**: ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ๊ณผ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ๋ณ‘ํ–‰ํ•  ๊ฒฝ์šฐ, ๋ฆฌํŒฉํ† ๋ง ๋น„์šฉ์œผ๋กœ ์ธํ•ด ๋‹จ๊ธฐ์ ์ธ ์ œํ’ˆ ์ถœ์‹œ ์†๋„๊ฐ€ ๋А๋ ค์งˆ ์ˆ˜ ์žˆ๋‹ค. +- **๊ธฐ์ˆ  ๋ถ€์ฑ„์˜ ์ž”์กด**: ๋ถ€๋ถ„์ ์ธ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์ด ์ค‘๋‹จ๋  ๊ฒฝ์šฐ, ์˜คํžˆ๋ ค ์‹œ์Šคํ…œ์ด ๋” ํŒŒํŽธํ™”๋œ ์ƒํƒœ๋กœ ๋‚จ๊ฒŒ ๋  ์œ„ํ—˜์ด ์žˆ์œผ๋ฏ€๋กœ ๋ช…ํ™•ํ•œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋กœ๋“œ๋งต์ด ํ•„์š”ํ•˜๋‹ค. + +## ๐Ÿ”— Knowledge Connections +### Related Concepts +- **Incremental Migration**: ๋ฆฌ์Šคํฌ ์ตœ์†Œํ™”๋ฅผ ์œ„ํ•œ ๋‹จ๊ณ„์  ์ „ํ™˜ ๊ธฐ๋ฒ• (๊ด€๊ณ„: ํ•ต์‹ฌ ์ „๋žต) +- **State Management Architecture**: ๋ ˆ๊ฑฐ์‹œ ์ „ํ™˜์˜ ๊ฐ€์žฅ ๋นˆ๋ฒˆํ•œ ๋Œ€์ƒ (๊ด€๊ณ„: ์ฃผ์š” ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์˜์—ญ) +- **Unit Testing**: ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์˜ ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•˜๋Š” ์•ˆ์ „ ์žฅ์น˜ (๊ด€๊ณ„: ํ•„์ˆ˜ ์„ ํ–‰ ์ž‘์—…) + +### Deeper Research Questions +1. ์ „์ฒด ์žฌ์ž‘์„ฑ(Big Bang Rewrite)์ด ์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜๋ณด๋‹ค ๊ฒฝ์ œ์ ์œผ๋กœ ์œ ๋ฆฌํ•ด์ง€๋Š” ๊ธฐ์ˆ  ๋ถ€์ฑ„์˜ ์ž„๊ณ„์ ์€ ์–ด๋””์ธ๊ฐ€? +2. ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ณผ๋„๊ธฐ์—์„œ ์„œ๋กœ ๋‹ค๋ฅธ ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ ๊ฐ„์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ 'Bridge' ํŒจํ„ด์˜ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์€? +3. ๋Œ€๊ทœ๋ชจ JS ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ TS๋กœ ์ „ํ™˜ํ•  ๋•Œ, 'any' ํƒ€์ž…์„ ์ตœ์†Œํ™”ํ•˜๋ฉด์„œ ๋นŒ๋“œ ์˜ค๋ฅ˜๋ฅผ ๋ง‰๋Š” ๋‹จ๊ณ„์  ํƒ€์ž… ๊ฐ•ํ™” ์ „๋žต์€? +4. ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ค‘ ๋ฐœ์ƒํ•œ ๋ฒ„๊ทธ๊ฐ€ ๊ธฐ์ˆ ์  ๊ฒฐํ•จ์ธ์ง€, ๊ธฐ์กด ๋ ˆ๊ฑฐ์‹œ์˜ ์˜๋„๋œ ๋™์ž‘์ธ์ง€ ํŒ๋ณ„ํ•˜๋Š” ๊ธฐ์ค€์€ ๋ฌด์—‡์ธ๊ฐ€? +5. ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง(SSR) ํ™˜๊ฒฝ์—์„œ์˜ ๋ ˆ๊ฑฐ์‹œ ํ”„๋ ˆ์ž„์›Œํฌ์™€ ์ตœ์‹  ํ”„๋ ˆ์ž„์›Œํฌ ๊ฐ„์˜ ํŠธ๋ž˜ํ”ฝ ๋ผ์šฐํŒ… ์ฒ˜๋ฆฌ ๋ฐฉ์•ˆ์€? + +### Practical Application Contexts +- **๋ ˆ๊ฑฐ์‹œ React ์•ฑ ํ˜„๋Œ€ํ™”**: ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ์™€ Redux ๊ธฐ๋ฐ˜ ์•ฑ์„ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์™€ Zustand/Query ์ฒด์ œ๋กœ ์ „ํ™˜. +- **๊ธฐ์ˆ  ์Šคํƒ ๊ต์ฒด**: ๊ธฐ์กด ๋ผ์ด๋ธŒ ์„œ๋น„์Šค๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ ๋ฐฑ์—”๋“œ API ๋ช…์„ธ ๋ณ€๊ฒฝ์— ๋”ฐ๋ฅธ ํ”„๋ก ํŠธ์—”๋“œ ๋ฐ์ดํ„ฐ ๋ ˆ์ด์–ด ๋ฆฌํŒฉํ† ๋ง. + +### Adjacent Topics +- **Technical Debt Management** +- **Clean Code & Refactoring Patterns** +- **Strangler Fig Pattern in Software Architecture** diff --git a/10_Wiki/Topics/Software Architecture/Open-Closed Principle (OCP).md b/10_Wiki/Topics/Software Architecture/Open-Closed Principle (OCP).md new file mode 100644 index 00000000..461a7a2e --- /dev/null +++ b/10_Wiki/Topics/Software Architecture/Open-Closed Principle (OCP).md @@ -0,0 +1,41 @@ +## ๐Ÿ“Œ Brief Summary +๊ฐœ๋ฐฉ-ํ์‡„ ์›์น™(Open/Closed Principle, OCP)์€ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ์ฒด(ํด๋ž˜์Šค, ๋ชจ๋“ˆ, ํ•จ์ˆ˜ ๋“ฑ)๊ฐ€ **ํ™•์žฅ์—๋Š” ์—ด๋ ค ์žˆ์–ด์•ผ ํ•˜๊ณ , ์ˆ˜์ •์—๋Š” ๋‹ซํ˜€ ์žˆ์–ด์•ผ ํ•œ๋‹ค**๋Š” ์„ค๊ณ„ ์›์น™์ด๋‹ค. ์ด๋Š” ๊ธฐ์กด ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ ๋„ ์‹œ์Šคํ…œ์˜ ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•จ์„ ์˜๋ฏธํ•˜๋ฉฐ, React์—์„œ๋Š” ์ปดํฌ๋„ŒํŠธ ํ•ฉ์„ฑ(Composition)๊ณผ ์ฃผ์ž… ํŒจํ„ด์„ ํ†ตํ•ด ์ด๋ฅผ ์‹คํ˜„ํ•œ๋‹ค. + +## ๐Ÿ“– Core Content +1. **ํ™•์žฅ์„ฑ๊ณผ ํ์‡„์„ฑ (Open & Closed)** + - ์‹ ๊ทœ ๊ธฐ๋Šฅ ์ถ”๊ฐ€ ์‹œ ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š์Œ์œผ๋กœ์จ ์˜๋„์น˜ ์•Š์€ ๋ฒ„๊ทธ ๋ฐœ์ƒ(Side Effects)์„ ์›์ฒœ ์ฐจ๋‹จํ•œ๋‹ค. + - ๊ธฐ์กด ๊ธฐ๋Šฅ์˜ ์•ˆ์ •์„ฑ์„ ์œ ์ง€ํ•˜๋ฉด์„œ๋„ ๋ณ€ํ™”ํ•˜๋Š” ์š”๊ตฌ์‚ฌํ•ญ์— ์œ ์—ฐํ•˜๊ฒŒ ๋Œ€์‘ํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ ๋ชฉ์ ์ด๋‹ค. +2. **React์—์„œ์˜ ๊ตฌํ˜„: ์ปดํฌ๋„ŒํŠธ ํ•ฉ์„ฑ (Composition)** + - ์ƒ์†์ด ์•„๋‹Œ ํ•ฉ์„ฑ์„ ๊ถŒ์žฅํ•˜๋Š” React์˜ ํŠน์„ฑ์— ๋”ฐ๋ผ, `children` prop์„ ํ™œ์šฉํ•˜์—ฌ ์™ธ๋ถ€์—์„œ ๋ Œ๋”๋ง ๋‚ด์šฉ์„ ์ฃผ์ž…๋ฐ›๋Š” ๋ฐฉ์‹์œผ๋กœ ํ™•์žฅ์„ฑ์„ ํ™•๋ณดํ•œ๋‹ค. + - ์˜ˆ: ๊ธฐ๋ณธ Modal ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ , ๋‚ด๋ถ€ ์ฝ˜ํ…์ธ ๋ฅผ `children`์œผ๋กœ ์ „๋‹ฌํ•˜์—ฌ ๋‹ค์–‘ํ•œ ํ˜•ํƒœ์˜ ๋ชจ๋‹ฌ๋กœ ํ™•์žฅ. +3. **Render Props ๋ฐ Slot ํŒจํ„ด** + - ๊ตฌ์ฒด์ ์ธ ๋กœ์ง์ด๋‚˜ UI ์กฐ๊ฐ์„ ํ•จ์ˆ˜๋‚˜ ๊ฐ์ฒด ํ˜•ํƒœ๋กœ ์ฃผ์ž…๋ฐ›์•„ ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€ ์†Œ์Šค ์ฝ”๋“œ์˜ ์ˆ˜์ • ์—†์ด ๋™์ž‘์„ ๋ณ€๊ฒฝํ•œ๋‹ค. +4. **์„ ์–ธ์  ์ถ”์ƒํ™”** + - ์กฐ๊ฑด๋ฌธ(`if/else`)์„ ํ†ตํ•ด ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ ๋ชจ๋“  ์ผ€์ด์Šค๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋Œ€์‹ , ์™ธ๋ถ€์—์„œ ์ฃผ์ž…๋œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ฐ์ž์˜ ์ฑ…์ž„์„ ๋‹คํ•˜๋„๋ก ์„ค๊ณ„ํ•œ๋‹ค. + +## โš–๏ธ Trade-offs & Caveats +- **์ถ”์ƒํ™” ์˜ค๋ฒ„ํ—ค๋“œ**: OCP๋ฅผ ์—„๊ฒฉํžˆ ์ง€ํ‚ค๊ธฐ ์œ„ํ•ด ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ•ฉ์„ฑ ๊ตฌ์กฐ๋กœ ๋งŒ๋“ค๋ฉด, ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ๊ฐ€ ๊นŠ์–ด์ง€๊ณ  `props` ์ „๋‹ฌ ๊ฒฝ๋กœ๊ฐ€ ๋ณต์žกํ•ด์ง€๋Š” 'Prop Drilling'์ด๋‚˜ ์ธ์ง€์  ๋ถ€ํ•˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. +- **KISS ์›์น™๊ณผ์˜ ์ถฉ๋Œ**: ๋‹จ์ˆœํ•œ ๊ธฐ๋Šฅ ์ถ”๊ฐ€๋ฅผ ์œ„ํ•ด ๋ณต์žกํ•œ Render Props๋‚˜ ๊ณ ์ฐจ ์ปดํฌ๋„ŒํŠธ(HOC)๋ฅผ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์€ 'Keep It Simple' ์›์น™์— ์–ด๊ธ‹๋‚  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ ์ ˆํ•œ ๊ท ํ˜•์ด ํ•„์š”ํ•˜๋‹ค. +- **์ดˆ๊ธฐ ์„ค๊ณ„ ๋น„์šฉ**: ํ™•์žฅ์„ ๊ณ ๋ คํ•œ ์ธํ„ฐํŽ˜์ด์Šค ์„ค๊ณ„๋Š” ์ดˆ๊ธฐ ๊ฐœ๋ฐœ ์‹œ๊ฐ„์„ ๋” ๋งŽ์ด ์†Œ์š”ํ•˜๊ฒŒ ๋งŒ๋“ค๋ฉฐ, ๋ฏธ๋ž˜์— ๋ฐœ์ƒํ•˜์ง€ ์•Š์„ ํ™•์žฅ์„ ๋Œ€๋น„ํ•˜๋Š” YAGNI ์œ„๋ฐ˜ ๊ฐ€๋Šฅ์„ฑ์ด ์กด์žฌํ•œ๋‹ค. + +## ๐Ÿ”— Knowledge Connections +### Related Concepts +- **Component Composition**: OCP๋ฅผ ์‹คํ˜„ํ•˜๋Š” React์˜ ํ•ต์‹ฌ ๊ธฐ์ˆ  (๊ด€๊ณ„: ์‹ค์ฒœ ๋ฐฉ๋ฒ•) +- **SOLID Principles**: OCP๋ฅผ ํฌํ•จํ•œ 5๋Œ€ ์„ค๊ณ„ ์›์น™ (๊ด€๊ณ„: ์ƒ์œ„ ์ฒ ํ•™) +- **Render Props / Children Prop**: ๊ธฐ๋Šฅ ์ฃผ์ž…์„ ์œ„ํ•œ ๊ตฌ์ฒด์  API (๊ด€๊ณ„: ๊ตฌํ˜„ ๋„๊ตฌ) + +### Deeper Research Questions +1. ์ปดํฌ๋„ŒํŠธ ํ•ฉ์„ฑ์„ ํ†ตํ•ด OCP๋ฅผ ์ค€์ˆ˜ํ•  ๋•Œ, ๊นŠ์€ ํŠธ๋ฆฌ์— ์˜ํ•œ ๋ฆฌ๋ Œ๋”๋ง ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ์ „๋žต์€? +2. ํ•จ์ˆ˜ํ˜• ํŒจ๋Ÿฌ๋‹ค์ž„์—์„œ 'Dependency Injection' ๊ฐœ๋…์ด OCP ๊ตฌํ˜„์— ์–ด๋–ป๊ฒŒ ์ ์šฉ๋˜๋Š”๊ฐ€? +3. ์ˆ˜๋ฐฑ ๊ฐœ์˜ ์กฐ๊ฑด๋ถ€ UI๊ฐ€ ํ•„์š”ํ•œ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ํ™˜๊ฒฝ์—์„œ OCP๋ฅผ ์ง€ํ‚ค๊ธฐ ์œ„ํ•œ 'Strategy Pattern'์˜ ํ”„๋ก ํŠธ์—”๋“œ์  ํ•ด์„์€? +4. ์ฝ”๋“œ ์ˆ˜์ • ์—†์ด ํ™•์žฅ๋งŒ ํ—ˆ์šฉํ•˜๋Š” ์›์น™์ด ๋Œ€๊ทœ๋ชจ ๋ฆฌํŒฉํ† ๋ง์ด๋‚˜ ๊ธฐ์ˆ  ์Šคํƒ ๊ต์ฒด ์‹œ์—๋Š” ์–ด๋–ป๊ฒŒ ์œ ์—ฐํ•˜๊ฒŒ ์ ์šฉ๋˜์–ด์•ผ ํ•˜๋Š”๊ฐ€? +5. CSS-in-JS ํ™˜๊ฒฝ์—์„œ ์Šคํƒ€์ผ ํ™•์žฅ์„ OCP ๊ด€์ ์—์„œ ์„ค๊ณ„ํ•˜๋Š” ๋ชจ๋ฒ” ์‚ฌ๋ก€๋Š”? + +### Practical Application Contexts +- **UI ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค๊ณ„**: ๊ณตํ†ต ๋ฒ„ํŠผ, ๋ชจ๋‹ฌ, ํ…Œ์ด๋ธ” ์ปดํฌ๋„ŒํŠธ ์ œ์ž‘ ์‹œ ์Šคํƒ€์ผ๊ณผ ๋™์ž‘์„ ์™ธ๋ถ€์—์„œ ์ฃผ์ž… ๊ฐ€๋Šฅํ•˜๋„๋ก ์„ค๊ณ„. +- **๋ณต์žกํ•œ ํผ(Form) ์—”์ง„**: ์ƒˆ๋กœ์šด ์ž…๋ ฅ ํƒ€์ž…์ด ์ถ”๊ฐ€๋˜์–ด๋„ ๋ฉ”์ธ ํผ ๋กœ์ง์„ ์ˆ˜์ •ํ•  ํ•„์š” ์—†๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ ๋ฐฉ์‹ ๊ตฌ์กฐ ๊ตฌ์ถ•. + +### Adjacent Topics +- **Single Responsibility Principle (SRP)** +- **KISS (Keep It Simple, Stupid)** +- **Inversion of Control (IoC)** diff --git a/10_Wiki/Topics/Software Architecture/Software Engineering Principles.md b/10_Wiki/Topics/Software Architecture/Software Engineering Principles.md new file mode 100644 index 00000000..31da79a3 --- /dev/null +++ b/10_Wiki/Topics/Software Architecture/Software Engineering Principles.md @@ -0,0 +1,44 @@ +## ๐Ÿ“Œ Brief Summary +Software Engineering Principles(์†Œํ”„ํŠธ์›จ์–ด ์—”์ง€๋‹ˆ์–ด๋ง ์›์น™)๋Š” ์œ ์ง€๋ณด์ˆ˜ ๊ฐ€๋Šฅํ•˜๊ณ  ํ™•์žฅ ์šฉ์ดํ•œ ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•œ ํ•ต์‹ฌ ์„ค๊ณ„ ์ง€์นจ์ด๋‹ค. ํ”„๋ก ํŠธ์—”๋“œ ๋ฐ React ์ƒํƒœ๊ณ„์—์„œ๋Š” **SOLID**, **Clean Code**, **DRY**, **KISS**, **YAGNI** ์›์น™์„ ํ†ตํ•ด ์ฝ”๋“œ ๋ณต์žก์„ฑ์„ ์ œ์–ดํ•˜๊ณ  ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ UI์˜ ๋ช…ํ™•ํ•œ ๋ถ„๋ฆฌ๋ฅผ ๋‹ฌ์„ฑํ•œ๋‹ค. + +## ๐Ÿ“– Core Content +1. **SOLID Principles** + - **SRP (๋‹จ์ผ ์ฑ…์ž„)**: ํ•˜๋‚˜์˜ ์ปดํฌ๋„ŒํŠธ/๋ชจ๋“ˆ์€ ํ•˜๋‚˜์˜ ์ฑ…์ž„๋งŒ ๊ฐ–๋Š”๋‹ค (300์ค„ ๋ฃฐ ๋“ฑ). + - **OCP (๊ฐœ๋ฐฉ-ํ์‡„)**: ์ฝ”๋“œ ์ˆ˜์ • ์—†์ด ์ปดํฌ๋„ŒํŠธ ํ•ฉ์„ฑ ๋“ฑ์„ ํ†ตํ•ด ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•œ๋‹ค. + - **ISP (์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ)**: ํ•„์š”ํ•œ ์†์„ฑ(Props)๋งŒ ์ „๋‹ฌํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ์˜์กด์„ฑ์„ ์ œ๊ฑฐํ•œ๋‹ค. + - **DIP (์˜์กด์„ฑ ์—ญ์ „)**: ๊ตฌ์ฒด์  ๊ตฌํ˜„์ด ์•„๋‹Œ ์ถ”์ƒํ™”(Props, Context)์— ์˜์กดํ•œ๋‹ค. +2. **Clean Code** + - ๋ช…ํ™•ํ•œ ๋„ค์ด๋ฐ, ๋‚ฎ์€ ์ค‘์ฒฉ ๊ตฌ์กฐ, ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ํ•จ์ˆ˜ ์ž‘์„ฑ์„ ํ†ตํ•ด ๊ฐ€๋…์„ฑ์„ ํ™•๋ณดํ•œ๋‹ค. +3. **ํšจ์œจ์  ๊ฐœ๋ฐœ ์›์น™ (DRY, KISS, YAGNI)** + - **DRY**: ์ปค์Šคํ…€ ํ›… ๋“ฑ์œผ๋กœ ๋กœ์ง์„ ์žฌ์‚ฌ์šฉํ•˜๋˜ ๊ณผ๋„ํ•œ ์ถ”์ƒํ™”๋Š” ๊ฒฝ๊ณ„ํ•œ๋‹ค. + - **KISS**: ๋‹จ์ˆœํ•จ์„ ์œ ์ง€ํ•˜์—ฌ ๋””๋ฒ„๊น… ์šฉ์ด์„ฑ์„ ํ™•๋ณดํ•œ๋‹ค. + - **YAGNI**: ๋‹น์žฅ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ธฐ๋Šฅ(๋ฏธ๋ž˜ ์˜ˆ์ธก)์„ ๋ฏธ๋ฆฌ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์•„ ๊ธฐ์ˆ  ๋ถ€์ฑ„๋ฅผ ๋ฐฉ์ง€ํ•œ๋‹ค. +4. **์•„ํ‚คํ…์ฒ˜์  ์ ์šฉ (FSD)** + - ์—”์ง€๋‹ˆ์–ด๋ง ์›์น™์„ ํด๋” ๊ตฌ์กฐ์™€ ์˜์กด์„ฑ ๊ทœ์น™์œผ๋กœ ๊ตฌํ˜„ํ•˜์—ฌ ๋ชจ๋“ˆ ๊ฐ„ ์บก์Аํ™”๋ฅผ ๊ทน๋Œ€ํ™”ํ•œ๋‹ค. + +## โš–๏ธ Trade-offs & Caveats +- **DRY vs KISS**: ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“  ๋ณต์žกํ•œ ์ถ”์ƒํ™”๊ฐ€ ์˜คํžˆ๋ ค ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ๋–จ์–ด๋œจ๋ฆด ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, 'Rule of Three'(3๋ฒˆ ๋ฐ˜๋ณต ์‹œ ์ถ”์ถœ)๋ฅผ ๊ถŒ์žฅํ•œ๋‹ค. +- **YAGNI vs ํ™•์žฅ์„ฑ**: ๋ฏธ๋ž˜๋ฅผ ๋Œ€๋น„ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ž์นซ ์•„ํ‚คํ…์ฒ˜์˜ ์œ ์—ฐ์„ฑ์„ ๋–จ์–ด๋œจ๋ ค ๋‚˜์ค‘์— ๋” ํฐ ์ˆ˜์ • ๋น„์šฉ์„ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ ์ ˆํ•œ ๋ฐธ๋Ÿฐ์Šค๊ฐ€ ํ•„์š”ํ•˜๋‹ค. +- **์ถ”์ƒํ™”์˜ ๋น„์šฉ**: ์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ์™€ ์˜์กด์„ฑ ์—ญ์ „์„ ์ฒ ์ €ํžˆ ์ง€ํ‚ค๋ ค๋‹ค ๋ณด๋ฉด ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ๊ฐ€ ์ฆ๊ฐ€ํ•˜์—ฌ ๊ฐœ๋ฐœ ์†๋„๊ฐ€ ์ผ์‹œ์ ์œผ๋กœ ์ €ํ•˜๋  ์ˆ˜ ์žˆ๋‹ค. + +## ๐Ÿ”— Knowledge Connections +### Related Concepts +- **SOLID**: ์„ธ๋ถ€ ์„ค๊ณ„ ์›์น™์˜ ์ง‘ํ•ฉ (๊ด€๊ณ„: ์ƒ์œ„ ์›์น™) +- **Clean Code**: ๊ถ๊ทน์ ์ธ ์ฝ”๋“œ ์ƒํƒœ (๊ด€๊ณ„: ํ’ˆ์งˆ ๋ชฉํ‘œ) +- **Feature-Sliced Design (FSD)**: ์›์น™์˜ ๋ฌผ๋ฆฌ์  ๊ตฌํ˜„ (๊ด€๊ณ„: ๊ตฌ์กฐ์  ๋ฐฉ๋ฒ•๋ก ) + +### Deeper Research Questions +1. ํ•จ์ˆ˜ํ˜• React ํ™˜๊ฒฝ์—์„œ ์ƒ์†์ด ์—†๋Š” LSP(๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜)์™€ DIP(์˜์กด์„ฑ ์—ญ์ „)์˜ ์‹ค์งˆ์ ์ธ ๊ตฌํ˜„ ํŒจํ„ด์€? +2. '์ถ”์ƒํ™”์˜ ๋น„์šฉ'์ด ์‹ค์ œ ํ”„๋กœ์ ํŠธ์˜ ์œ ์ง€๋ณด์ˆ˜ ๋น„์šฉ(TCO)์„ ์•ž์ง€๋ฅด๋Š” ์ž„๊ณ„์ ์€ ์–ด๋–ป๊ฒŒ ํŒ๋‹จํ•˜๋Š”๊ฐ€? +3. ์• ์ž์ผ ํ™˜๊ฒฝ์—์„œ YAGNI ์›์น™์„ ์ง€ํ‚ค๋ฉด์„œ๋„ '๊ธฐ์ˆ ์  ๋Ÿฐ์›จ์ด(Architectural Runway)'๋ฅผ ํ™•๋ณดํ•˜๋Š” ๋ฐฉ๋ฒ•์€? +4. ์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›์น™(ISP)์„ ์œ„๋ฐ˜ํ•˜์—ฌ ๊ฑฐ๋Œ€ ๊ฐ์ฒด๋ฅผ Props๋กœ ๋„˜๊ธธ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ฆฌ๋ Œ๋”๋ง ์„ฑ๋Šฅ ์ €ํ•˜์˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜์€? +5. Clean Code ์›์น™์„ ํŒ€์›๋“ค ์‚ฌ์ด์—์„œ ๋™๊ธฐํ™”ํ•˜๊ธฐ ์œ„ํ•œ ์ž๋™ํ™”๋œ '์ฝ”๋“œ ์Šค๋ฉœ' ํƒ์ง€ ๋„๊ตฌ ํ™œ์šฉ ๋ฐฉ์•ˆ์€? + +### Practical Application Contexts +- **์‹ ๊ทœ ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐ ์„ค๊ณ„**: ์•„ํ‚คํ…์ฒ˜ ์›์น™ ์ˆ˜๋ฆฝ ๋ฐ ์ฝ”๋“œ ์ปจ๋ฒค์…˜ ๊ฐ•์ œ๋ฅผ ํ†ตํ•œ ํ’ˆ์งˆ ๊ธฐ๋ฐ˜ ๋งˆ๋ จ. +- **๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง**: ๋ƒ„์ƒˆ๋‚˜๋Š” ์ฝ”๋“œ๋ฅผ ์‹๋ณ„ํ•˜๊ณ  ์—”์ง€๋‹ˆ์–ด๋ง ์›์น™์— ๋”ฐ๋ผ ๊ตฌ์กฐํ™” ๋ฐ ๋ถ„ํ•ด. + +### Adjacent Topics +- **Design Patterns in Frontend** +- **Refactoring Techniques** +- **Test Driven Development (TDD)** diff --git a/10_Wiki/Topics/Software Architecture/Startup Projects.md b/10_Wiki/Topics/Software Architecture/Startup Projects.md new file mode 100644 index 00000000..06042329 --- /dev/null +++ b/10_Wiki/Topics/Software Architecture/Startup Projects.md @@ -0,0 +1,40 @@ +## ๐Ÿ“Œ Brief Summary +์Šคํƒ€ํŠธ์—… ํ”„๋กœ์ ํŠธ(Startup Projects)๋Š” ์ œํ•œ๋œ ๋ฆฌ์†Œ์Šค์™€ ์‹œ๊ฐ„ ๋‚ด์— ๋น ๋ฅธ ์‹œ์žฅ ๊ฒ€์ฆ(MVP)์„ ๋ชฉํ‘œ๋กœ ํ•˜๋Š” ๊ณ ์† ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์ด๋‹ค. ์š”๊ตฌ์‚ฌํ•ญ์ด ์ˆ˜์‹œ๋กœ ๋ณ€ํ•˜๋Š” ํŠน์„ฑ์— ๋งž์ถฐ, ๋‹จ์ˆœํ•˜๋ฉด์„œ๋„ ํ™•์žฅ์„ฑ ์žˆ๋Š” ๊ธฐ์ˆ  ์Šคํƒ(Zustand ๋“ฑ)๊ณผ ์‹ค์šฉ์ ์ธ ๊ฐœ๋ฐœ ์›์น™(YAGNI, ๋‹จ์ˆœ ๋ธŒ๋žœ์น˜ ์ „๋žต)์„ ์ฑ„ํƒํ•˜์—ฌ ๋ฏผ์ฒฉ์„ฑ์„ ํ™•๋ณดํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ด๋‹ค. + +## ๐Ÿ“– Core Content +1. **์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ์˜ ์‹ค์šฉ์  ์„ ํƒ** + - ์ดˆ๊ธฐ๋ถ€ํ„ฐ ๋ณต์žกํ•œ Redux๋ฅผ ๋„์ž…ํ•˜๊ธฐ๋ณด๋‹ค, ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ๊ฐ€ ์ ๊ณ  ๋น ๋ฅธ ๋ฐฐํฌ๊ฐ€ ๊ฐ€๋Šฅํ•œ **Zustand**๋ฅผ ํ™œ์šฉํ•˜์—ฌ MVP๋ฅผ ์‹ ์†ํžˆ ๊ตฌ์ถ•ํ•œ๋‹ค. +2. **YAGNI ์›์น™์˜ ์ฒ ์ €ํ•œ ์ค€์ˆ˜** + - ๋ฏธ๋ž˜์˜ ๋ถˆํ™•์‹คํ•œ ์š”๊ตฌ์‚ฌํ•ญ์„ ๋ฏธ๋ฆฌ ๋Œ€๋น„ํ•œ ์˜ค๋ฒ„์—”์ง€๋‹ˆ์–ด๋ง์„ ์ง€์–‘ํ•˜๊ณ , ํ˜„์žฌ ๋‹น์žฅ ํ•„์š”ํ•œ ํ•ต์‹ฌ ๊ธฐ๋Šฅ ๊ตฌํ˜„์—๋งŒ ์ง‘์ค‘ํ•œ๋‹ค. +3. **๋น„์šฉ ํšจ์œจ์  ๋ชจ๋‹ˆํ„ฐ๋ง** + - Sentry์˜ ๋ฌด๋ฃŒ ํ‹ฐ์–ด๋‚˜ ์ดˆ๊ธฐ ๋น„์šฉ์ด ์ €๋ ดํ•œ ์˜คํ”ˆ์†Œ์Šค/ํด๋ผ์šฐ๋“œ ๋Œ€์•ˆ(SigNoz ๋“ฑ)์„ ํ™œ์šฉํ•˜์—ฌ ํ”„๋กœ๋•์…˜ ์•ˆ์ •์„ฑ์„ ํ™•๋ณดํ•˜๋ฉด์„œ ์ง€์ถœ์„ ๊ด€๋ฆฌํ•œ๋‹ค. +4. **๋ฏผ์ฒฉํ•œ ํ˜‘์—… ํ”„๋กœ์„ธ์Šค** + - ๋ณต์žกํ•œ Git Flow ๋Œ€์‹  ๋‹จ์ˆœํ•œ **Feature-branch workflow**๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ์†๋„๋ฅผ ๋†’์ด๊ณ  ๋ณ‘ํ•ฉ ์ถฉ๋Œ์„ ์ตœ์†Œํ™”ํ•œ๋‹ค. + - ์งง์€ ์ˆ˜๋ช…์˜ ๋ธŒ๋žœ์น˜์™€ Squash Merge๋ฅผ ํ†ตํ•ด ๊นจ๋—ํ•œ main ์ด๋ ฅ์„ ์œ ์ง€ํ•œ๋‹ค. + +## โš–๏ธ Trade-offs & Caveats +- **๊ธฐ์ˆ ์  ๋ถ€์ฑ„์˜ ์ถ•์ **: ๋น ๋ฅธ ๋ฐฐํฌ๋ฅผ ์œ„ํ•œ ๋‹จ์ˆœํ•œ ์„ค๊ณ„๊ฐ€ ์„œ๋น„์Šค ์„ฑ์žฅ ์‹œ์ ์—์„œ ์„ฑ๋Šฅ์ด๋‚˜ ํ™•์žฅ์„ฑ ๋ณ‘๋ชฉ์„ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์ ์ ˆํ•œ ์‹œ๊ธฐ์˜ ๋ฆฌํŒฉํ† ๋ง ๊ณ„ํš์ด ๋ณ‘ํ–‰๋˜์–ด์•ผ ํ•œ๋‹ค. +- **๋„๊ตฌ์˜ ํ•œ๊ณ„**: Zustand์™€ ๊ฐ™์€ ๊ฐ€๋ฒผ์šด ๋„๊ตฌ๋Š” ๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ ๋•Œ ์—„๊ฒฉํ•œ ๊ตฌ์กฐ์  ์ œ์•ฝ์ด ๋ถ€์กฑํ•˜์—ฌ ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ํŒŒํŽธํ™”๋  ์œ„ํ—˜์ด ์žˆ๋‹ค. +- **์˜ค๋ฒ„์—”์ง€๋‹ˆ์–ด๋ง์˜ ์œ ํ˜น**: ์ตœ์‹  ๊ธฐ์ˆ ์ด๋‚˜ ๋ณต์žกํ•œ ์•„ํ‚คํ…์ฒ˜(FSD ๋“ฑ)๋ฅผ ๋ฌด๋ถ„๋ณ„ํ•˜๊ฒŒ ๋„์ž…ํ•  ๊ฒฝ์šฐ ์Šคํƒ€ํŠธ์—…์˜ ์ตœ๋Œ€ ์ž์‚ฐ์ธ '์†๋„'๋ฅผ ์žƒ์„ ์ˆ˜ ์žˆ๋‹ค. + +## ๐Ÿ”— Knowledge Connections +### Related Concepts +- **Zustand**: ์Šคํƒ€ํŠธ์—…์— ์ ํ•ฉํ•œ ๊ฐ€๋ฒผ์šด ์ƒํƒœ ๊ด€๋ฆฌ (๊ด€๊ณ„: ๊ถŒ์žฅ ๋„๊ตฌ) +- **YAGNI**: ์ž์› ๋‚ญ๋น„๋ฅผ ๋ง‰๋Š” ํ•ต์‹ฌ ์›์น™ (๊ด€๊ณ„: ์„ค๊ณ„ ์ฒ ํ•™) +- **Feature-branch workflow**: ์†Œ๊ทœ๋ชจ ํŒ€ ํ˜‘์—… ์ตœ์ ํ™” (๊ด€๊ณ„: ํ”„๋กœ์„ธ์Šค ๋ชจ๋ธ) + +### Deeper Research Questions +1. Zustand ๊ธฐ๋ฐ˜ MVP๊ฐ€ ๋Œ€๊ทœ๋ชจ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ๊ธ‰(Scale-up)์œผ๋กœ ์ „ํ™˜๋  ๋•Œ ๋งˆ์ฃผํ•˜๋Š” ๊ธฐ์ˆ ์  ์ž„๊ณ„์ ๊ณผ ์ „ํ™˜ ์‹œ๋‚˜๋ฆฌ์˜ค๋Š”? +2. YAGNI๋ฅผ ๊ณ ์ˆ˜ํ•˜๋ฉด์„œ๋„ '์ˆ˜์ •ํ•˜๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ'๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ๋ฏธ๋ž˜์˜ ๋ณ€ํ™” ๊ฐ€๋Šฅ์„ฑ์„ ์—ด์–ด๋‘๋Š” ๊ตฌ์ฒด์  ๊ธฐ๋ฒ•์€? +3. ์Šคํƒ€ํŠธ์—… ํ™˜๊ฒฝ์—์„œ FSD์™€ ๊ฐ™์€ ์—„๊ฒฉํ•œ ์•„ํ‚คํ…์ฒ˜๊ฐ€ ๊ฐœ๋ฐœ ์†๋„์— ๋ฏธ์น˜๋Š” ์‹ค์ œ ์˜ํ–ฅ๊ณผ ๋„์ž… ์‹œ์ ์€ ์–ธ์ œ์ธ๊ฐ€? +4. ์ดˆ๊ธฐ ๋น„์šฉ์„ ์•„๋ผ๊ธฐ ์œ„ํ•ด ์ฑ„ํƒํ•œ ์˜คํ”ˆ์†Œ์Šค ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ๊ฐ€ ์šด์˜ ๋ถ€ํ•˜๋กœ ๋Œ์•„์˜ฌ ๋•Œ์˜ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„ ๊ณ„์‚ฐ๋ฒ•์€? +5. ์†Œ์ˆ˜ ์ธ์› ํŒ€์—์„œ ์ฝ”๋“œ ๋ฆฌ๋ทฐ์˜ ํ’ˆ์งˆ๊ณผ ์†๋„ ์‚ฌ์ด์˜ ๊ท ํ˜•์„ ๋งž์ถ”๊ธฐ ์œ„ํ•œ ์ž๋™ํ™”(Lint, CI)์˜ ์ตœ์†Œ ๋ฒ”์œ„๋Š”? + +### Practical Application Contexts +- **MVP ์‹ ์† ๊ตฌ์ถ•**: ์ˆ˜ ์ฃผ ๋‚ด์— ์‹œ์žฅ ๋ฐ˜์‘์„ ํ™•์ธํ•ด์•ผ ํ•˜๋Š” ์‹ ๊ทœ ์„œ๋น„์Šค ๋Ÿฐ์นญ. +- **์†Œ๊ทœ๋ชจ ๊ฐœ๋ฐœํŒ€ ๋ฆฌ๋“œ**: 2~5์ธ ๊ทœ๋ชจ์˜ ์กฐ์ง์—์„œ ํ˜‘์—… ํšจ์œจ์„ ๊ทน๋Œ€ํ™”ํ•˜๋Š” ์›Œํฌํ”Œ๋กœ์šฐ ์ˆ˜๋ฆฝ. + +### Adjacent Topics +- **Agile Development & Scrum** +- **Minimum Viable Product (MVP) Strategy** +- **Technical Debt Management** diff --git a/10_Wiki/Topics/System Design & Modeling/system_analysis_and_improvement_plan.md b/10_Wiki/Topics/System Design & Modeling/system_analysis_and_improvement_plan.md new file mode 100644 index 00000000..ae32c17d --- /dev/null +++ b/10_Wiki/Topics/System Design & Modeling/system_analysis_and_improvement_plan.md @@ -0,0 +1,52 @@ +## ๐Ÿ“Œ Brief Summary +G1nation ํ”„๋กœ์ ํŠธ์˜ ๊ธฐ์ˆ ์  ๋ถ€์ฑ„๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ์‹œ์Šคํ…œ์˜ ๊ทผ๋ณธ์ ์ธ ์•ˆ์ •์„ฑ(Stability)๊ณผ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜(UX)์„ ๊ณ ๋„ํ™”ํ•˜๊ธฐ ์œ„ํ•œ ์ „๋žต์  ์‹คํ–‰ ๊ณ„ํš์ด๋‹ค. ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ ๋ถ€์žฌ, ์ƒํƒœ ๊ด€๋ฆฌ์˜ ํœ˜๋ฐœ์„ฑ, ํ…Œ์ŠคํŠธ ๋ถ€์žฌ ๋“ฑ ํ˜„์žฌ์˜ ํ•ต์‹ฌ ๋ณ‘๋ชฉ ์ง€์ ์„ ์ง„๋‹จํ•˜๊ณ , ์›์ž์  ์ž‘์—… ๋‹จ์œ„ ํ™•๋ณด์™€ ๊ตฌ์กฐํ™”๋œ ์˜ค๋ฅ˜ ๋ณด๊ณ  ์‹œ์Šคํ…œ ๊ตฌ์ถ•์„ ํ†ตํ•ด ์—์ด์ „ํŠธ์˜ ์‹ ๋ขฐ์„ฑ์„ 'Zero-Friction' ์ˆ˜์ค€์œผ๋กœ ๋Œ์–ด์˜ฌ๋ฆฌ๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•œ๋‹ค. + +## ๐Ÿ“– Core Content +1. **์‹ ๋ขฐ์„ฑ ๊ธฐ๋ฐ˜ ํŠธ๋žœ์žญ์…˜ ์‹œ์Šคํ…œ (Atomicity & Rollback)** + - **๋ฌธ์ œ**: ์ž‘์—… ์ค‘๋‹จ ์‹œ ๋ถ€๋ถ„์  ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•œ ๋ฐ์ดํ„ฐ ์˜ค์—ผ. + - **ํ•ด๊ฒฐ**: `TransactionManager` ๋„์ž…. `begin()` ๋‹จ๊ณ„์—์„œ ์ƒํƒœ ์Šค๋ƒ…์ƒท์„ ์ƒ์„ฑํ•˜๊ณ , ์‹คํŒจ ์‹œ `rollback()`์„ ํ†ตํ•ด ์ดˆ๊ธฐ ์ƒํƒœ๋กœ ๋ณต๊ตฌํ•˜๋Š” ์›์ž์„ฑ ํ™•๋ณด. +2. **์˜์†์  ์ƒํƒœ ๊ด€๋ฆฌ (Persistence & Context)** + - **๋ฌธ์ œ**: ์„ธ์…˜ ์ค‘๋‹จ ์‹œ ์ž‘์—… ๋งฅ๋ฝ ์†Œ์‹ค. + - **ํ•ด๊ฒฐ**: `SessionState` ์Šคํ‚ค๋งˆ ์ •์˜ ๋ฐ ๋””์Šคํฌ ๊ธฐ๋ฐ˜ ์‹ค์‹œ๊ฐ„ ์—…๋ฐ์ดํŠธ. ์ค‘๋‹จ ์ง€์ ๋ถ€ํ„ฐ ์ฆ‰์‹œ ์žฌ๊ฐœ ๊ฐ€๋Šฅํ•œ '์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ์–ต ์žฅ์น˜' ๊ตฌํ˜„. +3. **๊ตฌ์กฐํ™”๋œ ์˜ค๋ฅ˜ ์ง„๋‹จ ๋ฐ ๋ณด๊ณ ** + - **๋ฌธ์ œ**: ๋ชจํ˜ธํ•œ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋กœ ์ธํ•œ ๋””๋ฒ„๊น… ํšจ์œจ ์ €ํ•˜. + - **ํ•ด๊ฒฐ**: ์ปค์Šคํ…€ ์—๋Ÿฌ ํด๋ž˜์Šค(`AgentExecutionError` ๋“ฑ) ์ •์˜ ๋ฐ ์˜ค๋ฅ˜ ์œ ํ˜•, ์œ„์น˜, ์›์ธ์„ ํฌํ•จํ•œ ์ •ํ˜•ํ™”๋œ ๋ณด๊ณ ์„œ ์ƒ์„ฑ. +4. **์•Œ๊ณ ๋ฆฌ์ฆ˜์  ๋น„ํšจ์œจ์„ฑ ๊ฐœ์„  (Performance P1)** + - **๋ฌธ์ œ**: `DataProcessor.aggregate()` ๋“ฑ ํ•ต์‹ฌ ์ง‘๊ณ„ ํ•จ์ˆ˜์˜ $O(N^2)$ ๋ณต์žก๋„๋กœ ์ธํ•œ ์ง€์ˆ˜์  ์„ฑ๋Šฅ ์ €ํ•˜. + - **ํ•ด๊ฒฐ**: ํ•ด์‹œ ๋งต(Hash Map) ๊ธฐ๋ฐ˜ ์ธ๋ฑ์‹ฑ ๋„์ž…์„ ํ†ตํ•ด ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ $O(N)$์œผ๋กœ ์ตœ์ ํ™”ํ•˜๊ณ  CPU ๋ถ€ํ•˜ ์ตœ์†Œํ™”. +5. **์œ ์ง€๋ณด์ˆ˜์„ฑ ๋ฐ ๋ณต์žก๋„ ๊ด€๋ฆฌ (Architecture P2)** + - **๋ฌธ์ œ**: ๋ผ์šฐํŒ… ๋กœ์ง์˜ ๋†’์€ ์ˆœํ™˜ ๋ณต์žก๋„(CC > 15) ๋ฐ ์ธํ”„๋ผ-๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์˜ ๊ฐ•ํ•œ ๊ฒฐํ•ฉ. + - **ํ•ด๊ฒฐ**: ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)์— ๋”ฐ๋ฅธ ๋„๋ฉ”์ธ ์„œ๋น„์Šค ๋ถ„๋ฆฌ ๋ฐ ์ธํ„ฐํŽ˜์ด์Šค ๊ธฐ๋ฐ˜์˜ ๋А์Šจํ•œ ๊ฒฐํ•ฉ ๊ตฌํ˜„. +6. **ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ ๋ฐ ํ™˜๊ฒฝ ๊ทœ๊ฒฉํ™”** + - **๋ฌธ์ œ**: ํ…Œ์ŠคํŠธ ๋ถ€์žฌ ๋ฐ ํ™˜๊ฒฝ ์„ค์ • ํŒŒํŽธํ™”. + - **ํ•ด๊ฒฐ**: Jest ๊ธฐ๋ฐ˜ ํ…Œ์ŠคํŠธ ์ˆ˜ํŠธ ๊ตฌ์ถ•(Mocking ํ•„์ˆ˜), `config/` ๋ชจ๋“ˆํ™”๋ฅผ ํ†ตํ•œ ํ™˜๊ฒฝ๋ณ„ ์„ค์ • ๋ถ„๋ฆฌ ๋ฐ ์‹คํ–‰ ์ „ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ(Validator) ์ˆ˜ํ–‰. +7. **์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ๊ณ ๋„ํ™” (Transparency & Control)** + - **๋ฌธ์ œ**: ๋‚ด๋ถ€ ์ž‘๋™ ๊ณผ์ •์˜ ๋ถˆํˆฌ๋ช…์„ฑ ๋ฐ ์ œ์–ด๊ถŒ ๋ถ€์กฑ. + - **ํ•ด๊ฒฐ**: ์‹ค์‹œ๊ฐ„ ์ง„ํ–‰๋ฅ  ์œ„์ ฏ ์ œ๊ณต ๋ฐ `Dry Run Mode` ๋„์ž…์„ ํ†ตํ•œ ์‚ฌ์ „ ์Šน์ธ ํ”„๋กœ์„ธ์Šค ๊ฐ•ํ™”. + +## โš–๏ธ Trade-offs & Caveats +- **๊ตฌํ˜„ ๋ณต์žก๋„ ์ฆ๊ฐ€**: ํŠธ๋žœ์žญ์…˜ ๋ฐ ์ƒํƒœ ์˜์†ํ™” ๋กœ์ง ๋„์ž… ์‹œ ์ฝ”๋“œ ๋ฒ ์ด์Šค์˜ ๋ฒ ์ด์Šค๋ผ์ธ ๋ณต์žก๋„๊ฐ€ ์ƒ์Šนํ•˜๋ฉฐ, ์Šค๋ƒ…์ƒท ์ƒ์„ฑ์— ๋”ฐ๋ฅธ ๋ฏธ์„ธํ•œ ์„ฑ๋Šฅ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. +- **ํ…Œ์ŠคํŠธ ์œ ์ง€๋ณด์ˆ˜ ๋น„์šฉ**: Mocking ๊ธฐ๋ฐ˜์˜ ํ…Œ์ŠคํŠธ๋Š” ์‹ค์ œ ์‹œ์Šคํ…œ ๋ณ€๊ฒฝ ์‹œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋„ ํ•จ๊ป˜ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•˜๋Š” ๊ด€๋ฆฌ ๋น„์šฉ์ด ๋ฐœ์ƒํ•œ๋‹ค. +- **์‚ฌ์šฉ์ž ๊ฐ„์„ญ์˜ ์–‘๋‚ ์˜ ๊ฒ€**: `Dry Run` ๋ฐ ์Šน์ธ ๋‹จ๊ณ„๊ฐ€ ๋งŽ์•„์งˆ์ˆ˜๋ก ์•ˆ์ „์„ฑ์€ ๋†’์•„์ง€๋‚˜, ์ž๋™ํ™”์˜ ์†๋„์™€ ํ๋ฆ„(Flow)์ด ๋Š๊ธธ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ ์ ˆํ•œ ๋ฐธ๋Ÿฐ์Šค๊ฐ€ ํ•„์š”ํ•˜๋‹ค. + +## ๐Ÿ”— Knowledge Connections +### Related Concepts +- **ACID ์›์น™**: ํŠธ๋žœ์žญ์…˜ ์„ค๊ณ„์˜ ๊ทผ๋ณธ ์ฒ ํ•™ (๊ด€๊ณ„: ๊ตฌํ˜„ ๋ชจ๋ธ) +- **State Machine Architecture**: ์ƒํƒœ ์ „ํ™˜์˜ ๋ช…ํ™•์„ฑ์„ ์œ„ํ•œ ์„ค๊ณ„ ํŒจํ„ด (๊ด€๊ณ„: ํ™•์žฅ ๋ฐฉํ–ฅ) +- **Observability**: ์‹œ์Šคํ…œ ๋‚ด๋ถ€ ์ƒํƒœ๋ฅผ ์™ธ๋ถ€์—์„œ ํŒŒ์•…ํ•˜๋Š” ๋Šฅ๋ ฅ (๊ด€๊ณ„: UX ๊ฐœ์„ ) + +### Deeper Research Questions +1. ๋ถ„์‚ฐ ํ™˜๊ฒฝ์—์„œ์˜ ํŠธ๋žœ์žญ์…˜ ๋กค๋ฐฑ์„ ํŒŒ์ผ ์‹œ์Šคํ…œ ์ˆ˜์ค€์—์„œ ์–ด๋–ป๊ฒŒ ์ตœ์ ํ™”ํ•  ๊ฒƒ์ธ๊ฐ€? +2. ์—์ด์ „ํŠธ์˜ '๊ธฐ์–ต'์„ ๋ฒกํ„ฐ DB์™€ ๋กœ์ปฌ ์„ธ์…˜ ์ƒํƒœ ์‚ฌ์ด์—์„œ ์–ด๋–ป๊ฒŒ ํšจ์œจ์ ์œผ๋กœ ๋ถ„๋ฐฐํ•  ๊ฒƒ์ธ๊ฐ€? +3. ๊ฐ€์ƒ ํŒŒ์ผ ์‹œ์Šคํ…œ(VFS)์„ ์ด์šฉํ•œ Dry Run ์‹œ๋ฎฌ๋ ˆ์ด์…˜์˜ ์ •ํ™•๋„๋ฅผ ์–ด๋–ป๊ฒŒ ๋ณด์žฅํ•  ๊ฒƒ์ธ๊ฐ€? +4. ์„ค์ • ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ(Config Validation)๋ฅผ ๋Ÿฐํƒ€์ž„์ด ์•„๋‹Œ ๋นŒ๋“œ ํƒ€์ž„์— ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์•ˆ์€? +5. ์‚ฌ์šฉ์ž ๊ฐœ์ž…(Human-in-the-loop)์˜ ์ตœ์†Œํ™”์™€ ์‹œ์Šคํ…œ ์•ˆ์ •์„ฑ ์‚ฌ์ด์˜ ์ •๋Ÿ‰์  ์ž„๊ณ„์ ์€ ์–ด๋””์ธ๊ฐ€? + +### Practical Application Contexts +- **ConnectAI Extension**: VS Code ๋‚ด์—์„œ ์—์ด์ „ํŠธ์˜ ์ž‘์—… ์ง„ํ–‰ ์ƒํ™ฉ์„ ์‹œ๊ฐํ™”ํ•˜๊ณ  ์‚ฌ์šฉ์ž ์Šน์ธ์„ ๋ฐ›๋Š” ์ธํ„ฐํŽ˜์ด์Šค ์„ค๊ณ„ ์‹œ ์ ์šฉ. +- **CI/CD Pipeline**: PR ์ƒ์„ฑ ์‹œ ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€ ๋ฐ ์ •์  ๋ถ„์„ ๊ฒฐ๊ณผ๋ฅผ ๊ฒŒ์ดํŠธ๋กœ ํ™œ์šฉํ•˜๋Š” ์šด์˜ ๋งฅ๋ฝ. + +### Adjacent Topics +- **Error Boundary Pattern in React** +- **Git Internals (Snapshot & Rollback)** +- **Event-Driven Microservices Architecture** diff --git a/10_Wiki/Topics/Web & Performance/Bundle Size Optimization.md b/10_Wiki/Topics/Web & Performance/Bundle Size Optimization.md new file mode 100644 index 00000000..1307f0b0 --- /dev/null +++ b/10_Wiki/Topics/Web & Performance/Bundle Size Optimization.md @@ -0,0 +1,44 @@ +## ๐Ÿ“Œ Brief Summary +Bundle Size Optimization(๋ฒˆ๋“ค ํฌ๊ธฐ ์ตœ์ ํ™”)์€ ํด๋ผ์ด์–ธํŠธ๋กœ ์ „์†ก๋˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ž์‚ฐ์˜ ๋ฌผ๋ฆฌ์  ์šฉ๋Ÿ‰์„ ์ตœ์†Œํ™”ํ•˜์—ฌ ์ดˆ๊ธฐ ๋กœ๋”ฉ ์„ฑ๋Šฅ(LCP)๊ณผ ๋Ÿฐํƒ€์ž„ ๋ฐ˜์‘์„ฑ(TBT/INP)์„ ๊ฐœ์„ ํ•˜๋Š” ๊ธฐ์ˆ ์  ๊ณต์ •์ด๋‹ค. ์ฝ”๋“œ ๋ถ„ํ• (Code Splitting), ์ง€์—ฐ ๋กœ๋”ฉ(Lazy Loading), ํŠธ๋ฆฌ ์‰์ดํ‚น ๋“ฑ์„ ํ†ตํ•ด ๋ธŒ๋ผ์šฐ์ €์˜ ํŒŒ์‹ฑ ๋ฐ ์‹คํ–‰ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๊ทผ๋ณธ์ ์œผ๋กœ ์ค„์ด๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•œ๋‹ค. + +## ๐Ÿ“– Core Content +1. **๋ฒˆ๋“ค ํŒฝ์ฐฝ์˜ ์›์ธ ์ง„๋‹จ** + - ๋‹จ์ผ ์—”ํŠธ๋ฆฌ ํฌ์ธํŠธ(`index.js`)์— ๋ชจ๋“  ์ข…์†์„ฑ(React, heavy libraries)์ด ๊ฒฐํ•ฉ๋œ ๊ตฌ์กฐ. + - ๋ฌด๋ถ„๋ณ„ํ•œ Eager Import์™€ ๊ฑฐ๋Œ€ํ•œ ์ „์ด์  ์ข…์†์„ฑ(Transitive Dependencies)์œผ๋กœ ์ธํ•œ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ ์ ์œ ์œจ ์ƒ์Šน. +2. **์ฝ”๋“œ ๋ถ„ํ•  ๋ฐ ์ง€์—ฐ ๋กœ๋”ฉ (Strategic Splitting)** + - `React.lazy()`์™€ ``๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํŠน์ • ๋ผ์šฐํŠธ๋‚˜ ๋ฌด๊ฑฐ์šด UI ์š”์†Œ(์ฐจํŠธ, ๋ชจ๋‹ฌ ๋“ฑ)๋ฅผ ๋…๋ฆฝ์ ์ธ ์ฒญํฌ(Chunk)๋กœ ๋ถ„๋ฆฌ. + - ์‚ฌ์šฉ์ž๊ฐ€ ํ•„์š”๋กœ ํ•˜๋Š” ์‹œ์ ์—๋งŒ ์ฝ”๋“œ๋ฅผ ๋กœ๋“œํ•˜์—ฌ ์ดˆ๊ธฐ ๋ฒˆ๋“ค ํŽ˜์ด๋กœ๋“œ๋ฅผ ํš๊ธฐ์ ์œผ๋กœ ์ ˆ๊ฐ. +3. **๋ฒค๋” ๋ถ„ํ•  ์ „๋žต (Vendor Splitting)** + - Vite/Rollup์˜ `manualChunks` ์„ค์ •์„ ํ†ตํ•ด ์ž์ฃผ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ํ•ต์‹ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(React ๋“ฑ)๋ฅผ ๋ณ„๋„์˜ ์ฒญํฌ๋กœ ๊ณ ์ •. + - ๋ธŒ๋ผ์šฐ์ € ์บ์‹ฑ ํšจ์œจ์„ ๊ทน๋Œ€ํ™”ํ•˜์—ฌ ์žฌ๋ฐฉ๋ฌธ์ž์˜ ๋กœ๋”ฉ ์†๋„๋ฅผ ๊ฐ€์†ํ™”. +4. **์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ(RSC)๋ฅผ ํ†ตํ•œ ๊ทผ๋ณธ์  ์ ˆ๊ฐ** + - ์ƒํ˜ธ์ž‘์šฉ์ด ์—†๋Š” ์ •์  UI๋ฅผ ์„œ๋ฒ„์—์„œ ๋ Œ๋”๋งํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ๋กœ ์ „์†ก๋˜๋Š” JS ํŽ˜์ด๋กœ๋“œ๋ฅผ '0'์œผ๋กœ ์ˆ˜๋ ด์‹œํ‚ค๋Š” ์•„ํ‚คํ…์ฒ˜ ์ ์šฉ. +5. **๋ถ„์„ ๋ฐ ์ •์ œ ๋„๊ตฌ ํ™œ์šฉ** + - `rollup-plugin-visualizer` ๋˜๋Š” Webpack Bundle Analyzer๋ฅผ ํ†ตํ•ด ๋ฒˆ๋“ค ๋‚ด๋ถ€์˜ 'Bloat'์„ ์‹œ๊ฐ์ ์œผ๋กœ ์‹๋ณ„ํ•˜๊ณ  ์ œ๊ฑฐ. + +## โš–๏ธ Trade-offs & Caveats +- **์›Œํ„ฐํด(Waterfall) ํ˜„์ƒ**: ์ง€์—ฐ ๋กœ๋”ฉ์„ ๋‚จ๋ฐœํ•  ๊ฒฝ์šฐ ์ฒญํฌ ๊ฐ„์˜ ์˜์กด์„ฑ์œผ๋กœ ์ธํ•ด ์ˆœ์ฐจ์  ๋กœ๋”ฉ ์ง€์—ฐ์ด ๋ฐœ์ƒํ•˜์—ฌ ์ฒด๊ฐ ์„ฑ๋Šฅ์ด ์˜คํžˆ๋ ค ์ €ํ•˜๋  ์ˆ˜ ์žˆ๋‹ค. +- **๋„คํŠธ์›Œํฌ ์š”์ฒญ ์ˆ˜ ์ฆ๊ฐ€**: ๋ฒˆ๋“ค์„ ๋„ˆ๋ฌด ์ž‘๊ฒŒ ์ชผ๊ฐœ๋ฉด HTTP ์š”์ฒญ ์ˆ˜๊ฐ€ ๊ธ‰์ฆํ•˜์—ฌ ๋„คํŠธ์›Œํฌ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ ์ ˆํ•œ ์ฒญํฌ ์‚ฌ์ด์ฆˆ(์˜ˆ: 30KB~100KB) ์œ ์ง€๊ฐ€ ํ•„์š”ํ•˜๋‹ค. +- **์บ์‹œ ๋ฌดํšจํ™” ๊ด€๋ฆฌ**: ์ฒญํฌ ๋ถ„ํ•  ์ „๋žต์ด ์ž˜๋ชป๋  ๊ฒฝ์šฐ ์ž‘์€ ์ฝ”๋“œ ์ˆ˜์ •์—๋„ ๋ชจ๋“  ๋ฒค๋” ์ฒญํฌ์˜ ํ•ด์‹œ๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด ์บ์‹œ ํšจ์œจ์ด ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค. + +## ๐Ÿ”— Knowledge Connections +### Related Concepts +- **Code Splitting**: ๋ฒˆ๋“ค์„ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ตฌํ˜„ ํŒจํ„ด (๊ด€๊ณ„: ์‹ค์ฒœ ๋ฐฉ๋ฒ•) +- **Core Web Vitals**: ๋ฒˆ๋“ค ์ตœ์ ํ™”์˜ ์„ฑ๊ณต ์—ฌ๋ถ€๋ฅผ ์ธก์ •ํ•˜๋Š” ์ •๋Ÿ‰์  ์ง€ํ‘œ (๊ด€๊ณ„: ์„ฑ๋Šฅ ํ‰๊ฐ€) +- **Hydration**: ๋ฒˆ๋“ค ํฌ๊ธฐ๊ฐ€ ํด์ˆ˜๋ก ์ง์ ‘์ ์œผ๋กœ ์ง€์—ฐ๋˜๋Š” ํด๋ผ์ด์–ธํŠธ ํ™œ์„ฑํ™” ๊ณผ์ • (๊ด€๊ณ„: ์ง์ ‘ ์˜ํ–ฅ) + +### Deeper Research Questions +1. Vite์˜ `manualChunks` ์„ค์ • ์‹œ ๋ณ€๋™ ์ฃผ๊ธฐ๊ฐ€ ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์„ ์–ด๋–ป๊ฒŒ ๊ทธ๋ฃนํ™”ํ•˜๋Š” ๊ฒƒ์ด ์บ์‹œ ํžˆํŠธ์œจ์— ๊ฐ€์žฅ ์œ ๋ฆฌํ•œ๊ฐ€? +2. `React.lazy`๋ฅผ ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ํŽ˜์นญ ๋กœ์ง๊ณผ ๊ฒฐํ•ฉํ•  ๋•Œ ๋ ˆ์ดํ„ด์‹œ๋ฅผ ์ตœ์†Œํ™”ํ•˜๋Š” ํ”„๋ฆฌํŽ˜์นญ(Prefetching) ์ „๋žต์€? +3. ํŠธ๋ฆฌ ์‰์ดํ‚น์ด ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” CommonJS ๊ธฐ๋ฐ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ESM ํ™˜๊ฒฝ์—์„œ ์–ด๋–ป๊ฒŒ ํšจ์œจ์ ์œผ๋กœ ๊ฒฉ๋ฆฌํ•  ๊ฒƒ์ธ๊ฐ€? +4. ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ ํ™˜๊ฒฝ์—์„œ ํด๋ผ์ด์–ธํŠธ ๋ฒˆ๋“ค์— ์˜๋„์น˜ ์•Š๊ฒŒ ํฌํ•จ๋˜๋Š” ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋กœ์ง์„ ์–ด๋–ป๊ฒŒ ์ •์ ์œผ๋กœ ๊ฐ์ง€ํ•  ๊ฒƒ์ธ๊ฐ€? +5. ๋ฒˆ๋“ค ์••์ถ• ๊ธฐ๋ฒ•(Gzip vs Brotli)๊ณผ ๋ฒˆ๋“ค ํฌ๊ธฐ ์ตœ์ ํ™” ์‚ฌ์ด์˜ ์‹ค์ œ ์‚ฌ์šฉ์ž ๋กœ๋”ฉ ์‹œ๊ฐ„ ์ƒ๊ด€๊ด€๊ณ„๋Š”? + +### Practical Application Contexts +- **Vite Configuration**: `vite.config.ts`์—์„œ Rollup ์˜ต์…˜์„ ์กฐ์ •ํ•˜์—ฌ ๋ฒค๋” ์ฒญํฌ ๋ถ„๋ฆฌ. +- **Performance Budgeting**: CI/CD ๋‹จ๊ณ„์—์„œ ํŠน์ • ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ ์ดˆ๊ณผ ์‹œ ๋นŒ๋“œ๋ฅผ ์‹คํŒจํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ์„ฑ๋Šฅ ์˜ˆ์‚ฐ ์„ค์ •. + +### Adjacent Topics +- **Brotli / Gzip Compression** +- **Tree Shaking & ES Modules** +- **HTTP/2 & HTTP/3 Multi-plexing** diff --git a/10_Wiki/Topics/Web & Performance/Frontend Observability & Logging.md b/10_Wiki/Topics/Web & Performance/Frontend Observability & Logging.md new file mode 100644 index 00000000..bafb7184 --- /dev/null +++ b/10_Wiki/Topics/Web & Performance/Frontend Observability & Logging.md @@ -0,0 +1,43 @@ +## ๐Ÿ“Œ Brief Summary +ํ”„๋ก ํŠธ์—”๋“œ ๊ด€์ธก์„ฑ(Frontend Observability) ๋ฐ ๋กœ๊น… ์‹œ์Šคํ…œ์€ ๋‹ค์–‘ํ•œ ๋ธŒ๋ผ์šฐ์ €์™€ ๊ธฐ๊ธฐ ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰๋˜๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋Ÿฐํƒ€์ž„ ๋™์ž‘์„ ๊ฐ€์‹œํ™”ํ•˜๋Š” ๊ธฐ์ˆ ์ด๋‹ค. ๋‹จ์ˆœํ•œ ์—๋Ÿฌ ์ถ”์ ์„ ๋„˜์–ด ์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด, ๋ถ„์‚ฐ ์ถ”์ , ์ง€๋Šฅํ˜• ์—๋Ÿฌ ๊ทธ๋ฃนํ™”๋ฅผ ํ†ตํ•ด ๋ณต์žกํ•œ ํ”„๋กœ๋•์…˜ ์˜ค๋ฅ˜์˜ ์›์ธ์„ ์‹ฌ์ธต ๋ถ„์„ํ•˜๊ณ  ์„œ๋น„์Šค ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•œ๋‹ค. + +## ๐Ÿ“– Core Content +1. **๊ด€์ธก์„ฑ์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ** + - **์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด (Session Replay)**: ์—๋Ÿฌ ๋ฐœ์ƒ ์ „์˜ DOM ๋ณ€๊ฒฝ, ๋„คํŠธ์›Œํฌ ์š”์ฒญ, ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ์˜์ƒ์ฒ˜๋Ÿผ ์žฌ์ƒํ•˜์—ฌ ์žฌํ˜„ ๊ฒฝ๋กœ๋ฅผ ํŒŒ์•…ํ•œ๋‹ค. + - **์ง€๋Šฅํ˜• ์—๋Ÿฌ ๊ทธ๋ฃนํ™”**: ๋…ธ์ด์ฆˆ๊ฐ€ ๋˜๋Š” ์ค‘๋ณต ์—๋Ÿฌ๋ฅผ ๋ฌถ์–ด ์‹ค์ œ ํ•ด๊ฒฐ์ด ํ•„์š”ํ•œ ๊ณ ์œ  ์ด์Šˆ์— ์ง‘์ค‘ํ•˜๊ฒŒ ํ•œ๋‹ค. + - **๋ถ„์‚ฐ ์ถ”์  (Distributed Tracing)**: ํ”„๋ก ํŠธ์—”๋“œ ์—๋Ÿฌ๋ฅผ ๋ฐฑ์—”๋“œ ํŠธ๋ ˆ์ด์Šค์™€ ์—ฐ๊ฒฐํ•˜์—ฌ ํ’€์Šคํƒ ๊ด€์ ์˜ ์žฅ์•  ์›์ธ์„ ์ง„๋‹จํ•œ๋‹ค. +2. **์ฃผ์š” ๋„๊ตฌ ๋ฐ ํŠน์ง•** + - **Sentry**: ๊ฐœ๋ฐœ์ž ์นœํ™”์ ์ธ ์—๋Ÿฌ ์ถ”์  ๋ฐ ๋ธŒ๋ ˆ๋“œํฌ๋Ÿผ(Breadcrumb) ๊ธฐ๋Šฅ ์ œ๊ณต. + - **LogRocket**: ๊ฐ•๋ ฅํ•œ ์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด์™€ ์ƒํƒœ ๋ณ€ํ™” ๊ธฐ๋ก์— ํŠนํ™”. + - **Datadog RUM**: ๋Œ€๊ทœ๋ชจ ํ™˜๊ฒฝ์˜ ํ’€์Šคํƒ ๊ด€์ธก์„ฑ ๋ฐ ์ง€ํ‘œ ํ†ตํ•ฉ ๊ด€๋ฆฌ. + - **SigNoz & Grafana**: OpenTelemetry ๊ธฐ๋ฐ˜์˜ ๊ฐœ๋ฐฉํ˜• ํ‘œ์ค€ ์ค€์ˆ˜ ๋ฐ ๋ฒค๋” ์ข…์† ๋ฐฉ์ง€. +3. **๋„์ž… ์‹œ ๊ณ ๋ ค์‚ฌํ•ญ** + - **์„ฑ๋Šฅ ์˜ค๋ฒ„ํ—ค๋“œ**: ๋กœ๊น… SDK๊ฐ€ ๋ธŒ๋ผ์šฐ์ € ๋กœ๋“œ ํƒ€์ž„์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ(์ตœ๋Œ€ 120ms ๋“ฑ)์„ ๊ฒ€ํ† ํ•ด์•ผ ํ•œ๋‹ค. + - **๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ**: ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ ์œ ์ถœ์„ ๋ง‰๊ธฐ ์œ„ํ•œ ๋ฐ์ดํ„ฐ ๋งˆ์Šคํ‚น ๋ฐ ํ”„๋ผ์ด๋ฒ„์‹œ ์ œ์–ด ์„ค์ •์ด ํ•„์ˆ˜์ ์ด๋‹ค. + +## โš–๏ธ Trade-offs & Caveats +- **๋น„์šฉ vs ๊ฐ€์‹œ์„ฑ**: Datadog ๋“ฑ ์ผ๋ถ€ ์œ ๋ฃŒ ๋„๊ตฌ๋Š” ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘๋Ÿ‰์— ๋”ฐ๋ผ ๋น„์šฉ์ด ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ์ฆ๊ฐ€ํ•˜๋ฏ€๋กœ, ์ค‘์š” ๋กœ๊ทธ๋งŒ ์„ ๋ณ„์ ์œผ๋กœ ์ˆ˜์ง‘ํ•˜๋Š” ์ „๋žต์ด ํ•„์š”ํ•˜๋‹ค. +- **์„ฑ๋Šฅ ์ €ํ•˜**: ๋ชจ๋“  ์‚ฌ์šฉ์ž ์ƒํ˜ธ์ž‘์šฉ์„ ๊ธฐ๋กํ•˜๋Š” ๋„๊ตฌ๋Š” ๋ธŒ๋ผ์šฐ์ €์˜ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ ์ ์œ ์œจ์„ ๋†’์—ฌ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์ €ํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค. +- **์„ค๊ณ„ ๋ณต์žก์„ฑ**: ์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด ๋„๊ตฌ ๋„์ž… ์‹œ ๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ๋ฅผ ์œ„ํ•œ ๋ณต์žกํ•œ ๋งˆ์Šคํ‚น ๊ทœ์น™ ์„ค์ •์ด ์šด์˜ ๋ถ€๋‹ด์œผ๋กœ ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. + +## ๐Ÿ”— Knowledge Connections +### Related Concepts +- **OpenTelemetry**: ๋ฒค๋” ์ข…์† ์—†๋Š” ๋ฐ์ดํ„ฐ ํ‘œ์ค€ (๊ด€๊ณ„: ๊ธฐ์ˆ  ๊ธฐ๋ฐ˜) +- **Session Replay**: ๋””๋ฒ„๊น… ์ปจํ…์ŠคํŠธ ํ™•๋ณด (๊ด€๊ณ„: ์ฃผ์š” ๊ธฐ๋Šฅ) +- **Distributed Tracing**: ํ’€์Šคํƒ ์žฅ์•  ์ง„๋‹จ (๊ด€๊ณ„: ํ™•์žฅ ๊ธฐ๋Šฅ) + +### Deeper Research Questions +1. SDK ๋„์ž…์ด ์‹ค์ œ ์‚ฌ์šฉ์ž์˜ TBT(Total Blocking Time) ๋ฐ LCP(Largest Contentful Paint)์— ๋ฏธ์น˜๋Š” ์ •๋Ÿ‰์  ์˜ํ–ฅ์€? +2. ์„ธ์…˜ ๋ฆฌํ”Œ๋ ˆ์ด ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ ์‹œ, ๋ณด์•ˆ ๊ทœ์ œ(GDPR, CCPA)๋ฅผ ์ค€์ˆ˜ํ•˜๋ฉด์„œ ์‹ค๋ฌด์— ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ํ™•๋ณดํ•˜๋Š” ์ตœ์ ์˜ ๋งˆ์Šคํ‚น ์ „๋žต์€? +3. ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง(SSR) ํ™˜๊ฒฝ์—์„œ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๋กœ๊ทธ๋ฅผ ์œ ๊ธฐ์ ์œผ๋กœ ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ํŠธ๋ ˆ์ด์Šค ID ์ „ํŒŒ ๊ธฐ๋ฒ•์€? +4. ์˜คํ”ˆ์†Œ์Šค ๊ธฐ๋ฐ˜ ๊ด€์ธก์„ฑ ๋„๊ตฌ(SigNoz ๋“ฑ)๋ฅผ ์ž์ฒด ๊ตฌ์ถ•ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์ธํ”„๋ผ ์œ ์ง€๋ณด์ˆ˜ ๋น„์šฉ๊ณผ ๊ด€๋ฆฌํ˜• ์„œ๋น„์Šค(Sentry ๋“ฑ)์˜ ๋น„์šฉ ํŽธ์ต ๋ถ„์„์€? +5. ์ˆ˜๋งŒ ๊ฐœ์˜ ์œ ์‚ฌ ์—๋Ÿฌ ์ค‘ '๋น„์ฆˆ๋‹ˆ์Šค์— ์น˜๋ช…์ ์ธ ์—๋Ÿฌ'๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์šฐ์„ ์ˆœ์œ„ํ™”ํ•˜๋Š” AI ๊ธฐ๋ฐ˜ ๊ทธ๋ฃนํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์›๋ฆฌ๋Š”? + +### Practical Application Contexts +- **ํ”„๋กœ๋•์…˜ ์žฅ์•  ๋””๋ฒ„๊น…**: ์žฌํ˜„์ด ์–ด๋ ค์šด ๊ฐ„ํ—์  ๋ฒ„๊ทธ๋‚˜ ์‚ฌ์šฉ์ž ํ™˜๊ฒฝ ์˜์กด์  ์—๋Ÿฌ ์‹ ์† ํ•ด๊ฒฐ. +- **์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง**: ์‚ฌ์šฉ์ž ์„ธ์…˜ ๋ฐ์ดํ„ฐ ๋ถ„์„์„ ํ†ตํ•œ ์‹ค์ œ ๋กœ๋”ฉ ๋ณ‘๋ชฉ ๊ตฌ๊ฐ„ ์‹๋ณ„ ๋ฐ ๊ฐœ์„ . + +### Adjacent Topics +- **Web & Performance Optimization** +- **Frontend Security & Privacy** +- **Error Boundaries & Resilience** diff --git a/10_Wiki/Topics/Web & Performance/Vite Build Optimization.md b/10_Wiki/Topics/Web & Performance/Vite Build Optimization.md new file mode 100644 index 00000000..5f051d3e --- /dev/null +++ b/10_Wiki/Topics/Web & Performance/Vite Build Optimization.md @@ -0,0 +1,39 @@ +## ๐Ÿ“Œ Brief Summary +Vite ๋นŒ๋“œ ๋ฒˆ๋“ค ์ตœ์ ํ™”๋Š” ์ดˆ๊ธฐ ๋กœ๋”ฉ ์†๋„์™€ ์บ์‹œ ํšจ์œจ์„ ๊ทน๋Œ€ํ™”ํ•˜๊ธฐ ์œ„ํ•ด JavaScript ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ค„์ด๊ณ  ๋กœ๋”ฉ ๊ตฌ์กฐ๋ฅผ ์ตœ์ ํ™”ํ•˜๋Š” ๊ณผ์ •์ด๋‹ค. Rollup ์˜ต์…˜์„ ํ†ตํ•œ ๋ฒค๋” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ถ„๋ฆฌ(`manualChunks`)์™€ ์ง€์—ฐ ๋กœ๋”ฉ(`React.lazy`)์„ ๊ฒฐํ•ฉํ•˜์—ฌ, ์‚ฌ์šฉ์ž๊ฐ€ ํ•„์š”ํ•œ ์‹œ์ ์— ํ•„์š”ํ•œ ์ฝ”๋“œ๋งŒ ๋‹ค์šด๋กœ๋“œํ•˜๋„๋ก ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ด๋‹ค. + +## ๐Ÿ“– Core Content +1. **๋Œ€๊ทœ๋ชจ ๋ฒˆ๋“ค ์ด์Šˆ ํ•ด๊ฒฐ** + - ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•˜๋‚˜์˜ ๊ฑฐ๋Œ€ํ•œ `index.js`๋กœ ๋ฌถ์ด๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์—ฌ FCP, LCP ๋“ฑ Core Web Vitals ์ง€ํ‘œ๋ฅผ ๊ฐœ์„ ํ•œ๋‹ค. +2. **manualChunks๋ฅผ ํ†ตํ•œ ๋ฒค๋” ๋ถ„๋ฆฌ** + - ์ž์ฃผ ๋ฐ”๋€Œ์ง€ ์•Š๋Š” `react`, `react-dom` ๋“ฑ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ณ„๋„ ์ฒญํฌ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ € ์บ์‹ฑ ํšจ์œจ์„ ๊ทน๋Œ€ํ™”ํ•œ๋‹ค. +3. **๋ผ์šฐํŠธ ๋ ˆ๋ฒจ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…** + - `React.lazy`์™€ ``๋ฅผ ํ™œ์šฉํ•ด ํŽ˜์ด์ง€ ๋‹จ์œ„๋กœ ์ฝ”๋“œ๋ฅผ ์ชผ๊ฐœ์–ด ์ดˆ๊ธฐ ์ง„์ž… ์‹œ ๋‹ค์šด๋กœ๋“œ๋˜๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ์ตœ์†Œํ™”ํ•œ๋‹ค. +4. **๋ฒˆ๋“ค ์‹œ๊ฐํ™” ๋ฐ ๋ถ„์„** + - `rollup-plugin-visualizer`๋ฅผ ํ†ตํ•ด ๋ฒˆ๋“ค ๋‚ด๋ถ€๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ๋ถ„์„ํ•˜๊ณ , ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋น„๋Œ€ํ•ด์ง„ ๋ชจ๋“ˆ์„ ์ฐพ์•„ ํŠธ๋ฆฌ ์‰์ดํ‚น(Tree-shaking)์„ ์ ์šฉํ•˜๊ฑฐ๋‚˜ ๋Œ€์ฒดํ•œ๋‹ค. + +## โš–๏ธ Trade-offs & Caveats +- **์ฒญํฌ ํŒŒํŽธํ™”**: ๋ฒˆ๋“ค์„ ๋„ˆ๋ฌด ์ž˜๊ฒŒ ์ชผ๊ฐค ๊ฒฝ์šฐ HTTP ์š”์ฒญ ํšŸ์ˆ˜๊ฐ€ ๊ธ‰์ฆํ•˜์—ฌ ์˜คํžˆ๋ ค ๋„คํŠธ์›Œํฌ ๋ณ‘๋ชฉ๊ณผ Waterfall ํ˜„์ƒ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. +- **๊ฐœ๋ฐœ vs ํ”„๋กœ๋•์…˜ ์ฐจ์ด**: Vite๋Š” ๊ฐœ๋ฐœ ์‹œ ๋„ค์ดํ‹ฐ๋ธŒ ESM์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ ํ”„๋กœ๋•์…˜์€ Rollup์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ, ๋นŒ๋“œ ๊ฒฐ๊ณผ๋ฌผ์—์„œ๋งŒ ๋ฐœ์ƒํ•˜๋Š” ์„ฑ๋Šฅ ์ด์Šˆ๋‚˜ ๊ฒฝ๊ณ ๋ฅผ ์ƒ์‹œ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค. +- **์บ์‹œ ๋ฌดํšจํ™”**: ๋ฒค๋” ๋ฒˆ๋“ค์„ ๋„ˆ๋ฌด ํฌ๊ฒŒ ๋ฌถ์œผ๋ฉด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ•˜๋‚˜๋งŒ ์—…๋ฐ์ดํŠธํ•ด๋„ ๊ฑฐ๋Œ€ํ•œ ๋ฒค๋” ํŒŒ์ผ ์ „์ฒด์˜ ์บ์‹œ๊ฐ€ ๋ฌดํšจํ™”๋˜๋Š” ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๊ฐ€ ์žˆ๋‹ค. + +## ๐Ÿ”— Knowledge Connections +### Related Concepts +- **Rollup**: Vite์˜ ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ ์—”์ง„ (๊ด€๊ณ„: ๊ตฌ๋™ ์›๋ฆฌ) +- **React.lazy & Suspense**: ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…์˜ ์‹ค์ฒœ ์ˆ˜๋‹จ (๊ด€๊ณ„: ๊ตฌํ˜„ ๋„๊ตฌ) +- **Core Web Vitals**: ์ตœ์ ํ™”์˜ ์ตœ์ข… ๋ชฉ์ ์ง€ (๊ด€๊ณ„: ์„ฑ๋Šฅ ์ง€ํ‘œ) + +### Deeper Research Questions +1. `manualChunks`๋ฅผ ์„ธ๋ฐ€ํ•˜๊ฒŒ ์„ค์ •ํ•  ๋•Œ, ๋„คํŠธ์›Œํฌ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ตœ์†Œํ™”ํ•˜๋ฉด์„œ ์บ์‹œ ํžˆํŠธ์œจ์„ ๊ทน๋Œ€ํ™”ํ•˜๋Š” ์ตœ์ ์˜ ์ฒญํฌ ํฌ๊ธฐ ๊ธฐ์ค€์€? +2. Vite์˜ ESM ๊ธฐ๋ฐ˜ ๊ฐœ๋ฐœ ์„œ๋ฒ„์™€ Rollup ๊ธฐ๋ฐ˜ ๋นŒ๋“œ ํ™˜๊ฒฝ ๊ฐ„์˜ ์ฐจ์ด๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” 'Silent Errors' ์‚ฌ๋ก€์™€ ๋ฐฉ์ง€์ฑ…์€? +3. ๋™์  ์ž„ํฌํŠธ๋กœ ์ชผ๊ฐœ์ง„ ์ฒญํฌ๋“ค์„ ์‚ฌ์šฉ์ž๊ฐ€ ํด๋ฆญํ•˜๊ธฐ ์ „์— ๋ฏธ๋ฆฌ ๋ถˆ๋Ÿฌ์˜ค๋Š” 'Prefetching' ์ „๋žต์˜ Vite ์ž๋™ํ™” ๋ฐฉ๋ฒ•์€? +4. ํŠธ๋ฆฌ ์‰์ดํ‚น์ด ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” CommonJS ๊ธฐ๋ฐ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ESM์œผ๋กœ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณ€ํ™˜ํ•˜๊ฑฐ๋‚˜ ๋Œ€์ฒดํ•˜๋Š” ๊ฐ€์ด๋“œ๋ผ์ธ์€? +5. HTTP/2 ๋˜๋Š” HTTP/3 ํ™˜๊ฒฝ์—์„œ ๋‹ค์ˆ˜์˜ ์ž‘์€ ์ฒญํฌ ์ „์†ก์ด ๋ฒˆ๋“ค๋ง๋œ ํ•˜๋‚˜์˜ ํฐ ํŒŒ์ผ ์ „์†ก๋ณด๋‹ค ์œ ๋ฆฌํ•ด์ง€๋Š” ๊ตฌ์ฒด์  ์กฐ๊ฑด์€? + +### Practical Application Contexts +- **์„ฑ๋Šฅ ๊ฒฝ๊ณ  ํ•ด๊ฒฐ**: "Chunks are larger than 500 kB" ๋นŒ๋“œ ๊ฒฝ๊ณ  ๋ฐœ์ƒ ์‹œ ์ฆ‰๊ฐ์ ์ธ ๋Œ€์‘. +- **์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ๊ฐœ์„ **: ๋А๋ฆฐ ๋„คํŠธ์›Œํฌ ํ™˜๊ฒฝ์˜ ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•œ ์ดˆ๊ธฐ ๋กœ๋”ฉ ์ตœ์ ํ™” ๋ฐ ์•ˆ์ •์  ์ธํ„ฐ๋ž™์…˜ ์ œ๊ณต. + +### Adjacent Topics +- **Service Worker & Caching Strategy** +- **React Server Components (RSC)** +- **Modern Build Tools (Turbopack, Rspack) Comparison**