본문 바로가기
Books/도메인 주도 개발 시작하기

Chapter1. 도메인 모델 시작하기

by YoonJong 2024. 4. 5.
728x90

 

  • 도메인 : 소프트웨어로 해결하고자 하는 문제 영역
    • 도메인은 여러 하위 도메인으로 구성된다.
    • 소프트웨어가 도메인의 모든 기능을 제공하지는 않는다.
  • 도메인 모델 : 특정 도메인을 개념적으로 표현한 것
    • 기본적으로 도메인 자체를 이해하기 위한 개념 모델
  • 도메인 모델 패턴
    1. 사용자 인터페이스 또는 표현
      • 사용자의 요청을 처리하고 사용자에게 정보를 보여준다. 외부 시스템일 수도 있다.
    2. 응용
      • 사용자가 요청한 기능을 실행
    3. 도메인
      • 시스템이 제공할 도메인 규칙을 구현
    4. 인프라스트럭처
      • DB 나 메시징 시스템과 같은 외부 시스템과의 연동 처리
  • 도메인 모델 도출
    • 모델을 구성하는 핵심 구성요소, 규칙, 기능을 찾는 것
    • 요구사항 확인하기
  • 엔티티와 밸류
    • 엔티티
      • 엔티티 객체마다 고유해서 각 엔티티는 서로 다른 식별자를 갖는다.
        1. 특정 규칙에 따라 생성
        2. UUID 와 같은 고유 식별자 생성기 사용
        3. 값을 직접 입력
        4. 일련번호 사용 ( 자동 증가 컬럼 등 )
      • 자동증가 컬럼은 DB 테이블에 데이터를 삽입해야 해당 값을 알 수 있다.
    • 밸류 타입
      • 개념적으로 완전한 하나를 표현할 때 사용
      • 의미를 명확하게 표현하기 위함
      • 밸류 타입을 위한 기능 추가 가능
      • 안전한 코드 생성 가능
      @Embeddable
      public class Address {
      
          private String street;
          private String city;
          private String zipCode;
      }
      
      --
      @Entity
      @Table(name = "person")
      public class Person {
      
          @Id
          @GeneratedValue(strategy = GenerationType.IDENTITY)
          private Long id;
      
          private String name;
      
          @Embedded
          private Address address;
      }
      
      --
      Person person = new Person();
      person.setName("JYJ");
      
      Address address = new Address();
      address.setStreet("서울");
      address.setCity("씨티");
      address.setZipCode("12345");
      
      person.setAddress(address);
      
  • 도메인 모델는 set 메서드를 넣지 않는다.
    • 도메인의 핵심 개념이나 의도를 코드에서 사라지게 한다.
    • 생성자를 통해 필요한 데이터를 모두 받아야 한다.
  • 도메인 용어와 유비쿼터스 언어
    • 도메인용어는 가독성을 높여서 코드를 분석하고 이해하는 시간을 줄여준다
    • 유비쿼터스 언어는 모두가 공유하는 언어를 의미한다.
public enum OrderStatus {
    NEW,
    PAYMENT_PENDING,
    SHIPPING,
    DELIVERED,
    CANCELLED
}

 

 

구분 도메인 용어 유비쿼터스 언어
정의 특정 문제 영역에서 사용되는 전문 용어 도메인 전문가, 개발자, 테스터 등 프로젝트 참여자 모두가 공유하는 언어
범위 특정 문제 영역 프로젝트
용도 문제 영역을 이해하고 설명하기 위한 용도 의사 소통, 코드 작성, 문서 작성 등 프로젝트 내에서 일관되게 사용

 

728x90

댓글