도메인 주도 설계에서 가장 어려운 일은 도메인 전문가의 관심사를 포착하고 효과적인 설계로 이끌어줄 명확한 모델을 발견하는 것이다. 궁극적으로는 도메인에 대한 심층적인 이해를 반영한 모델이 필요하다. 이 과정을 통해 도메인 전문가의 사고방식과 자연스럽게 융합되고 요구사항에 잘 대응할 수 있는 소프트웨어를 개발할 수 있다.
유용한 모델을 성공적으로 개발하기 위해 명심해야 할 세 가지는 다음과 같다.
리팩터링(Refactoring)이란 소프트웨어의 기능을 수정하지 않고, 설계를 다시 하는 것을 의미한다. 사전에 모든 설계 결정을 내리기보다는 기존의 기능은 유지한 채, 끊임없이 코드를 변경해보면서 설계를 좀 더 유연하게 개선하거나 이해하기 쉽도록 만든다.
자동화된 유닛 테스트를 통해 비교적 안전하게 리팩터링을 수행할 수 있다. 개발자는 리팩터링으로 인한 코드 변경을 안심하고 진행할 수 있다.
보통 리팩터링을 다루는 대부분의 문헌에서는 매우 상세한 수준에서 코드의 가독성을 높이거나 쉽게 개선하는 기계적인 변경에 초점을 맞춘다. 이러한 접근법은 설계 품질을 주로 기술적인 관점에서 바라본다.
시스템의 생존력에 가장 큰 영향을 미치는 리팩터링은 도메인에 대한 새로운 통찰력을 얻었을 때 수행하거나 모델이 표현하고자 하는 바를 명확하게 드러내고자 할 때이다. 이러한 유형의 리팩터링이 디자인 패턴을 활용한 리팩터링이나 마이크로 리팩터링을 대체하는 것은 아니다. 다만 다른 수준의 리팩터링, 심층 모델을 향한 리팩터링이라는 수준을 추가한다. 도메인에 대한 통찰력을 바탕으로 리팩터링을 하는 경우, 심층 모델을 만들기 위해 따라야 하는 방법을 마이크로 리팩터링을 통해 달성할 수 있다.
리팩터링의 목표는 개발자가 단순히 코드가 수행하는 바를 이해하는 것뿐만 아니라 왜 그렇게 수행되는지를 이해하고 도메인 전문가와의 의사소통에 이를 연관시키는 것이다.
모델링은 본래부터 일정한 체계를 갖추고 있지 않다. 심층 모델을 향한 리팩터링은 학습과 심층적인 사고가 이루어지는 곳이라면 어디라도 함께해야 한다.
심층 모델(deep model)이란 도메인의 피상적인 측면은 배제하고, 도메인 전문가의 주요 관심사와 가장 적절한 지식을 알기 쉽게 표현한 모델이다. 도메인과 조화를 이루는 모델에서는 융통성, 단순함, 설명력을 얻을 수 있다. 그러한 모델이 공통적으로 지니고 있는 특징은 업무 전문가가 즐겨쓰는 단순하지만 충분히 추상적인 언어가 존재한다는 것이다.
지식탐구와 더불어 인내심을 가지고 UBIQUITOUS LANGUAGE를 만드는 일에 집중해야 한다. 이를 통해 중요한 도매인 개념을 포착할 수 있고 그 개념을 모델 내에 명시적으로 표현할 수 있다. 그리고 수많은 리팩터링 과정에서의 연속적인 정제를 통해 서서히 모델에 대한 통찰력을 얻게 된다.
도메인 모델의 정제를 통해 얻은 심층적인 모델은 애플리케이션을 더 풍부하게 만들고 설계를 더 명확하게 만들 수 있는 기회를 제공하기도 한다. 이전에는 몰랐지만 정제된 도메인 모델과 유연해지고 명확해진 설계로 인해 설계상의 또다른 문제점을 깨닫게 되는 기회가 만들어질 수 있기 때문이다.