[React] Redux, Recoil

๊น€์ฑ„์šดยท2022๋…„ 10์›” 4์ผ
0

React

๋ชฉ๋ก ๋ณด๊ธฐ
5/26

๐Ÿ‘‰ redux์™€ recoil์— ๋Œ€ํ•œ ์„ค๋ช…๊ณผ ๋น„๊ต๋ฅผ ํ•˜๊ธฐ ์ „์— ์ด๋Ÿฌํ•œ ์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์™œ ์‚ฌ์šฉํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์„ค๋ช…์ด ๋จผ์ € ํ•„์š”ํ•˜๋‹ค.
react๋กœ ๊ฐœ๋ฐœ์„ ํ•˜๋‹ค๋ณด๋ฉด ์ƒํƒœ๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ ์ปดํฌ๋„ŒํŠธ์—์„œ ํ•„์š”ํ•  ๋•Œ๊ฐ€ ์žˆ๋Š”๋ฐ ์ด๋•Œ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์— ์ƒํƒœ๋ฅผ ์„ ์–ธํ•ด๋†“๊ณ  ํ•„์š”ํ•œ ์ปดํฌ๋„ŒํŠธ๋งˆ๋‹ค ์ „๋‹ฌ์„ ํ•ด์ค€๋‹ค. ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ๋‹จ๊ณ„๊ฐ€ ๊ฐ„๋‹จํ•œ ๊ฒฝ์šฐ์—” ํ•œ๋ฒˆ์œผ๋กœ ์ „๋‹ฌ์ด ๋๋‚  ์ˆ˜ ์žˆ์ง€๋งŒ ์ƒํƒœ๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ ๊นŒ์ง€์˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊นŠ๋‹ค๋ฉด ์ค‘๊ฐ„์— ์ด ์ƒํƒœ๋ฅผ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š๋Š” ์ปดํฌ๋„ŒํŠธ๊นŒ์ง€ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค.
์ด๋ ‡๊ฒŒ ๋˜๋ฉด ์•ฑ์ด ์ปค์งˆ์ˆ˜๋ก ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ์—‰๋ง์ด ๋˜๊ณ  ๋ณต์žกํ•ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ์œ ์ง€๋ณด์ˆ˜ ๋˜ํ•œ ํž˜๋“ค์–ด์ง„๋‹ค.
๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฐ ์ƒํƒœ๊ด€๋ฆฌ ํˆด์ด ํ•„์š”ํ•œ ๊ฒƒ์ด๋‹ค.

Redux

๋ฆฌ๋•์Šค๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ state๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์˜คํ”ˆ์†Œ์Šค JavaSctipt ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.
sotre๋ผ๊ณ  ํ•˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ, ํ•œ ๋ฒˆ ์„ค์ •์œผ๋กœ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ชจ๋“  ์ƒํƒœ๋ฅผ ํฌํ•จํ•˜๊ณ , ํ•„์š”ํ•  ๋•Œ ์—…๋ฐ์ดํŠธ ํ•ด์ฃผ๋Š” ๋ฐฉ์‹์ด๋‹ค.

๐Ÿ“ŒMVC ํŒจํ„ด

๋ฆฌ๋•์Šค๊ฐ€ ๋“ฑ์žฅํ•˜๊ธฐ ์ด์ „ ํ”„๋ก ํŠธ์—”๋“œ์—์„œ ๋ฐ์ดํ„ฐ์˜ ํ๋ฆ„์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์€ MVC ํŒจํ„ด์ด์—ˆ๋‹ค.
ํ•˜๋‚˜์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜, ํ”„๋กœ์ ํŠธ๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ ๊ทธ ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ์„ธ๊ฐ€์ง€์˜ ์—ญํ• ๋กœ ๊ตฌ๋ถ„ํ•œ ํŒจํ„ด์ด๋‹ค.

  • Model : ๋ฐ์ดํ„ฐ ํ˜•์‹์ด๋‚˜ ๊ตฌ์กฐ๋ฅผ ๊ด€๋ฆฌ
  • View : ์ฝ”๋“œ๊ฐ€ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ง€๋Š” ๋ถ€๋ถ„์„ ๋‹ด๋‹น
  • Controller : ๋ณ€ํ™”ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌ

