๐Ÿง  01. Zustand ๋ฉ˜ํƒˆ ๋ชจ๋ธ: ๋ฆฌ๋ Œ๋”๋ง ํญํƒ„์—์„œ ํƒˆ์ถœํ•˜๊ธฐ

๐Ÿ“‹ ๊ฐœ์š”

Redux์™€ Context API์˜ ํ•œ๊ณ„๋ฅผ ๊ทน๋ณตํ•˜๋Š” Zustand์˜ ํ•ต์‹ฌ ๋™์ž‘ ์›๋ฆฌ์™€ ๋ฉ˜ํƒˆ ๋ชจ๋ธ

๐ŸŽฏ ์ด ์„น์…˜์„ ์ฝ๊ณ  ๋‚˜๋ฉด:

  • Context API์˜ ๊ตฌ์กฐ์  ํ•œ๊ณ„์™€ ๋ฆฌ๋ Œ๋”๋ง ํญ๋ฐœ์˜ ์›์ธ์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Zustand์˜ ํ•ต์‹ฌ์ธ '๋…๋ฆฝ์ ์ธ ์Šคํ† ์–ด'์™€ '์„ ํƒ์  ๊ตฌ๋…(Select)' ๋ฉ˜ํƒˆ ๋ชจ๋ธ์„ ์žฅ์ฐฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ“‹ ๋ชฉ์ฐจ


๐Ÿ“Œ ์ด ๋ฌธ์„œ๋ฅผ ์ฝ๊ธฐ ์ „์—

โฑ๏ธ ์˜ˆ์ƒ ์ฝ๊ธฐ ์‹œ๊ฐ„: 10๋ถ„ / ํ•ต์‹ฌ ํŒŒํŠธ: 5๋ถ„

๐Ÿ—บ๏ธ ์ด ๋ฌธ์„œ์˜ ํ๋ฆ„
Context API์˜ ํ•œ๊ณ„์  ํ™•์ธ โ†’ Zustand์˜ ์ •๋ฐ€ ํƒ€๊ฒฉ ๋ชจ๋ธ ์ดํ•ด โ†’ ์Šคํ† ์–ด์˜ ๋…๋ฆฝ์„ฑ ํŒŒ์•…

๐Ÿ—บ๏ธ ์ด ๋ฌธ์„œ์˜ ๋ฐฐ๊ฒฝ ์„ธ๊ณ„๊ด€: '์˜์ˆ˜๋„ค ์ปค๋ฎค๋‹ˆํ‹ฐ'

  • ๐Ÿฃ ์˜์ฒ  ( ์‹ ์ž… ): "์ €ํฌ ์ปค๋ฎค๋‹ˆํ‹ฐ ์•ฑ ํ—ค๋”์— ์œ ์ € ํ”„๋กœํ•„ ์•„์ด์ฝ˜ ๋„์šฐ๋ ค๊ณ  UserContext๋ฅผ ๋งŒ๋“ค์—ˆ๊ฑฐ๋“ ์š”? ๊ทผ๋ฐ ๋กœ๊ทธ์ธ ์ƒํƒœ ๊ด€๋ฆฌํ•˜๋ ค๊ณ  ๊ฐ์‹ผ ๊ฑด๋ฐ, ํ—ค๋”๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ•˜์œ„์˜ ๋ฉ”์ธ ํ”ผ๋“œ๊นŒ์ง€ ๊ณ„์† ๋ฆฌ๋ Œ๋”๋ง์ด ์ผ์–ด๋‚˜์š”. ์ปจํ…์ŠคํŠธ๋ฅผ ๋„๋ฉ”์ธ๋ณ„๋กœ ๋‹ค ์ชผ๊ฐœ์•ผ ํ• ๊นŒ์š”? Redux๋Š” ์„ธํŒ…์ด ๋„ˆ๋ฌด ๋ณต์žกํ•ด์„œ ๋ฌด์„œ์›Œ์š”..."
  • ๐Ÿฆ ์˜ํ˜ธ ( ๋ฆฌ๋“œ ): "์˜์ฒ  ๋‹˜, Context API๋กœ ์ „์—ญ ์ƒํƒœ๋ฅผ ํ†ต์ œํ•˜๋ ค๋Š” ์‹œ๋„ ์ž์ฒด๋Š” ์ข‹์€ ์ถœ๋ฐœ์ด์—์š”. ํ•˜์ง€๋งŒ Context๋Š” ๊ฐ’ ํ•˜๋‚˜๊ฐ€ ๋ฐ”๋€Œ๋ฉด ํ•˜์œ„ ํŠธ๋ฆฌ๋ฅผ ๋ฌด์กฐ๊ฑด ๋ Œ๋”๋ง์‹œํ‚ค๋Š” ๊ตฌ์กฐ์  ํ•œ๊ณ„๊ฐ€ ์žˆ์ฃ . ๋ฌด์กฐ๊ฑด ํฐ ๋ง์น˜(Redux)๋ฅผ ๊บผ๋‚ผ ํ•„์š”๋Š” ์—†์–ด์š”. ์•„์ฃผ ๊ฐ€๋ณ์ง€๋งŒ ๊ฐ•๋ ฅํ•œ ์ €๊ฒฉ์ด, Zustand๋ฅผ ์ฅ์–ด ๋“œ๋ฆด๊ฒŒ์š”."

