useEffect 내부에서 async 함수를 정의해 호출하고 loading과 error 상태를 초기화합니다.
effect fetch lifecycle
useEffect 데이터 요청 수명
컴포넌트가 렌더링된 뒤 요청을 시작하고, 의존성이 바뀌거나 언마운트될 때 AbortController로 오래된 요청을 정리합니다.
userId, page, query처럼 요청 결과를 바꾸는 값만 의존성 배열에 넣습니다.
AbortController나 mounted flag로 언마운트 후 setState 경고와 오래된 응답 반영을 막습니다.
의존성 누락으로 오래된 데이터가 보이지 않는지 확인합니다.
빠르게 값이 바뀔 때 마지막 요청 결과만 반영합니다.
빈 배열 effect는 최초 로드 한 번만 실행됩니다.
실패 후 다시 요청할 사용자 경로가 있습니다.