state 변경 -> View 변경
state 변경 -> View 변경
View 변경 -> state 변경
ReactJS에서의 데이터 바인딩
은 기존의 것과 조금 다르게 해석된다.
이는 props가 흐르는 방향으로 설명되기 때문이다.
부모(상위) 컴포넌트와 자식(하위) 컴포넌트의 state를 하위 컴포넌트에서 사용해야 할 경우, 두 컴포넌트 사이에 존재하는 모든 컴포넌트의 매개변수(props)에 원하는 state나 함수를 담아 하위 컴포넌트로 내려주어야한다.
즉, props가 위에서 아래로 흐르는 구조를 가지게 된다. 따라서, ReactJS는 단방향 데이터 바인딩 구조로 보는 시각이 일반적이다.
문득 이야기를 들어보면 ReactJS에선 단방향 바인딩의 양상을 갖는 것 같지만, 이에 대해 반박하는 사례들이 존재한다.
상위 state를 변경할 수 있는 modifier(set함수)를 하위 컴포넌트의 props에 담아 전달해주면, 하위 컴포넌트에서 원하는 값을 전달받아 props로 전달받은 상위 컴포넌트의 modifier를 이용하는 것이 가능하기 때문이다.
const Parent = () => {
const [data, setData] = useState('');
return <Child data={data} setData={setData}/>
}
const Child = ({data, setData}) => {
setData((prev) => '새로운 데이터입니다');
return <div>child</div>;
}
하지만, modifier이 부모 컴포넌트로부터 온 것이기 때문에 단방향 데이터 바인딩으로 보는 것이 보편적이다.
왜 이렇게 불편해야하지?
무엇이 이 문제의 원인이지?
스스로 내린 해답은 다음과 같다.
하나의 함수(함수형 컴포넌트)가 두 개의 layer(View, Model)를 책임지고 있기 때문이다. (인터페이스 분리 원칙 위배)
하나의 함수가 여러가지 역할(화면 렌더링, 데이터 전달, 데이터 저장 등)을 하고 있기 때문이다. (SOLID 단일 책임 원칙 위배)
즉, 작성하는 모든 코드에서 기술부채가 발생할 수 있다는 의미이다. 이에 대한 해결책으로 state를 View(컴포넌트)에서 분리시켜낸 것이 상태관리 툴이라고 볼 수 있다.
상태관리 툴은 View와 Model을 분리함으로써 문제를 해결한다.
상태관리 도구를 사용하는 이유는 많겠지만, 직접 피부로 느낀 이유는 위와 같은 이유이다. View와 Model을 분리하고 함수형 컴포넌트들을 순수함수화 하는데 큰 도움을 준다.
각 컴포넌트들은 state로부터 해방된다. 그저 state를 DI받고, 결과를 렌더링만 하는 View의 정체성을 확립하게 된 것이다.