효습
1장 도메인 모델 시작하기 본문
1.1 도메인이란?
- 도메인이란 소프트웨어로 해결하고자 하는 문제 영역이다
- 한 도메인은 다시 하위 도메인으로 나눌 수 있다
- 특정 도메인을 위한 소프트웨어라고 해서 도메인이 제공해야할 모든 기능을 직접 구현하는 것은 아니다.
- 도메인마다 고정된 하위 도메인이 존재하는 것은 아니다
- 하위 도메인을 어떻게 구성할지 여부는 상황에 따라 달라진다.
1.2 도메인 전문가와 개발자 간 지식 공유
- 요구사항을 올바르게 이해하려면 개발자와 전문가가 직접 대화해야한다.
- 개발자와 전문가 사이에 내용을 전파하는 전달자가 많을수록 정보가 왜곡디고 손실이 발생하게 되며, 개발자는 최초에 전문가가 요구한 것도 다른 무언가를 만들게 될 수 있다
1.3 도메인 모델
- 도메인 모델은 기본적으로 특정 도메인을 개념적으로 표현한 것이다
- 도메인을 이해하려면 도메인이 제공하는 기능과 도메인의 주요 데이터 구성을 파악해야하는데, 이런 면에서 기능과 데이터를 함께 보여주는 객체 모델은 도메인을 모델링하기에 적합하다.
- 상태 다이어그램을 통해서도 모델링할 수 있다
- 도메인 모델은 개념모델이기때문에 구현 기술에 맞는 구현 모델이 따로 필요하다
1.4 도메인 패턴 모델
- 일반적인 애플리케이션의 아키텍처는 표현 , 응용, 도메인,인프라스트럭처로 구성된다
영역 | 설명 |
사용자 인터페이스 또는 표현 | 사용자의 요청을 처리하고 사용자에게 정보를 보여준다. 여기서 사용자는 소프트웨어를 사용하는 사람뿐만 아니라 외부 시스템일 수도 있다. |
응용 | 사용자가 요청한 기능을 실행한다. 업무 로직을 직접 구현하지 않으며 도메인 계층을 조합해서 기능을 실행한다 |
도메인 | 시스템이 제공할 도메인 규칙을 구현한다 |
인프라스트럭처 | 데이터베이스나 메세징 시스템과 같은 외부 시스템과의 연동을 처리한다 |
1.5 도메인 모델 도출
- 도메인을 모델링할 때 기본이 되는 작업은 모델을 구성하는 핵심 구성요소, 규칙,기능을 찾는 것이다
- 이 과정을 요구사항에서 출발한다
- 도메인을 구현하다 보면 특정 조건이나 상태에 따라 제약이나 규칙이 달리 적용되는 경우가 많다
- 다른 요구사항도 확인하여 점진적으로 도메인 모델을 만들어나간다
- 요구사항 정련을 위해 도메인 전문가나 다른 개발자와 논의하는 과정을 공유하기도 한다
1.6 엔티티와 밸류
- 도메인 모델은 크게 엔티티(Entity)와 밸류(Value)로 구분할 수 있다
1.6.1 엔티티
- 엔티티의 가장 큰 특징은 식별자를 가진다는 것이다.
- 식별자는 엔티티 객체마다 고유해서 각 엔티티는 서로 다른 식별자를 갖는다 (예를 들어 주문번호)
- 엔티티의 식별자는 바뀌지 않으며 생성하고 속성을 바꾸고 삭제할 때까지 식별자는 유지된다
1.6.2 엔티티의 식별자 생성
- 식별자는 다음과 같은 방법으로 생성된다
- 특정 규칙에 따라 생성
- UUID나 Nano ID 와 같은 고유 식별자 생성기를 사용
- 값을 직접 입력
- 일련번호 사용(시퀀스나 DB의 자동 증가 칼럼 사용)
- 리포지토리는 도메인 객체를 데이터베이스에 저장할 때 사용하는 구성요소이다
1.6.3 밸류 타입
- 밸류 타입은 개념적으로 완전한 하나를 표현할 때 사용한다
- 밸류 타입을 위한 기능을 추가할 수 있다
- 의미 중심으로 코드를 작성할 수 있다
- 밸류 객체의 데이터를 변경할 때는 기존 데이터를 변경하기보다는 변경한 데이터를 갖는 새로운 밸류 객체를 생성하는 방식을 선호한다
- 밸류 타입을 불변으로 구현하는 가장 중요한 이유는 안전한 코드를 작성할 수 있다는 데 있다.
1.6.4 엔티티 식별자와 밸류 타입
- 도메인 개념처럼 도메인이 특별한 의미를 지니는 경우가 많기 때문에 식별자를 위한 밸류 타입을 사용해서 의미가 잘 드러나도록 할 수 있다
1.6.5 도메인 모델에 set 메서드 넣지 않기
- 습관적으로 작성한 set 메서드는 필드값만 변경하고 끝나기 때문에 상태 변경과 관련된 도메인 지식이 코드에서 사라지게 된다
- 또 다른 문제는 도메인 객체를 생성할 때 온전하지 않은 상태가 될 수 있다는 것이다
- 도메인 객체가 불완전한 상태로 사용되는 것을 막으려면 생성 시점에 필요한 것을 전달해 주어야 한다.
- 생성자라를 통해 필요한 데이터를 모두 받아야한다 → 생성자를 호출하는 시점에서 필요한 데이터가 올바른지 검사할 수 있다
Order order = new order(orderer,lines,shippingInfo,OrderState.PREPARING);
1.7 도메인 용어와 유비쿼터스 언어
- 도메인에서 사용하는 용어를 코드에 반영하지 않으면 그 코드는 개발자에게 코드의 의미를 해석해야 하는 부담을 준다
- 시간이 지날수록 도메인에 대한 이해가 높아지는데 새롭게 이해한 내용을 잘 표현할 수 있는 용어를 찾아내고 이를 다시 공통의 언어로 만들어 다 같이 사용한다.
'책 > 도메인 주도 개발 시작하기' 카테고리의 다른 글
6장 응용 서비스와 표현 영역 (0) | 2024.03.25 |
---|---|
5장 스프링 데이터 JPA를 이용한 조회 기능 (1) | 2024.03.25 |
4장 리포지터리 모델 구현 (2) | 2024.03.18 |
3장 애그리거트 (0) | 2024.03.18 |
2장 아키텍처 개요 (0) | 2024.03.11 |