07 - 언어의 사용(확장 예제) (2)
시나리오 연습
예제 애플리케이션 기능 : 화물의 목적지 변경
Customer 로부터 화물의 목적지 변경 요청이 들어올 수 있다. Delivery Specification 은 Value Object 이므로 기존 것을 버리고 새로운 Delivery Specification 을 획득해 대체하면 간단하게 처리할 수 있다.
예제 애플리케이션 기능 : 반복 업무
같은 고객이 반복적으로 예약하는 내용이 비슷해서 기존 Cargo 를 새로운 Cargo 의 프로토타입으로 사용하고 싶다.
Cargo 는 Entity 이며 Aggregate 루트이기 떄문에, 신중하게 복사해야 한다. (Aggregate 는 외부에 영향을 주지 않아야 한다)
Delivery History : 기존 이력은 사용하지 않으므로 빈 상태로 만든다.
Customer Role : 동일한 역할을 수행할 가능성이 높으므로 Customer 에 대한 참조를 키로 갖는 Map 으로 복사한다. (객체 자체는 복사하지 않도록 주의)
Tracking ID : 새로운 Cargo 를 생성하는 때는 동일한 출처에서 만들어진 새 Tracking ID 를 제공해야 한다.
객체 생성
Cargo 에 대한 Factory 와 생성자
불변식을 이행하거나, 자신의 식별성을 그대로 갖는 객체를 생성하기 위해서 생성자가 필요하다.
Factory 에서 반환되는 결과는 빈 Delivery History, Delivery Specification 이 담긴 Cargo 일 것이다.
Delivery History 의 생성자는 Cargo 에 의해 배타적으로 사용되므로 Cargo 의 구성은 캡슐화된다.
Handler Event 추가
모델의 Handler Event 는 적재와 하역에서 포장, 입고, 기타 Carrier 에 관계되지 않은 활동에 이르기가지 다양하게 특화되어 있는 Handler Event 클래스를 캡슐화하는 추상적인 개념이다.
각 타입에 대한 기반 클래스(Handler Event) 에 Factory Metod 를 추가하면 인스턴스 생성이 추상화되며, 클라이언트가 구현에 대해서 알지 않아도 된다.
하지만, Cargo -> Delivery History -> Handler Event -> Cargo 에 이르는 참조의 순환은 인스턴스 생성을 복잡하게 한다.
리팩터링할 시간 : Cargo Aggregate 설계 대안
Handler Event 를 추가할 때 Delivery History 를 갱신해야 하는 탓에 Cargo Aggregate 가 트랜젝션에 참여하게 된다.
Delivery History 의 Handler Event 컬렉션을 질의로 교체하면 자체적인 Aggregate 외부에 아무런 무결성 문제를 일으키지 않고 추가될 수 있다.
Handling Event 에 대한 Repository 를 추가하여 특정 Cargo 에 관계된 Event 에 대한 질의를 지원할 수 있다.
...
Last updated