Isar는 데이터베이스에서 데이터를 관리하기 위해 컬렉션과 필드 구조를 정의합니다. 각 컬렉션은 Dart 클래스로 정의되며, 클래스는 데이터의 구조를 나타냅니다. Isar는 이 클래스를 바탕으로 데이터 저장 및 검색을 수행합니다.
import 'package:isar/isar.dart';
// 이 클래스를 컬렉션으로 지정합니다.
class User {
Id id = Isar.autoIncrement; // 자동 증가 ID
late String name; // 이름 필드
late int age; // 나이 필드
}
설명:
@collection: 이 클래스를 Isar 컬렉션으로 지정합니다.Id: Isar의 기본 키로 사용됩니다. 자동 증가 값을 설정할 수 있습니다.컬렉션은 설정값을 추가할 수 있습니다.
예:
(name: 'users')
class User {
...
}
모든 컬렉션에는 고유 식별자인 ID가 필요합니다. 기본적으로 Id 타입은 자동 증가 값으로 설정되며, 다음과 같이 정의합니다:
Id id = Isar.autoIncrement;
설명:
Isar.autoIncrement: ID를 자동으로 증가시킵니다.컬렉션이나 필드 이름은 Isar가 자동으로 저장하지만, 필요시 이름을 변경할 수 있습니다.
class User {
('user_name')
late String name;
('user_age')
late int age;
}
설명:
@Name: 데이터베이스에 저장될 이름을 지정합니다.필드 중 일부를 데이터베이스에 저장하지 않으려면 @ignore를 사용합니다.
class User {
late String name;
late String tempData; // 데이터베이스에 저장되지 않음
}
설명:
@ignore: 해당 필드는 데이터베이스에 포함되지 않습니다.Isar는 다양한 타입을 지원합니다. 다음은 주요 지원 타입 목록입니다:
class Example {
late int count;
late double price;
late bool isActive;
late String description;
late List<String> tags; // 문자열 리스트
late DateTime createdAt; // 날짜와 시간
}
설명:
List<T>: 리스트 타입을 지원하며, 제네릭 타입 T를 사용합니다.DateTime: 날짜 및 시간 데이터를 저장할 수 있습니다.Nullable 타입은 필드가 null 값을 가질 수 있도록 허용합니다. late 키워드 대신 nullable(?)을 사용하면 됩니다.
class User {
String? nickname; // null 허용
int? age; // null 허용
}
설명:
?: 해당 필드가 null 값을 가질 수 있도록 설정합니다.DateTime은 시간 정보를 다룰 때 사용됩니다. Isar는 이 타입을 기본적으로 지원하며, 다음과 같이 정의할 수 있습니다.
class Event {
late DateTime startTime; // 시작 시간
late DateTime endTime; // 종료 시간
}
설명:
DateTime: 날짜 및 시간 데이터를 저장할 때 사용합니다.Enum 타입은 제한된 값 목록을 저장할 때 사용합니다. Isar는 Enum 타입을 지원하며, 다음과 같이 설정합니다.
enum Status {
active,
inactive,
pending,
}
class Task {
late Status status;
}
Enum은 내부적으로 숫자 값으로 저장됩니다. 이는 Enum 값이 데이터베이스에 저장될 때 효율적으로 관리되도록 합니다. 예를 들어, 다음과 같이 Enum을 정의할 수 있습니다:
enum UserRole {
admin, // 0으로 저장
editor, // 1로 저장
viewer, // 2로 저장
}
class User {
Id id = Isar.autoIncrement;
late String name;
late UserRole role; // Enum 필드
}
Enum 값을 Isar에 저장할 때 네 가지 방식이 있습니다. 이 방법들은 Enum 값이 데이터베이스에서 어떻게 저장되고 관리될지를 결정합니다.
ordinal: Enum 값을 인덱스(순서)로 저장합니다. 이는 매우 효율적이지만, null 값은 허용되지 않습니다. 예를 들어, Enum의 첫 번째 값은 0, 두 번째 값은 1로 저장됩니다.
ordinal32: Enum 값을 4바이트 정수(short)로 저장합니다. 이 방식은 더 많은 범위의 값을 처리할 수 있습니다.
name: Enum 값을 문자열(String)로 저장합니다. 예를 들어, UserRole.admin은 'admin'으로 저장됩니다. 이 방식은 Enum 값의 순서를 변경해도 영향을 받지 않으므로 안전합니다.
value: Enum의 사용자 정의 속성을 저장합니다. 이 방법을 사용하면 Enum 값에 추가 정보를 연결할 수 있습니다.
class EnumCollection {
Id? id; // 기본적으로 Isar에서 사용하는 고유 ID. null 허용
// 기본값은 EnumType.ordinal로 설정됨. Enum 값의 순서를 byte로 저장
late TestEnum byteIndex; // nullable 불가. 첫 번째 값은 0, 두 번째 값은 1로 저장됨
(EnumType.ordinal32) // Enum 값을 4-byte 정수로 저장. 더 큰 값 범위를 처리 가능
TestEnum? shortIndex; // nullable 허용
(EnumType.name) // Enum의 이름을 문자열(String)로 저장. 예: 'first', 'second'
TestEnum? name; // 순서 변경에 안전하며, nullable 허용
(EnumType.value, 'myValue') // 사용자 정의 속성을 저장. 여기서는 'myValue' 필드 사용
TestEnum myValue; // TestEnum에 정의된 사용자 속성 값을 저장
}
enum TestEnum {
first(10), // myValue 값으로 10 저장
second(100), // myValue 값으로 100 저장
third(1000); // myValue 값으로 1000 저장
const TestEnum(this.myValue); // 생성자를 통해 사용자 정의 속성 값 초기화
final short myValue; // 사용자 정의 속성. 각 Enum 값마다 고유 값 설정 가능
}
추가 설명:
ordinal과 ordinal32: Enum 값의 순서가 바뀌면 기존 데이터에 오류가 생길 수 있습니다.name: Enum 값의 이름을 저장하므로 순서 변경에 안전합니다.value: Enum 값에 부가적인 정보를 저장하고 싶을 때 유용합니다.Isar는 임베드된 객체를 통해 계층적 데이터를 저장할 수 있습니다. 여기서 임베드된 객체란, 한 데이터 안에 또 다른 데이터를 포함하는 방식입니다. 예를 들어, 사용자(User)라는 데이터가 주소(Address)라는 데이터를 포함할 때, 주소를 별도의 데이터로 저장하지 않고 사용자 데이터 안에 포함시킬 수 있습니다. 임베드된 객체는 컬렉션 내부의 복잡한 데이터를 표현하는 데 유용합니다.
class Address {
late String street;
late String city;
}
class User {
late String name;
late Address address; // 임베드된 객체
}
설명:
@embedded: 임베드된 객체로 지정합니다.Isar의 스키마 개념은 데이터베이스 구조를 설계하는 데 필요한 핵심 요소를 제공합니다. 위의 내용을 기반으로 다양한 데이터를 효율적으로 저장하고 관리할 수 있습니다. 초보 Dart 개발자도 Isar를 활용하여 강력한 데이터베이스 기능을 구현할 수 있습니다.