-
React Redux๊ณต๋ถ 2022. 7. 6. 22:17
Redux๋? ๐
๋ฆฌ๋์ค๋ ๋ฆฌ์กํธ์์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค. ๋ฆฌ๋์ค๋ฅผ ์ฌ์ฉํ๋ฉด ์ปดํฌ๋ํธ์ ์ํ ์ ๋ฐ์ดํธ ๊ด๋ จ ๋ก์ง์ ๋ค๋ฅธ ํ์ผ๋ก ๋ถ๋ฆฌ์์ผ์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์๋ค.
Redux ๊ธฐ๋ณธ ์ฉ์ด ๐ฃ
- ์ก์ (Action)
์ํ ๋ณํ๊ฐ ํ์ํ๋ค๋ฉด ์ก์ ์ ์ผ์ผ์ผ์ผ ํ๋ค. ์ก์ ์ ๊ฐ์ฒด๋ก ํํ๋๋ฉฐ, type ํ๋๋ฅผ ๋ฐ๋์ ๊ฐ์ง๊ณ ์์ด์ผํ๋ค.
{ type: 'ADD_TODO', data: { id: 1, text: '๋ฆฌ๋์ค ๋ฐฐ์ฐ๊ธฐ' } }
2. ์ก์ ์์ฑํจ์(Action Creator)
์ก์ ์์ฑ ํจ์๋ ์ก์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ฃผ๋ ํจ์๋ค. ํ์ดํ ํจ์๋ก๋ ํํ ๊ฐ๋ฅํ๋ค.
function addTodo(data) { return { type: 'ADD_TODO', data, } }
3. ๋ฆฌ๋์(Reducer)
๋ฆฌ๋์๋ฅผ ํ๊ตญ์ด๋ก ํด์ํด๋ณด๋ฉด ๋ณํ๋ฅผ ์ผ์ผํค๋ ๊ฒ์ ๋งํ๋ค. ๋ฆฌ๋์๋ ํ์ฌ ์ํ์ ์ก์ ๊ฐ์ฒด๋ฅผ ๋ฐ์, ํ์ํ๋ค๋ฉด ์๋ก์ด ์ํ๋ฅผ ๋ฆฌํดํ๋ ํจ์๋ค. ์ก์ ์ ํ์ ๊ธฐ๋ฐ์ผ๋ก ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๋ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
const count = 1 // Reducer๋ฅผ ์์ฑํ ๋์๋ ์ด๊ธฐ ์ํ๋ฅผ ์ธ์๋ก ์๊ตฌํฉ๋๋ค. const counterReducer = (state = count, action) { // Action ๊ฐ์ฒด์ type ๊ฐ์ ๋ฐ๋ผ ๋ถ๊ธฐํ๋ switch ์กฐ๊ฑด๋ฌธ์ ๋๋ค. switch (action.type) //action === 'INCREASE'์ผ ๊ฒฝ์ฐ case 'INCREASE': return state + 1 // action === 'DECREASE'์ผ ๊ฒฝ์ฐ case 'DECREASE': return state - 1 // action === 'SET_NUMBER'์ผ ๊ฒฝ์ฐ case 'SET_NUMBER': return action.payload // ํด๋น ๋๋ ๊ฒฝ์ฐ๊ฐ ์์ ๋ ๊ธฐ์กด ์ํ๋ฅผ ๊ทธ๋๋ก ๋ฆฌํด default: return state; } // Reducer๊ฐ ๋ฆฌํดํ๋ ๊ฐ์ด ์๋ก์ด ์ํ๊ฐ ๋ฉ๋๋ค.
4. ์คํ ์ด(Store)
์คํ ์ด์๋ ์ํ๊ฐ ๋ค์ด์๋ค. ํ๋์ ํ๋ก์ ํธ๋ ํ๋์ ์คํ ์ด๋ง ๊ฐ์ง ์ ์๋ค.
import { createStore } from 'redux'; const store = createStore(rootReducer);
5. ๋์คํจ์น(Dispatch)
์คํ ์ด ๋ด์ฅ ํจ์ ์ค ํ๋์ธ ๋์คํจ์น๋ ์ก์ ๊ฐ์ฒด๋ฅผ ๋๊ฒจ์ค์ ์ํ๋ฅผ ์ ๋ฐ์ดํธ ํ๋ ์ ์ผํ ๋ฐฉ๋ฒ์ด๋ค. ์ด๋ฒคํธ ํธ๋ฆฌ๊ฑฐ๋ผ๊ณ ์๊ฐ ํ ์ ์๋ค.
// Action ๊ฐ์ฒด๋ฅผ ์ง์ ์์ฑํ๋ ๊ฒฝ์ฐ dispatch( { type: 'INCREASE' } ); dispatch( { type: 'SET_NUMBER', payload: 5 } ); // ์ก์ ์์ฑ์(Action Creator)๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ dispatch( increase() ); dispatch( setNumber(5) );
Reducx Hooks ๐ฃ
React์์ Redux๋ฅผ ์ฌ์ฉํ ๋ ํ์ฉํ ์ ์๋ Hooks ๋ฉ์๋๋ฅผ ์ ๊ณต
- useSelector()
์ปดํฌ๋ํธ์ state๋ฅผ ์ฐ๊ฒฐํ์ฌ Redux์ state์ ์ ๊ทผ ํ ์ ์๊ฒ ํด์ฃผ๋ ๋ฉ์๋๋ค.
// Redux Hooks ๋ฉ์๋๋ 'redux'๊ฐ ์๋๋ผ 'react-redux'์์ ๋ถ๋ฌ์ต๋๋ค. import { useSelector } from 'react-redux' const counter = useSelector(state => state.counterReducer) console.log(counter) // 1
- useDispatch()
Action ๊ฐ์ฒด๋ฅผ Reducer๋ก ์ ๋ฌํด ์ฃผ๋ ๋ฉ์๋. ์์์ Dispatch๋ฅผ ์ค๋ช ํ ๋ ์ฌ์ฉํ dispatch ํจ์๋ useDispatch()๋ฅผ ์ฌ์ฉํ ๊ฒ.
import { useDispatch } from 'react-redux' const dispatch = useDispatch() dispatch( increase() ) console.log(counter) // 2 dispatch( setNumber(5) ) console.log(counter) // 5
Redux์ ์ธ๊ฐ์ง ์์น ๐ฃ
- Single source of truth
- ๋์ผํ ๋ฐ์ดํฐ๋ ํญ์ ๊ฐ์ ๊ณณ์์ ๊ฐ์ง๊ณ ์์ผ ํ๋ค๋ ์๋ฏธ์ ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋๋ฒ๊น ์ด ์ฌ์์ง๊ณ ์๋ฒ์์ ์ง๋ ฌํ๊ฐ ๋ ์ ์๊ณ ์ฝ๊ฒ ํด๋ผ์ด์ธํธ์์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์๋ค์ฌ์ฌ ์ ์๊ฒ ๋๋ค.
- State is read-only
- ์ํ๋ ์ฝ๊ธฐ ์ ์ฉ์ด๋ผ๋ ๋ป์ผ๋ก, React์์ ์ํ๊ฐฑ์ ํจ์๋ก๋ง ์ํ๋ฅผ ๋ณ๊ฒฝํ ์ ์์๋ ๊ฒ์ฒ๋ผ, Redux์ ์ํ๋ ์ง์ ๋ณ๊ฒฝํ ์ ์์์ ์๋ฏธํฉ๋๋ค. ์ฆ, Action ๊ฐ์ฒด๊ฐ ์์ด์ผ๋ง ์ํ๋ฅผ ๋ณ๊ฒฝํ ์ ์์๊ณผ ์ฐ๊ฒฐ๋๋ ์์น์ ๋๋ค.
- Changes are made with pure functions
- ๋ฆฌ๋์ ํจ์๋ ์ด์ ์ํ์ ์ก์ ๊ฐ์ฒด๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ๋๋ค.
- ํ๋ผ๋ฏธํฐ ์ธ์ ๊ฐ์๋ ์์กดํ๋ฉด ์๋๋ค.
- ์ด์ ์ํ๋ ์ ๋๋ก ๊ฑด๋๋ฆฌ์ง ์๊ณ , ๋ณํ๋ฅผ ์ค ์๋ก์ด ์ํ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ ๋ฐํํ๋ค.
- ๋๊ฐ์ ํ๋ผ๋ฏธํฐ๋ก ํธ์ถ๋ ๋ฆฌ๋์ ํจ์๋ ์ธ์ ๋ ๋๊ฐ์ ๊ฒฐ๊ณผ ๊ฐ์ ๋ฐํํด์ผ ํ๋ค.
- ์ฑ์ ์ฌ๋ฌ ์์น์์ ํ์ํ ๋ง์ ์์ ์ํ๋ค์ด ์กด์ฌํ ๋ (์ ์ญ ์ํ๊ฐ ํ์ํ๋ค๊ณ ๋๊ปด์ง ๋)
- ์ํ๋ค์ด ์์ฃผ ์ ๋ฐ์ดํธ ๋ ๋
- ์ํ๋ฅผ ์ ๋ฐ์ดํธ ํ๋ ๋ก์ง์ด ๋ณต์กํ ๋
- ์ฑ์ด ์ค๊ฐ ๋๋ ํฐ ์ฌ์ด์ฆ์ ์ฝ๋๋ฅผ ๊ฐ๊ณ ์๊ณ ๋ง์ ์ฌ๋๋ค์ ์ํด ์ฝ๋๊ฐ ๊ด๋ฆฌ๋ ๋
- ์ํ๊ฐ ์ ๋ฐ์ดํธ๋๋ ์์ ์ ๊ด์ฐฐํ ํ์๊ฐ ์์ ๋
- ๋ณํ๋ฅผ ์ผ์ผํค๋ ๋ฆฌ๋์ ํจ์๋ ์์ํ ํจ์์ฌ์ผ ํ๋ค. ์์ ํจ์๋ ๋ค์๊ณผ ๊ฐ์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ค.
'๊ณต๋ถ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[CSS] ๊ธฐ์ด (0) 2022.07.05 Unit4 - [HTML] ๊ธฐ์ด (0) 2022.07.04 [JavaScript] ๊ธฐ์ด ์ ์ด๋ฌธ2 (0) 2022.07.01 [JavaScript] ๊ธฐ์ด (0) 2022.06.30 22.04.25 Learn how to learn (0) 2022.06.29