CUSTOM HOOK

커스텀 훅은 반환값 설계가 먼저다

useFetch나 useForm을 뽑을 때는 “반복된다”보다 의존성, cleanup, stale closure, 반환값 안정성까지 같은 계약으로 묶이는지를 본다.

01

반복 지점 찾기

두 컴포넌트에서 같은 상태 전이, 같은 effect cleanup, 같은 오류 처리가 반복되는지 본다.

코드 모양보다 규칙
02

입력 계약 고정

url, initialValue, validate처럼 훅 바깥에서 바뀌어야 하는 값을 인자로 분리한다.

deps 추적 가능
03

내부 효과 정리

fetch abort, timer clear, subscription unsubscribe를 훅 안에서 함께 처리한다.

StrictMode 재실행 대비
04

반환값 최소화

컴포넌트에는 data/error/loading 또는 value/onChange/reset처럼 필요한 표면만 돌려준다.

UI는 컴포넌트 책임
stale closure
콜백이 예전 props/state를 읽음 의존성 배열이나 함수형 업데이트가 빠지면 훅으로 옮긴 뒤 버그가 숨는다.
eslint-disable은 마지막 선택
return shape
컴포넌트마다 다른 형태를 요구 반환 객체가 계속 커지면 공통 훅보다 도메인 훅을 분리해야 한다.
data/error/loading부터 고정
cleanup
외부 시스템을 켜고 끄지 않음 event listener, interval, AbortController가 훅 수명 주기에 묶여야 한다.
unmount만이 아니라 재실행 직전
testability
훅 단위 상태 전이를 재현 가능 성공, 실패, 취소, 재요청을 훅 테스트나 Story 상태로 확인한다.
UI 스냅샷만으로 부족

훅 추출의 결과

컴포넌트가 얇아짐 컴포넌트는 렌더 분기와 이벤트 연결만 남고 비동기/검증 규칙은 훅으로 내려간다.
의존성이 드러남 훅 호출부만 봐도 어떤 입력이 상태 전이를 바꾸는지 알 수 있다.
오류 정책 통일 로딩, 실패, 취소, 재시도 상태 이름이 모든 사용처에서 같아진다.