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

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

๐Ÿš€ React Context API ์„ฑ๋Šฅ ์ตœ์ ํ™”: ๋ Œ๋”๋ง ๋‚ญ๋น„ ๋ง‰๋Š” ์‹ฌํ™” ์ „๋žต

๐ŸŽฏ ๋„์ž…๋ถ€: Context API, ๊ณผ์—ฐ ๋งŒ๋Šฅ ์น˜ํŠธํ‚ค์ผ๊นŒ?

React Context API๋Š” ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ๋ฅผ ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ๋ฅผ ์‰ฝ๊ฒŒ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ๋กœ, 'Prop Drilling' ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ํฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ Context๋ฅผ ๋ฌด์‹ฌ์ฝ” ์‚ฌ์šฉํ•˜๋‹ค ๋ณด๋ฉด, ์•ฑ์˜ ๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ์„ฑ๋Šฅ ์ €ํ•˜๋ผ๋Š” ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ํ•จ์ •์— ๋น ์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
Context์˜ ๊ฐ’์ด ์กฐ๊ธˆ๋งŒ ๋ฐ”๋€Œ์–ด๋„ ํ•ด๋‹น Context๋ฅผ ๊ตฌ๋…(Subscribe)ํ•˜๋Š” ๋ชจ๋“  ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฌด์ฐจ๋ณ„์ ์œผ๋กœ ๋ฆฌ๋ Œ๋”๋ง ๋˜๋Š” ํ˜„์ƒ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
์ด๋ฒˆ ์‹ฌํ™” ํ•™์Šต์—์„œ๋Š” Context API ์‚ฌ์šฉ ์‹œ ๋ฐœ์ƒํ•˜๋Š” ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง(Rendering Waste)์˜ ๊ทผ๋ณธ์ ์ธ ์›์ธ์„ ํŒŒํ—ค์น˜๊ณ , ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ์„ ๊ทน๋Œ€ํ™”ํ•˜๋Š” ์‹ค์งˆ์ ์ธ ์ตœ์ ํ™” ์ „๋žต์„ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ’ก ํ•ต์‹ฌ ๋ฌธ์ œ: Context Provider์˜ '๊ฐ’(value)'์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค, useContext๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ฐ’์˜ ์ผ๋ถ€๋งŒ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ” Context์˜ ์–•์€ ๋น„๊ต์™€ ๋ฆฌ๋ Œ๋”๋ง ์ „ํŒŒ

1. Context Provider์˜ ๊ฐ’ ๋น„๊ต ์›๋ฆฌ

Context Provider์˜ `value` prop์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์–•์€ ๋น„๊ต(Shallow Comparison)๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
์ด์ „ ๋ Œ๋”๋ง ์‹œ์ ์˜ `value` ๊ฐ์ฒด์™€ ํ˜„์žฌ ๋ Œ๋”๋ง ์‹œ์ ์˜ `value` ๊ฐ์ฒด๋ฅผ ๋น„๊ตํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊ฐ€ ๋‹ค๋ฅผ ๊ฒฝ์šฐ, React๋Š” ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค๊ณ  ํŒ๋‹จํ•˜๊ณ  Context๋ฅผ ๊ตฌ๋…ํ•˜๋Š” ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฆฌ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค.

2. ๋ฆฌ๋ Œ๋”๋ง ๋‚ญ๋น„์˜ ์ฃผ์š” ์›์ธ

Context์˜ `value`์— Object๋‚˜ Array๋ฅผ ์ „๋‹ฌํ•  ๋•Œ, ํ•ด๋‹น ๊ฐ์ฒด๋“ค์€ ๋งค ๋ Œ๋”๋ง๋งˆ๋‹ค ์ƒˆ๋กœ์šด ์ฐธ์กฐ๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
๋‹ค์Œ ํ‘œ๋Š” ํ”ํžˆ ๋ฐœ์ƒํ•˜๋Š” ๋ฆฌ๋ Œ๋”๋ง ๋‚ญ๋น„์˜ ์›์ธ์ž…๋‹ˆ๋‹ค.

