[react] 리액트 네이티브에서 비동기 처리와 리덕스
리액트 네이티브 앱을 개발할 때, API 호출, 데이터 가져오기 등의 비동기 작업을 수행해야 할 때가 있습니다. 이때 리덕스와 함께 비동기 처리를 어떻게 해야 하는지 알아보겠습니다.
1. Redux Thunk 사용하기
리덕스에서 비동기 작업을 처리하기 위해 Redux Thunk를 사용할 수 있습니다. Redux Thunk는 액션 생성자에서 비동기 작업을 수행하고, 다른 액션을 dispatch 하도록 허용합니다.
import { createStore, applyMiddleware } from 'redux';
import thunk from 'redux-thunk';
import rootReducer from './reducers';
const store = createStore(rootReducer, applyMiddleware(thunk));
2. 비동기 작업 처리
Redux Thunk를 이용하여 비동기 작업을 처리하는 예시입니다. fetchData
액션 생성자는 API를 호출하여 데이터를 가져온 후에 fetchSuccess
또는 fetchError
액션을 디스패치합니다.
export const fetchData = () => {
return (dispatch) => {
dispatch({ type: 'FETCHING_DATA' });
fetch('https://api.example.com/data')
.then((response) => response.json())
.then((data) => dispatch({ type: 'FETCH_SUCCESS', payload: data }))
.catch((error) => dispatch({ type: 'FETCH_ERROR', payload: error }));
};
};
3. Redux-Saga 사용하기
Redux-Saga는 리덕스 미들웨어로서 비동기 작업을 보다 세밀하게 제어할 수 있는 라이브러리입니다. 여러 작업들을 순차적으로 또는 병렬로 처리할 수 있습니다.
import { createStore, applyMiddleware } from 'redux';
import createSagaMiddleware from 'redux-saga';
import rootReducer from './reducers';
import rootSaga from './sagas';
const sagaMiddleware = createSagaMiddleware();
const store = createStore(rootReducer, applyMiddleware(sagaMiddleware));
sagaMiddleware.run(rootSaga);
4. 비동기 작업 처리
Redux-Saga를 이용하여 비동기 작업을 처리하는 예시입니다. fetchData
사가는 API를 호출하여 데이터를 가져온 후에 fetchSuccess
또는 fetchError
액션을 디스패치합니다.
import { call, put, takeEvery } from 'redux-saga/effects';
import Api from './api';
function* fetchData(action) {
try {
const data = yield call(Api.getData);
yield put({ type: 'FETCH_SUCCESS', payload: data });
} catch (error) {
yield put({ type: 'FETCH_ERROR', error });
}
}
function* watchFetchData() {
yield takeEvery('FETCHING_DATA', fetchData);
}
export default function* rootSaga() {
yield all([
watchFetchData()
]);
}
이제 리액트 네이티브 앱에서 비동기 작업을 리덕스와 함께 처리하는 방법에 대해 알아보았습니다. Redux Thunk와 Redux-Saga 중에서 선택하여 사용할 수 있으며, 프로젝트의 요구사항에 맞게 적절히 활용할 수 있습니다.
만약 이 중요한 주제에 대해 더 자세히 알고 싶다면, 공식 Redux 문서를 참고하시기 바랍니다.