๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐ŸŽฎ ํ”„๋กœ๊ทธ๋ž˜๋ฐ/2025 ํ•œ๊ฒฝxํ† ์Šค ๋ถ€์บ (Fullstack)

[ํ•œ๊ฒฝxToss] 12-13์ฃผ์ฐจ ์š”์•ฝ(2) : Next.JS

by xxilliant 2025. 4. 12.
728x90
๋ฐ˜์‘ํ˜•

 

๊ฐœ์ธ์˜ ํ•™์Šต ๋‚ด์šฉ ๊ธฐ๋ก ์ค‘, ๊ทนํžˆ ์ผ๋ถ€์˜ ๋‚ด์šฉ๋งŒ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

 

 

React VS Next

๋ฆฌ์•กํŠธ : CSR (ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง) - ๋ฒˆ๋“ค

์œ ์ € pc์—์„œ js์™€ html์„ ๊ทธ๋ ค์คŒ

  1. ๊ฒ€์ƒ‰์—”์ง„(SEO)์— ์•ˆ๊ฑธ๋ฆผ
  2. ์ฒซ ๋กœ๋”ฉ์‹œ ์ง€์—ฐ ๋ฐœ์ƒ

๋„ฅ์ŠคํŠธ : SSR (์„œ๋ฒ„์‚ฌ์ด๋“œ ๋ Œ๋”๋ง) - ๋ฆฌ์•กํŠธ ์ œ์ž‘ํ•˜๊ณ , html์„ ๋‚ด๋ ค์คŒ

  1. ๊ฒ€์ƒ‰์—”์ง„์— ๋‚˜์˜ด
  2. ์ง€์—ฐ์ด ๋ฐœ์ƒ๋˜์ง€ ์•Š์Œ
  3. fetch ํ•จ์ˆ˜ ์ตœ์ ํ™”, ๋ชจ๋“  ๊ธฐ๋Šฅ ์ตœ์ ํ™” ์ œ๊ณต
  4. ๋ณ„๋„์˜ ๋ผ์šฐํ„ฐ ์„ค์ •์ด ํ•„์š” ์—†๊ณ , ํŒŒ์ผ์‹œ์Šคํ…œ ๊ธฐ๋ฐ˜ ๋ผ์šฐํŒ… ์ œ๊ณต

SSR ์žฅ์  : ๋ณด์•ˆ์„ฑ, ํ˜ธํ™˜์„ฑ, SEO ์ตœ์ ํ™”

๋‹จ์  : ๋” ๋งŽ์€ ์ž์› ์†Œ๋ชจ, ๋งŽ์€ ๋ถ€ํ•˜, ์œ ์ง€๋ณด์ˆ˜ ๋น„์šฉ ์ฆ๊ฐ€, ํŽ˜์ด์ง€ ์š”์ฒญ ์‹œ๊ฐ„ ์ฆ๊ฐ€, ๋ธŒ๋ผ์šฐ์ € ์ „์šฉ API ์‚ฌ์šฉ ์‹œ ๋ช…์‹œ์  ์ง€์ • ํ•„์š”

 

 

๐Ÿ“Œ ์˜ˆ์‹œ

์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ (app/page.tsx)

// ๊ธฐ๋ณธ์ ์œผ๋กœ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ
export default async function Home() {
  const data = await fetch('<https://api.example.com/data>')
  const result = await data.json()

  return <div>{result.title}</div>
}
 

ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ (components/Button.tsx)

'use client'

import { useState } from 'react'

export default function Button() {
  const [count, setCount] = useState(0)

  return <button onClick={() => setCount(count + 1)}>ํด๋ฆญ {count}</button>
}

 

 


Next.js ํ”„๋กœ์ ํŠธ ํŒ

 

1. ํ•˜๋‹จ ๋„ค๋น„ ๋ฒ„ํŠผ ์—†์• ๊ธฐ : globals.css ์—์„œ

nextjs-portal { display: none; }

 

2. Next.js์—์„œ ํด๋” ์ด๋ฆ„์„ ๋Œ€๊ด„ํ˜ธ([])๋กœ ๊ฐ์‹ธ๋ฉด ๋™์  ๋ผ์šฐํŒ…(dynamic routing)์ด ์ ์šฉ

์˜ˆ๋ฅผ ๋“ค์–ด,

pages/products/[id].js

ํŒŒ์ผ์ด ์žˆ๋‹ค๋ฉด,

์ด๊ฑด /products/123, /products/abc ๊ฐ™์€ ๊ฒฝ๋กœ๋ฅผ ๋™์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป


next js ์—๋Ÿฌ ํŽ˜์ด์ง€ / ๋กœ๋”ฉ ํŽ˜์ด์ง€

 

๋งŒ๋“ค๊ธฐ๋งŒ ํ•˜๋ฉด ์•Œ์•„์„œ ์ ์šฉ๋œ๋‹ค.

 

