RSC(React ServerComponent)

POSIยท2025๋…„ 10์›” 17์ผ

WEB

๋ชฉ๋ก ๋ณด๊ธฐ
3/3

๐Ÿค” React 19v์—์„œ ์•ˆ์ •ํ™”๋˜๋Š” RSC์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž!

React Server Component

๋ฒˆ๋“ค๋ง ์ „์— ํด๋ผ์ด์–ธํŠธ ์•ฑ์ด๋‚˜ SSR ์„œ๋ฒ„์™€๋Š” ๋ถ„๋ฆฌ๋œ ํ™˜๊ฒฝ์—์„œ ๋ Œ๋”๋ง ๋˜๋Š” ์ƒˆ๋กœ์šด ์œ ํ˜•์˜ ์ปดํฌ๋„ŒํŠธ

์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋Š”
1. ๋นŒ๋“œ ์‹œ๊ฐ„์— CI ์„œ๋ฒ„์—์„œ ํ•œ๋ฒˆ ์‹คํ–‰๋˜๊ฑฐ๋‚˜
2. ๊ฐ ์š”์ฒญ๋งˆ๋‹ค ์›น ์„œ๋ฒ„๋ฅผ ํ†ตํ•ด ์‹คํ–‰ ๊ฐ€๋Šฅ

* ๋ฒˆ๋“ค๋ง = ํ•˜๋‚˜์˜ ์ˆœ์ˆ˜ JS ์ฝ”๋“œ๋กœ ๋ฌถ๊ธฐ ์ „
* ๋ถ„๋ฆฌ๋œ ํ™˜๊ฒฝ = React ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์˜ ์„œ๋ฒ„

์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ(Server Component) vs SSR(Server-Side Rendering)

SSR์€ "๋ธŒ๋ผ์šฐ์ € ๋Œ€์‹  ์„œ๋ฒ„์—์„œ HTML์„ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๊ธฐ์ˆ "์ด๊ณ ,
Server Component๋Š” "React ์ปดํฌ๋„ŒํŠธ๋ฅผ ์„œ๋ฒ„์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ React์˜ ์ƒˆ๋กœ์šด ์•„ํ‚คํ…์ฒ˜"

๊ตฌ๋ถ„ React Server Components Server-Side Rendering
๋ฌด์—‡์ธ๊ฐ€ React์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์„œ๋ฒ„์—์„œ ์‹คํ–‰ํ•˜๋Š” ์ƒˆ๋กœ์šด ๊ฐœ๋… ํด๋ผ์ด์–ธํŠธ์šฉ React ์•ฑ์„ ์„œ๋ฒ„์—์„œ ๋ฏธ๋ฆฌ ๋ Œ๋”๋งํ•˜๋Š” ๊ธฐ์ˆ 
์ถœ๋ ฅ๋ฌผ React ๋‚ด๋ถ€ ๊ตฌ์กฐ(ํŠธ๋ฆฌ)๋ฅผ RSC payload(JSON ์ŠคํŠธ๋ฆผ)๋กœ ์ง๋ ฌํ™” ์™„์„ฑ๋œ HTML ๋ฌธ์ž์—ด
์‹คํ–‰ ์œ„์น˜ ์„œ๋ฒ„ (Node/Edge ๋“ฑ) ์„œ๋ฒ„ (Node/Edge ๋“ฑ)
ํด๋ผ์ด์–ธํŠธ๋กœ ์ „์†ก๋˜๋Š” ๊ฒƒ RSC ๊ฒฐ๊ณผ(JSON-like ๋ฐ์ดํ„ฐ) + ์ผ๋ถ€ HTML ์ „์ฒด HTML + hydration์šฉ JS
hydrate ๋˜๋Š” ๋Œ€์ƒ Client Component๋งŒ ์ „์ฒด React ํŠธ๋ฆฌ
Next.js์—์„œ ๊ตฌํ˜„ํ•œ ํ˜•ํƒœ App Router Pages Router
๋ฐ์ดํ„ฐ ํŽ˜์นญ ์œ„์น˜ RSC ๋‚ด๋ถ€ (await fetch()) getServerSideProps() ๊ฐ™์€ SSR ํ•จ์ˆ˜ ๋‚ด๋ถ€

* hydration = ์„œ๋ฒ„์—์„œ ๋ Œ๋”๋ง๋œ ์ •์ ์ธ HTML์—, ๋ธŒ๋ผ์šฐ์ €์—์„œ React์˜ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์™€ ์ƒํƒœ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ


