개발 도서 정리/객체지향의 사실과 오해

6장 객체 지도(1) 객체 지도 - 기능과 구조

말조랑 2023. 1. 15. 12:20

 

 기능 설계 대 구조 설계

 

모든 소프트웨어 제품의 설계에는 두 가지 측면이 존재한다.

하나는 '기능' 측면의 설계이고, 다른 하나는 '구조' 측면의 설계다.

기능 측면의 설계는 제품이 사용자를 위해 무엇을 할 수 있는지에 초점을 맞춘다.

구조 측면의 설계는 제품의 형태가 어떠해야 하는지에 초점을 맞춘다.

설계의 가장 큰 도전은 기능과 구조라는 두 가지 측면을 함께 녹여 조화를 이루도록 만드는 것이다.

 

소프트웨어가 사용자에게 가치 있는 이유는 사용자가 필요로 하는 기능을 제공하기 때문이다.

따라서 소프트웨어를 개발하는 초기 단계에서는 사용자가 무엇을 원하는지, 그리고 사용자가 원하는 것을 만족시키기 위해 시스템이 어떤 기능을 제공해야 하는지에 초점을 맞춰야 한다.

 

훌륭한 구조는 훌륭한 소프트웨어를 만들기 위한 필요조건이다.

깔끔하고 단순하며 유지보수하기 쉬운 설계는 사용자의 변하는 요구사항을 반영할 수 있도록 쉽게 확장 가능한 소프트웨어를 창조할 수 있는 기반이 된다.

 

소프트웨어 분야에서 예외가 없는 유일한 규칙은 요구사항이 항상 변경된다는 것이다.

변경을 피할 수 있는 방법은 없기 때문에 좋은 설게에 대한 압력 역시 피할 수 없다.

훌륭한 설계자는 훌륭한 기능을 제공하는 동시에 안정적인 구조를 제공하는 능력을 갖춰야 한다.

 

우리는 미래를 예측할 수 없다. 단지 대비할 수 있을 뿐이다.

미래에 대비하는 가장 좋은 방법은 변경을 수용할 수 있는 선택의 여지를 설계에 마련해 놓는 것이다.

 

기능 분해 방법의 경우 기능이 변경될 경우 기능의 축을 따라 설계된 소프트웨어가 전체적으로 요동치게 된다.

이에 비해 객체지향 접근방법은 자주 변경되지 않는 안정적인 객체 구조를 바탕으로 시스템 기능을 객체 간의 책임으로 분배한다.

시스템 기능은 더 작은 책임으로 분할되고 적절한 객체에게 분배되기 때문에 기능이 변경되더라도 객체 간의 구조는 그대로 유지된다.

 

객체 지도는 빠르게 변화하는 기능을 수용할 수 있는 자리를 제공한다.  

 

 


 

두 가지 재료: 기능과 구조

 

객체지향 세계를 구축하기 위해서는 사용자에게 제공할 '기능'과

기능을 담을 안정적인 '구조'라는 재료가 준비돼 있어야 한다.

 

이제 초점은 이 두 재료를 어디에서 구하느냐로 이동한다.

사람들은 기능과 구조를 표현하기 위해 두 가지 기법을 발견했다.

 

  1. 구조는 사용자나 이해관계자들이 도메인에 관해 생각하는 개념과 개념들 간의 관계로 표현한다.
  2. 기능은 사용자의 목표를 만족시키기 위해 책임을 수행하는 시스템의 행위로 표현한다.

일반적으로 기능을 수집하고 표현하기 위한 기법을 유스케이스 모델링이라고 하고

구조를 수집하고 표현하기 위한 기법을 도메인 모델링이라고 한다.

 

두 가지 모델링 활동의 결과물을 각각 유스케이스도메인 모델이라고 한다.

 

 


 

안정적인 재료: 구조

 

 

도메인 모델

 

모든 소프트웨어는 사용자의 필요성을 충족시키기 위해 존재한다.

소프트웨어를 사용하는 사람들은 자신이 관심을 가지고 있는 특정한 분야의 문제를 해결하기 위해 소프트웨어를 사용한다.

이처럼 사용자가 프로그램을 사용하는 대상 분야를 도메인이라고 한다.

 

도메인 모델에서 모델이란 대상을 단순화해서 표현한 것이다.

모델은 지식을 선택적으로 단순화하고 의식적으로 구조화한 형태다.

즉, 대상을 추상화하고 단순화한 것이다.

모델을 사용하면 현재의 문제와 관련된 측면은 추상화하고 관련 없는 세부 사항에 대해서는 무시할 수 있다.

 

도메인과 모델의 정의를 연결하면 도메인 모델을 쉽게 정의할 수 있다.

도메인 모델이란 사용자가 프로그램을 사용하는 대상 영역에 관한 지식을 선택적으로 단순화하고 의식적으로 구조화한 형태이다.

도메인 모델은 소프트웨어가 목적하는 영역 내의 개념과 개념 간의 관계, 다양한 규칙이나 제약 등을 주의 깊게 추상화한 것이다.

도메인 모델은 소프트웨어 개발과 관련된 이해관계자들이 도메인에 대해 생각하는 관점이다.

 

도메인 모델은 단순히 다이어그램이 아닌, 이해관계자들이 바라보는 멘탈 모델이다.

멘탈 모델이란 사람들이 자기 자신, 다른 사람, 환경, 자신이 상호작용하는 사물들에 대해 갖는 모형이다.

소프트웨어 사용자들은 도메인에 존재하는 현상을 이해하고 현상에 반응하기 위해 도메인과 관련된 멘탈 모델을 형성한다.

 

