단의 개발 블로그
도메인 본문
해당 내용은 도메인 도메인 주도 개발 시작하기 책 내용을 바탕으로 정리한 내용입니다.
도메인이란?
쇼핑몰 앱에서 물건을 구입할 때 리뷰와 평점을 보면서 어떤 상품일지 가늠한다. 할인, 적립금 혹은 나중에 사기 위해 장바구니에 담아두기도 하고 바로 구매하기도 한다.
개발자 관점에서 쇼핑몰 애플리케이션은 구현해야 될 대상이 된다. 상품 조회, 구매, 결제, 배송, 장바구니 등 기능을 제공하며 쇼핑몰은 우리가 해결하고자 하는 문제의 영역으로 인식되며 이를 도메인이라고 한다.
도메인은 서로 엮여 완전한 기능을 제공한다. 특정 도메인을 위한 소프트웨어라고 해서 모든 기능을 직접 구현하여 제공하지 않는다. 예를 들어 배송 시스템은 외부 배송 시스템 업체를 사용하며, 배송 추적 정보를 제공하는데 필요한 기능만 일부 연동한다. 결제 시스템도 직접 구현하지 않고 PG사 API를 이용하여 결제를 구현한다.
도메인 전문가와 개발자
온라인 쇼핑몰 개발에는 각 영역마다 해당 도메인 전문가로 구성된다. 이들은 도메인 지식과 경험을 바탕으로 원하는 기능을 요구한다. 개발자는 이 요구사항을 이해하고 분석하여 시스템을 설계하여 배포한다. 만약 개발자가 엉뚱하게 이해해서 코드를 잘못 작성하게 되면 올바르게 수정하는데 더 오랜 시간이 걸린다. 그러므로 꼭 프로그래밍을 하기 전 요구 사항을 올바르게 이해하는 것이 가장 중요하다. 요구사항을 올바르게 이해하기에 가장 좋은 방법은 전문가와 직접 대화하는 것이다. 전파 방식으로 요구사항을 이해하면 정보가 왜곡되고 손실된다. 도메인 전문가, 관계자, 개발자가 같은 지식을 공유하고 직접 소통할 수록 좋은 도메인 설계가 된 좋은 소프트웨어가 만들어진다. ("Garbage in, Garbage out")
도메인 모델
도메인 모델은 특정 도메인을 개념적으로 표현한 것이다. 주문 도메인을 예로 들면, 온라인 쇼핑몰에서 주문을 하기 위해 상품을 선택하고 배송지를 입력한다. 선택한 상품의 가격을 입력하여 계산하고, 결제 수단을 선택해 주문을 완료한다. 만약 배송 전 이라면 배송지 주소를 변경하거나 주문을 취소할 수도 있다. 이를 위한 도메인 모델은 아래와 같다.

도메인 모델은 꼭 객체로만 모델링하지 않는다. 여러 다이어 그램을 이용하여 모델링도 가능하다. 아래는 주문의 상태 전이를 모델링 한 예시이며 해당 다이어 그램을 통해서 상품 준비 중 상태에서 주문을 취소하면 결제 취소가 함께 이루어 진다는 것을 알 수 있다.

도메인 모델 패턴
일반적인 애플리케이션의 아키텍처는 아래와 같이 나뉜다.
| 영역 | 설명 |
| 사용자 인터페이스 또는 표현 (Presentation) |
사용자의 요청을 처리하고 사용자에게 정보를 보여준다. 사용자는 소프트웨어를 사용하는 사람 뿐만 아니라 외부 시스템일 수도 있다. |
| 응용 (Application) |
사용자가 요청한 기능을 실행한다. 업무 로직을 직접 구현하지 않으며 도메인 계층을 조합해서 기능을 실행한다. |
| 도메인 (Domain) |
시스템이 제공할 도메인 규칙을 구현한다. |
| 인프라스트럭처 (Infrastructure) |
데이터베이스나 메시징 시스템과 같은 외부 시스템과의 연동을 처리한다. |
도메인 계층은 도메인의 핵심 규칙을 구현한다. 주문 도메인의 경우 '출고 전에 배송지를 변경할 수 있다'라는 규칙과 '주문 취소는 배송 전에만 할 수 있다'라는 규칙을 구현한 코드가 도메인 계층에 위치한다. 도메인 규칙을 객체 지향 기법으로 구현하는 패턴이 도메인 모델 패턴이다.
개념모델과 구현모델
개념 모델은 문제를 분석한 결과이다. 데이터베이스, 트랜잭션 처리, 성능, 구현 기술과 같은 것을 고려하지 않고 도메인을 표현한다. 따라서 실제 코드를 작성할 때는 개념 모델을 사용할 수 없으며, 개념모델을 구현 가능한 형태로 전환하여 사용해야 한다. 초기에 완벽하게 만드는 것은 불가능하며, 도메인 지식이 쌓이고 발전함에 따라 모델을 보완 및 변경한다.
모델 도출
도메인 주도 개발 시 도메인에 대한 이해 없이 프로그래밍을 할 수 없다. 기획서, 유스케이스, 스토리보드와 같은 요구사항과 관련된 사람들과의 회의를 통해 도메인을 이해하고, 이를 바탕으로 초안을 만들어야 프로그래밍이 가능하다. 기본작업은 모델을 구성하는 핵심 구성요소, 규칙, 기능을 찾아서 설계하는 것이다. 이 과정은 요구사항에서 시작된다.
출처
https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=291420687