Lined Notebook

[DDD] Domain Driven Design 개요

by HeshAlgo

DDD

1. 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개 이상의 데이터를 가질 필요는 없습니다.

 

 

 

 

 

 

이미지 출처 (객체 기반 주문 도메인 모델)

songii00.github.io/2020/06/14/2020-06-14-DDDStart!_Item_1/

'DDD' 카테고리의 다른 글

[DDD] Repository의 조회 기능(JPA 중심)  (0) 2021.04.21
[DDD] Aggregate  (0) 2021.04.11
[DDD] Domain Driven Design 아키텍처  (0) 2021.04.11

블로그의 정보

꾸준히 공부하는 개발 노트

HeshAlgo

활동하기