들어가며
React에서 "A component is changing an uncontrolled input to be controlled"*라는 경고 메시지를 만난 적이 있나요? 이 에러는 보통 input 요소가 uncontrolled 상태로 시작했다가, 이후 controlled 상태로 변환될 때 발생합니다. 이러한 경고는 개발 환경에서만 표시되지만, 무시하고 넘어가면 앱의 일관성과 안정성에 문제가 생길 수 있습니다.
이번 글에서는 이 문제를 해결하는 방법을 예시 코드와 함께 알아보겠습니다.
Uncontrolled와 Controlled Input 차이
Uncontrolled input은 React가 그 값을 관리하지 않는 입력 요소를 의미합니다. 사용자가 입력한 값을 직접적으로 DOM이 관리하고, React의 상태로부터 독립적인 상태로 동작합니다. 반대로 Controlled input은 React 상태에 의해 관리되는 입력 요소로, 사용자가 입력한 값이 항상 React의 state에 저장되며 상태에 따라 값이 동적으로 변화합니다.
문제는 다음과 같은 상황에서 발생합니다:
- input 필드가 처음에 undefined 또는 null 값으로 설정되어 uncontrolled로 시작된 후, 나중에 controlled 상태로 변경되는 경우입니다.
경고 메시지
에러 메시지는 다음과 같은 형태로 나타납니다:
이러한 경고는 필드의 value가 처음에 정의되지 않았기 때문에 uncontrolled로 시작하고, 이후에 정의된 값이 할당되면서 controlled 상태로 전환될 때 발생합니다.
문제 해결 방법
문제를 해결하려면 input 필드의 value를 항상 정의된 값으로 초기화해야 합니다. 즉, 빈 문자열('')을 사용하여 controlled 상태를 유지하는 것이 중요합니다.
예를 들어, 다음과 같은 코드를 살펴보겠습니다:
useEffect(() => {
if (!profile) {
setProfile({
name: '',
nickname: '',
email: '',
password: '',
newPassword: '',
confirmNewPassword: '',
profileImage: '', // 빈 문자열로 초기화
isMarketingAgreed: false // 기본값 false
})
}
}, [])
위 코드는 profile 값이 undefined일 경우, setProfile을 호출하여 빈 문자열로 모든 필드를 초기화하는 방법입니다. 이렇게 함으로써 React는 input 요소를 항상 controlled 상태로 유지할 수 있습니다.
'프론트엔드' 카테고리의 다른 글
Axios와 Fetch API 비교: 어떤 것을 선택해야 할까? (0) | 2024.08.24 |
---|