回答:
DTOはパターンであり、実装(POJO / POCO)に依存しません。DTOによれば、リモートインターフェイスへの各呼び出しは高価なので、各呼び出しへの応答は可能な限り多くのデータをもたらす必要があります。そのため、特定のタスクのデータを取得するために複数の要求が必要な場合、1つの要求だけで必要なすべてのデータを取得できるように、取得するデータをDTOで組み合わせることができます。エンタープライズアプリケーションアーキテクチャのパターンのカタログに詳細があります。
DTOは基本的な概念であり、時代遅れではありません。
概念としてのDTO(サーバーがクライアントに返すデータを収集することを目的とするオブジェクト)は、確かに時代遅れではありません。
何でやや時代遅れすると、まったくのロジックを含んでいないのDTOを持つという考え方で、使用されているだけのデータを送信するために、クライアントに送信される前に、ドメインオブジェクトから「マッピング」、および表示層に渡す前にモデルを表示するためにそこにマッピングされます。単純なアプリケーションでは、ドメインオブジェクトをDTOとして直接再利用し、ディスプレイレイヤーに直接渡すことができるため、統一されたデータモデルは1つだけです。より複雑なアプリケーションでは、ドメインモデル全体をクライアントに公開したくないため、ドメインモデルからDTOへのマッピングが必要です。DTOからのデータを複製する別のビューモデルを使用することはほとんど意味がありません。
ただし、この概念が単なる間違っているのではなく時代遅れである理由は、一部の(主に古い)フレームワーク/テクノロジーがそれを必要とするためです。ドメインモデルとビューモデルはPOJOSではなく、フレームワークに直接結び付けられているためです。
最も注目すべきは、EJB 3標準以前のJ2EEのEntity BeanはPOJOではなく、アプリサーバーによって構築されたプロキシオブジェクトでした。単にクライアントに送信することは不可能だったため、別のDTOレイヤーを作成することはできませんでした-それは必須でした。
DTOは時代遅れのパターンではありませんが、不必要に適用されることが多く、時代遅れに見えるかもしれません。
Java Enterpriseコミュニティで最も誤用されているパターンはDTOです。DTOは、配布の問題の解決策として明確に定義されました。DTOは、プロセス(層)間でデータを効率的に転送する、粒度の粗いデータコンテナになることを目的としていました。〜アダム・ビエン
たとえば、JSF ManagedBeanがあるとします。よくある質問は、BeanがJPAエンティティへの参照を直接保持するのか、または後でエンティティに変換される中間オブジェクトへの参照を保持するのかです。この中間オブジェクトはDTOと呼ばれますが、ManagedBeanとエンティティが同じJVM内で動作している場合、DTOパターンを使用するメリットはほとんどありません。
Bean Validation注釈を検討してください。JPAエンティティには、@ NotNullおよび@Size検証で注釈が付けられている可能性があります。DTOを使用している場合は、リモートインターフェイスを使用しているクライアントが基本的な検証に失敗したことを確認するためにメッセージを送信する必要がないように、DTOでこれらの検証を繰り返します。DTOとエンティティ間でBean Validation注釈をコピーする余分な作業を想像してください。ただし、ビューとエンティティが同じJVM内で動作している場合、この余分な作業を行う必要はありません。エンティティを使用するだけです。
エンタープライズアプリケーションアーキテクチャのパターンのカタログへのIAmTheDudeのリンクは、DTOの簡潔な説明を提供します。
絶対違う!つい最近、使用するビジネスオブジェクト(ORMマッパーにバインドされている可能性があります)よりも、DTOを使用する方が良いという教訓を学びました。
ただし、適切なパターンブックで言及されているため、使用するためだけでなく、使用するのに適切な場合にのみ使用してください。
私の頭に浮かぶ典型的な例は、ある種のインターフェースをサードパーティに公開するときです。このようなシナリオでは、交換されたオブジェクトを非常に安定した状態に保ちたいので、通常はDTOでうまく実現できます。