โœ”๏ธ ์œ„์˜ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ์‚ฌ์šฉ์ž๊ฐ€ controller๋ฅผ ์กฐ์ž‘ํ•˜๋ฉด controller๋Š” model์„ ํ†ตํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ๊ทธ ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์‹œ๊ฐ์ ์ธ ํ‘œํ˜„์„ ๋‹ด๋‹นํ•˜๋Š” view๋ฅผ ์ œ์–ดํ•ด์„œ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ „๋‹ฌํ•˜๊ฒŒ ๋œ๋‹ค.

โœ”๏ธ ๋งŒ์•ฝ state๊ฐ€ ๋ณ€ํ™”ํ•˜๊ฒŒ ๋˜๋ฉด, view,model,controller์— ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ๊ฐ’์ด ๋ณ€ํ™”ํ•˜๋Š” ๋“ฑ, ๋ณต์žกํ•˜๊ณ  ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ํŒŒ์•…ํ•˜๊ธฐ ํž˜๋“  ๊ตฌ์กฐ๋กœ ๋˜์–ด ์žˆ๋‹ค. ์›์ธ์€ '์–‘๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„'์ด๋ผ๋Š” ์ ์ด๋‹ค.

โœ”๏ธ ์ด๋Ÿฌํ•œ ์–‘๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ๋Š” ํ”„๋กœ์ ํŠธ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ํ๋ฆ„์„ ์ œ์–ดํ•˜๊ธฐ๊ฐ€ ํž˜๋“ค๊ณ , ์š”์ฆ˜๊ฐ™์ด ์‚ฌ์šฉ์ž์™€์˜ ์ƒํ˜ธ์ž‘์šฉ์ด ๋งŽ์•„์ง€๊ณ  ์žˆ๋Š” ์ƒํ™ฉ์—์„œ state ๊ด€๋ฆฌ๊ฐ€ ๋ณต์žกํ•ด์ง์— ๋”ฐ๋ผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๊ตฌ๋™๋˜์–ด์•ผ ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์ œ๋Œ€๋กœ ์ด๋ฃจ์–ด์ง€์ง€ ์•Š์•„, state ์ฐจ์ด๋กœ ์ธํ•œ ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฌธ์ œ์ ์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค.
์ด๋Ÿฌํ•œ ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„์ด๋ผ๋Š” ํŠน์ง•์„ ๊ฐ–๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐœ๋ฐœํ•˜๊ณ ์ž ํ–ˆ๊ณ  2014๋…„ ํŽ˜์ด์Šค๋ถ์—์„œ flux๋ฅผ ๊ฐœ๋ฐœํ•˜๊ฒŒ ๋œ๋‹ค.

๐Ÿ“ŒFlux ํŒจํ„ด

