본문 바로가기

728x90
반응형

책리뷰

(40)
도메인 주도 개발(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)..
도메인 주도 설계(DDD) 애그리거트 목차 애그리거트 복잡한 도메인을 이해하고 관리하기 쉬운 단위로 만들려면 상위 수준에서 모델을 조망할 수 있는 방법이 필요한데, 그 방법이 바로 애그리거트다. 애그리거트 장점 모델을 이해하는데 도움을 준다. 일관성을 관리하는 기준이 된다. 복잡한 도메인을 단순한 구조로 만들어준다. 복잡도가 낮아져서 도메인 기능을 확장하고 변경하는데 필요한 노력이 줄어든다. 애그리거트 특징 애그리거트에 속한 객체는 유사하거나 동일한 라이프 사이클을 갖는다. 한 애그리거트에 속한 객체는 다른 애그리거트에 속하지 않는다. 독립된 객체군이며 각 애그리거트는 자기자신을 관리할 뿐 다른 애그리거트는 관리하지 않는다. 경계설정시 기본은 도메인 규칙과 요구사항이다. 애그리거트루트 도메인규칙을 지키려면 애그리거트에 속한 모든 객체가 정상..
도메인 주도 설계 아키텍처 아키텍처 전형적인 네 가지 영역 표현 응용 도메인 인프라스트럭처 표현 영역 사용자의 요청을 받아 응용 영역에 전달하고, 응용영역의 처리 결과를 다시 사용자에게 보여주는 역할. 웹브라우저가 HTTP 요청 파라미터로 전송한 데이터를 응용서비스가 요구하는 형식의 객체 타입으로 변환해서 전달, 응용서비스가 리턴한 결과를 JSON형식으로 변환해서 HTTP응답으로 웹브라우저에 전송 응용 영역 시스템이 사용자에게 제공해야할 기능 구현. 도메인영역의 도메인 모델을 사용. 로직을 직접 수행하기보다 도메인 모델에 로직 수행을 위임함. ex) 주문등록, 주문취소, 상품상세조회 도메인영역 도메인모델 구현. ex) 주문 도메인 '배송지 변경', '결제완료' 등 핵심 로직을 구현 인프라스트럭처영역 구현기술에 대한 것. RDBMS..
도메인(DDD)주도 개발 도메인이란 도메인이란? 소프트웨어로 해결하고자 하는 문제 영역 일반적인 요구사항 ex, 온라인 서점 특정 도메인을 위한 소프트웨어라고 해서 모든 기능을 직접 구현하는 것은 아님(배송시스템, 결제시스템 등) 도메인 모델 도메인 자체를 이해하기 위한 개념 모델 여러 관계자들이 동일한 모습으로 도메인을 이해하고 도메인 지식을 공유하는 데 도움이 됨 도메인 계층 도메인의 핵심 규칙을 구현 ex) 주문 도메인 > 출고 전에 배송지 변경할 수 있다, 주문 취소는 배송 전에만 가능하다 라는 규칙이 도메인 계층에 위치 개념모델 : 순수하게 문제를 분석한 결과물로 데이터베이스, 트랜잭션처리, 성능, 구현 기술과 같은 것을 고려X 처음부터 완벽한 개념모델을 만들기보다는 구현하는 과정에서 구현 모델로 점진적으로 발전 시켜야 함 엔티티..

728x90
반응형