React에서는 input, textarea, select 같은 폼 요소를 사용할 때 두 가지 방식 중 하나로 데이터를 다룰 수 있습니다.
바로 Controlled Component(제어 컴포넌트) 와 Uncontrolled Component(비제어 컴포넌트) 입니다.
입력값의 상태(state)를 React가 직접 관리하는 컴포넌트를 의미합니다.
입력값은 컴포넌트의 상태에 저장되고, 사용자의 입력은 이벤트 핸들러를 통해 상태를 업데이트합니다.
ex)
function ControlledInput() {
const [value, setValue] = React.useState('');
return (
<input
type="text"
value={value}
onChange={(e) => setValue(e.target.value)}
/>
);
}
DOM 자체에서 값을 직접 관리하는 컴포넌트를 의미합니다.
입력값을 React state로 제어하지 않고, ref를 통해 DOM에 직접 접근하여 값을 읽거나 설정합니다.
ex)
function UncontrolledInput() {
const inputRef = React.useRef(null);
const handleClick = () => {
alert(inputRef.current.value);
};
return (
<>
<input type="text" ref={inputRef} />
<button onClick={handleClick}>입력값 보기</button>
</>
);
}
| 항목 | Controlled Component | Uncontrolled Component |
|---|---|---|
| 값의 저장 위치 | React의 state로 저장 | DOM 요소의 내부 값 (input.value) |
| 상태 제어 주체 | React가 직접 제어 | 브라우저(DOM)가 제어 |
| 초기값 설정 | useState로 초기값 설정 | defaultValue, defaultChecked 사용 |
| 값 변경 방법 | onChange로 상태 업데이트 | DOM을 통해 직접 변경되며 React는 관여하지 않음 |
| 값 접근 방법 | 상태 변수 (value)로 바로 접근 가능 | ref.current.value로 DOM에 접근해야 함 |
| 입력값 동기화 | 항상 React 상태와 UI가 동기화 | React와 입력값이 동기화되지 않음 (비일관성 가능성 존재) |
| 데이터 흐름 추적 | 명확하고 예측 가능함 (단방향) | 외부 변화가 React에 의해 추적되지 않음 |
| 디버깅 | 상태를 통해 언제든지 추적 가능 | ref 접근 없이 값 추적 어려움 |
| 코드 양 | 상대적으로 많아질 수 있음 | 간단한 로직은 짧게 끝남 |
| 성능 | 입력마다 re-render 발생 (최적화 필요 시 useMemo 등 필요) | 입력은 DOM이 처리 → 더 가볍지만 추적 불가 |
Controlled Component가 적합한 경우
Uncontrolled Component가 적합한 경우
Controlled Component는 데이터 흐름 관리와 유효성 검사가 중요한 경우에 유용하며, Uncontrolled Component는 단순한 폼이나 성능 최적화가 필요한 경우에 유용합니다. 상황에 따라 적절한 방식을 선택하여 사용되나, 개인적으로 성능이 정말 중요한 기능이 아니라면 state로 입력값을 관리하여 상태의 흐름을 제어하는 것이 좋을 것 같다.
Controlled Component는 입력값을 React의 state로 직접 제어하는 방식이고,
Uncontrolled Component는 DOM 자체가 입력값을 관리하며 React는 ref를 통해 접근하는 방식입니다.
상황에 따라 다릅니다.
React의 철학인 상태 기반 UI 관리에 부합하고, 실시간 유효성 검사, 상태 동기화, 동적 폼 처리 등을 할 경우에는 Controlled Component가 더 적합합니다.
반면, 파일 업로드나 외부 라이브러리 연동, 또는 입력값 추적이 불필요한 간단한 폼에서는
Uncontrolled Component가 코드도 간결하고 성능 측면에서도 유리합니다.
참고
https://velog.io/@white0_0/React-Uncontrolled-Component-Controlled-Component
https://velog.io/@nanafromjeju/React-Controlled-Component와-Uncontrolled-Component-차이점