React 18 useDeferredValue ์‹ฌํ™”: ๊ฒ€์ƒ‰ ์ž๋™์™„์„ฑ์—์„œ ๋””๋ฐ”์šด์‹ฑ์„ ์ œ๊ฑฐํ•˜๋Š” ์ด์œ 

React 18 useDeferredValue ์‹ฌํ™”: ๊ฒ€์ƒ‰ ์ž๋™์™„์„ฑ์—์„œ ๋””๋ฐ”์šด์‹ฑ์„ ์ œ๊ฑฐํ•˜๋Š” ์ด์œ 

๐Ÿ—️ Props Drilling์ด๋ž€?: ๋ฐ์ดํ„ฐ๋ฅผ ์ง€ํ•˜ 10์ธต๊นŒ์ง€ ๋ฐฐ๋‹ฌํ•ด์•ผ ํ•  ๋•Œ

๋ถ€๋ชจ์—์„œ ์ž์‹์˜ ์ž์‹์˜ ์ž์‹๊นŒ์ง€... ์ด ๊ณ ํ†ต์„ ์–ด๋–ป๊ฒŒ ๋๋‚ผ๊นŒ์š”?

React๋กœ ๊ฐœ๋ฐœ์„ ํ•˜๋‹ค ๋ณด๋ฉด ์ด๋Ÿฐ ์ƒํ™ฉ์„ ๋งˆ์ฃผํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
์ตœ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ € ๊นŠ์ˆ™ํ•œ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ์จ์•ผ ํ•˜๋Š”๋ฐ, ์ค‘๊ฐ„์— ๋‚€ ์ปดํฌ๋„ŒํŠธ๋“ค์€ ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ์“ฐ์ง€๋„ ์•Š์œผ๋ฉด์„œ ๊ทธ์ € '์ „๋‹ฌ'๋งŒ ํ•˜๊ณ  ์žˆ๋Š” ์ƒํ™ฉ ๋ง์ด์ฃ .
๋งˆ์น˜ 10๋ช…์ด ์ผ๋ ฌ๋กœ ์„œ์„œ ๋ฌผ๋™์ด๋ฅผ ๋‚˜๋ฅด๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.
์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์„ Props Drilling(ํ”„๋กญ์Šค ๋“œ๋ฆด๋ง)์ด๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.
์˜ค๋Š˜์€ ์ด ํ˜„์ƒ์ด ์™œ ๋ฌธ์ œ๊ฐ€ ๋˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์ด๋ฅผ ์šฐ์•„ํ•˜๊ฒŒ ํ•ด๊ฒฐํ•˜๋Š” 3๊ฐ€์ง€ ํŒจํ„ด์„ ์ •๋ฆฌํ•ด ๋“œ๋ฆฝ๋‹ˆ๋‹ค.



๐Ÿšง 1. Props Drilling, ์™œ ๋‚˜์œ๊ฐ€์š”?

Props Drilling ์ž์ฒด๋Š” ๋‚˜์œ ํŒจํ„ด์ด ์•„๋‹™๋‹ˆ๋‹ค.
React์˜ ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ ํ๋ฆ„์€ ๋‹จ๋ฐฉํ–ฅ(Top-down)์ด๊ธฐ ๋•Œ๋ฌธ์— ์ž์—ฐ์Šค๋Ÿฌ์šด ํ˜„์ƒ์ž…๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ๊นŠ์ด๊ฐ€ ๊นŠ์–ด์งˆ์ˆ˜๋ก(Depth๊ฐ€ 3~4๋‹จ๊ณ„๋ฅผ ๋„˜์–ด๊ฐˆ์ˆ˜๋ก) ๊ฐœ๋ฐœ์ž๋ฅผ ๊ดด๋กญํžˆ๋Š” ์น˜๋ช…์ ์ธ ๋‹จ์ ๋“ค์ด ๋“œ๋Ÿฌ๋‚ฉ๋‹ˆ๋‹ค.

๐Ÿ“‰ ์ฃผ์š” ๋ถ€์ž‘์šฉ 3๊ฐ€์ง€

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

