Chapter 6. 객체 지도

이은지·2024년 1월 11일
0

0. 개요

💛 다른 사람에게 마을로 가는 길을 물어보는 방법?

  1. 지나가는 사람에게 마을까지 가는 길을 직접 물어보는 것
  • 기능적이고 해결책 지향적인 접근법
  • 현재의 마을에서 다른 마을로 이동하는 현재의 요구만을 만족시킬 수 있음
  1. 지도에 표시된 길을 따라가는 방법
  • 구조적이고 문제 지향적인 접근법
  • 현재의 목적뿐만 아니라 다양한 목적을 위해 재사용될 수 있음

💛 지도은유를 객체지향에 적용하면?

  • 전통적인 소프트웨어 개발 방법은 빈번하게 발생하는 기능에 안정적인 구조를 종속시키는 길을 묻는 방법과 유사
  • 반면 객체지향 개발 방법은 안정적인 구조에 변경이 빈번하게 발생하는 기능을 종속시키는 지도의 방법과 유사
  • 이것이 객체지향이 과거의 전통적인 방법보다 범용적이고, 재사용성이 높으며, 변경에 안정적인 이유

💡 이번 장에서는 기능이 아니라 구조를 바탕으로 시스템을 분할하는 객체지향에 대해 설명하고, 자주 변경되는 기능이 아니라 안정적인 구조를 따라 역할, 책임, 협력을 구성하라는 것이 이번 장의 주제 !

1. 기능 설계 대 구조 설계

소프트웨어 제품 설계 → 기능/구조 두 가지 측면 존재

  • 기능 측면의 설계 : 제품이 사용자를 위해 무엇을 할 수 있는지에 초점
  • 구조 측면의 설계: 제품의 형태가 어떠해야 하는지에 초점

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

💛 훌륭한 기능=소프트웨어의 충분조건

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

💛 훌륭한 구조=소프트웨어의 필요조건

사용자가 원하는 새로운 기능을 빠르고 안정적으로 추가할 수 있어야 함. 최종 사용자들이 소프트웨어의 내부 구조를 볼 수는 없지만 깔끔하고 단순하며 유지보수하기 쉬운 설계는 사용자의 변하는 요구사항을 반영할 수 있도록 쉽게 확장 가능한 소프트웨어를 창조할 수 있는 기반이 됨

💡 요구사항이 변경되지 않을 경우는 훌륭한 기능만 필요하겠지만, 요구사항은 항상 변경되기 때문에 좋은 설계는 자주 변경되는 기능이 아닌 안정적인 구조를 중심으로 설계하는 것이다.

💛 객체지향 접근방법의 설계

  • 자주 변경되지 않는 안정적인 객체 구조를 바탕으로 시스템 기능을 객체 간의 책임으로 분배
  • 객체의 구조에 집중하고 기능이 객체의 구조를 따르게 만들어 기능이 변경되더라도 객체 간의 구조는 그대로 유지
  • 이것이 객체를 기반으로 책임과 역할을 식별하고 메시지를 기반으로 객체들의 협력 관계를 구축하는 이유이며, 안정적인 객체 구조는 변경을 수용할 수 있는 유연한 소프트웨어를 만들 수 있는 기반을 제공

2. 두가지 재료: 기능과 구조

💛 객체지향 개발에서 기능과 구조

  • 구조 : 사용자나 이해관계자들이 도메인(domain)에 관해 생각하는 개념과 개념들 간의 관계
    • 구조를 수집하고 표현하기 위한 기법을 도메인 모델링이라고 함
    • 해당 결과물을 도메인 모델이라고 함
  • 기능 : 사용자의 목표를 만족시키기 위해 책임을 수행하는 시스템의 행위
    • 기능을 수집하고 표현하기 위한 기법을 유스케이스 모델링이라고 함
    • 해당 결과물을 유스케이스라고 함



3. 안정적인 재료: 구조

💛 도메인 모델

  • 사용자가 프로그램을 사용하는 대상 영역에 관한 지식을 선택적으로 단순화하고 의식적으로 구조화한 형태
  • 다이어그램이 아닌 멘탈모델
    • 사람들이 자기 자신, 다른 사람, 환경, 자신이 상호작용하는 사물들에 대해 갖는 모형
    • 도널드 노먼의 멘탈모델
      • 제품을 설계할 때 제품에 관한 모든 것이 사용자들이 제품에 대해 가지고 있는 멘탈 모델과 정확히 일치해야 함
      • 멘탈모델 = 사용자 모델+디자인 모델+시스템 이미지
      • 최종 제품은 사용자의 관점을 반영해야 함

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

  • 애플리케이션은 도메인 모델을 기반으로 설계되어야 함
  • 객체지향은 이런 요구사항을 만족시킬 수 있는 거의 유일한 모델링 패러다임
  • 객체지향을 이용하면 도메인에 대한 사용자 모델, 디자인 모델, 시스템 이미지 모두가 유사한 모습을 유지하도록 만드는 것이 가능 → 이러한 특징을 연결완전성, 표현적 차이라고 함

