컴포넌트를 화면에 표시하기 이전에 React에서 렌더링하는 과정이 필요하다.
코드가 어떻게 실행되는지, React에서는 렌더링 과정이 어떻게 진행되는지에 대해 정리해보고자 한다.

주방 상황에서 요리사가 컴포넌트를 재료로 요리를 한는 상황이라면
UI를 요청하고 제공하는 세 가지 단계
1. 렌더링 트리거 (손님의 주문을 주방으로 전달)
2. 컴포넌트 렌더링 (주방에서 주문 준비하기)
3. DOM에 커밋 (테이블에 주문한 요리 내놓기)
여기에서 DOM이란 브라우저가 HTML 코드를 이해하고 화면에 그리기 위해 생성하는 설계도 같은 것이라고 이해하면 된다. 리액트는 실제 DOM 대신 메모리에 가벼운 가상 DOM(Virtual DOM)을 만들어 먼저 시뮬레이션하며, 데이터가 변하면 바뀐 부분만 골라내어 실제 DOM에 반영하기 때문에 웹 속도가 빠르고 효율적인 것이다.
컴포넌트는 다음 두 가지 경우에 렌더링된다.
1. 컴포넌트의 초기 렌더링
2. 컴포넌트의 state가 업데이트 된 경우
createRoot를 호출하고 render 메서드를 실행하는 것으로 이 작업이 완료된다.createRoot는 브라우저의 실제 DOM 노드(주로 id="root")를 인자로 받아, 리액트 컴포넌트가 뿌리 내릴 수 있는 최상위 진입점을 만든다.추가로, 이 방식을 통해 리액트 앱이 실행되어야만 Concurrent Mode(동시성 모드)와 같은 최신 성능 최적화 기능을 온전히 사용할 수 있다고 한다.
import { StrictMode } from "react";
import { createRoot } from "react-dom/client";
import "./index.css";
import App from "./App";
import { AuthProvider } from '@/contexts/AuthContext';
createRoot(document.getElementById("root")!).render(
<StrictMode>
<AuthProvider>
<App />
</AuthProvider>
</StrictMode>
);
진행하는 프로젝트의 진입점 main.tsx 코드이다. 여기서 createRoot를 확인할 수 있고, render 메서드를 통해 브라우저의 실제 DOM 요소인 root와 리액트의 가상 DOM 세상을 연결하여 초기 렌더링을 트리거한다.
<App />을 감싸 앱 전체에 인증 관련 전역 데이터를 공급하는 통로 역할을 수행📍연결과 렌더링 : createRoot + render (리액트라는 엔진을 브라우저에 장착)

set 함수를 통해 상태를 업데이트하여 추가적인 렌더링을 트리거 할 수 있다. set 함수 : 리액트에서 상태를 만들 때 사용하는 const [state, setState] = useState(초기값); 문법에서 setState가 set함수📍 렌더링 이란 : React에서 컴포넌트를 호출하는 것을 의미
export default function Gallery() {
return (
<section>
<h1>Inspiring Sculptures</h1>
<Image />
<Image />
<Image />
</section>
);
}
function Image() {
return (
<img
src="https://i.imgur.com/ZF6s192.jpg"
alt="'Floralis Genérica' by Eduardo Catalano: a gigantic metallic flower sculpture with reflective petals"
/>
);
}
리액트의 재귀적 렌더링 단계
1. 시작점(Parent) : 리액트가 Gallery() 컴포넌트를 호출 -> 컴포넌트는 <section>과 그 안에 담긴 <h1> , 그리고 세 개의 <Image/> 컴포넌트를 반환
<section>, <h1> 그리고 3개의 <img> 태그에 대한 DOM 노드를 생성함<image/>를 찾아가 다시 호출 <Image/>를 렌더링하여 <img> 태그를 얻음 <Image/>도 호출하여 더 이상 컴포넌트 형태가 아닌 순수한 HTML 태그 (<img>)가 나올때까지 반복 appendChild() DOM API를 사용하여 생성한 모든 DOM 노드를 화면에 표시한다.appendChild() 는 리액트가 내부적으로 몰래 실행하는 동작으로, 개발자가 직접 appendChild()를 호출할 필요 없이, createRoot와 render 과정을 거치면 리액트가 내부적으로 가장 최적화된 시점에 이 API를 사용하여 화면을 업데이트한다. export default function Clock({ time }) {
return (
<>
<h1>{time}</h1>
<input />
</>
);
}
<h1> 태그 안의 {time}은 계속 변하므로, 리액트는 이 부분의 텍스트 내용만 브라우저 DOM에서 업데이트한다. <input /> 태그는 이전과 똑같은 위치에 그대로 존재한다.<input /> 이나 그 안에 사용자가 입력 중이던 value는 건드리지 않고 그대로 둔다. 덕분에 사용자가
<input>을 치고 있는 와중에time이 바뀌더라도, 입력창의 포커스나 글자가 사라지지 않고 자연스럽게 유지될 수 있다.