React + Flux์˜ ๊ตฌ์กฐ์— 'Reducer'๋ฅผ ๊ฒฐํ•ฉํ•œ ๊ฒŒ 'Redux'
React+Flux(Action,Dispatch,Store,View(Subscription))+reducer = redux
'Redux = (Red)ucer+Fl(ux)`

  • Action : state๋ฅผ ๋ฐ”๊พธ๋Š” ๋ฐฉ์‹. ์•ก์…˜ ๊ฐ์ฒด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ , ๋ฐ˜๋“œ์‹œ type ํ•„๋“œ๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
  • Dispatch : Action์„ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๊ฒƒ์œผ๋กœ action ๊ฐ์ฒด๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›๋Š”๋‹ค.
  • Reducer: ๋ณ€ํ™”๋ฅผ ์ผ์œผํ‚ค๋Š” ํ•จ์ˆ˜๋กœ Action์˜ ๊ฒฐ๊ณผ๋กœ state๋ฅผ ์ง์ ‘์ ์œผ๋กœ ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•œ ๋ถ€๋ถ„์ด๋‹ค. ํ˜„์žฌ ์ƒํƒœ์™€ ์ „๋‹ฌ๋ฐ›์€ ์•ก์…˜ ๊ฐ์ฒด๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์•„์„œ ์ƒˆ๋กœ์šด ์ƒํƒœ๋กœ ๋ฐ˜ํ™˜ํ•ด์ค€๋‹ค. ๋ฆฌ๋“€์…”๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ ์™ธ์˜ ๊ฐ’์„ ์˜์กดํ•˜๋ฉด ์•ˆ ๋˜๊ณ , ์ด์ „ ์ƒํƒœ๋Š” ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š์€ ์ƒํƒœ๋กœ ์ƒˆ๋กœ์šด ์ƒํƒœ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ๋ฐ˜ํ™˜ํ•˜๋Š” ์ˆœ์ˆ˜ํ•จ์ˆ˜์—ฌ์•ผ ํ•œ๋‹ค.
  • Store : ํ”„๋กœ์ ํŠธ์— ๋ฆฌ๋•์Šค๋ฅผ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๊ฒƒ์œผ๋กœ ํ”„๋กœ์ ํŠธ์—๋Š” ๋‹จ ํ•œ ๊ฐœ์˜ Store๋งŒ์„ ํ•„์š”๋กœ ํ•˜๋ฉฐ ์ƒํƒœ์˜ ์ค‘์•™ ์ €์žฅ์†Œ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. Store ์•ˆ์—๋Š” ๋ฆฌ๋“€์„œ์™€ ๋‚ด์žฅ ํ•จ์ˆ˜ ๋“ฑ์ด ํฌํ•จ๋˜์–ด ์žˆ๋‹ค. (dispatch์™€ subscribe๋“ฑ๋„ ์Šคํ† ์–ด์˜ ๋‚ด์žฅ ํ•จ์ˆ˜์ด๋‹ค.) ์ƒํƒœ๋ฅผ ์ฝ์„ ๋•Œ๋Š” getState(), ์ƒํƒœ๋ฅผ ๋ฐ”๊ฟ€ ๋•Œ๋Š” dispatch()๋ฅผ ํ˜ธ์ค„ํ•œ๋‹ค.

โœ”๏ธ MVC ํŒจํ„ด๊ณผ๋Š” ๋‹ฌ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ๋ณ€๊ฒฝ์‹œํ‚ค์ง€ ์•Š๊ณ  Action๋งŒ์„ ๋„˜๊ฒจ์ค€ ํ›„, View์—์„œ ์ด๋ค„์ง„ Action์€ ๋ฐ˜๋“œ์‹œ Dispatcher๋ฅผ ๊ฑฐ์ณ์„œ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์„ ์ง„ํ–‰ํ•œ๋‹ค.

โœ”๏ธ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์ด ์ด๋ค„์ง„ ํ›„, store์— ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ๊ณผ์ •์„ ํ†ตํ•ด์„œ view๋Š” ๋ณ€๊ฒฝ๋œ ๋ฐ์ดํ„ฐ๋ฅผ store๋ฅผ ํ†ตํ•ด์„œ ์ „๋‹ฌ๋ฐ›๊ฒŒ ๋œ๋‹ค.

โœ”๏ธ ์ด๊ฐ™์€ ๊ณผ์ •์„ ํ†ตํ•ด ์ด๋ค„์ง„ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์€ ๋ทฐ์™€ ๋ชจ๋ธ ์‚ฌ์ด์˜ state ์ „์ด๋ฅผ ๊ฐ„ํŽธํ™”ํ•ด์ฃผ๊ณ  ๊ธฐ์กด์— ํ๋ฆ„์„ ํŒŒ์•…ํ•˜๊ธฐ ์–ด๋ ค์› ๋˜ ๊ด€๋ฆฌ์—์„œ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ฃผ์–ด ๋”์šฑ ํŽธ๋ฆฌํ•œ state ๋ณ€๊ฒฝ ๋ฐฉ๋ฒ•์„ ์ œ์‹œํ•ด์ค€๋‹ค.

โœ”๏ธ ์œ„์™€ ๊ฐ™์€ ๋ฐฉ์‹์„ ์ฑ„ํƒํ•˜์—ฌ 2015๋…„์— React+Flux ๊ตฌ์กฐ์— Reducer๋ฅผ ๊ฒฐํ•ฉํ•œ 'Redux'๊ฐ€ ๋“ฑ์žฅํ•˜๊ฒŒ ๋œ๋‹ค.

