[flutter] 플러터에서의 bloc 패턴으로 로컬 데이터베이스 사용하기

플러터(Flutter) 앱을 개발하는 동안 데이터 관리와 저장에 대한 고려가 중요합니다. 이를 위해 Bloc(State Management) 패턴을 사용하여 로컬 데이터베이스에 데이터를 저장하고 관리하는 것이 좋은 방법입니다.

이 포스트에서는 플러터 앱에서 Bloc 패턴을 이용하여 로컬 데이터베이스를 사용하는 방법에 대해 알아보겠습니다.

Bloc 패턴 소개

Bloc 패턴은 플러터 앱에서 상태 관리를 효율적으로 처리하기 위한 패턴으로, 비즈니스 로직과 사용자 인터페이스를 분리하여 관리합니다.

Bloc 패턴은 크게 이벤트상태로 구성됩니다. 이벤트는 사용자 액션 또는 요청을 나타내고, 상태는 앱의 상태를 변화시킵니다.

로컬 데이터베이스 사용하기

로컬 데이터베이스는 앱 내에서 사용되는 데이터를 영구적으로 보관하고 관리하기 위한 중요한 요소입니다. 플러터에서는 sqflite 패키지를 이용하여 로컬 데이터베이스를 쉽게 구성할 수 있습니다.

다음은 간단한 예제 코드로, 플러터 앱에서 Bloc 패턴과 sqflite 패키지를 이용하여 로컬 데이터베이스를 사용하는 방법을 보여줍니다.

import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:sqflite/sqflite.dart';

// 이벤트 정의
enum DataEvent { fetchData, saveData }

// 상태 정의
class DataState {
  final List<String> data;
  DataState(this.data);
}

// Bloc 정의
class DataBloc extends Bloc<DataEvent, DataState> {
  final Database database;

  DataBloc(this.database) : super(DataState([]));

  @override
  Stream<DataState> mapEventToState(DataEvent event) async* {
    if (event == DataEvent.fetchData) {
      // 데이터 가져오기 로직
      List<Map> result = await database.query('data_table');
      yield DataState(result.map((e) => e['value']).toList());
    } else if (event == DataEvent.saveData) {
      // 데이터 저장 로직
      await database.insert('data_table', {'value': 'some_data'});
      add(DataEvent.fetchData); // 저장 후 데이터 다시 가져오기
    }
  }
}

// 사용 예
void main() async {
  Database database = await openDatabase('app.db', version: 1, onCreate: (db, version) {
    db.execute('CREATE TABLE data_table (id INTEGER PRIMARY KEY, value TEXT)');
  });

  runApp(
    BlocProvider(
      create: (context) => DataBloc(database)..add(DataEvent.fetchData),
      child: MyApp(),
    ),
  );
}

결론

이번 포스트에서는 플러터에서의 Bloc 패턴과 로컬 데이터베이스 사용에 대해 알아보았습니다. Bloc 패턴을 통해 데이터를 효과적으로 관리하고, sqflite 패키지를 이용하여 로컬 데이터베이스를 쉽게 구성할 수 있음을 확인할 수 있었습니다. 이러한 방법들은 플러터 앱을 개발하는 과정에서 데이터 관리에 도움이 될 것입니다.