📘 Vol.10.1：DTO設計のベストプラクティス（命名規則・フィールド設計）

>Struts2でのDTO（JavaBeans）の正しい扱い方・設計思想を解説！
命名規則、フィールド設計、そしてJSPからDTOへアクセスできる“仕組み”まで、実務で役立つ知識を整理します。

---

### ✅ DTOとは？ ― ViewとActionをつなぐ“輸送係”

DTO（Data Transfer Object）は、**画面とサーバー側（Actionクラス）とのデータのやり取り**を行うための中継役です。

Struts2におけるDTOの主な役割は：

- 📥 JSPから入力された値をActionクラスに渡す

- 📤 Actionクラスで加工・取得したデータをJSPで表示する

つまり、**「データの入れ物」としての純粋なJavaBeans**であり、ビジネスロジックは持ちません。

### ✅ JavaBeansとしての設計ルール（命名規則）

DTOは、**JavaBeans仕様に従って設計**される必要があります。
そのため、次のルールに従うのがベストプラクティスです。

| 要素            | 命名例                                             | 補足              |
| ------------- | ----------------------------------------------- | --------------- |
| DTO名          | `User`, `Post`, `Thread`                        | エンティティ名と同一／単数形  |
| フィールド         | `username`, `email`                             | `camelCase`が推奨  |
| getter/setter | `getUsername()`, `setUsername(String username)` | 必須（JavaBeans仕様） |

---

### ✅ Actionクラスとの連携（Struts2との接続点）

Struts2では、**DTOをActionクラスのプロパティとして保持し、getter/setterを定義する**ことで、自動的にJSPとのデータ連携が成立します。
```java
public class UserEditAction extends ActionSupport {
    private User user;

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

    public String execute() {
        // 初期化、DB取得など
        return SUCCESS;
    }
}
```

この構造があることで、**Struts2はOGNL（Object-Graph Navigation Language）** を使って、JSPからこのDTOにアクセスできます。

**※ OGNL（Object-Graph Navigation Language）** とは、Struts2で使用される式言語で、
DTOなどのJavaBeansのプロパティにアクセスするための表現方法です。


---

### ✅ 📘 【重要】JSPからDTOにアクセスできる仕組みの正体！

たとえば、以下のようなJSPのコードを見たことがあるでしょう。

```jsp
<s:textfield name="user.username" />
```

この意味は、次のように読み解けます：

- 1.user → Actionクラスにある getUser() を呼び出して DTO を取得

- 2.username → DTOの getUsername() / setUsername() にアクセス

>✅ Struts2は、JSPのname="user.username"を 「Actionクラスにある User user の username プロパティにアクセスする」と解釈します。

つまり、**ActionクラスにDTOをプロパティとして持ち、そのgetter/setterがあれば、Struts2は自動でバインドしてくれるのです！**

---

### ✅ DTO設計の注意点とベストプラクティス

| ポイント             | 内容                                     |
| ---------------- | -------------------------------------- |
| DTOにはロジックを入れない   | DTOは「データの器」専用。計算や処理はActionやServiceで行う。 |
| フィールドは原則private  | 外部から直接アクセスさせず、getter/setterを通じて扱う。     |
| フィールド名はcamelCase | `userId`, `postContent`などが一般的。         |
| 再利用を意識           | ユーザ一覧、詳細、編集など共通化できるDTOは統一する。           |

---

### ✅ 次回予告
次回の **Vol.10.2「DAOのインタフェース設計と実装パターン」** では、DTOと密接に連携するDAO層の設計について、以下を解説します。

- DAOインタフェースと実装の分離（`UserDao` / `UserDaoImpl`）

- DAOの責務と粒度

- DAO→DTOへのデータマッピングのベストプラクティス

---

### ✅ まとめ

| 項目          | 内容                                                         |
| ----------- | ---------------------------------------------------------- |
| DTOとは？      | データ輸送専用のJavaBeans（getter/setter付き）                         |
| Struts2との連携 | Actionのプロパティ＋getter/setterで成立                              |
| JSPからのアクセス  | OGNLにより `user.username` → `getUser().getUsername()` に変換される |
| 設計方針        | 単機能・命名ルール遵守・ロジック非搭載が基本                                     |

---
## 📝 補足：DTOはStruts2の独自機能ではありません

DTO（Data Transfer Object）という用語は、Struts2固有の機能と思われがちですが、**実際にはJavaの標準機能ではなく、「設計パターン」のひとつ**です。

### ✅ 正確な位置づけ

| 用語         | 説明 |
|--------------|------|
| **JavaBeans** | getter/setterとデフォルトコンストラクタを持つJavaの標準的なクラス仕様。Struts2に限らず広く使われます。 |
| **DTO**       | JavaBeansを「データ輸送用オブジェクト」として利用するアーキテクチャ的な設計パターン。Struts2でも使われていますが、特定のフレームワーク専用ではありません。 |
| **Struts2のOGNL機能** | DTOのプロパティを `user.username` のような式で参照・操作できるStruts2のバインディング機構。DTOの構造を理解していれば自然に使えます。 |

### ✅ 実務的な意味
つまり、**Struts2はJavaBeansに準拠したDTOを介して、JSPとActionクラス間のデータをバインドしている**という仕組みです。

```java
// Actionクラス
public class UserEditAction extends ActionSupport {
    private User user; // ← DTO（JavaBeans）

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

    public String execute() {
        // DAOなどからuserを取得してJSPに渡す
        return SUCCESS;
    }
}
```

---

### 🎯 実装・設計に役立つ理解ポイント

✅ この補足を理解すると...

- DTOの位置づけがはっきりする  
- Struts2がJavaBeansのgetter/setterをどう扱うかが分かる  



「DTOとは何か」だけでなく、「なぜJSPからプロパティにアクセスできるのか？」という疑問も、これでスッキリ解消できたかと思います！

---

📘 この記事は、「Struts2 実務設計シリーズ Vol.10：DTO/DAO/JavaBeans編」の一部です。
Vol.10.2 ではさらに DAO 実装の詳細に踏み込んでいきます。どうぞお楽しみに！

---


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

- [✅ Vol.10.0：DAO / DTO / JavaBeansとは？ ― データ層設計の全体像と役割分担 ―](https://qiita.com/drafts/19c1d526df28240e0cb1/edit)

- [✅ 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)

---