[flutter] 플러터 Riverpod와 데이터베이스 연동 방법

목차

소개

플러터(Flutter)는 구글에서 개발한 모바일 앱 개발 프레임워크로서, 단일 코드베이스로 안드로이드와 iOS 앱을 동시에 개발할 수 있도록 지원합니다. Riverpod는 플러터의 상태 관리 라이브러리 중 하나인 Provider의 새로운 버전으로, 의존성 주입(Dependency Injection)과 상태 관리를 간편하게 할 수 있게 해줍니다.

이번 블로그 포스트에서는 Riverpod와 데이터베이스를 연동하는 방법에 대해 알아보겠습니다.

Riverpod란?

Riverpod는 플러터의 상태 관리를 위한 라이브러리로, Provider 패키지의 업그레이드 버전입니다. Riverpod를 사용하면 간단한 코드로 상태 관리와 의존성 주입을 수행할 수 있습니다. Riverpod는 변화하는 상태를 관리하기 위한 StateProvider와 같은 프로바이더들을 제공하여 앱의 상태를 관리합니다.

데이터베이스 연동

플러터 앱에서 데이터베이스 연동은 일반적으로 SQLite 또는 Firebase와 같은 외부 데이터베이스를 사용하는 방식으로 이루어집니다. Riverpod와 데이터베이스를 연동하려면 다음 단계를 따르면 됩니다:

  1. 데이터베이스 패키지를 추가합니다. (예: sqflite, firebase_core)
  2. Provider를 사용하여 데이터베이스 인스턴스를 생성하고 초기화합니다.
  3. Provider를 사용하여 데이터베이스 인스턴스에 접근하고 데이터를 읽거나 쓰는 작업을 수행합니다.

예제 코드

아래는 Riverpod와 SQLite 데이터베이스를 연동하는 간단한 예제 코드입니다.

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

final databaseProvider = FutureProvider<Database>((ref) async {
  final database = await openDatabase(
    'path_to_database.db',
    version: 1,
    onCreate: (db, version) {
      // 테이블 생성 등 필요한 초기화 작업 수행
    },
  );
  
  return database;
});

final todosProvider = StreamProvider<List<Todo>>((ref) {
  final database = ref.watch(databaseProvider).data?.value;
  final todoStream = database?.todoDao.watchAllTodos() ?? const Stream.empty();
  
  return todoStream;
});

class TodoDao {
  final Database database;
  
  TodoDao(this.database);
  
  Stream<List<Todo>> watchAllTodos() {
    return database.watch("todos").map((rows) => rows.map((row) => Todo.fromDatabase(row)).toList());
  }
  
  Future<void> insert(Todo todo) async {
    await database.insert("todos", todo.toDatabase(), conflictAlgorithm: ConflictAlgorithm.replace);
  }
}

class Todo {
  final int id;
  final String title;
  
  Todo({required this.id, required this.title});
  
  Map<String, dynamic> toDatabase() {
    return {
      "id": id,
      "title": title,
    };
  }
  
  factory Todo.fromDatabase(Map<String, dynamic> row) {
    return Todo(
      id: row["id"],
      title: row["title"],
    );
  }
}

위 예제 코드에서는 databaseProvider를 통해 데이터베이스 인스턴스를 생성하고, todosProvider를 통해 Todo 모델의 리스트를 데이터베이스에서 읽어옵니다.

참고 자료