LAYERED_ARCHITECTURE

도메인에 관련된 코드가 상당한 양의 도메인과 관련이 없는 다른 코드를 통해 널리 확산될 경우 도메인에 관련된 코드를 확인하고 추론하기 굉장히 힘들어진다. 응집력 있고 모델 주도적인 객체를 구현하는 것이 비현실적인 이야기가 되어버리고 자동화 테스트가 어려워진다.

소프트웨어 시스템을 분리하는 방법은 다양하지만 경험과 관례에 근거해 산업게에서는 LAYERED_ARCHITECTURE, 좀더 구체적으로 몇깨의 일반화된 계층이 널리 받아 들여지고 있다. 계층화의 핵심 원칙은 한 계층의 모든 요소는 오직 같은 계층에 존재하는 다른 요소나 계층상 '아래'에 위치한 요소에만 의존한다는 것이다. 위로 거슬러 가기 위해서는 간접적인 메커니즘을 거쳐야 한다.

성공적인 아키텍처에서 네가지 개념적 계층

1. 사용자 인터페이스(UI)

사용자에게 정보를 보여주고, 사용자의 명령을 해석하는 일을 책임진다.

2. 응용 계층

소프트 웨어가 수행할 작업을 정의하고 표현력있는 도메인 객체가 문제를 해결하게 한다. 이 계층에서 책임지는 작업은 업무상 중요하거나 다른 시스템의 응용 계층과 상호작용하는 데 필요한 것들이다. 이 계층은 얇게 유지된다. 여기에는 업무 규칙이나 지식이 포함되지 않으며, 오직 작업을 조정하고 아래에 위치한 계층에 포함된 도메인 객체의 협력자에게 작업을 위임한다. 업무 상황을 반영하는 상태가 없지만 사용자나 프로그램의 작업에 대한 진행 상황을 반영하는 상태를 가질 수는 있다.

3. 도메인 계층(모델 계층)

업무 개념과 업무 상황에 관한 정보, 업무규칙을 표핸하는 일을 책임진다. 이 계층에서는 업무 상황을 반영하는 상태를 제어하고 사용하며, 그와 같은 상태 저장과 관련된 기술적인 세부사항은 인프라스트럭체에 위임한다. 이 계층은 업무용 소프트웨어의 핵심이다.

4. 인프라스트럭체 계층

상위계층을 지원하는 일반화된 기술적 기증을 제공한다. 이러한 기능에는 애플리케이션에 대한 메시지 전송, 도메인 영속화, UI에 위젝을 그리는 것등이 있다. 또한 아키텍처 프레임워크를 통해 네가지 계층애 대한 상호작용 패턴을 지원할 수도 있다.

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

응집력 있고 오직 아래에 위치한 계층에만 의존하는 각 계층에게 설계를 발전시켜라 표준 아키텍쳐 패턴에 따라 사우이 계층과의 결합을 느슨하게 유지하라. 도메인 모델과 관련된 코드는 모두 한계층에 모으고 사용자 인터페이스, 애플리케이션 코드, 인프라스트럭체 코드와 격리하라도메인 객체는 도메인 모델을 표현하는 것에만 집중할 수 있다. 이로써 모델은 진화를 거듭해 본질적인 업무지식을 포착해서 해당 업무지식이 효과를 발휘할 수 있을 만큼 풍부하고 명확해질 것이다.