Zum Inhalt springen

DTO (Data Transfer Object)

Data Transfer Object (DTO) ist ein Software-Muster zum Transport von Daten zwischen Schichten. Definition, Abgrenzung zu Entity, Value Object, Data Contract.

Ein Data Transfer Object (DTO, deutsch: Datentransferobjekt) ist ein Transportcontainer für Daten: eine einfache Datenstruktur, die eine Handvoll Feldwerte (zum Beispiel Bestellnummer, Kundennummer, Betrag) gebündelt von einem Teil einer Software zu einem anderen bringt. Ein DTO enthält bewusst keine Geschäftslogik. Es ist ein reiner Behälter, kein handelndes Objekt, und trennt so das Transport-Format vom fachlichen Modell und vom Datenbankmodell.

Was ist ein DTO?

DTO ist ein Entwurfsmuster aus der Softwareentwicklung, also eine wiederkehrende Bau-Idee: eine Klasse oder Datenstruktur, deren einzige Aufgabe darin besteht, Feldwerte über eine System- oder Modulgrenze zu transportieren. Der Begriff geht auf Martin Fowlers Muster-Katalog „Patterns of Enterprise Application Architecture" von 2003 zurück. Auslöser war ein konkretes Performance-Problem verteilter Anwendungen: Wenn ein Programm über das Netzwerk viele kleine Einzelabfragen an ein anderes stellt (jede Abfrage kostet Zeit), summiert sich das schnell. Ein DTO bündelt die benötigten Felder in einem einzigen Aufruf und reduziert damit die Anzahl teurer Netzwerk-Zugriffe.

