SlideShare ist ein Scribd-Unternehmen logo
1 von 21
Downloaden Sie, um offline zu lesen
The Little Pattern That Could
Leveraging the Power of Repositories
Tobias Goeschel
Sr Solutions Architect, FSI
Amazon Web Services
Before we start: A disclaimer
To teach anything meaningful with code exercises in two hours is challenging.
I have provided exercises and example code that I think will make this possible.
The code is available on GitHub, so you can play with it for yourself:
https://github.com/weltraumpirat/repository_workshop.git
Of course, this is nowhere near real-life. Please do not take it as a template to design your DDD application by. It is
just one possible implementation, and in many aspects incomplete and/or imperfect.
Of course, I am not a Java expert. In fact, I haven’t coded anything serious in Java in years. I chose Java, because it
has some characteristics that illustrate the effect of repositories. You can help me improve by sending pull requests!
Of course, I am very opinionated, anyway. Sorry not sorry.
The pictures in this slide deck were created with the help of MidJourney and Photoshop AI. Similarities to real people
and/or artwork are purely coincidental.
Once upon a time,…
Your company, ChopShop Inc., has recently seen a fast
expansion in business, and the demand for new features
is ever increasing. The CTO has noticed a sharp increase in
delivery times, and as a team, you are quick to assert that
the code has become unmaintainable in its current
form:
It is entangled and messy, business logic is distributed across
many modules, it takes hours to
fi
nd bugs, and
fi
xes in one
place often break things somewhere else. The solution is
clear: Microservices.
You know that microservices are hard to get right, and you
want to take no chances. You decide to introduce Domain
Driven Design, successfully run an EventStorming,
identifying bounded contexts and aggregates, and start
separating code into proper modules.
Exercise #1
You have made progress. But inside of each module, there’s still quite a
mess. Rest controllers are huge, containing both domain logic and
database queries via JPA. Someone on the team makes good arguments to
continue the refactoring towards Hexagonal Architecture.
What are some concrete actions you should take?
Examine the ShoppingCartController class and discuss
options with your teammates.
Hint #1
The code has full test coverage, it looks better than most code bases,
and it looks like we already have repositories…
Why do we still need to refactor?
Try to imagine a codebase like this, but at scale -
hundreds, thousands of classes like this.
What could be problematic about the current solution?
Hint #2
Hexagonal Architecture requires a clear separation of the domain
logic from the REST API, the database, third party frameworks, and
all other technical details. That means, other parts can depend on the
core, but never vice versa.
What are possible adapters that you could build?
How can you make sure dependencies always point inward,
not outward?
Exercise #2
Your team has been quick to isolate the RestController logic from the
domain core, and decide to refactor to CQRS. Now it’s time to
introduce a “proper” DDD Repository.
What are the necessary steps for the refactoring?
Examine the use cases (Commands and Queries)
and their implementations,
then identify steps to take with your teammates.
The Repository Pattern in DDD
A repository is essentially an interface that hides the details of data access
from the domain core. Different storage mechanisms can be attached by creating
individual implementations, e.g. for
fi
le-based storage or per database engine.
The interface itself is part of the domain core, the implementation belongs to
its environment.
Domain objects can pass to the repository and back into the core. They map to
serializable data objects. But careful: Business methods must never be
invoked outside of the domain core!
There are two kinds of repositories: Collection- and Persistence-oriented.
Collection-Oriented Repositories
Collection-oriented repositories act like a collection: They have
add(), remove(), addAll() and removeAll(), as well as
fi
nder
methods that allow to search by attribute values.
Since a collection does not explicitly notice changes on its member
objects, all changes have to be recorded and explicitly “
fl
ushed” to
the database.
Persistence-Oriented Repositories
Persistence-oriented repositories are save()-based.
They make changes more explicit by requiring an extra method call:
Any change to a member object is persisted instantaneously by calling
save() on the repository.
Changes that are not explicitly persisted will be lost.
The rule of thumb is:
Go with collection-oriented, unless it creates dif
fi
culties in your context.
Hint #1
Repositories should map to domain objects,
not data transfer objects or database tables.
What is the difference?
Be mindful of aggregate boundaries.
Hint #2
Your teammates are worried about data integrity.
Where should you place transaction logic?
Exercise #3
The team has successfully implemented aggregates and a collection-
based repository. However, your tests are still very slow - they have to
initialize the full Spring context to run, resulting in hours of waiting every
week. As a result, more and more colleagues skip tests entirely, resulting in
more bugs and rework, which not only led to a number of embarrassing
incidents, but also further slows down the delivery.
How could those tests be improved? Examine the test
code, as well as the newly introduced repository logic, then
discuss and implement measures with your teammates.
Hint #1
All the business logic is now cleanly separated from technical details. It
should be testable without external dependencies.
Using polymorphism, what could be a quick way to fully isolate the
core?
Hint #2
Dependency injection is just a fancy way of passing
constructor parameters.
You can eliminate all the expensive setup by making good use of those.
Exercise #4
You’ve deployed your new microservices on Kubernetes. One month later, your boss
calls: The AWS bill is staggering! She urges you to get those spendings down ASAP!
Your team investigates, and after looking at some CloudWatch logs, you realize the usage
patterns of your app are spiky, high traf
fi
c times appear random, and there is a lot
of idle time - the system should not be running 24/7!
You decide to ditch the containers and go full serverless,
con
fi
dent that your system is modular, and should be easy to split up.
Discuss the necessary steps.
What about your current solution could be problematic?
Hint #1
Serverless apps are best mapped to individual use cases.
Hint #2
The collection based repository keeps a lot of in-memory state.
This is not helpful and may result in longer runtimes, higher memory
consumption, and potential race conditions.
What could you do to
fi
x it?
Let’s stay in touch!
https://mastodon.social/@weltraumpirat
https://linkedin.com/in/w3ltraumpirat
https://twitter.com/w3ltraumpirat

