테이브 연합 프로젝트를 진행하면서, 사용자 로그인 시 로그인 api를 통해 userId를 받고, userId를 통해 조회한 사용자 정보를 리덕스로 관리하고자 하였음. 그러나, 사용자가 새로고침 하면 스토어에 저장된 state가 리셋되어, 사용자 정보가 초기화 되어버리는 문제 발생
Redux persist를 통해 사용자가 새로고침 해도 리덕스 스토어에 사용자 정보를 유지
localStorage에 저장할 경우
import storage from 'redux-persist/lib/storage
session Storage에 저장할 경우
import storageSession from 'redux-persist/lib/storage/session
npm install redux-persist
import { combineReducers } from 'redux';
import Schedule from './schedule';
import Memo from './memo';
import Plan from './plan';
import User from './user';
import { persistReducer } from 'redux-persist';
import storage from 'redux-persist/lib/storage'; // defaults to localStorage for web
const rootReducer = combineReducers({
Schedule, Memo, Plan, User
});
const persistConfig = {
//reducer의 어느 지점에서부터 데이터를 저장할 것인지 지정
key: 'root',
//localStorage에 저장함
storage,
// User 리듀서만 localstorage에 저장하게 설정
whitelist: ['User']
// blacklist -> 그것만 제외
};
export const persistedReducer = persistReducer(persistConfig, rootReducer);
/* eslint-disable */
import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';
import { QueryClient, QueryClientProvider } from 'react-query';
import { ReactQueryDevtools } from 'react-query/devtools';
import { ThemeProvider } from 'styled-components';
import { colorTheme } from './styles/theme';
import { GlobalStyle } from './styles/global-style';
import { composeWithDevTools } from 'redux-devtools-extension';
import { Provider } from 'react-redux';
import { createStore } from 'redux';
import rootReducer, { persistedReducer } from './services';
import { PersistGate } from 'redux-persist/integration/react';
import { persistStore } from "redux-persist";
const root = ReactDOM.createRoot(document.getElementById('root'));
const queryClient = new QueryClient();
const store = createStore(persistedReducer, composeWithDevTools());
const persistor = persistStore(store);
root.render(
<Provider store={store}>
<QueryClientProvider client={queryClient}>
<PersistGate loading={null} persistor={persistor}>
<ReactQueryDevtools initialIsOpen={true} />
<GlobalStyle />
<ThemeProvider theme={colorTheme}>
<App />
</ThemeProvider>
</PersistGate>
</QueryClientProvider>
</Provider>,
);
// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
reportWebVitals();