CH01 도메인 모델 시작하기
Last updated
Last updated
해결하고자 하는 문제 영역. 온라인 서점을 예로 든다면 '온라인 서점' 자체가 도메인이며 하위 도메인으로 주문, 리뷰 등을 예로 들 수 있다.
도메인을 개념적으로 표현한 것. 예를 들어 '주문' 도메인을 모델링한 '주문 도메인 모델'의 경우 Order, OrderLine, Orderer 등으로 세분화 하고 구체화 할 수 있는데 이렇게 구체화된 것을 도메인 모델이라고 표현한다. DDD 세레나데에서 했던 요구사항 정의, 용어사전 정의, 모델링 하는 과정이 '도메인 모델'을 만드는 과정이며 최종적으로 모델링에서 정의한 것들이 '도메인 모델'의 한 종류이다.
조금 더 구체화 하면 DDD 세레나데에서 최종적으로 정의한 모델링을 실제 에그리거트, 엔티티, 벨류 객체의 관계로 표현한 것이 최종 형태의 '도메인 모델' 이라고 할 수 있다. 최종 도메인 모델의 예시는 아래와 같다. 아래 예시는 객체 중심 사고로 작성한 모델링이며 도메인 모델은 꼭 이러한 형태가 아니어도 상관없고 도메인을 이해하는데 도움이되는 형태이면 된다.
presentation 표현계층
application 응용계층. 도메인 로직을 조합하여 요청한 기능을 수행하는 계층이며 이 계층에 도메인 로직이 들어가서는 안된다.
domain 도메인 계층. 실제 도메인 규칙이 구현되는 계층이다. 핵심적인 비즈니스 규칙이 모두 이 계층에 구현된다.
infrastructure 인프라 계층. 외부 시스템과의 연동을 책임지는 계층
이 용어들은 저자가 그냥 만든 용어 같기도 한데, 내용이 공감이 많이 가서 따로 정리한다.
책에서 소개되고 있는 개념 모델이란 실제 코드로 구현하는 것을 감안하지 않은 개발을 염두한 것이 아닌 정말 순수한 도메인 지식에 입각한 모델이다. 반면에 구현 모델이란 실제로 개발을 염두한 모델을 의미한다.
저자가 말하고자 하는 핵심은 결국 개발자는 구현을 하는 과정에 도메인에 대한 이해도가 높아지고 결국 초반에 생각한 도메인 모델이 변경되는 경우가 흔하기 때문에 처음부터 너무 완벽하게 모델링을 하려고 하기 보다는 구현하는 과정에서 개념 모델이 점점 구현 모델로 점진적 발전을 이루게 해야 한다는 것이다.
책에서는 도메인 모델을 도출하는 과정을 실제 코드를 예로 들어 보여주고 있었다. 바로 코드로 이뤄진 모델을 다루고 있는데 이 단계에서는 코드로 이뤄지는 모델 보다는 도메인 주도 개발을 염두한 개념 수준에서의 상세한 모델링이 더 적절한 것 같다.
그래서 NEXTSTEP 의 DDD 세레나데 수업에서 배운 방식이 모델링 하는데 가장 좋은 것 같아서 여기에도 정리를 한다. 책에서도 그렇고 DDD세레나데에서도 배웠듯이 모든 것은 요구사항에서 시작한다. 순서는 아래와 같다.
직관적으로 파악할 수 있는 개체들로 분류하고 각 개체에 요구되는 요구사항들을 정리한다.
요구사항들을 기반으로 용어 사전을 작성한다.
1, 2 를 참고하여 속성, 기능으로 구분된 모델링을 한다. 이 때 각 개체는 엔티티 혹은 값 객체가 되며 속성은 필드값, 기능은 public method 라는 것이 핵심이다.
도메인 모델을 구성하는 개체는 두 가지로 분류할 수 있는데 엔티티와 값 객체이다.
예시로 링크를 남긴다.
가장 큰 차이점으로 엔티티는 고유한 식별값을 가지는데 값 객체의 경우 식별값이 없다는 것이다. 그리고 값 객체는 반드시 로 만들어야 한다.