[React] Context API vs Redux

๋ฐฑ๊ด‘ํ˜„ยท2022๋…„ 9์›” 20์ผ
0

๐Ÿ’ก Context API๋ž€?

์ผ๋ฐ˜์ ์ธ React์—์„œ prop ์ „๋‹ฌ์˜ ํ๋ฆ„์€ ํ•˜ํ–ฅ์‹์ด๋‹ค. (๋ถ€๋ชจ์—์„œ ์ž์‹์œผ๋กœ) ์ „๋‹ฌ๋˜๋Š” prop์ด ๋งŽ์•„์ง€๊ณ  ์ปดํฌ๋„ŒํŠธ ๊นŠ์ด๊ฐ€ ๊นŠ์–ด์ง€๋ฉด ๊ด€๋ฆฌ๊ฐ€ ๋ฒˆ๊ฑฐ๋กœ์›Œ ์งˆ ์ˆ˜ ์žˆ๋‹ค. Context Tree๋Š” ์ปจํ…์ŠคํŠธ ์•ˆ์— ํฌํ•จ๋œ ๋ชจ๋“  ๋ ˆ๋ฒจ์—์„œ ๋ช…์‹œ์ ์œผ๋กœ prop์„ ์ „๋‹ฌํ•˜์ง€ ์•Š๊ณ , ์–ด๋””์„œ๋“  ์ƒํƒœ๊ฐ’์— ์ ‘๊ทผ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•œ๋‹ค.

Context๋Š” ์•„๋ฌด๊ฒƒ๋„ ๊ด€๋ฆฌํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋‹จ์ˆœํ•œ ๊ฐ’์„ ์ „๋‹ฌํ•˜๋Š” ํŒŒ์ดํ”„์™€ ๊ฐ™๋‹ค. ์‚ฌ์šฉํ•˜๋Š” ์ฃผ์š” ๋ชฉ์ ์€ prop-drilling์„ ํ”ผํ•˜๋Š” ๊ฒƒ์ด๋‹ค. prop-passing ๋กœ์ง์„ ์ž‘์„ฑํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ๊ฐ€ ๋‹จ์ˆœํ•ด์ง„๋‹ค.

๐Ÿ’ก Redux๋ž€?

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด์— ๋Œ€ํ•œ ์ƒํƒœ ์ค‘์•™ ์ €์žฅ์†Œ ์—ญํ• ์„ ํ•˜๋ฉฐ ์•ก์…˜์ด๋ผ๋Š” ์ด๋ฒคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํƒœ๋ฅผ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ๋ฐฉ์‹์œผ๋กœ ์—…๋ฐ์ดํŠธ ํ•˜๊ธฐ ์œ„ํ•œ ํŒจํ„ด ๋˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.

Redux์—์„œ ์ œ๊ณตํ•˜๋Š” ํŒจํ„ด๊ณผ ๋„๊ตฌ๋“ค์„ ์‚ฌ์šฉํ•˜๋ฉด ์ƒํƒœ๊ฐ€ ์–ธ์ œ, ์–ด๋””์„œ, ์–ด๋–ป๊ฒŒ, ์™œ ์—…๋ฐ์ดํŠธ ๋˜์—ˆ๋Š”์ง€ ์‰ฝ๊ฒŒ ์ดํ•ด ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์ƒํƒœ ๊ด€๋ฆฌ
  • Redux์˜ ๋ชฉ์ ์€ ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ์ƒํƒœ ๊ฐ’๋“ค์ด ์–ด๋–ป๊ฒŒ ๋ณ€ํ•˜๋Š”์ง€ ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š”๊ฒƒ์ด๋‹ค.

React์—์„œ Redux๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” React-Redux ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” Redux์—์„œ ์ƒํƒœ ๊ฐ’์„ ์ฝ๊ณ  action์„ React ์ปดํฌ๋„ŒํŠธ์—๊ฒŒ ์ „๋‹ฌํ•˜์—ฌ Redux ์ €์žฅ์†Œ์™€ ์ƒํ˜ธ ์ž‘์šฉ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” UI๋ฐ”์ธ๋”ฉ ๋ ˆ์ด์–ด์ด๋‹ค.

