controlled components
는 사용자가 입력한 값에 접근하고 제어할 수 있도록 해주는 컴포넌트입니다. 이름 그대로 누군가의 통제를 받는 컴포넌트인데, 여기서 그 누군가는 바로 리액트입니다. 정리하면, controlled components
는 그 값이 리액트의 통제를 받는 input form element
를 의미합니다. 아래 그림을 한 번 보도록 하겠습니다.
위 그림에서 왼쪽은 HTML form
을 나타낸 것이고, 오른쪽은 Controlled Component를 나타낸 것입니다. HTML form
에서는 각 element
가 자체적으로 state
를 관리하게 됩니다. 그래서 <input>
, <textarea>
, <select>
이 각각 내부에 state
를 갖고 있습니다. 이렇게 되면 아무래도 자바스크립트 코드를 통해 각각의 값에 접근하기가 쉽지 않습니다.
하지만 오른쪽에 나와 있는 Controlled Component에서는 모든 데이터를 state
에서 관리합니다. 또한 앞에서 배운 것처럼 state
의 값을 변경할 때는 무조건 setState()
함수를 사용하게 됩니다. 참고로 위 그림은 클래스 컴포넌트를 기준으로 그린 것이고, 함수 컴포넌트에서는 useState()
훅을 사용하여 state
를 관리합니다. 이처럼 Controlled Component는 리액트에서 모든 값들을 통제할 수 있는 구조를 갖고 있습니다. 아래 코드는 위에서 나왔던 사용자의 이름을 입력받는 HTML form
을 리액트의 Controlled Component로 만든 것입니다.
function NameForm(props) {
const [value, setValue] = useState('');
const handleChange = (event) => {
setValue(event.target.value);
}
const handleSubmit = (event) => {
alert('입력한 이름: ' + value);
event.preventDefault();
}
return (
<form onSubmit={handleSubmit}>
<label>
이름:
<input type="text" value={value} onChange={handleChange} />
</label>
<button type="submit">제출</button>
</form>
)
}
이 코드에서 <input>
태그에 value={value}
부분을 볼 수 있는데, 이 부분은 값을 리액트 컴포넌트의 state
에서 가져다가 넣어주는 것입니다. 그래서 항상 state
에 들어있는 값이 input
에 표시되게 됩니다. 또한 입력값이 변경되었을 때 호출되는 onChange
에는 onChange={handleChange}
처럼 handleChange
함수가 호출되도록 했는데, handleChange
함수에서는 setValue()
함수를 사용해서 새롭게 변경된 값을 value
라는 이름의 state
에 저장합니다.
참고로 onChange
콜백 함수의 첫 번째 파라미터인 event
는 이벤트 객체를 나타냅니다. 그리고 event.target
은 현재 발생한 이벤트의 타겟을 의미하며, event.target.value
는 해당 타겟의 value
속성의 값을 의미합니다. 즉, 여기에서의 타겟은 input
엘리먼트가 되며, event.target.value
는 input
엘리먼트의 값이 됩니다.
이처럼 Controlled Component를 사용하면, 입력값이 리액트 컴포넌트의 state
를 통해 관리됩니다. 이 말은 여러 개의 입력 양식의 값을 원하는 대로 조종할 수 있다는 것이기도 합니다. 입력 양식의 초기값을 내가 원하는 대로 넣어줄 수도 있으며, 다른 양식의 값이 변경되었을 때 또 다른 양식의 값도 자동으로 변경시킬 수 있다는 것입니다. 예를 들어 사용자가 입력한 모든 알파벳을 대문자로 변경시켜서 관리하고 싶다면, 아래 코드와 같이 하면 됩니다.
const handleChange = (event) => {
setValue(event.target.value.toUpperCase());
}
handleChange()
함수로 들어오는 이벤트의 타겟 값을 toUpperCase()
함수를 사용하여 모두 대문자로 변경한 뒤에, 그 값을 state
에 저장하는 것이죠. 이처럼 Controlled Component를 통해 사용자의 입력을 직접적으로 제어할 수 있습니다.
마지막 업데이트: 2025년 08월 21일 09시 05분
이 문서의 저작권은 이인제(소플)에 있습니다. 무단 전재와 무단 복제를 금합니다.
On this page