
이전 포스팅에서 다룬 매치 삭제 기능을 최적화해보았습니다.
특히 불필요한 서버 요청을 줄이고 사용자 경험을 개선하는 방향으로 리팩토링을 진행했습니다.
const handleDelete = async (matchId: number) => {
try {
const response = await axiosInstance.delete(`/matches/${matchId}`);
if (response.status === 200 || response.status === 204) {
Alert.alert("성공", "매치가 삭제되었습니다");
await loadParticipations(); // 불필요한 서버 요청
onUpdate?.();
}
} catch (error) {
// ... 에러 처리
}
};
주요 문제:
1. 삭제 성공 후 전체 목록을 다시 로딩
2. 불필요한 네트워크 요청 발생
3. UI 업데이트가 서버 응답을 기다려야 함
// 로컬 상태 추가
const [localParticipations, setLocalParticipations] = useState(participations);
// props 변경 시 동기화
useEffect(() => {
setLocalParticipations(participations);
}, [participations]);
const handleDelete = async (matchId: number) => {
try {
Alert.alert("매치 삭제", "정말로 이 매치를 삭제하시겠습니까?", [
{
text: "취소",
style: "cancel",
},
{
text: "삭제",
style: "destructive",
onPress: async () => {
// 먼저 로컬 상태 업데이트
setLocalParticipations(prev =>
prev.filter(item => item.match.id !== matchId)
);
try {
const response = await axiosInstance.delete(`/matches/${matchId}`);
if (response.status === 200 || response.status === 204) {
Alert.alert("성공", "매치가 삭제되었습니다");
onUpdate?.();
}
} catch (error) {
// 실패 시 원상 복구 로직 추가 가능
setLocalParticipations(participations);
Alert.alert("오류", "매치 삭제 중 오류가 발생했습니다");
}
},
},
]);
} catch (error) {
Alert.alert("오류", "매치 삭제 중 오류가 발생했습니다");
}
};
성능 최적화
사용자 경험 향상
코드 품질 향상
상태 동기화
useEffect(() => {
setLocalParticipations(participations);
}, [participations]);
에러 처리
catch (error) {
// 실패 시 원상 복구
setLocalParticipations(participations);
Alert.alert("오류", "매치 삭제 중 오류가 발생했습니다");
}
성능 모니터링