diff --git a/01_Archive/2026-04-20/01_React-Foundation_Mental-Model.md b/01_Archive/2026-04-20/01_React-Foundation_Mental-Model.md new file mode 100644 index 00000000..9faf2764 --- /dev/null +++ b/01_Archive/2026-04-20/01_React-Foundation_Mental-Model.md @@ -0,0 +1,15 @@ +# ๐Ÿผ [LEVEL 1] ๋ฆฌ์•กํŠธ์˜ ์‹ฌ์žฅ: UI๋Š” ์ƒํƒœ(State)์˜ ํ•จ์ˆ˜๋‹ค + +## 1. ์ƒ๊ฐ์˜ ์ „ํ™˜: "์–ด๋–ป๊ฒŒ(How)"๊ฐ€ ์•„๋‹ˆ๋ผ "๋ฌด์—‡์„(What)" +- **HTML/JS ๋ฐฉ์‹**: "๋ฒ„ํŠผ์„ ์ฐพ์•„์„œ, ํด๋ฆญ ์ด๋ฒคํŠธ๋ฅผ ๊ฑธ๊ณ , ํ…์ŠคํŠธ๋ฅผ ๋ฐ”๊พผ๋‹ค." (๋ช…๋ นํ˜•) +- **๋ฆฌ์•กํŠธ ๋ฐฉ์‹**: "์ƒํƒœ๊ฐ€ `ON`์ด๋ฉด '์ผœ์ง'์„ ๋ณด์—ฌ์ฃผ๊ณ , `OFF`์ด๋ฉด '๊บผ์ง'์„ ๋ณด์—ฌ์ค€๋‹ค." (์„ ์–ธํ˜•) +- **๊ตํ›ˆ**: ์ค‘๊ธ‰ ์ฃผ๋‹ˆ์–ด๋Š” DOM์„ ์ง์ ‘ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค. ์˜ค์ง **์ƒํƒœ**๋งŒ ๊ฑด๋“œ๋ฆฐ๋‹ค. + +## 2. ๋ถˆ๋ณ€์„ฑ(Immutability): ์™œ `push`๋Š” ์•ˆ๋˜๋‚˜์š”? +- ๋ฆฌ์•กํŠธ๋Š” "๊ฐ’์ด ๋ฐ”๋€Œ์—ˆ๋„ค?"๋ฅผ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊ฐ’์œผ๋กœ ํŒ๋‹จํ•œ๋‹ค. +- `arr.push(1)`์€ ์ฃผ์†Œ๋Š” ๊ทธ๋Œ€๋กœ๊ณ  ๋‚ด์šฉ๋งŒ ๋ฐ”๋€๋‹ค. ๋ฆฌ์•กํŠธ๋Š” ๋ฐ”๋€ ์ค„ ๋ชจ๋ฅธ๋‹ค! +- **์ •๋‹ต**: `setArr([...arr, 1])` ์ฒ˜๋Ÿผ ํ•ญ์ƒ **์ƒˆ๋กœ์šด ๋ณต์‚ฌ๋ณธ**์„ ๋˜์ ธ๋ผ. + +## 3. ๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„: ๋ฌผ์€ ์œ„์—์„œ ์•„๋ž˜๋กœ ํ๋ฅธ๋‹ค. +- ๋ถ€๋ชจ๊ฐ€ ์ž์‹์—๊ฒŒ ์ฃผ๋Š” ๊ฑด `Props`. ์ž์‹์ด ๋ถ€๋ชจ๋ฅผ ๋ฐ”๊พธ๋ ค๋ฉด ๋ถ€๋ชจ๊ฐ€ ์ค€ `ํ•จ์ˆ˜`๋ฅผ ํ˜ธ์ถœํ•˜๋ผ. +- **ํ•˜์ง€ ๋ง ๊ฒƒ**: ์ž์‹์ด ๋ถ€๋ชจ์˜ ์ƒํƒœ๋ฅผ ๋ชฐ๋ž˜ ๋ฐ”๊พธ๋Š” '๋งค์ง'์€ ์‹œ์Šคํ…œ์„ ๋ง์นœ๋‹ค. diff --git a/01_Archive/2026-04-20/02_React-Hooks_Advanced-Patterns.md b/01_Archive/2026-04-20/02_React-Hooks_Advanced-Patterns.md new file mode 100644 index 00000000..5a748437 --- /dev/null +++ b/01_Archive/2026-04-20/02_React-Hooks_Advanced-Patterns.md @@ -0,0 +1,16 @@ +# ๐Ÿง  [LEVEL 2] Hook์˜ ์‹ฌ์—ฐ: ๋‹จ์ˆœ ์‚ฌ์šฉ์„ ๋„˜์–ด ์˜ค์šฉ ๋ฐฉ์ง€๋กœ + +## 1. `useEffect`๋Š” 'ํƒ€์ด๋จธ'๊ฐ€ ์•„๋‹ˆ๋‹ค. '๋™๊ธฐํ™”' ์žฅ์น˜๋‹ค. +- ์ดˆ๋ณด๋Š” `useEffect`๋ฅผ ํ•จ์ˆ˜ ์‹คํ–‰๊ธฐ๋กœ ์“ด๋‹ค. +- ์ค‘๊ธ‰์€ **"์ดํŽ™ํŠธ๊ฐ€ ์–ด๋–ค ์ƒํƒœ์™€ ์™ธ๋ถ€ ์‹œ์Šคํ…œ(API, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ)์„ ๋™๊ธฐํ™”ํ•˜๋Š”๊ฐ€?"**๋ฅผ ๊ณ ๋ฏผํ•œ๋‹ค. +- **Check**: ์˜์กด์„ฑ ๋ฐฐ์—ด(`[]`)์— ๋„ฃ์€ ๋ณ€์ˆ˜๊ฐ€ ์ •๋ง ์ด ์ดํŽ™ํŠธ์˜ ์›์ธ์ธ๊ฐ€? + +## 2. Custom Hooks: ๋…ผ๋ฆฌ์˜ ๋ถ„๋ฆฌ +- ์ปดํฌ๋„ŒํŠธ ์•ˆ์— `fetch`, `loading`, `error` ๊ฐ€ ๊ฐ€๋‹ฅ๊ฐ€๋‹ฅ ๋„๋ ค ์žˆ๋‹ค๋ฉด ์‹คํŒจ! +- `useFetchData()` ๋ผ๋Š” ๋‚˜๋งŒ์˜ ํ›…์„ ๋งŒ๋“ค์–ด ๋…ผ๋ฆฌ๋งŒ ์™ ๋ฝ‘์•„๋‚ด๋ผ. +- **์„ฑ๊ณต ๊ฐ€์ด๋“œ**: UI ๋‹ด๋‹น ์ปดํฌ๋„ŒํŠธ๋Š” `const { data } = useMyLogic();` ํ•œ ์ค„๋กœ ๋๋‚˜์•ผ ํ•œ๋‹ค. + +## 3. `useRef`: ์‚ฌ๋ผ์ง€์ง€ ์•Š๋Š” ๊ธฐ์–ต +- `useState`๋Š” ๋ฐ”๋€” ๋•Œ๋งˆ๋‹ค ํ™”๋ฉด์„ ๋‹ค์‹œ ๊ทธ๋ฆฐ๋‹ค(Refrender). +- `useRef`๋Š” ๊ฐ’์ด ๋ฐ”๋€Œ์–ด๋„ ํ™”๋ฉด์„ ๊ทธ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค. +- **์šฉ๋„**: ์ด์ „ ํ™”๋ฉด์˜ ๊ฐ’ ์ €์žฅ, DOM ์ง์ ‘ ์ ‘๊ทผ(ํฌ์ปค์Šค ๋“ฑ), ํƒ€์ด๋จธ ID ๋ณด๊ด€. diff --git a/01_Archive/2026-04-20/03_React-Architecture_Component-Patterns.md b/01_Archive/2026-04-20/03_React-Architecture_Component-Patterns.md new file mode 100644 index 00000000..006a6280 --- /dev/null +++ b/01_Archive/2026-04-20/03_React-Architecture_Component-Patterns.md @@ -0,0 +1,17 @@ +# ๐Ÿ—๏ธ [LEVEL 3] ์ปดํฌ๋„ŒํŠธ ์•„ํ‚คํ…์ฒ˜: ๋ฒฝ๋Œ ์Œ“๊ธฐ์—์„œ ์„ฑ ์ง“๊ธฐ๋กœ + +## 1. Props Drilling์„ ๋ฉˆ์ถฐ๋ผ! +- ํ• ์•„๋ฒ„์ง€๊ฐ€ ์†์ž์—๊ฒŒ ๋ฐ์ดํ„ฐ ์ฃผ๋ ค๊ณ  ์•„๋น , ์‚ผ์ดŒ์„ ๊ฑฐ์ณ๊ฐ€๋Š” ์ฝ”๋“œ๋Š” ์ฃ„์•…์ด๋‹ค. +- **ํ•ด๊ฒฐ์ฑ…**: `Context API`๋ฅผ ์“ฐ๊ฑฐ๋‚˜, **Component Composition(์ปดํฌ๋„ŒํŠธ ํ•ฉ์„ฑ)**์„ ์‚ฌ์šฉํ•˜๋ผ. +- ์•„์˜ˆ `} />` ์ฒ˜๋Ÿผ ์ž์‹์„ ํ†ต์งธ๋กœ ๋„˜๊ฒจ๋ผ. + +## 2. ๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ: Container-Presenter ํŒจํ„ด +- **Container**: ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ, ๋กœ์ง ์ฒ˜๋ฆฌ. (๋จธ๋ฆฌ) +- **Presenter**: CSS, ์Šคํƒ€์ผ, ๋ฐ์ดํ„ฐ ๋ณด์—ฌ์ฃผ๊ธฐ. (๋ชธํ†ต) +- **ํšจ๊ณผ**: ์Šคํƒ€์ผ๋งŒ ๋ฐ”๊พธ๊ณ  ์‹ถ์„ ๋•Œ ๋กœ์ง ์ฝ”๋“œ๋ฅผ ์•ˆ ๋ด๋„ ๋œ๋‹ค. + +## 3. Atomic Design ๋ง›๋ณด๊ธฐ +- `Atom`: ๋ฒ„ํŠผ, ์ž…๋ ฅ์ฐฝ (๊ฐ€์žฅ ์ž‘์€ ๋‹จ์œ„) +- `Molecule`: ๊ฒ€์ƒ‰๋ฐ” (Atom์˜ ๊ฒฐํ•ฉ) +- `Organism`: ํ—ค๋”, ํ‘ธํ„ฐ (๋ณต์žกํ•œ ๊ตฌ์กฐ) +- **๊ธฐ์ค€**: ์•„ํ†ฐ์€ ํ”„๋กœ์ ํŠธ ์–ด๋””์„œ๋“  ์“ฐ์ผ ์ˆ˜ ์žˆ๊ฒŒ **์ˆœ์ˆ˜(Pure)**ํ•ด์•ผ ํ•œ๋‹ค. diff --git a/01_Archive/2026-04-20/04_React-Performance_Optimization.md b/01_Archive/2026-04-20/04_React-Performance_Optimization.md new file mode 100644 index 00000000..7ac365a1 --- /dev/null +++ b/01_Archive/2026-04-20/04_React-Performance_Optimization.md @@ -0,0 +1,15 @@ +# โšก [LEVEL 4] ๋ Œ๋”๋ง ์ตœ์ ํ™”: "๋‚ด ์•ฑ์€ ์™œ ๋ ‰์ด ๊ฑธ๋ฆด๊นŒ?" + +## 1. ๋ Œ๋”๋ง์€ ๊ณต์งœ๊ฐ€ ์•„๋‹ˆ๋‹ค +- ๋ถ€๋ชจ๊ฐ€ ๊ทธ๋ ค์ง€๋ฉด ์ž์‹๋„ ๊ทธ๋ ค์ง„๋‹ค. ์ด๊ฒŒ ๊ณ„์†๋˜๋ฉด ์„ฑ๋Šฅ ํญ๋ฐœ์ด๋‹ค. +- `React.memo`: "๋„ˆ ์•„๊นŒ๋ž‘ ์ค€ ๊ฑฐ ๋˜‘๊ฐ™์€๋ฐ? ๋‹ค์‹œ ๊ทธ๋ฆฌ์ง€ ๋งˆ!" +- `useMemo`: ๋ณต์žกํ•œ ๊ณ„์‚ฐ ๊ฒฐ๊ณผ๋ฌผ ์žฌ์‚ฌ์šฉ. +- `useCallback`: ํ•จ์ˆ˜ ์žฌ์ƒ์„ฑ ๋ฐฉ์ง€. + +## 2. '์„ฑ๊ธ‰ํ•œ ์ตœ์ ํ™”'๋Š” ๋…์ด๋‹ค +- ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ์— `memo`๋ฅผ ๋ฐ”๋ฅด๋Š” ๊ฑด ๋ฉ์ฒญํ•œ ์ง“์ด๋‹ค. +- ์ง„์งœ ๋А๋ฆฐ ๋ถ€๋ถ„(๋ฆฌ์ŠคํŠธ 1000๊ฐœ ๋กœ๋”ฉ ๋“ฑ)์„ ์ฐพ์•„์„œ **ํ”„๋กœํŒŒ์ผ๋Ÿฌ(DevTools)**๋กœ ์ฐ์–ด๋ณด๊ณ  ์ตœ์ ํ™”ํ•˜๋ผ. + +## 3. Key๊ฐ’์˜ ์ค‘์š”์„ฑ: `index`๋Š” ์ตœํ›„์˜ ์ˆ˜๋‹จ์ด๋‹ค +- `map` ๋Œ๋ฆด ๋•Œ `index`๋ฅผ key๋กœ ์“ฐ๋ฉด, ๋ฆฌ์ŠคํŠธ ์ˆœ์„œ๊ฐ€ ๋ฐ”๋€” ๋•Œ ๋ฆฌ์•กํŠธ๊ฐ€ ๋ฉ˜๋ถ•์— ๋น ์ง„๋‹ค. +- ๋ฐ˜๋“œ์‹œ ๋ฐ์ดํ„ฐ์˜ **Unique ID**๋ฅผ ์จ๋ผ. ๊ทธ๋ž˜์•ผ ๋ฆฌ์•กํŠธ๊ฐ€ "์•„, ์ˆœ์„œ๋งŒ ๋ฐ”๋€Œ์—ˆ๋„ค?" ํ•˜๊ณ  ์˜๋ฆฌํ•˜๊ฒŒ ๋Œ€์ฒ˜ํ•œ๋‹ค. diff --git a/01_Archive/2026-04-20/05_React-State-Management_Strategy.md b/01_Archive/2026-04-20/05_React-State-Management_Strategy.md new file mode 100644 index 00000000..7268c2ce --- /dev/null +++ b/01_Archive/2026-04-20/05_React-State-Management_Strategy.md @@ -0,0 +1,15 @@ +# ๐ŸŒ [LEVEL 5] ์ƒํƒœ ๊ด€๋ฆฌ์˜ ๊ฑฐ๋ฒ„๋„Œ์Šค: ์–ด๋””์— ์ €์žฅํ•  ๊ฒƒ์ธ๊ฐ€? + +## 1. ์ƒํƒœ์—๋„ ๊ฑฐ์ฃผ์ง€๊ฐ€ ์žˆ๋‹ค +- **Local State**: ๊ทธ ์ปดํฌ๋„ŒํŠธ๋งŒ ์•Œ๋ฉด ๋˜๋Š” ๊ฒƒ (Input ์ž…๋ ฅ๊ฐ’ ๋“ฑ). +- **Global State**: ์˜จ ๋™๋„ค๊ฐ€ ์•Œ์•„์•ผ ํ•˜๋Š” ๊ฒƒ (๋กœ๊ทธ์ธ ์ •๋ณด, ํ…Œ๋งˆ). +- **Server State**: ์„œ๋ฒ„์—์„œ ๋นŒ๋ ค์˜จ ๊ฒƒ (๊ฒŒ์‹œ๊ธ€ ๋ชฉ๋ก). + +## 2. ์„œ๋ฒ„ ์ƒํƒœ๋Š” `React Query`์—๊ฒŒ ๋งก๊ฒจ๋ผ +- `useEffect`๋กœ API ํ˜ธ์ถœํ•ด์„œ `loading` ๊ด€๋ฆฌํ•˜๋˜ ์‹œ๋Œ€๋Š” ๋๋‚ฌ๋‹ค. +- ์บ์‹ฑ, ์žฌ์‹œ๋„, ๋กœ๋”ฉ ์ƒํƒœ๋ฅผ ์ž๋™์œผ๋กœ ํ•ด์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์จ์„œ **'์‹ ์„ ํ•œ ๋ฐ์ดํ„ฐ'**๋งŒ ๊ด€๋ฆฌํ•˜๋ผ. + +## 3. ์ƒํƒœ์˜ ์ตœ์†Œํ™” (Single Source of Truth) +- `firstName`๊ณผ `lastName`์ด ์žˆ๋Š”๋ฐ `fullName` ์ด๋ผ๋Š” ์ƒํƒœ๋ฅผ ๋˜ ๋งŒ๋“ค์ง€ ๋งˆ๋ผ. +- `fullName`์€ ๋ Œ๋”๋งํ•  ๋•Œ ๊ทธ๋ƒฅ ํ•ฉ์ณ์„œ ๋ณด์—ฌ์ฃผ๋ฉด ๋œ๋‹ค. +- ์ƒํƒœ๊ฐ€ ๋งŽ์•„์งˆ์ˆ˜๋ก ๋™๊ธฐํ™” ์˜ค๋ฅ˜(๋ฒ„๊ทธ)์˜ ํ™•๋ฅ ์€ ๊ธ‰์ƒ์Šนํ•œ๋‹ค. diff --git a/01_Archive/2026-04-20/06_React-Clean-Code_Etiquette.md b/01_Archive/2026-04-20/06_React-Clean-Code_Etiquette.md new file mode 100644 index 00000000..da576cca --- /dev/null +++ b/01_Archive/2026-04-20/06_React-Clean-Code_Etiquette.md @@ -0,0 +1,13 @@ +# ๐Ÿงน [LEVEL 6] ๋ฆฌ์•กํŠธ ํด๋ฆฐ ์ฝ”๋“œ: ๋ˆ„๊ตฌ๋‚˜ ์ดํ•ดํ•˜๋Š” ์ฝ”๋“œ + +## 1. ์กฐ๊ฑด๋ถ€ ๋ Œ๋”๋ง์˜ ํ’ˆ๊ฒฉ +- `condition && ` ๋Š” ํŽธํ•˜์ง€๋งŒ, `condition`์ด 0์ผ ๋•Œ ํ™”๋ฉด์— 0์ด ์ฐํžˆ๋Š” ๋Œ€์ฐธ์‚ฌ๊ฐ€ ๋‚œ๋‹ค. +- ๊ฐ€๊ธ‰์  `condition ? : null` ์„ ์จ์„œ ๋ช…ํ™•ํ•˜๊ฒŒ ํ‘œํ˜„ํ•˜๋ผ. + +## 2. ๊ตฌ์กฐ ๋ถ„ํ•ด ํ• ๋‹น(Destructuring) ์ƒํ™œํ™” +- `props.user.name`, `props.user.age` ... ๋ณด๋Š” ์‚ฌ๋žŒ ์ˆจ๋„˜์–ด๊ฐ„๋‹ค. +- `const { name, age } = user;` ๋กœ ๊น”๋”ํ•˜๊ฒŒ ์ •๋ฆฌํ•˜๊ณ  ์‹œ์ž‘ํ•˜๋ผ. + +## 3. Early Return: ์ฝ”๋“œ๋ฅผ ๋‚ ์”ฌํ•˜๊ฒŒ +- `if (loading) return ` ์ฒ˜๋Ÿผ ์‹คํŒจ๋‚˜ ์˜ˆ์™ธ ์ผ€์ด์Šค๋ฅผ ๋จผ์ € ์ณ๋‚ด๋ผ. +- ๋’ค๋กœ ๊ฐˆ์ˆ˜๋ก **'์ง„์งœ ์ค‘์š”ํ•œ ํ•ต์‹ฌ ๋กœ์ง'**๋งŒ ๋‚จ์•„์„œ ๊ฐ€๋…์„ฑ์ด ํญ๋ฐœํ•œ๋‹ค. diff --git a/01_Archive/2026-04-20/07_React-Testing_Reliability.md b/01_Archive/2026-04-20/07_React-Testing_Reliability.md new file mode 100644 index 00000000..73b591e0 --- /dev/null +++ b/01_Archive/2026-04-20/07_React-Testing_Reliability.md @@ -0,0 +1,15 @@ +# ๐Ÿ›ก๏ธ [LEVEL 7] ํ…Œ์ŠคํŠธ๋ผ๋Š” ์•ˆ์ „๋ง: ๋ฒ„๊ทธ ์—†๋Š” ์ฝ”๋“œ๋ฅผ ํ–ฅํ•˜์—ฌ + +## 1. "๋‚ด ์ฝ”๋“œ๋Š” ์™„๋ฒฝํ•ด"๋ผ๋Š” ์ฐฉ๊ฐ์„ ๋ฒ„๋ ค๋ผ +- ์‹ค๋ฌด์ž๋Š” ์ž๊ธฐ ์ฝ”๋“œ๋ฅผ ๋ฏฟ์ง€ ์•Š๋Š”๋‹ค, **ํ…Œ์ŠคํŠธ ์ฝ”๋“œ**๋ฅผ ๋ฏฟ๋Š”๋‹ค. +- `Unit Test`: ํ•จ์ˆ˜ ํ•˜๋‚˜๊ฐ€ 1+1=2๋ฅผ ๋‚ด๋ฑ‰๋Š”์ง€ ํ™•์ธ. +- `Integration Test`: ์ปดํฌ๋„ŒํŠธ์™€ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งŒ๋‚˜์„œ ์ž˜ ๋Œ์•„๊ฐ€๋Š”์ง€ ํ™•์ธ. + +## 2. Vitest & React Testing Library (RTL) +- RTL์˜ ์ฒ ํ•™: "์‚ฌ์šฉ์ž๊ฐ€ ๋ณด๋“ฏ ํ…Œ์ŠคํŠธํ•˜๋ผ." +- `getByRole('button')` ์ฒ˜๋Ÿผ ์‚ฌ์šฉ์ž๊ฐ€ ๋ฒ„ํŠผ์„ ์ฐพ๋“ฏ ์ฝ”๋“œ๋ฅผ ์งœ์•ผ ํ•œ๋‹ค. +- **Tip**: ๋‚ด๋ถ€ ๊ตฌํ˜„(State ๊ฐ’ ๋“ฑ)์ด ์•„๋‹ˆ๋ผ **ํ™”๋ฉด์— ๋ฌด์—‡์ด ๋‚˜์˜ค๋Š”๊ฐ€**๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋ผ. + +## 3. TDD(Test Driven Development) ๋ง›๋ณด๊ธฐ +- ํ…Œ์ŠคํŠธ๋ฅผ ๋จผ์ € ์“ฐ๊ณ  ์ฝ”๋“œ๋ฅผ ์งœ๋ผ. +- ๋ณต์žกํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ผ์ˆ˜๋ก TDD๋Š” ๋‹น์‹ ์˜ ํ‡ด๊ทผ ์‹œ๊ฐ„์„ ์•ž๋‹น๊ฒจ์ค€๋‹ค. diff --git a/01_Archive/2026-04-20/08_React-API_Communication-Patterns.md b/01_Archive/2026-04-20/08_React-API_Communication-Patterns.md new file mode 100644 index 00000000..3167f0ac --- /dev/null +++ b/01_Archive/2026-04-20/08_React-API_Communication-Patterns.md @@ -0,0 +1,14 @@ +# ๐Ÿ“ก [LEVEL 8] API ํ†ต์‹ ์˜ ํ’ˆ๊ฒฉ: ์„œ๋ฒ„์™€ ๋Œ€ํ™”ํ•˜๋Š” ๋ฒ• + +## 1. Axios Interceptor: ๊ณตํ•ญ ์ž…์ž…๊ตญ ์‹ฌ์‚ฌ +- ๋งค๋ฒˆ API ์  ๋•Œ๋งˆ๋‹ค ํ† ํฐ ๋„ฃ๊ณ  ์—๋Ÿฌ ์ฒ˜๋ฆฌํ•  ๊ฑด๊ฐ€? +- `interceptor`๋ฅผ ์จ์„œ ๋ชจ๋“  ์š”์ฒญ์— **์ž๋™์œผ๋กœ ์ธ์ฆ ํ† ํฐ**์„ ๋ถ™์ด๊ณ , ์—๋Ÿฌ ์‘๋‹ต์€ ํ•œ ๊ณณ์—์„œ ์ฒ˜๋ฆฌํ•˜๋ผ. + +## 2. HTTP ์—๋Ÿฌ ํ•ธ๋“ค๋ง (401, 404, 500) +- 401(๋ฏธ์ธ์ฆ)์ด ๋œจ๋ฉด ์ž๋™์œผ๋กœ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋กœ ๋ณด๋‚ด๊ฑฐ๋‚˜ ํ† ํฐ์„ ๊ฐฑ์‹ ํ•˜๋ผ. +- ์‚ฌ์šฉ์ž๋Š” ํ•˜์–€ ํ™”๋ฉด์ด ์•„๋‹ˆ๋ผ "์ž ์‹œ ํ›„ ๋‹ค์‹œ ์‹œ๋„ํ•ด ์ฃผ์„ธ์š”"๋ผ๋Š” ์นœ์ ˆํ•œ ๋ฉ”์‹œ์ง€๋ฅผ ์›ํ•œ๋‹ค. + +## 3. API ์ถ”์ƒํ™” (Service Layer) +- ์ปดํฌ๋„ŒํŠธ ์•ˆ์— `axios.get('/api/users')` ๋ฅผ ์ง์ ‘ ์“ฐ์ง€ ๋งˆ๋ผ. +- `userService.js` ํŒŒ์ผ์„ ๋”ฐ๋กœ ๋งŒ๋“ค์–ด ํ•จ์ˆ˜ํ™”ํ•˜๋ผ. +- **์ด์ **: API ์ฃผ์†Œ๊ฐ€ ๋ฐ”๋€Œ์–ด๋„ ํŒŒ์ผ ํ•˜๋‚˜๋งŒ ๊ณ ์น˜๋ฉด ๋œ๋‹ค. diff --git a/01_Archive/2026-04-20/09_Styling-Architecture_Governance.md b/01_Archive/2026-04-20/09_Styling-Architecture_Governance.md new file mode 100644 index 00000000..57db485d --- /dev/null +++ b/01_Archive/2026-04-20/09_Styling-Architecture_Governance.md @@ -0,0 +1,15 @@ +# ๐ŸŽจ [LEVEL 9] ์Šคํƒ€์ผ ๊ฑฐ๋ฒ„๋„Œ์Šค: ๋””์ž์ธ ์‹œ์Šคํ…œ ๊ตฌ์ถ•ํ•˜๊ธฐ + +## 1. CSS-in-JS vs Utility-First +- `Styled-components`: ์ปดํฌ๋„ŒํŠธ ์ค‘์‹ฌ์˜ ์Šคํƒ€์ผ๋ง. ๊ฐ€๋…์„ฑ์ด ์ข‹๋‹ค. +- `Tailwind CSS`: ํด๋ž˜์Šค ๊ธฐ๋ฐ˜์˜ ๋น ๋ฅธ ๊ฐœ๋ฐœ. ์ƒ์‚ฐ์„ฑ์ด ๋ฏธ์ณค๋‹ค. +- **์ค‘๊ธ‰์˜ ์„ ํƒ**: ํŒ€์˜ ๊ทœ๋ชจ์™€ ํ”„๋กœ์ ํŠธ ์„ฑ๊ฒฉ์— ๋งž๋Š” ๋„๊ตฌ๋ฅผ ์ œ์•ˆํ•  ์ค„ ์•Œ์•„์•ผ ํ•œ๋‹ค. + +## 2. Design Tokens: ๋งˆ๋ฒ•์˜ ๋ณ€์ˆ˜ +- `#FF5733` ์ด๋ผ๊ณ  ์ง์ ‘ ์“ฐ์ง€ ๋งˆ๋ผ. +- `theme.primary` ๋ผ๊ณ  ๋ณ€์ˆ˜(Token)๋ฅผ ์จ๋ผ. +- ํšŒ์žฅ๋‹˜์ด "๋นจ๊ฐ„์ƒ‰ ๋‹ค ํŒŒ๋ž€์ƒ‰์œผ๋กœ ๋ฐ”๊ฟ”!" ๋ผ๊ณ  ํ•  ๋•Œ 1์ดˆ ๋งŒ์— ๋๋‚ผ ์ˆ˜ ์žˆ๋‹ค. + +## 3. ๋ฐ˜์‘ํ˜• ๋””์ž์ธ (Responsive) +- ๋ชจ๋ฐ”์ผ ์šฐ์„ (Mobile First)์œผ๋กœ ์ƒ๊ฐํ•˜๋ผ. +- ์ž‘์€ ํ™”๋ฉด์—์„œ ๋จผ์ € ์งœ๊ณ  ํฐ ํ™”๋ฉด์œผ๋กœ ๋„“ํ˜€๊ฐ€๋Š” ๊ฒƒ์ด ๋…ผ๋ฆฌ์ ์œผ๋กœ ํ›จ์”ฌ ๊ฐ„๊ฒฐํ•˜๋‹ค. diff --git a/01_Archive/2026-04-20/10_Modern-Environment_Ecosystem.md b/01_Archive/2026-04-20/10_Modern-Environment_Ecosystem.md new file mode 100644 index 00000000..49abf4cd --- /dev/null +++ b/01_Archive/2026-04-20/10_Modern-Environment_Ecosystem.md @@ -0,0 +1,15 @@ +# ๐Ÿ—๏ธ [LEVEL 10] ๋ชจ๋˜ ์Šคํƒ์˜ ์„ ํƒ: Vite์™€ Next.js + +## 1. ์ „๊ด‘์„ํ™” ๊ฐ™์€ ๊ฐœ๋ฐœ: Vite +- `Create React App(CRA)`์€ ์ด์ œ ๋А๋ฆฌ๊ณ  ๋ฌด๊ฒ๋‹ค. +- `Vite`๋Š” ๋ธŒ๋ผ์šฐ์ €์˜ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ์„ ์จ์„œ ์„œ๋ฒ„ ๊ตฌ๋™์ด ๋น›๋ณด๋‹ค ๋น ๋ฅด๋‹ค. +- **๊ตํ›ˆ**: ๋„๊ตฌ๊ฐ€ ๋ฐ”๋€Œ๋ฉด ๊ฐœ๋ฐœ ๊ฒฝํ—˜์ด ๋ฐ”๋€Œ๊ณ , ๊ฐœ๋ฐœ ๊ฒฝํ—˜์€ ์ƒ์‚ฐ์„ฑ์ด๋‹ค. + +## 2. Server Side Rendering (SSR) & Next.js +- ๊ตฌ๊ธ€ ๊ฒ€์ƒ‰ ๋กœ๋ด‡์ด ๋‚ด ์‚ฌ์ดํŠธ๋ฅผ ์ž˜ ์ฐพ๊ฒŒ ํ•˜๋ ค๋ฉด(SEO) Next.js๊ฐ€ ํ•„์ˆ˜๋‹ค. +- "๊นœ๋นก์ž„ ์—†๋Š” ํŽ˜์ด์ง€ ์ „ํ™˜" + "๋น ๋ฅธ ์ฒซ ๋กœ๋”ฉ"์˜ ์กฐํ™”. +- **ํ•ต์‹ฌ**: ์–ธ์ œ CSR(ํด๋ผ์ด์–ธํŠธ)์„ ์“ฐ๊ณ  ์–ธ์ œ SSR(์„œ๋ฒ„)์„ ์“ธ์ง€ ๊ตฌ๋ถ„ํ•˜๋ผ. + +## 3. ํด๋” ๊ตฌ์กฐ์˜ ๋ฏธํ•™ +- `components`, `hooks`, `services`, `utils`, `pages`. +- ๋ˆ„๊ฐ€ ํ”„๋กœ์ ํŠธ๋ฅผ ์—ด์—ˆ์„ ๋•Œ **"์•„, ์—ฌ๊ธด ๋ญ๊ฐ€ ์žˆ๊ฒ ๊ตฌ๋‚˜"**๋ผ๊ณ  ์ง์ž‘ํ•˜๊ฒŒ ๋งŒ๋“ค์–ด๋ผ. diff --git a/01_Archive/2026-04-20/11_Reliability_Safety-First.md b/01_Archive/2026-04-20/11_Reliability_Safety-First.md new file mode 100644 index 00000000..bd3cf0cd --- /dev/null +++ b/01_Archive/2026-04-20/11_Reliability_Safety-First.md @@ -0,0 +1,12 @@ +# ๐Ÿš‘ [LEVEL 11] ์ตœํ›„์˜ ๋ฐฉ์–ด์„ : ์—๋Ÿฌ ๋ฐ”์šด๋”๋ฆฌ์™€ ๋กœ๊น… + +## 1. Error Boundary: ์•ฑ์˜ ์ˆ˜ํ˜ธ์‹  +- ์ปดํฌ๋„ŒํŠธ ํ•˜๋‚˜์—์„œ ์—๋Ÿฌ๊ฐ€ ๋‚ฌ๋‹ค๊ณ  ์ „์ฒด ์•ฑ์ด ํ•˜์–—๊ฒŒ ์ฃฝ์–ด์„œ๋Š” ์•ˆ ๋œ๋‹ค. +- ์—๋Ÿฌ๊ฐ€ ๋‚œ ๋ถ€๋ถ„๋งŒ "๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค"๋ผ๊ณ  ๋ณด์—ฌ์ฃผ๊ณ  ๋‚˜๋จธ์ง€๋Š” ์‚ด๋ ค๋‘ฌ๋ผ. + +## 2. Sentry: ๋ˆˆ์— ๋ณด์ด์ง€ ์•Š๋Š” ๋ฒ„๊ทธ ์žก๊ธฐ +- ์‚ฌ์šฉ์ž์˜ ์ปดํ“จํ„ฐ์—์„œ ๋‚˜๋Š” ์—๋Ÿฌ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์•Œ ์ˆ˜ ์—†๋‹ค. +- `Sentry` ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์—ฐ๋™ํ•ด์„œ, ์—๋Ÿฌ๊ฐ€ ๋‚˜๋Š” ์ฆ‰์‹œ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์ด๋ฉ”์ผ๋กœ ์ œ๋ณดํ•˜๊ฒŒ ํ•˜๋ผ. + +## 3. ์‚ฌ์šฉ์ž ๊ฒฝํ—˜(UX) ๋ฐฐ๋ ค: Skeleton UI +- ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ ์ค‘์ผ ๋•Œ ๋ฑ…๊ธ€๋ฑ…๊ธ€ ๋„๋Š” `Spinner` ๋ณด๋‹ค๋Š”, ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด์˜ฌ ์ž๋ฆฌ๋ฅผ ๋ฏธ๋ฆฌ ๋ณด์—ฌ์ฃผ๋Š” `Skeleton`์ด ์‹ฌ๋ฆฌ์ ์œผ๋กœ ํ›จ์”ฌ ๋น ๋ฅด๋‹ค. diff --git a/01_Archive/2026-04-20/12_Deployment_Final-Gate.md b/01_Archive/2026-04-20/12_Deployment_Final-Gate.md new file mode 100644 index 00000000..a7132b04 --- /dev/null +++ b/01_Archive/2026-04-20/12_Deployment_Final-Gate.md @@ -0,0 +1,14 @@ +# ๐Ÿš€ [LEVEL 12] ๋ฐฐํฌ ํ”„๋กœํ† ์ฝœ: ์„ธ์ƒ์œผ๋กœ ๋‚˜๊ฐ€๋Š” ๋งˆ์ง€๋ง‰ ๊ด€๋ฌธ + +## 1. GitHub Actions: ๋น„์„œ ์ฑ„์šฉํ•˜๊ธฐ +- ๋‚ด๊ฐ€ `Push` ํ•˜๋ฉด ์ž๋™์œผ๋กœ ํ…Œ์ŠคํŠธ ๋Œ๋ฆฌ๊ณ , ์—๋Ÿฌ ์—†์œผ๋ฉด ๋ฐฐํฌ๊นŒ์ง€ ํ•ด์ฃผ๋Š” ๋น„์„œ๋ฅผ ๊ณ ์šฉํ•˜๋ผ. +- **CI(์ง€์†์  ํ†ตํ•ฉ)**: ์ฝ”๋“œ ํ•ฉ์น  ๋•Œ๋งˆ๋‹ค ๊ฒ€์‚ฌํ•˜๊ธฐ. +- **CD(์ง€์†์  ๋ฐฐํฌ)**: ์ฝ”๋“œ ํ•ฉ์น˜๋ฉด ๋ฐ”๋กœ ์„œ๋ฒ„์— ์˜ฌ๋ฆฌ๊ธฐ. + +## 2. Vercel & Netlify +- ์˜ˆ์ „์—๋Š” ์„œ๋ฒ„ ์„ธํŒ…์— ๋ฉฐ์น ์ด ๊ฑธ๋ ธ๋‹ค. +- ์ง€๊ธˆ์€ ํด๋ฆญ ๋ช‡ ๋ฒˆ์œผ๋กœ ์ „ ์„ธ๊ณ„์— ๋‚ด ์•ฑ์„ ์„œ๋น„์Šคํ•  ์ˆ˜ ์žˆ๋‹ค. + +## 3. ํ™˜๊ฒฝ ๋ณ€์ˆ˜(ENV) ๊ด€๋ฆฌ: ๋ณด์•ˆ์˜ ํ•ต์‹ฌ +- API Key๋‚˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ ˆ๋Œ€ ๊นƒํ—ˆ๋ธŒ์— ์˜ฌ๋ฆฌ์ง€ ๋งˆ๋ผ. +- `.env` ํŒŒ์ผ์„ ์“ฐ๊ณ , ๋ฐฐํฌ ํ™˜๊ฒฝ ์„ค์ •์—์„œ ๋”ฐ๋กœ ๊ด€๋ฆฌํ•˜๋ผ. **์ด๊ฑฐ ํ•˜๋‚˜๋กœ ํšŒ์‚ฌ ๊ธฐ๋ฐ€์ด ํ„ธ๋ฆด ์ˆ˜ ์žˆ๋‹ค.** diff --git a/01_Archive/2026-04-20/13_TypeScript_Type-Safety.md b/01_Archive/2026-04-20/13_TypeScript_Type-Safety.md new file mode 100644 index 00000000..deb59847 --- /dev/null +++ b/01_Archive/2026-04-20/13_TypeScript_Type-Safety.md @@ -0,0 +1,14 @@ +# ๐Ÿ’Ž [LEVEL 13] ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ: ํ”๋“ค๋ฆฌ์ง€ ์•Š๋Š” ์ฝ”๋“œ์˜ ๋ผˆ๋Œ€ + +## 1. ์ธํ„ฐํŽ˜์ด์Šค(Interface)์™€ ํƒ€์ž…(Type) +- "์ด ๋ฐ์ดํ„ฐ๋Š” ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ์–ด?"๋ฅผ ๋ฏธ๋ฆฌ ์ •์˜ํ•˜๋ผ. +- ์˜คํƒ€ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•˜๋Š” ๋ฉ์ฒญํ•œ ๋ฒ„๊ทธ์˜ 90%๋ฅผ ๋ง‰์•„์ค€๋‹ค. +- **์›์น™**: `any`๋ฅผ ์“ฐ๋Š” ๊ฒƒ์€ ์ฝ”๋”ฉ์„ ํฌ๊ธฐํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ฃฝ์–ด๋„ `any`๋Š” ์“ฐ์ง€ ๋งˆ๋ผ. + +## 2. ์ œ๋„ค๋ฆญ(Generic): ์œ ์—ฐํ•˜๋ฉด์„œ๋„ ์•ˆ์ „ํ•˜๊ฒŒ +- ์–ด๋–ค ํƒ€์ž…์ด ๋“ค์–ด์˜ฌ์ง€ ๋ชจ๋ฅด์ง€๋งŒ, ๋“ค์–ด์˜จ ํƒ€์ž… ๊ทธ๋Œ€๋กœ ๋‚ด๋ฑ‰๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•˜๋ผ. +- ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ปดํฌ๋„ŒํŠธ(`Button`, `Select`)๋ฅผ ๋งŒ๋“ค ๋•Œ ์ค‘๊ธ‰์ž์˜ ์‹ค๋ ฅ์ด ์—ฌ๊ธฐ์„œ ๋“œ๋Ÿฌ๋‚œ๋‹ค. + +## 3. ํƒ€์ž… ์ถ”๋ก ๊ณผ ์ขํžˆ๊ธฐ(Narrowing) +- ๋ฆฌ์•กํŠธ๊ฐ€ ํƒ€์ž…์„ ๋˜‘๋˜‘ํ•˜๊ฒŒ ์œ ์ถ”ํ•˜๊ฒŒ ๋„์™€์ค˜๋ผ. +- `if (user)` ์ฒ˜๋Ÿผ ํƒ€์ž…์„ ์ขํ˜€์„œ `undefined` ์—๋Ÿฌ๋ฅผ ์›์ฒœ ์ฐจ๋‹จํ•˜๋ผ. diff --git a/01_Archive/2026-04-20/14_Accessibility_Inclusivity.md b/01_Archive/2026-04-20/14_Accessibility_Inclusivity.md new file mode 100644 index 00000000..230d11d0 --- /dev/null +++ b/01_Archive/2026-04-20/14_Accessibility_Inclusivity.md @@ -0,0 +1,14 @@ +# โ™ฟ [LEVEL 14] ์›น ์ ‘๊ทผ์„ฑ: ๋ชจ๋‘๋ฅผ ์œ„ํ•œ ๋ฐฐ๋ ค + +## 1. Semantic HTML์˜ ์ง„์ •ํ•œ ์˜๋ฏธ +- `
` ๋กœ๋งŒ ๋„๋ฐฐํ•˜์ง€ ๋งˆ๋ผ. ์Šคํฌ๋ฆฐ ๋ฆฌ๋”๋Š” `
`๋ฅผ ์ดํ•ดํ•˜์ง€ ๋ชปํ•œ๋‹ค. +- `