drift에서 code generation 하기

pharmDev·2024년 12월 18일

질문에 대한 답변:


1. import 'package:path/path.dart' as p; 이 부분이 이해가 되지 않아 import한 패키지의 기능과 as p 를 쓴 이유가 궁금해

  • 패키지의 기능:

    • package:path는 운영체제에 맞는 파일 경로 처리를 돕는 유틸리티 패키지입니다.
    • 예를 들어, 경로를 결합하거나(join), 파일 이름만 추출하거나(basename), 확장자를 바꿀 수 있는 기능을 제공합니다.
  • as p의 이유:

    • 별칭을 사용하여 코드 가독성을 높이고, 다른 패키지와 이름 충돌을 방지합니다.
    • 예: p.join()으로 path 패키지의 join 함수임을 명확히 합니다.
  • 예시:

    import 'package:path/path.dart' as p;
    
    void main() {
      final folder = "/Users/flutter";
      final fileName = "database.db";
      final fullPath = p.join(folder, fileName);
      print(fullPath); // 결과: /Users/flutter/database.db
    }

2. part 'drift.g.dart';의 기능과 사용법이 궁금해

  • 기능:

    • part는 다트의 라이브러리 시스템에서 여러 파일을 하나로 묶는 역할을 합니다.
    • drift.g.dart는 Drift 패키지가 테이블, DAO 등의 정보를 기반으로 자동 생성한 파일입니다.
    • 이 파일에는 데이터베이스 연산을 수행하는 코드가 포함됩니다.
  • 사용법:

    • part 키워드로 자동 생성된 파일을 포함하면, 정의한 테이블과 데이터베이스를 사용할 수 있습니다.
    • Drift는 아래 명령어로 파일을 생성합니다:
      flutter pub run build_runner build
  • 예시:

    part 'drift.g.dart';
    
    (tables: [ScheduleTable])
    class AppDatabase extends _$AppDatabase {
      AppDatabase() : super(_openConnection());
    
      
      int get schemaVersion => 1;
    }

3. @DriftDatabase()의 기능이 궁금해

  • 기능:

    • Drift에 이 클래스가 데이터베이스임을 알리는 어노테이션입니다.
    • tables 매개변수에 테이블 클래스를 전달하여 데이터베이스 구조를 정의합니다.
  • 예시:

    (tables: [ScheduleTable])
    class AppDatabase extends _$AppDatabase {
      AppDatabase() : super(_openConnection());
    
      
      int get schemaVersion => 1;
    }

4. schemaVersion의 기능과 사용법이 궁금해

  • 기능:

    • 데이터베이스의 버전을 정의합니다.
    • schemaVersion은 마이그레이션(테이블 추가, 수정 등) 시 Drift가 변경을 처리할 수 있도록 합니다.
  • 사용법:

    • 초기 버전에서는 schemaVersion = 1로 설정합니다.
    • 데이터베이스 구조를 변경할 때, 버전을 증가시키고 마이그레이션 전략을 추가합니다.
  • 예시:

    
    int get schemaVersion => 2;
    
    
    MigrationStrategy get migration => MigrationStrategy(
          onUpgrade: (migrator, from, to) async {
            if (from == 1) {
              await migrator.addColumn(scheduleTable, scheduleTable.newColumn);
            }
          },
        );

5. LazyDatabase 이게 무슨 클래스인지, 기능과 사용법이 궁금해

  • LazyDatabase:
    • 데이터베이스를 지연 초기화합니다. 즉, 실제로 데이터베이스가 필요해질 때만 초기화 작업을 수행합니다.
  • 기능:
    • 앱이 실행될 때 불필요한 초기화를 피하고, 필요 시 데이터베이스 파일을 엽니다.
  • 사용법:
    • LazyDatabaseFuture를 반환하는 콜백으로 데이터베이스를 초기화합니다.
  • 예시:
    LazyDatabase _openConnection() {
      return LazyDatabase(() async {
        final dbFolder = await getApplicationDocumentsDirectory();
        final file = File(p.join(dbFolder.path, 'database.db'));
        return NativeDatabase(file);
      });
    }

6. p.join의 기능이 운영체제와 상관없이 경로를 합쳐준다고 했는데, 자세히 설명해줘

  • p.join의 기능:
    • 운영체제에 맞는 파일 경로 구분자를 사용하여 경로를 결합합니다.
    • 윈도우: \
    • 유닉스/맥OS: /
  • 예시:
    final folder = "C:\\Users\\flutter"; // Windows 경로
    final fileName = "db.sqlite";
    final filePath = p.join(folder, fileName);
    print(filePath); // 결과: C:\Users\flutter\db.sqlite

7. applyWorkaroundToOpenSqlite3OnOldAndroidVersions()를 적는 이유가 궁금해

  • 역할:
    • 오래된 안드로이드 버전에서 SQLite 라이브러리를 사용할 때 발생하는 호환성 문제를 해결합니다.
  • 사용법:
    • 안드로이드 플랫폼에서 SQLite를 사용할 때 호출해야 합니다.
  • 예시:
    if (Platform.isAndroid) {
      await applyWorkaroundToOpenSqlite3OnOldAndroidVersions();
    }

8. sqlite3.tempDirectory = cachebase.path; 이 코드를 쓰는 이유가 궁금해

  • 역할:
    • SQLite가 임시 데이터를 저장하는 디렉토리를 설정합니다.
    • 일부 플랫폼에서는 SQLite가 기본 임시 디렉토리를 사용할 수 없기 때문에 명시적으로 설정해야 합니다.
  • 사용법:
    • getTemporaryDirectory()로 얻은 디렉토리를 설정합니다.
  • 예시:
    final tempDir = await getTemporaryDirectory();
    sqlite3.tempDirectory = tempDir.path;

코드 제너레이션의 순서

  1. 테이블 모델 정의:

    • Drift의 Table 클래스를 상속하여 테이블을 정의합니다.
    class ScheduleTable extends Table {
      IntColumn get id => integer().autoIncrement()();
      TextColumn get title => text().withLength(min: 1, max: 100)();
    }
  2. 데이터베이스 클래스 생성:

    • @DriftDatabase 어노테이션과 함께 데이터베이스를 정의합니다.
    (tables: [ScheduleTable])
    class AppDatabase extends _$AppDatabase {
      AppDatabase() : super(_openConnection());
      
      int get schemaVersion => 1;
    }
  3. build_runner 실행:

    • 자동 생성 파일을 생성합니다.
    flutter pub run build_runner build
  4. 자동 생성 파일 사용:

    • 생성된 drift.g.dart 파일을 포함하여 데이터베이스 연산을 수행합니다.
    final database = AppDatabase();
    database.insertSchedule(ScheduleTableCompanion(title: Value('New Task')));
profile
코딩을 배우는 초보

0개의 댓글