๐Ÿ“ฆRedux๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

๋ฐœํ–‰: (2026๋…„ 2์›” 13์ผ ์˜ค์ „ 08:05 GMT+9)
5 ๋ถ„ ์†Œ์š”
์›๋ฌธ: Dev.to

Source: Dev.to

ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ, ํŠนํžˆ React๋ฅผ ๋ฐฐ์šฐ๊ณ  ์žˆ๋‹ค๋ฉด Redux์— ๋Œ€ํ•ด ๋“ค์–ด๋ดค์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ์—” ํ—ท๊ฐˆ๋ฆด ์ˆ˜ ์žˆ์ง€๋งŒ, ํ•ต์‹ฌ ์•„์ด๋””์–ด๋Š” ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

Redux๋ž€?

Redux๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๋‹จ์ผ, ์ค‘์•™ ์žฅ์†Œ๋ฅผ ์ œ๊ณตํ•˜๋Š” ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ฝ๊ณ  ์“ธ ์ˆ˜ ์žˆ๋Š” ํฐ ์ €์žฅ ์ƒ์ž๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด, ๋ฐ˜๋ณต์ ์ธ propโ€‘drilling์„ ์—†์•จ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•ต์‹ฌ ๊ฐœ๋…

Store

์Šคํ† ์–ด๋Š” ์ „์ฒด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒํƒœ๋ฅผ ๋ณด๊ด€ํ•ฉ๋‹ˆ๋‹ค.

// Example state
{
  count: 0
}

์Šคํ† ์–ด๋ฅผ ์ฐฝ๊ณ , ์€ํ–‰ ์‚ฌ๋ฌผํ•จ, ํ˜น์€ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ด์•„์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ฐ•์Šค๋กœ ์ƒ์ƒํ•ด ๋ณด์„ธ์š”.

Action

์•ก์…˜์€ ๋ฌด์—‡์ด ์ผ์–ด๋‚˜์•ผ ํ•˜๋Š”์ง€๋ฅผ ์„ค๋ช…ํ•˜๋Š” ์ˆœ์ˆ˜ JavaScript ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.

// Example action
{
  type: "INCREMENT"
}

์•ก์…˜์€ ๋ ˆ์Šคํ† ๋ž‘์—์„œ ์ฃผ๋ฌธ์„ ๋„ฃ๊ฑฐ๋‚˜, ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๊ฑฐ๋‚˜, ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๋Š” ํ–‰์œ„์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Reducer

๋ฆฌ๋“€์„œ๋Š” ์•ก์…˜์— ๋Œ€ํ•œ ์‘๋‹ต์œผ๋กœ ์ƒํƒœ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ณ€ํ• ์ง€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ์ˆœ์ˆ˜ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

function counterReducer(state = { count: 0 }, action) {
  if (action.type === "INCREMENT") {
    return { count: state.count + 1 };
  }
  return state;
}

๋ฆฌ๋“€์„œ๋Š” ์ฃผ๋ฌธ(์•ก์…˜)์„ ๋ฐ›๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“ค์–ด ๋‚ด๋Š” ์š”๋ฆฌ์‚ฌ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ ํ๋ฆ„ ์˜ˆ์‹œ

๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ์นด์šดํ„ฐ๋ฅผ ์ฆ๊ฐ€์‹œํ‚ฌ ๋•Œ:

  1. ์‚ฌ์šฉ์ž๊ฐ€ ๋ฒ„ํŠผ ํด๋ฆญ ๐Ÿ–ฑ๏ธ
  2. ์•ก์…˜์ด ๋””์ŠคํŒจ์น˜๋จ ๐Ÿ“ข ({ type: "INCREMENT" })
  3. ๋ฆฌ๋“€์„œ๊ฐ€ ์•ก์…˜์„ ๋ฐ›์•„ ๐Ÿ” ์ƒˆ๋กœ์šด ์ƒํƒœ๋ฅผ ๋ฐ˜ํ™˜
  4. ์Šคํ† ์–ด๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธ ๐Ÿฌ
  5. UI๊ฐ€ ์ž๋™์œผ๋กœ ๋‹ค์‹œ ๋ Œ๋”๋ง ๐ŸŽ‰

์ด ์ผ๋ฐฉํ–ฅ ํ๋ฆ„ (action โ†’ reducer โ†’ store โ†’ UI) ์„ ๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

Redux ์‚ฌ์šฉ์˜ ์žฅ์ 

  • โœ… ํฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒํƒœ๋ฅผ ์ค‘์•™์—์„œ ๊ด€๋ฆฌ
  • โœ… ๋งŽ์€ ์ปดํฌ๋„ŒํŠธ์— ๊ฑธ์นœ prop drilling ๋ฐฉ์ง€
  • โœ… ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๊ณ  ์ถ”์  ๊ฐ€๋Šฅํ•˜๊ฒŒ ์œ ์ง€
  • โœ… Redux DevTools ๊ฐ™์€ ๋„๊ตฌ๋กœ ๋””๋ฒ„๊น… ๊ฐ„์†Œํ™”
  • โœ… ๊น”๋”ํ•˜๊ณ  ์กฐ์ง์ ์ธ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ ์œ ์ง€

Redux๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•  ๋•Œ

