Flutter와 Drift로 SQLite 데이터베이스 연결

pharmDev·2024년 12월 18일

쉽게 풀이: class AppDatabase extends _$AppDatabase { AppDatabase() : super(_openConnection()); }

코드에서 이 부분이 하는 역할

class AppDatabase extends _$AppDatabase는 Flutter와 Drift를 사용하여 데이터베이스를 정의하고 초기화하는 부분입니다. 특히 이 구문은 데이터베이스를 생성하고 연결하는 과정을 담당합니다.


1. 클래스 구조 이해하기

class AppDatabase

  • AppDatabase는 앱에서 사용할 데이터베이스 클래스입니다.
  • 이 클래스는 Flutter에서 Drift를 사용해 데이터베이스 작업을 수행하기 위한 시작점입니다.

extends _$AppDatabase

  • Drift가 자동으로 생성한 _$AppDatabase를 확장합니다.
  • _$AppDatabase는 Drift가 테이블 정보와 관련된 모든 기능(테이블 생성, 데이터 읽기/쓰기 등)을 자동으로 정의한 클래스입니다.
  • 이를 통해 AppDatabase가 Drift가 제공하는 모든 데이터베이스 기능을 사용할 수 있습니다.

2. 생성자 이해하기: AppDatabase() : super(_openConnection());

생성자의 역할

  • AppDatabase()는 데이터베이스 객체를 생성할 때 호출됩니다.
  • : super(_openConnection()):
    • super는 부모 클래스의 생성자를 호출합니다.
    • 여기서 부모 클래스는 _$AppDatabase입니다.
    • _$AppDatabase는 데이터베이스 연결 객체(GeneratedDatabase)가 필요하며, 이는 _openConnection() 함수에서 반환됩니다.

_openConnection()의 역할

  • 데이터베이스 연결을 설정합니다.
  • 파일 시스템에서 데이터베이스 파일을 저장할 경로를 설정하고, SQLite를 통해 파일을 생성 및 초기화합니다.

3. _openConnection()가 어떻게 동작하나요?

_openConnection() 함수는 LazyDatabase를 반환하며, 이 함수가 데이터베이스 초기화를 처리합니다.

코드:

LazyDatabase _openConnection() {
  return LazyDatabase(() async {
    // 데이터베이스 파일 저장 위치 얻기
    final dbFolder = await getApplicationDocumentsDirectory();
    final file = File(p.join(dbFolder.path, 'db.sqlite'));

    // 안드로이드 호환성을 위해 설정
    if (Platform.isAndroid) {
      await applyWorkaroundToOpenSqlite3OnOldAndroidVersions();
    }

    // SQLite 임시 디렉토리 설정
    final cachebase = await getTemporaryDirectory();
    sqlite3.tempDirectory = cachebase.path;

    // NativeDatabase 생성 및 반환
    return NativeDatabase.createInBackground(file);
  });
}

주요 흐름:

  1. 경로 설정:

    • getApplicationDocumentsDirectory()로 데이터베이스 파일을 저장할 앱 디렉토리를 가져옵니다.
    • p.join으로 디렉토리 경로와 파일 이름을 결합하여 운영체제에 상관없이 적절한 경로를 생성합니다.
      • 윈도우: C:\\Users\\flutter\\db.sqlite
      • 유닉스/맥OS: /Users/flutter/db.sqlite
  2. 안드로이드 호환성:

    • 오래된 안드로이드 버전에서 SQLite 사용 문제를 해결하기 위해 applyWorkaroundToOpenSqlite3OnOldAndroidVersions()을 호출합니다.
  3. SQLite 임시 디렉토리 설정:

    • SQLite가 사용할 임시 디렉토리를 명시적으로 설정합니다.
  4. 데이터베이스 초기화:

    • NativeDatabase.createInBackground(file)를 호출하여 데이터베이스를 비동기로 생성합니다.

4. 전체 동작 흐름

  1. AppDatabase 객체 생성:

    final db = AppDatabase();
    • AppDatabase 생성자가 호출됩니다.
    • 이 생성자에서 부모 클래스(_$AppDatabase)의 생성자를 호출합니다.
  2. 부모 클래스의 생성자 호출:

    • super(_openConnection())를 통해 _openConnection() 함수가 실행됩니다.
  3. 데이터베이스 연결 설정:

    • _openConnection() 함수에서 데이터베이스 파일의 경로를 생성하고, SQLite 데이터베이스를 초기화하여 Drift에 전달합니다.
  4. 자동 생성된 Drift 기능 사용:

    • _$AppDatabasedrift.g.dart에서 자동 생성된 데이터베이스 클래스입니다. 이 클래스는 정의된 테이블과 데이터 읽기/쓰기 메서드를 제공합니다.
    • 예:
      await db.into(db.scheduleTable).insert(ScheduleTableCompanion(
        name: Value('My Task'),
        date: Value(DateTime.now()),
      ));

Flutter와 Drift를 처음 사용하는 개발자를 위한 비유

  1. AppDatabase는 데이터베이스 연결의 "설계도"입니다.

    • 이 클래스가 데이터베이스를 생성하고, 사용할 준비를 합니다.
  2. _$AppDatabase는 Drift가 자동으로 만들어준 "엔진"입니다.

    • 테이블과 데이터베이스 작업(데이터 추가, 수정, 삭제 등)을 처리합니다.
  3. _openConnection()는 데이터베이스를 연결하는 "키"입니다.

    • 데이터베이스 파일을 열고, SQLite와 Drift가 협력할 수 있도록 설정합니다.

최종 요약

class AppDatabase extends _$AppDatabase {
  // 데이터베이스 생성자
  AppDatabase() : super(_openConnection());

  // 데이터베이스 버전 설정
  
  int get schemaVersion => 1;
}
  • AppDatabase(): 데이터베이스 객체를 생성합니다.
  • : super(_openConnection()): 부모 클래스(_$AppDatabase)에 데이터베이스 연결을 전달합니다.
  • _openConnection(): 데이터베이스 파일 경로를 설정하고 SQLite를 초기화하여 Drift와 연결합니다.
profile
코딩을 배우는 초보

0개의 댓글