01.도메인 모델 시작하기

도메인 주도 개발 시작하기 1장을 요약한 내용입니다.

도메인

  • 소프트웨어로 해결하고자 하는 문제 영역.

  • 한 도메인은 다시 하위 도메인으로 나뉠 수 있다.

  • 도메인: 온라인 서점

    • 하위 도메인: 주문, 혜택, 회원, 정산, 결제, 배송, 카탈로그, 리뷰

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

  • Garbage in, Garbage out

개발자는 요구사항을 이해할 때 왜 이러한 기능을 요구하는지 또는 실제로 원하는 게 무엇인지 생각하고 전문가와 대화를 통해 진짜로 원하는 것을 찾아야 한다.

도메인 모델 패턴

  • 도메인 모델은 아키텍처 상의 도메인 계층을 객체 지향 기법으로 구현하는 패턴

  • 도메인 모델을 사용하면 여러 관계자들이 동일한 모습으로 도메인을 이해하고 도메인 지식을 공유하는 데 도움이 된다.

  • 핵심 규칙을 구현한 코드는 도메인 모델에만 위치하기 때문에 규칙이 바뀌거나 규칙을 확장해야 할 때 다른 코드에 영향을 덜 주고 변경 내역을 모델에 반경할 수 있다.

아키텍처 구성

영역설명

사용자 인터페이스 또는 표현(Presentation)

사용자의 요청을 처리하고 사용자에게 정보를 보여준다. 여기서 사용자는 소프트웨어를 사용하는 사람뿐만 아니라 외부 시스템일 수도 있음

응용(Application)

사용자가 요청한 기능을 실행. 업무 로직을 직접 구현하지 않으며 도메인 계층을 조합해서 기능을 실행

도메인(Domain)

시스템이 제공할 도메인 규칙을 구현

인프라스트럭처(Infrastructure)

데이터베이스나 메시징 시스템과 같은 외부 시스템과의 연동을 처리

도메인 모델 도출

  • 도메인을 모델링할 때 기본이 되는 작업은 모델을 구성하는 핵심 구성요소, 규칙, 기능을 찾는 것.

  • ex)

    • 최소 한 종류 이상의 상품을 주문해야 한다.

    • ...

    • 출고를 하면 배송지를 변경할 수 없다.

코드를 보면서 도메인을 깊게 이해하게 되므로 코드 자체도 문서화의 대상.

단순히 코드를 보기 좋게 작성하는 것뿐만 아니라 도메인 관점에서 코드가 도메인을 잘 표현해야 비로소 코드의 가독성이 높아지고 문서로서 코드가 의미를 갖는다.

엔티티와 밸류

엔티티 / Order

  • 식별자를 가진다.(식별자는 엔티티 객체마다 고유해서 각 엔티티는 서로 다른 식별자를 보유, ex. 주문번호)

  • 엔티티의 식별자는 변경되지 않고 고유하므로 두 엔티티 객체의 식별자가 같으면 두 엔티티는 같다고 판단.

  • 식별자 생성.

    • 특정 규칙에 따라 생성

    • UUID, Nano ID 같은 고유 식별자 생성기 사용

    • 값 직접 입력

    • 일련번호 사용(시퀀스, DB 자동 증가 컬럼)

밸류 타입 / ShippingInfo

  • 개념적으로 완전한 하나를 표현할 때 사용 / Receiver, Address

  • 밸류 타입을 위한 기능 추가 가능 / Money

    • 밸류 객체 데이터를 변경할 때는 기존 데이터를 변경하기보다 변경한 데이터를 갖는 새로운 밸류 객체 생성 방식 선호.

  • 두 밸류 객체를 비교할 때는 모든 속성이 같은지 비교.

엔티티 식별자와 밸류 타입

  • 식별자를 위한 밸류 타입을 사용해서 의미가 잘 드러나도록 하자.

    • private OrderNo number;

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

  • set 메서드는 필드값만 변경하고 끝나므로 상태 변경과 관련된 도메인 지식이 코드에서 사라지게 된다.

  • 도메인 객체 생성 시 온전하지 않은 상태가 될 수 있다.

  • 도메인 객체가 불완전한 상태로 사용되는 것을 막기 위해 생성자를 통해 필요한 데이터를 모두 받자.

  • 밸류 타입은 불변으로 구현

.

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

  • 코드 작성 시 도메인에서 사용하는 용어는 매우 중요.

  • 전문가, 관계자, 개발자가 도메인과 관련된 공통의 언어를 만들고 이를 대화, 문서, 도메인 모델, 코드 테스트 등 모든 곳에서 같은 용어를 사용

Eric Evans는 도메인 주도 설계에서 언어의 중요함을 강조하기 위해 유비쿼터스 언어라는 용어를 사용

Last updated