Skip to content

컨트랙트

바운디드 컨텍스트의 모델은 서로 독립적이지만 바운디드 컨텍스트 자체는 독립적이지 않다.

컨텍스트는 각자 독립적으로 발전할 수 있지만 컨텍스트끼리는 서로 상호작용해야 하기 때문에, 그 사이에는 항상 접점이 생기는데 이를 컨트랙트(Contract) 라고 부른다.

바운디드 컨텍스트 간의 연동, 즉 컨트랙트에 대한 고민은 솔루션 설계에서 평가되고 다뤄져야 한다.

image

바운디드 컨텍스트간의 연관관계를 나타낸 컨텍스트 맵의 예시이다.

바운디드 컨텍스트 간의 관계는 두 컨텍스트를 작업하는 팀 간의 협력적 특성이나, 설계에 따라 달라질 수 있다. 컨트랙트가 상호작용하는 패턴은 크게 협력형 패턴 그룹사용자-제공자 패턴 그룹으로 나뉜다. 또는, 아예 협력하지 않는 분리형 노선을 채택할 수도 있다.

협력형 패턴 그룹(Cooperation)

파트너십 패턴(Partnership)

바운디드 컨텍스트 간의 연동을 ad-hoc 방식으로 조정하는 패턴으로, 한 팀이 다른 팀에게 API의 변경을 알리고 다른 팀은 그것을 충돌 없이 받아들이는 방식이다. 팀 간의 잦은 동기화와 협업이 필요하다.

공유 커널 패턴(Shared Kernel)

동일한 모델이 여러 바운디드 컨텍스트에서 사용되는 경우, 모델을 공유하여 사용할 수 있다.

공유하는 코드베이스에 대한 변경을 조율하는 데 드는 비용보다 공유하는 모델에 대한 변경을 통합할 때 드는 비용이 더 높은 경우 사용된다.

사용자-제공자 패턴 그룹(Customer-Supplier)

사용자-제공자(Customer-Supplier) 패턴 그룹은 **서비스 제공자(업스트림, Upstream)와 서비스 사용자(다운스트림, Downstream)**으로 구분된다.

순응주의자 패턴(Conformist)

다운스트림이 업스트림의 모델을 받아들이는 바운디드 컨텍스트의 관계를 순응주의자(Conformist) 패턴이라고 부른다. 이 패턴은 힘의 균형이 서비스를 제공하는 업스트림에 치우쳐 있다.

충돌 방지 계층 패턴(Anti-Corruption Layer)

힘의 균형이 업스트림 서비스로 치우쳐져있지만 다운스트림이 그것을 순응하지 않고, 충돌 방지층으로 자체 요구에 맞게 조정하는 패턴을 충돌 방지 계층 패턴이라 부른다.

다운스트림 바운디드 컨텍스트가 핵심 하위 도메인을 포함하거나, 업스트림 모델이 비효율적인 경우, 컨트랙트가 자주 변경되는 경우에 사용될 수 있다.

오픈 호스트 서비스 패턴(Open-Host Service)

오픈 호스트 서비스 패턴은 충돌 방지 계층 패턴과 반대로 사용자 대신 제공자가 내부 모델 번역을 구현한다.

이 패턴에서 제공자는 사용자를 보호하는 데 관심이 있고 힘의 균형이 사용자 측에 치우쳐 있다. 그리고구현 모델의 변경으로부터 사용자를 보호하기 위해 퍼블릭 모델과 내부 구현 모델을 분리한다.

퍼블릭 인터페이스는 자신의 유비쿼터스 언어가 아닌 연동 지향 언어(Integration-Oriented Language)를 통해 사용자의 편의를 고려한다. 다운스트림 바운디드 컨텍스트가 여러개인 경우에는 연동 모듈을 분리하여 각각 다른 버전을 동시에 노출하는 것도 가능하다.

분리형 노선(Separated Ways)

협력과 연동보다 특정 기능을 중복으로 두는 것이 더 저렴한 경우에는, 특정 도메인을 공유하더라도 서로 분리하여 개발할 수도 있는데, 그러한 방식을 분리형 노선(Separated Ways)이라 부른다.

커뮤니케이션이 힘들거나, 각 컨텍스트에서 쓰는 모델이 크게 다른경우에 분리형 노선을 선택한다.