단방향 데이터
✅ 단방향 데이터 흐름이란?
- 단방향 데이터 흐름은 데이터가 한 방향으로만 흐르는 설계 방식을 말합니다.
- React는 부모 컴포넌트에서 자식 컴포넌트로 데이터를 전달하며, 자식 컴포넌트는 부모에서 받은 데이터를 직접 수정하지 않고, 변경이 필요하면 다시 부모를 통해 변경을 요청합니다.
📌 동작원리
React에서의 데이터 흐름은 다음과 같이 동작합니다.
상위 컴포넌트 (Parent)
↓ props
하위 컴포넌트 (Child)
- 부모 컴포넌트는 자식 컴포넌트에 props를 통해 데이터를 전달합니다.
- 자식 컴포넌트는 읽기 전용으로 전달받은 데이터를 직접 수정할 수 없습니다.
- 데이터의 수정이 필요하면, 자식 컴포넌트는 부모 컴포넌트에 변경 요청을 전달합니다.
- 부모 컴포넌트는 상태를 업데이트하고, 변경된 데이터를 다시 자식에게 전달하여 UI를 갱신합니다.
이 방식은 데이터 흐름을 명확하게 만들어 애플리케이션의 상태 변화를 예측하기 쉽게 합니다.
📌 핵심 원리
단방향 데이터 흐름의 핵심적인 원리는 다음과 같습니다.
- 상태는 부모 컴포넌트에서 관리됩니다.
- Props를 통해 데이터를 하위 컴포넌트로 전달합니다.
- 하위 컴포넌트는 전달받은 props를 읽기 전용(Read-only)으로 사용합니다.
- 데이터의 변경 요청은 반드시 상위 컴포넌트에서만 수행됩니다.
📌 구현 예시
✅ Step 1. 상위 컴포넌트 구현 (Parent Component)
1import { useState } from 'react';23import Child from './Child';45const ParentComponent = () => {6 const [count, setCount] = React.useState(0);78 const increment = () => {9 setCount((prev) => prev + 1);10 };1112 return (13 <div>14 <h1>상위 컴포넌트: {count}</h1>15 <Child count={count} onIncrement={increment} />16 </div>17 );18};
✅ Step 2. 하위 컴포넌트 구현
1function Child({ count, onIncrement }) {2 return (3 <div>4 <h2>하위 컴포넌트: {count}</h1>5 <button onClick={onIncrement}>6 증가7 </button>8 </div>9 );10}
✅ 데이터 흐름 분석
상위 컴포넌트
├─ 상태를 관리 (state)
│
└─ props로 데이터(count)와 함수(onIncrement)를 하위 컴포넌트로 전달
├─ 하위 컴포넌트는 받은 props로 UI를 렌더링
└─ 버튼 클릭 시 props로 받은 onIncrement 호출
└─ 상위 컴포넌트의 상태가 변경되어 다시 하위 컴포넌트의 UI가 업데이트
이 과정에서 데이터의 흐름은 항상 위에서 아래로 한 방향으로 이루어집니다.
📌 단방향 데이터 흐름의 장점
- 예측 가능성 : 데이터가 명확한 흐름을 따라 움직이기 때문에 변경과 그 영향을 쉽게 추적하고 예측할 수 있습니다.
- 디버깅 용이성 : 데이터의 변경점을 명확히 알 수 있어 디버깅이 쉽습니다.
- 성능 최적화 : 데이터 흐름이 단순해져 불필요한 리렌더링 방지 및 최적화가 쉬워집니다.
- 유지보수 편의성 : 애플리케이션 규모가 커지더라도 데이터 관리가 용이합니다.
📌 단방향 데이터 흐름을 지원하는 대표적인 상태 관리 기법
- React의 Props 및 state
- Context API
- Redux, zustand, Recoil과 같은 전역 상태 관리 라이브러리
상태 관리가 복잡해지면 Redux나 zustand와 같은 외부 상태 관리 라이브러리를 도입하여 흐름을 더 효율적으로 관리할 수 있습니다.
📌 정리
- 단방향 데이터 흐름은 React 앱의 안정성과 예측 가능성을 크게 높여주는 핵심 설계 원리입니다.
- 컴포넌트는 명확한 규칙에 따라 데이터를 다루며, 이 규칙을 따르면 복잡한 상태 관리도 쉽게 수행할 수 있습니다.