노트

재조정(Reconciliation)

Reconciliation

프런트엔드#react · 연결된 개념 13개

쉽게 말하면

재조정은 틀린 그림 찾기처럼 이전 화면 설계도와 새 설계도를 비교해서, 달라진 부분만 실제 DOM에 고쳐 칠하는 과정이에요. 전부 다시 그리지 않으니 빠르고, 입력하던 내용 같은 state도 남아요.

비유가 깨지는 곳 다만 완벽한 비교가 아니라 빠른 어림짐작이에요. 타입이 바뀌면 아래를 통째로 새로 만들어 state가 날아가요. 형제 사이는 key로만 알아봐서, index를 key로 쓰면 state가 엉뚱한 항목을 따라가요.

재조정(Reconciliation)은 React가 이전 렌더의 엘리먼트 트리와 새 트리를 비교(Diffing)해, 실제 DOM(Document Object Model)에 필요한 최소한의 변경만 반영하는 과정이다. 두 트리를 완벽하게 비교하면 O(n³)이라, React는 두 가지 가정을 두어 O(n)으로 줄인다.

  1. 타입이 다르면 다른 트리다. <div>가 <section>으로, Counter가 Timer로 바뀌면 아래 트리를 모두 언마운트하고 새로 마운트한다. state도 사라진다
  2. key가 형제 사이의 정체성을 알려 준다. key가 같으면 같은 요소로 보고 이동만 처리한다
flowchart TD
  N["같은 위치의 이전 엘리먼트와 새 엘리먼트"] --> T{"타입이 같은가"}
  T -- 아니오 --> R["아래 트리를 언마운트하고 새로 마운트 (state 사라짐)"]
  T -- 예 --> K{"key가 같은가"}
  K -- 아니오 --> R
  K -- 예 --> U["DOM 노드·state 유지, 바뀐 props만 반영"]

규칙에서 나오는 실무 감각

  • 타입과 트리 위치가 같으면 DOM 노드와 컴포넌트 state가 유지되고, 바뀐 props만 반영된다
  • 리스트 key에 배열 index를 쓰면 앞에 항목을 넣을 때 엉뚱한 항목의 state가 따라간다. 데이터의 고유 ID를 쓴다
  • key는 리스트 밖에서도 쓸 수 있다. <Profile key={userId} />처럼 key를 바꾸면 컴포넌트를 일부러 초기화할 수 있다(Effect가 필요 없는 경우)
  • 컴포넌트를 다른 컴포넌트 안에서 정의하지 않는다. 렌더마다 새 함수 = 새 타입이라 매번 리마운트된다
  • 같은 자리에서 조건부로 다른 타입을 번갈아 그리면 state가 날아간다. {isOpen ? <Modal /> : null}도 닫으면 Modal의 state가 초기화된다
  • 리렌더를 디버깅할 때는 "어느 트리 위치에 어떤 타입이 있나"로 생각한다. React.memo는 이 알고리즘 안에서 비교를 건너뛰게 할 뿐 알고리즘을 바꾸지 않는다(memo·useMemo·useCallback, 상태 내리기와 컴포지션으로 리렌더 줄이기)

비교 작업을 쪼개 중단·재개하는 엔진은 Fiber 아키텍처. 정확성보다 속도를 택한 휴리스틱이라는 점에서 빅오 표기법 관점으로도 읽을 수 있다.

출처: React Reconciliation: 컴포넌트 뒤에 숨겨진 엔진 · React(구 문서) - Reconciliation · React - Preserving and Resetting State

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • React 상태 갱신

    React는 상태를 직접 고치지 않고 새 값을 setState로 넘겨야 다시 그린다. 이전 값과 Object.is로 비교하므로, 같은 객체를 고친 뒤 넘기면 바뀐 줄 모른다.

  • React Compiler

    React Compiler는 빌드 타임에 컴포넌트와 훅을 분석해 메모이제이션(Memoization) 코드를 자동으로 넣어 주는 컴파일러다. 개발자가 손으로 붙이던 useMemo·useCallback·memo를 대신한다. 2025년 10월 1.0이 나왔다.

  • React의 규칙과 렌더 순수성

    Rules of React는 React가 올바르게 동작하고 최적화하기 위해 코드가 지켜야 하는 규칙으로, 공식 문서가 세 가지로 정리한다. 핵심은 렌더가 순수한 계산이어야 한다는 것이다.

  • 내부 가변성과 메모이제이션

    내부 가변성(Interior Mutability)은 객체나 함수의 참조는 그대로인데 안에 숨은 상태가 바뀌는 성질이다. React의 메모이제이션은 "입력이 다른 참조인가"만 보기 때문에, 참조가 같으면 내용이 바뀌어도 바뀌지 않았다고 판단한다. React 공식 문서는 이를 "겉모습은 같은데 몰래 내용물을 바꾸는 상자"에 비유한다.

  • React로 보는 SOLID

    SOLID는 원래 객체 지향 설계 원칙이지만 React 컴포넌트·props·훅에도 그대로 옮겨 볼 수 있다. 원칙 자체보다 "어떤 코드 모양이 되는가"를 짧게 정리한다.

보기 옵션