๐Ÿงฉ 24. ์ „์—ญ ์ƒํƒœ vs ์ง€์—ญ ์ƒํƒœ โ€” React ์ƒํƒœ ๊ด€๋ฆฌ, ์ด ๊ธฐ์ค€๋ถ€ํ„ฐ ๋ช…ํ™•ํžˆ ํ•˜์ž

JM_Devยท2025๋…„ 5์›” 4์ผ
0
post-thumbnail

React์—์„œ ์ƒํƒœ(state)๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋งŽ๋‹ค.
useState, useReducer, Context, Zustand, Redux, Recoil ๋“ฑ๋“ฑโ€ฆ
ํ•˜์ง€๋งŒ ์ด ์ค‘ ์–ด๋–ค ๊ฑธ ์–ธ์ œ ์จ์•ผ ํ• ๊นŒ?

์‚ฌ์‹ค ๊ทธ๋ณด๋‹ค ๋จผ์ € ์ •๋ฆฌํ•ด์•ผ ํ•  ๊ฑด
"์ด ์ƒํƒœ๋Š” ์ „์—ญ์ด์–ด์•ผ ํ•˜๋Š”๊ฐ€, ์ง€์—ญ์ด์–ด์•ผ ํ•˜๋Š”๊ฐ€?" ๋ผ๋Š” ๊ธฐ์ค€์ด๋‹ค.


โœ… ์ง€์—ญ ์ƒํƒœ(Local State)๋ž€?

์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ๋งŒ ์‚ฌ์šฉ๋˜๋Š” ์ƒํƒœ
โ†’ useState, useReducer๋กœ ๊ด€๋ฆฌ

โœ… ์‚ฌ์šฉ ์˜ˆ์‹œ

  • input ํ•„๋“œ ๊ฐ’
  • ๋ชจ๋‹ฌ ์—ด๋ฆผ/๋‹ซํž˜ ์—ฌ๋ถ€
  • ๋ฒ„ํŠผ ํด๋ฆญ ์—ฌ๋ถ€
  • ํ•„ํ„ฐ ์กฐ๊ฑด, ํ† ๊ธ€ UI
const [isOpen, setIsOpen] = useState(false);

๐Ÿ“Œ ํ•ด๋‹น ์ƒํƒœ๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฒ—์–ด๋‚˜๋ฉด ์˜๋ฏธ๊ฐ€ ์—†๊ณ ,
props๋กœ ๋„˜๊ฒจ์ฃผ์ง€ ์•Š๋Š” ํ•œ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค.


โœ… ์ „์—ญ ์ƒํƒœ(Global State)๋ž€?

์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋™์‹œ์— ์ ‘๊ทผํ•˜๊ณ  ๊ณต์œ ํ•ด์•ผ ํ•˜๋Š” ์ƒํƒœ
โ†’ Redux, Zustand, Recoil, Context API ๋“ฑ ์‚ฌ์šฉ

โœ… ์‚ฌ์šฉ ์˜ˆ์‹œ

  • ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž ์ •๋ณด
  • ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๋ฆฌ์ŠคํŠธ
  • ํ…Œ๋งˆ ๋ชจ๋“œ (๋ผ์ดํŠธ/๋‹คํฌ)
  • ๊ฒŒ์ž„ ์ƒํƒœ, ์›น์†Œ์ผ“ ์—ฐ๊ฒฐ ์ •๋ณด
// ์˜ˆ: Zustand ์ „์—ญ ์ƒํƒœ
const useUserStore = create((set) => ({
  user: null,
  setUser: (user) => set({ user }),
}));

๐Ÿ“Œ ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ์ „์—ญ ์ƒํƒœ๋Š” ์ ์  ๋งŽ์•„์ง€๋Š”๋ฐ,
๋ถˆํ•„์š”ํ•œ ์ „์—ญํ™”๋Š” ์˜คํžˆ๋ ค ์„ฑ๋Šฅ ์ €ํ•˜์™€ ๋ณต์žก์„ฑ๋งŒ ๋งŒ๋“ ๋‹ค.


โš–๏ธ ์–ด๋–ค ๊ธฐ์ค€์œผ๋กœ ๊ตฌ๋ถ„ํ•ด์•ผ ํ• ๊นŒ?

์งˆ๋ฌธ์ „์—ญ ์ƒํƒœ์ผ ๊ฐ€๋Šฅ์„ฑ
์ด ์ƒํƒœ๋ฅผ ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ฐธ์กฐํ•˜๋‚˜?โœ… ์˜ˆ
ํŽ˜์ด์ง€ ์ „ํ™˜ ํ›„์—๋„ ์ƒํƒœ๊ฐ€ ์œ ์ง€๋˜์–ด์•ผ ํ•˜๋‚˜?โœ… ์˜ˆ
์™ธ๋ถ€ API, ์†Œ์ผ“ ๋“ฑ ์™ธ๋ถ€์™€ ์—ฐ๊ด€๋˜์—ˆ๋‚˜?โœ… ์˜ˆ
์ด ์ƒํƒœ๊ฐ€ ํŠน์ • UI์—๋งŒ ์˜ํ–ฅ์„ ์ฃผ๋Š”๊ฐ€?โŒ ์•„๋‹ˆ์˜ค โ†’ ์ง€์—ญ ์ƒํƒœ๋กœ ๊ฐ€๋Šฅ
๋ถ€๋ชจ-์ž์‹ ๊ฐ„์—๋งŒ ๊ณต์œ ๋˜๋‚˜?โŒ props๋กœ ์ „๋‹ฌํ•˜๋ฉด ์ถฉ๋ถ„

