📖
DAOとは?SwiftやFlutter/Dartをもとに改めて整理してみた
はじめに
- 普段は Swift や Flutter を使っていると「DAO」という言葉をあまり耳にしない
- でも Java を勉強していたときにはよく出てきて「なんだっけ?」となりがち
- そこで今回は DAO(Data Access Object) について整理してみました
DAO(Data Access Object)とは
- データベースとアプリケーションのやり取りを分離する設計パターン
- 役割:DBにアクセスする処理(SQLやクエリ)を専用のクラスにまとめる
- メリット:
- コードの責務分離
- 修正が楽になる(DB処理が1か所にまとまる)
- テストしやすい(DAOをモック化できる)
Javaの世界でのDAO
- Javaの学習では、DAOという言葉がよく出てくる
- 例:
UserDAO
クラスを作り、ユーザーデータ取得・保存処理をまとめる - Android公式ORM「Room」でも
@Dao
アノテーションが登場
@Dao
public interface UserDao {
@Query("SELECT * FROM user WHERE id = :id")
User findById(int id);
@Insert
void insert(User user);
}
SwiftやFlutterだと?
-
Swift(iOS)
- CoreDataやRealmなどのORMを使うと「DAOっぽい役割」を担うクラスが登場するが、「DAO」という言葉自体はあまり使わない
- RepositoryやServiceとしてまとめるのが一般的
-
Flutter(Dart)
-
sqflite
を直接使う場合は、自分で「LocalDataSource」や「DBService」クラスを作る - ORMライブラリ
floor
を使うとJavaと同じく@dao
が出てくる - 言葉としては「DAO」よりも「Repository」「DataSource」の方が一般的
-
Clean ArchitectureにおけるDAOの位置づけ
- DAOは Repository実装の中でDBを扱う部分
- 図にすると👇
UseCase → Repository(インターフェース)
↳ RepositoryImpl(実装)
↳ DAO(DB担当)
↳ API Client(リモート担当)
- Repositoryは「窓口」、DAOは「DB専用の部品」という関係
まとめ
- DAO = DBアクセスをまとめるクラス(パターン)
- JavaやAndroidではよく使う言葉
- SwiftやFlutterではあまり言葉としては出ないけど、同じ役割をするクラスは存在する
- Swift: CoreDataやRealmの管理クラス
- Flutter: LocalDataSourceやDBService
- DAOはRepository実装の中でDBとやり取りする部分 と整理すると理解しやすい
Discussion