앱 설계에 있어서 특정 데이터를 영구적으로 저장할 필요가 있습니다.
그럴 때 사용자의 스마트폰 내에 만들어지는 로컬DB를 설계합니다.
로컬DB는 다양한 패키지가 존재합니다만,
이번에는 고속 로컬DB 패키지 Isar Database를 소개합니다.
Isar Database란?
Isar Database는 Flutter를 위한 고속 크로스플랫폼 데이터베이스입니다.
앱에 영구적으로 저장하고 싶은 데이터가 있을 때 사용하는 로컬DB입니다.
다른 로컬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를 부여합니다.
import하고 있는 “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“는 무엇일까요?
users 메소드는 user 컬렉션에 대해 무언가 작업할 때 사용합니다.
자동 생성되는 “user.g.dart”에 의해 user 컬렉션을 위한
users 메소드가 함께 자동으로 정의됩니다.
사용자가 정의한 컬렉션명에 따라 이 컬렉션명도 변합니다.
예를 들어 정의한 컬렉션이 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);
});
컬렉션 조회
컬렉션 조회 방법은 여러 가지가 있습니다.
get을 사용한 조회
// 모든 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