React-Redux ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ชจ๋“  React ์š”์†Œ๋“ค์ด Redux ์ €์žฅ์†Œ์— ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•œ๋ฐ ์ด๋Š” React-Redux ๋‚ด๋ถ€์—์„œ Context ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์—ฌ๊ธฐ์„œ ์ฃผ์˜ํ•  ์ ์€ React-Redux ๋Š” ํ˜„์žฌ์˜ ์ƒํƒœ๊ฐ’์ด ์•„๋‹Œ Context ๋ฅผ ํ†ตํ•ด Redux ์ €์žฅ์†Œ ์ธ์Šคํ„ด์Šค๋งŒ ์ „๋‹ฌํ•œ๋‹ค๋Š”์ ์ด๋‹ค.

Redux ๋ชฉ์ 

  • UI ๋ ˆ์ด์–ด์™€ ๋ถ„๋ฆฌ๋œ ์ƒํƒœ ๊ด€๋ฆฌ ๋กœ์ง ์ž‘์„ฑ์ด ํ•„์š”ํ•  ๋•Œ
  • ์„œ๋กœ ๋‹ค๋ฅธ ui ๊ณ„์ธต๊ฐ„์— ์ƒํƒœ ๊ณต์œ ๊ฐ€ ํ•„์š”ํ•  ๋•Œ
  • Redux ๋ฏธ๋“ค์›จ์–ด ๊ธฐ๋Šฅ์„ ๋นŒ๋ ค ์•ก์…˜์ด ์ „๋‹ฌ ๋  ๋•Œ ์ถ”๊ฐ€์ ์ธ ๋กœ์ง์ด ํ•„์š”ํ• ๋•Œ

โญ๏ธ Context๊ฐ€ ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ์•„๋‹Œ ์ด์œ 

์ƒํƒœ๊ด€๋ฆฌ๋ผ ํ•˜๋ฉด ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ๋ฐฉ์‹์„ ์˜๋ฏธํ•œ๋‹ค.

  • ์ดˆ๊ธฐ ๊ฐ’์„ ์ €์žฅํ•œ๋‹ค.
  • ํ˜„์žฌ ๊ฐ’์„ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค.
  • ๊ฐ’ ์—…๋ฐ์ดํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

React useState์™€ useReducer๊ฐ€ ์ƒํƒœ ๊ด€๋ฆฌ์˜ ์ข‹์€ ์˜ˆ์ด๋‹ค.

  • hook์„ ํ˜ธ์ถœํ•˜์—ฌ ์ดˆ๊ธฐ ๊ฐ’ ์ €์žฅ
  • hook์„ ํ˜ธ์ถœํ•˜์—ฌ ํ˜„์žฌ ๊ฐ’์„ ์ฝ๋Š”๋‹ค
  • ์ œ๊ณต๋œ setState, dispatch ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๊ฐ’์„ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.
  • ๊ตฌ์„ฑ์š”์†Œ๊ฐ€ re-render ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ’์ด ์—…๋ฐ์ดํŠธ ๋์Œ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ Redux, Recoil, Mob x ๋„ ์œ„์˜ ์กฐ๊ฑด๋“ค์„ ์ถฉ์กฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒํƒœ๊ด€๋ฆฌ๋ผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

Context์˜ ๊ฒฝ์šฐ ์œ„์˜ ์กฐ๊ฑด์„ ์ถฉ์กฑํ•˜์ง€ ์•Š๋Š”๋‹ค. Context๋Š” ์ „๋‹ฌ๋˜๋Š” ๊ฐ’์„ ๊ฒฐ์ •ํ•˜๋Š” ์—ญํ• ์„ ํ•˜๊ณ  ์ผ๋ฐ˜์ ์œผ๋กœ ์‹ค์ œ ์ƒํƒœ ๊ด€๋ฆฌ๋Š” useState/useReducer hook๊ณผ ํ•จ๊ป˜ ๋ฐœ์ƒํ•œ๋‹ค.

Context๋Š” ์ƒํƒœ(์ด๋ฏธ ์กด์žฌํ•˜๋Š”, ์–ด๋”˜๊ฐ€์— ์žˆ๋Š”)๊ฐ€ Context Tree ๋‚ด๋ถ€์— ํฌํ•จ๋œ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ๋“ค๊ณผ ๊ณต์œ ๋˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

Context์™€ useReducer

