ddd-study-group / first-ddd-study Goto Github PK
View Code? Open in Web Editor NEW첫번째 DDD 스터디 기록을 담은 Repository 입니다.
첫번째 DDD 스터디 기록을 담은 Repository 입니다.
애그리거트에 대해 잘 이해가 되지 않아서 추가적으로 정리하고 공유드립니다.
마틴 파울러는 애그리거트를 다음과 같이 정의하는데
애그리거트는 데이터 저장소에 전송하기 위한 기본요소 입니다. 트랜잭션은 애그리거트의 경계를 벗어나지 못합니다.
DDD를 능숙하게 사용해본 사람은 잘 이해하겠지만 저에게는 무슨 의미인지 크게 와닿지 못했습니다. 그래서 더 추가적으로 찾아보고 정리했습니다.
소프트웨어를 작은 버블의 집합체로 보면 알기 쉽게 이해할 수 있다. 각 버블은 독립적으로 작업할 수 있다. 어떤 순간 버블이 무엇을 하는지 생각하면 된다. 애그리거트도 마찬가지로 더 작은 규모의 버블이다.
시스템을 운영하기 위한 새로운 기능을 구축한다고 상상하고 새로운 기능에는 프로젝트, 팀, 구성원의 개념이 포함됩니다.
각 팀에는 관련된 여러 직원이 있을 수 있고 직원은 각 팀의 일원이 될 수 있고 팀은 여러 프로젝트를 가질 수 있습니다.
여기에서 엔티티 마다 존재할 수 있을만 한 필드를 추가하면 아래와 같다.
엔티티를 좀 더 비지니스의 개념으로 이해하고 엔티티가 무엇을 할 수 있을지 정의하면 아래와 같다.
하지만 비지니스의 로직은 그렇게 쉽게 풀리지 않습니다. 아래와 같은 문제가 발생할 수 도 있습니다.
애그리거트는 이러한 종료의 문제를 해결하기 위한 것이다.
팀에게는 구성원에대한 이름 수정이나 경력수정이 필요하지 않습니다. 마찬가지로 프로젝트도 필요 없습니다. 하지만 서로 구성원을 참조하여 팀원과 프로젝트 팀원이 필요하니 개별적으로 참조하고 있는 구조로 변경하여 하나의 분기처럼 동작하도록 분할한 것입니다.
마틴파울러가 정의하는 애그리거트
Aggregate는 Domain-Driven Design의 패턴입니다. DDD 애그리거트는 단일 단위로 처리할 수 있는 도메인 개체의 클러스터입니다. 예를 들어 주문과 해당 라인 항목이 있을 수 있으며 이들은 별도의 개체가 되지만 주문(라인 항목과 함께)을 단일 애그리거트로 처리하는 것이 유용합니다.
애그리거트에는 구성 요소 개체 중 하나가 애그리거트 루트가 됩니다. 애그리거트 외부의 모든 참조는 애그리거트 루트로만 이동해야 합니다. 따라서 루트는 전체적으로 애그리거트의 무결성을 보장할 수 있습니다.
애그리거트는 데이터 저장소 전송의 기본 요소입니다. 전체 애그리거트를 로드하거나 저장하도록 요청합니다. 트랜잭션은 애그리거트 경계를 넘어서는 안 됩니다.
애그리거트는 한마디로 도메인의 클러스터 역활을 하여 여러 도메인이 연관되어 하나의 도메인이 동작하는 것처럼 해주는 묶음인 것이다. 그렇기 때문에 하나의 트랜잭션은 애그리거트의 경계를 넘지 못하는 것이다.
도메인 규칙은 도메인안에서 정의하고 응용계층은 도메인의 흐름만 제어한다가 전제가 되었을 때
만약 도메인 규칙이 인프라스트럭처에 의존해야되는 상황일 때에도 무조건 도메인에 의존하도록 해야될지 궁금해서 이슈를 남깁니다.
처음에는 현재 비밀번호와 변경하고자하는 비밀번호가 같으면 안된다라는 도메인 규칙을 정의했을 때에는 아래와 같습니다.
public void changePassword(String email, String newPassword) {
Member member = memberRepository.findByEmail(email);
existsMember(member);
if (!member.matchPassword(newPassword)) {
throw new WrongPasswordException();
}
member.changePassword(oldPassword, newPassword);
memberRepository.save(member);
}
추후에는 보안 정책이 강화됨에 따라 한달내에 변경했던 패스워드들은 변경하지 못한다고 도메인 규칙이 변경되고 한달동안 변경되었던 패스워드들은 Nosql형태의 다른 데이터 베이스에 저장한다고 가정 했을 때에는 서비스로직을 구현한다고 가정한다면 아래처럼 구현할 것 같습니다.
public void changePassword(String email, String newPassword) {
Member member = memberRepository.findByEmail(email);
existsMember(member);
if (memberPasswordHistoryRepository.existsByEmailAndPassword(email, newPassword)) {
throw new WrongPasswordException();
}
member.changePassword(oldPassword, newPassword);
memberRepository.save(member);
}
이러한 로직을 도메인으로 구현하다면 아래와 같은 구조로 구현이 된다면 아래처럼 구현이 될 것 같습니다.
public void changePassword(String email, String oldPassword, String newPassword) {
Member member = memberRepository.findByEmail(email);
existsMember(member);
List<String> usedPasswords = memberPasswordHistoryRepository.findUsedPasswordsByEmail(email);
if(member.isUsedPassword(usedPasswords, newPassword)) {
throw new WrongPasswordException();
}
member.changePassword(oldPassword, newPassword);
memberRepository.save(member);
}
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.