학습 공간 개념 · 판단 · 실험

Frontend Performance Lab

React

Props·상태 소유권·Context와 조합

공유 데이터는 가장 가까운 공통 소유자에 두고 props나 컴포넌트 조합, Context로 전달합니다.

이럴 때 필요해요

중복 상태와 불필요한 전역화를 줄이고 컴포넌트 간 데이터 계약을 명확하게 유지합니다.

어떻게 동작하나요?

검색창에 입력한 글자를 검색 결과 목록에서도 써야 한다면, 그 글자 상태는 어디에 두어야 할까요? React에서는 데이터를 위에서 아래로 내려보내는 단방향 흐름을 사용합니다. 부모가 주는 읽기 전용 입력은 props이고, 컴포넌트가 직접 기억하고 바꾸는 값은 state입니다. 자식이 값을 바꾸고 싶을 때는 부모가 내려준 콜백 함수를 호출해 변경 의도를 알립니다.

두 자식이 같은 데이터를 함께 써야 한다면 가장 가까운 공통 부모로 state를 끌어올립니다(State Lifting). 이때 중간 컴포넌트들이 자신이 쓰지도 않는 props를 전달만 하는 props drilling이 부담스럽다면, 먼저 children으로 자식을 직접 조립하는 컴포넌트 조합(Composition)을 검토하고, 테마나 로그인 정보처럼 넓은 범위에 필요한 값에는 Context를 사용합니다.

Context는 깊은 하위 트리에 값을 곧바로 공급해 주는 전달 통로입니다. 하지만 그 자체로 상태 전이 규칙이나 부분 구독 최적화, 서버 캐시까지 다 해 주는 상태 관리 도구는 아닙니다. 자주 바뀌는 상태와 잘 바뀌지 않는 설정을 하나의 거대한 Context 객체에 한꺼번에 넣으면 하위 소비자들이 불필요하게 자주 다시 그려질 수 있으므로 관심사별로 나누어 설계합니다.

코드 예제

동작을 설명하는 읽기 전용 예제입니다.

example.jsx
function Parent() {
  const [name, setName] = useState('');
  return <NameInput value={name} onChange={setName} />;
}
function NameInput({ value, onChange }) {
  return <input value={value} onChange={e => onChange(e.target.value)} />;
}
jsx · 읽기 전용7줄

설명용 예제입니다. 입력창(NameInput)은 이벤트가 발생했을 때 새 문자열을 부모에게 알리기만 하고, 실제 상태의 소유권은 부모(Parent)에 남아 있습니다.

자주 헷갈리는 포인트

  • 자식 컴포넌트에서 부모가 전달한 props 객체나 배열을 직접 수정하지 않습니다.
  • 몇 단계의 props 전달을 피하겠다는 이유만으로 단순 지역 입력 상태까지 모두 전역 저장소로 올리지 않습니다.

내 말로 설명해 보기

Context나 전역 상태 라이브러리를 도입하기 전에 컴포넌트 조합(children)으로 props 전달 단계를 줄일 수 있는 경우는 언제인가요?

실전 시나리오에 적용해 보기

함께 읽으면 좋은 개념

관련 면접 질문 5개

React 상태의 위치와 관리 방식을 어떻게 정하나요?

상태는 우선 그 값을 실제로 읽고 바꾸는 컴포넌트 가까이에 두고, 여러 형제 컴포넌트가 함께 써야 할 때 가장 가까운 공통 부모로 끌어올립니다. 단일 값이나 단순 토글은 useState로, 여러 하위 값이 정해진 규칙으로 함께 바뀌는 복잡한 상태는 useReducer로 정리하며, 트리 깊은 곳까지 공통 값을 전달해야 할 때는 컴포넌트 조합이나 Context를 검토합니다. 또한 서버에서 받아오는 원격 데이터는 클라이언트 UI 상태와 분리해 캐시·재검증 전용 도구로 다루는 것이 깔끔합니다.

꼬리질문과 참고자료 →

Props drilling의 부담은 어떻게 줄이나요?

Props drilling은 깊은 하위 컴포넌트에 값을 전달하기 위해 그 값을 직접 쓰지 않는 중간 컴포넌트들이 연쇄적으로 props를 넘기는 현상입니다. 2~3단계 정도의 전달은 데이터 흐름이 명시적이라는 장점이 있으므로 무조건 나쁜 것은 아닙니다. 하지만 중간 레이아웃 컴포넌트가 불필요한 데이터 의존성을 많이 갖게 된다면, 먼저 children이나 슬롯 props를 활용한 컴포넌트 조합으로 구조를 단순화하고, 테마나 인증 정보처럼 넓은 범위에서 공유되는 값에는 Context를 도입합니다.

꼬리질문과 참고자료 →

자식 컴포넌트는 부모에게 변경 의도를 어떻게 전달하나요?

React는 위에서 아래로 흐르는 단방향 데이터 흐름을 따르므로, 부모가 상태 변경 함수를 콜백 props로 내려주고 자식이 사용자 이벤트 시점에 그 콜백을 호출해 변경 의도를 전달합니다. 부모는 자식으로부터 전달받은 값이나 도메인 이벤트를 확인해 자신이 소유한 state를 갱신하고, 그 결과로 새로운 props가 다시 자식에게 내려갑니다. 형제 컴포넌트끼리 상태를 맞춰야 할 때도 공통 부모에 상태를 두고 각각 값과 콜백을 내려주는 방식으로 해결합니다.

꼬리질문과 참고자료 →
나머지 질문 2개

공식 참고 자료

← React