1. 해당 상태를 직접 사용하지 않는 최상위 컴포넌트, 컴포넌트1, 컴포넌트2도 상태 데이터를 가짐.
2. 상태 끌어올리기, Props 내려주기를 여러 번 거쳐야 함.
3. 애플리케이션이 복잡해질수록 데이터 흐름도 복잡해짐.
4. 컴포넌트 구조가 바뀐다면, 지금의 데이터 흐름을 완전히 바꿔야 할 수도 있음.
정의 : 컴포넌트와 상태를 분리하여 전역에서 상태 관리를 해줄 수 있게 해주는 상태 관리 라이브러리 (React 없이도 사용할 수 있음!)
필요성 :
Redux는 Action → Dispatch → Reducer → Store 순서로 데이터가 단방향으로 흐르게 된다!
Action
: 어떤 액션을 취할 것인지 정의해 놓은 객체/* 액션 객체 */
// payload가 필요 없는 경우
{ type: 'INCREASE' }
// payload가 필요한 경우
{ type: 'SET_NUMBER', payload: 5 }
/* 사용 예시 */
// payload가 필요 없는 경우
const increase = () => {
return {
type: 'INCREASE'
}
}
// payload가 필요한 경우
const setNumber = (num) => {
return {
type: 'SET_NUMBER',
payload: num
}
}
Dispatch
: Reducer로 Action을 전달해주는 함수// Action 객체를 직접 작성하는 경우
dispatch( { type: 'INCREASE' } );
dispatch( { type: 'SET_NUMBER', payload: 5 } );
// 액션 생성자(Action Creator)를 사용하는 경우
dispatch( increase() );
dispatch( setNumber(5) );
Reducer
: Dispatch에게서 전달받은 Action 객체의 type 값에 따라서 상태를 변경시키는 함수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가 리턴하는 값이 새로운 상태가 됨
// combineReducers 활용
import { combineReducers } from 'redux';
const rootReducer = combineReducers({
counterReducer,
anyReducer,
...
});
Store
: 상태가 관리되는 오직 하나뿐인 저장소의 역할, Redux 앱의 state가 저장되어 있는 공간import { createStore } from 'redux';
const store = createStore(rootReducer);
이 개념들은 Redux Hooks를 이용하면 된다!
// Redux Hooks 메서드는 'redux'가 아니라 'react-redux'에서 불러온다.
import { useSelector } from 'react-redux'
const counter = useSelector(state => state.counterReducer)
console.log(counter) // 1
import { useDispatch } from 'react-redux'
const dispatch = useDispatch()
dispatch( increase() )
console.log(counter) // 2
dispatch( setNumber(5) )
console.log(counter) // 5
Single source of truth (SSOT)
: 단일 진실 공급원이라는 의미로, 동일한 데이터는 항상 같은 곳에서 가지고 와야 한다는 의미. 즉, Redux에는 데이터를 저장하는 Store라는 단 하나뿐인 공간이 있음과 연결이 되는 원칙.
State is read-only
: 상태는 읽기 전용이라는 의미로, React에서 상태 갱신 함수로만 상태를 변경할 수 있었던 것처럼, Redux의 상태도 직접 변경할 수 없음을 의미한다. 즉, Action 객체가 있어야만 상태를 변경할 수 있음과 연결되는 원칙.
Changes are made with pure functions
: 변경은 순수함수로만 가능하다는 의미로, 상태가 엉뚱한 값으로 변경되는 일이 없도록 순수함수로 작성되어야하는 Reducer와 연결되는 원칙.
| 참고자료 |