Today I Learned

[도메인 주도 설계] 14. 모델의 무결성 유지 (1) 본문

도메인 주도 설계

[도메인 주도 설계] 14. 모델의 무결성 유지 (1)

하이라이터 2022. 3. 25. 01:22
728x90
  • 모델의 근본적인 요구사항은 모델의 각 용어가 모호하지 않고 모순되는 규칙이 없으며 내적 일관성 유지하는 것이고 이를 단일화라 한다.
  • 하지만 대규모 시스템의 도메인 모델을 완전하게 단일화한다는 것은 타당하지 않거나 비용 대비 효과적이지 않다.
  • 단일 모델로 통합하고자 할때는 다음과 같은 위험요소를 고려해야 한다.
    • 한번에 지나치게 많은 레거시를 교체해야 할 수 있다.
    • 능력이 비해 조율에 드는 비용이 너무 클 수 있다.
    • 특화된 요구사항을 완전하게 충족하지 못해 애플리케이션의 행위를 다른 곳에 둘 수 밖에 없을 수 있다.
    • 모델이 지나치게 복잡해져 사용하기 어려워질 수 있다.
  • 단일화된 모델을 유지하기 어렵다면, 모델 간의 경계와 관계를 표현해 줄 수단이 필요하다.

BOUNDED CONTEXT(제한된 컨텍스트)

  • 다수의 모델 탓에 발생하는 문제를 해결하려면 모델이 적용되는 컨텍스트를 명시적으로 정의해야 한다.
  • 컨텍스트의 경계를 팀 조직, 애플리케이션의 특정 부분에서의 사용법, 코드 기반의 데이터베이스 스키마와 같은 물리적 형태의 관점에서 명시적으로 설정해야 한다.
  • 이 경계 내에서는 모델을 일관된 상태로 유지하고 경계 바깥의 이슈 때문에 초점이 흐려져서는 안된다.
  • BOUNDED CONTEXT는 팀 구성원이 어떤 부분에서 일관성을 지녀야하고 다른 CONTEXT와 어떤 식으로 관련되어 있는 가를 명확하게 이해할 수 있게 특정 모델의 적용범위를 제한한다.
  • 예제 - 예약 컨텍스트
    • A팀은 예약 애플리케이션을 작업중이다. A팀은 모델 객체를 수정하지는 않겠지만 애플리케이션에서는 그와같은 객체를 보여주고 조작해야 한다. 모델은 애플리케이션 내에서 유효하므로 예약 애플리케이션은 구획 내에 존재한다고 볼 수 있다.
    • 예약이 완료되면 해당 예약 내역은 레거시 화물추적 시스템으로 전달돼야 한다. 새로운 모델은 레거시 모델과 구분하기로 결정했으므로 레거시 화물추적 시스템은 구획 밖에 존재한다.
    • 새로운 모델과 레거시 사이에 필요한 번역은 레거시 유지보수 팀의 몫이며, 번역 메커니즘은 모델에 의해 주도되지 않는다. 번역은 CONTEXT 밖에 있으며, 레거시 팀에서는 모델을 사용하기 위해 요청하는 것이 불가능하다.
    • B팀은 화물선 운항일정을 관리하는 모델과 애플리케이션을 개발 중이다. A팀과 B팀의 목표는 하나의 단일화된 시스템을 만들어내는 것이지만, 동일한 BOUNDED CONTEXT 내에서 일하고 있는건 아니다. 따라서 코드를 공유하는 것은 위험하다.
    • 문제가 일어나지 않게 하려면 두 팀은 정보를 공유했을 때 발생하는 비용과 이득의 타협점을 결정하고 정보 공유가 잘 될 수 있게 프로세스를 정립할 필요가 있다.
    • BOUNDED CONTEXT 안의 팀은 명확함을 얻고, 밖의 팀은 자유로움을 얻는다.
  • BOUNDED CONTEXT 안의 균열 인식
    • 뚜렷이 구분되는 모델 요소를 결합할 경우, 중복된 개념허위동족 언어 문제가 발생할 수 있다.
    • 중복된 개념은 실제로 같은 개념을 나타내는 두 개의 모델 요소가 존재하는 것이다. 개념은 동일하지만 서로 다른 규칙을 따르고 데이터까지 다른 두 버전의 객체가 존재하게 된다.
    • 허위 동족 언어는 같은 용어를 사용하는 두사람이 서로 같은 것을 이야기하고 있다고 생각하지만 실제로는 그렇지 않은 경우를 말한다. 이 때문에 개발팀은 서로의 코드를 침범하게 되고, 데이터베이스에 이상한 불일치가 생기고, 팀 내 의사소통이 혼란스러워 질 수 있다.

CONTINUOUS INTEGRATION

  • CONTINUOUS INTEGRATION은 내부적으로 균열이 발생할 때 이를 빠르게 포작하고 정정할 수 있을 정도로 컨텍스트 내의 모든 작업을 빈번하게 병합해서 일관성을 유지하는 것을 의미한다.
  • 개념은 팀 구성원 간의 부단한 의사소통을 토대로 통합되며, 팀은 끊임없이 변화하는 모델을 함께 이해하고 이를 발전시켜야 한다.
  • 통한을 위한 가장 효과적인 프로세스에는 공통적으로 다음과 같은 특징이 있다.
    • 단계적이고 재생 가능한 병합/빌드 기법
    • 자동화된 테스트 스위트
    • 수정사항이 통합되지 않은 상태로 존재할 수 있는 시간을 적당히 짧게 유지하는 규칙
  • 또한 모델과 애플리케이션에 관해 논의할 때 UBIQUTOUS LANGUAGE를 지속적으로 사용하는 것이 개념적인 통합에 도움이 된다.

 

728x90
Comments