Weitere ähnliche Inhalte

Was ist angesagt?

Cloud Native Landscape (CNCF and OCI)
Cloud Native Landscape (CNCF and OCI)Cloud Native Landscape (CNCF and OCI)
Cloud Native Landscape (CNCF and OCI)Chris Aniszczyk
 
Micro services Architecture
Micro services ArchitectureMicro services Architecture
Micro services ArchitectureAraf Karsh Hamid
 
Distributed tracing 101
Distributed tracing 101Distributed tracing 101
Distributed tracing 101Itiel Shwartz
 
CloudStack and GitOps at Enterprise Scale - Alex Dometrius, Rene Glover - AT&T
CloudStack and GitOps at Enterprise Scale - Alex Dometrius, Rene Glover - AT&TCloudStack and GitOps at Enterprise Scale - Alex Dometrius, Rene Glover - AT&T
CloudStack and GitOps at Enterprise Scale - Alex Dometrius, Rene Glover - AT&TShapeBlue
 
Kubernetes networking
Kubernetes networkingKubernetes networking
Kubernetes networkingSim Janghoon
 
Saturn 2018: Managing data consistency in a microservice architecture using S...
Saturn 2018: Managing data consistency in a microservice architecture using S...Saturn 2018: Managing data consistency in a microservice architecture using S...
Saturn 2018: Managing data consistency in a microservice architecture using S...Chris Richardson
 
Hexagonal Architecture
Hexagonal ArchitectureHexagonal Architecture
Hexagonal ArchitectureMarcelo Cure
 
Introducing github.com/open-cluster-management – How to deliver apps across c...
Introducing github.com/open-cluster-management – How to deliver apps across c...Introducing github.com/open-cluster-management – How to deliver apps across c...
Introducing github.com/open-cluster-management – How to deliver apps across c...Michael Elder
 
The twelve factor app
The twelve factor appThe twelve factor app
The twelve factor appRavi Okade
 
Domain Driven Design
Domain Driven DesignDomain Driven Design
Domain Driven DesignYoung-Ho Cho
 
Micro services vs Monolith Architecture
Micro services vs Monolith ArchitectureMicro services vs Monolith Architecture
Micro services vs Monolith ArchitectureMohamedElGohary71
 
Red Hat Openshift on Microsoft Azure
Red Hat Openshift on Microsoft AzureRed Hat Openshift on Microsoft Azure
Red Hat Openshift on Microsoft AzureJohn Archer
 
Distributed tracing using open tracing & jaeger 2
Distributed tracing using open tracing & jaeger 2Distributed tracing using open tracing & jaeger 2
Distributed tracing using open tracing & jaeger 2Chandresh Pancholi
 
CD using ArgoCD(KnolX).pdf
CD using ArgoCD(KnolX).pdfCD using ArgoCD(KnolX).pdf
CD using ArgoCD(KnolX).pdfKnoldus Inc.
 

Was ist angesagt? (20)

Démystifions le Domain Driven Design
 Démystifions le Domain Driven Design Démystifions le Domain Driven Design
Démystifions le Domain Driven Design
 
