DAO パターン
DAO パターンとは
DAO(Data Access Object)パターンは、データベースへのアクセス処理をビジネスロジックから分離し、専用のオブジェクトに集約するデザインパターンである。Java EE(現 Jakarta EE)の設計パターンカタログにも含まれており、エンタープライズアプリケーション開発で広く使われている。
DAO パターンの目的は、データの取得・保存の方法(How) と ビジネスロジック(What) を分離することにある。これにより、データベースの種類や SQL の実装詳細をビジネスロジック側が意識する必要がなくなる。
なぜ SIer で重要か
SIer の業務システムでは、ほぼすべてのシステムがデータベースを使用する。DAO パターンを採用することで、以下のメリットが得られる。
- データベース変更への対応 --- 開発環境では PostgreSQL、本番環境では Oracle を使うような場合でも、DAO の実装を切り替えるだけで対応できる。
- テストのしやすさ --- DAO をインターフェース化しておけば、モック(疑似実装)に差し替えてビジネスロジックのテストを行える。
- SQL の管理が容易 --- SQL がビジネスロジックのコードに散在するのではなく、DAO に集約されるため、SQL の確認・修正が容易になる。
SIer のプロジェクトでは設計書にも「DAO 一覧」や「SQL 一覧」が成果物として含まれることが多く、DAO パターンは設計レベルで組み込まれている。
基本概念
DAO の構造
DAO パターンの基本的な構成要素は以下の 3 つである。
DAO インターフェース
データアクセスの操作(CRUD)を定義する。ビジネスロジック層はこのインターフェースに対してプログラミングする。
DAO 実装クラス
DAO インターフェースを実装し、実際の SQL 発行やデータベース接続を行うクラス。
Entity(エンティティ)
データベースのテーブル 1 行分のデータを表現するクラス。DTO(Data Transfer Object)として使われることもある。
処理の流れ
Service(ビジネスロジック)
↓ メソッド呼び出し
DAO インターフェース
↓ 実装クラスが処理
DAO 実装クラス
↓ SQL 発行
データベース
CRUD 操作の例
DAO では一般的に以下の CRUD 操作を定義する。
| 操作 | メソッド名の例 | SQL |
|---|---|---|
| Create(作成) | insert(entity) | INSERT |
| Read(取得) | findById(id), findAll() | SELECT |
| Update(更新) | update(entity) | UPDATE |
| Delete(削除) | delete(id) | DELETE |
SIer での使われ方
MyBatis の Mapper が DAO に相当する
SIer の Java 開発で広く使われている MyBatis フレームワークでは、Mapper インターフェース が DAO の役割を果たす。Mapper インターフェースを定義し、対応する XML ファイル(または アノテーション)に SQL を記述するという構成になっている。
UserMapper.java ← DAO インターフェースに相当
UserMapper.xml ← SQL を定義した XML ファイル
UserEntity.java ← Entity クラス
MyBatis を使う場合、DAO 実装クラスを自分で書く必要はない。MyBatis がランタイムに Mapper インターフェースの実装を自動生成してくれるため、開発者はインターフェースと SQL だけを定義すればよい。
Spring Framework との組み合わせ
Spring Framework と組み合わせる場合、DAO(Repository)は @Repository アノテーションでマークされ、DI(依存性注入)コンテナによって管理される。Service クラスからは以下のように利用する。
@Service
public class UserService {
private final UserRepository userRepository;
// コンストラクタインジェクション
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public User getUser(Long id) {
return userRepository.findById(id);
}
}
DAO と Repository の違い
SIer のプロジェクトでは「DAO」と「Repository」という用語が混在することがある。厳密には異なる概念だが、実務上はほぼ同じ意味で使われることが多い。
| 用語 | 出自 | ニュアンス |
|---|---|---|
| DAO | Java EE パターン | データソース(DB)へのアクセスを抽象化 |
| Repository | ドメイン駆動設計(DDD) | ドメインオブジェクトのコレクションを抽象化 |
Spring Data JPA では Repository インターフェースが使われ、MyBatis では Mapper インターフェースが使われるが、いずれもデータアクセスを抽象化するという本質的な役割は同じである。
まとめ
- DAO パターンはデータベースアクセスをビジネスロジックから分離するパターンである
- CRUD 操作を DAO インターフェースとして定義し、実装詳細を隠蔽する
- SIer の Java 開発では MyBatis の Mapper が DAO の役割を果たしている
- Spring Framework の
@Repositoryと組み合わせて DI コンテナで管理される - DAO と Repository は厳密には異なる概念だが、実務上はほぼ同義で使われる