Skip to content

14 | 모델의 무결성 유지 #10

@youngvly

Description

@youngvly

#14. 모델의 무결성 유지
모델과 다른 모델과의 관계가 지닌 한계를 인식하고 전달하며, 선택하는 기법을 설명하는 장.

대규모 시스템의 도메인 모델을 완전 단일화 한다는 것은 타당하지 않거나, 비용대비 효과적이지 않을 것이다.

  • 단일화를 추구할때 따르는 위험요소
    1. 한번에 많은 레거시 교체를 하려할 지도 모른다.
    2. 능력에 비해 조율에 드는 비용이 커서 난관에 처할지 모른다.
    3. 요구사항이 있는 애플리케이션에서 요건 충족을 하지못해 애플리케이션 행위를 다른모델에 두어야 할 수있다.
    4. 반대로, 요구사항을 단일모델로 모두 만족시키려 해서, 모델을 사용하기 어렵게 만드는 복잡한 대안으로 이어질 지도 모른다.

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을 이해하고 공유해야한다.

  1. 프로젝트 상의 모델을 식별하고 bounded context 정의 (비객체지향적인 하위 시스템에 대한 암시적인 모델도 포함)
  2. Bounded context의 이름을 ubiquitous language 로 포함
  3. 모델과 모델이 만나는 경계지점을 서술 : Context간의 번역에 대한 윤곽을 명확하게 표시하고, context간 공유해야하는 정보를 강조
  4. 각 context의 현재 영역을 나타내는 지도를 작성.
  5. Context의 배치를 바꾸는일은 나중에!
  • 예시에서 translator를 별도의 객체로 두는데, 각각의 context에서 역할을 가져가는게 낫지않나? 왜 따로있지?? 여기가 경계인가??

SHARED KERNEL 공유커널

  • 두 팀간에 공유하기로한 도메인 모델의 부분집합을 명시하라. 이는 다른 팀과의 협의없이는 변경할 수 없다.
    모델 요소와 연관된 코드나 db설계의 부분집합도 포함된다.
  • 기능 시스템을 자주 통합하라. CI보다는 적은 빈도로 통합하라. 통합할때는 양팀에서 작성한 테스트를 모두 실행하라.
  • 목표는 중복을 줄이고 두 하위시스템간의 통합을 용이하게 만드는것에 있다.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions