[React] ์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ RecoilJS

2021. 11. 28. 16:25ใ†WEB Dev/Javascript | REACT | Node.js

728x90

 

๐Ÿ”ท ์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ Recoil

       A state management library for React 

 

ํˆฌ๋‘๋ฉ”์ดํŠธ ํด๋ก  ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•ด์„œ๋„ ๊ณต๋ถ€ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

๋ฆฌ์•กํŠธ ๊ฐœ๋ฐœ์ž๋ผ๋ฉด ๋ˆ„๊ตฌ๋‚˜ ํ•„์ˆ˜๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค ์ค‘์—์„œ

๊ฐ€์žฅ ์œ ๋ช…ํ•œ๊ฑด ์—ญ์‹œ Redux์ง€๋งŒ

Redux๊ฐ€ ํฐ ๊ทœ๋ชจ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ ์šฉํ•˜๊ธฐ ์ข‹์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๊ณ 

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋ฌด๊ฒ๋‹ค๋Š” ํ‰์ด ์žˆ์–ด์„œ ์ž‘์€ ํ”„๋กœ์ ํŠธ์ธ ์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” Recoil์„ ์“ฐ๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•ด์ฃผ์…จ๋‹ค.

๋ฆฌ์•กํŠธ๋ฅผ ๋งŒ๋“  ํŽ˜์ด์Šค๋ถํŒ€์ด ๋งŒ๋“  ์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ์•ž์œผ๋กœ์˜ ๋Œ€์„ธ๊ฐ€ ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค.

 

์•„์ง ๋ฆฌ์ฝ”์ผ์— ๋Œ€ํ•œ ๊ธ€์ด ๋งŽ์ด ์—†์–ด์„œ ์œ ํŠœ๋ธŒ์™€ ๋ธ”๋กœ๊ทธ๋ฅผ ์ฐธ๊ณ ํ•ด์„œ ์ƒํƒœ๊ด€๋ฆฌ์— ๋Œ€ํ•œ ์ •์˜์™€ Recoil ์‚ฌ์šฉ๋ฒ•์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ •๋ฆฌํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค.

์ƒํƒœ๊ด€๋ฆฌ๋„ ์ฒ˜์Œ์ธ๋ฐ ์ž๋ฃŒ๊ฐ€ ๊ณต์‹ ๋ฌธ์„œ ๋ฐ–์— ์—†์–ด์„œ ๋–จ๋ฆฌ๋Š” ๋งˆ์Œ.. (์˜์–ด๋ฅผ ์กฐ๊ธˆ๋งŒ ๋” ์ž˜ํ–ˆ์–ด๋„ ๐Ÿ˜ข)

 

 

Recoil

A state management library for React.

recoiljs.org

 


๐Ÿ”ธ ์ƒํƒœ๊ด€๋ฆฌState-management๋ž€?

 

โ–ช ์ƒํƒœ

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋™์ž‘ ๋ฐฉ์‹์„ ์„ค๋ช…ํ•˜๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์ƒํƒœState ๋ผ๊ณ  ํ•œ๋‹ค. 

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

 

โ–ช ์ƒํƒœ๊ด€๋ฆฌ ๊ธฐ๋Šฅ

 

- ์ตœ์ดˆ ๊ฐ’ Initial Value๋ฅผ ์ €์žฅ

- ํ˜„์žฌ ๊ฐ’ Current Value๋ฅผ ์ฝ๊ธฐ

- Value ๊ฐ’์„ ์—…๋ฐ์ดํŠธ

https://blog.codecentric.de/en/2017/12/developing-modern-offline-apps-reactjs-redux-electron-part-3-reactjs-redux-basics/

๐Ÿ”ธ Recoil

Recoil์€ ๋ฆฌ์•กํŠธ์˜ ๋‚ด์žฅ ์ƒํƒœ ๊ด€๋ฆฌ ๊ธฐ๋Šฅ(useState, useContext, Context API)์˜ ํ•œ๊ณ„์ ์„ ๊ทน๋ณตํ•˜๊ณ 

์ตœ๋Œ€ํ•œ React์Šค๋Ÿฌ์šด API๋ฅผ ์œ ์ง€ํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๋ถ€์† ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(ex : Redux์˜ Saga, Toolkit ๋“ฑ)๋ฅผ ์ตœ์†Œํ™” ํ•˜๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

(Redux์ฒ˜๋Ÿผ React-redux์ฒ˜๋Ÿผ ๋‹ค๋ฆฌ๊ฐ€ ๋˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ•„์š”์—†์ด Recoil๊ณผ ๋ฆฌ์•กํŠธ๊ฐ€ ์—ฐ๊ฒฐ๋œ๋‹ค.)

https://coleredfearn.medium.com/atomos-a-new-recoil-visualization-tool-powered-by-react-flow-6e0404a16b9a

 

 

๐Ÿ”ธ Recoil์˜ ์ฒ ํ•™

 

- ๋ณด์ผ๋Ÿฌ ํ”Œ๋ ˆ์ดํŠธ๊ฐ€ ์ ์€ API

- ๋ฆฌ์•กํŠธ์˜ ๋กœ์ปฌ ์ƒํƒœ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ(useState, useReducer)๊ณผ ์œ ์‚ฌํ•œ ์ธํ„ฐํŽ˜์ด์Šค

- selector๋ฅผ ์ด์šฉํ•ด ํŒŒ์ƒ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•จ์œผ๋กœ ๊ธฐ์กด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์ด ์‚ฌ์šฉํ•œ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ž„์˜๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”๊พธ๋Š” ๋กœ์ง์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

- ์ฝ”๋“œ ์ƒํ˜ธ๊ฐ„์˜ ๊ฒฐํ•ฉ๋„๊ฐ€ ๋‚ฎ๋‹ค.

- ์œ ์—ฐํ•˜๊ฒŒ ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

๐Ÿ”ธ Recoil์˜ ๊ธฐ๋Šฅ

โ–ช Atom ์•„ํ†ฐ

- ์•„ํ†ฐ์€ ์ƒํƒœ (โ‰’ state, props) ์ด๊ณ , ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๊ด€ํ•˜๋Š” ๊ธฐ๋ณธ ๋‹จ์œ„๋ฅผ ๋งํ•œ๋‹ค.

- ์•„ํ†ฐ์€ Redux์˜ store์˜ ์ƒํƒœ์ฒ˜๋Ÿผ ๊ตฌ๋… ๊ฐ€๋Šฅํ•˜๋‹ค.

- ์•„ํ†ฐ์ด ๋ณ€๊ฒฝ๋˜๋ฉด ์•„ํ†ฐ๊ณผ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ๋“ค์ด ์žฌ๋ Œ๋”๋ง ๋˜๋ฉด์„œ ๋ณ€๊ฒฝ๋œ ์•„ํ†ฐ์„ ๊ณต์œ ํ•œ๋‹ค.

- ์•„ํ†ฐ์€ ๊ณ ์œ ํ•œ key์™€ default๋ฅผ ๊ฐ€์ง„๋‹ค.

- ๊ณ ์œ ํ•œ ํ‚ค๋ฅผ ๊ฐ€์ง€๊ณ  ์ปดํฌ๋„ŒํŠธ์—์„œ ์•„ํ†ฐ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

- ์„ค์ •ํ•œ default๋Š” ์ƒํƒœ์˜ ์ดˆ๊นƒ๊ฐ’ initial value๊ฐ€ ๋œ๋‹ค.

 

โ‡จ ์•„ํ†ฐ์€ state, props ๊ฐ™์€ ์ƒํƒœ๋‹ค.

โ‡จ ์•„ํ†ฐ์˜ ์ดˆ๊นƒ๊ฐ’์€ default๋‹ค.

โ‡จ ์•„ํ†ฐ์€ key๋กœ ๋ถˆ๋Ÿฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

โ–ช selector

- ์…€๋ ‰ํ„ฐ๋Š” ์•„ํ†ฐ๊ณผ ์…€๋ ‰ํ„ฐ๋“ค์„ ์กฐํ•ฉํ•  ์ˆ˜ ์žˆ๋‹ค.

- ์…€๋ ‰ํ„ฐ๋ฅผ ์ด์šฉํ•ด ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•ด ์ค„ ์ˆ˜ ์žˆ๋‹ค. (ํŒŒ์ƒ๋˜๋Š” ์ƒํƒœDerived state๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.)

- ์…€๋ ‰ํ„ฐ๋Š” ๊ณ ์œ ํ•œ key๋ฅผ ๊ฐ–๋Š”๋‹ค.

- ์…€๋ ‰ํ„ฐ๊ฐ€ ์ฐธ์กฐํ•œ ์•„ํ†ฐ์ด๋‚˜ ์…€๋ ‰ํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ๋ณ€๊ฒฝ๋œ ๊ฐ’์„ ์ฆ‰์‹œ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ณ , ์ด๊ฒƒ๋“ค์„ ์‚ฌ์šฉํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋„ ์žฌ๋ Œ๋”๋ง ๋œ๋‹ค. 

- ์…€๋ ‰ํ„ฐ๋กœ async๋ฅผ ์ด์šฉํ•œ ๋น„๋™๊ธฐ ์ž‘์—…์ด ๊ฐ€๋Šฅํ•˜๋‹ค. (์„œ๋ฒ„์—์„œ api๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๋‹ค)

- ์…€๋ ‰ํ„ฐ๋กœ ๋ถ€๋ฅธ return ๊ฐ’์€ useRecoilValue(์…€๋ ‰ํ„ฐkey)๋ฅผ ํ†ตํ•ด ๋ฐ›์•„์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

- ์…€๋ ‰ํ„ฐ์˜ return ๊ฐ’์€ ์ฝ๊ธฐ ์ „์šฉ์ด๋‹ค.

 

โ–ช useRecoilState

- useRecoilState๋Š” useState ํ›…๊ณผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ด ๋™์ผํ•˜๋‹ค ๐Ÿ‘

- let [์ƒํƒœ, ์ƒํƒœ๋ณ€๊ฒฝํ•จ์ˆ˜] = useState(์ดˆ๊นƒ๊ฐ’);

- let [์ƒํƒœ, ์ƒํƒœ๋ณ€๊ฒฝํ•จ์ˆ˜] = useRecoilState(key);

- useRecoilState์„ ์‚ฌ์šฉํ•œ ์•„ํ†ฐ์˜ ์ƒํƒœ๋Š” ์ž๋™์œผ๋กœ ์ƒํƒœ๊ฐ€ ๊ณต์œ ๋˜๊ณ  ์ „์—ญ์œผ๋กœ ๊ณต์œ ๋œ๋‹ค.

 

โ–ช useRecoilValue

- useRecoilValue๋Š” ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ํ•จ์ˆ˜ ์—†์ด ์•„ํ†ฐ์˜ ๊ฐ’๋งŒ ๋ฐ›๋Š”๋‹ค.

 

โ–ช useRecoilCallback

- ๋ฆฌ์•กํŠธ์˜ useCallback๊ณผ ์œ ์‚ฌํ•˜๊ณ , ๋ฆฌ์ฝ”์ผ State๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” API๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

- ์•„ํ†ฐ์ด๋‚˜ ์…€๋ ‰ํ„ฐ๊ฐ€ ์—…๋ฐ์ดํŠธ ๋˜๋ฉด ์ด๋“ค์„ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ์žฌ๋ Œ๋”๋งํ•œ๋‹ค.

- ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ๋น„๋™๊ธฐ์  ์•ก์…˜์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

 

 

๋„์›€๋ฐ›์€ ์ž๋ฃŒ ๐Ÿ‘

 

- ์™œ Recoil์„ ์จ์•ผ ํ•˜๋Š”๊ฐ€? -์›นํˆฐFE

- ๋ฆฌ์ฝ”์ผ(Recoil)์€ ์™œ ๋งŒ๋“ ๊ฑด๋ฐ? -wooder2050

 

728x90