๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๊ฐœ๋ฐœ/NextJS

[๊ณต์‹๋ฌธ์„œ ๋ฒˆ์—ญ] NextJS ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ

by Jaeguk 2024. 3. 20.

Server Components


Next13์ด ๋“ฑ์žฅํ•˜๋ฉด์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ณ€ํ™”๋Š” ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋ผ๊ณ  ์ƒ๊ฐ๋œ๋‹ค

๋ฆฌ์•กํŠธ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ(RSC)๋Š” ์„œ๋ฒ„์—์„œ ๋ Œ๋”๋ง๋˜๊ณ  ์„ ํƒ์ ์œผ๋กœ ์บ์‹œ๋  ์ˆ˜ ์žˆ๋Š” UI๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค€๋‹ค.
NextJS์—์„œ ๋ Œ๋”๋ง ์ž‘์—…์€ Route Segment ๋ณ„๋กœ ๋ถ„ํ• ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ŠคํŠธ๋ฆฌ๋ฐ(Streaming)๊ณผ ๋ถ€๋ถ„ ๋ Œ๋”๋ง์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
์„œ๋ฒ„ ๋ Œ๋”๋ง ๋ฐฉ์‹์—๋Š” 3๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

  • Static Rendering (์ •์  ๋ Œ๋”๋ง)
  • Dynamic Rendering (๋™์  ๋ Œ๋”๋ง)
  • Streaming (์ŠคํŠธ๋ฆฌ๋ฐ)

 

Benefits of Server Rendering


