๐Ÿคœ Next.js 14 Conf

@winuss ยท December 21, 2023 ยท 4 min read

Next.js์˜ ์ตœ์‹  ๋ฒ„์ „, Next.js 14์˜ ์ถœ์‹œ๋Š” ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์˜ ์„ธ๊ณ„์— ์ƒˆ๋กœ์šด ๋ณ€ํ™”์˜ ๋ฐ”๋žŒ์„ ๋ถˆ๋Ÿฌ์ผ์œผํ‚ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์—…๋ฐ์ดํŠธ๋Š” ๊ฐœ๋ฐœ ์†๋„์™€ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๊ทน์ ์œผ๋กœ ๊ฐœ์„ ํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ธ€์—์„œ๋Š” Next.js 14์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ๊ณผ ๊ทธ๊ฒƒ๋“ค์ด ์›น ์•ฑ ๊ฐœ๋ฐœ์— ์–ด๋–ค ์˜ํ–ฅ์„ ๋ฏธ์น ์ง€์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Next.js 14์˜ ํ˜์‹ : ๋น ๋ฅด๊ณ  ํšจ์œจ์ ์ธ ๊ฐœ๋ฐœ ๊ฒฝํ—˜

Next.js๋Š” ์›น ์•ฑ ๊ฐœ๋ฐœ์„ ์œ„ํ•œ ์ตœ๊ณ ์˜ ํ”„๋ ˆ์ž„์›Œํฌ ์ค‘ ํ•˜๋‚˜๋กœ ์ž๋ฆฌ ์žก์•˜์œผ๋ฉฐ, Next.js 14๋Š” ์ด๋Ÿฌํ•œ ์œ„์น˜๋ฅผ ๋”์šฑ ๊ณต๊ณ ํžˆ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฒ„์ „์—์„œ๋Š” ํŠนํžˆ ์„ธ ๊ฐ€์ง€ ์ฃผ์š” ๊ธฐ๋Šฅ์ด ๋ˆˆ์— ๋•๋‹ˆ๋‹ค.

  1. Turbopack: ์†๋„์™€ ํšจ์œจ์„ฑ์˜ ์ƒˆ๋กœ์šด ๊ธฐ์ค€ Turbopack์€ ๋กœ์ปฌ ์„œ๋ฒ„ ์‹œ์ž‘ ์‹œ๊ฐ„์„ ์ตœ๋Œ€ 53%๊นŒ์ง€ ๋‹จ์ถ•ํ•˜๊ณ , ์ฝ”๋“œ ์—…๋ฐ์ดํŠธ ์‹œ๊ฐ„์„ 94%๋‚˜ ์ค„์—ฌ์ค๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ€ํ•œ ์‹ค์ œ ๋ฒค์น˜๋งˆํฌ ๊ฒฐ๊ณผ๋กœ, Next.js์˜ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ๋ช…ํ™•ํžˆ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
  2. Server Actions: ๊ฐ„๊ฒฐํ•˜๊ณ  ํšจ์œจ์ ์ธ ๋ฐฑ์—”๋“œ ํ†ตํ•ฉ Server Actions๋Š” ๋ฐฑ์—”๋“œ ์—”๋“œํฌ์ธํŠธ ๊ตฌ์ถ•์„ ๊ฐ„์†Œํ™”ํ•˜๊ณ , ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๋Š” API ๊ฒฝ๋กœ๋ฅผ ์ˆ˜๋™์œผ๋กœ ์ƒ์„ฑํ•  ํ•„์š” ์—†์ด, React ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ์ง์ ‘ ์„œ๋ฒ„์—์„œ ์‹คํ–‰๋˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. ๋ถ€๋ถ„์  Pre-rendering: ๋น ๋ฅธ ์ดˆ๊ธฐ ์‘๋‹ต๊ณผ ๋™์  ์ฝ˜ํ…์ธ  Next.js์˜ ์ƒˆ๋กœ์šด ๋ถ€๋ถ„์  pre-rendering ๊ธฐ๋Šฅ์€ ์ดˆ๊ธฐ ์ •์  ์‘๋‹ต๊ณผ ๋™์  ์ฝ˜ํ…์ธ  ์ŠคํŠธ๋ฆฌ๋ฐ์„ ์กฐํ™”๋กญ๊ฒŒ ๊ฒฐํ•ฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ๋” ๋น ๋ฅธ ํŽ˜์ด์ง€ ๋กœ๋”ฉ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•˜๋ฉด์„œ ๋™์‹œ์— ๋™์ ์ธ ์ฝ˜ํ…์ธ ๋ฅผ ์œ ์—ฐํ•˜๊ฒŒ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
npx create-next-app@latest

