본문 바로가기

관심사/독후감

최범균 <DDD START! > 1장-2장 요약

1장. 도메인 모델 시작

도메인 모델

특정 도메인을 개념적으로 표현한 것이다. 도메인 모델은 객체 모델 / 상태 다이어그램 등으로 표현할 수 있다.


도메인 모델 패턴


도메인 모델은 엔터티와 밸튜 타입으로 구성된다.

엔터티는 고유한 식별자를 갖고 있는 개념을의미하고, 밸류타입은 엔터티에 속해있으면서, 개념적으로 완전한 하나를 표현할 때 사용한다.

예를 들어, "주문"이라는 도메인은 고유한 주문 번호를 갖고 이는 엔터티라고 볼 수 있다. 그리고 주문 안에는 배송지 정보, 수신인 등을 의미하는 속성이 저장되는데, 이를 밸류 타입으로 볼 수 있다. 


주의할 점

도메인 모델에서는 get/set 메서드를 사용하지 않는 것이 좋다. set 메서드를 사용하면, 도메인 객체를 생성할 때 완전한 상태가 아닐 수도 있다는 단점이 있다.

즉, 도메인 객체를 생성한 후, set 메서드를 호출해주는걸 빠트리는 실수를 할 수 있으니, 생성자에서 값을 모두 초기화해주는 것이 좋다. 


2장. 아키텍처 개요

서비스 레이어는 로직을 직접 수행하기보다는, 도메인 모델에 로직 처리를 위임한다.

서비스 레이어에서 인프라 스트럭처 ( Data Access Layer ) 계층에 의존하는 경우도 있다. ( 도메인 연동 없이, 외부 시스템과 바로 연동하는 경우 ) 

참고 이미지

그런 경우, 서비스 로직에서 인프라스트럭쳐에 해당하는 로직을 바로 호출하면, 서비스와 인프라 스트럭쳐 간의 의존성이 심해진다.

이 경우, 의존성 주입 (DI) 개념이 반영되어야한다.

위의 이미지를 기반으로 설명하자면, 

CalculateDiscountService에서는 RuleDiscounter라는 인터페이스를 매개변수나 멤버변수로 저장/관리한다.

그리고 인터페이스를 클래스로 구현한 객체 (DroolRuleDiscounter)를 CalculateDiscountService를 실행할 때 매개변수 / 멤버변수로 전달하고, 저장한다.

이렇게 하면, 인프라 스트럭처 클래스를 변경해야할 때, 이를 사용하는 서비스를 모두 고쳐줘야하는 고생을 안해도 된다.

인터페이스를 구현한 객체에서 변경된 클래스 / 함수만 적용해주면 된다.


도메인 영역 구성요소

엔티티, 밸류, 애그리거트, 리포지터리, 도메인 서비스로 구성된다.

애그리거트는 관련된 엔티티와 밸류 객체를 개념적으로 하나로 묶은거다.

리포지토리는 도메인 모델을 로딩 / 저장하는 기능을한다.

도메인 서비스는 특정 엔티티에 속하지 않는 도메인 로직을 처리한다.