[Next.js] Server Component์ Client Component์ ๋ํด ์์๋ณด์
Next.js๋ Server Component์ Client Component๋ฅผ ๊ฐ๋ฐ์๊ฐ ์ ํํ๊ณ ์ ์ํ์ฌ ์ฌ์ฉํ ์ ์๋ค.
(๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ ์ปดํฌ๋ํธ๋ Server Component์ด๊ณ , "use client"๋ฅผ ํตํด Client Component๋ก ์ ์ํ ์ ์๋ค.)
React 18 ์ด์ ์ ๋ ๋๋ง
React๋ Client Side Rendering์ ํ๊ธฐ ๋๋ฌธ์, ๋ชจ๋ ์ปดํฌ๋ํธ์ ๋ ๋๋ง์ ํด๋ผ์ด์ธํธ(๋ธ๋ผ์ฐ์ )์์ ์ด๋ฃจ์ด์ก๋ค.
์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ(๋ธ๋ผ์ฐ์ )์ React์์ ์์ฑํ JavaScript ํ์ผ์ ๋๊ฒจ์ฃผ๋ฉด, ๋ธ๋ผ์ฐ์ ๋ ํด๋น ํ์ผ์ ํด์ํ์ฌ ์ต์ํ์ ์ด๊ธฐ ๋ฆฌ์์ค์์ ์ํธ์์ฉ์ ํตํด JavaScript๋ฅผ ์คํํ๋ฉด์ ๋์ ์ผ๋ก ํ๋ฉด์ ์์ฑํด๊ฐ๋ค.
ํ์ง๋ง ์ด๊ธฐ ๋ก๋ฉ ์๋๊ฐ ๋๋ฆฌ๊ณ , ๊ฒ์ ์์ง ์ต์ ํ๊ฐ ๋์ง์๋ ๋จ์ ์ด ์์ด Server Side Rendering์ ํ์์ฑ์ด ๋๋๋์๋ค.
๊ทธ๋ ๊ฒ Next.js๊ฐ ๋ฑ์ฅํ๋ฉด์ SSR์ ์ฝ๊ฒ ๊ตฌํํ ์ ์๊ฒ ๋์๋ค.
Server Side Rendering์ ์น ํ์ด์ง์ ์ฝํ ์ธ ๋ฅผ ๋จผ์ ์๋ฒ์์ ๋ ๋๋งํ์ฌ ์์ฑ๋ HTML์ ํด๋ผ์ด์ธํธ(๋ธ๋ผ์ฐ์ )์ ์ ๋ฌํ๋ ๋ฐฉ์์ผ๋ก, ํ์ React๊ฐ ์คํ๋์ด JavaScript ์ฝ๋๋ค์ด ๋ถ๋ hydration ๊ณผ์ ์ ์ํํ๋ค.
ํ์ง๋ง ์ด ๋์๋ CSR์ด ๊ธฐ๋ณธ์ด์ด์ SSR์ ์ ์ฉํ๋ ค๋ฉด, getServersideProps ๋ฑ์ ์ถ๊ฐ์ ์ธ ์ค์ ์ด ํ์ํ๋ค.
React 18 ์ดํ์ ๋ ๋๋ง
React 18๋ถํฐ Server Component๊ฐ ๋ฑ์ฅํ์๊ณ , (์ด์ ์ ๋ชจ๋ ์ปดํฌ๋ํธ๋ Client Component) Next.js 13์์ ๋ ๊ฐ์ง ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ ์ ์๊ฒ ๋์๋ค.
- Server Component
- ์๋ฒ์์ HTML์ ๋ ๋๋งํ์ฌ ํด๋ผ์ด์ธํธ(๋ธ๋ผ์ฐ์ )์ ์ ์ก๋๋ค. (ํด๋ผ์ด์ธํธ์์ ์คํ X)
- hydration ๊ณผ์ ์ด ์๋ค. ์์ํ๊ฒ HTML์ ์์ฑํ๋ ์ญํ ์ ํ๋ค.
- Client Component
- ํด๋ผ์ด์ธํธ ์ธก์์ JavaScript๋ก ์คํ๋์ด ๋ ๋๋ง๋๋ค.
- hydration์ด ๋ธ๋ผ์ฐ์ ์์ ์ด๋ฃจ์ด์ง๋ค.
- ์ฌ์ฉ์์ ์ํธ์์ฉํ๋ ์ธํฐ๋ํฐ๋ธํ UI๋ค์ ์ ์ํ ๋ ์ฌ์ฉํ๋ค.
RSC์ RCC ์ ์ ๋ฐ ์ฌ์ฉ ๋ฐฉ๋ฒ
Server Component
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>
);
}
์ถ์ฒ: https://curryyou.tistory.com/539 [์นด๋ ์ :ํฐ์คํ ๋ฆฌ]
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>
);
}
์ถ์ฒ: https://curryyou.tistory.com/539 [์นด๋ ์ :ํฐ์คํ ๋ฆฌ]
์ธ์ ์ฌ์ฉํด์ผ ํ ๊น?
์ด์ ๊ฐ์ด ์๋ฒ ์ปดํฌ๋ํธ๊ฐ ๋ ๋ซ๋ค, ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๊ฐ ๋ ๋ซ๋ค์ ๋ฌธ์ ๊ฐ ์๋
๋์ ๊ฐ๋ฐ์๊ฐ ์ ํผํฉํ์ฌ ์ฌ์ฉํ๊ณ ํจ์จ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ฉด ๋๋ค.
์๋ฒ ์ปดํฌ๋ํธ๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ๊ฐ์ ๋ฌด๊ฑฐ์ด ์์ ์ ๋ด๋นํ๊ณ , ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๋ ์ฌ์ฉ์ ์ธํฐ๋์ ๊ณผ ๋์ ์ธ ๊ธฐ๋ฅ์ ๋ด๋นํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฐ๋ผ์ ์ด๋ฌํ ๋ถ์ ์ ํตํด ํด๋ผ์ด์ธํธ์ ๋ถ๋ด์ ์ค์ด๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ๊ณผ ์ฌ์ฉ์ ๊ฒฝํ์ ๋์์ ํฅ์์ํฌ ์ ์๋ค.
์ฐธ๊ณ
https://f-lab.kr/insight/understanding-nextjs-and-server-components
Next.js์ ์๋ฒ ์ปดํฌ๋ํธ์ ์ดํด์ ํ์ฉ
Next.js์ ์๋ฒ ์ปดํฌ๋ํธ์ ๊ฐ๋ , ์ฅ์ ๋ฐ ํ์ฉ ๋ฐฉ๋ฒ์ ๋ํด ์ค๋ช ํฉ๋๋ค.
f-lab.kr
https://velog.io/@tnrud4685/Next.js-13%EB%B2%84%EC%A0%84
[Next.js 13] Server Component ๋? (feat.use client)
velog.io
https://curryyou.tistory.com/539
[Next.js 13] Server Component vs. Client Component ๊ธฐ๋ณธ ๋ฐ ์ฌ์ฉ ๋ฐฉ๋ฒ
# Server Component vs. Client Component ๊ธฐ๋ณธ Next.js 13์์๋ Server Component์ Client Component๋ฅผ ๊ฐ๋ฐ์๊ฐ ์ ํ์ ์ผ๋ก ์ ์ํ์ฌ ์ฌ์ฉํ ์ ์๋ค. ์ด์ ๋ํ ๊ธฐ๋ณธ์ ์ธ ์ดํด๋ฅผ ์ํด ๋ ๋๋ง๋ถํฐ ๊ฐ๋ณ๊ฒ ์ ๋ฆฌํด๋ณธ๋ค
curryyou.tistory.com