๊ฐœ๋ฐœ์˜ ํŽธ์˜์„ฑ: ๋” ์‰ฌ์›Œ์ง„ Next.js ๊ฐœ๋ฐœ ๊ฒฝํ—˜

Next.js 14๋Š” ๊ฐœ๋ฐœ์ž๋“ค์ด ๋ณด๋‹ค ๋น ๋ฅด๊ณ  ํšจ์œจ์ ์œผ๋กœ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํŽธ์˜์„ฑ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค:

  • ํ†ตํ•ฉ๋œ ์บ์‹ฑ ๋ฐ ์žฌ๊ฒ€์ฆ: ๋ฐ์ดํ„ฐ์˜ ์œ ํšจ์„ฑ์„ ๋น ๋ฅด๊ฒŒ ํ™•์ธํ•˜๊ณ  ์บ์‹œ๋œ ์ฝ˜ํ…์ธ ๋ฅผ ์ตœ์‹  ์ƒํƒœ๋กœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐ„๋‹จํ•œ ํ•จ์ˆ˜ ํ˜ธ์ถœ: ์„œ๋ฒ„ ์ž‘์—…์„ ์œ„ํ•œ ๋ณต์žกํ•œ ์„ค์ • ์—†์ด ๊ฐ„๋‹จํ•œ ํ•จ์ˆ˜ ํ˜ธ์ถœ๋กœ ๋ฐฑ์—”๋“œ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ณด๋‹ค ํšจ์œจ์ ์ธ ์ฝ”๋“œ ์ž‘์„ฑ: ๊ฐœ๋ฐœ์ž๋“ค์€ ์ฝ”๋“œ ์ž‘์„ฑ ์‹œ๊ฐ„์„ ์ค„์ด๊ณ , ๋” ์ง๊ด€์ ์ธ ๋ฐฉ์‹์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Server Action: ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ์˜ ๊ฐ„ํŽธํ•œ ํ†ตํ•ฉ

Server Action์€ ๋ฐฑ์—”๋“œ ๊ธฐ๋Šฅ์„ ํ”„๋ก ํŠธ์—”๋“œ ์ปดํฌ๋„ŒํŠธ์— ์ง์ ‘ ํ†ตํ•ฉํ•จ์œผ๋กœ์จ ๊ฐœ๋ฐœ์ž๋“ค์ด ๋”์šฑ ์ง๊ด€์ ์œผ๋กœ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ Next.js๊ฐ€ React Canary ์ฑ„๋„์˜ ์•ˆ์ •์„ฑ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜์—ฌ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ฑ„ํƒํ•˜๋Š” ๋ฐฉ์‹์„ ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค.

export default function Page() {
  async function create(formData: FormData) {
    "use server"
    const id = await createItem(formData)
  }

  return (
    <form action={create}>
      <input type="text" name="name" />
      <button type="submit">Submit</button>
    </form>
  )
}

์–‘์‹ ์ œ์ถœ ์‹œ ์„œ๋ฒ„์—์„œ ์‹คํ–‰๋˜๋Š” processFormData ํ•จ์ˆ˜๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ธฐ์กด์˜ ๋ณต์žกํ•œ API ๊ฒฝ๋กœ ์„ค์ • ์—†์ด ์„œ๋ฒ„ ๋กœ์ง์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ํ˜์‹ ์ ์ธ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

Server Action์˜ ์žฅ์ 

  • ๊ฐ„๊ฒฐ์„ฑ: React ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ์„œ๋ฒ„ ์ž‘์—…์„ ์ง์ ‘ ์ •์˜ํ•จ์œผ๋กœ์จ ์ฝ”๋“œ๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํƒ€์ž… ์•ˆ์ „์„ฑ: TypeScript๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„ ์™„๋ฒฝํ•œ ํƒ€์ž… ์•ˆ์ „์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ํšจ์œจ์ ์ธ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ: ๋‹จ์ผ ๋„คํŠธ์›Œํฌ ์™•๋ณต์œผ๋กœ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ, ํŽ˜์ด์ง€ ๋ฆฌ๋ Œ๋”๋ง ๋˜๋Š” ๋ฆฌ๋‹ค์ด๋ ‰์…˜์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์žฌ์‚ฌ์šฉ์„ฑ: ๋‹ค์–‘ํ•œ ์ž‘์—…์„ ๊ตฌ์„ฑํ•˜๊ณ  ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด ๊ฐœ๋ฐœ ๊ณผ์ •์„ ํšจ์œจ์ ์œผ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

