오늘의 목표Flutter에서 Drift(구 Moor) 패키지를 사용해 SQLite 기반 로컬 DB를 구축하고, 일정을 추가·조회·삭제하는 CRUD 기능을 마스터한다.
핵심 개념 요약Drift: SQL 문법 없이 Dart 코드로 SQLite DB를 제어하게 해주는 ORM 라이브러리.LazyDatabase: 앱 실행 시점에 기기 내부의 안전한 경로에 DB 파일(db.sqlite)을 생성하고 연결.Stream 조회 (.watch()): DB 값이 바뀌면 UI가 실시간으로 자동 새로고침되는 마법 같은 기능.
핵심 코드 ① 테이블 정의
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% 손에 익지 않아서 반복 연습이 필요해 보인다.
아니잖아