h e 1 1 o !

๐Ÿ’พ pre ์Šคํƒ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ํด๋ก  / ์ „์—ญ ์ƒํƒœ๊ด€๋ฆฌ๋ฅผ ์™œ ํ•˜๋Š”์ง€ ์•Œ๊ฒ ์–ด์š”(์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, Recoil ๋„์ž…) ๋ณธ๋ฌธ

p r o j e c t

๐Ÿ’พ pre ์Šคํƒ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ํด๋ก  / ์ „์—ญ ์ƒํƒœ๊ด€๋ฆฌ๋ฅผ ์™œ ํ•˜๋Š”์ง€ ์•Œ๊ฒ ์–ด์š”(์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, Recoil ๋„์ž…)

hee.hee 2022. 8. 28. 00:32

 

๐Ÿ– Piggy ํ”„๋กœ์ ํŠธ์™€ '์ƒํƒœ๊ด€๋ฆฌ'

piggy ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋ฉฐ ์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํ•„์š”์„ฑ์„ ์ ˆ๊ฐํ–ˆ๋‹ค.

์‚ฌ์‹ค piggy๋Š” ๊ทธ์•ผ๋ง๋กœ ๋ญ๋ผ๋„ ํ•ด๋ณด๋ ค๊ณ  ์‹œ์ž‘ํ•œ ํ”„๋กœ์ ํŠธ๋ผ์„œ, ์ตœ์†Œํ•œ์˜ ์ปดํฌ๋„ŒํŠธ(๋”ฑ CRUD๋งŒ)๋กœ ๊ตฌํ˜„ํ•˜๋ ค ํ–ˆ๋‹ค.

๊ทธ๋ž˜์„œ props, state๋งŒ ์จ๋„ ์ถฉ๋ถ„ํ•  ์ค„ ์•Œ์•˜๋‹ค.

ํ•˜์ง€๋งŒ... ํŒ€ํ”„๋กœ์ ํŠธ๊ฐ€ ๋˜๊ณ , ๋‚˜๋ฆ„ ์• ์ •์ด ์ƒ๊ธฐ๊ณ , ์œ ์ €ํ”Œ๋กœ์šฐ๋ฅผ ์ƒ๊ฐํ•˜๋‹ค๋ณด๋‹ˆ ์ƒ๊ฐ๋ณด๋‹ค ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์•„์ฃผ ๋งŽ์ด ๋Š˜์–ด๋‚ฌ๋‹ค.

๊ฒŒ๋‹ค๊ฐ€ ๋‚˜์ค‘์— ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ๋„ ์ถ”๊ฐ€ํ–ˆ๊ณ , ์ด๋ ‡๊ฒŒ ํŽ˜์ด์ง€์™€ ๊ธฐ๋Šฅ์ด ๋Š˜๋‹ค๋ณด๋‹ˆ ๋ฐ์ดํ„ฐ ์š”์ฒญ๋„ ๋Š˜์–ด๋‚ฌ๋‹ค.

์ด ๊ณผ์ •์—์„œ ์šฐ๋ฆฐ props, state ์ง€์˜ฅ์„ ๊ฒฝํ—˜ํ–ˆ๋‹ค.

 

 

 

๐Ÿ’ก ์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋„์ž…

์ฒ˜์Œ Pre ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ๋Š” ์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์“ธ ์ƒ๊ฐ์€ ์—†์—ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋กœ๊ทธ์ธ ๊ตฌํ˜„๋ถ€ํ„ฐ ์ง๊ฐํ–ˆ๋‹ค. ์•ˆํ•˜๋ฉด ํฐ์ผ ๋‚˜๊ฒ ๊ตฌ๋‚˜.

๊ทธ๋ž˜์„œ ์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์“ฐ๊ธฐ๋กœ ํ–ˆ๊ณ , Redux๋ƒ, Recoil์ด๋ƒ๋ฅผ ๋‘๊ณ  ๊ณ ๋ฏผํ–ˆ๋‹ค.

 

 

 

๐ŸŒŸ Redux vs Recoil

Redux

React์ฒ˜๋Ÿผ ๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„ ํŒจํ„ด์„ ๋”ฐ๋ฅธ๋‹ค.

์ƒํƒœ๊ฐ€ ์–ธ์ œ๋‚˜ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๊ณ  ๋ณ€ํ™”๋ฅผ ์ถ”์ ํ•˜๊ธฐ ์‰ฌ์›Œ์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ์— ์šฉ์ดํ•˜๋‹ค.

 

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

  • Store: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํƒœ๋ฅผ ๋‹จ์ผ ๊ฐ์ฒด๋กœ ์ €์žฅํ•˜๋Š” ์ €์žฅ์†Œ
    ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ์ด๋ฒคํŠธ๋ฅผ ๋ฐœํ–‰ํ•˜์—ฌ ๊ด€๋ จ ์ปดํฌ๋„ŒํŠธ๋“ค์ด ์ƒˆ๋กœ์šด ์ƒํƒœ๋ฅผ ๋ฐ›์•„ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.
  • Action: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์–ด๋– ํ•œ ์ด๋ฒคํŠธ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ์ฒด
    Action์€ ์ผ๋ฐ˜์ ์œผ๋กœ JavaScript ๊ฐ์ฒด์ด๋ฉฐ, ๋ฐ˜๋“œ์‹œ "type"์ด๋ผ๋Š” ํ•„๋“œ๋ฅผ ํฌํ•จํ•ด์•ผ ํ•œ๋‹ค. Action์€ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์š”์ฒญ์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.
  • Reducer: Action์— ๋”ฐ๋ผ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ํ•จ์ˆ˜
    ์ด์ „ ์ƒํƒœ์™€ Action์„ ๋ฐ›์•„ ์ƒˆ๋กœ์šด ์ƒํƒœ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด๋•Œ Reducer๋Š” ๋ถˆ๋ณ€์„ฑ์„ ์œ ์ง€ํ•˜์—ฌ ๊ธฐ์กด ์ƒํƒœ๋ฅผ ์ง์ ‘ ์ˆ˜์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • Dispatch: ์•ก์…˜์„ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๋ฉ”์„œ๋“œ๋กœ, ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด ์•ก์…˜์„ Store์— ๋ณด๋‚ด๋Š” ์—ญํ• 
  • Subscribe: ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€ํ•˜๊ณ , ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ๋“ฑ๋ก๋œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ
    ์ด๋ฅผ ํ†ตํ•ด UI ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ์ธ์ง€ํ•˜๊ณ  ์ƒˆ๋กœ์šด ์ƒํƒœ๋ฅผ ๋ฐ˜์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฆฌ๋•์Šค์˜ ์ž‘๋™ ๋ฐฉ์‹์€ '์˜ˆ์ธก ๊ฐ€๋Šฅ'ํ•˜๋‹ค.

๋‹จ์ผ ์ƒํƒœ ํŠธ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ์ถ”์ ํ•˜๊ธฐ ์šฉ์ดํ•˜๋ฉฐ, ๋””๋ฒ„๊น…๊ณผ ํ…Œ์ŠคํŠธ์—๋„ ํŽธ๋ฆฌํ•˜๋‹ค.

๋”ฐ๋ผ์„œ ๋ณต์žกํ•œ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ํ•„์š”๋กœ ํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ ํ•ฉํ•จ.

 

Recoil

