Isar 개념 1- schema(스키마)

pharmDev·2024년 12월 31일

isar

목록 보기
1/7

Isar 스키마 개념

1. 컬렉션의 구조

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의 기본 키로 사용됩니다. 자동 증가 값을 설정할 수 있습니다.
  • 각 필드는 컬렉션의 데이터로 저장됩니다.

추가 설정 (Config):

컬렉션은 설정값을 추가할 수 있습니다.

  • name: 컬렉션 이름 지정
  • inheritance: 상속 여부 지정

예:

(name: 'users')
class User {
  ...
}

2. Isar ID

모든 컬렉션에는 고유 식별자인 ID가 필요합니다. 기본적으로 Id 타입은 자동 증가 값으로 설정되며, 다음과 같이 정의합니다:

예시:

Id id = Isar.autoIncrement;

설명:

  • Isar.autoIncrement: ID를 자동으로 증가시킵니다.
  • 직접 ID를 설정할 수도 있지만, 자동 증가 기능은 편리합니다.

3. 컬렉션과 필드 이름 변경

컬렉션이나 필드 이름은 Isar가 자동으로 저장하지만, 필요시 이름을 변경할 수 있습니다.

예시 코드:


class User {
  ('user_name')
  late String name;

  ('user_age')
  late int age;
}

설명:

  • @Name: 데이터베이스에 저장될 이름을 지정합니다.
  • 필드 이름과 데이터베이스 내 이름을 다르게 설정할 때 유용합니다.

4. 필드 무시하기

필드 중 일부를 데이터베이스에 저장하지 않으려면 @ignore를 사용합니다.

예시 코드:


class User {
  late String name;

  
  late String tempData; // 데이터베이스에 저장되지 않음
}

설명:

  • @ignore: 해당 필드는 데이터베이스에 포함되지 않습니다.
  • 임시 데이터나 내부적으로만 사용하는 값을 필드로 지정할 때 사용됩니다.

5. 지원하는 타입 목록

Isar는 다양한 타입을 지원합니다. 다음은 주요 지원 타입 목록입니다:

  • 기본 타입: int, double, bool, String
  • 컬렉션 타입: List
  • 기타: DateTime, Enum, Embedded objects

코드 예시:


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: 날짜 및 시간 데이터를 저장할 수 있습니다.

6. Nullable 타입

Nullable 타입은 필드가 null 값을 가질 수 있도록 허용합니다. late 키워드 대신 nullable(?)을 사용하면 됩니다.

예시:


class User {
  String? nickname; // null 허용

  int? age; // null 허용
}

설명:

  • ?: 해당 필드가 null 값을 가질 수 있도록 설정합니다.

7. DateTime

DateTime은 시간 정보를 다룰 때 사용됩니다. Isar는 이 타입을 기본적으로 지원하며, 다음과 같이 정의할 수 있습니다.

예시:


class Event {
  late DateTime startTime; // 시작 시간

  late DateTime endTime; // 종료 시간
}

설명:

  • DateTime: 날짜 및 시간 데이터를 저장할 때 사용합니다.

8. Enum

Enum 타입은 제한된 값 목록을 저장할 때 사용합니다. Isar는 Enum 타입을 지원하며, 다음과 같이 설정합니다.

예시:

enum Status {
  active,
  inactive,
  pending,
}


class Task {
  late Status status;
}

EnumType에 대한 추가 설명:

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 저장 방식 (EnumType):

Enum 값을 Isar에 저장할 때 네 가지 방식이 있습니다. 이 방법들은 Enum 값이 데이터베이스에서 어떻게 저장되고 관리될지를 결정합니다.

  1. ordinal: Enum 값을 인덱스(순서)로 저장합니다. 이는 매우 효율적이지만, null 값은 허용되지 않습니다. 예를 들어, Enum의 첫 번째 값은 0, 두 번째 값은 1로 저장됩니다.

  2. ordinal32: Enum 값을 4바이트 정수(short)로 저장합니다. 이 방식은 더 많은 범위의 값을 처리할 수 있습니다.

  3. name: Enum 값을 문자열(String)로 저장합니다. 예를 들어, UserRole.admin은 'admin'으로 저장됩니다. 이 방식은 Enum 값의 순서를 변경해도 영향을 받지 않으므로 안전합니다.

  4. 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 값마다 고유 값 설정 가능
}

추가 설명:

  • ordinalordinal32: Enum 값의 순서가 바뀌면 기존 데이터에 오류가 생길 수 있습니다.
  • name: Enum 값의 이름을 저장하므로 순서 변경에 안전합니다.
  • value: Enum 값에 부가적인 정보를 저장하고 싶을 때 유용합니다.

9. 임베드된 객체

Isar는 임베드된 객체를 통해 계층적 데이터를 저장할 수 있습니다. 여기서 임베드된 객체란, 한 데이터 안에 또 다른 데이터를 포함하는 방식입니다. 예를 들어, 사용자(User)라는 데이터가 주소(Address)라는 데이터를 포함할 때, 주소를 별도의 데이터로 저장하지 않고 사용자 데이터 안에 포함시킬 수 있습니다. 임베드된 객체는 컬렉션 내부의 복잡한 데이터를 표현하는 데 유용합니다.

예시:


class Address {
  late String street;
  late String city;
}


class User {
  late String name;

  late Address address; // 임베드된 객체
}

설명:

  • @embedded: 임베드된 객체로 지정합니다.
  • 임베드된 객체는 별도 컬렉션이 아닌, 부모 컬렉션에 포함됩니다.

정리

Isar의 스키마 개념은 데이터베이스 구조를 설계하는 데 필요한 핵심 요소를 제공합니다. 위의 내용을 기반으로 다양한 데이터를 효율적으로 저장하고 관리할 수 있습니다. 초보 Dart 개발자도 Isar를 활용하여 강력한 데이터베이스 기능을 구현할 수 있습니다.

profile
코딩을 배우는 초보

0개의 댓글