userId, filter처럼 effect를 다시 실행할 값을 요청 ID와 함께 고정한다.
React 비동기 데이터
useEffect 요청은 cleanup, abort, 최신성 gate가 한 묶음이다
dependency가 바뀔 때마다 새 fetch를 시작하는 것보다, 이전 요청을 어디서 끊고 늦게 도착한 응답을 어디서 버리는지 정하는 것이 더 중요하다.
요청 수명 주기 지도
race controlfetch에 signal을 넘기고 cleanup에서 같은 controller를 abort한다.
requestId가 최신이 아니면 성공 응답이어도 state commit을 건너뛴다.
mounted, requestId, abort 상태가 맞는 응답만 화면에 반영한다.
상태 전이 레인
effect contract
새 요청 시작
기존 error/data를 유지할지 비울지 UI 정책을 먼저
정한다.
setStatus
cleanup에서 이전 요청 취소
AbortError는 사용자에게 보여줄 실패가 아니라 교체
신호다.
controller.abort()
최신 요청만 반영
느린 이전 응답이 최신 data를 덮어쓰지 못하게 한다.
requestIdRef
컴포넌트가 사라진 뒤 state 차단
cleanup 로그와 abort signal로 수명 주기 종료를
확인한다.
return cleanup
요청 방어 장치
state guard
검증 질문
요청 수명 주기는 “언제 fetch하는가”가 아니라 “어떤 응답을 믿는가”로 점검한다.
- dependency가 바뀔 때 이전 요청이 cleanup에서 실제로 abort되는가?
- AbortError와 네트워크 실패가 UI 상태에서 구분되는가?
- 늦은 성공 응답이 최신 data와 error를 덮지 못하게 막는가?