drift Table 모델 만들

pharmDev·2024년 12월 17일

이 코드는 Drift를 사용해서 "Schedule"이라는 테이블을 정의하는 Dart 코드입니다. 코드의 각 부분을 처음 접하는 Flutter 개발자를 위해 하나씩 차근차근 설명하겠습니다.


1. 테이블 클래스의 기본 구조

Drift에서 테이블은 클래스를 사용해 정의합니다. 테이블 클래스를 만들기 위해서는 Table 클래스를 상속받아야 합니다.

class Schedule extends Table {
  // 테이블의 컬럼들을 정의합니다.
}

여기서 Schedule이라는 테이블이 생성되며, 그 안에 필요한 컬럼(필드)들이 정의됩니다.


2. 컬럼(Column) 정의

Drift에서 테이블의 각 필드는 컬럼이라고 부릅니다. 컬럼은 다양한 데이터 타입을 지원하며, 테이블을 정의할 때 get 키워드를 사용해서 선언합니다.

컬럼의 주요 데이터 타입

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

컬럼 정의법

컬럼은 메서드 체이닝을 통해 다양한 옵션을 추가할 수 있습니다.


3. 코드 분석 (Schedule 테이블)

3.1 ID 컬럼

IntColumn get id => integer().autoIncrement()();
  • IntColumn: 정수형 컬럼을 생성합니다.
  • .autoIncrement(): 자동으로 숫자를 증가시키며, 기본 키(Primary Key) 역할을 합니다.
  • 이 컬럼은 각 데이터를 고유하게 식별할 수 있는 ID를 자동으로 부여합니다.

3.2 시작 시간과 종료 시간

IntColumn get startTime => integer()();
IntColumn get endTime => integer()();
  • IntColumn: 정수형 데이터를 저장합니다.
  • 시작 시간과 종료 시간은 정수 값(예: 시간이나 분 단위로 계산된 값)을 저장하기 위해 integer()로 선언합니다.

3.3 일정 내용

TextColumn get content => text()();
  • TextColumn: 문자열 데이터를 저장합니다.
  • content 컬럼에는 일정의 내용을 저장합니다.

3.4 날짜

DateTimeColumn get date => dateTime()();
  • DateTimeColumn: 날짜 및 시간을 저장합니다.
  • date 컬럼은 해당 일정이 어떤 날짜에 속하는지를 저장합니다.

3.5 카테고리

TextColumn get color => text()();
  • TextColumn: 문자열 데이터를 저장합니다.
  • color 컬럼은 카테고리를 표현하는 색상이나 이름을 저장합니다.

3.6 생성 날짜 및 시간

DateTimeColumn get createdAt =>
    dateTime().clientDefault(() => DateTime.now().toUtc())();
  • DateTimeColumn: 날짜 및 시간을 저장합니다.
  • clientDefault: 값을 지정하지 않고 삽입(insert)할 때 자동으로 값을 설정합니다.
  • DateTime.now().toUtc()는 현재 시간을 가져와 UTC 기준으로 저장합니다.

    예시: 새로운 데이터를 삽입할 때 createdAt 컬럼이 자동으로 생성 시각으로 채워집니다.


4. 최종 테이블 구조

위 컬럼들을 종합하면 다음과 같은 구조의 Schedule 테이블이 됩니다:

컬럼 이름타입설명특성
idInteger고유 ID자동 증가 (Primary Key)
startTimeInteger시작 시간 (숫자 값)
endTimeInteger종료 시간 (숫자 값)
contentText일정 내용
dateDateTime날짜 (일정의 날짜)
colorText카테고리나 색상 정보
createdAtDateTime데이터 생성 날짜 및 시간자동으로 현재 시간 설정

5. Drift에서 테이블을 사용하는 이유

  1. 안전성
    SQL 쿼리를 직접 작성하지 않고, 클래스 기반으로 테이블을 정의하기 때문에 타입 안전성이 보장됩니다.

  2. 가독성
    컬럼의 구조가 명확히 보이기 때문에 유지 보수 및 코드 이해가 쉽습니다.

  3. 자동 코드 생성
    나중에 build_runner를 사용하면 이 테이블에 맞는 SQL 코드와 ORM 메서드를 자동으로 생성해 줍니다.


