- Next.js์์๋ ์ธ ๊ฐ์ง ๋ฐฉ์์ ๋ ๋๋ง ๋ฐฉ์(SSR, SSG, CSR)์ ๋ชจ๋ ์ฌ์ฉํ ์ ์๋ค.
๐ฅ๏ธ CSR
- React์์๋ CSR ๋ฐฉ์์ ์ฌ์ฉํ๊ณ ์๊ธฐ ๋๋ฌธ์, ์ฒ์์๋ ๋ธ๋ผ์ฐ์ ๊ฐ ๋น HTML ํ์ผ์ ๋ฐ์ ํ๋ฉด์๋ ์๋ฌด๊ฒ๋ ๋ํ๋์ง ์๋ค๊ฐ, ์ฌ์ฉ์์ ๊ธฐ๊ธฐ์์ ๋ ๋๋ง์ด ์๋ฃ๋๋ฉด ํ ๋ฒ์ ํ๋ฉด์ ๋ณด์ฌ์ค๋ค.
// index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Title</title>
</head>
<body>
<div id="root"></div>
</body>
</html>
- ๋จ์ ๊ตฌ์กฐ๋ง ์๋ HTML ๋ฌธ์์ JS ํ์ผ๋ค์ ๋ชจ๋ ํด๋ผ์ด์ธํธ์ ๋ณด๋ธ ๋ค Client-Side์์ JS ๋ก๋๋ค์ ํตํด ์น ํ์ด์ง๋ฅผ ๋ ๋๋งํ๋ค.
- ์น ํ์ด์ง๊ฐ ๋ ๋๋ง ๋ ์ดํ์๋ ํ์ด์ง ๋ด์์ ๋์ํ๋ ๋ชจ๋ ์ด๋ฒคํธ๋ JS๋ฅผ ํตํด ๋ฐ์ํ๋ค.
import React from "react";
import ReactDOM from "react-dom";
import App from "./src/App";
ReactDOM.render(<App />, document.getElementById("root"));
-
๊ธฐ๋ณธ ๋ผ๋๋ง ์๋ index.html
ํ์ผ ๋์ src/index.js
์ JS ์ฝ๋์์ ๋ชจ๋ ํ๋ฉด์ ๋ ๋๋งํ ๋ค HTML์ DOM ์์ ์ค root
๋ผ๋ ID๋ฅผ ๊ฐ์ง element๋ฅผ ์ฐพ์ ํ์์ ๋ด์ฉ์ ์ฃผ์
ํ๋ค.
-
Next.js์์ CSR ์ฌ์ฉํ๊ธฐ
๐ผ๏ธ Pre-Rendering
- SSR๊ณผ SSG๋ Pre-Rendering ์ด๋ผ๊ณ ๋ถ๋ฆฌ๊ธฐ๋ ํ๋ค.
- ์ถ๊ฐ ๋ฐ์ดํฐ์ fetching๊ณผ React ์ปดํฌ๋ํธ์ HTML๋ก์ ๋ณํ์ด ๋ ๋๋ง ๊ฒฐ๊ณผ๋ฌผ์ด ํด๋ผ์ด์ธํธ์๊ฒ ์ ์ก๋๊ธฐ ์ ์ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ด๋ค.
- Next.js์์์ SSR, SSG
- ๊ทธ๋ฆฌ๊ณ Next.js์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ ํ์ด์ง๋ฅผ ๋ฏธ๋ฆฌ ๋ ๋๋งํ๋ค.
- ์ฌ์ฉ์์ ๊ธฐ๊ธฐ์์ JS๊ฐ ๋ชจ๋ ์ผ์ ์ฒ๋ฆฌํ๋ ๋์ ์๋ฒ์์ ๋จผ์ HTML ํ์ผ์ ์์ฑํ๊ธฐ ๋๋ฌธ์, ๋ ๋๋ง ์์
์ด ์งํ๋๋ ๋ํ ์ฌ์ฉ์์๊ฒ ํด๋น ํ์ด์ง์ ํ์ํ HTML ํ๋ฉด์ด ๋ณด์ฌ์ง๋ค.
ํ์ง๋ง ์ฌ๊ธฐ์ ๋ฐ์ํ๋ ๋ฌธ์ !
๐ฆด ํ์ฌ๋ ๋น ๊ป๋ฐ๊ธฐ๋ง ์กด์ฌํฉ๋๋ค!
- ์ด๋ ํด๋ผ์ด์ธํธ๊ฐ ๋ฐ๋ ์น ํ์ด์ง๋ ๋จ์ํ ์น ํ๋ฉด์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํ HTML์ผ ๋ฟ์ด๊ณ , ๋์์ ํ์ํ JS ์์๋ ์กด์ฌํ์ง ์๋๋ค.
- ํน์ JS ๋ชจ๋ ๋ฟ ์๋๋ผ ๋จ์ ํด๋ฆญ๊ณผ ๊ฐ์ ์ด๋ฒคํธ๋ค์ด ๊ฐ ์น ํ์ด์ง์ DOM ์์์ ์ ์ฉ๋์ด ์์ง ์์ ์ํ์ ํ์ด์ง๊ฐ ์ ์ก๋๋ ๊ฒ์ด๋ค.
useEffect
์ฒ๋ผ ๋ง์ดํธ ๋ ํ ์คํ๋๋ ๋์๋ค ๋ฟ๋ง ์๋๋ผ onClick, onChange
์ ๊ฐ์ ๋ฐ์ธ๋ฉ๋ ๋น ์ ธ ์๋ ์ํ์ด๋ค.
๐ง ์ด๋ป๊ฒ ํด๊ฒฐํ ์ ์์๊น์?
- Next.js ์๋ฒ์์๋ Pre-Rendering ๋ ์น ํ์ด์ง๋ฅผ ํด๋ผ์ด์ธํธ์๊ฒ ๋ณด๋ธ ๋ค, ๋ฐ๋ก React๊ฐ ๋ฒ๋ค๋ง ๋ JS ์ฝ๋๋ค์ Chunk ๋จ์๋ก ํด๋ผ์ด์ธํธ์๊ฒ ์ ์กํ๋ค.
- ๊ทธ๋ฆฌ๊ณ ์ด๋ฌํ JS ์ฝ๋๋ค์ด ์ด์ ์ ์ ์ก๋ HTML DOM ์์ ์๋ก ๋ฆฌ๋ ๋๋ง ๋๋ ๊ณผ์ ์์์ ์๊ธฐ ์๋ฆฌ๋ฅผ ์ฐพ์ ๋งค์นญ๋๋ค.
๐ข ๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๋ ์ด๋ฌํ ๊ณผ์ ์ "Hydration"์ด๋ผ ๋ถ๋ฆ
๋๋ค!
๐ฟ Hydration
- Server-Side์์ ๋ ๋๋ง ๋ ์ ์ ํ์ด์ง(HTML)์ ๋ฒ๋ค๋ง ๋ JS ํ์ผ์ ํด๋ผ์ด์ธํธ์๊ฒ ๋ณด๋ด๋ฉด, Client-Side์์ HTML ์ฝ๋์ JS(React) ์ฝ๋๋ฅผ ์๋ก ๋งค์นญ์ํค๋ ๊ณผ์
Hydration ์ ์๋ถ ๊ณต๊ธ์ด๋ผ๋ ์๋ฏธ๋ฅผ ๊ฐ๋๋ค.
- JS ์ฝ๋๋ค์ด DOM ์์ ์์ ๋ฌผ์ ์ฑ์ฐ๋ฏ ํ์๋ก ํ๋ ์์๋ค์ ์ฑ์ด๋คํ์ฌ ๋ถ์ฌ์ง ์ด๋ฆ์ด๋ผ๊ณ ํ๋ค.
๐ฉโ๐ซ ์๋ถ๊ธฐ ์๋ ์ ์ ์น ํ์ด์ง์ ๋ฌผ์ ์ฃผ๋ ๋๋์ด๋ผ๊ณ ์ดํดํฉ์๋ค!
๐ Hydration์ ์งํ ๊ณผ์
- React๋ก ํ์ด์ง๋ฅผ ์ ์ํ๋ค.
- Next.js๋ Gatsby์ ๊ฐ์ ํ๋ ์์ํฌ๋ React์์ HTML ํ์ผ์ ์์ฑํ๊ธฐ ์ํ React Server-Side API์ธ ReactDOMServer์ ์ฌ์ฉํด ์ ์๋ ์ฌ์ดํธ์ ํ๋ก๋์
๋จ๊ณ ํ์ผ์ ์์ฑํ๋ค.
- ๋ง์ฝ ์ด๋ ์น ํ์ด์ง๋ฅผ ๋ณด๊ฒ ๋๋ค๋ฉด, ์๋ฒ๋ก๋ถํฐ ์์ฑ๋ ์ ์ ์ธ HTML ํ์ผ์ ๋ณด๊ฒ ๋ ๊ฒ์ด๋ค.
- ํ์ด์ง ์ฒซ ๋ก๋ฉ ์ดํ JS๊ฐ ๋ก๋ ๋๊ณ ,
ReactDOM.hydrate()
API๋ JS์ ํจ๊ป ์๋ฒ์์ ๋ ๋๋ง๋์๋ HTML ํ์ด์ง์ ์๋ถ์ ๊ณต๊ธํ๋ค.
- Hydration ์ดํ,
React reconciler
API๊ฐ ์๋ฆฌ๋ฅผ ๋์ฒดํ๊ณ , ์ฌ์ดํธ๋ ์ํธ์์ฉ์ด ๊ฐ๋ฅํด์ง๋ค.
- hydration์ด ์ ์ฉ๋๋ฉด ํด๋ฆญ ๋ฑ์ ์ด๋ฒคํธ๋ ๋ชจ๋๋ค์ด ์ ์ฉ๋์ด ์ฌ์ฉ์ ์กฐ์์ด ๊ฐ๋ฅํด์ง๋ค!
- ์ฌ์ฉ์๋ SSR์ ํตํด UI๋ฅผ ๋ฏธ๋ฆฌ ๋ณด๊ณ , Hydration์ ํตํด ํ์ด์ง ์กฐ์์ด ๊ฐ๋ฅํด์ง๋ ๊ฒ์ด๋ค.
๐ง ๋ ๋ฒ์ฉ์ด๋ ๋ ๋๋ง๋๋ฉด ๋นํจ์จ์ ์ด์ง ์๋์?
- Server-Side์์ Pre-Rendering ๋ ๋ฌธ์๋ ๋ชจ๋ JS ์์๋ค์ด ๋ฐฐ์ ๋ ๊ต์ฅํ ๊ฐ๋ฒผ์ด ํ์ผ์ด๋ฏ๋ก ์ฌ์ฉ์์๊ฒ ๋น ๋ฅด๊ฒ ๋ก๋๋๋ ์น ํ์ด์ง๋ฅผ ์ ๊ณตํ ์ ์๋ค.
- ์ด๋ ๊ฐ์ ํ๋ฉด์ ๋ ๋ฒ ๋ ๋๋ง์ด ๋ฐ์ํ๋ค๋ ๋จ์ ์ ์ถฉ๋ถํ ๋ณด์ํ ์ ์๋ ์ฅ์ ์ด๋ค.
- ๋ ๋์๊ฐ, Client-Side์์ JS ํ์ผ์ด ๋ ๋๋ง ๋ ๋, ๋จ์ง ๊ฐ DOM ์์์ JS ์์ฑ์ ๋งค์นญ์ํฌ ๋ฟ ์ค์ ์น ํ์ด์ง๋ฅผ ๋ค์ ๊ทธ๋ฆฌ๋
paint()
ํจ์๊น์ง ํธ์ถํ์ง๋ ์๋๋ค.
๐ง Hydration์ Next.js์์๋ง ๋ฐ์ํ๋์?
๐ฉโ๐ซ ์๋๋๋ค!
- Hydration์ Next.js๋ง์ ํน๋ณํ ๋์์ด ์๋๋ผ ReactDOM ํจ์์ด๋ค.
- React: View๋ฅผ ๋ง๋ค๊ธฐ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- ReactDOM
- UI๋ฅผ ์ค์ ๋ก ๋ธ๋ผ์ฐ์ ์ ๋ ๋๋งํ ๋ ์ฌ์ฉ๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- ์ต์์ app์์ ์ฌ์ฉํ ์ ์๋ DOM ๊ด๋ จ ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ค.
ReactDOM.render()
ReactDOM.render(element, container, [callback]);
ReactDOM.render()
ํจ์๋ ํน์ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋ฒ์งธ ์ธ์๋ก ์ง์ ๋ DOM ์์์ ํ์๋ก ์ฃผ์
ํ์ฌ ๋ ๋๋ง์ ์ฒ๋ฆฌํด์ฃผ๋ ํจ์์ด๋ค.
- ์ ๊ณต๋
container
์ element
๋ฅผ ๋ ๋๋งํ๊ณ , component
์ ๋ํ ์ฐธ์กฐ๋ฅผ ๋ฐํํ๋ค.
- ๋ง์ฝ ์ด์ ์
element
๊ฐ container
์ ๋ ๋๋ง ๋์๋ค๋ฉด, ReactDOM์ ์
๋ฐ์ดํธํ๊ณ , ์ต์ข
React element์ ๋ฐ์์ด ํ์ํ ๋์๋ง DOM์ ๋ณ๊ฒฝํ๋ค.
- ๋ ๋๋ง์ด ์๋ฃ๋๋ฉด ํน์ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๋ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ธ ๋ฒ์งธ ์ธ์๋ก ๋๊ฒจ์ค ์ ์๋ค.
- container node๋ฅผ ์์ ํ์ง ์๊ณ ์์๋ง ์์ ํ๋ค.
- ๊ธฐ์กด ์์์ ๋ฎ์ด์ฐ์ง ์๊ณ ๊ตฌ์ฑ ์์๋ฅผ ์ฝ์
ํ๋ค.
ReactDOM.hydrate()
ReactDOM.hydrate(element, container, [callback]);
- render() ๋ฉ์๋์ ๋์ผํ์ง๋ง
ReactDOMServer
์์ HTML ์ปจํ
์ธ ๋ฅผ ๋ ๋๋งํ container
๋ฅผ hydrateํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ค.
- SSR์ ํตํด ์ด๋ฏธ ๋งํฌ์
์ด ์ฑ์์ ธ ์๋ ๊ฒฝ์ฐ ๋ค์ ๋ ๋๋งํ ํ์๊ฐ ์์ผ๋ฏ๋ก hydrate๋ฅผ ํตํด ๊ธฐ์กด ๋งํฌ์
์ ์ด๋ฒคํธ ๋ฆฌ์ค๋ ๋ฑ๋ง ์ถ๊ฐํ๋ค.
- ํน์ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋ฒ์งธ ์ธ์๋ก ์ง์ ๋ DOM ์์์ ํ์๋ก hydrate ์ฒ๋ฆฌํ๋ค.
- ๋ ๋๋ง์ ํตํด ์๋ก์ด ์น ํ์ด์ง๋ฅผ ๊ตฌ์ฑํ DOM์ ์์ฑํ์ง ์๋๋ค.
- ๋์ , ๊ธฐ์กด DOM tree์์ ํด๋น๋๋ DOM ์ปดํฌ๋ํธ๋ฅผ ์ฐพ์ ์ ํด์ง JS ์์ฑ(์: eventListener)๋ง ๋ถ์ฐฉ์ํจ๋ค.
๋์ ๊ณผ์
- ์๋ฒ์์ ๋ฐ์์จ DOM tree์ ์์ฒด์ ์ผ๋ก ๋ ๋๋งํ tree๋ฅผ ๋น๊ตํ๋ค.
- ๋ tree ์ฌ์ด์ ์ฐจ์ด์ ์ ์ป์ ํ, ์์ฒด์ ์ผ๋ก Client-Side-Renderingํ tree์ ๋น๊ตํ๋ฉฐ ์ด๋ค DOM๊ณผ ๋งค์นญ๋๋์ง ์ดํดํ๋ค.
- ์ดํดํ ๋ด์ฉ์ ๋ฐ๋ผ ํด๋ผ์ด์ธํธ ๋ ๋๋ง ๋์์ ์งํํ๋ค.
๊ทธ๋ฆฌ๊ณ ์ฌ๊ธฐ์ ๋ ๋ฐ์ํ๋ ๋ฌธ์ !
๐ฉ ๊ทธ๋งํด๋ผ!
๐จ SSR๊ณผ Hydration์ ๋ฌธ์ ์
โ ๏ธ ๋ณด์ฌ์ฃผ๊ธฐ ์ ๋ชจ๋ ๊ฒ์ ๋ค ๊ฐ์ ธ์์ผ ํฉ๋๋ค!
- SSR์ ์ปดํฌ๋ํธ๊ฐ ๋ฐ์ดํฐ๊ฐ ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ์ ํ์ฉํ์ง ์๋๋ค.
๐ค ์ข์ ๊ฑฐ ์๋๊ฐ์?
- ์ด๋ ๊ณง ํ์ฌ ์ ๊ณต๋๋ API๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ HTML์ ๋ ๋๋งํ ๋ ์๋ฒ ์ธก์์ ์ปดํฌ๋ํธ์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ์ค๋นํด๋์ด์ผ ํจ์ ์๋ฏธํ๋ค.
- ํด๋ผ์ด์ธํธ์ HTML ํ์ผ์ ๋ณด๋ด๊ธฐ ์ Server-Side์์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๋ชจ์๋์ด์ผ ํ๋ ๊ฒ์ ๋งค์ฐ ๋นํจ์จ์ ์ด๋ค.
- ์๋ฅผ ๋ค์ด, ๋๊ธ์ด ์๋ ๊ธ์ ๋ ๋๋งํ๋ค๊ณ ๊ฐ์ ํด๋ณด์.
- ๋๊ธ์ ์ฒ์๋ถํฐ ๋ณด์ฌ์ง ํ์๊ฐ ์์ผ๋ฏ๋ก, Server-Side HTML ์ถ๋ ฅ๋ฌผ์ ํฌํจํ๋ ค ํ๋ค.
- ํ์ง๋ง DB๋ API์ ์๋ต ์๋๋ฅผ ์กฐ์ ํ ์ ์๋ ์ํฉ์์, ๊ฐ๋ฐ์๋ ๋ ๊ฐ์ง ์ค ํ๋๋ฅผ ์ ํํด์ผ ํ๋ค.
- HTML ์ถ๋ ฅ๋ฌผ์์ ์ ์ธ์ํฌ ๊ฒฝ์ฐ ์ฌ์ฉ์๋ JS ํ์ผ์ด ์์ ํ ๋ถ๋ฌ์์ง๊ธฐ ์ ๊น์ง๋ ๋๊ธ์ ๋ณผ ์ ์๋ค.
- HTML ์ถ๋ ฅ๋ฌผ์ ํฌํจ์ํฌ ๊ฒฝ์ฐ ๋๊ธ์ด ๋ถ๋ฌ์์ง๊ณ ์ ์ฒด tree๊ฐ ๋ ๋๋ง๋ ๋๊น์ง ์ฌ์ฉ์๋ ๋๋จธ์ง HTML ํ์ผ๊น์ง ์ ์ก๋ฐ์ง ๋ชปํ๋ค.
โ ๏ธ Hydration์ ์ํด์๋ ๋ชจ๋ ๊ฒ์ ๋ค ๋ถ๋ฌ์์ผ ํฉ๋๋ค!
- React๋ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ๋ ๊ณผ์ ์์ Server-Side์์ ์์ฑ๋ HTML ํ์ผ์ ์ํํ๋ฉฐ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ๋ถ์ฐฉ์ํจ๋ค.
- ์ด๊ฒ ๋์ํ๊ธฐ ์ํด์๋ ๋ธ๋ผ์ฐ์ ์์ ์ปดํฌ๋ํธ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์ฑํ tree๊ฐ ์๋ฒ์์ ์์ฑํ tree์ ์ผ์นํด์ผ ํ๋ค.
- Hydration์ ๋จ์ผ ์์
๋ง ๊ฐ๋ฅํ๋ฏ๋ก, ๋ฐ๋ก ๋ก๋ํ๋ ค ํ ๊ฒฝ์ฐ React๋ HTML ์ฝ๋์ ์ผ๋ถ๋ถ๋ง์ผ๋ก๋ ๋ฌด์์ ํด์ผ ํ ์ง ์ ์ ์์ด Hydration์์ ํด๋น ์ฝ๋๋ฅผ ์ญ์ ํ๊ฒ ๋๋ค.
- ์์ ์์์์, ํ์ด์ง์๋ ๋๊ธ ๋ถ๋ถ๋ง๊ณ ๋ Nav Bar, Side Bar ๋ฑ์ ์ฌ์ฉ๋ JS ์ฝ๋๋ค์ด ์กด์ฌํ ๊ฒ์ด๋ค.
- ํ์ง๋ง ๋๊ธ์ ๋ํ ์ฝ๋๊ฐ ๋ถ๋ฌ์์ง๊ธฐ ์ ๊น์ง๋ ๋ค๋ฅธ ๋ถ๋ถ์ ๋ํด์๋ Hydration์ ์งํํ ์ ์๋ค.
โ ๏ธ ์ํธ์์ฉ์ ํ๊ธฐ ์ ๋ชจ๋ ํญ๋ชฉ์ ๋ํ Hydration์ด ํ์ํฉ๋๋ค!
- React๋ ํ ๋ฒ์ ์์
์ ํตํด tree์ ๋ํ Hydration์ ์งํํ๋ค.
- ๋ค์ ๋งํด, ์ปดํฌ๋ํธ ํจ์๋ฅผ ํธ์ถํ๋ ๊ณผ์ ์ด ํ ๋ฒ ์์๋๋ฉด React๋ ์ ์ฒด tree์ ๋ํด ์ด ๊ณผ์ ์ ์๋ฃํ๊ธฐ ์ ๊น์ง ๋ฉ์ถ์ง ์๋๋ค.
- ๋ฐ๋ผ์ ์ปดํฌ๋ํธ ์ค ์ด๋ ํ๋๋ผ๋ ์ํธ ์์ฉ์ด ๊ฐ๋ฅํด์ง๊ธฐ ์ํด์๋ ๋ชจ๋ ์ปดํฌ๋ํธ์ ๋ํ Hydration์ด ์๋ฃ๋์ด์ผ ํ๋ค.
- ํ ๋ฒ Hydration์ด ์์๋๋ฉด, ์ ์ฒด tree์ ๋ํด Hydration์ด ์๋ฃ๋๊ธฐ ์ ๊น์ง ์ฌ์ฉ์๋ ๋ค๋ฅธ ๋ชจ๋ ๊ธฐ๋ฅ(Nav Bar, Side Bar, ...)๊ณผ๋ ์ํธ์์ฉํ ์ ์๋ค.
- Nav Bar์ ๊ฒฝ์ฐ ํ์ด์ง ์์ฒด์ ์ด๋์ ํ์ํ ๊ธฐ๋ฅ์ธ๋ฐ Hydration์ด ์งํ ์ค์ด์ด์ ๋ ๋๊ณ ์ถ์ ํ์ด์ง์ ๊ณ์ ๋จ์์์ด์ผ ํ๊ณ , ์ด๋ UX์ ์ข์ง ์๋ค.
๐ง ์ด๋ป๊ฒ ํด๊ฒฐํ ์ ์์๊น์?
- ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ์ด์ ๋ ๋ชจ๋ ๋จ๊ณ๊ฐ ์ฐ๊ฒฐ๋์ด ์งํ๋๊ธฐ ๋๋ฌธ์ด๋ค.
- ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ(์๋ฒ) โก๏ธ HTML๋ก ๋ ๋๋ง(์๋ฒ) โก๏ธ ์ฝ๋ ๋ถ๋ฌ์ค๊ธฐ(ํด๋ผ์ด์ธํธ) โก๏ธ Hydration(ํด๋ผ์ด์ธํธ)
- ๋ชจ๋ ๊ณผ์ ์์ ์ด์ ๋จ๊ณ๊ฐ ๋๋ ๋๊น์ง ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์
์์ ๋ค์ ๋จ๊ณ๋ฅผ ์คํํ ์ ์๋ค.
- ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ์์
์ ๋ถํ ํ์ฌ ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์
์ด ์๋ ๊ฐ๊ฐ์ ๋ถ๋ถ๋ค์ ๋ํ ์์
์ํ์ด ๊ฐ๋ฅํด์ ธ์ผ ํ๋ค.
๐ข React 18์์๋ ์ด๋ ๊ฒ ํด๊ฒฐํ์ต๋๋ค!
๐ค React 18: Streaming HTML && Selective Hydration
- React18์์๋
suspense
๋ฅผ ์ฌ์ฉํด ๋ ๊ฐ์ ์ฃผ์ SSR ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ค.
- Streaming HTML
- ์๋ฒ์์ HTML ํ์ผ์ ์คํธ๋ฆฌ๋ฐ์ ํ์์ผ๋ก ์ ๋ฌํ๋ค.
renderToString
โก๏ธ renderToPipeableStream
- ๊ด๋ จ PR
- Selective Hydration
- ํด๋ผ์ด์ธํธ์์ ์ ํ์ ์ผ๋ก Hydration์ ์งํํ๋ค.
- ์ด๋ฅผ ์ํด Client-Side์์ createRoot๋ก ๋ฐ๊พผ ๋ค ์ ํ๋ฆฌ์ผ์ด์
์ ๋ถ๋ถ๋ถ๋ถ์
Suspense
๋ก ๊ฐ์ธ์ฃผ์ด์ผ ํ๋ค.
- ๊ด๋ จ PR
๐ ๋ณด์ฌ์ฃผ๊ธฐ ์ ์ ์๋ฒ์์ ๋ค ๊ฐ์ ธ์์ผ ํ๋ ๋ฌธ์ ํด๊ฒฐ!
<Layout>
<NavBar />
<Sidebar />
<RightPane>
<Post />
<Suspense fallback={<Spinner />}>
<Comments />
</Suspense>
</RightPane>
</Layout>
- ๋๊ธ ๋ถ๋ถ์
Suspense
๋ก ๊ฐ์ธ๊ณ , React๋ก ํ์ฌ๊ธ ์ค๋น๋๊ธฐ ์ ๊น์ง placeholder์ ํด๋นํ๋
์ปดํฌ๋ํธ๋ฅผ ๋ณด์ฌ์ค ์ ์๊ฒ ํ๋ค.
- ์ด๋ฅผ ํตํด ๋๊ธ ๋ถ๋ถ์ data fetching์ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ๋๋จธ์ง ํ์ด์ง์ ๋ํ HTML์ ์คํธ๋ฆฌ๋ฐํ ์ ์๋ค.
- ์ต์ด์ HTML์์๋ ๋๊ธ ๊ด๋ จ ์ปดํฌ๋ํธ์ ๋ํ ์ฝ๋๊ฐ ์ฌ๋ผ์ง๋ค.
<div hidden id="comments">
<!-- Comments -->
<p>First comment</p>
<p>Second comment</p>
</div>
<script>
document
.getElementById("sections-spinner")
.replaceChildren(document.getElementById("comments"));
</script>
- ์๋ฒ ์ธก์์ ๋๊ธ์ ํด๋น๋๋ ๋ฐ์ดํฐ๊ฐ ์ค๋น๋๋ฉด, React์์๋ ๋์ผํ ์คํธ๋ฆผ์ ์ถ๊ฐ๋๋ HTML๊ณผ ์ฌ๋ฐ๋ฅธ ์ฅ์์ HTML์ ์์น์ํค๊ธฐ ์ํ ์ธ๋ผ์ธ script ํ๊ทธ๋ฅผ ์ ์กํ๋ค.
- ํด๋ผ์ด์ธํธ์์ React ์์ฒด๊ฐ ๋ถ๋ฌ์์ง๊ธฐ๋ ์ ์ ๋ฆ๊ฒ ๋์ฐฉํ ๋๊ธ ๋ถ๋ถ์ HTML์ด ์ฝ์
๋๋ค.
- ์ด๋ฅผ ํตํด ํ๋ฉด ์ผ๋ถ๋ถ์ ๋ํ SSR์ ํฌ๊ธฐํ์ง ์๊ณ ๋ ํ๋ฉด์ ์ผ๋ถ๋ถ๋ง ์ ํํ์ฌ HTML ์คํธ๋ฆฌ๋ฐ ์์ ๋์ค์ ๋ค์ด์ค๊ฒ ํ ์ ์๋ค.
- ๋ํ ์ด ๋๋ถ์ tree ์์์ ๋ ๋จผ ๊ณณ์ ์์นํ๋ ์ปดํฌ๋ํธ์ ๋ ๋๋ง์ด ์ด๋ฏธ ๋ฐ์ดํฐ๊ฐ ์ ์ก๋ ๋ค์์๋ ์ด๋ฃจ์ด์ง ์ ์๋ค.
- ๋ฐ๋ผ์ ์ ํต์ ์ธ HTML ์คํธ๋ฆฌ๋ฐ ๋ฐฉ์๊ณผ ๋ฌ๋ฆฌ ์์์ ์๋๋ก ๋ด๋ ค๊ฐ๋ ์์๋ฅผ ์งํฌ ํ์๋ ์๋ค.
๐ Hydration์ ์ํด์๋ ๋ชจ๋ ๋ถ๋ฌ์์ผ ํ๋ ๋ฌธ์ ํด๊ฒฐ!
import { lazy } from "react";
const Comments = lazy(() => import("./Comments.js"));
<Suspense fallback={<Spinner />}>
<Comments />
</Suspense>;
- ๋๊ธ์ ์ํ ์ฝ๋๊ฐ ๋ก๋ฉ๋๊ธฐ ์ ํด๋ผ์ด์ธํธ ์ธก์์ ์ ํ๋ฆฌ์ผ์ด์
์ Hydration ํ ์ ์๋ ๋ฌธ์ ๋ Code Splitting์ ํตํด ํด๊ฒฐํ์๋ค.
- ํน์ ์ฝ๋ ๋ถ๋ถ์ด ๋๊ธฐ์ ์ผ๋ก ๋ก๋๋ ํ์๊ฐ ์์์ ๋ช
์ํด์ค์ผ๋ก์จ ํฐ ๋ฒ๋ค ์ฌ์ด์ฆ๋ฅผ ํผํ ์ ์๋ค.
lazy
๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉ์ธ ๋ฒ๋ค์์ ๋ถ๋ฆฌ์ํฌ ์ ์๋ค.
- ๋ฒ๋ค๋ฌ๋ ์ด๋ฅผ ๋ณ๋์ script ํ๊ทธ๋ก ๋ถ๋ฆฌํด์ค๋ค.
- ์ด๋ฅผ ํตํด ์์ ์์์์ ๋๊ธ์ ๋ํ UI๊ฐ ์์ง ๋ณด์ด์ง ์๋๋ผ๋ ๋ค๋ฅธ ๋ถ๋ถ์ ์ด๋ฒคํธ๋ฅผ ๋จผ์ ์ฌ์ฉํ ์ ์๊ฒ ๋๋ค.
๐ ์ํธ์์ฉ์ ํ๊ธฐ ์ ๋ชจ๋ Hydration์ ํด์ผ ํ๋ ๋ฌธ์ ํด๊ฒฐ!
<Layout>
<NavBar />
<Suspense fallback={<Spinner />}>
<Sidebar />
</Suspense>
<RightPane>
<Post />
<Suspense fallback={<Spinner />}>
<Comments />
</Suspense>
</RightPane>
</Layout>
- ์์ ์ฝ๋์์ NavBar์ Post๋ง Hydration์ด ์๋ฃ ๋๊ณ , SideBar์ Comments ์ปดํฌ๋ํธ๋ HTML ์คํธ๋ฆฌ๋ฐ๋ง ์๋ฃ๋ ์ํ๋ผ๊ณ ํ์.
- SideBar์ Comments ์ฝ๋๋ฅผ ๊ฐ์ง๊ณ ์๋ ๋ฒ๋ค์ด ๋ถ๋ฌ์์ง๊ณ , React๋ tree ์์์ ๋จผ์ ๋ฐ๊ฒฌ๋๋ ์ปดํฌ๋ํธ์ธ SideBar์ ๋ํ Hydration์ ๋จผ์ ์งํํ๊ฒ ๋๋ค.
- ๋ง์ฝ ์ด๋ ์ฌ์ฉ์๊ฐ ๋๊ธ ๋ถ๋ถ์ ํด๋ฆญํ ๊ฒฝ์ฐ, React๋ ํด๋น ํด๋ฆญ์ ๊ธฐ๋กํด๋์๋ค๊ฐ Comments ์ปดํฌ๋ํธ์ ๋ํ Hydration์ ์ฐ์ ์์๋ฅผ ๋ถ์ฌํ๋ค.
- React๋ ์ด์ ์๋ ์ํํ๋ ค ํ๋ SideBar์ ๋ํ Hydration ๋์ Comments ์ปดํฌ๋ํธ์ ๋ํ Hydration์ ๋จผ์ ์งํํ๋ค.
- ์ด๋ฅผ ํตํด React๋ ์ต๋ํ ๋น ๋ฅด๊ฒ ๋ชจ๋ ๊ฒ์ ๋ํ Hydration์ ์๋ฃํ๋ฉด์๋ ์ฌ์ฉ์์ ๋์์ ๊ธฐ๋ฐํด ํ๋ฉด ์์์ ๊ฐ์ฅ ๊ธํ ๋ถ๋ถ์ ์ฐ์ ์์๋ฅผ ๋ถ์ฌํ๋ค.
์ฐ๋ฆฌ๋ ์ด์ ์๋ฒ ์์์ HTML์ ๋ณด๋ด๊ธฐ ์ ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ๋ถ๋ฌ์์ง๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์์ ์ ์๋ค.
๋ํ Hydration์ ์์ํ๊ธฐ ์ ๋ชจ๋ JS ์ฝ๋๊ฐ ๋ถ๋ฌ์์ง๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์์๋ ๋๊ณ ,
ํ์ด์ง ์์ ์ํธ ์์ฉ์ ์ํด ๋ชจ๋ ์ปดํฌ๋ํธ์ ๋ํ Hydration์ด ์๋ฃ๋๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์์๋ ๋๋ค!
๐ References
์ฐธ๊ณ ์๋ฃ ๋ชจ์
Hydration์ ์ ์ค๋ช ํ ๊ธ ๊ฐ์์! ๋ง์ ๋์ ๋์์ต๋๋ค.