Drift를 활용한 테이블 정의 및 사용 방법 (정리)

pharmDev·2024년 12월 18일

1. 테이블 정의의 기본 개념

Drift는 Flutter에서 SQLite를 사용하기 위한 ORM(Object-Relational Mapping) 라이브러리입니다. 테이블을 정의할 때는 클래스 기반으로 작성하며, SQL 쿼리를 직접 작성하지 않아도 클래스와 메서드를 통해 데이터베이스 작업을 쉽게 처리할 수 있습니다.


2. 테이블 클래스의 구조

Drift에서 테이블은 Table 클래스를 상속받아 정의합니다. 각 컬럼(필드)은 get 키워드를 사용하여 선언되며, 컬럼의 데이터 타입과 옵션을 설정할 수 있습니다.

테이블 클래스 예제:

import 'package:drift/drift.dart';

class Schedule extends Table {
  IntColumn get id => integer().autoIncrement()(); // 기본 키
  IntColumn get startTime => integer()();          // 시작 시간
  IntColumn get endTime => integer()();            // 종료 시간
  TextColumn get content => text()();              // 일정 내용
  DateTimeColumn get date => dateTime()();         // 날짜
  TextColumn get color => text()();                // 카테고리
  DateTimeColumn get createdAt =>
      dateTime().clientDefault(() => DateTime.now().toUtc())(); // 생성 시각
}

3. 각 부분의 역할

3.1 테이블 클래스

class Schedule extends Table { ... }
  • Drift에서는 테이블을 하나의 클래스로 정의합니다.
  • Schedule이라는 이름으로 테이블을 생성하고, 각 컬럼은 클래스의 멤버로 정의됩니다.

3.2 컬럼 정의

기본 구조:

IntColumn get id => integer().autoIncrement()();
  • integer(): 정수형 데이터를 저장할 수 있는 컬럼을 정의합니다.
  • .autoIncrement(): 자동 증가(primary key 역할) 기능을 추가합니다.
  • ()(): 컬럼 정의를 최종적으로 완료합니다. Drift에서 반드시 호출해야 합니다.
  • get: 컬럼을 읽기 전용으로 정의합니다.

3.3 주요 컬럼 타입

타입역할
IntColumn정수형 데이터를 저장합니다. (예: ID, 시간 값)
TextColumn문자열 데이터를 저장합니다. (예: 일정 내용)
DateTimeColumn날짜와 시간을 저장합니다. (예: 일정 날짜, 생성 시각)

3.4 컬럼 정의 예시

1. 자동 증가 ID 컬럼

IntColumn get id => integer().autoIncrement()();
  • 정수형 컬럼으로 정의되며, 자동으로 숫자가 증가합니다.
  • 주로 Primary Key(기본 키)로 사용됩니다.

2. 시작 시간과 종료 시간

IntColumn get startTime => integer()();
IntColumn get endTime => integer()();
  • 정수형 컬럼으로 선언하며, 시간을 숫자 값으로 저장합니다.
    (예: 900 → 9:00, 1100 → 11:00)

3. 일정 내용

TextColumn get content => text()();
  • 일정의 내용을 저장하는 문자열 컬럼입니다.

4. 날짜

DateTimeColumn get date => dateTime()();
  • 날짜와 시간을 저장하는 컬럼입니다.
    (예: 2023-12-01)

5. 생성 날짜 및 시간

DateTimeColumn get createdAt =>
    dateTime().clientDefault(() => DateTime.now().toUtc())();
  • clientDefault: 기본값을 설정하는 옵션입니다.
  • 새로운 데이터를 삽입할 때 값이 지정되지 않으면, 현재 시간(UTC 기준)이 기본값으로 설정됩니다.

4. 테이블을 정의하는 코드에서 ()를 두 번 사용하는 이유

메서드 체이닝 구조

IntColumn get id => integer().autoIncrement()();
  1. integer()

    • 정수형 컬럼을 생성합니다.
  2. .autoIncrement()

    • 이 컬럼을 자동 증가로 설정합니다.
  3. 마지막 ()

    • 최종적으로 Drift가 컬럼 정의를 처리하도록 전달합니다.
    • 컬럼 정의가 완료되었음을 Drift에 알리는 역할입니다.

5. 화살표 함수(=>)를 사용하는 이유

예시:

IntColumn get id => integer().autoIncrement()();
  • =>는 Dart의 화살표 함수로, 단순히 간결한 함수 표현입니다.
  • 컬럼 정의는 일반적으로 단 한 줄로 작성되므로, 코드가 간결하고 가독성이 높아집니다.

6. Drift 테이블 정의와 값 입력의 차이

  • 테이블 정의: 컬럼의 데이터 타입과 속성을 정의합니다.
    예: integer(), text(), dateTime()
  • 값 입력: 테이블에 데이터를 추가하는 작업입니다.

값 입력 예시

테이블에 데이터를 삽입하려면 insert() 메서드를 사용합니다.

await db.into(db.schedule).insert(
  SchedulesCompanion(
    startTime: Value(900),     // 9시 00분
    endTime: Value(1100),      // 11시 00분
    content: Value('Flutter 공부'),
    date: Value(DateTime.now()), // 오늘 날짜
    color: Value('blue'),      // 카테고리 색상
  ),
);
  • Value(): Drift에서 값을 삽입할 때 사용하는 래퍼 클래스입니다.
  • SchedulesCompanion: Drift가 테이블의 값을 추가할 때 사용하는 객체입니다.

7. Drift를 사용하는 이유

  1. 안전성: SQL 쿼리를 직접 작성하지 않아도, 타입 안전성을 유지하면서 데이터베이스 작업을 처리할 수 있습니다.
  2. 가독성: 테이블 구조가 클래스 형태로 정의되어 읽기 쉽고 직관적입니다.
  3. 자동 코드 생성: build_runner를 통해 CRUD(Create, Read, Update, Delete) 관련 코드를 자동으로 생성해 줍니다.

최종 정리

  1. Drift는 ORM 기반으로 SQLite 데이터베이스 작업을 더 쉽고 효율적으로 만들어줍니다.
  2. 테이블은 클래스로 정의하며, 컬럼은 integer(), text(), dateTime() 등으로 설정합니다.
  3. ()를 두 번 사용하는 이유는 메서드 체이닝의 최종 호출로 컬럼 정의를 완료하기 위해서입니다.
  4. => 화살표 함수를 사용해 코드를 간결하게 표현합니다.
  5. 데이터 삽입과 같은 작업은 별도의 insert() 메서드를 통해 처리됩니다.

Drift를 처음 사용하는 개발자라면 위의 구조와 개념을 기반으로 시작하면 쉽게 이해할 수 있을 것입니다! 😊

profile
코딩을 배우는 초보

0개의 댓글