๋ฆฌ์ฝ”์ผ(Recoil)์€ Meta(๊ตฌ Facebook)์—์„œ ๊ฐœ๋ฐœํ•œ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ, React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. ๋ฆฌ๋•์Šค์™€ ๋น„์Šทํ•œ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜์ง€๋งŒ, ๋ฆฌ๋•์Šค๋ณด๋‹ค ๋” ๊ฐ„ํŽธํ•˜๊ณ  ์ง๊ด€์ ์ธ API๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

  • ์ƒํƒœ(Atom): ์ƒํƒœ๋Š” "Atom"์ด๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ๋‹จ์œ„๋กœ ๊ด€๋ฆฌ๋จ
    Atom์€ ์ฝ๊ธฐ ๋ฐ ์“ฐ๊ธฐ๊ฐ€ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ์œผ๋กœ, React ์ปดํฌ๋„ŒํŠธ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ฐ์ดํ„ฐ์ž…๋‹ˆ๋‹ค. Atom์€ ์ผ๋ฐ˜์ ์œผ๋กœ JavaScript ๋ณ€์ˆ˜์™€ ์œ ์‚ฌํ•˜๋ฉฐ,
    atom ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑํ•œ๋‹ค.
  • ์„ ํƒ์ž(Selector): ์„ ํƒ์ž๋Š” ํ•˜๋‚˜ ์ด์ƒ์˜ Atom์—์„œ ํŒŒ์ƒ๋œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜
    ์ด๋ฅผ ํ†ตํ•ด ์—ฌ๋Ÿฌ ์ƒํƒœ๋ฅผ ์กฐํ•ฉํ•˜๊ฑฐ๋‚˜ ๋ณ€ํ˜•ํ•˜์—ฌ ์ƒˆ๋กœ์šด ๊ฐ’์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
  • RecoilRoot: Recoil๋กœ ๊ด€๋ฆฌ๋˜๋Š” ์ƒํƒœ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ปดํฌ๋„ŒํŠธ์˜ ๊ณ„์ธต ๊ตฌ์กฐ ์ตœ์ƒ์œ„์—์„œ ์‚ฌ์šฉ
    ์ด๋ฅผ ํ†ตํ•ด ๋ชจ๋“  ์ž์‹ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ƒํƒœ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.
  • useRecoilState: Atom์˜ ๊ฐ’์„ ์ฝ๊ณ  ์“ฐ๋Š” ๋ฐ ์‚ฌ์šฉ
  • useRecoilValue: Atom์˜ ๊ฐ’์„ ์ฝ๋Š” ๋ฐ ์‚ฌ์šฉ
  • ์ƒํƒœ ๊ฐฑ์‹ : Recoil์€ React์˜ ๊ฐ€์ƒ ๋”(Virtual DOM)๊ณผ ์กฐํ•ฉํ•˜์—ฌ ์ƒํƒœ ๋ณ€๊ฒฝ์„ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•จ
    ์ƒํƒœ๊ฐ€ ๊ฐฑ์‹ ๋˜๋ฉด ํ•ด๋‹น ์ƒํƒœ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋“ค์ด ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธ๋œ๋‹ค.

๋ฆฌ์ฝ”์ผ์€ ๊ฐ„๋‹จํ•˜๊ณ  ์ง๊ด€์ ์ธ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ์ œ๊ณตํ•˜๋ฏ€๋กœ, Redux์ฒ˜๋Ÿผ ๋ณต์žกํ•œ ์„ค์ • ์—†์ด๋„ ์‰ฝ๊ฒŒ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฆฌ๋•์Šค๋ณด๋‹ค ๊ฐ„๋‹จํ•œ API์™€ ์ง๊ด€์ ์ธ ๋””์ž์ธ์œผ๋กœ ๋น ๋ฅธ ๊ฐœ๋ฐœ๊ณผ ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์ง€์›ํ•œ๋‹ค.

 

 

 

๐Ÿง‘‍๐Ÿ’ป  Recoil์„ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค

๋‚˜์™€ ํŒ€์›์€ ์ด์ „์— Redux๋ฅผ ์‚ฌ์šฉํ•ด๋ณธ ์ ์ด ์žˆ๋‹ค. 

'๋‹จ๋ฐฉํ–ฅ ํ๋ฆ„' ์ปจ์…‰์ด์–ด์„œ ๋ฆฌ์•กํŠธ์—์„œ์˜ ๋ฐ์ดํ„ฐ ํ๋ฆ„์— ๋Œ€ํ•ด ๋” ์ž์„ธํžˆ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฐ์— ์‹œ๊ฐ„์ด ๋งŽ์ด ๋“ค์—ˆ๋˜ ๊ธฐ์–ต์ด ์žˆ๋‹ค.

๋ฐ˜๋ฉด, ์กฐ์‚ฌ ๊ฒฐ๊ณผ Recoil์€ Redux์— ๋น„ํ•ด ํ›จ์”ฌ ์ง๊ด€์ ์ด๊ณ  ์„ค์ •๋„ ๊ฐ„ํŽธํ•˜๋‹ค๊ณ  ํ•œ๋‹ค.

Redux๋Š” ์‚ฌ์šฉํ•ด ๋ณด์•˜๊ณ , ์žฅ์ ๊ณผ ๋‹จ์ ์— ๋Œ€ํ•ด ํŒŒ์•…ํ–ˆ์œผ๋‹ˆ ์ด๋ฒˆ์—๋Š” Recoil์„ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค.

 

 

 

 

๐Ÿ’ก Recoil์€ ์ •๋ง ๊ฐ„ํŽธํ•ด