ํ•ญ๋ชฉ ์„ค๋ช… ๋ฌธ์ œ์ 
์ธ๋ผ์ธ ๊ฐ์ฒด/ํ•จ์ˆ˜ value={{ state, action: () => {} }}์™€ ๊ฐ™์ด Provider์— ์ง์ ‘ ์ •์˜๋œ ๊ฐ์ฒด๋‚˜ ํ•จ์ˆ˜. ๋งค ๋ Œ๋”๋ง๋งˆ๋‹ค ์ฐธ์กฐ ์ฃผ์†Œ๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด ์–•์€ ๋น„๊ต ์‹คํŒจ.
๋‹จ์ผ ๋Œ€ํ˜• Context ์‚ฌ์šฉ์ž ์ •๋ณด, ํ…Œ๋งˆ, ์„ค์ • ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋‚˜์˜ Context๋กœ ๊ด€๋ฆฌ. ํŠน์ • ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ผ๋ถ€ ๋ฐ์ดํ„ฐ๋งŒ ์‚ฌ์šฉํ•ด๋„, ์ „์ฒด ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ์‹œ ๋ฆฌ๋ Œ๋”๋ง๋จ.
⚠️ ์ฃผ์˜: useContext๋กœ Context๋ฅผ ๊ฐ€์ ธ์˜จ ์ปดํฌ๋„ŒํŠธ๋Š” React์˜ memo๋ฅผ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ Context ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด ๋ฌด์กฐ๊ฑด ๋ฆฌ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค. Context์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด memo์˜ Props ๋น„๊ต ๋กœ์ง์„ ์šฐํšŒํ•˜๊ณ  ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ’ก ์‹ฌํ™” ์ตœ์ ํ™” ์ „๋žต 3๊ฐ€์ง€

Context API์˜ ๋ฆฌ๋ Œ๋”๋ง ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์„ธ ๊ฐ€์ง€ ํ•ต์‹ฌ ์ „๋žต์€ '์ฐธ์กฐ ๋ฌด๊ฒฐ์„ฑ ์œ ์ง€', 'Context ๋ถ„๋ฆฌ', '์„ ํƒ์  ๊ตฌ๋…'์ž…๋‹ˆ๋‹ค.

1. ๐ŸŽฏ ๊ฐ’ ๋ฉ”๋ชจ์ด์ œ์ด์…˜: useMemo์™€ useCallback ํ™œ์šฉ

Provider์˜ `value`๊ฐ€ ๊ฐ์ฒด๋‚˜ ํ•จ์ˆ˜์ผ ๊ฒฝ์šฐ, ๋งค ๋ Œ๋”๋ง๋งˆ๋‹ค ์ƒˆ๋กœ์šด ์ฐธ์กฐ๊ฐ€ ์ƒ์„ฑ๋˜์ง€ ์•Š๋„๋ก useMemo์™€ useCallback์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

✅ `value` ๊ฐ์ฒด ๋ฉ”๋ชจ์ด์ œ์ด์…˜ (useMemo)
const memoizedValue = useMemo(() => ({ stateData, actions }), [stateData, actions]);
// value๊ฐ€ stateData ๋˜๋Š” actions๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งŒ ์ƒˆ๋กœ์šด ์ฐธ์กฐ๋ฅผ ๊ฐ€์ง.

✅ ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ (useCallback)
const handleAction = useCallback(() => { /* ๋กœ์ง */ }, [dependency]);
// actions ๊ฐ์ฒด ๋‚ด์˜ ํ•จ์ˆ˜๋“ค์ด ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์žฌ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜์—ฌ useMemo์˜ ์˜์กด์„ฑ(dependency) ๋ณ€๊ฒฝ์„ ๋ง‰์Œ.

2. ๐Ÿงฉ Context ๋ถ„๋ฆฌ: State์™€ Dispatch ๋ถ„ํ• 

๋Œ€๊ทœ๋ชจ Context๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹ , ์ž์ฃผ ๋ณ€ํ•˜๋Š” ์ƒํƒœ(State)์™€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ์•ก์…˜(Dispatch/Setter ํ•จ์ˆ˜)์„ ๋ณ„๋„์˜ Context๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ํšจ๊ณผ์ ์ธ ์ตœ์ ํ™” ๊ธฐ๋ฒ• ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.
์•ก์…˜ Context๋Š” ํ•œ ๋ฒˆ ์ •์˜๋˜๋ฉด ๋ณ€ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ, ์ด๋ฅผ ๊ตฌ๋…(Subscribe)ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋Š” ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด๋„ ๋ฆฌ๋ Œ๋”๋ง ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๐Ÿ“ ๋ถ„๋ฆฌ ํŒจํ„ด์˜ ํšจ๊ณผ

  • ✔️ ์ƒํƒœ Context ๊ตฌ๋… ์ปดํฌ๋„ŒํŠธ: ์ƒํƒœ(State)๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งŒ ๋ฆฌ๋ Œ๋”๋ง๋จ.
  • ✔️ ์•ก์…˜ Context ๊ตฌ๋… ์ปดํฌ๋„ŒํŠธ: ์•ก์…˜ ํ•จ์ˆ˜๋Š” ๋ถˆ๋ณ€ํ•˜๋ฏ€๋กœ, ์ƒํƒœ ๋ณ€๊ฒฝ ์‹œ ๋ฆฌ๋ Œ๋”๋ง ๋˜์ง€ ์•Š์Œ.

3. ๐ŸŽ ์„ ํƒ์  ๊ตฌ๋…์„ ์œ„ํ•œ Custom Hook

