독서/도메인 주도 개발 시작하기9 10~11장 이벤트, CQRS ( 完 ) 10.1 시스템 간 강결합 문제쇼핑몰에서 구매를 취소하면 환불을 처리해야 한다. 이때 환불 기능을 실행하는 주체는 주문 도메인 엔티티가 될 수 있다. 보통 결제 시스템은 외부에 존재하므로 RefundService는 외부에 있는 결제 시스템이 제공하는 환불 서비스를 호출한다. 2가지 문제가 발생할 수 있다. 1) 외부 서비스가 정상이 아닌 경우 트랜잭션 처리를 어떻게 해야 할지 애매하다. 외부의 환불 서비스를 실행하는 과정에서 익셉션이 발생하면 환불에 실패했으므로 주문 취소 트랜잭션을 롤백하는 것이 맞아 보인다. 하지만 반드시 트랜잭션을 롤백 해야 하는 것은 아니다. 주문은 취소 상태로 변경하고 환불만 나중에 다시 시도하는 방식으로 처리할 수도 있다. 2) 두 번째 문제는 성능에 관한 것이다. 환불을 처리.. 2024. 12. 8. 9장 도메인 모델과 바운디드 컨텍스트 9.1 도메인 모델과 경계논리적으로 같은 존재처럼 보이지만 하위 도메인에 따라 다른 용어를 사용하는 경우도 있고, 한 개인 상품이 다른 곳에서는 여러 개 존재할 수 있다. 하위 도메인마다 같은 용어라도 의미가 다르고, 같은 대상이라도 지칭하는 용어가 다를 수 있기 때문에 한 개의 모델로 모든 하위 도메인을 표현하려는 시도는 올바른 방법이 아니며 표현할 수도 없다. 하위 도메인마다 사용하는 용어가 달라서 올바른 도메인 모델을 개발하려면 하위 도메인 모델을 만들어야 한다. 각 모델은 명시적으로 구분되는 경계를 가져서 섞이지 않도록 해야 한다. 모델은 특정한 컨텍스트(문맥) 하에서 완전한 의미를 갖는다. 같은 제품이라도 카탈로그 컨텍스트와 재고 컨텍스트에서 의미가 서로 다르다. 이렇게 구분되는 경계를 갖는 컨.. 2024. 12. 5. 8장 애그리거트 트랜잭션 관리 8.1 애그리거트와 트랜잭션DBMS가 지원하는 트랜잭션과 함께 애그리거트를 위한 추가적인 기법이 필요하다. 대표적인 트랜잭션 처리 방식에는 선점 잠금과 비선점 잠금 방식이 있는데 이를 살펴보자. 8.2 선점 잠금선점 잠금은 먼저 애그리거트를 구한 스레드가 애그리거트 사용이 끝날 때까지 다른 스레드가 해당 애그리거트를 수정하지 못하게 막는 방식이다. 스레드1이 애그리거트를 구한 뒤 이어서 스레드2가 같은 애그리거트를 구하고 있다. 스레드 2는 스레드1이 애그리거트에 대한 잠금을 해제할 때까지 블로킹된다. 한 스레드가 애그리거트를 구하고 수정하는 동안 다른 스레드가 수정할 수 없으므로 동시에 애그리거트를 수정할 때 발생하는 데이터 충돌 문제를 해소할 수 있다. 선점 잠금은 보통 DBMS가 제공하는 행단위 .. 2024. 12. 5. 6장 응용 서비스와 표현 영역 6.1 표현 영역과 응용 영역1장부터 5장까지 도메인의 구성 요소, JPA를 이용한 리포지터리 구현 방법을 알아봤다. 도메인 영역을 잘 만들어도, 도메인이 제 기능을 하려면 사용자 도메인을 연결해주는 매개체가 필요하다. 응용 영역과 표현 영역이 사용자와 도메인을 연결해주는 매개체 역할을 한다. 표현 영역은 사용자의 요청을 해석한다. 요청을 받은 표현 영역은 URL, 요청 파라미터, 쿠키, 헤더 등 이용해서 사용자가 실행하고 싶은 기능을 판별하고 그 기능을 제공하는 응용 서비스를 실행한다. 실제 사용자가 원하는 기능을 제공하는 것은 응용 영역에 위치한 서비스다. 응용 서비스의 메서드가 요구하는 파라미터와 표현 영역이 사용자로부터 전달받은 데이터는 형식이 일치하지 않기 때문에 표현 영역은 응용 서비스가 요구.. 2024. 12. 3. 5장 스프링 데이터 JPA를 이용한 조회 기능 5.1 시작에 앞서시작에 앞서 CQRS 알고가자. 명령(command) 모델과, 조회(query) 모델을 분리하는 패턴이다. 명령 모델은 상태를 변경하는 기능을 구현할 때 사용하고, 조회 모델은 데이터를 조회하는 기능을 구현할 때 사용한다. 엔티티, 애그리거트, 리포지터리 등 앞에서 살펴본 모델은 주문 취소, 배송지 변경과 같이 상태를 변경할 때 주로 사용된다. 즉 도메인 모델은 주문 취소, 배송지 변경과 같이 상태를 변경할 때 주로 사용된다. 명령 모델로 주로 사용된다. 반면에 이 장에서 설명할 정렬, 페이징, 검색 조건 지정과 같은 기능은 조회 기능에 사용된다. 즉 이 장에서 살펴볼 구현 방법은 조회 모델을 구현할 때 주로 사용한다. 5.2 검색을 위한 스펙목록 조회와 같은 기능은 다양한 검색 조건.. 2024. 12. 2. 4장 리포지터리와 모델 구현 4.1.1 모듈 위치리포지터리 인터페이스는 애그리거트와 같이 도메인 영역에 속하고, 리포지터리를 구현한 클래스는 인프라스트럭처 영역에 속한다. 가능하면 리포지터리 구현 클래스를 인프라스트럭처 영역에 위치시켜서 인프라스트럭처에 대한 의존을 낮춰야 한다. 4.1.2 리포지터리 기본 기능 구현리포지터리가 제공하는 기본 기능은 다음 두 가지다.1) ID로 애그리거트 조회하기2) 에그리거트 저장하기 인터페이스는 애그리거트 루트를 기준으로 작성한다. 루트 엔티티인 Order를 기준으로 리포지터리 인터페이스를 작성한다. 애그리거트를 조회하는 기능의 이름을 지을 때, 널리 사용되는 규칙은 'findBy프로퍼티이름(프로퍼티 값)' 형식을 사용하는 것이다. findById()는 ID에 해당하는 애그리거트가 존재하면 O.. 2024. 12. 1. 3장 애그리거트 3.1 애그리거트도메인 객체 모델이 복잡해지면 개별 구성요소 위주로 모델을 이해하게 되고 전반적인 구조나 큰 수준에서 도메인 간의 관계를 파악하기 어려워진다. 도메인 요소 간 관계를 파악하기 어렵다는 것은 코드를 변경하고 확장하는 것이 어려워진다는 것을 의미한다. 이를 해결할 수 있는 방법이 애그리거트이다. 일관성을 관리하는 기준이 될 수 있고, 모델을 이해하는 데 도움이 된다. 애그리거트는 관련된 모델을 하나로 모았기 때문에 한 애그리거트에 속한 객체는 유사하거나 동일한 라이프 사이클을 갖는다. 도메인 규칙에 따라 최초 주문 시점에 일부 객체를 만들 필요가 없는 경우도 있지만 애그리거트에 속한 구성요소는 대부분 함께 생성하고 함께 제거한다. 애그리거트는 경계를 갖는다. 한 애그리거트에 속한 객체는 다른.. 2024. 11. 29. 2장 아키텍처 개요 2.1 네 개의 영역'표현', '응용', '도메인', '인프라스트럭처'는 아키텍처를 설계할 때 출현하는 전형적인 네 가지 영역이다. 네 영역 중 표현 영역은 사용자의 요청을 받아 응용 영역에 전달하고 응용 영역의 처리 결과를 다시 사용자에게 보여주는 역할을 한다. 웹 애플리케이션을 개발할 때 많이 사용하는 스프링 MVC 프레임워크가 표현 영역을 위한 기술에 해당한다. 웹 애플리케이션에서 표현 영역의 사용자는 웹 브라우저를 사용하는 사람일 수 있고, REST API를 호출하는 외부 시스템일 수 있다. 표현 영역을 통해 사용자의 요청을 전달받는 응용 영역은 시스템이 사용자에게 제공해야 할 기능을 구현하는데 '주문 등록', '주문 취소', '상품 상세 조회' 같은 기능 구현을 예로 들 수 있다. 응용 영역은 .. 2024. 11. 28. 1장 도메인 모델 시작하기 1.1 도메인이란?개발자 입장에서 바라보면 온라인 서점은 구현해야 할 소프트웨어의 대상이 된다. 온라인 서점은 책을 판매하는 데 필요한 상품 조회, 구매, 결제, 배송 추적 등 기능을 제공해야 한다. 이때 온라인 서점은 소프트웨어로 해결하고자 하는 문제 영역, 즉 도메인에 해당한다. 예로 온라인 서점 도메인은 몇 개의 하위 도메인으로 나눌 수 있다. 하위 도메인을 어떻게 구성할지 여부는 상황에 따라 달라진다. 1.2 도메인 전문가와 개발자 간 지식 공유코딩에 앞서 요구사항을 올바르게 이해하는 것이 중요하다. 간단한 방법으로 개발자와 전문가가 직접 대화하는 것이다. 도메인 전문가만큼은 아니겠지만 이해관계자와 개발자도 도메인 지식을 갖춰야 한다. 전문가나 관련자가 요구한 내용이 항상 올바른 것은 아니며,.. 2024. 11. 27. 이전 1 다음