도메인 주도 개발 시작하기2 - chapter2

유사개발자·2023년 8월 21일
0

DDD

목록 보기
1/1
post-thumbnail

chapter2 - 아키텍처 개요

엔티티

고유의 식별자를 갖는 객체 주문, 회원, 상품과 같이
도메인의 고유한 개념을 표현한다. 도메인 모델의 데이터를 포함하며 해당 데이터와 관련된 기능을 함께 제공한다.

밸류

고유의 식별자를 갖지 않는 객체로 개념적으로 하나인 값을 표현할 때 사용된다.
배송지 주소를 표현하기 위한 주소나 구매 금액을 위한 금액과 같은 타입이 밸류 타입이다.
엔티티의 속성으로 사용할 뿐만 아니라 다른 밸류 타입의 속성으로도 사용할 수 있다.
(밸류의 경우 불변으로 구현할 것을 권장하며 이 뜻은 엔티티의 밸류 값이 변경된다면
새로운 객체를 생성해서 처리해야 한다는 뜻이다.)

애그리거트

애그리거트는 연관된 엔티티와 밸류 객체를 개념적으로 하나로 묶은 것이다.
주문과 관련된 Order 엔티티, Orderline밸류, Orderer밸류 객체를 '주문'애그리거트로 묶을 수 있다.

(일종의 군집화로써 개별 객체가 아닌 관련 객체를 묶어서 객체 군집 단위로 모델을 바라볼 수 있게 된다. 개별 객체 간의 관계가 아닌 애그리거트 간의 관계로 도메인 모델을 이해하고 구현하게 되며, 이를 통해 큰 틀에서 도메인 모델을 관리할 수 있다.

애그리거트는 군집에 속한 객체를 관리하는 '루트'엔티티를 갖는다. 루트 엔티티는 애그리거트에 속해 있는 엔티티와 밸류 객체를 이용해서 애그리거트가 구현해야 할 기능을 제공한다. 애그리거트를 사용하는 코드는 애그리거트 루트가 제공하는 기능을 실행하고 애그리거트 루트를 통해서 간접적으로 애그리거트 내의 다른 엔티티나 밸류 객체에 접근한다. 이것은 애그리거트의 내부 구현을 숨겨 애그리거트 단위로 구현을 캡슐화 할 수 있게 한다.)

리포지터리

도메인 객체를 지속적으로 사용하려면 RDBMS, NOSQL과 같은 물리적인 저장소에
도메인 객체를 보관해야 한다. 이를 위한 도메인 모델이 리포지터리 Repository이다. 엔티티나
밸류가 요구사항에서 도출되는 도메인 모델이라면 리포지터리는 구현을 위한 도메인 모델이다.

리포지터리는 애그리거트 단위로 도메인 객체를 저장하고 조회하는 기능을 정의한다. 예를들어
주문 애그리거트를 위한 리포지터리를 다음과 같이 정의할 수 있다.

public interface  OrderRepository {
	Order findByNumber(OrderNumber number);
	void save(Order order);
	void delete(Order order);
}

OrderRepository의 메서드를 보면 대상을 찾고 저장하는 단위가 애그리거트 루트인 Order인 것을 알 수 있다. Order는 애그리거트에 속한 모든 객체를 포함하고 있으므로 결과적으로 애그리거트 단위로 저장하고 조회한다.

(그러면.. 애그리거트 단위로 저장 및 조회가 된다면 애그리거트 하위 도메인을 조회하기 위해서는 상위 도메인을 통해 조회해야만 한다는 뜻? 그렇다면 불필요한 값도 조회하는건 아닌가 ??)

도메인 모델을 사용해야 하는 코드는 리포지터리를 통해서 도메인 객체를 구한 뒤에 도메인 객체의 기능을 실행한다. 예를 들어 주문 취소 기능을 제공하는 응용 서비스는 다음 코드처럼 OrderRepository를 이용해서 Order 객체를 구하고 해당 기능을 실행한다.

public class CancelOrderService {
	private OrderRepository orderRepository;
	
	public void cancel(OrderNumber number) {
		Order order = orderRepository.findByNumber(number);
		if (order == null) throw new NoOrderException(number);
		order.cancel();
	}
}

도메인 모델 관점에서 OrderRepository는 도메인 객체를 영속화 하는 데 필요한 기능을 추상화한 것으로 고수준 모듈에 속한다. 기반 기술을 이용하여 OrderRepository를 구현한 클래스는 저수준 모듈(세부사항)로 인프라스트럭처 영역에 속한다.

profile
개발자와 유사한 개발자입니다

0개의 댓글