DDD Start! - 1장 정리

UkJJang·2021년 10월 6일
0

도메인 모델

  • 도메인 모델은 특정 도메인을 개념적으로 표현한 것
  • 도메인은 하위 도메인으로 계속해서 뻗어 나갈 수 있다.
  • 도메인 모델을 사용하면 여러 관계자들이 동일한 모습으로 도메인을 이해하고 도메인 지식을 공유하는 데 도움이 된다.

표현 방식에는 관계 없이 도메인 모델은 기본적으로 도메인 자체를 이해하기 위한 개념 모델이다.

하위 도메인

  • 도메인은 각 하위 도메인으로 구성이 되고, 하위 도메인이 다루는 영역은 서로 다르기 때문에 같은 용어라도 하위 도메인 마다 의미가 달라질 수 있다.
  • 즉 도메인에 따라 용어의 의미가 결정되기 때문에 도메인을 하나의 다이어그램에 모델링하면 안된다.
  • 모델의 각 꾸성요소는 특정 도메인을 한정할 때 의미가 완전해지기 때문에 하위 도메인마다 별도로 모델을 만들어야 한다.

개념모델

  • 순수하게 문제를 분석한 결과물, 데이터베이스, 트랜잭션 처리, 성능, 구현 기술과 같은 것들을 고려하고 있지 않기 때문에 실제 코드를 작성할 때 개념 모델을 있는 그대로 사용할 수 없다.

구현모델

  • 처음부터 완벽한 개념 모델을 만들기 보다는 전반적인 개요를 알 수 있는 수준으로 개념 모델을 작성해야 한다. 초기에는 개요 수준의 개념 모델로 도메인에 대한 전체 윤곽을 이해하는데 집중하고, 구현하는 과정에서 개념 모델을 구현 모델로 점진적으로 발전시켜 나가야 한다.

도메인 모델 패턴 아키텍쳐

  • UI / 표현 : 사용자의 요청을 처리하고 사용자에게 정보를 보여준다, 사용자는 sw를 사용하는 사람 뿐만 아니라, 외부 시스템도 사용자가 될 수 있다.
  • 응용(Application) : 사용자가 요청한 기능을 실행한다. 업무로직을 직접 구현하지 않으며, 도메인 게층을 조합해서 기능을 수행한다.
  • 도메인 : 시스템이 제공할 도메인의 규칙을 구현한다.
  • 인프라스트럭쳐 : DB나 메시징 시스템과 같은 외부 시스템과의 연동을 처리한다.

도메인 모델링할 때 기본이 되는 작업

핵심 구성요소, 규칙, 기능을 찾는 것이다.
도메인 계층은 도메인의 핵심 규칙을 구현한다.

도메인을 구현하다 보면 특정 조건이나 상태에 따라 제약이나 규칙이 달리 적용되는 경우가 많다.

엔티티와 벨류를 제대로 구분해야 도메인을 올바르게 설계하고 구현할 수 있다.

엔티티의 식별자 생성 규칙

  • 특정 규칙에 따라 작성
  • UUID 사용
  • 값을 직접 입력
  • 일련번호 사용(DB 시퀀스, 자동 증가 컬럼)

엔티티 식별자를 벨류타입을 이용하자 !

벨류 객체를 사용할 때 주의점

  • 벨류 객체의 데이터를 변경할 때는 기존의 데이터를 변경하기 보다는 새로운 벨류 객체를 생성하는 방식을 더 선호한다. 그 이유는 불변 타입을 사용하면 보다 안전한 코드를 작성할 수 있기 때문이다.

도메인 모델에서는 Set 메서드를 넣지 않아야 한다.

ublic class Order {
    
    private OrderState state;
    private ShippingInfo shippingInfo;
    
    public void changeShippingIfo(ShippingInfo newShippingInfo) {
        if(!state.isShippingChangeAble()) {
            throw new IllegalArgumentException("can't change shipping in " + state);
        }
    }
    
    public void changesShipped() {
        this.state = OrderState.SHIPEED;
    }
    
    // 주문 배송지를 변경할 수 있는지 여부를 검사하는 메소드 제공
    public enum OrderState{
        
        PAYMENT_WAITING {
            public boolean isShippingChangeable(){
                return true;
            }
        },
        
        PREPARING {
            public boolean isShippingChangeable() {
                return true;
            }
        },
        
        SHIPEED, DELIVERING, DELIVERY_COMPLETED;
        
        public boolean isShippingChangeable() {
            return false;
        }
    }
    
}

주문 핵심 규칙 : 배송지 변경은 출고 전에만 가능하다, 주문 취소는 배송 전에만 가능하다.

도메인을 모델링할 때 기본이 되는 작업은 모델을 구성하는 핵심 구성요소, 규칙, 기능을 찾는 것이다. 이 과정은 요구사항에서 출발하게 된다.


총 정리

  • 도메인 용어를 잘 사용하자 !
  • 벨류 타입을 적절하게 사용하고 불변 객체로 만들자
  • 도메인에는 Set 메소드를 생성하지 않도록 한다 생성해야할 일이 있다면 private 접근자로 작성하여 외부에서 사용 못하도록 막아준다.
  • 엔티티 식별자를 적절하게 사용한다.
profile
꾸준하게 성실하게

0개의 댓글