평소에 '도메인 주도 설계' 라는 단어가 종종 언급되는 것을 보았다. 아직 DDD를 접해보지 않아 궁금했는데 막상 무엇부터 공부해야 할지 막막했다. 찾아보던 중 이 책이 입문자에게 적절할 것 같아 해당 책을 읽고 공부한 내용을 정리해보려고 한다.
도메인 주도 설계란 말 그대로 도메인 지식에 초점을 맞춘 설계 기법이다.
그렇다면 도메인이란 무엇일까? 도메인이란 영역이라는 뜻이다. 소프트웨어 개발에서 말하는 도메인은 '프로그램이 쓰이는 대상 분야'라는 의미로 쓰인다.
예를 들어, 회계 분야에서는 금전, 장부와 같은 개념이 등장한다. 이 개념은 회계 시스템의 도메인에 속한다. 물류 시스템에는 창고, 화물, 운송수단 등의 개념이 있으며 이 또한 물류 시스템의 도메인에 속한다. 이렇게 도메인에 포함되는 개념은 시스템의 대상 분야에 따라 달라진다.
소프트웨어의 목적은 도메인에서 이용자들이 직면한 문제를 해결하는 것이다. 그렇기 때문에 개발자는 도메인에 속한 개념과 사건을 이해하고, 그 중에서 문제 해결에 유용한 것을 뽑아낸 지식을 소프트웨어에 반영해야 한다.
하지만 이러한 과정들은 기술을 중시하는 개발자들이 놓치기 쉬운 부분이다. 기술을 중요시하는 개발자는 기술적 접근법으로만 문제를 해결하려고 한다. 그 결과, 목적 없는 소프트웨어가 만들어지는 참사가 발생한다.
이러한 참사를 피하기 위해서라도 소프트웨어가 사용될 분야(도메인)의 지식에 초점을 맞춰야 한다. 주의 깊게 관찰하고 이를 통해 알게된 지식을 제대로 표현하는 것 또한 소프트웨어 개발 과정의 일부이기 때문이다.
모델은 현실에 일어나는 사건 혹은 개념을 추상화한 개념이다. 추상이란 여러 사물 혹은 개념에서 공통적인 것을 뽑아 파악하는 것으로, 현실의 모든 것을 반영하진 않는다. 무엇을 버리고 무엇을 취할지는 도메인에 따라 결정된다.
예를 들어, 소설가의 관점에서 본 펜은 도구이며, 글자를 쓸 수 있다는 것이 중요한 성질이다. 반면에, 문구점의 관점에서 본 펜은 상품이며, 글자를 쓸 수 있다는 기능보다 상품으로서의 가치가 더 중시된다. 같은 대상이라도 중점이 달라질 수 있다.
이렇게 사건 혹은 개념을 추상화하는 작업을 모델링이라고 한다. 그리고 모델링의 결과를 모델이라고 한다. 도메인 주도 설계에서는 도메인 개념을 모델링한 모델을 도메인 모델이라고 한다.
도메인 모델은 어디까지나 개념을 추상화한 지식이다. 이것만으로는 문제를 해결할 수 없다. 모데인 모델은 어떤 매체를 통해 표현돼야만 문제를 해결할 수 있는 힘을 갖는다.
도메인 모델을 소프트웨어 형태의 동작하는 모듈로 나타낸 것이 도메인 객체이다.
어떤 도메인 모델을 도메인 객체로 구현할지도 중요한 문제이다. 개발자는 유용한 모델과 그렇지 않은 모델을 구분해야 한다. 공들여 만든 도메인 모델이 있어도 해당 모델이 이용자의 문제를 해결하는 것과 관계가 없다면, 이를 도메인 객체로 구현하는 것은 쓸데없는 작업이기 때문이다.
도메인 개념 <-> 도메인 모델 <-> 도메인 객체
소프트웨어 이용자가 처한 세계는 항상 같은 상태로만 존재하지 않는다. 이럴 때 도메인 객체가 도메인 모델을 잘 반영하고 있다면 도메인의 변화를 코드로 쉽게 옮길 수 있다.
이렇듯 도메인 개념과 도메인 객체는 도메인 모델을 통해 연결되며, 서로 영향을 주고받는 반복적 개발로 실현된다.
도메인 주도 설계는 2003년에 처음 제안됐지만, 비교적 최근에야 주목받고 있다. 이유는 무엇일까?
이전에는 서비스를 하루라도 빨리 출시하는 것을 중요하게 생각했다. 그래서 모델링에 중점을 두어 개발 극초기에 비용이 들어가는 도메인 주도 설계는 기민하지 못한 개발 기법으로 오해를 받고 기피하게 되었다.
그러나 소프트웨어는 항상 진화하는 존재다. 개발 극초기 잠깐 동안의 개발 속도를 우선시한 소프트웨어는 유연성이 떨어지며 변화에 대응하기 어렵다.
도메인 주도 설계는 도메인에 주목해 요구사항 분석부터 설계, 개발에 이르기까지 소프트웨어 개발 과정에 상호 작용이 필요하다. 이러한 도메인 주도 설계는 변화에 대응해 소프트웨어를 수정할 때 진정한 가치가 드러난다.
지금 당장 동작하는 프로그램을 만드는 것은 어렵지 않다. 하지만 앞으로도 계속 동작할 프로그램을 만들기는 어렵다. 시스템을 장기적으로 운영하기 원한다면 도메인 주도 설계를 익혀야 한다.