[ Next.js ] Server ์ปดํฌ๋„ŒํŠธ vs Client ์ปดํฌ๋„ŒํŠธ ์™„๋ฒฝ ์ดํ•ดํ•˜๊ธฐ

๐Ÿ’ก Next.js(App Router) ํ™˜๊ฒฝ์—์„œ ๊ฐœ๋ฐœํ•  ๋•Œ ๊ฐ€์žฅ ๋จผ์ € ๋งˆ์ฃผ์น˜๋Š” ๊ฐœ๋…์ด ๋ฐ”๋กœ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ(Server Components)์™€ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ(Client Components)์ž…๋‹ˆ๋‹ค. ์ด ๋‘ ๊ฐ€์ง€์˜ ํŠน์ง•๊ณผ ์˜ฌ๋ฐ”๋ฅธ ์‚ฌ์šฉ๋ฒ•์„ ํ•ต์‹ฌ๋งŒ ์ •๋ฆฌํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

๐Ÿ” ์ปดํฌ๋„ŒํŠธ ๋น„๊ต

Next.js๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๋ฅผ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ(Server Component)๋กœ ์ธ์‹
ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํŒŒ์ผ ์ตœ์ƒ๋‹จ์— "use client"๋ผ๋Š” ์ง€์‹œ์–ด๋ฅผ ๋ช…์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ตฌ๋ถ„ Server Component Client Component
๊ธฐ๋ณธ ์ธ์‹ Next.js์˜ ๊ธฐ๋ณธ๊ฐ’ ํŒŒ์ผ ์ตœ์ƒ๋‹จ์— "use client" ๋ช…์‹œ ํ•„์š”
์ฃผ์š” ์—ญํ•  ๋ณด์•ˆ์ด ์ค‘์š”ํ•œ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ, API ํ˜ธ์ถœ, DB ์ง์ ‘ ์ ‘๊ทผ ์‚ฌ์šฉ์ž ์ธํ„ฐ๋ž™์…˜(ํด๋ฆญ, ์ž…๋ ฅ), UI ์ƒํƒœ ๊ด€๋ฆฌ
React Hook useState, useEffect ๋“ฑ ์‚ฌ์šฉ ๋ถˆ๊ฐ€ ๋ชจ๋“  React Hook ์ž์œ ๋กญ๊ฒŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

 

๐Ÿ’ก ์ค‘์š” ํฌ์ธํŠธ
์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ ๋‚ด์— ์„œ๋ฒ„ ์ „์šฉ ๋กœ์ง(์˜ˆ: DB ์ง์ ‘ ์กฐํšŒ ๋“ฑ)์ด ์—†๊ณ , ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ์ฒ˜๋Ÿผ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ๋ผ๋ฉด Next.js๊ฐ€ ๋นŒ๋“œ ์‹œ์ ์— ์ด๋ฅผ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ์ฒ˜๋Ÿผ ๋‹ค๋ฃฐ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋Ÿฐํƒ€์ž„ ๋™์ž‘ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๊ณ  ๋ช…ํ™•ํ•˜๊ฒŒ ์—ญํ• ์„ ๊ตฌ๋ถ„ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

 

๐Ÿ”ฅ ๊ฐ€์žฅ ํ—ท๊ฐˆ๋ฆฌ๋Š” '์ค‘์ฒฉ ๊ทœ์น™' (์ƒํ˜ธ์ž‘์šฉ)

  • ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋Š” ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ž์‹์œผ๋กœ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ๋Š” ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ง์ ‘ importํ•ด์„œ ๊ฐ€์งˆ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๐Ÿ’ก ์‹ค์ „ ํ™œ์šฉ ๋ฐ ์ค‘์ฒฉ ๊ทœ์น™

 

Server Component

// async ๋Š” Server Components ์—์„œ๋งŒ ์“ธ ์ˆ˜ ์žˆ์Œ

import Button from "./Button";

export default async function DataFetch() {
  return (
    <>
      <h1>DataFetch</h1>
      <Button /> {/* ๊ฐ€๋Šฅ */}
    </>
  );
}

 

Client Components

'use client';

import DataFetch from "./DataFetch";

export default function Button() {
  return (
    <>
    	{/* Server Component */}
    	<DataFetch /> 
		
        <h1 onClick={() => alert("click")}>Button</h1>
    </>
  );
}

 

Client Component ์— Server Component ๋ฅผ ๋„ฃ์œผ๋ฉด ๋ฐ”๋กœ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒ

 

 

"๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ (Fetch) ๋ณด์•ˆ์ด ํ•„์š”ํ•œ ๋กœ์ง์€ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์—๊ฒŒ, ์ƒํƒœ(State)๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ์œ ์ €์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” UI๋Š” ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ์—๊ฒŒ!"

 

์ฒ˜์Œ์—๋Š” ๋‘ ์ปดํฌ๋„ŒํŠธ์˜ ๊ฒฝ๊ณ„๊ฐ€ ํ—ท๊ฐˆ๋ฆด ์ˆ˜ ์žˆ์ง€๋งŒ, "์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ถ€๋ชจ๋กœ ๋‘๊ณ  ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ž์‹์œผ๋กœ ์กฐ๋ฆฝํ•œ๋‹ค"๋Š” ๋ฐฉํ–ฅ์„ฑ๋งŒ ๊ธฐ์–ตํ•˜์‹œ๋ฉด ๋Œ€๋‹ค์ˆ˜์˜ ์—๋Ÿฌ๋ฅผ ์˜ˆ๋ฐฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

Next.js App Router์˜ ์„ฑ๋Šฅ์„ 100% ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด, ์ปดํฌ๋„ŒํŠธ๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ ์ด ๋‘ ๊ฐ€์ง€ ์—ญํ• ์„ ๋จผ์ € ๋ช…ํ™•ํžˆ ๋‚˜๋ˆ„๋Š” ์Šต๊ด€์„ ๋“ค์—ฌ๋ณด์„ธ์š”!