[Flutter] Riverpod vs Provider, Flutter 상태관리의 진화

📖 Riverpod 상태관리와 provider 상태관리의 차이
🏗️ BuildContext 의존성
🟡 Provider
- 상태를 읽으려면
Context.read 또는 Context.watch가 필요하다.
- 위젯 트리에 강하게 의존한다.
🟢 Riverpod
ref.read, ref.watch 사용한다.
BuildContext에 의존하지 않아 ViewModel, Service 등 위젯 밖 계층에서도 사용 가능하다.
📦 선언 및 구조
🟡 Provider
ChangeNotifierProvider, Provider 등을 위젯 트리에 직접 감싸서 등록해야 하며 선언 위치에 따라 접근 범위를 제한한다.
🟢 Riverpod
Provider를 전역 변수처럼 선언 가능하다.
- 앱 전체를
ProviderScope으로 한 번만 감싸면 돼서 MultiProvider가 불필요하다.
🔗 의존성 주입 & 조합
🟡 Provider
- 다른
Provider 참조가 복잡하다.
- 의존 관계 관리가 불편하다.
🟢 Riverpod
ref.watch(otherProvider)로 명시적 의존성을 선언한다.
- 참조
Provider 변경 시 자동 빌드 반영한다.
- 다양한
Provider 타입을 제공한다.
⚠️ 에러처리
🟡 Provider
🟢 Riverpod
- 컴파일 시점에서 오류 감지가 가능하여 안정성이 높아진다.
🗑️ 메모리 관리
🟡 Provider
- 자동
dispose 부족하여 개발자가 직접 메모리 해제 관리가 필요하다.
🟢 Riverpod
- 사용하지 않는
Provider를 dispose로 자동 해제 되어 메모리 누수가 감소된다.
🧪 테스트 용이성
🟡 Provider
- 반드시 위젯 트리에 감싸고 테스트를 해야 해서 번거롭다.
🟢 Riverpod
ProviderOverride 기능을 지원한다.
- 단위 테스트가 편리하다.
BuildContext 의존 없어 UI 없이 로직만 테스트 가능하다.
📊 규모 적합성
🟡 Provider
🟢 Riverpod
- 복잡한 상태 종속성 관리와 의존성 주입에 강점이다.
- 대규모 애플리케이션에 적합하다.