SSR, CSR - Next.js ๋ Œ๋”๋ง

๋ž ๋œจยท2025๋…„ 8์›” 2์ผ

๐Ÿ”Ž Overview

ย Next.js ๋ฅผ ์ด์šฉํ•ด ํ”„๋ก ํŠธ์—”๋“œ ์‹ค์Šต์„ ์ง„ํ–‰ ์ค‘, ํ—ท๊ฐˆ๋ฆฌ๋Š” ๋ถ€๋ถ„์ด ์ƒ๊ฒผ๋‹ค. ํ•„์ž๊ฐ€ ์•Œ๊ณ  ์žˆ๋Š” SSR ๊ณผ CSR ์˜ ๊ฐœ๋…์ด ์‹ค์Šต ์ค‘ ํ˜ผ๋™์„ ์ผ์œผํ‚ค๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค.

ย ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง์€ ์„œ๋ฒ„ ์ธก์—์„œ ๋ Œ๋”๋ง์„ ํ•ด์„œ ๋ณด์—ฌ์ฃผ๋Š” ๊ฑฐ๊ณ , ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง์€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ Œ๋”๋ง์„ ํ•ด์„œ ๋ณด์—ฌ์ค€๋‹ค ๋ผ๊ณ ๋งŒ ์ดํ•ดํ•˜๊ณ  ์žˆ์—ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‹ค๋ณด๋‹ˆ, ' Next.js ์—์„œ JSX ์™€ JavaScript ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด CSR ์ด๋‹ค' ๋ผ๊ณ  ์ž˜๋ชป ์ดํ•ดํ•˜๊ณ  ์žˆ์—ˆ๋‹ค.

ย ์ž˜๋ชป๋œ ์ •๋ณด์— ๋Œ€ํ•œ ์ธ์‹์„ ๊ฐœ์„ ํ•œ ๊น€์—, ์ดํ›„์—๋Š” ์ ˆ๋Œ€ ํ—ท๊ฐˆ๋ฆฌ์ง€ ์•Š๋„๋ก ๊ด€๋ จ ๊ฐœ๋…์— ๋Œ€ํ•œ ๊ธฐ๋ก์„ ๋‚จ๊ฒจ๋‘๊ธฐ๋กœ ํ–ˆ๋‹ค.


1๏ธโƒฃ SSR

  • Server-Side Rendering - ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง
  • ์„œ๋ฒ„์—์„œ ์›น ํŽ˜์ด์ง€ ๋ Œ๋”๋ง์„ ๋‹ด๋‹น
  • ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ํŽ˜์ด์ง€๋ฅผ ์š”์ฒญ๋ฐ›์œผ๋ฉด ์™„์„ฑ๋œ ์ •์  + ๋™์  HTML ํŒŒ์ผ์„ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ฐ˜ํ™˜
    • ๊ธฐ๋ณธ์ ์ธ ์ •์  ๋ฐ์ดํ„ฐ์ธ HTML , JSX ํŒŒ์ผ์€ ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜
    • ์„œ๋ฒ„์— ๋™์ ์ธ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•œ ๊ฒฝ์šฐ, ํ•ด๋‹น API ๋ฅผ ํ˜ธ์ถœํ•œ ํ›„์˜ ์‘๋‹ต๊ฐ’(๋™์  ๋ฐ์ดํ„ฐ) ๋˜ํ•œ HTML, JSX ํŒŒ์ผ์— ๋‹ด์•„์„œ ๋ฐ˜ํ™˜
    • ์ฆ‰, ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‘ ์ฑ„์›Œ ๋„ฃ์€ ์™„์ „ํ•œ HTML ํŒŒ์ผ ๋ฐ˜ํ™˜
  • ์„œ๋ฒ„ ๋ฐ์ดํ„ฐ ๊ธฐ๋ฐ˜ UI ๊ตฌ์„ฑ ๋‹ด๋‹น