Cloud Native Landscape (CNCF and OCI)
Cloud Native Landscape (CNCF and OCI)Cloud Native Landscape (CNCF and OCI)
Cloud Native Landscape (CNCF and OCI)
 
Micro services Architecture
Micro services ArchitectureMicro services Architecture
Micro services Architecture
 
Distributed tracing 101
Distributed tracing 101Distributed tracing 101
Distributed tracing 101
 
CloudStack and GitOps at Enterprise Scale - Alex Dometrius, Rene Glover - AT&T
CloudStack and GitOps at Enterprise Scale - Alex Dometrius, Rene Glover - AT&TCloudStack and GitOps at Enterprise Scale - Alex Dometrius, Rene Glover - AT&T
CloudStack and GitOps at Enterprise Scale - Alex Dometrius, Rene Glover - AT&T
 
Kubernetes
KubernetesKubernetes
Kubernetes
 
Kubernetes networking
Kubernetes networkingKubernetes networking
Kubernetes networking
 
Saturn 2018: Managing data consistency in a microservice architecture using S...
Saturn 2018: Managing data consistency in a microservice architecture using S...Saturn 2018: Managing data consistency in a microservice architecture using S...
Saturn 2018: Managing data consistency in a microservice architecture using S...
 
Domain driven design
Domain driven designDomain driven design
Domain driven design
 
Hexagonal Architecture
Hexagonal ArchitectureHexagonal Architecture
Hexagonal Architecture
 
Introducing github.com/open-cluster-management – How to deliver apps across c...
Introducing github.com/open-cluster-management – How to deliver apps across c...Introducing github.com/open-cluster-management – How to deliver apps across c...
Introducing github.com/open-cluster-management – How to deliver apps across c...
 
Platform engineering
Platform engineeringPlatform engineering
Platform engineering
 
The twelve factor app
The twelve factor appThe twelve factor app
The twelve factor app
 
Open shift 4-update
Open shift 4-updateOpen shift 4-update
Open shift 4-update
 
Domain Driven Design
Domain Driven DesignDomain Driven Design
Domain Driven Design
 
Micro services vs Monolith Architecture
Micro services vs Monolith ArchitectureMicro services vs Monolith Architecture
Micro services vs Monolith Architecture
 
Red Hat Openshift on Microsoft Azure
Red Hat Openshift on Microsoft AzureRed Hat Openshift on Microsoft Azure
Red Hat Openshift on Microsoft Azure
 
Distributed tracing using open tracing & jaeger 2
Distributed tracing using open tracing & jaeger 2Distributed tracing using open tracing & jaeger 2
Distributed tracing using open tracing & jaeger 2
 
Terraform
TerraformTerraform
Terraform
 
CD using ArgoCD(KnolX).pdf
CD using ArgoCD(KnolX).pdfCD using ArgoCD(KnolX).pdf
CD using ArgoCD(KnolX).pdf
 

Ähnlich wie Workshop - The Little Pattern That Could.pdf

System design for Web Application
System design for Web ApplicationSystem design for Web Application
System design for Web ApplicationMichael Choi
 
Introduction to Behavior Driven Development
Introduction to Behavior Driven Development Introduction to Behavior Driven Development
Introduction to Behavior Driven Development Robin O'Brien
 
Architecting a Large Software Project - Lessons Learned
Architecting a Large Software Project - Lessons LearnedArchitecting a Large Software Project - Lessons Learned
Architecting a Large Software Project - Lessons LearnedJoão Pedro Martins
 
Software Development Standard Operating Procedure
Software Development Standard Operating Procedure Software Development Standard Operating Procedure
Software Development Standard Operating Procedure rupeshchanchal
 
From Duke of DevOps to Queen of Chaos - Api days 2018
From Duke of DevOps to Queen of Chaos - Api days 2018From Duke of DevOps to Queen of Chaos - Api days 2018
From Duke of DevOps to Queen of Chaos - Api days 2018Christophe Rochefolle
 
ITARC15 Workshop - Architecting a Large Software Project - Lessons Learned
ITARC15 Workshop - Architecting a Large Software Project - Lessons LearnedITARC15 Workshop - Architecting a Large Software Project - Lessons Learned
ITARC15 Workshop - Architecting a Large Software Project - Lessons LearnedJoão Pedro Martins
 
How can JAVA Performance tuning speed up applications.pdf
How can JAVA Performance tuning speed up applications.pdfHow can JAVA Performance tuning speed up applications.pdf
How can JAVA Performance tuning speed up applications.pdfMindfire LLC
 
