logo

도메인 모델과 퍼시스턴스 모델 분리

Domain Model과 Persistence Model 결합과 분리

domain, persistence, ddd, clean-architecture


자랑은 아니지만 여러 회사를 돌아다녀 보니, 도메인 모델과 퍼시스턴스 모델이 같다고 생각하는 개발자들이 의외로 제법 있다. 추정컨대 데이터베이스 중심으로 사고를 하다 보니 그렇게 오해하는 게 아닌가 싶다.

정론을 얘기하자면, DDD에서 도메인은 반드시 순수해야 한다. 이 말은 도메인은 아무것도 의존해선 안 된다는 것이다. 도메인에 레파지토리의 어노테이션이 선언되는 순간 도메인은 오염된다.

그래서 도메인 모델과 퍼시스턴스 모델은 분리해야 한다. (어디까지나 정론)

In conclusion, repeat after me: the Domain Model is NOT the same as the Persistence Model. Each serve a different layer with different responsibilities.

🔗 Just Stop It! The Domain Model Is Not The Persistence Model

그렇지만 실제 개발이 항상 이상적으로 흘러가진 않기에 익숙하지 않다면 보통은 처음부터 두 모델을 결합하여 개발한다. 그 이윤,

  1. 당연하게도 도메인 모델과 퍼시스턴스 모델을 분리해서 개발하면 비용이 더 많이 든다. 두 가지의 모델을 모두 만들어야 하며 또 두 모델 사이를 매핑하는 매퍼를 만들고 지속적으로 관리해야 한다. (ORM 사용 시)

  2. 도메인 모델과 퍼시스턴스 모델이 일치하는 상황이 존재하며, 초기 개발에 속도를 내야 할 상황도 있다. 그럴 땐 개발 편의를 위해 사용한다.

그런데 두 모델을 결합하여 개발하다 보면, 처음에는 문제가 없겠지만 시간이 지남에 따라 도메인이 점점 고도화되고 발전하면서 두 모델 간의 불일치가 드러나기 시작한다. 가령, 테이블을 다시 설계하거나 성능 문제로 정규화 혹은 비정규화 과정을 거치거나 극단적으로 ORM이나 데이터베이스를 바꾸거나 하는 등 결국엔 분리할 수밖에 없는 상황에 직면하게 된다.

시작을 어떻게 할지는 프로젝트 규모나 속도, 비용 등을 따져봐야겠지만 헷갈리거나 익숙지 않을 때는 두 모델을 결합하되, 이후 고도화에 맞춰 차차 분리하도록 하자.