•
우리가 모르는 길을 가야할 때, 사람들은 보통 두 가지 방법 중 하나를 이용해 길을 찾는다.
◦
하나는 지나가는 사람에게 어디로 가야하는 지 묻는 것이고 나머지 하나는 지도에 표시된 길을 따라가는 방법이다.
•
첫 번째 방법은 기능적이고 해결책 지향적인 접근법이다. 길을 가르쳐주는 사람은 길을 단계별로 상세히 설명해야 한다.
◦
이는 올바른 길을 알려주며 지시를 충실히 따른다면 원하는 목적지로 갈 수 있다. 그러나 이 방법은 일반적이지도 재사용 가능하지도 않다.
•
반해 두 번째 방법인 지도는 실세계의 지형을 기반으로 만들어진 추상화된 모델이다. 지도에는 길을 찾는 데 필요한 맥락 정보들이 충분히 제공된다.
◦
지도를 이용해 길을 찾는 방법은 길을 물어서 찾는 것보다 쉽고 간단하다.
◦
이는 구조적이고 문제 지향적인 접근법이라고 부른다. 지도는 길을 찾는 데 필요한 구체적인 기능이 아니라 길을 찾을 수 있는 구조를 제공한다.
•
지도가 앞선 방법과 비교해 더 범용적인 이유는 지도를 사용하려는 사람들이 원하는 기능에 비해 지도에 표시된 구조가 더 안정적이기 때문이다.
◦
지도를 사용하는 사람들의 요구사항은 그들의 위치, 목적에 따라 변경된다.
◦
이에 반해 지도는 잘 변하지 않는 지형 정보를 기반으로 하고 있기 때문에 잘 변경되지 않는다.
•
해당 은유가 얘기하는 바의 핵심은 기능이 아니라 구조를 기반으로 모델을 구축하는 편이 더 재사용성이 좋고 변경에 안정적이며 이해하기 쉽다는 것이다.
•
전통적인 소프트웨어 개발 방법은 변경이 빈번하게 발생하는 기능에 안정적인 구조를 종속시키는 즉, 기능적이고 해결책 지향적인 접근법이었다.
•
반면 객체지향 개발 방법은 안정적인 구조에 변경이 빈번하게 발생하는 기능을 종속시키는 즉, 구조적이고 문제 지향적인 접근법이다.
•
자율적인 객체들이 각자의 역할과 책임을 수행하며 협력하는 공동체인 객체지향이 강력한 이유는 사람들이 실세계의 현상을 인지하고 이해하는 관점을 소프트웨어에 그대로 투영할 수 있기 때문이다.
•
이번 장에서는 기능이 아니라 구조를 바탕으로 시스템을 분할하는 객체지향의 또 다른 측면에 관해 설명한다.
•
자주 변경되는 기능이 아닌 안정적인 구조를 따라 역할, 책임, 협력을 구성하라.
기능 설계 대 구조 설계
•
모든 소프트웨어 제품의 설계에는 두 가지 측면이 존재한다. 하나는 기능이고 하나는 구조다. 그리고 설계의 가장 큰 도전은 기능과 구조라는 두 가지 측면을 함께 녹여 조화를 이루도록 만드는 것이다.
◦
기능 측면의 설계는 제품이 사용자에게 무엇을 제공해줄 수 있는지에 초점을 맞춘다.
◦
구조 측면의 설계는 제품의 형태가 어떠해야 하는지에 초점을 맞춘다.
•
소프트웨어가 가치를 가지게 되는 첫 번째 이유는 사용자가 필요로 하는 기능을 제공한다는 점에서 소프트웨어를 개발하는 근원적인 이유는 훌륭한 기능을 제공하기 위해서다.
•
훌륭한 기능이 훌륭한 소프트웨어를 만드는 충분조건이라고 한다면 훌륭한 구조는 훌륭한 소프트웨어를 만들기 위한 필요조건이다.
◦
성공적인 소프트웨어들이 지닌 공통적인 특징은 훌륭한 기능을 제공하는 동시에 사용자가 원하는 새로운 기능을 빠르고 안정적으로 추가할 수 있다는 것이다.
◦
훌륭한 구조를 지닌 소프트웨어는 사용자의 변하는 요구사항을 반영할 수 있도록 쉽게 확장 가능한 소프트웨어를 창조할 수 있는 기반이 된다.
•
소프트웨어 분야에서 예외가 없는 유일한 규칙 하나는 요구사항이 항상 변한다는 것이다. 설계라는 행위를 중요하게 만드는 것은 변경에 대한 필요성이다.
◦
변경을 피할 수 없기 때문에 좋은 설계를 해야하는 것이다.
•
설계가 어려운 이유는 이 둘을 조화롭게 잘 만족해야하기 때문이다. 훌륭한 기능을 제공하는 동시에 예측 불가능한 요구사항 변경에 유연하게 대처할 수 있는 안정적인 구조를 제공하는 능력을 갖춰야 한다.
•
우리는 변경을 대비할 순 있으나 예측할 수는 없다. 불확실한 미래의 변경을 예측해 이를 설계에 반영하는 것은 불필요하게 복잡한 설계를 낳을 뿐이다.
•
미래를 대비하는 가장 좋은 방법은 변경을 예측하는 것이 아니라 변경을 수용할 수 있게끔 선택의 여지를 설계에 마련해놓는 것이다.
◦
앞서 지도를 통해 살펴본 것처럼 변경에 대비하고 변경의 여지를 남겨 놓는 가장 좋은 방법은 자주 변경되는 기능이 아닌 안정적인 구조를 중심으로 설계하는 것이다.
•
전통적인 기능 분해는 자주 변경되는 기능을 중심으로 설계 후 구조가 기능에 따르게 한다. 이것이 기능 분해 방법이 변경에 취약한 이유다.
◦
기능 분해 방법의 경우, 큰 기능은 더 작은 기능으로 분해되고 각 기능은 서로 밀접하게 관련된 하나의 덩어리를 이루기 때문에 변경사항이 발생하면 쉽게 전파되고 기존의 형태가 깨지곤 한다.
•
객체지향 접근방법은 자주 변경되지 않는 안정적인 객체 구조를 바탕으로 시스템 기능을 객체 간의 책임으로 분배한다.
◦
객체지향은 객체의 구조에 집중하고 기능이 객체의 구조를 따르게 만든다. 시스템 기능은 더 작은 책임으로 분할되고 적절한 객체에게 분배되기 때문에 기능이 변경되더라도 객체 간의 구조는 유지된다.
•
이것이 객체를 기반으로 책임과 역할을 식별하고 메시지를 이용해 객체들의 협력 관계를 구축해야 하는 이유다. 안정적인 객체 구조는 변경을 수용할 수 있는 훌륭한 구조를 가진 소프트웨어를 만들 수 있는 기반을 제공한다.
•
객체 지도는 빠르게 변화하는 기능을 수용할 수 있는 자리를 제공한다. 사람들에게 길을 묻지 말고 객체를 이용해 지도를 만들자. 기능은 지도에 표시된 길을 따라 자연스럽게 흘러갈 것이다.
두 가지 재료: 기능과 구조
•
객체지향 세계를 구축하는 재료는 사용자에게 제공할 기능과 안정적인 구조로 나뉜다.
◦
각각 기능은 사용자가 자신의 목표를 달성하기 위해 사용할 수 있는 시스템의 서비스고 구조는 시스템의 기능을 구현하기 위한 기반이다.
•
이 두 재료를 구하는 방법으로, 일관되게 적용할 수 있는 두 가지 기법이 존재한다.
◦
구조는 사용자나 이해관계자들이 도메인에 관해 생각하는 개념과 개념들 간의 관계로 표현한다.
◦
기능은 사용자의 목표를 만족시키기 위해 책임을 수행하는 시스템의 행위로 표현한다.
•
일반적으로 기능을 수집하고 표현하기 위한 기법을 유스케이스 모델링이라고 하고 구조를 수집하고 표현하기 위한 기법을 도메인 모델링이라고 한다.
•
그리고 두 모델링 활 동의 결과물을 각각 유스케이스와 도메인 모델이라고 한다.
안정적인 재료: 구조
도메인 모델
•
소프트웨어를 사용하는 사람들은 자신이 관심을 가지고 있는 특정한 분야의 문제를 해결하기 위해 소프트웨어를 사용한다. 이처럼 도메인이란 사용자가 프로그램을 사용하는 대상 분야다.
•
도메인 모델에서 모델이란 대상을 단순화해서 표현한 것이다. 모델은 지식을 선택적으로 단순화하고 의식적으로 구조화한 형태다.
◦
모델은 중요한 문제에 집중할 수 있도록 필요한 지식만 재구성한 것이다.
•
도메인과 모델의 정의를 연결하면 도메인 모델을 쉽게 정의할 수 있는데, 이는 사용자가 프로그램을 사용하는 대상 영역에 관한 지식을 선택적으로 단순화하고 의식적으로 구조화한 형태다.
◦
즉, 소프트웨어가 목적하는 영역 내의 개념과 개념 간의 관계, 다양한 규칙이나 제약 등을 주의 깊게 추상화한 것이다.
•
도메인 모델은 단순한 다이어그램이 아니며 이는 이해관계자들이 바라보는 멘탈 모델이다.
◦
멘탈 모델이란 사람들이 자기 자신, 다른 사람, 환경, 자신이 상호작용하는 사물들에 갖는 모형으로 사람들은 세상에 존재하는 현상을 이해하고 현상에 반응하기 위해 자신의 마음 속에 멘탈 모델을 구축한다.
•
도널드 노먼은 제품을 설계할 때, 제품에 관한 모든 것이 사용자들이 제품에 가지고 있는 멘탈 모델과 정확하게 일치해야 한다고 주장했다.
◦
이는 사용자들은 자신의 멘탈 모델과 유사한 방식으로 제품이 반응하고 움직일 것이라고 기대하기 때문에 훌륭한 설계란, 사용자가 예상하는 방식에 따라 정확하게 반응하는 제품을 만드는 것이다.
◦
또한 노먼은 멘탈 모델을 사용자 모델, 디자인 모델, 시스템 이미지의 세 가지로 구분했다.
▪
사용자 모델은 사용자가 제품에 대해 가지고 있는 개념들의 모습이다.
▪
디자인 모델은 설계자가 마음 속에 가지고 있는 시스템에 대한 개념화다.
▪
시스템 이미지는 최종 제품이다.
•
사용자와 설계자는 일반적으로 직접 상호작용할 수 없고 최종 제품인 시스템 이미지를 통해서 의사소통할 수 있기 때문에 설계자는 시스템 이미지가 사용자 모델을 정확하게 반영하도록 노력해야 한다.
◦
디자인 모델과 사용자 모델이 동일한 경우, 이상적인 시스템이라고 할 수 있다.
•
도메인 모델은 결국 도메인에 대한 사용자 모델, 디자인 모델, 시스템 이미지를 포괄하도록 추상화한 소프트웨어 모델이다. 따라서 도메인 모델은 소프트웨어에 대한 멘탈 모델이다.
도메인의 모습을 담을 수 있는 객체지향
•
도널드 노먼의 주장은 곧, 사용자가 도메인을 바라보는 관점을 코드에 반영해야 한다는 것이며 이는 곧 어플리케이션이 도메인 모델을 기반으로 설계되어야 한다는 것을 의미한다.
•
도메인 모델의 세 가지 측면을 모두 모델링할 수 있는 유사한 모델링 패러다임을 사용할 수록 소프트웨어 개발의 결과가 만족스러울 것이다.
•
여기서 객체지향은 이런 요구사항들을 가장 범용적으로 가장 잘 만족시킬 수 있는 거의 유일한 모델링 패러다임이다.
•
객체지향을 이용하면 도메인에 대한 사용자 모델, 디자인 모델, 시스템 이미지 모두가 유사한 모습을 유지하도록 만드는 것이 가능하며 이러한 특징을 연결완전성 또는 표현적 차이라고 한다.
표현적 차이
•
저자는 여기서 다시 한번 소프트웨어 객체와 현실 객체의 관계를 가장 효과적으로 표현할 수 있는 단어가 추상화가 아닌, 은유임을 강조한다.
◦
소프트웨어 객체는 현실 객체를 완전히 모방하지 않는다. 은유를 기반으로 재창조하는 것이기 때문이다. 따라서 소프트웨어 객체는 현실 객체가 갖지 못한 특성이나 행동을 가질 수 있다.
•
하지만 은유라고 언급했듯이 소프트웨어 객체는 현실 객체의 특성을 토대로 구축된다. 이처럼 소프트웨어 객체와 현실 객체 사이의 의미적 거리를 가리켜 표현적 차이 또는 의미적 차이라고 한다.
•
안타깝게도 대부분의 소프트웨어 도메인은 현실에 존재하지 않는 가상의 세계를 대상으로 하기 때문에, 현실 객체를 은유하라는 말은 받아들이기 어렵다. 그렇다면 우리가 은유를 통해 투영해야 하는 대상은 뭘까?
•
이는 바로 사용자가 도메인에 대해 생각하는 개념이다. 즉 소프트웨어 객체를 창조하기 위해 우리가 은유해야 하는 대상이 도메인 모델이라는 것이다.
•
이것이 도메인 모델이 중요한 이유다. 도메인 모델을 기반으로 설계하고 구현하는 것은 사용자가 도메인을 바라보는 관점이 코드에 반영되게끔 한다. 이는 표현적 차이를 줄이고 사용자의 멘탈 모델이 코드에 녹아들게 할 것이다.
•
표현적 차이가 중요한 이유는 소프트웨어를 이해하고 수정하기 쉽게 만들어주기 때문이다. 코드의 구조가 도메인의 구조를 반영하기 때문에 도메인을 이해하면 코드를 이해하기 쉬워진다.
•
결국 도메인 모델은 코드 안에 존재하는 미로를 헤쳐나갈 수 있는 구조에 바탕한 지도를 제공한다.
불안정한 기능을 담는 안정적인 도메인 모델
•
도메인 모델을 기반으로 코드를 작성하는 두 번째 이유는 도메인 모델이 제공하는 구조가 상대적으로 안정적이기 때문이다.
•
도메인 모델의 핵심은 사용자가 도메인을 바라보는 관점을 반영해 소프트웨어를 설계하고 구현하는 것으로 이는 사용자들이 도메인의 본질적인 측면을 가장 잘 알고 있는 도메인 전문가이기 때문이다.
◦
사용자들은 도메인을 구성하는 중요한 개념과 개념 간의 관계를 가장 잘 알고 있는 사람들이다.
◦
본질적이라는 것은 변경이 적고 비교적 특성이 오랜 시간 유지된다는 것을 의미한다. 즉, 사용자 모델에 포함된 개념과 규칙은 변경될 확률이 적어 이를 기반으로 설계와 코드를 만들면 변경에 쉽게 대처할 가능성이 커진다.
◦
도메인 모델이 기능을 담을 수 있는 안정적인 구조를 제공할 수 있음을 의미하며 이는 소프트웨어 구조의 기반을 이루고 이를 기반으로 변경되는 기능을 배치함으로써 변경에 대해 안정적인 소프트웨어를 구현할 수 있다.
•
안정적인 구조를 제공하는 도메인 모델을 기반으로 소프트웨어의 구조를 설계하면 변경에 유연하게 대응하는 탄력적인 소프트웨어를 만들 수 있다. 도메인 모델은 우리가 기능을 구현할 때, 참조할 수 있는 궁극적인 지도다.
•
결국, 사용자에게 중요한 것은 도메인 모델이 아닌 소프트웨어의 기능이다. 따라서 사용자에게 제공할 기능을 기술한 정보가 필요한데, 이를 유스케이스라는 유용한 기법을 사용해 기술할 수 있다.
불안정한 재료: 기능
유스케이스
•
기능적 요구사항이란 시스템이 사용자에게 제공해야 하는 기능의 목록을 정리한 것이다.
◦
시스템이 사용자에게 기능을 제공하는 이유는 사용자들이 시스템을 통해 달성하고자 하는 목표가 있기 때문이다.
◦
따라서 훌륭한 기능적 요구사항을 얻기 위해서 우리는 목표를 가진 사용자와 사용자의 목표를 만족시키기 위해 일련의 절차를 수행하는 시스템 간의 상호작용 관점에서 시스템을 바라봐야 한다.
•
사용자는 자신의 목표를 달성하기 위해 시스템과의 상호작용을 시작한다. 이처럼 사용자의 목표를 달성하기 위해 사용자와 시스템 간에 이뤄지는 상호작용의 흐름을 텍스트로 정리한 것을 유스케이스라고 한다.
◦
유스케이스는 이바 야콥슨의 저서인 객체지향 개발 - 유스케이스 주도 접근법에서 처음 소개되었으며 앨리스터 코오번에 의해 체계화되었다.
•
앨리스터 코오번은 유스케이스를 다음과 같이 설명한다.
유스케이스는 시스템의 이해관계자들 간의 계약을 행위 중심으로 파악한다.
유스케이스는 이해관계자들 중에서 일차 액터라 불리는 행위자의 요청에 대한 시스템의 응답으로서, 다양한 조건하에 있는 시스템의 행위를 서술한다.
일차 액터는 어떤 목표를 달성하기 위해 시스템과의 상호작용을 시작한다. 시스템은 모든 이해관계자들의 요구에 응답하고 이해관계를 보호해야 한다.
특별한 요청과 관계되는 조건에 따라 서로 다른 일련의 행위 혹은 시나리오가 전개될 수 있다. 유스케이스는 이렇게 서로 다른 시나리오를 묶어준다.
•
일차 액터란 이해관계자 중, 시스템의 서비스를 요청하며, 하나의 목표를 가지고 유스케이스를 시작하는 액터를 의미한다.
◦
일반적으로 시스템과 연동되는 외부 시스템 역시 일차 액터의 범위에 포함된다.
•
유스케이스의 장점은 사용자들의 목표를 중심으로 시스템의 기능적인 요구사항들을 이야기 형식으로 묶을 수 있다는 점이다.
◦
흩어져 있는 기능을 사용자 목표라는 문맥을 제공함으로써 각 기능이 유기적인 관계를 가진 체계를 이룰 수 있게 한다.
◦
마틴 파울러는 사용자 목표가 유스케이스의 핵심이다. 유스케이스는 공통의 사용자 목표를 통해 강하게 연관된 시나리오의 집합이다라고 했다.
유스케이스의 특성
1.
유스케이스는 사용자와 시스템 간의 상호작용을 보여주는 텍스트다.
•
중요한 것은 유스케이스 안에 포함되어 있는 상호작용의 흐름이다.
•
유스케이스의 핵심은 사용자와 시스템 간의 상호작용을 일련의 이야기 흐름으로 표현하는 것이다.
•
유스케이스에 담겨 있는 이야기를 파악하자.
2.
유스케이스는 하나의 시나리오가 아닌 여러 시나리오들의 집합이다.
•
시나리오는 유스케이스를 통해 시스템을 사용하는 하나의 특정한 이야기 또는 경로다.
•
즉, 하나의 시나리오가 아닌 사용자의 목표와 고나렫뇐 모든 시나리오의 집합이다.
3.
유스케이스는 단순한 기능 목록과 다르다.
•
기능들을 단순히 나열하는 것이 아닌, 기능들을 포함하는 이야기를 제공함으로써 연관된 기능으로 묶을 수 있다.
4.
유스케이스는 사용자 인터페이스와 관련된 세부 정보를 포함하지 말아야 한다.
•
유스케이스는 자주 변경되는 사용자 인터페이스 요소는 배제하고 사용자 관점에서 시스템의 행위에 초점을 맞춘다.
•
이처럼 사용자 인터페이스를 배제한 유스케이스 형식을 본질적인 유스케이스라 한다.
5.
유스케이스는 내부 설계와 관련된 정보를 포함하지 않는다.
•
유스케이스의 목적은 연관된 시스템의 기능을 이야기 형식으로 모을 뿐, 내부 설계를 설명하는 것이 아니다.
•
과거의 객체지향 서적엔 유스케이스에 나타나는 명사를 클래스로, 동사를 클래스의 메소드로 대응시키는 방식으로 객체지향 설계를 설명하기도 했지만 객체지향 설계는 그렇게 간단하지 않다.
•
유스케이스에서 객체 설계로의 전환은 공학적인 규칙과 원칙을 기반으로 한 변환 작업이 아닌 경험과 상식과 의사소통을 기반으로 한 창조 작업이다.
•
5번의 경우, 설계에 대한 오해가 발생할 수 있기 때문에 다음 장에서 상세히 의논한다.
유스케이스는 설계 기법도, 객체지향 기법도 아니다
•
유스케이스는 단지 사용자가 바라보는 시스템이라는 걸 명심하자. 즉 외부 관점이다.
◦
유스케이스는 시스템의 내부 구조나 실행 메커니즘에 관한 그 어떠한 정보도 제공하지 않는다.
◦
유스케이스에는 단지 사용자가 상호작용을 통해 뭘 얻을 수 있고 뭘 할 수 있는지에 관한 정보만 기술된다.
◦
유스케이스는 단지 기능적 요구사항을 사용자의 목표라는 문맥을 중심으로 묶기 위한 정리 기법일 뿐이다.
•
유스케이스와 객체의 구조 간에는 커다란 차이점이 조냊한다. 둘 사이의 간격을 편하게 없앨 수 없으며 변환 작업은 순수하게 창조적이고 예술적인 작업이다.
◦
유스케이스를 기반으로 객체의 구조를 쉽게 추출할 수 없음을 분명히 알자. 유스케이스는 객체의 구조나 책임에 대한 어떠한 정보도 제공하지 않는다.
•
물론 유스케이스를 통해 도메인 모델에 사용할 용어의 힌트를 얻을 수도 있다. 그러나 모든 힌트가 제공되는 것은 아니다.
재료 합치기: 기능과 구조의 통합
도메인 모델, 유스케이스, 그리고 책임-주도 설계
•
훌륭한 객체지향 설계자라면 불안정한 기능을 안정적인 구조 안에 담음으로써 변경에 대한 파급효과를 최소화하는 설계 능력을 기본적으로 가져야 한다.
◦
도메인 모델은 안정적인 구조를 개념화하기 위해, 유스케이스는 불안정한 기능을 서술하기 위해 가장 일반적으로 사용되는 도구다.
◦
변경에 유연한 소프트웨어를 만들기 위해서는 유스케이스에 정리된 시스템의 기능을 도메인 모델을 기반으로 한 객체들의 책임으로 분배해야 한다.
•
객체지향 패러다임은 모든 것이 객체라는 사상에서 출발한다. 따라서 유스케이스에 명시된 기능을 구현해야 하는 프로그래머는 시스템을 사용자로부터 전송된 메시지를 수행하기 위해 책임을 수행하는 자율적인 객체로 본다.
◦
시스템은 인터페이스에서 사용자의 목표를 만족시키기 위해 사용자와의 협력에 참여하는 커다란 객체다.
▪
사용자에게 있어서 시스템이 수행하기로 약속한 기능은 결국 시스템의 책임으로 볼 수 있다.
◦
사용자의 관점에서 시스템은 자신이 전송한 메시지에 응답하는 데 필요한 책임을 수행하는 일종의 객체다.
•
제목에서도 언급되었듯이, 책임-주도 설계는 유스케이스에서 도메인 모델로 전환되는 시점에서 사용된다.
•
지금까지는 시스템이 사용자에게 제공할 기능이 이미 정해져있다는 가정하에 객체들 간의 협력을 설계했지만 사실 협력의 처음을 담당하는 첫 번째 메시지는 시스템의 기능을 시스템의 책임으로 바꾼 후 얻어지는 것이다.
◦
시스템에 할당된 커다란 책임은 앞서, 시스템 안의 작은 객체들이 수행하는 작은 규모의 책임으로 세분화된다고 했다. 그렇다면 어떤 객체를 선택해야할까?
◦
이 시점에서 도메인 모델이 무대에 등장한다. 우리는 도메인 모델에 포함된 개념을 은유하는 소프트웨어 객체를 선택해야 한다.
•
유스케이스는 사용자에게 제공하는 기능을 시스템의 책임으로 보게 함으로써 객체 간의 안정적인 구조에 책임을 분배하는 출발점을 제공한다.
•
결국 중요한 것은, 견고한 객체지향 어플리케이션을 개발하기 위해서는 사용자의 관점에서 시스템의 기능을 명시하고 사용자와 설계자가 공유하는 안정적인 구조를 기반으로 기능을 책임으로 변환하는 체계적인 절차를 거친다는 것이다.
◦
객체의 이름은 도메인 모델에 포함된 개념으로부터 차용하고 책임은 도메인 모델에 정의한 개념의 정의에 부합하도록 할당한다.
기능 변경을 흡수하는 안정적인 구조
•
앞서 설명했듯 도메인 모델을 기반으로 객체 구조를 설계하는 이유는 도메인 모델이 안정적이기 때문이다. 이는 다음과 같은 특징을 띄기 때문이다.
◦
도메인 모델을 구성하는 개념은 비즈니스가 없어지거나 완전히 개편되지 않는 이상 안정적으로 유지된다.
◦
도메인 모델을 구성하는 개념 간의 관계는 비즈니스 규칙을 기반으로 하기 때문에 비즈니스 정책이 크게 변경되지 않는 한 안정적으로 유지된다.
•
객체지향의 가장 큰 장점은 도메인을 모델링하기 위한 기법과 도메인을 프로그래밍하기 위해 사용하는 기법이 동일하다는 점이다.
◦
앞서 객체지향의 이런 특징을 연결완전성이라고 했다.
•
객체지향이 강력한 또다른 이유 하나는 연결완전성의 역방향 역시 성립한다는 것이다. 즉 코드의 변경으로부터 도메인 모델의 변경사항을 유추할 수 있다.
◦
객체지향 이전의 개발 방법에서는 대응이 어려웠으나 객체지향에서는 도메인 모델과 코드가 동일한 모델링 패러다임을 공유하기 때문에 대처가 가능하다.
◦
이처럼 모델에서 코드로의 매끄러운 흐름을 의미하는 연결완전성과 반대로 코드에서 모델로의 매끄러운 흐름을 의미하는 것을 가역성이라고 한다.
•
도메인 모델은 문서나 다이어그램이 아니다. 도메인 모델은 사람들의 머릿속에 들어있는 공유된 멘탈 모델이다.
◦
사람들이 동일한 용어와 개념을 이용해 의사소통하고 코드로부터 도메인 모델을 유추할 수 있게 하는 것이 도메일 모델의 진정한 목표다.
•
안정적인 도메인 모델을 구조로 시스템의 기능을 구현하라. 도메인 모델과 코드를 밀접하게 연관시키게 위해 노력하라. 그것이 유지보수하기 쉽고 유연한 객체지향 시스템을 만드는 첫걸음이 될 것이다.