๐Ÿค” ์™œ ์•Œ์•„์•ผ ํ•˜๋Š”๊ฐ€

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

๋ฐ˜๋Œ€๋กœ ๊ธฐ์กด์˜ Redux๋Š” ๊ฐ•๋ ฅํ•˜์ง€๋งŒ, ํ•˜๋‚˜์˜ ์ƒํƒœ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด Action Type, Action Creator, Reducer๊นŒ์ง€ ์„ธํŒ…ํ•ด์•ผ ํ•˜๋Š” ๊ฑฐ๋Œ€ํ•œ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ๊ฐ€ ์˜์ฒ ์ด ๊ฐ™์€ ์ฃผ๋‹ˆ์–ด์˜ ๊ธฐ๋™์„ฑ์„ ๋–จ์–ด๋œจ๋ฆฝ๋‹ˆ๋‹ค.

์ด๋•Œ Zustand๊ฐ€ ๋“ฑ์žฅํ•ฉ๋‹ˆ๋‹ค. ๋…์ผ์–ด๋กœ '์ƒํƒœ'๋ฅผ ๋œปํ•˜๋Š” ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” Redux์˜ ์žฅ์ ์ธ ๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ๊ณ„์Šนํ•˜๋ฉด์„œ๋„, ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ๋ฅผ 0์— ์ˆ˜๋ ดํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  ์ปดํฌ๋„ŒํŠธ ์ƒ๋ช…์ฃผ๊ธฐ ๋ฐ”๊นฅ์— ์Šคํ† ์–ด๋ฅผ ์œ„์น˜์‹œํ‚ด์œผ๋กœ์จ ๋ฆฌ๋ Œ๋”๋ง ํญ๋ฐœ์„ ์›์ฒœ ๋ด‰์‡„ํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ—๏ธ 1. Context API์˜ ํ•œ๊ณ„์™€ Zustand์˜ ์ฒ ํ•™

Zustand๋ฅผ ์ดํ•ดํ•˜๋ ค๋ฉด, ๋จผ์ € ์šฐ๋ฆฌ๊ฐ€ ์™œ ๊ธฐ์กด ๋„๊ตฌ์—์„œ ๋ถˆํŽธํ•จ์„ ๋А๊ผˆ๋Š”์ง€ ๋˜์งš์–ด๋ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Context API์˜ '๋„“์€ ๊ณต๊ฒฉ ๋ฒ”์œ„'

Context API๋Š” Provider ๋‚ด๋ถ€์˜ ์ปดํฌ๋„ŒํŠธ๋“ค์ด useContext๋ฅผ ํ†ตํ•ด ๊ฐ’์„ ์ฝ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” Provider์˜ value๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด, ํ•ด๋‹น ์ปจํ…์ŠคํŠธ๋ฅผ ๊ตฌ๋…ํ•˜๋Š” ๋ชจ๋“  ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง๋œ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค.

// ๐Ÿฃ ์˜์ฒ : ์ƒํƒœ ํ•˜์œ„ ๊ตฌ์กฐ ์ค‘ theme๋งŒ ์“ฐ๊ณ  ์‹ถ์€๋ฐ, user๊ฐ€ ๋ฐ”๋€Œ์–ด๋„ ์ €๊นŒ์ง€ ๋ฆฌ๋ Œ๋”๋ง ๋ผ์š”!
const { theme } = useContext(AppStoreContext); 

