Article

Drift를 이용한 Flutter 로컬 데이터베이스 구축

Drift 소개

Drift는 Dart와 Flutter 애플리케이션에서 SQLite를 ORM으로 사용할 수 있게 해주는 강력한 반응형 데이터베이스 라이브러리입니다. 타입 안전성을 제공하면서도 직관적인 API로 데이터베이스 작업을 단순화합니다.

자세한 정보는 Drift 공식 문서를 참조하세요.

설치

flutter pub add drift
flutter pub add sqlite3_flutter_libs
flutter pub add path_provider
flutter pub add path

flutter pub add --dev drift_dev
flutter pub add --dev build_runner

Todo 테이블 정의

Drift에서 테이블을 정의하려면 Table 클래스를 상속받아야 합니다.

import 'package:drift/drift.dart';

class Todo extends Table {
  IntColumn get id => integer().autoIncrement()();
  TextColumn get title => text()();
  TextColumn get context => text().nullable()();
  TextColumn get status => text()();
}

데이터베이스 헬퍼 클래스 작성

데이터베이스 연결을 관리하는 헬퍼 클래스를 생성합니다 (db_helper.dart).

import 'dart:io';

import 'package:drift/drift.dart';
import 'package:drift/native.dart';
import 'package:path/path.dart' as p;
import 'package:path_provider/path_provider.dart';

part 'db_helper.g.dart';

(tables: [Todo])
class DbHelper extends _$DbHelper {
  DbHelper() : super(_openConnection());

  
  int get schemaVersion => 1;
}

LazyDatabase _openConnection() {
  return LazyDatabase(() async {
    final dbFolder = await getApplicationDocumentsDirectory();
    final file = File(p.join(dbFolder.path, 'todo.sqlite'));
    return NativeDatabase.createInBackground(file);
  });
}

빌드

자동 코드 생성을 위해 build_runner를 실행합니다.

flutter pub run build_runner build

기능 구현

CRUD 작업을 구현합니다. 데이터베이스 헬퍼 클래스에 다음 메서드들을 추가합니다.

(tables: [Todo])
class DbHelper extends _$DbHelper {
  // 데이터 추가
  Future<int> addTodo(TodoData todoData) {
    return into(todos).insert(todoData);
  }

  // 모든 데이터 조회
  Future<List<TodoData>> findAll() {
    return select(todos).get();
  }

  // 데이터베이스 초기화
  Future resetDB() {
    return delete(todos).go();
  }

  // 특정 데이터 조회
  Future<TodoData?> find(TodoData todoData) {
    return (select(todos)..where((t) => t.id.equals(todoData.id)))
        .getSingleOrNull();
  }
}

핵심 요약

Drift는 Flutter 애플리케이션에서 로컬 데이터베이스를 효과적으로 관리할 수 있는 강력한 도구입니다. 타입 안전성, 반응형 스트림, 자동 코드 생성 등의 기능으로 복잡한 데이터 관리도 간단하게 처리할 수 있습니다.

댓글