좋은 React 코드는 불필요한 useEffect부터 줄여. 외부 시스템과 동기화할 때만 필요한 이유를 분명히 해 보자.
Effect는 React 밖의 시스템과 맞추는 도구야
Focus와 scroll 같은 DOM API는 effect의 대상이야. 이벤트 리스너와 타이머, 위치 정보, 네트워크 구독과 WebSocket, React를 모르는 서드파티 라이브러리도 여기에 들어가. 다른 상태에서 값을 계산하거나 상태 변경을 연달아 일으키는 일처럼 React 안에서 끝나는 작업에는 보통 effect가 필요하지 않아.
Dependency 배열은 실행 조건을 표현해
useEffect(fn)은 모든 렌더링 뒤에 실행돼.useEffect(fn, [])은 마운트 뒤에 실행되고 unmount할 때 cleanup해.useEffect(fn, [a, b])은 a나 b가 달라진 뒤 다시 실행돼.
react-hooks/exhaustive-deps 경고는 빠진 의존성 때문에 오래된 값을 읽을 수 있다는 신호야. 이유 없이 끄지 마.
Cleanup으로 이전 연결을 정리해
Effect에서 함수를 반환하면 React가 effect를 다시 실행하기 전과 컴포넌트를 제거할 때 호출해. 이벤트 리스너를 떼고, 구독을 해제하고, 진행 중인 fetch를 취소하는 코드를 여기에 둬.
StrictMode의 두 번 실행은 검사용이야
개발 모드에서는 StrictMode가 마운트, cleanup, 재마운트를 일부러 반복해. Cleanup이 빠졌거나 여러 번 실행해도 안전하지 않은 effect를 드러내기 위한 동작이야. 프로덕션에서는 한 번 실행되지만 개발 중 두 번 실행될 때 깨진다면 고쳐야 할 버그가 있는 거야.
Effect 대신 더 직접적인 방법을 써
렌더링용 데이터는 렌더링 중에 계산하고, 비싼 계산은 필요할 때 메모이제이션해. Prop이 바뀔 때 상태를 완전히 초기화해야 한다면 key를 바꾸는 방법을 검토해. 사용자 동작 뒤 부모에게 알려야 한다면 effect를 기다리지 말고 이벤트 핸들러에서 콜백을 호출해.