์„œ๋ฒ„์—์„œ ๋ Œ๋”๋ง์„ ํ–ˆ์„ ๋•Œ์˜ ์ด์ 

  • Data Fetching (๋ฐ์ดํ„ฐ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ)
    • ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋กœ์ง์„ ๋ฐ์ดํ„ฐ ์†Œ์Šค์™€ ๊ฐ€๊นŒ์ด์— ์žˆ๋Š” "์„œ๋ฒ„"๋กœ ์ด์ „ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค.
    • ์ด๊ฒƒ์€ ๋ Œ๋”๋ง์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์‹œ๊ฐ„๊ณผ ํด๋ผ์ด์–ธํŠธ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์š”์ฒญ์˜ ์ˆ˜๋ฅผ ๋‹จ์ถ•์‹œ์ผœ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚จ๋‹ค.
  • Security (๋ณด์•ˆ)
    • ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋Š” ํ† ํฐ๊ณผ API ํ‚ค ๊ฐ™์€ ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ์™€ ๋กœ์ง์„ ์„œ๋ฒ„์— ์œ ์ง€ํ•˜๋„๋ก ํ•ด์ค€๋‹ค.
    • ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฐ ์ •๋ณด๋“ค์„ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋…ธ์ถœ๋  ์œ„ํ—˜์„ ์—†์• ์ค€๋‹ค.
  • Caching (์บ์‹ฑ)
    • ์„œ๋ฒ„์—์„œ ๋ Œ๋”๋ง์„ ํ•จ์œผ๋กœ์จ ๋ Œ๋”๋ง ๊ฒฐ๊ณผ๊ฐ€ ์„œ๋ฒ„์— ์บ์‹ฑ๋  ์ˆ˜ ์žˆ๊ณ , ๋‹ค์Œ๋ฒˆ์— ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์—๊ฒŒ์„œ ์š”์ฒญ์ด ์™”์„ ๋•Œ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์ด๊ฒƒ์€ ๊ฐ๊ฐ์˜ ์š”์ฒญ์— ๋Œ€ํ•ด ๋ฐœ์ƒํ•˜๋Š” ์—„์ฒญ๋‚œ ์–‘์˜ ๋ Œ๋”๋ง๊ณผ ๋ฐ์ดํ„ฐ ์š”์ฒญ์„ ์ค„์ž„์œผ๋กœ์จ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ณ  ๋น„์šฉ์„ ์ ˆ๊ฐํ•œ๋‹ค.
  • Performance (์„ฑ๋Šฅ)
    • ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋Š” ์„ฑ๋Šฅ์„ ์ตœ์ ํ™” ํ•  ์ˆ˜ ์žˆ๋Š” ์ถ”๊ฐ€์ ์ธ ํˆด์„ ์ œ๊ณตํ•œ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹น์‹ ์ด ์™„์ „ํžˆ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ๋กœ ๊ตฌ์„ฑ๋œ ์•ฑ์„ ์‹œ์ž‘ํ•œ๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ
    • ์ƒํ˜ธ์ž‘์šฉ์ด ํ•„์š”์—†๋Š” ๋ถ€๋ถ„๋“ค์„ ์„œ๋ฒ„๋กœ ์˜ฎ๊น€์œผ๋กœ์จ ํด๋ผ์ด์–ธํŠธ์ธก์— ์ „๋‹ฌํ•ด์•ผํ•  JavaScript์˜ ์–‘์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.
    • ์ด๊ฒƒ์€ ๋Š๋ฆฐ ์ธํ„ฐ๋„ท ๋˜๋Š” ๋œ powerfulํ•œ ์žฅ์น˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ์šฉ์ž๋“ค์—๊ฒŒ ์ด๋“์ธ๋ฐ,
    • ํด๋ผ์ด์–ธํŠธ์ธก์˜ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋” ์ ์€ ์–‘์˜ JavaScript๋ฅผ ๋‹ค์šด๋ฐ›๊ณ , ํŒŒ์‹ฑํ•˜๊ณ , ์‹คํ–‰ํ•ด๋„ ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค
  • Initial Page Load and First Contentful Paint(FCP)
    • ์„œ๋ฒ„์—์„œ ์šฐ๋ฆฌ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ฆ‰๊ฐ์ ์œผ๋กœ ํŽ˜์ด์ง€๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋„๋ก HTML์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค
    • ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ํด๋ผ์ด์–ธํŠธ๋Š” ํŽ˜์ด์ง€๋ฅผ ๋ Œ๋”๋งํ•˜๊ธฐ ์œ„ํ•œ JavaScript๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ , ํŒŒ์‹ฑํ•˜๊ณ , ์‹คํ–‰ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.
  • Search Engine Optimization and Social Network Shareability (๊ฒ€์ƒ‰ ์—”์ง„ ์ตœ์ ํ™”)
    • ๋ Œ๋”๋ง๋œ HTML์€ ๊ฒ€์ƒ‰์—”์ง„ ๋ด‡์— ์˜ํ•ด ๋‹น์‹ ์˜ ํŽ˜์ด์ง€๋ฅผ ์ƒ‰์ธํ™”ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค.
    • ๋ Œ๋”๋ง๋œ HTML์€ ์†Œ์…œ ๋„คํŠธ์›Œํฌ ๋ด‡์ด ๋‹น์‹ ์˜ ํŽ˜์ด์ง€์— ๋Œ€ํ•œ Social Card ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ฅผ ์ƒ์„ฑํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค.
    • ์—ฌ๊ธฐ์„œ ๋ Œ๋”๋ง๋œ HTML์€ ์„œ๋ฒ„ ์‚ฌ์ด๋“œ์—์„œ ๋ฏธ๋ฆฌ ๋ Œ๋”๋ง๋œ HTML์„ ์˜๋ฏธํ•œ๋‹ค
  • Streaming (์ŠคํŠธ๋ฆฌ๋ฐ)
    • ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋Š” ๋ Œ๋”๋ง ์ž‘์—…์„ Chunk ๋‹จ์œ„๋กœ ๋ถ„ํ• ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค€๋‹ค
    • ๊ทธ๋ฆฌ๊ณ  ๋ Œ๋”๋ง์ด ์ค€๋น„๋˜๋Š”๋Œ€๋กœ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ŠคํŠธ๋ฆผ๋˜๋„๋ก ํ•ด์ค€๋‹ค
    • ์ด๊ฒƒ์€ ์‚ฌ์šฉ์ž๊ฐ€ ์ „์ฒด ํŽ˜์ด์ง€๊ฐ€ ๋กœ๋“œ๋˜๊ธฐ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์ค€๋น„๋œ ๋ถ€๋ถ„๋ถ€ํ„ฐ ๋ณผ ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค€๋‹ค

