๐ŸŽฎ ํ”„๋กœ๊ทธ๋ž˜๋ฐ/๐Ÿ‘ฉ‍๐Ÿ’ป ๊ฐœ๋ฐœ ๊ณต๋ถ€

[NextJS] SSR ์ปดํฌ๋„ŒํŠธ vs CSR ์ปดํฌ๋„ŒํŠธ (Server Component์™€ Client Component), ํŽ˜์ด์ง€ ๋กœ๋”ฉ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ๋ฌธ์ œ ํ•ด๊ฒฐ

xxilliant 2025. 4. 26. 15:39
728x90
๋ฐ˜์‘ํ˜•

Next.js - Server Component์™€ Client Component

Next.js 13๋ถ€ํ„ฐ app ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ๊ฐ€ ๋„์ž…๋˜๋ฉด์„œ, ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์„œ๋ฒ„(Server) ์ปดํฌ๋„ŒํŠธ์ธ์ง€, ํด๋ผ์ด์–ธํŠธ(Client) ์ปดํฌ๋„ŒํŠธ์ธ์ง€ ๊ตฌ๋ถ„ํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ์ค‘์š”ํ•ด์กŒ์Šต๋‹ˆ๋‹ค.
์ด ๊ธ€์—์„œ๋Š” Server Component์™€ Client Component๊ฐ€ ๋ฌด์—‡์ธ์ง€, ๊ฐ๊ฐ ์–ด๋–ค ํŠน์ง•๊ณผ ์žฅ๋‹จ์ ์„ ๊ฐ€์ง€๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์–ธ์ œ ์–ด๋–ค ๊ฑธ ์„ ํƒํ•ด์•ผ ํ•˜๋Š”์ง€ ์‰ฝ๊ฒŒ ์ •๋ฆฌํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


Server Component๋ž€?

Next.js์—์„œ page.tsx๋‚˜ layout.tsx ์ปดํฌ๋„ŒํŠธ๋“ค์€ ๊ธฐ๋ณธ์ ์œผ๋กœ Server Component์ž…๋‹ˆ๋‹ค.
Server Component๋Š” ์„œ๋ฒ„์—์„œ ๋ Œ๋”๋ง๋˜๊ณ , ์ตœ์ข… ๊ฒฐ๊ณผ๋งŒ HTML๋กœ ๋ธŒ๋ผ์šฐ์ €์— ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.

โœ… Server Component์˜ ์žฅ์ 

  • ํŽ˜์ด์ง€๋ฅผ ๋ Œ๋”๋งํ•  ๋•Œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค๋ง์ด ๊ฑฐ์˜ ํ•„์š” ์—†๋‹ค.
  • ๊ฒฐ๊ณผ์ ์œผ๋กœ ํŽ˜์ด์ง€ ๋กœ๋”ฉ ์†๋„๊ฐ€ ๋น ๋ฅด๋‹ค.
  • SEO์— ์œ ๋ฆฌํ•˜๋‹ค (์„œ๋ฒ„์—์„œ ์™„์„ฑ๋œ HTML ์ œ๊ณต).

โŒ Server Component์˜ ๋‹จ์ 

  • ๋ธŒ๋ผ์šฐ์ € ์ „์šฉ ๊ธฐ๋Šฅ์„ ์“ธ ์ˆ˜ ์—†๋‹ค.
    • useState, useEffect ๊ฐ™์€ React Hook ์‚ฌ์šฉ ๋ถˆ๊ฐ€
    • onClick, onChange ๊ฐ™์€ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋ง ๋ถˆ๊ฐ€
    • ๋น„๋™๊ธฐ ์ŠคํŠธ๋ฆฌ๋ฐ์ด ์—†๋‹ค๋ฉด ์‚ฌ์šฉ์ž๋Š” ํ•ญ์ƒ ์ „์ฒด ํŽ˜์ด์ง€๋ฅผ ๊ธฐ๋‹ค๋ ค์•ผ ํ•œ๋‹ค.
  • HTML ์•ˆ์— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ง์ ‘ ๋„ฃ์„ ์ˆ˜ ์—†๋‹ค.

Client Component๋ž€?

์ปดํฌ๋„ŒํŠธ ํŒŒ์ผ์˜ ๋งจ ์œ„์— 'use client'; ๋ฅผ ์„ ์–ธํ•˜๋ฉด, ๊ทธ ์•„๋ž˜์— ์ž‘์„ฑํ•˜๋Š” ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๋Š” Client Component๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

Client Component๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์ง์ ‘ ์‹คํ–‰๋˜๋ฉฐ, ์šฐ๋ฆฌ๊ฐ€ ์ต์ˆ™ํ•œ React ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

