1. 도메인이란?
도메인이란 소프트웨어로 해결하고자 하는 문제 영역을 의미한다. 만약 우리가 온라인 서점을 구현하고 싶다고 해보자. 그러면 이 온라인 서점이 구현해야 할 소프트웨어의 대상, 즉 도메인이 되는 것이다.
한 도메인은 다시 하위 도메인으로 나눌 수 있다. 하위 도메인들이 서로 연동하면서 완전한 기능을 제공하는 것이다.
도메인이 제공해야 할 모든 기능을 직접 구현하는 것은 아니다. 예를 들어 결제나 배송과 같은 하위 도메인은 외부 업체의 시스템을 사용하는 방식으로 도메인을 구성할 수 있다.
2. 도메인 전문가와 개발자 간 지식 공유
개발자는 요구 사항을 바탕으로 구조를 설계하고 개발을 진행한다. 첫 단추인 요구사항 분석의 중요성은 두말할 것도 없다.
정산과 배송과 같이 각 도메인에는 전문가가 있다. 개발자는 이러한 전문가들과 직접 대화하면서 요구사항을 올바르게 이해하는 것이 중요하다. 물론 사전에 도메인 지식을 어느 정도 갖춰야 한다.
번거롭다고 느낄 수 있지만, 전문가와 관계자와 지식을 공유해야 원하는 제품을 만들 가능성이 높아진다.
3. 도메인 모델
도메인 모델 설명에 앞서, 먼저 애플리케이션의 아키텍처 구성은 다음과 같다.
영역 | 설명 |
표현 | 클라이언트의 요청을 처리하거나 정보를 보여준다. 여기서 클라이언트는 사용자 또는 외부 시스템이다. |
응용 | 클라이언트가 요청한 기능을 실행한다. 업무 로직을 직접 구현하지 않으며 도메인 계층을 조합해서 기능을 실행한다. |
도메인 | 시스템이 제공할 도메인 규칙을 제공한다. |
인프라스트럭처 | 데이터베이스나 메시징 시스템과 같은 외부 시스템과의 연동을 처리한다. 도메인, 응용, 표현 영역은 구현 기술을 사용한 코드를 직접 만들지 않는다. 인프라 영역에서 제공하는 기능을 사용해서 필요한 기능을 개발한다. |
도메인 계층은 도메인의 핵심 규칙을 구현한다. 주문 취소는 배송 전에만 할 수 있다. 나 출고 전에 배송지를 변경할 수 있다. 와 같은 요구 사항이 도메인 규칙에 해당된다. 그리고 이런 도메인 규칙을 객체 지향 기법으로 구현하는 패턴이 도메인 모델 패턴이다.
4. 엔티티와 밸류
도메인 영역에는 엔티티와 밸류가 존재한다.
엔티티
엔티티는 테이블가 매핑되어 있는 객체를 말한다. 엔티티의 가장 큰 특징은 식별자를 가진다는 것이다. 이 식별자는 엔티티 객체마다 서로 다른 값을 가진다. 위의 그림에서는 Order가 엔티티이고, 식별자는 주문번호가 되겠다.
식별자는 변하지 않고 고유하기 때문에, 두 엔티티 객체의 식별자가 서로 같으면 두 엔티티는 같다고 판단할 수 있다. 그에 맞춰 equals()와 hashCode() 메서드를 적절하게 구현하자.
밸류
응집도 높은 필드들을 모아 새로운 타입으로 정의한 것을 밸류 타입이라고 부른다. 가령 도시, 번지, 우편 번호 세 개의 필드를 Address로 묶어서 사용할 수 있다. 해당 타입을 사용하더라도 테이블에 영향을 주지 않는다. (아무리 밸류 타입이 많아져도 하나의 Order 테이블만 존재한다는 의미이다.)
밸류 타입을 선언할 때 불변으로 설계하는 것이 좋다. 불필요하게 setter를 열어놓으면 어디서든 접근할 수 있기 때문에 잘못 사용될 가능성이 존재한다. 따라서 생성자를 통해서만 값을 설정할 수 있도록 하고, 변경이 필요하면 새로운 객체를 생성하는 방법을 고려하자.
추가로 setter라는 이름도 애매하다. 그 대신 changePassword와 같이 직관적인 메서드 이름을 사용하자.
5. 도메인 용어와 유비쿼터스 언어
public OrderState {
STEP1, STEP2, STEP3, STEP4, STEP5, STEP6
}
public OrderState {
PAYMENT_WAITING, PREPARING, SHIPPED, DELEVERING, DELIVERY_COMPLETED
}
이처럼 명확한 이름은 코드의 가독성이 높아지고 버그도 줄어든다는 장점을 지닌다. 개발자뿐만 아니라 전문가, 관계자들 간에 공통의 언어를 규정하고 사용하자. 시간이 흘러 도메인 이해가 높아지면 그에 걸맞게 이름을 재정의하면 더더욱 좋다.
'개발 도서 및 강의 > 도메인 주도 개발 시작하기' 카테고리의 다른 글
7장 도메인 서비스 (0) | 2023.03.24 |
---|---|
6장 응용 서비스와 표현 영역 (0) | 2023.03.24 |
4장 리포지터리와 모델 구현 (0) | 2023.03.17 |
3장 애그리거트 (1) | 2023.03.17 |
2장 아키텍처 개요 (0) | 2023.03.17 |