โ“ ์žฅ์ 

  1. ๋น ๋ฅธ ์ดˆ๊ธฐ ๋กœ๋”ฉ ์„ฑ๋Šฅ
    • HTML ํŒŒ์ผ ์ž์ฒด๊ฐ€ ๋ชจ๋“  ์ปจํ…์ธ ๋ฅผ ์ด๋ฏธ ํฌํ•จ
    • ํด๋ผ์ด์–ธํŠธ(๋ธŒ๋ผ์šฐ์ €)๋Š” ์ด ํŽ˜์ด์ง€๋ฅผ ๋ฐ”๋กœ ๋ Œ๋”๋งํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋จ
  2. SEO ์ตœ์ ํ™”
    • ๊ฒ€์ƒ‰ ์—”์ง„ ํฌ๋กค๋Ÿฌ๊ฐ€ ํŽ˜์ด์ง€์˜ ๋ชจ๋“  ์ฝ˜ํ…์ธ ๋ฅผ ์‰ฝ๊ฒŒ ์ฝ์„ ์ˆ˜ ์žˆ์Œ
    • ํŠน์ • ํ‚ค์›Œ๋“œ์— ๋Œ€ํ•œ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ๋…ธ์ถœ์— ์œ ๋ฆฌ

โ— ๋‹จ์ 

  1. ๋А๋ฆฐ ํŽ˜์ด์ง€ ์ „ํ™˜ ์†๋„
    • ํŽ˜์ด์ง€ ์ด๋™ ์‹œ๋งˆ๋‹ค, ์„œ๋ฒ„๋Š” HTML ์„ ์ƒˆ๋กœ ๋ Œ๋”๋ง ํ›„ ์ „์†ก
    • ๋กœ์ง ์ฒ˜๋ฆฌ์— ์‹œ๊ฐ„์ด ๋‹ค์†Œ ์†Œ์š”๋œ๋‹ค๋ฉด, ์‘๋‹ต๋ฐ›๊ธฐ ์ „๊นŒ์ง€ ํŽ˜์ด์ง€ ๋กœ๋”ฉ
    • ์ด๋Š” ๋ถˆ์พŒํ•œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์ดˆ๋ž˜
  2. ์„œ๋ฒ„ ๋ถ€ํ•˜์˜ ์ฆ๊ฐ€
    • ๋งค๋ฒˆ ์„œ๋ฒ„ API ๋ฅผ ํ˜ธ์ถœํ•˜๋ฏ€๋กœ, ์„œ๋ฒ„ ํ˜ธ์ถœ ํšŸ์ˆ˜ ์ฆ๊ฐ€
    • ํŠธ๋ž˜ํ”ฝ์ด ๋งŽ์„์ˆ˜๋ก ์„œ๋ฒ„ ์ž์›์€ ๋งŽ์ด ์†Œ๋ชจ
    • ์„œ๋ฒ„ ๋ถ€ํ•˜๋กœ ์ธํ•œ ์„ฑ๋Šฅ ์ €ํ•˜, ์‹ฌํ•˜๋ฉด ์„œ๋ฒ„ ๋‹ค์šด๊นŒ์ง€ ์ดˆ๋ž˜

2๏ธโƒฃ CSR

  • Client-Side Rendering - ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง
  • ํด๋ผ์ด์–ธํŠธ(๋ธŒ๋ผ์šฐ์ €)์—์„œ ํŽ˜์ด์ง€ ๋ Œ๋”๋ง์„ ๋‹ด๋‹น
  • ์›น ํŽ˜์ด์ง€์˜ ๋ชจ๋“  ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ JavaScript ์— ์˜ํ•ด ๋™์ ์œผ๋กœ ์ƒ์„ฑ
  • UX ๋ฐ ์‚ฌ์šฉ์ž ์ธํ„ฐ๋ ‰์…˜ ๋‹ด๋‹น

โ“ ์žฅ์ 

  1. ๋น ๋ฅธ ํŽ˜์ด์ง€ ์ „ํ™˜
    • ์„œ๋ฒ„ API ํ˜ธ์ถœ ์ด์ „์— ํŽ˜์ด์ง€๋ฅผ ๋จผ์ € ๋ Œ๋”๋ง
    • ์ฆ‰, ์„œ๋ฒ„์— ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜๊ธฐ๋„ ์ด์ „์—, ๋ฐ”๋กœ UI ์— ๋จผ์ € ์ ์šฉ
    • ๋‚™๊ด€์  ์—…๋ฐ์ดํŠธ
  2. ํ’๋ถ€ํ•œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜
    • ์‚ฌ์šฉ์ž์—๊ฒŒ ์ฆ‰๊ฐ์ ์ธ ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณต
    • ์‚ฌ์šฉ์ž์˜ UX ๊ทน๋Œ€ํ™”