๊ฐœ์ธ์ ์ธ ์˜๊ฒฌ์ด์ง€๋งŒ 1,2๋ฒˆ์€ Next ํ”„๋กœ์ ํŠธ๊ฐ€ ๋ฐ์ดํ„ฐ ์„œ๋ฒ„์™€ ๊ฐ™์€ ๊ณณ์— ์žˆ์„ ๋•Œ์˜ ์ด์•ผ๊ธฐ์ธ ๊ฒƒ ๊ฐ™๋‹ค.

 

Using Server Components in Next.js


์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

  • ๊ธฐ๋ณธ์ ์œผ๋กœ NextJS๋Š” ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค
  • ์ด๊ฒƒ์€ ์ถ”๊ฐ€์ ์ธ ์„ค์ •์—†์ด ์„œ๋ฒ„ ๋ Œ๋”๋ง์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค
  • ๊ทธ๋ฆฌ๊ณ  ์„ ํƒ์ ์œผ๋กœ ํ•„์š”์— ์˜ํ—ค ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค
    • ์ƒ๋‹จ์— 'use client'๋ฅผ ์ž‘์„ฑํ•ด์ฃผ๋ฉด ๋œ๋‹ค (์ž์„ธํ•œ ๊ฑด Client Components ์ฐธ๊ณ ํ•˜๊ธฐ)

 

How are Server Componetns rendered?


์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋Š” ์–ด๋–ป๊ฒŒ ๋ Œ๋”๋˜๋Š”์ง€?

  • ์„œ๋ฒ„์—์„œ NextJS๋Š” ๋ Œ๋”๋ง์„ ์กฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด ๋ฆฌ์•กํŠธ์˜ API๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค
  • ๋ Œ๋”๋ง ์ž‘์—…์€ Chunk ๋‹จ์œ„๋กœ ๋ถ„ํ• ๋œ๋‹ค
    • ๊ฐœ๋ณ„ Route Segments์™€ Suspense Boundaries ๋ณ„๋กœ

 

๊ฐ๊ฐ์˜ Chunk์˜ ๋ Œ๋”๋ง์€ 2๋‹จ๊ณ„๋กœ ์ง„ํ–‰๋œ๋‹ค

  1. React๋Š” ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋ฅผ React Server Component Payload(RSC Payload)๋ผ ๋ถˆ๋ฆฌ๋Š” ํŠน๋ณ„ํ•œ ๋ฐ์ดํ„ฐ ํ˜•ํƒœ๋กœ ๋ Œ๋”๋งํ•œ๋‹ค.
  2. NextJS๋Š” HTML์„ ๋ Œ๋”ํ•˜๊ธฐ ์œ„ํ•ด RSC Payload์™€ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ์˜ JavaScript ๋ช…๋ น์„ ์‚ฌ์šฉํ•œ๋‹ค.
    => ์ฆ‰, React์—์„œ ์ƒ์„ฑ๋œ RSC Payload์™€ ํด๋ผ์ด์–ธํŠธ์ธก JavaScript ๋ช…๋ น์„ ๊ฒฐํ•ฉํ•ด์„œ HTML์„ ์ƒ์„ฑํ•œ๋‹ค

 

ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ๋Š”?

  1. HTML์€ ์ƒํ˜ธ์ž‘์šฉ์ด ์—†๋Š” ๋ถ€๋ถ„์„ ์ฆ‰๊ฐ์ ์œผ๋กœ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉ๋œ๋‹ค - ์ด๊ฒƒ์€ ์ดˆ๊ธฐ ํŽ˜์ด์ง€ ๋ Œ๋”๋ฅผ ์œ„ํ•ด์„œ๋งŒ ์‚ฌ์šฉ๋œ๋‹ค.
  2. RSC Payload๋Š” ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ์™€ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ๋ฅผ ์กฐ์ •ํ•˜๊ณ , DOM์„ ์—…๋ฐ์ดํŠธํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.
  3. JavaScript ๋ช…๋ น๋“ค์€ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ๋ฅผ hydrate๋ฅผ ํ•˜๊ณ , ์ƒํ˜ธ์ž‘์šฉ์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.

 

