useTransition, uesDeferredValue

  • useTransition ํ›…์„ ์‚ฌ์šฉํ•ด UI ๊ฐฑ์‹ ์„ ์ง€์—ฐ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•

  • isPending ๋ถˆ๋ฆฐ ๊ฐ’์„ ์‚ฌ์šฉํ•ด ์ผ๊ด€์„ฑ ์—†๋Š” ์ƒํƒœ์™€ UI์— ๋Œ€ํ•œ ํ”Œ๋ž˜๊ทธ๋ฅผ ๋‚จ๊ธฐ๋Š” ๋ฐฉ๋ฒ•

  • useDefferedValue ํ›…์„ ์‚ฌ์šฉํ•ด ์˜ˆ์ „ ๊ฐ’๊ณผ ์ƒˆ๋กœ์šด ๊ฐ’์„ ๋™์‹œ์— ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

  • SuspenseList ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•ด ์—ฌ๋Ÿฌ ํด๋ฐฑ UI๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•

  • ๋™์‹œ์„ฑ ๋ Œ๋”๋ง์ด ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ ์ดํ•ดํ•˜๊ธฐ

Ref

๋™์‹œ์„ฑ ๋ชจ๋“œ

  • ๋™์‹œ์„ฑ ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฆฌ์•กํŠธ๊ฐ€ ๋™์‹œ์— ์—ฌ๋Ÿฌ ๋ฒ„์ „์˜ UI๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋ Œ๋”๋งํ•˜๊ณ  ํ˜„์žฌ ์ƒํƒœ์— ๊ฐ€์žฅ ์ ํ•ฉํ•œ ๋ฒ„์ „๋งŒ DOM์— ๊ฐฑ์‹ ํ•œ๋‹ค.

  • ํ˜„์žฌ ์ƒํƒœ์˜ ๊ฐฑ์‹ ์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ์‹œ๊ฐ„์ด ๊ฑธ๋ ค๋„ ์ด์ „ ๋ฒ„์ „์˜ UI๋ฅผ DOM์— ํ‘œ์‹œ ๊ฐ€๋Šฅ

  • ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋” ๋†’์€ ๊ฐฑ์‹ (์‚ฌ์šฉ์ž ์ธํ„ฐ๋ ‰์…˜)์ด ์ด๋ค„์ง€๋Š” ๋™์•ˆ ๋ฆฌ์•กํŠธ๊ฐ€ ๋ Œ๋”๋ง์„ ์ผ์‹œ์ค‘๋‹จ ๊ฐ€๋Šฅ

  • ์ด๋Ÿฐ ์œ ์—ฐ์„ฑ์€ ์•ฑ์˜ ๋ฐ˜์‘์„ฑ์„ ์œ ์ง€ํ•˜๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ์ธ์ง€ํ•˜๋Š” ์•ฑ์˜ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•˜๋Š”๋ฐ ๋„์›€์ด ๋œ๋‹ค.

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

๋™์‹œ์„ฑ ๋ Œ๋”๋ง

๋ฆฌ์—‘ํŠธ๊ฐ€ ํ•œ ๋ฒˆ์— ์—ฌ๋Ÿฌ ๋ฒ„์ „์˜ UI์—์„œ ์ž‘๋™ํ•˜๊ฒŒ ํ•˜๋Š”๋ฐ, ์ƒˆ ๋ฒ„์ „์ด ์ค€๋น„๋  ๋•Œ๊นŒ์ง€ ์™„์ „ํžˆ ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ด์ „ ๋ฒ„์ „์„ ํ‘œ์‹œํ•œ๋‹ค.

  • ์ฆ‰, ๋‹จ๊ธฐ์ ์œผ๋กœ ์ตœ์‹  ์ƒํƒœ๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์˜ ํ˜„์žฌ UI์™€ ์ผ์น˜ํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ๋œป

  • ๋™์‹œ์„ฑ ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์•ฑ์ด ์ดˆ๊ธฐ์— ๋ธŒ๋ผ์šฐ์ €์— ๋ Œ๋”๋ง๋˜๋Š” ๋ฐฉ์‹์„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค.

// React ํ•œ์ •
const root = document.getElementById('root');
ReactDOM.createRoot(root).render(<App />);

