Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

自己紹介 Twitter: @akanuma

Slide 3

Slide 3 text

Purpose と Value

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

全体構成

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

iOSアプリアーキテクチャ概要 ● MVVM ○ Model – View – ViewModel ○ 社内でアプリ開発する場合のデフォルト ○ ごくシンプルなアプリの場合はMVCも選択 View ViewModel Model Data Binding データ 参照・更新

Slide 12

Slide 12 text

主要ライブラリ ● リアクティブプログラミング ○ RxSwift ■ RxDataSources ■ NSObject+Rx ■ RxGesture ■ NSObject+Rx ● データベース ○ Realm ■ RxRealm ■ RealmSwift ● ネットワーク ○ Alamofire ■ RxAlamofire ● リソース ○ R.swift

Slide 13

Slide 13 text

事業特性に関するプロダクトの辛み ● 複数プロダクトを一つのアプリで使える必要がある ○ 保育現場でのユーザビリティを考慮して、4つのプロダクトを一つの iOS アプリにま とめている ■ スーパーアプリ構成 ● 画面が複雑でビジネスロジックも複雑 ● 複数プロダクトから同じデータの編集ができる必要がある ○ 体温データをクラスボードからも連絡帳からも参照・編集できる必要がある、など

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

アプリ構成(抜粋) API Sleep ViewController CommBook ViewController Sleep ViewModel CommBook ViewModel RxRealm で Binding データ参照・更新の APIリクエスト Data Binding Data Binding

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

初期表示 API Sleep ViewController CommBook ViewController Sleep ViewModel CommBook ViewModel RxRealm で Binding データ参照・更新の APIリクエスト Data Binding Data Binding ②APIから取得した json データを Realm に保存

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

RxSwift x MVVM x Realm にして良かったこと ● データの参照や更新が様々なところで行われる仕様を実現するには、宣言的に 記述することができ、データの更新をトリガーにリアクティブに反映されるア ーキテクチャでなければ難しかった ○ これをMVC構成で実現しようとすると、APIのレスポンスの処理を ViewController で行うことに なるなど、相当複雑になる ● Realm は他のDBに比べるとセットアップが簡単で、リアクティブアーキテクチ ャで使いやすい

Slide 27

Slide 27 text

RxSwift x MVVM x Realm にして難しかったこと ● iOSエンジニアチームの中にこのアーキテクチャに慣れていないメンバーが おり、キャッチアップに時間がかかった ● それぞれのプロダクトを別のエンジニアが並行して開発している中で、エン ジニア間での同期が足りておらず、 Realm の使い方で混乱が生じた ● 将来的には RxSwift → SwiftUI + Combine ?

Slide 28

Slide 28 text

まとめ Ø 保育現場の業務では扱われるデータ項目が多く、事務処理の内容も複雑なもの も多い。またユースケースも様々。 Ø そのような複雑な構成になるシステムのアーキテクチャには RxSwift x MVVM x Realm は有力な選択肢の一つ Ø メンバーのスキルセットによってはキャッチアップに時間がかかるため、学習 期間も見込んだスケジュールを立てることが必要