개발/React
React - 상태 끌어올리기(State Lifting)
hanks
2025. 6. 1. 18:47
React를 사용하다 보면 컴포넌트 간에 같은 데이터를 공유해야 할 때가 있다. 이럴 때 사용하는 패턴이 바로 상태 끌어올리기(state lifting)다. 이 글에서는 상태 끌어올리기의 개념부터 예제, 사용하는 이유까지 단계별로 정리해본다.
상태 끌어올리기란?
여러 컴포넌트가 같은 상태를 공유해야 할 때, 해당 상태를 공통 부모 컴포넌트로 올리는 것을 상태 끌어올리기라고 한다.
React는 데이터가 항상 위에서 아래(부모 → 자식) 방향으로 흐르기 때문에, 형제 컴포넌트끼리 데이터를 공유하려면 부모 컴포넌트를 통해야 한다.
왜 상태를 끌어올려야 할까?
형제 컴포넌트가 서로 다른 상태를 가지면 데이터가 불일치할 수 있다. 이 경우 공통 부모가 상태를 관리하고 자식에게 props로 내려주는 방식이 가장 깔끔하다.
예를 들어, 두 개의 입력창이 있고 한쪽에서 입력한 값이 다른 쪽에도 반영되어야 할 경우를 보자.
❌ 상태를 끌어올리지 않은 예시
function FirstInput() {
const [text, setText] = useState("");
return <input value={text} onChange={(e) => setText(e.target.value)} />;
}
function SecondInput() {
const [text, setText] = useState("");
return <input value={text} onChange={(e) => setText(e.target.value)} />;
}
각 입력창이 독립적인 상태를 갖고 있어서 서로 영향을 주지 않는다. 즉, 한쪽 입력값이 다른 쪽에 반영되지 않는다.
✅ 상태를 끌어올린 예시
function Parent() {
const [text, setText] = useState("");
return (
<>
<FirstInput text={text} setText={setText} />
<SecondInput text={text} setText={setText} />
</>
);
}
function FirstInput({ text, setText }) {
return <input value={text} onChange={(e) => setText(e.target.value)} />;
}
function SecondInput({ text, setText }) {
return <input value={text} onChange={(e) => setText(e.target.value)} />;
}
이제 하나의 입력창에서 입력하면 다른 입력창에도 동일하게 반영된다. 상태는 공통 부모인 Parent가 가지고 있고, 자식은 props를 통해 상태를 전달받는다.
상태 끌어올리기의 흐름
- 형제 컴포넌트 간 데이터 공유 필요 발생
- 공통 부모 컴포넌트가 상태를 관리
- 자식 컴포넌트는 props로 상태와 set 함수를 전달받음
- 자식에서 상태를 변경하면 부모를 통해 상태가 갱신되고, 변경 사항이 다시 자식에게 전달됨
언제 사용하는가?
- 형제 컴포넌트끼리 데이터를 공유할 필요가 있을 때
- 입력값에 따라 다른 컴포넌트가 반응해야 할 때
- 공통된 동작이나 상태 관리를 한 곳에서 처리하고 싶을 때
요약
항목 | 설명 |
상태 끌어올리기 | 자식들이 공유할 상태를 부모 컴포넌트로 이동시키는 기법 |
목적 | 컴포넌트 간 상태 동기화 |
방법 | 부모에서 상태를 관리하고, 자식은 props로 전달받아 사용 |
상태 끌어올리기는 React의 데이터 흐름 제어의 핵심이다. 더 복잡한 상태 관리가 필요하다면 Context API나 Redux 같은 도구로 확장하면 된다.