๋ชฉํ‘œ๋Š” ์•ฑ์˜ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ํ–ฅ์ƒํ•˜๊ณ  ์•ฑ์ด ๋” ๋ฐ˜์‘์ ์œผ๋กœ ๋Š๊ปด์ง€๊ฒŒ ๋งŒ๋“ค๊ณ , ๊ฐฑ์‹ ์„ ์กฐ์œจํ•ด ์‚ฌ์šฉ์ž๊ฐ€ ๋ฌด์—‡์ด ์˜ค๋ž˜๋๊ณ  ๋ฌด์—‡์ด ๊ฐฑ์‹  ์ค‘์ด๋ฉฐ ๋ฌด์—‡์ด ์ตœ์‹  ๋‚ด์šฉ์ธ์ง€ ์ฆ‰์‹œ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š”๊ฒƒ

useTransition, useDeferredValue ํ›…

์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ƒˆ ๋ฐ์ดํ„ฐ๋ฅผ ์ ์žฌํ•˜๊ฑฐ๋‚˜ ์ƒˆ ๊ฐ’์„ ๊ณ„์‚ฐํ•˜๋Š” ๋™์•ˆ ๋ฆฌ์•กํŠธ๊ฐ€ ์ด์ „ UI๋‚˜ ์ด์ „ ๊ฐ’์„ ๊ณ„์† ํ‘œ์‹œํ•˜๋„๋ก ํ—ˆ์šฉ

  • ํ›„ํ‡ด ์ƒํƒœ(receded state)๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š”๋ฐ ๋„์›€์ด ๋˜๊ธฐ ๋•Œ๋ฌธ

    • ๋ฆฌ์—‘ํŠธ๊ฐ€ ์œ ์šฉํ•˜๊ณ  ์ƒํ˜ธ์ž‘์šฉ์ด ๊ฐ€๋Šฅํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ด์ „์˜ ์ ์žฌ ์ค‘ ์ƒํƒœ๋กœ(์‹ค์ˆ˜๋กœ) ์ „ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ ์ด๋ฅผ ๋น„์ •์ƒ์ ์ธ ์ƒํƒœ๋ผ๊ณ  ๋งํ•จ

    • ex: ์‚ฌ์šฉ์ž ๋ชฉ๋ก์—์„œ ์ƒˆ๋กœ์šด ์‚ฌ์šฉ์ž๋ฅผ ์„ ํƒํ•˜๋ฉด ์‚ฌ์šฉ์ž ์ƒ์„ธ ์ •๋ณด ํŒจ๋„์„ ์Šคํ”ผ๋„ˆ๋กœ ๋Œ€์ฒดํ•œ๋‹ค. ์ด๋Š” ์ด์ „์œผ๋กœ ๋˜๋Œ์•„๊ฐ€๋Š” ๋Š๋‚Œ์ด ๋“ค๊ธฐ ๋•Œ๋ฌธ์— ์•ฝ๊ฐ„ ์ถฉ๊ฒฉ์ , ์ด๋Ÿฐ ์ƒํƒœ๋ฅผ ํ›„ํ‡ด ์ƒํƒœ๋ผ ๋ถ€๋ฅธ๋‹ค.

    • ์›์น˜ ์•Š๋Š” ๋กœ๋”ฉ์„ ํ‘œ์‹œ X

useTransition์„ ์‚ฌ์šฉํ•ด ํ›„ํ‡ด ์ƒํƒœ ํ”ผํ•˜๊ธฐ

์Šคํ”ผ๋„ˆ๋กœ ๋‹ค์‹œ ๋Œ์•„๊ฐ€์ง€ ์•Š๊ณ  ์ด์ „ UI ์ •๋ณด๋ฅผ ๊ณ„์† ํ‘œ์‹œ "startTransition์€ UI๋ฅผ Blocking ์•Š๊ณ  ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค."

  • ์ƒํƒœ ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ผ์‹œ์ค‘๋‹จ๋  ๋•Œ ๋ฆฌ์—‘ํŠธ๊ฐ€ ์ด์ „ UI๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๋„๋ก useTransition ํ›…์„ ์‚ฌ์šฉ

