객체지향의 사실과 오해 | 06. 객체 지도 & 07. 함께 모으기

yeonk·2022년 12월 27일
0

OOP

목록 보기
6/7
post-thumbnail

참고사항: 조영호님의 객체지향의 사실과 오해를 읽고 정리한 글입니다.










06. 객체지도


유일하게 변하지 않는 것은 모든 것이 변한다는 사실 뿐이다.
-헤라클레이토스










기능 설계와 구조 설계


설계의 가장 큰 도전은 기능(function)구조(structure)라는 두 가지 측면을 함께 녹여 조화를 이루도록 하는 것

  • 기능이 아니라 구조를 기반으로 모델을 구축하는 편이 좀 더 범용적이고 이해하기 쉬우며 변경에 안정적이다.

  • 안정적인 구조를 중심으로 기능을 종속시키는 접근법은 범용적이고 재사용 가능하며 변경에 유연하게 대처할 수 있는 모델을 만든다.

  • 자주 변경되는 기능이 아니라 안정적인 구조를 따라 역할, 책임, 협력을 구성해야한다.










  • 객체지향 접근방법은 안정적인 객체 구조를 바탕으로 시스템 기능을 객체간의 책임으로 분배한다.

  • 객체지향은 객체의 구조에 집중하고 기능이 객체의 구조를 따르게 만든다.

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










기능과 구조


  • 기능

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

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





  • 구조

    • 시스템의 기능을 구현하기 위한 기반

    • 기능 변경을 수용할 수 있도록 안정적이어야 함

    • 사용자나 이해관계자들이 도메인에 관해 생각하는 개념과 개념들 간의 관계로 표현










  • 유스케이스 모델링

    • 기능을 수집하고 표현하기 위한 기법

    • 결과물을 유스케이스라고 한다.





  • 도메인 모델링

    • 구조를 수집하고 표현하기 위한 기법

    • 결과물을 도메인 모델이라고 한다.










구조 - 안정적


도메인 모델

도메인은 사용자가 프로그램을 사용하는 대상 분야를 의미한다.

  • 모델

    • 대상을 단순화해서 표현한 것

    • 지식을 선택적으로 단순화하고 의식적으로 구조화한 형태

    • 복잡성을 관리하기 위해 사용하는 기본적인 도구





  • 도메인 모델

    • 사용자가 프로그램을 사용하는 대상 영역에 관한 지식을 선택적으로 단순화하고 시각적으로 구조화한 형태

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

  • 멘탈 모델(Mental Model)

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

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

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










  • 멘탈 모델 구분

    • 사용자 모델: 사용자가 제품에 대해 가지고 있는 개념들의 모습

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

    • 시스템 이미지: 최종 제품





훌륭한 디자인이란 사용자가 예상하는 방식에 따라 정확하게 반응하는 제품을 만드는 것이다.

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










도메인과 객체지향

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

  • 정적인 타입을 이용해 세상을 단순화할 수 있으며 클래스라는 도구를 이용해 타입을 코드 안으로 옮길 수 있다.

  • 도메인에 대한 사용자 모델, 디자인 모델, 시스템 이미지 모두가 유사한 모습을 유지하도록 만드는 것이 가능 → 연결완전성, 표현적 차이










표현적 차이

소프트웨어 객체와 현실 객체 사이의 의미적 거리.
핵심은 은유를 통해 현실 객체와 소프트웨어 객체 사이의 차이를 최대한 줄이는 것

  • 도메인 모델: 소프트웨어 객체를 창조하기 위해 은유해야하는 대상

  • 도메인 모델을 기반으로 설계하고 구현하는 것은 사용자가 도메인을 바라보는 관점을 그대로 코드에 반영할 수 있게 함 → 표현적 차이 감소, 사용자의 멘탈 모델과 유사

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










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

  • 도메인 모델이 제공하는 구조는 상대적으로 안정적

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

  • 도메인 모델은 안정적인 구조를 기반으로 자주 변경되는 기능을 배치함으로써 기능의 변경에 대해 안정적인 소프트웨어를 구현 가능하게 함

  • 도메인 모델을 기반으로 소프트웨어의 구조를 설계하면 변경에 유연하게 대응할 수 있는 탄력적인 소프트웨어를 만들 수 있다.










기능 - 불안정


유스케이스

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

  • 기능적 요구사항: 시스템이 사용자에게 제공행야하는 기능의 목록을 정리한 것

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

  • 유스케이스의 큰 특징은 사용자들의 목표를 중심으로 시스템의 기능적인 요구사항들을 이야기 형식으로 묶을 수 있다는 것 → 각 기능이 유기적인 관계를 지닌 체계를 이룰 수 있음










유스케이스의 특성

  • 유스케이스는 사용자와 시스템 간의 상호작용을 보여주는 텍스트

  • 유스케이스는 하나의 시나리오가 아니라 여러 시나리오들의 집합

    • 시나리오를 유스케이스 인스턴스(use case instance)라고도 한다.
  • 유스케이스는 단순한 피처(feature) 목록과 다르다.

    • 피처는 시스템이 수행해야하는 기능의 목록을 단순하게 나열한 것

    • 유스케이스의 강점은 유스케이스가 단순히 기능을 나열하는 것이 아니라 이야기를 통해 연관된 기능들을 함께 묶을 수 있다는 점이다.

  • 유스케이스는 사용자 인터페이스와 관련된 세부 정보를 포함하지 말아야 한다.

    • 본질적인 유스케이스(essential use case): 사용자 인터페이스를 배제한 유스케이스 형식
  • 유스케이스는 내부 설계와 관련된 정보를 포함하지 않는다.










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

  • 유스케이스는 사용자가 바라보는 시스템의 외부 관점만을 표현

    • 사용자가 시스템을 통해 무엇을 얻을 수 있고 어떻게 상호작용할 수 있느냐에 관한 정보만 기술
  • 유스케이스는 객체의 구조나 책임에 대한 어떤 정보도 제공하지 않는다.

  • 유스케이스 텍스트 안에서 도메인 모델에서 사용할 용어에 대한 힌트를 얻을 수는 있다.










