inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

[React 2부] 고급 주제와 훅

[4.2장 레프 훅] 4.2.3 오류 메세지

잘못된 useEffect 사용?

65

dev.mingyo

작성한 질문수 6

1

useEffect를 통해 setErros를 호출해서 errors 상태를 변경하고 있습니다.

 상태를 변경하는 건 부수효과가 아니니까 useEffect에서 상태 업데이트는 잘못된 사용이 아닌가 해서요!

저것 때문에 렌더링이 두 번 되기도 하고,

https://react.dev/learn/you-might-not-need-an-effect#updating-state-based-on-props-or-state

이 내용이랑 같은 내용인 것 같아서요!

javascript react 웹앱 React-Context react-hooks

답변 2

1

김정환

안녕하세요 dev.mingyo님. 리액트의 핵심원리를 날카롭게 지적해 주셨네요.

결론부터 말씀드립니다. 네, 맞습니다. 해당코드는 useEffect를 오용한 사례가 맞습니다.

불필요한 렌더링

리액트는 상태가 변하면 렌더링을 수행하는데요.

  1. 사용자가 값을 입력 함 → setValue 호출 (1차 렌더링)

  2. 렌더 직후 useEffect 실행 → setErrors 호출 (2차 렌더링)

한 번만 입력해도 브라우져는 매번 두 번씩 화면을 그리는데요, 서비스가 커질수록 성능 저하의 원인이 될수 있습니다.

개선 방향

errors 상태를 두었지만 실은 values를 통해 파생될수 있는 값입니다. 공식 문서에서 강조하듯, 기존 상태를 조합해서 만들 수 있는 값은 별도의 상태로 두지 않는 것이 유지보수에 훨씬 유리해요. errors를 직접 렌더링 내의 변수로 선언하는 것이 '리액트다운' 해결책입니다.

// ❌ 기존 방식: 불필요한 렌더링 발생
// const [errors, setErrors] = useState({});
// useEffect(() => { setErrors(validate(values)) }, [values]);

// ✅ 파생된 상태로 처리 (useState/useEffect 제거)
const errors = validate(values);

이렇게 작성하면 values가 바뀔 때 리액트가 렌더링을 시작하고, 최신 errors 값을 계산하여 화면에 그립니다. 코드도 훨씬 간결해지고 성능도 최적화될 수 있습니다.

 

 

1

dev.mingyo

감사합니다

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다. dev.mingyo님, 반갑습니다!

useEffect를 사용할 때 주의해야 할 점은 dependencies(의존성 배열)와 부수효과의 관리입니다. useEffect 내에서 상태를 변경하는 경우, 해당 상태를 의존성 배열에 포함시켜야 올바른 동작을 보장할 수 있습니다. 상태 변경 시 의존성 배열이 변경되지 않으면 의도한 대로 useEffect가 실행되지 않을 수 있습니다.

예를 들어, 아래와 같은 useEffecterrors 상태가 변경될 때마다 효력을 발생하게 됩니다:

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