๐Ÿ–ฅ️ ๊ณ ํ†ต์Šค๋Ÿฌ์šด ์ฝ”๋“œ ์˜ˆ์‹œ

// App > Header > UserMenu > ProfileImage

function App() {
  const user = { name: 'Gemini' };
  return <Header user={user} />;
}

function Header({ user }) {
  // Header๋Š” user๊ฐ€ ํ•„์š” ์—†์ง€๋งŒ ์ „๋‹ฌํ•ด์•ผ ํ•จ ๐Ÿ˜ฉ
  return <UserMenu user={user} />;
}
... (๊ณ„์† ๋ฐ˜๋ณต)

๐Ÿงฉ 2. ํ•ด๊ฒฐ์ฑ… A: ์ปดํฌ๋„ŒํŠธ ํ•ฉ์„ฑ (Composition)

๋งŽ์€ ๋ถ„๋“ค์ด Props Drilling์„ ๋งŒ๋‚˜๋ฉด ๋ฐ”๋กœ Context API๋‚˜ Redux๋ฅผ ๋– ์˜ฌ๋ฆฝ๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ๊ฐ€์žฅ ๋จผ์ € ๊ณ ๋ คํ•ด์•ผ ํ•  ๊ฐ€๋ณ๊ณ  ๊ฐ•๋ ฅํ•œ ๋ฐฉ๋ฒ•์€ ์ปดํฌ๋„ŒํŠธ ํ•ฉ์„ฑ์ž…๋‹ˆ๋‹ค.
`children` prop์„ ์ ๊ทน์ ์œผ๋กœ ํ™œ์šฉํ•˜๋ฉด ์ค‘๊ฐ„ ์ „๋‹ฌ์ž๋“ค์„ ์—†์•จ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ’ก ํ•ฉ์„ฑ์˜ ๋งˆ๋ฒ• (Inversion of Control)
๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง„ ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ง์ ‘ ๋ Œ๋”๋งํ•ด์„œ ๋„˜๊ฒจ์ฃผ๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
์ด๋ ‡๊ฒŒ ๋˜๋ฉด ์ค‘๊ฐ„ ์ปดํฌ๋„ŒํŠธ๋Š” "๋ฌด์—‡์ด ๋“ค์–ด์˜ฌ์ง€ ๋ชจ๋ฅด๋Š”" ๊ตฌ๋ฉ(`children`)๋งŒ ๋šซ์–ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
function App() {
  const user = { name: 'Gemini' };
  // Header์—๊ฒŒ ๋‚ด์šฉ์„ ์ง์ ‘ ์ฃผ์ž…!
  return (
    <Header>
      <ProfileImage user={user} />
    </Header>
  );
}

์ด์ œ `Header` ์ปดํฌ๋„ŒํŠธ๋Š” `user` prop์„ ์•Œ ํ•„์š”๊ฐ€ ์—†์–ด์กŒ์Šต๋‹ˆ๋‹ค.


๐Ÿ“ก 3. ํ•ด๊ฒฐ์ฑ… B & C: Context API์™€ ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ

์ปดํฌ๋„ŒํŠธ ํ•ฉ์„ฑ๋งŒ์œผ๋กœ ํ•ด๊ฒฐํ•˜๊ธฐ์—” ๊ตฌ์กฐ๊ฐ€ ๋„ˆ๋ฌด ๋ณต์žกํ•˜๊ฑฐ๋‚˜, ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ๊ณตํ†ต์œผ๋กœ ์“ฐ๋Š” ๋ฐ์ดํ„ฐ(ํ…Œ๋งˆ, ๋กœ๊ทธ์ธ ์ •๋ณด ๋“ฑ)๋ผ๋ฉด ๋„๊ตฌ๋ฅผ ์จ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

✅ Context API (React ๋‚ด์žฅ)

๋ณ„๋„์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜ ์—†์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
`Provider`๋กœ ๊ฐ์‹ธ์ง„ ๋ชจ๋“  ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ์งํ†ต ํ„ฐ๋„์„ ๋šซ์–ด ๋ฐ์ดํ„ฐ๋ฅผ ๊บผ๋‚ด ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋‹จ, ์žฆ์€ ์ƒํƒœ ๋ณ€๊ฒฝ ์‹œ ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง ์ด์Šˆ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์–ด ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

