caffeine-library / Domain-Driven-Design

🌱 에릭 에반스의 '도메인 주도 설계'를 읽는 스터디
4 stars 0 forks source link

[keyword] 6장 - 도메인 객체의 생명주기 #31

Closed emiling closed 1 year ago

emiling commented 1 year ago

주제

'6장. 도메인 객체의 생명주기'을 읽고 내용을 요약하거나,
중요✨ 하다고 생각하는 키워드 및 관련 설명을 코멘트로 달아주세요

연관 챕터

https://github.com/caffeine-library/Domain-Driven-Design/issues/30

kth990303 commented 1 year ago

Aggregate

에그리거트는 한 개 이상의 Entity와 그와 연관된 VO들을 가지고 있음. 또, 타 에그리거트 간의 연관이 발생하게 될 경우 Deadlock 유의.

Factory

토비의 스프링 1권 1장에서 설명된제어의 역전 내용을 떠올릴 수 있음. 복잡한 객체 및 구현체의 생성 책임을 Factory에게 위임한다. 단, 최근에는 JpaRepository 등 ORM 기술들이 발달하여 Entity 생성을 Repository에서 하는 경우도 많음

이 경우 Repository가 데이터를 근거로 객체를 생성하므로 많은 이들이 Repository를 Factory로 생각하는데, 사실 기술적 관점에서는 그렇다고 볼 수 있다. 그러나 모델을 중심에 두는 것이 더 유용하며, 앞에서 언급한 것처럼 저장된 객체를 재구성하는 것이 새로운 개념적 객체를 생성하는 것은 아니다. (p. 163)

Repository

repository의 메서드 하나하나에 트랜잭션을 두기보단 비즈니스 로직에 트랜잭션 제어를 둔다. (ex. 은행 예금 절차가 있을 때, 돈이 나한테서 빠져나가는 것 + 은행에 돈이 들어오는 것은 하나의 트랜잭션으로 묶어야 함.)

(개인적 주관) 단, 비즈니스 로직을 관리하는 서비스 레이어 바깥까지 트랜잭션 제어를 반환하는 것은 반대 (사유: 커넥션 리소스 낭비 및 엔티티 변경감지 작업이 비즈니스 로직 이외에서 발생 가능 https://kth990303.tistory.com/427)

leejaeseung commented 1 year ago

165p

일반적으로 새로운 객체와 이미 존재하는 객체를 구분하는 것은 도메인에서 중요하다.

insert + update 인 upsert 가 안티 패턴이라는 글도 많이 볼 수 있다. 처음엔 upsert 가 사용하기 편리하단 이유만으로 많이 애용했었는데, 애초에 동작하는 방식과 로직이 다르므로 별개의 케이스로 생각하는게 맞다. (사용자는 insert 만을 원했는데 db 에 해당 key 가 이미 존재한다는 이유로 원래 값을 덮어쓴다? 이건 이상한 것 같다.)

ex) 사용자는 key 가 1234 인 객체를 생성하고 싶다. 그런데 key 를 123 으로 잘못 입력해 upsert API 를 호출한다. 그럼 key 가 123 인 객체가 수정된다. (에러를 뱉는게 정상이겠지..)

JasonYoo1995 commented 1 year ago

[ 불변식 (Invariant) 이란? - ChatGPT의 답변 ]

[ AGGREGATE ]

emiling commented 1 year ago

불변식은 데이터가 변경될 때마다 유지되야 하는 일관성 규칙을 뜻하며, 여기엔 AGGREGATE 를 구성하는 각 구성요소 간의 관계도 포함 될 것이다.

저번주에 https://github.com/caffeine-library/Domain-Driven-Design/issues/12 이슈에서 다룬 정책 검증과 관련해서 생각해볼 수 있을 것 같네요. 이와 관련해서 조금 찾아보다가 아래 아티클을 읽고 간단히 정리해보았습니다.

https://learn.microsoft.com/en-us/dotnet/architecture/microservices/microservice-ddd-cqrs-patterns/domain-model-layer-validations

DDD에서 유효성 검사 규칙은 불변성(invariants) 으로 생각할 수 있습니다. AGGREGATE의 주요 책임은 해당 AGGREGATE 내의 모든 ENTITY에 대해 상태 변경에 걸쳐 불변성을 적용하는 것입니다.

유효성 검사는 일반적으로 도메인 ENTITY 생성자 또는 ENTITY를 업데이트 할 수 있는 메서드에서 구현됩니다. 유효성 검사를 구현하는 방법에는 다음과 같은 방법들이 있습니다.

도메인 모델 레이어에서 검증로직 구현하기

JasonYoo1995 commented 1 year ago

[1번째 커멘트 관련 논의 내용]