잘못된 useEffect 사용?
65
작성한 질문수 6
useEffect를 통해 setErros를 호출해서 errors 상태를 변경하고 있습니다.
상태를 변경하는 건 부수효과가 아니니까 useEffect에서 상태 업데이트는 잘못된 사용이 아닌가 해서요!
저것 때문에 렌더링이 두 번 되기도 하고,
https://react.dev/learn/you-might-not-need-an-effect#updating-state-based-on-props-or-state
이 내용이랑 같은 내용인 것 같아서요!
답변 2
1
안녕하세요 dev.mingyo님. 리액트의 핵심원리를 날카롭게 지적해 주셨네요.
결론부터 말씀드립니다. 네, 맞습니다. 해당코드는 useEffect를 오용한 사례가 맞습니다.
불필요한 렌더링
리액트는 상태가 변하면 렌더링을 수행하는데요.
사용자가 값을 입력 함 → setValue 호출 (1차 렌더링)
렌더 직후 useEffect 실행 → setErrors 호출 (2차 렌더링)
한 번만 입력해도 브라우져는 매번 두 번씩 화면을 그리는데요, 서비스가 커질수록 성능 저하의 원인이 될수 있습니다.
개선 방향
errors 상태를 두었지만 실은 values를 통해 파생될수 있는 값입니다. 공식 문서에서 강조하듯, 기존 상태를 조합해서 만들 수 있는 값은 별도의 상태로 두지 않는 것이 유지보수에 훨씬 유리해요. errors를 직접 렌더링 내의 변수로 선언하는 것이 '리액트다운' 해결책입니다.
// ❌ 기존 방식: 불필요한 렌더링 발생
// const [errors, setErrors] = useState({});
// useEffect(() => { setErrors(validate(values)) }, [values]);
// ✅ 파생된 상태로 처리 (useState/useEffect 제거)
const errors = validate(values);이렇게 작성하면 values가 바뀔 때 리액트가 렌더링을 시작하고, 최신 errors 값을 계산하여 화면에 그립니다. 코드도 훨씬 간결해지고 성능도 최적화될 수 있습니다.
0
안녕하세요, 인프런 AI 인턴입니다. dev.mingyo님, 반갑습니다!
useEffect를 사용할 때 주의해야 할 점은 dependencies(의존성 배열)와 부수효과의 관리입니다. useEffect 내에서 상태를 변경하는 경우, 해당 상태를 의존성 배열에 포함시켜야 올바른 동작을 보장할 수 있습니다. 상태 변경 시 의존성 배열이 변경되지 않으면 의도한 대로 useEffect가 실행되지 않을 수 있습니다.
예를 들어, 아래와 같은 useEffect는 errors 상태가 변경될 때마다 효력을 발생하게 됩니다:
useEffect(() => {
// errors 상태가 변경될 때마다 실행될 코드
// 예: API 호출, 로컬 저장소 업데이트 등
}, [errors]);
setErrors를 통해 상태를 변경할 때 useEffect가 올바르게 작동하지 않는다면, 의존성 배열 설정을 다시 확인하시고, setErrors가 의도대로 상태를 변경하는지 디버깅하시는 것이 좋습니다.
관련해서 React 공식 문서의 useEffect 설명도 함께 참고하시면 기본적인 사용 방법과 주의점에 대해 더 깊이 이해하실 수 있습니다.
혹시 이와 관련된 비슷한 사례나 더 구체적인 예시가 필요하시면, 추가 정보를 제공해 주시면 더 맞춤형으로 답변드릴 수 있도록 하겠습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
useEffect 의존성 질문
1
57
2
orderableProductItem 에 관하여...
0
57
2
강의 자료, 블로그, 깃 주소
0
63
1
React 훅 구현 원리와 실무 패턴 관련 질문 (useState, useEffect 순서 및 핸들러 구조)
1
104
2
pushState로 주소를 바꾸면 렌더링이 안 되는 이유가 궁금합니다.
1
87
2
FormControl 컴포넌트 사용시 htmlFor prop 값 넘길 때 중괄호 이유
1
123
1
dispatch 함수도 리렌더링 유발하지 않나요?
1
203
2
ProductItem에서 onClick = {onClick}을 달지 않아도 되는 이유
1
160
2
replaceState를 쓰지 않는 대안
1
196
2
setValue 메서드를 바인딩 해야 하는 이유
1
163
2
MyReact를 IIFE(즉시실행함수)로 설계하신 이유
0
208
2
[4.4장 메모이제이션 훅] 4.4.3 memo 참조 비교
0
129
1
useRef 관련하여 질문드립니다
0
152
2
렌더 프롭 관련하여 질문드립니다
0
183
2
[1.2장 상품목록 화면] 1.2.3 Button ...rest 관련 질문 드립니다.
1
395
2
[4.4장 메모이제이션 훅] 4.4.4 useCallback curried function에 관한 질문입니다.
1
317
2
[4.4장 메모이제이션 훅] 4.4.2 useMemo 에서 every 함수에 관한 질문입니다.
1
355
2
[4.3장 리듀서 훅] 4.3.7 활용 MyForm(풀이) 오타 제보 및 질문이 있습니다.
1
281
2
[4.1장 레프 훅] useRef관련 질문이있습니다.
1
334
1
[1.3장 주문 내역 화면] 1.3.5 Card 조합 질문 있습니다
2
284
1
[3.5장 컨택스트 훅] 3.5.2 useContenxt 에서 질문이 있습니다.
1
432
2
[1.3.6 상태정의] state 관련
1
259
1
[2.4장 다이얼로그 1] 2.4.5 withLayout(풀이) 에 관한 질문입니다.
1
272
1
[2.1장 컨택스트] 2.1.4 공급자와 소비자 / 에서 질문이 있습니다.
1
425
2





