Back-End/도메인 주도 개발 시작하기21 [DDD] 도메인 주도 개발 시작하기 Ch11 Chapter 11 CQRS11.1 단일 모델의 단점 ∘ 주문 내역 조회 기능을 구현하려면 여러 애그리거트에서 데이터를 가져와야 됨 ∘ 조회 기능을 구현할 때 식별자를 이용해서 애그리거트를 참조하면 즉시 로딩과 같은 JPA의 쿼리 관련 최적화 기능을 사용할 수 없음. 직접 참조하더라도 조회 화면 특성에 따라 같은 연관도 즉시 로딩이나 지연 로딩으로 처리해야 되므로 고민해야 됨. ∘ 이러한 문제는 시스템 상태를 변경할 때와 조회할 때 단일 도메인 모델을 사용하기 때문 ∘ 이런 상황에서 구현 복잡도를 낮추려면 상태 변경을 위한 모델과 조회를 위한 모델을 분리하면 됨 11.2 CQRS ∘ 시스템이 제공하는 기능 : 상태를 변경하는 기능, 사용자 입장에서 상태 정보를 조회하는 기능 ∘ 도메인 모델 관점에서 상태.. 2024. 4. 29. [DDD] 도메인 주도 개발 시작하기 Ch10 Chapter 10 이벤트10.1 시스템 간 강결합 문제∘ 외부 시스템의 서비스를 호출할 때의 문제 - 외부 서비스가 정상이 아닐 때 트랜잭션 처리가 애매함 - 트랜잭션을 롤백할지 말지 - 외부 서비스의 성능에 직접적인 영향을 받음 - 설계상 서로 다른 로직이 섞일 수 있음 ∘ 컨텍스트 간의 강결합이 있으면 결합된 컨텍스트끼리 영향을 주고받게 됨 ∘ 이벤트를 사용하면 강결합 제거 가능10.2 이벤트 개요∘ 이벤트 : 과거에 벌어진 어떤 것. 상태가 변경됐음을 의미. ∘ 이벤트가 발생하면 그에 따른 동작이 수행됨 10.2.1 이벤트 관련 구성요소∘ 이벤트 도입을 위해서는 이벤트, 이벤트 생성 주체, 이벤트 디스패처(퍼블리셔), 이벤트 핸들러(구독자)를 구현해야 됨 - 이벤트 생성 주체 : 엔티.. 2024. 4. 29. [DDD] 도메인 주도 개발 시작하기 Ch9 Chapter 9 도메인 모델과 바운디드 컨텍스트 9.1 도메인 모델과 경계 ∘ 한 개의 모델로 여러 하위 도메인을 모두 표현하려 하면 안 됨 ex. 재고 관리에서의 상품, 주문에서의 상품, 배송에서의 상품에서 상품은 다 다른 의미를 가짐 ∘ 하위 도메인마다 사용하는 용어가 다르기 때문에 올바른 도메인 모델을 개발하려면 하위 도메인마다 모델을 만들어야 함 ∘ Bounded Context : 모델이 완전한 의미를 갖는 경계가 있는 컨텍스트 9.2 바운디드 컨텍스트 ∘ 바운디드 컨텍스트는 모델의 경계를 결정함 ∘ 한 개의 바운디드 컨텍스트는 논리적으로 한 개의 모델을 가짐 ∘ 바운디드 컨텍스트는 실제로 사용자에게 기능을 제공하는 물리적 시스템 ∘ 여러 하위 도메인을 한 개의 바운디드 컨텍스트에서 개발할 때는.. 2024. 4. 8. [DDD] 도메인 주도 개발 시작하기 Ch8 Chapter 8 애그리거트 트랜잭션 관리 8.1 애그리거트와 트랜잭션 ∘ 운영자는 상품의 배송 상태를 바꾸고, 동시에 고객은 배송지 정보를 바꿈. 서로 다른 애그리거트 객체를 이용하지만 트랜잭션 커밋할 때 두 정보가 다 바뀜 → 애그리거트의 일관성이 깨짐 ∘ 애그리거트 트랜잭션 처리 방식에는 선점 잠금과 비선점 잠금이 있음 8.2 선점 잠금 ∘ 선점 잠금 : 먼저 애그리거트를 구한 스레드가 애그리거트 사용이 끝날 때까지 다른 스레드가 해당 애그리거트를 수정하지 못하게 블로킹 ∘ 먼저 애그리거트를 사용하던 스레드가 수행하고 트랜잭션을 커밋하면 잠금이 해제됨 ∘ 데이터 충돌 문제 해결 가능 ∘ 선점 잠금은 보통 DBMS가 제공하는 행단위 잠금을 사용해서 구현 ∘ JPA 프로바이더와 DBMS에 따라 잠금 모.. 2024. 4. 1. [DDD] 도메인 주도 개발 시작하기 Ch7 Chapter 7 도메인 서비스 7.1 여러 애그리거트가 필요한 기능 ∘ 여러 개의 애그리거트가 필요한 경우가 있음 ex. 결제 금액 계산 로직의 경우 상품, 주문, 할인 쿠폰, 회원 애그리거트가 필요함 ∘ 복잡하다고 기능과 관련 없는 구성 요소가 있는 애그리거트에 기능을 넣으면 안 됨 ∘ 애그리거트가 자신의 책임 범위를 넘어서는 기능을 구현하게 되면 외부에 대한 의존이 높아지고 코드 수정이 어려워짐 ∘ 애그리거트가 여러 개 있을 때 기능을 어디에 구현할지에 대한 문제가 생기면 도메인 기능을 별도 서비스로 구현하면 됨 7.2 도메인 서비스 ∘ 도메인 서비스는 도메인 영역에 위치한 도메인 로직을 표현할 때 사용 7.2.1 계산 로직과 도메인 서비스 ∘ 특정 애그리거트에 넣기 어려운 도메인 개념은 도메인 서.. 2024. 4. 1. [DDD] 도메인 주도 개발 시작하기 Ch6 6.1 표현 영역과 응용 영역 ∘ 표현 영역 : 사용자의 요청을 해석 ∘ 사용자가 실행하고 싶은 기능을 판별하고 해당 기능의 응용 서비스를 실행 ∘ 응용 영역 : 사용자가 실행하고 싶은 서비스가 위치한 영역 ∘ 사용자 → 표현 영역 → 응용 영역 ∘ 사용자의 요청 데이터를 바탕으로 응용 서비스가 원하는 형식의 객체를 생성하는 과정 필요 ∘ 사용자 ← 표현 영역 ← 응용 영역 ∘ 응용 서비스의 실행한 결과를 표현 영역에서 사용자에게 알맞은 형식으로 답해줌 ∘ 응용 서비스는 표현 영역에 의존하지 않음 6.2 응용 서비스의 역할 ∘ 응용서비스는 리포지터리에서 도메인 객체를 가져와서 사용자의 요청을 처리 public Result doSomeFunc(SomeReq req){ SomeAgg agg = someAgg.. 2024. 3. 25. [DDD] 도메인 주도 개발 시작하기 Ch5 Chapter 5 스프링 데이터 JPA를 이용한 조회 기능 5.1 시작에 앞서 ∘ CQRS : 명령 모델과 조회 모델을 분리하는 패턴 ∘ 명령 모델 : 상태를 변경하는 기능 구현 ∘ 조회 모델 : 데이터를 조회하는 기능 ∘ 앞 부분에서 봤던 도메인 모델은 명령 모델로 주로 사용됨 ∘ 정렬, 페이징, 검색 조건 지정과 같은 기능은 주문 목록, 상품 상세와 같은 조회 기능에 사용됨 5.2 검색을 위한 스펙 ∘ 검색 조건의 조합마다 find를 정의하는 것은 좋지 않음 ∘ 스펙 : 검색 조건을 다양하게 조합할 때 사용, 애그리거트가 특정 조건을 충족하는지를 검사할 때 사용하는 인터페이스 ∘ 스펙을 리포지터리에 사용하는지, DAO에 사용하는지에 따라 검사 대상이 되는 객체가 다름 ∘ isSatisfiedBy() .. 2024. 3. 25. [DDD] 도메인 주도 개발 시작하기 Ch4 Chapter 4 리포지터리와 모델 구현4.1 JPA를 이용한 리포지터리 구현∘ 자바의 ORM 표준인 JPA를 이용해서 리포지터리와 애그리거트를 구현하는 방법 4.1.1 모듈 위치 ∘ 리포지터리 인터페이스는 애그리거트와 같이 도메인 영역에 속함 ∘ 리포지터리를 구현한 클래스는 인프라스트럭처 영역에 속함 4.1.2 리포지터리 기본 기능 구현 ∘ 리포지터리가 제공하는 기본 기능 - ID로 애그리거트 조회하기 : findBy프로퍼티이름(프로퍼티 값) - 애그리거트 저장하기 : save() ∘ JPA는 트랙잭션 범위에서 변경한 데이터를 자동으로 DB에 반영 ∘ 애그리거트를 삭제하는 기능을 만들 수 있음 4.2 스프링 데이터 JPA를 이용한 리포지터리 구현∘ 스프링 데이터 JPA는 지정한 규칙에 맞게 리포지터리 .. 2024. 3. 18. 이전 1 2 3 다음