What I did.
- 약정(Contract)에 들어가는 여러가지 상태들의 type을 정의하고, 매 단계가 끝날 때 마다 폼으로 제출하는 상태값들을 dispatch로 저장할 수 있도록 코드를 개선하였습니다.
- 기존에 '확인' 버튼을 누를 때마다 DB로 직접 호출하는 코드가 비효율적이라고 생각되어, 프론트에서 Redux로 상태를 저장할 수 있도록 개선하였습니다.
- 15회이상 여러번 호출되던 API 횟수를 줄여, 불필요한 서버 요청을 5단계로 줄일 수 있었고, 기존 데이터를 참조하는 코드에서 Redux의 상태값을 바로 가져올 수 있도록 하여 페이지 전환 속도를 개선하였습니다.
Before
* 예시 코드입니다.
// 페이지 넘길 때 마다 API 요청
const updateAddress = async (data: AddressType): Promise<void> => {
const request = addressRequest[data.addressType](data);
const response = await fetch('/api/setAddress', {
body: JSON.stringify(request),
headers: { 'Content-Type': 'application/json' },
method: 'POST',
})
if (!response.ok) {
throw Error();
}
}
<SubmitButton
onClick={updateAddress}
>
</SubmitButton>
After
* 예시 코드입니다.
// 최종 폼이 아닌, 중간 단계의 폼에서는 reducer로 상태만 업데이트
const updateAddress = useCallback(() => {
dispatch(
setAddress({
address: addressValue,
detailAddress: detailAddressValue,
}),
);
})
<SubmitButton
onClick={updateAddress}
>
</SubmitButton>
// 최종 폼에서만 reducer로 저장된 상태값 서버에 최종 반영
const submitForm = useCallback(() => {
addressMutation({ addressData: { address, detailAddress } });
...
}, [addressMutation, detailAddress, address]);
<SubmitButton
onClick={submitForm}
>
</SubmitButton>