React의 StrictMode에 대해서

citron03·2022년 7월 21일
0
  • React.StrictMode는 애플리케이션의 잠재적인 문제를 알아내기 위한 도구이다.
  • 와 마찬가지로, 는 추가적으로 DOM을 렌더링하지 않고, 자손들에 대한 부가적인 검사와 경고를 활성화한다.
  • StrictMode는 자손 컴포넌트의 부가적인 검사와 경고를 할 뿐이다.
// index.tsx
import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';

const root = ReactDOM.createRoot(
  document.getElementById('root') as HTMLElement
);
root.render(
  <React.StrictMode>
    <App /> // React.StrictMode는 하위의 모든 자손 컴포넌트에 적용된다.
  </React.StrictMode>
);
  • StrictMode는 개발 모드에서만 활성화 되기에, 빌드가 된 후의 프로젝트에서 StrictMode는 비활성화된다.

  • 개발을 진행하는 중 console.log()가 두 번 찍히는 이유는 StrictMode가 활성화되어있기 때문이다.
    🍸 다만, react 버전 17 이상에서는 Strict 모드에서도 자동으로 console.log()가 두 번찍히지 않는다.

🧃 잠재적인 문제의 종류로는 다음과 같은 것들이 있다.

1. 안전하지 않은 생명주기를 사용하는 컴포넌트 발견

  • 비동기 React 애플리케이션에서 특정 생명주기 메서드들은 안전하지 않다.

  • Strict 모드가 활성화되면, 안전하지 않은 생명주기 메서드를 사용하는 컴포넌트 목록이 담긴 경고 로그가 출력된다.

2. 레거시 문자열 ref 사용에 대한 경고

  • 레거시 문자열 ref API은 여러 단점이 있고, 이러한 단점없이 객체 ref를 사용하는 방법이 있다.

  • 따라서, Strict 모드가 활성화 되었을 때, 레거시 문자열 ref API가 사용되면 경고 로그가 출력된다.

3. 권장되지 않는 findDOMNode 사용에 대한 경고

  • findDOMNode는 변하지 않는 단일 DOM에서만 정상적으로 작동한다.

  • 리액트와 같이 렌더링이 자주 일어날 수 있는 환경에서 findDOMNode는 변경사항에 대응할 방법이 없으므로 적절하지 않다.

  • ref 객체를 사용하는 방법을 대신 사용할 수 있다.

4. 예상치 못한 부작용 검사

🌹 React는 렌더링 단계(변경사항 탐지)커밋 단계(실제 변경사항 반영)로 나뉘어진다.

  • 커밋 단계는 빠르게 진행되나, 렌더링 단계는 느릴 수 있다.

  • 렌더링 단계의 여러 생명주기 메서드들이 여러번 호출될 수 있기에, 메모리 누수와 같은 부작용이 없는 것이 중요하다.

  • Strict 모드가 모든 부작용을 자동으로 찾아줄 수는 없다.

  • 하지만, 일부 함수를 이중으로 호출하여 부작용을 에측하고 문제가 되는 부분을 찾을 수 있게 돕는다.
    🥛 물론, 개발모드에서만 이중으로 호출된다.

이중으로 호출되는 함수는 다음과 같다.

  • 클래스 컴포넌트의 constructor, render 그리고 shouldComponentUpdate 메서드
  • 클래스 컴포넌트의 getDerivedStateFromProps static 메서드 함수 컴포넌트 바디
  • State updater 함수 (setState의 첫 번째 인자)
  • useState, useMemo 그리고 useReducer에 전달되는 함수
    🌶 출처 : https://ko.reactjs.org/docs/strict-mode.html#detecting-unexpected-side-effects

5. 레거시 context API 검사

  • 레거시 context API는 오류가 발생하기 쉽기에 Strict 모드에서 사용되면 경고 로그를 출력한다.

  • 새로운 context API를 사용하는 것이 권장된다.
    🍄 새로운 context API: https://ko.reactjs.org/docs/context.html

참고 자료 : https://ko.reactjs.org/docs/strict-mode.html

profile
🙌🙌🙌🙌

0개의 댓글