728x90
React를 쓰다 보면 상태 초기화, 상태 원복(되돌리기)을 다루게 되는 경우가 꽤 많다.
예를 들어…
- 사용자가 어떤 폼을 열었을 때 기본값으로 초기화하고 싶을 때
- 사용자가 입력하던 중 “취소” 버튼을 눌러서 원래 값으로 되돌리고 싶을 때
겉보기엔 비슷해 보이지만, 이 두 개는 의도와 동작이 엄연히 다르다.
이번 글에서는 "초기화"와 "원복"을 구분하는 이유,
그리고 실무에서 이걸 헷갈려 생긴 문제와 해결 방법을 정리해본다.
---
초기화 vs 원복, 뭐가 다를까?
구분 초기화 (Reset) 원복 (Restore)
초기화 | 원복 | |
목적 | 상태를 기본값으로 되돌림 | 특정 시점의 데이터를 다시 불러옴 |
시점 | 폼을 새로 열거나 처음 접근했을 때 | 수정 중 취소하거나 롤백할 때 |
기준값 | "기본값" 상수나 최초 정의된 값 | 실제 API에서 받아온 값 (originalData) |
예시 | setForm(defaultForm) | setForm(originalData) |
즉, 초기화는 정해진 기본값으로 설정하는 것이고,
원복은 어떤 시점에서의 실제 값으로 되돌리는 것이다.
---
잘못된 패턴
const defaultForm = {
name: '',
email: '',
};
const [form, setForm] = useState(defaultForm);
// ...
const handleCancel = () => {
setForm(defaultForm); // ← 이게 항상 "되돌리기"는 아님
};
처음엔 괜찮아 보여도, 이 방식은 사용자가 수정하다가
"취소" 눌렀을 때 원래 API에서 받아온 데이터로 복원되는 게 아니다.
그냥 빈 값으로 초기화되는 것뿐이다.
---
상태를 복사해서 '원본 데이터' 따로 들고 있어야 한다
const [originalForm, setOriginalForm] = useState({});
const [form, setForm] = useState({});
// API로 데이터 받아올 때
useEffect(() => {
const fetch = async () => {
const res = await api.getUser();
const copy = cloneDeep(res.data);
setOriginalForm(copy); // 원본 백업
setForm(copy); // 수정용 상태
};
fetch();
}, []);
취소 버튼 눌렀을 때
const handleCancel = () => {
setForm(cloneDeep(originalForm)); // ← 원복은 originalForm 기준으로
};
초기화 버튼 눌렀을 때
const defaultForm = {
name: '',
email: '',
};
const handleReset = () => {
setForm(defaultForm); // ← 초기화는 기본값 기준으로
};
초기화 값은 상수로, 원본 값은 동적 데이터로 관리
const DEFAULT_FORM = {
name: '',
email: '',
};
const [originalForm, setOriginalForm] = useState({});
const [form, setForm] = useState(DEFAULT_FORM);
이렇게 하면 코드 읽기도 쉬워지고
의도치 않은 값 복사 실수를 방지할 수 있다.
---
React에서 상태를 관리할 때,
“초기화”와 “원복”은 단어는 비슷하지만 목적과 동작이 다르다.
- 초기화는 말 그대로 ‘빈 값’으로 되돌리는 것
- 원복은 이전 상태(보통 API 응답 값)으로 되돌리는 것
이 둘을 혼동하지 않으려면, 상태를 별도로 분리하고
초기값 상수와 API 기반 원본 값을 각각 관리해주는 것이 좋다.
728x90
반응형
'REACT' 카테고리의 다른 글
모바일에서만 영상이 안 나와? 내 삽질기 (ft. Range 헤더) (2) | 2025.07.23 |
---|---|
BFF(Backend For Frontend)? (0) | 2024.02.14 |
Zustand란? (0) | 2024.02.05 |
Redux Toolkit - RTK Query 사용 후기 및 정리 (0) | 2022.09.23 |
React로 Intersection Observer 없이 Viewport 감지 구현하기 (0) | 2022.09.20 |