โœ… Client Component์˜ ์žฅ์ 

  • ์ž์œ ๋กญ๊ฒŒ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ์„ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค.
    • useState, useEffect ์‚ฌ์šฉ ๊ฐ€๋Šฅ
    • ๋ฒ„ํŠผ ํด๋ฆญ ์ด๋ฒคํŠธ(onClick) ๋“ฑ ์‚ฌ์šฉ์ž ์ธํ„ฐ๋ž™์…˜ ๊ฐ€๋Šฅ
  • ๋ณต์žกํ•œ UI ์ƒํƒœ ๊ด€๋ฆฌ๋‚˜ ์‚ฌ์šฉ์ž ์ž…๋ ฅ ์ฒ˜๋ฆฌ์— ์œ ๋ฆฌํ•˜๋‹ค.

โŒ Client Component์˜ ๋‹จ์ 

  • ํŽ˜์ด์ง€ ์šฉ๋Ÿ‰์ด ์ปค์ง€๊ณ  ๋กœ๋”ฉ ์†๋„๊ฐ€ ๋А๋ ค์งˆ ์ˆ˜ ์žˆ๋‹ค.
  • Hydration ๊ณผ์ •์ด ํ•„์š”ํ•˜๋‹ค.
    • ์„œ๋ฒ„๊ฐ€ HTML์„ ๋จผ์ € ๋ณด๋‚ด๊ณ ,
    • ๋ธŒ๋ผ์šฐ์ €๊ฐ€ HTML์„ ์ฝ์€ ๋’ค ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฌธ๋ฒ•์„ ์ ์šฉํ•˜๋Š” ๋ณต์žกํ•œ ๊ณผ์ •์„ ๊ฑฐ์นœ๋‹ค.
    • ์ด ๋•Œ๋ฌธ์— ๋กœ๋”ฉ์ด ๋А๋ ค์ง€๊ฑฐ๋‚˜ ์ดˆ๊ธฐ ๋ Œ๋”๋ง์ด ๋”œ๋ ˆ์ด๋  ์ˆ˜ ์žˆ๋‹ค.

Server์™€ Client Component๋ฅผ ์–ด๋–ป๊ฒŒ ๋‚˜๋ˆ ์•ผ ํ• ๊นŒ?

  • ํฐ ๋‹จ์œ„์˜ ํŽ˜์ด์ง€๋‚˜ ์ •์ ์ธ ํŽ˜์ด์ง€๋Š” Server Component๋กœ ๋งŒ๋“ ๋‹ค.
    (๋ Œ๋”๋ง์€ ์„œ๋ฒ„์—์„œ ํ•˜๊ณ , ๊ฐ€๋ณ๊ฒŒ ๋ณด๋‚ด์ž.)
  • ํด๋ฆญ ์ด๋ฒคํŠธ, ๋™์ ์ธ UI ์ฒ˜๋ฆฌ ๋“ฑ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ Client Component๋กœ ๋งŒ๋“ ๋‹ค.
    • ์ดˆ๊ธฐ ๋กœ๋”ฉ์„ ๋น ๋ฅด๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด, ์ •์  ์ฝ˜ํ…์ธ ๋Š” ์„œ๋ฒ„์—์„œ ๋จผ์ € ๋ Œ๋”๋งํ•˜๊ณ 
      ๋ฐ์ดํ„ฐ๋Š” ํด๋ผ์ด์–ธํŠธ์—์„œ ๋น„๋™๊ธฐ๋กœ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ „๋žต์ด ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์— ์œ ๋ฆฌํ•จโ€ผ๏ธ (์ปดํฌ๋„ŒํŠธ ์„ธ๋ถ„ํ™”)

โœจ ์ •๋ฆฌ

 

  ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ
๊ธฐ๋ณธ ์‚ฌ์šฉ ์œ„์น˜ page.tsx, layout.tsx 'use client' ์„ ์–ธํ•œ ์ปดํฌ๋„ŒํŠธ
์žฅ์  ๋น ๋ฅธ ๋กœ๋”ฉ, ์ ์€ JS ๋ฒˆ๋“ค ํฌ๊ธฐ ์ž์œ ๋กœ์šด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ ๊ตฌํ˜„
๋‹จ์  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ ์‚ฌ์šฉ ๋ถˆ๊ฐ€ ํŽ˜์ด์ง€ ์šฉ๋Ÿ‰ ์ฆ๊ฐ€, Hydration ๋น„์šฉ ๋ฐœ์ƒ
์ถ”์ฒœ ์‚ฌ์šฉ์ฒ˜ ์ •์  ํŽ˜์ด์ง€, SEO ํ•„์š”ํ•œ ๊ณณ ๋™์  ์ธํ„ฐ๋ž™์…˜, ์‚ฌ์šฉ์ž ์ž…๋ ฅ ์ฒ˜๋ฆฌ

 

728x90
๋ฐ˜์‘ํ˜•