출처 : 매일메일 CS
리액트에서 폼 데이터를 처리할 때는 Controlled Component와 Uncontrolled Component 두 가지 접근 방식이 있다. 이 글에서는 두 방식의 차이점과 각각의 장단점, 그리고 어떤 상황에서 어떤 방식을 선택해야 하는지에 대해 알아보자!
Controlled Component는 입력값을 리액트 상태(state)로 관리하는 컴포넌트를 말한다. 입력 요소의 값(value)은 리액트 상태와 동기화되며, 사용자가 입력을 변경할 때마다 onChange 이벤트 핸들러를 통해 상태가 업데이트된다.
import React, { useState } from "react";
function ControlledInput() {
const [inputValue, setInputValue] = useState("");
const handleChange = (event) => {
setInputValue(event.target.value);
};
return (
<div>
<label>
Controlled Input:
<input type="text" value={inputValue} onChange={handleChange} />
</label>
<p>Current Value: {inputValue}</p>
</div>
);
}
export default ControlledInput;
Uncontrolled Component는 입력값을 리액트 상태가 아닌 DOM 자체에서 관리하는 방식이다. 이 경우, 리액트는 입력값을 직접 제어하지 않으며, ref를 사용해 DOM 요소에 접근하여 값을 읽거나 조작한다.
import React, { useRef } from 'react';
function UncontrolledInput() {
const inputRef = useRef(null);
const handleSubmit = () => {
alert(Input Value: ${inputRef.current.value});
};
return (
<div>
<label>
Uncontrolled Input:
<input type="text" ref={inputRef} />
</label>
<button onClick={handleSubmit}>Submit</button>
</div>
);
}
export default UncontrolledInput;
| 특징 | Controlled Component | Uncontrolled Component |
|---|---|---|
| 데이터 관리 방식 | 리액트 상태(state) | DOM 자체 |
| 유효성 검증 | 실시간 검증 가능 | 별도의 로직 필요 |
| 코드 복잡도 | 상대적으로 복잡 | 간단 |
| 성능 | 상태 업데이트로 인해 렌더링 발생 가능 | 렌더링 최소화 가능 |
| 사용 사례 | 복잡한 폼 로직, 실시간 검증 | 단순한 폼, 특정 시점 데이터 접근 |
Controlled Component와 Uncontrolled Component는 각각의 장단점과 적합한 사용 사례가 있다. 프로젝트의 요구사항과 폼의 복잡도에 따라 적절한 방식을 선택하는 것이 중요하다. 실시간 유효성 검증이나 동적인 폼 처리가 필요하다면 Controlled 방식을, 간단하고 특정 시점의 데이터 접근만 필요한 경우에는 Uncontrolled 방식을 고려해야 한다.