6. 예시 데이터 삽입하기

Schedule 테이블에 데이터를 삽입하는 예제 코드는 다음과 같습니다.

final db = AppDatabase(); // 데이터베이스 초기화

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'),
  ),
);

결론

  1. 클래스를 기반으로 테이블을 정의합니다.
  2. 각 컬럼은 데이터 타입과 옵션(자동 증가, 기본값 등)을 설정할 수 있습니다.
  3. clientDefault는 값을 자동으로 설정할 때 사용됩니다.
  4. autoIncrementPrimary Key 역할을 하는 고유 식별자를 만듭니다.

이제 위 코드를 보면 어떤 컬럼이 어떤 데이터를 저장하는지 명확하게 이해할 수 있을 것입니다.

드리프트(Drift)에서 테이블 정의 시 ()를 두 번 사용하고 =>를 사용하는 이유에 대해 설명드리겠습니다.


1. ()를 두 번 사용하는 이유

코드 예시:

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

이유 설명

Drift에서 테이블의 컬럼(column)을 정의할 때는 메서드 체이닝 방식으로 여러 옵션을 추가할 수 있습니다.

  • integer()정수형 컬럼을 만드는 메서드입니다.
    예를 들어, IntColumn get id => integer(); 이렇게만 사용하면 기본 정수 컬럼을 정의합니다.

  • 옵션 추가: autoIncrement()와 같은 추가 기능은 메서드 체이닝을 통해 설정됩니다.
    즉, integer().autoIncrement()()를 통해 완성된 컬럼을 반환합니다.

마지막에 ()를 한 번 더 쓰는 이유:

Drift모든 컬럼의 반환 값을 ()를 통해 호출해야 합니다.
이렇게 하면 컬럼의 정의가 완료되었음을 Drift에 알려주는 역할을 합니다.

간단히 정리하면
integer() → 정수형 컬럼 생성
.autoIncrement() → 자동 증가 옵션 추가
() → 이 컬럼의 정의를 최종적으로 완료

흐름 정리:

integer()       // 정수 컬럼 생성
.autoIncrement()// 자동 증가 기능 추가
()              // 최종적으로 컬럼 정의 완료

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

코드 예시:

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

이유 설명

=>화살표 함수라고 하며, 단순히 간결한 함수 표현식입니다.
Dart에서 함수의 몸체(body)가 단 한 줄로 이루어졌을 때 사용됩니다.


화살표 함수와 일반 함수 비교

  1. 화살표 함수 (=>):

    IntColumn get id => integer().autoIncrement()();
    • =>를 사용하면 함수가 단 한 줄일 때 코드가 간결해집니다.
    • 읽기 쉽고 직관적입니다.
  2. 일반 함수 ({}):

    IntColumn get id {
      return integer().autoIncrement()();
    }
    • 중괄호 {}return을 사용하면 더 길고 복잡해집니다.

결론: => 사용 이유

  1. 간결함: 코드가 간단하고 깔끔하게 작성됩니다.
  2. 함수 몸체가 한 줄일 때 유용: 테이블 컬럼 정의처럼 단순한 작업에 적합합니다.

3. 전체 코드 분석 (정리)

다시 원본 코드로 돌아가서 설명하면:

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

    • id라는 정수형 컬럼을 선언합니다.
  2. integer()

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

    • 이 컬럼에 자동 증가 옵션을 추가합니다.
  4. ()()

    • 메서드 체이닝이 끝난 후 최종적으로 컬럼을 Drift에 전달합니다.
  5. =>

    • 화살표 함수로 간결하게 컬럼을 반환합니다.

최종 요약

  1. ()를 두 번 사용하는 이유:

    • 컬럼의 정의를 최종적으로 Drift에 반환하기 위해서입니다.
  2. =>를 사용하는 이유:

    • 코드의 간결함을 유지하고 단일 표현식에 적합하기 때문입니다.

이제 전체 코드가 더 명확하게 이해되겠죠?

Drift는 이러한 패턴을 통해 SQL 테이블 정의를 간결하고 안전하게 만들 수 있게 도와줍니다! 😊

profile
코딩을 배우는 초보

0개의 댓글