11강: 실제 프로젝트에서 다양한 상태 관리 도구 적용하기

11강: 실제 프로젝트에서 다양한 상태 관리 도구 적용하기


이번 강의에서는 실제 프로젝트에서 Provider, Bloc, Riverpod과 같은 다양한 상태 관리 도구를 어떻게 적용할 수 있는지에 대해 다뤄볼 거야. 앞서 우리가 배운 이 세 가지 도구들은 각기 다른 장점과 특징을 가지고 있어. 따라서, 실제 애플리케이션에서 어떻게 함께 사용할 수 있는지, 그리고 특정 상황에서 어떤 도구를 적용하는 것이 좋은지 실전 예제를 통해 알아보자.


프로젝트 개요: Todo 관리 앱 만들기

이번 예제에서는 Todo 관리 앱을 만들어 볼 거야. 이 앱에서는 다음과 같은 기능을 포함하고 있어:

  • 할 일 추가삭제 기능
  • 할 일의 상태 업데이트 (완료 여부)
  • 다양한 상태 관리 도구를 사용하여 기능 구현

우리는 각 상태 관리 도구를 어떤 역할에 사용해야 하는지 고민하면서 앱을 만들어 볼 거야.


Provider로 간단한 UI 상태 관리하기

우선, 앱의 간단한 UI 상태(예: 테마, 사용자 설정 등)는 Provider로 관리할 거야. Provider는 설정이 간단하고 사용하기 쉬워서, 복잡하지 않은 UI 요소의 상태 관리에 적합해.

ThemeProvider 예제:

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

class ThemeProvider with ChangeNotifier {
  bool _isDarkMode = false;

  bool get isDarkMode => _isDarkMode;

  void toggleTheme() {
    _isDarkMode = !_isDarkMode;
    notifyListeners();
  }
}

ThemeProvider를 통해 앱의 테마를 다크 모드와 라이트 모드로 전환할 수 있어. 이러한 간단한 UI 상태는 Provider로 관리하는 것이 적합해.


Bloc을 이용한 비즈니스 로직 분리

다음으로, 앱의 주요 비즈니스 로직은 Bloc 패턴을 사용하여 구현할 거야. Bloc은 비즈니스 로직UI를 명확히 분리하는 데 적합하므로, 복잡한 상태나 이벤트 흐름을 관리하는 데 매우 유용해.

TodoBloc 예제:

import 'package:flutter_bloc/flutter_bloc.dart';

class TodoEvent {}
class AddTodo extends TodoEvent {
  final String title;
  AddTodo(this.title);
}

class TodoState {
  final List<String> todos;
  TodoState(this.todos);
}

class TodoBloc extends Bloc<TodoEvent, TodoState> {
  TodoBloc() : super(TodoState([]));

  @override
  Stream<TodoState> mapEventToState(TodoEvent event) async* {
    if (event is AddTodo) {
      final updatedTodos = List<String>.from(state.todos)..add(event.title);
      yield TodoState(updatedTodos);
    }
  }
}

여기서 Bloc은 Todo 추가와 같은 주요 비즈니스 로직을 처리하고 있어. 이벤트 기반으로 상태를 관리하기 때문에, Todo 목록의 상태를 명확하게 업데이트할 수 있어.


Riverpod으로 전역 상태 관리하기

마지막으로, 앱의 전역적인 상태Riverpod으로 관리해 볼 거야. Riverpod은 안전한 타입 관리와 유연성을 제공하기 때문에, 앱 전반에서 참조해야 하는 상태에 적합해.

TodoFilter 예제:

import 'package:flutter_riverpod/flutter_riverpod.dart';

final todoFilterProvider = StateProvider<String>((ref) => 'All');

여기서 todoFilterProvider는 사용자가 보고자 하는 Todo 목록의 필터(예: ‘All’, ‘Completed’, ‘Pending’)를 관리해. Riverpod을 사용하면 전역 상태를 안전하게 관리하고, 코드의 가독성을 높일 수 있어.


프로젝트 구조 정리

이번 프로젝트에서 상태 관리 도구를 어떻게 적용했는지 정리해 보자:

  • Provider: UI의 간단한 상태, 테마 변경 등.
  • Bloc: 주요 비즈니스 로직, 이벤트 처리와 관련된 상태 관리.
  • Riverpod: 전역 상태 관리, 필터와 같은 앱 전반에서 사용되는 상태.

이러한 구조는 각각의 도구의 강점을 잘 활용해 앱의 유지보수성과 확장성을 높여줘. 특히 큰 규모의 애플리케이션에서는 이러한 구조를 통해 코드의 복잡도를 줄이고, 명확한 상태 흐름을 유지할 수 있어.


상태 관리 도구의 조합 활용

Flutter에서는 특정 상태 관리 도구만 고집할 필요는 없어. 이번 강의에서 보여준 것처럼, 프로젝트의 특성과 요구 사항에 따라 Provider, Bloc, Riverpod을 조합해서 사용할 수 있어. 이를 통해 각 도구의 장점을 최대한 살리고, 단점을 보완하는 방식으로 개발할 수 있지.

예를 들어, 간단한 UI 상태는 Provider로 관리하면서 복잡한 로직은 Bloc으로 처리하고, 앱 전반에서 사용하는 상태는 Riverpod으로 관리함으로써, 프로젝트의 구조를 더 견고하고 체계적으로 만들 수 있어.


마무리

이번 강의에서는 실제 프로젝트에서 Provider, Bloc, Riverpod을 어떻게 적절히 조합하여 사용할 수 있는지 알아봤어. 각각의 상태 관리 도구가 적합한 역할을 맡아서 사용되었고, 이를 통해 코드의 유지보수성과 효율성을 높이는 방법을 배웠지. 다음 강의에서는 이 상태 관리 도구들을 활용하여 더욱 복잡한 앱을 구현해 보고, 실제로 앱을 최적화하는 방법에 대해 다뤄볼 거야. 계속해서 함께 Flutter의 가능성을 탐구해 나가자!