CQRS 단일 모델의 단점 식별자를 이용해서 애그리 거트를 참조한다면 jpa쿼리 최적화 사용할 수 없음 변경 조회때 단일 모델을 사용하면 고려할게 많아짐 상태 변경과 조회를 위함 모델을 분리 CQRS란? Command Query Responsivility Segregation의 약자임 복잡한 도메인에 적합함 장점 명령모델을 구현할때 도메인 자체에 집중할 수 있음 도메인 로직을 구현하는데 집중할 수 있음 조회 성능 향상 단점 구현해야 할 코드가 더 많음 더 많은 구현 기술이 필요함 결론 잘 고민하고 복잡도를 생각해서 적용할 것
이벤트 시스템간 강결합 문제 트렌젝션 처리 애매함 성능이 외부 서비스에 직접적인 영향 A와 B가 강하게 결합되에 있어 서로 영향을 받음. 해결법 이벤트 비동기 이벤트 개요 이벤트란? 이벤트 : 과거에 벌어진 어떤 것 구성요소 이벤트 생성 주체, 디스패처, 핸들러 핸들러는 이벤트에 반응해서 원하는 기능을 실행 용도 트리거 도메인의 상태가 바뀔때 후처리가 필요하면 실행하기 위한 트리거 데이터 동기화 외부 서비스의 정보를 동기화 이벤트,핸들러,디스패처 구현 이벤트 클래스 이름을 과거시제로 사용 최소한의 데이터를 포함 디스패처 (퍼블리셔) 스피링이 제공하는 ApplicationEventPublisher사용 이벤트 핸들러 @EventListener를 사용해서 구현 동기 이벤트 처리문제 강결합 문제는 해소 but ..
도메인 모델과 바운디드 컨텍스트 도메인 모델과 경계 한개의 모델로 도은 하위 도메인을 표현 하려는 시도는 X 하위 도메인 마다 모델을 만들어야함 도멜은 특적한 컨텍스트 하에서 완전한 의미 이렇게 구분되는 겨예를 갖는 컨텍스트를 DDD에서 바운디드 컨텍스트라고 부른다 바운디드 컨텍스트 바운디드 컨텍스트는 모델의 경계를 결정 용어를 기준으로 구분 하나의 바운디드 컨텍스트는 논리적으로 하나의 모델을 갖는다 여러 바운디드 컨텍스트에서 여러 하위 도메인을 개발할때 구분되는 패키지를 갖도록 구현 바운디드 컨텍스트 구현 바운디드 컨텍스트는 표현,서비스,도메인,인프라스트럭쳐,DB까지 모두 포함된다 꼭 도메인 주도로 개발할 칠요 없음 간단한 것은 CRUD로 구현해도 됨 두가지를 같이 쓰기도함
애그리거트 트랜젝션 관리 애그리거트와 트랜잭션 이런 상황이 있을때 트랜잭션의 일관성이 깨지게 된다. 이런 상황을 막기위함 추가적인 트랜잭션 처리 기법이 필요함 선점 잠금과 비선점 잠금의 두가지 방식이 있음 선점잠금 먼저 애그리거트를 구한 스레드의 사용이 끝날때 까지 다른 스레드가 수정하지 못하게 막는 방식이다 교착상태가 발생하지 않도록 주의해야한다 최대 대기 시간을 지정해서 문제를 해결할 수 있다. 비선점 잠금 변경한 데이터를 반영하는 시점에 변경 가능 여부를 확인하는거 버전으로 사용할 프로처티 값이 필요 그리고 버전값이 값을때만 데이터를 수정 @Version으로 JPA에서 이용가능함 오프라인 선점 잠금 다른 사용자가 사용중일때 수정페이지를 보여주지 않음 이것도 교착상태처럼 사용자가 중간에 나갈 수도 있..
도메인 서비스 여러 애그리거트가 필요한 기능 보통 한 애그리거트로 기능을 구현 할 수 없을 때가 많음 이때 도메인 기능을 별도 서비스로 구현하면 됨 도메인 서비스 도메인 영역에 위치한 도메인 로직을 표현할 때 사용한다 계산 로직(다른 애그리거트가 필요한, 너무 복잡한) 외부 시스템 연동이 필요한 로직 계산 로직과 도메인 서비스 도메인 서비스는 상태 없이 로직만 구현 상태는 다름 방법으로 전달 받음 애그리거트 객체에 도메인 서비스를 전달하는 것은 응용 서비스 책임임 외부 시스템 연동과 도메인 서비스 시스템간 연동은 api호출로 이루어 질 수 있지만 설문 조사 도메인에서는 권한 확인하는 도메인 로직으로 볼수 있음. 도메인 로직관점에서 인터페이스를 작성 구현체는 인프라 영역에 위치해서 구현하고 응용서비스가 사..
응용서비스와 표현영역 표현영역과 응용영역 사용자의 요청을 해석(Controller)역할 실질적 기능은 응용 영역의 서비스가 함 사용자와의 상호작용은 표현이 하기 때문에 응용 서비스는 의존하지 않음 응용서비스의 역할 사용자가 요청한 기능을 실행함 리포지터리에서 도메인 객체를 가져와 사용 주요 역할은 도메인 객체를 사용해서 요청을 처리 응용서비스에서 도메인 로직의 일부를 구현 -> 서비스가 복잡 고로 도메인 로직을 넣지 않아야함 트랜젝션 처리도 담당함 응용서버스의 구현 표현과 도메인 영역을 연결하는 매개체 역할 like Facade패턴 서비스를 한 클래스에 담을수도 여러 클래스에 나누어 담을 수도 있음 공통된 로직을 별도클래스에 나누고 구분되는 기능을 별도의 서비스 클래스로 구현 하는 것이 좋다 과연 인터페..
JPA를 이용한 조회기능 CQRS command 모델과 Query모델을 분리하는 페턴 command는 상태를 변경하는 기능 ex)도메인 모델 Query는 조회기능 검색을 위한 스펙 스펙 검색조건을 조합할수록 저의할 find메서드도 함께 증가하기 때문 다양하기 조합해야할때 스펙을 사용할 수 있음 인터페이스로 구현하고 boolean isSatisfiedBy(T agg) 형태 레포지토리에 사용하면 agg는 애그리거트 루트 DAO에 사용하면 agg는 DAO가 된다 JPA이용한 스펙 - T는 는 JPA엔티티 타입 - ```java public class OrdererIdSpec implements Specification { private String ordererId; public OrdererIdSpec(St..
리포지터리와 모델구현 JPA 모듈 위치 리포지터리 서비스는 도메인에 속하고 구현한 클래스는 인프라스트럭처 영역에 속함 리포지터리 인터페이스는 애그리거트 루트를 기준으로 작성함 기본기능 구현하기 id로 조회하기 저장하기 findBy프로퍼티의이름 형태로 사용 트랜젝션 메서드 실행이 끝나면 db에 반여하기 위해서 update쿼리를 실행함 리포지터리 구현 org.springframwork.data.repository.Repository인터페이스 상속 T -> 엔티티 타입 , ID 식별자 타입 규칙에따라서 메서드를 작성 save, findById, findBy프로퍼티의이름, delete, deleteById 매핑구현 루트는 @Entity로 매핑설정 Value는 Embeddable로 매핑설정 - Value 타입 프..