NextJS - Routing/Loading UI and Streaming

Hunter Joeยท2025๋…„ 1์›” 30์ผ
0

๐Ÿ“ŒLoading UI and Streaming

  • loading.js๋Š” React Suspense๋ฅผ ์‚ฌ์šฉํ•ด ๋กœ๋”ฉ UI๋ฅผ ๋งŒ๋“œ๋Š”๋ฐ ๋„์›€์ด ๋œ๋‹ค.
    ์ด ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๋ฉด, Segment ๋‚ด ์ปจํ…์ธ ๊ฐ€ ๋กœ๋“œ๋˜๋Š” ๋™์•ˆ ์ฆ‰์‹œ ๋กœ๋”ฉ UI๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ƒˆ๋กœ์šด ์ปจํ…์ธ ๊ฐ€ ๋ Œ๋”๋ง์„ ์™„๋ฃŒํ•˜๋ฉด, ์ž๋™์œผ๋กœ ๊ธฐ์กด ๋กœ๋”ฉ UI์™€ ๊ต์ฒด ๋œ๋‹ค.

๐Ÿ“ŒInstant Loading States

โœ… ์ฆ‰์‹œ ๋กœ๋”ฉ ์ƒํƒœ๋ž€?

  • ๋‚ด๋น„๊ฒŒ์ด์…˜ ์‹œ ์ฆ‰์‹œ ํ‘œ์‹œ๋˜๋Š” ๋Œ€์ฒด UI(Fallback UI) ๋ฅผ ์˜๋ฏธ
  • Ex) ์Šค์ผˆ๋ ˆํ†ค UI(Skeleton UI), ์Šคํ”ผ๋„ˆ(Spinner), ํ‘œ์ง€ ์ด๋ฏธ์ง€, ์ œ๋ชฉ ๋“ฑ

โœ… ์™œ ํ•„์š”ํ• ๊นŒ?

  • ์‚ฌ์šฉ์ž๊ฐ€ ์•ฑ์ด ๋ฐ˜์‘ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๋Š๋‚Œ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์คŒ.
    ์ฆ‰, ๋ฐ์ดํ„ฐ๊ฐ€ ๋กœ๋“œ๋˜๋Š” ๋™์•ˆ ๋นˆ ํ™”๋ฉด ๋Œ€์‹  ๋ฏธ๋ฆฌ ์ค€๋น„๋œ UI๋ฅผ ๋ณด์—ฌ์คŒ์œผ๋กœ์จ UX๋ฅผ ํ–ฅ์ƒ์‹œํ‚ด.
// app/dashboard/loading.tsx
export default function Loading() {
  // You can add any UI inside Loading, including a Skeleton.
  return <LoadingSkeleton />
}
  • loading.js๋Š” ๋™์ผํ•œ ํด๋” ๋‚ด์˜layout.js๋‚ด๋ถ€์— ์ค‘์ฒฉ(Nested)๋œ๋‹ค.
  • ์ž๋™์œผ๋กœ page.js ๋ฐ ํ•ด๋‹น ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋“ค์„ <suspense> ๊ฒฝ๊ณ„ ์•ˆ์— wrapํ•œ๋‹ค.
    โ†’ ํŠน์ • segment ๋ฐ์ดํ„ฐ๊ฐ€ ๋กœ๋“œ๋˜๋Š” ๋™์•ˆ loading.js์—์„œ ์ •์˜ํ•œ ๋กœ๋”ฉ UI๊ฐ€ ๋จผ์ € ํ‘œ์‹œ๋˜๋ฉฐ, ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ์ด ์™„๋ฃŒ๋˜๋ฉด ์ž๋™์œผ๋กœ ์ƒˆ๋กœ์šด ์ปจํ…์ธ ์™€ ๊ต์ฒด๋œ๋‹ค.

Good to know

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

๊ถŒ์žฅ ์‚ฌํ•ญ

  • loading.jsํŒŒ์ผ์„ ์‚ฌ์šฉํ•ด ๋ ˆ์ด์•„์›ƒ ๋ฐ ํŽ˜์ด์ง€์˜ ๊ฒฝ๋กœ(Segment)์— ๋กœ๋”ฉ UI๋ฅผ ์ถ”๊ฐ€ํ•  ๊ฒƒ
    Next.js๋Š” ์ด๋ฅผ ์ž๋™์œผ๋กœ ์ตœ์ ํ™”ํ•จ

