์๋ฒ์์ HTML์ ๋ ๋๋งํ์ฌ ๋ธ๋ผ์ฐ์ ์ ์๋ตํ๋ค.
Hydration ๊ณผ์ ์ ์๋ค.
์๋ฒ์์ ๊ธฐ๋ณธ์ ์ธ HTML์ ๋ ๋๋ฉํ์ฌ ๋ธ๋ผ์ฐ์ ์ ์๋ตํ๋ค.
Hydration(JS Interactivity)๋ง ๋ธ๋ผ์ฐ์ ์์ ์ด๋ฃจ์ด์ง๋ค.
Event Listener(ํด๋ฆญ ์ด๋ฒคํธ ๋ฑ), Browser API(web storage ๋ฑ), React Hooks(useState, useEffect ๋ฑ) ๋ฑ์ ๋ธ๋ผ์ฐ์ ์์๋ง ์๋ํ๋ ํด๋ผ์ด์ธํธ ๋จ JS์ฝ๋์ด๋ฉฐ, ๋ธ๋ผ์ฐ์ ์์ Hydration ๊ณผ์ ์ ๊ฑฐ์น๋ Client Component์์๋ง ์ ์๋ ์ ์๋ค.
๋ฐ๋ผ์, Server Component์์๋ ์ฌ์ฉ์ด ๋ถ๊ฐํ๋ค.
๋ฐ์ดํฐ ํ์นญ์ ํ๊ธฐ ์ํด์
-> ๋ฐ์ดํฐ๋ฅผ ๋ณด์ฌ์ฃผ๋ ํด๋ผ์ด์ธํธ ์ฌ์ด๋์ ๋ฆฌ์กํธ ์ฑ๊ณผ ์๋ฒ ์ฌ์ด๋ REST API ์ฑ์ด ํ์
๋ฆฌ์กํธ์์ ๋ฐ์ดํฐ๋ฅผ ํ์นํ๊ธฐ ์ํด์

์๋ ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๋ ๋๋ง CSR ์ ํจํด์ด๋ค.
-> ์๋ฐ์คํฌ๋ฆฝํธ ๋ค์ด๋ก๋๋๊ณ ํ์ฑ ๋๋ฉด
-> ๋ฆฌ์กํธ ์ฑ์ด ์คํ๋๊ณ
-> ๋ ๋
ธ๋๋ฅผ ์์ฑํด UI๋ฅผ ์ฑ์ด๋ค.
์ด๊ธฐ์๋, ์ ์ ๋ ์ด๋ ํ ์ค์ ๋ฐ์ดํฐ๋ ๊ฐ์ง ๋ชปํ๊ณ ,
์ ์ ๋ ๋คํธ์ํฌ ์์ฒญ์ด ์๋ฃ๋ ๋๊น์ง ๋ก๋ฉ ์ํ๋ฅผ ๋ณด๊ฒ ๋๊ณ , ๋ฆฌ๋ ๋๋ฅผ ํตํด ๋ก๋ฉ UI(์คํผ๋, ์ค์ผ๋ ํค ๋ฑ)๊ฐ ์ค์ ์ปจํ ์ธ ๋ก ๋์ฒด๋๋ค.

์๋ SSR์ ์ฌ์ฉํ ํ์น ํจํด
ํด๋ผ์ด์ธํธ ์ฌ์ด๋์ ๋ค๋ฅธ ์ ์
์ด๊ธฐ์ ์๋ฒ์์ ๋ ๋ ํ๊ฒ ๋๋ฉด, ์ข ๋ ๋น ๋ฅด๊ฒ ์์ ๋ณผ ์ ์๋ค.
์ ์ ๋ ํ
๋น ํ์ด์ง๋ณด๋ค ์ํฉ์ด ์งํ๋๋ค๊ณ ๋๋ผ๊ธฐ์ -> ๋ก๋ฉ ๊ฒฝํ์ด ์ข ๋ ๋น ๋ฅด๊ฒ ๋๊ปด์ง ์ ์๋ค.
ํ์ง๋ง ์์ ๊ฐ์ ํ๋ฆ์ ๋ญ๊ฐ ์ด์ํจ
ํด๋ผ์ด์ธํธ์ ์๋ฒ๋ฅผ ์๋ณตํ์ง ์๊ณ ,
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ๋ฅผ ์ด๊ธฐ์ ์๋ฒ์์ ์์ฒญํ๋ค๋ฉด
์ปจํ
์ธ ๊ฐ ์จ์ ํ ์ฑ์์ง UI๋ฅผ ์ฆ์ ์ ์ ์๊ฒ ๋ณด๋ผ ์ ์์ ๊ฒ์ธ๋ฐ...
์ด๋, ๋ฆฌ์กํธ ์๋ฒ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
๋ฆฌ์กํธ ์๋ฒ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋ฉด
๋ฐ์ดํฐ ํ์น ๋ก์ง ์์ฒด๋ฅผ ์๋ฒ๋ก ์ฎ๊ธธ ์ ์๊ธฐ์, ํด๋ผ์ด์ธํธ์์๋ ๋ฐ์ดํฐ์ ํจ๊ป ๊ตฌ์ฑ๋ ์ปดํฌ๋ํธ๋ฅผ ๋ฐ๋๋ค.