✅ ์ „์—ญ ์ƒํƒœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (Zustand, Redux, Recoil)

ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๊ฐ€ ํฌ๋‹ค๋ฉด ์ „๋ฌธ์ ์ธ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ •๋‹ต์ž…๋‹ˆ๋‹ค.
์ตœ๊ทผ์—๋Š” ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ๊ฐ€ ๋งŽ์€ Redux๋ณด๋‹ค, ์ง๊ด€์ ์ธ Zustand๊ฐ€ ํฐ ์ธ๊ธฐ๋ฅผ ๋Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“Š ํ•ด๊ฒฐ์ฑ… ๋น„๊ต ์š”์•ฝ

๋ฐฉ๋ฒ• ์ถ”์ฒœ ์ƒํ™ฉ ๋‚œ์ด๋„
Composition ๊นŠ์ด๊ฐ€ 2~3๋‹จ๊ณ„, ๊ตฌ์กฐ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ ์‹œ ⭐ (์‰ฌ์›€)
Context API ํ…Œ๋งˆ, ๋‹ค๊ตญ์–ด ๋“ฑ ๋ณ€๊ฒฝ์ด ์ ์€ ์ „์—ญ ๋ฐ์ดํ„ฐ ⭐⭐ (๋ณดํ†ต)
Zustand/Redux ๋ณต์žกํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง, ๋นˆ๋ฒˆํ•œ ์—…๋ฐ์ดํŠธ ⭐⭐⭐ (์–ด๋ ค์›€)

๐ŸŽ“๋ฌด์กฐ๊ฑด ๋„๊ตฌ๋ถ€ํ„ฐ ์ฐพ์ง€ ๋งˆ์„ธ์š”

Props Drilling์ด ๋ฐœ์ƒํ–ˆ๋‹ค๊ณ  ํ•ด์„œ ๋ฌด์กฐ๊ฑด Context๋‚˜ Redux๋ฅผ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์€ '๋ชจ๊ธฐ ์žก์œผ๋ ค๋‹ค ์ดˆ๊ฐ€์‚ผ๊ฐ„ ํƒœ์šฐ๋Š” ๊ฒฉ'์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋จผ์ € ์ฝ”๋“œ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ ํ•ฉ์„ฑ์„ ์‹œ๋„ํ•ด ๋ณด์„ธ์š”.

๐Ÿš€ ์˜ค๋Š˜์˜ ํ•ต์‹ฌ ์š”์•ฝ
  • Props Drilling์€ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ์„ ์œ„ํ•ด ๋ถˆํ•„์š”ํ•œ ์ค‘๊ฐ„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฑฐ์น˜๋Š” ํ˜„์ƒ์ž…๋‹ˆ๋‹ค.
  • ์ด๋กœ ์ธํ•ด ์ฝ”๋“œ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ค์›Œ์ง€๊ณ  ์ถ”์ ์ด ํž˜๋“ค์–ด์ง‘๋‹ˆ๋‹ค.
  • 1๋‹จ๊ณ„: `children`์„ ํ™œ์šฉํ•œ ํ•ฉ์„ฑ์„ ๊ณ ๋ คํ•˜์„ธ์š”.
  • 2๋‹จ๊ณ„: ์ „์—ญ์ ์ธ ๋ฐ์ดํ„ฐ๋ผ๋ฉด Context API๋‚˜ Zustand๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

์—ฌ๋Ÿฌ๋ถ„์˜ ํ”„๋กœ์ ํŠธ์—์„œ ๋ถˆํ•„์š”ํ•˜๊ฒŒ props๋ฅผ ์ „๋‹ฌํ•˜๊ณ  ์žˆ๋Š” '๋ฐฐ๋‹ฌ๋ถ€ ์ปดํฌ๋„ŒํŠธ'๋Š” ์—†๋Š”์ง€ ์ง€๊ธˆ ๋ฐ”๋กœ ํ™•์ธํ•ด ๋ณด๋Š” ๊ฑด ์–ด๋–จ๊นŒ์š”?

๋Œ“๊ธ€ ์“ฐ๊ธฐ