반응형
이번 포스팅에서는 redux-persist 패키지를 사용해서 브라우저의 LocalStorage에 상태값을 저장해 놓고 사용하는 방법에 대해 알아보고자 한다. Redux가 세팅되어 있다는 가정 하에 redux-persist만 추가해보도록 하자.
Redux를 사용해 상태 관리를 할 경우 store에 상태값을 넣어놓고 사용하게 된다. 하지만 Redux의 store는 페이지를 새로고침 할 경우 state가 초기값으로 되돌아가게 된다. 이것에 대한 대응 방안으로 LocalStorage에 저장하고자 하는 state를 저장하여 새로고침을 해도 저장공간에 있는 데이터를 Redux에 불러올 수 있는 방법을 사용한다. 그리고 이러한 역할을 수행해주는 라이브러리가 redux-persist 이다.
👉 설치
npm install redux-persist
👉 Store/useStore.jsx -> persist store 사용
// Store/useStore.jsx
import { createStore, compose, applyMiddleware } from 'redux'
import { Provider } from 'react-redux'
import rootReducer from '../reducers'
import { composeWithDevTools } from 'redux-devtools-extension'
import createSagaMiddleware from 'redux-saga' // redux -> object createSagaMiddleware()
import rootSaga from '../sagas'
import { persistStore } from 'redux-persist'
// persist 전용 store를 만들기 위함.
import { PersistGate } from 'redux-persist/integration/react'
// persist와 관련된 정보를 전역에서 관리하기 위해,
// react-redux의 Provider와 같은 것을 만들어 주기 위함.
const sagaMiddleware = createSagaMiddleware()
const middleware = [sagaMiddleware]
const enhancer = process.env.NODE_ENV === 'production'
? compose(applyMiddleware(...middleware)) // 배포모드
: composeWithDevTools(applyMiddleware(...middleware)) // 개발모드
const store = createStore(rootReducer,enhancer) // rootReducer , enhancer
sagaMiddleware.run(rootSaga) // sagas/index.js
const persistor = persistStore(store) // persist 전용 store
const Store = ({children}) => {
return (
<Provider store={store}>
<PersistGate loading={null} persistor={persistor}>
{children}
</PersistGate>
</Provider>
)
}
export default Store
👉 reducers/index.js -> reducer에 persist store를 정의
import { combineReducers } from "redux";
import { persistReducer } from 'redux-persist' // reducer가 실행될 때 persist도 묶어서 사용.
import storage from 'redux-persist/lib/storage' // localStorage에 저장하기 위함.
import counter from './counter.js'
import user from './user.js'
// config
// localStorage의 key, value
const persistConfig = {
key: 'user', // localStorage에 저장될 때의 key값.
storage,
whitelist: ['user'] // store에 있는 user reducer만 localStorage에 저장하겠다는 의미.
}
// persist가 store에 있는 user reducer만을 localStorage에 저장.
// localStorage에 있던 값을 store 안의 user reducer의 initialState 값으로 넣어준다.
const rootReducer = combineReducers({
counter,
user
})
export default persistReducer(persistConfig, rootReducer)
// rootReducer와 persist를 묶어서 사용.
// persist와 관련된 reducer를 만들어준 것.
추가설명 )
redux-persist를 사용해서 localStorage에 state를 저장할 경우, 페이지가 새로고침 되어도 initialState 값이 localStorage에 저장된 state로 대체되기 때문에 state가 초기화되지 않는다.
반응형
'React' 카테고리의 다른 글
Redux - redux-actions / immer (0) | 2022.05.10 |
---|---|
Redux - redux-saga (1) | 2022.05.10 |
Redux - redux middleware (0) | 2022.05.07 |
React - react-redux (0) | 2022.05.03 |
React - react-router-dom (0) | 2022.05.02 |