๋ฆฌ์กํธ ์๋ฒ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋ฉด ์์ ๊ฐ์ด ํด๋ผ์ด์ธํธ์ ์๋ฒ ์๋ณต ์์ด๋ ๋ฐ์ดํฐ์ ํ๋ฆ์ ๋ง๋ค์ด๋
=> ์ ์ ๋ ๋ก๋ฉ UI ์์ด ๋ฐ๋ก ์ปจํ
์ธ ๋ฅผ ํ์ด์ง์์ ๋ณผ ์ ์๊ฒ ๋๋น
Next.js์์๋ /app ๋๋ ํฐ๋ฆฌ ๋ด๋ถ์ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค๋ฉด, ๋ํดํธ๋ก Server Component๊ฐ ๋๋ค.
๋ฐ๋ผ์ Server Component๋ก ๋ง๋ค๊ธฐ ์ํด ๋ณ๋์ ์์
์ ํ ํ์๊ฐ ์๋ค.
export default function Home(){
return (
<main>
<h1>Home: Server Component</h1>
</main>
);
}
๋ชจ๋ ์ปดํฌ๋ํธ๋ Server Component๊ฐ ๋ํดํธ.
์๋ฒ ๋จ์์ ๋ ๋๋ง ๋๋ฏ๋ก, ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์ ์ฝ๋๋ ์ฌ์ฉ ๋ถ๊ฐ:
Server Component๋ Client Compoent ํฌํจ ๊ฐ๋ฅ(๋ฐ๋๋ ๋ถ๊ฐ)
Server Component๋ async ํจ์๋ก ์ ์ ๊ฐ๋ฅ
๋ฐ๋ผ์ ์ปดํฌ๋ํธ ๋ด๋ถ์์ ๋ฐ๋ก await fetch() ํธ์ถ์ด ๊ฐ๋ฅํ๋ค.
export default async function Home() {
const res = await fetch("https://jsonplaceholder.typicode.com/todos/1");
const data = await res.json();
return (
<main>
<h1>Home</h1>
<p>{data.title}</p>
</main>
);
}
Server Component๋ ์๋ฒ์์ ๋ ๋๋ง ๋๋ฏ๋ก, ์๋์ ๊ฐ์ ์ฅ์ ์ด ์๋ค.
Client Component๋ฅผ ์ ์ํ๊ธฐ ์ํด์๋ ์ปดํฌ๋ํธ ํ์ผ ์ต์๋จ์ "use client"๋ฅผ ์ถ๊ฐํด ์ฃผ๋ฉด ๋๋ค.
"use client";
import { useState } from "react";
export default function Counter() {
const [count, setCount] = useState(0);
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount((prev) => prev + 1)}>Click me</button>
</div>
);
}
์ปดํฌ๋ํธ ํ์ผ ์ต์๋จ์ "use client"๋ฅผ ๋ถ์ฌ์ฃผ๋ฉด Client Component๊ฐ ๋๋ค.
ํด๋ผ์ด์ธํธ(๋ธ๋ผ์ฐ์ ) ๋จ์์ ๋ ๋๋ง ๋๋ฏ๋ก, ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์ ์ฝ๋ ์ฌ์ฉ ๊ฐ๋ฅ:
Client Component์ ๋ด๋ถ์ ํฌํจ๋๋ ์์ ์ปดํฌ๋ํธ๋ค๋ ๋ชจ๋ ์๋์ผ๋ก Client Component๊ฐ ๋๋ค.
Client Componemt๋ Server Component๋ฅผ ํฌํจํ ์ ์๋ค. (๋ฐ๋๋ง ๊ฐ๋ฅ)
๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ ์ปดํฌ๋ํธ๋ฅผ Server Component๋ก ๋ง๋ค๊ณ ,
ํด๋ผ์ด์ธํธ ๋จ์ ์ ์ ์ธํฐ๋์
์ฒ๋ฆฌ๋ React hooks ์ฌ์ฉ์ด ํ์ํ ๋๋ง Client Component๋ฅผ ์ถ๊ฐํด์ฃผ๋ฉด ์ข๋ค.
1. Client Component ์ฌ์ฉ์ด ํ์ํ ๋:
2. Server Component ์ฌ์ฉ์ด ํ์ํ ๋:
๊ณต์ ๋ฌธ์์์๋ ํนํ ์๋์ ๊ฒฝ์ฐ Server Component๋ฅผ ์ฌ์ฉํ ๊ฒ์ ๊ถ๊ณ ํ๋ค.
Fetch data
Access Backend Resources(directly)
Keep sensitive information on the server (access tokens, API keys, etc)
Keepย largeย dependenciesย onย theย serverย /ย Reduceย client-sideย JavaScript

๋ฐ๋ผ์, Navbar, Sidebar, Main์ปดํฌ๋ํธ๋ Server Component๋ก ์ ์ํ๊ณ ,
Search, Button ์ปดํฌ๋ํธ๋ Client Component๋ก ์ ์ํ์ฌ Main ์์ ํฌํจ์ํค๋ฉด ๋๋ค.
Server Component๋ Client Component๋ฅผ ํฌํจํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.

์ถ์ฒ: https://curryyou.tistory.com/539 [์นด๋ ์ :ํฐ์คํ ๋ฆฌ]https://www.yujiseok.blog/post/react-server-components