📖

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