데이터 요청은 idle·loading·success·error 상태로 움직인다
useEffect는 요청을 시작하고 cleanup은 이전 요청을 닫으며, 화면은 현재 상태를 명시적으로 렌더한다.
loading
이전 오류를 비우고 요청 시작
success
최신 응답을 data에 commit
error
AbortError가 아닌 실패를 표시
cleanup → loading
dependency 변경 시 이전 요청 취소
핵심늦은 응답이 최신 화면을 덮지 않도록 AbortController나 request id gate를 함께 사용한다.