Recoil์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ณต๋ถ€ํ•˜๊ณ , ๊ณต๋ถ€ํ•˜๋Š” ๊ณผ์ •์—์„œ ์ž‘์„ฑํ•œ ๋ฌธ์„œ๋ฅผ ํŒ€์›๊ณผ ๊ณต์œ ํ–ˆ๋‹ค.

์ฃผ์š” ํ•จ์ˆ˜๋งŒ ์ •๋ฆฌํ•ด๋‘” ๋ฌธ์„œ์˜€๋Š”๋ฐ, ๊ทธ๊ฒƒ๋งŒ ์žˆ์–ด๋„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ์–ด๋ ค์›€์ด ์—†์„ ์ •๋„๋กœ ๊ฐ„ํŽธํ–ˆ๋‹ค.

๊ณต๋ถ€ํ•˜๋Š” ๋ฐ 20๋ถ„ ์ •๋„ ๊ฑธ๋ ธ๊ณ  ํŒ€์›๊ณผ ํ™”๋ฉด ๊ณต์œ ํ•˜๋ฉฐ ํ•จ๊ป˜ ์—ฐ์Šตํ•˜๊ณ  ๋ฐ”๋กœ ์‚ฌ์šฉํ–ˆ๋‹ค.

 

์‚ฌ์šฉํ•œ ๋’ค ๋А๋‚€ ์ ์€, '์ „์—ญ ์ƒํƒœ๋ฅผ React Hook useState๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ ๊ฐ™์€' ๋А๋‚Œ์ด๋‹ค.

React Hook๋งŒ ์จ๋ดค๋‹ค๋ฉด ์•„๋ฌด ๋ฌด๋ฆฌ ์—†์ด ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•จ์ˆ˜๋„ ์—ฌ๋Ÿฌ๊ฐ€์ง€๋ผ์„œ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ „์—ญ์œผ๋กœ ์ƒํƒœ๋ฅผ set, get ํ•„์š”ํ•œ ๋Œ€๋กœ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ƒํƒœ ์ดˆ๊ธฐํ™”, ์‚ญ์ œ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

 

 

๐Ÿ’ฌ ๋А๋‚€์ : ์ „์—ญ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ์™œ ํ•˜๋Š”์ง€ ์•Œ๊ฒ ์–ด์š”

์‚ฌ์‹ค props ์ง€์˜ฅ์„ ๋ง›๋ดค๋˜ Piggy ํ”„๋กœ์ ํŠธ๋„ ์™„๋ฒฝํ•˜๊ฒŒ ์„ค๊ณ„ ํ–ˆ๋‹ค๋ฉด ์ง€์˜ฅ๊นŒ์ง„ ์•„๋‹ˆ๊ณ  ์‚ผ๋„์ฒœ์— ๋ฐœ๋‹ด๊ทธ๊ธฐ.. ์ •๋„์˜€๊ณ ,

์ง€๊ธˆ๊นŒ์ง€ ๋งŒ๋“  ๊ฒƒ๋“ค์ด ๋Œ€๋ถ€๋ถ„ useState, props ์„ ์—์„œ ํ•ด๊ฒฐ๋˜๋Š” ํ”„๋กœ์ ํŠธ๋“ค์ด์—ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ƒํƒœ๊ด€๋ฆฌ์˜ ํ•„์š”์„ฑ์„ ๊ทธ๋ ‡๊ฒŒ ํฌ๊ฒŒ ๋А๋ผ์ง€ ๋ชปํ–ˆ๊ณ , ๋ฆฌ๋•์Šค๋ฅผ ๋ฐฐ์šธ ๋•Œ๋„ ์ด ๋ณต์žกํ•œ ๊ฒŒ ์™œ ํ•„์š”ํ•œ๊ฐ€ ์ƒ๊ฐํ–ˆ์—ˆ๋‹ค.

ํ•˜์ง€๋งŒ, ๋ฆฌ์ฝ”์ผ์„ ์“ฐ๊ณ  ๋ณด๋‹ˆ ์ „์—ญ์—์„œ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค๋Š” ๊ฒŒ ์–ผ๋งˆ๋‚˜ ๊ฐ„ํŽธํ•˜๊ณ , ํšจ์œจ์ ์ด๊ณ , ์‹ ๋ขฐ๊ฐ€ ๋˜๋Š”์ง€ ์•Œ๊ฒŒ๋๋‹ค!!!

 

๋ฆฌ์ฝ”์ผ ๋„ˆ๋ฌด ์ข‹์•„~