💛 표현적 차이

  • 소프트웨어 객체와 현실 객체 사이의 의미적 거리
  • 핵심은 은유를 통해 현실 객체와 소프트웨어 객체 사이의 차이를 최대한 줄이는 것
  • 소프트웨어 객체를 창조하기 위해 은유해야 하는 대상은 바로 도메인 모델
    • 사용자가 도메인에 대해 생각하는 개념들
  • 도메인 모델을 기반으로 설계하고 구현하는 것은 사용자가 도메인을 바라보는 관점을 그대로 코드에 반영할 수 있게 함

💡 표현적 차이가 중요한 이유는 코드의 구조가 도메인의 구조를 반영하기 때문에 소프트웨어를 이해하고 수정하기 쉽게 만들어주기 때문이다.

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

  • 도메인이 제공하는 구조는 상대적으로 안정적임
  • 왜 안정적? 사용자 모델에 포함된 개념과 규칙은 비교적 변경될 확률이 적기 때문에 사용자 모델을 기반으로 설계와 코드를 만들면 변경에 쉽게 대처할 수 있는 가능성이 커짐
  • 안정적인 구조를 제공하는 도메인 모델을 기반으로 소프트웨어의 구조를 설계하면 변경에 유연하게 대응할 수 있는 탄력적인 소프트웨어를 만들 수 있음

4. 불안정한 재료: 기능

💛 유스케이스

  • 객체지향 커뮤니티에서 소프트웨어의 기능을 기술하기 위한 기법으로 사용자와 시스템 간에 이뤄지는 상호작용의 흐름을 텍스트로 정리한 것

💛 유스케이스의 특성

  1. 유스케이스는 사용자와 시스템 간의 상호작용을 보여주는 ‘텍스트’다.
  2. 유스케이스는 하나의 시나리오가 아니라 여러 시나리오들의 집합이다.
  • 시나리오를 유스케이스 인스턴스라고도 한다.
  1. 유스케이스는 단순한 피처(feature) 목록과 다르다.
  • 단순히 기능을 나열하는 것이 아니라 이야기를 통해 연관된 기능들을 함께 묶을 수 있다
  1. 유스케이스는 사용자 인터페이스와 관련된 세부 정보를 포함하지 말아야 한다.
  • 사용자 관점에서 시스템의 행위에 초점을 맞춘다
  1. 유스케이스는 내부 설계와 관련된 정보를 포함하지 않는다.
  • 유스케이스의 목적은 연관된 시스템의 기능을 이야기 형식으로 모으는 것이지 내부 설계를 설명하는 것이 아님

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

  • 유스케이스는 시스템의 내부 구조나 실행 메커니즘에 관한 어떤 정보도 제공하지 않는다.
    • 유스케이스에는 단지 사용자가 시스템을 통해 무엇을 얻을 수 있고 어떻게 상호작용할 수 있느냐에 관한 정보만 기술된다.
  • 유스케이스는 객체지향과도 상관이 없다. 유스케이스는 단지 기능적 요구사항을 사용자의 목표라는 문맥을 중심으로 묶기 위한 정리 기법일 뿐이다.

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

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

  • 유스케이스는 사용자에게 제공할 기능을 시스템의 책임으로 보게 함으로써 객체 간의 안정적인 구조에 책임을 분배할 수 있는 출발점을 제공
  • 도메인 모델은 기능을 수용하기 위해 은유할 수 있는 안정적인 구조를 제공
  • 책임-주도 설계는 유스케이스로부터 첫 번째 메시지와 사용자가 달성하려는 목표를, 도메인 모델로부터 기능을 수용할 수 있는 안정적인 구조를 제공받아 실제로 동작하는 객체들의 협력 공동체를 창조

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

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

  • 도메인 모델이 안정적인 이유는 다음과 같은 특징이 있기 때문
    • 도메인 모델을 구성하는 개념은 비즈니스가 없어지거나 완전히 개편되지 않는 한 안정적으로 유지됨
      • 예: 정기예금 도메인에서 정기예금, 계좌, 이자율, 이자란 개념은 정기예금이란 금융상품이 없어지거나 완전히 개편되지 않는 한 안정적으로 유지되는 개념
    • 도메인 모델을 구성하는 개념 간의 관계는 비즈니스 규칙을 기반으로 하기 때문에 비즈니스 정책이 크게 변경되지 않는 한 안정적으로 유지됨
      • 정기예금 도메인에서 이자는 정기예금이 만기가 되거나 중도 해지를 하는 경우에 한해서 단 한번 지급됨(계좌와 이자 간의 0..1관계)
  • 안정적인 도메인 모델을 기반으로 시스템의 기능을 구현할 경우 비즈니스 정책이나 규칙이 크게 변경되지 않는 한 시스템의 기능이 변경되더라도 객체 간의 관계는 일정하게 유지됨
  • 객체지향은 도메인을 모델링 하기위한 기법과 도메인을 프로그래밍하기 위해 사용하는 기법이 동일
  • 따라서 도메인 모델링에서 사용한 객체와 개념을 프로그래밍 설계에서의 객체와 클래스로 매끄럽게 변환 가능(연결완전성)
  • 코드의 뱐경으로부터 도메인 모델의 변경 사항 유추 가능(가역성)
profile
소통하는 개발자가 꿈입니다!

0개의 댓글