Redux์˜ ํŠน์ง•

  • ์ƒํƒœ๋ฅผ ์ „์—ญ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณต์žกํ•œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ƒํƒœ๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ์— ํŽธ๋ฆฌํ•˜๋‹ค.
  • ๋ฐ์ดํ„ฐ ํ๋ฆ„์ด ๋‹จ๋ฐฉํ–ฅ์œผ๋กœ ํ๋ฅธ๋‹ค.
  • ์ƒํƒœ ๊ด€๋ฆฌ์—์„œ ๋ถˆ๋ณ€์„ฑ ์œ ์ง€๊ฐ€ ๋งค์šฐ ์ค‘์š”ํ•˜๋‹ค. ์ƒํƒœ๋ฅผ ์ฝ๊ธฐ์ „์šฉ์œผ๋กœ ์ทจ๊ธ‰ํ•œ๋‹ค. Immutable.js ์™€ ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์“ฐ์ด๊ธฐ๋„ ํ•œ๋‹ค.
  • flux ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋”ฐ๋ฅธ๋‹ค (๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด redux-thunk๋‚˜ redux-saga์™€ ๊ฐ™์€ ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋„ ํ•œ๋‹ค.)
  • ๊ฐœ๋…์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ์„ ํ–‰๋˜์–ด์•ผ ํ•˜๊ณ , ์—ฌ๋Ÿฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋Ÿฌ๋‹์ปค๋ธŒ๊ฐ€ ๋†’์€ ํŽธ์ด๋‹ค.
  • ์•ก์…˜์„ ํ•˜๋‚˜ ์ถ”๊ฐ€ํ•˜๊ณ  ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜๋Š”๋ฐ ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š” ์ฝ”๋“œ์–‘์ด ๋งŽ๋‹ค.

Recoil

Recoil์€ ์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค ์ค‘ ๊ฐ€์žฅ ์ตœ์‹ ์˜ ํˆด์ด๋‹ค.
Recoil์€ ContextAPI ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌํ˜„๋œ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํŽ˜์ด์Šค๋ถ์—์„œ ๋งŒ๋“  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค. ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” Redux์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ React์˜ ๊ณต์‹ ์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์•„๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Recoil๋„ React ์—์ฝ” ์‹œ์Šคํ…œ ์ „๋ฐ˜์— ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์ž…์ฆ๋˜๋ฉด์„œ ๋งŽ์€ react ์‚ฌ์šฉ ๊ฐœ๋ฐœ์ž๋“ค๋กœ๋ถ€ํ„ฐ ๋Œ€๊ทœ๋ชจ ์ฑ„ํƒ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

  • Recoil์€ React์Šค๋Ÿฌ์›€์„ ์œ ์ง€ํ•˜๋ฉฐ ๊ฐœ์„ ํ•˜๋Š” ๋ฐฉ์‹์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค. Recoil์€ ๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„๋ฅผ ์ •์˜ํ•˜๊ณ  ๋ฆฌ์•กํŠธ ํŠธ๋ฆฌ์— ๋ถ™์ด๋Š”๋ฐ, ์ด ๊ทธ๋ž˜ํ”„์˜ ๋ฟŒ๋ฆฌ(atom)์œผ๋กœ๋ถ€ํ„ฐ ์ˆœ์ˆ˜ํ•จ์ˆ˜(selector)๋ฅผ ๊ฑฐ์ณ ์ปดํฌ๋„ŒํŠธ๋กœ ํ๋ฅธ๋‹ค.

์ฃผ์š”๊ฐœ๋…