Context๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ Context์˜ ์ผ๋ถ€ ๊ฐ’(user.name)๋งŒ ํ•„์š”๋กœ ํ•  ๋•Œ, Context ์ „์ฒด(user ๊ฐ์ฒด)๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ๋ฆฌ๋ Œ๋”๋ง๋˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
์ด๋ฅผ ์œ„ํ•ด Custom Hook์„ ๋งŒ๋“ค์–ด ํŠน์ • ํ•„๋“œ๋งŒ ์ถ”์ถœํ•˜๊ณ , ํ•ด๋‹น ํ•„๋“œ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ๋งŒ ๊ฐ•์ œ๋กœ ์—…๋ฐ์ดํŠธํ•˜๋„๋ก ๋กœ์ง์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (์˜ˆ: Redux์˜ useSelector์™€ ์œ ์‚ฌ)

๐Ÿ“Œ Custom Hook ๊ตฌ์กฐ ์˜ˆ์‹œ
function useCustomState() {
  const context = useContext(MyContext);
  const specificValue = context.valueA;
  return specificValue;
}

์ด ํŒจํ„ด์€ Context์˜ ๊ฐ’ ๋น„๊ต๋ฅผ ์ง์ ‘ ์ˆ˜ํ–‰ํ•˜๋Š” ๋กœ์ง(์˜ˆ: useSyncExternalStore ๋˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ)์„ Custom Hook์— ์ˆจ๊ฒจ, ์‹ค์ œ๋กœ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งŒ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.


✅ Context ์ตœ์ ํ™”๋Š” ๊ณง ์ฐธ์กฐ ๋ฌด๊ฒฐ์„ฑ ๊ด€๋ฆฌ

React Context API๋Š” ํŽธ๋ฆฌํ•˜์ง€๋งŒ, ์„ฑ๋Šฅ ์ธก๋ฉด์—์„œ๋Š” ํ•ญ์ƒ ๊ฒฝ๊ณ„ํ•ด์•ผ ํ•  ๋ถ€๋ถ„์ด ์žˆ์Šต๋‹ˆ๋‹ค.
๊ฒฐ๊ตญ Context API ์ตœ์ ํ™”์˜ ํ•ต์‹ฌ์€ Provider์˜ `value`์— ์ „๋‹ฌ๋˜๋Š” ๊ฐ์ฒด ๋˜๋Š” ํ•จ์ˆ˜์˜ ์ฐธ์กฐ ๋ฌด๊ฒฐ์„ฑ์„ ์œ ์ง€ํ•˜์—ฌ, React์˜ ์–•์€ ๋น„๊ต๊ฐ€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์‹คํŒจํ•˜์ง€ ์•Š๋„๋ก ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๐Ÿ’ก 3์ค„ ์š”์•ฝ ๋ฐ ์ตœ์ข… ์ ๊ฒ€ ๋ฆฌ์ŠคํŠธ

  1. 1. ๋ฉ”๋ชจ์ด์ œ์ด์…˜: Provider์˜ `value`์™€ ๋‚ด๋ถ€ ํ•จ์ˆ˜๋Š” ๋ฐ˜๋“œ์‹œ `useMemo`์™€ `useCallback`์œผ๋กœ ๊ฐ์‹ธ์„œ ์ฐธ์กฐ ๋ณ€๊ฒฝ์„ ๋ง‰์œผ์‹ญ์‹œ์˜ค.
  2. 2. ๋ถ„๋ฆฌ ์ „๋žต: ์ž์ฃผ ๋ณ€ํ•˜๋Š” ๋ฐ์ดํ„ฐ์™€ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ์•ก์…˜(ํ•จ์ˆ˜)์„ ๋‘ ๊ฐœ์˜ Context๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ตฌ๋… ๋ฒ”์œ„๋ฅผ ์ตœ์†Œํ™”ํ•˜์‹ญ์‹œ์˜ค.
  3. 3. ๋Œ€์•ˆ ๊ฒ€ํ† : Context์˜ ๋ฆฌ๋ Œ๋”๋ง ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, Zustand, Jotai ๋“ฑ ๋ฆฌ๋ Œ๋”๋ง ๊ด€๋ฆฌ๊ฐ€ ๋” ์šฉ์ดํ•œ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

์ด ์‹ฌํ™” ์ „๋žต๋“ค์„ ์ ์šฉํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง์„ ์ค„์ธ๋‹ค๋ฉด, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜(UX)๊ณผ ๊ฐœ๋ฐœ ํšจ์œจ์„ฑ์ด ํฌ๊ฒŒ ํ–ฅ์ƒ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊พธ์ค€ํ•œ ํ”„๋กœํŒŒ์ผ๋ง์„ ํ†ตํ•ด ๋ Œ๋”๋ง ๋‚ญ๋น„๋ฅผ ํ™•์ธํ•˜๋Š” ์Šต๊ด€์„ ๋“ค์ด์„ธ์š”.

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