Skip to main content
입문React 공통 모델 · 1

React 렌더링의 입력: 컴포넌트는 무엇으로 다음 UI를 계산하는가

부모가 준 값, 컴포넌트가 기억한 값과 트리에서 공유된 값을 구분하고, 화면을 바꿔야 하는 데이터를 파일 바깥 변수에 둘 때 생기는 실패를 설명한다.

마지막 검증 재검증 정책: 제품 버전 의존: 새 주요 버전마다 재검증
목차
표준·구현·측정·해석 표시는 무엇인가요?
  • 표준웹 표준이나 언어 명세가 정한 동작
  • 구현특정 기술이나 브라우저가 실제로 구현한 동작
  • 측정명시한 환경에서 직접 실행해 관찰한 결과
  • 해석앞선 근거에서 도출한 설계 판단
  • 미확인아직 공식 근거나 재현 결과를 확인하지 못한 내용

30초 요약

함수 컴포넌트는 React가 다음 사용자 인터페이스(User Interface, UI) 조각을 계산하기 위해 실행하는 자바스크립트 함수다. 이 글에서 렌더링은 React가 그 함수를 실행해 다음 UI를 계산하는 과정까지만 뜻한다. 계산 결과를 실제 화면에 반영하는 단계는 2편에서 분리한다.

함수 컴포넌트가 렌더링 중 읽을 수 있는 React 입력의 종류에는 props · state · context가 있다. 각 컴포넌트는 이 가운데 필요한 입력만 읽는다. JSX는 자바스크립트 파일 안에서 다음 UI 모양을 표현하는 문법 확장이다. 기억할 질문은 “이 값이 바뀌는가?” 하나가 아니라 다음 세 가지다.

  1. 부모가 소유하고 자식에게 전달하는 값인가?
  2. 한 컴포넌트가 사용자 동작 사이에 기억해야 하는 값인가?
  3. 트리의 넓은 범위에서 같은 설정을 읽어야 하는가?

답에 따라 props, state, context를 고른다. 화면에 보여야 할 값을 파일 바깥의 일반 변수에 두고 직접 바꾸면 값은 달라져도 React에 새 화면 계산을 요청하지 못한다.

이 글을 관통하는 상황: 수량은 바뀌었는데 합계는 그대로다

상품 단가는 부모가 서버 응답에서 받아 자식에게 전달하고, 사용자는 주문 요약에서 수량을 늘릴 수 있다고 하자. 통화 단위는 결제 화면 전체에서 같은 값을 사용한다.

처음 구현은 수량을 파일 바깥의 일반 변수에 둔다.

let quantity = 1
 
function OrderSummary({ unitPrice }) {
  function handleAdd() {
    quantity += 1
  }
 
  return (
    <section>
      <p>수량: {quantity}</p>
      <p>합계: {unitPrice * quantity}원</p>
      <button type="button" onClick={handleAdd}>수량 추가</button>
    </section>
  )
}

버튼을 누르면 quantity 값 자체는 바뀐다. 하지만 React에는 화면을 다시 계산하라는 요청이 전달되지 않는다. 사용자는 버튼을 눌렀는데도 수량과 합계가 그대로인 화면을 본다. 나중에 부모의 다른 상태가 바뀌어 우연히 다시 렌더링되면 수량이 갑자기 건너뛴 것처럼 나타날 수도 있다.

이 실패를 “버튼 이벤트가 실행되지 않았다”로만 조사하면 원인을 놓친다. 개발자 도구에서 처리 함수가 실행되고 변수도 증가했다면, 다음 질문은 그 변경이 React의 어떤 렌더링 입력으로 전달됐는가다.

세 입력은 소유 위치가 다르다

세 입력은 모두 화면 계산에 쓰이지만 값의 소유 위치가 다르다.

입력값의 기준을 소유하는 곳이 상황의 값
props부모 컴포넌트상품 단가 unitPrice
state상태를 선언한 컴포넌트사용자가 선택한 수량 quantity
context가장 가까운 상위 제공자통화 단위 currency

이 표는 “변하지 않는 값은 props, 변하는 값은 state”라는 구분이 아니다. 부모가 소유한 단가도 서버 응답이나 선택한 상품이 바뀌면 다음 렌더링에서 다른 props로 전달될 수 있다. 중요한 기준은 값이 변할 수 있는지가 아니라 누가 값의 기준을 소유하는가다.

일반 변수를 바꿔도 화면 갱신은 요청되지 않는다