๐Ÿ“Œ Atoms

  • Recoil์—์„œ ์ƒํƒœ์˜ ๋‹จ์œ„๋ฅผ ์˜๋ฏธ. ์—…๋ฐ์ดํŠธ์™€ ๊ตฌ๋…์ด ๊ฐ€๋Šฅํ•˜๋‹ค atom์ด ์—…๋ฐ์ดํŠธ ๋˜๋ฉด ๊ฐ๊ฐ์˜ ๊ตฌ๋…๋œ ์ปดํฌ๋„ŒํŠธ๋Š” ์ƒˆ๋กœ์šด ๊ฐ’์„ ๋ฐ˜์˜ํ•ด์„œ ๋ฆฌ๋ Œ๋”๋ง๋œ๋‹ค.
  • ๋ฆฌ์•กํŠธ์˜ ๋กœ์ปฌ state ๋Œ€์‹  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋™์ผํ•œ atom์ด ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ ๋ชจ์€ ์ปดํฌ๋„ŒํŠธ๋Š” ์ƒํƒœ๋ฅผ ๊ณต์œ ํ•œ๋‹ค.
  • Atoms์—๋Š” ๊ณ ์œ ํ•œ ํ‚ค๊ฐ€ ํ•„์š”ํ•˜๊ณ  ์ด ํ‚ค๋Š” ์ „์—ญ์ ์œผ๋กœ ๊ณ ์œ ํ•ด์•ผ ํ•œ๋‹ค.
  • react state์ฒ˜๋Ÿผ default ๊ฐ’๋„ ๊ฐ€์ง„๋‹ค.
const exampleState = atom({
  key: 'exampleState',
  default: null,
})
  • ์ปดํฌ๋„ŒํŠธ์—์„œ atom์„ ์ฝ๊ณ  ์“ธ ๋•Œ๋Š” useRecoilState๋ผ๋Š” ํ›…์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. ์ด๊ฑด ๋ฆฌ์•กํŠธ์˜ useState์™€ ์œ ์‚ฌํ•œ, ์ƒํƒœ๊ฐ€ ์ปดํฌ๋„ŒํŠธ๊ฐ„์— ๊ณต์œ  ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์—์„œ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.
function ExampleButton() {
  const [exampleSize, setExampleSize] = useRecoilState(exampleState)
  return (
    <button
      onClick={() => setExampleSize(size => size + 1)}
      style={{ exampleSize }}
    >
      Click to Enlarge
    </button>
  )
}

function Text() {
  const [exampleSize, setExampleSize] = useRecoilState(exampleState)
  return <p style={{ exampleSize }}>This text will increase in size too.</p>
}

๐Ÿ“Œ Selector

  • atoms๋‚˜ ๋‹ค๋ฅธ selectors๋ฅผ ์ž…๋ ฅ์œผ๋กœ ๋ฐ›๋Š” ์ˆœ์ˆ˜ํ•จ์ˆ˜์ด๋‹ค.
  • ์ƒ์œ„ atoms๋‚˜ selectors๊ฐ€ ์—…๋ฐ์ดํŠธ ๋  ๊ฒฝ์šฐ ํ•˜์œ„ selector๋„ ์žฌ์‹คํ–‰๋œ๋‹ค.
  • ์ปดํฌ๋„ŒํŠธ๋Š” atom ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ selectors๋ฅผ ๊ตฌ๋…ํ•  ์ˆ˜ ์žˆ๊ณ , ๊ตฌ๋…ํ•˜๊ณ  ์žˆ๋Š” selectors๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ๊ตฌ๋…ํ•œ ์ปดํฌ๋„ŒํŠธ๋„ ๋ฆฌ๋ Œ๋”๋ง ๋œ๋‹ค.
  • Selectors๋Š” ์ƒํƒœ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ  ์ตœ์†Œํ•œ์˜ ์ƒํƒœ ์ง‘ํ•ฉ๋งŒ atoms์— ์ €์žฅํ•˜๊ณ  ํŒŒ์ƒ ๋ฐ์ดํ„ฐ๋Š” selector์—์„œ ๊ณ„์‚ฐํ•˜๋ฉด์„œ ๋ถˆํ•„์š”ํ•œ ์ƒํƒœ๋ฅผ ๋งŒ๋“ค์–ด๋‚ด์ง€ ์•Š๋Š”๋‹ค.
  • ์ปดํฌ๋„ŒํŠธ ๊ด€์ ์—์„œ atoms์™€ selector๋Š” ๋™์ผํ•œ ์ธํ„ฐํŽ˜์ด์Šค์ด๋ฏ€๋กœ ๋Œ€์ฒด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • Selectors๋Š” selector ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ์ •์˜ํ•œ๋‹ค.
