Redux Thunk를 이용한 비동기 검색 기능 구현하기
이번 블로그에서는 Redux Thunk를 사용하여 비동기 검색 기능을 구현하는 방법에 대해 알아보려 합니다.
Redux Thunk란?
Redux Thunk는 Redux의 미들웨어 중 하나로, 비동기 작업을 처리할 수 있는 확장 기능입니다. Redux는 기본적으로 동기적인 작업만을 처리할 수 있기 때문에, 비동기 작업을 처리하기 위해서는 Redux Thunk를 사용해야 합니다.
비동기 검색 기능 구현하기
1. Redux Thunk 설치하기
먼저 프로젝트에 Redux Thunk를 설치해야 합니다. 아래의 명령어를 통해 설치할 수 있습니다.
npm install redux-thunk
2. 액션 타입 정의하기
검색 과정에서 발생하는 액션들을 위해 액션 타입을 정의해야 합니다. 예를 들어, 검색 시작, 검색 성공, 검색 실패와 같은 액션들을 정의할 수 있습니다.
// actionTypes.js
export const SEARCH_START = "SEARCH_START";
export const SEARCH_SUCCESS = "SEARCH_SUCCESS";
export const SEARCH_FAILURE = "SEARCH_FAILURE";
3. 비동기 액션 크리에이터 정의하기
검색 함수를 호출하고 그 결과에 따라 액션을 생성하는 비동기 액션 크리에이터를 정의해야 합니다. 이때 Redux Thunk를 이용하여 비동기 작업을 처리합니다.
// actions.js
import { SEARCH_START, SEARCH_SUCCESS, SEARCH_FAILURE } from "./actionTypes";
import axios from "axios";
export const search = (query) => {
return async (dispatch) => {
dispatch({ type: SEARCH_START });
try {
const response = await axios.get(`/api/search?query=${query}`);
dispatch({ type: SEARCH_SUCCESS, payload: response.data });
} catch (error) {
dispatch({ type: SEARCH_FAILURE, payload: error.message });
}
};
};
4. 리듀서 구현하기
비동기 액션에 대한 상태 변화를 처리하는 리듀서를 구현해야 합니다. 예를 들어, 검색 결과를 상태에 저장하는 경우에는 다음과 같이 리듀서를 작성합니다.
// reducer.js
import { SEARCH_START, SEARCH_SUCCESS, SEARCH_FAILURE } from "./actionTypes";
const initialState = {
loading: false,
results: [],
error: null,
};
const reducer = (state = initialState, action) => {
switch (action.type) {
case SEARCH_START:
return { ...state, loading: true, error: null };
case SEARCH_SUCCESS:
return { ...state, loading: false, results: action.payload };
case SEARCH_FAILURE:
return { ...state, loading: false, error: action.payload };
default:
return state;
}
};
export default reducer;
5. 컨테이너 컴포넌트에서 검색 기능 사용하기
마지막으로, 컨테이너 컴포넌트에서 검색 기능을 사용할 수 있도록 구현해야 합니다. 이때 useDispatch 훅을 사용하여 비동기 액션 크리에이터를 호출할 수 있습니다.
// SearchContainer.js
import React, { useState } from "react";
import { useDispatch } from "react-redux";
import { search } from "./actions";
const SearchContainer = () => {
const [query, setQuery] = useState("");
const dispatch = useDispatch();
const handleSearch = () => {
dispatch(search(query));
};
return (
<div>
<input type="text" value={query} onChange={(e) => setQuery(e.target.value)} />
<button onClick={handleSearch}>검색</button>
</div>
);
};
export default SearchContainer;
마무리
이제 Redux Thunk를 사용하여 비동기 검색 기능을 구현하는 방법에 대해 알아보았습니다. Redux Thunk를 이용하면 Redux와 함께 비동기 작업을 처리할 수 있어서 웹 애플리케이션의 사용자 경험을 향상시킬 수 있습니다.