SlideShare a Scribd company logo
1 of 21
Download to read offline
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

More Related Content

What's hot

API Design Methodology - Mike Amundsen, Director of API Architecture, API Aca...
API Design Methodology - Mike Amundsen, Director of API Architecture, API Aca...API Design Methodology - Mike Amundsen, Director of API Architecture, API Aca...
API Design Methodology - Mike Amundsen, Director of API Architecture, API Aca...CA API Management
 
Clean architecture - Protecting the Domain
Clean architecture - Protecting the DomainClean architecture - Protecting the Domain
Clean architecture - Protecting the DomainVictor Rentea
 
Platform as a Service overview
Platform as a Service overviewPlatform as a Service overview
Platform as a Service overviewMiguel Pastor
 
How to Implement Architecture to Support Omnichannel Services
How to Implement Architecture to Support Omnichannel ServicesHow to Implement Architecture to Support Omnichannel Services
How to Implement Architecture to Support Omnichannel ServicesOpenbravo
 
Data Product Management by Tinder Group PM
Data Product Management by Tinder Group PMData Product Management by Tinder Group PM
Data Product Management by Tinder Group PMProduct School
 
Programming Languages Trends for 2023
Programming Languages Trends for 2023Programming Languages Trends for 2023
Programming Languages Trends for 2023Svetlin Nakov
 
Cloud Native Apps
Cloud Native AppsCloud Native Apps
Cloud Native AppsDavid Chou
 
Fine tune and deploy Hugging Face NLP models
Fine tune and deploy Hugging Face NLP modelsFine tune and deploy Hugging Face NLP models
Fine tune and deploy Hugging Face NLP modelsOVHcloud
 
Domain Driven Design (DDD)
Domain Driven Design (DDD)Domain Driven Design (DDD)
Domain Driven Design (DDD)Tom Kocjan
 
Enterprise Storage NAS - Dual Controller
Enterprise Storage NAS - Dual ControllerEnterprise Storage NAS - Dual Controller
Enterprise Storage NAS - Dual ControllerFernando Barrientos
 
Architecture of integration services
Architecture of integration servicesArchitecture of integration services
Architecture of integration servicesSlava Kokaev
 
A Modern Data Architecture for Microservices
A Modern Data Architecture for MicroservicesA Modern Data Architecture for Microservices
A Modern Data Architecture for MicroservicesAmazon Web Services
 
Testing Rich Domain Models
Testing Rich Domain ModelsTesting Rich Domain Models
Testing Rich Domain ModelsChris Richardson
 
SharePoint Document Types
SharePoint Document TypesSharePoint Document Types
SharePoint Document TypesGregory Zelfond
 
Azure Pipelines Multistage YAML - Top 10 Features
Azure Pipelines Multistage YAML - Top 10 FeaturesAzure Pipelines Multistage YAML - Top 10 Features
Azure Pipelines Multistage YAML - Top 10 FeaturesMarc Müller
 

What's hot (20)

API Design Methodology - Mike Amundsen, Director of API Architecture, API Aca...
API Design Methodology - Mike Amundsen, Director of API Architecture, API Aca...API Design Methodology - Mike Amundsen, Director of API Architecture, API Aca...
API Design Methodology - Mike Amundsen, Director of API Architecture, API Aca...
 
Clean architecture - Protecting the Domain
Clean architecture - Protecting the DomainClean architecture - Protecting the Domain
Clean architecture - Protecting the Domain
 
Platform as a Service overview
Platform as a Service overviewPlatform as a Service overview
Platform as a Service overview
 
Solid principles
Solid principlesSolid principles
Solid principles
 
Why Microservice
Why Microservice Why Microservice
Why Microservice
 
How to Implement Architecture to Support Omnichannel Services
How to Implement Architecture to Support Omnichannel ServicesHow to Implement Architecture to Support Omnichannel Services
How to Implement Architecture to Support Omnichannel Services
 
Data Product Management by Tinder Group PM
Data Product Management by Tinder Group PMData Product Management by Tinder Group PM
Data Product Management by Tinder Group PM
 
Programming Languages Trends for 2023
Programming Languages Trends for 2023Programming Languages Trends for 2023
Programming Languages Trends for 2023
 
Microsoft dynamics
Microsoft dynamicsMicrosoft dynamics
Microsoft dynamics
 
Cloud Native Apps
Cloud Native AppsCloud Native Apps
Cloud Native Apps
 
Fine tune and deploy Hugging Face NLP models
Fine tune and deploy Hugging Face NLP modelsFine tune and deploy Hugging Face NLP models
Fine tune and deploy Hugging Face NLP models
 
Machine Learning Pitch Deck
Machine Learning Pitch DeckMachine Learning Pitch Deck
Machine Learning Pitch Deck
 
Domain Driven Design (DDD)
Domain Driven Design (DDD)Domain Driven Design (DDD)
Domain Driven Design (DDD)
 
camunda for developer-friendly BPM
camunda for developer-friendly BPMcamunda for developer-friendly BPM
camunda for developer-friendly BPM
 
Enterprise Storage NAS - Dual Controller
Enterprise Storage NAS - Dual ControllerEnterprise Storage NAS - Dual Controller
Enterprise Storage NAS - Dual Controller
 
Architecture of integration services
Architecture of integration servicesArchitecture of integration services
Architecture of integration services
 
A Modern Data Architecture for Microservices
A Modern Data Architecture for MicroservicesA Modern Data Architecture for Microservices
A Modern Data Architecture for Microservices
 
Testing Rich Domain Models
Testing Rich Domain ModelsTesting Rich Domain Models
Testing Rich Domain Models
 
