解説 · セクション 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 にする
  • publicgetter/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 クラスの活用

準備できたら問題に挑戦 → 演習に進む (5 問)