일반 자바스크립트 변수도 값을 기억할 수 있다. 그러나 React는 모든 변수 대입을 감시하지 않는다.

수량을 state로 옮기면 값의 보존과 화면 갱신 요청이 같은 경계에 놓인다.

import { useState } from 'react'
 
function OrderSummary({ unitPrice }) {
  const [quantity, setQuantity] = useState(1)
 
  function handleAdd() {
    setQuantity(quantity + 1)
  }
 
  return (
    <section>
      <p>수량: {quantity}</p>
      <p>합계: {unitPrice * quantity}원</p>
      <button type="button" onClick={handleAdd}>수량 추가</button>
    </section>
  )
}

useState(1)은 현재 수량과 다음 수량을 요청하는 함수를 제공한다. 버튼을 누르면 현재 렌더링의 quantity에 1을 더한 값을 다음 상태로 요청한다. 한 번의 처리 안에서 여러 상태 요청을 쌓는 규칙은 뒤의 상태 글에서 별도로 다룬다.

context는 숨겨진 전역 변수가 아니다

결제 화면의 여러 하위 컴포넌트가 같은 통화 단위를 읽는다면 context를 검토할 수 있다.

import { createContext, useContext, useState } from 'react'
 
const CurrencyContext = createContext('KRW')
 
function Checkout({ unitPrice, currency }) {
  return (
    <CurrencyContext value={currency}>
      <OrderSummary unitPrice={unitPrice} />
    </CurrencyContext>
  )
}
 
function OrderSummary({ unitPrice }) {
  const currency = useContext(CurrencyContext)
  const [quantity, setQuantity] = useState(1)
 
  return (
    <section>
      <p>수량: {quantity}</p>
      <p>합계: {unitPrice * quantity} {currency}</p>
      <button type="button" onClick={() => setQuantity(quantity + 1)}>
        수량 추가
      </button>
    </section>
  )
}

현재 React 19 문서에서 <CurrencyContext value={currency}>는 트리 아래에 현재 통화 값을 제공한다. createContext('KRW')'KRW'는 일치하는 상위 제공자가 없을 때만 사용하는 정적 대체값이며, 현재 값을 저장하거나 스스로 바꾸는 저장소가 아니다. React 18과 그 이전 문법에서는 같은 역할을 <CurrencyContext.Provider value={currency}>로 표현한다.

context는 파일 바깥에 둔 전역 변수와 다르다. 어떤 값이 적용되는지는 컴포넌트 트리의 제공자 위치로 결정되고 React의 렌더링 입력으로 추적된다. 하지만 전달 단계가 있다는 이유만으로 모든 값을 context에 넣으면 컴포넌트의 필수 입력 관계가 코드에서 덜 분명해질 수 있다. 특정 자식만 필요한 단가는 props로 두는 편이 필수 입력 관계를 읽기 쉽다.

이 코드에서 부모가 currency="USD"를 전달해 다시 렌더링하면 주문 요약도 USD를 표시해야 한다. 반면 unitPrice는 특정 주문 요약의 필수 입력이므로 context로 숨기지 않고 props로 전달한다. 이 대조를 테스트하면 context 값 경로와 props 계약을 함께 확인할 수 있다.

같은 상황을 입력 경로로 다시 진단한다

처음 실패를 입력 경로로 정리하면 다음과 같다.

문제       수량 추가 버튼 뒤에도 합계가 바뀌지 않음
잘못된 판단 JSX가 읽는 일반 변수만 바꾸면 화면도 바뀔 것임
관찰       처리 함수와 변수 대입은 실행됐지만 렌더링 요청이 없음
원인       수량이 props·state·context 중 어떤 경로에도 들어 있지 않음
행동       수량의 소유 컴포넌트에 state를 두고 설정 함수로 다음 값을 요청
검증       클릭마다 수량과 합계가 함께 바뀌고, 주문 요약 두 개가 수량을 공유하지 않으며,
           부모의 통화 값 변경이 표시 통화에 반영됨

풀 리퀘스트에서는 화면에 영향을 주는 새 값마다 다음을 확인할 수 있다.

  • 기준 값을 어느 컴포넌트가 소유하는가?
  • 자식은 props로 값을 받고 변경 의도를 처리 함수로 올려보내는가?
  • 사용자 동작 사이에 보존할 값은 state인가?
  • context는 트리의 넓은 범위에서 필요한 값에만 쓰였는가?
  • React 밖의 가변 값을 렌더링 중 읽어 우연한 다시 렌더링을 기대하지 않는가?

