본문 바로가기

반응형

programming/DDD

(11)
[DDD] chapter 11 Chapter 11 11.1 단일 모델의 단점 주문 내역 조회 기능을 구현하려면 여러 애그리거트에서데이터를 가져와야 한다. Order에서 주문 정보를 가져와야 하고, Product에서 상품 이름을 가져와야 하고, Member에서 회원 이름과 ID를 가져와야 한다. 이러한 구현 복잡도 문제를 해결하려면 상태 변경을 위한 모델과 조회를 위한 모델을 분리하여 구현할 수 있다. 11.2 CQRS Command Query Responsibility Segregation의 약자로 상태를 변경하는 명령을 위한 모델과 상태를 제공하는 조회를 위한 모델을 분리하는 패턴이다. CQRS는 도메인이 복잡할수록 명령 기능과 조회 기능이 다루는 데이터 범위에 차이가난다. CQRS를 사용하면 각 모델에 맞는 구현 기술을 선택할 수..
[DDD] chapter 10 Chapter 10 10.1 시스템 간 강결합 문제 외부 서비스를 사용할 때 발생할 수 있는 문제점 트랜잭션 처리가 애매해진다. 성능이 비교적 감소한다. (외부 서비스 성능에 직접적인 영향을 받게 된다.) 위의 문제를 해결하는 방법은 이벤트를 사용하는 것이다. 10.2 이벤트 개요 이벤트란? 과거에 벌어진 어떤 것. 사용자가 암호를 변경했을 때 > "암호를 변경했음 이벤트"가 벌어졌다고 할 수 있다. 사용자가 주문을 취소했을 때 > "주문을 취소했음 이벤트"가 벌어졌다고 할 수 있다. 도메인의 상태 변경과 관련된 요구사항들을 이벤트를 통해 구현할 수있다. "주문을 취소할 때 이메일을 보낸다."라는 요구사항에서 "주문을 취소할 때"는 주문이 취소 상태로 바뀌는 것을 의미하므로 "주문 취소됨 이벤트"를 이용..
[DDD] chapter 9 Chapter 9 9.1 도메인 모델과 경계 한 개의 모델로 여러 하위 도메인을 모두 표현하려고 시도하면 오히려 모든 하위 도메인에 맞지 않는 모델을 만들게 된다. 카탈로그에서 상품, 재고 관리에서 상품, 주문에서 상품, 배송에서 상품은 이름만 같지 실제로 의미하는 것이 다르다. 카탈로그에서의 상품은 상품 이미지와같은 상품 정보가 위주라면, 재고 관리에서는 실존하는 개별 객체를 추적하기 위한 목적으로 개별 객체를 추적하기 위한 목적으로 상품을 사용한다. 즉, 카탈로그에서는 물리적으로 한 개인 상품이 재고 관리에서는 여러 개 존재할 수 있다. 논리적으로 같은 존재처럼 보이지만, 하위 도메인에 따라 다른 용어를 사용하는 경우도 있다.카탈로그 도메인에서의 상품이 검색 모데인에서는 문서로 물리기도 한다. (이러..
[DDD] chapter 8 chapter 8 8.1 애그리거트와 트랜잭션 한 주문 애그리거트에 대해 운영자는 배송 상태로 변경할 때 사용자는 배송지 주소를 변경하면 다음과 같은 일이 일어난다. 운영자 스레드 고객 스레드 주문 애그리거트 구함 주문 애그리거트 구함 배송 상태로 변경 배송지 변경 트랜잭션 커밋 트랜잭션 커밋 트랜잭션마다 리포지터리는 새로운 애그리거트 객체를 생성하므로 운영자 스레드와 고객 스레드는 같은 주문 애그리거트를 나타내는 다른 객체를 구하게 된다. 운영자 스레드와 고객 스레드는 개념적으로 동일한 애그리거트지만 물리적으로 서로 다른 애그리거트 객체를 사용한다. 때문에 운영자 스레드가 주문 애그리거트 객체를 배송 상태로 변경 하더라도 고객 스레드가 사용하는 주문 애그리거트 객체에는 영향을 주지 않는다. 고객 스레드..
[DDD] chapter 7 Chapter 7 7.1 여러 애그리거트가 필요한 기능 도메인 영역의 코드를 작성하다 보면, 한 애그리거트로 기능을 구현할 수 없을 때가 있다. 상품 애그리거트: 구매하는 상품의 가격이 필요하다. 또한 상품에 따라 배송비가 추가되기도 한다. 주문 애그리거트: 상품별로 구매 개수가 필요하다. 할인 쿠폰 애그리거트: 쿠폰별로 지정한 할인 금액이나 비율에 따라 주문 총 금액을 할인한다. 할인 쿠폰을 조건에 따라 중복 사용할 수 있다거나 지정한 카테고리의 상품에만 적용할 수 있다는 제약조건이 있을 수있다. 회원 애그리거트: 회원 등급에 따라 추가 할인이 가능하다. 이 상황에서 실제 결제 금액을 계산해야하는 주체는 주문 애그리거트일까? 그러나 총 주문 금액에서 할인 금액을 계산해야하는데 이 할인 금액을 구하는 것..
[DDD] chapter 6 6.1 표현 영역과 응용 영역 도메인이 제 기능을 하려면 사용자와 도메인을 연결해 주는 매개체가 필요하다. 응용 영역과 표현 영역이 사용자와 도메인을 연결해 주는 매개체 역할을 한다. 실제 사용자가 원하는 기능을 제공하는 것은 응용 역역에 위치한 서비스다. 사용자가 회원가입을 요청했다면, 실제 그 요청을 위한 기능을 제공하는 주체는 응용 서비스에 위치한다. 사용자와 상호작용은 표현 영역이 처리하기 때문에, 응용 서비스는 표현 영역에 의존하지 않는다. 응용 영역은 사용자가 웹 브라우저를 사용하는지 REST API를 호출하는지, TCP 소켓을 사용하는지를 알 필요가 없다. 6.2 응용 서비스의 역할 응용 서비스의 역할 사용자가 요청한 기능을 실행한다. 사용자의 요청을 처리하기 위해 리포지터리에서 도메인 객체..
[DDD] chapter 5 5.1 시작에 앞서 CQRS 명령(Command) 모델과 조회(Query) 모델을 분리하는 패턴. 명령 모델은 상태를 변경하는 기능을 구현할 때 사용. 조회 모델은 데이터를 조회하는 기능을 구현할 때 사용. 예를 들어 회원 가입, 암호 변경, 주문 취소 처럼 상태를 변경하는 기능을 구현할 때 사용. 도메인 모델은 명령 모델로 주로 사용된다. 5.2 검색을 위한 스펙 검색 조건이 고정되어 있지 않고, 다양한 검색 조건을 조합해야 할 때가 있다. 필요한 조합마다 find 메서드를 정의할 수 있지만, 이것은 좋은 방법이 아니다. 이렇게 검색 조건을 다양하게 조합해야 할 때 사용할 수 있는 것이 스펙이다. 스펙은 애그리거트가 특정 조건을 충족하는지를 검사할 때 사용하는 인터페이스다. 스펙 인터페이스는 다음과 같..
[DDD] chapter 4 Chapter 4 4.1 JPA를 이용한 리포지터리 구현 4.1.1 모듈 위치 위의 그림처럼 Repository interface는 도메인 영역에 속한다. 이를 구현하는 구현체는 인프라영역에서 구현한다. 가능하면 리포지터리 구현 클래스를 인프라스트럭쳐 영역에 위치 시켜서 인프라스트럭처에 대한 의존을 낮춰야한다. 4.2.1 리포지터리 기본 기능 구현 인터페이스는 애그리거트 루트를 기준으로 작성한다. 주문 애그리거트는 Order 루트 엔티티를 비롯해 OrderLine, Orderer, ShippingInfo 등 다양한 객체를 포함하는데, 이 구성요소 중에서 루트 엔티티인 Order를 기준으로 리포지터리 인터페이스를 작성한다. 애그리거트의 널리 사용되는 규칙은 'findBy프로퍼티 이름(프로퍼티 값)' 형식을..