도널드 노먼은 제품을 설계할 때 제품에 관한 모든 것이 사용자들이 제품에 대해 가지고 있는 멘탈 모델과 정확하게 일치해야 한다고 주장한다.

노먼은 그림 6.3과 같이 멘탈 모델을 사용자 모델, 디자인 모델, 시스템 이미지의 세 가지로 구분한다.

사용자 모델은 사용자가 제품에 대해 가지고 있는 개념들의 모습이다.

디자인 모델은 설계자가 마음 속에 갖고 있는 시스템에 대한 개념화다.

시스템 이미지는 최종 제품이다.

 

멘탈 모델의 세 가지 측면

 

사용자와 설계자는 직접적으로 상호작용할 수 없으며 시스템을 통해서만 의사소통할 수 있다.

따라서 설계자는 디자인 모델을 기반으로 만든 시스템 이미지가 사용자 모델을 정확하게 반영하도록 노력해야 한다.

 

도메인 모델은 도메인에 대한 사용자 모델, 디자인 모델, 시스템 이미지를 포괄하도록 추상화한 소프트웨어 모델이다.

따라서 도메인 모델은 소프트웨어에 대한 멘탈 모델이다.

 

 

도메인의 모습을 담을 수 있는 객체지향

 

도널드 노먼의 주장은 최종 제품은 사용자의 관점을 반영해야 한다는 것이다.

이는 소프트웨어 개발에서도 적용된다.

최종 코드는 사용자가 도메인을 바라보는 관점을 반영해야 한다.

이것은 곧 애플리케이션이 도메인 모델을 기반으로 설계돼야 한다는 것을 의미한다.

 

따라서 도메인 모델의 세 가지 측면을 모두 모델링할 수 있는 유사한 모델링 패러다임을 사용할수록 소프트웨어 개발이 쉬워질 것이다.

객체지향은 이런 요구사항을 가장 범용적으로 만족시킬 수 있는 거의 유일한 모델링 패러다임이다.

 

객체지향을 사용하면 사용자들이 이해하고 있는 도메인의 구조와 최대한 유사하게 코드를 구조화할 수 있다.

결과적으로 도메인에 대한 사용자 모델, 디자인 모델, 시스템 이미지 모두가 유사한 모습을 유지하도록 만드는 것이 가능하다.

객체지향의 이러한 특징을 연결완전성, 또는 표현적 차이 라고 한다.

 

 

표현적 차이

 

소프트웨어 객체는 현실 객체를 모방한 것이 아니라 은유를 기반으로 재창조한 것이다.

따라서 소프트웨어 객체는 현실 객체가 갖지 못한 특성을 가질 수도 있고 현실 객체가 하지 못하는 행동을 할 수도 있다.

 

비록 소프트웨어 객체가 현실 객체를 왜곡한다고 하더라고 소프트웨어 객체는 현실 객체의 특성을 토대로 구축된다.

이처럼 소프트웨어 객체와 현실 객체 사이의 의미적 거리를 가리켜 표현적 차이 또는 의미적 차이라고 한다.

핵심은 현실과 소프트웨어 객체 사이의 차이를 최대한 줄이는 것이다.

 

안타깝게도 대부분의 소프트웨어 도메인은 현실에 존재하지 않는 가상의 세계를 대상으로 한다. (게임, 인터넷... 등)

그래서 우리가 은유를 통해 투영해야 할 대상은 사용자가 도메인에 대해 생각하는 개념들이다.

바로 도메인 모델이 은유해야 할 대상이다.

 

따라서 소프트웨어 객체는 그 대상이 현실적인지 여부에 상관없이 도메인 모델을 통해 표현되는 도메인 객체들을 은유해야 한다.

이것이 도메인 모델이 중요한 이유이다.

도메인 모델을 기반으로 설계하고 구현하는 것은 사용자가 도메인을 바라보는 관점을 그대로 코드에 반영할 수 있게 한다.

결과적으로 표현적 차이는 줄어들 것이다.

 

 

표현적 차이가 중요한 이유는 소프트웨어를 이해하고 수정하기 쉽게 만들어주기 때문이다.

코드의 구조가 도메인의 구조를 반영하기 때문에 도메인을 이해하면 코드를 이해하기가 훨씬 수월해진다.

결국 도메인 모델은 코드 안에 존재하는 미로를 헤쳐나갈 수 있는 지도를 제공한다.

 

 

불안정한 기능을 담는 안정적인 도메인 모델

도메인 모델을 기반으로 코드를 작성하는 두 번째 이유는 도메인 모델이 제공하는 구조가 상대적으로 안정적이기 때문이다.

 

도메인 모델의 핵심은 사용자의 관점에서 소프트웨어를 설계하고 구현하는 것이며,

이는 사용자들이 누구보다도 도메인의 '본질적인' 측면을 가장 잘 이해하고 있기 때문이다.

사용자들은 도메인을 구성하는 중요한 개념과 개념 간의 관계를 가장 잘 알고 있는 사람들이다.

 

본질적이라는 것은 변경이 적고 비교적 그 특성이 오랜 시간 유지된다는 것을 의미한다.

사용자 모델에 포함된 개념과 규칙은 비교적 변경될 확률이 적기 때문에 사용자 모델을 기반으로 설계와 코드를 만들면 변경에 쉽게 대처할 수 있을 가능성이 커진다.

 

비록 도메인 모델이 도메인과 관련된 중요한 개념과 관계를 보여준다고 해도 실제로 사용자에게 중요한 것은 도메인 모델이 아니라 소프트웨어의 기능이다.

따라서 사용자에게 제공할 기능을 기술한 정보가 필요하다.

객체지향 커뮤니티에서는 오래 전부터 소프트웨어의 기능을 기술하기 위해 유스케이스라는 유용한 기법을 사용해왔다.