도메인 주도 설계(9)
-
CQRS
보통 데이터를 조회 시에 여러 에그리거트에서 데이터를 가져와야 한다. 여러 애그리거트의 데이터가 필요하면 다양한 방안의 구현 방법을 고민해야 하는데, 식별자를 이용해서 애그리거트를 참조하는 방식을 사용하면 즉시 로딩과 같은 JPA 쿼리 관련 최적화 기능을 사용할 수 없다. 직접 참조하는 방식을 사용한다 하더라도, 같은 연관도 즉시/지연 로딩 등 다양한 방법으로 처리애햐 하고, DBMS가 제공하는 전용 기능이 필요하면 네이티브 쿼리를 사용해야 할 수도 있다. ORM 기법은 도메인 상태 변경 기능을 구현하는 데는 적합하지만, 데이터를 가져와 출력하는 기능울 구현하기에는 고려할게 많아서 구현을 복잡하게 한다. 상태 변경을 위한 모델과 조회를 위한 모델을 분리하면 위 문제를 해결할 수 있다. # CQRS 시스템..
2023.09.21 -
도메인 서비스
구현을 하다보면 한 애그리거트에 넣기 애매한 도메인 기능이 있다. 그러한 기능들을 억지로 특정 에그리거트에 넣으면 안 된다. 자신의 책임 범위를 넘어서서 기능을 구현하면 코드가 길어지고 외부에 대한 의존이 높아지기 때문이다. 도메인 기능을 별도 서비스로 구현하면 이러한 문제를 해결할 수 있다. 도메인 서비스 도메인 서비스는 도메인 영역에 위치한 도메인 로직을 표현할 때 사용한다. 주로 다음과 같은 로직에서 사용한다. - 계산 로직 : 여러 에그리거트가 필요한 계산 로직, 한 애그리거트에 넣기 다소 복잡한 계산 로직 - 외부 시스템 연동일 필요한 로직 : 구현하기 위해서 타 시스템을 사용해야 하는 도메인 로직 한 애그리거트에 넣기 애매한 도메인 개념을 구현하려면 애그리거트에 억지로 넣기 보다는 도메인 서비..
2023.08.18 -
리포지터리와 모델 구현
매핑 구현 - 애그리거트와 JPA 매핑을 위한 기본 규칙 - 애그리거트 루트는 엔티티이므로 @Entitiy로 매핑 설정 - 벨류는 @Embeddedable로 매핑 설정 - 벨류 타입 프로퍼티는 @Embedded로 매핑 설정 - 타 애그리거트는 ID로 참조 AttributeConverter - int, long, String, LocalDate 같은 타입은 DB 테이블에 한 개의 컬럼에 매핑됨. - 이와 비슷하게 벨로타입의 프로퍼티를 한 개의 컬럼에 매핑해야할 때도 있음. - AttributeConverter을 통해 벨류 타입과 칼럼 데이터 간의 변환 처리 가능 - 벨류 컬렉션을 별도 테이블로 매핑시에는 @ElementCollection과 @CollectionTable을 함께 사용 - List에 자체 인덱..
2023.07.28 -
애그리거트
애그리거트 - 도메인 객체 모델이 복잡해지면 전반적인 구조나 큰 수준에서 도메인 간 관계를 파악하기 어려워짐. -> 코드 변경/확장 난이도 상승 - 애그리거트를 통해 복잡한 도메인을 이해하고 관리하기 쉬운 단위로 만들 수 있음. - 애그리거트를 통해 관련 객체를 하나의 군으로 묶을 수 있고, 상위 수준에서 도메인 모델 간 관계 파악 가능 - 애그리거트는 모델을 이해하는 데 도움을 줄 뿐 아니라 일관성 관리 기준도 됨. - 한 애그리거트에 속한 객체는 유사하거나 동일한 라이프 사이클 가짐 - 애그리거트는 경계를 가짐 -> 한 애그리거트에 속한 객체는 다른 애그리거트에 속하지 않음 - 애그리거트 경계를 설정할 때 기본이 되는 것은 도메인 규칙과 요구사항 - 도메인 규칙에 따라 함께 생성되는 구성 요소는 한 ..
2023.07.19 -
도메인 주도 개발 시작하기
네 개의 영역 표현 영역 사용자 요청을 받아 응용 영역에 전달, 응용 영역의 처리 결과를 다시 사용자에게 전달 응용 영역 시스템이 사용자에게 제공해야할 기능을 구현 응용 서비스는 로직을 직접 수행하기보다는 도메인 모델에 로직 수행을 위임 도메인 모델 도메인 핵심 로직을 구현 인프라스트럭처 영역 구현 기술에 대한 것을 다룸 DB 연동, 메시징 큐 송수신 계층 구조 아키텍처 계층 구조는 상위 계층에서 하위 계층으로 의존만 존재 하위 계층은 상위 계층에 의존하지 않음 구현의 편리함을 위해 계층 구조를 유연하게 적용하기도 함 인프라 스트럭처에 의존하면 test와 기능 확장에 어려움을 가짐 : DIP로 해결 DIP 상위 모듈은 하위 모듈에 의존해서는 안 됨. 변하지 않는 것에 의존 -> 추상화에 의존 -> 인터페..
2023.07.11 -
도메인 모델 시작하기
도메인이란? - 도메인 : SW로 해결하고자 하는 문제 영역 - 도메인은 여러 하위 도메인으로 구성됨. - 한 하위 도메인은 다른 하위 도메인과 연동하여 완전한 기능 제공 - 특정 도메인 위한 SW라고 해서 도메인이 제공해야 할 모든 기능을 직접 구현하지 않음. - 일부 기능은 자체 시스템으로 구현, 나머지 기능은 외부 시스템 사용 EX) 온라인 쇼핑몰은 외부 배송 업체의 시스템 사용. 필요한 기능만 일부 연동 도메인 전문가와 개발자 간 지식 공유 - 요구사항은 첫 단추와 같음. 코딩에 앞서 요구사항을 올바르게 이해하는 것이 중요. - 개발자와 전문가가 직접 대화하는게 베스트 - 이해관계자와 개발자도 도메인 지식을 갖춰야 - 잘못된 값이 들어가면 잘못된 결과가 나옴. 요구사항도 마찬가지 - 관련자가 요구..
2023.07.06