상태 관리 라이브러리가 왜 필요한지 이해할 수 있다.
Redux (혹은 Flux Pattern)에서 사용하는 Action, Reducer 그리고 Store의 의미와 특징을 이해할 수 있다.
Redux의 3가지 원칙이 무엇이며, 주요 개념과 어떻게 연결되는지 이해할 수 있다.
Presentational 컴포넌트와 Container 컴포넌트의 개념을 이해할 수 있다.
Redux hooks(useSelector, useDispatch)를 사용해 store 를 업데이트할 수 있다.
오늘 urclass를 보면서 한 가지 알게 된 점이 있다. 바로 Redux
는 React
와 아무 상관이 없다는 것이다. 처음 React
를 배울 때 Redux
도 세트로 자주 들어서 관련 라이브러리인 줄 알았는데, Redux
는 React
없이도 사용할 수 있는 상태 관련 라이브러리이다.
그동안 했던 스프린트 과제나 내가 했던 클론 코딩은 규모가 작아서 Redux
를 사용하지 않아도 props
를 내려주는데 전혀 복잡하지 않았다. 하지만 규모가 커지고 프로젝트를 할 때에는 props
를 10번 내려주는 일을 해서는 안되기 때문에… Redux
를 잘 알아둬야 한다고 생각이 되었다.
Redux
는 중앙 저장소 같은 개념이라고 생각하니 이해하기 쉬웠다. 중앙 저장소에 있는 State
를 한 번에 가져다 쓸 수 있기 때문이다. 그렇기 때문에 안정적이고, 에러 찾기에도 쉬우나, 코드량이 많아진다는 단점이 있다.
1.Single source of truth
동일한 데이터는 항상 같은 곳에서 가지고 온다. 즉, State
를 저장하는 하나뿐인 공간이 있다는 뜻이다.
2.State is read-only
Redux
에서는 Action
이라는 객체를 통해서 상태를 변경할 수 있다. Action
은 자바스크립트 객체이다.
3.Change are made with pure functions
변경은 순수 함수로만 가능하다. Reducer
와 관련이 있는 이야기이다.
Action
객체는 Dispatch
에게 전달되고, Dispatch
는 Reducer
를 호출해서 새로운 state를 생성한다. 이러한 규칙을 따르는 이유는 데이터가 한 방향으로 흘러야 하기 때문이다.
이 패턴은 알고보니 Redux
에서 자주 사용되는 유명한 패턴이였다. 이 패턴을 쓰게 되면 가독성이 정말 좋아지는데 그 이유가 바로 데이터를 다루는 부분(Container)과 화면을 표현하는 부분(Presentational)으로 나누어서 개발을 하기 때문이다
오늘 실제로 다뤄보고 결과를 보니 정말 보기가 편안했다. 만약 화면을 표현하는 부분(UI)를 수정하고 싶으면 presenter 파일로 가면 되고, 데이터 요청이나 관련 코드를 구현하거나, 수정하고 싶다면 Container파일로 가면 된다. 그렇기 때문에 유지, 보수 측면에서도 정말 편리할 것 같다!
useSelector
useSelector는 컴포넌트와 State를 연결하는 역할을 한다.
컴포넌트에서 useSelecotor 메소드를 통해 store의 state에 접근을 할 수 있었다.
import { useSelector } from 'react-redux';
const state = useSelector(state => state.itemReducer);
이런식으로 state에 접근할 수 있었는데, 이런 이유때문인지 정말 복잡하지 않고 쉽게할 수 있었던 것 같다.
useDispatch
useDispatch는 Action 객체를 Reducer로 전달해주는 메소드이다. 그렇기 때문에 먼저 Action
을 만들어 놓고 그 다음 useDispatch
메소드를 사용했다.
// actions.js
// --- Action 객체 ---
export const setQuantity = (itemId, quantity) => {
return {
type: SET_QUANTITY,
payload: {
itemId,
quantity
}
}
}
// Container.js
import { useDispatch, useSelector } from 'react-redux'
const dispatch = useDispatch();
// --- Aciton객체를 Reducer로 전달 ---
const handleQuantityChange = (quantity, itemId) => {
dispatch(setQuantity(itemId, quantity))
}
오늘 배운 Redux
도 어느정도 짜여진 틀에서 코드를 채워넣는 구조였다. 그렇기 때문에 완전히 내 코드라고는 할 수 가없다. 과제는 정말 빨리 끝냈지만 Redux
뿐만 아니라 Redux-saga
와 Redux-thunk
를 더 공부해야 할 필요가 있다.
오늘 아침에 못풀었던 Toy 알고리즘을 마저 다시 풀고, Redux
공부를 하고, 노마드코더 리액트 챌린지 과제를 하면 오늘 하루도 끝이다~!!!
👊 내일의 TIW(today I Will)
Redux