본문 바로가기

OBJECT

오브젝트 챕터4<설계 품질과 트레이드오프>

 

4장에서는 데이터 중심 설계(Data-Driven Design)와 책임 중심 설계(Responsibility-Driven Design, RDD)의 차이를 비교하며, 책임 중심 설계의 중요성을 강조합니다.


2장에서 영화 예매 시스템을 주제로 책임을 적절히 분산하여 시스템을 설계했습니다.

이번에는 같은 주제로 데이터를 기준으로 시스템을 설계하는 절차적 방식을 소개합니다.

 

저자는 이를 통해 나쁜 설계에서 배울 수 있는 통찰력을 제공하며, 데이터 중심 설계의 한계를 설명합니다.

 

 

3장에서 학습했던 RDD(Responsibility Driven Design)라는 이름에서 알 수 잇듯 가장 중요한 것은 책임입니다.

역할은 책임의 집합으로서 생성되기 때문에 기초가 되는 책임이 적절하지 못한다면, 상위 구조도 불안정해 좋은 품질의 객체지향 프로그램이 생성되지 못합니다.

앞 장에서 구성했던 다이어그램이 얼추 맞다는 것을 확인할 수 있었습니다.

 

 


 

책임 중심 설계의 핵심

 

RDD(Responsibility-Driven Design)의 핵심은 책임입니다.

 

역할(Role)은 책임의 집합으로 구성되므로, 책임이 적절하지 못하면 설계의 전체 구조가 불안정해질 수 있습니다.

따라서 객체지향 설계의 품질은 책임을 올바르게 정의하고 분배하는 것에서 시작됩니다.

 

 

앞서 학습한 역할, 책임, 협력을 기반으로 객체지향 설계를 다시 살펴보면 다음 두 가지 핵심 관점을 도출할 수 있습니다.

  1. 객체지향 설계의 본질은 책임이다.
  2. 책임 할당은 응집도와 결합도 같은 설계 품질과 직결된다.

 


 

설계 품질과 합리적인 비용

 

저자는 "훌륭한 설계란 합리적인 비용 안에서 변경을 수용할 수 있는 구조를 만드는 것"이라고 강조합니다.
이를 위해 다음 두 가지 원칙이 필요합니다. 1장에서 처음 등장해 계속 언급되고있는 원칙입니다.

  • 높은 응집도: 관련성이 높은 요소들을 하나의 객체 안에 묶는다.
  • 느슨한 결합도: 객체 간 의존성을 최소화한다.

 


 

데이터 중심 설계의 문제점

데이터 중심 설계에서는 객체의 책임보다는 데이터를 우선으로 고려합니다.
하지만 이는 다음과 같은 문제를 초래할 수 있습니다. 

  1. 캡슐화 위반: 객체 내부 데이터를 외부에 노출해, 변경에 취약해짐.
  2. 높은 결합도: 객체 간 강한 의존성으로 인해 유연성이 떨어짐.
  3. 낮은 응집도: 객체 내부 요소들이 서로 관련성이 낮아, 설계가 단순하지 않음.

 

이러한 문제를 피하기 위해, 저자는 설계 과정에서 "이 객체가 포함해야 하는 데이터는 무엇인가?" 같은 질문은 지양하라고 합니다.

 

그렇다면 당연히 이 객체가 어떤 책임을 수행해야 할 것인가?라는 질문을 하며 설계를 해야하겠지만 너무 추상적이라 와닿지 않았습니다.

 

 

어떤 질문이 적절할지 고민을 해봤습니다

 

이 객체가 처리해야 할 주요 입력은 무엇이고, 출력은 무엇이어야 할까?

이 객체가 어떤 메시지에 응답해야 할까?

객체가 협력에서 어떤 역할을 수행하나?

 

이렇게 자문하며 설계한다면 조금 더 구체적인 답을 하며 설계가 가능할 것 같다는 생각을 했습니다.

 

 


 

 

 

캡슐화의 본질

저자는 캡슐화는 단순히 데이터를 숨기는 것을 넘어, 변경 가능성이 있는 어떤 것이라도 캡슐화 해야 한다고 했습니다. 이를 통해 설계의 유연성과 안정성을 동시에 확보할 수 있습니다.

 

단일 책임 원칙(Single Responsibility Principle / SRP)

  • 하나의 클래스는 하나의 책임만 가져야 한다.
  • SRP를 따르면 클래스의 응집도를 높이고, 결합도는 낮출 수 있겠습니다.

 


 

영화 예매 프로그램 예시

영화 예매 프로그램의 설계에서, Movie 클래스는 다음과 같이 책임 중심 설계의 좋은 예를 보여줍니다.

fee와 discountPolicy는 단순한 데이터가 아니라, calculateMovieFee라는 메서드를 통해 영화 요금을 계산하는 데 필요한 행동을 수행하기 위한 정보입니다. 이처럼 객체의 데이터는 책임을 수행하기 위한 수단이어야 합니다.

 


 

객체의 본질

4장을 관통하는 핵심 문장은 아래 문장이라고 생각했습니다.

"객체는 단순한 데이터 제공자가 아니다. 객체 내부에 저장되는 데이터보다 객체가 협력에 참여하면서 수행할 책임을 정의하는 오퍼레이션이 더 중요하다."

 

 

 

같은 주제를 다른 방식으로 설계하며 책임 기반의 설계와 반대로, 데이터 중심 설계는 설계의 유연성과 안정성을 저해할 가능성이 상대적으로 높다는 것을 알게 되었습니다.


객체지향 설계는 객체의 책임을 중심으로 시스템을 구축하는 것이 가장 중요하다는 점을 다시 한번 확인했습니다.