Upgrade to Pro — share decks privately, control downloads, hide ads and more …

RxSwift x MVVM x Realm で保育の現場をDXしている話 / DX Childcare with RxSwift, MVVM and Realm

RxSwift x MVVM x Realm で保育の現場をDXしている話 / DX Childcare with RxSwift, MVVM and Realm

【アンドパッド×ユニファ】業界変革型 Vertical SaaS のiOS/Android開発最前線 のセッションにてお話しさせていただいた際のスライドです。

保育現場をDXするためのプロダクトだからこその難しさと、それに対して RxSwift x MVVM x Realm でどのようにプロダクトを開発してきたのかをお話ししました。

717e348de96d4638d6ff04aad91bc594?s=128

Hiroaki Akanuma

November 09, 2021
Tweet

Transcript

  1. RxSwift x MVVM x Realm で 保育の現場をDXしている話 2021.11.04 ユニファ株式会社 赤沼

    寛明
  2. 自己紹介 Twitter: @akanuma

  3. Purpose と Value

  4. プロダクト・事業 子どもの安全や保護者の安心と 保育業務の負担軽減を実現する 次世代型保育施設「スマート保育園®」 「スマート幼稚園®」「スマートこども 園®」の展開を進めることで、子どもと 保育者、そして家族にとって 質の高い保育の実現と、保育施設の 「社会インフラ化」を推進します。 保育現場に向け、業務効率だけでなく保育の質を上げるためのサポートを提供。

  5. プロダクト・事業 子どもの安全や保護者の安心と 保育業務の負担軽減を実現する 次世代型保育施設「スマート保育園®」 「スマート幼稚園®」「スマートこども 園®」の展開を進めることで、子どもと 保育者、そして家族にとって 質の高い保育の実現と、保育施設の 「社会インフラ化」を推進します。 保育現場に向け、業務効率だけでなく保育の質を上げるためのサポートを提供。

  6. ルクミーノート(保育者用アプリ)

  7. ルクミーノート(保育者用アプリ)

  8. 全体構成

  9. 全体構成(ルクミーノート部分抜粋)

  10. 全体構成(ルクミーノート部分抜粋)

  11. iOSアプリアーキテクチャ概要 • MVVM ◦ Model – View – ViewModel ◦

    社内でアプリ開発する場合のデフォルト ◦ ごくシンプルなアプリの場合はMVCも選択 View ViewModel Model Data Binding データ 参照・更新
  12. 主要ライブラリ • リアクティブプログラミング ◦ RxSwift ▪ RxDataSources ▪ NSObject+Rx ▪

    RxGesture ▪ NSObject+Rx • データベース ◦ Realm ▪ RxRealm ▪ RealmSwift • ネットワーク ◦ Alamofire ▪ RxAlamofire • リソース ◦ R.swift
  13. 事業特性に関するプロダクトの辛み • 複数プロダクトを一つのアプリで使える必要がある ◦ 保育現場でのユーザビリティを考慮して、4つのプロダクトを一つの iOS アプリにま とめている ▪ スーパーアプリ構成

    • 画面が複雑でビジネスロジックも複雑 • 複数プロダクトから同じデータの編集ができる必要がある ◦ 体温データをクラスボードからも連絡帳からも参照・編集できる必要がある、など
  14. 複数プロダクトのデータを参照

  15. 複数プロダクトのデータを参照

  16. 複数プロダクトからのデータ参照・更新 睡眠時間データなどは からも からも参照・更新が行われる

  17. アプリ構成(抜粋) API Sleep ViewController CommBook ViewController Sleep ViewModel CommBook ViewModel

    RxRealm で Binding データ参照・更新の APIリクエスト Data Binding Data Binding
  18. 初期表示 API Sleep ViewController CommBook ViewController Sleep ViewModel CommBook ViewModel

    RxRealm で Binding データ参照・更新の APIリクエスト Data Binding Data Binding ①APIをコールして データを取得
  19. 初期表示 API Sleep ViewController CommBook ViewController Sleep ViewModel CommBook ViewModel

    RxRealm で Binding データ参照・更新の APIリクエスト Data Binding Data Binding ②APIから取得した json データを Realm に保存
  20. クラスボードで更新したデータを連絡帳で参照するケース API Sleep ViewController CommBook ViewController Sleep ViewModel CommBook ViewModel

    RxRealm で Binding データ参照・更新の APIリクエスト Data Binding Data Binding ①更新操作
  21. Data Binding クラスボードで更新したデータを連絡帳で参照するケース API Sleep ViewController CommBook ViewController Sleep ViewModel

    CommBook ViewModel RxRealm で Binding データ参照・更新の APIリクエスト Data Binding ②ViewModelに反映
  22. クラスボードで更新したデータを連絡帳で参照するケース API Sleep ViewController CommBook ViewController Sleep ViewModel CommBook ViewModel

    RxRealm で Binding データ参照・更新の APIリクエスト Data Binding Data Binding ③Realmのデータ更新
  23. クラスボードで更新したデータを連絡帳で参照するケース API Sleep ViewController CommBook ViewController Sleep ViewModel CommBook ViewModel

    RxRealm で Binding データ参照・更新の APIリクエスト Data Binding Data Binding ④APIにデータ更新 リクエスト
  24. クラスボードで更新したデータを連絡帳で参照するケース API Sleep ViewController CommBook ViewController Sleep ViewModel CommBook ViewModel

    RxRealm で Binding データ参照・更新の APIリクエスト Data Binding Data Binding ⑤Realmのデータ 更新検知
  25. Data Binding クラスボードで更新したデータを連絡帳で参照するケース API Sleep ViewController CommBook ViewController Sleep ViewModel

    CommBook ViewModel RxRealm で Binding データ参照・更新の APIリクエスト Data Binding ⑥Viewに変更を反映
  26. RxSwift x MVVM x Realm にして良かったこと • データの参照や更新が様々なところで行われる仕様を実現するには、宣言的に 記述することができ、データの更新をトリガーにリアクティブに反映されるア ーキテクチャでなければ難しかった

    ◦ これをMVC構成で実現しようとすると、APIのレスポンスの処理を ViewController で行うことに なるなど、相当複雑になる • Realm は他のDBに比べるとセットアップが簡単で、リアクティブアーキテクチ ャで使いやすい
  27. RxSwift x MVVM x Realm にして難しかったこと • iOSエンジニアチームの中にこのアーキテクチャに慣れていないメンバーが おり、キャッチアップに時間がかかった •

    それぞれのプロダクトを別のエンジニアが並行して開発している中で、エン ジニア間での同期が足りておらず、 Realm の使い方で混乱が生じた • 将来的には RxSwift → SwiftUI + Combine ?
  28. まとめ Ø 保育現場の業務では扱われるデータ項目が多く、事務処理の内容も複雑なもの も多い。またユースケースも様々。 Ø そのような複雑な構成になるシステムのアーキテクチャには RxSwift x MVVM x

    Realm は有力な選択肢の一つ Ø メンバーのスキルセットによってはキャッチアップに時間がかかるため、学習 期間も見込んだスケジュールを立てることが必要