useReducer๋Š” Redux + React-Redux์™€ ๋น„์Šทํ•œ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

  • ๊ฐ’์˜ ์ €์žฅ
  • reducer ํ•จ์ˆ˜
  • action ์ „๋‹ฌ
  • ๊ฐ’์„ ์ „๋‹ฌํ•˜๊ณ  ์ปดํฌ๋„ŒํŠธ์—์„œ ์ฝ๋Š” ๋ฐฉ๋ฒ•

๊ธฐ๋Šฅ๊ณผ ๋™์ž‘์—๋Š” ์ฐจ์ด์ ์ด ๋งŽ์Œ

  • Context + useReducer๋Š” Context๋ฅผ ํ†ตํ•ด ํ˜„์žฌ ์ƒํƒœ ๊ฐ’์„ ์ „๋‹ฌํ•˜๋Š”๋ฐ ์˜์กด.
    React-Redux๋Š” Context๋ฅผ ํ†ตํ•ด ํ˜„์žฌ Redux ์Šคํ† ์–ด ์ธ์Šคํ„ด์Šค๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.

  • useReducer์˜ ๊ฒฝ์šฐ ์ƒˆ๋กœ์šด ์ƒํƒœ ๊ฐ’์„ ์ƒ์„ฑ ํ•  ๋•Œ ํ•ด๋‹น Context ๋‚ด๋ถ€์— ํฌํ•จ๋œ ์ปดํฌ๋„ŒํŠธ๋“ค์ด ์ƒํƒœ ๊ฐ’์˜ ์ผ๋ถ€์—๋งŒ ๊ด€์‹ฌ์ด ์žˆ๋”๋ผ๋„ ๊ฐ•์ œ๋กœ re-render ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
    re-render ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒ ํ•  ์ˆ˜ ์žˆ๋‹ค. React-redux๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ €์žฅ์†Œ ์ƒํƒœ์˜ ํŠน์ • ๋ถ€๋ถ„๋งŒ ์‚ฌ์šฉํ•˜๊ณ  ํ•ด๋‹น ๊ฐ’์ด ๋ณ€๊ฒฝ ๋  ๋•Œ๋งŒ re-render ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • Context + useReducersms React์˜ ๊ธฐ๋Šฅ์ด๊ธฐ ๋•Œ๋ฌธ์— React ์™ธ๋ถ€์—์„œ๋Š” ์‚ฌ์šฉ์ด ๋ถˆ๊ฐ€ํ•˜๋‹ค. Redux๋Š” UI ๋…๋ฆฝ์ ์ด๊ธฐ ๋•Œ๋ฌธ์— React์™€ ๋ณ„๋„๋กœ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

  • useReducer๋Š” ๋ฏธ๋“ค์›จ์–ด๊ฐ€ ์—†๋‹ค.

Context API + useReducer๋Š” ๋‚ฎ์€ ๊ทœ๋ชจ์™€ ๋นˆ๋„์˜ ์—…๋ฐ์ดํŠธ์™€ ๊ฐ™์€ ์ •์ ์ธ ์ƒํƒœ์˜ ์ „๋‹ฌ์—๋Š” ๊ดœ์ฐฎ์ง€๋งŒ, Flux์™€ ์œ ์‚ฌํ•œ ์ƒํƒœ ์ „ํŒŒ์˜ ๋Œ€์ฒด๋ฌผ๋กœ๋Š” ๋ถ€์กฑํ•˜๋‹ค.

์ตœ์ข… ์ •๋ฆฌ

  • ๋‹จ์ˆœ prop-drilling์„ ํ”ผํ•˜๋Š” ๊ฒƒ์ด ๋ชฉ์ ์ด๋ผ๋ฉด Context๋ฅผ ์‚ฌ์šฉํ•˜์ž.

  • ์ ๋‹นํžˆ ๋ณต์žกํ•œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žˆ๊ฑฐ๋‚˜ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๋ฉด Context +useReducer๋ฅผ ์‚ฌ์šฉํ•ด๋ผ

  • ํŠน์ • ๊ตฌ์„ฑ ์š”์†Œ๋งŒ re-render ์‹œํ‚ค๊ฑฐ๋‚˜, ์‚ฌ์ด๋“œ์ดํŽ™ํŠธ๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด ๋” ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•˜๋‹ค๋ฉด Redux + React+Redux๋ฅผ ์‚ฌ์šฉ

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