React Redux
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
- 리λμ ν¨μλ μ΄μ μνμ μ‘μ κ°μ²΄λ₯Ό νλΌλ―Έν°λ‘ λ°λλ€.
- νλΌλ―Έν° μΈμ κ°μλ μμ‘΄νλ©΄ μλλ€.
- μ΄μ μνλ μ λλ‘ κ±΄λλ¦¬μ§ μκ³ , λ³νλ₯Ό μ€ μλ‘μ΄ μν κ°μ²΄λ₯Ό λ§λ€μ΄μ λ°ννλ€.
- λκ°μ νλΌλ―Έν°λ‘ νΈμΆλ 리λμ ν¨μλ μΈμ λ λκ°μ κ²°κ³Ό κ°μ λ°νν΄μΌ νλ€.
- μ±μ μ¬λ¬ μμΉμμ νμν λ§μ μμ μνλ€μ΄ μ‘΄μ¬ν λ (μ μ μνκ° νμνλ€κ³ λκ»΄μ§ λ)
- μνλ€μ΄ μμ£Ό μ λ°μ΄νΈ λ λ
- μνλ₯Ό μ λ°μ΄νΈ νλ λ‘μ§μ΄ 볡μ‘ν λ
- μ±μ΄ μ€κ° λλ ν° μ¬μ΄μ¦μ μ½λλ₯Ό κ°κ³ μκ³ λ§μ μ¬λλ€μ μν΄ μ½λκ° κ΄λ¦¬λ λ
- μνκ° μ λ°μ΄νΈλλ μμ μ κ΄μ°°ν νμκ° μμ λ
- λ³νλ₯Ό μΌμΌν€λ 리λμ ν¨μλ μμν ν¨μμ¬μΌ νλ€. μμ ν¨μλ λ€μκ³Ό κ°μ 쑰건μ λ§μ‘±νλ€.