React Hooks로 Form 상태 관리 리팩토링
배경
사내 관리자 페이지의 사용자 등록 폼이 클래스 컴포넌트로 작성되어 있었다. 여러 input 필드와 validation 로직이 뒤섞여 있어 유지보수가 어려웠다. React 16.8부터 Hooks가 안정화되었고, 팀 내에서도 도입 논의가 있어 이번 기회에 리팩토링을 진행했다.
기존 코드의 문제점
- componentDidMount, componentDidUpdate에 분산된 로직
- this 바인딩으로 인한 보일러플레이트
- state 업데이트 로직의 복잡도
Hooks 적용
상태 관리 단순화
const [formData, setFormData] = useState({
username: '',
email: '',
role: 'user'
});
const handleChange = (e) => {
const { name, value } = e.target;
setFormData(prev => ({ ...prev, [name]: value }));
};
Custom Hook으로 분리
validation 로직을 별도 Hook으로 추출했다.
function useFormValidation(values) {
const [errors, setErrors] = useState({});
useEffect(() => {
const newErrors = {};
if (!values.email.includes('@')) {
newErrors.email = '유효한 이메일을 입력하세요';
}
setErrors(newErrors);
}, [values]);
return errors;
}
결과
- 코드 라인 수: 180줄 → 125줄
- 테스트 작성 용이성 증가
- 로직 재사용 가능
다만 팀원들이 Hooks에 익숙하지 않아 코드리뷰 시간이 평소보다 길었다. useState의 비동기 특성이나 useEffect의 dependency array 개념을 설명하는 시간이 필요했다.
향후 계획
다른 Form 컴포넌트들도 점진적으로 마이그레이션할 예정이다. react-hook-form 같은 라이브러리 도입도 검토 중이다.