📘 Vol.10.0：DAO / DTO / JavaBeansとは？ ― データ層設計の全体像と役割分担 ―

### 🟦 はじめに
Webアプリケーションにおいて、**「入力されたデータを処理してDBに保存し、結果を画面に返す」** という一連の処理は、どの案件でも不可欠な流れです。

この中で中心的な役割を担うのが、

- DTO（Data Transfer Object）

- DAO（Data Access Object）

- JavaBeans（Javaでのデータ構造の基礎的形式）

です。
本章ではこれら3つの役割や関係性、MVCフレームワーク（特にStruts2）での位置付けを明確に整理し、次章以降の実装編や構築編に向けて「基礎知識の地盤」を固めます。

---

### 🟨 1. JavaBeansとは？ ～ DTOのベースとなる規約 ～

JavaBeansは、Javaにおける「データ構造クラス」の標準的な書き方です。

### 🔹 JavaBeansの基本ルール

- publicクラスであること

- 引数なしのコンストラクタがあること

- getter/setterが正しく定義されていること

```java
public class User {
    private int userId;
    private String username;

    public int getUserId() { return userId; }
    public void setUserId(int userId) { this.userId = userId; }

    public String getUsername() { return username; }
    public void setUsername(String username) { this.username = username; }
}
```
### 🔹 なぜ必要なのか？

- JSPやStruts2では、自動的にプロパティがバインディングされる（例：フォーム入力 → Bean）

- EL式でのプロパティ参照（${user.username}）などで動作する前提がJavaBeans準拠

JavaBeansはDTOやModelを構成する「最小単位」であり、全てのデータ設計の土台になります。

---

### 🟨 2. DTO（Data Transfer Object）とは？
DTOは、**画面とのやり取り用に使うデータの器（オブジェクト）** です。

### 🔹 役割
- 画面入力データを受け取る

- DBから取得した結果を画面に返す

- DAOやビジネスロジックと連携する中継役

### 🔹 特徴
- 複数の値を一括で持ち回せる

- 仕様変更があっても影響をコントロールしやすい

- DBエンティティと同一とは限らない（Viewに最適化された構造も可）

### 🔹 Struts2での使用例
フォームに入力されたデータをDTOにマッピングし、そのDTOをActionクラスで受け取り、DAOに渡して処理する構成が一般的です。

### 🔹 Struts2での使用例
フォームに入力されたデータをDTOにマッピングし、そのDTOをActionクラスで受け取り、DAOに渡して処理する構成が一般的です。

```jsp
<s:form action="login">
  <s:textfield name="user.username" label="ユーザー名"/>
  <s:password name="user.password" label="パスワード"/>
</s:form>

```

```java
public class LoginAction extends ActionSupport {
    private User user;

    public String execute() {
        if ("admin".equals(user.getUsername())) {
            return SUCCESS;
        }
        return ERROR;
    }

    public User getUser() { return user; }
    public void setUser(User user) { this.user = user; }
}

```

この例では、DTO（Userクラス）が直接フォームと連携しているのがわかります。


---

### 🟨 3. DAO（Data Access Object）とは？

DAOは、データベースとやり取りする責任を担うクラスです。

### 🔹 役割
- SQLの実行と結果の取得

- DTOへのデータ詰め込みと返却

- DBアクセスの共通処理の一元化

### 🔹 DAOの基本構成（例）
```java
public interface UserDao {
    User findById(int id);
    List<User> findAll();
    void insert(User user);
    void update(User user);
    void delete(int id);
}
```

```java
public class UserDaoImpl implements UserDao {
    public User findById(int id) {
        Connection conn = ...;
        PreparedStatement ps = ...;
        ResultSet rs = ...;
        // 結果をUserに詰めて返す
    }
}

```

DAOはSQL文を内部に持ち、データ取得後にDTOに詰めてActionクラスへ返す“裏方”です。

---

### 🟨 4. MVC構成の中での役割分担

