Data Fetching

ํ•™์Šตํ‚ค์›Œ๋“œ

  • Suspense

    • Streaming with Suspense

  • Client vs Server Component

Suspense

  • ์‹ค์ œ ์ฝ˜ํ…์ธ ๊ฐ€ ๋กœ๋”ฉ๋˜๋Š” ๋™์•ˆ ๋ณด์—ฌ์ฃผ๋Š” ๋Œ€์ฒด ์ฝ˜ํ…์ธ  ์˜๋ฏธ

  • React 18 ์ถ”๊ฐ€๋œ ์ปดํฌ๋„ŒํŠธ

Suspense๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์Šค์ผˆ๋ ˆํ†ค ๋ฐ ์Šคํ”ผ๋„ˆ์™€ ๊ฐ™์€ ๋กœ๋”ฉํ‘œ์‹œ๊ธฐ๋ฅผ pre-rendering ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋กœ๋”ฉ์‹œ๊ฐ„์ด ๊ธธ์–ด์ง„๋‹ค๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ํฐ ํ™”๋ฉด๋จผ ๋ณด๊ณ  ์žˆ๋Š”๊ฒƒ์ด ์•„๋‹Œ, Loading์˜ ์˜๋ฏธ์˜ UI๋ฅผ ๋ณด์—ฌ์ฃผ๋Š”๊ฒƒ์ด ๋” ๋‚˜์€ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์ œ๊ณตํ•œ๋‹ค.

<Suspense fallback={<Loading />}>
  <SomeComponent />
</Suspense>

๐Ÿ”„ SSR์˜ ๊ณผ์ •

Server Side Rendering

1. ํ•ด๋‹น ํŽ˜์ด์ง€์— ๋Œ€ํ•œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ์„œ๋ฒ„์—์„œ ๊ฐ€์ ธ์˜จ๋‹ค

2. ์„œ๋ฒ„๋Š” ํŽ˜์ด์ง€์˜ HTML์„ ๋ Œ๋”๋งํ•œ๋‹ค

3. ํŽ˜์ด์ง€์˜ HTML, CSS ๋ฐ JavaScript๊ฐ€ ํด๋ผ์ด์–ธํŠธ๋กœ ์ „์†ก๋œ๋‹ค

4. ์ƒ์„ฑ๋œ HTML ๋ฐ CSS๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋Œ€ํ™”ํ˜•(non-interactive) ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค (non-interactive : ์‚ฌ์šฉ์ž๊ฐ€ ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์—†๋Š” ์ •์ ์ธ ์ƒํƒœ)๊ฐ€ ํ‘œ์‹œ๋œ๋‹ค

5. ๋งˆ์ง€๋ง‰์œผ๋กœ, React๊ฐ€ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ hydratesํ•˜์—ฌ ์ƒํ˜ธ์ž‘์šฉ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค

์œ„ ๋‹จ๊ณ„์—์„œ suspense๋Š” 4๋ฒˆ์˜ ๋‹จ๊ณ„์—์„œ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค. ํด๋ผ์ด์–ธํŠธ(๋ธŒ๋ผ์šฐ์ €)๊ฐ€ ์„œ๋ฒ„์—์„œ ๋ฐ›์€ HTML, CSS๋กœ ์›น ํŽ˜์ด์ง€์˜ ์ดˆ๊ธฐ ๋ฒ„์ „์„ ๋กœ๋”ฉ์‹œ์ผฐ์ง€๋งŒ, ์•„์ง ์‚ฌ์šฉ์ž๋Š” ์ƒํ˜ธ ์ž‘์šฉํ•  ์ˆ˜ ์—†๋Š” ๋‹จ๊ณ„์ด๋‹ค. ์ƒํ˜ธ์ž‘์šฉ์„ ํ•˜๋ ค๋ฉด, 5๋‹จ๊ณ„์—์„œ JavaScript์™€ React์™€ ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ Hydrateํ•˜๋Š” ๊ณผ์ •์ด ๋๋‚˜์•ผ ์ƒํ˜ธ์ž‘์šฉ์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.

๐Ÿ“Œ ์ฆ‰, 4๋‹จ๊ณ„๋ถ€ํ„ฐ 5๋‹จ๊ณ„๊ฐ€ ๋๋‚˜๋Š” ๊ณผ์ •๊นŒ์ง€, ์‚ฌ์šฉ์ž๊ฐ€ ์ƒํ˜ธ์ž‘์šฉ ํ•  ์ˆ˜ ์—†๋Š” ์ •์ ํŽ˜์ด์ง€๋ฅผ ๋งˆ์ฃผํ•ด์•ผํ•˜๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒ๋˜๋Š”๋ฐ ์ด๋Ÿฌํ•œ ์‹œ๊ฐ„์— suspense๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ๋”ฉ์ค‘์ด๋ผ๋Š” UI๋ณด์—ฌ์คŒ์œผ๋กœ์„œ ๋”๋‚˜์€ UX ์ œ๊ณตํ•œ๋‹ค.

Streaming with Suspense

Server Rendering Rendering All UI

ํŽ˜์ด์ง€๊ฐ€ ์‚ฌ์šฉ์ž์—๊ฒŒ ํ‘œ์‹œ๋˜๊ธฐ ์ „์— ์„œ๋ฒ„์—์„œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ ์™„๋ฃŒ๋˜์–ด์•ผ ํ•˜๋ฏ€๋กœ ์—ฌ์ „ํžˆ ์ „์ฒด์ „์ธ UI ๋ณด์—ฌ์ฃผ๋Š” ์†๋„๊ฐ€ ๋А๋ฆด ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ŠคํŠธ๋ฆฌ๋ฐ์„ ์‚ฌ์šฉํ•˜๋ฉด ํŽ˜์ด์ง€์˜ HTML์„ ๋” ์ž‘์€ ์ฒญํฌ๋กœ ๋‚˜๋ˆ„๊ณ  ์ ์ง„์ ์œผ๋กœ ํ•ด๋‹น ์ฒญํฌ๋ฅผ ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๋กœ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค.(๋จผ์ € ์˜จ ๋ฐ์ดํ„ฐ๋Š” ๋จผ์ € ๋ณด๋‚ธ๋‹ค.)

Streaming with Suspense
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>
  );
}

๐Ÿค– Suspense๋กœ ๋น„๋™๊ธฐ ์ž‘์—…(๋ฐ์ดํ„ฐํŒจ์นญ)์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ž˜ํ•‘ํ•˜๊ณ  ํ•ด๋‹น ์ž‘์—…์ด ์ง„ํ–‰๋˜๋Š” ๋™์•ˆ ๋Œ€์ฒด UI๋ฅผ ํ‘œ์‹œํ•œ ๋‹ค์Œ ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ต์ฒดํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™

Suspense๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค

  1. ์ŠคํŠธ๋ฆฌ๋ฐ ์„œ๋ฒ„ ๋ Œ๋”๋ง - ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๋กœ HTML์„ ์ ์ง„์ ์œผ๋กœ ๋ Œ๋”๋ง ํ•œ๋‹ค.

  2. ์„ ํƒ์  ์ˆ˜ํ™” - React๋Š” ์‚ฌ์šฉ์ž ์ƒํ˜ธ์ž‘์šฉ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์–ด๋–ค ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋จผ์ € ๋Œ€ํ™”์‹์œผ๋กœ ๋งŒ๋“ค๊ฒƒ์ธ์ง€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ •ํ•œ๋‹ค.

๐Ÿ”— ์ฐธ๊ณ 

Last updated