🔷 들어가며
React를 사용하다 보면 <React.StrictMode>라는 컴포넌트를 본 적이 있을 것이다. 보통 index.js 파일에서 루트 컴포넌트를 감쌀 때 사용한다. 하지만 정확히 어떤 역할을 하는지, 왜 사용하는지에 대해선 모호한 경우가 많다.
이번 글에서는 StrictMode가 실제로 어떤 일을 하는지, React 18에서 어떤 변화가 있었는지, 그리고 우리가 코드에서 어떻게 대응해야 하는지까지 정리해보려한다.
✅ StrictMode란?
StrictMode는 React에서 잠재적인 문제를 사전에 감지할 수 있도록 도와주는 개발용 유틸리티 컴포넌트이다.
- 개발 모드에서만 동작
- 실제 UI에는 아무 영향도 주지 않음
- 앱 전체 또는 일부분에만 적용 가능
import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
<React.StrictMode>
<App />
</React.StrictMode>
);
🔍 StrictMode가 하는 일
1. Deprecated API 감지
React에서 더 이상 사용이 권장되지 않는 생명주기 메서드나 레거시 API 사용을 감지한다.
- componentWillMount, componentWillReceiveProps, componentWillUpdate 등
- tring ref 방식 (ref="myRef") 사용
- 레거시 Context API (contextTypes, childContextTypes)
2. 부작용 감지 (Side Effect Detection)
React 18부터는 마운트와 언마운트를 의도적으로 반복하여 컴포넌트의 사이드 이펙트 작동을 확인한다.
예를 들어 다음 코드의 useEffect는 StrictMode 하에서 두 번 실행된다.
useEffect(() => {
console.log('마운트');
return () => console.log('언마운트');
}, []);
출력
마운트
언마운트
마운트
이렇게 일부러 다시 마운트해보면서 정상적으로 cleanup이 되는지 확인한다.
3. 상태 불변성 체크 및 이상 동작 감지
상태를 직접 변경하거나, 부적절한 방식으로 상태를 조작하면 경고를 발생시킨다.
리액트의 "퓨어" 철학을 깨지 않도록 도와준다.
⚠️ React 18 이후 StrictMode 변화
React 18에서 Concurrent Rendering이 기본이 되면서 StrictMode도 다음과 같은 변화가 있었다.
- useEffect, useState, useMemo 등 훅의 초기화/clean-up을 여러 번 수행 (더블 호출)
- 이유는: 비동기 렌더링 시 예상치 못한 동작을 미리 감지하기 위해서
💡 주의할 점
이중 실행은 프로덕션에서는 일어나지 않지만, 개발 중에는 항상 발생하므로 이에 맞게 퓨어하고 idempotent한 로직을 작성해야 한다.
🧪 실제 적용 팁
- 외부 API 호출이나 DB 트랜잭션 같은 부작용 로직은 useEffect 내부에서 분리하고, 정확한 cleanup 함수를 작성하는 것이 좋다.
- 컴포넌트 내부에 불필요한 상태 변경이나 순수하지 않은 계산식이 없는지 확인해 볼 것.
- StrictMode에서 문제가 없는 코드는 미래의 React 업데이트에 안전하다.
'개발 > Javascript & Typescript' 카테고리의 다른 글
[React] React에서 key로 index를 쓰면 안 되는 이유 (50) | 2025.07.04 |
---|---|
[Javascript] 함수가 기억을 한다고? 자바스크립트 클로저 쉽게 설명해봄 (58) | 2025.06.02 |
[jQuery] jQuery 파헤치기 (64) | 2025.04.20 |
[jQuery] jQuery에 대해서 알아보자. (40) | 2025.04.18 |
[Next] Next.js로 5분 만에 웹 앱 폭주! 이걸 몰랐다면 개발자로서 이미 뒤처진 거다! (52) | 2025.01.14 |