Struts2のようなMVCフレームワークでは、以下のように役割が明確に分かれます：

```text
[View (JSP)]
    ↑      ↓      ← EL式やタグでDTO参照
[Action (Struts2)]
    ↑      ↓      ← execute()内でDTOとDAOを操作
[DTO] ⇄ [DAO] ⇄ [DB]

```

- DTO：ViewとAction間のデータ輸送係

- DAO：DBからDTOへのデータ取得・更新を担う

- Action：DTOとDAOを橋渡しし、処理の流れを制御

---

### 🟦 5. 今後の連載とのつながり
本記事で紹介したJavaBeans / DTO / DAOの設計方針は、Vol.10の各章で以下のように深掘りしていきます：


| 回        | 内容                            |
| -------- | ----------------------------- |
| Vol.10.1 | DTO設計のベストプラクティス（命名規則・フィールド設計） |
| Vol.10.2 | DAOのインタフェース設計と実装パターン          |
| Vol.10.3 | DB接続クラスの共通化とドライバ設計            |
| Vol.10.4 | Actionとの連携実装（Struts2との融合）     |
| Vol.10.5 | DAO・DTOのテスト設計（JUnitやH2活用）     |


さらに、**Vol.11以降（掲示板構築編）** では、ここで作成したDTO/DAOをベースに、実際の機能（掲示板登録・編集・投稿処理）に落とし込んでいきます。

---

### ✅ まとめ
- JavaBeansはDTOやModelの前提となるJavaの基本規約

- DTOは画面 ↔ 処理層間のデータ中継役

- DAOはDBアクセス専用の裏方担当で、DTOを操作する

- Struts2ではActionがDTOとDAOを結びつけ、MVC構造を実現する

- この構成は、今後の実装・構築編でも再登場する重要な「アーキテクチャの基礎」

---

### 📘 次回予告：Vol.10.1
次回は「DTO設計のベストプラクティス」をテーマに、**命名規則・共通DTO化・フォーム連携の実例**などを解説していきます！

| 回        | 内容                            |
| -------- | ----------------------------- |
| Vol.10.1 | DTO設計のベストプラクティス（命名規則・フィールド設計） |
| Vol.10.2 | DAOのインタフェース設計と実装パターン          |
| Vol.10.3 | DB接続クラスの共通化とドライバ設計            |
| Vol.10.4 | Actionとの連携実装（Struts2との融合）     |
| Vol.10.5 | DAO・DTOのテスト設計（JUnitやH2活用）     |


---

---

### ✨ シリーズまとめ（Vol.10.x バリデーション編）

- [✅ Vol.10.1：DTO設計のベストプラクティス（命名規則・フィールド設計](https://qiita.com/juehara-crypto/items/1b0ad616095f8ae134ec)

- [✅ Vol.10.2：DAOのインタフェース設計と実装パターン ](https://qiita.com/juehara-crypto/items/bcb15618440bef5931ef)

- [✅ Vol.10.3：DB接続クラスの共通化とドライバ設計](https://qiita.com/juehara-crypto/items/c3d4e8e6887d5ec8e1eb)

- [✅ Vol.10.4：Actionとの連携実装（Struts2との融合）](https://qiita.com/juehara-crypto/items/b8873de1aa9e46cd9309)

- [✅ Vol.10.5：DAO・DTOのテスト設計（JUnitやH2活用）](https://qiita.com/juehara-crypto/items/9f0914697726068b9e93)

- [✅ Vol.10.6：Service層の設計方針と例外処理戦略 ](https://qiita.com/juehara-crypto/items/6685c303c40e48b3c1f3)

- [✅ Vol.10.7：Service層×JUnitテストの基本とパターン](https://qiita.com/juehara-crypto/items/128fda40df3ffa0fedce)

- [✅ Vol.10.8：Service層の共通基盤化とDI対応 ](https://qiita.com/juehara-crypto/items/8e94acf2a31be15aaf94)

---