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)