Flutter 프로젝트에 Riverpod 2.0 도입 후기
배경
사내 Flutter 앱이 규모가 커지면서 Provider 패턴의 한계를 느꼈다. 특히 BuildContext 의존성과 런타임 에러가 문제였다. Riverpod 2.0이 안정화되면서 마이그레이션을 결정했다.
주요 변경점
1. ProviderScope 래핑
void main() {
runApp(
ProviderScope(
child: MyApp(),
),
);
}
2. StateNotifier → StateNotifierProvider
기존 ChangeNotifier 방식에서 불변 상태 관리로 전환했다.
final counterProvider = StateNotifierProvider<CounterNotifier, int>((ref) {
return CounterNotifier();
});
class CounterNotifier extends StateNotifier<int> {
CounterNotifier() : super(0);
void increment() => state++;
}
3. ConsumerWidget 활용
StatefulWidget을 제거하고 ConsumerWidget으로 통일했다.
class CounterView extends ConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
final count = ref.watch(counterProvider);
return Text('$count');
}
}
개선된 점
- 컴파일 타임 안정성: Provider 접근 오류를 빌드 전에 발견
- 테스트 용이성: ProviderContainer로 독립적인 테스트 환경 구성
- Context 독립: BuildContext 없이도 Provider 접근 가능
아쉬운 점
보일러플레이트가 여전히 많다. freezed와 함께 사용하면 코드량이 늘어나는 건 감수해야 했다. 팀원들의 학습 곡선도 예상보다 가팔랐다.
결론
중대형 프로젝트라면 충분히 도입 가치가 있다고 판단했다. 초기 러닝커브만 넘으면 유지보수성이 확실히 개선된다.