EFFECT DEPS

effect 의존성 배열

deps는 “언제 실행할지”보다 effect 내부가 어떤 props, state, 함수, 객체를 읽는지 드러내는 계약이며 누락하면 stale closure, 과하면 무한 루프가 생긴다.

01

effect 본문 읽기

effect 안에서 참조하는 props, state, 함수, 객체를 모두 표시한다.

read set
02

안정 값 제외

ref.current, setState, dispatch처럼 React가 안정성을 보장하는 값은 구분한다.

stable identity
03

함수/객체 처리

매 렌더 새로 만들어지는 값은 effect 안으로 옮기거나 useMemo/useCallback으로 안정화한다.

identity
04

cleanup 영향 확인

deps 변경마다 이전 구독이 정리되고 새 구독이 열리는지 본다.

resubscribe
[] misuse
한 번만 실행하려다 props 변경 무시 id나 url을 읽는데 deps가 비어 있으면 이후 변경에 반응하지 않는다.
stale closure
object dep
매 렌더 새 객체로 재실행 옵션 객체를 렌더 중 생성하면 참조가 달라져 effect가 계속 돈다.
memoize or inline
function dep
핸들러 정체성 불안정 effect에서 쓰는 함수는 내부로 옮기거나 useCallback의 deps를 다시 확인한다.
루프 원인
lint disable
규칙을 끄고 버그를 숨김 정말 외부 동기화가 아닌 경우라면 effect 자체가 필요 없는지 먼저 본다.
escape hatch

Effect 재실행 디버깅

값 변경 deps 후보 값을 하나씩 바꿔 effect가 필요한 만큼만 재실행되는지 로그로 확인한다.
cleanup 구독 id가 바뀔 때 이전 구독이 남지 않아야 한다.
무한 루프 effect가 state를 바꾸고 그 state가 deps에 있으면 종료 조건을 확인한다.