리액트 공부하기 - 컨트롤 컴포넌트(Controlled Component)
1. 컨트롤 컴포넌트가 뭘까? 비유로써 알아보기
2. 상위 개념과 하위 개념
3. 어떨 때 주로 사용되는지, 대체 할 수 있는 useRef
💡✨컨트롤 컴포넌트가 뭘까? 비유로써 알아보기
🎬 1. 비제어 컴포넌트(Uncontrolled Component)
너는 지금 "입력창(input)" 역할이야.
💬 누군가 "이름을 입력해줘!" 라고 해.
그래서 네 마음대로 쓰기 시작해.
Jane이라고 쓰고, 이 내용은 너 혼자만 알고 있어.
React(관리자)는 몰라.
React는 ref 같은 걸로 나중에 몰래 엿봐야 해.
📦 React: "Jane이 뭘 썼는지 모르겠네… 나중에 확인해야겠다."
🎬 2. 제어 컴포넌트(Controlled Component)
이제 다시 "입력창 역할"인 너한테 요청이 와.
하지만 이번엔 네가 직접 쓰는 게 아니라,
📢 React(관리자)가 알려주는 것만 보여줄 수 있어.
너는 마음대로 쓰지 못하고, React가 말해주는 값을 보여줘야 해!
사용자가 키보드로 입력하면 →
너는 React에게 "이 사람이 J 눌렀어요!" 라고 말함 →
React는 J를 state에 저장함 →
React는 다시 너에게 "J 보여줘!" 라고 함 →
그래서 너는 그걸 표시함
→ 이게 바로 Controlled Component야!
📦 React: "모든 걸 내가 다 통제할게. 입력값도 내 상태에 저장해서, 언제든 확인하고 조작할 수 있게."
💡✨상위 개념과 하위 개념
1. 상위 개념: 폼(Form)과 상태(State)
리액트에서는 사용자 입력을 처리할 때 HTML 폼 요소들 (<input>, <textarea>, <select> 등)을 사용 한다.
그런데 리액트는 "상태(state)로 UI를 관리하는" 프레임워크 !
그래서 폼의 값도 리액트가 상태를 통해 제어할 수 있다.
이런 제어 방식이 바로 컨트롤 컴포넌트와 연결된다.
2. 하위 개념: Controlled vs Uncontrolled
- Controlled Component (제어 컴포넌트)
입력값을 컴포넌트의 state로 관리하는 폼 요소.
사용자가 input에 입력 → onChange로 이벤트 감지 → setState로 상태 업데이트 → input value도 변경됨.
즉, 폼의 값은 항상 리액트 상태(state)에 의해 "제어됨".
import { useState } from 'react';
function MyForm() {
const [name, setName] = useState('');
return (
<input
type="text"
value={name} // 상태로 제어
onChange={(e) => setName(e.target.value)} // 입력이 바뀌면 상태도 바꿈
/>
);
}
→ 이 input은 사용자가 입력해도 실제 데이터는 리액트 state에 저장돼 있어. 그래서 이걸 Controlled Component라고 불러.
- Uncontrolled Component (비제어 컴포넌트)
- 리액트가 값을 직접 관리하지 않고, DOM 자체에서 값을 관리함.
- 보통 useRef를 이용해서 값을 가져옴.
import { useRef } from 'react';
function MyForm() {
const inputRef = useRef();
const handleSubmit = () => {
console.log(inputRef.current.value); // DOM에서 직접 값 꺼냄
};
return <input type="text" ref={inputRef} />;
}
→ 이런 방식은 DOM에 맡기기 때문에 Uncontrolled Component라고 해.
💡✨어떨 때 주로 사용하는지

1. 비밀번호를 작성할 때, 작성하는 순간마다 특수 문자를 입력해야 한다던가 이런식으로 알림이 뜰 때가 많다.
이런식으로 내가 한글자 한글자 칠 때 마다, 검사를 할 수 있게 해주는게 controlled component
* 반대로 내가 비밀번호를 모두 작성하고, 비밀번호의 유효성을 검사하는 경우는 컨트롤 컴포넌트를 사용하지 않은 경우!
2. 두번째 경우는 입력값이 다른 컴포넌트에 바로 영향을 줄 때.
당장 구글 검색창만 생각해도 내가 한글자 한글자 칠 때마다 추천이 뜨는 자동검색어가 바로바로 달라지니
이런 식으로 내가 인풋에 값을 입력했을 때, 컴포넌트에서 띄워주는 값이 달라지는 것이다
그러나, 이럴 땐 사용할 필요는 없다 !
최종 값만 필요할 땐 굳이 인풋과 연결 시켜서 매번 리렌더링 할 필요가 없다.
컨트롤 컴포넌트를 쓰면 리렌더링이 많이 발생 하기 때문에, 성능을 향상 시키고 싶을 땐 사용하지 않는 것이 낫다.
💡✨대체할 수 있는 useRef
이럴 때 사용할 수 있는 것이 바로 ▾
useRef 이다 !
하지만, 너무 남발하며 자주 사용해서는 안된다.
useRef는 DOM주소를 바로 가져오는 만큼, 작동 방식과 다르므로, 필요시에만 사용해야 한다.
아래 게시글에서, useRef에 대해 보다 자세히 알아보자.
출처 : 구글링, 챗지피티, 오즈코딩스쿨 학습자료