이 글은 벨로퍼트 님의 '리액트를 다루는 기술', 위코드의 Redux 세션을 참고하여 작성하였습니다.
리덕스는 현재 가장 많이 사용되는 상태 관리 라이브러리이다.
리덕스를 사용하면 컴포넌트의 상태 업데이트 관련 로직을 다른 파일로 분리시켜 더울 효율적으로 관리할 수 있다.
또한, 컴포넌트끼리 똑같은 상태를 공유해야 할때도 여러 컴포넌트를 거치지 않고 손쉽게 상태 값을 전달하거나 업데이트할 수 있다.
이제 리덕스를 사용하면서 접하게 될 키워드의 개념을 알아보도록 하자.
상태에 어떠한 변화가 필요하면 액션(Action)이란 것이 발생한다.
액션은 하나의 객체로 표현되고, 다음과 같은 형식으로 이루어져 있다.
{
type: "액션의 종류를 한번에 식별할 수 있는 문자열 혹은 심볼",
payload: "액션의 실행에 필요한 임의의 데이터",
}
{
type:'ADD_TODO',
payload:{
id:1,
text: '리덕스 배우기',
}
}
{
type:'CHANGE_INPUT',
payload: '안녕하세요 신세원입니다.'
}
액션 생성함수(action creator)는 액션 객체를 만들어 주는 함수이다.
어떠한 변화를 일으켜야 할 때마다 액션 객체를 만들어야 하는데, 매번 액션 객체를 직접 작성하기 번거롭고, 만드는 과정에서 실수로 정보를 놓칠수 있다. 이러한 일을 방지하기 위해 함수로 만들어서 관리한다.
const addTodo =(data)=>{
return{
type:'ADD_TODO',
payload
};
}
리듀서(Reducer)는 변화를 일으키는 함수이다.
const initialState ={
counter:1
};
const reducer =(state = initialState,action)=>{
swith(action.type){
case INCREMENT:
return{
counter:state.counter+1
};
default:
return state;
}
}
switch
문을 쓴다.function cartReducer(state = INITIAL_STATE, action) {
switch (action.type) {
case "ADD_ITEM":
return [...state, action.payload]; // 스토어의 이전 상태에 새로운 item을 추가
default:
return state; // 해당 사항 없으면 이전 상태를 그대로 리턴
}
}
맨 처음 리덕스를 사용하면 컴포넌트의 상태 업데이트 관련 로직을 다른 파일로 분리시켜 더울 효율적으로 관리할 수 있다.
라고 적어놨다.
프로젝트에 리덕스를 적용하기 위해 스토어(store)를 만든다. 한 개의 프로젝트는 단 하나의 스토어만 가질 수 있다.
위 사진이 바로 리덕스를 프로젝트에 적용하게 됐을때 모습이다.(컴포넌트를 바깥에서 관리할 수 있는 구조)
스토어 안에는 프로젝트의 상태에 관한 데이터들이 담겨 있다.
예를 들어 B에서 일어나는 변화가 G에 반영된다고 가정해보자.
G 컴포넌트는 스토어에 구독을 한다. 구독을 하는 과정에서, 특정 함수가 스토어한테 전달이 되고, 나중에 스토어의 상태값에 변동이 생긴다면 전달 받았던 함수를 호출해준다.
이제 B 컴포넌트에서 어떤 이벤트가 생겨서, 상태를 변화 할 일이 생겼다.
이 때 dispatch 라는 함수를 통하여 액션을 스토어한테 던져준다.(dispatch는 뒤에서 자세하게 알아보도록 하자)
액션은 상태에 변화를 일으킬 때 참조 할 수 있는 객체이고. 액션 객체는 필수적으로 type 라는 값을 가지고 있어야 한다고 이야기했다.
예를들어 { type: 'INCREMENT' }
이런 객체를 전달 받게 된다면, 리덕스 스토어는 아~ 상태에 값을 더해야 하는구나~
하고 액션을 참조하게 된다.
추가적으로, 상태값에 2를 더해야 한다면, 이러한 액션 객체를 만들게 된다 { type: 'INCREMENT', diff: 2 }
그러면, 나중에 이 diff 값을 참고해서 기존 값에 2를 더하게된다.type 를 제외한 값은 선택적(optional) 인 값이다.
const dispatch = useDispatch()
dispatch(action)
과 같은 형태로 액션 객체를 파라미터로 넣어서 호출한다.action.type
에 따라 스토어가 업데이트 된다.