일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- ddd
- springboot
- JPA
- Redis
- 알고리즘
- spring security
- dataframe
- series
- pandas
- 데이터 flow
- 비트마스크
- 위상정렬
- 헥사고날 아키텍처
- 파이썬
- 자바
- 세그먼트 트리
- UML
- 포트앤어댑터 아키텍처
- disjoint set
- 이펙티브 자바
- 백준
- dfs
- 다익스트라
- equals
- DP
- BFS
- docker
- 문자열
- 스프링
- java
- Today
- Total
코딩못하는사람
1.도메인 모델 시작하기 본문
1.1 도메인이란?
온라인 서점을 개발자에 입장에서 바라보게 되면 온라인 서점은 우리가 소프트웨어를 통해 구현해야 할 대상이 된다.
책 한권을 판매하기 위해 필요한 상품 조회, 구매, 결제, 배송 추적등의 기능을 제공해야 하는데, 이렇게 해결하고자 하는 문제 영역을 도메인(Domain)이라고 한다.
한 도메인은 다시 하위 여러 도메인으로 나뉜다. 주문의 하위 도메인은 고객의 주문을 처리하고, 혜택의 하위 도메인은 쿠폰과 할인같은 서비스를 제공할 것이고, 배송 하위 도메인은 구매한 상품을 전달하는 일련의 과정을 처리할 것이다.
도메인마다 고정된 하위 도메인이 존재하는 것은 아니다. 또한, 하위 도메인을 어떻게 구성할지 여부는 상황에 따라 달라진다.
또, 특정 도메인을 위한 소프트웨어라고 해서 도메인이 제공해야 할 모든 기능을 직접 구현하진 않는다.
하위 도메인을 어떻게 구성할지는 필요한 기능에 따라서 달라지게 된다.
1.2 도메인 전문가와 개발자 간 지식공유
개발자와 도메인 전문가 사이의 협업에서 요구사항을 올바르게 이해하는 것이 중요하다.
요구사항을 올바르게 이해하려면 개발자와 도메인 전문가가 직접 대화하는 것이 가장 쉽다. 사이에 전달자가 많을수록 정보의 왜곡과 손실이 생기게 되고 변질이 일어나게 된다.
더 나아가 원하는 제품을 만들기 위해 개발자도 도메인 지식을 갖추는 것이 중요하다.
"Garbage in, Garbage out" - 잘못된 값이 들어가면 잘못된 결과가 나온다.
개발자와 도메인 전문가가 직접 소통할수록 요구사항 변질이 줄지만, 항상 올바른 요구사항을 주는것은 아니다.
도메인 전문가가 소프트웨어를 기준으로 요구사항을 맞출때가 있기 때문에 (ex admin 페이지 등) 사전 협의에서 왜 이런기능을 요구하는지 실제로 원하는게 무엇인지 논의를 통해 진짜로 원하는 것을 찾아가는것이 중요하다.
1.3 도메인 모델
도메인 모델은 특정 도메인을 개념적으로 표현한 것이다.
도메인 모델을 사용하면 여러 관계자들이 동일한 모습으로 도메인을 이해하고 도메인 지식을 공유하는데 도움이 된다.
위 사진은 객체를 이용한 도메인 모델이다. 도메인을 이해할때 제공하는 기능과 주요 데이터들을 함께 보면 이해가 쉬운데, 객체 모델은 두가지를 같이 제공해준다는 장점을 가지고 있다.
하지만 객체로만 도메인 모델링이 가능한 것은 아니다.
관계가 중요한 도메인이라면 그래프를, 계산 규칙이 중요하다면 수학공식을 활용해서 도메인을 만들 수 있다.
중요한 것은 도메인을 이해하는데 도움이 되는 방식으로 모델링하는 것이다.
도메인 모델은 도메인 이해를 위한 '개념 모델'이지만, 바로 코드를 작성할 수 있는 '구현 모델'은 아니다.
객체 기반 모델을 사용했다면 구현 모델을 객체지향 언어를 이용해 개념모델에 가깝게 구현할 수 있을 것이다.
도메인은 다수의 하위 도메인으로 구성된다. 각 하위 도메인마다 다루는 영역이 다르기 때문에 같은 용어라도 의미가 달라질 수 있다. 판매 '상품'의 상품과 배송'상품'의 상품은 각 도메인에서 필요로 하는 저옵가 다르게 될것이다.
따라서 여러 하위 도메인을 하나의 다이어그램에 모델링하면 도메인을 제대로 이해하는데 방해가 될 수 있다.
각 하위 모데인마다 별도로 모델을 만들도록 하자.
1.4 도메인 모델 패턴
일반적인 애플리케이션 아키텍처
표현: 사용자의 요청을 처리하고 정보를 보여준다.
응용: 사용자가 요청한 기능을 실행한다. 업무로직을 구현하지 않고 도메인 계층을 조합해서 기능 실행
도메인: 시스템이 제공할 도메인 규칙을 구현
인프라스트럭처: DB나 메시징 시스템과 같은 외부 시스템과의 연동을 처리
도메인 모델은 보통 두가지 뜻을 가지는데
1.도메인 자체를 이해하는데 필요한 개념모델
2.도메인 모델 패턴 (아키텍쳐 중 도메인 계층을 객체지향기법으로 구현하는 패턴)
코드 예시로 Order와 OrderState를 가지고 배송지 변경이 가능한 상태인지에 대한 메서드를 구현한다.
OrderState의 상태만 가지고 판단을 할 수 있다면 OrderState에서, Order 클래스의 다른 정보까지 필요하다면 Order에서 판단하도록 구현한 코드를 예시로 든다.
주용한 점은, 주문과 관련된 중요 로직을 도메인 모델인 order, orderstate에서 구현한다는 점이다. '핵심 로직을 구현한 코드는 도메인 모델에만 위치하기 때문에 규칙이 바뀌거나 확장해야 할 때 다른 코드에 영향을 줄일 수 있다.
개념모델은 순수하게 문제를 분석한 결과물. DB,트랜잭션 처리, 성능, 구현 기술과 같은 것을 고려하고 있지 않음.
프로젝트 처음부터 완벽한 도메인을 표현하는 모델을 시도할 수 있지만 쉽지 않고, 도메인 지식이 늘어나면서 보완하거나 변경할일이 생긴다. 따라서 완벽한 개념 모델을 만들기보다 개요를 알 수 있는 수준으로 개념모델을 작성해 윤곽을 잡고, 구현하는 과정에서 개념모델 to 구현모델로의 점진적 발전 필요.
1.5 도메인 모델 도출
도메인 모델을 점진적으로 만들어나가는 과정 예시
40p 점점 구체화 되는 메서드명
문서화는 지식의 공유를 위함이다. 실제 소프트웨어를 분석하며 코드를 모두 보는것 보다 전반적인 기능 목록이나 모듈 구조, 빌드 과정은 정리한 문서를 참조하는 것이 전반을 이해하는데 도움이 된다. 전체 구조에서 더 깊게 이해가 필요한 부분을 코드로 분석하면 된다.
도메인 지식이 잘 묻어나도록 코드를 작성하지 않으면 코드의 동작과정은 이해해도 도메인 관점에서 이해하는데 힘들 수 있다. 단순히 보기 좋은 코드가 아닌 도메인을 잘 표현하는 코드를 짜야한다.
1.6 엔티티와 벨류
요구사항에서 도출한 도메인은 크게 엔티티와 밸류로 구분.
엔티티와 벨류를 제대로 구분해야 올바르게 설계가 가능하기 때문에 차이를 명확하게 이해해야 한다.
엔티티
엔티티의 가장 큰 특징은 식별자를 가진다(고유하고 변하지 않는).
ex) 주문(order) 도메인의 주문. 주문번호(orderNumber)를 가지고 있는데, 각 주문 마다 서로 다름
엔티티의 식별자 생성시점
- 특정 규칙에 따라 생성
- UUID나 Nano ID 같은 고유 식별자 생성기 사용
- 직접 입력
- 일련번호 사용(시퀀스나 DB 칼럼 자동증가)
자동증가 칼럼은 DB테이블에 데이터를 삽입해야 비로소 값을 알 수 있다(엔티티를 생성할 때 식별자를 전달 불가)
밸류타입
밸류타입의 장점이 많구나.
'DDD > 도메인 주도 개발 시작하기' 카테고리의 다른 글
9.도메인 모델과 바운디드 컨텍스트 (0) | 2022.10.27 |
---|---|
2.아키텍처 개요 (0) | 2022.09.03 |