juniors-dev-study / domain-driven-design

1 stars 0 forks source link

14장 모델의 무결성 유지 (2) #16

Closed bearics closed 3 years ago

bearics commented 3 years ago

모델의 컨텍스트 전략 선택

CONTEXT 관계 변경 상황

youngvly commented 3 years ago

CONTEXT 간의 통합

chanhyeong commented 3 years ago

CUSTOMER/SUPPLIER DEVERLOPMENT TEAM

  1. CUSTOMER 의 요구사항이 가장 중요하다
  2. upstream 이 downstream 에 관계 없이 코드를 수정하고, downstream 이 upstream 을 의식하지 않고도 작업할 수 있는 test suite 가 필요

CONFORMIST

upstream 이 원하는대로 안 해주는데 downstream 에서는 거기서 더 기능이 더 필요한 경우

  1. upstream 에서 제공하는 기능의 사용 포기 (SEPERATE WAYS)
    • 근데 이게 되나?
  2. 캡슐화, 추상화 상태가 안 좋은 등의 상태 -> downstream 의 자체적인 모델 생성
    • 번역 계층 + 유지보수 필요 (ANTICORRUPTION LAYER)
  3. (CONFORMIST) 품질이 괜찮다면 독립적인 모델을 포기하고 upstream 의 모델을 무조건 따름
    • BC 간의 번역 복잡도 제거
    • 설계가 upstream 에 속박되고, 이상적인 모델은 못 만들지만 통합은 단순해짐
    • SUPPLIER 와 UL 공유

ANTICORRUPTION LAYER

service model -> dao model 변환 개념인가?

외부 시스템을 모델 내에 단일 컴포넌트로 표현하는건 불가능
모델 관점에서 응집력있는 책임을 맡는 여러 SERVICE 를 사용하는게 최선

FACADE

하위 시스템에 대한 클라이언트의 접근을 단순화, 더 쉽게 하위 시스템을 사용할 수 있게 만드는 인터페이스 다른 시스템의 모델에 따라 엄격하게 작성해야 함

ADAPTER

다른 프로토콜을 클라이언트에서 사용하게 해주는 wrapper 클라이언트에서 ADAPTER 에 메시지를 전송하면 응답이 변환되어 adaptee 로 전송됨

Translator

ADAPTER 가 하는 일은 요청 방법을 파악하는 것 개념 객체나 데이터의 실제 변환. 번역기는 ADAPTER 에 속함, 아무런 상태가 필요하지 않음 필요할 때 인스턴스화 되는 가벼운 객체일 수도

SEPERATE WAYS

통합에는 비용이 많이 들고, 혜택이 적은 경우도 있음

middleware 나 UI layer 에 기능을 구성할 수 있지만, 로직은 공유하지 않고 번역 계층을 거쳐 최소한의 데이터만 전송

OPEN HOST SERVICE

하위 시스템 접근과 관련된 프로토콜을 일련의 SERVICE 로 정의
프로토콜을 공개해서 통합하고자 하는 모든 사람들이 해당 프로토콜을 사용할 수 있게 함
특수한 요구사항은 일회성 번역기로 프로토콜 보강 -> 공유 프로토콜을 단순하고 일관되게 유지

PUBLISEHD LANGUAGE

두 BC 모델 간에 이뤄지는 번역에 필요한 공통의 언어

필요한 도메인 정보를 표현할 수 있는 문서화된 공유 언어를 공통의 의사소통에 사용 이 언어로 혹은 이 언어로부터 번역 수행


변형 (Transformation): BC 에 관한 결정을 변경하는 것

SEPERATE WAYS -> SHARED KERNEL

번역 비용이 너무 클 때

방법

두 CONTEXT 에서 중복되는 부분을 포함하는 규모가 작은 하위 도메인 선택

하위 도메인에 대한 공유 모델을 만들기 위해, 각 팀에서 차출

후속

SHARED KERNEL 통합 -> 필요 없어진 번역 제거

SHARED KERNEL -> CI

SHARED KERNEL 이 확장 중일 때, BC 를 단일화

  1. CI 에 필요한 권한 부여, 동일한 방식으로 업무 수행하도록 갖춤
  2. 팀 간 인원 교류 시작
  3. 모델 간 디스틸레이션 과정을 명확하게
  4. 핵심 도메인을 SHARED KERNEL 에 시작
  5. SHARED KERNEL 이 확장 -> 통합 빈도 늘림 -> CI 에 이름
  6. SHARED KERNEL 이 기존 두 BC 를 포괄하면 CI 코드 기반을 갖춘 큰 하나의 팀 or 규모가 작은 두 팀(??)이 됨

레거시의 단계적 폐기

ANTICORRUPTION LAYER 를 거쳐 레거시와 소통하는 작은 최신 시스템으로 보완

  1. 단일 iteration 내에 레거시 특정 기능 파악
  2. ANTICORRUPTION LAYER 에 필요할 추가 사항 파악
  3. 구현
  4. 배포
  5. ANTICORRUPTION LAYER 에서 불필요한 부분 파악해 제거
  6. 레거시 모듈 삭제

OPEN HOST SERVICE -> PUBLISHED LANGUAGE

접근을 원하는 시스템이 늘어나거나 상호작용이 이해하기 어려워지는 경우

  1. 업계 표준 언어 사용
  2. 1이 안되면 CORE DOMAIN 을 다듬는다 (15장)
  3. CORE DOMAIN 을 교환 언어의 기반으로 사용하고, 표준 교환 패러다임 활용 (우리의 경우엔 OAI 가 될 듯)
  4. 협업에 참여하는 사람들에 공유
  5. 새 시스템 아키텍처가 있다면 같이 공유
  6. 각 협업 시스템을 상대로 번역
  7. 전환

PL 은 안정적이어야 함, 끊임없는 리팩토링을 하며 호스트 모델을 자유롭게 변경 가능
교환 언어와 호스트 모델을 동일하게 보면 안됨