Server Action์€ ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ ๊ฒฝํ—˜์ด ์žˆ๋Š” ๊ฐœ๋ฐœ์ž๋“ค์—๊ฒŒ ์นœ์ˆ™ํ•˜๋ฉด์„œ๋„, ์›น์˜ ๊ธฐ๋ณธ ์‚ฌํ•ญ์ธ Form๊ณผ FormData Web API๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒˆ๋กœ์šด ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์€ ๊ฐœ๋ฐœ์ž๋“ค์ด Next.js๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณด๋‹ค ์‹ ์†ํ•˜๊ณ  ํšจ๊ณผ์ ์œผ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ค๋‹ˆ๋‹ค.

๋ถ€๋ถ„์  Pre-rendering

Next.js๋ฅผ ์œ„ํ•ด ์ž‘์—… ์ค‘์ธ ๋ถ€๋ถ„ pre-rendering(๋น ๋ฅธ ์ดˆ๊ธฐ ์ •์  ์‘๋‹ต์„ ๊ฐ–์ถ˜ ๋™์  ์ฝ˜ํ…์ธ ์— ๋Œ€ํ•œ ์ปดํŒŒ์ผ๋Ÿฌ ์ตœ์ ํ™”)์˜ ๋ฏธ๋ฆฌ ๋ณด๊ธฐ๋ฅผ ์ œ๊ณตํ•˜๊ณ , pre-rendering์€ ์„œ๋ฒ„์ธก ๋ Œ๋”๋ง(SSR), ์ •์  ์‚ฌ์ดํŠธ ์ƒ์„ฑ(SSG) ๋ฐ ์ฆ๋ถ„์  ์ •์  ์žฌ๊ฒ€์ฆ(ISR)์— ๋Œ€ํ•œ 10๋…„ ๊ฐ„์˜ ์—ฐ๊ตฌ ๊ฐœ๋ฐœ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์ถ•๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

React Suspense๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์ถ•

๋ถ€๋ถ„ ์‚ฌ์ „ ๋ Œ๋”๋ง์€ Suspense ๊ฒฝ๊ณ„์— ๋”ฐ๋ผ ์ •์˜๋ฉ๋‹ˆ๋‹ค.

export default function Page() {
  return (
    <main>
      <header>
        <h1>My Store</h1>
        <Suspense fallback={<CartSkeleton />}>
          <ShoppingCart />
        </Suspense>
      </header>
      <Banner />
      <Suspense fallback={<ProductListSkeleton />}>
        <Recommendations />
      </Suspense>
      <NewProducts />
    </main>
  )
}

pre-rendering์ด ํ™œ์„ฑํ™”๋˜๋ฉด ์ด ํŽ˜์ด์ง€๋Š” <Suspense /> boundary๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ •์  ์…ธ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. React Suspense์˜ fallback์€ ์‚ฌ์ „ ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ ์…ธ์˜ Suspense fallback์€ cookie๋ฅผ ์ฝ์–ด ์นดํŠธ๋ฅผ ๊ฒฐ์ •ํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉ์ž๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐฐ๋„ˆ๋ฅผ ํ‘œ์‹œํ•˜๋Š” ๋“ฑ์˜ ๋™์  ์ปดํฌ๋„ŒํŠธ๋กœ ๋Œ€์ฒด๋ฉ๋‹ˆ๋‹ค.

์š”์ฒญ์ด ์ด๋ฃจ์–ด์ง€๋ฉด ์ •์  HTML ์…ธ์ด ์ฆ‰์‹œ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

<main>
  <header>
    <h1>My Store</h1>
    <div class="cart-skeleton">
      <!-- Hole -->
    </div>
  </header>
  <div class="banner" />
  <div class="product-list-skeleton">
    <!-- Hole -->
  </div>
  <section class="new-products" />
</main>

<ShoppingCart />๋Š” ์ฟ ํ‚ค์—์„œ ์ฝ์–ด ์‚ฌ์šฉ์ž session์„ ํ™•์ธํ•˜๋ฏ€๋กœ ์ด ์ปดํฌ๋„ŒํŠธ๋Š” ์ •์  ์…ธ๊ณผ ๋™์ผํ•œ HTTP ์š”์ฒญ์˜ ์ผ๋ถ€๋กœ ์ŠคํŠธ๋ฆฌ๋ฐ๋ฉ๋‹ˆ๋‹ค. ์ถ”๊ฐ€ ๋„คํŠธ์›Œํฌ ์™•๋ณต์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

import { cookies } from 'next/headers'

export default function ShoppingCart() {
  const cookieStore = cookies()
  const session = cookieStore.get('session')
  return ...
}

๊ฐ€์žฅ ์„ธ๋ถ€์ ์ธ ์ •์  ์…ธ์„ ๊ฐ€์ง€๋ ค๋ฉด Suspense boundary๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ˜„์žฌ loading.js๋ฅผ ์ด๋ฏธ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ์ด๋Š” ์•”์‹œ์ ์ธ Suspense boundray์ด๋ฏ€๋กœ ์ •์  ์…ธ์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๊ฐœ์„ 

