Programming/DDD 13

DDD - CQRS란 무엇인가?!

해당 포스팅은 "도메인 주도 개발 시작하기" 라는 내용을 정리한 글입니다. 해당 도서는 아래 Link에서 확인할 수 있습니다. - http://www.yes24.com/Product/Goods/108431347 단일 모델의 단점 주문 내역 조회 기능을 구현하려면 여러 애그리거트에서 데이터를 가져와야 한다. Order에서 주문 정보를 가져와야 하고, Product에서 상품 정보를 가져와야 하고, Member에서 회원 정보를 가져와야 한다. 조회 화면 특성상 속도가 빠를수록 좋은데 여러 애그리거트의 데이터가 필요하면 구현 방식을 고민해야 한다. 식별자(ID)를 이용해서 애그리거트에 참조하게 되면 즉시 로딩(Eager loading) 방식과 같은 JPA의 쿼리 관련 최적화 기능을 사용할 수 없다. -> 이는..

Programming/DDD 2022.08.08

DDD - 이벤트란 무엇인가 ?! (+ 마이크로 서비스 간 트랜잭션 처리)

해당 포스팅은 "도메인 주도 개발 시작하기" 라는  내용을 정리한 글입니다. 해당 도서는 아래 Link에서 확인할 수 있습니다. - http://www.yes24.com/Product/Goods/108431347 시스템 간 강결합 문제 쇼핑몰에서 구매를 취소하려면 환불을 처리해야 한다. 이때 환불 기능을 실행하는 주체가 도메인 엔터티가 될 수 있다. 아래와 같이 환불 기능을 제공하는 도메인 서비스를 파라미터로 전달받아 사용할 수 있다. public class Order { // 외부 서비스를 실행하기 위해 도메인 서비스를 파라미터로 전달 받음 public void cancel(RefundService refundService) { // 주문과 관련된 로직 verifyNotYetShipped(); th..

Programming/DDD 2022.08.03

DDD - 바운디드 컨텍스트란 무엇인가 ?!

해당 포스팅은 "도메인 주도 개발 시작하기" 라는  내용을 정리한 글입니다. 해당 도서는 아래 Link에서 확인할 수 있습니다. - http://www.yes24.com/Product/Goods/108431347 도메인 모델과 경계 도메인 모델을 만들 때 빠지기 쉬운 함정이 도메인을 완벽하게 표현하는 단일 모델을 만드는 시도를 하는 것이다. 한 도메인은 여러 하위 도메인으로 구분되기 때문에 한 개의 모델로 여러 하위 도메인을 모두 표현하려고 시도하면 하위 도메인을 공동체에 협력하는 자율적인 객체가 아닌 수동적인 개체로 만들어 버린다. 이는 OOP에 명백히 어긋나며 하위 도메인의 개념과 요구사항을 반영하기 어렵게 된다. 모델은 특정한 컨텍스트(문맥)에서 완전한 의미를 갖는다. 같은 제품이라도 카탈로그 ..

Programming/DDD 2022.07.25

DDD - 트랜잭션과 잠금을 관리하는 다양한 방법!

해당 포스팅은 "도메인 주도 개발 시작하기" 라는  내용을 정리한 글입니다. 해당 도서는 아래 Link에서 확인할 수 있습니다. - http://www.yes24.com/Product/Goods/108431347 애그리거트와 트랜잭션 주문 애그리거트에 대해 운영자가 배송 준비 상태로 변경할 때 사용자는 배송지 주소를 변경하면 어떻게 될까? 다음 그림은 운영자와 고객이 동시에 한 주문 애그리거트를 수정하는 과정이다. 리포지토리는 트랜잭션마다 새로운 애그리거트 객체를 생성한다. 운영자 스레드와 고객 스레드에서는 개념적으로 동일하지만 물리적으로 서로 다른 애그리거트를 사용한다. 즉, 각 애그리거트는 서로의 객체에 영향을 주지 않는다. 고객 스레드 입장에서는 주문 애그리거트가 아직 배송 상태가 아니므로 배송..

Programming/DDD 2022.07.19

DDD - 도메인 서비스란 무엇인가 ?! (+ 다수의 애그리거트를 참조하는 방법)

해당 포스팅은 "도메인 주도 개발 시작하기" 라는  내용을 정리한 글입니다. 해당 도서는 아래 Link에서 확인할 수 있습니다. - http://www.yes24.com/Product/Goods/108431347 여러 애그리거트가 필요한 기능 도메인 영역의 코드를 작성하다 보면 한 애그리거트로 기능을 구현할 수 없을 때가 있다. 결제 금액 계산 로직의 예로 살펴보자. 상품 애그리거트 : 구매하는 상품의 가격이 필요하다. 또한 상품에 따라 배송비가 추가되기도 한다. 주문 애그리거트 : 상품별로 구매 개수가 필요하다. 할인 쿠폰 애그리거트 : 쿠폰별로 지정한 할인 금액이나 비율에 따라 주문 총 금액을 할인한다. 회원 애그리거트 : 회원 등급에 따라 추가 할인이 가능하다. 이 경우 실제 결제 금액을 계산하는..

Programming/DDD 2022.07.14

