1. 도메인 주도 설계
Domain-Driven Design
Eric Evans
5장. 소프트웨어에서 표현되는 모델(일부)
아꿈사
http://cafe.naver.com/architect1
안명환
homepage: http://eritaka.net
twitter: @eritakas
2. 소프트웨어에서 표현되는 모델
MODEL-DRIVEN
DESIGN
모델을 표현
VALUE
ENTITY SERVICE MODULE
OBJECT
• 객체의 의미에 따른 모델을 구분한다
3. 연관관계
• 현실세계의 두 사물간의 관계
– 다대다(*:*) 관계가 흔하다
– 애초부터 양방향(bidirection)인 경우가 많다
• 현실세계를 그대로 모델링하면…
– 구현과 유지보수가 복잡해진다
– 해당 관계의 특성이 드러나지 않는다
• 결론: 가능한 한 관계를 제약하자!
4. 연간관계 간소화 방법
1. 탐색 방향을 부여한다
2. 한정자(qualifier)를 추가해서 다중성
(multiplicity)을 줄인다
3. 중요하지 않은 연관관계를 제거한다
• 요구사항을 분석하여 설계를 단순하게 정제
5. 1. 탐색 방향을 부여한다
• 조지 워싱턴이 대통령이었던 나라가 어디
입니까?
• 미국의 대통령은 누구인가요?
국가 국가
대통령 대통령
* *
사람 사람
6. 2. 한정자를 추가하여
다중성을 줄이자
• 미국의 대통령은 누구인가요?
• 1790년에 미국의 대통령은 누구인가요?
국가 국가
기간
대통령 대통령
*
사람 사람
7. Entity
• 사전적 의미
– 존재간의 서로 구별되는 것
– 물질적 존재와는 상관없음
• Entity라는 용어가 혼란스러워도…
– DB: ERD (Entity-Relationship Model)
– J2EE: Entity Bean (실제 Entity와는 다르지만)
• 그래도 본질은 같습니다.
8. Entity가 된 에어에게…
• 내가 구매 버튼을 누르기 전에는 그는 다만
하나의 고철 덩어리에 지나지 않았다.
• 내가 전원 버튼을 눌러 주었을 때 그는 나
에게로 와서 진정 맥북에어가 되었다.
이것은 오직 나만의 사자…
9. DDD – Entity Model
• 어떤 객체를 해당 객체의 식별성으로 정의할
경우 Entity라고 한다
• Entity의 형태와 내용은 바뀔 수 있다.
• Entity의 정체성이 중요!
• 자바의 ‘==‘ 연산자와 같은 메모리 동등 비교
는 Entity와 상관없다
• 개념적 속성이므로 언어에서 제공하는 자동화
된 기능으로 대체할 수 없다.
10. Entity Modeling
• 속성이나 행위에 집중하지 말고 본질적인
식별성에 중점을 두고 정의하라.
• 즉, 클래스 정의를 단순하게 하고 생명 주
기의 연속성과 식별성에 집중하라.
class Exam
class Exam
Customer
Customer
- 고객ID Business Line
- 이름 - 고객ID
- 제품 분류 - 이름 - 제품 분류
- 평균 매출액 - 전화번호 - 평균 매출액
- 주소
Sales Contact
Sales Contact
- 영업사원
- 우선순위 - 영업사원
- 전화번호 - 우선순위
- 주소
11. Value Object
• 개념적 식별성을 갖지 않으면서 도메인의
서술적 측면을 나타내는 객체
• 모든 것에 식별성을 부여하고 Entity로 관
리한다면 복잡성이 증가
• DTO(Data Transfer Object)의 과거이름
인 Value Object와는 상관없다
12. Value Object
• 개념적 완전성을 형성해야 함
– 도메인 내에서 해당 개념을 온전히 표현해야
한다 (Whole Value Pattern)
class Exam
class Exam Customer
- 고객ID
- 이름
Customer
- 주소
- 고객ID
- 이름
- 읍면동
- 시군구
- 도
Address
- 읍면동
- 시군구
- 도
13. Value Object 설계
• Value Object는 많아지는 경향이 있으므
로 성능 최적화를 생각해야 함
• 객체를 안전하게 공유하기 위해서 불변적
(immutable)이어야 한다
• 알고리즘이 포함되어 있을 수도 있다
• 구현 예 Flyweight Pattern을 이용한 최적화
– .net 의 struct