diff --git a/keyword/chapter10/keyword.md b/keyword/chapter10/keyword.md
new file mode 100644
index 00000000..69a6e81a
--- /dev/null
+++ b/keyword/chapter10/keyword.md
@@ -0,0 +1,1248 @@
+# ๐ย ํ์ต ๋ชฉํ
+
+---
+
+**1) Referential Equality(์ฐธ์กฐ ๋์ผ์ฑ)์ ์๋ฆฌ ์ดํด ๋ฐ ์ ์ฉ**
+
+- ์๋ฐ์คํฌ๋ฆฝํธ์ ๊ฐ(Primitive) ํ์
๊ณผ ์ฐธ์กฐ(Object) ํ์
์ ์ฐจ์ด๋ฅผ ๋ฉ๋ชจ๋ฆฌ ๊ด์ ์์ ์ค๋ช
ํ ์ ์๋ค.
+- `==`, `===`, `Object.is`์ ๋น๊ต ๋ฐฉ์ ์ฐจ์ด๋ฅผ ์ดํดํ๊ณ , ์ํฉ์ ๋ง๊ฒ ๊ตฌ๋ณํ์ฌ ์ฌ์ฉํ ์ ์๋ค.
+- React์ ๋ถ๋ณ์ฑ(Immutability)๊ณผ ์ฐธ์กฐ ๋์ผ์ฑ์ด ๋ ๋๋ง ์ต์ ํ์ ๋ฏธ์น๋ ์ํฅ์ ์ค๋ช
ํ ์ ์๋ค.
+
+**2) React ์ฑ๋ฅ ์ต์ ํ(Optimization) Hooks ๋ง์คํฐ**
+
+- `useCallback`, `useMemo`, `React.memo`์ ๊ฐ๋
๊ณผ ์ฐจ์ด์ ์ ๋ช
ํํ ๊ตฌ๋ถํ ์ ์๋ค.
+- ๋ฉ๋ชจ์ด์ ์ด์
(Memoization)์ด ๋ฌด์์ธ์ง ์ดํดํ๊ณ , ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ๋ฐฉ์งํ๋ ์ฝ๋๋ฅผ ์ง์ ๊ตฌํํ ์ ์๋ค.
+- ์์กด์ฑ ๋ฐฐ์ด(Dependency Array)๊ณผ ์ฐธ์กฐ ๋์ผ์ฑ์ ๊ด๊ณ๋ฅผ ํ์
ํ์ฌ `stale closure` ๋ฌธ์ ๋ฅผ ์๋ฐฉํ ์ ์๋ค.
+- ๋ฌด์กฐ๊ฑด์ ์ธ ์ต์ ํ๊ฐ ์๋, ์ฑ๋ฅ์ ์ด์ ์ด ์๋ ๊ฒฝ์ฐ๋ฅผ ํ๋จํ์ฌ ์ ์ ํ Hook์ ์ ํํ ์ ์๋ค.
+
+**3) Vercel์ ํ์ฉํ ์ค์ ๋ฐฐํฌ ๋ฐ ์๋ฒ ํ๊ฒฝ ์ดํด**
+
+- ๋ฐฐํฌ(Deployment)์ ํต์ฌ ๊ฐ๋
(Build, Hosting)๊ณผ ๋ก์ปฌ(Local) ํ๊ฒฝ๊ณผ์ ์ฐจ์ด๋ฅผ ์ค๋ช
ํ ์ ์๋ค.
+- Vercel๊ณผ GitHub๋ฅผ ์ฐ๋ํ์ฌ ์ฝ๋ ํธ์ ์ ์๋์ผ๋ก ๋ฐฐํฌ๋๋ ํ๋ฆ์ ๊ตฌ์ถํ ์ ์๋ค.
+- SPA(Single Page Application) ๋ฐฐํฌ ์ ๋ฐ์ํ๋ ๋ผ์ฐํ
๋ฌธ์ (404 ์๋ฌ)๋ฅผ `vercel.json`์ผ๋ก ํด๊ฒฐํ๊ณ , ํ๊ฒฝ๋ณ์(Environment Variables)๋ฅผ ์์ ํ๊ฒ ๊ด๋ฆฌํ ์ ์๋ค.
+
+**4) CI/CD ๊ฐ๋
์ดํด์ ๋ชจ๋ ์น ๊ฐ๋ฐ ํ๋ก์ธ์ค ์ ๋ฆฝ**
+
+- CI(์ง์์ ํตํฉ)์ CD(์ง์์ ๋ฐฐํฌ)์ ์ ์์ ์ด๋ฅผ ์ฌ์ฉํ๋ ์ด์ (์์ฐ์ฑ, ์์ ์ฑ)๋ฅผ ์ค๋ช
ํ ์ ์๋ค.
+- ์๋ํ๋ ๋ฐฐํฌ ์์คํ
์ด ๊ฐ๋ฐ์์ ์ค์(Human Error)๋ฅผ ์ค์ฌ์ฃผ๋ ์๋ฆฌ๋ฅผ ์ดํดํ๋ค.
+- ์ปค์คํ
๋๋ฉ์ธ ์ฐ๊ฒฐ ๊ณผ์ ์ ํตํด ์ค์ ์ฌ์ฉ์๊ฐ ์ ๊ทผ ๊ฐ๋ฅํ ์๋น์ค๋ฅผ ์์ฑํ๋ ๊ฒฝํ์ ๊ฐ๋๋ค.
+
+# โ ๏ธย ์คํฐ๋ ์งํ ๋ฐฉ๋ฒ
+
+---
+
+1. **์ํฌ๋ถ ์๋ฃ ํ ์คํฐ๋ ์ฐธ์ฌ**
+ - ์คํฐ๋ ์ , ์ํฌ๋ถ ๋ด์ฉ์ **๋ชจ๋ ์์ฑ**ํ๊ณ ์ดํด๋์ง ์์ ๋ถ๋ถ์ ์ค๋นํฉ๋๋ค.
+2. **์คํฐ๋ ๋ฏธ์
์ํ**
+ - ์ํฌ๋ถ ์๋ฃ ํ ๋ฏธ์
์ ์ํํฉ๋๋ค.
+ - ์งํ ๋ด์ฉ๊ณผ ๋ฌธ์ ์ ์ ์คํฐ๋ ์๊ฐ์ ๊ณต์ ํฉ๋๋ค.
+ - **์ฝ๋ ๋ฆฌ๋ทฐ**๋ GitHub PR์์ ์์ ์งํํฉ๋๋ค.
+3. **์คํฐ๋ ์๊ฐ ๊ตฌ์ฑ**
+ 1. ๊ฐ์ ์งํํ ๋ฏธ์
์ค **ํด๊ฒฐํ์ง ๋ชปํ ์ด์ ๊ณต์ **
+ 2. ํด๋น ๋ฌธ์ ๋ฅผ **์คํฐ๋์๊ณผ ํจ๊ป ํด๊ฒฐ ๋ฐฉ๋ฒ ๊ณต์ **, ํ์ ์ ๊ฐ์ด ํด๊ฒฐ
+ 3. ๋ฏธ์
ํ **ํผ๋๋ฐฑ ๊ณต์ ๋ฐ ๊ฐ์ **
+4. **์ฃผ์ฐจ๋ณ ๋ฏธ์
์ ์ถ**
+ - ๋งค์ฃผ **์ํฌ๋ถ๊ณผ ๋ฏธ์
์ ์ ์ถ**ํฉ๋๋ค. (๋์์ธ์ ๊ฐ์ธ ๋ณด์ ๊ฐ๋ฅ)
+ - ์ํฌ๋ถ ์๋ฃ ํ [**์ํฌ๋ถ ํผ๋๋ฐฑ ํผ ์ ์ถ**](https://forms.gle/aXPWVZpDSfYTAiCd6?utm_source=chatgpt.com)
+ - ํน์ ์ฃผ์ ์ ๋ง์ ํผ๋๋ฐฑ ์์ฒญ์ด ๋ค์ด์ฌ ๊ฒฝ์ฐ, ํผ๋๋ฐฑ ์ดํ ํด๋น ๋ด์ฉ์ ๋ฐํ์ผ๋ก **์ถ๊ฐ ๊ฐ์ ์์** ์ ๊ณต ์์ ([์ ํ๋ธ ๊ตฌ๋
](https://www.youtube.com/@yongcoding?utm_source=chatgpt.com))
+ - **๐ ย ์ฝ๋ ๋ฆฌ๋ทฐ ์ ์ถ ๊ธฐ์ค**
+ - ๋ณธ์ธ์ด ๋ฆฌ๋ทฐํ ์ฝ๋ **์ต์ 1๊ฐ**
+ - ๋ณธ์ธ์ด ๋ฐ์ ๋ฆฌ๋ทฐ๋ฅผ ์ฝ๋์ **์ค์ ๋ฐ์ํ ๊ฒ ์ต์ 1๊ฐ**
+5. **์คํฐ๋ ์ธ์ฆ์ท**
+ - ๋งค์ฃผ ๋ํ ์ฌ์ง **1์ฅ** ๋จ๊ธฐ๊ธฐ
+ - ์ด๋ฏธ์ง ์๋ฒ ๋ ๋๋ ๋ณต์ฌยท๋ถ์ฌ๋ฃ๊ธฐ ๊ฐ๋ฅ
+
+# ๐ธย ์ ๊น ! ์คํฐ๋ ์ธ์ฆ์ท์ ์ฐ์ผ์
จ๋์?๐ธ
+
+---
+
+* ์คํฐ๋๋ฆฌ๋๊ป์ ๋ํ๋ก ๋งค ์ฃผ์ฐจ๋ง๋ค ํ ์ฅ ๋จ๊ฒจ์ฃผ์๋ฉด ์ข๊ฒ ์ต๋๋ค!๐๐
+ (์ฌ์ง์ ์ ์ฅํด์ ์ด๋ฏธ์ง ์๋ฒ ๋๋ฅผ ํ์
๋ ์ข๊ณ , ๋ณต์ฌ+๋ถ์ฌ๋ฃ๊ธฐํด์ ๋ฃ์ด์ฃผ์
๋ ์ข์ต๋๋ค!)
+
+[]()
+
+# ๐ฏย ํต์ฌ ํค์๋
+
+---
+
+
+
+- **`Referential Equality` (์ฐธ์กฐ ๋์ผ์ฑ)** ๐
+ - **`Referential Equality`๋ ๋ฌด์์ธ๊ฐ์?**
+
+ # **`Referential Equality`๋ ๋ฌด์์ธ๊ฐ์?**
+
+ ๊ฐ๋จํ ๋งํ๋ฉด,
+
+ > **์ฐธ์กฐ ๋์ผ์ฑ**์ โ๋ ๋ณ์๊ฐ **์์ ํ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์๋๊ฐ**?โ๋ฅผ ๋ณด๋ ๊ฐ๋
์ด์์.
+ >
+ - โ๊ฐ์ ๊ฐ์ด๋?โ๊ฐ ์๋๋ผ โ๊ฐ์ **๋ฉ๋ชจ๋ฆฌ ์ฃผ์(๊ฐ์ ๊ฐ์ฒด ์ธ์คํด์ค)**๋ฅผ ๊ฐ๋ฆฌํค๋?โ๋ฅผ ๋ฌป๋ ๊ฑฐ์์.
+
+ ๊ทธ๋์ **โ๋ ๊ฐ์ฒด๊ฐ ์ง์ง๋ก ๊ฐ์ ๋
์์ด๋?โ** ๋ฅผ ํ์ธํ ๋ ์ฐ๋ ๊ธฐ์ค์ด๋ผ๊ณ ๋ณผ ์ ์์ด์.
+
+ ---
+
+ ## 1. ์๋ฐ์คํฌ๋ฆฝํธ์์ ๊ฐ vs ์ฐธ์กฐ์์
+
+ ---
+
+ ### 1-1. ๊ฐ(primitive) ํ์
+
+ - `number`, `string`, `boolean`, `null`, `undefined`, `bigint`, `symbol`
+ - ๋ณ์ ์์ **๊ฐ ์์ฒด๊ฐ ๋ค์ด์๋ ๊ฒฝ์ฐ**์์.
+
+ ```jsx
+ let a = 10;
+ let b = 10;
+
+ console.log(a === b); // true (๊ฐ ๋น๊ต)
+ ```
+
+ ---
+
+ ### 1-2. ์ฐธ์กฐ(object) ํ์
+
+ - `object`, `array`, `function`, `Date`, `Map` ๋ฑ
+ - ๋ณ์ ์์๋ โ๊ฐ์ฒด๊ฐ ์ ์ฅ๋ ๋ฉ๋ชจ๋ฆฌ ์์น(์ฐธ์กฐ)โ๊ฐ ๋ค์ด์์ด์.
+
+ ```jsx
+ const obj1 = { x: 1 };
+ const obj2 = { x: 1 };
+ const obj3 = obj1;
+
+ console.log(obj1 === obj2); // false (์๋ก ๋ค๋ฅธ ๊ฐ์ฒด(์ฃผ์๊ฐ)์์)
+ console.log(obj1 === obj3); // true (๊ฐ์ ๊ฐ์ฒด(์ฃผ์๊ฐ)๋ฅผ ๊ฐ๋ฆฌ์ผ์)
+ ```
+
+ - `obj1`๊ณผ `obj2`๋ ๋ชจ์์ ๊ฐ์ง๋ง **์๋ก ๋ค๋ฅธ ๊ฐ์ฒด**์์.
+ - `obj1`๊ณผ `obj3`๋ **์ ํํ ๊ฐ์ ๊ฐ์ฒด**๋ฅผ ๊ณต์ ํด์.
+
+ โ ์ด ๋์ด โ์ฐธ์กฐ ๋์ผโํ๋ค๊ณ ๋งํ๋ ๊ฑฐ์์.
+
+
+ ---
+
+ ## 2. ์๋ฐ์คํฌ๋ฆฝํธ์์ ==, ===, Object.is ์์
+
+ ---
+
+ ### 2-1. `==` (๋์จํ ๋๋ฑ)
+
+ - ํ์
์ **์๋ฌต์ ์ผ๋ก ๋ณํ**ํ๋ฉด์ ๋น๊ตํด์.
+ - ์์ธกํ๊ธฐ ์ด๋ ค์ด ๊ฒฝ์ฐ๊ฐ ๋ง์์, **์ค๋ฌด์์๋ ๊ฑฐ์ ์ ์ฐ๋ ๊ฒ ์ข์์.**
+
+ ```jsx
+ 0 == false; // true
+ "" == false; // true
+ null == undefined; // true
+ ```
+
+ ---
+
+ ### 2-2 `===` (์๊ฒฉํ ๋๋ฑ)
+
+ - ํ์
๋ณํ ์์ด **๊ทธ๋๋ก ๋น๊ต**ํด์.
+ - primitive์์๋ โ๊ฐ ๋์ผ์ฑโ
+ - ๊ฐ์ฒด/๋ฐฐ์ด/ํจ์์์๋ โ์ฐธ์กฐ ๋์ผ์ฑโ์ ๋น๊ตํด์.
+
+ ```jsx
+ // primitive
+ 1 === 1; // true
+ "hi" === "hi"; // true
+
+ // object
+ const a = { x: 1 };
+ const b = { x: 1 };
+ const c = a;
+
+ a === b; // false (์๋ก ๋ค๋ฅธ ๊ฐ์ฒด)
+ a === c; // true (์ฐธ์กฐ ๋์ผ์ฑ)
+ ```
+
+ ---
+
+ ### 2-3. `Object.is`
+
+ - ๊ธฐ๋ณธ์ ์ผ๋ก `===`์ ๋น์ทํ์ง๋ง,
+ - `NaN` ๋น๊ต, `+0` vs `-0` ๊ฐ์ ํน์ ์ผ์ด์ค์์๋ง ์กฐ๊ธ ๋ฌ๋ผ์.
+
+ ```jsx
+ NaN === NaN; // false
+ Object.is(NaN, NaN); // true
+
+ +0 === -0; // true
+ Object.is(+0, -0); // false
+ ```
+
+ - **๊ฐ์ฒด์ ๋ํด์๋ `===`์ ๋๊ฐ์ด ์ฐธ์กฐ ๋์ผ์ฑ**์ ๋น๊ตํด์.
+
+ ```jsx
+ const obj1 = {};
+ const obj2 = obj1;
+
+ Object.is(obj1, obj2); // true (๊ฐ์ ์ฐธ์กฐ์์)
+ ```
+
+ ---
+
+ ## 3. ๊ฐ์ฒด/๋ฐฐ์ด/ํจ์์์ ์ฐธ์กฐ ๋์ผ์ฑ ์์
+
+ ---
+
+ ### 3-1. ๊ฐ์ฒด
+
+ ```jsx
+ const user1 = { name: "kim" };
+ const user2 = { name: "kim" };
+ const user3 = user1;
+
+ console.log(user1 === user2); // false
+ console.log(user1 === user3); // true
+ ```
+
+ - `user1`๊ณผ `user2`๋ **๊ฐ์ ๊ฐ์ ๋ณด์ฌ๋** ์๋ก ๋ค๋ฅธ ๊ฐ์ฒด์์.
+ - `user1`๊ณผ `user3`๋ ๊ฐ์ ์ฐธ์กฐ๋ฅผ ๊ณต์ ํ๋๊น ์ฐธ์กฐ ๋์ผ์ด์์.
+
+ ---
+
+ ### 3-2. ๋ฐฐ์ด
+
+ ```jsx
+ const arr1 = [1, 2, 3];
+ const arr2 = [1, 2, 3];
+ const arr3 = arr1;
+
+ console.log(arr1 === arr2); // false
+ console.log(arr1 === arr3); // true
+ ```
+
+ โ๋ฐฐ์ด ๋ด์ฉ์ด ๊ฐ์์งโ๋ฅผ ๋ณด๋ ค๋ฉด **์ง์ ๋น๊ต ๋ก์ง**์ด ํ์ํด์.
+
+ ```jsx
+ const isArrayEqual = (a, b) =>
+ a.length === b.length && a.every((v, i) => v === b[i]);
+
+ console.log(isArrayEqual(arr1, arr2)); // true (๊ฐ ๋์ผ์ฑ)
+ ```
+
+ ---
+
+ ### 3-3. ํจ์
+
+ ```jsx
+ function foo() {}
+
+ const bar = function () {};
+
+ const baz = foo;
+
+ console.log(foo === bar); // false (๋ค๋ฅธ ํจ์ ๊ฐ์ฒด)
+ console.log(foo === baz); // true (๊ฐ์ ํจ์ ๊ฐ์ฒด)
+ ```
+
+ - ํจ์๋ ๊ฒฐ๊ตญ **๊ฐ์ฒด**๋ผ์, ์ฐธ์กฐ ๋จ์๋ก ๋น๊ต๋ผ์.
+
+ ---
+
+ ## 4. ์ฐธ์กฐ ๋์ผ์ฑ์ด ์ค์ํ ์ด์
+
+ ---
+
+ ### 4-1. ๊ฐ๋ณ ๊ฐ์ฒด ๊ณต์ ๋ก ์ธํ ์ฌ์ด๋ ์ดํํธ
+
+ ```jsx
+ const state = { count: 0 };
+
+ function increment(s) {
+ s.count += 1;
+ return s;
+ }
+
+ const a = state;
+ const b = increment(state);
+
+ console.log(a === b); // true (๊ฐ์ ๊ฐ์ฒด)
+ console.log(state.count); // 1
+ console.log(a.count); // 1
+ console.log(b.count); // 1
+ ```
+
+ - `state`, `a`, `b` ์ธ ๋ณ์๊ฐ **๊ฐ์ ๊ฐ์ฒด๋ฅผ ๊ณต์ **ํ๊ณ ์์ด์.
+ - ์ด๋ ํ ๊ณณ์์ `count`๋ฅผ ๋ฐ๊พธ๋ฉด **์ ๋ถ ๋์์ ๋ฐ๋๋ ํจ๊ณผ**๊ฐ ๋์.
+ - โ์ฌ๊ธฐ๋ง ๋ฐ๊พผ ์ค ์์๋๋ฐ, ์ ๊ธฐ๋ ๊ฐ์ด ๋ฐ๋์๋คโ๋ ๋ฒ๊ทธ๊ฐ ๋๊ธฐ ์ฌ์ด ํจํด์ด์์.
+
+ ---
+
+ ### 4-2. ๋ถ๋ณ ๊ฐ์ฒด(immutable) + ์ฐธ์กฐ ๋์ผ์ฑ
+
+ ```jsx
+ const state = { count: 0 };
+
+ function incrementImmutable(s) {
+ return { ...s, count: s.count + 1 };
+ }
+
+ const a = state;
+ const b = incrementImmutable(state);
+
+ console.log(a === b); // false (์ ๊ฐ์ฒด)
+ console.log(a.count); // 0
+ console.log(b.count); // 1
+ ```
+
+ - **์๋ณธ์ ๊ทธ๋๋ก ๋๊ณ , ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ ๋ฐํ**ํด์.
+ - ์ด ํจํด์ ์ฐ๋ฉด
+ - ๊ณผ๊ฑฐ ์ํ๋ฅผ ์์ ํ๊ฒ ๋ณด๊ดํ ์ ์๊ณ
+ - โ์ฐธ์กฐ๊ฐ ๋ฐ๋์๋์งโ๋ง ๋ด๋ ๋ณ๊ฒฝ ์ฌ๋ถ๋ฅผ ์ด๋ ์ ๋ ์ ์ ์์ด์.
+
+ ๋ฆฌ์กํธ์์
+
+ - `useMemo`, `useCallback`
+ - `React.memo`, `shouldComponentUpdate`
+ - ๋ฆฌ๋์ค์ ์ํ ๋น๊ต
+
+ ๊ฐ์ ๊ณณ์์ **โ์ฐธ์กฐ๊ฐ ๋ฐ๋์๋?โ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฆฌ๋ ๋๋ง/๊ณ์ฐ ์ต์ ํ๋ฅผ ํ๋ ์ด์ **๊ฐ ์ฌ๊ธฐ์ ์์ด์.
+
+ ---
+
+ ## 5. ์๋ฐ์คํฌ๋ฆฝํธ์์ ์์ฃผ ํ๋ ์ค์๋ค
+
+ ---
+
+ ### 5-1. โ๊ฐ์ฒด ๋ด์ฉ์ด ๊ฐ์๋ฐ ์ false์ฃ ?โ
+
+ ```jsx
+ const a = { x: 1 };
+ const b = { x: 1 };
+
+ console.log(a === b); // false
+ ```
+
+ - ์ด ๋น๊ต๋ **โ๊ฐ์ ๊ฐ์ฒด๋?โ** ๋ฅผ ๋ฌป๋ ๊ฑฐ์์.
+ - โ๋ด์ฉ์ด ๊ฐ๋?โ๋ฅผ ๋ณด๋ ค๋ฉด ๋ณ๋์ **deepEqual** ๋ก์ง์ด๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์จ์ผ ํด์.
+
+ ---
+
+ ### 5-2. ๋ฐฐ์ด๋ ๋ง์ฐฌ๊ฐ์ง
+
+ ```jsx
+ [1, 2, 3] === [1, 2, 3]; // ํญ์ false
+ ```
+
+ ๋งค๋ฒ ์๋ก ๋ง๋ค์ด์ง๋ ๋ฐฐ์ด์ **๋ค ๋ค๋ฅธ ๊ฐ์ฒด**๋ผ์, ์ฐธ์กฐ ๋์ผ์ฑ์ด ๊นจ์ ธ์.
+
+ ---
+
+ ### 5-3. ์ํ๋ฅผ ์ง์ ์์ ํ๋ฉด์, ์ฐธ์กฐ ๋น๊ต๋ก ๋ณ๊ฒฝ ์ฌ๋ถ๋ฅผ ๋ณด๋ ค๋ ๊ฒฝ์ฐ
+
+ ```jsx
+ const state = { x: 1 };
+
+ function mutate(s) {
+ s.x = 2;
+ }
+
+ mutate(state);
+
+ console.log(state === state); // ํญ์ true์ฃ โฆ
+ ```
+
+ - โ๊ฐ์ฒด๋ฅผ ์ง์ ์์ โํ๋๋ฐ, ์ฐธ์กฐ๋ ๊ทธ๋๋ก๋๊น ์ฐธ์กฐ ๋์ผ์ฑ์ผ๋ก๋ ๋ณ๊ฒฝ ์ฌ๋ถ๋ฅผ ์ ์ ์์ด์.
+ - ์ฐธ์กฐ ๋น๊ต๋ก ๋ณ๊ฒฝ ์ฌ๋ถ๋ฅผ ๊ฐ์งํ๊ณ ์ถ๋ค๋ฉด **๋ถ๋ณ ํจํด(์ ๊ฐ์ฒด ์์ฑ)**์ ์จ์ผ ํด์.
+
+ - **๋ฆฌ์กํธ ๋ ๋๋ง ์ต์ ํ**์ **`Referential Equality`**๋ ์ด๋ค ๊ด๊ณ๊ฐ ์์๊น์? ๐
+
+ ๋ฆฌ์กํธ๋ ๊ฐ์ฒด์ **๋ด์ฉ์ ๋น๊ตํ์ง ์๊ณ ์ฐธ์กฐ ๋์ผ์ฑ(`===`)** ์ผ๋ก props์ state์ ๋ณ๊ฒฝ ์ฌ๋ถ๋ฅผ ํ๋จ.
+
+ ๋ฐ๋ผ์ ๊ฐ์ฒดยท๋ฐฐ์ดยทํจ์๋ฅผ ์๋ก ์์ฑํ๋ฉด ๊ฐ์ด ๊ฐ์๋ ์ฐธ์กฐ๊ฐ ๋ฌ๋ผ์ ธ ๋ฆฌ๋ ๋๋ง์ด ๋ฐ์!
+
+ `React.memo`, `useMemo`, `useCallback`์ ์ด๋ฌํ **๋ถํ์ํ ์ฐธ์กฐ ๋ณ๊ฒฝ์ ๋ง์,** ๋ฆฌ๋ ๋๋ง๊ณผ ์ฌ๊ณ์ฐ์ ์ต์ ํํ๊ธฐ ์ํ ๋๊ตฌ.
+
+ ์ด๋ฅผ ์ ๋๋ก ํ์ฉํ๋ ค๋ฉด ์ํ๋ฅผ **๋ถ๋ณ ๊ฐ์ฒด๋ก ๊ด๋ฆฌ**ํด ์ฐธ์กฐ ๋ณ๊ฒฝ์ด ์๋ฏธ ์๋ ๊ฒฝ์ฐ์๋ง ๋ฐ์ํ๋๋ก ํด์ผ ํจ.
+
+- **`useCallabck`๊ณผ `memo`** ๐
+
+ ### ๐ฅ ์ค์ต 1. ๊ฐ์ ์์
+
+ https://www.youtube.com/watch?v=Z3uNjFqYSF8&t=904s
+
+
+
+ - **`useCallabck`** ์ ๋ํ์ฌ ์ ๋ฆฌํด์ฃผ์ธ์! ๐
+
+ # **`useCallabck`** ์ ๋ํ์ฌ ์ ๋ฆฌํด์ฃผ์ธ์! ๐
+
+ ---
+
+ - **`useCallabck`** ์ด ๋ฌด์์ธ์ง? ๐
+
+ # **`useCallabck`** ์ด ๋ฌด์์ธ์ง?
+
+ ---
+
+ - ํจ์(์ฝ๋ฐฑ)๋ฅผ โ๋ฉ๋ชจ์ด์ ์ด์
โ ํ๋ค๋ ๊ฒ ๋ฌด์จ ๋ป์ธ์ง?
+ - ํจ์์ **์คํ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๋ ๊ฒ ์๋๋ผ**,
+
+ **ํจ์ ๊ฐ์ฒด ์์ฒด(์ฐธ์กฐ)๋ฅผ ์ ์ฅ**ํ๋ ๊ฒ์ด๋ค.
+
+ - dependencies๊ฐ ๊ฐ์ผ๋ฉด โ **์ด์ ํจ์ ๊ทธ๋๋ก ๋ฐํ**
+ - dependencies๊ฐ ๋ฐ๋๋ฉด โ **์ ํจ์ ์์ฑ**
+ - ์ธ์ ์ ํจ์๋ฅผ ๋ง๋ค๊ณ , ์ธ์ ๊ธฐ์กด ํจ์๋ฅผ ์ฌ์ฌ์ฉํ๋์ง?
+ - ์ปดํฌ๋ํธ๊ฐ ๋ค์ ๋ ๋๋ง๋์ด๋ **์์กด์ฑ์ด ๋ณํ์ง ์์ผ๋ฉด ๊ฐ์ ํจ์ ์ฐธ์กฐ๋ฅผ ์ฌ์ฌ์ฉ**ํ๋ค.
+ - ์ฆ, ๋งค ๋ ๋๋ง๋ค ์ ํจ์๋ฅผ ๋ง๋ค์ง ์๊ณ **๊ธฐ์กด ํจ์๋ฅผ ์ ์ง**ํด์ค๋ค.
+ - ์์กด์ฑ์ด ๋ณํ ๋๋ง ํจ์๋ฅผ ์์ฑ.
+ - ์ **`useCallabck`**์ ์ฌ์ฉํ๋์ง? ๐
+
+ # ์ **`useCallabck`**์ ์ฌ์ฉํ๋์ง?
+
+ ---
+
+ - **๋ถํ์ํ ๋ฆฌ๋ ๋๋ง ๋ฐฉ์ง**์ ์ด๋ค ๊ด๋ จ์ด ์๋์ง
+ - React๋ props๋ฅผ `===`๋ก ๋น๊ตํ๋ค.
+ - ๋งค ๋ ๋๋ง๋ค ์ ํจ์๊ฐ ์์ฑ๋๋ฉด ์ฐธ์กฐ๊ฐ ๋ฌ๋ผ์ ธ
+
+ `React.memo`๋ก ๊ฐ์ผ ์์๋ ๋ค์ ๋ ๋๋ง๋๋ค.
+
+ - `useCallback`์ **ํจ์ ์ฐธ์กฐ๋ฅผ ๊ณ ์ **ํด ์ด๋ฅผ ๋ง์์ค๋ค.
+ - ์ฑ๋ฅ ์ต์ ํ ๊ด์ ์์ ์ป๋ ์ด๋ vs ๋จ์ฉํ์ ๋์ ์ค๋ฒํค๋
+ - `useCallback`์ ํจ์ ์ฐธ์กฐ๋ฅผ ์ ์งํด **๋ถํ์ํ ๋ฆฌ๋ ๋๋ง๊ณผ ์ฌ๊ณ์ฐ์ ์ค์ด๋ ์ด์ **์ด ์๋ค.
+ - ํนํ `React.memo`๋ก ๊ฐ์ผ ์์ ์ปดํฌ๋ํธ์ ์ฝ๋ฐฑ์ ์ ๋ฌํ ๋ ํจ๊ณผ์ ์ด๋ค.
+ - ํ์ง๋ง ๋ชจ๋ ํจ์์ ์ฌ์ฉํ๋ฉด **์์กด์ฑ ๋น๊ต ๋น์ฉ๊ณผ ์ฝ๋ ๋ณต์ก๋**๊ฐ ์ฆ๊ฐํ๋ค.
+ - ๋ฐ๋ผ์ ์ค์ ์ฑ๋ฅ ์ด๋์ด ์๋ ๊ฒฝ์ฐ์๋ง **์ ๋ณ์ ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ด ์ค์**ํ๋ค.
+ - **`useCallabck`** ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ ๐
+
+ # **`useCallabck`** ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ
+
+ ---
+
+ - **`useCallabck`**์ ์ด๋ป๊ฒ ์ฌ์ฉํ๋์? (์ฝ๋)
+
+ ```tsx
+ import { useCallback } from "react";
+
+ const handleClick = useCallback(() => {
+ console.log("click");
+ }, []);
+ ```
+
+ - `deps` ๋ฐฐ์ด์ ๋ฌด์์ ๋ฃ์ด์ผ ํ๋์ง ๊ท์น
+ - ์ฝ๋ฐฑ ๋ด๋ถ์์ ์ฌ์ฉํ๋ **state, props, ๋ณ์๋ ๋ชจ๋ deps์ ํฌํจ**ํด์ผ ํ๋ค.
+ - deps๋ **ํญ์ ๊ณ ์ ๋ ๊ธธ์ด์ ๋ฐฐ์ด**์ด์ด์ผ ํ๋ค.
+ - React๋ deps๋ฅผ `Object.is`๋ก ๋น๊ตํ๋ค.
+ - ์์กด์ฑ ๋ณ๊ฒฝ ์ ์ฝ๋ฐฑ์ด ์ด๋ป๊ฒ ๋ค์ ๋ง๋ค์ด์ง๋์ง
+ - `useCallback`์ ๋ ๋๋ง ์๋ง๋ค **์์กด์ฑ ๋ฐฐ์ด(deps)์ ์ด์ ๊ฐ๊ณผ ๋น๊ต**ํ๋ค.
+ - React๋ ๊ฐ ์์กด์ฑ์ `Object.is`๋ก ๋น๊ตํด ๋ณ๊ฒฝ ์ฌ๋ถ๋ฅผ ํ๋จํ๋ค.
+ - deps ์ค ํ๋๋ผ๋ ๋ณ๊ฒฝ๋๋ฉด **๊ธฐ์กด ์ฝ๋ฐฑ์ ๋ฒ๋ฆฌ๊ณ ์ ํจ์๋ฅผ ์์ฑ**ํ๋ค.
+ - ๋ชจ๋ ์์กด์ฑ์ด ๋์ผํ๋ฉด **์ด์ ๋ ๋์์ ์์ฑ๋ ์ฝ๋ฐฑ์ ๊ทธ๋๋ก ์ฌ์ฌ์ฉ**ํ๋ค.
+ - **`useCallabck`**์์ ์ค์ํ ๊ฐ๋
๐
+
+ # **`useCallabck`**์์ ์ค์ํ ๊ฐ๋
+
+ ---
+
+ - **์ฐธ์กฐ ๋์ผ์ฑ(reference equality)** ์ด ์ ์ค์ํ์ง (=== ๋น๊ต)
+ - React๋ ๊ฐ์ฒดยท๋ฐฐ์ดยทํจ์์ ๋ณ๊ฒฝ ์ฌ๋ถ๋ฅผ **๊ฐ์ด ์๋๋ผ ์ฐธ์กฐ ๋์ผ์ฑ(`===`)** ์ผ๋ก ํ๋จํ๋ค.
+ - ์ฐธ์กฐ๊ฐ ๊ฐ์ผ๋ฉด โ๋ณ๊ฒฝ ์์โ, ์ฐธ์กฐ๊ฐ ๋ค๋ฅด๋ฉด โ๋ณ๊ฒฝ ์์โ์ผ๋ก ์ธ์ํ๋ค.
+ - ๋ฐ๋ผ์ ๊ฐ์ด ๊ฐ์๋ ์ ๊ฐ์ฒด๋ ์ ํจ์๊ฐ ์์ฑ๋๋ฉด **๋ถํ์ํ ๋ฆฌ๋ ๋๋ง**์ด ๋ฐ์ํ ์ ์๋ค.
+ - `useCallback`, `useMemo`, `React.memo`๋ **์ฐธ์กฐ๋ฅผ ์ ์งํด ์ฑ๋ฅ ์ต์ ํ**๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๋ค.
+ - ํด๋ก์ ์ ์ํ: ์ฝ๋ฐฑ ์์์ state, props๋ฅผ ์ฌ์ฉํ ๋ ์ฃผ์ํ ์
+ - ์ฝ๋ฐฑ ํจ์๋ **์์ฑ ์์ ์ state์ props๋ฅผ ํด๋ก์ ๋ก ์บก์ฒ**ํ๋ค.
+ - ๋ฐ๋ผ์ `useCallback`์ deps์ state๋ props๋ฅผ ๋๋ฝํ๋ฉด **์ต์ ๊ฐ์ด ๋ฐ์๋์ง ์์ ์ ์๋ค**.
+ - ์ฝ๋ฐฑ ๋ด๋ถ์์ state๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์
๋ฐ์ดํธํ ๊ฒฝ์ฐ, **ํจ์ํ ์
๋ฐ์ดํธ(`prev => โฆ`)๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์์ **ํ๋ค.
+ - ํญ์ ์ฝ๋ฐฑ์์ ์ฐธ์กฐํ๋ ๊ฐ์ด **์์กด์ฑ ๋ฐฐ์ด์ ์ ํํ ํฌํจ๋์ด ์๋์ง** ํ์ธํด์ผ ํ๋ค.
+ - **stale closure(๋ก์ ๊ฐ ์บก์ฒ)** ๋ฌธ์ ๋ ์ธ์ ์๊ธฐ๋์ง, ์ด๋ป๊ฒ ํผํ๋์ง
+ - `useCallback`์ผ๋ก ๋ง๋ ํจ์๊ฐ **์์ฑ ๋น์์ state/props ๊ฐ์ ํด๋ก์ ๋ก ๊ธฐ์ต**ํ ๋ ๋ฐ์ํ๋ค.
+ - deps ๋ฐฐ์ด์ ํ์ํ state๋ props๋ฅผ ๋น ๋จ๋ฆฌ๋ฉด, **์ต์ ๊ฐ์ด ์๋ ๊ณผ๊ฑฐ ๊ฐ**์ ๊ณ์ ์ฌ์ฉํ๊ฒ ๋๋ค.
+ - ์ด๋ฅผ ํผํ๋ ค๋ฉด **์ฝ๋ฐฑ์์ ์ฌ์ฉํ๋ ๋ชจ๋ ๊ฐ๋ค์ deps์ ์ ํํ ํฌํจ**ํด์ผ ํ๋ค.
+ - ์ํ ์
๋ฐ์ดํธ๊ฐ ๋ชฉ์ ์ด๋ผ๋ฉด `setState(prev => โฆ)` ๊ฐ์ **ํจ์ํ ์
๋ฐ์ดํธ**๋ฅผ ์ฌ์ฉํ๋ฉด stale closure๋ฅผ ์์ ํ๊ฒ ํผํ ์ ์๋ค.
+ - **`useCallabck`**์ ์ฌ์ฉํ ์ฝ๋ฐฑ ๋ฉ๋ชจ์ด์ ์ด์
์์ ๐
+
+ # **`useCallabck`**์ ์ฌ์ฉํ ์ฝ๋ฐฑ ๋ฉ๋ชจ์ด์ ์ด์
์์
+
+ ---
+
+ - ๋ถ๋ชจ์์ ์์์ผ๋ก ์ฝ๋ฐฑ์ ๋ด๋ ค์ค ๋, `onClick`, `onChange` ๊ฐ์ ํธ๋ค๋ฌ๋ฅผ **`useCallabck`** ์์ด ๋๊ฒผ์ ๋์ **`useCallabck`**์ผ๋ก ๊ฐ์ธ์ ๋๊ฒผ์ ๋ ์ฐจ์ด
+
+ ### โ `useCallback` ์์ด ์ฝ๋ฐฑ ์ ๋ฌ
+
+ ```tsx
+ functionParent() {
+ consthandleClick = () => {
+ console.log("click");
+ };
+
+ return;
+ }
+ ```
+
+ - ๋ ๋๋ง๋ง๋ค **์ ํจ์๊ฐ ์์ฑ**
+ - `Child`๊ฐ `memo`๋ก ๊ฐ์ธ์ ธ ์์ด๋ **ํญ์ ๋ฆฌ๋ ๋๋ง๋จ**
+
+ ---
+
+ ### โ
`useCallback`์ผ๋ก ๊ฐ์ผ ๊ฒฝ์ฐ
+
+ ```tsx
+ functionParent() {
+ const handleClick =useCallback(() => {
+ console.log("click");
+ }, []);
+
+ return;
+ }
+ ```
+
+ - ํจ์ ์ฐธ์กฐ๊ฐ ์ ์ง๋จ
+ - `Child`๋ props๊ฐ ๊ฐ๋ค๊ณ ํ๋จํด **๋ฆฌ๋ ๋๋ง์ ๊ฑด๋๋**
+
+ ---
+
+ ### ์ ๋ฆฌ ํ ์ค โ๏ธ
+
+ > useCallback์ ๋ถ๋ชจ ๋ ๋๋ง ์์๋ ์ฝ๋ฐฑ ์ฐธ์กฐ๋ฅผ ์ ์งํด
+ ์์ ์ปดํฌ๋ํธ์ ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ๋ง๋๋ค.
+ >
+
+ - ์ด๋ฒคํธ ํธ๋ค๋ฌ / ๋น๋๊ธฐ ๋ก์ง์์ **`useCallabck`** ์์ ๐
+
+ # ์ด๋ฒคํธ ํธ๋ค๋ฌ / ๋น๋๊ธฐ ๋ก์ง์์ **`useCallabck`** ์์
+
+ ---
+
+ - ๋ฒํผ ํด๋ฆญ ์ API ํธ์ถํ๋ ํธ๋ค๋ฌ๋ฅผ `useCallback`์ผ๋ก ๊ฐ์ธ๋ ํจํด
+
+ ### ๋ฒํผ ํด๋ฆญ ์ API ํธ์ถ ํธ๋ค๋ฌ
+
+ ```tsx
+ const handleClick =useCallback(async () => {
+ awaitfetch("/api/data");
+ }, []);
+
+ ```
+
+ - ํด๋ฆญ ํธ๋ค๋ฌ๋ฅผ ๋ฉ๋ชจ์ด์ ์ด์
ํด **๋ถํ์ํ ํจ์ ์ฌ์์ฑ**์ ๋ง๋๋ค.
+ - `memo`๋ ์์ ์ปดํฌ๋ํธ์ ์ ๋ฌํ ๋ ํจ๊ณผ์ ์ด๋ค.
+ - `useEffect` ์์์ ์์กด์ฑ์ผ๋ก ์ฝ๋ฐฑ์ ๋ฃ์ ๋ ํจํด
+
+ ### `useEffect` ์์กด์ฑ์ผ๋ก ์ฝ๋ฐฑ์ ๋ฃ๋ ํจํด
+
+ ```tsx
+ const fetchData =useCallback(() => {
+ fetch(`/api/${id}`);
+ }, [id]);
+
+ useEffect(() => {
+ fetchData();
+ }, [fetchData]);
+
+ ```
+
+ - ์ฝ๋ฐฑ์ `useCallback`์ผ๋ก ๊ฐ์ธ๋ฉด **Effect๊ฐ ํ์ํ ๋๋ง ์คํ**๋๋ค.
+ - ๋งค ๋ ๋๋ง๋ค Effect๊ฐ ๋ค์ ์คํ๋๋ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ๋ค.
+ - ํผ ์ ์ถ ํธ๋ค๋ฌ, ๋๋ฐ์ด์ค/์ค๋กํ ํจ์์ ํจ๊ป ์ฌ์ฉํ ๋
+
+ ### ํผ ์ ์ถ / ๋๋ฐ์ด์คยท์ค๋กํ๊ณผ ํจ๊ป ์ฌ์ฉ
+
+ ```tsx
+ const handleSubmit =useCallback(() => {
+ submitForm(form);
+ }, [form]);
+
+ ```
+
+ - ์ด๋ฒคํธ ํธ๋ค๋ฌ์ **์ฐธ์กฐ๋ฅผ ์์ ์ ์ผ๋ก ์ ์ง**ํ ์ ์๋ค.
+ - ๋๋ฐ์ด์คยท์ค๋กํ ํจ์์ ๊ฒฐํฉ ์, **ํ์ด๋จธ๊ฐ ๋งค๋ฒ ์ด๊ธฐํ๋๋ ๋ฌธ์ **๋ฅผ ๋ง์์ค๋ค.
+
+ - **`memo`**์ ๋ํ์ฌ ์ ๋ฆฌํด์ฃผ์ธ์!๐
+
+ # **`memo`**์ ๋ํ์ฌ ์ ๋ฆฌํด์ฃผ์ธ์!๐
+
+ ---
+
+ - **`memo`**๊ฐ ๋ฌด์์ธ์ง? ๐
+
+ # **`memo`**๊ฐ ๋ฌด์์ธ์ง?
+
+ ---
+
+ - `memo`๋ **props๊ฐ ๋ณ๊ฒฝ๋์ง ์์ผ๋ฉด ์ปดํฌ๋ํธ ๋ฆฌ๋ ๋๋ง์ ๊ฑด๋๋ฐ๋** ๊ณ ์ฐจ ์ปดํฌ๋ํธ(HOC)์ด๋ค.
+ - ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง๋์ด๋, **props๊ฐ ์ด์ ๊ณผ ๊ฐ์ผ๋ฉด ์์์ ๋ฆฌ๋ ๋๋ง๋์ง ์๋๋ค**.
+ - ๊ธฐ๋ณธ์ ์ผ๋ก React๋ props๋ฅผ `Object.is`(์์ ๋น๊ต)๋ก ๋น๊ตํ๋ค.
+ - ๋จ, `memo`๋ **์ฑ๋ฅ ์ต์ ํ ๋๊ตฌ์ด์ง ๋ ๋๋ง ๋ณด์ฅ์ ์๋ฏธํ์ง๋ ์๋๋ค**.
+
+ - ์ **`memo`**๋ฅผ ์ฌ์ฉํ๋์ง? ๐
+
+ # ์ **`memo`**๋ฅผ ์ฌ์ฉํ๋์ง?
+
+ ---
+
+ - ๋ ๋๋ง ๋น์ฉ์ด ํฐ ์ปดํฌ๋ํธ์ **๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ๋ฐฉ์ง**ํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค.
+ - ๋ถ๋ชจ ์ํ ๋ณ๊ฒฝ์ด ์ฆ์ง๋ง, ์์ props๋ ๊ฑฐ์ ๋ณํ์ง ์๋ ๊ฒฝ์ฐ์ ํจ๊ณผ์ ์ด๋ค.
+ - `useCallback`, `useMemo`์ ํจ๊ป ์ฌ์ฉํ๋ฉด **์ฐธ์กฐ ๋์ผ์ฑ ์ ์ง๋ก ์ต์ ํ ํจ๊ณผ๊ฐ ์ปค์ง๋ค**.
+ - ๊ฒฐ๊ณผ์ ์ผ๋ก **UI ๋ฐ์์ฑ๊ณผ ์ฑ๋ฅ์ ๊ฐ์ **ํ ์ ์๋ค.
+ - **`memo`** ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ ๐
+
+ # **`memo`** ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ
+
+ ---
+
+ ```tsx
+ import { memo }from"react";
+
+ constChild =memo(functionChild({ value }) {
+ return
{value}
;
+ });
+ ```
+
+ - `memo(Component)` ํํ๋ก ๊ฐ์ธ์ ์ฌ์ฉํ๋ค.
+ - props๊ฐ ์ด์ ๊ณผ ๋์ผํ๋ฉด ์ปดํฌ๋ํธ ๋ ๋๋ง์ ๊ฑด๋๋ด๋ค.
+ - ํ์ํ๋ฉด ๋ ๋ฒ์งธ ์ธ์๋ก **์ปค์คํ
๋น๊ต ํจ์**๋ฅผ ์ ๋ฌํ ์ ์๋ค.
+ - **`memo`**๋ฅผ ์ธ์ ์ฐ๋ฉด ์ข์์ง / ์ ์ข์์ง ๐
+
+ # **`memo`**๋ฅผ ์ธ์ ์ฐ๋ฉด ์ข์์ง / ์ ์ข์์ง
+
+ ---
+
+ ### โ
์ฐ๊ธฐ ์ข์ ๊ฒฝ์ฐ
+
+ - ๋ ๋๋ง ๋น์ฉ์ด ํฌ๊ณ props ๋ณ๊ฒฝ์ด ๋๋ฌธ ์ปดํฌ๋ํธ
+ - ๋ฆฌ์คํธ ์์ดํ
, ์ฐจํธ, ๋ณต์กํ UI ์ปดํฌ๋ํธ
+ - props๋ก ๊ฐ์ฒดยทํจ์ ์ ๋ฌ ์ `useCallback`/`useMemo`์ ํจ๊ป ์ฌ์ฉ
+
+ ### โ ์ ์ข์ ๊ฒฝ์ฐ
+
+ - ๋ ๋๋ง ๋น์ฉ์ด ๋งค์ฐ ์์ ์ปดํฌ๋ํธ
+ - props๊ฐ ์์ฃผ ๋ฐ๋๋ ์ปดํฌ๋ํธ
+ - ๋ฌด๋ถ๋ณํ๊ฒ ์ฌ์ฉํ๋ฉด **๋น๊ต ๋น์ฉ๊ณผ ์ฝ๋ ๋ณต์ก๋๋ง ์ฆ๊ฐ**
+
+ ### ํ ์ค ์์ฝ โ๏ธ
+
+ > memo๋ props์ ์ฐธ์กฐ ๋์ผ์ฑ์ ๊ธฐ์ค์ผ๋ก
+ ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ์ค์ด๊ธฐ ์ํ ์ปดํฌ๋ํธ ์ต์ ํ ๋๊ตฌ๋ค.
+ >
+
+ ---
+
+ ### ๐ ย ์ค์ต 1. ์ ์ถ
+
+ - ๊นํ๋ธ ์ฃผ์ ๐
+ - ์คํ ์์ ๐
+
+- **`useMemo`** ๐
+
+ # **`useMemo`** ๐
+
+ ---
+
+ ### ๐ฅ ์ค์ต 2. ๊ฐ์ ์์
+
+ https://youtu.be/GdnfH_WH8pg?si=lILRTKG4hFOjqrYH
+
+
+
+ - **`useMemo`** ์ ๋ํ์ฌ ์ ๋ฆฌํด์ฃผ์ธ์! ๐
+
+ # **`useMemo`** ์ ๋ํ์ฌ ์ ๋ฆฌํด์ฃผ์ธ์! ๐
+
+ ---
+
+ - **`useMemo`**๊ฐ ๋ฌด์์ธ์ง? ๐
+
+ # **`useMemo`**๊ฐ ๋ฌด์์ธ์ง? ๐
+
+ ---
+
+ - ์ **`useMemo`**๋ฅผ ์ฌ์ฉํ๋์ง? ๐
+
+ # ์ **`useMemo`**๋ฅผ ์ฌ์ฉํ๋์ง? ๐
+
+ ---
+
+ - **`useMemo`** ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ ๐
+
+ # **`useMemo`** ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ ๐
+
+ ---
+
+ - **`useMemo`**์์ ์ค์ํ ๊ฐ๋
๐
+
+ # **`useMemo`**์์ ์ค์ํ ๊ฐ๋
๐
+
+ ---
+
+ - **`useMemo`** ์ค์ ์์ ๐
+
+ # **`useMemo`** ์ค์ ์์ ๐
+
+ ---
+
+
+
+ ---
+
+ ### ๐ ย ์ค์ต 2. ์ ์ถ
+
+ - ๊นํ๋ธ ์ฃผ์ ๐
+ - ์คํ ์์ ๐
+- **Vercel**์ ํ์ฉํ **`๋ฐฐํฌ`**์ CI/CD ๐
+
+ # Vercel์ ํ์ฉํ **`๋ฐฐํฌ`**์ CI/CD ๐
+
+ ---
+
+
+
+ [Vercel Documentation](https://vercel.com/docs)
+
+ [GitHub Actions documentation - GitHub Docs](https://docs.github.com/en/actions)
+
+ - **`๋ฐฐํฌ`**๋ ๋ฌด์์ธ๊ฐ์?
+
+ # **`๋ฐฐํฌ`**๋ ๋ฌด์์ธ๊ฐ์?
+
+ ---
+
+ **`๋ฐฐํฌ`(Deployment)**๋ ๊ฐ๋ฐ์๊ฐ ๋ง๋ ์ฝ๋๋ฅผ ์ค์ ์ฌ์ฉ์๋ค์ด ์ฌ์ฉํ ์ ์๋๋ก ์ธํฐ๋ท ์์ ๊ณต๊ฐํ๋ ๊ณผ์ ์ด์์. ๋ด ์ปดํจํฐ(Localhost)์์๋ง ๋์๊ฐ๋ ์น์ฌ์ดํธ๋ฅผ, ๋๊ตฌ๋ URL์ ํตํด ์ ์ํ ์ ์๋ (Server)๋ก ์ฎ๊ธฐ๋ ์์
์ด๋ผ๊ณ ์๊ฐํ๋ฉด ์ข์์.
+
+ ---
+
+ **ํน์ง ์ ๋ฆฌ:**
+
+ - **๋น๋(Build):** ์ฐ๋ฆฌ๊ฐ ์์ฑํ ์ฝ๋(React, TypeScript ๋ฑ)๋ฅผ ๋ธ๋ผ์ฐ์ ๊ฐ ์ดํดํ ์ ์๋ ํ์ผ(HTML, CSS, JS)๋ก ๋ณํํ๋ ๊ณผ์ ์ด ํ์ํด์.
+ - **ํธ์คํ
(Hosting):** ๋ณํ๋ ํ์ผ๋ค์ 24์๊ฐ ์ผ์ ธ ์๋ ์ปดํจํฐ(์๋ฒ)์ ์ ์ฅํด ๋๊ณ , ์์ฒญ์ด ์ค๋ฉด ๋ณด์ฌ์ค์.
+ - **์ ๊ทผ์ฑ:** ๋ฐฐํฌ๊ฐ ์๋ฃ๋๋ฉด ๊ณ ์ ํ ๋๋ฉ์ธ ์ฃผ์(์: `www.yolog.co.kr`)๊ฐ ์๊ฒจ์ ์ด๋์๋ ์ ์ํ ์ ์์ด์.
+
+ ---
+
+ **๋จ์ ๋ ์์ด์:**
+
+ - ๊ณผ๊ฑฐ์๋ ์ง์ ์๋ฒ ์ปดํจํฐ๋ฅผ ์ฌ๊ณ , ๋ฆฌ๋
์ค๋ฅผ ์ค์นํ๊ณ , ๋ณต์กํ ๋คํธ์ํฌ ์ค์ ์ ํด์ผ ํ์ด์.
+ - ์ฝ๋๋ฅผ ์์ ํ ๋๋ง๋ค ์๋์ผ๋ก ํ์ผ์ ์๋ฒ์ ์
๋ก๋ํด์ผ ํด์ ๋ฒ๊ฑฐ๋กญ๊ณ ์ค์๊ฐ ์ฆ์์ด์.
+ - **Vercel**์ ๋ฌด์์ธ๊ฐ์?
+
+ # **Vercel**์ ๋ฌด์์ธ๊ฐ์?
+
+ ---
+
+ **Vercel**์ ํ๋ก ํธ์๋ ๊ฐ๋ฐ์๊ฐ ๋ณต์กํ ์๋ฒ ์ค์ ์์ด ์์ฃผ ์ฝ๊ณ ๋น ๋ฅด๊ฒ ์น์ฌ์ดํธ๋ฅผ ๋ฐฐํฌํ ์ ์๋๋ก ๋์์ฃผ๋ ํ๋ซํผ์ด์์.
+ React์ ํ๋ ์์ํฌ์ธ **Next.js**๋ฅผ ๋ง๋ ํ์์ ๊ฐ๋ฐํ๊ธฐ ๋๋ฌธ์, ๋ฆฌ์กํธ ๊ธฐ๋ฐ ํ๋ก์ ํธ์ ์ฐฐ๋ก๊ถํฉ์ธ ๋๊ตฌ๋ผ๊ณ ์๊ฐํ๋ฉด ์ข์์.
+
+ ---
+
+ **ํน์ง:**
+
+ - **GitHub ์ฐ๋:** GitHub ์ ์ฅ์์ ์ฝ๋๋ฅผ ์ฌ๋ฆฌ๊ธฐ๋ง ํ๋ฉด(Push), Vercel์ด ์์์ ๊ฐ์งํ๊ณ ๋ฐฐํฌ๋ฅผ ์์ํด์.
+ - **์๋ ์ค์ :** ๋ณต์กํ ์๋ฒ ์ธํ
์์ด๋ HTTPS(๋ณด์ ์ฐ๊ฒฐ), ๋๋ฉ์ธ ์ค์ ๋ฑ์ ์๋์ผ๋ก ํด์ค์.
+ - **๋ฏธ๋ฆฌ๋ณด๊ธฐ(Preview):** ์ค์ ์๋น์ค์ ๋ฐ์ํ๊ธฐ ์ ์, ํ
์คํธ ์ฃผ์๋ฅผ ์์ฑํด ์ค์ ํ์๋ค๊ณผ ๋ฏธ๋ฆฌ ํ์ธํด ๋ณผ ์ ์์ด์.
+ - **๋น ๋ฅธ ์๋:** ์ ์ธ๊ณ ๊ณณ๊ณณ์ ์๋ฒ(CDN)๊ฐ ์์ด์ ์ฌ์ฉ์๊ฐ ์ด๋์ ์๋ ๋น ๋ฅด๊ฒ ์ฌ์ดํธ๋ฅผ ๋ณด์ฌ์ค์.
+
+ - **CI / CD**๋ ๋ฌด์์ธ๊ฐ์?
+
+ # **CI / CD**๋ ๋ฌด์์ธ๊ฐ์?
+
+ ---
+
+ **CI/CD**๋ ๊ฐ๋ฐ๋ถํฐ ๋ฐฐํฌ๊น์ง์ ๊ณผ์ ์ "์๋ํ"ํ์ฌ, ๋ ์์ฃผ, ๋ ์์ ํ๊ฒ ์ฝ๋๋ฅผ ๋ฐฐํฌํ ์ ์๊ฒ ํ๋ ๋ฐฉ๋ฒ๋ก ์ด์ ๋๊ตฌ ๋ชจ์์ด์์.
+ ๊ฐ๋ฐ์๊ฐ ์ผ์ผ์ด ์๋์ผ๋ก ํ๋ ์ผ๋ค์ "๋ก๋ด(์คํฌ๋ฆฝํธ)"์๊ฒ ๋งก๊ฒจ์ ์ค์๋ฅผ ์ค์ด๋ ๊ฒ์ด ํต์ฌ์ด์์.
+
+ ---
+
+ ### **1. CI (Continuous Integration - ์ง์์ ํตํฉ)**
+
+ - **๋ฌด์์ธ๊ฐ์?** ์ฌ๋ฌ ๊ฐ๋ฐ์๊ฐ ์์ฑํ ์ฝ๋๋ฅผ **์์ฃผ, ์ ๊ธฐ์ ์ผ๋ก ํฉ์น๋(Merge)** ๊ณผ์ ์ด์์.
+ - **ํ๋ ์ผ:** ์ฝ๋๊ฐ ํฉ์ณ์ง ๋๋ง๋ค ์๋์ผ๋ก **ํ
์คํธ**๋ฅผ ์คํํ๊ณ , ๋น๋๊ฐ ์ ๋๋์ง ํ์ธํด์.
+ - **์ ํ๋์?** ๋ฒ๊ทธ๋ฅผ ๋ฏธ๋ฆฌ ๋ฐ๊ฒฌํด์, ์๋ชป๋ ์ฝ๋๊ฐ ํฉ์ณ์ง๋ ๊ฒ์ ๋ง๊ธฐ ์ํด์์์. "๋ฌธ์ง๊ธฐ" ์ญํ ์ ํ๋ค๊ณ ๋ณด๋ฉด ๋ผ์.
+
+ ---
+
+ ### **2. CD (Continuous Deployment/Delivery - ์ง์์ ๋ฐฐํฌ/์ ๊ณต)**
+
+ - **๋ฌด์์ธ๊ฐ์?** CI๋ฅผ ํต๊ณผํ ์ฝ๋๋ฅผ ์๋์ผ๋ก **์ฌ์ฉ์์๊ฒ ๋ฐฐํฌ**ํ๋ ๊ณผ์ ์ด์์.
+ - **ํ๋ ์ผ:** ํ
์คํธ๊ฐ ๋๋ ์ฝ๋๋ฅผ ์๋ฒ๋ก ์ ์กํ๊ณ , ์ค์ ์น์ฌ์ดํธ๋ฅผ ์
๋ฐ์ดํธํด์.
+ - **์ ํ๋์?** ๊ฐ๋ฐ์๊ฐ ์๋์ผ๋ก ์
๋ก๋ํ ํ์ ์์ด, ์ฝ๋๋ง ์์ฑํ๋ฉด ๊ณ ๊ฐ์๊ฒ ๊ธฐ๋ฅ์ด ์ฆ์ ์ ๋ฌ๋๊ฒ ํ๊ธฐ ์ํด์์์.
+
+ - **`๋ฐฐํฌ`** vs **Vercel** vs **CI/CD** ํ๋์ ๋น๊ต
+
+ # ๋ฐฐํฌ vs Vercel vs CI/CD ํ๋์ ๋น๊ต
+
+ ---
+
+ | **ํญ๋ชฉ** | **๋ฐฐํฌ (Deployment)** | **Vercel** | **CI / CD** |
+ | --- | --- | --- | --- |
+ | **ํต์ฌ ๊ฐ๋
** | ์๋น์ค ๊ณต๊ฐ | ๋ฐฐํฌ ๋๊ตฌ (ํ๋ซํผ) | ์๋ํ ํ๋ก์ธ์ค |
+ | **์ญํ ** | ๋ด ์ปดํจํฐ -> ์ธ์ ๋ฐ์ผ๋ก | ๋ฐฐํฌ๋ฅผ ์ฝ๊ฒ ํด์ฃผ๋ ์กฐ๋ ฅ์ | ๊ฐ๋ฐ~๋ฐฐํฌ ๊ณผ์ ์ ์ฐ๊ฒฐํ๋ ํ์ดํ๋ผ์ธ |
+ | **๋น์ ** | ๊ฐ๊ฒ ์คํ | ์ธํ
๋ฆฌ์ด/์ค๋น ๋ค ๋ ๋งค์ฅ ์๋ | ๋ก๋ด์ด ์ฒญ์/์๋ฆฌ/์๋น๊น์ง ์๋ํ |
+ | **๋์ด๋** | (๊ณผ๊ฑฐ) ๋งค์ฐ ๋์ | ๋งค์ฐ ๋ฎ์ (ํด๋ฆญ ๋ช ๋ฒ) | ์ค์ ์ ๋ฐ๋ผ ๋ค๋ฆ (GitHub Actions ๋ฑ) |
+ | **์ฃผ์ ์์
** | ํ์ผ ์
๋ก๋, ์๋ฒ ์คํ | GitHub ๋ ํฌ์งํ ๋ฆฌ ์ฐ๊ฒฐ | ํ
์คํธ ์ฝ๋ ์์ฑ, ์ํฌํ๋ก์ฐ(.yml) ์ค์ |
+ - **Vercel๊ณผ CI/CD**๊ฐ ๊ถ์ฅ๋๋ ์ด์
+
+ # **Vercel๊ณผ CI/CD**๊ฐ ๊ถ์ฅ๋๋ ์ด์
+
+ ---
+
+ ํ๋ ๊ฐ๋ฐ ํ๊ฒฝ์์ ํต์ฌ์ **"์์ฐ์ฑ"**๊ณผ **"์์ ์ฑ"**์ด์์:
+
+ > "๊ฐ๋ฐ์๋ ๋น์ฆ๋์ค ๋ก์ง(๊ธฐ๋ฅ ๊ตฌํ)์๋ง ์ง์คํ์ธ์. ๋ฐฐํฌ์ ์ด์์ ๋๊ตฌ๊ฐ ํด๊ฒฐํด ๋๋ฆฝ๋๋ค."
+ >
+
+ ์ฆ, **Vercel**์ ์ฌ์ฉํ๋ฉด ์ธํ๋ผ ๊ตฌ์ถ ์๊ฐ์ ์๋ ์ ์๊ณ , **CI/CD**๋ฅผ ๊ตฌ์ถํ๋ฉด ์ฌ๋์ด ํ ์ ์๋ ์ค์๋ฅผ ์ปดํจํฐ๊ฐ ๋์ ๊ฒ์ฆํด์ฃผ๊ธฐ ๋๋ฌธ์ ํจ์ฌ ์์ ์ ์ธ ์๋น์ค ์ด์์ด ๊ฐ๋ฅํด์.
+
+ ---
+
+ ### **โ ์ธ์ ์ด ๋๊ตฌ๋ค์ ์ฌ์ฉํ ๊น์?**
+
+ ---
+
+ ๐ **์ด๋ฐ ๊ฒฝ์ฐ๋ผ๋ฉด ๊ฐ๋ ฅ ์ถ์ฒํด์**
+
+ - โ ๋ด๊ฐ ๋ง๋ ํ๋ก์ ํธ๋ฅผ ํฌํธํด๋ฆฌ์ค๋ก ์ ์ถํด์ ๋งํฌ๋ก ๋ณด์ฌ์ฃผ๊ณ ์ถ์ ๋ (**Vercel**)
+ - โ ์ฝ๋๋ฅผ ์์ ํ ๋๋ง๋ค ์ผ์ผ์ด ๋ค์ ๋น๋ํ๊ณ ์
๋ก๋ํ๊ธฐ ๊ท์ฐฎ์ ๋ (**CI/CD**)
+ - โ ํ ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉฐ, ํ์์ ์ฝ๋๊ฐ ์๋ฌ ์์ด ์ ํฉ์ณ์ง๋์ง ํ์ธํ๊ณ ์ถ์ ๋
+ - โ ์ค๋ฌด์์์ฒ๋ผ ์ฒด๊ณ์ ์ธ ๊ฐ๋ฐ ํ๋ก์ธ์ค๋ฅผ ๊ฒฝํํด๋ณด๊ณ ์ถ์ ๋
+
+ ---
+
+ ๐ **์ด๋ฐ ๊ฒฝ์ฐ ๊ณผํ ์๋ ์์ด์**
+
+ - โ ์ธํฐ๋ท ์ฐ๊ฒฐ ์์ด ๋ก์ปฌ์์๋ง ๋์ํ๋ ํ๋ก๊ทธ๋จ์ ๋ง๋ค ๋
+ - โ ๋ฐฐํฌํ ํ์ ์์ด ์ฝ๋ ๋ก์ง๋ง ๊ณต๋ถํ๋ ๋จ๊ณ์ผ ๋
+ - **์ถ๊ฐ๋ก ๋ณธ์ธ์ด ํ์ตํ ๋ด์ฉ์ ๋ํด์ ์ ๋ฆฌํด์ฃผ์ธ์** ๐
+
+ # **์ถ๊ฐ๋ก ๋ณธ์ธ์ด ํ์ตํ ๋ด์ฉ์ ๋ํด์ ์ ๋ฆฌํด์ฃผ์ธ์** ๐
+
+ ---
+
+ - **Preview ๋ฐฐํฌ์ ์ค์์ฑ**: Vercel์ PR๋ง๋ค Preview URL์ ์๋ ์์ฑํด, ์ค์ ๋ฐฐํฌ ์ ๊ธฐ๋ฅยทUI๋ฅผ ์์ ํ๊ฒ ๊ฒ์ฆํ ์ ์๋ค.
+ - **ํ๊ฒฝ ๋ณ์ ๊ด๋ฆฌ**: API Key ๊ฐ์ ๋ฏผ๊ฐํ ๊ฐ์ ์ฝ๋์ ์ง์ ๋ฃ์ง ์๊ณ , Vercel์ Environment Variables๋ก ๊ด๋ฆฌํด์ผ ํ๋ค.
+ - **Rollback์ ํ์์ฑ**: ๋ฐฐํฌ ํ ๋ฌธ์ ๊ฐ ์๊ธฐ๋ฉด ์ด์ ๋ฒ์ ์ผ๋ก ์ฆ์ ๋๋๋ฆด ์ ์์ด ์๋น์ค ์์ ์ฑ์ด ๋์์ง๋ค.
+ - **์๋ํ์ ์ ๋ขฐ์ฑ**: CI ๋จ๊ณ์์ ํ
์คํธ๊ฐ ์คํจํ๋ฉด ๋ฐฐํฌ ์์ฒด๊ฐ ์ฐจ๋จ๋์ด, ์ค๋ฅ ์ฝ๋๊ฐ ์ฌ์ฉ์์๊ฒ ๋
ธ์ถ๋๋ ๊ฒ์ ๋ง๋๋ค.
+ - **ํ์
ํจ์จ ํฅ์**: GitHub Actions + Vercel์ ์ฌ์ฉํ๋ฉด ํ์ ๊ฐ โ๋ด ๋ก์ปฌ์์๋ ๋์ดโ ๋ฌธ์ ๋ฅผ ํฌ๊ฒ ์ค์ผ ์ ์๋ค.
+ - **์ค๋ฌด์์ ์ฐ๊ฒฐ์ฑ**: ๋๋ถ๋ถ์ ์ค๋ฌด ํ๋ก ํธ์๋ ํ๋ก์ ํธ๋ CI/CD ๊ธฐ๋ฐ ๋ฐฐํฌ๋ฅผ ์ฌ์ฉํ๋ฏ๋ก, ํ์ต ์์ฒด๊ฐ ์ค๋ฌด ๊ฒฝํ์ด ๋๋ค.
+ - **๋ฐฐํฌ๋ ๊ฐ๋ฐ์ ๋์ด ์๋๋ผ ์์**: ๋ฐฐํฌ ์ดํ ๋ก๊ทธ, ์ฑ๋ฅ, ์ฌ์ฉ์ ๋ฐ์์ ๋ณด๋ฉฐ ์ง์์ ์ผ๋ก ๊ฐ์ ํ๋ ๊ณผ์ ์ด ์ค์ํ๋ค๋ ๊ฒ์ ์ดํดํ๋ค.
+
+# ๐ ย ๋ฏธ์
1 - ์ํ ์ฌ์ดํธ ๋ ๋๋ง ์ต์ ํ
+
+---
+
+
+
+### ๐ฅ ๋ฏธ์
1. ๊ฐ์ ์์
+
+https://www.youtube.com/watch?v=Zr0OP21zF4c&t=3611s
+
+## ๐ฌ 1. ์ํ ๊ฒ์ ๊ธฐ๋ฅ
+
+### ๐ช ๋ ์ด์์
+
+- [ ] ํ์ด์ง ์๋จ์ **์ํ ๊ฒ์ ์์ญ ๋ ์ด์์**์ ๋ง๋ค์ด์ฃผ์ธ์.
+- [ ] ๊ฒ์ ํผ์ `form` ํ๊ทธ๋ก ๊ฐ์ธ์ฃผ์ธ์. (์ํฐ ์
๋ ฅ ์์๋ ๊ฒ์๋๋๋ก)
+
+### ๐ฌ ์ํ ์ ๋ชฉ ์
๋ ฅ
+
+- [ ] โ์ํ ์ ๋ชฉโ์ ์
๋ ฅํ ์ ์๋ `input`(text)๋ฅผ ๋ง๋ค์ด์ฃผ์ธ์.
+- [ ] `placeholder`๋ฅผ ๋ง๋ค์ด์ฃผ์ธ์. **์) ์ํ ์ ๋ชฉ์ ์
๋ ฅํ์ธ์**
+- [ ] ์ฌ์ฉ์๊ฐ ์
๋ ฅํ ๊ฐ์ ์ํ(state)๋ก ๊ด๋ฆฌํด์ฃผ์ธ์.
+
+ 
+
+
+### ๐ ์ฑ์ธ ์ฝํ
์ธ ํ์ ์ฌ๋ถ (์ฒดํฌ๋ฐ์ค)
+
+- [ ] โ์ฑ์ธ ์ฝํ
์ธ ํฌํจโ ์ฌ๋ถ๋ฅผ ์ ํํ ์ ์๋ `checkbox`๋ฅผ ๋ง๋ค์ด์ฃผ์ธ์.
+- [ ] ์ฒดํฌ ์ฌ๋ถ๋ฅผ ์ํ๋ก ๊ด๋ฆฌํด์ฃผ์ธ์. (true/false)
+- [ ] ์ค์ API ํธ์ถ ์, ์ด ๊ฐ์ ๋ฐ๋ผ **์ฑ์ธ ์ฝํ
์ธ ํฌํจ ์ฌ๋ถ๊ฐ ๋ฐ์๋๋๋ก** ํด์ฃผ์ธ์. (์: TMDB์ `include_adult` ํ๋ผ๋ฏธํฐ ํ์ฉ ๋ฑ)
+
+### ๐ ์ธ์ด ์ ํ (ํ๊ตญ์ด / ์์ด / ์ผ๋ณธ์ด)
+
+- [ ] ์ธ์ด๋ฅผ ์ ํํ ์ ์๋ `select` ๋ฐ์ค๋ฅผ ๋ง๋ค์ด์ฃผ์ธ์.
+- [ ] ์ต์
์ ์๋ 3๊ฐ์ง ์ค์์ ์ ํ ๊ฐ๋ฅํ๊ฒ ํด์ฃผ์ธ์.
+ - [ ] ํ๊ตญ์ด (ko-KR)
+ - [ ] ์์ด (en-US)
+ - [ ] ์ผ๋ณธ์ด (ja-JP)
+ - [ ] ์ค์ API ํธ์ถ ์, ์ ํํ ์ธ์ด ์ฝ๋๊ฐ ์ ์ฉ๋๋๋ก ํด์ฃผ์ธ์.
+- [ ] ์ ํ๋ ์ธ์ด ๊ฐ์ ์ํ๋ก ๊ด๋ฆฌํด์ฃผ์ธ์.
+
+ 
+
+
+---
+
+## ๐ช 2. ์ํ ์์ธ ์ ๋ณด ๋ชจ๋ฌ ๊ตฌํ
+
+### ๐จ ๋ชจ๋ฌ ๋์์ธ ์๊ตฌ์ฌํญ
+
+- [ ] ์ํ ์นด๋๋ฅผ ํด๋ฆญํ๋ฉด **์ ํ๋ ์ํ์ ์ ๋ณด**๋ฅผ ๋ชจ๋ฌ ํํ๋ก ๋ณด์ฌ์ฃผ์ธ์.
+- [ ] ์ ๊ณต๋ **์ด๋ฏธ์ง/์์๊ณผ ์ต๋ํ ์ ์ฌํ ๋ ์ด์์**์ผ๋ก ๋ชจ๋ฌ์ ๋์์ธํด์ฃผ์ธ์.
+ - [ ] ํฌ์คํฐ, ์ ๋ชฉ, ํ์ , ๊ฐ๋ด์ผ, ์ค๊ฑฐ๋ฆฌ ๋ฑ์ด ๋ณด๊ธฐ ์ข๊ฒ ๋ฐฐ์นํด์ฃผ์ธ์.
+ - [ ] ์ค์์ ์นด๋ ํํ์ ๋ชจ๋ฌ ๋ฐ์ค๊ฐ ๋ํ๋๊ฒ ํด์ฃผ์ธ์.
+
+ [Screen Recording 2025-05-05 at 2.27.20โฏAM.mov](attachment:f75fbe0c-fb14-437c-9c45-199a7e905ed8:Screen_Recording_2025-05-05_at_2.27.20_AM.mov)
+
+- [ ] ๋ชจ๋ฌ ์๋จ์ **ํฌ์คํฐ ์ด๋ฏธ์ง**๋ฅผ ๋ณด์ฌ์ฃผ์ธ์.
+- [ ] ๋ชจ๋ฌ์ ์ต์ ์๋ ์ด๋ฏธ์ง์ ์ ๋ณด๋ค์ ํ์ํด์ฃผ์ธ์.
+
+ 
+
+- [ ] ๋ชจ๋ฌ ์์ **โIMDb์์ ๊ฒ์ํ๊ธฐโ ๋ฒํผ**์ ๋ง๋ค์ด์ฃผ์ธ์.
+ - [ ] ๋ฒํผ ํด๋ฆญ ์, ์ ํญ์์ IMDb ๊ฒ์ ๊ฒฐ๊ณผ๊ฐ ์ด๋ฆฌ๋๋ก ํด์ฃผ์ธ์.
+ - [ ] ์: `https://www.imdb.com/find?q=${์ํ์ ๋ชฉ}` ํ์์ผ๋ก URL ๊ตฌ์ฑ
+- [ ] ๋ชจ๋ฌ ๋ด๋ถ์ โ๋ซ๊ธฐโ ๋ฒํผ์ ๋ง๋ค์ด์ฃผ์ธ์.
+ - [ ] ๋ซ๊ธฐ ๋ฒํผ ํด๋ฆญ์ ๋ชจ๋ฌ์ด ๋ซํ๊ฒ ํด์ฃผ์ธ์.
+
+---
+
+## โ๏ธ ์ฑ๋ฅ ์ต์ ํ (React.memo, useCallback, useMemo)
+
+- [ ] ๋ธ๋ผ์ฐ์ ์ **React DevTools**๋ฅผ ์ค์นํ๋ค.
+
+ [React Developer Tools - Chrome Web Store](https://chromewebstore.google.com/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi?pli=1)
+
+- [ ] React DevTools์ **Profiler ํญ**์ ์ด์ด์ฃผ์ธ์.
+- [ ] ์ํ ๊ฒ์ ๋ฐ ํํฐ๋ง์ ํ ๋ฒ ์ํํด ๋ณด๊ณ , ์ด๋ค ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง๋๋์ง ํ์ธํด์ฃผ์ธ์.
+
+ [Screen Recording 2025-05-05 at 2.28.37โฏAM.mov](attachment:75ffd2ba-abb4-482c-b42f-3801c50db5ba:Screen_Recording_2025-05-05_at_2.28.37_AM.mov)
+
+ - [ ] ๋ถํ์ํ๊ฒ ์์ ์ ์ฒด๊ฐ ๋ฆฌ๋ ๋๋ง ๋๋ค๋ฉด, ์์ธ์ ์ฐพ์ `memo`, `useCallback`, `useMemo`๋ฅผ ์กฐ์ ํด์ฃผ์ธ์.
+- [ ] ์ต์ ํ ์ / ํ์ ์ฐจ์ด๋ฅผ ์บก์ฒํด์ ๊ธฐ๋กํ๊ฑฐ๋, ๊ฐ๋จํ ์ ๋ฆฌํด ์ฃผ์ธ์.
+ - **์ ์ฉํ ์ต์ ํ ์ ๋ฆฌํด ๋ณด๊ธฐ**
+- [ ] ๊ทธ๋์ ์ฌ๋ฌ๋ถ์ด ์ ์ํ์ **LP ์ฌ์ดํธ**๋ ์ต์ ํ๋ฅผ 3๊ฐ ์ด์ ํด๋ณด์๊ณ ์๋์ ๋จ๊ฒจ์ฃผ์ธ์.
+ - **LP ํ์ด์ง ์ฑ๋ฅ ๊ฐ์ ํฌ์ธํธ ์ ๋ฆฌ**
+
+### ๐ ย ๋ฏธ์
1. ์ ์ถ
+
+- ๊นํ๋ธ ์ฃผ์ ๐
+- ์คํ ์์ ๐
+
+---
+
+# ๐ ย ๋ฏธ์
2. Vercel์ ํ์ฉํ ์ํ ์ฌ์ดํธ ๋ฐฐํฌ ๋ฐ ๋๋ฉ์ธ ์ฐ๊ฒฐ
+
+---
+
+
+
+### ๐ฅ ๋ฏธ์
2. ๊ฐ์ ์์
+
+https://youtu.be/GX9QbJiiQyQ?si=hVBHTZqgySzoyy82
+
+### ๐ ๋ฏธ์
2. ๋ธ๋ก๊ทธ ์๋ฃ
+
+[๊ฐ๋ฐ์ ๋งคํ | ์ฐ๋ฆฌ๋ Vercel๋ก ๊ฐ๋ค! ํ๋ก ํธ์๋ ๋ฐฐํฌ ๊ฐ์ด๋](https://www.yolog.co.kr/post/vercel-deployment)
+
+### Vercel ๋ฐฐํฌ ์ฒดํฌ๋ฆฌ์คํธ
+
+---
+
+**1. ์ค๋น ๋จ๊ณ (GitHub & CLI)**
+
+๋ด ์ฝ๋๋ฅผ ๋ฐฐํฌํ ์ค๋น๋ฅผ ํ๋ ๋จ๊ณ์์.
+
+- [ ] **GitHub ๋ ํฌ์งํ ๋ฆฌ ์์ฑ ๋ฐ ์ฝ๋ ์
๋ก๋ (Push)**
+ - `git init` โ `git add .` โ `git commit` โ `git push`
+ - โ ๏ธ **์ฃผ์:** API ํค๊ฐ ๋ค์ด์๋ `.env` ํ์ผ์ ์ ๋ ์ฌ๋ฆฌ๋ฉด ์ ๋ผ์! (`.gitignore` ํ์ธ)
+- [ ] **Vercel CLI ์ค์น**
+ - ํฐ๋ฏธ๋์ `npm install -g vercel` ์
๋ ฅ
+- [ ] **Vercel ๋ก๊ทธ์ธ**
+ - ํฐ๋ฏธ๋์ `vercel login` ์
๋ ฅ ํ GitHub ๊ณ์ ๋ฑ์ผ๋ก ๋ก๊ทธ์ธ ์๋ฃํ๊ธฐ
+
+**2. ํ๋ก์ ํธ ์ฐ๊ฒฐ ๋ฐ ์ฒซ ๋ฐฐํฌ (Preview)**
+
+Vercel๊ณผ ๋ด ํ๋ก์ ํธ๋ฅผ ์ฐ๊ฒฐํ๊ณ ๋ฏธ๋ฆฌ๋ณด๊ธฐ(Preview)๋ฅผ ๋์ฐ๋ ๋จ๊ณ์์.
+
+- [ ] **Vercel ์ฐ๋ ์์**
+ - ํ๋ก์ ํธ ๊ฒฝ๋ก์์ `vercel` ๋ช
๋ น์ด ์
๋ ฅ
+- [ ] **์ด๊ธฐ ์ค์ ์ง๋ฌธ ๋ต๋ณํ๊ธฐ**
+- [ ] **Preview ๋ฐฐํฌ ํ์ธ**
+ - ํฐ๋ฏธ๋์ ๋ฌ `Preview` URL๋ก ์ ์ํด์ ์ฌ์ดํธ๊ฐ ๋์ค๋์ง ํ์ธํ๊ธฐ
+
+**3. ์ค์๋น์ค ๋ฐฐํฌ (Production)**
+
+์ด์ ์ง์ง ์ฌ์ฉ์๊ฐ ๋ณผ ์ ์๋ ์ฃผ์๋ก ๋ฐฐํฌํ๋ ๋จ๊ณ์์.
+
+- [ ] **Production ๋ฐฐํฌ ๋ช
๋ น์ด ์คํ**
+ - ํฐ๋ฏธ๋์ `vercel --prod` ์
๋ ฅ
+- [ ] **Production URL ํ์ธ**
+ - `Production` ์์ ๋ฌ URL๋ก ์ ์ํด์ ํ์ธํ๊ธฐ
+
+**4. ํ์ ์ค์ ๋ฐ ์๋ฌ ํด๊ฒฐ**
+
+๋ธ๋ก๊ทธ์์ ๊ฐ์กฐํ **"์๋ก๊ณ ์นจ ์ 404 ์๋ฌ"**์ **"ํ๊ฒฝ๋ณ์"** ํด๊ฒฐ ๋จ๊ณ์์.
+
+- [ ] **`react-router-dom`**์ ํ์ฉํ์ฌ ์ํ ์์ธํ์ด์ง ๋ผ์ฐํ
๋ง ํด์ฃผ์ธ์
+ - [ ] ์ ๋๋ก **`/movies/:movieId`** ํ์ด์ง ์ด๋์ด ๋๋์ง ํ์ธํด์ฃผ์ธ์. (์ค์ ๋ก ๋์์ธ์ ํ ํ์๋ ์์ต๋๋ค.)
+- [ ] **ํ๊ฒฝ๋ณ์(Environment Variables) ๋ฑ๋ก**
+ - Vercel ๋์๋ณด๋ โ Settings โ Environment Variables ํญ ์ด๋
+ - `.env` ํ์ผ์ ์๋ ๋ด์ฉ(API URL ๋ฑ)์ ๋๊ฐ์ด ์
๋ ฅํ๊ณ Save
+ - **ํ์:** ์ ์ฅ ํ ๋ฐ๋์ **์ฌ๋ฐฐํฌ(`vercel --prod`)** ํด์ผ ์ ์ฉ๋จ!
+- [ ] **SPA ์๋ก๊ณ ์นจ 404 ์๋ฌ ๋ฐฉ์ง (`vercel.json`)**
+ - React, Vue ๋ฑ SPA ํ๋ก์ ํธ๋ผ๋ฉด ํ์!
+ - ํ๋ก์ ํธ ์ต์๋จ์ `vercel.json` ํ์ผ ๋ง๋ค๊ธฐ
+ - ๋ธ๋ก๊ทธ์ ๋์จ `rewrites` ์ฝ๋(๋ชจ๋ ๊ฒฝ๋ก๋ฅผ index.html๋ก ๋ณด๋ด๋ ์ค์ ) ๋ณต์ฌยท๋ถ์ฌ๋ฃ๊ธฐ
+
+**5. ๋๋ฉ์ธ ์ฐ๊ฒฐ (์ ํ ์ฌํญ)**
+
+๋๋ง์ ์์ ์ฃผ์(`yolog.co.kr` ๋ฑ)๋ฅผ ๊ฐ๊ณ ์ถ๋ค๋ฉด ์งํํ์ธ์.
+
+- [ ] **๋๋ฉ์ธ ์ถ๊ฐ**
+ - Vercel ๋์๋ณด๋ โ Domains ํญ โ ๊ตฌ์
ํ ๋๋ฉ์ธ ์
๋ ฅ ํ Add
+- [ ] **DNS ๋ ์ฝ๋ ์ค์ **
+ - ๋๋ฉ์ธ ๊ตฌ์
์ฒ(๊ฐ๋น์ ๋ฑ) ์ค์ ํ์ด์ง ์ด๋
+ - **A Record** (IP ์ฃผ์) ๋๋ **CNAME Record** (vercel.app ์ฃผ์) ์
๋ ฅ
+- [ ] **์ฐ๊ฒฐ ํ์ธ**
+ - 'Configured Correctly' ์ด๋ก๋ถ์ด ๋ค์ด์ค๋์ง ํ์ธํ๊ธฐ
+
+### ๐ ย ๋ฏธ์
2. ์ ์ถ
+
+- ๊นํ๋ธ ์ฃผ์ ๐
+- ๋ฐฐํฌ ์ฌ์ดํธ ๋งํฌ ๐
+
+# ๐ ย ์ํฌ๋ถ ํผ๋๋ฐฑ (์๋ฃ)
+
+---
+
+
+
+[](https://forms.gle/PCLJq6NUn1qBd1Ha8)
+
+# ๐ ย ์ฝ๋ ๋ฆฌ๋ทฐ
+
+---
+
+
+
+- ๋ด๊ฐ ๋ฆฌ๋ทฐํ ๋ด์ฉ์ ์บก์ฒํด ์
๋ก๋
+
+ **์์**
+
+ 
+
+- ๋ฐ์ ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ์ํ์ฌ ๊ฐ์ ํ ์ฝ๋์ ์บก์ฒ ์
๋ก๋
+
+ **์์**
+
+ 
+
+
+# ๐ฅย Vercel์ ์ด๋ป๊ฒ ๋ฌด๋ฃ๋ก ๋ฐฐํฌ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ ๊น?
+
+---
+
+
+
+[Vercel์ ์ด๋ป๊ฒ ๋ฌด๋ฃ๋ก ๋ฐฐํฌ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ ๊น?](https://www.notion.so/Vercel-2b8b57f4596b81618336d5d8976bfb63?pvs=21)
+
+# ๐ ย ํ์ต ํ๊ณ
+
+---
+
+
+
+- ๐ขย ํ์ต ํ๊ณ (์์, ์์๋ง ๋ณต์ฌํ์๊ณ ์ง์์ฃผ์ธ์.)
+ - **ํ๋ก ํธ์๋ ๋ฐฐํฌ, Vercel ํ์ฉ**
+ - **์ดํดํ ์ **: Vercel์ ํ๋ก ํธ์๋ ํ๋ก์ ํธ๋ฅผ **๋น ๋ฅด๊ณ ๊ฐํธํ๊ฒ ๋ฐฐํฌ**ํ ์ ์๋ ํ๋ซํผ์
๋๋ค.
+
+ GitHub ์ฐ๋, ํ๊ฒฝ๋ณ์ ์ค์ , ์ปค์คํ
๋๋ฉ์ธ ์ฐ๊ฒฐ ๋ฑ ๋ฐฐํฌ ๊ณผ์ ๋๋ถ๋ถ์ด GUI์ CLI๋ก ์ฝ๊ฒ ์ฒ๋ฆฌ๋๋ฉฐ, SPA ํ๊ฒฝ์์๋ ๋ผ์ฐํ
๋ฌธ์ ๋ฅผ `vercel.json` ์ค์ ์ผ๋ก ํด๊ฒฐํ ์ ์์ต๋๋ค.
+
+ - ์์:
+
+ ```bash
+ # CLI๋ก ๋ฐฐํฌ
+ vercel # Preview ๋ฐฐํฌ
+ vercel --prod # Production ๋ฐฐํฌ
+ ```
+
+ ```json
+ // SPA ๋ผ์ฐํ
๋ฌธ์ ํด๊ฒฐ
+ {
+ "routes": [
+ { "src": "/[^.]+", "dest": "/index.html", "status": 200 }
+ ]
+ }
+ ```
+
+ - **์ด๋ ค์ด ์ (๊ฐ์ ๋ฐฉ๋ฒ)**: SPA ๊ธฐ๋ฐ ํ๋ก์ ํธ๋ ์๋ก๊ณ ์นจ ์ 404 ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ผ๋ฉฐ, ํ๊ฒฝ๋ณ์ ๊ด๋ฆฌ, ์ปค์คํ
๋๋ฉ์ธ ์ฐ๊ฒฐ ๊ณผ์ ์ด ์ฒ์์๋ ํท๊ฐ๋ ธ์ต๋๋ค.
+ - ๊ฐ์ ๋ฐฉ๋ฒ: `vercel.json` ์ค์ ์ผ๋ก SPA ๋ผ์ฐํ
๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ , Vercel Dashboard์์ ํ๊ฒฝ๋ณ์์ DNS ์ค์ ์ ์ง์ ํ์ธํ๋ฉด์ ๋ฐ๋ณต์ ์ผ๋ก ๋ฐฐํฌ ์ค์ต์ ์งํํ์ต๋๋ค.
+ - ์์:
+
+ ```tsx
+ // ํ๊ฒฝ๋ณ์ ์ฌ์ฉ
+ const api = axios.create({
+ baseURL: import.meta.env.VITE_API_URL,
+ headers: { 'Content-Type': 'application/json' },
+ });
+
+ ```
+
+ - **ํ๊ณ **: ์ค์ ๋ฐฐํฌ ๊ณผ์ ์ ๊ฒฝํํด๋ณด๋, ๋ก์ปฌ ํ๊ฒฝ๊ณผ ๋ค๋ฅธ ์ค์ ์๋น์ค ํ๊ฒฝ์์์ ํ
์คํธ ํ์์ฑ์ ์ดํดํ ์ ์์์ต๋๋ค.
+
+ ์์ผ๋ก ํ๋ก์ ํธ๋ฅผ ์งํํ ๋, GitHub ์ฐ๋๊ณผ Vercel ๋ฐฐํฌ๋ฅผ ํ์ฉํด **์ฆ์ ํ
์คํธ ๊ฐ๋ฅํ ํ๊ฒฝ**์ ๋ง๋ค๊ณ , SPA ๋ผ์ฐํ
๋ฌธ์ ์ ํ๊ฒฝ๋ณ์๋ฅผ ์ ๊ฒฝ ์จ์ ์์ ์ ์ผ๋ก ์๋น์ค๋ฅผ ์ด์ํ ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค.
+
+
+ ---
+
+ ### ์ฐธ๊ณ ์๋ฃ
+
+ [๊ฐ๋ฐ์ ๋งคํ | ์ฐ๋ฆฌ๋ Vercel๋ก ๊ฐ๋ค! ํ๋ก ํธ์๋ ๋ฐฐํฌ ๊ฐ์ด๋](https://www.yolog.co.kr/post/vercel-deployment)
+
+
+# ๐คย ์ฐธ๊ณ ์๋ฃ
+
+---
+
+[useCallback โ React](https://ko.react.dev/reference/react/useCallback)
+
+[useMemo โ React](https://ko.react.dev/reference/react/useMemo)
+
+[memo โ React](https://ko.react.dev/reference/react/memo)
+
+[๊ฐ๋ฐ์ ๋งคํ | ์ฐ๋ฆฌ๋ Vercel๋ก ๊ฐ๋ค! ํ๋ก ํธ์๋ ๋ฐฐํฌ ๊ฐ์ด๋](https://www.yolog.co.kr/post/vercel-deployment)
+
+[Vercel Documentation](https://vercel.com/docs)
+
+[GitHub Actions documentation - GitHub Docs](https://docs.github.com/en/actions)
+
+# ๐ก๏ธย ์ ์๊ถ
+
+---
+
+**ยฉ 2025 [Kim Yongmin (Matthew)](https://www.youtube.com/@yongcoding). All rights reserved.**
\ No newline at end of file