Zustand์˜ '์ •๋ฐ€ ํƒ€๊ฒฉ(Select)'

Zustand๋Š” ์ด์™€ ๋‹ฌ๋ฆฌ, ๋ Œ๋”๋ง ์ƒํƒœ๊ณ„ ๋ฐ”๊นฅ(React ์™ธ๊ณฝ) ์— ๊ฑฐ๋Œ€ํ•œ ๋ณด๊ด€์†Œ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ทธ ๋ณด๊ด€์†Œ ์•ˆ์˜ ํŠน์ • ๊ฐ’ ํ•˜๋‚˜๋งŒ ์ฝ• ์ง‘์–ด์„œ(Select) ๊ตฌ๋…ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

// ๐Ÿฆ ์˜ํ˜ธ: Zustand๋กœ๋Š” 'theme'๋งŒ ๊ตฌ๋…ํ•  ์ˆ˜ ์žˆ์–ด์š”. user๊ฐ€ ๋ฐ”๋€Œ์–ด๋„ ์–˜๋Š” ์กฐ์šฉํ•ฉ๋‹ˆ๋‹ค.
const theme = useAppStore((state) => state.theme);

์ด๊ฒƒ์ด Zustand์˜ ํ•ต์‹ฌ ๋ฉ˜ํƒˆ ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค. ๋‹จ์ผ ์Šคํ† ์–ด(Single Source of Truth)๋ฅผ ์œ ์ง€ํ•˜๋˜, ๊ตฌ๋…์€ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ฐ์ž ํ•„์š”ํ•œ ๊ณณ์—๋งŒ ์–‡๊ฒŒ ๋ฐ”๋ฅด๋Š” ๊ฒƒ(Selector).


๐Ÿง  2. ๋ฆฌ์•กํŠธ ๋ฐ”๊นฅ์˜ ๋…๋ฆฝ์ ์ธ ์Šคํ† ์–ด

Zustand๊ฐ€ ๋‹ค๋ฅธ React ์ „์šฉ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์ฐจ๋ณ„ํ™”๋˜๋Š” ๊ฐ€์žฅ ํฐ ํŠน์ง•์€ ์Šคํ† ์–ด๊ฐ€ ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ์— ์ข…์†๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Redux๋‚˜ Context API๋Š” ๋ฐ˜๋“œ์‹œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ตœ์ƒ๋‹จ์— <Provider>๋กœ ์•ฑ์„ ๊ฐ์‹ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ง์€ ์ƒํƒœ๊ฐ€ React ํŠธ๋ฆฌ์˜ ๋งฅ๋ฝ(Context) ์•ˆ์— ๊ฐ‡ํ˜€ ์žˆ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด Zustand ์Šคํ† ์–ด๋Š” ์ˆœ์ˆ˜ํ•œ JavaScript ํด๋กœ์ € ๊ธฐ๋ฐ˜์œผ๋กœ ๋งŒ๋“ค์–ด์ง‘๋‹ˆ๋‹ค.

// ๐Ÿฃ ์˜์ฒ : Provider๊ฐ€ ์—†์–ด์š”?! ๊ทธ๋Ÿผ ์–ธ์ œ ์–ด๋””์„œ ์ด ์ƒํƒœ๋ฅผ ์“ฐ์ฃ ?
import { create } from 'zustand';
 
export const useBearStore = create((set) => ({
  bears: 0,
  increasePopulation: () => set((state) => ({ bears: state.bears + 1 })),
  removeAllBears: () => set({ bears: 0 }),
}));
  • <Provider> ํŠธ๋ฆฌ๋กœ ๊ฐ์Œ€ ํ•„์š”๊ฐ€ ์—†์œผ๋ฏ€๋กœ ์•ฑ ์ง„์ž…์ ์ด ๊น”๋”ํ•ด์ง‘๋‹ˆ๋‹ค.
  • ๊ฐ€์žฅ ๊ฐ•๋ ฅํ•œ ์ : React ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์•„๋‹Œ ์ˆœ์ˆ˜ JS ํ•จ์ˆ˜(์˜ˆ: Axios ์ธํ„ฐ์…‰ํ„ฐ ๋‚ด๋ถ€, ์›น์†Œ์ผ“ ์œ ํ‹ธ ํ•จ์ˆ˜ ์•ˆ)์—์„œ๋„ ์ €์žฅ์†Œ์˜ ๊ฐ’์„ ์ง์ ‘ ์ฝ๊ณ (useBearStore.getState()) ์—…๋ฐ์ดํŠธ(useBearStore.setState()) ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐ŸŽฏ 3. Action๊ณผ State์˜ ๊ณต์กด

