도메인 주도 개발 스터디 10

Chapter 11 CQRS

도메인 주도 개발 시작하기 11장을 요약한 내용입니다. 11.1 단일 모델의 단점 주문 내역 조회 기능을 구현하려면 여러 애그리거트에서 데이터를 가져와야 한다. Order에서 주문 정보 Product에서 상품 정보 Member에서 회원 이름과 ID 정보 조회 화면 특성상 조회 속도가 빠를수록 좋은데 여러 애그리거트의 데이터가 필요하면 구현 방법을 고민 해야함 애그리거트 간 연관의 식별자가 아니라 직접 참조하는 방식으로 연결해도 고민거리가 생긴다. 조회 화면 특성에 따라 같은 연관도 즉시 로딩이나 지연 로딩으로 처리 해야하기 때문 조회 기능을 구현할 때 DBMS가 제공하는 전용 기능이 필요하면 JPA의 네이티브 쿼리를 사용해야할 수 있다. 고민이 발생하는 이유는 시스템 상태를 변경할 때와 조회할 때 단일 ..

Chapter 10 이벤트

도메인 주도 개발 시작하기 10장을 요약한 내용입니다. 10.1 시스템 간 강결합 문제 쇼핑몰에서 구매를 취소하면 환불을 처리해야 한다. 환불 기능을 실행하는 주체는 주문 도메인 엔티티가 될 수 있다. 도메인 객체에서 환불 기능을 실행하려면 환불 기능을 제공하는 도메인 서비스를 파라미터로 전달 받고 도메인 서비스를 실행하게 된다. public class Order { // 외부 서비스를 실행하기 위해 도메인 서비스를 파라미터로 전달받음 public void cancel(RefundService refundService) { verifyNotYetShipped(); this.state = OrderState.CANCELED; this.refundStatus = State.REFUND_STARTED; try..

Chapter 9 도메인 모델과 바운디드 컨텍스트

도메인 주도 개발 시작하기 9장을 요약한 내용입니다. 9.1 도메인 모델과 경계 도메인 모델을 만들 때 빠지기 쉬운 함정이 도메인을 완벽하게 표현하는 단일 모델을 만드는 시도를 하는 것 한 도메인은 여러 하위 도메인으로 구분되기 때문에 한 개의 모델로 여러 하위 도메인을 모두 표현하려고 시도하면 오히려 모든 하위 도메인에 맞지 않는 모델을 만들게 된다. 상품이라는 모델을 생각 해보자. 카달로그에서 상품, 재고 관리에서 상품, 주문에서 상품, 배송에서 상품은 이름만 같지 실제로 의미하는 것은 다름 카달로그에서의 상품은 상품 이미지, 상품명, 상품 가격 등과 같은 상품 위주의 정보 재고 관리에서의 상품은 실존하는 개별 객체를 추적관리하기 위한 목적 논리적으로는 같은 존재처럼 보이지만 하위 도메인에 따라 다른..

Chapter 8 애그리거트 트랜잭션 관리

create table locks ( 'type' varchar(255), id varchar(255), lockid varchar(255), expiration_time datetime, primary key ('type', id) ) character set utf8; create unique index locks_idx ON locks (lockid); // Order 타입의 1번 식별자를 갖는 애그리거트에 대한 잠금 쿼리 insert into locks values ('Order', '1', '생성한 lockid', '2016-03-28 09:10:00'); 도메인 주도 개발 시작하기 8장을 요약한 내용입니다. 8.1 애그리거트와 트랜잭션 주문 애그리거트에 대해 운영자는 배송 상태로 변경할 때 고..

Chapter 7 도메인 서비스

도메인 주도 개발 시작하기 7장을 요약한 내용입니다. 7.1 여러 애그리거트가 필요한 기능 한 애그리거트로 기능을 구현할 수 없을 때가 있다. 결제 금액을 계산할 때 필요한 내용 상품 애그리거트: 구매하는 상품의 가격이 필요하다. 상품에 따라 배송비가 추가되기도 한다. 주문 애그리거트: 상품별로 구매 개수가 필요하다. 할인 쿠폰 애그리거트: 쿠폰별로 지정한 할인 금액이나 비율에 따라 주문 총 금액을 할인한다. 할인 쿠폰을 조건에 따라 중복 사용할 수 있다거나 지정한 카테고리의 상품에만 적용할 수 있다는 제약 조건이 있다면 할인 계산이 복잡해지낟. 회원 애그리거트: 회원 등급에 따라 추가 할인이 가능하다. 결제 금액을 계산해야 하는 주체는 어떤 애그리거트일까? 총 주문 금액에서 할인 금액을 계산해야 하는데..

Chapter 6 응용 서비스와 표현 영역

도메인 주도 개발 시작하기 6장을 요약한 내용입니다. 6.1 표현 영역과 응용 영역 도메인이 제 기능을 하려면 사용자와 도메인을 연결해주는 매개체가 필요하다 표현 영역은 사용자의 요청을 해석 웹 브라우저에서 ID와 암호를 입력한 뒤에 전송 버튼을 클릭하면 요청 파라미터를 포함함 HTTP 요청을 표현 영역에 전달 사용자가 실행하고 싶은 기능을 판별하고 기능을 제공하는 응용 서비스를 실행 사용자가 원하는 기느을 제공하는 것은 응용 영역에 위치한 서비스 회원 가입을 요청했다면 실제 그 요청을 위한 기능을 제공하는 주체는 응용 서비스 응용 서비스의 메서드가 요구하는 파라미터와 표현 영역이 사용자로부터 전달받은 데이터는 형식이 일치하지 않음 표현 영역은 응용 서비스가 요구하는 현식으로 사용자 요청을 변환 @Pos..

Chapter 5 스프링 데이터 JPA를 이용한 조회 기능

도메인 주도 개발 시작하기 5장을 요약한 내용입니다. 5.1 시작에 앞서 CQRS는 명령 모델과 조화 모델을 분리하는 패턴 명령 모델은 상태를 변경하는 기능을 구현할 때 사용 회원가입, 암호변경, 주문취소 등 조회 모델은 데이터를 조회하는 기능을 구현할 때 사용 주문목록, 주문 상세 등 엔티티, 애그리거트, 리포지터리 등은 주로 상태를 변경할 때 사용이 된다 도메인 모델은 명령 모델로 주로 사용됨 정렬, 페이징, 검색 조건 같은 기능은 조회 기능에 사용됨 5.2 검색을 위한 스펙 검색 조건이 고정되어 있고 단순하면 특정 조건으로 조회하는 기능을 만들면 된다. public interface OrderDataDao { Optional findById(OrderNo id); List findByOrderer(..

Chapter 4 리포지터리와 모델 구현

도메인 주도 개발 시작하기 4장을 요약한 내용입니다. 4.1 JPA를 이용한 리포지터리 구현 객체 기반의 도메인 모델과 관계형 데이터 모델 간의 매핑을 처리하는 기술로 ORM만한 것이 없다. 자바의 ORM 표준인 JPA를 이용해 리포지터리와 애그리거트를 구현하는 방법에 대해 살펴본다. 4.1.1 모듈 위치 리포지터리 인터페이스는 애그리거트와 같이 도메인 영역에 속하고, 리포티저티를 구현한 글래스는 인프라스트럭처 영역에 속한다. 리포지터리 구현 클래스를 인프라스트럭처 영역에 위치시켜서 인프라스트럭처에 대한 의존을 낮추는 것이 좋음 4.1.2 리포지터리 기본 기능 구현 리포지터리가 제공하는 기본 기능 ID로 애그리거트 조회 애그리거트 저장 public interface OrderRepository { Ord..

Chapter 2 아키텍처 개요

도메인 주도 개발 시작하기 2장을 요약한 내용입니다. 2.1 네 개의 영역 “표현”, “응용”, “도메인”, “인프라스트럭처”는 아키텍처를 설계할 때 출현하는 전형적인 네 가지 영역 표현 영역 사용자의 요청을 받아 응용 영역에 전달, 응용 영역의 처리 결과를 사용자에게 전달 스프링 MVC 프레임워크가 표현 영역의 기술 응용 영역 표현 영역을 통해 사용자의 요청을 전달받은 응용 영역은 시스템이 사용자에게 제공해야할 기능을 구현 “주문 등록”, “주문 취소”, “상품 상세 조회” 등의 기능을 예로 들수 있다. 기능을 구현하기 위한 도메인 영역의 도메인 모델을 사용 “주문 취소” 기능을 제공하는 응용 서비스를 도메인 모델을 사용해서 기능 구현이 가능 public class CancelOrderService {..

Chapter 1 도메인 모델 시작하기

도메인 주도 개발 시작하기 1장을 요약한 내용입니다. 1.1 도메인이란? 온라인 서점을 구현할 소프트웨어라고 봤을때 도메인이란? 상품 조회, 구매, 결제, 배송 추적 등 온라인 서점 도메인은 몇개의 하위 도메인으로 나눌 수 있다. 카탈로그 하위 도메인은 고객에게 구매할 수 있는 상품 목록을 제공하고, 주문 하위 도메인은 고객의 주문을 처리 혜택의 하위 도메인은 쿠폰이나 특별 할인과 같은 서비스 제공 하위 도메인은 다른 하위 도메인과 연동하여 완전한 기능을 제공 한다. 고객이 물건을 구매하면 주문, 결제, 배송, 혜택 하위 도메인의 기능이 엮이게 된다. 특정 도메인을 위한 소프트웨어라고 해서 도메인이 제공해야 할 모든 기능을 직접 구현하는 것은 아님 배송 도메인의 일부 기능은 자체 시스템으로 구현하고 나머..