Dart & Flutter용 Realm 소개

Dart & Flutter용 Realm 소개

Dart 플랫폼 프리미티브를 사용해서 Dart 및 Flutter 앱을 위한 풍부한 멀티플랫폼 라이브러리를 구축하는 방법에 대한 사례 연구예요.

출처: Introducing Realm for Dart & Flutter

본문

오늘 MongoDB가 Dart 및 Flutter용 Realm의 일반 공급(GA)을 발표한 걸 보니 정말 기뻐요! Realm은 반응형(reactive), 객체 지향, 크로스 플랫폼 데이터베이스로, 앱 개발자들 사이에서 인기가 많아요. 다시 말해 Dart와 Flutter에 완벽하죠. 그래서 지난 1년 동안 우리는 MongoDB와 협력해 Realm을 Dart와 Flutter로 가져왔어요. Realm이 무엇을 제공하는지, 이전 프리뷰에서 어떻게 개선됐는지, 앞으로 무엇을 계획하고 있는지에 대한 자세한 내용은 MongoDB의 블로그 게시물을 확인해 보세요. 우리는 Realm이 Dart & Flutter 개발자에게 아주 잘 맞을 거라고 생각해요.

이 동반(companion) 게시물에서는, 새 Dart 기반 개발자 SDK를 구축하는 실용적인 예시로, Dart & Flutter용 Realm이 어떻게 구축됐는지 무대 뒤를 살짝 들여다볼게요.

Realm 예시

Realm SDK의 구현을 파고들기 전에, Dart 터미널 앱에서 작업하는 개발자로서 SDK를 어떻게 사용하는지 빠르게 둘러볼게요(참고: Flutter 앱의 단계는 약간 다르고, 자세한 내용은 문서를 참조하세요).

먼저 데이터 모델을 정의해요. 이는 몇 가지 Realm 어노테이션을 추가한 일반적인 Dart 클래스를 사용해서 해요. 책에 대한 샘플 데이터 클래스는 이렇습니다:

모델을 정의하고 데이터 모델이 완전히 생성되면(아래 참조), Realm 데이터 저장소에 책 몇 권을 쓸 수 있어요.

Dart 및 Flutter용 Realm이 어떻게 구축됐는가

기본을 다뤘으니, 이제 MongoDB 팀이 여러 Dart 라이브러리와 도구를 활용해서 Dart 및 Flutter용 Realm을 어떻게 구축했는지 살펴볼게요. Realm SDK가 초기화될 때 무슨 일이 일어나는지, Realm SDK가 공유 네이티브 C++ 라이브러리 위에 어떻게 구축됐는지, Realm 터미널 도구가 어떻게 만들어졌는지, 그리고 Realm 모델이 어떻게 생성되는지 보겠어요.

Realm SDK 초기화하기

Dart 및 Flutter 개발자는 기존 앱에 Realm을 추가하는 것으로 시작해서, 설치 프로그램을 실행하게 돼요:

dart pub add realm_dart
dart run realm_dart install

첫 번째 단계는 Realm SDK를 pubspec.yaml에 추가해서 앱의 의존성으로 등록하는 거예요. 두 번째 단계는 Realm 터미널 도구를 실행해서 SDK를 설치하라고 요청하는 거예요. install 커맨드의 소스 코드를 들여다보면, install이 우리가 개발 중인 운영 체제를 판단한 다음, 그 운영 체제에 맞는 Realm SDK 바이너리를 다운로드한다는 걸 알 수 있어요.

그런데 왜 install 커맨드가 바이너리를 다운로드할까요? Realm SDK는 매우 포괄적인 제품으로, 광범위한 운영 체제와 개발자 프레임워크에서 사용할 수 있어요. Realm SDK의 많은 인스턴스를 빌드하지 않아도 되도록, Realm 팀은 핵심 Realm SDK를 공유된 realm-core C++ 라이브러리로 구현하기로 결정했어요. 그래서 install 커맨드가 실제로 하는 일은 앱이 지원하는 모든 플랫폼에 대해 이 핵심 라이브러리의 컴파일된 버전을 다운로드하는 거예요.

realm-core SDK 호출하기

Realm SDK를 사용해서 Dart나 Flutter 앱을 작성하는 사용자는 이 포스트의 시작부분에서 본 것처럼 좋고 강력하게 타입된 Dart API를 얻게 돼요. 그런 API들이 realm-core C++ 라이브러리와 어떻게 대응할까요?

Realm SDK의 lib 디렉터리 안을 들여다보면 realm_bindings.dart를 찾을 수 있는데, 이 파일은 이렇게 시작해요:

수수께끼가 풀렸어요. Realm SDK는 dart:ffi 라이브러리를 통한 네이티브 API와의 상호 운용성 지원을 사용해서 realm-core를 호출해요. 사용 가능한 아주 많은 Realm API에 대해 FFI 바인딩을 수동으로 작성하지 않아도 되도록, 바인딩은 Dart의 ffigentool을 사용해서 자동 생성돼요. 이것은 우리가 Dart 팀 전체에서 빠르게 성장하고 있는 패턴이라고 볼 수 있어요.

Realm 터미널 도구

이제 Realm 터미널 도구를 살펴볼게요. 위에서 install 커맨드를 실행했지만, 커맨드를 지정하지 않고 도구를 실행할 수도 있어요:

$ dart run realm_dart
Realm commands for working with Realm Flutter & Dart SDKs.

Usage: dart run realm|realm_dart <command> [arguments]

Global options:
-h, --help    Print this usage information.

Available commands:
  generate   Generate Realm objects from data model classes
  install    Download & install Realm native binaries into a Flutter or Dart project
  metrics    Report anonymized builder metrics to Realm

Run "dart run realm|realm_dart help <command>" for more information about a command.

이 출력 결과가 핵심 dart 및 flutter 도구의 출력과 아주 비슷해 보인다는 걸 눈치챘을 거예요. 이것은 우연이 아니에요. 세 도구 모두 터미널 도구를 위한 동일한 Dart 기반 라이브러리를 package:args로부터 사용해서 구축됐거든요.

  • args 라이브러리는 원시 명령줄 인수를 옵션과 플래그로 파싱하는 풍부한 지원을 가지고 있어요.
  • command_runner 라이브러리는 도구가 지원하는 커맨드(예: install)에 대한 구조를 제공해요.

Realm 모델 생성하기

generate 커맨드는 특히 흥미로워요. "Realm 예시" 섹션에서 정의한, 어노테이션된 Dart 모델 클래스에서 완전한 Realm 모델을 생성하기 때문이에요:

dart run realm_dart generate

generate 커맨드는 어떻게 동작할까요? 이는 Dart의 build_runner 위에 구축된 Realm 생성기(generator)에 의존해요. build_runner는 입력 파일 세트를 받아 새 출력 파일을 만드는 생성기용 프레임워크예요. 일반적으로 — Realm의 경우처럼 — 입력은 어노테이션이 있는 Dart 소스 코드 파일이고, 출력 파일은 추가로 생성된 Dart 소스 코드예요.

마무리 생각

커튼 뒤에서, 재사용 가능한 Dart 라이브러리 세트로 커다란 개발자 프레임워크를 어떻게 구축할 수 있는지 들여다보는 게 즐거웠길 바라요. 프레임워크 개발자라면, 다음 Dart 기반 프레임워크에 대한 영감을 얻을 수 있길 바래요.

Dart 및 Flutter 앱 개발자라면, Realm은 MongoDB 팀의 훌륭한 새 제품이에요. Realm SDK 문서와 오늘의 Realm 블로그 게시물을 확인해 보시길 권해요.