이어서 LOGOUT이라는 액션을 만들고, 이 액션이 디스패치되었을 때 API 호출 후 localStorageuser 값을 지워 줍니다. 추가로 리듀서에서는 스토어의 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,
    );

    신간 소식 구독하기
    뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.