이번 학습에서는 Flutter에서 사용되는 다양한 상태 관리(State Management) 방식들을 비교하며, 특히 Riverpod의 개념과 특징을 중심으로 정리했다. 각 방식의 구조적 차이와 장단점을 이해함으로써, 프로젝트의 규모와 목적에 따라 적절한 방법을 선택할 수 있도록 하는 것이 목표였다.
1. Riverpod의 개념
Riverpod은 Flutter의 대표적인 상태 관리 라이브러리 중 하나로, 기존 Provider의 단점을 개선한 진화된 형태이다. BuildContext에 의존하지 않으며, 전역적으로 상태를 읽고 관리할 수 있다. 컴파일 타임에 오류를 잡아주기 때문에 타입 안정성이 높고, 테스트와 유지보수가 용이하다.
주요 특징
- BuildContext 의존 없음
- 컴파일 타임 안정성
- Hot Reload 안정적 지원
- Provider 간 의존성 관리 가능
- 비동기 데이터(Future, Stream) 관리 지원
2. Riverpod 기본 구조
final counterProvider = StateProvider<int>((ref) => 0);
class CounterPage extends ConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
final count = ref.watch(counterProvider);
return Scaffold(
body: Center(child: Text('현재 값: $count')),
floatingActionButton: FloatingActionButton(
onPressed: () => ref.read(counterProvider.notifier).state++,
),
);
}
}
- ProviderScope: 앱 전체에 Provider를 적용하는 루트 위젯
- ConsumerWidget: Provider 값을 구독하여 UI를 업데이트
- ref.watch(): 상태 구독 및 UI 갱신
- ref.read(): 상태 읽기 (UI 갱신 없음)
3. 다른 상태 관리 방식 비교
(1) setState (기본 내장)
- Flutter에서 가장 기본적인 상태 관리 방식
- setState()로 간단히 UI를 갱신할 수 있으나, 규모가 커지면 유지보수 어려움
장점: 단순하고 빠른 구현
단점: 상태 공유 불편, 구조화 어려움
적합한 경우: 작은 규모 앱, 간단한 화면 상태
(2) Provider
- Flutter 공식 팀이 만든 기본적인 상태 관리 패턴
- ChangeNotifier 기반으로 작동하며, context를 통해 상태를 전달함
장점: 구조가 명확하고 공식 문서가 풍부
단점: BuildContext 의존성, 대규모 프로젝트에 부적합
적합한 경우: 중간 규모 앱
(3) Bloc / Cubit
- Stream 기반의 구조적인 상태 관리 패턴
- Business Logic을 명확히 분리할 수 있음
장점: 명확한 데이터 흐름, 테스트 용이
단점: 초기 설정 복잡, 코드량 많음
적합한 경우: 대형 앱, 팀 프로젝트
(4) GetX
- 가장 간단하고 직관적인 상태 관리 방식 중 하나
- 라우팅, DI, 상태관리를 한 번에 지원함
장점: 코드 간결, 빠른 개발
단점: 구조가 자유로워 관리 어려움 ui 라우팅 등등 패키지 하나에 많은 게 들어있어 무겁
적합한 경우: 개인 프로젝트, 프로토타입
(5) MobX
- React의 MobX에서 영향을 받은 반응형 상태 관리
- @observable, @action 등을 활용한 선언형 코드
장점: 반응형 구조, 직관적인 코드
단점: build_runner 필요, 초기 설정 번거로움
적합한 경우: 중간 규모 앱, 반응형 UI 중심 앱
(6) Redux
- 모든 상태를 중앙 Store에서 관리하는 구조
- 명확한 상태 흐름과 추적이 가능하지만, 보일러플레이트가 많음
장점: 상태 추적 용이, 디버깅에 강함
단점: 코드량 많고 복잡도 높음
적합한 경우: 대규모 협업 프로젝트
5. 배운 점
Riverpod은 기존 Provider의 구조를 개선한 현대적인 상태 관리 방식으로, 유연성과 타입 안정성이 강점이다. 각 상태 관리 방식은 프로젝트 규모와 협업 형태에 따라 선택이 달라지며, 작은 앱은 setState, 중형은 Provider나 GetX, 대형은 Riverpod이나 Bloc이 적합하다. 앞으로는 Riverpod을 활용해 쇼핑몰 플랫폼 프로젝트의 상품 관리 및 UI 상태를 효율적으로 제어하는 연습을 진행할 예정이다.