domain-driven-design

04장 도메인의 격리

소프트웨어 구현을 건전한 상태로 유지하고 모델과의 밀접한 관계를 유지하려면 모델링과 설계의 우수 실천법을 적용해야 한다.

어떤 종류의 의사결정은 모델과 구현이 서로 정합된 상태를 유지해서 서로의 효과를 상호 보완하게 한다.

이 책에서 제시하는 방법은 거의 책임 주도 설계의 원칙 / 계약에 의한 설계를 따른다.

규모와는 관계없이 프로젝트가 난관에 부딪치면 개발자들은 자신들이 그와 같은 원칙을 적용할 수 없는 상황에 놓여 있다는 사실을 알게 될지도 모른다.

도메인 주도 설계 과정을 탄력성 있게 만들려면 개발자들은 잘 알려진 근본 원리들이 어떻게 MODEL-DRIVEN-DESIGN을 뒷받침하는지 이해해야 하며, 이를 통해 실패를 극복하고 난관을 헤쳐나갈 수 있다.

모델의 개발 요소를 실제로 설계하고 구현하는 일은 비교적 체계적으로 이뤄질 수 있다.

소프트웨어 시스템에서 도메인 설계 외의 수많은 관심사로부터 도메인 설계를 격리하면 모델과 설계의 관계가 훨씬 분명해질 것이다.

도메인에서 발생하는 문제를 해결하는 소프트웨어의 각 요소는 그것의 중요성에 어울리지 않게 대개 전체 소프트웨어 시스템의 극히 작은 부분을 구성한다.

도메인 모델링 원칙을 성공적으로 적용하려면 이 기법이 매우 중요하므로 도메인 주도 관점에서 간략하게나마 반드시 검토해봐야 한다.

LAYERED ARCHITECTURE (계층형 아키텍처)

소프트웨어 프로그램에는 갖가지 작업을 수행하는 설계와 코드가 포함된다.

소프트웨어 프로그램은 사용자 입력을 받아들이고 업무 로직을 수행하며, 데이터베이스에 접근하고, 네트워크상으로 통신하며, 사용자에게 정보를 보여주는 등의 일을 수행한다.

객체지향 프로그램에서는 종종 사용자 인터페이스(UI)와 데이터베이스, 기타 보조적인 성격의 코드를 비즈니스 객체 안에 직접 작성하기도 한다.

도메인에 관련된 코드가 상당한 양의 도메인과 관련이 없는 다른 코드를 통해 널리 확산될 경우 도메인에 관련된 코드를 확인하고 추론하기가 굉장히 힘들어진다.

매우 복잡한 작업을 처리하는 소프트웨어를 만들 경우 관심사의 분리가 필요하다.

계층형 아키텍처라는 몇 개의 일반화된 계층이 널리 받아들여지고 있다,

계층화의 핵심 원칙은 한 계층의 모든 요소는 오직 같은 계층에 존재하는 다른 요소나 계층상 ‘아래’에 위치한 요소에만 의존한다는 것이다.

계층화의 가치는 각 계층에서 컴퓨터 프로그램의 특정 측면만을 전문적으로 다룬다는 데 있다.

경험과 관례를 바탕으로 널리 받아들여지는 계층화가 어느 정도 정해졌다.

사용자 인터페이스(또는 표현 계층)

응용 계층

도메인 계층 ( 핵심 계층 )

인프라스트럭처 계층

MODEL-DRIVEN DESIGN을 가능케 하는 것은 결정적으로 도메인 계층을 분리하는데 있다.

복잡한 프로그램을 여러 개의 계층으로 나눠라.

인프라스트럭처 계층과 사용자 인터페이스 계층에서 도메인 계층을 분리하면 각 계층을 훨씬 더 명료하게 설계할 수 있다.

계층 간 관계 설정

각 계층은 서로 연결돼야 한다. 분리의 이점을 잃지 않으면서 각 계층을 서로 연결하는 것이야말로 각종 패턴이 존재하는 이유다.

설계 의존성을 오직 한 방향으로만 둬서 느슨하게 결합된다.

응용 계층과 도메인 계층에 UI를 연결하는 패턴은 MODEL-VIEW-CONTROLLER에서 유래한다.

APPLICATION COORDINATOR 패턴은 애플리케이션 계층을 연결하는 접근법 가운데 하나다.

보통 인프라스트럭처 계층에서는 도메인 계층에서 어떤 활동이 일어나게 하지 않는다.

인프라스트럭처 계층은 도메인 계층의 아래에 있으므로 해당 인프라스트럭처 계층이 보조하는 도메인의 구체적인 지식을 가져서는 안 된다.

응용 계층과 도메인 계층에서는 인프라스트럭처 계층에서 제공하는 SERVICE를 요청한다.

SERVICE의 범위와 인터페이스를 적절히 선정하고 설계한다면 호출하는 측은 SERVICE 인터페이스에서 캡슐화하는 정교한 행위를 바탕으로 느슨하게 결합되고 단순해질 수 있다.

아키텍처 프레임워크

수많은 인프라스트럭처의 요구사항을 통합하는 프레임워크는 종종 다른 계층이 매우 특수한 방식으로 구현되기를 요구한다.

일반적으로 어떤 형태로든 아키텍처 프레임워크와 같은 것은 필요하다.

프레임워크의 목적

프레임워크는 가장 유용한 기능만 분별력 있게 적용한다면 구현과 프레임워크간의 결합이 줄어들어 차후 설계 의사결정을 더욱 유연하게 내릴 수 있을 것이다.

도메인 계층은 모델이 살아가는 곳

도메인 주도 설계에서는 오직 한 가지 특정한 계층만이 존재할 것을 요구한다.

SMART UI(지능형 UI) “안티 패턴”

이 패턴은 하나의 대안에 불과하며, 도메인 주도 설계 접근법과는 서로 양립할 수 없는 상호배타적인 길에 놓인 접근법이다.

장점

단점

아키텍처에서 응집력 있는 도메인 설계가 시스템의 다른 부분과 느슨하게 결합될 수 있게 도메인 관련 코드를 격리한다면 아마 그러한 아키텍처는 도메인 주도 설계를 지원할 수 있을 것이다.

도메인 설계를 분리하는 데 실패한다면 이것은 실제로 어떤 상황에서는 재앙이 될 수 있다.

다른 종류의 격리