기능과 구조의 통합


도메인 모델, 유스케이스, 책임 주도 설계

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

  • 시스템은 사용자의 메시지를 수행하는 거대한 자율적인 객체로 볼 수 있고, 사용자와의 협력에 참여하는 커다란 객체이다. 시스템이 수행해야할 기능은 곧 책임으로 볼 수 있다.

  • 시스템에 할당된 책임은 시스템 안의 작은 규모의 객체들이 수행해야하는 더 작은 규모의 책임으로 세분화 된다.

  • 협력을 완성하는데 필요한 메시지를 식별하면서 객체들에게 책임을 할당해 나간다.

  • 사용자의 관점에서 시스템의 기능을 명시하고, 사용자와 설계자가 공유하는 안정적인 구조를 기반으로 기능을 책임으로 변환하는 체계적인 절차를 따라야한다.










  • 시스템의 기능은 책임을 수행하는 객체들의 협력 관계를 통해 구현된다.

  • 객체의 이름은 도메인 모델에 포함된 개념으로부터 차용하고, 책임은 도메인 모델에 정의한 개념의 정의에 부합하도록 할당한다.

  • 유스케이스에서 출발해 객체들의 협력으로 이어지는 일련의 흐름은 객체 안에 다른 객체를 포함하는 재귀적 합성이라는 객체지향의 기본 개념을 잘 보여준다.










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

도메인 모델을 기반으로 객체 구조를 설계하는 이유는 도메인 모델이 안정적이기 때문이고, 이는 구성 요소의 특징 때문이다.

  • 도메인 모델 구성 요소의 특징

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

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

  • 변경에 대한 파급효과 최소화, 요구사항 변경에 유연하게 대응 할 수 있는 시스템 구축을 가능하게 함










  • 객체지향의 장점 중 하나는 도메인을 모델링하기 위한 기법과 도메인을 프로그래밍하기 위해 사용하는 기법이 동일하다는 점이다. 이런 특징을 연결완전성이라고 한다.

    • 연결완전성: 모델에서 코드로의 매끄러운 흐름을 의미

    • 가역성(reversibility): 코드에서 모델로의 매끄러운 흐름을 의미





사람들이 동일한 용어와 동일한 개념을 이용해 의사소통하고 코드로부터 도메인 모델을 유추할 수 있게 하는 것이 도메인 모델의 진정한 목표다.



















07. 함께 모으기


코드와 모델을 밀접하게 연관시키는 것은 코드에 의미를 부여하고 모델을 적절하게 한다.
-에릭 에반스










  • 객체 지향 설계 안에 존재하는 세 가지 상호 연관된 관점

    • 개념 관점(Conceptual Perspective)

      • 설계는 도메인 안에 존재하는 개념과 개념들 사이의 관계를 표현

      • 실제 도메인의 규칙과 제약을 최대한 유사하게 반영하는 것이 핵심

    • 명세 관점(Specification Perspective)

      • 소프트웨어, 객체들의 책임에 초점

      • 객체가 협력을 위해 무엇을 할 수 있는가에 초점

    • 구현 관점(Implementation Perspective)

      • 실제 작업을 수행하는 코드와 연관
      • 객체들이 책임을 수행하는 데 필요한 동작하는 코드를 작성하는 것
      • 객체는 책임을 어떻게 수행할 것인가에 초점을 맞춤










클래스는 세 가지 관점을 모두 수용할 수 있도록 개념, 인터페이스, 구현을 함께 드러내야 한다.동시에 코드 안에서 세 가지 관점을 쉽게 식별할 수 있도록 깔끔하게 분리해야 한다.

명세 관점과 구현 관점을 명확하게 분리하는 것, 인터페이스와 구현을 분리하는 것은 훌륭한 객체지향 설계를 낳는 가장 기본적인 원칙이다.










정리


  • 객체지향 설계의 첫 번째 목표는 훌륭한 협력을 설계하는 것이다.

  • 협력을 설계할 때는 메시지가 객체를 선택하게 해야한다.

  • 객체가 수신한 메시지가 객체의 인터페이스를 결정한다.

  • 객체가 어떤 메시지를 수신할 수 있다는 것은 그 객체의 인터페이스 안에 메시지에 해당하는 오퍼레이션이 존재한다는 것을 의미한다.

  • 인터페이스에 포함된 오퍼레이션은 외부에서 접근가능하도록 공용으로 선언돼 있어야 한다.

  • 메서드의 구현과 속성의 변경은 원칙저긍로 외부의 객체에게 영향을 미쳐서는 안된다.

  • 메서드와 속성이 철저하게 클래스 내부로 캐슐화 돼야 한다.

  • 인터페이스와 구현을 분리해야한다.

  • 명세 관점은 클래스의 안정적인 측면을 드러내야한다.










참고 자료


조영호, 『객체지향의 사실과 오해』, 위키북스

0개의 댓글