Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Databaseのことを考えずにiOSアプリを作る ローカルデータベースを使うときの アーキ...
Search
ムッチョ
March 04, 2024
Programming
310
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Databaseのことを考えずにiOSアプリを作る ローカルデータベースを使うときの アーキテクチャ設計
ムッチョ
March 04, 2024
Transcript
25 slides
Databaseのことを考えずにiOSアプリを作る ローカルデータベースを使うときの アーキテクチャ設計
自己紹介 • ヤズジュムーサー(ムッチョ) • VoicyのiOSエンジニア • Androidもぼちぼちやってます • 趣味はボルダリング Mucchooooo
個人開発もやってます!
ローカルデータベースで 苦労した経験はありますか?
データベースのオブジェクトの扱いには ルールが多い!
例えば... Realm このRealmオブジェクトは普通の変数のよう に取得したり変更したりできない。
考えなきゃいけない ルール • Realmインスタンスの扱い方 • Threadは単一のものを使用しているか • etc. Realmの場合
データベースオブジェクトの扱いに付随するルール はたくさんある Realmの場合 1. threadを跨いでオブジェクトにアクセスするとクラッシュ 2. realm.write {} ブロックの外でrealmオブジェクトを編集するとクラッシュ 3.
モデル定義にないプロパティへアクセスしようとするとクラッシュ 4. 削除済みのRealmオブジェクトにアクセスしようとするとクラッシュ 5. Realmインスタンスを適切にクローズしないとリソースのリークや不正な状態の参照でクラッシュ CoreDataの場合 1. Contextを異なるThread間で共有するとクラッシュ 2. フェッチリクエストが完了する前に結果セットにアクセスしようとするとクラッシュ 3. モデル定義にないエンティティにアクセスしようとするとクラッシュ 4. 削除されたか、コンテキストに属していないマネージドオブジェクトを操作するとクラッシュ 5. モデルの属性に対して予期しない型のデータを設定しようとするとクラッシュ 6. コンパイルされたモデルとコード内のモデルが一致しない場合クラッシュ
データベースオブジェクトの扱いに付随するルール はたくさんある Realmの場合 1. threadを跨いでオブジェクトにアクセスするとクラッシュ 2. realm.write {} ブロックの外でrealmオブジェクトを編集するとクラッシュ 3.
モデル定義にないプロパティへアクセスしようとするとクラッシュ 4. 削除済みのRealmオブジェクトにアクセスしようとするとクラッシュ 5. Realmインスタンスを適切にクローズしないとリソースのリークや不正な状態の参照でクラッシュ CoreDataの場合 1. Contextを異なるThread間で共有するとクラッシュ 2. フェッチリクエストが完了する前に結果セットにアクセスしようとするとクラッシュ 3. モデル定義にないエンティティにアクセスしようとするとクラッシュ 4. 削除されたか、コンテキストに属していないマネージドオブジェクトを操作するとクラッシュ 5. モデルの属性に対して予期しない型のデータを設定しようとするとクラッシュ 6. コンパイルされたモデルとコード内のモデルが一致しない場合クラッシュ ルールを守るのは 難しい・苦労する
ルールに違反していても、コンパイルエ ラーが起きない上、コードから違反箇所を 見つけることは難しい。 開発者かユーザーがクラッシュするまで 見つけられない可能性も
データベースオブジェクトの ルールは 品質的にも脅威 開発効率的にも脅威
データベースのオブジェクトを 普通の変数のように自由に扱いたい!
Solution 1.データベース用のオブジェクトと普通のオ ブジェクトを用意する Normal Object Realm Object
2.オブジェクト同士を 変換できる状態にする Normal Object Realm Object
3. Realm Serviceを用意 データベースに関わる処理を担当 Realmに依存しないCard配列を 他の全てのファイルで使う
4.アプリ起動時にRealm ObjectをFetchして Normal Objectに変換 RealmCard情報をfetchして Card配列に変換
Card配列に少しでも変更があると syncronizeWithRealm() が呼ばれる バックグラウンドスレッドにて Card配列をRealmCardに変換し、 情報をRealmデータに適用 4.Normal Objectが変更された時 Realm Objectが自動で変更される状態を作る
普通の使い方の場合 Realm Card
普通の使い方の場合 Realm Cardを扱う全てのファイル (View, ViewModel, Testファイルなど) がRealmに依存する+ルールに従う義務を負う Realm Card
今回のアーキテクチャの場合 起動時のFetch・Cardへの変換 Cardが変更されるたび自動でRealmに保存 Realm Card Card Realm Service
今回のアーキテクチャの場合 起動時のFetch・Cardへの変換 Cardが変更されるたび自動でRealmに保存 アプリ全体ではRealmに一切依存しないCardクラスが使われるため、 RealmService以外の全てのファイルがRealmに依存しない。 Realmのことを一切考えずに開発ができる! Realm Card Card Realm
Service
今回紹介したアーキテクチャの メリット 1. 保守性・開発効率の向上! ルールから脱却!データベースのことを考えずに開発ができる! 2. 最高レベルのUIパフォーマンスを達成できる! データの更新は常にバックグラウンド。 データ量が膨大になるとローカルデータベースでも重くなりがちだが、いつでも超高速 3.
テストも書きやすくなる+動作も高速! テストの実行がデータベースに依存しない 。パラレル実行なども簡単。 4. コード全体がデータベースに依存しない。 もしデータベースを変更するとしても書き直しが少ない。
まとめ データベースのオブジェクトは デリケートなアイテム 直に触れることは避けるのがベター
デメリット、コード、詳しい解説は Zennにあります! https://zenn.dev/voicy/articles/dd42bfbee7de01
ありがとうございました!
More Decks by ムッチョ
See All by ムッチョ
AndroidアプリのUIをGeminiで生成する
musayazuju
0
140
Architecture Design for Local Database ~ Realm, CoreData, SwiftData ~
musayazuju
0
160
Generate Android App UI with Gemini
musayazuju
2
210
CoreDataからSwiftDataへの移行
musayazuju
1
220
Other Decks in Programming
See All in Programming
全ての永続トークンを、生まれる前に消し去りたい!
sylph01
3
1.7k
Goコンパイラを作ってGoをもっと理解する / Build a Go compiler to better understand Go
ikura_hamu
0
130
graphql-ruby を Spinel で速くしようとした話
mtsmfm
0
140
AIで開発が速くなった先で、開発チームは何を目指すか
shihochan
1
2k
ビジネスロジックを堅牢に~Scala 3のドメインプリミティブ~
j5ik2o
0
150
Enforcing Your Architecture with Unit Tests in the AI Era (Swift Connection X)
steliosf
PRO
1
170
動画プレイヤーはなぜカクつくのか 〜Flutterのレンダリングとネイティブの境界を解剖する〜
naruogram
0
340
[Kotlin Fest 2026] eBPF Tracing for Kotlin
takehaya
0
120
baseline으로 마이그레이션, 리팩토링 안전하게 맡기기
fornewid
1
980
自作Discord音声botをLambda MicroVMsに移行した話 / Migrating My Discord Voice Bot to Lambda MicroVMs
akihisaikeda
1
320
Python Lambdaにおけるテストしやすい設計とAI支援の活用 / Designing Testable Python Lambda Functions with AI
kitano_yuichi
1
320
作って学ぶSpring BootのAuto Configuration / JJUG Night Seminar 2026-10-19
rshindo
0
230
Featured
See All Featured
We Have a Design System, Now What?
morganepeng
55
8.4k
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
2
2.1k
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
400
Product Roadmaps are Hard
iamctodd
55
13k
Navigating Weather and Climate Data
rabernat
0
590
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
610
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
850
Speed Design
sergeychernyshev
33
2.2k
The Mindset for Success: Future Career Progression
greggifford
PRO
0
560
From π to Pie charts
rasagy
1
450
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
470
GraphQLの誤解/rethinking-graphql
sonatard
75
12k