6장 : 객체 지도

객체지향이 구조와 기능이라는 두 가지 관점의 조회 과정을 설명.

구조는 기능에 비해 변화에 더 안정적이므로, 구조 안에 기능을 녹임으로써 변화에 안정적인 소프트웨어를 개발할 수 있도록 한다.

(도메인 모델을 안다면, 여기서 도메인 모델과 객체지향 패러다임 사이의 관계를 이해할 수 있다)

유일하게 변하지 않는 것은 모든 것이 변한다는 사실뿐이다.

기능 설계 대 구조 설계

✔️ 소프트웨어 제품의 설계의 두 가지 측면

  • ‘기능’ : 제품이 사용자를 위해 무엇을 할 수 있는지에 초점을 맞춘다.

  • ‘구조’ : 제품의 형태가 어떠해야 하는지에 초점을 맞춘다.

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

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

  • 훌륭한 기능이 훌륭한 소프트웨어를 만드는 충분조건이라고 한다면 훌륭한 구조는 훌륭한 소프트웨어를 만들기 위한 필요조건이다.

  • 훌륭한 설계자는 사용자가 만족할 수 있는 훌륭한 기능을 제공하는 동시에 예측 불가능한 요구사항 변경에 유연하게 대처할 수 있는 안정적인 구조를 제공한다.

more

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

설계를 하는 목적은 나중에 설계하는 것을 허용하는 것이며, 설계의 일차적인 목표는 변경에 소요되는 비용을 낮추는 것이다.

객체지향 접근방법은 자주 변경되지 않는 안정적인 객체 구조를 바탕으로 시스템 기능을 객체 간의 책임으로 분배한다. 객체지향은 객체의 구조에 집중하고 기능이 객체의 구조를 따르게 만든다. 시스템 기능은 더 작은 책임으로 분할되고 적절한 객체에게 분배되기 때문에 기능이 변경되더라도 객체 간의 구조는 그대로 유지된다.

안정적인 객체 구조는 변경을 수용할 수 있는 유연한 소프트웨어를 만들 수 있는 기반을 제공한다.

두 가지 재료 : 기능과 구조

기능

  • 사용자가 자신의 목표를 달성하기 위해 사용할 수 있는 시스템의 서비스이다.

  • 기능은 사용자의 목표를 만족시키디 위해 책임을 수행하는 시스템의 행위로 표현한다.

구조

  • 시스템의 기능을 구현하기 위한 기반으로, 기능 변경을 수용할 수 있도록 안정적이어야 한다.

  • 구조는 사용자나 이해관계자들이 도메인(domain)에 관해 생각하는 개념과 개념들 간의 관계로 표현한다.

일반적으로 기능을 수집하고 표현하기 위한 기법을 유스케이스 모델링이라고 하고 구조를 수집하고 표현하기 위한 기법을 도메인 모델링이라고 한다. 각각 모델링 활동의 결과물을 유스케이스와 도메인 모델이라고 한다.

안정적인 재료 : 구조

도메인 모델

  • 모든 소프트웨어는 사용자의 필요성을 충족시키기 위해 존재한다. 사용자가 프로그램을 사용하는 대상 분야를 도메인이라고 한다.

  • 도메인 모델에서 모델이란 대상을 단순화해서 표현한 것이다. 즉, 대상을 추상화하고 단순화한 것이다.

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

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

  • 도메인 모델은 이해관계자들이 바라보는 **멘탈 모델(Mental Model)**이다.

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

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

example

병원에서는 모든 환자의 진료 기록을 보관하고 분석하기 위해 소프트웨어를 사용한다.

은행에서는 고객의 소중한 자산을 관리하고 보호하기 위해 소프트웨어를 사용한다.

무료한 시간을 달래기 위해 사람들은 게임 소프트웨어에 열중한다.

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

도메인 모델이란
  • 사용자들이 도메인을 바라보는 관점 (사용자의 관점)

  • 설계자가 시스템의 구조를 바라보는 관점 (설계자의 관점)

  • 소프트웨어 안에 구현된 코드의 모습 그 자체 (코드의 모습)

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

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

  • 객체지향은 도메인 모델을 가장 범용적으로 만족시킬 수 있는 모델링 패러다임이다.

    • 사람들이 만지고 느끼고 볼 수 있는 실체를 시스템 안의 객체로 재창조할 수 있게 해준다.

    • 도메인에 대한 사용자 모델, 디자인 모델, 시스템 이미지가 모두 유사한 모습을 유지하도록 만들 수 있다. (연결 완전성, 표현적 차이)