Redux ๋ฉ˜ํƒˆ ๋ชจ๋ธ์— ์ต์ˆ™ํ•œ ์‚ฌ๋žŒ๋“ค์„ ๊ดด๋กญํžˆ๋Š” ๊ฒƒ์€ ์ƒํƒœ ๋ณด๊ด€ ๊ณต๊ฐ„(Reducer)๊ณผ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ํ•จ์ˆ˜(Action/Dispatch)๋ฅผ ๋ถ„๋ฆฌํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฐ•๋ฐ•์ž…๋‹ˆ๋‹ค.

Zustand๋Š” ์ด ๋‘˜์„ ํ•œ ๊ณต๊ฐ„์— ๋‘ก๋‹ˆ๋‹ค. ์ƒํƒœ ๊ฐ’(bears)๊ณผ ๊ทธ ๊ฐ’์„ ๋ฐ”๊พธ๋Š” ํ•จ์ˆ˜(increasePopulation)๊ฐ€ ํ•˜๋‚˜์˜ ์Šคํ† ์–ด ์˜ค๋ธŒ์ ํŠธ ์•ˆ์— ๋™๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

// ๐Ÿฆ ์˜ํ˜ธ: Zustand๋Š” ์ƒํƒœ ๋ณด๊ด€ ๋ฐ•์Šค ์•ˆ์—, ๊ทธ ๋ฐ•์Šค๋ฅผ ์กฐ์ž‘ํ•˜๋Š” ๋ช…์„ธ์„œ(ํ•จ์ˆ˜)๋„ ๊ฐ™์ด ๋„ฃ์–ด๋‘๋Š” ๋ฐฉ์‹์ด์—์š”.
const bears = useBearStore((state) => state.bears); // ์ƒํƒœ๋งŒ ์™!
const increasePopulation = useBearStore((state) => state.increasePopulation); // ํ•จ์ˆ˜๋งŒ ์™!

์ด๋กœ ์ธํ•ด ์ฝ”๋“œ๋ฅผ ๋”ฐ๋ผ๊ฐ€๋ฉฐ ์—ญ์ถ”์ (Debugging)ํ•˜๋Š” ๊ณผ์ •์ด ๋‹จ์ผ ํŒŒ์ผ ์•ˆ์—์„œ ๋๋‚˜๋ฉฐ, ์ฝ”๋“œ๋Ÿ‰์ด ํš๊ธฐ์ ์œผ๋กœ ์ค„์–ด๋“ญ๋‹ˆ๋‹ค.


๐Ÿ“ ๋งˆ๋ฌด๋ฆฌ ํ€ด์ฆˆ

Q1. Context API์˜ ๊ฐ€์žฅ ํฐ ๊ตฌ์กฐ์  ๋‹จ์ ์€ ๋ฌด์—‡์ธ๊ฐ€์š”?

  • A) ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด Provider๊ฐ€ ํ•„์ˆ˜์ ์ด์ง€ ์•Š๋‹ค.
  • B) ๊ตฌ๋… ์ค‘์ธ ์ƒํƒœ์˜ ํŠน์ • ๊ฐ’์ด ์•„๋‹ˆ๋ผ, ๊ฐ์ฒด์˜ ์ฐธ์กฐ๊ฐ€ ๋ฐ”๋€Œ๋ฉด ํ•ด๋‹น Context๋ฅผ ์ฝ๋Š” ๋ชจ๋“  ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง๋œ๋‹ค.
  • C) Redux๋ณด๋‹ค ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ๊ฐ€ ๋งŽ์•„ ์„ค์ •์ด ๋ณต์žกํ•˜๋‹ค.
  • D) ์™ธ๋ถ€(React ํŠธ๋ฆฌ ๋ฐ”๊นฅ) ์Šคํ† ๋ฆฌ์ง€์™€์˜ ์—ฐ๋™์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

