解説 · セクション 6
DTO / Bean 規約
private + getter/setter + 引数なしコンストラクタ。なぜそういうお作法なのかを背景から。
身近に置き換えると
DTO(Data Transfer Object)は、荷物を安全に運ぶための「宅配便のダンボール箱」です。そして「JavaBeans規約」は、その箱を扱うための「全国共通の伝票ルール」です。ダンボール箱(DTO)にデータという荷物を詰め込み、データベース(DAO)や画面(JSP)、処理の裏側(Servlet)といった異なる部署間で受け渡しをします。ルール通りに箱を作り、伝票(メソッド名)を正しく書くことで、自動仕分けシステム(Javaの便利な仕組み)がスムーズに荷物を運んでくれるようになります。
3 行でまとめると
- DTOは、プログラムの各層(DAO・Servlet・JSP)の間でデータをまとめて運ぶためのクラスです。
- フィールドは必ず
privateに隠し、データの出し入れはgetter/setterを使います。 - フレームワークが自動で箱を作れるよう、「引数なしコンストラクタ」を必ず用意します(JavaBeans規約)。
図で見ると
flowchart LR
DB[(データベース)] <--> DAO[DAO]
DAO -- DTOを渡す --> Servlet[Servlet]
Servlet -- DTOを渡す --> JSP[JSP]
JSP -. 画面表示 .-> User((ユーザー))
style DAO fill:#f9f,stroke:#333,stroke-width:2px
style Servlet fill:#bbf,stroke:#333,stroke-width:2px
style JSP fill:#bfb,stroke:#333,stroke-width:2px
DTOという「箱」にデータを詰めることで、DAO(データベース操作)、Servlet(処理)、JSP(画面表示)の間で、バラバラのデータを一度にまとめて受け渡しできます。
順を追って理解する
1. DTO(Data Transfer Object)の役割
DTOは、名前の通り「データを転送(Transfer)するためのオブジェクト」です。例えばユーザーの「ID」「名前」「年齢」という3つのデータを別々に運ぶのは大変ですが、UserDTO という1つの箱にまとめれば、メソッドの引数や戻り値がスッキリします。
2. JavaBeans規約という絶対ルール
DTOを作る際、「JavaBeans(ジャバビーンズ)規約」というルールに従う必要があります。このルールを守ったクラスを「Bean(ビーン)」と呼びます。主なルールは以下の3つです。
- フィールドはすべて
privateにする publicなgetter/setterメソッドを用意するpublicな 引数なしコンストラクタ を用意する
3. getter / setter の命名ルール
フィールド名が name なら、メソッド名は先頭を大文字にして getName() と setName(値) にします。ただし、boolean 型(true/false)のフィールドの場合は特別で、get ではなく is を使い、isXxx()(例:isAdmin())とするのが慣習です。
4. なぜ「引数なしコンストラクタ」が必要なのか?
今後の応用で学ぶ JSP の useBean アクションや、様々なフレームワークは、裏側で自動的に new UserDTO() のように「引数なし」でクラスを生成(インスタンス化)します。そのため、引数なしコンストラクタがないと、システムが空の箱を準備できずエラーになってしまいます。
応用ではこう書く
public class UserDTO {
// 1. フィールドはすべて private にする
private int id;
private String name;
private boolean admin;
// 2. 引数なしコンストラクタを必ず用意する
public UserDTO() {
// 処理がなくても明示的に書く
}
// 3. getter / setter を用意する
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
// boolean型の getter は getAdmin() ではなく isAdmin() にする
public boolean isAdmin() {
return admin;
}
public void setAdmin(boolean admin) {
this.admin = admin;
}
}
このように、データを保持することだけに特化したシンプルなクラスを作ります。データベースから取得した値をDAOで setter を使って詰め込み、JSP側で getter を使って画面に表示します。
よくある誤解
誤解: フィールドを public にすれば、わざわざ getter/setter を書かなくて済むのでは?
正しくは: Javaの基本として「カプセル化(データの保護)」の目的もありますが、応用技術における最大の理由はフレームワークが getter/setter の存在を前提に動いているからです。例えば JSP で ${user.name} と短く書いたとき、裏側では自動的に getName() メソッドが探されて呼ばれています。フィールドが public でも、getName() が存在しないと JSP はデータを読み取れずエラーになります。JavaBeans規約は、システムに自動処理させるための「契約」なのです。
つまずいたら
このトピックで詰まったら基礎復習へ: 章 2 クラスの活用