Redux Thunk를 이용한 다중 페이지 폼 구현하기

소개

다중 페이지 폼은 사용자로부터 여러 단계로 나뉘어진 정보를 수집하는 과정입니다. 이러한 폼을 구현하기 위해 Redux Thunk를 활용할 수 있습니다. Redux Thunk는 Redux middleware로, 비동기 동작을 처리하기 위한 표준적인 방법입니다.

이번 블로그에서는 Redux Thunk를 사용하여 다중 페이지 폼을 구현하는 방법에 대해 알아보겠습니다.

시작하기 전에

  1. Redux와 Redux Thunk를 프로젝트에 설치해주세요:
    npm install redux redux-thunk
    
  2. Redux store를 설정해주세요. 예시 코드는 다음과 같습니다: ```javascript import { createStore, applyMiddleware } from ‘redux’; import thunk from ‘redux-thunk’; import rootReducer from ‘./reducers’;

const store = createStore(rootReducer, applyMiddleware(thunk));

export default store;


## 구현 과정

1. 액션 타입과 액션 생성자 함수를 정의합니다. 각 페이지에 해당하는 액션 타입을 정의하고, 상태를 변경하기 위한 액션 생성자 함수를 만듭니다.

```javascript
// actionTypes.js
export const SET_PAGE_1_DATA = 'SET_PAGE_1_DATA';
export const SET_PAGE_2_DATA = 'SET_PAGE_2_DATA';

// actions.js
export const setPage1Data = (data) => ({
  type: SET_PAGE_1_DATA,
  payload: data,
});

export const setPage2Data = (data) => ({
  type: SET_PAGE_2_DATA,
  payload: data,
});
  1. 리듀서를 작성합니다. 각 페이지에 해당하는 상태를 관리하는 리듀서를 만듭니다.
// reducers.js
import { combineReducers } from 'redux';
import { SET_PAGE_1_DATA, SET_PAGE_2_DATA } from './actionTypes';

const page1DataReducer = (state = {}, action) => {
  switch (action.type) {
    case SET_PAGE_1_DATA:
      return {
        ...state,
        ...action.payload,
      };
    default:
      return state;
  }
};

const page2DataReducer = (state = {}, action) => {
  switch (action.type) {
    case SET_PAGE_2_DATA:
      return {
        ...state,
        ...action.payload,
      };
    default:
      return state;
  }
};

const rootReducer = combineReducers({
  page1Data: page1DataReducer,
  page2Data: page2DataReducer,
});

export default rootReducer;
  1. 폼 컴포넌트를 작성합니다. 각 페이지에 대한 템플릿과 폼 데이터를 관리하는 컴포넌트를 만듭니다.
import React from 'react';
import { useDispatch, useSelector } from 'react-redux';
import { setPage1Data, setPage2Data } from './actions';

const FormPage1 = () => {
  const dispatch = useDispatch();
  const page1Data = useSelector((state) => state.page1Data);

  const handleSubmit = (e) => {
    e.preventDefault();
    // 폼 데이터 유효성 검사 등의 로직 수행
    dispatch(setPage1Data({
      // 페이지 1에서 수집한 데이터
    }));
    // 다음 페이지로 이동
  };

  return (
    <form onSubmit={handleSubmit}>
      {/* 페이지 1 템플릿 */}
    </form>
  );
};

const FormPage2 = () => {
  const dispatch = useDispatch();
  const page2Data = useSelector((state) => state.page2Data);

  const handleSubmit = (e) => {
    e.preventDefault();
    // 폼 데이터 유효성 검사 등의 로직 수행
    dispatch(setPage2Data({
      // 페이지 2에서 수집한 데이터
    }));
    // 다음 페이지로 이동
  };

  return (
    <form onSubmit={handleSubmit}>
      {/* 페이지 2 템플릿 */}
    </form>
  );
};
  1. 폼 컴포넌트를 사용하는 메인 컴포넌트를 작성합니다. 각 페이지에 대한 라우트를 설정하고, 페이지 간 이동을 관리합니다.
import React from 'react';
import { BrowserRouter as Router, Route, Link } from 'react-router-dom';
import FormPage1 from './FormPage1';
import FormPage2 from './FormPage2';

const App = () => {
  return (
    <Router>
      <nav>
        <ul>
          <li>
            <Link to="/">페이지 1</Link>
          </li>
          <li>
            <Link to="/page2">페이지 2</Link>
          </li>
        </ul>
      </nav>

      <Route path="/" exact component={FormPage1} />
      <Route path="/page2" component={FormPage2} />
    </Router>
  );
};

export default App;

결론

Redux Thunk를 활용하여 다중 페이지 폼을 구현하는 방법을 알아보았습니다. Redux를 사용하면 상태 관리와 비동기 동작 처리를 용이하게 할 수 있습니다. Redux Thunk를 이용하면 비동기 동작을 처리하는 데 수월하게 할 수 있으며, 다중 페이지 폼을 구현하는 데에도 도움이 됩니다.

더 많은 Redux Thunk 기능과 사용법을 알고 싶다면 공식 문서를 참고해주세요.

#redux #redux-thunk