【기초】로컬 DB! Isar Database

앱 설계 시 특정 데이터를 영구적으로 저장해야 할 필요성이 생길 때가 있습니다. 이때 사용자의 스마트폰 내부에 설계하는 DB, 즉 로컬 DB를 사용합니다.

로컬 DB에는 다양한 패키지가 존재하지만, 이번에는 그 중에서도 자주 사용되는 “Isar Database” 패키지를 소개합니다.

Isar Database란?

Isar Database는 Flutter를 위한 고속 크로스 플랫폼 데이터베이스입니다. 앱의 데이터를 로컬에 영구적으로 저장할 때 사용합니다.

다른 로컬 DB도 있지만, Isar Database는 다음과 같은 이유로 인기가 있습니다.

  • 빠른 속도와 효율
  • 초보자도 사용하기 쉬움
  • NoSQL 데이터베이스이기 때문에 확장성이 높음
    (앱의 성장에 맞춰 확장 가능)

언제 필요한가?

일반적인 앱에서 사용하는 변수나 상태(State)는 앱이 종료되면 데이터도 함께 사라집니다.
하지만 앱을 설계할 때, 사용자 작업으로 발생한 상태나 변수를 다음 시작 시에 이어받아 처리하고 싶은 경우가 생깁니다.

이때 Isar Database에 데이터를 저장함으로써 영구적으로 관리할 수 있습니다.

Isar Database 사용법

Isar Database는 문서형의 NoSQL입니다. RDB의 경우 데이터를 “레코드”라고 하지만, 문서형 NoSQL에서는 “컬렉션”이라고 합니다.

사용 방법은 다음과 같습니다.

환경 준비

“pubspec.yaml”에 필요한 패키지를 추가합니다.

dependencies:

  flutter:
    sdk: flutter
  flutter_localizations: 
    sdk: flutter
  isar: ^3.1.0
  isar_flutter_libs: ^3.1.0

dev_dependencies:
  build_runner: ^2.3.3
  dart_code_metrics: ^5.4.0

  flutter_lints: ^2.0.0
  flutter_test:
    sdk: flutter
  isar_generator: ^3.1.0
  • isar: Isar 데이터베이스의 핵심 라이브러리
  • isar_flutter_libs: Flutter에서 Isar를 사용하기 위한 추가 라이브러리
  • build_runner: Dart의 코드 생성을 위한 도구
  • isar_generator: Isar의 코드 자동 생성 도구. 모델에서 필요한 코드를 자동 생성합니다.

컬렉션 정의

어떤 데이터를 관리할지 정의합니다.
예를 들어, 로그인 등에 사용할 사용자 정보를 “user.dart”에 정의해 봅시다.

import 'package:isar/isar.dart';
import 'user.g.dart';

@collection
class User {
  // ID를 Isar의 기능으로 자동 증가
  Id? id = Isar.autoIncrement;
  String? userName;
  String? eMail;
}

규칙1:@collection
정의의 시작에 “@collection”을 기술합니다.
Isar가 데이터베이스 테이블로 인식하기 위한 어노테이션입니다.
“여기에 컬렉션을 정의하고 있습니다”라는 표시입니다.

규칙 2: 유니크한 ID
컬렉션을 정의할 때는 반드시 유일하게 식별할 수 있는 ID를 설정해야 합니다.
이번에는 id에 “Isar.autoIncrement”를 사용합니다.
Isar.autoIncrement를 사용하면 Isar가 자동으로 유니크한 ID를 할당합니다.

インポートしている”user.g.dart”は、この時点では存在しません。
以下コードをターミナルで実行することで”user.g.dart”が作成されます。

flutter pub run build_runner build --delete-conflicting-outputs


컬렉션 등록

삽입하고 싶은 데이터용 객체를 생성하고 put하면 컬렉션을 삽입할 수 있습니다.

final user = User()
  ..userName = 'John Doe'
  ..eMail = 'john@example.com';

await isar.users.put(user);
users에 대하여

isar.users.put의 “users”는 무엇일까요?

자동 생성된 “user.g.dart”에 의해 user 컬렉션을 위한 users 메서드가 정의됩니다.
users 메서드는 user 컬렉션에 대해 어떤 작업을 할 때 사용합니다.
정의한 컬렉션이 Item이라면 Items입니다.

메서드 이름이 불분명한 경우 “xxx.g.dart”를 참조해 보세요.

컬렉션 업데이트

컬렉션 업데이트는 등록 시와 같은 put을 사용합니다.
ID를 가진 객체를 생성하고 put하면 업데이트할 수 있습니다.
이때 ID가 이미 존재하는 경우 컬렉션 업데이트가 이루어지고, 존재하지 않는 경우 삽입됩니다.

final user = User()
  ..id = 123
  ..userName = 'John Doe'
  ..eMail = 'john@example.com';

await isar.users.put(user);


컬렉션 삭제

컬렉션 삭제는 ID를 지정하여 delete를 실행합니다.

await isar.users.delete(123);


트랜잭션 처리

컬렉션의 등록, 업데이트, 삭제는 일반적으로 트랜잭션 처리로 실행합니다.

final user = User()
  ..id = 123
  ..userName = 'John Doe'
  ..eMail = 'john@example.com';

// 아래의 처리가 모두 커밋된 경우, DB가 업데이트됩니다.
await isar.writeTxn(() async {
  await isar.users.put(user);
  await isar.users.delete(123);
});


컬렉션 가져오기

컬렉션을 가져오는 방법은 여러 가지가 있습니다.

// 모든 User 컬렉션 가져오기
final user = await isar.users;

// ID "123"의 User 컬렉션 가져오기
final user = await isar.users.get(123);


Filter 절 사용법

Filter 절은 컬렉션의 요소에 대해 조건을 지정하여 검색할 수 있습니다.

// eMail에 "@example.com"이 포함된 것을 가져오기
final users = await isar.users
 .filter()
 .emailcontains('@example.com')
 .findAll();
  //※"findAll()"은 일치하는 모든 컬렉션을 가져옵니다.

Where 절 사용법

Where 절은 인덱스를 설정한 요소에만 조건으로 사용할 수 있습니다.
반면 Filter 절은 어떤 요소에도 사용할 수 있지만, Where 절이 처리 속도가 더 빠릅니다.

예를 들어, user.dart가 다음과 같은 컬렉션을 정의했다고 가정합니다.

import 'package:isar/isar.dart';
import 'user.g.dart';

@collection
class User {
  Id? id = Isar.autoIncrement;
  String? userName;

  // 나이라는 요소에 인덱스 설정
  @Index()
  String? age;

  String? eMail;
}

다음과 같은 Where 절이 설정될 수 있습니다.

// 나이가 30세인 컬렉션 가져오기
final user = await isar.users
  .where()
  .ageEqualTo(30)
  .findAll();

// 나이가 30세 이상인 컬렉션 가져오기
final user = await isar.users
  .where()
  .ageGreaterThan(30)
  .findAll();

“ageEqualTo”나 “ageGreaterThan”의 파라미터는 자동 생성된 ‘user.g.dart’에 정의되어 있습니다.

공식 사이트 소개

이번에 설명한 내용 외에도 Isar Database는 다양한 사용 방법이 있습니다.
관심 있는 분은 공식 사이트를 참조해 주세요.

공식 사이트:https://isar.dev/ko/schema.html

제목과 URL을 복사했습니다