DTOs enthalten typischerweise nur Felder und triviale Zugriffs-Methoden. In modernen Sprachen sind sie oft als Record oder Dataclass ausgeprägt (Java Record seit JEP 395, C# Record Types seit C# 9, Python Dataclasses, Pydantic-Models, Go-Structs, TypeScript-Interfaces). Sie enthalten keine Geschäftslogik, keine fachliche Validierung und kein Verhalten über die Feldzuweisung hinaus. Diese bewusste Anemie ist Teil des Musters und kein Design-Mangel: Sobald ein DTO fachliche Regeln trägt, verschmilzt es mit dem Domänenmodell und verliert seine Rolle als Transportcontainer.

Ein DTO ist plattform-neutral und tritt an drei typischen Grenzen auf: zwischen Schichten einer Anwendung (etwa vom Service-Layer zum Web-Layer, damit der Web-Layer keine ORM-Entitäten mit Lazy-Loading nach außen reicht), zwischen Diensten in einer verteilten Architektur (REST-API, gRPC, Message-Bus) und zwischen operativen Systemen und Analytics-Plattformen (Ingest-APIs, CDC-Streams, Data-Contract-basierte Publikationen). Serialisierungs-Formate wie JSON, XML, Protobuf, Avro oder MessagePack bilden das Wire-Format für DTOs. Das DTO selbst ist die typisierte Repräsentation der Nutzdaten in der jeweiligen Sprache, während das Wire-Format die Byte-Sequenz auf der Leitung bezeichnet; die Zuordnung übernimmt ein Serialisierer.

Der Begriff DTO wird gelegentlich auch außerhalb der Softwareentwicklung verwendet, etwa in der Luftfahrt für „Declared Training Organisation". Diese Bedeutung ist unabhängig und wird in diesem Eintrag nicht behandelt.

Abgrenzung zu Entity, Value Object, Data Contract und Payload

Die häufigsten Verwechslungen betreffen die Nachbarn im Objekt-Katalog: Domain Entity, Value Object, Data Contract, ORM-Entity und der umgangssprachliche „Payload". Die Trennung ist keine akademische Übung, sondern entscheidet darüber, wo Fachlogik lebt und wie eng Systeme aneinander gekoppelt sind.

BegriffRolleKernunterschied zum DTO
Domain EntityFachliches Objekt mit Verhalten und InvariantenTrägt Geschäftsregeln und Identität über die Lebenszeit (Rich Model). Ein DTO ist anemic und transportiert nur Feldwerte. Vermischen führt zum Anti-Pattern Anemic Domain Model.
Value ObjectFachlicher Wert ohne eigene IdentitätModelliert Bedeutung durch Gleichheit aller Felder (Adresse, Money) mit Validierung und Verhalten. Ein DTO hat keine fachliche Identität und keine Semantik über die reine Struktur hinaus.
Data ContractVerhandelte Schnittstellen-Zusage zwischen zwei ParteienUmfasst Schema, Semantik, Qualitäts- und Verfügbarkeits-Garantien, Versionierung und Ownership. Das DTO ist die konkrete Struktur, in der die Nutzdaten übertragen werden; der Data Contract ist die Zusage über sie.
ORM-EntityPersistenz-Objekt einer Datenbank-TabelleTrägt Persistenz-Metadaten wie Beziehungen, Lazy-Loading und Change-Tracking (JPA, SQLAlchemy, Entity Framework). Sollte nicht direkt über API-Grenzen reisen, weil interne Modell-Änderungen sonst an Konsumenten koppeln.
PayloadUmgangssprachlich der Nutzdaten-Teil einer NachrichtBezeichnet die serialisierte Byte- oder JSON-Struktur auf der Leitung. Das DTO liefert die typisierte Objekt-Repräsentation derselben Nutzdaten in einer Sprache.

Eine weitere häufige Frage betrifft das Verhältnis zu Messages und Events in ereignisgetriebenen Architekturen. Eine Message auf einem Message-Bus wie Kafka oder RabbitMQ trägt Metadaten (Topic, Header, Offset, Timestamp) plus einen Nutzdaten-Teil. Ein Event ist eine spezielle Nachricht mit einer fachlichen Bedeutung wie „OrderPlaced" oder „PaymentFailed". Ein DTO kann als Nutzdaten-Struktur in einer Message oder einem Event stecken, deckt aber deren Metadaten und Semantik nicht ab.

Beispiel: DTO an der Grenze zwischen operativem Backend und Analytics-Plattform

Ein E-Commerce-Backend publiziert Bestellungen für die Analytics-Plattform. Der Order-Service arbeitet intern mit einer ORM-Entity „Order", die Lazy-Loading auf Positionen, Kunden-Historie und einen internen Freigabestatus enthält. Diese Entity wäre als Wire-Format ungeeignet: Sie würde Persistenz-Verhalten mitschleppen, unbeabsichtigte Datenbank-Zugriffe während der Serialisierung auslösen und interne Modell-Änderungen direkt an die konsumierende Analytics-Plattform binden.

Der Service transformiert die Entity deshalb in ein OrderPlacedDTO mit klar definierten Feldern: order_id, customer_id, placed_at, total_net, total_gross, currency und line_items, wobei jedes Line-Item wieder als eigenes LineItemDTO typisiert ist. Interne Felder wie internal_flag_manual_review bleiben im Backend. Das DTO wird als JSON serialisiert und als Kafka-Event auf ein Topic gepublisht. Die Analytics-Plattform liest den Stream, mappt in eine Bronze-Tabelle im Lakehouse und weiter in Silver-Tabellen für die Reporting-Modelle.

Die Vorteile dieser Trennung zeigen sich beim ersten Modell-Wechsel im Backend: Wenn das Order-Team ein neues internes Feld einführt oder eine Beziehung umbaut, bleibt das OrderPlacedDTO stabil, solange die publizierten Felder gleich bleiben. Änderungen am DTO werden bewusst versioniert und mit den Konsumenten abgestimmt, meist im Rahmen eines expliziten Data Contracts. Ohne DTO würde die interne Modell-Änderung sofort in der Analytics-Pipeline landen und dort Breaking Changes verursachen.

DTO (Data Transfer Object) im eigenen Unternehmen umsetzen?

Wir zeigen, wie sich das in deiner Systemlandschaft konkret abbilden lässt.

Gespräch vereinbaren