โœ… ์ •๋‹ต: B

๐Ÿ’ก ์ƒ์„ธ ํ•ด์„ค:

  • ์›๋ฆฌ ์„ค๋ช…: Context API๋Š” value ํ”„๋กœํผํ‹ฐ๋กœ ์ „๋‹ฌ๋˜๋Š” ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด useContext๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ชจ๋“  ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฆฌ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค. ํŠน์ • ํ”„๋กœํผํ‹ฐ๋งŒ ๊ณจ๋ผ์„œ ๊ตฌ๋…(Select)ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ๋‚ด์žฅ๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์˜ค๋‹ต ํ”ผ๋“œ๋ฐฑ: "์˜์ฒ  ๋‹˜, Context๋Š” ๊ฐ’์„ ๋ฌถ์–ด์„œ ๋˜์ง€๋Š” ๊ด‘์—ญ ๋งˆ๋ฒ•์ด์—์š”. A, C, D๋Š” ๋‹ค ํ‹€๋ฆฐ ์„ค๋ช…์ž…๋‹ˆ๋‹ค. ์˜คํžˆ๋ ค ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ๊ฐ€ ์ ๊ณ  ์ง๊ด€์ ์ด์ง€๋งŒ ์ •๋ฐ€ ํƒ€๊ฒฉ์ด ์•ˆ ๋˜๋Š” ๊ฒŒ ๋ฌธ์ œ์ฃ ."
  • ๐Ÿ“Œ ํ•ต์‹ฌ ๊ธฐ์–ต๋ฒ•: ๐Ÿฆ ์˜ํ˜ธ: "Context๋Š” ์Šค์œ„์น˜ ํ•˜๋‚˜ ์ผœ๋ฉด ์ง‘์•ˆ ์ „์ฒด ๋ถˆ์ด ๊นœ๋นก๊ฑฐ๋ฆฌ๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค."

Q2. Zustand ์Šคํ† ์–ด์˜ ๊ฐ€์žฅ ํฐ ํŠน์ง•์ด์ž ์žฅ์ ์€ ๋ฌด์—‡์ธ๊ฐ€์š”?

  • A) React์˜ Context API๋ฅผ ๋‚ด๋ถ€์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„๋˜์—ˆ๋‹ค.
  • B) ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ตœ์ƒ๋‹จ์— ๋ฐ˜๋“œ์‹œ <Provider>๋ฅผ ์„ ์–ธํ•ด์•ผ๋งŒ ์ž‘๋™ํ•œ๋‹ค.
  • C) ์ƒํƒœ ๋ณ€๊ฒฝ์„ ์œ„ํ•œ Reducer ํ•จ์ˆ˜๋ฅผ ๊ฐ•์ œํ•˜์—ฌ ๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ์—„๊ฒฉํ•˜๊ฒŒ ์ง€ํ‚จ๋‹ค.
  • D) ์Šคํ† ์–ด๊ฐ€ React ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ ๋ฐ”๊นฅ(๋…๋ฆฝ๋œ ํด๋กœ์ €)์— ์กด์žฌํ•˜๋ฉฐ, ํ•„์š”ํ•œ ์ƒํƒœ๋งŒ ์„ ํƒ์ (Selector)์œผ๋กœ ๊ตฌ๋…ํ•  ์ˆ˜ ์žˆ๋‹ค.

โœ… ์ •๋‹ต: D

๐Ÿ’ก ์ƒ์„ธ ํ•ด์„ค:

  • ์›๋ฆฌ ์„ค๋ช…: Zustand๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ํด๋กœ์ €์™€ ๊ตฌ๋…(Publish/Subscribe) ํŒจํ„ด์„ ์ด์šฉํ•ด React ํŠธ๋ฆฌ ๋ฐ”๊นฅ์— ์Šคํ† ์–ด๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋•๋ถ„์— Provider๊ฐ€ ํ•„์š” ์—†๊ณ , ์ˆœ์ˆ˜ JS ํ•จ์ˆ˜์—์„œ๋„ ์Šคํ† ์–ด ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • ์˜ค๋‹ต ํ”ผ๋“œ๋ฐฑ: "์˜์ฒ  ๋‹˜, ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ๊ผญ React ์•ˆ์— ๊ฐ€๋‘ฌ๋†“์„ ํ•„์š”๋Š” ์—†์–ด์š”. ๋ฐ”๊นฅ์— ๋นผ๋ฉด ์˜คํžˆ๋ ค ์ž์œ ๋กœ์›Œ์ ธ์š”!"
  • ๐Ÿ“Œ ํ•ต์‹ฌ ๊ธฐ์–ต๋ฒ•: ๐Ÿฆ ์˜ํ˜ธ: "Zustand๋Š” React ์ปดํฌ๋„ŒํŠธ๋“ค์ด ์–ธ์ œ๋“  ์ „ํ™”ํ•ด์„œ ๋ฌผ์–ด๋ณผ ์ˆ˜ ์žˆ๋Š” '๋ฐ”๊นฅ ์‚ฌ๋ฌด์‹ค'์ž…๋‹ˆ๋‹ค."