โ— ๋‹จ์ 

  1. ์ดˆ๊ธฐ ๋กœ๋”ฉ ์†๋„ ์ €ํ•˜
    • CSR ์€ ์‚ฌ์šฉ์ž์—๊ฒŒ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ์˜ JavaScript ๋ฅผ ๋ชจ๋‘ ์ „์†ก
      • ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งŽ์•„์งˆ์ˆ˜๋ก ์ดˆ๊ธฐ ๋‹ค์šด๋กœ๋“œ ์šฉ๋Ÿ‰ ์ฆ๊ฐ€
    • ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ HTML ์— JavaScript ๋ฅผ ์—ฐ๊ฒฐํ•˜์—ฌ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ๋“ฑ๋ก
      • ์ด๋ฅผ ํ•˜์ด๋“œ๋ ˆ์ด์…˜ ์ด๋ผ๊ณ  ํ•จ
      • ํ•˜์ด๋“œ๋ ˆ์ด์…˜์— ํ•„์š”ํ•œ ์ž‘์—… ์ฆ๊ฐ€๋กœ ์ธํ•œ ์ธํ„ฐ๋ž™์…˜ ์†Œ์š” ์‹œ๊ฐ„ ์ฆ๊ฐ€
  2. SEO ํšจ์œจ์„ฑ ๊ฐ์†Œ
    • JavaScript ๊ธฐ๋ฐ˜์ด๋ฏ€๋กœ, ์™„์„ฑ๋œ HTML ํŒŒ์ผ์„ ์ œ๊ณตํ•˜๋Š” SSR ๋ฐฉ์‹์— ๋น„ํ•ด ๋‚ฎ์€ ํšจ์œจ

๐Ÿ’ก ๋‚™๊ด€์  ์—…๋ฐ์ดํŠธ์˜ ์ด๋ฉด

  • ๊ฐ€์ƒ ์‹œ๋‚˜๋ฆฌ์˜ค
    1) ์‚ฌ์šฉ์ž๊ฐ€ ์ข‹์•„์š” ๋ฒ„ํŠผ ํด๋ฆญ
    2) ์ข‹์•„์š” ์ˆซ์ž ์ฆ๊ฐ€ ๋ฐ ๋ฒ„ํŠผ ์•กํ‹ฐ๋ธŒ UI ์ œ๊ณต
    3) ์„œ๋ฒ„ API ํ˜ธ์ถœ
    4) API ๋Š” 10๋ถ„ ๋Œ€๊ธฐ ํ›„ ํ•ด๋‹น ๋กœ์ง ์‹คํ–‰
    5) 10๋ถ„ ํ›„ ํ•ด๋‹น ๋กœ์ง ์ˆ˜ํ–‰ ์ค‘ ์—๋Ÿฌ ๋ฐœ์ƒ
    6) ์ข‹์•„์š” ํด๋ฆญ ์ธํ„ฐ๋ž™ํŠธ ์ดˆ๊ธฐํ™” ๋ฐ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ํ‘œ์‹œ

  • ์ด์ฒ˜๋Ÿผ, ๋น ๋ฅธ ๋ฐ˜์‘์„ฑ์„ ์ œ๊ณตํ•˜๋Š” ๋‚™๊ด€์  ์—…๋ฐ์ดํŠธ์ด์ง€๋งŒ ์ถ”ํ›„ ์—๋Ÿฌ ๋ฐœ์ƒ ์‹œ ๋’ค๋Šฆ์€ ์—๋Ÿฌ ์‘๋‹ต ๋ฐœ์ƒ
  • ์ด์— ๋”ฐ๋ฅธ ๋ถˆ์พŒํ™˜ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ์ œ๊ณต

