본문 바로가기

Book Review

객체지향의 사실과 오해 Chapter 06 리뷰

Chapter 06 객체 지도

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

객체지향은 자주 변경되는 기능이 아니라 안정적인 구조를 기반으로 시스템을 구조화한다. 

 

기능 설계 대 구조 설계

✔ 모든 SW 설계에는 "기능 측면의 설계"와 "구조 측면의 설계"의 두 가지 측면이 존재한다. 

기능 측면에서는 사용자를 위해 무엇을 할 수 있는지에 초점을 맞춘다. 구조 측면에 설계에서는 제품의 형태가 어떠해야 하는지에 초점을 맞춘다. SW개발 초기 단계에서는 사용자가 무엇을 원하는지, 사용자가 원하는 것을 만족시키기 위해 시스템이 어떤 기능을 제공해야 하는지에 초점을 맞춰야 한다.

 

미래에 대비하는 가장 좋은 방법은 변경을 예측하는 것이 아니라 변경을 수용할 수 있는 선택의 여지를 설계에 마련해 놓는 것이다. 훌룡한 설계는 나중에라도 변경할 수 있는 여지를 남겨 놓은 설계다. 설계를 하는 목적은 나중에 설계를 허용하는 것이다.

 

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

 

두 가지 재료: 기능과 구조

사용자에게 제공할 '기능'과 기능을 담은 안정적인 '구조'라는 재료가 준비되어 있어야 한다. 이 두 재료를 어디서 구할까? 기능과 구조를 표현하기 위해 일관되게 적용할 수 있는 두 가지 기법이 있다.

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

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

 

안정적인 재료: 구조

도메인 모델

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

도메인 모델에서 모델이란 대상을 단순화해서 표현한 것이다. 모델은 지식을 선택적으로 단순화하고 의식적으로 구조화한 형태다. 모델은 복잡성의 바다에서 길을 잃지 않고 중요한 문제에 집중할 수 있도록 필요한 지식만 재구성한 것이다. 즉, 대상을 추상화하고 단순화한 것이다. 모델은 복잡성을 관리하기 위해 사용하는 기본적인 도구이다. 

 

도메인 모델이란 사용자가 프로그램을 사용하는 대상 영역에 관한 지식을 선택적으로 단순화하고 의식적으로 구조화 한 형태다. 도메인 모델은 SW가 목적하는 영역 내의 개념과 개념간의 관계, 다양한 규칙이나 제약 등을 주의 깊게 추상화한 것이다. 즉, 설계자가 도메인에 대해 생각하는 관점이다.

 

도메인 모델은 단순한 다이어그램이 아니라 이해관계자들이 바라보는 멘탈 모델mental model 이다. 멘탈 모델이란 사람들과 자신이 상호작용하는 사물들에 대해 갖는 모형이다. 

✔ 제품을 설계할 때 제품에 관한 모든 것이 사용자들이 제품에 대해 가지고 있는 멘탈 모델과 정확하게 일치해야 한다. -Donald Norman-

도메인 모델은 SW에 대한 멘탈 모델이다. 설계자는 디자인 모델을 기반으로 만든 시스템 이미지가 사용자 모델을 정확하게 반영하도록 노력해야 한다. 

 

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

객체지향을 사용하면 사용자들이 이해하고 있는 도메인의 구조와 최대한 유사하게 코드를 구조화할 수 있다. 동적인 객체가 가진 복잡성을 극복하기 위해 정적인 타입을 이용해 세상을 단순화할 수 있으며 클래스라는 도구를 이용해 타입을 코드 안으로 옮길 수 있다.

 

✔ 객체지향을 이용하면 도메인에 대한 사용자 모델, 디자인 모델, 시스템 이미지 모두가 유사한 모습을 유지하도록 만드는 것이 가능하다. 객체지향의 이러한 특징을 연결완전성 또는 표현적 차이라고 한다.

표현적 차이

소프트웨어 객체와 현실 객체 사이의 의미적 거리를 가리켜 표현적 차이 또는 의미적 차이라고 한다. 소프트웨어 객체를 창조하기 위해 우리가 은유해야 하는 대상은 바로 도메인 모델이다.

 

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

도메인 모델은 SW 구조의 기반을 이룬다. 안정적인 구조를 기반으로 자주 변경되는 기능을 배치함으로써 기능의 변경에 대해 안정적인 SW를 구현할 수 있다.

 

불안정한 재료: 기능

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

 

유스케이스의 특성

  1. 유스케이스는 사용자와 시스템 간의 상호작용을 보여주는 '텍스트'다.
  2. 유스케이스는 하나의 시나리오가 아닌 여러 시나리오의 집합이다.
  3. 유스케이스는 단순한 피처feature 목록과 다르다.
  4. 유스케이스는 사용자 인터페이스와 관련된 세부 정보를 포함하지 말아야 한다.
  5. 유스케이스는 내부 설계와 관련된 정보를 포함하지 않는다.

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

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

유스케이스에서 출발해 객체들의 협력으로 이어지는 일련의 흐름은 객체 안에 객체를 포함하는 재귀적 합성이라는 객체지향의 기본 개념을 잘 보여준다. 객체에 대한 재귀는 객체지향의 개념을 모든 추상화 수준에서 적용 가능하게 하는 동시에 객체지향 패러다임을 어떤 곳에서는 일관성 있게 적용할 수 있다.

 

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

도메인 모델을 중심으로 객체 구조를 설계하고 유스케이스의 기능을 객체의 책임으로 분해하는 기본적인 객체지향 설계 방식의 유연함을 잘 살려준다. 기능적인 요구사항이 변경될 경우 책임과 객체 간의 대응 관계만 수정될 뿐이다.

 

객체지향의 가장 큰 장점은 도메인을 모델링하기 위한 기법과 도메인을 프로그래밍하기 위해 사용하는 기법이 동일하다는 점이다. 도메인 모델링에서 사용한 객체와 개념을 프로그래밍 설계에서의 객체와 클래스로 매끄럽게 변환할 수 있다.

 

✔ 안정적인 도메인 모델을 기반으로 시스템의 기능을 구현하라. 도메인 모델과 코드를 밀접하게 연관시키기 위해 노력하라. 그것이 유지보수하기 쉽고 유연한 객체지향 시스템을 만드는 첫걸음이 될 것이다. 

📌 느낀점

이번 6장에서는 기능에 대한 이야기보단 구조를 바탕으로 시스템을 분할하는 객체지향의 특징이 자세하게 설명되어 있었다. 책임-주도 설계의 본질을 더 잘 이해할 수 있었다. 도메인 모델이라는 개념을 생각하니까 더 객체지향 설계를 하는 데 이해하기가 쉬웠다!

 

✔ 같이 스터디를 진행하는 데보션 영 김경욱님의 포스팅 첨부! 같은 챕터를 읽고 생각이 다른 걸 공유하는 건 언제나 의미있는 것 같아서 좋다!:)

https://velog.io/@kimku1018/%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5%EC%9D%98-%EC%82%AC%EC%8B%A4%EA%B3%BC-%EC%98%A4%ED%95%B4-Study-6

 

객체지향의 사실과 오해 Study - (6)

Chapter 6. 객체 지도 > ### 유일하게 변하지 않는 것은 모든 것이 변한다는 사실뿐이다. -헤라클레이토스(Heraclitus of Ephesus)- 여행 중 다른 마을로 이동해야 하는데 길을 모른다고 가정해 보자. 이 경

velog.io

 

반응형