RSC Payload๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

RSC Payload๋ž€ ๋ Œ๋”๋œ ๋ฆฌ์•กํŠธ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ์˜ compactํ•œ ๋ฐ”์ด๋„ˆ๋ฆฌ ํ‘œํ˜„์ด๋‹ค.
์ด๊ฒƒ์€ ๋ธŒ๋ผ์šฐ์ €์˜ DOM์„ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ ์œ„ํ•ด์„œ ํด๋ผ์ด์–ธํŠธ์ธก์˜ ๋ฆฌ์•กํŠธ์—์„œ ์‚ฌ์šฉ๋œ๋‹ค.
RSC Payload๋Š” ๋‹ค์Œ์„ ํฌํ•จํ•œ๋‹ค

  • ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋“ค์ด ๋ Œ๋”๋œ ๊ฒฐ๊ณผ
  • ์–ด๋””์— ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ๋“ค์ด ๋ Œ๋”๋ ์ง€์— ๋Œ€ํ•œ Placeholder์™€ ๊ทธ๋“ค์˜ JavaScript ํŒŒ์ผ์— ๋Œ€ํ•œ ์ฐธ์กฐ
  • ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ๋กœ ์ „๋‹ฌ๋œ ๋ชจ๋“  props

 

Server Rendering Strategies


์„œ๋ฒ„ ๋ Œ๋”๋ง ๋ฐฉ์‹

์„œ๋ฒ„์ธก ๋ Œ๋”๋ง ๋ฐฉ์‹์—๋Š” 3๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค: Static, Dynamic, Streaming

 

Static Rendering (Default)


์ •์  ๋ Œ๋”๋ง

์ •์  ๋ Œ๋”๋ง์„ ์‚ฌ์šฉํ•˜๋ฉด, ๋นŒ๋“œ ํƒ€์ž„(build time)์— ๋ Œ๋”๋ง๋˜๊ฑฐ๋‚˜, ๋ฐ์ดํ„ฐ ์žฌ์œ ํšจํ™”(Data Revalidation) ํ›„์— ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๋ Œ๋”๋ง๋œ๋‹ค.
๊ทธ ๊ฒฐ๊ณผ๋Š” ์บ์‹œ๋˜์–ด Content Delivery Network(CDN)์— ํ‘ธ์‹œ๋  ์ˆ˜ ์žˆ๋‹ค.
์ด๋Ÿฌํ•œ ์ตœ์ ํ™”๋Š” ๋ Œ๋”๋ง ๊ฒฐ๊ณผ๋ฅผ ์‚ฌ์šฉ์ž์™€ ์„œ๋ฒ„ ์š”์ฒญ ์‚ฌ์ด์—์„œ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.
๊ฐ™์€ ์š”์ฒญ์ด ๋“ค์–ด์™”์„ ๋•Œ, ์บ์‹ฑ๋œ ๊ฒฐ๊ณผ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์‘๋‹ตํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์˜๋ฏธ

์ •์  ๋ Œ๋”๋ง์€ ์ •์ ์ธ ๋ธ”๋กœ๊ทธ ํฌ์ŠคํŠธ ๋˜๋Š” ์ œํ’ˆ ํŽ˜์ด์ง€์™€ ๊ฐ™์ด ๊ฒฝ๋กœ๊ฐ€ ์‚ฌ์šฉ์ž๋ณ„๋กœ ๊ฐœ์ธํ™”๋˜์ง€ ์•Š์•˜๊ณ  ๋นŒ๋“œ ํƒ€์ž„์— ์•Œ ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์œ ์šฉํ•˜๋‹ค.

 