We continue checking Microsoft projects: analysis of PowerShell
We continue checking Microsoft projects: analysis of PowerShellWe continue checking Microsoft projects: analysis of PowerShell
We continue checking Microsoft projects: analysis of PowerShellPVS-Studio
 
Front-End Modernization for Mortals
Front-End Modernization for MortalsFront-End Modernization for Mortals
Front-End Modernization for Mortalscgack
 
Front end-modernization
Front end-modernizationFront end-modernization
Front end-modernizationdevObjective
 
Typescript design patterns applied to sharepoint framework - Sharepoint Satur...
Typescript design patterns applied to sharepoint framework - Sharepoint Satur...Typescript design patterns applied to sharepoint framework - Sharepoint Satur...
Typescript design patterns applied to sharepoint framework - Sharepoint Satur...Luis Valencia
 
Care and feeding notes
Care and feeding notesCare and feeding notes
Care and feeding notesPerrin Harkins
 
Improving Drupal Performances
Improving Drupal PerformancesImproving Drupal Performances
Improving Drupal PerformancesVladimir Ilic
 
Ci tips and_tricks_linards_liepins
Ci tips and_tricks_linards_liepinsCi tips and_tricks_linards_liepins
Ci tips and_tricks_linards_liepinsLinards Liep
 
Design Patterns
Design PatternsDesign Patterns
Design Patternsimedo.de
 
10 Ways To Improve Your Code( Neal Ford)
10  Ways To  Improve  Your  Code( Neal  Ford)10  Ways To  Improve  Your  Code( Neal  Ford)
10 Ways To Improve Your Code( Neal Ford)guestebde
 
Devops interview questions 2 www.bigclasses.com
Devops interview questions  2  www.bigclasses.comDevops interview questions  2  www.bigclasses.com
Devops interview questions 2 www.bigclasses.combigclasses.com
 

Ähnlich wie Workshop - The Little Pattern That Could.pdf (20)

Codeigniter
CodeigniterCodeigniter
Codeigniter
 
System design for Web Application
System design for Web ApplicationSystem design for Web Application
System design for Web Application
 
10 Ways To Improve Your Code
10 Ways To Improve Your Code10 Ways To Improve Your Code
10 Ways To Improve Your Code
 
Introduction to Behavior Driven Development
Introduction to Behavior Driven Development Introduction to Behavior Driven Development
Introduction to Behavior Driven Development
 
Architecting a Large Software Project - Lessons Learned
Architecting a Large Software Project - Lessons LearnedArchitecting a Large Software Project - Lessons Learned
Architecting a Large Software Project - Lessons Learned
 
Software Development Standard Operating Procedure
Software Development Standard Operating Procedure Software Development Standard Operating Procedure
Software Development Standard Operating Procedure
 
From Duke of DevOps to Queen of Chaos - Api days 2018
From Duke of DevOps to Queen of Chaos - Api days 2018From Duke of DevOps to Queen of Chaos - Api days 2018
From Duke of DevOps to Queen of Chaos - Api days 2018
 
ITARC15 Workshop - Architecting a Large Software Project - Lessons Learned
ITARC15 Workshop - Architecting a Large Software Project - Lessons LearnedITARC15 Workshop - Architecting a Large Software Project - Lessons Learned
ITARC15 Workshop - Architecting a Large Software Project - Lessons Learned
 
How can JAVA Performance tuning speed up applications.pdf
How can JAVA Performance tuning speed up applications.pdfHow can JAVA Performance tuning speed up applications.pdf
How can JAVA Performance tuning speed up applications.pdf
 
We continue checking Microsoft projects: analysis of PowerShell
We continue checking Microsoft projects: analysis of PowerShellWe continue checking Microsoft projects: analysis of PowerShell
We continue checking Microsoft projects: analysis of PowerShell
 
Front-End Modernization for Mortals
Front-End Modernization for MortalsFront-End Modernization for Mortals
Front-End Modernization for Mortals
 
Front end-modernization
Front end-modernizationFront end-modernization
Front end-modernization
 
Front end-modernization
Front end-modernizationFront end-modernization
Front end-modernization
 
Typescript design patterns applied to sharepoint framework - Sharepoint Satur...
Typescript design patterns applied to sharepoint framework - Sharepoint Satur...Typescript design patterns applied to sharepoint framework - Sharepoint Satur...
Typescript design patterns applied to sharepoint framework - Sharepoint Satur...
 
Care and feeding notes
Care and feeding notesCare and feeding notes
Care and feeding notes
 
