Redux Thunk는 Redux 미들웨어 중 하나로, 비동기 작업을 처리하고 액션을 디스패치할 수 있게 해줍니다. 이러한 기능을 이용하여 실시간 데이터 업데이트를 처리하는 예제를 살펴보겠습니다.
프로젝트 설정
먼저 Redux와 Redux Thunk를 설치해야 합니다. 다음 명령을 사용하여 npm을 통해 설치합니다:
npm install redux redux-thunk
다음으로 Redux 스토어를 설정하고 Thunk 미들웨어를 적용합니다. store.js
파일을 만들고 다음 코드를 작성합니다:
import { createStore, applyMiddleware } from 'redux';
import thunk from 'redux-thunk';
import rootReducer from './reducers';
const store = createStore(rootReducer, applyMiddleware(thunk));
export default store;
액션 생성자와 Thunk 함수
본 예제에서는 데이터를 비동기로 가져오는 작업을 수행하고, 가져온 데이터를 이용하여 액션을 디스패치하는 방식으로 실시간 데이터 업데이트를 구현합니다. 우선 액션 타입과 액션 생성자 함수를 작성합니다:
// actionTypes.js
export const FETCH_DATA_REQUEST = 'FETCH_DATA_REQUEST';
export const FETCH_DATA_SUCCESS = 'FETCH_DATA_SUCCESS';
export const FETCH_DATA_FAILURE = 'FETCH_DATA_FAILURE';
// actionCreators.js
export const fetchDataRequest = () => ({
type: FETCH_DATA_REQUEST,
});
export const fetchDataSuccess = (data) => ({
type: FETCH_DATA_SUCCESS,
payload: data,
});
export const fetchDataFailure = (error) => ({
type: FETCH_DATA_FAILURE,
payload: error,
});
다음으로 실제로 비동기 작업을 처리하고 액션을 디스패치하는 Thunk 함수를 작성합니다:
// actions.js
import { fetchDataSuccess, fetchDataFailure, fetchDataRequest } from './actionCreators';
export const fetchData = () => {
return async (dispatch) => {
dispatch(fetchDataRequest());
try {
const response = await fetch('https://example.com/api/data');
const data = await response.json();
dispatch(fetchDataSuccess(data));
} catch (error) {
dispatch(fetchDataFailure(error));
}
};
};
컴포넌트에서 Thunk 함수 사용
이제 Redux Thunk를 사용하여 데이터를 가져오는 Thunk 함수를 컴포넌트에서 사용할 수 있습니다. DataViewer
컴포넌트를 예로 들어보겠습니다:
import React, { useEffect } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import { fetchData } from './actions';
const DataViewer = () => {
const dispatch = useDispatch();
const data = useSelector((state) => state.data);
const loading = useSelector((state) => state.loading);
const error = useSelector((state) => state.error);
useEffect(() => {
dispatch(fetchData());
}, []);
if (loading) {
return <div>Loading...</div>;
}
if (error) {
return <div>Error: {error}</div>;
}
return (
<ul>
{data.map((item) => (
<li key={item.id}>{item.name}</li>
))}
</ul>
);
};
export default DataViewer;
위와 같이 Thunk 함수를 사용하여 데이터를 가져오고, 상태값을 이용하여 로딩 상태와 에러 처리를 할 수 있습니다. 데이터를 가져와서 렌더링하는 예제입니다.
마무리
이 예제에서는 Redux Thunk를 사용하여 실시간 데이터 업데이트를 구현하는 방법을 알아보았습니다. 비동기 작업을 처리하고 액션을 디스패치하기 위해 Thunk 함수를 사용하는 것은 복잡할 수 있지만, Redux Thunk를 이용하면 간단하게 구현할 수 있습니다. 이를 통해 Redux 애플리케이션에서 효율적인 데이터 업데이트를 할 수 있습니다.
더 자세한 내용은 Redux 공식 문서를 참고하시기 바랍니다.