domain-driven-design

09. 암시적인 개념을 명확하게

심층 모델이 강력한 이유는 심층 모델에 사용자의 행위, 문제, 문제의 해법에 대한 본질적인 지식을 간결하고 유연하게 표현하는 중심 개념과 추상화가 담겨 있기 때문이다.

심층 모델로 향하는 첫걸음은 일단 도메인의 본질적인 개념을 모델 내에 표현하는 것이다.

지식탐구와 리팩터링은 중요한 개념이 모델과 설계 내에 명확하게 인식되고 표현될 때에야 비로소 본 궤도에 오른다.

개발자들이 토의 중에 단서를 얻거나 설계상에 암시적으로 존재하는 개념을 인지하면 도메인 모델과 관련 코드를 대량으로 변환하게 되며, 그 후 하나 이상의 객체와 객체 간의 관계를 활용해 모델 내에 해당 개념을 명확하게 표현하게 된다.

대개 도약은 여러 가지 중요 개념이 모델 내에서 명확해지고 난 후에야 나타난다. 성공적인 리팩터링 과정을 거쳐 반복적으로 개념에 할당된 책임을 조정하고, 다른 객체와의 관계를 변경하며, 심지어 이름까지도 몇 번씩 수정한다.

개념 파헤치기

개발자는 잠재해 있는 암시적인 개념을 드러내는 단서에 민감해야 하며, 이따금 한발 앞서 미리 암시적인 개념을 찾아야 할 때도 있다.

언어에 귀 기울여라.

도메인 전문가가 사용하는 언어에 귀 기울여라. 복잡하게 뒤얽힌 개념들을 간결하게 표현하는 용어가 있는가? 여러분이 선택한 단어를 고쳐주는가? 여러분이 특정 문구를 이야기할 때 도메인 전문가의 얼굴에서 곤혹스러운 표정이 사라지는가? 이 모두가 바로 모델에 기여하는 개념의 실마리에 해당한다.

새로운 단어를 듣게되면 명료하고 유용한 개념을 찾기 위한 대화와 지식탐구로 이어진다.

UBIQUITOUS LANGUAGE는 언어, 문서, 모델 다이어그램, 심지어 코드에도 널리 퍼져 있는 어휘로 구성돼 있다. 어떤 용어가 설계에 누락돼 있다면 누락된 용어를 설계에 포함시켜 모델과 설계를 향상시키는 기회가 될 수 있다.

어색한 부분을 조사하라

필요한 개념이 늘 대화나 문서로 인식할 수 있을 만큼 확연히 드러나 있지는 않다. 이미 존재하는 개념을 파헤치거나 새로운 개념을 만들어내야 할지도 모른다. 아울러 설계에서 가장 어색한 부분을 조사해야 한다.

객체가 모든 작업을 원활하게 수행하지만 할당된 일부 책임이 어색하다는 것을 발견할지도 모른다. 또는 뭔가가 누락됐다는 사실을 깨닫는다고 해도 모델과 관련된 문제를 어떻게 풀어야 할지 감이 잡히지 않을 수도 있다.

모순점에 대해 깊이 고민하라.

도메인 전문가는 자신의 경험과 필요에 따라 각기 다른 방식으로 사물을 바라본다.

어떤 모순은 용어를 다르게 쓰는 데서 발생하며, 어떤 모순은 도메인을 잘못 이해하는 데서 발생한다. 하지만 용어와 오해의 문제 말고도 두 도메인 전문가가 서로 모순되는 사실을 진술하는 경우도 있다.

모든 모순을 해소한다는 것은 현실적이지도, 바람직하지도 않다.

그러나 모순되는 사항을 그대로 유지해야 하는 상황에서조차 모순되는 양측의 주장을 모두 동일한 외부 현실에 적용하는 방법을 심사숙고하는 과정에서 숨겨져 있던 사실들을 밝히는 계기가 마련될 수 있다.

서적을 참고하라

모델의 개념을 조사할 때는 분명해 보이는 사실이라고 해서 간과해서는 안 된다.

시도하고 또 시도하라

각 방향 선회는 모델에 좀더 심층적인 통찰력을 반영했음을 의미한다. 각 리팩터링은 더 유연하고, 차후에 좀더 변경하기 수월하며, 수정해야 할 것으로 판명된 곳을 지체하지 않고 바로 수정할 수 있게 모델의 상태를 유지해준다.

어차피 선택의 여지는 없다. 실험을 유용한 것이 무엇이고 유용하지 않은 것이 무엇인지를 배우는 방법이다.