이 코드는 Drift를 사용해서 "Schedule"이라는 테이블을 정의하는 Dart 코드입니다. 코드의 각 부분을 처음 접하는 Flutter 개발자를 위해 하나씩 차근차근 설명하겠습니다.
Drift에서 테이블은 클래스를 사용해 정의합니다. 테이블 클래스를 만들기 위해서는 Table 클래스를 상속받아야 합니다.
class Schedule extends Table {
// 테이블의 컬럼들을 정의합니다.
}
여기서 Schedule이라는 테이블이 생성되며, 그 안에 필요한 컬럼(필드)들이 정의됩니다.
Drift에서 테이블의 각 필드는 컬럼이라고 부릅니다. 컬럼은 다양한 데이터 타입을 지원하며, 테이블을 정의할 때 get 키워드를 사용해서 선언합니다.
IntColumn: 정수형 데이터를 저장합니다. (예: ID, 숫자)TextColumn: 문자열 데이터를 저장합니다. (예: 일정 내용)DateTimeColumn: 날짜와 시간을 저장합니다. (예: 시작 시간, 생성 시간)컬럼은 메서드 체이닝을 통해 다양한 옵션을 추가할 수 있습니다.
IntColumn get id => integer().autoIncrement()();
IntColumn: 정수형 컬럼을 생성합니다..autoIncrement(): 자동으로 숫자를 증가시키며, 기본 키(Primary Key) 역할을 합니다.IntColumn get startTime => integer()();
IntColumn get endTime => integer()();
IntColumn: 정수형 데이터를 저장합니다.integer()로 선언합니다.TextColumn get content => text()();
TextColumn: 문자열 데이터를 저장합니다.content 컬럼에는 일정의 내용을 저장합니다.DateTimeColumn get date => dateTime()();
DateTimeColumn: 날짜 및 시간을 저장합니다.date 컬럼은 해당 일정이 어떤 날짜에 속하는지를 저장합니다.TextColumn get color => text()();
TextColumn: 문자열 데이터를 저장합니다.color 컬럼은 카테고리를 표현하는 색상이나 이름을 저장합니다.DateTimeColumn get createdAt =>
dateTime().clientDefault(() => DateTime.now().toUtc())();
DateTimeColumn: 날짜 및 시간을 저장합니다.clientDefault: 값을 지정하지 않고 삽입(insert)할 때 자동으로 값을 설정합니다.DateTime.now().toUtc()는 현재 시간을 가져와 UTC 기준으로 저장합니다.예시: 새로운 데이터를 삽입할 때
createdAt컬럼이 자동으로 생성 시각으로 채워집니다.
위 컬럼들을 종합하면 다음과 같은 구조의 Schedule 테이블이 됩니다:
| 컬럼 이름 | 타입 | 설명 | 특성 |
|---|---|---|---|
id | Integer | 고유 ID | 자동 증가 (Primary Key) |
startTime | Integer | 시작 시간 (숫자 값) | |
endTime | Integer | 종료 시간 (숫자 값) | |
content | Text | 일정 내용 | |
date | DateTime | 날짜 (일정의 날짜) | |
color | Text | 카테고리나 색상 정보 | |
createdAt | DateTime | 데이터 생성 날짜 및 시간 | 자동으로 현재 시간 설정 |
안전성
SQL 쿼리를 직접 작성하지 않고, 클래스 기반으로 테이블을 정의하기 때문에 타입 안전성이 보장됩니다.
가독성
컬럼의 구조가 명확히 보이기 때문에 유지 보수 및 코드 이해가 쉽습니다.
자동 코드 생성
나중에 build_runner를 사용하면 이 테이블에 맞는 SQL 코드와 ORM 메서드를 자동으로 생성해 줍니다.
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'),
),
);
clientDefault는 값을 자동으로 설정할 때 사용됩니다. autoIncrement는 Primary Key 역할을 하는 고유 식별자를 만듭니다.이제 위 코드를 보면 어떤 컬럼이 어떤 데이터를 저장하는지 명확하게 이해할 수 있을 것입니다.
드리프트(Drift)에서 테이블 정의 시 ()를 두 번 사용하고 =>를 사용하는 이유에 대해 설명드리겠습니다.
()를 두 번 사용하는 이유IntColumn get id => integer().autoIncrement()();
Drift에서 테이블의 컬럼(column)을 정의할 때는 메서드 체이닝 방식으로 여러 옵션을 추가할 수 있습니다.
integer()는 정수형 컬럼을 만드는 메서드입니다.
예를 들어, IntColumn get id => integer(); 이렇게만 사용하면 기본 정수 컬럼을 정의합니다.
옵션 추가: autoIncrement()와 같은 추가 기능은 메서드 체이닝을 통해 설정됩니다.
즉, integer() → .autoIncrement() → ()를 통해 완성된 컬럼을 반환합니다.
()를 한 번 더 쓰는 이유:Drift는 모든 컬럼의 반환 값을 ()를 통해 호출해야 합니다.
이렇게 하면 컬럼의 정의가 완료되었음을 Drift에 알려주는 역할을 합니다.
간단히 정리하면
integer()→ 정수형 컬럼 생성
.autoIncrement()→ 자동 증가 옵션 추가
()→ 이 컬럼의 정의를 최종적으로 완료
integer() // 정수 컬럼 생성
.autoIncrement()// 자동 증가 기능 추가
() // 최종적으로 컬럼 정의 완료
=> (화살표 함수)를 사용하는 이유IntColumn get id => integer().autoIncrement()();
=>는 화살표 함수라고 하며, 단순히 간결한 함수 표현식입니다.
Dart에서 함수의 몸체(body)가 단 한 줄로 이루어졌을 때 사용됩니다.
화살표 함수 (=>):
IntColumn get id => integer().autoIncrement()();
=>를 사용하면 함수가 단 한 줄일 때 코드가 간결해집니다. 일반 함수 ({}):
IntColumn get id {
return integer().autoIncrement()();
}
{}와 return을 사용하면 더 길고 복잡해집니다.=> 사용 이유다시 원본 코드로 돌아가서 설명하면:
IntColumn get id => integer().autoIncrement()();
IntColumn get id
id라는 정수형 컬럼을 선언합니다.integer()
.autoIncrement()
()()
=>
()를 두 번 사용하는 이유:
=>를 사용하는 이유:
Drift는 이러한 패턴을 통해 SQL 테이블 정의를 간결하고 안전하게 만들 수 있게 도와줍니다! 😊