useEffect 요청은 최신성 gate를 통과해야 state에 쓴다

dependency가 바뀌면 이전 요청은 정리하고, 늦게 도착한 응답은 request id와 mounted 상태를 확인한 뒤에만 commit합니다.

요청 수명 주기

race control
1

dependency snapshot

요청 ID와 기준값을 함께 저장해 이번 요청의 정체를 고정합니다.

2

abort previous

cleanup에서 이전 controller를 취소해 영향 범위를 끊습니다.

3

commit gate

응답 도착 시 request ID와 mounted 상태가 맞는지 확인합니다.

4

state update

최신 요청만 loading, data, error 상태를 갱신합니다.

열 구성 · 상황 · 판정 · gate · state 반영
상황
판정
gate
state 반영
새 요청 시작
허용
requestId를 현재값으로 교체
loading=true
이전 요청 도착
차단
현재 requestId와 다름
data/error 쓰기 금지
AbortError
분리
정상 취소와 실제 실패를 구분
사용자 오류로 표시하지 않음
mount once

처음 한 번만 필요한 데이터

빈 dependency는 초기 로드에는 맞지만 입력 변화에는 반응하지 않습니다.

[]
by id

조건이 바뀌는 데이터

userId, query, filter처럼 결과를 바꾸는 값은 dependency에 둡니다.

[userId]
unsafe

매 렌더 요청

누락되거나 매번 새 객체를 넣으면 요청 폭주나 stale response가 생깁니다.

[options]

응답을 믿는 기준

도착 순서가 아니라 현재 requestId와 일치하는지를 봅니다.

cleanup의 역할

다음 effect 전에 이전 요청의 영향 범위를 명확히 종료합니다.

사용자 오류 구분

AbortError를 네트워크 실패처럼 보여주지 않습니다.