์™œ Server Component๋Š” async ํ•จ์ˆ˜์—ฌ๋„ ๋˜๋Š”๊ฐ€

React Server Component๋Š” ์„œ๋ฒ„ ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์—
๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ชปํ•˜๋Š” ์ผ์„ ํ•  ์ˆ˜ ์žˆ์Œ:
์˜ˆ๋ฅผ ๋“ค์–ด DB ์ฟผ๋ฆฌ, ํŒŒ์ผ ์ฝ๊ธฐ, ์™ธ๋ถ€ API ํ˜ธ์ถœ, ...

export default async function Page() {
	const data = await fetch("https://api.example.com/products").then(r => r.json());
    return <ProductList products={data} />;
}

์ด๊ฒŒ ๊ฐ€๋Šฅํ•œ ์ด์œ ๋Š”

  • RSC๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์•„๋‹ˆ๋ผ ์„œ๋ฒ„์—์„œ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— await์„ ์จ๋„ ๋ฌธ์ œ ์—†์Œ
  • React๋Š” ์ด๊ฑธ ๊ฐ์‹ธ์„œ "๋น„๋™๊ธฐ์  ๋ Œ๋”๋ง ๊ฐ€๋Šฅํ•œ ์ปดํฌ๋„ŒํŠธ"๋กœ ์ฒ˜๋ฆฌ
  • ๋‚ด๋ถ€์ ์œผ๋กœ React ์„œ๋ฒ„ ๋ Œ๋”๋Ÿฌ๊ฐ€ await๊ฐ€ ๋๋‚  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ ๊ฒฐ๊ณผ๋ฅผ ์ŠคํŠธ๋ฆฌ๋ฐ

โš ๏ธ ๋ฐ˜๋Œ€๋กœ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ๋Š” async์ผ ์ˆ˜ ์—†์Œ

๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰๋˜๋Š” ์ปดํฌ๋„ŒํŠธ๋Š” ๋ Œ๋”๋ง์ด ๋™๊ธฐ์ ์ด์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ
React์˜ ๋ Œ๋”๋Ÿฌ๋Š” ํด๋ผ์ด์–ธํŠธ ์ชฝ์—์„œ async ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Œ
(๋ฐ์ดํ„ฐ๋Š” useEffect๋‚˜ use ํ›… ๋“ฑ์„ ํ†ตํ•ด ๋ณ„๋„๋กœ ๋ถˆ๋Ÿฌ์™€์•ผ ํ•จ)


SSR๊ณผ RSC๊ฐ€ ๊ฐ™์ด ์“ฐ์ผ ๋•Œ

Next.js App Router์—์„œ๋Š” ์ด ๋‘˜์ด ๊ฐ™์ด ์ž‘๋™
1. Next.js ์„œ๋ฒ„๊ฐ€ ์š”์ฒญ์„ ๋ฐ›์Œ
2. ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ(RSC) ์‹คํ–‰ -> ๋ฐ์ดํ„ฐ fetch -> React ํŠธ๋ฆฌ ์ƒ์„ฑ
3. ์„œ๋ฒ„๊ฐ€ ๊ทธ๊ฑธ SSR ํ˜•ํƒœ๋กœ HTML๋กœ "์ดˆ๊ธฐ ์ŠคํŠธ๋ฆผ" ์ „์†ก
4. ๋™์‹œ์— ๋ธŒ๋ผ์šฐ์ €๋กœ RSC payload(JSON ์ŠคํŠธ๋ฆผ)๋„ ์ „์†ก
5. ๋ธŒ๋ผ์šฐ์ €์—์„œ Client Component hydrate
์ฆ‰,

App Router๋Š” RSC๋กœ ๊ตฌ์„ฑ๋œ React ํŠธ๋ฆฌ๋ฅผ SSR ๋ฐฉ์‹์œผ๋กœ ์ŠคํŠธ๋ฆฌ๋ฐ


์ •๋ฆฌ

SSR์€ HTML์„ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๊ธฐ์ˆ 
RSC๋Š” React์˜ ์ผ๋ถ€๋ฅผ ์„œ๋ฒ„์—์„œ๋งŒ ์‹คํ–‰ํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ์ƒˆ๋กœ์šด ์„ค๊ณ„

profile
๊ณ ์–‘์ด๊ฐ€ ์šด์˜ํ•˜๋Š” ํ…Œํฌ๋ธ”๋กœ๊ทธ

0๊ฐœ์˜ ๋Œ“๊ธ€