Search

React 제어 컴포넌트, 비제어 컴포넌트

Tag
React
Frontend
Web
Category
FE문제풀이
Description
React의 제어 컴포넌트와 비제어 컴포넌트는 각각의 장단점이 있으며, 상황에 따라 적절히 선택하는 것이 중요하다고 생각한다.
AI 키워드
ID
23
Title
포스팅
2024/10/07
1 more property

질문

React에서 상태 관리의 복잡성을 줄이기 위해 컴포넌트를 비제어(Uncontrolled) 컴포넌트로 사용할 수 있는 상황과, 제어(Control) 컴포넌트로 사용할 수 있는 상황을 비교하여 설명해주세요.

질문의도

제어 컴포넌트와 비제어 컴포넌트의 차이점과 사용 시점을 이해하고 있는지 평가합니다. 폼 요소의 복잡성과 상태 관리 비용을 줄이기 위해 각 접근 방식을 어떻게 선택하고, 비제어 컴포넌트를 사용할 때 발생할 수 있는 문제(데이터의 동기화 어려움 등)의 해결 방법응 설명할 수 있는지를 확인합니다.

정의

React에서 제어 컴포넌트(Control Component)와 비제어 컴포넌트(Uncontrolled Component)는 상태 관리의 복잡도를 줄이기 위한 두 가지 접근 방식입니다. 이 두 방법의 차이점과 사용 시점을 다음과 같이 설명할 수 있습니다.

제어 컴포넌트 (Controlled Component)

정의: 제어 컴포넌트는 React의 상태(state)를 통해 폼 요소의 값을 관리합니다. 즉, 입력 값이 React의 상태에 의해 결정되고, 사용자가 입력할 때마다 상태가 리렌더링이 생기며 상태 값이 업데이트됩니다.
장점:
상태 관리: 입력 값이 컴포넌트의 상태와 직접 연결되어 있어, 데이터의 흐름을 쉽게 추적하고 관리할 수 있습니다.
유효성 검사: 실시간으로 입력 값을 검증하고, 상태에 따라 UI를 즉시 업데이트할 수 있습니다.
일관성: 모든 입력 값이 React의 상태에 의해 관리되므로, 여러 컴포넌트 간의 데이터 일관성을 유지하기 쉽습니다.
사용 예:
사용자 입력을 실시간으로 반영해야 하는 경우 (예: 검색 필터, 실시간 유효성 검사)
여러 폼 요소 간에 상태를 공유해야 하는 경우 (예: 다중 폼)
예시:
import React, { useState } from 'react'; function ControlledInput() { const [inputValue, setInputValue] = useState(''); const handleChange = (event) => { setInputValue(event.target.value); }; const handleSubmit = (event) => { event.preventDefault(); alert(`입력한 값: ${inputValue}`); }; return ( <form onSubmit={handleSubmit}> <label> 이름: <input type="text" value={inputValue} onChange={handleChange} /> </label> <button type="submit">제출</button> </form> ); }
JavaScript
복사
입력 필드의 값이 React의 상태와 연결되어 있고, 사용자가 입력할 때마다 handleChange 함수가 호출되어 상태가 없데이트 됩니다.

비제어 컴포넌트 (Uncontrolled Component)

정의: 비제어 컴포넌트는 DOM 요소의 상태를 직접 관리합니다. React의 상태와는 별개로, ref를 통해 DOM 노드에 접근하여 값을 가져옵니다.
장점:
간편한 구현: 간단한 폼 요소나 상태가 복잡하지 않은 경우, 코드가 더 간결해질 수 있습니다.
성능 최적화: 상태 업데이트가 자주 발생하지 않는 경우, 불필요한 렌더링을 줄일 수 있습니다.
사용 예:
단순한 입력 필드나 간단한 폼 제출이 필요한 경우 (예: 피드백 폼).
초기 렌더링 시 값만 필요하고, 이후의 상태는 중요하지 않을 때.
예시:
import React, { useRef } from 'react'; function UncontrolledInput() { const inputRef = useRef(null); const handleSubmit = (event) => { event.preventDefault(); alert(`입력한 값: ${inputRef.current.value}`); }; return ( <form onSubmit={handleSubmit}> <label> 이름: <input type="text" ref={inputRef} /> </label> <button type="submit">제출</button> </form> ); }
JavaScript
복사
useRef를 사용해 DOM 요소에 직접 접근합니다. 사용자가 입력한 값은 ref를 통해 제출 시에만 읽기 때문에 React에서 관리되지 않기 때문에, 입력 필드의 값은 React의 상태와는 독립적입니다.

비제어 컴포넌트의 문제점 및 해결 방법

문제점: 비제어 컴포넌트는 데이터의 동기화가 어려울 수 있습니다. DOM에서 직접 값을 가져오기 때문에, React의 상태와 불일치할 수 있습니다.
해결 방법:
ref 사용: useRef를 사용하여 DOM 요소의 현재 값을 가져오고, 폼 제출 시 상태를 한 번에 업데이트하는 방식으로 동기화할 수 있습니다.
이벤트 핸들러: 폼 제출 시 이벤트 핸들러 내에서 ref를 통해 값을 읽어와서 상태로 업데이트하는 방법을 사용할 수 있습니다.

결론

제어 컴포넌트와 비제어 컴포넌트는 상황에 따라 적절히 선택되어야 합니다. 제어 컴포넌트는 데이터의 흐름을 엄격하게 관리할 수 있는 반면, 비제어 컴포넌트는 간단한 구현과 성능 최적화를 제공하는 장점이 있습니다. 상황에 맞는 선택이 중요하며, 각각의 장단점을 이해하고 적절히 활용하는 것이 React 애플리케이션의 효율성을 높이는 데 좋은 효과를 볼 수 있을 것 같습니다.