강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

dev.mingyo님의 프로필 이미지
dev.mingyo

작성한 질문수

[React 2부] 고급 주제와 훅

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

잘못된 useEffect 사용?

작성

·

23

·

수정됨

1

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

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

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

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

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

답변 2

0

김정환님의 프로필 이미지
김정환
지식공유자

안녕하세요 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 값을 계산하여 화면에 그립니다. 코드도 훨씬 간결해지고 성능도 최적화될 수 있습니다.

 

 

0

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

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

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

useEffect(() => {
    // errors 상태가 변경될 때마다 실행될 코드
    // 예: API 호출, 로컬 저장소 업데이트 등
}, [errors]);

setErrors를 통해 상태를 변경할 때 useEffect가 올바르게 작동하지 않는다면, 의존성 배열 설정을 다시 확인하시고, setErrors가 의도대로 상태를 변경하는지 디버깅하시는 것이 좋습니다.

관련해서 React 공식 문서의 useEffect 설명도 함께 참고하시면 기본적인 사용 방법과 주의점에 대해 더 깊이 이해하실 수 있습니다.

혹시 이와 관련된 비슷한 사례나 더 구체적인 예시가 필요하시면, 추가 정보를 제공해 주시면 더 맞춤형으로 답변드릴 수 있도록 하겠습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

dev.mingyo님의 프로필 이미지
dev.mingyo

작성한 질문수

질문하기