Redux๊ฐ€ ๋น›์„ ๋ฐœํ•˜๋Š” ๊ฒฝ์šฐ:

  • ๋งŽ์€ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•˜๋Š” ๊ทœ๋ชจ๊ฐ€ ํฐ ์•ฑ
  • ์ƒํƒœ ๋กœ์ง์ด ๋ณต์žกํ•˜๊ฑฐ๋‚˜ ์ƒํ˜ธ์ž‘์šฉ์ด ๋งŽ์€ ๊ฒฝ์šฐ
  • ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ์‹ ๋ขฐ์„ฑ ์žˆ๊ฒŒ ์ถ”์ ยท๋””๋ฒ„๊น…ํ•ด์•ผ ํ•  ๋•Œ

์•„์ฃผ ์ž‘์€ ์•ฑ์—์„œ๋Š” Redux๊ฐ€ ๋ถˆํ•„์š”ํ•œ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Redux Toolkit

Redux Toolkit์€ Redux ๋กœ์ง์„ ์ž‘์„ฑํ•˜๋Š” ํ˜„๋Œ€์ ์ด๊ณ  ๊ถŒ์žฅ๋˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. Toolkit์€ Redux๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค:

  • ์„ค์ •์ด ๋” ์‰ฌ์›€ ๐Ÿ˜Š
  • ์ฝ”๋“œ๊ฐ€ ๋” ๊น”๋”ํ•˜๊ณ  ๊ฐ„๊ฒฐํ•จ โœจ
  • ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ ๊ฐ์†Œ ๐Ÿงน

Toolkit์„ ์‚ฌ์šฉํ•˜๋ฉด ์Šฌ๋ผ์ด์Šค, ๋ฆฌ๋“€์„œ, ๋น„๋™๊ธฐ thunk ๋“ฑ์„ ํ›จ์”ฌ ์ ์€ ์ฝ”๋“œ ๋ผ์ธ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์š”์•ฝ

  • ๐Ÿง  Store = ์ค‘์•™ ๋ฐ์ดํ„ฐ ์ปจํ…Œ์ด๋„ˆ
  • ๐Ÿ“ข Action = ๋ฌด์—‡์ด ์ผ์–ด๋‚˜์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์„ค๋ช…
  • ๐Ÿ” Reducer = ์ƒˆ๋กœ์šด ์ƒํƒœ๋ฅผ ๋งŒ๋“ค์–ด ๋‚ด๋Š” ๋กœ์ง
  • ๐Ÿฌ Redux = ๋ชจ๋“  ๊ฒƒ์„ ์—ฐ๊ฒฐํ•ด ์ฃผ๋Š” ์ „์ฒด ๊ด€๋ฆฌ ์‹œ์Šคํ…œ

์นด์šดํ„ฐ๋‚˜ todo ์•ฑ ๊ฐ™์€ ์ž‘์€ ์˜ˆ์ œ๋กœ ์‹œ์ž‘ํ•ด ํ๋ฆ„์„ ์—ฐ์Šตํ•˜๋ฉด, ๊ธˆ๋ฐฉ Redux์— ์ต์ˆ™ํ•ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ๋ฅผ ๊ณ„์† ๋งŒ๋“ค๋ฉด์„œ ๊ฒฝํ—˜์„ ์Œ“๋‹ค ๋ณด๋ฉด Redux๊ฐ€ React ํˆดํ‚ท์˜ ์ž์—ฐ์Šค๋Ÿฌ์šด ์ผ๋ถ€๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๐Ÿš€

0 ์กฐํšŒ
Back to Blog

๊ด€๋ จ ๊ธ€

๋” ๋ณด๊ธฐ ยป

Google Street View๋ฅผ React ์•ฑ์— ํ†ตํ•ฉํ•˜๊ธฐ (Google Maps ์—†์ด)

์†Œ๊ฐœ Google Maps๋Š” ๋งŽ์€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์ง€๋งŒ, ๋†’์€ ํŠธ๋ž˜ํ”ฝ์—์„œ์˜ ๋น„์šฉ์ด ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ Google Street View๋ฅผ ์•ฑ์— ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฏธ์นœ React key

tsx์—์„œ map์„ ํ†ตํ•œ ๋ Œ๋”๋ง export function Parent { const array, setArray = useState(1, 2, 3, 4, 5); useEffect(() => { setTimeout(() => { setArray(prev => [6, 7, 8, 9, 10, ...prev]); ... }); }); }

์ œ๋กœ์—์„œ ๋žญํฌ๊นŒ์ง€: Next.js 14์™€ Cloudflare๋กœ ๊ณ ์„ฑ๋Šฅ NBA ํ”Œ๋ ˆ์ด์–ด ๋žœ๋ค๋ผ์ด์ € ๊ตฌ์ถ•

๊ฐœ๋ฐœ์ž์ด์ž NBA ํŒฌ์œผ๋กœ์„œ, r/NBA2K ๊ฐ™์€ ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ๋ฐ˜๋ณต๋˜๋Š” ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค: ํ”Œ๋ ˆ์ด์–ด๋“ค์ด ์ƒˆ๋กœ์šด MyLeague ๋ฆฌ๋นŒ๋“œ๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ ์ข…์ข… โ€œchoice paralysisโ€์— ๋น ์ง‘๋‹ˆ๋‹ค.