관리 메뉴

효습

1장 도메인 모델 시작하기 본문

책/도메인 주도 개발 시작하기

1장 도메인 모델 시작하기

효효효효 2024. 3. 11. 21:18

1.1 도메인이란?

  • 도메인이란 소프트웨어로 해결하고자 하는 문제 영역이다
  • 한 도메인은 다시 하위 도메인으로 나눌 수 있다

  • 특정 도메인을 위한 소프트웨어라고 해서 도메인이 제공해야할 모든 기능을 직접 구현하는 것은 아니다.
  • 도메인마다 고정된 하위 도메인이 존재하는 것은 아니다
    • 하위 도메인을 어떻게 구성할지 여부는 상황에 따라 달라진다.

 

1.2 도메인 전문가와 개발자 간 지식 공유

  • 요구사항을 올바르게 이해하려면 개발자와 전문가가 직접 대화해야한다.
    • 개발자와 전문가 사이에 내용을 전파하는 전달자가 많을수록 정보가 왜곡디고 손실이 발생하게 되며, 개발자는 최초에 전문가가 요구한 것도 다른 무언가를 만들게 될 수 있다

 

1.3 도메인 모델

  • 도메인 모델은 기본적으로 특정 도메인을 개념적으로 표현한 것이다
  • 도메인을 이해하려면 도메인이 제공하는 기능과 도메인의 주요 데이터 구성을 파악해야하는데, 이런 면에서 기능과 데이터를 함께 보여주는 객체 모델은 도메인을 모델링하기에 적합하다.
  • 상태 다이어그램을 통해서도 모델링할 수 있다
  • 도메인 모델은 개념모델이기때문에 구현 기술에 맞는 구현 모델이 따로 필요하다

 

1.4 도메인 패턴 모델

  • 일반적인 애플리케이션의 아키텍처는 표현 , 응용, 도메인,인프라스트럭처로 구성된다

영역 설명
사용자 인터페이스 또는 표현 사용자의 요청을 처리하고 사용자에게 정보를 보여준다. 여기서 사용자는 소프트웨어를 사용하는 사람뿐만 아니라 외부 시스템일 수도 있다.
응용 사용자가 요청한 기능을 실행한다. 업무 로직을 직접 구현하지 않으며 도메인 계층을 조합해서 기능을 실행한다
도메인 시스템이 제공할 도메인 규칙을 구현한다
인프라스트럭처 데이터베이스나 메세징 시스템과 같은 외부 시스템과의 연동을 처리한다

 

1.5 도메인 모델 도출

  • 도메인을 모델링할 때 기본이 되는 작업은 모델을 구성하는 핵심 구성요소, 규칙,기능을 찾는 것이다
    • 이 과정을 요구사항에서 출발한다
  • 도메인을 구현하다 보면 특정 조건이나 상태에 따라 제약이나 규칙이 달리 적용되는 경우가 많다
    • 다른 요구사항도 확인하여 점진적으로 도메인 모델을 만들어나간다
  • 요구사항 정련을 위해 도메인 전문가나 다른 개발자와 논의하는 과정을 공유하기도 한다

 

 

1.6 엔티티와 밸류

  • 도메인 모델은 크게 엔티티(Entity)와 밸류(Value)로 구분할 수 있다

1.6.1 엔티티

  • 엔티티의 가장 큰 특징은 식별자를 가진다는 것이다.
  • 식별자는 엔티티 객체마다 고유해서 각 엔티티는 서로 다른 식별자를 갖는다 (예를 들어 주문번호)
  • 엔티티의 식별자는 바뀌지 않으며 생성하고 속성을 바꾸고 삭제할 때까지 식별자는 유지된다

1.6.2 엔티티의 식별자 생성

  • 식별자는 다음과 같은 방법으로 생성된다
    • 특정 규칙에 따라 생성
    • UUID나 Nano ID 와 같은 고유 식별자 생성기를 사용
    • 값을 직접 입력
    • 일련번호 사용(시퀀스나 DB의 자동 증가 칼럼 사용)
  • 리포지토리는 도메인 객체를 데이터베이스에 저장할 때 사용하는 구성요소이다

1.6.3 밸류 타입

  • 밸류 타입은 개념적으로 완전한 하나를 표현할 때 사용한다
  • 밸류 타입을 위한 기능을 추가할 수 있다
    • 의미 중심으로 코드를 작성할 수 있다
  • 밸류 객체의 데이터를 변경할 때는 기존 데이터를 변경하기보다는 변경한 데이터를 갖는 새로운 밸류 객체를 생성하는 방식을 선호한다
    • 밸류 타입을 불변으로 구현하는 가장 중요한 이유는 안전한 코드를 작성할 수 있다는 데 있다.

1.6.4 엔티티 식별자와 밸류 타입

  • 도메인 개념처럼 도메인이 특별한 의미를 지니는 경우가 많기 때문에 식별자를 위한 밸류 타입을 사용해서 의미가 잘 드러나도록 할 수 있다

1.6.5 도메인 모델에 set 메서드 넣지 않기

  • 습관적으로 작성한 set 메서드는 필드값만 변경하고 끝나기 때문에 상태 변경과 관련된 도메인 지식이 코드에서 사라지게 된다
  • 또 다른 문제는 도메인 객체를 생성할 때 온전하지 않은 상태가 될 수 있다는 것이다
  • 도메인 객체가 불완전한 상태로 사용되는 것을 막으려면 생성 시점에 필요한 것을 전달해 주어야 한다.
    • 생성자라를 통해 필요한 데이터를 모두 받아야한다 → 생성자를 호출하는 시점에서 필요한 데이터가 올바른지 검사할 수 있다
Order order = new order(orderer,lines,shippingInfo,OrderState.PREPARING);

 

 

1.7 도메인 용어와 유비쿼터스 언어

  • 도메인에서 사용하는 용어를 코드에 반영하지 않으면 그 코드는 개발자에게 코드의 의미를 해석해야 하는 부담을 준다
  • 시간이 지날수록 도메인에 대한 이해가 높아지는데 새롭게 이해한 내용을 잘 표현할 수 있는 용어를 찾아내고 이를 다시 공통의 언어로 만들어 다 같이 사용한다.