Layered Architecture
Layered Entwurfsmuster
Fortlaufend gepflegte Dokumentation der Layered-Variante.
Java 21Quality GatesArchUnitOffline
8
aktueller Entwicklungsstand
7
Module
21
Java
Entwurfsmuster der Layered-Variante
| Pattern |
Zweck |
Einsatzort |
Begründung |
| Fitness Function |
Schichten und Zyklen automatisch prüfen |
Architekturtestmodul |
verhindert schleichende Strukturverletzungen |
| Test Pyramid |
Tests passend zur Verantwortung wählen |
alle Module |
vermeidet unnötig langsame Vollsystemtests |
| Quality Gate |
Build bei relevanten Defekten stoppen |
Quality-Profil |
Qualitätskriterien werden reproduzierbar |
| Mutation Testing |
Testwirksamkeit prüfen |
Domain und Application |
überlebt ein Fehler, fehlt eine wirksame Assertion |
| SBOM |
Komponentenbestand ausgeben |
Aggregator |
Lieferkettentransparenz |
| Pattern |
Zweck |
Einsatzort |
Begründung |
| DTO |
HTTP-Vertrag isolieren |
REST-Modul |
Domain bleibt transportfrei |
| Thin Controller |
Request/Response koordinieren |
sechs Controller |
keine Fachlogik im Eingangslayer |
| Exception Translator |
stabile Problem Details |
REST-Fehlerbehandlung |
einheitliche externe Fehlersemantik |
| Outbox Dispatcher |
vorgemerkte Events ausliefern |
Integration-Modul |
kein Dual Write im Use Case |
| Lease |
konkurrierende Worker koordinieren |
JPA-Outbox-Store |
skalierbare, wiederanlaufbare Verarbeitung |
| Gateway |
Kafka und Payment Provider kapseln |
Integration-Modul |
Fremdsysteme austauschbar |
| Composition Root |
Module verdrahten |
Bootstrap |
äußere Frameworkkopplung konzentriert |
Persistenzmuster
| Pattern |
Zweck |
Einsatzort |
Begründung |
| Data Mapper |
Domain und JPA-Modell übersetzen |
PersistenceMappers |
Keine ORM-Annotationen im Fachkern |
| Repository Adapter |
Application Ports technisch implementieren |
*JpaAdapter |
Dependency Inversion bleibt erhalten |
| Unit of Work |
vollständigen Use Case atomar ausführen |
TransactionRunner, SpringTransactionRunner |
fachliche Transaktionsgrenze ohne Spring-Kopplung |
| Transactional Outbox |
Zustand und Event atomar speichern |
JpaOutboxEventPublisher, lay_outbox_event |
kein Dual-Write-Verlust |
| Optimistic Lock |
verlorene Updates erkennen |
Versionsspalten |
sichere konkurrierende Änderungen |
| Pessimistic Lock |
Mehrpositionsbestand serialisieren |
findAllForUpdate |
Überreservierung verhindern |
| Reconstitution Factory |
gespeicherten Zustand kontrolliert laden |
Domain restore(...) |
keine öffentlichen Setter |
Fachmodell und Application Services
| Pattern |
Zweck |
Einsatzort |
Begründung |
| Aggregate Root |
kontrollierte Konsistenz und Zustandsübergänge |
domain.order.Order |
Bestellpositionen und Order-Status ändern sich nur über definierte Operationen |
| Entity |
Identität und Lebenszyklus abbilden |
Customer, Product, StockItem, Payment, Invoice |
fachliche Gleichheit hängt nicht nur von Attributwerten ab |
| Value Object |
validierte unveränderliche Werte |
Money, Quantity, Address, IDs, Email, SKU |
verhindert Primitive Obsession und verteilt keine Validierung |
| Snapshot Value Object |
historische Bestell- und Rechnungsdaten erhalten |
Product.Snapshot, Order.Line, Invoice.Line |
spätere Katalogänderungen verändern abgeschlossene Vorgänge nicht |
| Service Layer |
Use Cases orchestrieren |
sechs Application Services |
einheitlicher Einstieg für REST, Messaging und Tests |
| Repository |
Speicherzugriff abstrahieren |
Ports.CustomerRepository bis InvoiceRepository |
Anwendung bleibt unabhängig von JPA und Datenbank |
| Strategy |
Zahlungsanbieter austauschbar machen |
Ports.PaymentGateway |
Providerverhalten wird hinter einem stabilen Vertrag gekapselt |
| Domain Event |
fachlich relevante Ergebnisse ausdrücken |
BusinessEvent |
entkoppelt Kernentscheidung von technischer Zustellung |
| Idempotent Receiver |
Wiederholungen sicher behandeln |
PlaceOrderService, ReserveInventoryService, AuthorizePaymentService |
Netzwerk- und Messaging-Wiederholungen erzeugen keine Duplikate |
| In-Memory Fake |
Application Services ohne Mock-Kaskaden testen |
InMemoryPorts |
realistischere Zustandsprüfung bei geringem Testaufwand |
| Application Exception |
stabile Fehlerklassifikation |
ApplicationException |
Adapter können Fehler ohne Regelduplizierung übersetzen |
Modulgrundlage
| Pattern |
Zweck |
Einsatzort |
Begründung |
| Layered Architecture |
technische Verantwortungen trennen |
Maven-Modulgraph |
verständliche Referenzarchitektur |
| Composition Root |
technische Implementierungen zusammensetzen |
layered-bootstrap |
keine Geschäftslogik im Startmodul |
| Fitness Function |
Grenzen automatisiert prüfen |
layered-architecture-tests |
verhindert schleichende Architekturverletzungen |