diff --git a/Aug/article/Deep-Dive-into-React-Concurrent-Mode-Exploring-Key-Features-and-Use-Cases.md b/Aug/article/Deep-Dive-into-React-Concurrent-Mode-Exploring-Key-Features-and-Use-Cases.md
new file mode 100644
index 0000000..37e217a
--- /dev/null
+++ b/Aug/article/Deep-Dive-into-React-Concurrent-Mode-Exploring-Key-Features-and-Use-Cases.md
@@ -0,0 +1,324 @@
+# [Deep Dive into React Concurrent Mode: Exploring Key Features and Use Cases](https://www.dhiwise.com/post/deep-dive-into-react-concurrent-mode-exploring-key-features-and-use-cases)
+
+### ๐๏ธ ๋ฒ์ญ ๋ ์ง: 2024.08.04
+
+### ๐ง ๋ฒ์ญํ ํฌ๋ฃจ: ๋ฒ๊ฑด๋(์ ํํ)
+
+---
+
+์๋
ํ์ธ์, React ์ด์ฑ ํฌ ์ฌ๋ฌ๋ถ!
+
+React Concurrent Mode์ ๋ฏธ์คํฐ๋ฆฌ๋ฅผ ํ์ด๋ด๋ ์ง๋ฆฟํ ์ฌ์ ์ ์ค๋นํ์ธ์. React 18์์ ๋์
๋ ์ด ๊ฐ๋ ฅํ ์๋ก์ด ๊ธฐ๋ฅ์ ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌ์ถํ๋ ๋ฐฉ์์ ํ์ ํ ๊ฒ์
๋๋ค. ๋ง์น React ์ฑ์ด ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ฐจ๋จํ์ง ์๊ณ ์ฌ๋ฌ ์์
์ ๋์์ ์ํํ ์ ์๋ ์๋ก์ด ์ฐจ์์ผ๋ก ๋ค์ด๊ฐ๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค.
+
+๋ฌด๊ฑฐ์ด ๊ณ์ฐ์ด๋ ๋คํธ์ํฌ ์์ฒญ ์ค์๋ ์ฑ์ด ์๋ต์ฑ์ ์ ์งํ ์ ์๋ ์ธ๊ณ๋ฅผ ์์ํด ๋ณด์ธ์. ์ฌ์ฉ์๊ฐ ์ํธ์์ฉํ ๋ UI๊ฐ ๋ฉ์ถ์ง ์๋ ์ธ๊ณ๋ฅผ ๋ง์ด์ฃ . ์ด๊ฒ์ด Concurrent ๊ธฐ๋ฅ์ ์ฝ์์
๋๋ค. ์ด๊ฒ์ ๋จ์ํ ์๋ก์ด ๊ธฐ๋ฅ์ด ์๋๋ผ React์ ๋ํ ์๋ก์ด ์ฌ๊ณ ๋ฐฉ์์
๋๋ค.
+
+๊ทธ๋ผ, ์์ ๋ฒจํธ๋ฅผ ๋งค๊ณ React์ ๋์์ฑ ์ธ๊ณ๋ก ๋ฐ์ด๋ค ์ค๋น๋ฅผ ํฉ์๋ค!
+
+```tsx
+import { unstable_createRoot } from "react-dom";
+
+const root = unstable_createRoot(document.getElementById("root"));
+
+root.render();
+```
+
+์ด ์ฝ๋ ์ค๋ํซ์์ ์ฐ๋ฆฌ๋ react-dom์ unstable_createRoot ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ฃจํธ ๋
ธ๋๋ฅผ ์์ฑํ๊ณ ์์ต๋๋ค. ์ด ํจ์๋ ์ ์ฒด ์ฑ์ ๋ํด ๋์ ๋ ๋๋ง์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
+
+๋์ ๋ ๋๋ง์ ์๋ฆ๋ค์์ React๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ UI์ ์ฌ๋ฌ ๋ฒ์ ์ ์ค๋นํ ๋ค์ ์ฌ์ฉ์ ์ํธ์์ฉ ๋ฐ ๋คํธ์ํฌ ์กฐ๊ฑด์ ๋ฐ๋ผ ๋น ๋ฅด๊ฒ ์ ํํ ์ ์๊ฒ ํ๋ค๋ ๊ฒ์
๋๋ค. ์ด๋ ๋ฌด๊ฑฐ์ด ๊ณ์ฐ์ด๋ ๋คํธ์ํฌ ์์ฒญ์ด ์๋ ๋ณต์กํ ์ฑ์์๋ ๋ ์๋ต์ฑ์ด ์ข๊ณ ์ ๋์ ์ธ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํฉ๋๋ค.
+
+๊ทธ๋ฌ๋ ๋์ ๋ ๋๋ง์ด ๋ง๋ณํต์น์ฝ์ ์๋๋๋ค. ์ด๋ ์๋ก์ด ์์ค์ ๋ณต์ก์ฑ์ ๋์
ํ๋ฉฐ ์ฑ์ด ์
๋ฐ์ดํธ๋๊ณ ๋ ๋๋ง๋๋ ๋ฐฉ์์ ๋ค๋ฅด๊ฒ ์๊ฐํด์ผ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ฅผ ์ตํ๊ฒ ๋๋ฉด, React ์ฑ์ด ํ ๋จ๊ณ ๋ ๋ฐ์ ํ ์ ์๋ ๋ฐฉ๋ฒ์ ์๊ฒ ๋ ๊ฒ์
๋๋ค.
+
+## ๋ฆฌ์กํธ 16์ ๋นํด์ ๋์์ฑ ๋ชจ๋๋ ์ด๋ป๊ฒ ๋ค๋ฅธ๊ฐ
+
+React 18์ ๋ฑ์ฅ๊ณผ ํจ๊ป React ํ์ ์ด์ ๋ฒ์ ์ธ React 16 ๋ฐ ์ด์ ๋ฒ์ ์์ ์ฌ์ฉ๋ ๋๊ธฐ ๋ ๋๋ฌ์ ๊ทผ๋ณธ์ ์ผ๋ก ๋ค๋ฅธ ์๋ก์ด ๋์ ๋ ๋๋ฌ๋ฅผ ๋์
ํ์ต๋๋ค. ๊ทธ๋ ๋ค๋ฉด ์ ํํ ๋ฌด์์ด ๋ณ๊ฒฝ๋์์๊น์?
+
+React 16์์๋ ๋ ๋๋ง์ด ํญ์ ๋๊ธฐ์ ์ด์์ต๋๋ค. ์ด๋ React๊ฐ ์ปดํฌ๋ํธ ํธ๋ฆฌ์ ๋ ๋๋ง์ ์์ํ๋ฉด ์ ์ฒด ํธ๋ฆฌ๊ฐ ๋ ๋๋ง๋ ๋๊น์ง ์ค์งํ์ง ์๋๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์ด๋ ํฐ ๋ ๋๋ง ์์
์ด ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ฐจ๋จํ์ฌ UI๊ฐ ๋ฉ์ถ๊ณ ์๋ตํ์ง ์๊ฒ ๋๋ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์์์ต๋๋ค.
+
+๋ฐ๋ฉด, React 18์ ๋์ ๋ ๋๋ง์ ๋์
ํฉ๋๋ค. ์ด ์๋ก์ด ๋ชจ๋๋ React๊ฐ ๋ ๋๋ง ํ๋ก์ธ์ค๋ฅผ ์ค๋จํ๊ณ ์ฌ์ฉ์ ์
๋ ฅ๊ณผ ๊ฐ์ ๋ ๊ธด๊ธํ ์์
์ ์ฒ๋ฆฌํ ์ ์๊ฒ ํฉ๋๋ค. ์ด๋ ๋ง์น React๊ฐ ๋์์ ์ฌ๋ฌ ๊ณณ์ ์์ ์ ์๋ ์ด๋ฅ๋ ฅ์ ๊ฐ์ง ๊ฒ๊ณผ ๊ฐ์ต๋๋ค.
+
+```ts
+// React 16
+ ReactDOM.render(, document.getElementById('root'));
+
+// React 18
+ const root = ReactDOM.createRoot(document.getElementById('root'));
+ root.render()
+```
+
+React 16์์๋ ReactDOM.render๋ฅผ ์ฌ์ฉํ์ฌ ์ฑ์ ๋ ๋๋งํฉ๋๋ค. ๊ทธ๋ฌ๋ React 18์์๋ ReactDOM.createRoot๋ฅผ ์ฌ์ฉํ์ฌ ๋ฃจํธ ๋
ธ๋๋ฅผ ์์ฑํ ํ ํด๋น ๋ฃจํธ ๋
ธ๋์์ render๋ฅผ ํธ์ถํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ฑ ์ ์ฒด์์ ๋์ ๋ ๋๋ง์ด ๊ฐ๋ฅํด์ง๋๋ค.
+
+ํ์ง๋ง ์ฐจ์ด์ ์ ๋จ์ํ ์ฑ์ ๋ ๋๋งํ๋ ๋ฐฉ์์ ๊ทธ์น์ง ์์ต๋๋ค. ๋์ ๋ชจ๋๋ฅผ ํตํด React 18์ ์ฌ๋ฌ ์ํ ์
๋ฐ์ดํธ์ ์๋ ์ผ๊ด ์ฒ๋ฆฌ, ์คํธ๋ฆฌ๋ฐ ์๋ฒ ๋ ๋๋ง, ๊ทธ๋ฆฌ๊ณ ์ปดํฌ๋ํธ์ ๋ถ๋๋ฌ์ด ๋ก๋ฉ ์ํ๋ฅผ ๋ง๋ค ์ ์๋ React Suspense์ ๊ฐ์ ์๋ก์ด ๊ธฐ๋ฅ๋ค์ ๋์
ํฉ๋๋ค.
+
+๋ณธ์ง์ ์ผ๋ก, React 18์ ๋์ ๋ชจ๋๋ React์์ ๋ ๋๋ง์ ๋ํ ์ฌ๊ณ ๋ฐฉ์์ ๋ณํ์ํค๋ ํจ๋ฌ๋ค์์ ์ ํ์
๋๋ค. ์ด๋ ๋จ์ํ ์ฑ์ ๋ ๋น ๋ฅด๊ฒ ๋ง๋๋ ๊ฒ๋ฟ๋ง ์๋๋ผ ๋ ์๋ต์ฑ์ด ์ข๊ณ ์ฌ์ฉ์ ์นํ์ ์ผ๋ก ๋ง๋๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค.
+
+## ๋ฆฌ์กํธ 18์์์ ๋์์ฑ ๊ธฐ๋ฅ๋ค : ๊น์ด ํํค์น๊ธฐ
+
+React 18์๋ ์ฑ์ ๋ ์๋ต์ฑ ์๊ณ ์ฌ์ฉ์ ์นํ์ ์ผ๋ก ๋ง๋ค๊ธฐ ์ํ ๋ค์ํ ๋์ ๊ธฐ๋ฅ์ด ํฌํจ๋์ด ์์ต๋๋ค. ์ด๋ฌํ ๊ธฐ๋ฅ ์ค ์ผ๋ถ๋ฅผ ๊น์ด ์ดํด๋ณด๊ณ ์ด๋ป๊ฒ React ์ฑ์ ํฅ์์ํฌ ์ ์๋์ง ์์๋ณด๊ฒ ์ต๋๋ค.
+
+1. ์๋ ๋ฐฐ์นญ:
+
+์ด์ ๋ฒ์ ์ React์์๋ React ์ด๋ฒคํธ ์ธ๋ถ์์ ํธ๋ฆฌ๊ฑฐ๋ ์ํ ์
๋ฐ์ดํธ๊ฐ ํจ๊ป ๋ฐฐ์นญ๋์ง ์์์ต๋๋ค. ์ด๋ ๋ถํ์ํ ์ฌ๋ ๋๋ง๊ณผ ๋นํจ์จ์ ์ธ ์ฑ์ ์ด๋ํ ์ ์์์ต๋๋ค. React 18์ ์ฌ๋ฌ ์ํ ์
๋ฐ์ดํธ๋ฅผ ํจ๊ป ๋ฐฐ์นญํ์ฌ ๋จ์ผ ์ฌ๋ ๋๋ง์ ์ํํ๋ ์๋ ๋ฐฐ์นญ์ ๋์
ํฉ๋๋ค.
+
+๋ค์์ ์์ ์
๋๋ค:
+
+```tsx
+const [count, setCount] = useState(0);
+
+// In React 16, these would cause two re-renders
+setCount(count + 1);
+setCount(count + 1);
+
+// In React 18, these are batched together and cause a single re-render
+```
+
+2. ์คํธ๋ฆฌ๋ฐ ์๋ฒ ๋ ๋๋ง:
+
+React 18์ ์๋ฒ์์ ํด๋ผ์ด์ธํธ๋ก HTML์ ์คํธ๋ฆฌ๋ฐํ ์ ์๋ ์๋ก์ด ์๋ฒ ๋ ๋๋ง API๋ฅผ ๋์
ํฉ๋๋ค. ์ด๋ ๋ธ๋ผ์ฐ์ ๊ฐ ์ ์ฒด ์๋ต์ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ์ฒซ ๋ฒ์งธ ๋ฐ์ดํฐ ์ฒญํฌ๋ฅผ ๋ฐ์๋ง์ HTML ๋ ๋๋ง์ ์์ํ ์ ์์์ ์๋ฏธํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ฑ์ ์ธ์๋ ๋ก๋ ์๊ฐ์ ํฌ๊ฒ ๊ฐ์ ํ ์ ์์ต๋๋ค.
+
+3. React Suspense:
+
+React Suspense๋ ์ปดํฌ๋ํธ์ ๋ํด ๋ถ๋๋ฌ์ด ๋ก๋ฉ ์ํ๋ฅผ ๋ง๋ค ์ ์๋ React 18์ ์๋ก์ด ๊ธฐ๋ฅ์
๋๋ค. Suspense๋ฅผ ์ฌ์ฉํ๋ฉด ์ผ๋ถ ์ฝ๋๊ฐ ๋ก๋๋ ๋๊น์ง "๋๊ธฐ"ํ๊ณ ์ ์ธ์ ์ผ๋ก ๋ก๋ฉ ์ํ๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค. ์ด๋ ์ฝ๋ ๋ถํ ๋๋ ๋ฐ์ดํฐ ํ์นญ์ ์ฒ๋ฆฌํ ๋ ํนํ ์ ์ฉํ ์ ์์ต๋๋ค.
+
+```tsx
+Loading...}>
+
+
+```
+
+์ด ์์ ์์ ์ปดํฌ๋ํธ๋ MyComponent๋ฅผ ๊ฐ์ธ๊ณ ์์ต๋๋ค. MyComponent๊ฐ ์์ง ์ค๋น๋์ง ์์ ๊ฒฝ์ฐ(์: ๋ฐ์ดํฐ๋ฅผ ํ์นญํ๊ฑฐ๋ ์ฝ๋ ๋ถํ ์ฒญํฌ๋ฅผ ๋ก๋ํ๋ ์ค์ผ ๋), React๋ fallback ์์ฑ์ผ๋ก ์ง์ ๋ ๋ด์ฉ์ ํ์ํฉ๋๋ค. ์ด ๊ฒฝ์ฐ ๊ฐ๋จํ "Loading..." div๋ฅผ ํ์ํฉ๋๋ค.
+
+์ด๊ฒ์ React 18์ ๋์ ๊ธฐ๋ฅ ์ค ์ผ๋ถ์ ๋ถ๊ณผํฉ๋๋ค. ๋ํ startTransition ๊ธฐ๋ฅ์ด ์์ด ํน์ ์
๋ฐ์ดํธ๋ฅผ "์ ํ"์ผ๋ก ํ์ํ๊ณ ์ฐ์ ์์๋ฅผ ๋ฎ์ถ์ด ์ฒ๋ฆฌํ ์ ์์ผ๋ฉฐ, useDeferredValue ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด ๋๋ฆฐ ์ํ ์
๋ฐ์ดํธ๋ฅผ ๋น ๋ฅธ ์
๋ฐ์ดํธ๊ฐ ์๋ฃ๋ ๋๊น์ง ์ฐ๊ธฐํ ์ ์์ต๋๋ค.
+
+์ด๋ฌํ ๋์ ๊ธฐ๋ฅ๋ค์ ํจ๊ป ์ฌ์ฉํ๋ฉด React๋ ๋ณต์กํ ๋ ๋๋ง ์์
์ ๋ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ณ ๋ ๋ถ๋๋ฝ๊ณ ์๋ต์ฑ์ด ๋ฐ์ด๋ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
+
+## ๋์์ฑ ๋ชจ๋๊ฐ ๊ฐ๋ฅํ๋๋กํ๊ธฐ : ์ฐจ๊ทผ์น๊ทผ ํด๋ณด๊ธฐ
+
+์ด์ ๋์ ๋ ๋๋ง๊ณผ ๊ทธ ๊ธฐ๋ฅ์ ๋ํด ์์๋ณด์์ผ๋, ์ค์ ๋ก React ์ฑ์์ ๋์ ๋ชจ๋๋ฅผ ํ์ฑํํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
+
+๋จ๊ณ 1: React 18๋ก ์
๊ทธ๋ ์ด๋
+
+์ฒซ ๋ฒ์งธ ๋จ๊ณ๋ ์ฑ์ React 18๋ก ์
๊ทธ๋ ์ด๋ํ๋ ๊ฒ์
๋๋ค. ์ด๋ฅผ ์ํด ํฐ๋ฏธ๋์์ ๋ค์ ๋ช
๋ น์ด๋ฅผ ์คํํ๋ฉด ๋ฉ๋๋ค:
+
+์ด ๋ช
๋ น์ด๋ฅผ ์คํํ๋ฉด React์ ReactDOM ํจํค์ง๊ฐ ์ต์ ๋ฒ์ ์ผ๋ก ์
๋ฐ์ดํธ๋ฉ๋๋ค.
+
+```
+npm install react@18 react-dom@18
+```
+
+๋จ๊ณ 2: Strict Mode ํ์ฑํ
+
+๋ค์์ผ๋ก, ์ฑ์์ Strict Mode๋ฅผ ํ์ฑํํด์ผ ํฉ๋๋ค. ์ด๋ ๋์ ๋ชจ๋์์ ๋ฌธ์ ๊ฐ ๋ ์ ์๋ ์ ์ฌ์ ์ธ ์ด์๋ฅผ ์ก์๋ด๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ์ด๋ฅผ ์ํด ์ฑ์ ๋ฃจํธ ์ปดํฌ๋ํธ๋ฅผ StrictMode๋ก ๊ฐ์ธ๋ฉด ๋ฉ๋๋ค.
+
+```tsx
+import React, { StrictMode } from "react";
+
+
+
+;
+```
+
+๋จ๊ณ 3: ๋์ ๋ชจ๋ ํ์ฑํ
+
+์ด์ ๋์ ๋ชจ๋๋ฅผ ํ์ฑํํ ์ฐจ๋ก์
๋๋ค. ReactDOM.render๋ฅผ ์ฌ์ฉํ๋ ๋์ ReactDOM.createRoot๋ฅผ ์ฌ์ฉํฉ๋๋ค.
+
+```tsx
+import { createRoot } from "react-dom";
+
+const root = createRoot(document.getElementById("root"));
+root.render();
+```
+
+๊ทธ๋ฆฌ๊ณ ๋ณด์ธ์! ์ด์ React ์ฑ์์ ๋์ ๋ชจ๋๋ฅผ ํ์ฑํํ์ต๋๋ค. ์ด์ ์๋ ๋ฐฐ์นญ, ์คํธ๋ฆฌ๋ฐ ์๋ฒ ๋ ๋๋ง ๋ฐ React Suspense์ ๊ฐ์ React 18์ ๋์ ๊ธฐ๋ฅ์ ์ต๋ํ ํ์ฉํ ์ ์์ต๋๋ค.
+
+๊ธฐ์ตํ์ธ์, ๋์ ๋ชจ๋๋ ๊ฐ๋ ฅํ ๋๊ตฌ์ด์ง๋ง ํฐ ํ์๋ ํฐ ์ฑ
์์ด ๋ฐ๋ฆ
๋๋ค. ์ด๋ ์๋ก์ด ์์ค์ ๋ณต์ก์ฑ์ ๋์
ํ๋ฉฐ ์ฑ์ ์
๋ฐ์ดํธ์ ๋ ๋๋ง ๋ฐฉ์์ ๋ค๋ฅด๊ฒ ์๊ฐํด์ผ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ฅผ ์ตํ๊ฒ ๋๋ฉด, React ์ฑ์ด ํ ๋จ๊ณ ๋ ๋ฐ์ ํ ์ ์๋ ๋ฐฉ๋ฒ์ ์๊ฒ ๋ ๊ฒ์
๋๋ค.
+
+## ๋์ React: ์ค์ ์์
+
+์ด์ ๋์ ๋ชจ๋์ ์ด๋ก ๊ณผ ์ค์ ์ ๋ํด ๋ค๋ฃจ์์ผ๋, ์ค์ ๋ก ๋์ React๊ฐ ์ฌ์ฉ์ ๊ฒฝํ์ ์ด๋ป๊ฒ ํฅ์์ํฌ ์ ์๋์ง ๋ช ๊ฐ์ง ์์ ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
+
+### ์์ 1: ์ฌ์ฉ์ ์
๋ ฅ ์ฐ์ ์ฒ๋ฆฌ
+
+๋์ ๋ชจ๋์ ์ฃผ์ ์ด์ ์ค ํ๋๋ ํน์ ์์
์ ๋ค๋ฅธ ์์
๋ณด๋ค ์ฐ์ ์ฒ๋ฆฌํ ์ ์๋ค๋ ๊ฒ์
๋๋ค. ์๋ฅผ ๋ค์ด, ์ฑ์ ๊ฒ์์ฐฝ์ด ์๋ค๊ณ ๊ฐ์ ํด๋ด
์๋ค. ์ฌ์ฉ์๊ฐ ๊ฒ์์ฐฝ์ ์
๋ ฅํ๋ฉด ์ฑ์ ์ฌ์ฉ์์ ์
๋ ฅ์ ๊ธฐ๋ฐ์ผ๋ก ํญ๋ชฉ ๋ชฉ๋ก์ ํํฐ๋งํฉ๋๋ค.
+
+์ ํต์ ์ธ ๋๊ธฐ ๋ ๋๋ง ๋ชจ๋ธ์์๋ ํญ๋ชฉ ๋ชฉ๋ก์ด ํฌ๋ค๋ฉด, ๋ชฉ๋ก์ ํํฐ๋งํ๋ ์์
์ด ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ฐจ๋จํ์ฌ ์
๋ ฅ์ด ์ฌ์ฉ์์ ํ์ดํ ์๋์ ๋ค์ฒ์ง ์ ์์ต๋๋ค. ์ด๋ ์ฌ์ฉ์๋ฅผ ๋ถํธํ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.
+
+๋์ ๋ชจ๋๋ฅผ ์ฌ์ฉํ๋ฉด, React๋ ํํฐ๋ง ํ๋ก์ธ์ค๋ฅผ ์ค๋จํ๊ณ ์ฌ์ฉ์ ์
๋ ฅ์ ์ฒ๋ฆฌํ์ฌ ์
๋ ฅ์ด ํญ์ ์๋ต์ฑ์ ์ ์งํ๋๋ก ํ ์ ์์ต๋๋ค.
+
+### ์์ 2: Suspense๋ฅผ ํตํ ๋ถ๋๋ฌ์ด ๋ก๋ฉ ์ํ
+
+๋์ ๋ชจ๋์ ๋ ๋ค๋ฅธ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ React Suspense์
๋๋ค. ์ด๋ฅผ ํตํด ์ปดํฌ๋ํธ์ ๋ถ๋๋ฌ์ด ๋ก๋ฉ ์ํ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
+
+์๋ฅผ ๋ค์ด, API์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ์ปดํฌ๋ํธ๊ฐ ์๋ค๊ณ ๊ฐ์ ํด๋ด
์๋ค. ์ ํต์ ์ธ ๋ชจ๋ธ์์๋ ๋ก๋ฉ ์ํ๋ฅผ ์๋์ผ๋ก ๊ด๋ฆฌํด์ผ ํ๋ฉฐ, ์ ๋๋ก ๊ด๋ฆฌ๋์ง ์์ผ๋ฉด ์ฌ์ฉ์ ๊ฒฝํ์ด ๋ถํธํด์ง ์ ์์ต๋๋ค.
+
+Suspense๋ฅผ ์ฌ์ฉํ๋ฉด ์ ์ธ์ ์ผ๋ก ๋ก๋ฉ ์ํ๋ฅผ ์ง์ ํ๊ณ ๋๋จธ์ง๋ React๊ฐ ์ฒ๋ฆฌํ๋๋ก ํ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด React๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ๋ ๋์ "๊ธฐ๋ค๋ฆฌ๊ณ " ๊ทธ ์ฌ์ด์ ๋ก๋ฉ ์ํ๋ฅผ ๋ณด์ฌ์ค์ผ๋ก์จ ํจ์ฌ ๋ ๋ถ๋๋ฌ์ด ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
+
+```tsx
+Loading...}>
+
+
+```
+
+์ด ์์ ์์ DataFetchingComponent๊ฐ ์ฌ์ ํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ์ค์ด๋ผ๋ฉด, React๋ fallback ์์ฑ์ ํ์ํฉ๋๋ค. ์ด ๊ฒฝ์ฐ ๊ฐ๋จํ "Loading..." div๋ฅผ ๋ณด์ฌ์ค๋๋ค.
+
+์ด๊ฒ์ ๋์ React๊ฐ ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์์ํค๋ ๋ฐฉ๋ฒ์ ๋ํ ๋ช ๊ฐ์ง ์์ ๋ถ๊ณผํฉ๋๋ค. ๊ฐ๋ฅ์ฑ์ ๋ฌด๊ถ๋ฌด์งํ๋ฉฐ, ์ด๋ฌํ ๊ฐ๋ ฅํ ์๋ก์ด ๊ธฐ๋ฅ์ผ๋ก ์ฌ๋ฌ๋ถ์ด ๋ฌด์์ ๋ง๋ค์ง ๊ธฐ๋๋ฉ๋๋ค!
+
+## React 18: ์์ฝ๊ฒ ๋์์ฑ ์ฒ๋ฆฌ
+
+React 18์ ๋์ ๋ชจ๋๋ ์ ํ๋ฆฌ์ผ์ด์
์์ ๋์์ฑ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ ํฐ ๋ณํ๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
+์ด๋ ์๋ก์ด ๋์ ๋ ๋๋ฌ๋ฅผ ๋์
ํ์ฌ ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ฐจ๋จํ์ง ์๊ณ ๋์์ ์ฌ๋ฌ ์์
์ ์ํํ ์ ์๊ฒ ํฉ๋๋ค. ์ด๋ ํ ๋ฒ์ ํ๋์ ์์
๋ง ์ฒ๋ฆฌํ ์ ์์๋ ์ด์ ์ ๋๊ธฐ ๋ ๋๋ฌ์ ๋นํด ์๋นํ ๊ฐ์ ์
๋๋ค.
+
+ํ์ง๋ง React๋ ๋์์ฑ์ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ๊น์? ๊ทธ ๋น๋ฐ์ React๊ฐ ์
๋ฐ์ดํธ๋ฅผ ์ค์ผ์ค๋งํ๋ ๋ฐฉ์์ ์์ต๋๋ค. ๋์ ๋ชจ๋์์๋ React๊ฐ ์งํ ์ค์ธ ๋ ๋๋ง ํ๋ก์ธ์ค๋ฅผ ์ค๋จํ๊ณ ์ฌ์ฉ์ ์
๋ ฅ๊ณผ ๊ฐ์ ๋ ๊ธด๊ธํ ์์
์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์ฑ์ด ๋ฌด๊ฑฐ์ด ๊ณ์ฐ์ด๋ ๋คํธ์ํฌ ์์ฒญ ์ค์๋ ํญ์ ์๋ต์ฑ์ ์ ์งํ ์ ์์ต๋๋ค.
+
+์ด๊ฒ์ ์ค๋ช
ํ๊ธฐ ์ํ ์์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
+
+```tsx
+import { startTransition } from "react";
+
+function MyComponent() {
+ const [state, setState] = useState(initialState);
+
+ function handleClick() {
+ startTransition(() => {
+ setState(newState);
+ });
+ }
+
+ // ...
+}
+```
+
+์ด ์์ ์์๋ startTransition ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ํ ์
๋ฐ์ดํธ๋ฅผ "์ ํ"์ผ๋ก ํ์ํ๊ณ ์์ต๋๋ค. ์ด๋ React์๊ฒ ์ด ์
๋ฐ์ดํธ๊ฐ ๊ธด๊ธํ์ง ์์ผ๋ฉฐ, ๋ ๊ธด๊ธํ ์์
์ด ์์ ๊ฒฝ์ฐ ์ค๋จ๋ ์ ์์์ ์๋ ค์ค๋๋ค.
+
+์์
์ ์ฐ์ ์์๋ฅผ ์ง์ ํ ์ ์๋ ์ด ๊ธฐ๋ฅ์ด ๋์ ๋ชจ๋๋ฅผ ๋งค์ฐ ๊ฐ๋ ฅํ๊ฒ ๋ง๋ญ๋๋ค. ์ด๋ฅผ ํตํด React๋ ๋ณต์กํ ๋ ๋๋ง ์์
์ ๋ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ณ ๋ ๋ถ๋๋ฝ๊ณ ์๋ต์ฑ์ด ์ข์ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํฉ๋๋ค.
+
+๊ทธ๋ฌ๋ ํฐ ํ์๋ ํฐ ์ฑ
์์ด ๋ฐ๋ฆ
๋๋ค. ๋์ ๋ชจ๋๋ ์๋ก์ด ์์ค์ ๋ณต์ก์ฑ์ ๋์
ํ๋ฉฐ, ์ฑ์ด ์
๋ฐ์ดํธ๋๊ณ ๋ ๋๋ง๋๋ ๋ฐฉ์์ ๋ค๋ฅด๊ฒ ์๊ฐํด์ผ ํฉ๋๋ค. ๋ฐ๋ผ์ ๋์ ๋ชจ๋๋ฅผ ์ฌ์ฉํ๊ธฐ ์ ์ ๊ฐ๋
์ ์ฒ ์ ํ ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
+
+## React 18: ๋๋ธ ๋ ๋ ๋ฏธ์คํฐ๋ฆฌ ์ค๋ช
+
+React 18์ ๋์ ๋ชจ๋์์ ๊ฐ์ฅ ํฅ๋ฏธ๋ก์ด ์ธก๋ฉด ์ค ํ๋๋ ์์ "๋๋ธ ๋ ๋" ํ์์
๋๋ค. React 18์ ์คํํด๋ณด์
จ๋ค๋ฉด ์ผ๋ถ ์ปดํฌ๋ํธ๊ฐ ํ ๋ฒ๋ง ๋ ๋๋ง๋์ด์ผ ํ๋๋ฐ ๋ ๋ฒ ๋ ๋๋ง๋๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ ๊ฒ์ ๋ฐ๊ฒฌํ์์ง๋ ๋ชจ๋ฆ
๋๋ค. ๋๋์ฒด ๋ฌด์จ ์ผ์ด ๋ฒ์ด์ง๊ณ ์๋ ๊ฑธ๊น์?
+
+๋๋ธ ๋ ๋๋ ์ฌ์ค ๋ฒ๊ทธ๊ฐ ์๋๋ผ ๊ธฐ๋ฅ์
๋๋ค. ์ด๋ ์๋ก์ด ๋์ ๋ ๋๋ฌ์ ์๋ ๋ฐฉ์์์ ๋น๋กฏ๋ฉ๋๋ค. ๋์ ๋ชจ๋์์๋ React๊ฐ DOM์ ์
๋ฐ์ดํธํ๊ธฐ ์ ์ ๋ฉ๋ชจ๋ฆฌ์์ ์๋ก์ด ํ๋ฉด(๋๋ ์
๋ฐ์ดํธ๋ ์ปดํฌ๋ํธ ์ํ)์ ์ค๋นํฉ๋๋ค. ์ด๋ฅผ "๋ฉ๋ชจ๋ฆฌ ๋ด ๋ ๋๋ง" ๋๋ "์คํ์คํฌ๋ฆฐ ๋ ๋๋ง"์ด๋ผ๊ณ ํฉ๋๋ค.
+
+์ด ๋จ๊ณ์์ React๋ ์ผ๋ถ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉ์์๊ฒ ๋ณด์ด์ง ์๋๋ผ๋ ํ ๋ฒ ์ด์ ๋ ๋๋งํ ์ ์์ต๋๋ค. ์ด๊ฒ์ด "๋๋ธ ๋ ๋"๋ฅผ ์ด๋ํ๋ ์์ธ์
๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ฌํ ์ถ๊ฐ ๋ ๋๋ง์ ์ผ๋ฐ์ ์ผ๋ก ๋น ๋ฅด๊ฒ ์ด๋ฃจ์ด์ง๋ฉฐ ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ฐจ๋จํ์ง ์์ผ๋ฏ๋ก ์ฑ์ ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์น์ง ์์ต๋๋ค.
+
+์ด๋ฅผ ์ค๋ช
ํ๊ธฐ ์ํ ์์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
+
+```tsx
+function MyComponent() {
+ const [state, setState] = useState(initialState);
+
+ console.log("Render");
+
+ // ...
+}
+```
+
+์ด ์์ ์์ ์ด ์ปดํฌ๋ํธ๋ฅผ ๋์ ๋ชจ๋์์ ์คํํ๋ฉด, ์ปดํฌ๋ํธ๊ฐ ํ ๋ฒ๋ง ์
๋ฐ์ดํธ๋๋๋ผ๋ ์ฝ์์ "Render"๊ฐ ๋ ๋ฒ ๊ธฐ๋ก๋๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. ์ด๊ฒ์ด ๋ฐ๋ก "๋๋ธ ๋ ๋" ํ์์
๋๋ค.
+
+๋ฐ๋ผ์ ๋์ ๋ชจ๋์์ ์ปดํฌ๋ํธ๊ฐ ๋ ๋ฒ ๋ ๋๋ง๋๋ ๊ฒ์ ๋ณด๋๋ผ๋ ๋๋ผ์ง ๋ง์ธ์. ์ด๋ React๊ฐ ์๋ก์ด ํ๋ฉด์ ๋ฉ๋ชจ๋ฆฌ์์ ์ค๋นํ์ฌ ๋ ๋ถ๋๋ฌ์ด ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๊ธฐ ์ํ ๊ณผ์ ์ผ ๋ฟ์
๋๋ค.
+
+## React Experimental: ๋ฌด์์ ๊ดํ ๊ฒ์ผ๊น?
+
+React ๊ฐ๋ฐ์ ์ฃผ์ํ๊ณ ์๋ค๋ฉด "React Experimental"์ด๋ผ๋ ์ฉ์ด๋ฅผ ์ ํ์ ๊ฒ์
๋๋ค. ํ์ง๋ง ์ด๊ฒ์ด ๋ฌด์์ ์๋ฏธํ๋ฉฐ ๋์ ๋ชจ๋์ ์ด๋ค ๊ด๋ จ์ด ์์๊น์?
+
+"React Experimental"์ ์์ ์ ์ธ ๋ฆด๋ฆฌ์ค์์๋ ์์ง ์ฌ์ฉํ ์ ์๋ ๊ธฐ๋ฅ์ ํฌํจํ๋ ์คํ์ ์ธ React ๋น๋๋ฅผ ๊ฐ๋ฆฌํค๋ ์ฉ์ด์
๋๋ค. ์ด๋ฌํ ์คํ ๋น๋๋ React ํ์ด ์๋ก์ด ๊ธฐ๋ฅ์ ํ
์คํธํ๊ณ , ์ปค๋ฎค๋ํฐ๋ก๋ถํฐ ํผ๋๋ฐฑ์ ๋ฐ๊ณ , ์์ ์ ์ธ ๋ฆด๋ฆฌ์ค์ ํฌํจํ๊ธฐ ์ ์ ๋์์ธ์ ๋ฐ๋ณต์ ์ผ๋ก ๊ฐ์ ํ๋ ๋ฐฉ๋ฒ์
๋๋ค.
+
+๋์ ๋ชจ๋๋ ์ฒ์์ React Experimental์์ ๋์
๋์์ต๋๋ค. ์ด๋ ๊ด๋ฒ์ํ ํ
์คํธ์ ํผ๋๋ฐฑ์ด ํ์ํ ๊ธ์ง์ ์ธ ์๋ก์ด ๊ธฐ๋ฅ์ด์๊ธฐ ๋๋ฌธ์
๋๋ค. React Experimental์์ ๋จผ์ ์ถ์ํจ์ผ๋ก์จ, React ํ์ ์ปค๋ฎค๋ํฐ๋ก๋ถํฐ ๊ท์คํ ํผ๋๋ฐฑ์ ์์งํ๊ณ ๋์ ๋ชจ๋์ ๋์์ธ๊ณผ ๊ตฌํ์ ํ์ํ ์กฐ์ ์ ํ ์ ์์์ต๋๋ค.
+
+๋ฐ๋ผ์ ์ต์ ์ React ๊ธฐ๋ฅ์ ๊ณต์ ์ถ์ ์ ์ ์ฌ์ฉํด๋ณด๊ณ ์ถ๋ค๋ฉด React Experimental์ ์ฃผ๋ชฉํ์ธ์. ํ์ง๋ง React Experimental์ ๊ธฐ๋ฅ์ ๋ณ๊ฒฝ๋ ์ ์์ผ๋ฉฐ, ํ๋ก๋์
ํ๊ฒฝ์์ ์ฌ์ฉํด์๋ ์ ๋ฉ๋๋ค.
+
+๊ทธ๋ฆฌ๊ณ React ๊ฐ๋ฐ์ ๊ธฐ์ฌํ๊ณ ์ถ๋ค๋ฉด, React Experimental์ ์๋ํด๋ณด๊ณ React ํ์ ํผ๋๋ฐฑ์ ์ ๊ณตํ๋ ๊ฒ์ด ์ข์ ์์์ ์
๋๋ค. ์ฌ๋ฌ๋ถ์ ํผ๋๋ฐฑ์ React์ ๋ฏธ๋๋ฅผ ํ์ฑํ๊ณ ๋ชจ๋ ์ฌ๋์๊ฒ ๋ ๋์ React๋ฅผ ๋ง๋๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
+
+## React์ ์ง์์ ์ธ ๊ฐ๋ฐ: ๋ฏธ๋ ์ ๋ง
+
+React๋ ์ง์์ ์ผ๋ก ๊ฐ๋ฐ๋๊ณ ๊ฐ์ ๋๋ ์ด์ ์จ์ฌ๋ ํ๋ก์ ํธ์
๋๋ค. React ํ๊ณผ ์คํ ์์ค ์ปค๋ฎค๋ํฐ์ ์ํด ๋์์์ด ๋ฐ์ ํ๊ณ ์์ผ๋ฉฐ, React 18์ ์ถ์๋ก React์ ๋ฏธ๋๋ ๋ฐ๊ณ ํฅ๋ฏธ๋ก์ด ๊ฐ๋ฅ์ฑ๋ค๋ก ๊ฐ๋ ์ฐจ ์์์ ์ ์ ์์ต๋๋ค.
+
+React์ ์ง์์ ์ธ ๊ฐ๋ฐ์์ ๊ฐ์ฅ ํฅ๋ฏธ๋ก์ด ์ธก๋ฉด ์ค ํ๋๋ ๋์์ฑ์ ๋ํ ์ง์ค์
๋๋ค. React 18์์ ๋์ ๋ชจ๋์ ๋์
์ผ๋ก React๋ ๋ ์๋ต์ฑ์ด ์ข๊ณ ์ฌ์ฉ์ ์นํ์ ์ธ ๋ฏธ๋๋ฅผ ํฅํ ํฐ ๋ฐ๊ฑธ์์ ๋ด๋๋ ์ต๋๋ค. ํ์ง๋ง ์ด๋ ์์์ ๋ถ๊ณผํฉ๋๋ค. React ํ์ ์ด๋ฏธ ๋์ ๋ ๋๋ง์ ๊ฐ๋ ฅํจ์ ํ์ธต ๋ ๋ฐ์ ์ํค๊ธฐ ์ํ ์๋ก์ด ๋์ ๊ธฐ๋ฅ๊ณผ ๊ฐ์ ์์
์ ์งํํ๊ณ ์์ต๋๋ค.
+
+๋ ๋ค๋ฅธ ํฅ๋ฏธ๋ก์ด ๊ฐ๋ฐ ์์ญ์ ์๋ฒ ์ปดํฌ๋ํธ์
๋๋ค. ์ด๋ ์๋ฒ์์ ๋ ๋๋ง๋๊ณ HTML๋ก ํด๋ผ์ด์ธํธ์ ์ ์ก๋ ์ ์๋ ์๋ก์ด ์ ํ์ ์ปดํฌ๋ํธ์
๋๋ค. ์๋ฒ ์ปดํฌ๋ํธ๋ API ๊ณ์ธต ์์ด๋ ์๋ฒ ์ธก ๋ฐ์ดํฐ๋ฅผ ์ง์ ์ก์ธ์คํ ์ ์์ด, ์ฑ์ ๋ฐ์ดํฐ ํ์นญ ๋ก์ง์ ํฌ๊ฒ ๋จ์ํํ๊ณ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
+
+๊ทธ๋ฆฌ๊ณ React Suspense๋ ์์ง ๋ง์์ผ ํฉ๋๋ค. ์ปดํฌ๋ํธ์ ๋ถ๋๋ฌ์ด ๋ก๋ฉ ์ํ๋ฅผ ๋ง๋ค ์ ์๋ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์
๋๋ค. Suspense๋ ์ด๋ฏธ React 18์์ ์ฌ์ฉํ ์ ์์ง๋ง, React ํ์ ์ด๋ฅผ ๋์ฑ ๊ฐ๋ ฅํ๊ณ ์ ์ฐํ๊ฒ ๋ง๋ค๊ธฐ ์ํ ์๋ก์ด API์ ์ถ๊ฐ ๊ฐ์ ์์
์ ์งํํ๊ณ ์์ต๋๋ค.
+
+๋ฐ๋ผ์ React ๊ฐ๋ฐ์๋ก์ ์์ผ๋ก ๊ธฐ๋ํ ๊ฒ์ด ๋ง์ต๋๋ค. React์ ๋ฏธ๋๋ ์ฑ์ ๋ ์๋ต์ฑ ๋๊ณ ์ฌ์ฉ์ ์นํ์ ์ด๋ฉฐ, ๊ฐ๋ฐํ๊ธฐ ์ฌ๋ฏธ์๊ฒ ๋ง๋๋ ํฅ๋ฏธ๋ก์ด ์๋ก์ด ๊ธฐ๋ฅ๊ณผ ๊ฐ์ ์ผ๋ก ๊ฐ๋ํ ๊ฒ์
๋๋ค. React ํ์ด ์ฐ๋ฆฌ์๊ฒ ์ด๋ค ๊ฒ์ ์ค๋นํ๊ณ ์์์ง ์ ๋ง ๊ธฐ๋๊ฐ ๋ฉ๋๋ค!
+
+## ์ React๊ฐ ๊ฐ๋ฐ์๋ค ์ฌ์ด์์ ์ธ๊ธฐ๊ฐ ๋ง์๊ฐ
+
+React๋ ํ๋ก ํธ์๋ ๊ฐ๋ฐ์ ์ธ๊ณ๋ฅผ ๊ฐํํ์ต๋๋ค. 2013๋
Facebook์ ์ํด ์ถ์๋ ์ดํ, React๋ ๊ฐ๋ฐ์๋ค ์ฌ์ด์์ ์์ฒญ๋ ์ธ๊ธฐ๋ฅผ ์ป์์ผ๋ฉฐ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌ์ถํ๋ ๋ฐ ๊ฐ์ฅ ๋๋ฆฌ ์ฌ์ฉ๋๋ JavaScript ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค ํ๋๊ฐ ๋์์ต๋๋ค. ๊ทธ๋ ๋ค๋ฉด ์ React๊ฐ ์ด๋ ๊ฒ ์ธ๊ธฐ๊ฐ ๋ง์๊น์?
+
+์ฃผ์ ์ด์ ์ค ํ๋๋ ๊ทธ ๋จ์ํจ๊ณผ ์ ์ฐ์ฑ์
๋๋ค. React๋ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ฝ๋ ์กฐ๊ฐ์ธ ์ปดํฌ๋ํธ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ฑ๋์ด ์์ผ๋ฉฐ, ์ด๋ฌํ ์ปดํฌ๋ํธ๋ฅผ ์กฐํฉํ์ฌ ๋ณต์กํ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌ์ถํ ์ ์์ต๋๋ค. ์ด ์ปดํฌ๋ํธ ๊ธฐ๋ฐ ์ํคํ
์ฒ๋ ๋๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌ์ถํ๊ณ ์ ์ง๋ณด์ํ๊ธฐ ์ฝ๊ฒ ๋ง๋ญ๋๋ค.
+
+๋ ๋ค๋ฅธ ์ด์ ๋ ์ฑ๋ฅ์
๋๋ค. React๋ ๊ฐ์ DOM๊ณผ ๋ํ(diffing) ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์ฌ ์ค์ DOM์ ๋ํ ์
๋ฐ์ดํธ ์๋ฅผ ์ต์ํํฉ๋๋ค. ์ด๋ ์ค์ DOM ์
๋ฐ์ดํธ๊ฐ ๋๋ฆด ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค. ์ด๋ฅผ ํตํด React ์ ํ๋ฆฌ์ผ์ด์
์ ๋ณต์กํ UI๋ฅผ ๊ฐ์ง ๋๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์
์์๋ ๋น ๋ฅด๊ณ ์๋ต์ฑ์ด ๋์ต๋๋ค.
+
+React 18์์ ๋์
๋ ๋์ ๋ชจ๋๋ ์ด๋ฌํ ์ฑ๋ฅ์ ํ ๋จ๊ณ ๋ ๋์ด์ฌ๋ฆฝ๋๋ค. React๊ฐ ์ฌ๋ฌ ์์
์ ๋์์ ์ํํ๊ณ ๊ทธ ์ค์๋์ ๋ฐ๋ผ ์ฐ์ ์์๋ฅผ ์ง์ ํ ์ ์๊ฒ ํจ์ผ๋ก์จ, ๋์ ๋ชจ๋๋ React ์ ํ๋ฆฌ์ผ์ด์
์ ๋์ฑ ์๋ต์ฑ์ด ๋๊ณ ์ฌ์ฉ์ ์นํ์ ์ผ๋ก ๋ง๋ญ๋๋ค.
+
+ํ์ง๋ง ์๋ง๋ React์ ์ธ๊ธฐ๊ฐ ๋ง์ ๊ฐ์ฅ ์ค์ํ ์ด์ ๋ ๊ทธ ํ๊ธฐ์ฐฌ ์ปค๋ฎค๋ํฐ์ผ ๊ฒ์
๋๋ค. ์ ์ธ๊ณ ์๋ฐฑ๋ง ๋ช
์ ๊ฐ๋ฐ์๊ฐ React๋ฅผ ์ฌ์ฉํ๊ณ ์์ด, ์ธ์ ๋ ๋์์ ๋ฐ์ ์ ์์ต๋๋ค. ๋ฌธ์ ํด๊ฒฐ, ๊ฐ๋ฐ์ ๋จ์ํํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ๋๋ ์๊ฐ์ด ํ์ํ ๋, React ์ปค๋ฎค๋ํฐ๊ฐ ํญ์ ๋์์ค ์ค๋น๊ฐ ๋์ด ์์ต๋๋ค.
+
+๊ทธ๋ฆฌ๊ณ ๋์ ๋ชจ๋, ์๋ฒ ์ปดํฌ๋ํธ, React Suspense์ ๊ฐ์ ์๋ก์ด ๊ธฐ๋ฅ์ ๋์
์ผ๋ก, React๋ ํ์ฌ์ ์์ฃผํ์ง ์๊ณ ๊ณ์ํด์ ์งํํ๊ณ ๊ฐ์ ๋๊ณ ์์ต๋๋ค. ์ด๋ React๊ฐ ๊ฐ๋ฐ์๋ค์๊ฒ ํฅ๋ฏธ๋กญ๊ณ ๋ณด๋ ์๋ ์ ํ์ด ๋๊ฒ ๋ง๋ญ๋๋ค.
+
+## React Suspense: ํ๋ก๋์
์ค๋น๊ฐ ๋์์๊น? ๋ถ์
+
+React Suspense๋ React 18์์ ๋์
๋ ๊ฐ์ฅ ํฅ๋ฏธ๋ก์ด ๊ธฐ๋ฅ ์ค ํ๋์
๋๋ค. ์ด๋ ์ปดํฌ๋ํธ์ ๋ก๋ฉ ์ํ๋ฅผ ์ ์ธ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ฌ ๋ถ๋๋ฝ๊ณ ์๋ต์ฑ ์ข์ ๋ก๋ฉ ๊ฒฝํ์ ๋ง๋ค๊ธฐ ์ฝ๊ฒ ํด์ค๋๋ค. ํ์ง๋ง ์ด๊ฒ์ด ํ๋ก๋์
์์ ์ฌ์ฉํ๊ธฐ์ ์ค๋น๊ฐ ๋์์๊น์?
+
+๋ต์ "์"์ด์ง๋ง ์ฃผ์ํ ์ ์ด ์์ต๋๋ค. React Suspense๋ React 18์ ํฌํจ๋์ด ์์ผ๋ฉฐ ํ๋ก๋์
์์ ์ฌ์ฉํ ์ ์์ง๋ง, ์ฌ์ ํ ์คํ์ ์ธ ๊ธฐ๋ฅ์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค. ์ด๋ ์ผ๋ฐ์ ์ผ๋ก ์์ ์ ์ด๊ณ ์ ๋ขฐํ ์ ์์ง๋ง, React ํ์ด ํด๊ฒฐํด์ผ ํ ๋ช ๊ฐ์ง ์ฃ์ง ์ผ์ด์ค์ ๋ฒ๊ทธ๊ฐ ์์ ์ ์์์ ์๋ฏธํฉ๋๋ค.
+
+Suspense๋ฅผ ์ฌ์ฉํ ๋ ์ผ๋์ ๋์ด์ผ ํ ์ฃผ์ ์ฌํญ ์ค ํ๋๋ ๋ก๋ฉ ์ํ์ ๋ํ ์ฌ๊ณ ๋ฐฉ์์ ๋ณํ๊ฐ ํ์ํ๋ค๋ ์ ์
๋๋ค. ์ปดํฌ๋ํธ์์ ๋ก๋ฉ ์ํ๋ฅผ ์๋์ผ๋ก ๊ด๋ฆฌํ๋ ๋์ , Suspense๋ฅผ ์ฌ์ฉํ๋ฉด ์ ์ธ์ ์ผ๋ก ๋ก๋ฉ ์ํ๋ฅผ ์ง์ ํ๊ณ ๋๋จธ์ง๋ React๊ฐ ์ฒ๋ฆฌํ๋๋ก ํ ์ ์์ต๋๋ค.
+
+์ด๋ ๊ฒ ํ๋ฉด ์ฝ๋๊ฐ ๊ฐ์ํ๋๊ณ ๋ก๋ฉ ์ํ๊ฐ ์ผ๊ด๋๊ฒ ์ ์ง๋ ์ ์์ง๋ง, ๊ธฐ์กด ์ฝ๋๋ฅผ ์ผ๋ถ ๋ฆฌํฉํ ๋งํด์ผ ํ ์๋ ์์ต๋๋ค. ๋ฐ๋ผ์ Suspense๋ฅผ ๋๊ท๋ชจ ๊ธฐ์กด ์ฝ๋๋ฒ ์ด์ค์ ์ฌ์ฉํ๋ ค๊ณ ํ๋ค๋ฉด, ์ด๋ ์ ๋์ ์์
์ ์ค๋นํด์ผ ํฉ๋๋ค.
+
+๊ฒฐ๋ก ์ ์ผ๋ก, React Suspense๋ ๋ถ๋๋ฌ์ด ๋ก๋ฉ ์ํ๋ฅผ ๋ง๋๋ ๊ฐ๋ ฅํ ๋๊ตฌ์ด์ง๋ง, ์ฌ์ ํ ์คํ์ ์ธ ๊ธฐ๋ฅ์ด๋ฉฐ ๊ธฐ์กด ์ฝ๋์ ํตํฉํ๋ ๋ฐ ์ฝ๊ฐ์ ์์
์ด ํ์ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์๋ก์ด ํ๋ก์ ํธ๋ฅผ ์์ํ๊ฑฐ๋ ๊ธฐ์กด ์ฝ๋๋ฅผ ๋ฆฌํฉํ ๋งํ ์์ง๊ฐ ์๋ค๋ฉด, ๋ก๋ฉ ๊ฒฝํ์ ํฌ๊ฒ ๊ฐ์ ํ ์ ์๋ ๊ฒ์ ์ฒด์ธ์ ๊ฐ ๋ ์ ์์ต๋๋ค.
+
+## React 18: ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ๊ณผ ๋์ฒ ๋ฐฉ๋ฒ
+
+๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํ๋ ์์ํฌ์ ์ฃผ์ ๋ฆด๋ฆฌ์ค๋ง๋ค ํญ์ ํธํ์ฑ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค. React 18๋ ์์ธ๋ ์๋๋๋ค. React ํ์ ํ์ ํธํ์ฑ์ ์ ์งํ๊ธฐ ์ํด ๋ง์ ๋
ธ๋ ฅ์ ๊ธฐ์ธ์์ง๋ง, ๊ธฐ์กด ์ฝ๋๋ฅผ ์ ์ฌ์ ์ผ๋ก ์ค๋จ์ํฌ ์ ์๋ ๋ช ๊ฐ์ง ๋ณ๊ฒฝ ์ฌํญ์ด ์์ต๋๋ค.
+
+๊ฐ์ฅ ์ค์ํ ๋ณ๊ฒฝ ์ฌํญ ์ค ํ๋๋ ๋์ ๋ชจ๋์ ๋์
์
๋๋ค. ๋์ ๋ชจ๋๋ ๋ง์ ์ด์ ์ ์ ๊ณตํ์ง๋ง, React์์ ๋ ๋๋ง๊ณผ ์ํ ์
๋ฐ์ดํธ์ ๋ํ ์๋ก์ด ์ฌ๊ณ ๋ฐฉ์์ ๋์
ํฉ๋๋ค. ์ด๋ ๊ธฐ์กด ์ฝ๋์์ ๊ฐ์ ํ ๋ด์ฉ์ ์ ์ฌ์ ์ผ๋ก ์ค๋จ์ํฌ ์ ์์ต๋๋ค.
+
+์๋ฅผ ๋ค์ด, ๋์ ๋ชจ๋์์๋ React๊ฐ ์ฌ์ฉ์์๊ฒ ๋ณด์ด์ง ์๋๋ผ๋ ์ปดํฌ๋ํธ๋ฅผ ์ฌ๋ฌ ๋ฒ ๋ ๋๋งํ ์ ์์ต๋๋ค. ์ด๋ ์ด์ ๋ฒ์ ์ React์์ ์ปดํฌ๋ํธ๊ฐ ์ ํํ ํ ๋ฒ ๋ ๋๋ง๋๋ ๋๊ธฐ ๋ ๋๋ง ๋ชจ๋ธ๊ณผ๋ ๋ค๋ฆ
๋๋ค.
+
+๋ ๋ค๋ฅธ ์ ์ฌ์ ์ธ ๋ฌธ์ ๋ ์๋ ๋ฐฐ์นญ์ ๋์
์
๋๋ค. React 18์์๋ ์ฌ๋ฌ ์ํ ์
๋ฐ์ดํธ๊ฐ ๋ฐฐ์น๋์ด ๋จ์ผ ์ฌ๋ ๋๋ง์ด ๋ฐ์ํฉ๋๋ค. ์ด๋ ์ํ ์
๋ฐ์ดํธ๊ฐ ์ฆ๊ฐ์ ์ธ ์ฌ๋ ๋๋ง์ ์ ๋ฐํ๋ ๊ธฐ์กด ์ฝ๋์ ์ํฅ์ ์ค ์ ์์ต๋๋ค.
+
+์ด๋ฌํ ๋ณ๊ฒฝ ์ฌํญ์ ์ด๋ป๊ฒ ๋์ฒํ ์ ์์๊น์? ๋ค์ ๋ช ๊ฐ์ง ํ์ ์ฐธ๊ณ ํ์ธ์:
+
+1. ์ฑ ํ
์คํธํ๊ธฐ: ๋ณ๊ฒฝ ์ฌํญ์ ๋์ฒํ๋ ์ฒซ ๋ฒ์งธ ๋จ๊ณ๋ ์ฑ์ ์ฒ ์ ํ ํ
์คํธํ๋ ๊ฒ์
๋๋ค. ๋ณ๊ฒฝ ์ฌํญ์ ์ํฅ์ ๋ฐ์ ๊ฒ์ด๋ผ๊ณ ์๊ฐ๋๋ ๋ถ๋ถ๋ฟ๋ง ์๋๋ผ ์ฑ์ ๋ชจ๋ ๋ถ๋ถ์ ํ
์คํธํ์ธ์.
+
+2. ์๊ฒฉ ๋ชจ๋ ์ฌ์ฉํ๊ธฐ: ์๊ฒฉ ๋ชจ๋๋ ์ฑ์์ ์ ์ฌ์ ์ธ ๋ฌธ์ ๋ฅผ ์ก์๋ด๋ ๋ฐ ๋์์ด ๋๋ React ๋๊ตฌ์
๋๋ค. React์ ์๋ก์ด ๋ฒ์ ์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์
ํ ๋ ํนํ ์ ์ฉํ๋ฉฐ, ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ธฐ ์ ์ ๋ณ๊ฒฝ ์ฌํญ์ ๊ฐ์งํ ์ ์์ต๋๋ค.
+
+3. ํ์์ ๋ฐ๋ผ ๋ฆฌํฉํ ๋งํ๊ธฐ: React 18์ ๋ณ๊ฒฝ ์ฌํญ์ผ๋ก ์ธํด ์ฑ์ ์ผ๋ถ๊ฐ ๊นจ์ง๋ ๊ฒฝ์ฐ, ์ฝ๋๋ฅผ ๋ฆฌํฉํ ๋งํด์ผ ํ ์ ์์ต๋๋ค. ์ด๋ ์ํ ์
๋ฐ์ดํธ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ ๋ณ๊ฒฝํ๊ฑฐ๋ ์ฑ์์ ๋ ๋๋ง์ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ ์ฌ๊ณ ํ๋ ๊ฒ์ ํฌํจํ ์ ์์ต๋๋ค.
+
+4. ๋์ ๊ตฌํ๊ธฐ: ๋งํ๋ฉด ์ฃผ์ ํ์ง ๋ง๊ณ ๋์์ ๊ตฌํ์ธ์. React ์ปค๋ฎค๋ํฐ๋ ํ๊ธฐ์ฐจ๊ณ ์ง์์ ์ด๋ฉฐ, React 18์ ๋ณ๊ฒฝ ์ฌํญ์ ํ์ํ๋ ๋ฐ ๋์์ด ๋๋ ๋ง์ ๋ฆฌ์์ค๊ฐ ์์ต๋๋ค.
+
+๊ธฐ์ตํ์ธ์, ํธํ์ฑ ๋ฌธ์ ๋ ๋์ ์ ์ผ ์ ์์ง๋ง, ์ด๋ ์ฝ๋๋ฅผ ๊ฐ์ ํ๊ณ React์ ๋ํด ๋ ๋ง์ด ๋ฐฐ์ธ ์ ์๋ ๊ธฐํ์ด๊ธฐ๋ ํฉ๋๋ค. ๋์ ์ ๋ฐ์๋ค์ด๊ณ ์ฆ๊ฒ๊ฒ ์ฝ๋ฉํ์ธ์!
+
+## React 18: ๋์ ๊ธฐ๋ฅ์ ํ
+
+React 18๊ณผ ๊ทธ ๋์ ๋ชจ๋๋ฅผ ํํํ๋ฉด์ React์์ ๋ ๋๋ง์ ๋ํ ์๋ก์ด ์ฌ๊ณ ๋ฐฉ์์ ์ด๋ป๊ฒ ๋์
ํ๋์ง ์ ์ ์์์ต๋๋ค. ์ด๋ ๋จ์ํ ์ฑ์ ๋ ๋น ๋ฅด๊ฒ ๋ง๋๋ ๊ฒ์ด ์๋๋ผ ๋ ์๋ต์ฑ ์๊ณ ์ฌ์ฉ์ ์นํ์ ์ผ๋ก ๋ง๋๋ ๊ฒ์
๋๋ค. React 18์ ๋์ ๊ธฐ๋ฅ์ ํ์ ๊ณผ์ฅํ ์ ์์ต๋๋ค.
+
+์๋ ๋ฐฐ์นญ: ์ด ๊ธฐ๋ฅ์ ์ฌ๋ฌ ์ํ ์
๋ฐ์ดํธ๋ฅผ ํจ๊ป ๋ฐฐ์นํ์ฌ ๋จ์ผ ์ฌ๋ ๋๋ง์ ์ํํ ์ ์๊ฒ ํฉ๋๋ค. ์ด๋ ์ํ ์
๋ฐ์ดํธ๊ฐ ๋น๋ฒํ ์ฑ์ ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค.
+
+**์คํธ๋ฆฌ๋ฐ ์๋ฒ ๋ ๋๋ง:** ์ด ๊ธฐ๋ฅ์ ์๋ฒ์์ ํด๋ผ์ด์ธํธ๋ก HTML์ ์คํธ๋ฆฌ๋ฐํ ์ ์๊ฒ ํ์ฌ ์ฑ์ ์ธ์๋ ๋ก๋ ์๊ฐ์ ๊ฐ์ ํฉ๋๋ค. ๋ธ๋ผ์ฐ์ ๋ ์ ์ฒด ์๋ต์ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ์ฒซ ๋ฒ์งธ ๋ฐ์ดํฐ ์ฒญํฌ๋ฅผ ๋ฐ์๋ง์ HTML ๋ ๋๋ง์ ์์ํ ์ ์์ต๋๋ค.
+
+**React Suspense:** ์ด ๊ธฐ๋ฅ์ ์ปดํฌ๋ํธ์์ ๋ก๋ฉ ์ํ๋ฅผ ์ฒ๋ฆฌํ๋ ์ ์ธ์ ์ธ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. Suspense๋ฅผ ์ฌ์ฉํ๋ฉด ์ผ๋ถ ์ฝ๋๊ฐ ๋ก๋๋ ๋๊น์ง "๊ธฐ๋ค๋ฆฌ๊ณ " ์ ์ธ์ ์ผ๋ก ๋ก๋ฉ ์ํ๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์ฝ๋๊ฐ ๊ฐ์ํ๋๊ณ ์ฌ์ฉ์์๊ฒ ๋ถ๋๋ฌ์ด ๋ก๋ฉ ๊ฒฝํ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
+
+**StartTransition:** ์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด ํน์ ์
๋ฐ์ดํธ๋ฅผ "์ ํ"์ผ๋ก ํ์ํ๊ณ ์ฐ์ ์์๋ฅผ ๋ฎ์ถ ์ ์์ต๋๋ค. ์ด๋ ๊ธด๊ธํ์ง ์๊ณ ๋ ๊ธด๊ธํ ์์
์ด ์์ ๋ ์ค๋จํ ์ ์๋ ์
๋ฐ์ดํธ์ ์ ์ฉํ ์ ์์ต๋๋ค.
+
+**UseDeferredValue:** ์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด ๋๋ฆฐ ์ํ ์
๋ฐ์ดํธ๋ฅผ ๋ ๋น ๋ฅธ ์ํ ์
๋ฐ์ดํธ๊ฐ ์๋ฃ๋ ๋๊น์ง ์ฐ๊ธฐํ ์ ์์ต๋๋ค. ์ด๋ ๋ฌด๊ฑฐ์ด ๊ณ์ฐ์ด๋ ๋คํธ์ํฌ ์์ฒญ ์ค์๋ UI์ ์๋ต์ฑ์ ์ ์งํ๋ ๋ฐ ์ ์ฉํ ์ ์์ต๋๋ค.
+
+์ด๋ฌํ ๋์ ๊ธฐ๋ฅ๋ค์ React 18์ ํต์ฌ์
๋๋ค. ์ด๋ค์ ์๋ต์ฑ์ด ๋ฐ์ด๋๊ณ ์ฌ์ฉ์ ์นํ์ ์ธ ์ฑ์ ๊ตฌ์ถํ๊ธฐ ์ํ ์๋ก์ด ๋๊ตฌ์ ๊ธฐ์ ์ ์ ๊ณตํฉ๋๋ค. ๊ทธ๋ฌ๋ ํฐ ํ์๋ ํฐ ์ฑ
์์ด ๋ฐ๋ฆ
๋๋ค. ์ด๋ฌํ ๊ธฐ๋ฅ๋ค์ ์๋ก์ด ์์ค์ ๋ณต์ก์ฑ์ ๋์
ํ๋ฉฐ ์ฑ์ด ์
๋ฐ์ดํธ๋๊ณ ๋ ๋๋ง๋๋ ๋ฐฉ์์ ๋ค๋ฅด๊ฒ ์๊ฐํด์ผ ํฉ๋๋ค. ๋ฐ๋ผ์ ์ด๋ฌํ ๊ฐ๋
์ ์ฒ ์ ํ ์ดํดํ ํ์ ์ฌ์ฉํ์๊ธฐ ๋ฐ๋๋๋ค.
+
+## ๋์ ๋ชจ๋์ ํจ๊ปํ๋ React์ ๋ฏธ๋
+
+React ๋์ ๋ชจ๋์ ๋ํ ํํ์ ํตํด ์ฐ๋ฆฌ๋ ๋ง์ ๊ฒ์ ๋ฐฐ์ ์ต๋๋ค. ๋์ ๋ ๋๋ง์ ๊ธฐ๋ณธ์ ์ดํดํ๋ ๊ฒ๋ถํฐ React 18์ ์๋ก์ด ๊ธฐ๋ฅ์ ๊น์ด ํ๊ณ ๋๋ ๊ฒ๊น์ง, ๋์ ๋ชจ๋๊ฐ ์ฌ์ฉ์ ์ธํฐํ์ด์ค ๊ตฌ์ถ ๋ฐฉ์์ ํ์ ํ ์ค๋น๊ฐ ๋์ด ์์์ ์ ์ ์์์ต๋๋ค.
+
+๋์ ๋ชจ๋๋ ๋จ์ํ ์๋ก์ด ๊ธฐ๋ฅ์ด ์๋๋ผ React์ ๋ํ ์์ ํ ์๋ก์ด ์ฌ๊ณ ๋ฐฉ์์
๋๋ค. ์ด๋ฅผ ํตํด React๋ ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ฐจ๋จํ์ง ์๊ณ ๋์์ ์ฌ๋ฌ ์์
์ ์ํํ ์ ์์ต๋๋ค. ์๋ ๋ฐฐ์นญ, ์คํธ๋ฆฌ๋ฐ ์๋ฒ ๋ ๋๋ง, React Suspense์ ๊ฐ์ ๊ฐ๋ ฅํ ์๋ก์ด ๊ธฐ๋ฅ์ ๋์
ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ React์์ ๋ ๋๋ง ๋ฐ ์ํ ์
๋ฐ์ดํธ์ ๋ํ ์ฌ๊ณ ๋ฐฉ์์ ๋ณํ์ํต๋๋ค.
+
+ํ์ง๋ง ์ด๋ฌํ ์๋ก์ด ํ์๋ ์๋ก์ด ๋์ ๊ณผ์ ๊ฐ ๋ฐ๋ฆ
๋๋ค. ๋์ ๋ชจ๋๋ ์๋ก์ด ์์ค์ ๋ณต์ก์ฑ์ ๋์
ํ๋ฉฐ ์ฑ์ด ์
๋ฐ์ดํธ๋๊ณ ๋ ๋๋ง๋๋ ๋ฐฉ์์ ๋ค๋ฅด๊ฒ ์๊ฐํด์ผ ํฉ๋๋ค. ๊ธฐ์กด์ ๊ฐ์ ์ ์ฌ๊ณ ํ๊ณ ์ฝ๋๋ฅผ ๋ฆฌํฉํ ๋งํด์ผ ํ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ React ๊ฐ๋ฐ์๋ก์ ๊ณ์ ๋ฐฐ์ฐ๊ณ ์ฑ์ฅํด์ผ ํฉ๋๋ค.
+
+ํ์ง๋ง ์ด๊ฒ์ด ๋ฐ๋ก React์ ๋งค๋ ฅ์
๋๋ค. React๋ ์ง์์ ์ผ๋ก ์งํํ๊ณ ๊ฐ์ ๋๋ ์ด์์๋ ํ๋ก์ ํธ์
๋๋ค. ๋ ๋์ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌ์ถํ๊ธฐ ์ํด ์ด์ ์ ๊ฐ์ง ์๋ฐฑ๋ง ๋ช
์ ๊ฐ๋ฐ์๋ก ๊ตฌ์ฑ๋ ์ปค๋ฎค๋ํฐ์
๋๋ค. ๊ทธ๋ฆฌ๊ณ ํ์ต, ์ฑ์ฅ, ๋ฐ๊ฒฌ์ ์ฌ์ ์
๋๋ค.
+
+๋ฐ๋ผ์ ๋์ ๋ชจ๋์ ํจ๊ปํ๋ React์ ๋ฏธ๋๋ฅผ ๋ฐ๋ผ๋ณด๋ฉฐ, ์ฌ๋ฌ๋ถ์ด ๋ฌด์์ ๊ตฌ์ถํ ์ง ๊ธฐ๋๋ฉ๋๋ค. ์ด๋ฌํ ์๋ก์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ ๋ ์๋ต์ฑ์ด ๋ฐ์ด๋๊ณ ์ฌ์ฉ์ ์นํ์ ์ธ ์ฑ์ ์ด๋ป๊ฒ ๋ง๋ค์ง ๊ธฐ๋๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ์ฌ์ ์ ์ฌ๋ฌ๋ถ๊ณผ ํจ๊ป ๊ณ์ํ๊ฒ ๋์ด ๊ธฐ์ฉ๋๋ค.
+
+React ๊ฐ๋ฐ์ ๋ชจ๋ ์ ์ฌ๋ ฅ์ ๋ฐํํ ์ค๋น๊ฐ ๋์
จ๋์?
+
+React ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌ์ถํ๋ ๊ฒ์ ํฅ๋ฏธ๋กญ์ง๋ง ์๊ฐ์ด ๋ง์ด ์์๋ ์ ์์ต๋๋ค. [DhiWise React Builder](https://app.dhiwise.com/sign-up?utm_campaign=blog&utm_source=seo&utm_medium=website&utm_term=education&utm_content=deep-dive-into-react-concurrent-mode-exploring-key-features)๋ ๋ ์ ์ ์๊ฐ์ ๋ ๋ง์ ๊ฒ์ ์ด๋ฃฐ ์ ์๋๋ก ๋์์ค๋๋ค.
+
+์ค๋ DhiWise ๊ณ์ ์ ๋ฑ๋กํ๊ณ React ์ ํ๋ฆฌ์ผ์ด์
๊ตฌ์ถ์ ๋ฏธ๋๋ฅผ ๊ฒฝํํด๋ณด์ธ์.
diff --git a/Aug/article/Leveraging-TypeScript-branded-types-for-stronger-type-checks.md b/Aug/article/Leveraging-TypeScript-branded-types-for-stronger-type-checks.md
new file mode 100644
index 0000000..150f714
--- /dev/null
+++ b/Aug/article/Leveraging-TypeScript-branded-types-for-stronger-type-checks.md
@@ -0,0 +1,284 @@
+## ๐ [Leveraging TypeScript branded types for stronger type checks](https://blog.logrocket.com/leveraging-typescript-branded-types-stronger-type-checks/)
+
+### ๐๏ธ ๋ฒ์ญ ๋ ์ง: 2024.08.04
+
+### ๐ง ๋ฒ์ญํ ํฌ๋ฃจ: ๋ ์(๊น๋ค์)
+
+---
+
+## TypeScript ๋ธ๋๋ ํ์
์ ํ์ฉํ์ฌ ๋ ๊ฐ๋ ฅํ ํ์
๊ฒ์ฌํ๊ธฐ
+
+TypeScript์ ๋ธ๋๋ ํ์
์ ๋ ๋ช
ํํ ์ฝ๋๋ฅผ ์์ฑํ๊ณ ๋ ํ์
์์ ํ ์๋ฃจ์
์ ์ ๊ณตํ ์ ์๊ฒ ํด์ค๋๋ค. ์ด ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ๋ ๋งค์ฐ ๊ฐ๋จํ๋ฉฐ, ์ฝ๋ ์ ์ง ๋ณด์๋ฅผ ๋ ํจ์จ์ ์ผ๋ก ํ ์ ์๊ฒ ๋์์ค๋๋ค.
+
+
+
+![](https://blog.logrocket.com/wp-content/uploads/2024/07/Leveraging-TypeScript-branded-types-stronger-type-checks.png)
+
+
+
+์ด ๊ธฐ์ฌ์์๋ ๊ฐ๋จํ ์์ ๋ถํฐ ์์ํ์ฌ ๋ช ๊ฐ์ง ๊ณ ๊ธ ์ฌ์ฉ ์ฌ๋ก์ ์ด๋ฅด๊ธฐ๊น์ง, TypeScript ์ฝ๋์์ ๋ธ๋๋ ํ์
์ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์๋ณด๊ฒ ์ต๋๋ค. ์์ํด๋ด
์๋ค.
+
+## TypeScript์ ๋ธ๋๋ ํ์
์ด๋ ๋ฌด์์ธ๊ฐ์?
+
+TypeScript์ ๋ธ๋๋ ํ์
์ ์ฝ๋ ๊ฐ๋
์ฑ, ๋งฅ๋ฝ, ํ์
์์ ์ฑ์ ํฅ์์ํค๊ธฐ ์ํ ๋งค์ฐ ๊ฐ๋ ฅํ๊ณ ํจ์จ์ ์ธ ๊ธฐ๋ฅ์
๋๋ค. ์ด ํ์
์ ๊ธฐ์กด ํ์
์ ์ถ๊ฐ ์ ์๋ฅผ ์ ๊ณตํ์ฌ ๊ตฌ์กฐ์ ํ์ผ ์ด๋ฆ์ด ์ ์ฌํ ์ํฐํฐ๋ฅผ ๋น๊ตํ ์ ์๊ฒ ํฉ๋๋ค.
+
+์๋ฅผ ๋ค์ด, ๋ฌธ์์ด๋ก ์ฌ์ฉ์ ์ด๋ฉ์ผ์ ์ ์ฅํ๋ ๋์ , ์ด๋ฉ์ผ ์ฃผ์์ ๋ํ ๋ธ๋๋ TypeScript ํ์
์ ๋ง๋ค์ด ์ผ๋ฐ ๋ฌธ์์ด๊ณผ ๊ตฌ๋ถํ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ํฐํฐ๋ฅผ ๋ ์ฒด๊ณ์ ์ผ๋ก ๊ฒ์ฆํ ์ ์๊ณ ์ฝ๋๋ ๋ช
ํํด์ง๋๋ค.
+
+๋ธ๋๋ ํ์
์์ด ์ฐ๋ฆฌ๋ ์ผ๋ฐ์ ์ผ๋ก ๋๋ถ๋ถ์ ๊ฒฝ์ฐ์ฒ๋ผ ๊ฐ๋ค์ ์ ๋ค๋ฆญ ํ์
๋ณ์์ ์ ์ฅํฉ๋๋ค. ๋ธ๋๋ ํ์
์ ์ฌ์ฉํ๋ฉด ํด๋น ๋ณ์๋ฅผ ๊ฐ์กฐํ๊ณ ์ฝ๋ ์ ๋ฐ์์ ๊ทธ ์ ํจ์ฑ์ ์ ์งํ ์ ์์ต๋๋ค.
+
+## ๊ฐ๋จํ TypeScript ๋ธ๋๋ ํ์
์์
+
+์ด๋ฉ์ผ ์ฃผ์๋ฅผ ์ํ ๋ธ๋๋ ํ์
์ ๋ง๋ค์ด๋ด
์๋ค. type์ ๋ธ๋๋ ์ด๋ฆ์ ๋ถ์ด๋ ๊ฒ์ผ๋ก ๋ธ๋๋ ํ์
์ ์์ฑํ ์ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ, ์ด๋ฉ์ผ ์ฃผ์์ ๋ํ ๋ธ๋๋ ํ์
์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
+
+```ts
+type EmailAddress = string & { __brand: 'EmailAddress' };
+```
+
+์ฌ๊ธฐ์, ์ฐ๋ฆฌ๋ \_\_brand ์ด๋ฆ 'EmailAddress'๋ฅผ ๋ถ์ฌ์ ๋ธ๋๋ ํ์
EmailAddress๋ฅผ ๋ง๋ค์์ต๋๋ค.
+
+๋ธ๋๋ ํ์
์ ๋ง๋ค ๋ ์ ๋ค๋ฆญ ๋ฌธ๋ฒ์ ํ์์๋ค๋ ์ฌ์ค์ ๋ช
์ฌํ์ธ์. ๋ธ๋๋ ํ์
์ ์ ๋ค๋ฆญ(๋ฌธ์์ด, ์ซ์ ๋ฑ)์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค. \_\_brand ๋ฌธ๋ฒ๋ ์์ฝ์ด๊ฐ ์๋๋ฏ๋ก \_\_brand ์ธ์ ๋ค๋ฅธ ๋ณ์ ์ด๋ฆ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
+
+์ด์ EmailAddress ํ์
์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ ๋ฌธ์์ด์ ์ ๋ฌํด ๋ด
์๋ค:
+
+```ts
+const email: EmailAddress = 'asd'; // error
+```
+
+๋ณด์๋ ๋ฐ์ ๊ฐ์ด ํ์
์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค.
+
+```shell
+Type 'string' is not assignable to type 'EmailAddress.' Type 'string' is not assignable to type '{ __brand: "EmailAddress"; }.'
+```
+
+์ด๋ฅผ ๊ณ ์น๊ธฐ ์ํด์ ์ด๋ฉ์ผ ์ฃผ์์ ๋ํ ๊ธฐ๋ณธ์ ์ธ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ์์ฑํด๋ด
์๋ค.
+
+```ts
+const isEmailAddress = (email: string): email is EmailAddress => {
+ return email.endsWith('@gmail.com');
+};
+```
+
+์ฌ๊ธฐ์ boolean ๊ฐ์ ๋ฐํํ๋ ๋์ , `email is EmailAddress`๋ฅผ ๋ฐํํ๊ณ ์์ต๋๋ค. ์ด๋ ํจ์๊ฐ `true`๋ฅผ ๋ฐํํ๋ฉด email์ด `EmailAddress` [ํ์
์ผ๋ก ์บ์คํ
](https://blog.logrocket.com/how-to-perform-type-casting-typescript/)๋๋ค๋ ์๋ฏธ์
๋๋ค. ์ด๋ฅผ ํตํด ๋ฌธ์์ด์ ๋ํด ์ด๋ค ์์
์ ์ํํ๊ธฐ ์ ์ ์ ํจ์ฑ์ ๊ฒ์ฆํ ์ ์์ต๋๋ค.
+
+```ts
+const sendVerificationEmail = (email: EmailAddress) => {
+ //...
+};
+const signUp = (email: string, password: string) => {
+ //...
+ if (isEmailAddress(email)) {
+ sendVerificationEmail(email); // pass
+ }
+ sendVerificationEmail(email); // error
+};
+```
+
+๋ณด์๋ ๋ฐ์ ๊ฐ์ด, ์ค๋ฅ๋ if ์กฐ๊ฑด๋ฌธ ์์์ ๋ณด์ด์ง ์์ง๋ง, ํด๋น ์กฐ๊ฑด๋ฌธ์ ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ฉด ๋ฐ์ํฉ๋๋ค.
+
+`assert`๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฉ์ผ ์ฃผ์๋ฅผ ๊ฒ์ฆํ ์๋ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๊ฒ์ฆ์ด ํต๊ณผ๋์ง ์์ ๊ฒฝ์ฐ ์ค๋ฅ๋ฅผ ๋ฐ์์ํค๊ณ ์ ํ ๋ ์ ์ฉํ ์ ์์ต๋๋ค.
+
+```ts
+function assertEmailAddress(email: string): asserts email is EmailAddress {
+ if (!email.endsWith('@gmail.com')) {
+ throw new Error('Not an email addres');
+ }
+}
+
+const sendVerificationEmail = (email: EmailAddress) => {
+ //...
+};
+
+const signUp = (email: string, password: string) => {
+ //...
+ assertEmailAddress(email);
+ sendVerificationEmail(email); // ok
+};
+```
+
+์ฌ๊ธฐ์ ๋ณด์๋ค์ํผ, ๋ฐํ ํ์
์ผ๋ก `asserts email is EmailAddress`๋ฅผ ๋ช
์ํ๊ณ ์์ต๋๋ค. ์ด๋ ๊ฒ์ฆ์ด ํต๊ณผํ๋ฉด ์ด๋ฉ์ผ ์ฃผ์๊ฐ ๋ธ๋๋ ํ์
`EmailAddress`์์ ๋ณด์ฅํฉ๋๋ค.
+
+## TypeScript์์ ๋ธ๋๋ ํ์
์ ๊ณ ๊ธ ์ฌ์ฉ ์ฌ๋ก
+
+์ ์์๋ ๋ธ๋๋ ํ์
์ ๊ฐ๋จํ ์์ฐ์
๋๋ค. ์ฐ๋ฆฌ๋ ์ด๋ฅผ ๋ ๊ณ ๊ธ ์ฌ๋ก์์๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์์๋ฅผ ํ๋ ๋ณด๊ฒ ์ต๋๋ค.
+
+๋จผ์ , ๋ค๋ฅธ ํ์
์ ๋ถ์ผ ์ ์๋ ๊ณตํต Branded ํ์
์ ์ ์ธํด ๋ด
์๋ค:
+
+```ts
+declare const __brand: unique symbol;
+type Brand = { [__brand]: B };
+export type Branded = T & Brand;
+```
+
+์ฌ๊ธฐ์, ์ฌ๋ณผ์ ์ฌ์ฉํด ๊ฐ ํ์
์ ๊ตฌ๋ถํ๋ ๊ณ ์ ํ ๋ธ๋๋๋ฅผ ๋ง๋ญ๋๋ค. ์ฌ๋ณผ์ ๋ค๋ฅธ ์ด๋ค ์ฌ๋ณผ๊ณผ๋ ๊ตฌ๋ณ๋๋ ์ ์ผํ ์ฌ๋ณผ์์ ๋ณด์ฅํฉ๋๋ค. ์ด๋ ์๋ก์ด ์ฌ๋ณผ์ ์์ฑํ ๋๋ง๋ค ๋ค๋ฅธ ์ฌ๋ณผ๊ณผ ๊ตฌ๋ณ๋๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ๋ค์์ ์ด๋ฅผ ์ค๋ช
ํ๋ ์์ ์
๋๋ค:
+
+```ts
+// ๋ธ๋๋๋ก ์ฌ์ฉํ ๊ณ ์ ์ฌ๋ณผ ์ ์
+const metersSymbol: unique symbol = Symbol('meters');
+const kilometersSymbol: unique symbol = Symbol('kilometers');
+
+// ๋ธ๋๋ ํ์
์ ์
+type Meters = number & { [metersSymbol]: void };
+type Kilometers = number & { [kilometersSymbol]: void };
+
+// ๋ธ๋๋ ๊ฐ์ ์์ฑํ๋ ๋์ฐ๋ฏธ ํจ์
+function meters(value: number): Meters {
+ return value as Meters;
+}
+
+function kilometers(value: number): Kilometers {
+ return value as Kilometers;
+}
+
+// ๋ธ๋๋ ํ์
์ ๊ฐ์ง ๋ณ์๋ค
+const distanceInMeters: Meters = meters(100);
+const distanceInKilometers: Kilometers = kilometers(1);
+
+// ์๋ ํ ๋น์ ํ์
์ค๋ฅ๋ฅผ ๋ฐ์์ํด
+const wrongDistance: Meters = distanceInKilometers;
+const anotherWrongDistance: Kilometers = distanceInMeters;
+
+// ์ฌ๋ฐ๋ฅธ ์ฌ์ฉ๋ฒ
+const anotherDistanceInMeters: Meters = meters(200);
+const anotherDistanceInKilometers: Kilometers = kilometers(2);
+
+console.log(distanceInMeters, distanceInKilometers);
+```
+
+๊ณตํต Branded ํ์
์ธํฐํ์ด์ค๋ฅผ ๊ฐ์ง๋ฉด TypeScript์์ ์ฌ๋ฌ ๋ธ๋๋ ํ์
์ ๋์์ ์์ฑํ ์ ์์ด, ์ฝ๋ ๊ตฌํ์ ์ค์ด๊ณ ์ฝ๋๋ฅผ ํจ์ฌ ๊น๋ํ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค. ์ด์ ์์ ์ด๋ฉ์ผ ๊ฒ์ฆ ์์ ๋ฅผ ํ์ฅํ์ฌ, ์ด ๊ณตํต Branded ํ์
์ ์ฌ์ฉํด EmailAddress ๋ธ๋๋๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์ ์ํ ์ ์์ต๋๋ค:
+
+```ts
+type EmailAddress = Branded;
+
+const isEmailAddress = (email: string): email is EmailAddress => {
+ return email.endsWith('@gmail.com');
+};
+
+const sendEmail = (email: EmailAddress) => {
+ // ...
+};
+
+const signUp = (email: string, password: string) => {
+ if (isEmailAddress(email)) {
+ // ์ธ์ฆ ๋ฉ์ผ ์ ์ก
+ sendEmail(email);
+ }
+};
+```
+
+์ด์ ์ด Branded ํ์
์ ์ฌ์ฉํ์ฌ ์๋ก์ด ๋ธ๋๋ TypeScript ํ์
์ ๋ง๋ค ์ ์์ต๋๋ค. Branded ํ์
์ ์ฌ์ฉํ๋ ๋ ๋ค๋ฅธ ์๋ฅผ ์ดํด๋ด
์๋ค. ์ฌ์ฉ์๊ฐ ๊ฒ์๋ฌผ์ ์ข์ํ ์ ์๋๋ก ํ๋ ํจ์๋ฅผ ์์ฑํ๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. userId์ postId ๋ชจ๋์ Branded ํ์
์ ์ฌ์ฉํ ์ ์์ต๋๋ค:
+
+```ts
+type UserId = Branded;
+type PostId = Branded;
+
+type User = {
+ userId: UserId;
+ username: string;
+ email: string;
+};
+
+type Post = {
+ postId: PostId;
+ title: string;
+ description: string;
+ likes: Like[];
+};
+
+type Like = {
+ userId: UserId;
+ postId: PostId;
+};
+
+const likePost = async (userId: UserId, postId: PostId) => {
+ const response = await fetch(`/posts/${postId}/like/${userId}`, {
+ method: 'post',
+ });
+ return await response.json();
+};
+
+// ๊ฐ์์ ๊ฐ์ฒด
+const user: User = {
+ userId: '1' as UserId,
+ email: 'a@email.com',
+ username: 'User1',
+};
+const post: Post = {
+ postId: '2' as PostId,
+ title: 'Sample Title',
+ description: 'Sample post description',
+ likes: [],
+};
+
+likePost(user.userId, post.postId); // ok
+likePost(post.postId, user.userId); // error
+```
+
+## TypeScript 5.5-beta์์ ๋ธ๋๋ ํ์
์ผ๋ก ์์
ํ๊ธฐ
+
+์๋ก์ด TypeScript 5.5-beta ๋ฆด๋ฆฌ์ค์์๋ TypeScript์ ์ ์ด ํ๋ฆ ๋ถ์์ด ์ฝ๋๊ฐ ์งํ๋จ์ ๋ฐ๋ผ ๋ณ์์ ํ์
์ด ์ด๋ป๊ฒ ๋ณํ๋์ง ์ถ์ ํ ์ ์๊ฒ ๋์์ต๋๋ค.
+
+์ด๋ ๋ณ์์ ํ์
์ด ์ฝ๋ ๋ก์ง์ ๋ฐ๋ผ ๋ณ๊ฒฝ๋ ์ ์์ผ๋ฉฐ, TypeScript๊ฐ ์ฝ๋ ๋ก์ง์ ๊ฐ ์์ ์ฒด์ธ์์ ๋ณ์ ํ์
์ ์ถ์ ํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ๋ณ์๊ฐ ๊ฐ์ง ์ ์๋ ๋ ๊ฐ์ง ๊ฐ๋ฅํ ํ์
์ด ์๋ ๊ฒฝ์ฐ, ํ์ํ ์กฐ๊ฑด์ ์ ์ฉํ์ฌ ๋ณ์์ ํ์
์ ๋ถ๋ฆฌํ ์ ์์ต๋๋ค.
+
+์๋ ์ฝ๋๋ฅผ ๋ณด๋ฉด์ ์ดํดํด๋ด
์๋ค:
+
+```tsx
+interface ItemProps {
+ // ...
+}
+
+declare const items: Map;
+
+function getItem(id: string) {
+ const item = items.get(id); // item์ ItemProps | undefined ํ์
์ผ๋ก ์ ์ธ๋จ
+ if (item) {
+ // if ๋ฌธ ์์์ item์ ItemProps ํ์
์ ๊ฐ์ง
+ } else {
+ // ์ฌ๊ธฐ์ item์ undefined ํ์
์ ๊ฐ์ง
+ }
+}
+
+function getAllItemsByIds(ids: string[]): ItemProps[] {
+ return ids.map((id) => items.get(id)).filter((item) => item !== undefined); // ์ด์ ์๋ ์ด๋ฐ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค: Type '(ItemProps | undefined)[]' is not assignable to type 'ItemProps[]'. Type 'ItemProps | undefined' is not assignable to type 'ItemProps'. Type 'undefined' is not assignable to type 'ItemProps'
+}
+```
+
+๋ค์ ์์ ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์ด ์์ ์์๋ ์ด๋ฉ์ผ ์ฃผ์ ๋ชฉ๋ก์ ๊ฐ์ ธ์์ ๊ฒ์ฆ๋ ์ด๋ฉ์ผ ์ฃผ์๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํฉ๋๋ค. ์ด์ ์์ ๋ฅผ ์ฌ์ฉํ์ฌ ๋ธ๋๋ EmailAddress ํ์
์ ์์ฑํ๊ณ ๊ฒ์ฆ๋ ์ด๋ฉ์ผ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ ์ ์์ต๋๋ค:
+
+```ts
+type EmailAddress = Branded;
+const isEmailAddress = (email: string): email is EmailAddress => {
+ return email.endsWith('@gmail.com');
+};
+
+const storeToDb = async (emails: EmailAddress[]) => {
+ const response = await fetch('/store-to-db', {
+ body: JSON.stringify({
+ emails,
+ }),
+ method: 'post',
+ });
+ return await response.json();
+};
+
+const emails = ['a@gmail.com', 'b@gmail.com', '...'];
+const validatedEmails = emails.filter((email) => isEmailAddress(email));
+storeToDb(validatedEmails); // error
+```
+
+์ฌ๊ธฐ์ ๊ฒ์ฆ๋ ์ด๋ฉ์ผ ์ฃผ์๋ฅผ validatedEmails ๋ฐฐ์ด์ ๋์ดํ๊ณ ์์ง๋ง, storeToDb ํจ์์ ์ ๋ฌํ ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. ์ด ์ค๋ฅ๋ ํนํ v5.5-beta ์ด์ ์ TypeScript ๋ฒ์ ์ ์ฌ์ฉํ ๋ ๋ํ๋ฉ๋๋ค.
+
+๋ฎ์ ๋ฒ์ ์ TypeScript์์๋ validatedEmails ๋ฐฐ์ด์ ํ์
์ด ์๋ ๋ณ์์ธ emails ๋ฐฐ์ด์์ ํ์๋ฉ๋๋ค. ๊ทธ๋์ validatedEmails ๋ฐฐ์ด์ ํ์
์ด string[]๋ก ๋ํ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด ๋ฌธ์ ๋ ํ์ฌ TypeScript ๋ฒ ํ ๋ฒ์ (ํ์ฌ ๊ธฐ์ค์ผ๋ก 5.5-beta)์์ ํด๊ฒฐ๋์์ต๋๋ค.
+
+ํ์ฌ ๋ฒ ํ ๋ฒ์ ์์๋ ๊ฒ์ฆ๋ ์ด๋ฉ์ผ์ ํํฐ๋งํ ํ์ validatedEmails๊ฐ ์๋์ผ๋ก EmailAddress[]๋ก ํ์
์บ์คํ
๋ฉ๋๋ค. ๋ฐ๋ผ์ TypeScript 5.5-beta ๋ฒ์ ์์๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค. ํ๋ก์ ํธ์ TypeScript ๋ฒ ํ ๋ฒ์ ์ ์ค์นํ๋ ค๋ฉด ํฐ๋ฏธ๋์์ ๋ค์ ๋ช
๋ น์ด๋ฅผ ์คํํ์ญ์์ค:
+
+```shell
+npm install -D typescript@beta
+```
+
+
+
+## ๊ฒฐ๋ก
+
+๋ธ๋๋ ํ์
์ TypeScript์์ ๋งค์ฐ ์ ์ฉํ ๊ธฐ๋ฅ์
๋๋ค. ์ด๋ค์ ๋ฐํ์ ํ์
์์ ์ฑ์ ์ ๊ณตํ์ฌ ์ฝ๋ ๋ฌด๊ฒฐ์ฑ์ ๋ณด์ฅํ๊ณ ๊ฐ๋
์ฑ์ ํฅ์์ํต๋๋ค. ๋ํ ๋๋ฉ์ธ ์์ค์์ ์ค๋ฅ๋ฅผ ๋ฐ์์์ผ ์ฝ๋์ ๋ฒ๊ทธ๋ฅผ ์ค์ด๋ ๋ฐ ๋งค์ฐ ์ ์ฉํฉ๋๋ค.
+
+๋ธ๋๋ ํ์
์ ์ฝ๊ฒ ๊ฒ์ฆํ๊ณ , ๊ฒ์ฆ๋ ๊ฐ์ฒด๋ฅผ ํ๋ก์ ํธ ์ ๋ฐ์ ๊ฑธ์ณ ์์ ํ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ต์ TypeScript ๋ฒ ํ ๋ฒ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด ์ฝ๋ฉ ๊ฒฝํ์ ๋์ฑ ์ํํ๊ฒ ํ์ฉํ ์ ์์ต๋๋ค.
diff --git a/Aug/article/Server-Component.md b/Aug/article/Server-Component.md
new file mode 100644
index 0000000..45cd5a2
--- /dev/null
+++ b/Aug/article/Server-Component.md
@@ -0,0 +1,122 @@
+## ๐ [Server Components](https://nextjs.org/docs/app/building-your-application/rendering/server-components)
+
+### ๐๏ธ ๋ฒ์ญ ๋ ์ง: 2024.08.04
+
+### ๐ง ๋ฒ์ญํ ํฌ๋ฃจ: ๋ฌ๊ธฐ(๋ฐ์ ์ฐ)
+
+---
+
+## ์๋ฒ ์ปดํฌ๋ํธ
+
+React ์๋ฒ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ฒ์์ UI๋ฅผ ๋ ๋๋งํ๊ณ ์ ํ์ ์ผ๋ก ์บ์ํ ์ ์์ต๋๋ค. Next.js์์๋ ๋ผ์ฐํธ ์ธ๊ทธ๋จผํธ์ ๋ฐ๋ผ ๋ ๋๋ง ์์
์ ๋ถํ ํ์ฌ ์คํธ๋ฆฌ๋ฐ ๋ฐ ๋ถ๋ถ ๋ ๋๋ง์ ๊ฐ๋ฅํ๊ฒ ํ๋ฉฐ, ์ธ ๊ฐ์ง ์๋ฒ ๋ ๋๋ง ์ ๋ต์ด ์์ต๋๋ค:
+
+- ์ ์ ๋ ๋๋ง
+- ๋์ ๋ ๋๋ง
+- ์คํธ๋ฆฌ๋ฐ
+
+์ด ํ์ด์ง์์๋ ์๋ฒ ์ปดํฌ๋ํธ์ ์๋ ๋ฐฉ์, ์ฌ์ฉ ์๊ธฐ, ๋ค์ํ ์๋ฒ ๋ ๋๋ง ์ ๋ต์ ๋ํด ์ค๋ช
ํฉ๋๋ค.
+
+## ์๋ฒ ๋ ๋๋ง์ ์ด์
+
+์๋ฒ์์ ๋ ๋๋ง ์์
์ ์ํํ๋ ๊ฒ์ ๋ค์๊ณผ ๊ฐ์ ๋ช ๊ฐ์ง ์ด์ ์ ์ ๊ณตํฉ๋๋ค:
+
+- **๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ**: ์๋ฒ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐ์ดํฐ ์์ค์ ๊ฐ๊น์ด ์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๋ ๋๋ง์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ์๊ฐ์ ๋จ์ถํ๊ณ ํด๋ผ์ด์ธํธ์์ ์์ฒญํด์ผ ํ๋ ํ์๋ฅผ ์ค์ฌ ์ฑ๋ฅ์ ๊ฐ์ ํ ์ ์์ต๋๋ค.
+- **๋ณด์**: ์๋ฒ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋ฉด ํ ํฐ์ด๋ API ํค์ ๊ฐ์ ๋ฏผ๊ฐํ ๋ฐ์ดํฐ์ ๋ก์ง์ ํด๋ผ์ด์ธํธ์ ๋
ธ์ถ์ํค์ง ์๊ณ ์๋ฒ์ ์ ์งํ ์ ์์ต๋๋ค.
+- **์บ์ฑ**: ์๋ฒ์์ ๋ ๋๋งํ๋ฉด ๊ฒฐ๊ณผ๋ฅผ ์บ์ํ๊ณ ์ดํ ์์ฒญ ๋ฐ ์ฌ์ฉ์ ๊ฐ์ ์ฌ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์ฑ๋ฅ์ ๊ฐ์ ํ๊ณ ๊ฐ ์์ฒญ๋ง๋ค ๋ ๋๋ง ๋ฐ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์ค์ฌ ๋น์ฉ์ ์ ๊ฐํ ์ ์์ต๋๋ค.
+- **์ฑ๋ฅ**: ์๋ฒ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋ฉด ๊ธฐ๋ณธ ์ฑ๋ฅ์ ์ต์ ํํ๋ ์ถ๊ฐ ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์์ ํ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๋ก ๊ตฌ์ฑ๋ ์ฑ์์ ์ํธ์์ฉ์ด ์๋ UI ๋ถ๋ถ์ ์๋ฒ ์ปดํฌ๋ํธ๋ก ์ด๋ํ๋ฉด ํด๋ผ์ด์ธํธ ์ธก JavaScript ์์ ์ค์ผ ์ ์์ต๋๋ค. ์ด๋ ๋๋ฆฐ ์ธํฐ๋ท์ด๋ ์ฑ๋ฅ์ด ๋ฎ์ ์ฅ์น๋ฅผ ์ฌ์ฉํ๋ ์ฌ์ฉ์์๊ฒ ์ ๋ฆฌํฉ๋๋ค.
+- **์ด๊ธฐ ํ์ด์ง ๋ก๋ ๋ฐ ์ฒซ ๋ฒ์งธ ์ฝํ
์ธ ํ์ธํธ(FCP)**: ์๋ฒ์์ HTML์ ์์ฑํ์ฌ ์ฌ์ฉ์๊ฐ ํ์ด์ง๋ฅผ ์ฆ์ ๋ณผ ์ ์๋๋ก ํฉ๋๋ค. ์ด๋ ํด๋ผ์ด์ธํธ๊ฐ ํ์ด์ง๋ฅผ ๋ ๋๋งํ๋ ๋ฐ ํ์ํ JavaScript๋ฅผ ๋ค์ด๋ก๋, ํ์ฑ, ์คํํ๋ ๊ฒ์ ๊ธฐ๋ค๋ฆฌ์ง ์๊ฒ ํฉ๋๋ค.
+- **๊ฒ์ ์์ง ์ต์ ํ(SEO) ๋ฐ ์์
๋คํธ์ํฌ ๊ณต์ ๊ฐ๋ฅ์ฑ**: ๋ ๋๋ง๋ HTML์ ๊ฒ์ ์์ง ๋ด์ด ํ์ด์ง๋ฅผ ์ธ๋ฑ์ฑํ๊ณ ์์
๋คํธ์ํฌ ๋ด์ด ํ์ด์ง์ ์์
์นด๋ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ฅผ ์์ฑํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค.
+- **์คํธ๋ฆฌ๋ฐ**: ์๋ฒ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ ๋๋ง ์์
์ ์ฒญํฌ๋ก ๋ถํ ํ๊ณ ์ค๋น๋๋ ๋๋ก ํด๋ผ์ด์ธํธ์ ์คํธ๋ฆฌ๋ฐํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์ ์ฒด ํ์ด์ง๊ฐ ์๋ฒ์์ ๋ ๋๋ง๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ํ์ด์ง์ ์ผ๋ถ๋ฅผ ๋จผ์ ๋ณผ ์ ์์ต๋๋ค.
+
+## Next.js์์ ์๋ฒ ์ปดํฌ๋ํธ ์ฌ์ฉ
+
+๊ธฐ๋ณธ์ ์ผ๋ก Next.js๋ ์๋ฒ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ถ๊ฐ์ ์ธ ์ค์ ์์ด ์๋์ผ๋ก ์๋ฒ ๋ ๋๋ง์ ๊ตฌํํ ์ ์์ผ๋ฉฐ, ํ์ํ ๋ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๋ฅผ ์ ํํ ์ ์์ต๋๋ค.
+
+---
+
+## ์๋ฒ ์ปดํฌ๋ํธ๋ ์ด๋ป๊ฒ ๋ ๋๋ง๋๋์?
+
+์๋ฒ์์ Next.js๋ React์ API๋ฅผ ์ฌ์ฉํ์ฌ ๋ ๋๋ง์ ์กฐ์ ํฉ๋๋ค. ๋ ๋๋ง ์์
์ ๊ฐ๋ณ ๋ผ์ฐํธ ์ธ๊ทธ๋จผํธ ๋ฐ ์์คํ์ค ๊ฒฝ๊ณ๋ฅผ ๊ธฐ์ค์ผ๋ก ์ฒญํฌ๋ก ๋ถํ ๋ฉ๋๋ค.
+
+๊ฐ ์ฒญํฌ๋ ๋ ๋จ๊ณ๋ก ๋ ๋๋ง๋ฉ๋๋ค:
+
+1. React๋ ์๋ฒ ์ปดํฌ๋ํธ๋ฅผ ํน์ ๋ฐ์ดํฐ ํ์์ธ React ์๋ฒ ์ปดํฌ๋ํธ ํ์ด๋ก๋(RSC Payload)๋ก ๋ ๋๋งํฉ๋๋ค.
+2. Next.js๋ RSC ํ์ด๋ก๋์ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ JavaScript ์ง์นจ์ ์ฌ์ฉํ์ฌ ์๋ฒ์์ HTML์ ๋ ๋๋งํฉ๋๋ค.
+
+๊ทธ๋ฐ ๋ค์ ํด๋ผ์ด์ธํธ์์๋:
+
+1. HTML์ ์ฌ์ฉํ์ฌ ์ด๊ธฐ ํ์ด์ง ๋ก๋ ์ ๋น ๋ฅด๊ณ ๋น์ํธ์์ฉ์ ์ธ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ฅผ ์ฆ์ ํ์ํฉ๋๋ค.
+2. React ์๋ฒ ์ปดํฌ๋ํธ ํ์ด๋ก๋๋ฅผ ์ฌ์ฉํ์ฌ ํด๋ผ์ด์ธํธ์ ์๋ฒ ์ปดํฌ๋ํธ ํธ๋ฆฌ๋ฅผ ์กฐ์ ํ๊ณ DOM์ ์
๋ฐ์ดํธํฉ๋๋ค.
+3. hydrate๋ฅผ ์ํด JavaScript ์ง์นจ์ ์ฌ์ฉํ์ฌ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๋ฅผ ํ์ฑํํ๊ณ ์ ํ๋ฆฌ์ผ์ด์
์ ์ํธ์์ฉ ๊ฐ๋ฅํ๊ฒ ๋ง๋ญ๋๋ค.
+
+### React ์๋ฒ ์ปดํฌ๋ํธ ํ์ด๋ก๋(RSC)๋ ๋ฌด์์ธ๊ฐ์?
+
+RSC ํ์ด๋ก๋๋ ๋ ๋๋ง๋ React ์๋ฒ ์ปดํฌ๋ํธ ํธ๋ฆฌ์ ๊ฐ๊ฒฐํ ๋ฐ์ด๋๋ฆฌ ํํ์
๋๋ค. ์ด๋ ํด๋ผ์ด์ธํธ์์ React๊ฐ ๋ธ๋ผ์ฐ์ ์ DOM์ ์
๋ฐ์ดํธํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. RSC ํ์ด๋ก๋๋ ๋ค์์ ํฌํจํฉ๋๋ค:
+
+- ์๋ฒ ์ปดํฌ๋ํธ์ ๋ ๋๋ง๋ ๊ฒฐ๊ณผ
+- ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง๋ ์๋ฆฌ ํ์์ ๋ฐ ํด๋น JavaScript ํ์ผ์ ๋ํ ์ฐธ์กฐ
+- ์๋ฒ ์ปดํฌ๋ํธ์์ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๋ก ์ ๋ฌ๋ ๋ชจ๋ props
+
+## ์๋ฒ ๋ ๋๋ง ์ ๋ต
+
+์๋ฒ ๋ ๋๋ง์๋ ์ธ ๊ฐ์ง ํ์ ์งํฉ์ด ์์ต๋๋ค: ์ ์ , ๋์ ๋ฐ ์คํธ๋ฆฌ๋ฐ.
+
+### ์ ์ ๋ ๋๋ง (๊ธฐ๋ณธ๊ฐ)
+
+์ ์ ๋ ๋๋ง์์๋ ๋ผ์ฐํธ๊ฐ ๋น๋ ์ ๋๋ ๋ฐ์ดํฐ ์ฌ๊ฒ์ฆ ํ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋ ๋๋ง๋ฉ๋๋ค. ๊ฒฐ๊ณผ๋ ์บ์๋์ด ์ฝํ
์ธ ์ ๋ฌ ๋คํธ์ํฌ(CDN)์ ํธ์๋ ์ ์์ต๋๋ค. ์ด ์ต์ ํ๋ ๋ ๋๋ง ์์
์ ๊ฒฐ๊ณผ๋ฅผ ์ฌ์ฉ์ ๋ฐ ์๋ฒ ์์ฒญ ๊ฐ์ ๊ณต์ ํ ์ ์๊ฒ ํฉ๋๋ค.
+
+์ ์ ๋ ๋๋ง์ ๋ผ์ฐํธ์ ๋ฐ์ดํฐ๊ฐ ์ฌ์ฉ์์๊ฒ ๊ฐ์ธํ๋์ง ์๊ณ ๋น๋ ์ ์ ์ ์๋ ๊ฒฝ์ฐ์ ์ ์ฉํฉ๋๋ค. ์๋ฅผ ๋ค์ด ์ ์ ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์ด๋ ์ ํ ํ์ด์ง ๋ฑ์ด ์์ต๋๋ค.
+
+### ๋์ ๋ ๋๋ง
+
+๋์ ๋ ๋๋ง์์๋ ๋ผ์ฐํธ๊ฐ ์์ฒญ ์๋ง๋ค ์ฌ์ฉ์์๊ฒ ๋ง์ถฐ ๋ ๋๋ง๋ฉ๋๋ค. ๋์ ๋ ๋๋ง์ ์ฟ ํค๋ URL์ ๊ฒ์ ๋งค๊ฐ๋ณ์์ ๊ฐ์ ์์ฒญ ์์๋ง ์ ์ ์๋ ์ ๋ณด๋ฅผ ํฌํจํ๋ ๋ผ์ฐํธ์ ์ ์ฉํฉ๋๋ค.
+
+### ์บ์๋ ๋ฐ์ดํฐ๊ฐ ์๋ ๋์ ๋ผ์ฐํธ
+
+๋๋ถ๋ถ์ ์น์ฌ์ดํธ์์ ๋ผ์ฐํธ๋ ์์ ํ ์ ์ ์ด๊ฑฐ๋ ์์ ํ ๋์ ์ด์ง ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๊ฐ๊ฒฉ๋ง๋ค ์ฌ๊ฒ์ฆ๋๋ ์บ์๋ ์ ํ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ ์ ์ ์๊ฑฐ๋ ํ์ด์ง๊ฐ ์์ ์ ์์ง๋ง, ์บ์๋์ง ์์ ๊ฐ์ธํ๋ ๊ณ ๊ฐ ๋ฐ์ดํฐ๋ ํฌํจ๋ ์ ์์ต๋๋ค.
+
+Next.js์์๋ ์บ์๋ ๋ฐ์ดํฐ์ ์บ์๋์ง ์์ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ํฌํจํ๋ ๋์ ์ผ๋ก ๋ ๋๋ง๋ ๋ผ์ฐํธ๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค. ์ด๋ RSC ํ์ด๋ก๋์ ๋ฐ์ดํฐ๊ฐ ๋ณ๋๋ก ์บ์๋๊ธฐ ๋๋ฌธ์
๋๋ค. ์ด๋ฅผ ํตํด ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์์ฒญ ์ ๊ฐ์ ธ์ค๋ ์ฑ๋ฅ ๋ฌธ์ ์์ด ๋์ ๋ ๋๋ง์ ์ ํํ ์ ์์ต๋๋ค.
+
+์ ์ฒด ๋ผ์ฐํธ ์บ์ ๋ฐ ๋ฐ์ดํฐ ์บ์์ ๋ํด ์์ธํ ์์๋ณด์ธ์.
+
+[Building Your Application: Caching - full route cache](https://nextjs.org/docs/app/building-your-application/caching#full-route-cache)
+
+[Building Your Application: Caching - data cache](https://nextjs.org/docs/app/building-your-application/caching#data-cache)
+
+### ๋์ ๋ ๋๋ง์ผ๋ก ์ ํ
+
+๋ ๋๋ง ์ค์ ๋์ ํจ์๋ ์บ์๋์ง ์์ ๋ฐ์ดํฐ ์์ฒญ์ด ๋ฐ๊ฒฌ๋๋ฉด Next.js๋ ์ ์ฒด ๋ผ์ฐํธ๋ฅผ ๋์ ์ผ๋ก ๋ ๋๋งํ๋๋ก ์ ํํฉ๋๋ค. ์ด ํ๋ ๋์ ํจ์์ ๋ฐ์ดํฐ ์บ์ฑ์ด ๋ผ์ฐํธ์ ์ ์ ๋๋ ๋์ ๋ ๋๋ง ์ฌ๋ถ์ ์ด๋ป๊ฒ ์ํฅ์ ๋ฏธ์น๋์ง ์์ฝํฉ๋๋ค:
+
+| ๋์ ํจ์ | ๋ฐ์ดํฐ | ๋ผ์ฐํธ |
+| --------- | ------------- | ----------------- |
+| ์๋์ | ์บ์๋จ | ์ ์ ์ผ๋ก ๋ ๋๋ง๋จ |
+| ์ | ์บ์๋จ | ๋์ ์ผ๋ก ๋ ๋๋ง๋จ |
+| ์๋์ | ์บ์๋์ง ์์ | ๋์ ์ผ๋ก ๋ ๋๋ง๋จ |
+| ์ | ์บ์๋์ง ์์ | ๋์ ์ผ๋ก ๋ ๋๋ง๋จ |
+
+์์ ํ์์, ๋ผ์ฐํธ๊ฐ ์์ ํ ์ ์ ์ด ๋๋ ค๋ฉด ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ์บ์๋์ด์ผ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์บ์๋ ๋ฐ์ดํฐ์ ์บ์๋์ง ์์ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ๋ชจ๋ ์ฌ์ฉํ๋ ๋์ ์ผ๋ก ๋ ๋๋ง๋ ๋ผ์ฐํธ๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค.
+
+๊ฐ๋ฐ์๋ก์ ์ ์ ๋ ๋๋ง๊ณผ ๋์ ๋ ๋๋ง์ ์ ํํ ํ์๋ ์์ต๋๋ค. Next.js๋ ์ฌ์ฉ๋ ๊ธฐ๋ฅ๊ณผ API์ ๋ฐ๋ผ ๊ฐ ๋ผ์ฐํธ์ ์ต์ ์ ๋ ๋๋ง ์ ๋ต์ ์๋์ผ๋ก ์ ํํฉ๋๋ค. ๋์ ํน์ ๋ฐ์ดํฐ๋ฅผ ์บ์ํ๊ฑฐ๋ ์ฌ๊ฒ์ฆํ ๋์ UI์ ์ผ๋ถ๋ฅผ ์คํธ๋ฆฌ๋ฐํ ๋๋ฅผ ์ ํํฉ๋๋ค.
+
+### ๋์ ํจ์
+
+๋์ ํจ์๋ ์์ฒญ ์์๋ง ์ ์ ์๋ ์ ๋ณด(์: ์ฌ์ฉ์์ ์ฟ ํค, ํ์ฌ ์์ฒญ ํค๋ ๋๋ URL์ ๊ฒ์ ๋งค๊ฐ๋ณ์)์ ์์กดํฉ๋๋ค. Next.js์์ ์ด๋ฌํ ๋์ ํจ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
+
+- `cookies()`์ `headers()`: ์๋ฒ ์ปดํฌ๋ํธ์์ ์ด๋ฅผ ์ฌ์ฉํ๋ฉด ์ ์ฒด ๋ผ์ฐํธ๊ฐ ์์ฒญ ์์ ๋์ ์ผ๋ก ๋ ๋๋ง๋ฉ๋๋ค.
+- `searchParams`: ํ์ด์ง์์ `searchParams` prop์ ์ฌ์ฉํ๋ฉด ํ์ด์ง๊ฐ ์์ฒญ ์์ ๋์ ์ผ๋ก ๋ ๋๋ง๋ฉ๋๋ค.
+
+์ด๋ค ์ค ํ๋๋ฅผ ์ฌ์ฉํ๋ฉด ์ ์ฒด ๋ผ์ฐํธ๊ฐ ์์ฒญ ์์ ๋์ ์ผ๋ก ๋ ๋๋ง๋ฉ๋๋ค.
+
+### ์คํธ๋ฆฌ๋ฐ
+
+![streaming](https://nextjs.org/_next/image?url=%2Fdocs%2Fdark%2Fsequential-parallel-data-fetching.png&w=3840&q=75)
+
+์คํธ๋ฆฌ๋ฐ์ ์๋ฒ์์ UI๋ฅผ ์ ์ง์ ์ผ๋ก ๋ ๋๋งํ ์ ์๊ฒ ํฉ๋๋ค. ์์
์ ์ฒญํฌ๋ก ๋ถํ ๋๊ณ ์ค๋น๋๋ ๋๋ก ํด๋ผ์ด์ธํธ์ ์คํธ๋ฆฌ๋ฐ๋ฉ๋๋ค. ์ด๋ฅผ ํตํด ์ ์ฒด ์ฝํ
์ธ ๊ฐ ๋ ๋๋ง๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ํ์ด์ง์ ์ผ๋ถ๋ฅผ ์ฆ์ ๋ณผ ์ ์์ต๋๋ค.
+
+![streaming2](https://nextjs.org/_next/image?url=%2Fdocs%2Fdark%2Fserver-rendering-with-streaming.png&w=3840&q=75)
+
+์คํธ๋ฆฌ๋ฐ์ Next.js App Router์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ด์ฅ๋์ด ์์ต๋๋ค. ์ด๋ ์ด๊ธฐ ํ์ด์ง ๋ก๋ฉ ์ฑ๋ฅ์ ํฅ์์ํค๊ณ , ์ ์ฒด ๋ผ์ฐํธ ๋ ๋๋ง์ ์ฐจ๋จํ ๋๋ฆฐ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ์ ์์กดํ๋ UI๋ฅผ ๊ฐ์ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ ํ ํ์ด์ง์ ๋ฆฌ๋ทฐ๊ฐ ํด๋นํฉ๋๋ค.
+
+๋ผ์ฐํธ ์ธ๊ทธ๋จผํธ๋ฅผ ์คํธ๋ฆฌ๋ฐํ๋ ค๋ฉด `loading.js`์ React ์์คํ์ค๋ฅผ ์ฌ์ฉํ์ฌ UI ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ ๋ก๋ฉ UI ๋ฐ ์คํธ๋ฆฌ๋ฐ ์น์
์ ์ฐธ์กฐํ์ธ์.
+
+[Routing: Loading UI and Streaming](https://nextjs.org/docs/app/building-your-application/routing/loading-ui-and-streaming)