alpaka206

UseEffect가 두번 실행되는 이유

date
Oct 11, 2024
slug
why-UseEffect-run-twice
author
status
Public
tags
React
COMATCHING
summary
UseEffect가 두번 실행되는 이유
type
Post
thumbnail
category
💻 Frontend
updatedAt
Jan 4, 2026 06:54 AM
리액트에서 개발하다 보면 useEffect가 의도치 않게 두 번 실행되는 경우가 있습니다.
notion image
이번 글에서는 useEffect의 동작 원리와 두 번 실행되는 이유를 알아보고자 합니다.

1. UseEffect란 무엇인가?

문제를 해결하기 위해선 먼저 UseEffect에 대해서 알아야 한다고 생각합니다. useEffect는 리액트에서 제공하는 Hook 중 하나로, 컴포넌트가 렌더링될 때마다 특정 작업을 수행할 수 있도록 도와줍니다. 대표적으로 다음과 같은 상황에서 활용됩니다.

1-1 마운트될 때만 실행하기

컴포넌트가 처음 화면에 나타날 때 한 번만 실행되게 하고 싶다면 useEffect의 두 번째 인자로 빈 배열([])을 전달하면 됩니다.
useEffect(() => { console.log('마운트 될 때만 실행'); }, []);

1-2 특정 값이 업데이트될 때 실행하기

useEffect(() => { console.log('특정 값이 업데이트될 때 실행됩니다.'); }, [value]);
이와 같이 useEffect렌더링 직후에 실행되며, 두 번째 파라미터에 따라 실행 조건을 설정할 수 있습니다.

UseEffect가 두 번 실행되는 이유

useEffect가 두 번 실행되는 현상은 주로 React의 Strict Mode 때문입니다.

2-1. Strict Mode란 무엇인가?

StrictMode는 리액트에서 제공하는 개발 도구로, 코드에서 잠재적인 문제를 감지하고 경고를 제공합니다. 특히 다음과 같은 문제를 사전에 잡아줍니다:
  • 안전하지 않은 생명 주기 메서드 감지
  • 권장되지 않는 API 사용 경고
  • 예상치 못한 사이드 이펙트 확인
이 도구는 개발 모드에서만 동작하며, 컴포넌트를 한 번 더 렌더링하고 언마운트했다가 다시 마운트하는 방식을 사용해 잠재적인 문제를 확인합니다.
const root = ReactDOM.createRoot(document.getElementById('root')); root.render( <React.StrictMode> <App /> </React.StrictMode> );

해결 방법

Strict Mode는 배포 환경에서는 비활성화되므로, 사실 두 번 실행되는 현상은 개발 단계에서만 발생합니다. 하지만 테스트 시 혼란을 줄이기 위해 다음 방법을 고려할 수 있습니다.

3-1. Strict Mode 제거하기

StrictMode를 사용하지 않도록 설정하면 useEffect가 두 번 실행되는 문제를 방지할 수 있습니다.
const root = ReactDOM.createRoot(document.getElementById('root')); root.render( <App /> );
주의: Strict Mode를 제거하면 개발 단계에서 잡을 수 있는 잠재적 문제를 놓칠 수 있으므로, 꼭 필요한 경우에만 사용하지 않는 것을 권장합니다.

3-2. 실제 배포 환경에서는 문제없음

배포 환경에서는 Strict Mode가 비활성화되므로, useEffect는 정상적으로 한 번만 실행됩니다.
따라서 개발 모드에서만 발생하는 문제라면 큰 걱정 없이 그대로 두어도 됩니다

4. 마무리

useEffect가 두 번 실행되는 이유는 Strict Mode의 의도된 동작 때문입니다. Strict Mode는 리액트 앱의 안정성과 코드 품질을 높이는 데 유용하므로, 개발 단계에서는 이를 유지하면서 작업하는 것이 좋습니다. 하지만 테스트 환경에서 혼란을 줄이고 싶다면, Strict Mode를 비활성화하거나 배포 환경에서만 확인하는 방법도 있습니다.