React 앱은 많은 컴포넌트가 서로 중첩되어 형태를 취하고 있습니다. React는 앱의 컴포넌트 구조를 어떻게 추적할까요?
React 및 기타 많은 UI 라이브러리는 UI를 트리로 모델링합니다. 앱을 트리로 생각하는 것은 컴포넌트 간의 관계를 이해하는 데 유용합니다. 이러한 이해는 성능 및 상태 관리와 같은 개념을 디버깅하는데 도움이 됩니다.
트리는 항목 간의 관계 모델이며 UI는 트리 구조를 사용하여 표현되는 경우가 많습니다. 예를 들어 브라우저는 트리 구조를 사용하여 HTML( DOM ) 및 CSS( CSSOM ) 를 모델링합니다 . 모바일 플랫폼은 또한 트리를 사용하여 뷰 계층 구조를 나타냅니다.

React는 구성 요소에서 UI 트리를 만듭니다. 이 예에서는 UI 트리를 사용하여 DOM에 렌더링합니다.
브라우저 및 모바일 플랫폼과 마찬가지로 React도 트리 구조를 사용하여 React 앱의 구성 요소 간의 관계를 관리하고 모델링합니다. 이러한 트리는 React 앱을 통해 데이터가 흐르는 방식과 렌더링 및 앱 크기를 최적화하는 방법을 이해하는 데 유용한 도구입니다.
컴포넌트의 주요 특징은 다른 컴포넌트의 컴포넌트를 구성하는 기능입니다. 컴포넌트를 중첩하면 상위 컴포넌트와 하위 컴포넌트라는 개념이 생깁니다. 여기서 각 상위 컴포넌트는 그 자체가 다른 컴포넌트의 하위일 수 있습니다.
React 앱을 렌더링할 때 렌더링 트리라고 알려진 트리에서 이 관계를 모델링할 수 있습니다
import FancyText from './FancyText';
import InspirationGenerator from './InspirationGenerator';
import Copyright from './Copyright';
export default function App() {
return (
<>
<FancyText title text="Get Inspired App" />
<InspirationGenerator>
<Copyright year={2004} />
</InspirationGenerator>
</>
);
}

React는 렌더링된 구성요소로 구성된 UI 트리인 렌더링 트리를 생성합니다.
예제 에서 위의 렌더링 트리를 구성할 수 있습니다.
트리는 노드로 구성되며 각 노드는 컴포넌트를 나타냅니다. App, FancyText, Copyright 등은 모두 트리의 노드입니다.
React 렌더 트리의 루트 노드는 앱의 루트 컴포넌트입니다. 이 경우 루트 컴포넌트는 App 이며 React가 렌더링하는 첫 번째 컴포넌트입니다. 트리의 각 화살표는 상위 컴포넌트에서 하위 컴포넌트를 가리킵니다.
위의 렌더링 트리에는 각 컴포넌트가 렌더링하는 HTML 태그에 대한 언급이 없습니다. 이는 렌더링 트리가 React 컴포넌트로만 구성되어 있기 때문입니다.
UI 프레임워크인 React는 플랫폼에 구애받지 않습니다. React.dev에서는 HTML 마크업을 UI 기본 요소로 사용하는 웹으로 렌더링하는 예제를 보여줍니다. 그러나 React 앱은 UIView 또는 FrameworkElement 와 같은 다양한 UI 기본 요소를 사용할 수 있는 모바일 또는 데스크톱 플랫폼으로 렌더링할 수도 있습니다 .
이러한 플랫폼 UI 기본 요소는 React의 일부가 아닙니다. React 렌더링 트리는 앱이 렌더링되는 플랫폼에 관계 없이 React 앱에 대한 통찰력을 제공할 수 있습니다.
렌더링 트리는 React 애플리케이션의 단일 렌더링 경로를 나타냅니다. 조건부 렌더링을 사용하면 상위 컴포넌트는 전달된 데이터에 따라 다른 하위 컴포넌트를 렌더링할 수 있습니다.
import FancyText from './FancyText';
import InspirationGenerator from './InspirationGenerator';
import Copyright from './Copyright';
export default function App() {
return (
<>
<FancyText title text="Get Inspired App" />
<InspirationGenerator>
<Copyright year={2004} />
</InspirationGenerator>
</>
);
}

