patterns.dev의 내용을 보고 추가적인 개념을 덧붙여 정리한 글입니다.
앱 내의 여러 컴포넌트들이 데이터를 사용해야 할 때
props
를 통해서 데이터를 전달하는 방식은 앱 내의 모든 컴포넌트들이 데이터에 접근해야 하는 경우 번거롭다.
아주 멀리있는 컴포넌트 트리까지 props를 내려주는 경우,
prop에 의존되는 컴포넌트들을 추후에 리팩토링하기 힘들어지고
어떤 데이터가 어디서부터 전해져오는지 알기 어렵다.
데이터가 필요하지 않는 컴포넌트는 props를 받지 않도록 수정하는것이 좋다.
그러기 위해선 prop drilling에 의존하지 않고 컴포넌트가 직접 데이터에 접근할 수 있는 방법이 요구된다.
이러한 경우에 provider pattern이 유용하다.
data
를 필요로 하지 않는 컴포넌트들은 data
를 prop을 받지 않게 된다Increment
버튼이 Button
컴포넌트 안에 있고, Reset
버튼은 Reset
컴포넌트 안에 있다. Increment
버튼을 누르면 카운트만 증가되는 것이 아니라 Reset
컴포넌트 내의 date도 리렌더링 된다. (Reset
컴포넌트는 useCountContext
를 사용하고 있기 때문에 리렌더링 된다)보통 UI테마를 여러 컴포넌트들이 공유해 사용하기 위해 쓴다.
모든 컴포넌트를 Provider
로 감싼다. Provider는 HOC로 Context
객체를 제공한다. - React가 제공하는 createContext
메서드를 활용해서 Context 객체를 만들어낼 수 있다.
Provider 컴포넌트는 value
라는 prop으로 하위 컴포넌트들에 내려줄 데이터를 받는다. 이 컴포넌트의 모든 자식 컴포넌트들은 해당 provider를 통해 value prop에 접근할 수 있다. - 아로 인해 각 컴포넌트들에 직접 data
prop을 일일히 넘기지 않아도 된다.
각 컴포넌트들은 useContext
훅을 사용하여 data
에 접근할 수 있다. - 이 훅은 data와 연관된 DataContext를 받아 data를 읽고 쓸 수 있는 context 객체를 제공한다.
- Hook 라이브러리는 flutter의
StatelessWidget
과StatefulWidget
을 대신하는HookWidget
을 제공하는 라이브러리다.- HookWidget을 사용하면 해당 위젯이 가진
Hook
함수를 사용할 수 있다.- 자주 사용하는 로직을 미리 정의하여 필요할 때 꺼내 쓰도록 하고, 이렇게 미리 정의한 로직패턴을
Hook
이라고 부른다.- Hook을 사용할 시 한줄의 코드로 기존보다 더 많은 정보를 추상화해서 전달할 수 있다.
위의 <동작 개념> 에서 제시하던 예시에 대한 내용을 이어나가면, 각 컴포넌트에서 useContext
를 직접 import하는 대신 필요로 하는 컨텍스트를 직접 반환하는 훅을 구현할 수 있다.
-> 훅이 유효하게 사용되는지 검증하기 위해 컨텍스트가 잘못된 값일 때 예외를 발생시키도록 구현한다.
function useThemeContext() {
const theme = useContext(ThemeContext)
if (!theme) {
throw new Error('useThemeContext must be used within ThemeProvider')
}
return theme
}
컴포넌트들을 ThemeContext.Provider
로 직접 래핑하게 하는 것 대신, HOC를 만들어 간단하게 쓸 수 있도록 할 수 있다.
=> 컨텍스트 로직과 렌더링 로직을 분리하여 재사용성을 증가시킬 수 있다
다음 내용은 flutter에서 provider pattern을 적용하는 부분에 대한 글입니다.
참고자료
Hook에 대한 내용 참고