Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add ADRs #1057

Merged
merged 2 commits into from
Dec 8, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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.

Expand Down
Original file line number Diff line number Diff line change
@@ -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.
Original file line number Diff line number Diff line change
@@ -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:

```
└── <context-name>
├── 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

```



lmoesle marked this conversation as resolved.
Show resolved Hide resolved
4 changes: 3 additions & 1 deletion docs/src/documentation/architecture/adrs.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)
* [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)
Loading