const UserPage = () => {
  const [loggedInUser] = useUser();
  const [selectedUser, setSelectedUser] = useState(null);
  const user = selectedUser || loggedInUser;
  const queryClient = useQueryClient();
  const [startTransition] = useTransition(); // startTransition ํ•จ์ˆ˜ get
  
  const switchUser = (nextUser: User) => {
    startTransition(() => setSelectedUser(nextUser)); // ์‚ฌ์šฉ์ž ์ƒํƒœ ๋ณ€๊ฒฝ์„ ์ „ํ™˜์œผ๋กœ ๊ฐ์Œˆ
    // queryClient.prefetchQuery('์‚ฌ์šฉ์ž ์ƒ์„ธ ์ •๋ณด ๋ฏธ๋ฆฌ ์ฝ์–ด์˜ค๊ธฐ');
    // queryClient.prefetchQuery('์‚ฌ์šฉ์ž ์ด๋ฏธ์ง€ ๋ฏธ๋ฆฌ ์ฝ์–ด์˜ค๊ธฐ');
  }
  
  return user 
    ? <Susepense fallback={<PageSpinner/>}>
        <UserDetails userID={user.id}/>
      </Suspense>
    : <PageSpinner />  
}
  • useTransition ํ›…์€ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ผ์‹œ์ค‘๋‹จ๋  ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ ๋ณ€๊ฒฝ์„ ๊ฐ์Œ€ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ํฌํ•จ๋œ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜

  • ์ƒˆ ๋ฐ์ดํ„ฐ ์ ์žฌ์— ์˜ค๋žœ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค๋ฉด, ์‚ฌ์šฉ์ž๊ฐ€ ์ด์ „ UI๋ฅผ ๋ณด๋ฉด์„œ ํ˜ผ๋ž€์— ๋น ์งˆ์ˆ˜ ์žˆ๋‹ค.

    • ๋”ฐ๋ผ์„œ ์•ฑ์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ ์žฌํ•˜๋Š๋ผ ๋ฐ”์˜๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ๋ ค์ฃผ๊ธฐ ์œ„ํ•ด ๋ช‡๊ฐ€์ง€ ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•ด์•ผ ํ•œ๋‹ค.

const [startTransition] = useTransition();

์ƒํƒœ ๋ณ€๊ฒฝ ์‹œ ์Šคํ”ผ๋„ˆ๋กœ ๋‹ค์‹œ ๋Œ์•„๊ฐ€์ง€ ์•Š๋Š” ๊ฒƒ์€ ์ƒˆ๋กœ์šด ์ƒํƒœ ๋ฐ์ดํ„ฐ์— ์ ์žฌ์— ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ์ง€ ์•Š๋Š” ํ•œ ๊ฐœ์„ ์ด๋ผ ํ•  ์ˆ˜ ์žˆ๋‹ค. (์ฆ‰, ์Šคํ”ผ๋„ˆ ์ฐ”๋” ํ‘œ์‹œ ๊ฐ™์€ ์ƒํ™ฉ)

Transition์€ ์ด๋ฏธ ํ‘œ์‹œ๋œ ์ฝ˜ํ…์ธ (์˜ˆ์‹œ: ํƒญ ์ปจํ…Œ์ด๋„ˆ)๋ฅผ ์ˆจ๊ธฐ์ง€ ์•Š์„ ๋งŒํผ๋งŒ โ€œ๋Œ€๊ธฐโ€ํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ Posts ํƒญ์— ์ค‘์ฒฉ๋œ <Suspense> ๊ฒฝ๊ณ„๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ Transition ์€ ์ด๋ฅผ โ€œ๋Œ€๊ธฐโ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

isPending์„ ์‚ฌ์šฉํ•ด ์‚ฌ์šฉ์ž์—๊ฒŒ ํ”ผ๋“œ๋ฐฑ ์ œ๊ณตํ•˜๊ธฐ

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

  • ex: ์ ์žฌ์ค‘์ธ ํŒจ๋„์˜ ๋ถˆํˆฌ๋ช…๋„๋ฅผ ์ค„์—ฌ์„œ ์˜ค๋ž˜๋์Œ์„ ๋ณด์—ฌ์ฃผ๋Š” ๋“ฑ..

    • ์Šคํ”ผ๋„ˆ๋กœ ํ›„ํ‡ดํ•˜์ง€ ์•Š๊ณ  ํ™”๋ฉด์— ์ „ํ™˜์ค‘์ž„์„ ํ‘œ์‹œํ•˜๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜

const [isPending, startTransition] = useTransition()
  • ์ด์ „ UI๋ฅผ ๊ณ„์† ๋ณด์—ฌ์ฃผ๋ฉด์„œ isPending true๊ฐ€ ์„ค์ •๋˜๊ณ  ์ด์ „์— ์ผ์‹œ์ค‘๋‹จ๋œ ๋‹ค์Œ ์—…๋ฐ์ดํŠธ UI๋ฅผ ๋ Œ๋”๋งํ•œ๋‹ค.

๋ฆฌ์—‘ํŠธ ๋ฌธ์„œ์—์„œ๋Š” ์ฝ”๋“œ ๊ธฐ๋ฐ˜ ์ „์ฒด์— useTransition ํ˜ธ์ถœ์„ ์‚ฝ์ž…ํ•˜๋Š” ๋Œ€์‹  useTransition ํ˜ธ์ถœ์„ ๋””์ž์ธ ์‹œ์Šคํ…œ์— ํ†ตํ•ฉํ•˜๋Š” ํŽธ์ด ๋” ๋‚ซ๋‹ค๊ณ  ์ œ์•ˆํ•œ๋‹ค (ํ™•์ธ ํ•„์š”)

  • ex: ๋ฒ„ํŠผ์€ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ „ํ™˜์œผ๋กœ ๊ฐ์‹ธ๊ธฐ

// ๋ฒ„ํŠผ์„ ๋ Œ๋”๋งํ•˜๋ฉด์„œ ์ „ํ™˜ ์ฝ”๋“œ๋„ ์บก์Šํ™”
// ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ์ „ํ™˜์ด ์‹œ์ž‘๋˜๊ณ , ์ „ํ™˜์ด ์ผ์‹œ์ค‘๋‹จ ์ƒํƒœ์ธ ๋™์•ˆ ๋ฒ„ํŠผ์— ์Šคํ”ผ๋„ˆ ํ‘œ์‹œ