โš’๏ธ ํ•ด๊ฒฐ ๋ฐฉ์•ˆ

  1. ํƒ€์ž„์•„์›ƒ ์„ค์ •
    • ์„œ๋ฒ„ ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ตœ๋Œ€ ์‹œ๊ฐ„ ์„ค์ •
    • UX ์ €ํ•˜ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด, ๋‚ฉ๋“ํ•  ์ •๋„์˜ ์ฒ˜๋ฆฌ ์‹œ๊ฐ„ ํ•œ๋„ ์„ค์ •
  2. ๋กœ๋”ฉ ์ƒํƒœ ์‚ฌ์šฉ
    • ์„œ๋ฒ„ ์‘๋‹ต์ด ์˜ค๊ธฐ ์ „๊นŒ์ง€, ํŽ˜์ด์ง€์— ๋กœ๋”ฉ ์ค‘์ž„์„ ์•Œ๋ฆฌ๋Š” ์ƒํƒœ ์ถ”๊ฐ€
    • ๋น ๋ฅธ ์‘๋‹ต์„ฑ์ด๋ผ๋Š” ์žฅ์ ์„ ๋กœ๋”ฉ ์ค‘ ์ƒํƒœ ํ‘œ์‹œ์— ์‚ฌ์šฉํ•˜์ง€๋งŒ, ๊ทธ๋งŒํผ ์•ˆ์ •์ ์ธ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ์ œ๊ณต
  3. ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์žฌ์‹œ๋„
    • ์„œ๋ฒ„ ์š”์ฒญ ์‹คํŒจ์‹œ, ์—๋Ÿฌ ํ‘œ์‹œ ๋Œ€์‹  ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ์š”์ฒญ ์ž๋™ ์žฌ์‹œ๋„

3๏ธโƒฃ SPA (Single-Page Application)

  • ๋‹จ์ผ ํŽ˜์ด์ง€ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜
  • ํŽ˜์ด์ง€ ์ด๋™ ์‹œ๋งˆ๋‹ค ์„œ๋ฒ„์— ์ „์ฒด ํŽ˜์ด์ง€๋ฅผ ์š”์ฒญํ•˜๋Š” ๊ธฐ๋ณธ ๋ฐฉ์‹๊ณผ ๋‹ฌ๋ฆฌ, ์ตœ์ดˆ ํŽ˜์ด์ง€ ์ ‘๊ทผ ํ•œ ๋ฒˆ๋งŒ ์ •์  ๋ฆฌ์†Œ์Šค๋ฅผ ๋‹ค์šด๋กœ๋“œ
    • ์ดํ›„ ์ƒํ˜ธ์ž‘์šฉ ๋ฐœ์ƒ์‹œ, ํŽ˜์ด์ง€ ์ƒˆ๋กœ๊ณ ์นจ์„ ํ•˜์ง€ ์•Š๊ณ  JavaScript ๋กœ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ์„œ๋ฒ„์—์„œ ๋น„๋™๊ธฐ์ ์œผ๋กœ ํ˜ธ์ถœ
    • ๋ธŒ๋ผ์šฐ์ € ์บ์‹ฑ์„ ํ†ตํ•ด ๋‹ค์šด๋กœ๋“œ ๋ฆฌ์†Œ์Šค๋“ค์€ ์žฌํ™œ์šฉ
    • ์ฒซ ๋กœ๋”ฉ์€ ๋А๋ฆด ์ˆ˜ ์žˆ์–ด๋„, ์ดํ›„ ํŽ˜์ด์ง€ ์ „ํ™˜์€ ๋งค์šฐ ๋น ๋ฆ„
  • ์ด๋ ‡๊ฒŒ ๋™์  ์—…๋ฐ์ดํŠธ ๋ Œ๋”๋ง ์ˆ˜ํ–‰
  • CSR ๋ฐฉ์‹์„ ๊ทน๋Œ€ํ™”ํ•œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ˜•ํƒœ


4๏ธโƒฃ Next.js ์—์„œ์˜ ๋ Œ๋”๋ง

  • Next.js ๋Š” SSR ๊ณผ CSR ์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ํ•˜์ด๋ธŒ๋ฆฌ๋“œ
  • "use client" ์‚ฌ์šฉ ์œ ๋ฌด์— ๋”ฐ๋ผ SSR ๊ณผ CSR ์„ ๊ตฌ๋ถ„
    • "use client" ์‚ฌ์šฉ : CSR - ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง
    • "use client" ๋ฏธ์‚ฌ์šฉ : SSR - ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง

๐Ÿ“Œ "use client"

  • ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ๋กœ ์ •์˜ํ•œ๋‹ค๋Š” ์˜๋ฏธ
  • ๋ธŒ๋ผ์šฐ์ €๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ๋•Œ ์‚ฌ์šฉ
  • React Hooks์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ
    • ex) use() , useEffect() , useRouter() ...
  • JavaScript ๋กœ ๋“ฑ๋ก๋œ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ
    • ex) onClick() , onSubmit() , onChange() ...
  • ๋ธŒ๋ผ์šฐ์ € API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ
    • ex) window.scrollTo() , document.title ...

  • JavaScript ์—์„œ๋Š” Link ๋‚˜ <a> , router ๋“ฑ์œผ๋กœ ํŽ˜์ด์ง€ ์ด๋™ ์ง€์›

