스터디/DDD 스터디(11)
-
CQRS
보통 데이터를 조회 시에 여러 에그리거트에서 데이터를 가져와야 한다. 여러 애그리거트의 데이터가 필요하면 다양한 방안의 구현 방법을 고민해야 하는데, 식별자를 이용해서 애그리거트를 참조하는 방식을 사용하면 즉시 로딩과 같은 JPA 쿼리 관련 최적화 기능을 사용할 수 없다. 직접 참조하는 방식을 사용한다 하더라도, 같은 연관도 즉시/지연 로딩 등 다양한 방법으로 처리애햐 하고, DBMS가 제공하는 전용 기능이 필요하면 네이티브 쿼리를 사용해야 할 수도 있다. ORM 기법은 도메인 상태 변경 기능을 구현하는 데는 적합하지만, 데이터를 가져와 출력하는 기능울 구현하기에는 고려할게 많아서 구현을 복잡하게 한다. 상태 변경을 위한 모델과 조회를 위한 모델을 분리하면 위 문제를 해결할 수 있다. # CQRS 시스템..
2023.09.21 -
이벤트
## 시스템 간 강결합 문제 쇼핑몰에서 구매를 취소하면 환불처리를 해야한다. 보통 결제 시스템은 외부에 있으므로 Order 도메인에서 구매 취소에 관련된 서비스를 다음과 같이 파라미터로 주입할 것이다 위처럼 외부 시스템을 도메인에서 호출 시 3가지 문제가 발생할 수 있다. 1. 외부 서비스가 비정상일 경우 트랜젝션 처리를 어떻게 할까? - 롤백을 해야할까? 일단 커밋을 해야할까?, 아니면 상태만 변경한 후에 나중에 다시 시도를 해야할까? 2. 외부 시스템의 응답 시간이 길어지면 어떻게 할까? - 대기 시간만큼 응답시간이 길어져서 성능에 악영향을 주지 않을까? 3. 도메인 객체에 서비스를 전달하면 설계상 문제가 발생하지 않을까? - 도메인 로직과 외부 로직이 뒤섞이지 않을까? 위 문제가 발생하는 이유는 바..
2023.09.09 -
도메인 모델과 바운디드 컨텍스트
# 도메인 모델과 경계 - 도메인 모델을 만들 때 처음부터 완벽하게 단일 모델을 만들 수는 없음. - 한 도메인은 다시 여러 하위 도메인으로 구분됨. - 한 도메인을 논리적으로 같아 보여도 하위 도메인에 따라 다른 용어를 사용할 수 있음 - 하위 도메인마다 같은 용어라도 의미가 다르기 때문에 한 개의 모델로 모든 하위 도메인을 표현할 수 없음 - 올바른 도메인 모델을 개발하려면 하위 도메인 마다 모델을 다르게 만들어줘야 - 각 모델은 명시적으로 구분되는 경계를 가져야 함. - 바운디드 컨텍스트 : 구분되는 경계를 갖는 컨텍스트 # 바운디드 컨텍스트 - 모델의 경계를 결정 - 하나의 바운디드 컨텍스트는 논리적으로 한 개의 모델을 가짐 - 이상적으로는 하위 도메인과 바운디드 컨텍스트가 일대일이면 좋겠으나, ..
2023.09.02 -
애그리거트 트랜잭션 관리
트랜젝션이 잘못되면 데이터의 일관성이 깨진다. 즉, 애그리거트의 일관성이 깨지기 떄문에 적절한 트랜잭션 처리 기법이 필요하다. 애그리거트에 대해 사용할 수 있는 대표적인 트랜잭션 처리 방식은 선점 잠금과 비선점 잠금이 있다. # 선점 잠금 선점 잠금은 먼저 애그리거트를 구한 스레드가 애그리거트 사용이 끝날 때까지 다른 스레드가 해당 애그리거트를 수정하지 못하게 막는 방식이다. 스레드 1이 선점 잠금 방식으로 애그리거트를 구하면, 스레드2 는 애그리거트에 대한 잠금이 해제할 때까지 블로킹(Blocking)된다. 선점 잠금은 보통 DMBS가 제공하는 행단위 잠금을 사용해서 구현한다. Jpa EntityManager.find() 함수를 통해 선점 잠금 방식을 사용할 수 있다. LockModeType을 PESS..
2023.08.26 -
도메인 서비스
구현을 하다보면 한 애그리거트에 넣기 애매한 도메인 기능이 있다. 그러한 기능들을 억지로 특정 에그리거트에 넣으면 안 된다. 자신의 책임 범위를 넘어서서 기능을 구현하면 코드가 길어지고 외부에 대한 의존이 높아지기 때문이다. 도메인 기능을 별도 서비스로 구현하면 이러한 문제를 해결할 수 있다. 도메인 서비스 도메인 서비스는 도메인 영역에 위치한 도메인 로직을 표현할 때 사용한다. 주로 다음과 같은 로직에서 사용한다. - 계산 로직 : 여러 에그리거트가 필요한 계산 로직, 한 애그리거트에 넣기 다소 복잡한 계산 로직 - 외부 시스템 연동일 필요한 로직 : 구현하기 위해서 타 시스템을 사용해야 하는 도메인 로직 한 애그리거트에 넣기 애매한 도메인 개념을 구현하려면 애그리거트에 억지로 넣기 보다는 도메인 서비..
2023.08.18 -
응용 서비스와 표현 영역
# 표현 영역과 응용 영역 - 응용 영역과 표현 영역이 사용자와 도메인을 연결해주는 매개체 역할을 함 - 표현 영역은 응용 서비스가 요구하는 형식으로 사용자 요청을 변환. - 응용 서비스를 실행한 뒤에 표현 영역은 실행 결과를 사용자에게 알맞은 형식(HTML/JSON)으로 응답 # 응용 서비스의 역할 - 응용 서비스는 사용자가 요청한 기능을 실행 - 사용자 요청을 처리하기 위해 리포지터리에서 도메인 객체를 가져와 사용 - 도메인 영역과 표현 영역을 연결해주는 창구 - 응용 서비스가 복잡하다면 응용 서비스에서 도메인 로직 일부를 구현하고 있을 가능성이 높음 - 응용 서비스는 트랜젝션 처리도 담당 도메인 로직을 응용서비스로 분산시 문제점 1. 코드 응집성이 떨어짐 2. 여러 응용 서비스에서 동일한 도메인 로..
2023.08.12