Redux Toolkit의 createAsyncThunk를 이용해 회원가입 요청의 흐름을 파악하기 위한 게시글

<form className='mt-6' onSubmit={handleSubmit(onSubmit)}>
<input type="email"
- 사용자가 버튼을 클릭하면 onSubmit 함수가 호출되고, 입력된 값들이 백엔드로 전송{...register('email')} placeholder="이메일" />
<input type="password" {...register('password')} placeholder="비밀번호" />
<input type="text" {...register('name')} placeholder="이름" />
<button type="submit">회원가입</button>
</form>
const onSubmit = ({ email, password, name }) => {
const body = {
email,
password,
name,
image: `https://via.placeholder.com/600x400?text=no+user+image`,
};
// 회원가입 액션을 디스패치하여 요청 실행
dispatch(registerUser(body));
// 폼 초기화
reset();
};
createAsyncThunk는 Redux에서 비동기 로직을 처리할 때 사용되는 유용한 함수
import { createAsyncThunk } from '@reduxjs/toolkit';
import axiosInstance from '../utils/axios';
// 회원가입 요청 Thunk 함수 생성
export const registerUser = createAsyncThunk(
'user/registerUser', // 액션 타입
async (body, thunkAPI) => {
try {
// 백엔드로 POST 요청
const response = await axiosInstance.post(`/users/register`, body);
return response.data; // 요청 성공 시, 반환된 데이터
} catch (error) {
console.error(error);
// 요청 실패 시 에러 메시지 반환
return thunkAPI.rejectWithValue(error.response.data || error.message);
}
}
);
성공 시 : response.data를 반환
실패 시 : 에러 메시지를 Thunk의 rejectWithValue를 이용해 처리
createAsyncThunk로 생성된 Thunk 함수는 Redux의 미들웨어로 동작
요청 상황
이 상태들은 Redux의 리듀서에서 처리
// 리덕스 슬라이스 정의
const userSlice = createSlice({
name: 'user',
initialState,
reducers: {},
extraReducers: (builder) => {
builder
.addCase(registerUser.pending, (state) => {
state.status = 'loading'; // 요청 중
})
.addCase(registerUser.fulfilled, (state, action) => {
state.status = 'succeeded'; // 요청 성공
state.user = action.payload; // 사용자 정보 저장
})
.addCase(registerUser.rejected, (state, action) => {
state.status = 'failed'; // 요청 실패
state.error = action.payload; // 에러 메시지 저장
});
},
});