STUDY/React

[React] useEffect가 두 번 실행되는 이유와 해결방법 (with. StrictMode)

1juyoung 2025. 6. 20. 14:16

저번 글에서는 React의 대표적인 훅인 useStateuseEffect의 개념과 기본 사용법에 대해 알아보았다. 이번에는 지난 시간에 배운 내용을 다시 복습할 겸 간단한 예제를 만들어 실행해 보았다.

그런데 예제를 실행하자 예상치 못한 현상이 발생했다 😂

바로 useEffect가 두 번씩 실행되는 것이었다!

이번 글에서는 이런 현상이 왜 발생했는지 원인을 파악하면서 React 훅을 좀 더 깊게 이해해 보려고 한다.

예제 코드 살펴보기

먼저 작성한 예제 코드를 살펴보자.

mport { useState, useEffect } from "react";

function Home() {
  const [countNumber, setCountNumber] = useState(0);

  useEffect(() => {
    console.log('useEffect 실행되나 확인.');
  }, [countNumber]);

return {
		<div>
      <button onClick={() => setCountNumber(countNumber + 1)}>useEffect 확인</button>
    </div>
  );
}

export default Home;

이 코드는 다음과 같이 동작한다.

  • 버튼을 클릭할 때마다 countNumber 상태가 1씩 증가한다.
  • countNumber 상태가 변경될 때마다 useEffect가 실행되어 콘솔에 로그가 찍힌다.

하지만 실행해 보면 초기 렌더링 시 콘솔에 로그가 두 번 찍히는 현상이 나타난다. 이 원인은 React의 StrictMode에 있다.

 

초기 렌더링 시 결과 창

React StrictMode와 두 번 렌더링 문제

리액트 프로젝트를 처음 생성하면, 일반적으로 아래와 같이 <StrictMode>로 컴포넌트를 감싸준다.

createRoot(document.getElementById('root')).render(
  <StrictMode>
    <Header />
    <App />
  </StrictMode>,
)

이 <StrictMode>는 React가 개발 환경에서 컴포넌트의 잠재적 문제를 발견할 수 있도록 도움을 주는 도구이다. 이를 위해 컴포넌트를 일부러 두 번 렌더링하여 예측하지 못한 사이드 이펙트나 메모리 누수 등의 문제를 개발자가 미리 인지할 수 있도록 한다.

즉, 두 번 실행되는 현상은 오류가 아니라 React가 개발자에게 보내는 경고의 의미라고 생각하면 된다!

해결 방법

만약 개발 중 두 번씩 실행되는 것이 불편하다면 개발 중에만 <StrictMode>를 일시적으로 제거하면 된다. 그러나 <StrictMode>가 제공하는 유용한 기능이 많기 때문에 가급적 제거하지 않는 것이 좋다.

프로덕션 환경에서는 <StrictMode>가 동작하지 않기 때문에 걱정하지 않아도 된다.

나처럼 React를 공부하면서 혼란을 겪었다면 이 글을 통해 조금이나마 해소하는 데 도움이 되었기를 바란다..