์ž๋™์œผ๋กœ ์ ์šฉ๋˜๋Š” ์ด์œ  ⇒ Next.js์˜ ํŒŒ์ผ ์‹œ์Šคํ…œ ๊ธฐ๋ฐ˜ ๋ผ์šฐํŒ…๊ณผ ์ž๋™ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๋ฐ ๋กœ๋”ฉ ์ƒํƒœ ๊ด€๋ฆฌ ๋•Œ๋ฌธ

  1. app/ ๋””๋ ‰ํ† ๋ฆฌ ๋‚ด์— error.tsx ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•˜๋ฉด, Next.js๋Š” ์•ฑ์˜ ๋ชจ๋“  ํŽ˜์ด์ง€์—์„œ ๋ฐœ์ƒํ•œ ์˜ค๋ฅ˜๋ฅผ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌ
    1. ์ž๋™ ์ ์šฉ: ์ด ํŒŒ์ผ์ด ์žˆ๋Š” ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ๋ฐœ์ƒํ•œ ์˜ˆ์™ธ๋‚˜ ์˜ค๋ฅ˜๋ฅผ ์ž๋™์œผ๋กœ ์บ์น˜ํ•˜๊ณ , ์‚ฌ์šฉ์ž๊ฐ€ ์ •์˜ํ•œ ์—๋Ÿฌ UI๋ฅผ ๋ Œ๋”๋งํ•จ.
  2. app/ ๋””๋ ‰ํ† ๋ฆฌ ๋‚ด์— loading.tsx ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•˜๋ฉด, Next.js๋Š” ํ•ด๋‹น ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋กœ๋”ฉ ์ค‘์ผ ๋•Œ ์ž๋™์œผ๋กœ ๋กœ๋”ฉ UI๋ฅผ ํ‘œ์‹œ
    1. ์ž๋™ ์ ์šฉ: ์ด ํŒŒ์ผ์€ ํŽ˜์ด์ง€๋‚˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋กœ๋“œ๋  ๋•Œ ๋กœ๋”ฉ ์ƒํƒœ๋ฅผ ์ž๋™์œผ๋กœ ํ‘œ์‹œ

 

์›๋ฆฌ: React Suspense + ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง(SSR)

Next.js๋Š” React์˜ Suspense ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ , ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง(SSR)์„ ํ†ตํ•ด ์ปดํฌ๋„ŒํŠธ๋ฅผ ์„œ๋ฒ„์—์„œ ๋ฏธ๋ฆฌ ๋ Œ๋”๋งํ•˜์—ฌ ํŽ˜์ด์ง€๋ฅผ ๋น ๋ฅด๊ฒŒ ๋กœ๋“œํ•จ

  • loading.tsx๋Š” React Suspense๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ๋”ฉํ•˜๋Š” ๋™์•ˆ ํ‘œ์‹œ๋˜๋Š” ์ปดํฌ๋„ŒํŠธ
  • error.tsx๋Š” try-catch๋‚˜ ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ React์˜ ์˜ค๋ฅ˜ ๊ฒฝ๊ณ„๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ ๋ถ€๋ถ„์„ ์บก์ฒ˜ํ•˜๊ณ  ๋Œ€์ฒด UI๋ฅผ ์ œ๊ณต

Next.js์˜ fetch ์บ์‹ฑ ์ „๋žต

  1. ๊ธฐ๋ณธ ๋™์ž‘:
    • fetch๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ force-cache๋กœ ๋™์ž‘ → ๊ฐ™์€ ์š”์ฒญ์ด๋ฉด ์บ์‹œ ์žฌ์‚ฌ์šฉ (๋นŒ๋“œ ์‹œ/๋Ÿฐํƒ€์ž„ ๋ชจ๋‘).
    • ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ๋„ ์บ์‹ฑ๋˜์ง€๋งŒ, ๊ฐฑ์‹ ํ•˜๋ ค๋ฉด ์„ค์ • ํ•„์š”.
  2. cache ์˜ต์…˜:
    • force-cache: ์บ์‹œ๋œ ๋ฐ์ดํ„ฐ ์‚ฌ์šฉ (๊ธฐ๋ณธ๊ฐ’).
    • no-store: ํ•ญ์ƒ ์ƒˆ ๋ฐ์ดํ„ฐ ์š”์ฒญ (์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ์— ์ ํ•ฉ).
  3. ์žฌ๊ฒ€์ฆ (ISR):
    • next: { revalidate: ์ดˆ } → ์ฃผ๊ธฐ์ ์œผ๋กœ ์บ์‹œ ๊ฐฑ์‹ .
  4. ๋™์  ๋ฐ์ดํ„ฐ:
    • ๋™์  URL๋„ ๊ฐ๊ฐ ์บ์‹ฑ๋จ.
    • ์‹ค์‹œ๊ฐ„์„ฑ ํ•„์š”ํ•˜๋ฉด no-store ์‚ฌ์šฉ.
  5. ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ:
    • useSWR ๋“ฑ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์บ์‹ฑ/๊ฐฑ์‹  ์„ธ๋ฐ€ ์ œ์–ด ๊ฐ€๋Šฅ.
  6. ์ฃผ์˜์‚ฌํ•ญ:
    • GET๋งŒ ์บ์‹ฑ๋จ, dev ๋ชจ๋“œ์—์„œ๋Š” ์บ์‹ฑ X.
    • URL/ํ—ค๋”/์ฟผ๋ฆฌ ๊ฐ™์•„์•ผ ์บ์‹œ ์žฌ์‚ฌ์šฉ.
728x90
๋ฐ˜์‘ํ˜•