๐Ÿฅ‡ <a>

  • ๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋ณธ ๋งํฌ ๋™์ž‘
  • ํด๋ฆญ ์‹œ ์„œ๋ฒ„์— ์ƒˆ๋กœ์šด ํŽ˜์ด์ง€ ์š”์ฒญ
  • ์„œ๋ฒ„๋Š” ํ•ด๋‹น ํŽ˜์ด์ง€์˜ ์ƒˆ๋กœ์šด HTML ์‘๋‹ต
  • SSR

  • ํŽ˜์ด์ง€ ์ด๋™ ์ดํ›„, ํ•ด๋‹น ํŽ˜์ด์ง€์˜ "use client" ์œ ๋ฌด์— ๋”ฐ๋ผ CSR ์ถ”๊ฐ€
  • ์ฆ‰, SSR ๋กœ ์‹œ์ž‘ํ•˜์—ฌ ํ•„์š”์— ๋”ฐ๋ผ CSR ์ถ”๊ฐ€๋กœ ์‚ฌ์šฉ์ž ์ธํ„ฐ๋ž™์…˜ ์ œ๊ณต

๐Ÿฅˆ router

  • JavaScript ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉ
  • ํŽ˜์ด์ง€ ์ „์ฒด๋ฅผ ์ƒˆ๋กœ๊ณ ์นจํ•˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ, ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ํ˜ธ์ถœํ•˜์—ฌ ํŽ˜์ด์ง€ ์—…๋ฐ์ดํŠธ
  • CSR

  • ์ฆ‰, CSR ๋กœ ์‹œ์ž‘ํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ธํ„ฐ๋ž™์…˜์œผ๋กœ ์ธํ•ด ํŽ˜์ด์ง€๊ฐ€ ์ด๋™๋˜๊ณ , ์ดํ›„ SSR ๋กœ ์ƒˆ๋กœ์šด ์ฝ˜ํ…์ธ  ์‘๋‹ต

  • SPA ๋ฐฉ์‹์˜ ํŽ˜์ด์ง€ ์ด๋™ ์ง€์›
  • ํด๋ฆญ ์‹œ ์ƒˆ๋กœ์šด ํŽ˜์ด์ง€ ์š”์ฒญ์ด ์•„๋‹Œ, Next.js ๊ฐ€ ๋ฏธ๋ฆฌ ๋‹ค์šด๋กœ๋“œํ•ด ๋‘” ํ•„์š”ํ•œ JavaScript ๋ฐ ๋ฐ์ดํ„ฐ๋งŒ์œผ๋กœ ํŽ˜์ด์ง€ ์—…๋ฐ์ดํŠธ
    • ์ด๋ ‡๊ฒŒ ๋‹ค์šด๋กœ๋“œ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ฏธ๋ฆฌ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์„ ํ”„๋ฆฌํŒจ์นญ(Prefetching) ์ด๋ผ๊ณ  ํ•จ
  • router ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ƒˆ๋กœ๊ณ ์นจ ์—†์ด ํŽ˜์ด์ง€ ์ „ํ™˜
  • SSR + CSR (ํ•˜์ด๋ธŒ๋ฆฌ๋“œ)

  • SSR ๋กœ ์ดˆ๊ธฐ ํŽ˜์ด์ง€ ๋ Œ๋”๋ง ์ดํ›„, <Link> ํŽ˜์ด์ง€ ์ด๋™ ์‹œ์—๋Š” CSR ๋กœ ๋ถ€๋“œ๋Ÿฌ์šด ํŽ˜์ด์ง€ ์ „ํ™˜
  • Next.js ์˜ ๊ธฐ๋ณธ ์ œ๊ณต ๋ Œ๋”๋ง ๋ฐฉ์‹์œผ๋กœ, SPA ์˜ ์žฅ์ ๋“ค์„ ๋ชจ๋‘ ๋ˆ„๋ฆด ์ˆ˜ ์žˆ์Œ

๊ฒ€์ˆ˜) Google Gemini ( https://gemini.google.com/app )

profile
๊ธฐ๋ก

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