d.d.d. 14장
TRANSCRIPT
![Page 1: D.D.D. 14장](https://reader034.vdocuments.pub/reader034/viewer/2022042715/55a0617c1a28ab372e8b47e3/html5/thumbnails/1.jpg)
도메인 주도 설계14장, 모델의 무결성 유지
2011. 9. 24, 최기원
![Page 2: D.D.D. 14장](https://reader034.vdocuments.pub/reader034/viewer/2022042715/55a0617c1a28ab372e8b47e3/html5/thumbnails/2.jpg)
ㄴ
ㄴ
제 4 부
전략적 설계
개별 객체 -> 컨텍스트
개인 : 개인 -> 팀 : 팀 정치설계 단위의 변화에 따른 전략들
14장. 모델의 무결성 유지 15장. 디스틸레이션 16장. 대규모 구조
17장. 전략의 종합
![Page 3: D.D.D. 14장](https://reader034.vdocuments.pub/reader034/viewer/2022042715/55a0617c1a28ab372e8b47e3/html5/thumbnails/3.jpg)
14장
![Page 4: D.D.D. 14장](https://reader034.vdocuments.pub/reader034/viewer/2022042715/55a0617c1a28ab372e8b47e3/html5/thumbnails/4.jpg)
1부 14장의 주요 개념
![Page 5: D.D.D. 14장](https://reader034.vdocuments.pub/reader034/viewer/2022042715/55a0617c1a28ab372e8b47e3/html5/thumbnails/5.jpg)
![Page 6: D.D.D. 14장](https://reader034.vdocuments.pub/reader034/viewer/2022042715/55a0617c1a28ab372e8b47e3/html5/thumbnails/6.jpg)
모델은 컨텍스트에 적용된다.
컨텍스트는 코드의 특정 부분일 수도,
개별 팀이 수행하는 업무일 수도 있다.
![Page 7: D.D.D. 14장](https://reader034.vdocuments.pub/reader034/viewer/2022042715/55a0617c1a28ab372e8b47e3/html5/thumbnails/7.jpg)
ㄴ
ㄴ
프로젝트가 작을때
객체
응집도를 높이고
결합도를 낮추자객체
객체
![Page 8: D.D.D. 14장](https://reader034.vdocuments.pub/reader034/viewer/2022042715/55a0617c1a28ab372e8b47e3/html5/thumbnails/8.jpg)
ㄴ
ㄴ
프로젝트가 커지면
객체
객체
객체
객체
객체 객체
객체객체
객체
객체
객체
객체
객체
객체
객체
객체
객체
객체
객체객체
객체
객체
객체
객체
객체
객체
객체
객체
객체
객체
객체객체
객체
객체
객체
객체객체
객체
객체
객체
객체
객체
객체
객체
객체객체
객체
객체
객체
객체
객체
객체
객체
객체
객체객체
객체
객체
객체
객체
객체 객체
객체
객체 객체
객체
객체객체
객체
객체 객체
객체
객체
객체
객체
객체
객체
객체
객체
객체
객체
객체
객체
객체
객체객체
객체
객체
객체객체
객체
객체
객체
객체
객체객
체
객체 객체객체
객체
객체
객체
객체
객체
객체
객체객체
![Page 9: D.D.D. 14장](https://reader034.vdocuments.pub/reader034/viewer/2022042715/55a0617c1a28ab372e8b47e3/html5/thumbnails/9.jpg)
ㄴ
ㄴ
모델에 맞춰 의미 있게 묶자
객체
객체 객체
객체
객체
객체
객체
객체
객체
객체
객체
객체
객체
객체
객체
객체
객체
객체
객체 객체
객체
객체
객체
객체
객체
객체
객체
객체
객체
객체객체
객체
객체객체
객체
객체
객체
객체
객체
객체
객체
객체
객체
객체
객체
객체
객체
객체
객체
객체
객체
객체
객체
객체
객체
객체
객체
객체
객체
객체
객체
객체
객체
객체
객체 객체
객체
객체 객체
객체
객체
객체
객체
객체
객체
객체
객체
객체
객체
객체
객체
객체객체
객체
객체
객체
객체객
체
객체객체
객체
객체객체
객체
객체
객체
객체
객체
객체
![Page 10: D.D.D. 14장](https://reader034.vdocuments.pub/reader034/viewer/2022042715/55a0617c1a28ab372e8b47e3/html5/thumbnails/10.jpg)
Bounded Context라 하자
객
체
객
체
객
체
객
체객
체
객
체객
체
객
체
객
체
객
체객
체객
체객
체 ㄴㄴ
객
체객
체
객
체 객
체
객
체
객
체객
체
객
체객
체객
체 객
체
객
체
객
체
객
체
객
체 객
체객
체객
체
객
체객
체
객
체객
체 객
체객
체객
체
객
체
객
체
객
체객
체
객
체
객
체객
체
객
체객
체
객
체
객
체
객
체
객
체객
체
객
체
객
체
객
체
객
체객
체
객
체 객
체
객
체
객
체
객
체객
체
객
체
객
체
객
체 객
체
객
체
객
체
객
체
객
체 객
체 객
체
객
체
객
체객
체
객
체객
체객
체
객
체객
체
객
체 객
체객
체
객
체객
체객
체객
체객
체 객
체
객
체 객
체
객
체
객
체
객
체객
체
객
체
객
체
객
체
Bounded Context 별로
명확한 의미를 부여한다.
이름을 붙인다.
Ubiqiutous language로 사용
경계를 명확히 한다.
모델에 일치시킨다.
![Page 11: D.D.D. 14장](https://reader034.vdocuments.pub/reader034/viewer/2022042715/55a0617c1a28ab372e8b47e3/html5/thumbnails/11.jpg)
ㄴ
ㄴ
응집도가 높아진다. ... 우연 응집도 -> 기능 응집도
결합도가 낮아진다. ... 내용 결합도 -> 데이터 결합도
개발자는 Context만 신경 쓰면 된다.
Context의 통합에는 번역이 필요하다.
![Page 12: D.D.D. 14장](https://reader034.vdocuments.pub/reader034/viewer/2022042715/55a0617c1a28ab372e8b47e3/html5/thumbnails/12.jpg)
화물 예제 – 1/2
![Page 13: D.D.D. 14장](https://reader034.vdocuments.pub/reader034/viewer/2022042715/55a0617c1a28ab372e8b47e3/html5/thumbnails/13.jpg)
ㄴ
ㄴ
화물 예약 컨텍스트 (팀)
화물 추적 컨텍스트 (팀)
화물 운항 컨텍스트 (팀)
팀별로 Bounded Context를 명확히 한다.
인터페이스를 맞춘다.
코드를 공유하지 않는다.
Context의 경계는 번역 프로그램을 따로 만든다.
![Page 14: D.D.D. 14장](https://reader034.vdocuments.pub/reader034/viewer/2022042715/55a0617c1a28ab372e8b47e3/html5/thumbnails/14.jpg)
ㄴ
ㄴ
결합할 때의 문제점
중복된 개념서로 다른 말을 하고 있지만 같은 의미
허위 동족 언어서로 같은 말을 하고 있지만 다른 의미
![Page 15: D.D.D. 14장](https://reader034.vdocuments.pub/reader034/viewer/2022042715/55a0617c1a28ab372e8b47e3/html5/thumbnails/15.jpg)
![Page 16: D.D.D. 14장](https://reader034.vdocuments.pub/reader034/viewer/2022042715/55a0617c1a28ab372e8b47e3/html5/thumbnails/16.jpg)
ㄴ
ㄴ
개발이 진행됨에 따라
Context의 의미가 모델과 달라진다.
Context내에서 중복된 개념이 생긴다.
Context 밖의 개념을 고려하기 시작한다.
![Page 17: D.D.D. 14장](https://reader034.vdocuments.pub/reader034/viewer/2022042715/55a0617c1a28ab372e8b47e3/html5/thumbnails/17.jpg)
ㄴ
ㄴ
지속적인 통합을 한다.
개념의 통합Ubiquitous Language를 지속적으로 사용한다.“조지 팀에서 만든 것이 변경될 예정이므로 그에 따라 저희 것도 변경할 예정입니다.”
“운송망 모델이 바뀌고 있습니다. 그러니 저희도 예약 컨텍스트에 대한 번역기를 변경
할 예정입니다.”
구현의 통합단계적이고 재생 가능한 병합/빌드
TDD
![Page 18: D.D.D. 14장](https://reader034.vdocuments.pub/reader034/viewer/2022042715/55a0617c1a28ab372e8b47e3/html5/thumbnails/18.jpg)
![Page 19: D.D.D. 14장](https://reader034.vdocuments.pub/reader034/viewer/2022042715/55a0617c1a28ab372e8b47e3/html5/thumbnails/19.jpg)
ㄴ
ㄴ
Context Map
컨텍스트 간의 관계도(지도)Context의 이름을 쓴다.
Context간의 관계를 표현한다.
현재 상태 그대로의 상황을 표현한다. 유지한다.
모든 이들이 경계가 어디에 위치하는지 알 수 있도
록 공표한다.
Map을 보면 바꾸고 싶어진다. 심사숙고 해야 한다.
![Page 20: D.D.D. 14장](https://reader034.vdocuments.pub/reader034/viewer/2022042715/55a0617c1a28ab372e8b47e3/html5/thumbnails/20.jpg)
화물 예제 – 2/2
![Page 21: D.D.D. 14장](https://reader034.vdocuments.pub/reader034/viewer/2022042715/55a0617c1a28ab372e8b47e3/html5/thumbnails/21.jpg)
ㄴ
ㄴ
예제) 화물... ㅡㅡ;
화물 예약 팀
화물 추적 팀
화물 운항 일정 관리 팀
팀별로 Bounded Context를 명확히 한다.
인터페이스를 맞춘다.
코드를 공유하지 않는다.
Context의 경계는 번역 프로그램을 따로 만든다.
![Page 22: D.D.D. 14장](https://reader034.vdocuments.pub/reader034/viewer/2022042715/55a0617c1a28ab372e8b47e3/html5/thumbnails/22.jpg)
ㄴ
ㄴ
예제, 화물 ㅡㅡ;;
예약 Context
일정
화물 항로 명세
구간
![Page 23: D.D.D. 14장](https://reader034.vdocuments.pub/reader034/viewer/2022042715/55a0617c1a28ab372e8b47e3/html5/thumbnails/23.jpg)
ㄴ
ㄴ
Route Specification -> locationCodes
Itinerary <- Node ID의 List
![Page 24: D.D.D. 14장](https://reader034.vdocuments.pub/reader034/viewer/2022042715/55a0617c1a28ab372e8b47e3/html5/thumbnails/24.jpg)
Route Specification -> locationCodes
![Page 25: D.D.D. 14장](https://reader034.vdocuments.pub/reader034/viewer/2022042715/55a0617c1a28ab372e8b47e3/html5/thumbnails/25.jpg)
Node ID의 List -> Itinerary
배 항해 ID
![Page 26: D.D.D. 14장](https://reader034.vdocuments.pub/reader034/viewer/2022042715/55a0617c1a28ab372e8b47e3/html5/thumbnails/26.jpg)
![Page 27: D.D.D. 14장](https://reader034.vdocuments.pub/reader034/viewer/2022042715/55a0617c1a28ab372e8b47e3/html5/thumbnails/27.jpg)
![Page 28: D.D.D. 14장](https://reader034.vdocuments.pub/reader034/viewer/2022042715/55a0617c1a28ab372e8b47e3/html5/thumbnails/28.jpg)
컨텍스트 간에는 의사소통이 활발하지 않다.
번역기는 TDD를 해야 한다.
![Page 29: D.D.D. 14장](https://reader034.vdocuments.pub/reader034/viewer/2022042715/55a0617c1a28ab372e8b47e3/html5/thumbnails/29.jpg)
모델을 컨텍스트화 하는
하나의 예시
코끼리 통일하기
![Page 30: D.D.D. 14장](https://reader034.vdocuments.pub/reader034/viewer/2022042715/55a0617c1a28ab372e8b47e3/html5/thumbnails/30.jpg)
맙소사! 코끼리는
벽처럼 생겼네!
알겠다. 코끼리는
뱀같이 생겼어.
정말 이상한 동물일세.
정말 평범해. 코끼리는
꼭 나무 같이 생겼어
알겠다. 코끼리는
밧줄같이 생겼어!
![Page 31: D.D.D. 14장](https://reader034.vdocuments.pub/reader034/viewer/2022042715/55a0617c1a28ab372e8b47e3/html5/thumbnails/31.jpg)
![Page 32: D.D.D. 14장](https://reader034.vdocuments.pub/reader034/viewer/2022042715/55a0617c1a28ab372e8b47e3/html5/thumbnails/32.jpg)
상상력과 지속적인(아마도 열띤) 토론을 거친
후
![Page 33: D.D.D. 14장](https://reader034.vdocuments.pub/reader034/viewer/2022042715/55a0617c1a28ab372e8b47e3/html5/thumbnails/33.jpg)
코끼리를 한쪽 끝에는 밧줄이 있고 다른 쪽에는 뱀이 있
는, 나무기둥이 떠받치고 있는 벽으로 간주하는 것이 적합할
지도 모른다.
![Page 34: D.D.D. 14장](https://reader034.vdocuments.pub/reader034/viewer/2022042715/55a0617c1a28ab372e8b47e3/html5/thumbnails/34.jpg)
코끼리는 동물의 특성을 가졌을꺼야
![Page 35: D.D.D. 14장](https://reader034.vdocuments.pub/reader034/viewer/2022042715/55a0617c1a28ab372e8b47e3/html5/thumbnails/35.jpg)
Context(팀)간의 관계 패턴
2부
![Page 36: D.D.D. 14장](https://reader034.vdocuments.pub/reader034/viewer/2022042715/55a0617c1a28ab372e8b47e3/html5/thumbnails/36.jpg)
팀 사이에 모델 공유를 사용하는 패턴
![Page 37: D.D.D. 14장](https://reader034.vdocuments.pub/reader034/viewer/2022042715/55a0617c1a28ab372e8b47e3/html5/thumbnails/37.jpg)
갑/을 관계의 팀
단방향 의존
![Page 38: D.D.D. 14장](https://reader034.vdocuments.pub/reader034/viewer/2022042715/55a0617c1a28ab372e8b47e3/html5/thumbnails/38.jpg)
갑/을 관계의 팀에서
„을‟을 전적으로 신뢰
![Page 39: D.D.D. 14장](https://reader034.vdocuments.pub/reader034/viewer/2022042715/55a0617c1a28ab372e8b47e3/html5/thumbnails/39.jpg)
갑/을 관계의 팀에서
„을‟을 어느 정도만 신뢰
![Page 40: D.D.D. 14장](https://reader034.vdocuments.pub/reader034/viewer/2022042715/55a0617c1a28ab372e8b47e3/html5/thumbnails/40.jpg)
갑/을 관계의 팀에서
을을 버린 갑.
![Page 41: D.D.D. 14장](https://reader034.vdocuments.pub/reader034/viewer/2022042715/55a0617c1a28ab372e8b47e3/html5/thumbnails/41.jpg)
컨텍스트
컨텍스트 컨텍스트 컨텍스트
번역기번역기 번역기
![Page 42: D.D.D. 14장](https://reader034.vdocuments.pub/reader034/viewer/2022042715/55a0617c1a28ab372e8b47e3/html5/thumbnails/42.jpg)
컨텍스트
컨텍스트 컨텍스트 컨텍스트
번역기
![Page 43: D.D.D. 14장](https://reader034.vdocuments.pub/reader034/viewer/2022042715/55a0617c1a28ab372e8b47e3/html5/thumbnails/43.jpg)
번역기 대신
(XML과 같은) 도메인 정보를 표현할 수 있는 공유 언어를
사용 하는 관계
![Page 44: D.D.D. 14장](https://reader034.vdocuments.pub/reader034/viewer/2022042715/55a0617c1a28ab372e8b47e3/html5/thumbnails/44.jpg)
변형 : 리펙토링
. Separate ways -> Shared Kernel
. Shared Kernel -> Continous Integration
. 레거시 시스템의 단계적 폐기
. Open Host Service -> Published Language
![Page 45: D.D.D. 14장](https://reader034.vdocuments.pub/reader034/viewer/2022042715/55a0617c1a28ab372e8b47e3/html5/thumbnails/45.jpg)
병합
![Page 46: D.D.D. 14장](https://reader034.vdocuments.pub/reader034/viewer/2022042715/55a0617c1a28ab372e8b47e3/html5/thumbnails/46.jpg)
병합
![Page 47: D.D.D. 14장](https://reader034.vdocuments.pub/reader034/viewer/2022042715/55a0617c1a28ab372e8b47e3/html5/thumbnails/47.jpg)
폐기
레거시 시스템
![Page 48: D.D.D. 14장](https://reader034.vdocuments.pub/reader034/viewer/2022042715/55a0617c1a28ab372e8b47e3/html5/thumbnails/48.jpg)
공식화
![Page 49: D.D.D. 14장](https://reader034.vdocuments.pub/reader034/viewer/2022042715/55a0617c1a28ab372e8b47e3/html5/thumbnails/49.jpg)
질문?