Q3. ๐Ÿ‹๏ธโ€โ™‚๏ธ ์˜์ฒ ์˜ ํ…Œ์ŠคํŠธ ํƒ€์ž„ (Q&A)

์˜์ฒ ์ด๊ฐ€ ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ฒŒ์‹œ๊ธ€ ๋ชฉ๋ก ๋ทฐ๋ฅผ ๋งŒ๋“ค๋ฉด์„œ, Context API๋กœ ๋กœ๊ทธ์ธ ์œ ์ € ์ •๋ณด๋ฅผ ๋ฟŒ๋ ค์ฃผ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์—์„œ ๊ธ€ ์ž‘์„ฑ ๋ชจ๋‹ฌ ์ƒํƒœ ์ •๋ณด๋ฅผ ์ถ”๊ฐ€ํ•˜์ž๋งˆ์ž, ๋กœ๊ทธ์ธ ์œ ์ € ์ปจํ…์ŠคํŠธ๋ฅผ ๋ฐ”๋ผ๋ณด๋˜ ๊ฒŒ์‹œ๊ธ€ ๋ชฉ๋ก์ด ๋ฆฌ๋ Œ๋”๋ง๋˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜์ฒ ์ด๊ฐ€ Zustand๋กœ ์ด ์ƒํ™ฉ์„ ํ•ด๊ฒฐํ•œ๋‹ค๋ฉด ์–ด๋–ค ์›๋ฆฌ๋ฅผ ํ†ตํ•ด ๋ฆฌ๋ Œ๋”๋ง์„ ๋ง‰์„ ์ˆ˜ ์žˆ์„๊นŒ์š”?

โœ… ์ •๋‹ต: Selector(์„ ํƒ์  ๊ตฌ๋…)๋ฅผ ํ†ตํ•ด ํ•„์š”ํ•œ ์ƒํƒœ๋งŒ ์ž˜๋ผ์„œ ์‚ฌ์šฉํ•œ๋‹ค.

