이제 새로운 리듀서를 만들어 줄 차례입니다. 위 API를 사용하여 데이터를 받아와 상태를 관리할 sample이라는 리듀서를 생성해 보겠습니다. 주석을 읽으면서 다음 코드를 작성해 보세요.

    modules/sample.js

    import { handleActions } from 'redux-actions';
    import * as api from '../lib/api';
    
    // 액션 타입을 선언합니다.
    //  요청당  개를 만들어야 합니다.
    
    const GET_POST = 'sample/GET_POST';
    const GET_POST_SUCCESS = 'sample/GET_POST_SUCCESS';
    const GET_POST_FAILURE = 'sample/GET_POST_FAILURE';
    
    const GET_USERS = 'sample/GET_USERS';
    const GET_USERS_SUCCESS = 'sample/GET_USERS_SUCCESS';
    const GET_USERS_FAILURE = 'sample/GET_USERS_FAILURE';
    
    // thunk 함수를 생성합니다.
    // thunk 함수 내부에서는 시작할 , 성공했을 , 실패했을  다른 액션을 디스패치합니다.
    
    export const getPost = id => async dispatch => {
      dispatch({ type: GET_POST }); // 요청을 시작한 것을 알림
      try {
        const response = await api.getPost(id);
        dispatch({
          type: GET_POST_SUCCESS,
          payload: response.data
        }); // 요청 성공
      } catch (e) {
        dispatch({
          type: GET_POST_FAILURE,
          payload: e,
          error: true
        }); // 에러 발생
        throw e; // 나중에 컴포넌트단에서 에러를 조회할  있게  
      }
    };
    
    export const getUsers = () => async dispatch => {
      dispatch({ type: GET_USERS }); // 요청을 시작한 것을 알림
      try {
        const response = await api.getUsers();
        dispatch({
          type: GET_USERS_SUCCESS,
          payload: response.data
        }); // 요청 성공
      } catch (e) {
        dispatch({
          type: GET_USERS_FAILURE,
          payload: e,
          error: true
        }); // 에러 발생
        throw e; // 나중에 컴포넌트단에서 에러를 조회할  있게  
      }
    };
    
    // 초기 상태를 선언합니다.
    // 요청의 로딩  상태는 loading이라는 객체에서 관리합니다.
    
    const initialState = {
      loading: {
        GET_POST: false,
        GET_USERS: false
      },
      post: null,
      users: null
    };
    
    const sample = handleActions(
      {
        [GET_POST]: state => ({
          ...state,
          loading: {
            ...state.loading,
            GET_POST: true // 요청 시작
          }
        }),
        [GET_POST_SUCCESS]: (state, action) => ({
          ...state,
          loading: {
            ...state.loading,
            GET_POST: false // 요청 완료
          },
          post: action.payload
        }),
        [GET_POST_FAILURE]: (state, action) => ({
          ...state,
          loading: {
            ...state.loading,
            GET_POST: false // 요청 완료
          }
        }),
        [GET_USERS]: state => ({
          ...state,
          loading: {
            ...state.loading,
            GET_USERS: true // 요청 시작
          }
        }),
        [GET_USERS_SUCCESS]: (state, action) => ({
          ...state,
          loading: {
            ...state.loading,
            GET_USERS: false // 요청 완료
          },
          users: action.payload
        }),
        [GET_USERS_FAILURE]: (state, action) => ({
          ...state,
          loading: {
            ...state.loading,
            GET_USERS: false // 요청 완료
          }
        })
      },
      initialState
    );
    
    export default sample;

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