이어서 LOGOUT이라는 액션을 만들고, 이 액션이 디스패치되었을 때 API 호출 후 localStorage의 user 값을 지워 줍니다. 추가로 리듀서에서는 스토어의 user 값을 null로 설정하겠습니다.
로그아웃의 경우에는 성공/실패 여부가 중요하지 않으므로 LOGOUT_SUCCESS, LOGOUT_FAILURE와 같은 액션은 따로 만들지 않겠습니다.
modules/user.js
import { createAction, handleActions } from 'redux-actions'; import { takeLatest, call } from 'redux-saga/effects'; import * as authAPI from '../lib/api/auth'; import createRequestSaga, { createRequestActionTypes, } from '../lib/createRequestSaga'; const TEMP_SET_USER = 'user/TEMP_SET_USER'; // 새로고침 이후 임시 로그인 처리 // 회원 정보 확인 const [CHECK, CHECK_SUCCESS, CHECK_FAILURE] = createRequestActionTypes( 'user/CHECK', ); const LOGOUT = 'user/LOGOUT'; export const tempSetUser = createAction(TEMP_SET_USER, user => user); export const check = createAction(CHECK); export const logout = createAction(LOGOUT); const checkSaga = createRequestSaga(CHECK, authAPI.check); function checkFailureSaga() { try { localStorage.removeItem('user'); // localStorage에서 user를 제거 } catch (e) { console.log('localStorage is not working'); } } function* logoutSaga() { try { yield call(authAPI.logout); // logout API 호출 localStorage.removeItem('user'); // localStorage에서 user를 제거 } catch (e) { console.log(e); } } export function* userSaga() { yield takeLatest(CHECK, checkSaga); yield takeLatest(CHECK_FAILURE, checkFailureSaga); yield takeLatest(LOGOUT, logoutSaga); } const initialState = { user: null, checkError: null, }; export default handleActions( { (...) [LOGOUT]: state => ({ ...state, user: null, }), }, initialState, );