StrictMode는 리액트에서 제공하는 개발용 도구. React.StrictMode는 컴포넌트의 잠재적인 문제를 사전에 발견할 수 있도록 돕기 위해 사용한다.
React.StrictMode에서는 컴포넌트가 마운트되었다가 언마운트되고 다시 마운트되는 과정을 한 번 더 실행하는데, 이 과정은 다음의 이유 때문에 의도적으로 설계된 것이다.
1. 클린업 함수 테스트
React는 useEffect의 클린업 함수가 올바르게 실행되는지 확인하기 위해
마운트 → 언마운트 → 다시 마운트의 과정을 실행한다.
만약 클린업이 잘못 구현되었거나 메모리 누수가 있다면 이 과정에서 문제를 감지할 수 있다.
🖥️ jsx
import React, { useEffect } from "react";
function ExampleComponent() {
useEffect(() => {
console.log("✅ useEffect 실행됨");
return () => {
console.log("🧹 useEffect 클린업 실행됨");
};
}, []);
return <div>StrictMode 테스트</div>;
}
export default ExampleComponent;
출력 결과 (StrictMode 사용 시)
plaintext
✅ useEffect 실행됨
🧹 useEffect 클린업 실행됨
✅ useEffect 실행됨
첫 번째 useEffect 실행 → 컴포넌트가 마운트됨
클린업 함수 실행 → 컴포넌트가 언마운트됨
다시 useEffect 실행 → 컴포넌트가 다시 마운트됨
이 과정을 통해 클린업 로직의 정상 동작을 확인할 수 있다.
2. 잠재적 버그 감지
개발자가 컴포넌트를 작성할 때 간혹 잘못된 의존성이나 부수 효과를 추가할 수 있는데, StrictMode를 통해 마운트-언마운트-재마운트를 실행하면 이러한 버그를 빠르게 발견할 수 있다.
3. StrictMode 적용 방법
StrictMode는 리액트 개발 환경에서만 활성화되며 배포 버전에서는 제거됩니다.
적용 예시
보통 index.js 파일에 다음과 같이 감싼다.
🖥️ jsx
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>
);
<React.StrictMode>로 감싸진 컴포넌트들은 엄격한 검사를 받고,
이를 통해 부수 효과와 라이프사이클 메서드의 잠재적 문제를 사전에 확인 가능.
개발 서버에서만 작동
: StrictMode는 개발 환경에서만 적용되며, 배포(프로덕션)에서는 영향이 없다.
useEffect의 실행
: StrictMode는 의도적으로 useEffect를 두 번 실행시켜 클린업 함수의 정상 작동 여부를 검사한다.
잠재적 버그 예방 : 잘못된 의존성이나 부수 효과를 미리 감지하여 애플리케이션 개발을 안정화.
성능에는 영향 없음
: 배포 시 StrictMode가 제거되기 때문에 애플리케이션 성능에는 영향을 미치지 않는다.
🍓 TIL - Strict Mode
❓ Strict Mode에서 2번 실행되는 것은 useEffect훅 하나인가?
➡️ 아니다. 컴포넌트 자체가 2번 실행된다.