서문
여행 중에 길을 찾는 것을 예시로, 사람에게 직접 길을 묻는 방법과, 지도를 이용해 길을 찾는 방법을 제시한다.
길을 묻는 방법은 '기능적이고 해결책 지향적인 접근법'이다. 그러나 일반적이지 않고 재사용 가능하지 않다.
이에 비해 지도는 '구조적이고 문제 지향적인 접근법'이다. 길을 찾는 구체적인 기능이 아닌 길을 찾을 수 있도록 구조를 제공한다.
지도가 더 범용적인 이유는 지도를 사용하려는 사람들이 원하는 기능에 비해 지도에 표시된 구조가 더 안정적이기 때문이다. 지도를 이용하면 A에서 B의 길을 찾을 때 A와 B가 어디든지 구할 수 있다. 즉 요구사항이 계속 변해도 안정적인 구조 덕분에 수용할 수 있다.
이 비유의 핵심은 기능이 아니라 구조를 기반으로 모델을 구축하는 편이 좀 더 범용적이고 이해하기 쉬우며 변경에 안정적이라는 것이다. 요구사항은 계속 변하기 때문에 제공해야할 기능 또한 계속 변하지만, 구조가 안정적이라면 변화에 유연하게 대처할 수 있다.
이번 장의 주제는 자주 변경되는 기능이 아니라 안정적인 구조를 따라 역할, 책임, 협력을 구성하라는 것이다.
기능 설계 대 구조 설계
소프트웨어 제품의 설계에는 기능측면의 설계와, 구조 측면의 설계로 나뉜다. 소프트웨어 개발의 초기 단계에서는 사용자가 무엇을 원하고, 이를 위해 어떤 기능을 제공해야 하는지 초점을 맞춰야 한다.
훌륭한 기능이 훌륭한 소프트웨어를 만드는 충분조건이라면 훌륭한 구조는 필요조건이다. 안정적인 구조는 사용자의 변하는 요구사항을 반영할 수 있도록 쉽게 확장 가능한 소프트웨어를 창조할 수 있는 기반이 된다.
미래에 요구사항이 어떻게 변경될지 모르고, 우리는 이를 예측할 수 없다. 그러나 대비할 수는 있다. 미래에 대비하는 가장 좋은 방법은 변경을 예측하는 것이 아니라 변경을 수용할 수 있는 선택의 여지를 설계에 마련해 놓는 것이다.
객체지향은 자주 변경되지 않는 안정적인 객체 구조를 바탕으로 시스템 기능을 객체 간의 책임으로 분배한다. 시스템 기능은 더 작은 책임으로 분할되고 적절한 객체에게 분배되기 때문에 기능이 변경되더라도 객체 간의 구조는 유지된다.
이것이 객체를 기반으로 책임과 역할을 식별하고 메시지를 기반으로 객체들의 협력 관계를 구축하는 이유이다. 안정적인 객체 구조는 변경을 수용할 수 있는 기반을 제공한다.
두 가지 재료 : 기능과 구조
객체지향 세계를 구축하기 위해서는 사용자에게 제공할 기능과 기능을 담을 안정적인 구조라는 재료가 필요하다. 이 두 재료를 구하는 두 가지 기법이 있다.
- 구조는 사용자나 이해관계자들이 도메인에 관해 생각하는 개념과 개념들 간의 관계로 표현한다.
- 기능은 사용자의 목표를 만족시키기 위해 책임을 수행하는 시스템의 행위로 표현한다.
안정적인 재료 : 구조
사용자가 프로그램을 사용하는 대상 분야를 도메인이라고 한다.
모델은 지식을 선택적으로 단순화하고 의식적으로 구조화한 형태다. 즉 대상을 추사오하하고 단순화한 것이다.
도메인 모델이란 사용자가 프로그램을 사용하는 대상 영역에 관한 지식을 선택적으로 단순화하고 의식적으로 구조화한 형태다. 개념과 개념 간의 관계, 다양한 규칙이나 제약 등을 주의 깊게 추상화한 것이다. 소프트웨어 개발과 관련된 이해관계자들이 도메인에 대해 생각하는 관점이다.
최종 코드는 사용자가 도메인을 바라보는 관점을 반영해야 한다. 곧 애플리케이션이 도메인 모델을 기반으로 설계되야 한다는 것을 의미한다. 객체지향을 사용하면 사용자들이 이해하고 있는 도메인의 구조와 최대한 유사하게 코드를 구조화 할 수 있다.
따라서 객체지향을 이용하면 도메인에 대한 사용자 모델, 디자인 모델, 시스템 이미지가 모두 유사한 모습을 유지하도록 만드는 것이 가능하다. 이런 객체지향의 특성을 연결완전성 또는 표현적 차이라고 한다.
안정적인 구조를 제공하는 도메인 모델을 기반으로 소프트웨어의 구조를 설계하면 변경에 유연하게 대응할 수 있는 탄력적인 소프트웨어를 만들 수 있다.
불안정한 재료 : 기능
기능적 요구사항을 얻기 위해서는 목표를 가진 사용자와 목표를 만족시킬 시스템 간의 상호작용 관점에서 시스템을 바라봐야 한다. 사용자의 목표를 달성하기 위해 사용자와 시스템 간에 이뤄지는 상호작용의 흐름을 텍스트로 정리한 것을 유스케이스라고 한다.
유스케이스의 몇 가지 특성을 살펴보자.
- 유스케이스는 사용자와 시스템 간의 상호작용을 보여주는 텍스트다. 상호작용을 일련의 이야기 흐름으로 표현한다는 것이다.
- 유스케이스는 여러 시나리오들의 집합이다.
- 유스케이스는 단순한 피처 목록과 다르다. 피처란 시스템이 수행해야 하는 기능의 목록을 단순하게 나열한 것이다. 유스케이스는 단순히 기능을 나열하는 것이 아니라 이야기를 통해 연관된 기능을 함께 묶는다.
- 사용자 인터페이스와 관련된 세부 정보를 포함하지 말아야 한다. 인터페이스가 아닌 사용자 관점에서 시스템의 행위에 초점을 맞춘다.
- 내부 설계와 관련된 정보를 포함하지 않는다. 유스케이스는 기능을 이야기 형식으로 모으는 것이지 내부 설계를 설명하는 것이 아니다. 유스케이스는 개체의 구조나 책임에 대한 어떤 정보도 제공하지 않는다.
재료 합치기 : 기능과 구조의 통합
불안정한 기능을 안정적인 구조에 담아서 변경에 대한 파급효과를 최소화하는 것이 훌륭한 객체지향 설계자가 갖출 설계 능력이다. 도메인 모델은 안정적인 구조를 개념화하기 위해, 유스케이스는 불안정한 기능을 서술하기 위해 사용되는 도구이다. 유연한 소프트웨어를 만들기 위해 유스케이스에 정리된 시스템의 기능을 도메인 모델을 기반으로 한 객체들의 책임으로 분배해야 한다.
책임 주도 설계는 유스케이스로부터 첫 번째 메시지와 사용자가 달성하려는 목표를, 도메일 모델로부터 기능을 사용할 수 있는 안정적인 구조를제공받아 실제로 동작하는 객체들의 협력 공동체를 창조한다. 즉 유스케이스와 도메인 모델을 통합한다.
견고한 객체지향 애플리케이션을 개발하기 위해서는 사용자의 관점에서 시스템의 기능을 명시하고, 사용자와 설계자가 공유하는 안정적인 구조를 기반으로 기능을 책임으로 변환하는 체계적인 절차를 따라야 한다는 것이다.
객체지향의 큰 장점은 도메인을 모델링하기 위한 기법과 도메인을 프로그래밍하기 위해 사용하는 기법이 동일하다는 점이다. 따라서 도메인 모델링에서 사용한 객체와 개념을 프로그래밍 설계에서의 객체와 클래스로 변환할 수 있다. 이를 연결완전성이라고 한다. 또한 역방향도 성립한다. 이를 가역성이라고 한다.
안정적인 도메인 모델을 기반으로 시스템의 기능을 구현하고, 도메인 모델과 코드를 밀접하게 연관시키기 위해 노력해라. 이것이 유지보수하기 쉽고 유연한 객체지향 시스템을 만드는 첫 걸음이 된 것이다.
느낀점
안정적인 구조가 아닌 기능을 중심으로 소프트웨어를 설계하면 변화에 대응하기 어렵다는 사실을 깨달았다.
또한 예전에 기능을 중심으로 코드를 짜다가 코드가 덕지덕지 지저분하고 변경도 힘들었던 경험이 떠올랐다.
중요한 것은 도메인 모델을 기반으로 안정적인 구조를 설계한 후 기능을 구현하는 것이다.
'프로그래밍 이론 & 책 > 객체지향의 사실과 오해' 카테고리의 다른 글
[객체지향] 7. 함께 모으기 (0) | 2020.06.24 |
---|---|
[객체지향] 5. 책임과 메시지 (0) | 2020.06.22 |
[객체지향] 4. 역할, 책임, 협력 (0) | 2020.06.19 |
[객체지향] 3. 타입과 추상화 (0) | 2020.06.18 |
[객체지향] 2. 이상한 나라의 객체 (0) | 2020.06.17 |