Riverpod 이란?
Riverpod은 Flutter 애플리케이션에서 상태 관리와 의존성 주입을 효율적으로 처리하기 위한 강력한 라이브러리이다. 기존의 Provider 패키지의 단점을 개선하고, 추가적인 기능과 안전성을 제공한다.
Riverpod의 주요 특징
- 컴파일 타임 안전성: Riverpod은 컴파일 시점에 많은 오류를 잡아내어 런타임 에러를 최소화한다.
- Widget 트리에 의존하지 않음: Provider와 달리, Riverpod은 Widget 트리에 의존하지 않으므로 애플리케이션 어디에서든 상태에 접근하고 관리할 수 있다.
- 상태의 불변성: Riverpod은 불변 상태를 지향하여 상태 관리의 예측 가능성과 안정성을 높입니다. 필요에 따라 가변 상태도 관리할 수 있다.
- 의존성 주입의 용이성: Provider 간의 의존성을 쉽게 설정하고 관리할 수 있어, 복잡한 애플리케이션 구조에서도 유연하게 동작한다.
- 테스트 편의성: Widget 트리에 의존하지 않으므로, 별도의 설정 없이도 간단하게 테스트할 수 있다.
Riverpod의 핵심 개념 (Provider, Notifier)
Provider
Provider는 애플리케이션에서 데이터를 노출하고 공유하는 기본 단위이다. 다양한 유형의 Provider를 통해 여러 종류의 상태와 데이터를 관리할 수 있다.
Provider 선택 가이드
- 간단한 읽기 전용 데이터: Provider
- 간단한 상태 변경: StateProvider
- 복잡한 상태 로직: StateNotifierProvider
- 비동기 작업 결과: FutureProvider
- 스트림 데이터: StreamProvider
- 기존 ChangeNotifier 사용: ChangeNotifierProvider
Notifier
Notifier는 Riverpod에서 상태 관리 로직을 캡슐화하는 클래스 또는 객체이다. 애플리케이션의 상태를 변경하고 관리하는 역할을 담당하며, 상태 변경에 따른 알림을 제공하여 UI나 다른 부분이 이에 반응할 수 있게 한다.
Notifier 선택 가이드
- 간단한 동기 상태 관리: Notifier
- 비동기 상태 관리: AsyncNotifier
- 복잡한 불변 상태 관리: StateNotifier
- 가변 상태 관리 또는 기존 ChangeNotifier 사용: ChangeNotifier
Riverpod 이야기 - 우체국 물류 센터의 혁신
옛날 어느 마을에서, 사람들은 서로에게 편지와 소포를 보내며 마음을 전했다. 하지만 시간이 지남에 따라 마을은 번창하고, 편지와 소포의 양도 늘어나기 시작했다. 어느 순간, 마을의 우체국은 넘쳐나는 편지와 소포를 효율적으로 처리하기 어려워졌습니다. 기존의 단순한 방식으로는 빠르고 정확한 배송이 점점 불가능해 보였다.
그러던 어느 날, 우체국장은 이런 문제를 해결하기 위해 새로운 물류 관리 시스템을 도입하기로 결정했다. 이 시스템은 최신의 기술과 체계적인 방법을 도입하여, 모든 편지와 소포를 신속하고 정확하게 분류하고 전달할 수 있도록 설계되었다. 이 혁신적인 시스템의 이름이 바로 Riverpod이다.
Riverpod 우체국 물류 센터는 잘 구성된 여러 섹션(Provider)들로 나누어져 있었고, 각 섹션은 자신만의 역할을 맡고 있다.
- 일반 우편 섹션은 일상적인 편지들을 빠르고 쉽게 처리한다.
- 특급 배송 섹션은 급히 보내야 하는 소포들을 특별히 관리한다.
- 국제 우편 섹션은 해외로 나가는 편지와 소포를 계속 추적하여 정확하게 관리한다.
각 섹션에는 창고 관리자(Notifier)가 있어 물건들이 잘 분류되고, 정해진 시간에 정확히 목적지로 갈 수 있도록 관리한다. 이렇게 잘 조직된 Riverpod 우체국 덕분에 마을 사람들은 다시 마음 편하게 소포와 편지를 보낼 수 있었다. 편지는 잘 정리되고, 소포는 목적지로 안전하게 배달되며, 마을은 더욱 활기찬 소통을 이어갈 수 있게 되었다.
Riverpod 우체국 물류 센터처럼, Riverpod 라이브러리는 우리가 애플리케이션에서 데이터를 효율적으로 관리하고, 원하는 곳에 정확히 전달할 수 있도록 돕는다. 각 섹션(Provider)과 관리자(Notifer)가 힘을 모아, 복잡한 데이터 흐름을 쉽고 효율적으로 처리할 수 있게 한다.
섹션(Provider)의 역할
- 일반 우편 섹션 (Provider):
- 역할: 일반적인 편지나 작은 소포를 처리한다.
- 특징: 일상적으로 많이 오가는 우편물을 신속하게 분류하고 전달한다.
- 특급 우편 섹션 (FutureProvider):
- 역할: 긴급하게 배송해야 하는 소포를 담당한다.
- 특징: 빠른 배송이 필요한 소포를 우선 처리하며, 미래의 일정에 맞춰 정확한 배송 시간을 예측한다.
- 국제 우편 섹션 (StreamProvider):
- 역할: 해외로 보내는 소포와 편지를 관리한다.
- 특징: 국제 배송의 특성상 지속적인 추적이 필요하므로, 실시간으로 소포의 위치와 상태를 업데이트한다.
- 특별 관리 섹션 (StateNotifierProvider):
- 역할: 깨지기 쉬운 물품이나 고가의 상품처럼 특별한 처리가 필요한 소포를 관리한다.
- 특징: 소포의 상태 변화에 따라 즉각적인 대응을 하며, 세심한 관리가 요구된다.
창고 관리자(Notifier)의 역할
각 섹션에는 해당 업무를 총괄하는 창고 관리자(Notifier)가 배치되었다. 이들은 섹션 내의 모든 소포와 편지를 효율적으로 관리하고, 필요에 따라 상태를 업데이트한다.
- StateNotifier:
- 역할: 소포의 상태(예: '분류 중', '배송 중', '배송 완료')를 관리하고 변경한다.
- 특징: 소포의 상태 변화가 있을 때마다 정확하게 기록하고, 다음 단계로의 처리를 준비한다.
- ChangeNotifier:
- 역할: 변경 사항이 발생하면 관련된 모든 부서나 직원들에게 즉시 알린다.
- 특징: 정보의 실시간 공유를 통해 업무 효율성을 높인다.
소포 전달자(Consumer)의 역할
소포가 섹션 내에서만 관리되어서는 고객에게 전달될 수 없다. 이때 등장하는 것이 바로 소포 전달자(Consumer 위젯)이다. 이들은 창고 관리자에게서 소포를 받아 최종 목적지인 고객에게 전달한다.
- ConsumerWidget:
- 역할: 특정 섹션의 소포를 받아와서 고객에게 전달하거나, 소포의 상태를 고객에게 알려준다.
- 특징: 고객과 직접 소통하며, 필요한 정보를 제공하고 서비스를 수행한다.
- WidgetRef:
- 역할: 소포 전달자가 창고 관리자와 원활하게 소통할 수 있도록 돕는 통로이다.
- 특징: 필요한 정보를 정확하고 빠르게 받아올 수 있도록 연결해 준다.
의존성 주입(Dependency Injection)의 이해
어느 날, 국제 우편 섹션에서 긴급한 소포를 처리해야 하는 상황이 발생했다. 이 소포는 해외로 보내져야 하지만, 동시에 빠른 배송이 필요했다. 국제 우편 섹션은 특급 우편 섹션의 지원이 필요했다. 이처럼 의존성 주입(Dependency Injection)을 통해 섹션 간에 필요한 자원을 공유하고 협력할 수 있었다. Provider를 통해 다른 섹션의 기능이나 자원을 가져와 업무를 효율적으로 수행했다.
Riverpod 주요 개념 정리
- Provider: 애플리케이션에서 데이터를 제공하는 역할을 한다.
- Notifier: 상태 관리 로직을 캡슐화하는 객체로, 상태 변경을 담당한다.
- Consumer 위젯: Provider에서 제공하는 데이터를 UI에 표시하거나 사용하는 역할을 한다.
- WidgetRef: Consumer 위젯이 Provider나 Notifier와 소통하기 위한 통로이다.
- 의존성 주입: Provider 간의 의존성을 설정하여 다른 Provider의 데이터를 가져올 수 있다.
Riverpod에서의 상태 관리 흐름
- Provider 정의: 필요한 객체나 상태를 제공하기 위해 Provider를 정의한다.
- ViewModel 정의: StateNotifier를 상속하여 상태와 상태 변경 로직을 구현한다.
- Provider를 통해 ViewModel 노출: StateNotifierProvider 등을 사용하여 ViewModel을 Provider로 감싼다.
- View에서 Provider를 통해 상태 접근: ref.watch 등을 사용하여 ViewModel의 상태를 구독하고, UI를 업데이트한다.
'Flutter' 카테고리의 다른 글
riverpod 과 MVVM 활용 - Http 통신 클라이언트 Dio 객체를 만들어 보자(2) (0) | 2024.11.19 |
---|---|
riverpod 과 MVVM 활용 - 플러터 프로젝트 생성(1) (0) | 2024.11.19 |
당근 마켓 만들어 보기 (2) | 2024.11.19 |
MVVM 패턴과 상태 관리 (0) | 2024.11.15 |
플러터 기본기 다지기 - 4 (Flutter의 위젯과 Element 트리 그리고 Key) (1) | 2024.11.15 |