본문 바로가기
카테고리 없음

Flutter 상태 관리 (Provider, Riverpod, Bloc)

by lifechecking 2025. 3. 8.
반응형

flutter 상태 관리

 

Flutter에서 상태 관리는 효율적인 애플리케이션 개발을 위해 필수적인 개념입니다. 특히, 규모가 커질수록 적절한 상태 관리 방법을 선택하는 것이 중요합니다. 대표적인 상태 관리 방법으로는 Provider, Riverpod, Bloc이 있으며, 각각의 장점과 단점이 존재합니다. 이 글에서는 세 가지 방법을 비교 분석하여 어떤 상황에서 어떤 상태 관리 방식을 선택해야 할지 정리해 보겠습니다.

1. 상태 관리란 무엇인가?

Flutter에서 상태(state)란 UI가 변경될 때 필요한 데이터를 의미합니다. 예를 들어, 사용자가 버튼을 클릭하면 버튼 색상이 바뀌는 경우, "버튼 색상"이 상태가 됩니다. 상태 관리는 앱의 데이터 흐름을 체계적으로 관리하는 기법입니다. 작은 프로젝트에서는 별다른 상태 관리가 필요 없을 수 있지만, 규모가 커질수록 체계적인 상태 관리가 필요합니다. 대규모 프로젝트에서는 상호 연관된 상태들이 무수히 존재하기 때문에 상태를 어떻게 관리하느냐가 앱의 완성도에 많은 영향을 미치기 때문입니다.

 

Flutter에서는 상태를 크게 로컬 상태(Local State)와 글로벌 상태(Global State)로 구분합니다.

  • 로컬 상태: 특정 위젯 내에서만 관리되는 상태입니다. (ex: setState())
  • 글로벌 상태: 앱 전체에서 공유되는 상태입니다. (ex: Provider, Riverpod, Bloc)

이제 Flutter에서 가장 많이 사용되는 Provider, Riverpod, Bloc 상태 관리 방법을 자세히 살펴보겠습니다.

2. Provider: 가장 기본적인 상태 관리 방법

Provider란?

Provider는 Flutter 공식 패키지로, 가장 많이 사용되는 상태 관리 방법 중 하나입니다. Google에서 지원하며, 간단한 구조와 직관적인 사용법 덕분에 많은 개발자들이 사용하고 있습니다.

 

Provider의 장점

  • ✅ Flutter 팀에서 공식 지원하는 패키지입니다.
  • ✅ 코드가 간결하고 배우기 쉽습니다.
  • ✅ 기존 InheritedWidget을 기반으로 하여 성능을 최적화시킵니다.
  • ✅ 다양한 상태 관리 방식(ChangeNotifier, StreamProvider 등)을 지원합니다.

Provider의 단점

  • ❌ 프로젝트가 커지면 상태 관리 코드가 복잡해질 수 있습니다.
  • ❌ 의존성 주입(Dependency Injection)에 대한 추가적인 학습이 필요합니다.
  • ❌ 상태 변경 시 UI 리렌더링 최적화가 필요합니다.

Provider 코드 예제

class CounterProvider with ChangeNotifier {
  int _count = 0;
  int get count => _count;

  void increment() {
    _count++;
    notifyListeners();
  }
}

3. Riverpod: Provider의 개선된 버전

Riverpod이란?

RiverpodProvider의 단점을 보완하기 위해 개발된 패키지입니다. 코드가 더욱 직관적이며, 테스트를 쉽게 할 수 있도록 설계되었습니다.

 

Riverpod의 장점

  • Provider보다 더 안전하고 유지보수가 쉽습니다.
  • Global State를 쉽게 관리할 수 있습니다.
  • ref.watch, ref.read 등을 통해 상태 접근이 직관적입니다.
  • FutureProvider, StateProvider 등 다양한 Provider 지원이 가능합니다.

Riverpod 코드 예제

final counterProvider = StateProvider((ref) => 0);

class CounterScreen extends ConsumerWidget {
  @override
  Widget build(BuildContext context, WidgetRef ref) {
    final count = ref.watch(counterProvider);
    return Text('$count');
  }
}

4. Bloc: 대규모 프로젝트에 적합한 상태 관리

Bloc이란?

Bloc (Business Logic Component)은 Flutter에서 가장 강력한 상태 관리 방법 중 하나로, 이벤트(Event) 기반의 상태 관리를 제공합니다. 대규모 프로젝트에서 코드의 유지보수성과 확장성을 높이는 데 유용합니다.

 

Bloc의 장점

  • ✅ 상태 변경 로직을 명확하게 분리하여 유지보수에 용이합니다.
  • ✅ 이벤트 기반 방식으로 예측 가능한 상태 관리가 가능합니다.
  • ✅ 테스트가 쉽고, 대규모 프로젝트에 적합합니다.

Bloc 코드 예제

class CounterBloc extends Bloc<CounterEvent, int> {
  CounterBloc() : super(0) {
    on((event, emit) => emit(state + 1));
  }
}

5. Provider, Riverpod, Bloc 비교 분석

  Provider Riverpod Bloc
난이도 쉬움 중간 어려움
사용 사례 중소 규모 앱 중간 규모 앱 대규모 앱
성능 최적화 기본적 우수 매우 우수
코드 복잡도 낮음 중간 높음
Google 공식 지원

 

결론: 어떤 상태 관리 방식을 선택해야 할까?

 

상태 관리 방식은 프로젝트의 규모와 복잡도에 따라 선택하는 것이 중요합니다.

  • 간단한 프로젝트라면 Provider 사용을 추천합니다.
  • 유지보수와 확장성을 고려한다면 Riverpod를 추천합니다.
  • 대규모 프로젝트라면 Bloc이 가장 적합합니다.

Flutter에서 적절한 상태 관리 방식을 선택하여 더 효율적인 개발을 진행해 보세요!

반응형