TIL

Redux

용어

용법

initialState 생성, action 객체 생성
-> someReducer = state, action을 받는 reducer
-> rootReducer = combineReducers({ someReducer, ...리듀서들 객체 })
-> store = createStore(rootReducer)

정리

용어나 동작 원리 자체는 Context API와 useReducer를 함께 사용하는 것과 크게 다르지 않은 것 같다.
그렇다면 Redux는 왜 사용하는 걸끼?


Redux-Tool-Kit

Redux-Tool-Kit은 미들웨어가 아닌, 리덕스를 보다 잘(?) 사용할 수 있도록 도와주는 도구 모음이다.
리덕스를 사용할 때 유용한 도구들을 붙인 커스텀 훅을 제공하는, 마치 갑옷을 입히고 더 좋은 무기를 들게 한 리덕스라고 생각한다.

공식 문서에서 본 중 기억에 남는건,

그 외의 기능은 학습하며 이해할 수 있을만한 문장..


slice: createSlice()

slice는 뭘까? action과 reducer, initialState를 한데 합쳐놓은 예쁜 리듀서 세트 정도다.

createSlice()에 name, initialState, reducers를 포함하는 객체를 파라미터로 주어 slice를 생성

import { createSlice } from '@reduxjs/toolkit';

export const counterSlice = createSlice({
  name: 'counter',
  initialState: {
    value: 0,
  },
  reducers: {
    increment: state => {
      state.value += 1;
    },
    decrement: state => {
      state.value -= 1;
    },
    incrementByAmount: (state, action) => {
      state.value += action.payload;
    },
  },
});

export const { increment, decrement, incrementByAmount } = counterSlice.actions;
export default counterSlice.reducer;


store 생성: configureStore()

예쁜 리듀서 세트인 slice들을 모아 하나의 전역 관리 저장소인 store를 생성한다.

import { configureStore } from '@reduxjs/toolkit';
import usersReducer from '../features/users/usersSlice';
import postsReducer from '../features/posts/postsSlice';
import commentsReducer from '../features/comments/commentsSlice';

export default configureStore({
  reducer: {
    users: usersReducer,
    posts: postsReducer,
    comments: commentsReducer,
  },
});

store의 state에 접근하게 되면, 이 리듀서 집합에 닿게 된다.
따라서 각각의 slice에는,
state.users, state.posts, state.comments와 같이 접근하면 된다.


store에서 state 추출: useSelector()

방법이 두 가지가 있는 것 같다.
useSelector()를 이용하는 방법과 store에 접근하는 방법,

  1. useSelector()
    useSelector()의 리턴값은 state다.
    따라서 이 안에 원하는 slice의 state를 추출하는 커스텀 함수를 넣으면, 특정 slice의 state를 받아올 수 있다.

    export const selectCount = state => state.counter;
    
    const count = useSelector(selectCount);
    // { value : 0 }
    
  2. store 접근

    export const selectCount = state => state.counter;
    
    // 또는 store.getState().counter;
    const count = selectCounter(store.getState());
    
    // { value : 0 }
    

state에 접근하는 프로퍼티명도 slice의 name이다.


dispatch: useDispatch()

useSelector()와 useDispatch() 모두 리덕스와 동일하다.
store.으로 직접 접근도 가능하지만, Hook을 사용하여 state와 dispatch를 사용할 수 있다.