DDD 도메인주도설계

    도메인주도개발 시작하기 11장 CQRS

    CQRS란 Command and Query Responsibility Segregation 의 약자로, 데이터 저장소로부터의 읽기와 업데이트 작업을 분리하는 패턴을 말한다 여러 애그리거트의 데이터가 필요하면 다양한 방안의 구현방법을 고민해야한다. 식별자를 이용해서 애그리거트를 참조하는 방식을 사용하여 가져와한다. 상태 변경 기능은 주로 한 애그리거트의 상태를 변경한다. 반면, 조회 기능은 두 개 이상의 애그리거트가 필요할 때가 많다. 상태를 변경하는 범위와 조회하는 범위가 일치하지 않기 때문에 단일 모델로 두 종류의 기능을 구현하면 모델이 불필요하게 복잡해진다. 위 복잡도를 해결하기 위해 사용하는 방법이 CQRS이다. CQRS : 명령(Command)을 위한 모델과 조회(Query)를 위한 모델을 분리하..

    도메인주도개발 시작하기 10장 이벤트

    ## 시스템 간 강결합 문제 쇼핑몰에서 구매를 취소하면 환불처리를 해야한다. 이때 보통 결제 시스템은 외부에 있으므로 Order 도메인에서 구매 취소에 관련된 서비스를 다음과 같이 파라미터로 주입할 것이다. 위처럼 외부 시스템을 도메인에서 호출 시 3가지 문제가 발생할 수 있다. 1. 외부 서비스가 비정상일 경우 트랜젝션 처리를 어떻게 할까? - 롤백을 해야할까? 일단 커밋을 해야할까?, 아니면 상태만 변경한 후에 나중에 다시 시도를 해야할까? 2. 외부 시스템의 응답 시간이 길어지면 어떻게 할까? - 대기 시간만큼 응답시간이 길어져서 성능에 악영향을 주지 않을까? 3. 도메인 객체에 서비스를 전달하면 설계상 문제가 발생하지 않을까? - 도메인 로직과 외부 로직이 뒤섞이지 않을까? 바운디드 컨텍스트 간 ..

    도메인주도개발 시작하기 9장 바운디드컨텍스트

    # 바운디드 컨텍스트 간 통합 - 인프라 영역에서 외부 시스템과의 연동을 처리 - RecSystemClient에서 도메인 모델 변환하는 작업을 처리 - 두 모델 간 변환 과정이 복잡하면 변환 처리를 위한 별도 클래스 생성 가능 - Rest API를 통해 두 바운디드 컨텍스트를 직접 통합할 수 있고, 메시지큐를 사용하여 간접적으로 통합할 수도 있음 - 비동기적으로 처리 가능 - 단, 두 바운디드 컨텍스트가 사용할 메시지의 데이터 구조를 맞춰야 - 변경 내용을 여러 컨텍스트에 pub-sub 가능 그럼 여기서 , microservice간 restapi 와 message queue로 처리하는 방식의 차이는 뭘까 REST API 통신: 장점: - 간단하고 직관적인 통신 방식으로, HTTP 프로토콜을 사용하여 통신..

    도메인주도개발 시작하기 8장 애그리거트 트랜잭션관리

    8.1 애그리거트와 트랜잭션 한 주문 애그리거트에 대해 운영자는 배송 준비 상태로 변경할 때 사용자는 배송지 주소를 변경한다면 어떻게 될까 스레드는 각각 트랜잭션을 커밋할 때 수정한 내용을 DBMS에 반영함. 때문에 하나의 애그리거트를 여러 사용자가 동시에 변경하고자한다면 데이터의 일관성이 깨질 수 있음 이런 문제를 방지하기 위해서는 아래와 같은 방법을 사용해야 함 운영자가 배송지 정보를 조회하고 상태를 변경하는 동안 고객이 애그리거트를 수정하지 못하게 막는다. (Pessimistic) 운영자가 배송지 정보를 조회한 이후에 고객이 정보를 변경하면 운영자가 에그리거트를 다시 조회한 뒤 수정하도록 한다. (Optimistic) 낙관적락 : 충돌이 발생하지 않을거야 라고 낙관적으로 생각함 (비선점) -> 버전..