Improving Drupal Performances
Improving Drupal PerformancesImproving Drupal Performances
Improving Drupal Performances
 
Ci tips and_tricks_linards_liepins
Ci tips and_tricks_linards_liepinsCi tips and_tricks_linards_liepins
Ci tips and_tricks_linards_liepins
 
Design Patterns
Design PatternsDesign Patterns
Design Patterns
 
10 Ways To Improve Your Code( Neal Ford)
10  Ways To  Improve  Your  Code( Neal  Ford)10  Ways To  Improve  Your  Code( Neal  Ford)
10 Ways To Improve Your Code( Neal Ford)
 
Devops interview questions 2 www.bigclasses.com
Devops interview questions  2  www.bigclasses.comDevops interview questions  2  www.bigclasses.com
Devops interview questions 2 www.bigclasses.com
 

Kürzlich hochgeladen

^Clinic ^%[+27788225528*Abortion Pills For Sale In soweto
^Clinic ^%[+27788225528*Abortion Pills For Sale In soweto^Clinic ^%[+27788225528*Abortion Pills For Sale In soweto
^Clinic ^%[+27788225528*Abortion Pills For Sale In sowetokasambamuno
 
Jax, FL Admin Community Group 05.14.2024 Combined Deck
Jax, FL Admin Community Group 05.14.2024 Combined DeckJax, FL Admin Community Group 05.14.2024 Combined Deck
Jax, FL Admin Community Group 05.14.2024 Combined DeckMarc Lester
 
From Theory to Practice: Utilizing SpiraPlan's REST API
From Theory to Practice: Utilizing SpiraPlan's REST APIFrom Theory to Practice: Utilizing SpiraPlan's REST API
From Theory to Practice: Utilizing SpiraPlan's REST APIInflectra
 
The mythical technical debt. (Brooke, please, forgive me)
The mythical technical debt. (Brooke, please, forgive me)The mythical technical debt. (Brooke, please, forgive me)
The mythical technical debt. (Brooke, please, forgive me)Roberto Bettazzoni
 
Software Engineering - Introduction + Process Models + Requirements Engineering
Software Engineering - Introduction + Process Models + Requirements EngineeringSoftware Engineering - Introduction + Process Models + Requirements Engineering
Software Engineering - Introduction + Process Models + Requirements EngineeringPrakhyath Rai
 
Secure Software Ecosystem Teqnation 2024
Secure Software Ecosystem Teqnation 2024Secure Software Ecosystem Teqnation 2024
Secure Software Ecosystem Teqnation 2024Soroosh Khodami
 
Microsoft365_Dev_Security_2024_05_16.pdf
Microsoft365_Dev_Security_2024_05_16.pdfMicrosoft365_Dev_Security_2024_05_16.pdf
Microsoft365_Dev_Security_2024_05_16.pdfMarkus Moeller
 
^Clinic ^%[+27788225528*Abortion Pills For Sale In witbank
^Clinic ^%[+27788225528*Abortion Pills For Sale In witbank^Clinic ^%[+27788225528*Abortion Pills For Sale In witbank
^Clinic ^%[+27788225528*Abortion Pills For Sale In witbankkasambamuno
 
BusinessGPT - Security and Governance for Generative AI
BusinessGPT  - Security and Governance for Generative AIBusinessGPT  - Security and Governance for Generative AI
BusinessGPT - Security and Governance for Generative AIAGATSoftware
 
Lessons Learned from Building a Serverless Notifications System.pdf
Lessons Learned from Building a Serverless Notifications System.pdfLessons Learned from Building a Serverless Notifications System.pdf
Lessons Learned from Building a Serverless Notifications System.pdfSrushith Repakula
 
OpenChain Webinar: AboutCode and Beyond - End-to-End SCA
OpenChain Webinar: AboutCode and Beyond - End-to-End SCAOpenChain Webinar: AboutCode and Beyond - End-to-End SCA
OpenChain Webinar: AboutCode and Beyond - End-to-End SCAShane Coughlan
 
Anypoint Code Builder - Munich MuleSoft Meetup - 16th May 2024
Anypoint Code Builder - Munich MuleSoft Meetup - 16th May 2024Anypoint Code Builder - Munich MuleSoft Meetup - 16th May 2024
Anypoint Code Builder - Munich MuleSoft Meetup - 16th May 2024MulesoftMunichMeetup
 
Transformer Neural Network Use Cases with Links
Transformer Neural Network Use Cases with LinksTransformer Neural Network Use Cases with Links
Transformer Neural Network Use Cases with LinksJinanKordab
 
Auto Affiliate AI Earns First Commission in 3 Hours..pdf
Auto Affiliate  AI Earns First Commission in 3 Hours..pdfAuto Affiliate  AI Earns First Commission in 3 Hours..pdf
Auto Affiliate AI Earns First Commission in 3 Hours..pdfSelfMade bd
 
Evolving Data Governance for the Real-time Streaming and AI Era
Evolving Data Governance for the Real-time Streaming and AI EraEvolving Data Governance for the Real-time Streaming and AI Era
Evolving Data Governance for the Real-time Streaming and AI Eraconfluent
 
Salesforce Introduced Zero Copy Partner Network to Simplify the Process of In...
Salesforce Introduced Zero Copy Partner Network to Simplify the Process of In...Salesforce Introduced Zero Copy Partner Network to Simplify the Process of In...
Salesforce Introduced Zero Copy Partner Network to Simplify the Process of In...CloudMetic
 
Spring into AI presented by Dan Vega 5/14
Spring into AI presented by Dan Vega 5/14Spring into AI presented by Dan Vega 5/14
Spring into AI presented by Dan Vega 5/14VMware Tanzu
 
Wired_2.0_CREATE YOUR ULTIMATE LEARNING ENVIRONMENT_JCON_16052024
Wired_2.0_CREATE YOUR ULTIMATE LEARNING ENVIRONMENT_JCON_16052024Wired_2.0_CREATE YOUR ULTIMATE LEARNING ENVIRONMENT_JCON_16052024
Wired_2.0_CREATE YOUR ULTIMATE LEARNING ENVIRONMENT_JCON_16052024SimonedeGijt
 

Kürzlich hochgeladen (20)

Abortion Clinic Pretoria ](+27832195400*)[ Abortion Clinic Near Me ● Abortion...
Abortion Clinic Pretoria ](+27832195400*)[ Abortion Clinic Near Me ● Abortion...Abortion Clinic Pretoria ](+27832195400*)[ Abortion Clinic Near Me ● Abortion...
Abortion Clinic Pretoria ](+27832195400*)[ Abortion Clinic Near Me ● Abortion...
 
^Clinic ^%[+27788225528*Abortion Pills For Sale In soweto
^Clinic ^%[+27788225528*Abortion Pills For Sale In soweto^Clinic ^%[+27788225528*Abortion Pills For Sale In soweto
^Clinic ^%[+27788225528*Abortion Pills For Sale In soweto
 
Jax, FL Admin Community Group 05.14.2024 Combined Deck
Jax, FL Admin Community Group 05.14.2024 Combined DeckJax, FL Admin Community Group 05.14.2024 Combined Deck
Jax, FL Admin Community Group 05.14.2024 Combined Deck
 
From Theory to Practice: Utilizing SpiraPlan's REST API
From Theory to Practice: Utilizing SpiraPlan's REST APIFrom Theory to Practice: Utilizing SpiraPlan's REST API
From Theory to Practice: Utilizing SpiraPlan's REST API
 
The mythical technical debt. (Brooke, please, forgive me)
The mythical technical debt. (Brooke, please, forgive me)The mythical technical debt. (Brooke, please, forgive me)
The mythical technical debt. (Brooke, please, forgive me)
 
Software Engineering - Introduction + Process Models + Requirements Engineering
Software Engineering - Introduction + Process Models + Requirements EngineeringSoftware Engineering - Introduction + Process Models + Requirements Engineering
Software Engineering - Introduction + Process Models + Requirements Engineering
 
Secure Software Ecosystem Teqnation 2024
Secure Software Ecosystem Teqnation 2024Secure Software Ecosystem Teqnation 2024
Secure Software Ecosystem Teqnation 2024
 
Microsoft365_Dev_Security_2024_05_16.pdf
Microsoft365_Dev_Security_2024_05_16.pdfMicrosoft365_Dev_Security_2024_05_16.pdf
Microsoft365_Dev_Security_2024_05_16.pdf
 
^Clinic ^%[+27788225528*Abortion Pills For Sale In witbank
^Clinic ^%[+27788225528*Abortion Pills For Sale In witbank^Clinic ^%[+27788225528*Abortion Pills For Sale In witbank
^Clinic ^%[+27788225528*Abortion Pills For Sale In witbank
 
BusinessGPT - Security and Governance for Generative AI
BusinessGPT  - Security and Governance for Generative AIBusinessGPT  - Security and Governance for Generative AI
BusinessGPT - Security and Governance for Generative AI
 
Lessons Learned from Building a Serverless Notifications System.pdf
Lessons Learned from Building a Serverless Notifications System.pdfLessons Learned from Building a Serverless Notifications System.pdf
Lessons Learned from Building a Serverless Notifications System.pdf
 
OpenChain Webinar: AboutCode and Beyond - End-to-End SCA
OpenChain Webinar: AboutCode and Beyond - End-to-End SCAOpenChain Webinar: AboutCode and Beyond - End-to-End SCA
OpenChain Webinar: AboutCode and Beyond - End-to-End SCA
 
Anypoint Code Builder - Munich MuleSoft Meetup - 16th May 2024
Anypoint Code Builder - Munich MuleSoft Meetup - 16th May 2024Anypoint Code Builder - Munich MuleSoft Meetup - 16th May 2024
Anypoint Code Builder - Munich MuleSoft Meetup - 16th May 2024
 
Transformer Neural Network Use Cases with Links
Transformer Neural Network Use Cases with LinksTransformer Neural Network Use Cases with Links
Transformer Neural Network Use Cases with Links
 
Abortion Clinic In Johannesburg ](+27832195400*)[ 🏥 Safe Abortion Pills in Jo...
Abortion Clinic In Johannesburg ](+27832195400*)[ 🏥 Safe Abortion Pills in Jo...Abortion Clinic In Johannesburg ](+27832195400*)[ 🏥 Safe Abortion Pills in Jo...
Abortion Clinic In Johannesburg ](+27832195400*)[ 🏥 Safe Abortion Pills in Jo...
 
Auto Affiliate AI Earns First Commission in 3 Hours..pdf
Auto Affiliate  AI Earns First Commission in 3 Hours..pdfAuto Affiliate  AI Earns First Commission in 3 Hours..pdf
Auto Affiliate AI Earns First Commission in 3 Hours..pdf
 
Evolving Data Governance for the Real-time Streaming and AI Era
Evolving Data Governance for the Real-time Streaming and AI EraEvolving Data Governance for the Real-time Streaming and AI Era
Evolving Data Governance for the Real-time Streaming and AI Era
 
Salesforce Introduced Zero Copy Partner Network to Simplify the Process of In...
Salesforce Introduced Zero Copy Partner Network to Simplify the Process of In...Salesforce Introduced Zero Copy Partner Network to Simplify the Process of In...
Salesforce Introduced Zero Copy Partner Network to Simplify the Process of In...
 
Spring into AI presented by Dan Vega 5/14
Spring into AI presented by Dan Vega 5/14Spring into AI presented by Dan Vega 5/14
Spring into AI presented by Dan Vega 5/14
 
Wired_2.0_CREATE YOUR ULTIMATE LEARNING ENVIRONMENT_JCON_16052024
Wired_2.0_CREATE YOUR ULTIMATE LEARNING ENVIRONMENT_JCON_16052024Wired_2.0_CREATE YOUR ULTIMATE LEARNING ENVIRONMENT_JCON_16052024
Wired_2.0_CREATE YOUR ULTIMATE LEARNING ENVIRONMENT_JCON_16052024
 

Workshop - The Little Pattern That Could.pdf

  • 1. The Little Pattern That Could Leveraging the Power of Repositories Tobias Goeschel Sr Solutions Architect, FSI Amazon Web Services
  • 2. Before we start: A disclaimer To teach anything meaningful with code exercises in two hours is challenging. I have provided exercises and example code that I think will make this possible. The code is available on GitHub, so you can play with it for yourself: https://github.com/weltraumpirat/repository_workshop.git Of course, this is nowhere near real-life. Please do not take it as a template to design your DDD application by. It is just one possible implementation, and in many aspects incomplete and/or imperfect. Of course, I am not a Java expert. In fact, I haven’t coded anything serious in Java in years. I chose Java, because it has some characteristics that illustrate the effect of repositories. You can help me improve by sending pull requests! Of course, I am very opinionated, anyway. Sorry not sorry. The pictures in this slide deck were created with the help of MidJourney and Photoshop AI. Similarities to real people and/or artwork are purely coincidental.
  • 3. Once upon a time,…
  • 4. Your company, ChopShop Inc., has recently seen a fast expansion in business, and the demand for new features is ever increasing. The CTO has noticed a sharp increase in delivery times, and as a team, you are quick to assert that the code has become unmaintainable in its current form: It is entangled and messy, business logic is distributed across many modules, it takes hours to fi nd bugs, and fi xes in one place often break things somewhere else. The solution is clear: Microservices.
  • 5. You know that microservices are hard to get right, and you want to take no chances. You decide to introduce Domain Driven Design, successfully run an EventStorming, identifying bounded contexts and aggregates, and start separating code into proper modules.
  • 6. Exercise #1 You have made progress. But inside of each module, there’s still quite a mess. Rest controllers are huge, containing both domain logic and database queries via JPA. Someone on the team makes good arguments to continue the refactoring towards Hexagonal Architecture. What are some concrete actions you should take? Examine the ShoppingCartController class and discuss options with your teammates.
  • 7. Hint #1 The code has full test coverage, it looks better than most code bases, and it looks like we already have repositories… Why do we still need to refactor? Try to imagine a codebase like this, but at scale - hundreds, thousands of classes like this. What could be problematic about the current solution?
  • 8. Hint #2 Hexagonal Architecture requires a clear separation of the domain logic from the REST API, the database, third party frameworks, and all other technical details. That means, other parts can depend on the core, but never vice versa. What are possible adapters that you could build? How can you make sure dependencies always point inward, not outward?
  • 9. Exercise #2 Your team has been quick to isolate the RestController logic from the domain core, and decide to refactor to CQRS. Now it’s time to introduce a “proper” DDD Repository. What are the necessary steps for the refactoring? Examine the use cases (Commands and Queries) and their implementations, then identify steps to take with your teammates.
  • 10. The Repository Pattern in DDD A repository is essentially an interface that hides the details of data access from the domain core. Different storage mechanisms can be attached by creating individual implementations, e.g. for fi le-based storage or per database engine. The interface itself is part of the domain core, the implementation belongs to its environment. Domain objects can pass to the repository and back into the core. They map to serializable data objects. But careful: Business methods must never be invoked outside of the domain core! There are two kinds of repositories: Collection- and Persistence-oriented.
  • 11. Collection-Oriented Repositories Collection-oriented repositories act like a collection: They have add(), remove(), addAll() and removeAll(), as well as fi nder methods that allow to search by attribute values. Since a collection does not explicitly notice changes on its member objects, all changes have to be recorded and explicitly “ fl ushed” to the database.
  • 12. Persistence-Oriented Repositories Persistence-oriented repositories are save()-based. They make changes more explicit by requiring an extra method call: Any change to a member object is persisted instantaneously by calling save() on the repository. Changes that are not explicitly persisted will be lost. The rule of thumb is: Go with collection-oriented, unless it creates dif fi culties in your context.
  • 13. Hint #1 Repositories should map to domain objects, not data transfer objects or database tables. What is the difference? Be mindful of aggregate boundaries.
  • 14. Hint #2 Your teammates are worried about data integrity. Where should you place transaction logic?
  • 15. Exercise #3 The team has successfully implemented aggregates and a collection- based repository. However, your tests are still very slow - they have to initialize the full Spring context to run, resulting in hours of waiting every week. As a result, more and more colleagues skip tests entirely, resulting in more bugs and rework, which not only led to a number of embarrassing incidents, but also further slows down the delivery. How could those tests be improved? Examine the test code, as well as the newly introduced repository logic, then discuss and implement measures with your teammates.
  • 16. Hint #1 All the business logic is now cleanly separated from technical details. It should be testable without external dependencies. Using polymorphism, what could be a quick way to fully isolate the core?
  • 17. Hint #2 Dependency injection is just a fancy way of passing constructor parameters. You can eliminate all the expensive setup by making good use of those.
  • 18. Exercise #4 You’ve deployed your new microservices on Kubernetes. One month later, your boss calls: The AWS bill is staggering! She urges you to get those spendings down ASAP! Your team investigates, and after looking at some CloudWatch logs, you realize the usage patterns of your app are spiky, high traf fi c times appear random, and there is a lot of idle time - the system should not be running 24/7! You decide to ditch the containers and go full serverless, con fi dent that your system is modular, and should be easy to split up. Discuss the necessary steps. What about your current solution could be problematic?
  • 19. Hint #1 Serverless apps are best mapped to individual use cases.
  • 20. Hint #2 The collection based repository keeps a lot of in-memory state. This is not helpful and may result in longer runtimes, higher memory consumption, and potential race conditions. What could you do to fi x it?
  • 21. Let’s stay in touch! https://mastodon.social/@weltraumpirat https://linkedin.com/in/w3ltraumpirat https://twitter.com/w3ltraumpirat