const fontSizeLabelState = selector({
  key: 'fontSizeLabelState',
  get: ({get}) => {
    const fontSize = get(fontSizeState);
    const unit = 'px';

    return `${fontSize}${unit}`;
  },
});
  • get ์†์„ฑ์€ ๊ณ„์‚ฐ๋  ํ•จ์ˆ˜๋‹ค. ์ „๋‹ฌ๋˜๋Š” get ์ธ์ž๋ฅผ ํ†ตํ•ด atoms์™€ ๋‹ค๋ฅธ selector์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋‹ค๋ฅธ atoms๋‚˜ selectors์— ์ ‘๊ทผํ•˜๋ฉด ์ž๋™์œผ๋กœ ์ข…์† ๊ด€๊ณ„๊ฐ€ ์ƒ์„ฑ๋˜๋ฏ€๋กœ, ์ฐธ์กฐํ–ˆ๋˜ ๋‹ค๋ฅธ atoms๋‚˜ selectors๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜๋ฉด ์ด ํ•จ์ˆ˜๋„ ๋‹ค์‹œ ์‹คํ–‰๋œ๋‹ค.
  • ์ด ์˜ˆ์‹œ์—์„œ selector๋Š” fontSizeState๋ผ๋Š” ํ•˜๋‚˜์˜ atom์— ์˜์กด์„ฑ์„ ๊ฐ–๋Š”๋‹ค. ๊ฐœ๋…์ ์œผ๋กœ fontSizeLabelState selector๋Š” fontSizeState๋ฅผ ์ž…๋ ฅ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ํ˜•์‹ํ™”๋œ ๊ธ€๊ผด ํฌ๊ธฐ ๋ ˆ์ด๋ธ”์„ ์ถœ๋ ฅ์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ˆœ์ˆ˜ ํ•จ์ˆ˜์ฒ˜๋Ÿผ ๋™์ž‘ํ•œ๋‹ค.
  • Selector๋Š” useRecoilValue()๋ฅผ ์‚ฌ์šฉํ•ด ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค.
  • useRecoilValue()๋Š” ํ•˜๋‚˜์˜ atom์ด๋‚˜ selector๋ฅผ ์ธ์ž๋กœ ๋ฐ›์•„ ๋Œ€์‘ํ•˜๋Š” ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • fontSizeLabelState selector๋Š” writableํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— useRecoilState()๋ฅผ ์ด์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.
function FontButton() {
  const [fontSize, setFontSize] = useRecoilState(fontSizeState);
  const fontSizeLabel = useRecoilValue(fontSizeLabelState);

  return (
    <>
      <div>Current font size: ${fontSizeLabel}</div>

      <button onClick={setFontSize(fontSize + 1)} style={{fontSize}}>
        Click to Enlarge
      </button>
    </>
  );
}
  • ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ๋ฒ„ํŠผ์˜ ๊ธ€๊ผด ํฌ๊ธฐ๊ฐ€ ์ฆ๊ฐ€ํ•˜๋Š” ๋™์‹œ์— ํ˜„์žฌ ๊ธ€๊ผด ํฌ๊ฐ€๋ฅผ ๋ฐ˜์˜ํ•˜๋„๋ก ๊ธ€๊ผด ํฌ๊ธฐ ๋ ˆ์ด๋ธ”์„ ์—…๋ฐ์ดํŠธ ํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ์ž‘์—…์ด ์ˆ˜ํ–‰๋œ๋‹ค.

Recoil ํŠน์ง•

โœ”๏ธ Recoil์€ React์˜ useState์˜ ๊ธ€๋กœ๋ฒŒ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ๊ฐ™์€ ๋Š๋‚Œ์„ ์ค€๋‹ค. ๊ทธ๋ž˜์„œ React์Šค๋Ÿฌ์šด ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๊ณ  ๋‹จ์ˆœํ•˜๋‹ค. ๋˜ํ•œConcurrent(๋™์‹œ์„ฑ) ๋ชจ๋“œ๋ฅผ ์ง€์›ํ•˜๋Š” ํฐ ์ด์ ์ด ์žˆ๋‹ค.

  • Concurrent Mode: ํ๋ฆ„์ด ์—ฌ๋Ÿฌ ๊ฐœ๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ์ด๋‹ค. ๋ฆฌ์•กํŠธ์—์„œ ๋ Œ๋”๋ง์˜ ๋™์ž‘ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ •ํ•˜์—ฌ ์ ์ ˆํ•œ ๋•Œ์— ๋ Œ๋”๋ง ํ•ด์ค€๋‹ค.