DDD - 표현 영역과 응용 서비스! (+ 값 검증, 권한 검사, ...)

해당 포스팅은 "도메인 주도 개발 시작하기" 라는  내용을 정리한 글입니다. 해당 도서는 아래 Link에서 확인할 수 있습니다. - http://www.yes24.com/Product/Goods/108431347 표현 영역 표현 영역의 책임은 크게 다음과 같다. 사용자가 시스템을 사용할 수 있는 흐름(화면)을 제공하고 제어한다. 사용자의 요청을 알맞은 응용 서비스에 전달하고 결과를 사용자에게 제공한다. 응용 서비스에서 익셉션이 발생 시 예외에 맞게 처리해서 사용자에게 노출한다. 사용자의 세션을 관리한다. 값 검증 값 검증은 표현 영역과 응용 서비스에서 모두 수행할 수 있다. 원칙적으로 모든 값에 대한 검증은 응용 서비스에서 처리한다. 하지만 표현 영역은 잘못된 값이 존재하면 이를 사용자에게 알려주고 값..

Programming/DDD 2022.07.13

DDD - 응용 서비스 제대로 구현하기!

해당 포스팅은 "도메인 주도 개발 시작하기" 라는  내용을 정리한 글입니다. 해당 도서는 아래 Link에서 확인할 수 있습니다. - http://www.yes24.com/Product/Goods/108431347 표현 영역과 응용 영역 도메인 영역을 잘 만들었어도 도메인이 제 기능을 하려면 사용자와 도메인을 연결해주는 매개체가 필요하다. 응용 영역과 표현 영역은 사용자와 도메인을 연결해 주는 매개체 역할을 한다. 표현 영역은 사용자의 요청을 해석한다. 해석된 메시지를 이용해서 사용자가 실행하고 싶은 기능을 제공하는 것은 응용 서비스가 담당한다. 즉, 실제 사용자가 원하는 기능을 제공하는 것은 응용 영역에 위치한 서비스이다. 응용 서비스의 역할 응용 서비스는 사용자(클라이언트)가 요청한 기능을 실행한다..

Programming/DDD 2022.06.23

DDD - JPA를 이용한 Repository, Entity 매핑 제대로 구현하기!

해당 포스팅은 "도메인 주도 개발 시작하기" 라는  내용을 정리한 글입니다. 해당 도서는 아래 Link에서 확인할 수 있습니다. - http://www.yes24.com/Product/Goods/108431347 모듈 위치 리포지터리 인터페이스는 애그리거트와 같이 도메인 영역에 속하고, 리포지터리를 구현한 클래스는 인프라스트럭처 영역에 속한다. 이는 DIP에 따라 리포지터리의 구현체를 인프라스트럭처 영역에 위치시켜서 인프라스트럭처 영역이 도메인 영역을 의존하도록 한다. Spring Data JPA 스프링 데이터 JPA는 다음 규칙에 따라 작성한 인터페이스를 찾아서 해당 인터페이스의 구현체 프록시를 빈으로 등한다. org.springframwork.data.repository.Repository 인터..

Programming/DDD 2022.06.16

DDD - 애그리거트(Aggregate)를 잘 사용하는 방법들!

해당 포스팅은 "도메인 주도 개발 시작하기" 라는  내용을 정리한 글입니다. 해당 도서는 아래 Link에서 확인할 수 있습니다. - http://www.yes24.com/Product/Goods/108431347 애그리거트 온라인 쇼핑몰 시스템을 개발할 때 다음 그림과 같이 상위 수준의 개념을 이용해서 전체 모델을 정리하면 전반적인 관계를 이해하는데 도움이 된다. 아래 그림을 보면 주문은 회원, 상품, 결제와 관련이 있다는 것을 쉽게 파악할 수 있다. 다음은 상위 수준 모델을 개별 객체 단위로 다시 그린 것이다. 해당 그림은 상위 수준에서의 개념 이해 없이 도출하려면 시간이 더 오래 걸린다. 더 많은 코드를 보고 도메인 전문가와 더 많은 대화를 나눠야 비로소 상위 수준에서 모델 간의 관계가 이해되기 ..

Programming/DDD 2022.06.09

DDD - Infrastructure Layer 설계하는 방법 (+ DIP 제대로 사용하기)

해당 포스팅은 "도메인 주도 개발 시작하기" 라는  내용을 정리한 글입니다. 해당 도서는 아래 Link에서 확인할 수 있습니다. - http://www.yes24.com/Product/Goods/108431347 Layer Architecture 아래는 계층 구조 아키텍처를 도식화한 그림이다. 위의 계층 구조 아키텍처는 다음의 특징이 있다. 도메인의 복잡도에 따라 응용과 도메인을 분리하기도 하고 한 계층으로 합치기도 한다. 상위 계층에서 하위 계층으로 의존만 존재하고 하위 계층은 상위 계층에 의존하지 않는다. 응용계층이 도메인 뿐만 아니라 Infrastructure에 의존하기도 한다. Infrastructure에 의존하면 테스트하기 어렵다. 기능 확장이 어렵다. 해결 방법은 DIP를 적용하는 것이다..

Programming/DDD 2022.06.05