diff --git a/docs/src/documentation/architecture/adr/adr002-use-webclient.md b/docs/src/documentation/architecture/adr/adr002-use-webclient.md index a3a989e4f1..98bd17dcff 100644 --- a/docs/src/documentation/architecture/adr/adr002-use-webclient.md +++ b/docs/src/documentation/architecture/adr/adr002-use-webclient.md @@ -14,8 +14,8 @@ werden. SpringBoot bringt einen WebClient (reactive oder auch nicht) mit, es exi ## Decision Statt eine konkrete Implementierung eines WebClients zu verwenden, verwenden wir ein deklaratives WebClient -Framework [**OpenFiegn**](https://github.com/OpenFeign/feign). Bei der Verwendung innerhalb von SpringBoot -nutzen wir den entsprechenden [SpringCloud Feign Starter](https://cloud.spring.io/spring-cloud-openfeign/reference/html/#netflix-feign-starter) +Framework [**OpenFeign**](https://github.com/OpenFeign/feign). Bei der Verwendung innerhalb von SpringBoot +nutzen wir den entsprechenden [SpringCloud Feign Starter](https://cloud.spring.io/spring-cloud-openfeign/reference/html/#netflix-feign-starter). Liegt eine Open API Spezifikation einer Schnittstelle vor, sollte der `feign` Client mittels `openapi-generator` generiert werden. diff --git a/docs/src/documentation/architecture/adr/adr003-use-hexagonal-architecture.md b/docs/src/documentation/architecture/adr/adr003-use-hexagonal-architecture.md new file mode 100644 index 0000000000..57f58a7702 --- /dev/null +++ b/docs/src/documentation/architecture/adr/adr003-use-hexagonal-architecture.md @@ -0,0 +1,30 @@ +# ADR-003 Use hexagonal architecture for services + +## Status + +accepted + +## Context + +Der Aufbau der Anwendung kann verschiedenen Architekturstillen folgen. Diese Entscheidung bestimmt den Standardarchitekturstil eines +Self-contained Services. + +## Decision + +Wir verwenden hexagonal / port-adapter / onion / clean Architektur. Folgenden Regeln gelten dabei: + +- Die Komponenten der Anwendung sind Schichten zugeordnet, wobei jeder Schicht eine Verantwortlichkeit übernimmt. +- Es gibt folgende Schichten: Infrastruktur, Adapter, Application, Domain. +- Die Schichten sind so angeordnet, dass bestimmte Abhängigkeiten nicht erlaubt sind. Ordnet man die Schichten als konzentrische Kreise +(von aussen nach Innen: Infrastruktur, Adapter, Application, Domain), so sind nur die Abhängigkeiten von Aussen nach Innen erlaubt. +- Infrastruktur Schicht ist für die Konfiguration der Infrastruktur zuständig +- Adapter sind für die Anbindung der Anwendung and die technische Infrastruktur zuständig (HTTP, Messaging, RDBMS, etc) +- Adapter werden in "treibende" (engl. driving, inbound, primary) und getriebene (engl. driven, outbound, secondary) unterschieden, +abhängig von der Rolle in der Anwendung. +- Um eine klare Trennung zwischen Adapter und Application zu garantieren werden Ports (In und Out) bereitgestellt, die von den +Driving Adapter aufgerufen, bzw. von Driven Adapter implementiert werden. +- Driving Port wird von Services im Application Tier implementiert. Diese Services stellen fachliche Use Cases dar und werden Use Case Services genannt. + +## Consequences + +Durch die Verwendung von Komponenten mit klarer Zuständigkeit ist die Navigation im Code einfach. diff --git a/docs/src/documentation/architecture/adr/adr004-hexagonal-architecture-packages.md b/docs/src/documentation/architecture/adr/adr004-hexagonal-architecture-packages.md new file mode 100644 index 0000000000..0ebcf4cda9 --- /dev/null +++ b/docs/src/documentation/architecture/adr/adr004-hexagonal-architecture-packages.md @@ -0,0 +1,76 @@ +# ADR-004 Use Java Packaging following Hexagonal Architecture Style + +## Status + +accepted + +## Context + +Die Struktur von Java packages ermöglicht eine schnelle Navigation im Quelltext und kann zur Qualität und Einheitlichkeit des +Quelltextes beitragen. Es gibt verschiedene Stile die Java Packages zu strukturieren - diese Entscheidung legt den Strukturstil fest. + +## Decision + +Durch die Verwendung von Hexagonal Architecture [ADR003](adr003-use-hexagonal-architecture) ist der Architekturstil vorgegeben. Die Benennung der Java Packages +folgt dem gewählten Architekturstil. Die Einhaltung dieser Benennung sollte mithilfe eines ArchUnit Tests geprüft werden. + +Hier ist ein Beispiel wie die Package Struktur aussehen kann: + +``` + └── + ├── adapter + │ ├── in + │ │ ├── rest + │ │ │ ├── dto + │ │ │ │ ├── ...Dto.java + │ │ │ │ └── ...Dto.java + │ │ │ ├── ...Controller.java (injects 1InPort) + │ │ │ ├── ...Controller.java (injects 2InPort) + │ │ │ ├── mapper + │ │ │ │ ├── ...Mapper.java + │ │ │ │ ├── ...Mapper.java (maps between domain model classes and DTOs) + │ │ │ ├── RestExceptionMapping.java + │ │ │ └── validation + │ │ │ ├── ....java + │ │ │ └── ...Validator.java + │ │ └── streaming + │ │ ├── ...Event.java + │ │ └── MessageProcessor.java (injects 3InPort) + │ └── out + │ ├── integration + │ │ └── IntegrationOutAdapter.java (implements IntegrationOutPort.java) + │ ├── storage + │ │ ├── BaseEntity.java + │ │ ├── ...Entity.java + │ │ ├── ...Repository.java + │ │ ├── ...Mapper.java (maps between domain model classes and entities) + │ │ ├── StorageOutAdapter.java (implements StorageOutPort.java) + │ └── ... + │ └── ....java + ├── application + │ ├── ...1UseCase.java (implements ...1InPort.java) + │ ├── ...2UseCase.java (implements ...2InPort.java) + │ ├── ...3UseCase.java (implements ...3InPort.java) + │ └── port + │ ├── in + │ │ ├── ...Exception.java + │ │ ├── ...1InPort.java (uses domain model classes) + │ │ ├── ...2InPort.java (uses domain model classes) + │ │ └── ...3InPort.java (uses domain model classes) + │ └── out + │ ├── StorageOutPort.java (uses domain model classes) + │ └── IntegrationOutPort.java (uses domain model classes) + ├── domain + │ └── model + │ ├── ....java + │ └── ....java + └── infrastructure + ├── dialect + │ └── NoToastPostgresSQLDialect.java + └── mapper + └── MapstructConfiguration.java + +``` + + + diff --git a/docs/src/documentation/architecture/adrs.md b/docs/src/documentation/architecture/adrs.md index c8f4d58dfc..fbe65b8323 100644 --- a/docs/src/documentation/architecture/adrs.md +++ b/docs/src/documentation/architecture/adrs.md @@ -6,4 +6,6 @@ Architekturentscheidungen dar. Wir verwenden die [ADR Vorlage von Michael Nygard Folgende ADRs sind vorhanden: * [ADR001 Configure Service](./adr/adr001-configure-service) -* [ADR002 Use Webclient](./adr/adr002-use-webclient) \ No newline at end of file +* [ADR002 Use Webclient](./adr/adr002-use-webclient) +* [ADR003 Use hexagonal Architecture style for self-contained systems](./adr/adr003-use-hexagonal-architecture) +* [ADR004 Use hexagonal Architecture by Java package naming](./adr/adr004-hexagonal-architecture-packages)