[DDD] Domain Driven Design 개요
by HeshAlgo1. Domain
- 사용자가 사용하는 모든것을 도메인이라 칭할수 있다.
- 예를 들어 한사이트에 회원 가입, 수정, 탈퇴 등 회원이라는 전체적인 기능을 제공하는데 이것을 '회원' 이라는 도메인으로 한 묶음이 될 수 있다.
2. 왜 Domain Model을 사용하는가?
위와 같이 주문 도메인이 주어졌을때 주문을 하기위한 플로우를 간략하게 적어보자며
상품 선택 -> 배송지 입력 -> 지불 금액 계산 -> 견제수단 선택 -> 결제 완료
이러한 플로우를 거치게 되는데 이런 플로우를 객체 모델로 구성하면 위와 같은 그림처럼 표현 될 수 있다. (간략하게 표현 가능)
이렇게 도메인 모델을 사용하면 여러 관계자들이 동일한 모습으로 도메인을 이해하고 지식을 공유하는데 도움이 된다.
또한, 복잡한 비즈니스 로직을 도메인 모델에 담게 되면서 복잡했던 로직을 쉽게 풀어 나갈 수 있고
그 풀어나가는 방식을 보게되면 객체지향 5원칙에도 맞아들게 된다.
※ 핵심 목표 : "Loosly coupling", "High cohesion"
3. 도메인 모델 패턴
일반적인 애플리케이션 아키텍처는 위의 그림과 같이 4개의 계층으로 구성
Layer | Description |
사용자 인터페이스(UI) 또는 표현(Presention) | 사용자의 요청을 처리하고 사용자에게 정보를 보여준다. |
응용(Application) | 사용자가 요청한 기능을 실행한다. 업무 로직을 직접 구현하지 않으며 도메인 계층을 조합해서 기능 실행 |
도메인(Domain) | 시스템이 제공할 도메인의 규칙을 구현 |
인프라스트럭처(Infrastructure) | 데이터베이스나 메시징 시스템과 같은 외부 시스템과의 연동 처리 |
4. Entity & Value
- 도출한 모델은 Entity와 Value로 구분 가능
- Entity와 Value를 제대로 구분해야 올바르게 설계하고 구현이 가능하기 때문에 이 둘의 차이를 명확하게 아는 것이 중요!
1) Entity
- 엔티티의 가장 큰 특징은 식별자를 갖는다는 것이다.
- 엔티티 객체마다 식별가능한 서로 다른 식별자를 갖는다.
2) 식별자를 생성 방법
- 특정 규칙에 따라 생성
- UUID 사용
- 값을 직접 입력
- 일련번호 사용(시퀀스나 DB의 자동 증가 칼럼)
3) Value
public class ShippingInfo {
private String receiverName; // 받는사람
private String receiverPhoneNumber; //
private String shippingAddress1; //
private String shippingAddress1; // 주소
private String shippingZipCode; //
}
현재 ShippingInfo 클래스에 receiverName과 receiverPhoneNumber 각각의 필드는 다른 데이터를 담고 있지만 개념적으로 받는 사람을 의미 하고 있다. (주소 필드도 마찬가지)
이런 것을 개념적으로 완전한 하나를 표현할 때 사용하는 것이 Value이다.
public class Receiver {
private String name;
private String phoneNumber;
public Receiver(String name, String phoneNumber) {
this.name = name;
this.phoneNumber = phoneNumber;
}
}
개념적으로 봤을때 하나로 표현할 수 있었던 필드들은 Receiver (받는사람)이라는 도메인 개념을 표현 할 수 있습니다.
이렇게 Value타입을 사용함으로써 개념적으로 완전한 하나를 잘 표현 할 수 있어야 합니다.
※ Value타입이 꼭 2개 이상의 데이터를 가질 필요는 없습니다.
이미지 출처 (객체 기반 주문 도메인 모델)
'DDD' 카테고리의 다른 글
[DDD] Repository의 조회 기능(JPA 중심) (0) | 2021.04.21 |
---|---|
[DDD] Aggregate (0) | 2021.04.11 |
[DDD] Domain Driven Design 아키텍처 (0) | 2021.04.11 |
블로그의 정보
꾸준히 공부하는 개발 노트
HeshAlgo