데이터 요청은 idle·loading·success·error 상태로 움직인다

useEffect는 요청을 시작하고 cleanup은 이전 요청을 닫으며, 화면은 현재 상태를 명시적으로 렌더한다.

Request statestatus + data + error
START

loading

이전 오류를 비우고 요청 시작

RESOLVE

success

최신 응답을 data에 commit

REJECT

error

AbortError가 아닌 실패를 표시

CHANGE

cleanup → loading

dependency 변경 시 이전 요청 취소

핵심늦은 응답이 최신 화면을 덮지 않도록 AbortController나 request id gate를 함께 사용한다.