해당 포스팅은 최범균 작가님의 도메인 주도 개발 시작하기 (P.22~29)를 읽고 정리한 글입니다.
도메인이란?
도메인이란 소프트웨어로 해결하고자 하는 문제 영역을 의미한다. 예를 들어 온라인 서점이 있다. 온라인 서점 소프트웨어는 온라인으로 책을 판매하는데 필요한 상품 조회, 구매, 결제, 배송 추적 등의 기능을 제공해야 한다.
한 도메인은 다시 하위 도메인으로 나눌 수 있다. 온라인 서점 도메인은 주문, 배송, 정산 등 여러 하위 도메인으로 분리할 수 있다.
한 하위 도메인은 다른 하위 도메인과 연동하여 완전한 기능을 제공한다. 예를 들어 고객이 물건을 구매하면 주문, 결제, 배송, 혜택 하위 도메인의 기능이 엮이게 된다.
특정 도메인을 위한 소프트웨어라고 해서 도메인이 제공해야할 모든 기능을 직접 구현하는 것은 아니다. 일부 기능은 자체 시스템으로 구현하고, 나머지 기능은 외부 업체의 시스템을 사용한다.
도메인마다 고정된 하위 도메인이 존재하는 것은 아니며 하위 도메인을 어떻게 구성할지 여부는 상황에 따라 달라지게 된다.
도메인 전문가와 개발자 간 지식 공유
온라인 홍보, 정산, 배송 등 각 영역에는 전문가가 있다. 이들 전문가는 해당 도메인에 대한 지식과 경험을 바탕으로 본인들이 원하는 기능 개발을 요구한다. 개발자는 이런 요구사항을 분석하고 설계하여 코드를 작성하며 테스트하고 배포한다.
이 과정에서 요구사항은 첫 단추와 같다. 왜냐하면 요구사항을 제대로 이해하지 않으면 쓸모없거나 유용함이 떨어지는 시스템을 만들기 때문이다. 요구사항을 잘못 이해하면 변경하거나 다시 만들어야 할 코드가 많아지고 경우에 따라 소프트웨어, 즉 제품을 만드는 데 실패하거나 일정이 크게 밀리기도 한다.
해당 문제를 해결하기 위한 간단한 방법은 개발자와 전문가가 직접 대화를 하는 것이다. 중간 전달자가 많아지게 되면 정보가 왜곡되고 손실이 발생한다. 또한 이해관계자와 개발자도 도메인 지식을 갖춰야 한다. 제품 개발과 관련된 도메인 전문가, 관계자, 개발자가 같은 지식을 공유하고 직접 소통할수록 도메인 전문가가 원하는 제품을 만들 가능성이 높아진다.
"Garbage In, Garbage Out"
개발자가 도메인 전문가와 직접 소통할수록 요구사항이 변질될 가능성이 줄지만 도메인 전문가라고 해서 항상 올바른 요구사항을 주는 것은 아니다. 그래서 개발자는 요구사항을 이해할 때 왜 이런 기능을 요구하는지 또는 실제로 원하는 게 무엇인지 생각하고 전문가와 대화를 통해 진짜로 원하는 것을 찾아야 한다.
도메인 모델
도메인 모델은 특정 도메인을 개념적으로 표현한 것이다. 도메인 모델을 사용하면 여러 관계자들이 동일한 모습으로 도메인을 이해하고 도메인 지식을 공유하는 데 도움이 된다.
도메인을 이해하려면 도메인이 제공하는 기능과 도메인의 주요 데이터 구성을 파악해야 하는데, 이런 면에서 기능과 데이터를 함께 보여주는 객체 모델은 도메인을 모델링하기에 적합하다. 하지만 도메인 모델을 객체로만 모델링할 수 있는 것은 아니다. 상태 다이어그램을 이용해서 주문의 상태 전이를 모델링할 수도 있다. 즉, 도메인을 이해하는데 도움이 된다면 표현방식이 무엇인지는 중요하지 않다.
도메인 모델은 기본적으로 도메인 자체를 이해하기 위한 개념 모델이다. 개념 모델을 이용해서 바로 코드를 작성할 수 있는 것은 아니기에 구현 기술에 맞는 구현 모델이 따로 필요하다.
하위 도메인과 모델
각 하위 도메인이 다루는 영역은 서로 다르기 때문에 같은 용어라도 하위 도메인마다 의미가 달라질 수 있다. 도메인에 따라 용어의 의미가 결정되므로 여러 하위 도메인을 하나의 다이어그램에 모델링하면 안 된다. 모델의 각 구성요소는 특정 도메인으로 한정할 때 비로소 의미가 완전해지기 때문에 각 하위 도메인마다 별도로 모델을 만들어야 한다.
요즘 들어 개발자로 살아남기 위해서는 기술적으로 높은 퍼포먼스를 내는 것도 중요하지만, 그보다 더 중요한 것은 내가 속한 도메인에 대한 깊은 이해와, 소프트웨어를 통해 해결해야 할 문제를 정확히 파악한 뒤 이를 기술적으로 효과적으로 구현하는 일이라는 것을 깨달았다.
'📚 개발자의 서재 > 도메인 주도 개발 시작하기' 카테고리의 다른 글
[DDD] 아키텍처 개요 -1 (0) | 2025.04.21 |
---|---|
[DDD] 도메인 모델 시작하기 -5 (0) | 2025.04.20 |
[DDD] 도메인 모델 시작하기 -4 (0) | 2025.04.19 |
[DDD] 도메인 모델 시작하기 -3 (0) | 2025.04.18 |
[DDD] 도메인 모델 시작하기 -2 (0) | 2025.04.17 |