두 가지 재료 : 기능과 구조안정적인 재료 : 구조도메인 모델불안정한 기능을 담는 안정적인 도메인 모델불안정한 재료 : 기능유스케이스유스케이스의 특성재료 합치기 : 기능과 구조의 통합도메인 모델, 유스케이스, 그리고 책임-주도 설계
안정적인 도메인 모델을 기반으로 시스템의 기능을 구현하라. 도메인 모델과 코드를 밀접하게 연관시키기 위해 노력하라. 그것이 유지보수하기 쉽고 유연한 객체지향 시스템을 만드는 첫걸음이 될 것이다.
- 훌륭한 설계자는 미래에 구체적으로 어떤 변경이 발생할 것인지를 예측하지 않는다. 단지 언젠가는 변경이 발생할 것이며 아직까지는 그것이 무엇인지 모른다는 사실을 겸허하게 받아들인다.
- 변경에 대비하고 변경의 여지를 남겨 놓는 가장 좋은 방법은 자주 변경되는 기능이 아닌 안정적인 구조를 중심으로 설계하는 것이다.
두 가지 재료 : 기능과 구조
- 기능은 사용자가 자신의 목표를 달성하기 위해 사용할 수 있는 시스템의 서비스
- 구조 : 시스템의 기능을 구현하기 위한 기반으로, 기능 변경을 수용할 수 있도록 안정적이어야 한다.
안정적인 재료 : 구조
도메인 모델
- 사용자가 프로그램을 사용하는 대상 분야를 도메인 이라고 함
- 코드의 구조가 도메인의 구조를 반영하면, 도메인을 이해할 시 코드를 이해하기가 훨씬 수월해진다. 도메인 속의 개념과 관계가 코드 속에 녹아 있기 때문에 도메인이 알려주는 길을 따라가면 코드 속에서 길을 잃지 않을 수 있다.
- 결국 도메인 모델은 코드 안에 존재하는 미로를 헤쳐나갈 수 있는 지도를 제공
불안정한 기능을 담는 안정적인 도메인 모델
- 본질적이라는 것은 변경이 적고 비교적 그 특성이 오랜 시간 유지된다는 것을 의미함.
- 사용자 모델에 포함된 개념과 규칙은 비교적 변경될 확률이 적기 때문에 사용자 모델을 기반으로 설계와 코드를 만들면 변경에 쉽게 대처할 수 있을 가능성이 커짐
- 결론적으로 안정적인 구조를 제공하는 도메인 모델을 기반으로 소프트웨어의 구조를 설계하면 변경에 유연하게 대응할 수 있는 탄력적인 소프트웨어를 만들 수 있다. 도메인 모델은 여러분이 기능을 구현할 때 참조할 수 있는 궁극적인 지도다
불안정한 재료 : 기능
유스케이스
- 사용자의 목표를 달성하기 위해 사용자와 시스템 간에 이뤄지는 상호작용의 흐름을 텍스트로 정리한 것
- 유스케이스의 가치는 사용자들의 목표를 중심으로 시스템의 기능적인 요구사항들을 이야기 형식으로 묶을 수 있다는 점
- 산발적으로 흩어져 있는 기능에 사용자 목표라는 문맥을 제공함으로써 각 기능이 유기적인 관계를 지닌 체계를 이룰 수 있게 함
사용자 목표가 유스케이스의 핵심이다. 유스케이스는 공통의 사용자 목표를 통해 강하게 연관된 시나리오의 집합이다 [Fowler 2003]
유스케이스의 특성
- 유스케이스는 사용자와 시스템 간의 상호작용을 보여주는 ‘텍스트’
- 유스케이스는 다이어그램이 아니고, 중요한 것은 유스케이스 안에 포함돼 있는 상호작용의 흐름이다.
- 유스케이스의 핵심은 사용자와 시스템 간의 상호작용을 일련의 이야기 흐름으로 표현하는 것
- 유스케이스는 하나의 시나리오가 아니라 여러 시나리오들의 집합이다
- 예를 들어, 중도 해지 이자액을 계산한다 라는 목표(= 유스케이스) 하에
- 당일까지의 이자액 계산 — 시나리오
- 특정 일자까지의 이자액 계산 — 시나리오
- 유스케이스는 단순한 피처 목록과 다름. 유스케이스의 강점은 피처처럼 단순히 기능을 나열하는 것이 아니라 이야기를 통해 연관된 기능들을 함께 묶을 수 있다는 점임
- 유스케이스는 사용자 인터페이스와 관련된 세부 정보를 포함하지 말아야 한다.
- 자주 변경되는 사용자 인터페이스 요소는 배제하고 사용자 관점에서 시스템의 행위에 초점을 맞춘다.
- 사용자 인터페이스를 배제한 유스케이스 형식을 본질적인 유스케이스 라고 함
- 유스케이스는 내부 설계와 관련된 정보를 포함하지 않음
- 유스케이스의 목적은 연관된 기능을 이야기 형식으로 모으는 것이지 내부 설계를 설명하는 것이 아님
- 과거의 객체 지향 서적에서는 유스케이스에 나타나는 명사를 클래스로, 동사를 클래스의 메서드로 대응시키는 방식으로 객체지향 설계를 설명하기도 했지만, 객체 지향 설계는 그렇게 간단하지 않음
- 유스케이스는 객체의 구조나 책임에 대한 어떤 정보도 제공하지 않는다
- 유스케이스 텍스트 안에서 도메인 모델에서 사용할 용어에 대한 힌트를 얻을 수 있지만, 도메인 모델을 구축할 수 있는 모든 정보가 포함돼 있지는 않다.
재료 합치기 : 기능과 구조의 통합
도메인 모델, 유스케이스, 그리고 책임-주도 설계
- 도메인 모델은 안정적인 구조를 개념화하기 위해, 유스케이스는 불안정한 기능을 서술하기 위해 가장 일반적으로 사용되는 도구다
- 변경에 유연한 소프트웨어를 만들기 위해서는 유스케이스에 정리된 시스템의 기능을 도메인 모델을 기반으로 한 객체들의 책임으로 분배해야 한다
- 유스케이스는 사용자에게 제공할 기능을 시스템의 책임으로 보게 함으로써 객체 간의 안정적인 구조에 책임을 분배할 수 있는 출발점을 제공함
책임-주도 설계는 유스케이스로부터 첫 번째 메시지와 사용자가 달성하려는 목표를, 도메인 모델로부터 기능을 수용할 수 있는 안정적인 구조를 제공받아 실제로 동작하는 객체들의 협력 공동체를 창조한다.