Redux๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋๊ธฐ์ ์ธ ๋ฐ์ดํฐ ํ๋ฆ์ ๋ค๋ฃจ๊ธฐ ์ํด ์ค๊ณ๋์๊ธฐ ๋๋ฌธ์, API ํธ์ถ ๊ฐ์ ๋น๋๊ธฐ ์์
์ ์ง์ ์ฒ๋ฆฌํ์ง ์๋๋ค.
redux-thunk๋ Redux์์ ๋น๋๊ธฐ ์์
์ ๊ด๋ฆฌํ ์ ์๋๋ก ๋์์ฃผ๋ ๋ฏธ๋ค์จ์ด๋ผ๊ณ ํ๋ค.
๊ทธ๋ฐ๋ฐ Redux ์์ ๊ตณ์ด Redux-thunk ๋ฅผ ํ์ฉํ์ฌ ๋น๋๊ธฐ ์ํ ๋ณ๊ฒฝ ์ฒ๋ฆฌ๋ฅผ ํด์ผํ๋ ์ด์ ๊ฐ ๊ถ๊ธํด์ก๋ค.
Redux ์ธ๋ถ์์ API ์์ฒญ์ ์ฃผ๊ณ ๋ฐ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ง Redux๋ก ๋ณด๋ด์ด ์ํ๋ฅผ ์ ๋ฐ์ดํธ (dispatch) ํด๋ ๋๋๊ฑฐ ์๋๊น?
์ฆ, ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ๊ณผ ๋น๊ตํ์ ๋ Redux-thunk ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ด๋ค ์ด์ ์ด ์๋์ง ๊ถ๊ธํด์ก๋ค.
// ์ปดํฌ๋ํธ์์ ๋น๋๊ธฐ ์์ฒญ๊ณผ ์ํ๋ฅผ ๋ก์ปฌ๋ก ๊ด๋ฆฌํ๋ ์์
const MyComponent = () => {
const [loading, setLoading] = useState(false);
const [error, setError] = useState(null);
const dispatch = useDispatch();
const fetchData = async () => {
setLoading(true);
try {
const response = await apiRequest();
dispatch(updateData(response.data)); // ์์ฒญ ์ฑ๊ณต ์ ์ํ ์
๋ฐ์ดํธ
} catch (err) {
setError(err.message); // ์์ฒญ ์คํจ ์ ์๋ฌ ์ํ ์
๋ฐ์ดํธ
} finally {
setLoading(false);
}
};
useEffect(() => {
fetchData();
}, []);
};
redux-thunk๋ฅผ ํ์ฉํ์ฌ ๋น๋๊ธฐ ์ํ ๋ณ๊ฒฝ ์ฒ๋ฆฌ๋ฅผ ํ๋ ์ด์
Redux Toolkit์์ redux-thunk
๋ฅผ ํ์ฉํ์ฌ ๋น๋๊ธฐ ์ํ ๋ณ๊ฒฝ ์ฒ๋ฆฌ๋ฅผ ํ๋ ์ด์ ๋ ๋น๋๊ธฐ ์์
์ ์ ํ ์ํ๋ฅผ Redux์์ ๊ด๋ฆฌํ๊ณ , ์ผ๊ด๋ ์ํ ๊ด๋ฆฌ ํ๋ฆ์ ์ ์งํ๊ธฐ ์ํด์์ด๋ค. ์ธ๋ถ์์ ๋น๋๊ธฐ API ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ , ์ฑ๊ณต ์์๋ง Redux ์ํ๋ฅผ ์
๋ฐ์ดํธํ๋ ๋ฐฉ์๋ ๊ฐ๋ฅํ์ง๋ง, redux-thunk
๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ด์ ์ด ์๋ค.
1. ๋ก๋ฉ ์ํ์ ์๋ฌ ์ํ ๊ด๋ฆฌ
๋น๋๊ธฐ ์์ฒญ์๋ ์ฃผ๋ก ์ธ ๊ฐ์ง ์ํ๊ฐ ์กด์ฌํ๋ค.
- ์์ฒญ์ด ์์๋จ (loading ์ํ)
- ์์ฒญ์ด ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋จ (success ์ํ)
- ์์ฒญ์ด ์คํจํจ (error ์ํ)
์๋ฅผ ๋ค์ด:
redux-thunk
๋ฅผ ์ฌ์ฉํ๋ฉด, ๋น๋๊ธฐ ์์ ์ ๊ฐ ๋จ๊ณ์ ๋ฐ๋ผ ์ํ๋ฅผ ์ ๋ฐ์ดํธํ ์ ์๋ค.- API ํธ์ถ์ด ์์๋๋ฉด
loading
์ํ๋ฅผtrue
๋ก ์ค์ - API ํธ์ถ์ด ์ฑ๊ณตํ๋ฉด
loading
์false
๋ก ์ค์ ํ๊ณ , ๋ฐ์ดํฐ๋ฅผ ์ํ์ ์ ์ฅ - API ํธ์ถ์ด ์คํจํ๋ฉด
loading
์false
๋ก ์ค์ ํ๊ณ , ์๋ฌ ๋ฉ์์ง๋ฅผ ์ํ์ ์ ์ฅ
// slice.js
import { createSlice, createAsyncThunk } from '@reduxjs/toolkit';
// createAsyncThunk๋ฅผ ์ฌ์ฉํด ๋น๋๊ธฐ ์ก์
์์ฑ
export const fetchData = createAsyncThunk(
'data/fetchData',
async (_, thunkAPI) => {
const response = await fetch('https://api.example.com/data');
const data = await response.json();
return data; // fulfilled ์ํ์ payload๋ก ์ ๋ฌ๋จ
}
);
// createSlice๋ฅผ ํตํด ๋ฆฌ๋์์ ์ก์
์ ์
const dataSlice = createSlice({
name: 'data',
initialState: {
data: null,
loading: false,
error: null,
},
reducers: {
// ๋๊ธฐ ์ก์
์ด ํ์ํ ๊ฒฝ์ฐ ์ฌ๊ธฐ์ ์ถ๊ฐํ ์ ์์
},
extraReducers: (builder) => {
builder
.addCase(fetchData.pending, (state) => {
state.loading = true;
state.error = null;
})
.addCase(fetchData.fulfilled, (state, action) => {
state.loading = false;
state.data = action.payload;
})
.addCase(fetchData.rejected, (state, action) => {
state.loading = false;
state.error = action.error.message;
});
},
});
export default dataSlice.reducer;
import React, { useEffect } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import { fetchData } from './slice';
const DataComponent = () => {
const dispatch = useDispatch();
const { data, loading, error } = useSelector((state) => state.data);
useEffect(() => {
dispatch(fetchData());
}, [dispatch]);
if (loading) return <p>Loading...</p>;
if (error) return <p>Error: {error}</p>;
return (
<div>
<h1>Data</h1>
<pre>{JSON.stringify(data, null, 2)}</pre>
</div>
);
};
export default DataComponent;
=> ์ด๋ ๊ฒ ํ๋ฉด ์ปดํฌ๋ํธ์์ ๋ก๋ฉ ์คํผ๋๋ฅผ ํ์ํ๊ฑฐ๋, ์๋ฌ ๋ฉ์์ง๋ฅผ ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ฃผ๋ ๋ฑ ๋ณด๋ค ํ๋ถํ UX๋ฅผ ์ ๊ณตํ ์ ์๋ค.
2. ์ํ์ ์ผ๊ด์ฑ ์ ์ง
๋น๋๊ธฐ ์์ฒญ์ ์ธ๋ถ์์ ์ฒ๋ฆฌํ๊ณ ์ฑ๊ณตํ ๊ฒฝ์ฐ์๋ง Redux ์ํ๋ฅผ ์ ๋ฐ์ดํธํ๋ฉด, ์ํ ๋ณํ์ ํ๋ฆ์ด Redux์์ ๊ด๋ฆฌ๋์ง ์๊ธฐ ๋๋ฌธ์ ์ํ์ ์ผ๊ด์ฑ์ด ๊นจ์ง ์ํ์ด ์๋ค.
- ์ธ๋ถ์์ API ์์ฒญ์ด ์ฑ๊ณตํ์ง๋ง Redux ์ํ ์ ๋ฐ์ดํธ๊ฐ ๋๋ฝ๋๊ฑฐ๋, ๋คํธ์ํฌ ์ง์ฐ์ผ๋ก ์ธํด ๋ฆ๊ฒ ๋์ฐฉํ ์๋ต์ด ์ํ๋ฅผ ์๋ชป ๋ฎ์ด์ฐ๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ ์ ์๋ค.
- Redux๋ ์ํ์ ๋จ์ผ ์ง์ค ์์ค(single source of truth)๋ก์ ๋์ํด์ผ ํ๋ฏ๋ก, ๋น๋๊ธฐ ์์ ์ ์ํ ๋ณํ๋ฅผ ์ผ๊ด๋๊ฒ ๊ด๋ฆฌํ๋ ๊ฒ์ด ์ค์ํ๋ค.
redux-thunk
๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ ๋ก์ง์ Redux ์์์ ๊ด๋ฆฌํ๋ฉด, ์ํ ๋ณํ๊ฐ Redux ํ๋ฆ์ ํตํฉ๋์ด ์ํ์ ์ผ๊ด์ฑ์ ์ ์งํ ์ ์๋ค.
๋น๋๊ธฐ ์์ฒญ์ ์ธ๋ถ์์ ์ฒ๋ฆฌํ๊ณ ์ฑ๊ณตํ ๊ฒฝ์ฐ์๋ง Redux ์ํ๋ฅผ ์ ๋ฐ์ดํธํ ๋ ๋ฐ์ํ ์ ์๋ ๋ฌธ์ ๋ฅผ ์ดํดํ๋ ค๋ฉด, ์ํ์ ์ผ๊ด์ฑ์ด ๊นจ์ง ์ํ์ด ์ด๋ค ์ํฉ์์ ๋ฐ์ํ ์ ์๋์ง ์ดํด๋ณผ ํ์๊ฐ ์๋ค.
1) ๋คํธ์ํฌ ์ง์ฐ ๋๋ ์คํจ๋ก ์ธํ ์ํ ๋ถ์ผ์น
์๋ฅผ ๋ค์ด, ์ฌ์ฉ์๊ฐ ๋ ๋ฒ ์ฐ์์ผ๋ก "๋ฐ์ดํฐ ๋ก๋" ๋ฒํผ์ ๋๋ฌ ๋น๋๊ธฐ ์์ฒญ์ด ๋ ๋ฒ ๋ฐ์ํ๋ค๊ณ ๊ฐ์ ํด ๋ณด์.
- ์ฒซ ๋ฒ์งธ ์์ฒญ์ด ์๋ฒ์ ๋๋ฌํ์ง๋ง ๋คํธ์ํฌ ์ง์ฐ์ผ๋ก ์ธํด ์๋ต์ด ๋ฆ์ด์ง๊ณ ,
- ๋ ๋ฒ์งธ ์์ฒญ์ ๋น ๋ฅด๊ฒ ์๋ต์ ๋ฐ์ ์ฑ๊ณต์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์จ๋ค.
์ด ๊ฒฝ์ฐ, ๋น๋๊ธฐ ์์ฒญ์ ์ธ๋ถ์์ ์ฒ๋ฆฌํ๊ณ ๋ ๋ฒ์งธ ์์ฒญ์ ์ฑ๊ณต ์๋ต๋ง Redux ์ํ์ ๋ฐ์ํ๋ค๋ฉด ๋ฌธ์ ๊ฐ ์์ด ๋ณด์ผ ์ ์์ง๋ง, ๋์ค์ ์ฒซ ๋ฒ์งธ ์์ฒญ์ด ์๋ต์ ๋ฐํํ ๊ฒฝ์ฐ ์์์น ๋ชปํ ๊ฒฐ๊ณผ๊ฐ ๋ฐ์ํ ์ ์๋ค.
์์
// ์ฒซ ๋ฒ์งธ ์์ฒญ์ ๊ฒฐ๊ณผ๊ฐ ๋ฆ๊ฒ ๋์ฐฉํ์ฌ ์ํ๋ฅผ ๋ฎ์ด์ฐ๋ ์ํฉ
dispatch(fetchDataSuccess(secondResponseData)); // ๋ ๋ฒ์งธ ์์ฒญ ๊ฒฐ๊ณผ
dispatch(fetchDataSuccess(firstResponseData)); // ์ฒซ ๋ฒ์งธ ์์ฒญ ๊ฒฐ๊ณผ (๋ฆ๊ฒ ๋์ฐฉ)
์ด๋ ๊ฒ ๋๋ฉด Redux ์ํ์๋ ๊ฐ์ฅ ์ต์ ์ํ๊ฐ ์๋, ์ฒซ ๋ฒ์งธ ์์ฒญ์ ๊ฒฐ๊ณผ๊ฐ ๋จ๊ฒ ๋๋ค. ์ฌ์ฉ์๋ ํ๋ฉด์์ ์ค๋๋ ๋ฐ์ดํฐ๋ฅผ ๋ณด๊ฒ ๋๋ฉฐ, ์ํ์ ์ผ๊ด์ฑ์ด ๊นจ์ง ๊ฒ์ ๋๋ผ๊ฒ ๋๋ค.
2) ์ฌ๋ฌ ์ปดํฌ๋ํธ์์ ๋์ผํ ๋น๋๊ธฐ ์์ ์ ์ฌ์ฉํ ๋
Redux ์ํ๋ ์ฌ๋ฌ ์ปดํฌ๋ํธ ๊ฐ์ ๊ณต์ ๋๊ธฐ ๋๋ฌธ์, ์ฌ๋ฌ ์ปดํฌ๋ํธ์์ ๋์ผํ ๋น๋๊ธฐ ์์ ์ ํธ๋ฆฌ๊ฑฐํ๋ ๊ฒฝ์ฐ๊ฐ ์์ฃผ ๋ฐ์ํ๋ค. ์๋ฅผ ๋ค์ด, ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธ๋์ด ์์ ๋ ์ฌ์ฉ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๋น๋๊ธฐ ์์ ์ด ์ฌ๋ฌ ์ปดํฌ๋ํธ์์ ํ์ํ ์ ์๋ค.
๋ง์ฝ ๋น๋๊ธฐ ์์ฒญ์ ์ธ๋ถ์์ ์ฒ๋ฆฌํ๊ณ ์ฑ๊ณตํ ๊ฒฝ์ฐ์๋ง Redux ์ํ๋ฅผ ์ ๋ฐ์ดํธํ๋ค๋ฉด, ์ฌ๋ฌ ์ปดํฌ๋ํธ์์ ๋น์ทํ ์์ฒญ์ด ์ค๋ณต๋๊ฑฐ๋ ์๋ก ์ถฉ๋ํ ๊ฐ๋ฅ์ฑ์ด ๋์์ง๋ค.
์์
- ์ปดํฌ๋ํธ A์ ์ปดํฌ๋ํธ B๊ฐ ๋์์ ์ฌ์ฉ์ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๋ค๊ณ ๊ฐ์ ํ๋ค.
- ๋ ์ปดํฌ๋ํธ๋ ์๋ก ๋ค๋ฅธ ํ์ด๋ฐ์ API ์์ฒญ์ ์ํํ๊ณ ์ฑ๊ณต ์์๋ง Redux์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฐ์ดํธํ๋ค.
์ด ๊ฒฝ์ฐ, ์ปดํฌ๋ํธ A์ ์์ฒญ๊ณผ ์ปดํฌ๋ํธ B์ ์์ฒญ์ด ๋์์ ์ฑ๊ณตํ ์๋ ์๊ณ , ํ๋๋ ์ฑ๊ณตํ๊ณ ํ๋๋ ์คํจํ ์๋ ์๋ค. ์ํ ์ ๋ฐ์ดํธ๊ฐ ๋น๋๊ธฐ ์์ฒญ์ ์ฑ๊ณต ์ฌ๋ถ์๋ง ์์กดํ ๊ฒฝ์ฐ, ๊ฐ ์์ฒญ์ ์๋ต ์์์ ์ฑ๊ณต/์คํจ ์ฌ๋ถ์ ๋ฐ๋ผ Redux ์ํ๊ฐ ์์ธกํ ์ ์๋ ๋ฐฉ์์ผ๋ก ๋ณ๊ฒฝ๋ ์ ์๋ค.
์ด๋ก ์ธํด ๋ฐ์ดํฐ๊ฐ ์ค๋ณต ์์ฒญ๋๊ฑฐ๋, ์ํ๊ฐ ์์์น ์๊ฒ ๋ฎ์ด์จ์ง๋ ํ์์ด ๋ฐ์ํ ์ ์๋ค. redux-thunk
์ ๊ฐ์ ๋ฏธ๋ค์จ์ด๋ฅผ ํตํด ์ค์์์ ๋น๋๊ธฐ ์์
์ ๊ด๋ฆฌํ๋ฉด ์ด๋ฌํ ์ค๋ณต ์์ฒญ์ ๋ฐฉ์งํ ์ ์๋ค.
3) ์ํ ๋ณํ๊ฐ ๋จ์ผ ์ง์ค ์์ค๊ฐ ์๋ ์ฌ๋ฌ ๊ณณ์์ ๊ด๋ฆฌ๋จ
Redux์ ํต์ฌ ์์น ์ค ํ๋๋ ๋จ์ผ ์ง์ค์ ์์ค(single source of truth)์ด๋ค. ์ํ๊ฐ ์ค์์์ ์ผ๊ด๋๊ฒ ๊ด๋ฆฌ๋์ด์ผ๋ง ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์ธก ๊ฐ๋ฅํ ์ํ๋ก ์ ์ง๋ ์ ์๋ค.
ํ์ง๋ง ๋น๋๊ธฐ ์์ฒญ์ด ์ธ๋ถ์์ ๊ด๋ฆฌ๋๊ณ , ์ฑ๊ณต ์์๋ง Redux์ ๊ฒฐ๊ณผ๋ฅผ ์ ๋ฐ์ดํธํ๋ฉด ์ํ ๋ณํ๊ฐ Redux ์ธ๋ถ์ ๋ด๋ถ ์์ชฝ์์ ๋ฐ์ํ๊ฒ ๋๋ค. ์ด๋ก ์ธํด ์ํ์ ๋ณ๊ฒฝ ํ๋ฆ์ด ๋ช ํํ์ง ์์ผ๋ฉฐ, ์ํ๊ฐ ์์ธก ๋ถ๊ฐ๋ฅํ๊ฒ ๋๋ค.
3. ์ค์ ์ง์ค์ ๋น๋๊ธฐ ๋ก์ง ๊ด๋ฆฌ
redux-thunk
๋ฅผ ์ฌ์ฉํ๋ฉด ๋ชจ๋ ๋น๋๊ธฐ ๋ก์ง์ด Redux์ ์ก์
์์ฑ ํจ์ ์์ ์ ์๋๋ฏ๋ก, ๋น๋๊ธฐ ์์
์ด ์ด๋์ ๋ฐ์ํ๊ณ ์ํ๊ฐ ์ด๋ป๊ฒ ๋ณํํ๋์ง ์ฝ๋ ๊ตฌ์กฐ๊ฐ ๋ ๋ช
ํํด์ง๋ค. ๋น๋๊ธฐ ์์ฒญ์ ์ธ๋ถ์์ ์ฒ๋ฆฌํ ๊ฒฝ์ฐ, ์์ฒญ ์์น๊ฐ ์ฌ๊ธฐ์ ๊ธฐ ํฉ์ด์ง ์ ์์ด ์ฝ๋ ์ ์ง๋ณด์๊ฐ ์ด๋ ค์์ง ์ ์๋ค.
๋ง์ผ ์ธ๋ถ์์ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ ์ฑ๊ณตํ ๋๋ง ์ํ๋ฅผ ์ ๋ฐ์ดํธํ๋ฉด, Redux์์๋ ์์ฒญ ์ค์ ์ํ๊ฐ ์ด๋ป๊ฒ ๋ณํ๋์ง ์ ์ ์๊ธฐ ๋๋ฌธ์ ์ํ ๋ณํ์ ์ ์ฒด ํ๋ฆ์ ์ถ์ ํ๊ธฐ ์ด๋ ค์์ง๋ค. ํนํ loading ์ํ์ error ์ํ๊ฐ Redux์ ๋ฐ์๋์ง ์๋๋ค๋ฉด, UI์์ ๋ก๋ฉ ์คํผ๋๋ฅผ ํ์ํ๊ฑฐ๋ ์๋ฌ ๋ฉ์์ง๋ฅผ ๋ณด์ฌ์ฃผ๋ ๋ฑ์ ์ฒ๋ฆฌ๊ฐ ๋ถ๊ฐ๋ฅํด์ง ์ ์๋ค.
์์
๋ง์ฝ Redux์์ loading ์ํ๋ฅผ ๊ด๋ฆฌํ์ง ์๋๋ค๋ฉด, ๋ก๋ฉ ์ํ๋ฅผ ํ์ํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ปดํฌ๋ํธ ๋ด๋ถ์์ useState๋ก ๊ด๋ฆฌํด์ผ ํ ์ ์๋ค.
// ์ปดํฌ๋ํธ์์ ๋น๋๊ธฐ ์์ฒญ๊ณผ ์ํ๋ฅผ ๋ก์ปฌ๋ก ๊ด๋ฆฌํ๋ ์์
const MyComponent = () => {
const [loading, setLoading] = useState(false);
const [error, setError] = useState(null);
const dispatch = useDispatch();
const fetchData = async () => {
setLoading(true);
try {
const response = await apiRequest();
dispatch(updateData(response.data)); // ์์ฒญ ์ฑ๊ณต ์ ์ํ ์
๋ฐ์ดํธ
} catch (err) {
setError(err.message); // ์์ฒญ ์คํจ ์ ์๋ฌ ์ํ ์
๋ฐ์ดํธ
} finally {
setLoading(false);
}
};
useEffect(() => {
fetchData();
}, []);
};
์ด ๊ฒฝ์ฐ loading๊ณผ error ์ํ๊ฐ Redux์ ์ค์ ์ํ ๊ด๋ฆฌ ํ๋ฆ์ ํฌํจ๋์ง ์์, ๋ค๋ฅธ ์ปดํฌ๋ํธ์์ ์ด ์ํ๋ฅผ ๊ณต์ ํ ์ ์๊ฒ ๋๋ค. ๋ํ Redux DevTools์์ ์ํ ๋ณํ์ ํ๋ฆ์ ํ์ธํ ์ ์์ด ๋๋ฒ๊น ์ด ์ด๋ ค์์ง ์ ์๋ค.
4. Redux DevTools์์ ์ฐ๋
redux-thunk
๋ฅผ ์ฌ์ฉํ๋ฉด Redux DevTools์์ ์ก์
์ ํ๋ฆ์ ์ถ์ ํ ์ ์๋ค. pending
, fulfilled
, rejected
๋ฑ์ ์ก์
์ด ์์๋๋ก ๋์คํจ์น๋๋ ๊ณผ์ ์ ์๊ฐ์ ์ผ๋ก ํ์ธํ ์ ์์ด, ๋น๋๊ธฐ ์์
์ ๋ ์ฝ๊ฒ ๋๋ฒ๊น
ํ ์ ์๋ค.
5. ์ก์ ์ฒด์ด๋ ๋ฐ ์ํ์ ๋ฐ๋ฅธ ๋น๋๊ธฐ ๋ก์ง ์ฒ๋ฆฌ
redux-thunk
๋ฅผ ์ฌ์ฉํ๋ฉด Redux ์ํ์ ๋ฐ๋ผ ์กฐ๊ฑด๋ถ ๋น๋๊ธฐ ์์
์ ์ํํ ์ ์๋ค. ์๋ฅผ ๋ค์ด, ํน์ ์ํ์ผ ๋๋ง API ์์ฒญ์ ๋ณด๋ด๊ฑฐ๋, ์ด์ ์์ฒญ์ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ ์๋ก์ด ์์ฒญ์ ๋ณด๋ด๋ ๋ก์ง์ ๊ตฌํํ ์ ์๋ค.
export const conditionalFetchData = () => {
return (dispatch, getState) => {
const { data } = getState();
if (!data) {
dispatch(fetchData());
}
};
};
์ด์ ๊ฐ์ด redux-thunk
๋ฅผ ์ฌ์ฉํ๋ฉด ๋น๋๊ธฐ ์์
์ด Redux ์ํ ๊ด๋ฆฌ์ ์ผํ์ผ๋ก ํตํฉ๋๋ฉฐ, ๋ ์ผ๊ด๋๊ณ ์ฒด๊ณ์ ์ธ ์ํ ๊ด๋ฆฌ๋ฅผ ํ ์ ์๋ค. Redux์ ์ฅ์ ์ธ ๋จ์ผ ์ง์ค ์์ค๋ฅผ ์ ์งํ๋ฉด์, ๋น๋๊ธฐ ๋ก์ง์ ์ ํ ์ํ๋ฅผ ์ผ๊ด๋๊ฒ ๊ด๋ฆฌํ ์ ์๋ค๋ ์ ์ด ํฐ ์ด์ ์ด๋ค.
๊ฒฐ๋ก
redux-thunk๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ ์์ ์ Redux ๋ด๋ถ์์ ์ฒ๋ฆฌํ๋ฉด, ์์ฒญ์ ์์, ์ฑ๊ณต, ์คํจ ์ํ๋ฅผ Redux์์ ์ผ๊ด๋๊ฒ ๊ด๋ฆฌํ ์ ์๋ค. ์ด๋ ์ํ์ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๊ณ , ๋น๋๊ธฐ ๋ก์ง์ ์์ธก ๊ฐ๋ฅํ๊ฒ ๋ง๋ค์ด ์ค๋ค. redux-thunk์ ๊ฐ์ ๋ฏธ๋ค์จ์ด๋ฅผ ํตํด ๋น๋๊ธฐ ์์ ์ ์ค์์์ ๊ด๋ฆฌํ๋ ๊ฒ์ด ๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ํ ์ผ๊ด์ฑ์ ์ ์งํ๋ ๋ฐ ๋งค์ฐ ์ค์ํ๋ค.