플러터 숙제(수정)

이담현·2026년 5월 14일

[Flutter] Drift 패키지로 로컬 DB(SQLite) 연결하기

  1. 오늘의 목표Flutter에서 Drift(구 Moor) 패키지를 사용해 SQLite 기반 로컬 DB를 구축하고, 일정을 추가·조회·삭제하는 CRUD 기능을 마스터한다.

  2. 핵심 개념 요약Drift: SQL 문법 없이 Dart 코드로 SQLite DB를 제어하게 해주는 ORM 라이브러리.LazyDatabase: 앱 실행 시점에 기기 내부의 안전한 경로에 DB 파일(db.sqlite)을 생성하고 연결.Stream 조회 (.watch()): DB 값이 바뀌면 UI가 실시간으로 자동 새로고침되는 마법 같은 기능.

  3. 핵심 코드 ① 테이블 정의


class Schedules extends Table {
  IntColumn get id => integer().autoIncrement()();  // 자동 증가 PK
  TextColumn get content => text()();              // 일정 내용
  DateTimeColumn get date => dateTime()();         // 일정 날짜
  IntColumn get startTime => integer()();          // 커스텀 추가: 시작 시간
  IntColumn get endTime => integer()();            // 커스텀 추가: 종료 시간
}
② DB 연결 및 CRUD 구현 (drift_database.dart)Dartimport 'package:calendar_scheduler/model/schedule.dart';
import 'package:drift/drift.dart';
import 'package:drift/native.dart';
import 'package:path_provider/path_provider.dart';
import 'package:path/path.dart' as p;
import 'dart:io';

part 'drift_database.g.dart'; // 코드 생성 파일 연결

@DriftDatabase(tables: [Schedules])
class LocalDatabase extends _$LocalDatabase {
  LocalDatabase() : super(_openConnection());

  // [Read] 특정 날짜 일정 실시간 감시
  Stream<List<Schedule>> watchSchedules(DateTime date) =>
      (select(schedules)..where((tbl) => tbl.date.equals(date))).watch();

  // [Create] 일정 추가 (Companion 객체 사용)
  Future<int> createSchedule(SchedulesCompanion data) => into(schedules).insert(data);

  // [Delete] 일정 삭제 (끝에 .go() 필수!)
  Future<int> removeSchedule(int id) =>
      (delete(schedules)..where((tbl) => tbl.id.equals(id))).go();

  @override
  int get schemaVersion => 1;
}

// DB 파일 생성 및 연결
LazyDatabase _openConnection() {
  return LazyDatabase(() async {
    final dbFolder = await getApplicationDocumentsDirectory();
    final file = File(p.join(dbFolder.path, 'db.sqlite'));
    return NativeDatabase(file);
  });
}

4. 핵심 코드 매칭 가이드메서드 / 키워드역할비고

integer().autoIncrement()()ID 값을 1씩 자동으로 늘려가며 저장끝에 괄호 () 필수..where(...)특정 조건에 맞는 데이터만 필터링 (SQL의 WHERE)Cascade 연산자(..) 사용.watch()데이터 변경 시 UI를 실시간으로 자동 갱신Stream 리턴SchedulesCompanion데이터를 Insert 할 때 Drift가 요구하는 데이터 규격코드 생성 후 사용 가능.go()삭제(delete)나 수정 시 쿼리를 최종 실행하는 명령어안 쓰면 반영 안 됨!

5. 트러블슈팅 에러 : _$LocalDatabase 클래스를 찾을 수 없습니다! (컴파일 에러)원인: Drift는 개발자가 짠 코드를 바탕으로 내부 파일을 자동 생성(part)해야 하는데, 아직 빌드를 안 돌려서 그렇다.해결법: 터미널에 아래 명령어를 치면 깔끔하게 해결!Bashflutter pub run build_runner build

주의점 : 테이블 구조를 바꾸거나 새로 만들면 무조건 build_runner를 다시 돌리자.

6. 결론 및 요약 오늘 알게 된 점 : SQL 문법을 쓰지 않고 Dart 코드로만 DB를 다룰 수 있어서 타입 안정성이 높고 편하다..watch()를 쓰니까 스트림으로 화면이 알아서 갱신돼서 상태 관리가 엄청나게 쉬워진다.

아직 헷갈리는 점 : 일반 모델 클래스(Schedule)와 데이터 삽입용 클래스(SchedulesCompanion)의 명확한 차이와 활용법은 좀 더 써보며 익혀야겠다.Drift 특유의 쿼리 문법(..where, 종속 연산자) 구조가 아직 100% 손에 익지 않아서 반복 연습이 필요해 보인다.

profile
최고 최선의 코드를 생성하는 개발자

2개의 댓글

comment-user-thumbnail
2026년 5월 14일

아니잖아

1개의 답글