๐Ÿ” ์‹ค์ „์—์„œ ๊ฒช์€ ์‚ฌ๋ก€

โŒ ์ƒํƒœ๋ฅผ ๋„ˆ๋ฌด ์ „์—ญํ™”ํ•œ ๊ฒฝ์šฐ

  • ๋ชจ๋“  ํ•„ํ„ฐ ๊ฐ’์„ Zustand๋กœ ๊ด€๋ฆฌํ–ˆ๋”๋‹ˆ,
  • ํ•„ํ„ฐ ์กฐ๊ฑด์ด ๋ฐ”๋€” ๋•Œ๋งˆ๋‹ค ์ „์ฒด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง
    โ†’ ์‹ค์ œ๋กœ๋Š” input ํ•˜๋‚˜๋งŒ ๋‹ค์‹œ ๊ทธ๋ฆฌ๋ฉด ๋๋Š”๋ฐโ€ฆ

โœ… ์ง€์—ญ ์ƒํƒœ๋กœ ๋ฐ”๊พผ ํ›„

  • ๊ฐ ํ•„ํ„ฐ ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ useState๋กœ ๋ถ„๋ฆฌ
    โ†’ ์„ฑ๋Šฅ ๊ฐœ์„  + ์ƒํƒœ ์ถ”์ ๋„ ์‰ฌ์›Œ์ง

โœ… ์ƒํƒœ ์„ค๊ณ„ํ•  ๋•Œ์˜ ์ˆœ์„œ ํŒ

  1. ๋จผ์ € "์ด ์ƒํƒœ๊ฐ€ ์–ด๋””์„œ ์“ฐ์ด๋Š”๊ฐ€?"๋ฅผ ํŒŒ์•…
  2. ํ•œ ๊ณณ์—์„œ๋งŒ ์“ฐ์ด๋ฉด useState
  3. ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ณต์œ ํ•˜๋ฉด Context, Zustand ๋“ฑ ๊ณ ๋ ค
  4. ํŽ˜์ด์ง€ ๊ฐ„ ์œ ์ง€ ํ•„์š” ์‹œ ์ „์—ญ ์ƒํƒœ๋กœ ์ด๋™

๐Ÿ“ ๋‚ด๊ฐ€ ๋А๋‚€ ์ 

์˜ˆ์ „์—” ์ƒํƒœ๊ฐ€ ์ƒ๊ธฐ๋ฉด ๋ฌด์กฐ๊ฑด Zustand๋กœ ๋‹ค ๋„ฃ์—ˆ๋‹ค.
๊ทธ๋Ÿฐ๋ฐ ํ”„๋กœ์ ํŠธ๊ฐ€ ์ปค์ง€๋‹ˆ๊นŒ ์ „์—ญ ์ƒํƒœ๋ฅผ ์ถ”์ ํ•˜๋Š” ๊ฒŒ ๋” ํž˜๋“ค์–ด์กŒ๋‹ค.
์ง€๊ธˆ์€ ๋ฌด์กฐ๊ฑด "์ด๊ฑด ์ง„์งœ ์ „์—ญ์ด์–ด์•ผ ํ•ด?"๋ฅผ ๋จผ์ € ์ž๋ฌธํ•œ๋‹ค.

๊ทธ ๊ธฐ์ค€๋งŒ ์„ธ์šฐ๋ฉด ์ƒํƒœ ๊ด€๋ฆฌ๋Š” ํ›จ์”ฌ ์‰ฌ์›Œ์ง€๊ณ ,
๋ฒ„๊ทธ๋„ ์ค„๊ณ , ๋ฆฌ๋ Œ๋”๋ง๋„ ์ค„์–ด๋“ค์—ˆ๋‹ค.


๐Ÿง  "์ƒํƒœ ๊ด€๋ฆฌ๋ž€, ๋จผ์ € '๋ฒ”์œ„'๋ฅผ ์ •ํ•œ ๋‹ค์Œ์— '๋„๊ตฌ'๋ฅผ ๊ณ ๋ฅด๋Š” ์ผ์ด๋‹ค."

profile
๊ฐœ๋ฐœ์ž๋กœ ์ทจ์—…์„ ์ค€๋น„ ์ค‘ ์ด๋ฉฐ, ์—ด์‹ฌํžˆ ๊ณต๋ถ€ ์ค‘ ์ž…๋‹ˆ๋‹ค!

0๊ฐœ์˜ ๋Œ“๊ธ€