DDD

    [DDD Start] 이벤트

    [DDD Start] 이벤트

    도메인 주도 개발 시작하기 책 정리 도메인 주도 개발 시작하기 실제 업무에 도메인 주도 설계(DDD)를 적용할 수 있도록 기본적인 DDD의 핵심 개념을 익히고 구현을 통해 학습할 수 있도록 구성한 DDD 입문서 www.hanbit.co.kr 시스템 간 강결합 문제 ✅ 도메인 로직에서 외부 서비스 의존 ex) 쇼핑몰에서 구매를 취소하면 환불을 처리해야 한다. -> 이 때, 환불 기능을 실행하는 주체가 주문 도메인 엔티티일 수 있다. public class Order { // 외부 서비스를 실행하기 위해 도메인 서비스를 파라미터로 전달받음 public void cancel(RefundService refundService) { verifyNotYetShipped(); this .state = OrderSta..

    [DDD Start] 도메인 모델과 바운디드 컨텍스트

    [DDD Start] 도메인 모델과 바운디드 컨텍스트

    도메인 주도 개발 시작하기 책 정리 도메인 주도 개발 시작하기 실제 업무에 도메인 주도 설계(DDD)를 적용할 수 있도록 기본적인 DDD의 핵심 개념을 익히고 구현을 통해 학습할 수 있도록 구성한 DDD 입문서 www.hanbit.co.kr 도메인 모델과 경계 ✅ 모델은 도메인마다 의미가 다를 수 있다 도메인을 완벽하게 표현하는 단일 모델은 구현하기 어렵다. ex) 상품 모델 카탈로그 도메인, 재고 관리 도메인, 주문 도메인에서 상품 모델이 의미하는 것은 다르다. -> 도메인마다 다른 용어를 사용하는 경우도 있다. (카탈로그 도메인 - 상품, 검색 도메인 - 문서) 이처럼 한 개의 모델로 모든 하위 도메인을 표현할 수 없다. -> 하위 도메인마다 모델을 만들어야 한다. -> 그리고 각 모델은 명시적으로 ..

    [DDD Start] 애그리거트 트랜잭션 관리

    도메인 주도 개발 시작하기 책 정리 도메인 주도 개발 시작하기 실제 업무에 도메인 주도 설계(DDD)를 적용할 수 있도록 기본적인 DDD의 핵심 개념을 익히고 구현을 통해 학습할 수 있도록 구성한 DDD 입문서 www.hanbit.co.kr 애그리거트와 트랜잭션 ✅ 동시에 한 애그리거트 수정 ex) 하나의 주문 애그리거트에 대해 운영자는 배송 상태로 변경하는 동시에, 고객은 배송지 주소를 변경하면? 고객은 배송 상태인 주문 애그리거트의 배송지 주소를 변경할 수 없기 때문에, 일관성이 깨지는 문제가 발생하지 않도록 하려면 다음 두 가지 중 하나를 해야 한다. 운영자가 배송지 정보를 조회하고 상태를 변경하는 동안, 고객이 애그리거트를 수정하지 못하게 막는다. (선점 잠금) 운영자가 배송지 정보를 조회한 이후..

    [DDD Start] 도메인 서비스

    도메인 주도 개발 시작하기 책 정리 도메인 주도 개발 시작하기 실제 업무에 도메인 주도 설계(DDD)를 적용할 수 있도록 기본적인 DDD의 핵심 개념을 익히고 구현을 통해 학습할 수 있도록 구성한 DDD 입문서 www.hanbit.co.kr 여러 애그리거트가 필요한 기능 ✅ 어떤 애그리거트에 로직을 추가해야 할까? 도메인 영역의 코드를 작성하다 보면, 한 애그리거트로 기능을 구현할 수 없을 때가 있다. ex) 결제 금액 계산 로직에 필요한 애그리거트 상품 애그리거트: 상품의 가격 주문 애그리거트: 상품 별 구매 개수 할인 쿠폰 애그리거트: 쿠폰별로 지정한 할인 금액 회원 애그리거트: 회원 등급에 따른 추가 할인 -> 이런 경우 억지로 특정 애그리거트에 구현하게 되면 애그리거트를 복잡하게 만든다. 도메인 ..

    [DDD Start] 응용 서비스와 표현 영역

    도메인 주도 개발 시작하기 책 정리 도메인 주도 개발 시작하기 실제 업무에 도메인 주도 설계(DDD)를 적용할 수 있도록 기본적인 DDD의 핵심 개념을 익히고 구현을 통해 학습할 수 있도록 구성한 DDD 입문서 www.hanbit.co.kr 표현 영역과 응용 영역 ✅ 표현 영역 표현 영역은 사용자의 요청을 해석한다. 그리고 응용 서비스를 실행한다. ✅ 응용 영역 실제 사용자가 원하는 기능을 제공한다. ✅ 표현 -> 응용 응용 서비스의 메서드가 요구하는 파라미터와 표현 영역이 사용자로부터 전달받은 데이터는 형식이 일치하지 않기 때문에, 표현 영역은 응용 서비스가 요구하는 형식으로 사용자 요청을 변환한다. @PostMapping("/member/join") public ModelAndView join(Htt..

    [DDD Start] 스프링 데이터 JPA를 이용한 조회 기능

    도메인 주도 개발 시작하기 책 정리 도메인 주도 개발 시작하기 실제 업무에 도메인 주도 설계(DDD)를 적용할 수 있도록 기본적인 DDD의 핵심 개념을 익히고 구현을 통해 학습할 수 있도록 구성한 DDD 입문서 www.hanbit.co.kr 시작에 앞서 ✅ CQRS 명령 모델과 조회 모델을 분리하는 패턴이다. -> 도메인 모델은 명령 모델로 주로 사용된다. 이 장에서 설명할 정렬, 페이징, 검색 조건 지정과 같은 기능은 주로 조회 기능에 사용된다. -> 즉, 이 장에서 살펴볼 구현 방법은 조회 모델을 구현할 때 주로 사용한다. 검색을 위한 스펙 ✅ 검색 조건이 복잡할 때 목록 조회와 같은 기능은 다양한 검색 조건을 조합해야 할 때가 있다. -> 이럴 때 사용할 수 있는 것이 스펙(Specification..

    [DDD Start] 리포지터리와 모델 구현

    도메인 주도 개발 시작하기 책 정리 도메인 주도 개발 시작하기 실제 업무에 도메인 주도 설계(DDD)를 적용할 수 있도록 기본적인 DDD의 핵심 개념을 익히고 구현을 통해 학습할 수 있도록 구성한 DDD 입문서 www.hanbit.co.kr JPA를 이용한 리포지터리 구현 모듈 위치 ✅ 리포지터리 위치 리포지터리 인터페이스는 애그리거트와 같이 도메인 영역에 속하고, 리포지터리를 구현한 클래스는 인프라스트럭처 영역에 속한다. 리포지터리 기본 기능 구현 ✅ 기본 기능 ID로 애그리거트 조회하기 애그리거트 저장하기 public interface OrderRepository { Order findById(OrderNo id); void save(Order order); } @Repository public cl..

    [DDD Start] 애그리거트

    도메인 주도 개발 시작하기 책 정리 도메인 주도 개발 시작하기 실제 업무에 도메인 주도 설계(DDD)를 적용할 수 있도록 기본적인 DDD의 핵심 개념을 익히고 구현을 통해 학습할 수 있도록 구성한 DDD 입문서 www.hanbit.co.kr 애그리거트 ✅ 애그리거트 복잡한 도메인을 이해하고 관리하기 쉬운 단위로 만들려면, 상위 수준에서 도메인 모델을 조망할 수 있는 방법이 필요한데, 이 방법이 바로 애그리거트다. -> 관련 객체를 하나의 군으로 묶어 준다. -> 단순한 구조: 도메인 기능을 확장하고 변경하는데 필요한 노력이 줄어든다. ✅ 어떻게 나눠야 할까? 1. 동일한 라이프 사이클 ex) 주문 애그리거트를 만드려면, Order, Orderer, ShippingInfo와 같은 객체를 함께 생성해야 한다..