[flutter] 플러터 Riverpod와 데이터베이스 연동 방법
목차
소개
플러터(Flutter)는 구글에서 개발한 모바일 앱 개발 프레임워크로서, 단일 코드베이스로 안드로이드와 iOS 앱을 동시에 개발할 수 있도록 지원합니다. Riverpod는 플러터의 상태 관리 라이브러리 중 하나인 Provider의 새로운 버전으로, 의존성 주입(Dependency Injection)과 상태 관리를 간편하게 할 수 있게 해줍니다.
이번 블로그 포스트에서는 Riverpod와 데이터베이스를 연동하는 방법에 대해 알아보겠습니다.
Riverpod란?
Riverpod는 플러터의 상태 관리를 위한 라이브러리로, Provider 패키지의 업그레이드 버전입니다. Riverpod를 사용하면 간단한 코드로 상태 관리와 의존성 주입을 수행할 수 있습니다. Riverpod는 변화하는 상태를 관리하기 위한 StateProvider
와 같은 프로바이더들을 제공하여 앱의 상태를 관리합니다.
데이터베이스 연동
플러터 앱에서 데이터베이스 연동은 일반적으로 SQLite 또는 Firebase와 같은 외부 데이터베이스를 사용하는 방식으로 이루어집니다. Riverpod와 데이터베이스를 연동하려면 다음 단계를 따르면 됩니다:
- 데이터베이스 패키지를 추가합니다. (예:
sqflite
,firebase_core
) - Provider를 사용하여 데이터베이스 인스턴스를 생성하고 초기화합니다.
- 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
모델의 리스트를 데이터베이스에서 읽어옵니다.