본문 바로가기

728x90
반응형

책리뷰/도메인 주도 개발 시작하기(DDD핵심 개념 정리부터 구현까지)

(11)
도메인 주도 개발(DDD)시작하기 CQRS 목차 단일 모델의 단점 주문 내역 조회 기능 구현시 여러 애그리거트에서 데이터를 가져와야함 시스템 상태를 변경할 때와 조회할 때 단일 도메인 모델을 사용하면 고민해야할 부분이 생김 조회화면 특성상 즉시로딩이나 지연로딩으로 처리해야함 CQRS Command Query Responsibility Segregation 복잡한 도메인에 적합 CQRS를 사용하면 각 모델에 맞는 구현 기술 선택 가능 ex) 명령 모델 > 도메인 모델(JPA), 조회모델 > DB테이블에서 SQL 쿼리(마이바티스) 조회모델은 응용서비스가 존재하지 않음 컨트롤러에서 바로 DAO를 실행해도 무방함 명령모델은 트랜잭션을 지원하는 RDBMS, 조회모델은 성능이 좋은 메모리기반 NoSQL사용도 가능 서로 다른 데이터 저장소 사용시 데이터 동기..
도메인 주도 개발(DDD) 시작하기 이벤트 목차 시스템간 강결합 문제 쇼핑몰에서 구매 취소시 환불처리가 필요함 환불기능을 실행하는 주체는 주문 도메인 엔티티가 될 수 있음 보통 결제 시스템은 외부에 존재하기 때문에 외부 서비스가 아닐 경우 트랜잭션 처리가 애매함 주문은 취소상태로 변경 후 환불만 나중에 시도하는 방시긍로 처리할 수 있음 외부 시스템 응답 시간이 길어지면 대기 시간이 길어지기 때문에 성능에 대한 이슈도 있음 위와같이 도메인 객체에 서비스를 전달하면 Order도메인인데 결제 도메인의 환불 로직이 섞이게 됨 환불 기능이 바뀌면 Order도 영향을 받을 수 있음 주문 취소후 환불과 함께 취소 통지를 해야한다면 외부 서비스가 두 개로 증가하고 트랜잭션 처리가 더 복잡해짐 ☝️ 강한 결합을 없앨 수 있는 방법은 이벤트를 사용하는 것이다. 비..
도메인 주도 개발(DDD) 도메인 모델과 바운디드 컨텍스트 목차 도메인 모델과 경계 처음부터 도메인을 완벽하게 표현하는 단일 모델을 만들기는 어렵다 도메인은 여러 하위도메인으로 구분되기 때문에 한 개의 모델로 여러 하위 도메인을 표현하기 어려움 시스템을 사용하는 사람을 회원 도메인에서는 회원, 주문 도메인에서는 주문자, 배송도메인에서는 보내는 사람이라고 부른다. 각 모델은 명시적으로 구분되는 경계를 이용해 섞이지 않도록 해야함 하위 도메인 모델이 섞이면 모델의 의미가 약해지고 각 도메인 별로 다른 요구사항을 반영하기 어려움 바운디드 컨텍스트 모델은 특정 컨텍스트하에서 완전한 의미를 갖는데, 같은 제품이라도 카탈로그 컨텍스트와 재고 컨텍스트에서 의미가 서로 다르다. 이렇게 구분되는 경계를 갖는 컨텍스트를 바운디드 컨텍스트라고 함 모델의 경계를 결정, 한 개의 바운..
도메인 주도 개발(DDD) 애그리거트 트랜잭션 관리 목차 애그리거트와 트랜잭션 한 주문 애그리거트에 대해 운영자는 배송상태로 변경하고 사용자는 배송지 주소를 변경하면? 트랜잭션마다 리포지터리는 새로운 애그리거트 객체를 생성하므로 운영자 스레드와 고객스레드는 같은 주문 애그리거트를 나타내는 다른 객체를 구하게됨 개념적으로 동일한 애그리거트지만 물리적으로 다른 애그리거트 객체를 사용 애그리거트의 일관성이 깨짐 운영자가 배송지 정보 조회 후 상태 변경하는 동안 고객이 수정하지 못하게 해야함 운영자가 정보조회 이후 고객이 변경하면 운영자가 다시 조회한 후 수정 위 두 가지 방법은 트랜잭션 처리 기법이 필요함 선점 잠금 먼저 애그리거트를 구한 스레드가 사용이 끝날때까지 다른 스레드가 해당 애그리거트 수정을 못하게 막음 스레드2는 스레드1이 잠금해제할 때까지 블로킹..
도메인 주도 개발(DDD) 도메인 서비스 목차 도메인 서비스 도메인 서비스를 사용하는 상황 계산 로직 : 여러 애그리거트가 필요한 계산 로직이나, 한 애그리거트에 넣기에는 다소 복잡한 계산 로직 외부 연동 시스템이 필요한 도메인 로직 : 구현하기 위해 타 시스템을 사용해야 하는 도메인 로직 계산 로직과 도메인 서비스 할인 규칙 같이 한 애그리거트에 넣기 애매한 도메인 개념 구현시 도메인 서비스를 이용해 도메인 개념을 명시적으로 드러내면 됨 도메인영역의 애그리거트, 밸류와 같은 구성요소 vs 도메인 서비스 도메인 서비스는 상태없이 로직만 구현 도메인 서비스에 필요한 상태는 다른 방법으로 전달받음 public class DiscountCalculationService { public Money calcutationDiscountAmounts(Lis..
도메인 주도 개발 (DDD) 시작하기 응용서비스와 표현영역 목차 public class Member { public void changePassword(String oldPw, String newPw) { if(!matchPassword(oldPw)) throw new BaddPasswordException(); setPassword(newPw); } // 현재 암호와 일치하는지 검사하는 도메인 로직 public boolean matchPassword(String pwd) { return passwordEncoder.matches(pwd); } private void setPassword(String newPw) { if(isEmpty(newPw)) throw new IllegalArgumentException("no new password"); } } 표현영역..
도메인 주도 설계(DDD) 스프링데이터 JPA를 이용한 조회 목차 CQRS 란 명령(Command)모델과 조회(Query) 모델을 분리하는 패턴. 명령 모델은 상태 변경 기능 구현시 사용, 조회 모델은 데이터 조회기능 구현시 사용. ex) 명령모델 : 회원가입, 암호 변경, 주문 취소 > 상태를 변경 조회모델 : 주문 목록, 주문상세 > 데이터 보여주는 기능 도메인 모델은 명령모델로 주로 사용됨. 검색을 이용한 스펙 검색 조건이 고정되어 있고 단순하면 조회 기능을 만들면 된다. public interface OrderDataDao{ Optional findById(OrderNo id); List findByOrderer(String ordererId, Date fromDate, Date toDate); ... } 다양한 검색조건을 조합해야할 때가 있음 필요한 조합..
도메인 주도 개발(DDD) 리포지터리와 모델 구현 목차 JPA를 이용한 리포지터리 구현 - 도메인 모델과 리포지터리를 구현할 때 선호하는 기술은 JPA이다. - 데이터 보관소로 RDBMS를 사용할 때, 객체 기반 도메인 모델과 관계 데이터 모델간의 매핑 처리 기술로 ORM만한 것이 없음 모듈위치 리포지터리 인터페이스는 애그리거트와 같이 도메인 영역에 속함 리포지터리 구현 클래스는 인프라스트럭처 영역 팀 표준에 따라 다르지만 리포지터리 구현 클래스틑 인프라스트럭처에 둬서 의존을 낮춰야 함 리포지터리 기본 기능 구현 리포지터리가 제공하는 기본 기능 ID로 애그리거트 조회하기 애그리거트 저장하기 public interface OrderRepository { Order findById(OrderNo no); void save(Order order); } ex)..

728x90
반응형