728x90
반응형
Flutter를 어느 정도 다루게 되면 필연적으로 부딪히는 고민이 있다.
“상태 관리를 어떤 방식으로 할까?”
위젯에서 직접 상태를 다루는 건 처음엔 괜찮지만, 앱이 커질수록 복잡함은 폭발한다.
이 글에서는 가장 널리 쓰이는 Provider, Riverpod, Bloc의 철학과 사용 예시, 장단점을 비교하여
어떤 상황에서 어떤 도구를 선택하면 좋을지 이야기해보려 한다.
🔹 Provider — 간단하고 직관적인 상태 관리
Provider는 Flutter 팀이 공식적으로 권장하는 방식으로, InheritedWidget의 복잡함을 감쌌다.ChangeNotifier
를 기반으로 상태를 관찰하고 UI를 업데이트할 수 있다.
class Counter extends ChangeNotifier {
int count = 0;
void increment() {
count++;
notifyListeners();
}
}
장점:
- 학습 난이도 낮음
- 공식 문서와 튜토리얼이 많음
단점:
- 대형 앱에서 구조화가 어려울 수 있음
- 의존성 주입/테스트 코드 작성이 번거로움
🔸 Riverpod — Provider의 발전형
Riverpod은 Provider의 창시자인 Remi Rousselet가 만든 상태 관리 프레임워크로, 단점들을 보완한다.
글로벌 접근 가능, Null safety 완전 지원, 테스트 용이성이 강점이다.
final counterProvider = StateProvider((ref) => 0);
class CounterWidget extends ConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
final count = ref.watch(counterProvider);
return Text('$count');
}
}
장점:
- 불변성 기반의 예측 가능한 상태 관리
- 글로벌 상태 접근 가능
- 의존성 주입/테스트 용이
단점:
- 초심자에게 다소 생소할 수 있음
- Provider보다 설정이 많음
🟠 Bloc — 선언적이고 구조적인 상태 관리
Bloc은 이벤트-상태 패턴(Event-State Pattern)을 따르는 구조적 상태 관리 방식이다.
기능이 명확하게 분리되며, 팀 프로젝트나 대규모 앱에 적합하다.
class CounterBloc extends Bloc<CounterEvent, int> {
CounterBloc() : super(0) {
on<IncrementEvent>((event, emit) => emit(state + 1));
}
}
장점:
- 로직과 UI 분리가 뛰어남
- 테스트에 매우 강함
단점:
- 코드 양이 많고 진입장벽이 있음
- 작은 앱에는 과할 수 있음
🔍 어떤 상태 관리 도구를 선택할까?
상황 | 추천 도구 |
---|---|
간단한 앱 | Provider |
중형 앱, 글로벌 상태, 테스트 용이성 | Riverpod |
대형 앱, 팀 프로젝트, 복잡한 상태 | Bloc |
각자의 프로젝트 성격에 따라 선택이 달라질 수 있다.
중요한 것은 하나의 패턴을 '마스터'하는 것이다.
🧘 마무리하며
Flutter에서 상태 관리는 앱 구조의 근간이 된다.
Provider, Riverpod, Bloc 각각의 장단점을 이해하고 상황에 맞게 선택할 수 있다면, 당신의 앱은 한층 더 견고해질 것이다.
✍️ 이 글은 터미널 밖으로 나온 개발자의 Flutter 심화과정입니다.
728x90
반응형
'Flutter' 카테고리의 다른 글
애니메이션을 더 깊게 — AnimatedBuilder부터 Tween까지 완전 정복 (0) | 2025.05.23 |
---|---|
Flutter에서 Custom Widget 제대로 만들기 — 재사용 가능한 컴포넌트 설계 (0) | 2025.05.23 |
Flutter와 네이티브의 연결고리 — Platform Channel 실전 입문 (2) | 2025.05.22 |
CustomPainter 완전 정복 — Flutter에서 나만의 캔버스를 그려보자 (0) | 2025.05.22 |
Flutter에서 HTTP로 서버 데이터 불러오기 — 작은 연결이 만들어내는 큰 변화 (0) | 2025.05.19 |