โœ”๏ธ Redux์ฒ˜๋Ÿผ ์—„๊ฒฉํ•œ ๋Ÿฌ๋‹ ์ปค๋ธŒ๋ฅผ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด Atom๊ณผ Selector๋ผ๋Š” ๊ฐœ๋…์ด ์žˆ๊ณ  ๋ฐฐ์šธ ๊ฒƒ์ด ๋งŽ์ง€ ์•Š๋‹ค.

โœ”๏ธ BoilerPlate-free API ๋ฆฌ๋•์Šค๋Š” ์ƒํƒœ๋ฅผ ๋ณ€ํ™”์‹œํ‚ค๊ณ  ์—…๋ฐ์ดํŠธ ์‹œํ‚ค๋ ค๋ฉด ๊ทธ๋งŒํผ ์ฝ”๋“œ๊ฐ€ ๋Š˜์–ด๋‚˜๋Š”๋ฐ recoil์€ ๊ทธ๋ ‡๊ฒŒ๊นŒ์ง€ ๋งŽ์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์ƒํƒœ ์ •์˜๋Š” ์ฆ๋ถ„ ๋ฐ ๋ถ„์‚ฐ๋˜์–ด code splitting์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

โœ”๏ธ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘์„ฑ๋˜์–ด ๋™์‹œ์„ฑ ๋ชจ๋“œ๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์—, Redux์™€ ๊ฐ™์ด ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์˜์กดํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

  • Selector๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ selector๋Š” recoil์—์„œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋ฉฐ, ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ’์„ ์บ์‹ฑํ•œ๋‹ค. ๋“ค์–ด์™”๋˜ ์ ์ด ์žˆ๋Š” ๊ฐ’์„ ๊ธฐ์–ตํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐ™์€ ์‘๋‹ต์„ ๋ณด๋‚ด๋Š” api call์— ๋Œ€ํ•ด์„œ๋Š” ์ถ”๊ฐ€์ ์œผ๋กœ ์š”์ฒญํ•˜์ง€ ์•Š์•„ ์„ฑ๋Šฅ์ ์œผ๋กœ ์œ ๋ฆฌํ•˜๋‹ค.

โœ”๏ธ store์™€ ๊ฐ™์€ ์™ธ๋ถ€ ์š”์ธ์ด ์•„๋‹Œ React ๋‚ด๋ถ€์˜ ์ƒํƒœ๋ฅผ ํ™œ์šฉํ•˜๊ณ  context API๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋” ๋ฆฌ์•กํŠธ์— ๊ฐ€๊นŒ์šด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

Recoil์€ ์‰ฝ๊ฒŒ ๋ฐฐ์šฐ๊ณ  ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์žฅ์ ์ด ์žˆ๊ณ  ์ฝ”๋“œ๋„ ๋ณต์žกํ•˜์ง€ ์•Š์•„์„œ ์ „์—ญ์ƒํƒœ๊ด€๋ฆฌ๊ฐ€ ๋” ์‰ฝ๊ณ  ํŽธ๋ฆฌํ•˜๊ฒŒ ์ด๋ฃจ์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค. ๋˜ recoil ์ž์ฒด์ ์œผ๋กœ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋”ฐ๋กœ api๋ฅผ ํ˜ธ์ถœํ•  ํ•„์š”๊ฐ€ ์—†์–ด ์„ฑ๋Šฅ์ ์œผ๋กœ๋„ ์œ ๋ฆฌํ•˜๋‹ค. ํ•˜์ง€๋งŒ Redux์—์„œ๋Š” DevTool์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํŽธ๋ฆฌํ•˜๊ฒŒ state๋ฅผ ์‹œ๊ฐํ™”ํ•˜์—ฌ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ์— ๋ฐ˜ํ•ด Recoil์€ Redux์ฒ˜๋Ÿผ ๋”ฐ๋กœ ์•ˆ์ •์ ์ธ Devtool์ด ์•„์ง ์—†๋‹ค.

์ฐธ์กฐ ๐Ÿ‘‡

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