const ButtonPending = ({children, onClick, ...props}) => {
  const [isPending, startTransition] = useTransition();
  
  const handleClick = () => {
    startTransition(onClick); // ํ•ธ๋“ค๋Ÿฌ๋ฅผ transition์œผ๋กœ ๊ฐ์Œˆ
  }
  
  return (
    <button onClick={handleClick} {...props}>
      {isPending && <Spinner/>
      {children}
      {isPending && <Spinner/>
    </button>
  )
}

์Šคํ”ผ๋„ˆ๊ฐ€ ๋…ธ์ถœ๋˜๋Š” ํ…€์ด ์งง๋‹ค๋ฉด CSS๋กœ ์ˆ˜๋ฐฑ๋ฐ€๋ฆฌ์ดˆ ํ›„์— ์Šคํ”ผ๋„ˆ๊ฐ€ ์„œ์„œํžˆ ๋‚˜ํƒ€๋‚˜๋„๋ก ์„ค์ •ํ•ด๋ด๋ผ

๋ฐ์ดํ„ฐ๊ฐ€ ๋น ๋ฅด๊ฒŒ ์ ์žฌ๋˜๋Š” ๊ฒฝ์šฐ ์Šคํ”ผ๋„ˆ๋ฅผ ๋ณด์ง€ ๋ชปํ• ๊ฒƒ์ด๋‹ค.

useDeferredValue๋กœ ์ด์ „๊ฐ’ ์œ ์ง€ํ•˜๊ธฐ

UI ์ผ๋ถ€ ์—…๋ฐ์ดํŠธ๋ฅผ ์ง€์—ฐ(deferred)์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ํ›…

  • ์ง€์—ฐ์„ ๋ฐœ์ƒ์‹œ์ผœ ์ƒˆ ๊ฐ’์„ UI๋กœ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ์„ ๋•Œ๊นŒ์ง€ ์ด์ „๊ฐ’์„ ์‚ฌ์šฉ

  • ์ฆ‰, ์ƒˆ ๊ฐ’์€ ์ง€์—ฐ๋œ๋‹ค.

  • ๋ฆฌ์•กํŠธ๋Š” ์ด์ „ ๋ฒ„์ „(์˜ค๋ž˜๋œ UI)๊ณผ ์ƒˆ ๋ฒ„์ „(์—…๋ฐ์ดํŠธ ์ดํ›„ UI)์˜ ๊ฐ’์„ ๋ชจ๋‘ ์œ ์ง€ํ•˜๊ณ  UI์—์„œ ๋‘ ๋ฒ„์ „์„ ๋ชจ๋‘ ์‚ฌ์šฉํ•œ๋‹ค.

// deferrredValue๋Š” undefined๋กœ ์‹œ์ž‘ํ•˜๋ฏ€๋กœ || user ๋์— ์ถ”๊ฐ€ํ•ด์„œ
// ์ดˆ๊ธฐ user ๊ฐ’์ด ์„ค์ •๋˜์ž๋งˆ์ž ๋ฐ”๋กœ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค์ •
const deferredUser = useDeferredValue(user) || user;
const isPending = deferredUser !== user;

const siwtchUser = (nextUser: User) => {
  setSelectedUser(nextUser)
  // queryClient.prefetchQuery('์‚ฌ์šฉ์ž ์ƒ์„ธ ์ •๋ณด ๋ฏธ๋ฆฌ ์ฝ์–ด์˜ค๊ธฐ');
  // queryClient.prefetchQuery('์‚ฌ์šฉ์ž ์ด๋ฏธ์ง€ ๋ฏธ๋ฆฌ ์ฝ์–ด์˜ค๊ธฐ');
}

return user 
    ? <main>
        <UserList 
          user={user} // ์ƒˆ ์‚ฌ์šฉ์ž ๋ชฉ๋ก ๋ฐ˜์˜
          setUser={switchUser} 
          // ๋ชฉ๋ก ์‚ฌ์šฉ์ž๊ฐ€ details ์‚ฌ์šฉ์ž์™€ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์‚ฌ์‹ค์„ ๋ชฉ๋ก์—๊ฒŒ ์•Œ๋ฆผ
          isPending={ispending} 
         />
        <Susepense fallback={<PageSpinner/>}>
          <UserDetails 
          // ์ƒˆ ์‚ฌ์šฉ์ž์˜ ์ƒ์„ธ ์ •๋ณด๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ ์ด์ „ ์‚ฌ์šฉ์ž์˜ ์ƒ์„ธ์ •๋ณด ํ‘œ์‹œ
            userID={deferredUser.id} 
            isPending={isPending} // ์‚ฌ์šฉ์ž ์ •๋ณด๊ฐ€ ์˜ค๋ž˜๋œ ์ •๋ณด๋ผ๋Š” ์‚ฌ์‹ค์„ ๋„˜๊น€
          />
        </Suspense>
     </main>
    : <PageSpinner /> 
  • ์ถ”์ ํ•  ๊ฐ’์„ ์ธ์ž๋กœ useDeferredValue๋ฅผ ํ˜ธ์ถœ

  • ์ด ํ›…์€ value๋ฅผ ์ถ”์ ํ•ด์„œ value๊ฐ€ ์ด์ „ ๊ฐ’์—์„œ ์ƒˆ ๊ฐ’์œผ๋กœ ๋ณ€๊ฒฝ๋˜๋ฉด ํ›…์€ ๋‘ ๊ฐ’์ค‘ ํ•˜๋‚˜๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

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

  • ๋ฆฌ์•กํŠธ๊ฐ€ ์ƒˆ ๊ฐ’์œผ๋กœ ๋ Œ๋”๋ง์„ ๋งˆ์น˜๊ธฐ ์œ„ํ•ด ์–ด๋–ค ํ”„๋กœ์„ธ์Šค์˜ ์™„๋ฃŒ๋ฅผ ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ, ํ›…์€ ์ด์ „ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  ๋ฆฌ์•กํŠธ๋Š” ๊ธฐ์กด ๊ฐ’์„ ์‚ฌ์šฉํ•ด UI๋ฅผ ํ‘œ์‹œํ•œ๋‹ค.(์ด์™€ ๋™์‹œ์— ๋ฉ”๋ชจ๋ฆฌ์ƒ์—์„œ ์ƒˆ ๊ฐ’์„ ์‚ฌ์šฉํ•ด UI ์ž‘์—…์„ ์ˆ˜ํ–‰)

const deferredValue = useDeferredValue(value);

Last updated