Dynamic Rendering


๋™์  ๋ Œ๋”๋ง

๋™์  ๋ Œ๋”๋ง์„ ์‚ฌ์šฉํ•˜๋ฉด, ๊ฒฝ๋กœ๋Š” ์š”์ฒญ ํƒ€์ž„(request time)์— ๋ Œ๋”๋ง๋œ๋‹ค.

๋™์  ๋ Œ๋”๋ง์€ ์ฟ ํ‚ค ๋˜๋Š” URL์˜ search params์™€ ๊ฐ™์ด ๊ฒฝ๋กœ๊ฐ€ ์‚ฌ์šฉ์ž๋ณ„๋กœ ๊ฐœ์ธํ™”๋˜์–ด ์žˆ๊ฑฐ๋‚˜, ์š”์ฒญ ํƒ€์ž„์—๋งŒ ์•Œ ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์— ์œ ์šฉํ•˜๋‹ค.
(URL search params๋Š” https://www.google.com?q=hello ์—์„œ q=hello์™€ ๊ฐ™์€ params๋ฅผ ์˜๋ฏธ)

 

Switching to Dynamic Rendering
๋ Œ๋”๋ง๋˜๋Š” ๋™์•ˆ ๋™์ ์ธ ํ•จ์ˆ˜ ๋˜๋Š” ์บ์‹œ๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ ์š”์ฒญ์ด ๋ฐœ๊ฒฌ๋˜๋ฉด, NextJS๋Š” ์ „์ฒด ๊ฒฝ๋กœ์— ๋Œ€ํ•ด ๋™์ ์œผ๋กœ ๋ Œ๋”๋งํ•˜๋„๋ก ์ „ํ™˜ํ•œ๋‹ค.
์•„๋ž˜์˜ ํ…Œ์ด๋ธ”์€ ์–ด๋–ป๊ฒŒ ๋™์ ์ธ ํ•จ์ˆ˜๋‚˜ ๋ฐ์ดํ„ฐ์˜ ์บ์‹ฑ์ด ๊ฒฝ๋กœ๊ฐ€ ์ •์  ๋˜๋Š” ๋™์ ์œผ๋กœ ๋ Œ๋”๋˜๋Š” ๊ฒƒ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

๋™์  ํ•จ์ˆ˜ (Dynamic Functions) ๋ฐ์ดํ„ฐ (Data) ๊ฒฝ๋กœ (Route)
์—†์Œ ์บ์‹œ๋˜์—ˆ์Œ ์ •์ ์œผ๋กœ ๋ Œ๋”
์žˆ์Œ ์บ์‹œ๋˜์—ˆ์Œ ๋™์ ์œผ๋กœ ๋ Œ๋”
์—†์Œ ์บ์‹œ๋˜์ง€ ์•Š์•˜์Œ ๋™์ ์œผ๋กœ ๋ Œ๋”
์žˆ์Œ ์บ์‹œ๋˜์ง€ ์•Š์•˜์Œ ๋™์ ์œผ๋กœ ๋ Œ๋”

ํ…Œ์ด๋ธ”์„ ๋ณด๋ฉด, ๊ฒฝ๋กœ๊ฐ€ ์™„์ „ํžˆ ์ •์ ์œผ๋กœ ๋ Œ๋”๋˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ์บ์‹ฑ๋˜์–ด์•ผ ํ•œ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ๋‹น์‹ ์€ ์บ์‹œ๋˜๊ฑฐ๋‚˜ ์บ์‹œ๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ ์š”์ฒญ์„ ๋ชจ๋‘ ๊ฐ–๋Š” ๋™์ ์œผ๋กœ ๋ Œ๋”๋˜๋Š” ๊ฒฝ๋กœ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.

๊ฐœ๋ฐœ์ž๋กœ์„œ ๋‹น์‹ ์€ static๊ณผ dynamic ์ค‘์— ๊ณ ๋ฅผ ํ•„์š”๊ฐ€ ์—†๋‹ค.
NextJS๊ฐ€ ์•Œ์•„์„œ ํŠน์ง•๊ณผ ์‚ฌ์šฉ๋˜๋Š” API๋ฅผ ๋ณด๊ณ , ๊ฐ ๊ฒฝ๋กœ์— ๋Œ€ํ•œ ์ตœ์ ์˜ ๋ Œ๋”๋ง ์ „๋žต์„ ์„ ํƒํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
๋Œ€์‹ , ์–ธ์ œ ๋ฐ์ดํ„ฐ๋ฅผ ์บ์‹œํ•˜๊ณ  ํŠน์ • ๋ฐ์ดํ„ฐ๋ฅผ ์žฌ์œ ํšจํ™”ํ•  ๊ฒƒ์ธ์ง€ ์„ ํƒํ•ด์•ผ ํ•œ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๋‹น์‹ ์˜ UI์—์„œ ์ŠคํŠธ๋ฆผํ•  ๋ถ€๋ถ„์„ ๊ณจ๋ผ์•ผ ํ•  ๊ฒƒ์ด๋‹ค.

 

Dynamic Functions
๋™์ ์ธ ํ•จ์ˆ˜๋Š” ์ฟ ํ‚ค, ํ˜„์žฌ ์š”์ฒญ ํ—ค๋”, ๋˜๋Š” URL's search params์™€ ๊ฐ™์ด ์š”์ฒญ ํƒ€์ž„(request time)์—๋งŒ ์•Œ ์ˆ˜ ์žˆ๋Š” ์ •๋ณด์— ์˜์กดํ•œ๋‹ค.
NextJS์—์„œ ์ด๋Ÿฌํ•œ ๋™์ž‘ ํ•จ์ˆ˜๋“ค์ด ์žˆ๋‹ค.

  • cookies() and headers(): ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ด๊ฒƒ ํ•จ์ˆ˜๋“ค์„ ์‚ฌ์šฉํ•˜๋ฉด ์ „์ฒด ๊ฒฝ๋กœ๊ฐ€ ์š”์ฒญ ํƒ€์ž„์— ๋™์  ๋ Œ๋”๋ง์„ ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์„ ํƒํ•œ๋‹ค.
  • searchParams: Pages prop์„ ์‚ฌ์šฉํ•˜๋ฉด ํŽ˜์ด์ง€ ์ „์ฒด๋ฅผ ์š”์ฒญ ํƒ€์ž„์— ๋™์  ๋ Œ๋”๋งํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์„ ํƒํ•œ๋‹ค.

์ด๋Ÿฌํ•œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ „์ฒด ๊ฒฝ๋กœ๋ฅผ ์š”์ฒญ ํƒ€์ž„์— ๋™์ ์œผ๋กœ ๋ Œ๋”๋งํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์„ ํƒํ•  ๊ฒƒ์ด๋‹ค.

 

Streaming


์ŠคํŠธ๋ฆฌ๋ฐ

์ŠคํŠธ๋ฆฌ๋ฐ์€ ๋‹น์‹ ์ด UI๋ฅผ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์ ์ง„์ ์œผ๋กœ ๋ Œ๋”ํ•˜๋Š” ๊ฒƒ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค.
์ž‘์—…์€ Chunk ๋‹จ์œ„๋กœ ๋ถ„ํ• ๋˜์–ด ์ˆ˜ํ–‰๋˜๊ณ , ์ค€๋น„๋˜๋Š”๋Œ€๋กœ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ stream๋œ๋‹ค.
์ด๊ฒƒ์€ ์‚ฌ์šฉ์ž๊ฐ€ ์ „์ฒด ๋‚ด์šฉ์ด ๋ Œ๋”๋ง์ด ๋๋‚˜๊ธฐ ์ „์—, ์ค€๋น„๊ฐ€ ๋˜๋Š”๋Œ€๋กœ ๋ถ€๋ถ„์ ์œผ๋กœ ๋ณด์—ฌ์งˆ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

์ŠคํŠธ๋ฆฌ๋ฐ์€ NextJS์˜ App Router ์•ˆ์— ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‚ด์žฅ๋˜์–ด ์žˆ๋‹ค.
์ด๊ฒƒ์€ ์ดˆ๊ธฐ ํŽ˜์ด์ง€ ๋กœ๋”ฉ ์„ฑ๋Šฅ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ๋Š๋ฆฐ ๋ฐ์ดํ„ฐ fetch์— ์˜์กดํ•˜๋Š” UI๋กœ ์ธํ•ด ์ „์ฒด ๊ฒฝ๋กœ์˜ ๋ Œ๋”๋ง์„ ๋ฐฉํ•ดํ•˜๋Š” ๊ฒƒ์„ ๊ฐœ์„ ํ•œ๋‹ค.
์ œํ’ˆ ํŽ˜์ด์ง€์˜ ๋ฆฌ๋ทฐ๋“ค์ด ๊ทธ ์˜ˆ์ด๋‹ค.

๋‹น์‹ ์€ loading.js์™€ React Suspense๋ฅผ ์ด์šฉํ•œ UI ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ†ตํ•ด์„œ route segments๋ฅผ ์ŠคํŠธ๋ฆฌ๋ฐํ•˜๋Š” ๊ฒƒ์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค.
๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ์œ„ํ•ด์„œ Loading UI and Streaming ๋ถ€๋ถ„์„ ์ฐธ๊ณ ํ•ด๋ผ.

 

์—ฌ๊ธฐ๊นŒ์ง€๊ฐ€ ๊ณต์‹ ๋ฌธ์„œ์— ๋‚˜์™€์žˆ๋Š” ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์— ๋Œ€ํ•œ ๋‚ด์šฉ์ด๋‹ค.

์ดํ›„์— Streaming์— ๋Œ€ํ•ด์„œ ๊ฐœ์ธ์ ์œผ๋กœ ์กฐ๊ธˆ ๋” ์•Œ์•„๋ณด์•˜๋‹ค

 

๊ธฐ์กด์˜ SSR์€ ์ด๋ ‡๊ฒŒ ์ด๋ฃจ์–ด์ง„๋‹ค

SSR

  1. ์„œ๋ฒ„(DB)๋กœ๋ถ€ํ„ฐ Data๋ฅผ fetchํ•œ๋‹ค
  2. ์„œ๋ฒ„(NextJS)์—์„œ HTML์„ ๋ Œ๋”๋งํ•œ๋‹ค
  3. ํด๋ผ์ด์–ธํŠธ์—์„œ HTML์„ ๋ฐ›๋Š”๋‹ค
  4. JavaScript๋ฅผ ๋ฐ›์•„์™€์„œ hydrateํ•œ๋‹ค

๊ทธ๋ ‡๋‹ค๋ฉด ์ด ๊ณผ์ •์ด ๋ชจ๋‘ ๋๋‚˜๊ธฐ ์ „์— ์œ ์ €๋Š” ํŽ˜์ด์ง€์™€ ์ƒํ˜ธ์ž‘์šฉ์„ ํ•  ์ˆ˜๊ฐ€ ์—†๋‹ค.

์ด๊ฒƒ์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์ด Streaming์ด๋‹ค.

HTML์„ ์ž‘๊ฒŒ ๋‚˜๋ˆ„์–ด(Chunk) ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ๋กœ๋“œ๋˜๊ธฐ ์ „ ์ค€๋น„๋œ ์ปดํฌ๋„ŒํŠธ๋Š” ๋ฏธ๋ฆฌ streamํ•ด์„œ ์ƒํ˜ธ์ž‘์šฉ์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ธฐ์ˆ ์„ Streaming์ด๋ผ๊ณ  ํ•œ๋‹ค.
=> ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋จผ์ € ์ž‘๋™ ํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค

 

Reference


https://bysxx.tistory.com/20

https://nextjs.org/docs/app/building-your-application/rendering/server-components

728x90