표현적 차이

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

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

  • 핵심은 은유를 통해 현실 객체와 소프트웨어 객체 사이의 차이를 줄이는 것이다.

  • 소프트웨어 객체를 창조하기 위해 우리가 은유해야 하는 대상은 바로 도메인 모델이다.

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

  • 도메인 모델의 핵심은 사용자가 도메인을 바라보는 관점을 반영해 소프트웨어를 설계하고 구현하는 것이다.

  • 도메인에 대한 사용자의 관점을 반영해야 하는 이유는 사용자들이 누구보다도 도메인의 ‘본질적인’ 측면을 가장 잘 이해하고 있기 때문이다.

  • 본질적이라는 것은 변경이 적고 비교적 그 특성이 오랜 시간 유지된다는 것을 의미한다. (소프트웨어 개발자의 가장 큰 적은 변경 ..ㅠ)

  • 결론 적으로 도메인 모델을 기반으로한 소프트웨어의 구조는 상대적으로 안정적이며, 변경에 유연하게 대응할 수 있는 탄력적인 소프트웨어를 만드는데 도움이 된다.

불안정한 재료 : 기능

유스케이스

  • 시스템은 사용자들이 시스템을 통해 달성하고자 하는 ‘목표’를 달성하기 위한 기능을 제공해야 한다.

  • 훌륭한 기능적 요구사항을 얻기 위해서는 목표를 가진 사용자와 사용자의 목표를 만족시키기 위해 일련의 절차를 수행하는 시스템 간의 ‘상호작용’ 관점에서 시스템을 바라봐야 한다.

  • 사용자의 목표를 달성하기 위해 사용자와 시스템 간에 이뤄지는 상호작용의 흐름을 텍스트로 정리한 것을 유스케이스라고 한다.

    • 유스케이스의 가치는 사용자들의 목표를 중심으로 시스템의 기능적인 요구사항들을 이야기 형식으로 묶을 수 있다는 점이다.

    • 산발적으로 흩어져 있는 기능에 사용자 목표라는 문맥을 제공함으로써 각 기능이 유기적인 관계를 지닌 체계를 이룰 수 있게 한다.

💡 사용자 목표가 유스케이스의 핵심이다. 유스케이스는 공통의 사용자 목표를 통해 강하게 연관된 시나리오의 집합이다.

example

🖇 유스케이스명 : 중도 해지 이자액을 계산한다.

🫧 일차 액터 : 예금주

🍄 주요 성공 시나리오 :

  1. 예금주가 정기예금 계좌를 선택한다.

  2. 시스템은 정기예금 계좌 정보를 보여준다.

  3. 예금주가 금일 기준으로 예금을 해지할 경우 지급받을 수 있는 이자 계산을 요청한다.

  4. 시스템은 중도 해지 시 지급받을 수 있는 이자를 계산한 후 결과를 사용자에게 제공한다.

🐠 확장 :

3a. 사용자는 해지 일자를 다른 일자로 입력할 수 있다.

유스케이스의 특성

  1. 유스케이스는 사용자와 시스템 간의 상호작용을 보여주는 ‘텍스트’다. 다이어그램이 아니다. 중요한 것은 유스케이스에 담겨 있는 이야기다.

  2. 유스케이스는 하나의 시나리오가 아니라 여러 시나리오들의 집합니다. 시나리오는 유스케이스를 통해 시스템을 사용하는 하나의 특정한 이야기 또는 경로다. 시나리오를 유스케이스 인스턴스(use case instance)라고도 한다.

  3. 유스케이스는 단순한 피처(feature) 목록과 다르다. 피처는 시스템이 수행해야 하는 기능의 목록을 단순하게 나열한 것이다. 유스케이스의 강점은 유스케이스가 단순히 기능을 나열하는 것이 아니라 이야기를 통해 연관된 기능들을 함께 묶을 수 있다는 점이다.

  4. 유스케이스는 사용자 인터페이스와 관련된 세부 정보를 포함하지 말아야 한다. 유스케이스는 자주 변경되는 사용자 인터페이스 요소는 배제하고 사용자 관점에서 시스템의 행위에 초점을 맞춘다.

  5. 유스케이스는 내부 설계와 관련된 정보를 포함하지 않는다.

