2024-04-11.md

๐Ÿก

DIL: ๋ชจ๋˜ ๋ฆฌ์•กํŠธ ๋”ฅ ๋‹ค์ด๋ธŒ, 6์ฃผ์ฐจ-4

์Šคํ„ฐ๋””: ์›”๊ฐ„ CS, https://github.com/monthly-cs/2024-03-modern-react-deep-dive
์˜ค๋Š˜ ์ง„ํ–‰: ๊ฐœ์ธ๊ณต๋ถ€


DIL-week6-4_2024-04-11

| DIL ์ฃผ์ฐจ | ๋ฒ”์œ„ | ๋‚ด์šฉ | ์˜ค๋Š˜์ฐจ ์ง„๋„ | | -------- | ---------- | --------------------------------------------------------- | ----------- | | 6์ฃผ์ฐจ | 10์žฅ, 11์žฅ | ๋ฆฌ์•กํŠธ 17๊ณผ 18 ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์‚ดํŽด๋ณด๊ธฐ, Next.js 13๊ณผ ๋ฆฌ์•กํŠธ 18 | 682~686p |

์˜ค๋Š˜ ์ฝ์€ ๋‚ด์šฉ์„ markdown์œผ๋กœ ๊ฐ„๋‹จํžˆ ๋ฉ”๋ชจ
ํ† ์š”์ผ์— ๋งŽ์ด ์ฝ์–ด์•ผ ํ•  ๊ฒƒ์œผ๋กœ ๋ณด์ž„


๋ฆฌ์•กํŠธ 18 ๋ฒ„์ „ ์ƒˆ๋กœ ์ถ”๊ฐ€๋œ ํ›…

useTransition

  • UI ๋ณ€๊ฒฝ์„ ๊ฐ€๋กœ๋ง‰์ง€ ์•Š๊ณ  ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธ
    • ๋žœ๋”๋ง ์ค‘๋‹จ์ด ์•ˆ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ๋žœ๋”๋ง์ด ๋ฌด๊ฑฐ์šด ์ž‘์—…์— ๊ฐ€๋กœ๋ง‰ํžˆ๋Š” ํ˜„์ƒ ์ƒ๊ธธ ์ˆ˜ ์žˆ์Œ
  • โœจ ๋™์‹œ์„ฑ concurrency์„ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋Š” ์ƒˆ๋กœ์šด ํ›…
    • ๋Š๋ฆฐ ๋žœ๋”๋ง ๊ณผ์ •์ผ ๋–„ ๋กœ๋”ฉ ํ™”๋ฉด
    • ๋žœ๋”๋ง์„ ๋ฒ„๋ฆฌ๊ณ  ์ƒˆ๋กœ์šด ์ƒํƒœ๊ฐ’์œผ๋กœ ๋‹ค์‹œ ๋žœ๋”๋ง
  • ์ฃผ์˜์ 
    • ๋‚ด๋ถ€์—๋Š” setState๊ณผ ๊ฐ™์€ ์ƒํƒœ ์—…๋ฐ์ดํŠธ ํ•จ์ˆ˜ ์ž‘์—…๋งŒ ๋„˜๊ธธ ์ˆ˜ ์žˆ๋‹ค
    • startTransition ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋Š” ๋‹ค๋ฅธ ๋ชจ๋“  ๋™๊ธฐ ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋กœ ์‹คํ–‰์ด ์ง€์—ฐ๋  ์ˆ˜ ์žˆ๋‹ค.
    • ๋ฐ˜๋“œ์‹œ ๋™๊ธฐ ํ•จ์ˆ˜! ์ž‘์—…์„ ์ง€์—ฐ์‹œํ‚ค๋Š” startTransition ์ž‘์—…๊ณผ ๋น„๋™๊ธฐ ์‹คํ–‰์ด ๋ถˆ์ผ์น˜์ด๊ธฐ ๋•Œ๋ฌธ
import { useState, useTransition } from "react";

type Tab = "about" | "posts" | "contact";

export default function TabContainer() {
  const [isPending, startTransition] = useTransition(); // ์ธ์ˆ˜x
  // isPending: ์ƒํƒœ ์—…๋ฐ์ดํŠธ๊ฐ€ ์ง„ํ–‰ ์ค‘์ธ์ง€ ํ™•์ธ
  // startTransition: ๊ธด๊ธ‰ํ•˜์ง€ ์•Š์€ ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋กœ ๊ฐ„์ฃผํ•œ set ํ•จ์ˆ˜๋ฅผ ์ธ์ˆ˜๋กœ ๋ฐ›๋Š” ํ•จ์ˆ˜
  // ์—ฌ๋Ÿฌ ๊ฐœ์˜ setter๋ฅผ ๋„ฃ์–ด์ค„ ์ˆ˜๋„ ์žˆ๋‹ค.
  const [tab, setTab] = useState<Tab>("about");

  function selectTab(nextTab: Tab) {
    startTransition(() => {
      setTab(nextTab);
    });
  }

  return (
    <>
      {isPending ? (
        "๋กœ๋”ฉ ์ค‘"
      ) : (
        <>
          {tab === "about" && <About />}
          {tab === "posts" && <Posts />}
          {tab === "contact" && <Contact />}
        </>
      )}
    </>
  );
}