조건부 렌더링을 사용하면 다양한 렌더링에 걸쳐 렌더링 트리가 다양한 구성 요소를 렌더링할 수 있습니다.
이 예에서는 inspiration.type 가무엇인지에 따라<FancyText> 또는 <Color> 를 렌더링할 수 있습니다 . 렌더 링트리는 각 렌더링 경로마다 다를 수 있습니다.
렌더링 트리는 렌더 경로마다 다를 수 있지만 일반적으로 이러한 트리는 React 앱의 최상위 컴포넌트와 리프 컴포넌트가 무엇인지 식별하는 데 도움이 됩니다. 최상위 컴포넌트는 루트 컴포넌트에 가장 가까운 컴포넌트로, 그 아래에 있는 모든 컴포넌트의 렌더링 성능에 영향을 미치며 종종 가장 복잡한 컴포넌트를 포함합니다. 리프 컴포넌트는 트리 하단 근처에 있으며, 하위 컴포넌트가 없으며 자주 다시 렌더링됩니다.
이러한 컴포넌트 범주를 식별하는 것은 앱의 데이터 흐름과 성능을 이해하는 데 유용합니다.
트리로 모델링할 수 있는 React 앱의 또 다른 관계는 앱의 모듈 종속성입니다. 컴포넌트와 로직을 별도의 파일로 분할하면서 구성 요소, 함수 또는 상수를 내보낼 수 있는 JS 모듈을 만듭니다 .
모듈 종속성 트리의 각 노드는 모듈이고 각 분기는 해당 모듈의 import 문을 나타냅니다.
이전 예제(Inspirations 앱)을 사용하면 모듈 종속성 트리, 줄여서 종속성 트리를 구축할 수 있습니다.

Inspirations 앱의 모듈 종속성 트리입니다.
트리의 루트 노드는 진입점 파일이라고도 알려진 루트 모듈입니다. 루트 컴포넌트를 포함하는 모듈인 경우가 많습니다.
동일한 앱의 렌더링 트리를 비교해 보면 구조는 비슷하지만 몇 가지 차이점이 있습니다.
- 트리를 구성하는 노드는 컴포넌트가 아닌 모듈을 나타냅니다.
inspration.js와 같은 비컴포넌트 모듈도 이 트리에 표시됩니다. 렌더링 트리는 컴포넌트만 캡슐화합니다.Copyright.js는App.js의 아래에 나타나지만, 렌더링 트리에는Copyright컴포넌트는InspirationGenerator의 자식 컴포넌트로 나타납니다.InspirationGenerator는 JSX를 하위 props로 전달하여 하위 컴포넌트를 렌더링하지만Copyright모듈은 가져오지 않기 때문입니다.
종속성 트리는 React 앱을 실행하는 데 필요한 모듈을 결정하는 데 유용합니다. Production 용 React 앱을 빌드할 때 일반적으로 클라이언트에 제공하는 데 필요한 모든 JavaScript를 번들로 묶는 빌드 단계가 있습니다. 이를 담당하는 도구를 번들러 라고 하며 , 번들러는 종속성 트리를 사용하여 어떤 모듈을 포함해야 하는지 결정합니다.
앱이 고도화됨에 따라 번들 크기도 커지는 경우가 많습니다. 큰 번들 크기는 클라이언트가 다운로드하고 실행하는 데 비용이 많이 듭니다. 번들 크기가 크면 UI가 그려지는 시간이 지연될 수 있습니다. 앱의 종속서 트리를 이해하면 이러한 문제를 디버깅하는 데 도움이 될 수 있습니다.