역할, 책임, 협력의 관점에서 애플리케이션 설계하기

MinHwi·2022년 11월 24일
0
  • 공부 내용 : 객체지향의 사실과 오해 4장
  • 공부 기간 : 2022년 11월 20일 일요일

질문

  1. 객체지향 설계의 품질을 결정하는 것은 무엇인가?
  2. 협력은 무엇으로 구성되는가?
  3. 책임과 메시지의 차이는 무엇인가?
  4. 역할을 사용하여 얻을 수 있는 장점은 무엇인가?
  5. 책임 주도 설계는 무엇인가?
  6. 디자인 패턴은 왜 사용해야 하는가?
  7. 테스트 주도 개발과 객체 지향은 어떤 관련이 있는가?

기억하고 싶은 것

객체지향 설계란 애플리케이션의 기능을 구현하기 위한 협력 관계를 고안하고, 협력에 필요한 역할과 책임을 식별한 후 이를 수행할 수 있는 적절한 객체를 선택하는 과정이다. 핵심은 올바른 책임을 올바른 객체에게 할당하는 것이다.

협력은 요청과 응답으로 이루어지고, 객체는 자신의 책임을 수행하며 다른 객체에게는 메시지를 통해 책임 수행을 요청할 수 있다. 책임의 집합을 추상화하여 역할이라 하며, 동일한 메시지를 이해할 수 있는 객체는 해당 역할을 대체할 수 있다.

책임 주도 설계는 시스템의 책임을 객체의 책임으로 변환하고, 적절한 객체에게 책임을 할당하여 객체들의 협력 공동체를 만든다. 디자인 패턴은 책임 주도 설계의 결과를 코드로 표현하는 템플릿이다. 테스트 주도 개발은 협력이라는 문맥에서 객체의 행동에 대한 기대를 코드로 작성하여 피드백 받을 수 있다.

1. 객체지향 설계의 품질을 결정하는 것은 무엇인가?

객체지향 설계의 전체적인 품질을 결정하는 것은 개별 객체의 품질이 아니라 여러 객체들이 모여 이루어내는 협력의 품질이다. 훌륭한 객체지향 설계자는 객체들 간의 요청과 응답 속에서 창발하는 협력에 초점을 맞춰 애플리케이션을 설계한다. 협력이 자리를 잡으면 저절로 객체의 행동이 드러나고 뒤이어 적절한 객체의 상태가 결정된다.

2. 협력은 무엇으로 구성되는가?

협력은 다수의 요청과 응답으로 구성되며, 전체적으로 협력은 다수의 연쇄적인 요청과 응답의 흐름으로 구성된다. 협력은 어떤 객체의 요청으로 시작된다. 어떤 객체가 특정 요청을 받아들이고 응답하는 이유는 그 요청에 대해 적절한 방식으로 응답하는데 필요한 지식과 행동을 가지고 있기 때문이다. 그리고 요청과 응답은 협력에 참여하는 객체가 수행할 책임을 정의한다.

3. 책임과 메시지의 차이는 무엇인가?

책임은 어떤 객체가 다른 객체의 존재 여부와 상관없이 외부에 제공할 수 있는 행위를 나타낸다. 책임은 하는 것과 아는 것으로 파악할 수 있다. 예를 들어 앨리스 이야기에서 모자 장수는 스스로 증인석에 입장해야 하는 책임(하는 것)과 자신이 알고 있는 사실을 증언해야할 책임(자신이 유도할 수 있는 것에 관해 아는 것)을 가진다. 반면 메시지는 송신자와 수신자가 상호 협력하는 문맥을 강조한다. 앨리스 이야기에서 재판 과정에서 왕이 모자 장수에게 증언하라는 요청을 하는 책임을 말한다.

4. 역할을 사용하여 얻을 수 있는 장점은 무엇인가?

역할은 책임의 집합이다. 역할을 사용하면 재사용 가능하고 유연한 객체지향 설계를 할 수 있다. 앨리스 이야기에서 판사의 역할을 하던 하트 왕이 하트 여왕에게 권한을 위임한다. 이때 판사가 하는 책임을 역할로 추상화하면, 해당 역할을 수행하는 객체는 갈아낄 수 있다. 이때 대체 가능한 객체는 해당 역할의 책임을 메시지로 이해할 수 있어야만 대체 가능하다. 이때 역할과 대체 가능한 객체는 일반화, 특수화 관계를 만족한다. 하트 왕은 판사의 역할 뿐만 아니라 국정을 돌보는 다른 책임도 가지고 있다.

5. 책임 주도 설계는 무엇인가?

책임-주도 설계는 객체의 역할, 책임, 협력을 고안하기 위한 방법과 절차를 제시한다. 객체의 책임과 상호작용에 집중한다. 책임-주도 설계를 적용한 시스템은 충분히 자율적이면서 우호적으로 협력 가능한 객체로 이루어진 생태계를 구성한다.

객체지향 시스템의 설계 절차
1. 시스템이 사용자에게 제공해야 하는 기능인 시스템 책임을 파악한다.
2. 시스템 책임을 더 작은 책임으로 분할한다.
3. 분할된 책임을 수행할 수 있는 적절한 객체 또는 역할을 찾아 책임을 할당한다.
4. 객체가 책임을 수행하는 중에 다른 객체의 도움이 필요한 경우 이를 책임질 적절한 객체 또는 역할을 찾는다.
5. 해당 객체 또는 역할에게 책임을 할당하여 객체가 협력하게 한다.

6. 디자인 패턴은 왜 사용해야 하는가?

디자인 패턴은 책임-주도 설계의 결과를 표현한다. 패턴은 반복적으로 발생하는 문제를 해결할 수 있는 역할, 책임, 협력을 제공하는 설계 방식을 제시한다. 패턴은 해결하려고 하는 문제가 무엇인지 서술하고, 패턴을 사용할 수 있는 상황을 설명한다. 그리고 그 패턴이 특정 상황에서 왜 더 효과적인지에 대한 이유를 설명한다. 특정한 상황에서 설계를 돕기 위해 모방하고 수정할 수 있는 과거의 설계 경험이다. 가장 유명한 패턴 책은 GOF의 디자인 패턴이다.

7. 테스트 주도 개발과 객체 지향은 어떤 관련이 있는가?

테스트 주도 개발은 책임을 수행할 객체 또는 클라이언트가 기대하는 객체의 역할이 메시지를 수신할 때 어떤 결과를 반환하고 그 과정에서 어떤 객체와 협력할 것인지에 대한 기대를 코드의 형태로 작성한다. 테스트 주도 개발이 응집도가 높고 결합도가 낮은 클래스로 구성된 시스템을 개발할 수 있게 하는 최상의 프랙티스이다.

하지만 객체 지향에 대한 경험이 적은 초보자들은 어떤 테스트를 어떤 식으로 작성해야 하는지 결정하는데 큰 어려움을 느낀다. 테스트 주도 개발은 객체지향에 대한 깊이 있는 지식을 요구한다. 테스트를 작성하기 위해 객체의 메서드롤 호출하고 반환값을 검증하는 것은 순간적으로 객체가 수행해야 하는 책임에 관해 생각한 것이다. 역할, 책임, 협력에 집중하고 객체지향의 원칙을 적용하려는 깊이 있는 고민과 노력을 통해서만 테스트 주도 개발의 혜택을 누릴 수 있다.

profile
딩가딩가 백엔드 개발자

0개의 댓글