SharePoint Document Types
SharePoint Document TypesSharePoint Document Types
SharePoint Document Types
 
Azure Pipelines Multistage YAML - Top 10 Features
Azure Pipelines Multistage YAML - Top 10 FeaturesAzure Pipelines Multistage YAML - Top 10 Features
Azure Pipelines Multistage YAML - Top 10 Features
 

Similar to 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
 

Similar to 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
 

Recently uploaded

What are the features of Vehicle Tracking System?
What are the features of Vehicle Tracking System?What are the features of Vehicle Tracking System?
What are the features of Vehicle Tracking System?Watsoo Telematics
 
cybersecurity notes for mca students for learning
cybersecurity notes for mca students for learningcybersecurity notes for mca students for learning
cybersecurity notes for mca students for learningVitsRangannavar
 
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...gurkirankumar98700
 
Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)OPEN KNOWLEDGE GmbH
 
The Evolution of Karaoke From Analog to App.pdf
The Evolution of Karaoke From Analog to App.pdfThe Evolution of Karaoke From Analog to App.pdf
The Evolution of Karaoke From Analog to App.pdfPower Karaoke
 
Unit 1.1 Excite Part 1, class 9, cbse...
Unit 1.1 Excite Part 1, class 9, cbse...Unit 1.1 Excite Part 1, class 9, cbse...
Unit 1.1 Excite Part 1, class 9, cbse...aditisharan08
 
Salesforce Certified Field Service Consultant
Salesforce Certified Field Service ConsultantSalesforce Certified Field Service Consultant
Salesforce Certified Field Service ConsultantAxelRicardoTrocheRiq
 
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...soniya singh
 
chapter--4-software-project-planning.ppt
chapter--4-software-project-planning.pptchapter--4-software-project-planning.ppt
chapter--4-software-project-planning.pptkotipi9215
 
Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024Andreas Granig
 
EY_Graph Database Powered Sustainability
EY_Graph Database Powered SustainabilityEY_Graph Database Powered Sustainability
EY_Graph Database Powered SustainabilityNeo4j
 
Advancing Engineering with AI through the Next Generation of Strategic Projec...
Advancing Engineering with AI through the Next Generation of Strategic Projec...Advancing Engineering with AI through the Next Generation of Strategic Projec...
Advancing Engineering with AI through the Next Generation of Strategic Projec...OnePlan Solutions
 
Implementing Zero Trust strategy with Azure
Implementing Zero Trust strategy with AzureImplementing Zero Trust strategy with Azure
Implementing Zero Trust strategy with AzureDinusha Kumarasiri
 
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptxKnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptxTier1 app
 
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdf
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdfThe Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdf
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdfkalichargn70th171
 
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...MyIntelliSource, Inc.
 
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer DataAdobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer DataBradBedford3
 
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...kellynguyen01
 
Project Based Learning (A.I).pptx detail explanation
Project Based Learning (A.I).pptx detail explanationProject Based Learning (A.I).pptx detail explanation
Project Based Learning (A.I).pptx detail explanationkaushalgiri8080
 

Recently uploaded (20)

What are the features of Vehicle Tracking System?
What are the features of Vehicle Tracking System?What are the features of Vehicle Tracking System?
What are the features of Vehicle Tracking System?
 
cybersecurity notes for mca students for learning
cybersecurity notes for mca students for learningcybersecurity notes for mca students for learning
cybersecurity notes for mca students for learning
 
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
 
Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)
 
The Evolution of Karaoke From Analog to App.pdf
The Evolution of Karaoke From Analog to App.pdfThe Evolution of Karaoke From Analog to App.pdf
The Evolution of Karaoke From Analog to App.pdf
 
Unit 1.1 Excite Part 1, class 9, cbse...
Unit 1.1 Excite Part 1, class 9, cbse...Unit 1.1 Excite Part 1, class 9, cbse...
Unit 1.1 Excite Part 1, class 9, cbse...
 
Salesforce Certified Field Service Consultant
Salesforce Certified Field Service ConsultantSalesforce Certified Field Service Consultant
Salesforce Certified Field Service Consultant
 
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
 
chapter--4-software-project-planning.ppt
chapter--4-software-project-planning.pptchapter--4-software-project-planning.ppt
chapter--4-software-project-planning.ppt
 
Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024
 
EY_Graph Database Powered Sustainability
EY_Graph Database Powered SustainabilityEY_Graph Database Powered Sustainability
EY_Graph Database Powered Sustainability
 
Advancing Engineering with AI through the Next Generation of Strategic Projec...
Advancing Engineering with AI through the Next Generation of Strategic Projec...Advancing Engineering with AI through the Next Generation of Strategic Projec...
Advancing Engineering with AI through the Next Generation of Strategic Projec...
 
Implementing Zero Trust strategy with Azure
Implementing Zero Trust strategy with AzureImplementing Zero Trust strategy with Azure
Implementing Zero Trust strategy with Azure
 
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptxKnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
 
Call Girls In Mukherjee Nagar 📱 9999965857 🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...
Call Girls In Mukherjee Nagar 📱  9999965857  🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...Call Girls In Mukherjee Nagar 📱  9999965857  🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...
Call Girls In Mukherjee Nagar 📱 9999965857 🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...
 
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdf
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdfThe Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdf
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdf
 
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
 
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer DataAdobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
 
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
 
Project Based Learning (A.I).pptx detail explanation
Project Based Learning (A.I).pptx detail explanationProject Based Learning (A.I).pptx detail explanation
Project Based Learning (A.I).pptx detail explanation
 

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