Skip to main content

Command Palette

Search for a command to run...

TIL: React의 의존성 관리

Updated
2 min read

재밌는 질문을 받았다. 그리고 답변을 고민하다가 React가 의존성을 관리하는 방식에 대해 알게 되어서 글로 남긴다.

질문

질문은 아래 컴포넌트를 렌더링하고 버튼을 2번째 눌렀을 때 왜 저 함수가 다시 호출되면서 console.log가 실행되는지 모르겠다는 내용이었다.

import { useEffect, useState } from "react";

function UseEffectTest() {
  // state only for rerender
  const [foo, setFoo] = useState(true);

  console.log("outside of useEffect, but inside of component", "foo: ", foo);

  useEffect(() => {
    console.log("RE-RENDERED", "foo: ", foo);
  });

  return (
    <div>
      {console.log("---inside JSX---", "foo: ", foo)}
      <button
        onClick={() => {
          setFoo(false);
        }}
      >
        rerender me!
      </button>
    </div>
  );
}

export default UseEffectTest;

나도 모르던 내용이라 처음엔

스트릭트 모드 때문 아닌가?

했다. 그런데 프로덕션 빌드에서도, next@12react@17로 테스트해봐도 똑같더라. 그리고 버튼을 더 눌러도 다시 렌더링이 되지 않았다.

고민하다가 깨달았다. 이건 React API의 한계다.

답변

React 함수 컴포넌트는 의존성 배열이라는 걸 사용한다. 그리고 fooboolean 타입을 가진 변수인데, 의존성 배열에 들어갈 수 있다. 변화 내용을 추적하거나 의존성 그래프를 그리기 위한 정보가 아예 없는, boolean 같은 값들이 의존성 배열에 직접 들어간다는 것이다. use*는 의존성 그래프 없이 다시 실행할지 여부를 결정해야한다. 이럴 때 쓸 수 있는 방법이 foofalse로 놓고 컴포넌트를 다시 실행해보는 것이다. 실행하면서 의존성 배열에 다른 값이 들어오는지 확인하면, foofalse로 바뀌었을 때 다시 실행돼야하는 코드가 있는지 알 수 있다. 이후에 버튼을 다시 클릭해도 로그가 찍히지 않는 건 이전 실행의 결과로 foofalse로 바뀌어도 다시 실행될 필요가 없다는 걸 알았기 때문일 것이다.


오랜만에 답변하면서도 배울 게 있는 질문이었다.

More from this blog

한국의 학벌에 대한 생각

내 블로그의 제목이 kdy1: The way I think 인만큼 앞으로는 내 생각을 더 자주 올리려고 한다. 한국 기준으로, 학벌은 사람을 볼 때 꽤나 유용한 지표이지만, 절대적이지는 않다. 경험적인 얘기일 뿐이지만, 성균관대학교 자퇴생으로서 느낀 것들이 몇 가지 있다. 대학까지 간 사람의 학벌은 학습 능력 x 성실함 에 대체로 비례한다. 그래서 의미가

Apr 3, 20261 min read

인간 지능에 대한 메모장

최종 업데이트: 2026/03/15 지능의 유전 현재 인류 기준으로, 고지능자는 고지능 유전자가 많이 겹친 사람이다. 지능의 유전엔 X 염색체가 매우 중요한 역할을 한다. 그리고 이게 남자와 여자의 지능 분포 차이를 만든다. 극상위권에 여자가 거의 없는 이유가 이것이다. 고지능 X 염색체가 여자한테서 발현되려면 2개가 있어야 한다. 이는 인간의 생

Mar 15, 20262 min read

Ai 코딩 팁 2 (한국어)

발표 자료: https://gamma.app/docs/AI--2a52e7tk3eb1ch1 AI 활용법 관련해서 간단하게 발표를 했다. 발표 자료 앞쪽은 전에 블로그에 올린 글이랑 같은 내용이다. 이 글에서는 기존 글에서 다루지 않은 내용들을 다루겠다. 에러 메시지 및 로깅 구체적 타입 및 스키마 활용 any 타입은 사람에게도 위험하지만, AI에게는 더 위험하다. 마찬가지로, JSON.parse처럼 아무 제약 없는 파싱 느슨한 인터페이스 ...

Jan 30, 20265 min read

kdy1: The way I think

233 posts