๐Ÿ’ก ์ƒ์„ธ ํ•ด์„ค:

  • ์›๋ฆฌ ์„ค๋ช…: Context API๋Š” value ๊ฐ์ฒด ์ฐธ์กฐ๊ฐ€ ๋ฐ”๋€Œ๋ฉด ํ•˜์œ„ ํŠธ๋ฆฌ๋ฅผ ๋ฌด์กฐ๊ฑด ๋ฆฌ๋ Œ๋”๋ง์‹œํ‚ต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Zustand๋Š” useStore((state) => state.user) ์ฒ˜๋Ÿผ ์ƒํƒœ์˜ ํŠน์ • ํŒŒํŽธ(Slice)๋งŒ ์„ ํƒ(Select)ํ•˜์—ฌ ๊ตฌ๋…ํ•ฉ๋‹ˆ๋‹ค. Zustand ๋‚ด๋ถ€๋Š” ์ด ์„ ํƒ๋œ ๊ฐ’์ด ๋ฐ”๋€” ๋•Œ๋งŒ ๋ฆฌ์•กํŠธ์— ๋ Œ๋”๋ง ์‹ ํ˜ธ๋ฅผ ๋ณด๋‚ด๊ธฐ ๋•Œ๋ฌธ์—, ๋ชจ๋‹ฌ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด๋„ ์œ ์ € ์ •๋ณด๋งŒ ๊ตฌ๋… ์ค‘์ธ ์ปดํฌ๋„ŒํŠธ๋Š” ์žฌํ‰๊ฐ€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์˜ค๋‹ต ํ”ผ๋“œ๋ฐฑ: "์˜์ฒ  ๋‹˜, Context ์•ˆ์—์„œ ๋ฉ”๋ชจ์ด์ œ์ด์…˜(useMemo)์„ ์—ด์‹ฌํžˆ ๊ฑฐ๋Š” ๊ฑด ์ž„์‹œ๋ฐฉํŽธ์ด์—์š”. ์• ์ดˆ์— ๊ฐ์‹œ ์ดˆ์†Œ๋ฅผ ์Šค์œ„์น˜ ํ•˜๋‚˜ ๋‹จ์œ„๋กœ ์ขํžˆ๋Š” Zustand์˜ Selector ํŒจํ„ด์ด ๋” ๊ทผ๋ณธ์ ์ธ ์„ฑ๋Šฅ ๊ฐœ์„ ์ฑ…์ด๋ž๋‹ˆ๋‹ค."
  • ๐Ÿ“Œ ํ•ต์‹ฌ ๊ธฐ์–ต๋ฒ•: ๐Ÿฆ ์˜ํ˜ธ: "Zustand๋Š” ๋ท”ํŽ˜์—์„œ ์›ํ•˜๋Š” ์ ‘์‹œ๋งŒ ํผ์˜ค๋Š” ๊ฑฐ๊ณ , Context API๋Š” ๋ท”ํŽ˜ ์‹ํƒ์„ ํ†ต์งธ๋กœ ์Ÿ์•„๋†“๊ณ  ๋„ค๊ฐ€ ์•Œ์•„์„œ ๊ณจ๋ผ ๋จน์œผ๋ผ๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค."

๐Ÿฃ ์˜์ฒ ์ด์˜ ํ‡ด๊ทผ ์ผ๊ธฐ

๋งจ๋‚  ์ตœ์ƒ๋‹จ์— Provider ๋ฐ•์•„๋„ฃ๊ณ  "์™œ ๋‹ค ๋ฆฌ์–ผํƒ€์ž„์œผ๋กœ ๊นœ๋นก๊ฑฐ๋ฆฌ์ง€?" ์ ˆ๋งํ–ˆ๋˜ ๋‚ ๋“ค์€ ์ด์ œ ์•ˆ๋…•์ด๋‹ค! ์ „์—ญ ์ƒํƒœ๋ฅผ ๋ฆฌ์•กํŠธ ๋ฐ”๊นฅ์— ์Šคํ† ์–ด๋กœ ๋นผ๋ฒ„๋ฆฌ๋‹ˆ๊นŒ ํŒŒ์ผ ๊ตฌ์กฐ๋„ ์˜คํžˆ๋ ค ํ›จ์”ฌ ์‹œ์›ํ•ด์กŒ๋‹ค. ๋‚ด์ผ์€ ์ด ๊ณฐํŒก์ด ๋‚œ Context ๋กœ์ง๋“ค ์‹น ๋‹ค Zustand๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•ด์•ผ์ง€. ๊ทธ๋‚˜์ €๋‚˜ ํ‡ด๊ทผ๊ธธ์— ๋งˆ๋ผํƒ•์— ๊ฟ”๋ฐ”๋กœ์šฐ ๋จน๊ณ  ์‹ถ์€๋ฐ, ์˜ํ˜ธ ๋ฆฌ๋“œ ๋‹˜์ด๋ž‘ ๊ฐ™์ด ๊ฐˆ๊นŒ ๋ฌผ์–ด๋ณผ๊นŒ. (์•„๋งˆ ์›๋ฆฌ ์„ค๋ช…ํ•˜์‹œ๋ฉฐ ๊ฑฐ์ ˆํ•˜์‹œ๊ฒ ์ง€ ๐Ÿค”)

๐Ÿ’ก "์ƒํƒœ ๊ด€๋ฆฌ๋Š” ์•ฑ์„ ์ปค๋‹ค๋ž€ ๋ณด์ž๊ธฐ๋กœ ๊ฐ์‹ธ๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ, ํ•„์š”ํ•œ ์ปดํฌ๋„ŒํŠธ์—๋งŒ ์–‡์€ ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ฝ‚์•„ ๋„ฃ๋Š” ๊ฒƒ์ด๋‹ค."