유스케이스는 설계 기법도, 객체지향 기법도 아니다.

  • 유스케이스에는 단지 사용자가 시스템을 통해 무엇을 얻을 수 있고 어떻게 상호작용할 수 있느냐에 관한 정보만 기술된다.

  • 유스케이스는 객체의 구조나 책임에 대한 정보를 제공하지 않는다.

재료 합치기 : 기능과 구조의 통합

도메인 모델, 유스케이스, 그리고 책임-주도 설계

  • 도메인 모델은 안정적인 구조를 개념화하기 위해, 유스케이스는 불안정한 기능을 서술하기 위해 가장 일반적으로 사용되는 구조다.

  • 변경에 유연한 소프트웨어를 만들기 위해서는 유스케이스에 정리된 시스템의 기능을 도메인 모델을 기반으로 한 객체들의 책임으로 분배해야 한다.

  • 시스템은 사용자로부터 전송된 메시지를 수행하기 위해 책임을 수행하는 거대한 자율적인 객체로 본다. 시스템이 수행해야 하는 커다란 규모의 책임은 시스템 안에 살아가는 더 작은 크기의 객체들의 협력을 통해 구현될 수 있다.

more(pic)

...

협력의 첫 걸음은 시스템의 기능을 시스템의 책임으로 바꾼 후 얻어진다. (책임-주도 설계) 시스템에 할당된 커다란 책임은 시스템 안의 작은 규모의 객체들이 수행해야 하는 더 작은 규묘의 책임으로 세분화된다. 책임을 수행하는 객체는 도메인 모델에 포함된 개념을 은유하는 소프트웨어 객체를 선택해야 한다 (도메인 모델) .협력을 완성하는 데 필요한 메시지를 식별하면서 객체들에게 책임을 할당해준다. 마지막으로 협력에 참여하는 객체를 구현하기 위해 클래스를 추가하고 속성과 함께 메서드를 구현하면 시스템의 기능이 완성된 것이다.

객체설계는 요구사항들을 식별하고 도메인 모델을 생성한 후, 소프트웨어 클래스에 메서드들을 추가하고, 요구사항을 충족시키기 위해 객체들 가느이 메시지 전송을 정의하는 것이다.

💡 견고한 객체지향 애플리케이션을 개발하기 위해서는 사용자의 관점에서 시스템의 기능을 명시하고, 사용자와 설계자가 공유하는 안정적인 구조를 기반으로 기능을 책임으로 변환하는 체계적인 절차를 따라야 한다는 것이다.

  • 유스케이스는 사용자에게 제공할 기능을 시스템의 책임으로 보게 함으로써 객체 간의 안정적인 구조에 책임을 분배할 수 있는 출발점을 제공한다.

  • 도메인 모델은 기능을 수용하기 위해 은유할 수 있는 안정적인 구조를 제공한다.

  • 책임-주도 설계는 유스케이스로부터 첫 번째 메시지와 사용자가 달성하려는 목표를, 도메인 모델로 부터 기능을 수용할 수 있는 안정적인 구조를 제공받아 실제로 동작하는 객체들의 협력 공동체를 창조한다.

    • 책임-주도 설계 방법은 시스템의 기능을 역할과 책임을 수행하는 객체들의 협력 관계로 바라보게 함으로써 두 가지 기본 재료인 유스케이스와 도메인 모델을 통합한다.

example

이자 계산 기능 구현...

기능 변경을 흡수하는 안정적인 구조

✔️ 도메인 모젤이 안정적인 이유

  • 도메인 모델을 구성하는 개념은 비즈니스가 없어지거나 완전히 개편되지 않는 한 안정적으로 유지된다.

  • 도메인 모델을 구성하는 개념 간의 관게는 비즈니스 규칙을 기반으로 하기 때문에 비즈니스 정책이 크게 변경되지 않는 한 안정적으로 유지된다.

💡 안정적인 도메인 모델을 기반으로 시스템의 기능을 구현하라. 도메인 모델과 코드를 밀접하게 연관시키기 위해 노력하라.

  • 객체지향의 가장 큰 장점은 도메인을 모델링하기 위한 기법과 도메인을 프로그래밍하기 위해 사용하는 기법이 동일하다는 점이다.

  • 따라서 도메인 모델링에서 사용한 객체와 개념을 프로그래밍 설계에서의 객체와 클래스로 변환하기 용이하다. (연결완전성)

  • 이 연결완정성의 역방향 역시 성립하는데, 코드의 변경으로부터 도메인 보델의 변경 사항을 유추할 수 있다. (가역성)

Last updated