๋ทฐํฌํŠธ, ์ƒ‰ ๊ตฌ์„ฑํ‘œ ๋ฐ ํ…Œ๋งˆ์— ๋Œ€ํ•œ ์ค‘์š”ํ•œ ํŽ˜์ด์ง€ ์ฝ˜ํ…์ธ ๋ฅผ ์„œ๋ฒ„์—์„œ ์ŠคํŠธ๋ฆฌ๋ฐํ•˜๊ธฐ ์ „์— ๋จผ์ € ๋ธŒ๋ผ์šฐ์ €์— ์ „์†กํ•ด์•ผ ํ•˜๋Š” ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ meta ํƒœ๊ทธ๊ฐ€ ์ดˆ๊ธฐ ํŽ˜์ด์ง€ ์ฝ˜ํ…์ธ ์™€ ํ•จ๊ป˜ ์ „์†ก๋˜๋„๋ก ํ•˜๋ฉด ์›ํ™œํ•œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์— ๋„์›€์ด ๋˜๋ฉฐ, ํ…Œ๋งˆ ์ƒ‰์ƒ์„ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ๋ทฐํฌํŠธ ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด ๋ ˆ์ด์•„์›ƒ์ด ์ด๋™ํ•˜์—ฌ ํŽ˜์ด์ง€๊ฐ€ ๊นœ๋ฐ•์ด๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Next.js 14์—์„œ๋Š” blocking ๋ฐ non-blocking ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์˜ต์…˜์˜ ์ž‘์€ ํ•˜์œ„ ์ง‘ํ•ฉ(small subset)๋งŒ ์ฐจ๋‹จ๋˜๋ฉฐ, ์šฐ๋ฆฌ๋Š” non-blocking ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๊ฐ€ ๋ถ€๋ถ„์ ์œผ๋กœ pre-rendering๋œ ํŽ˜์ด์ง€๊ฐ€ ์ •์  ์…ธ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉํ•ดํ•˜์ง€ ์•Š๋„๋ก ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์˜ต์…˜์€ ์ด์ œ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์œผ๋ฉฐ ํ–ฅํ›„ ์ฃผ์š” ๋ฒ„์ „์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์—์„œ ์ œ๊ฑฐ(deprecated)๋  ์˜ˆ์ • ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

  • viewport: ๋ทฐํฌํŠธ์˜ ์ดˆ๊ธฐ ํ™•๋Œ€/์ถ•์†Œ ๋ฐ ๊ธฐํƒ€ ์†์„ฑ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • colorScheme: ๋ทฐํฌํŠธ์˜ ์ง€์› ๋ชจ๋“œ(๋ฐ์Œ/์–ด๋‘์›€)๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • themeColor: ๋ทฐํฌํŠธ ์ฃผ๋ณ€์˜ ํฌ๋กฌ์ด ๋ Œ๋”๋งํ•ด์•ผ ํ•˜๋Š” ์ƒ‰์ƒ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. Next.js 14๋ถ€ํ„ฐ ์ด๋Ÿฌํ•œ ์˜ต์…˜์„ ๋Œ€์ฒดํ•˜๋Š” ์ƒˆ๋กœ์šด ์˜ต์…˜ viewport ๋ฐ generateViewport๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ชจ๋“  ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์˜ต์…˜์€ ๋™์ผํ•˜๊ฒŒ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

๋งˆ์น˜๋ฉฐ

turobopack๊ณผ pre-rendering ์€ ๊ธฐ๋Œ€๊ฐ€ ๋˜๋Š” ๋ถ€๋ถ„์ด๊ธด ํ•˜์ง€๋งŒ, ServerActions์€ ์‹ฌํ”Œํ•ด ๋ณด์ด๊ธด ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ ์“ฐ๋ฉด ์ฝ”๋“œ๊ฐ€ ์ง€์ €๋ถ„ํ•ด ์งˆ๊ฒƒ ๊ฐ™์€๋ฐ ์ด๊ฒŒ ๋งž๋‚˜ ์‹ถ์€ ๋Š๋‚Œ์ด ๋“ค๊ธฐ๋„ ํ•˜๋„ค์š”. ์•„๋ฌดํŠผ ํ”„๋ก ํŠธ์—”๋“œ์˜ ๋ณ€ํ™” ์†๋„๋Š” ์ •๋ง ๋น ๋ฅธ๊ฒƒ ๊ฐ™๋‹ค๋Š” ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค.

@winuss
Hello :) Developer notes!