지금부터는 실제로 redux-persist
를 사용하는 방법에 대해서 배워보도록 하겠습니다.
가장 먼저 어떤 Storage에 데이터를 저장할 것인지, Storage Engine을 선택해야 합니다.
웹에서는 localStorage
와 sessionStorage
중에서 선택해서 사용하면 되는데, 일반적으로는 localStorage
를 가장 많이 사용합니다.
Storage Engine을 선택했다면, 다음으로는 redux-persist
를 어떻게 사용할 것인지 설정을 세팅해야 합니다.
이 설정 객체를 보통 persistConfig
라고 부르는데, persistConfig
에는 대표적으로 다음과 같은 속성들이 있습니다.
key
storage
version
blacklist
& whitelist
transforms
먼저 key
는 저장할 데이터의 key를 의미합니다.
그리고 storage
는 사용할 Storage Engine을 지정하는 속성입니다.
앞에서 선택한 localStorage
또는 sessionStorage
를 여기에 넣으면 됩니다.
그리고 version
은 현재 저장된 State의 버전을 의미하는데, 개발하다 보면 이미 배포된 이후에 State Tree의 구조가 바뀔 수 있기 때문에 이렇게 버전을 명시하여 향후 Migration에 사용하게 됩니다.
Migration에 대해서는 뒤에서 다시 자세히 살펴보도록 하겠습니다.
다음 속성은 blacklist
& whitelist
입니다.
이 속성은 저장에서 제외(blacklist)하거나, 저장할 타겟(whitelist) State의 key값을 의미합니다.blacklist
를 사용해서 전체 State Tree에서 일부 State만 저장하지 않을 수도 있고, 반대로 whitelist
를 사용해서 일부 State만 저장할 수도 있습니다.
마지막으로 transforms
는 앞에서 배웠던 데이터 변환 플러그인을 지정하는 속성입니다.
persistConfig
에는 이외에도 다양한 속성들이 있는데, 추가적인 속성이 궁금한 분들은 아래 링크를 참고하기 바랍니다.
https://github.com/rt2zz/redux-persist/blob/master/src/types.ts
자, 이제 persistConfig
까지 결정했다면, 다음으로는 Redux Store와 redux-persist
를 연동해야 합니다.
import { createStore } from 'redux';
import { persistStore, persistReducer } from 'redux-persist';
import storage from 'redux-persist/lib/storage';
import rootReducer from './reducers';
const persistConfig = {
key: 'root',
storage: storage,
}
const persistedReducer = persistReducer(persistConfig, rootReducer);
const store = createStore(persistedReducer);
export const persistor = persistStore(store);
export default store;
연동은 위 코드와 같이 먼저 persistConfig
객체를 만들고, 이 persistConfig
와 rootReducer
를 파라미터로 해서 persistReducer
를 만듭니다.
이렇게 만들어진 persistedReducer
는 내부 State들이 Storage를 통해 저장되고 복원되게 됩니다.
그리고 Redux의 createStore()
함수를 호출 할 때, 이 persistedReducer
를 넣어주면 됩니다.
그리고 마지막 부분에 persistStore()
함수를 사용해서 persistor
라는 것을 만들어서 export
하고 있습니다.
여기서 잠시 이 persistor
에 대해서 조금 자세히 살펴보도록 하겠습니다.
Persistor는 Persisted Redux Store와 관련된 여러 함수들을 제공하는 객체입니다.
purge()
flush()
pause()
persist()
제공 되는 함수들을 하나씩 살펴보면, 먼저 purge()
함수는 데이터를 모두 초기화 하는 함수이고, flush()
함수는 즉시 모든 state의 데이터를 저장하는 함수입니다.
그리고 pause()
함수는 데이터 저장(persist)를 일시 중단하는 함수고, persist()
함수는 데이터 저장(persist)을 다시 재개하는 함수입니다.
Persistor는 이렇게 Persisted Redux Store의 기능을 직접 호출하고 싶을 때 사용할 수 있는 객체라고 보면 됩니다.
여기까지 하면 Redux와 redux-persist
의 연동은 모두 끝납니다.
하지만 React와 Redux를 함께 사용하는 경우에는, 한 가지 더 추가로 해야 할 작업이 있습니다.
바로 아래 코드처럼 최상위 컴포넌트를 PersistGate
컴포넌트로 감싸는 것입니다.
import React from 'react';
import ReactDOM from 'react-dom/client';
import { Provider } from 'react-redux';
import { PersistGate } from 'redux-persist/integration/react';
import store, { persistor } from './redux/store';
import App from './App';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
<Provider store={store}>
<PersistGate loading={null} persistor={persistor}>
<App />
</PersistGate>
</Provider>
);
그리고 PersistGate
컴포넌트의 props
로 앞에서 만든 persistor
가 들어가게 됩니다.
이렇게 하면 저장된 데이터가 로딩되어 Redux Store에 복원되기 전까지 UI 렌더링을 막을 수 있습니다.
그리고 loading
prop을 사용하면, 데이터가 로딩되어 Redux Store에 복원되기 전까지 보여줄 UI를 직접 구현할 수도 있습니다.
여기에서는 데이터 로딩 전까지 화면에 아무것도 렌더링하지 않도록 하기 위해서 null
로 설정해두었습니다.
PersistGate
를 사용하면 데이터가 비어있는 상태에서 렌더링 되는 것을 막을 수 있기 때문에, 조금 더 깔끔한 사용자 경험을 제공할 수 있게 됩니다.
마지막 업데이트: 2023년 07월 14일 00시 00분
이 문서의 저작권은 이인제(소플)에 있습니다. 무단 전재와 무단 복제를 금합니다.