[๐ค] Next.js 13+ Server Components์ Client Components, ์๋ฒฝ ์ดํดํ๊ธฐ
Next.js App Router์ ํต์ฌ์ธ Server Components์ Client Components์ ๊ฐ๋ , ์ฐจ์ด์ , ์ฌ์ฉ ์๋๋ฆฌ์ค, ๊ทธ๋ฆฌ๊ณ ์ค์ง์ ์ธ ์ฑ๋ฅ ์ด์ ๊ณผ ์ฃผ์์ฌํญ์ ์์ธํ ์์๋ด์.
์ ๋ณด
Next.js App Router์ Server Components์ Client Components๋ ์น ๊ฐ๋ฐ ํจ๋ฌ๋ค์์ ๋ณํ์ํค๋ ์ค์ํ ๊ฐ๋ ์ด์์. ์ด ๊ธ์์๋ ๋ ์ปดํฌ๋ํธ์ ์ฐจ์ด์ ๊ณผ ์ฌ์ฉ๋ฒ, ๊ทธ๋ฆฌ๊ณ ์ค๋ฌด์์ ํ์ฉํ ์ ์๋ ์ต์ ํ ์ ๋ต์ ์ฌ๋ ์๊ฒ ๋ค๋ค๋ณผ๊ฒ์.
๐ค ๋ฌธ์ /๋ฐฐ๊ฒฝ
0๏ธโฃ ์ ์ด ์ฃผ์ ๋ฅผ ๋ค๋ฃจ๋๊ฐ
Next.js 13 ๋ฒ์ ๋ถํฐ ๋์ ๋ App Router๋ ๋ฆฌ์กํธ ์ํ๊ณ์ ํฐ ๋ณํ๋ฅผ ๊ฐ์ ธ์์ด์. ํนํ Server Components์ Client Components๋ผ๋ ์๋ก์ด ๊ฐ๋ ์ ๊ฐ๋ฐ์๋ค์๊ฒ ๋ง์ ํผ๋์ ์ฃผ๊ธฐ๋ ํ์ด์. ์ด ๋ ๊ฐ์ง ์ปดํฌ๋ํธ ํ์ ์ ์ ํํ ์ดํดํ๋ ๊ฒ์ App Router ๊ธฐ๋ฐ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ํจ์จ์ ์ผ๋ก ๊ฐ๋ฐํ๊ณ ์ต์ ํํ๋ ๋ฐ ํ์์ ์ธ ๋ถ๋ถ์ด์์. ์๋ชป๋ ์ฌ์ฉ์ ์คํ๋ ค ์ฑ๋ฅ ์ ํ๋ ๊ฐ๋ฐ ๋ณต์ก์ฑ์ ์ผ๊ธฐํ ์ ์๊ธฐ ๋๋ฌธ์, ์ด๋ฒ ๊ธฐํ์ ์ ๋๋ก ํ์ ํ๋ ๊ฒ์ด ์ค์ํ๋ค๊ณ ์๊ฐํ์ด์.
1๏ธโฃ ๊ธฐ์กด ๋ฐฉ์์ ํ๊ณ
๊ธฐ์กด React ๊ฐ๋ฐ ๋ฐฉ์์ด๋ Next.js Pages Router์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ ์ปดํฌ๋ํธ๊ฐ ํด๋ผ์ด์ธํธ์์ Hydration ๊ณผ์ ์ ๊ฑฐ์ณ ์ํธ์์ฉํ๊ฒ ๋ผ์. ์ด๋ ๋ค์๊ณผ ๊ฐ์ ํ๊ณ๋ฅผ ๊ฐ์ก์ด์.
- ์ด๊ธฐ ๋ก๋ฉ ์ฑ๋ฅ ์ ํ: ๋ชจ๋ JavaScript ์ฝ๋๊ฐ ํด๋ผ์ด์ธํธ๋ก ์ ์ก๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋ฒ๋ค ์ฌ์ด์ฆ๊ฐ ์ปค์ง๊ณ , ์ด๋ TTI(Time To Interactive) ์ง์ฐ์ผ๋ก ์ด์ด์ง ์ ์์์ด์.
- ์๋ฒ ๋ฆฌ์์ค ํ์ฉ์ ์ด๋ ค์: ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ๊ทผ์ด๋ ํ๊ฒฝ ๋ณ์ ์ฌ์ฉ ๋ฑ ์๋ฒ ์ ์ฉ ๋ก์ง์ ์ปดํฌ๋ํธ ๋ด๋ถ์์ ์ง์ ์ํํ๊ธฐ ์ด๋ ค์ ๊ณ , API ์๋ํฌ์ธํธ๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐฉ์๋ง ๊ฐ๋ฅํ์ด์.
- Hydration ์ค๋ฒํค๋: ์ฌ์ฉ์ ์ํธ์์ฉ์ด ์๋ ์ ์ ์ธ UI์์๋ ๋ถ๊ตฌํ๊ณ , Hydration์ ์ํ JavaScript ์ฝ๋๊ฐ ๋ฐ๋์ ํ์ํด์ ๋ถํ์ํ ๋น์ฉ์ด ๋ฐ์ํ์ด์.
์ด๋ฌํ ํ๊ณ์ ๋ค์ ํนํ ์ด๊ธฐ ๋ก๋ฉ ์ฑ๋ฅ๊ณผ SEO๊ฐ ์ค์ํ ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ํฐ ๊ฑธ๋ฆผ๋์ด ๋๊ณค ํ์ด์.
โ๏ธ ํด๊ฒฐ ๋ฐฉ๋ฒ
0๏ธโฃ ํต์ฌ ์์ด๋์ด: Server Components์ Client Components์ ํ์
React ํ์ ์ด๋ฌํ ๋ฌธ์ ์ ๋ค์ ํด๊ฒฐํ๊ธฐ ์ํด React Server Components(RSC) RFC๋ฅผ ๋ฐํํ๊ณ , Next.js๋ App Router๋ฅผ ํตํด ์ด๋ฅผ ์ ๊ทน์ ์ผ๋ก ๋์ ํ์ด์. ํต์ฌ ์์ด๋์ด๋ ๊ฐ๋จํด์.
- Server Components: ์๋ฒ์์ ๋ ๋๋ง๋๊ณ , ์ต์ข HTML ํํ๋ก ํด๋ผ์ด์ธํธ์ ์ ์ก๋ผ์. JavaScript ๋ฒ๋ค์ ํฌํจ๋์ง ์์ ํด๋ผ์ด์ธํธ ๋ฒ๋ค ํฌ๊ธฐ๋ฅผ ์ค์ด๊ณ ์ด๊ธฐ ๋ก๋ฉ ์ฑ๋ฅ์ ํฅ์์์ผ์. ๋ฐ์ดํฐ ํ์นญ, ์๋ฒ ์ ์ฉ ๋ก์ง, SEO์ ์ ๋ฆฌํ ์ ์ ์ฝํ ์ธ ํ์์ ์ ํฉํด์.
- Client Components: ๊ธฐ์กด React ์ปดํฌ๋ํธ์ ์ ์ฌํ๊ฒ ํด๋ผ์ด์ธํธ์์ ๋ ๋๋ง๋๊ณ Hydration ๊ณผ์ ์ ๊ฑฐ์ณ ์ฌ์ฉ์ ์ํธ์์ฉ์ ์ฒ๋ฆฌํด์.
useState,useEffect์ ๊ฐ์ ํ ์ด๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ํ์ํ ๋์ ์ธ UI์ ์ฌ์ฉ๋ผ์.
์ ๋ณด๊ธฐ๋ณธ์ ์ผ๋ก App Router์ ๋ชจ๋ ์ปดํฌ๋ํธ๋ Server Components๋ก ๊ฐ์ฃผ๋ผ์. ๋ช ์์ ์ผ๋ก
"use client"์ง์์๋ฅผ ์ ์ธํด์ผ๋ง Client Components๋ก ๋์ํ๊ฒ ๋ฉ๋๋ค.
1๏ธโฃ Server Components์ ํน์ง๊ณผ ์ฌ์ฉ
Server Components๋ ๋ค์๊ณผ ๊ฐ์ ํน์ง์ ๊ฐ์ ธ์.
- ์๋ฒ์์ ์คํ: ์ปดํฌ๋ํธ์ ์ฝ๋๊ฐ ํด๋ผ์ด์ธํธ JavaScript ๋ฒ๋ค์ ํฌํจ๋์ง ์์์.
- ๋ฐ์ดํฐ ํ์นญ์ ์ต์ ํ:
async/await๋ฅผ ์ง์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์ธ๋ถ API์์ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ฐ์ ธ์ฌ ์ ์์ด์. - ํ์ผ ์์คํ
์ ๊ทผ: ์๋ฒ ์ ์ฉ API(์:
fs๋ชจ๋)๋ ํ๊ฒฝ ๋ณ์(process.env)์ ์ง์ ์ ๊ทผํ ์ ์์ด์. - ๋ณด์ ๊ฐํ: ๋ฏผ๊ฐํ ์ ๋ณด(API ํค ๋ฑ)๊ฐ ํด๋ผ์ด์ธํธ์ ๋ ธ์ถ๋ ์ํ์ด ์ค์ด๋ค์ด์.
- ์ ๋ก ๋ฒ๋ค ์ฌ์ด์ฆ: ํด๋ผ์ด์ธํธ๋ก ์ ์ก๋๋ JavaScript๊ฐ ์์ผ๋ฏ๋ก ๋ฒ๋ค ์ฌ์ด์ฆ๊ฐ ๊ฐ์ํ๊ณ ๋ก๋ฉ ์๋๊ฐ ๋นจ๋ผ์ ธ์.
์ธ์ Server Components๋ฅผ ์ฌ์ฉํ๋์?
- ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ํ์ํ๋ ์ปดํฌ๋ํธ (e.g., ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ, ์ํ ๋ชฉ๋ก).
- ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ง์ ์ ๊ทผํด์ผ ํ๋ ์ปดํฌ๋ํธ.
- ์๋ฒ ์ ์ฉ ํ๊ฒฝ ๋ณ์์ ์ ๊ทผํด์ผ ํ๋ ์ปดํฌ๋ํธ.
- ์ฌ์ฉ์ ์ํธ์์ฉ์ด ํ์ ์๋ ์ ์ ์ธ UI ๋ถ๋ถ.
- SEO์ ์ค์ํ ๋ฉํ๋ฐ์ดํฐ๋ ์ฝํ ์ธ ๋ฅผ ํฌํจํ๋ ์ปดํฌ๋ํธ.
2๏ธโฃ Client Components์ ํน์ง๊ณผ ์ฌ์ฉ
Client Components๋ Server Components์ ๋ฌ๋ฆฌ ํด๋ผ์ด์ธํธ ๋ธ๋ผ์ฐ์ ์์ ์คํ๋๊ณ Hydration ๊ณผ์ ์ ๊ฑฐ์ณ์.
- ํด๋ผ์ด์ธํธ์์ ์คํ: ๋ธ๋ผ์ฐ์ API(e.g.,
window,localStorage)์ ์ ๊ทผํ ์ ์์ด์. - ์ํธ์์ฉ ์ฒ๋ฆฌ:
useState,useEffect,useRef๋ฑ์ React ํ ์ ์ฌ์ฉํ์ฌ ์ํ ๊ด๋ฆฌ, ์๋ช ์ฃผ๊ธฐ ์ด๋ฒคํธ, ์ฌ์ฉ์ ์ ๋ ฅ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํด์. - ์ด๋ฒคํธ ํธ๋ค๋ฌ:
onClick,onChange๋ฑ์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋์ ์ธ UI๋ฅผ ๋ง๋ค์ด์. - ๋ฒ๋ค ์ฌ์ด์ฆ ์ฆ๊ฐ: ํด๋ผ์ด์ธํธ ๋ฒ๋ค์ ํฌํจ๋๋ฏ๋ก ๋๋ฌด ๋ง์ Client Components๋ ๋ฒ๋ค ์ฌ์ด์ฆ ์ฆ๊ฐ๋ก ์ด์ด์ง ์ ์์ด์.
์ธ์ Client Components๋ฅผ ์ฌ์ฉํ๋์?
- ์ํ ๊ด๋ฆฌ๊ฐ ํ์ํ ์ปดํฌ๋ํธ (e.g., ์นด์ดํฐ, ํผ ์ ๋ ฅ).
- ํด๋ผ์ด์ธํธ ์ ์ฉ ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ํ์ํ ์ปดํฌ๋ํธ (e.g., ๋ฒํผ ํด๋ฆญ, ๋๋๊ทธ์ค๋๋กญ).
- ๋ธ๋ผ์ฐ์ API์ ์ ๊ทผํด์ผ ํ๋ ์ปดํฌ๋ํธ (e.g.,
Geolocation,WebRTC). - Suspense๋ฅผ ํ์ฉํ ๋ก๋ฉ UI.
- ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(e.g., ์ฐจํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ๋ชจ๋ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ)๋ฅผ ์ฌ์ฉํ๋ ์ปดํฌ๋ํธ.
3๏ธโฃ ์ํธ์์ฉ ๋ฐ ํผ์ฉ ๋ฐฉ๋ฒ
Server Components์ Client Components๋ ํจ๊ป ์ฌ์ฉ๋ ๋ ๊ฐ๋ ฅํ ์๋์ง๋ฅผ ๋ฐํํด์. ๊ฐ์ฅ ์ค์ํ ๊ท์น์ ๋ค์๊ณผ ๊ฐ์์.
- Server Component๋ Client Component๋ฅผ ์ํฌํธํ ์ ์์ด์. ๊ทธ๋ฆฌ๊ณ Client Component์๊ฒ props๋ฅผ ์ ๋ฌํ ์ ์์ด์.
- Client Component๋ Server Component๋ฅผ ์ง์ ์ํฌํธํ ์ ์์ด์. ๋์ , Server Component์์ Client Component์
childrenprop์ผ๋ก Server Component์ ๋ด์ฉ์ ์ ๋ฌํ๋ ํจํด์ ์ฌ์ฉํ ์ ์์ด์.
๊ฒฝ๊ณClient Component ๋ด๋ถ์์
"use client"์ง์์ ์์ด Server Component์ฒ๋ผ ๋์ํ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ๊ฑฐ๋ ์๋ํ์ง ์์ ๋ฐฉ์์ผ๋ก ๋์ํ ์ ์์ด์. ํนํ ์๋ฒ ์ ์ฉ ํ๊ฒฝ ๋ณ์ ์ ๊ทผ ๋ฑ์ Client Component์์ ์ ๋ ํ๋ฉด ์ ๋ผ์.
๐งช ์์
0๏ธโฃ ์ฝ๋/์ค์ ์์
์๋ ์์๋ฅผ ํตํด Server Components์ Client Components์ ์ฌ์ฉ๋ฒ๊ณผ ์ํธ์์ฉ ๋ฐฉ์์ ์์๋ณผ๊ฒ์.
๐ app/page.tsx (Server Component)
์ด ์ปดํฌ๋ํธ๋ ์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ํ์ํ๊ณ , Client Component๋ฅผ ์์์ผ๋ก ํฌํจํ๊ณ ์์ด์. async ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ ์์
์ ์ํํ ์ ์์ด์.
// app/page.tsx import ClientCounter from './client-counter'; // Client Component ์ํฌํธ async function getMessage() { // ์ค์ ๋ฐฑ์๋ API ํธ์ถ์ด๋ DB ์ ๊ทผ์ด ์ผ์ด๋๋ ๋ถ๋ถ์ด๋ผ๊ณ ๊ฐ์ ํด์. const response = await fetch('https://api.example.com/message'); const data = await response.json(); return data.message; } export default async function HomePage() { const message = await getMessage(); // ์๋ฒ์์ ๋ฐ์ดํฐ ํ์นญ console.log('Server Log: Rendering HomePage'); // ์๋ฒ ์ฝ์์๋ง ์ฐํ์. return ( <main> <h1>Server Component์์ ๊ฐ์ ธ์จ ๋ฉ์์ง:</h1> <p>{message}</p> <ClientCounter initialCount={10} /> {/* Server Component๊ฐ Client Component๋ฅผ ๋ ๋๋งํด์ */} <section> <h2>์ด ์น์ ์ ์๋ฒ์์ ๋ ๋๋ง๋ ์ ์ ์ธ ๋ถ๋ถ์ด์์.</h2> <p>์ด๋ค ์ํธ์์ฉ๋ ์์ด ๋น ๋ฅด๊ฒ ๋ก๋๋ ๊ฑฐ์์.</p> </section> </main> ); }
๐ app/client-counter.tsx (Client Component)
์ด ์ปดํฌ๋ํธ๋ ์ฌ์ฉ์ ์ํธ์์ฉ์ด ํ์ํ ์นด์ดํฐ ์ปดํฌ๋ํธ์์. ๋ฐ๋์ ํ์ผ ์๋จ์ "use client" ์ง์์๊ฐ ํ์ํด์.
// app/client-counter.tsx 'use client'; // Client Component์์ ๋ช ์ํด์. import { useState } from 'react'; export default function ClientCounter({ initialCount }: { initialCount: number }) { const [count, setCount] = useState(initialCount); console.log('Client Log: Rendering ClientCounter'); // ๋ธ๋ผ์ฐ์ ์ฝ์์๋ง ์ฐํ์. return ( <div style={{ border: '1px solid gray', padding: '1rem', margin: '1rem 0' }}> <h2>Client Component (์ํธ์์ฉ ๊ฐ๋ฅ)</h2> <p>ํ์ฌ ์นด์ดํธ: {count}</p> <button onClick={() => setCount(count + 1)}>์ฆ๊ฐ</button> <button onClick={() => setCount(count - 1)}>๊ฐ์</button> </div> ); }
๐ app/layout.tsx (Root Layout, Server Component)
layout.tsx ํ์ผ์ ๊ธฐ๋ณธ์ ์ผ๋ก Server Component๋ก ๋์ํด์. ์ด๋ ์ ์ฒด ๋ ์ด์์์ด ์๋ฒ์์ ํ ๋ฒ ๊ตฌ์ฑ๋๊ณ , ํ์ํ ๊ฒฝ์ฐ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๋ฅผ ํฌํจํ ์ ์์์ ์๋ฏธํด์.
// app/layout.tsx import './globals.css'; export default function RootLayout({ children }: { children: React.ReactNode }) { return ( <html lang="ko"> <body>{children}</body> </html> ); }
1๏ธโฃ ์ ์ฉ ๊ฒฐ๊ณผ ๋ฐ ์ฃผ์์ฌํญ
- ์ด๊ธฐ ๋ก๋ฉ ์ต์ ํ:
HomePage์<main>ํ๊ทธ์<section>ํ๊ทธ ๋ด์ฉ์ ์๋ฒ์์ HTML๋ก ๋ฏธ๋ฆฌ ๋ ๋๋ง๋์ด ์ ์ก๋๋ฏ๋ก, ์ด๊ธฐ ๋ก๋ฉ ์ JavaScript ๋ฒ๋ค ์์ด ๋น ๋ฅด๊ฒ ํ๋ฉด์ ํ์๋ผ์.getMessageํจ์๋ ํด๋ผ์ด์ธํธ ๋ฒ๋ค์ ํฌํจ๋์ง ์์์. - ๋ฒ๋ค ์ฌ์ด์ฆ ๊ฐ์:
client-counter.tsx๋ง ํด๋ผ์ด์ธํธ ๋ฒ๋ค์ ํฌํจ๋๊ณ , ๋๋จธ์ง ์๋ฒ ์ปดํฌ๋ํธ ์ฝ๋๋ ํฌํจ๋์ง ์์ผ๋ฏ๋ก ์ ๋ฐ์ ์ธ ํด๋ผ์ด์ธํธ ๋ฒ๋ค ์ฌ์ด์ฆ๊ฐ ์ค์ด๋ค์ด์. - Hydration:
ClientCounter์ปดํฌ๋ํธ๋ง ํด๋ผ์ด์ธํธ์์ Hydration ๊ณผ์ ์ ๊ฑฐ์ณ ์ํธ์์ฉํ ์ ์๊ฒ ๋ผ์.HomePage์ ์ ์ ์ธ ๋ถ๋ถ์ Hydration ์์ด๋ ๋์ํด์.
์ ์ฉํ ํServer Component๊ฐ Client Component์
children์ ๋ฐ๋ ํจํด์ ๊ต์ฅํ ๊ฐ๋ ฅํด์. ์๋ฅผ ๋ค์ด,ClientWrapper๋ผ๋ Client Component๊ฐ ์๊ณ , ๊ทธ ์์ServerContent๋ผ๋ Server Component๋ฅผ ๋ฃ๊ณ ์ถ๋ค๋ฉด ์ด๋ ๊ฒ ํ ์ ์์ด์.// app/client-wrapper.tsx 'use client'; import React from 'react'; export default function ClientWrapper({ children }: { children: React.ReactNode }) { // ํด๋ผ์ด์ธํธ ์ํ ๊ด๋ฆฌ ๋ก์ง... return ( <div className="client-boundary"> <p>์ด๊ฒ์ Client Component์ ๋๋ค.</p> {children} {/* children์ Server Component์ผ ์ ์์ด์! */} </div> ); } // app/page.tsx (Server Component) import ClientWrapper from './client-wrapper'; export default function HomePage() { return ( <ClientWrapper> <p>์ด๊ฒ์ ClientWrapper์ ์์์ผ๋ก ๋ค์ด๊ฐ Server Component ๋ด์ฉ์ด์์!</p> </ClientWrapper> ); }์ด ํจํด์ Client Component์ ์ํธ์์ฉ ๋ฒ์ ๋ด์ Server Component์ ์ ์ ์ธ ์ต์ ํ ์ด์ ์ ๊ฐ์ ธ์ฌ ์ ์์ด์ ๋งค์ฐ ์ ์ฉํด์.
๐ ์ ๋ฆฌ
0๏ธโฃ ํต์ฌ ์์ฝ
Next.js App Router์ Server Components์ Client Components๋ ์ญํ ์ด ๋ช ํํ๊ฒ ๋ถ๋ฆฌ๋์ด ์์ด์.
- Server Components:
- ์๋ฒ์์ ๋ ๋๋ง๋๊ณ HTML๋ก ์ ์ก๋ผ์.
- ๋ฐ์ดํฐ ํ์นญ, ์๋ฒ ์ ์ฉ ๋ก์ง, ํ์ผ ์์คํ ์ ๊ทผ์ ์ ๋ฆฌํด์.
- ํด๋ผ์ด์ธํธ ๋ฒ๋ค ํฌ๊ธฐ๋ฅผ ์ค์ด๊ณ ์ด๊ธฐ ๋ก๋ฉ ์ฑ๋ฅ์ ํฅ์์์ผ์.
- ๊ธฐ๋ณธ๊ฐ์ด์์.
- Client Components:
- ํด๋ผ์ด์ธํธ์์ ๋ ๋๋ง๋๊ณ Hydration์ ๊ฑฐ์ณ ์ํธ์์ฉ์ ์ฒ๋ฆฌํด์.
useState,useEffect, ์ด๋ฒคํธ ํธ๋ค๋ฌ, ๋ธ๋ผ์ฐ์ API ์ ๊ทผ์ ์ฌ์ฉ๋ผ์.- ํ์ผ ์๋จ์
'use client'์ง์์๊ฐ ํ์ํด์.
์ด ๋์ ์ ์ ํ ์กฐํฉ์ ์ฑ๋ฅ๊ณผ ๊ฐ๋ฐ ํธ์์ฑ์ ๋์์ ์ก์ ์ ์๋ ๊ฐ๋ ฅํ ๋๊ตฌ์์. ์ต๋ํ Server Components๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉํ๊ณ , ์ํธ์์ฉ์ด ํ์ํ ์ต์ํ์ ๋ถ๋ถ๋ง Client Components๋ก ๋ถ๋ฆฌํ๋ ๊ฒ์ด ์ข์ ์ ๋ต์ด์์.
1๏ธโฃ ๋ค์ ์ก์
- Next.js ๊ณต์ ๋ฌธ์์ Server Components ์น์ ์ ๋ค์ ํ๋ฒ ๊ผผ๊ผผํ ์ฝ์ด๋ณด์ธ์.
- Next.js ์บ์ฑ ์ ๋ต(๋ฐ์ดํฐ ์บ์ฑ, Full Route Cache ๋ฑ)๊ณผ Server Components๊ฐ ์ด๋ป๊ฒ ์๋์ง๋ฅผ ๋ด๋์ง ์ถ๊ฐ์ ์ผ๋ก ํ์ตํด ๋ณด์ธ์.
- ์คํธ๋ฆฌ๋ฐ(Streaming)๊ณผ Suspense๊ฐ Server Components์ ์ ์ง์ ๋ ๋๋ง๊ณผ ์ด๋ป๊ฒ ์ฐ๊ด๋๋์ง ์์๋ณด๋ ๊ฒ๋ ํฐ ๋์์ด ๋ ๊ฑฐ์์.
๐ฎ ์ฐธ๊ณ
์ฐ๊ด๋ ํฌ์คํธ
- ๋จ์ด: 1,271๊ฐ15๋ถ
[๐ค] Next.js App Router์์ Server Components์ Client Components ์ ๋๋ก ํ์ฉํ๊ธฐ
Next.js 13+ App Router ํ๊ฒฝ์์ Server Components์ Client Components์ ๊ฐ๋ , ์ฐจ์ด์ , ๊ทธ๋ฆฌ๊ณ ์ค์ฉ์ ์ธ ํ์ฉ ์ ๋ต์ ์์ธํ ์์๋ณด๊ณ , ์ฑ๋ฅ ์ต์ ํ์ ๊ฐ๋ฐ ํจ์จ์ฑ์ ๋์ด๋ ๋ฐฉ๋ฒ์ ๊ณต์ ํด์.
๋จ์ด: 1,844๊ฐ20๋ถ[๐ค] Next.js App Router: Server Components์ Client Components, ์๋ฒฝ ์ ๋ณตํด์!
Next.js 13+ App Router์์ Server Components์ Client Components๊ฐ ์ด๋ป๊ฒ ๋์ํ๊ณ , ์ธ์ ์ด๋ค ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํด์ผ ํ๋์ง ๋ช ํํ ์ดํดํ์ฌ ์ฑ๋ฅ ์ต์ ํ์ ํจ์จ์ ์ธ ๊ฐ๋ฐ์ ์ด๋ฃจ๋ ๋ฐฉ๋ฒ์ ์์ธํ ์์๋ด์.