-
Notifications
You must be signed in to change notification settings - Fork 0
Description
#14. 모델의 무결성 유지
모델과 다른 모델과의 관계가 지닌 한계를 인식하고 전달하며, 선택하는 기법을 설명하는 장.
대규모 시스템의 도메인 모델을 완전 단일화 한다는 것은 타당하지 않거나, 비용대비 효과적이지 않을 것이다.
- 단일화를 추구할때 따르는 위험요소
- 한번에 많은 레거시 교체를 하려할 지도 모른다.
- 능력에 비해 조율에 드는 비용이 커서 난관에 처할지 모른다.
- 요구사항이 있는 애플리케이션에서 요건 충족을 하지못해 애플리케이션 행위를 다른모델에 두어야 할 수있다.
- 반대로, 요구사항을 단일모델로 모두 만족시키려 해서, 모델을 사용하기 어렵게 만드는 복잡한 대안으로 이어질 지도 모른다.
BOUNDED CONTEXT 제한된 컨텍스트
-
모델은 컨텍스트에 적용된다.
-
모델 컨텍스트란 모델에서 사용된 용어를 특정한 의미로 의사소통하기위한 조건의 집합이다.
-
모델이 적용되는 컨텍스트를 명시적으로 정의하라.
: 컨텍스트의 경계를 팀,애플리케이션 특정부분의 사용법, 코드기반, db스키마 같은 물리적 형태의 관점에서 명시적으로 설정하라. -
context 내에서는 모델을 논리적으로 통일된 상태로 유지하되, 경계 외부에 대한 적절성에 대해서는 신경쓰지 않아도 된다.
-
Bonded context 와 module은 다르다.
- module은 단일 모델내에 포함된 요소 구성에도 사용되고, 다른 모델의 경계를 제공하는데에도 사용된다. 개별 context에 의도를 전하는것은 아니다.
- bounded context 내 module이 만들어낸 개별 네임스페이스가 포함되면 우발적으로 발생하는 모델의 단편화를 파악하기가 어려워진다. (?)
-
예약 컨텍스트 예제
- 예약시스템 : 기준 bounded context
- 레거시 예약 관리 시스템 : 새로운 모델과 구분하기로 사전에 논의됨 / 번역 메커니즘은 bounded context 내에 존재하지 않는다.
- 홤루선 운항일전 관리 시스템 : 예약시스템과 같은 모델을 사용한다고 생각하지만, 같은 context안에 있지 않다면 코드를 공유하려해서는 안된다.
-
context 안에서 업무 진행하는 팀에서 얻는것은 모델의 일관성 등 명확함.
-
context 밖에서 업무 진행하는 팀에서 얻는것은 자유로움. (번역도 context 밖에 있음)
-
안과 밖 각각의 팀은 정보를 공유했을때 발생하는 비용과 이득의 타협점을 결정하고 ㅓ정보 공유가 잘될수있게 프로세스로 정립할 필요가 있다.
-
bounded context 안의 균열 인식
: 중복된 개념과 허위 동족언어(false cognates) 사용할경우- 허위 동족언어 : 같은 용어/객체를 사용하는 사람들이 서로 다른것을 같은것으로 이야기하고있는것.
CONTINUOUS INTEGRATION 지속적인 통합
내부적으로 균열이 발생할때 이를 빠르게 포착하고 정정할 수 있을 정도로 컨텍스트 내의 모든 작업을 빈번하게 병합해서 일관성을 유지하는것.
- 다수의 사람이 동일한 bounded context를 작업할 경우 모델이 단편화될 가능성이 높다. 단편화가 발생한 사실을 빠르게 알려줄 수 있는 자동화된 테스트와 함께 모든 코드와 그밖의 구현 산출물을 빈번하게 병합하는 프로세스를 수립하라
- 병합/빌드/테스트 프로세스를 토대로 통합된다.
- 효과적인 프로세스의 공통점
- 단계적이고 재생가능한 병합/빌드기법
- 자동화된 테스트 스위트
- 수정사항이 통합되지 않은 상태로 존재할 수 있는 시간을 적당히 짧게 유지하는 규칙
- 개념적인 통합 : 논의시에 UBIQUITOUS LANGUAGE 사용
CONTEXT MAP
서로 다른 context 간의 관계를 정의하고 프로젝트상의 모든 모델 컨텍스트를 아우르는 전체적인 뷰
프로젝트에 속한 모든 사람들은 map을 이해하고 공유해야한다.
- 프로젝트 상의 모델을 식별하고 bounded context 정의 (비객체지향적인 하위 시스템에 대한 암시적인 모델도 포함)
- Bounded context의 이름을 ubiquitous language 로 포함
- 모델과 모델이 만나는 경계지점을 서술 : Context간의 번역에 대한 윤곽을 명확하게 표시하고, context간 공유해야하는 정보를 강조
- 각 context의 현재 영역을 나타내는 지도를 작성.
- Context의 배치를 바꾸는일은 나중에!
- 예시에서 translator를 별도의 객체로 두는데, 각각의 context에서 역할을 가져가는게 낫지않나? 왜 따로있지?? 여기가 경계인가??
SHARED KERNEL 공유커널
- 두 팀간에 공유하기로한 도메인 모델의 부분집합을 명시하라. 이는 다른 팀과의 협의없이는 변경할 수 없다.
모델 요소와 연관된 코드나 db설계의 부분집합도 포함된다. - 기능 시스템을 자주 통합하라. CI보다는 적은 빈도로 통합하라. 통합할때는 양팀에서 작성한 테스트를 모두 실행하라.
- 목표는 중복을 줄이고 두 하위시스템간의 통합을 용이하게 만드는것에 있다.