본문 바로가기

[DDD START!] 1장 도메인 모델 시작

  • 도메인 모델
  • 엔티티와 밸류
  • 도메인 용어

도메인

- 소프트웨어로 해결하고자 하는 문제 영역, 즉 도메인(domain)

- 한 도메인은 하위 도메인으로 나눌 수 있다. 

 

도메인 모델

- 특정 도메인을 개념적으로 표현한 것

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

- 도메인을 이해하려면 도메인이 제공하는 기능과 도메인의 주요 데이터 구성을 파악해야 한다. 이런 면에서 기능과 데이터를 함께 보여주는 객체 모델은 도메인을 모델링 하기에 적합하다.  

- 도메인 모델은 기본적으로 도메인 자체를 이해하기 위한 개념 모델.

 

도메인 모델 패턴

일반적인 애플리케이션의 아키텍쳐 구성 

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

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

- 도메인 계층은 도메인의 핵심 규칙을 구현한다.

- 이런 도메인 규칙을 객체 지향 기법으로 구현하는 패턴이 도메인 모델 패턴이다. 

'도메인 모델'이란 용어는 도메인 자체를 표현하는 개념적인 모델을 의미하지만, 도메인 계층을 구현할 때 사용하는 객체 모델을 언급할 때에도 '도메인 모델'이란 용어를 사용한다. 이 책에서도 도메인 계층의 객체 모델을 표현할 때 도메인 모델이라고 표현하고 있다. 

 

도메인 모델 도출

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

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

 

엔티티와 밸류

- 도출한 모델은 크게 엔티티(Entity)와 밸류(Value)로 구분할 수 있다. 

- 식별자는 단순한 문자열이 아니라 도메인에서 특별한 의미를 지니는 경우가 많기 때문에 식별자를 위한 밸류 타입을 사용해서 의미가 잘 드러나도록 할 수 있다. 

- 도메인 객체가 불완전한상태로 사용되는 것을 막으려면 생성 시점에서 필요한 것을 전달해 주어야 한다. 즉 생성자를 통해 필요한 데이터를 모두 받아야 한다. 

 

엔티티(Entity)

- 엔티티 객체마다 고유한 식별자를 갖는다. 

- 엔티티의 식별자는 바뀌지 않는다. 엔티티를 생성하고, 엔티티의 속성을 바꾸고, 엔티티를 삭제할 때까지 식별자는 유지된다. 

- 엔티티의 식별자는 바뀌지 않고 고유하기 때문에 두 엔티티 객체의 식별자가 같으면 두 엔티티는 같다고 판단할 수 있음.

- 엔티티의 식별자 생성

1) 특정한 규칙에 따라 생성

2) UUID 사용

3) 값을 직접 입력

4) 일련번호 사용(시퀀스나 DB의 자동 증가 칼럼 사용)

 

밸류(Value)

- 밸류 타입은 개념적으로 완전한 하나를 표현할 때 사용.

- 밸류 타입이 꼭 두개 이상의 데이터를 가져야 하는것은 아니다. 의미를 명확하게 하기 위해서 사용하는 경우도 있음. (ex) Money

- 밸류 타입을 위한 기능 추가 가능.

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

- 데이터 변경기능을 제공하지 않음, 불변(immutable), 보다 안전한 코드를 작성할 수 있음.

- 엔티티 타입의 두 객체가 같은지 비교할 때 주로 식별자를 사용한다면 두 밸류 객체가 같은지 비교할 때는 모든 속성이 같은지 비교해야 한다. 

 

도메인 용어

- 도메인에서 사용하는 용어는 매우 중요함.

- 도메인에서 사용하는 용어를 최대한 코드에 반영해야 함.

- 도메인 용어로 해석하거나 도메인 용어를 코드로 해석하는 과정이 줄어듬, 이는 코드의 가독성을 높여서 코드를 분석하고 이해하는 시간을 절약한다.