ํฐ์คํ ๋ฆฌ ๋ทฐ
redux-saga ๋ฏธ๋ค์จ์ด์์์ ์๋ฌ ์ฒ๋ฆฌ_axios์์์ ์๋ฌ ํธ๋ค๋ง
choi95 2022. 3. 26. 14:03๋ฌธ์
์๋ฒ์์ API ํต์ ๋์ค ๋น๋๊ธฐ์ ์ฒ๋ฆฌ์ ์ธ์๊ณผ ์ ์ด๋ฅผ ํจ์จ์ ์ผ๋ก ํ๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ด redux-saga ๋ฏธ๋ค์จ์ด๋ฅผ ์ด์ฉํ ์ ํธ ํจ์๋ฅผ ๋ง๋ค์๋ค.
export const createRequestActionTypes = type => {
const SUCCESS = `${type}_SUCCESS`;
const FAILURE = `${type}_FAILURE`;
return [type, SUCCESS, FAILURE];
};
export default function createRequestSaga(type, request) {
const SUCCESS = `${type}_SUCCESS`;
const FAILURE = `${type}_FAILURE`;
return function* (action) {
yield put(startLoading(type));
try {
const response = yield call(request, action.payload);
yield put({
type: SUCCESS,
payload: response.data,
});
} catch (error) {
yield put({
type: FAILURE,
payload: error,
error: true,
});
}
yield put(finishLoading(type));
};
}
์ ๋๋ ์ดํฐ ํจ์ ๋ด์์ call() ํจ์๊ฐ ๋ฐํํ๋ ๊ฒฐ๊ณผ ๊ฐ์ ๋ฐ๋ผ์ ๊ฐ๊ธฐ ๋ค๋ฅธ ํ์ ์ฒ๋ฆฌ๋ฅผ ํ๋ ์ ํธ ํจ์๋ฅผ ์์ฑํ์๋๋ฐ, ์๋ฌ ์ฒ๋ฆฌ์ ๋ํ ์ก์ ์ ํธ๋ฆฌ๊ฑฐํ์์ ๋ ์ ๋๋ก ๋ ์๋ฌ ์ฒ๋ฆฌ๋ฅผ ํ ์ ์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์๋ค.
๋ฌธ์ ํด๊ฒฐ
ํด๋น ๋ฌธ์ ๋ redux-sage ๋ฏธ๋ค์จ์ด์์ ๋ฐ์ํ ๋ฌธ์ ๊ฐ ์๋ axios ์๋ฌ ์ฒ๋ฆฌ์ ๋ํด์ ๋ฏธํกํ๊ฒ ์๊ณ ์์๋ ๊ฒ์์ ๋ฐ์ํ์๋ค.
๋ฆฌ๋์ ๋ด์์ API ๋์ค ์๋ฌ ์ฒ๋ฆฌ๋ฅผ ๋ด๋นํ๋ ์ก์ ์ ๊ฒฝ์ฐ๋ฅผ ์ฝ๋๋ก ์ดํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
const auth = handleActions(
{
( ... )
[DUPLICATIONCHECK_FAILURE]: (state, { payload: error }) => ({
...state,
authError: response.data.message,
})
},
initialState
);
์๋ฒ์ ์ด๋ฏธ ์กด์ฌํ๋ ์ ์ ์ผ ๊ฒฝ์ฐ, ์ค๋ณต ์๋ฌ๊ฐ ๋ฐ์๋๊ณ ํด๋น ์๋ฌ์ ๋ํ ๋ด์ฉ์ [DUPLICATIONCHECK_FAILURE] ์ก์ ์์ ์ฒ๋ฆฌํด ์ฃผ๋๋ก ์ฝ๋๋ฅผ ์์ฑํ์๋ค.
ํ์ง๋ง error์ ๋ํ ์ ๋ณด๋ฅผ put() ์ธ์์ ๋ด์ ๋ฆฌ๋์ ๋ด์์ ๋์คํธ๋ญ์ณ๋ง์ ํตํด error ํค ๊ฐ์ state์ ๋ฐ๋ก ์ ์ฅํ๋ ์ฒ๋ฆฌ ๋จ๊ณ์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ด๋ค.
์๋ฒ์์ ๋ฐํํ ์๋ฌ๋ ์ฌ๋ฌ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ ๊ฐ์ฒด์ ํํ์ด๋ค.
https://yamoo9.github.io/axios/guide/error-handling.html
ํ์ฌ ํด๋น ๋ก์ง์์ ํ์ํ ๊ฐ์ ํ์ ๊ฐ์ ์ ์งํํ์์ ๋ ์ด๋ฉ์ผ์ ํ ๋๋ก ํด๋น ์ ์ ๊ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐ์ 'DUPLICATION ERROR' message๋ฅผ ๋ฐ๋ ๊ฒ์ธ๋ฐ, ํด๋น ๊ฐ์ ์ ๋ฌ ๋ฐ์ error์ ๋ฐ๋ก ๋ฐ์ธ๋ฉ๋ ๊ฒ์ด ์๋ ๋ด๋ถ ํค ๊ฐ์ผ๋ก ์กด์ฌํ์๋ค.
๊ทธ๋์ ๋ค์๊ณผ ๊ฐ์ด ์๋ฌ์ ๋ํ ๊ฐ ์ ๋ณด๋ฅผ ์ฝ์๋ก ํ์ธํด๋ณด๋ ํ์ฌ ํ์ํ ์ ๋ณด๊ฐ error.response.data ๋ด์ message์ ์กด์ฌํ๋ ๊ฒ์ ํ์ธํ ์ ์์๋ค.
return client
.post(`${API.baseUrl}users/${currentCheckInputAPI}`, {
[currentCheckKey]: currentCheckInputValue,
})
.then(res => console.log(res.message))
.catch(error =>
console.log(
error.response.data,
error.response.status,
error.response.headers
)
);
์ด์ ๋ฆฌ๋์ ๋ด์์ ํด๋น ๊ฐ์ store์ ์ ์ฅํด์ฃผ๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ ํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์๋ค.
const auth = handleActions(
{
( ... )
[DUPLICATIONCHECK_FAILURE]: (state, { payload: { response } }) => ({
...state,
authError: response.data.message,
})
},
initialState
);