๐Ÿ“ฐ Front-end/Next.js

[Next.js] Server Component์™€ Client Component์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž

s2ylvia 2024. 6. 12. 18:29

 

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