๐Ÿ“ŒStreaming with Suspense

  • loading.js์™ธ์—๋„, ์ง์ ‘ Suspense ๊ฒฝ๊ณ„๋ฅผ ์ƒ์„ฑํ•ด ํŠน์ • UI ์ปดํฌ๋„ŒํŠธ์˜ ๋กœ์ง ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • App Router๋Š” Suspense๋ฅผ ํ™œ์šฉํ•œ Streaming์„ ์ง€์›ํ•œ๋‹ค.
    โ†’ ์ฆ‰, ํŽ˜์ด์ง€ ์ „์ฒด๊ฐ€ ์•„๋‹Œ ๊ฐœ๋ณ„ ์ปดํฌ๋„ŒํŠธ์—์„œ๋„ suspense๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ์ด ๋๋‚˜๋Š” ๋Œ€๋กœ ๋ Œ๋”๋ง์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

What is Streaming?

  • ์ŠคํŠธ๋ฆฌ๋ฐ์ด๋ž€ ์„œ๋ฒ„์—์„œ ํด๋ผ์–ด์–ธํŠธ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ๋ฒˆ์— ์ „์†กํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ
    ์ค€๋น„๋œ ๋ถ€๋ถ„๋ถ€ํ„ฐ ์ฆ‰์‹œ ๋ Œ๋”๋งํ•˜๋ฉด์„œ ์ ์ง„์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹
    (ํŽ˜์ด์ง€์˜ HTML์„ ์ž‘์€ ์ฒญํฌ๋กœ ๋ถ„๋ฆฌํ•ด ์ ์ง„์ ์œผ๋กœ server โ†’ client๋กœ ๋ณด๋‚ธ๋‹ค.)
  • Streaming์„ ์ดํ•ดํ•˜๋ ค๋ฉด ๋จผ์ € ๊ธฐ์กด์˜ SSR ๋ฐฉ์‹๊ณผ ๊ทธ ํ•œ๊ณ„๋ฅผ ์•Œ์•„์•ผ ํ•œ๋‹ค.

๊ธฐ์กด SSR(Server-Side Rendering)์˜ ํ•œ๊ณ„

  • SSR์—์„œ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ํŽ˜์ด์ง€๋ฅผ ๋ณด๊ณ  ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ๊นŒ์ง€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹จ๊ณ„๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
  1. ์„œ๋ฒ„์—์„œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ด
  2. ์„œ๋ฒ„๊ฐ€ HTML์„ ๋ Œ๋”๋งํ•จ
  3. HTML, CSS, JavaScript๋ฅผ ํด๋ผ์ด์–ธํŠธ๋กœ ์ „์†กํ•จ
  4. HTML๊ณผ CSS๋ฅผ ์‚ฌ์šฉํ•ด ๋น„์ƒํ˜ธ์ž‘์šฉ(non-interactive)์ƒํƒœ์˜ UI๊ฐ€ ๋จผ์ € ๋ Œ๋”๋ง๋œ๋‹ค.
  5. Hydration์„ ์‚ฌ์šฉํ•ด UI์™€ ์ƒํ˜ธ์ž‘์šฉ์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค.

Streaming์˜ ์žฅ์ 

  • streaming์€ ๊ธด ๋ฐ์ดํ„ฐ ์š”์ฒญ์œผ๋กœ ์ธํ•ด ํŽ˜์ด์ง€ ๋ Œ๋”๋ง์ด ์ง€์—ฐ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐ ์œ ์šฉํ•˜๋‹ค.
  • TTFB, FCP์„ ๋‹จ์ถ•ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋Š๋ฆฐ ์žฅ์น˜์—์„œ๋„ ์ƒํ˜ธ์ž‘์šฉ ๊ฐ€๋Šฅ ์‹œ๊ฐ„ (TTI)๋ฅผ ๊ฐœ์„ ํ•˜๋Š”๋ฐ ๋„์›€์ด ๋จ.
  • Selective Hydration(์„ ํƒ์  ์ˆ˜ํ™”) : React๋Š” ์‚ฌ์šฉ์ž ์ƒํ˜ธ์ž‘์šฉ(User Interaction)์— ๋”ฐ๋ผ ์–ด๋–ค ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋จผ์ € ์ƒํ˜ธ์ž‘์šฉ์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ• ์ง€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ •ํ•œ๋‹ค.
// app/dashboard/page.tsx
import { Suspense } from 'react'
import { PostFeed, Weather } from './Components'
 
export default function Posts() {
  return (
    <section>
      <Suspense fallback={<p>Loading feed...</p>}>
        <PostFeed />
      </Suspense>
      <Suspense fallback={<p>Loading weather...</p>}>
        <Weather />
      </Suspense>
    </section>
  )
}
profile
Async FE ์ทจ์—… ์ค€๋น„์ค‘.. Await .. (์ทจ์—…์™„๋ฃŒ ๋Œ€๊ธฐ์ค‘) ..

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

๊ด€๋ จ ์ฑ„์šฉ ์ •๋ณด