React 공통 규칙과 렌더 대상의 책임을 나눈다

어떤 화면 요소로 반영되는지의 차이는 2편의 Render와 Commit, 이후 React Native 트랙에서 다룬다.

지금 기억할 축은 짧다.

부모의 값은 props, 컴포넌트의 기억은 state, 트리의 공유 값은 context다.

다음 글에서는 이 입력으로 컴포넌트를 실행하는 Render와 계산 결과를 실제 화면에 반영하는 Commit을 나누어 본다.

Active recall

기억에서 꺼내 보기

답을 쓰지 않아도 됩니다. 먼저 머릿속으로 답한 뒤 펼쳐서 정답·이유·흔한 오해를 비교하세요.

  1. 01함수 컴포넌트가 현재 화면을 계산할 때 읽을 수 있는 React 입력 세 종류는 무엇인가?

    정답

    부모가 전달한 props, 컴포넌트의 현재 state와 가장 가까운 상위 제공자가 준 context다.

    왜 그런가

    실제로 사용하는 각 입력은 소유 위치와 전달 경로가 다르며 현재 렌더링의 계산에 참여한다.

    관련 설명 다시 읽기
    지금 어느 정도 기억났나요?

    선택한 상태와 다음 복습일은 이 브라우저에만 저장됩니다.

  2. 02버튼을 누를 때마다 바뀐 값이 화면에 보여야 한다면 파일 바깥의 일반 변수보다 state가 필요한 이유는 무엇인가?

    정답

    state 설정은 다음 값을 보존하면서 React에 새 화면 계산을 요청하지만, 일반 변수 변경은 React에 렌더링이 필요하다는 신호를 주지 않기 때문이다.

    왜 그런가

    일반 변수는 바뀔 수 있어도 React가 그 변경을 관찰하거나 렌더링 사이에 컴포넌트별 값으로 관리하지 않는다.

    관련 설명 다시 읽기
    지금 어느 정도 기억났나요?

    선택한 상태와 다음 복습일은 이 브라우저에만 저장됩니다.

  3. 03단가와 수량 중 부모가 소유한 단가는 자식이 어떤 경로로 받고, 자식이 기억해야 하는 수량은 어디에 둘 수 있는가?

    정답

    부모가 소유한 단가는 props로 받고, 컴포넌트 상호작용 사이에 보존하며 화면을 바꿀 수량은 적절한 소유 컴포넌트의 state에 둔다.

    왜 그런가

    데이터가 변하는지뿐 아니라 누가 그 값의 기준을 소유하는지에 따라 입력 경로를 선택한다.

    관련 설명 다시 읽기
    지금 어느 정도 기억났나요?

    선택한 상태와 다음 복습일은 이 브라우저에만 저장됩니다.

  4. 04통화 단위를 여러 하위 컴포넌트가 읽는다면 언제 context를 검토할 수 있고, 언제 props가 더 명확할까?

    정답

    트리의 넓은 범위에서 같은 설정이 필요하고 중간 컴포넌트가 전달만 한다면 context를 검토할 수 있다. 특정 자식의 필수 입력과 소유 관계를 드러내야 한다면 props가 더 명확하다.

    왜 그런가

    context는 전달 단계를 줄이는 입력 경로이지 모든 상태를 대신하는 전역 저장소라는 뜻은 아니다.

    관련 설명 다시 읽기
    지금 어느 정도 기억났나요?

    선택한 상태와 다음 복습일은 이 브라우저에만 저장됩니다.

출처와 검증 범위

아래 날짜는 링크를 마지막으로 열어 본 날입니다. 문서 상단의 검증일은 글의 설명과 적용 범위를 다시 확인한 날입니다.

  1. Components and Hooks must be pureReact · 공식 문서 · 확인 2026-08-08
  2. Keeping Components PureReact · 공식 문서 · 확인 2026-08-08
  3. Passing Props to a ComponentReact · 공식 문서 · 확인 2026-08-08
  4. State as a SnapshotReact · 공식 문서 · 확인 2026-08-08
  5. Passing Data Deeply with ContextReact · 공식 문서 · 확인 2026-08-08
  6. createContextReact · 공식 문서 · 확인 2026-08-08
  7. Learn the BasicsReact Native · 공식 문서 · 확인 2026-08-08
  8. Core Components and APIsReact Native · 공식 문서 · 확인 2026-08-08
이 문서의 마지막까지 읽었습니다.