EFFECT CLEANUP

cleanup은 언마운트보다 먼저 재실행 직전을 막는다

useEffect가 외부 시스템을 켰다면 React는 다음 effect 실행 직전과 unmount 시점에 이전 연결을 끊어 누수와 중복 실행을 줄인다.

01

mount

effect가 interval, resize listener, socket 구독 같은 외부 작업을 시작한다.

setup
02

deps 변경

새 effect를 실행하기 전에 이전 effect의 cleanup을 먼저 호출한다.

중복 방지
03

cleanup

clearInterval, removeEventListener, unsubscribe, abort를 실행한다.

외부 자원 해제
04

unmount

컴포넌트가 사라질 때 마지막 cleanup으로 남은 연결을 닫는다.

누수 차단
setInterval
타이머가 화면 밖에서도 계속 실행 id를 저장하고 cleanup에서 clearInterval(id)를 호출한다.
카운트가 두 배로 뛰면 의심
event listener
리스너가 누적되어 핸들러가 여러 번 실행 add와 remove에 같은 함수 참조를 넘겨야 제거된다.
익명 함수 한계
fetch/request
늦게 도착한 응답이 오래된 상태를 덮음 AbortController 또는 ignore flag로 오래된 요청 결과를 버린다.
race condition
subscription
소켓/스토어 구독이 컴포넌트 수만큼 남음 subscribe가 돌려준 unsubscribe를 그대로 cleanup에 연결한다.
Provider 밖 누수 확인

디버깅 확인법

StrictMode 개발 모드에서 setup-cleanup-setup 순서가 깨지지 않는지 로그로 확인한다.
deps 변경 id나 url을 바꿀 때 이전 구독이 먼저 닫히고 새 구독이 열리는지 본다.
unmount 페이지 이동 뒤 네트워크 응답이나 이벤트 로그가 더 찍히지 않아야 한다.