본문 바로가기
프로그래밍

GRASP 패턴에 대해서

by bantomak 2023. 10. 19.
반응형

들어가기에 앞서서

어느 패턴을 먼저 설명하더라도 약간의 준비 작업은 필요하다. Factory Method 패턴을 설명하려고 하면, Creational 패턴들이 전체적으로 다루고 있는 두 가지 문제에 대한 설명이 필요하다. Creational 패턴을 사용하는 목적은 주로 두 가지라고 할 수 있는데, 하나는 시스템이 사용하는 Concrete 클래스가 무엇인지 감추는 것이고, 또 다른 하나는 객체가 어떻게 생성되며, 구성되는지 감추는 것이다.

 

이 두 가지가 주요한 목표라면, 어떻게 왜 그 목표를 설정하게 되었는지를 이해하면 Creational 패턴들에 대한 전반을 이해하고, 각 패턴들을 이해하는데 도움이 될 것이다.

 

GRASP 패턴

  • General Responsibility Assignment Software Patterns의 축약어이다.
  • Object-Oriented 디자인의 핵심 문제는 각 객체에 역할(또는 책임)을 부여하는 것
  • 역할 부여의 원칙들을 서술함
  • 제시하는 철학을 각 상황에 맞게 구체적으로 구현한 것

 

  1. 정보 담당자 (Information Expert)
    역할을 수행할 수 있는 정보를 가지고 있는 객체에 역할을 부여하자. 단순해 보이는 이 원칙은 객체지향의 기본 원리 중에 하나이다. 객체는 데이터와 처리로직이 함께 묵여 있는 것이고, 자신의 데이터를 감추고자 하면 오직 자기 자신의 처리 로직에서만 데이터를 처리하고, 외부에는 그 기능(역할)만을 제공해야 하기 때문이다.
  2. 소유 권한 (Creator)
    객체의 생성은 생성되는 객체의 콘텍스트를 알고 있는 다른 객체가 있다면, 콘텍스트를 알고 있는 객체에 부여하자. A 객체와 B 객체의 관계가 다음 중 하나라면 A의 생성을 B의 역할로 부여하라.

    - B 객체가 A 객체를 포함하고 있다.
    - B 객체가 A 객체의 정보를 기록하고 있다.
    - A 객체가 B 객체의 일부이다.
    - B 객체가 A 객체를 긴밀하게 사용하고 있다.
    - B 객체가 A 객체의 생성에 필요한 정보를 가지고 있다.
  3. 컨트롤러 (Controller)
    시스템 이벤트(사용자의 요청)를 처리할 객체를 만들자. 시스템, 서브시스템으로 들어오는 외부 요청을 처리하는 객체를 만들어 사용하라. 만약 어떤 서브 시스템 안에 있는 각 객체의 기능을 사용할 때, 직접적으로 각 객체에 접근하게 된다면 서브 시스템과 외부 간의 Coupling이 증가되고, 서브 시스템의 어떤 객체를 수정할 경우, 외부에 주는 충격이 크게 된다. 서브 시스템을 사용하는 입장에서 보면, 이 Controller 객체만 알고 있으면 되므로 사용하기 쉽다.
  4. 느슨한 연결 (Low Coupling)
    객체들 간, 서브 시스템들 간의 상호 의존도가 낮게 역할을 부여하자. Object-Oriented 시스템은 각 객체들과 그들 간의 상호작용을 통하여 요구사항을 충족시키는 것을 기본으로 한다. 그러므로, 각 객체들 사이에 Coupling이 존재하지 않을 수는 없다. 이 패턴은 요구사항은 충족시키면서도 각 객체들, 각 서브시스템 간의 Coupling를 낮은 수준으로 유지하는 방향으로 디자인하라고 말하고 있다. Low Coupling은 각 객체, 서브 시스템의 재사용성을 높이고, 시스템 관리를 편하게 한다.
  5. 높은 응집도 (High Cohesion)
    각 객체가 밀접하게 연관된 역할들만 가지도록 역할을 부여하자. 이 패턴은 Low Coupling패턴과 동전의 양면을 이루는 것으로, 한 객체, 한 서브 시스템이 자기 자신이 부여받은 역할만을 수행하도록 짜임새 있게 구성되어 있다면, 자신이 부여받은 역할을 충족시키기 위해 다른 객체나 시스템을 참조하는 일이 적을 것이고, 그것이 곧 Low Coupling이기 때문이다.
  6. 다형성 (Polymorphism)
    객체의 종류에 따라 행동양식이 바뀐다면, Polymorphism 기능을 사용하자. Object-Oriented 시스템은 상속과 다형성을 지원한다. 만약 객체의 종류에 따라 행동이 바뀐다면 객체의 종류를 체크하는 조건문을 사용하지 말고, Object-Oriented 시스템의 Polymorphism 기능을 사용하라
  7. 순수 조립 (Fure Fabrication)
    Information Expert 패턴을 적용하면 Low Coupling과 High Cohsion의 원칙이 깨어진다면, 기능적인 역할을 별도로 한 곳으로 모으자. 데이터베이스 정보를 저장하거나, 로그 정보를 기록하는 역할에 대해 생각해 보자. 각 정보는 각각의 객체들이 가지고 있을 것이다. 이때 Information Expert 패턴을 적용하면, 각 객체들이 정보를 저장하고, 로그를 기록하는 역할을 담당해야 하지만, 실제로 그렇게 사용하는 사람들은 없다. 이것은 그 기능들이 시스템 전반적으로 사용되고 있기 때문에 각 객체에 그 기능을 부여하는 것은 각 객체들이 특정 데이터베이스에 종속을 가져오거나, 로그를 기록하는 메커니즘을 수정할 경우, 모든 객체를 수정해야 하는 결과를 가져온다. 즉 Low Coupling의 원칙이 깨어지게 된다. 이럴 경우에는 공통적인 기능을 제공하는 역할을 한 곳으로 모아서 가상의 객체, 서브 시스템을 만들어라.
  8. 간접 참조 (Indirection)
    두 객체 사이의 직접적인 Coupling을 피하고 싶으면, 그 사이에 다른 객체를 사용하라. 여기서 말하는 다른 객체란 인터페이스가 될 수 있고, 주로 인터페이스인 경우가 많다.
  9. 변화에 대한 보호 (Protected Variations)
    변경될 여지가 있는 곳에 안정된 인터페이스를 정의해서 사용하자. JDBC에 대해서 생각해 보자. JDBC는 일련의 인터페이스들로 구성되어 있으며, 각 데이터베이스 벤더들이 인터페이스를 구현한 Concrete 클래스를 제공한다. 데이터베이스 기능을 사용하는 시스템의 입장에선 각 벤더들이 구현방식을 바꾸었을 때, 자신의 코드를 수정하고 싶지 않을 것이다. 그래서 Driver를 로딩만 바꾸어 주면 되도록 데이터베이스 관련 작업이 필요한 곳에는 안정된 JDBC 인터페이스를 사용한 것이다.

 

Creational Pattern에서 실제로 사용되는 Concrete 클래스를 숨기려고 하는 이유는 Low Coupling을 지원하려고 하기 때문이며, 변경될 여지가 있는 것들(Protected Variations)을 사용하는 시스템에 충격을 감소시키기 원하기 때문이다. Concrete 클래스를 숨겼지만, 결국 그 객체를 사용해야 한다. 그러면 어떻게 사용할 것인가? 일반적으로 인터페이스 타입의 변수에 저장해서 사용한다. 각 Concrete 클래스를 대표하는 안정된 인터페이스를 만들 수 있다면, 그럴 경우에만 Creational Pattern 들은 자신의 역량을 최대로 발휘할 수 있다. 두 번째로 왜 객체의 생성과 구성을 감추려고 하는가? 어떤 객체를 사용하기 위해서는 두 가지 작업이 필요하다. 먼저 객체를 생성해야 한다. 생성되어 있다면, 객체에 대한 Reference를 얻어와야 한다. 두 번째는 그 객체에 정의된, 사용하고자 하는 메서드를 알아야 한다. 객체 사용 시 Low Coupling을 원한다면, 두 가지 작업을 해야 한다. 객체를 숨기고, 메서드를 (주로 인터페이스를 이용하여) 자신이 원하는 수준으로 추상화시킨다.

 

출처

 

GRASP 패턴

저자: 김대곤이전 기사(Singleton 패턴)을 쓰면서, 다음에 다루어야 할 주제는 Observer 패턴이 아니면, Factory Method 패턴이라고 생각했다. GUI의 구조를 보면 Observer 패턴을 설명할 때 재사용할 수 있을

www.hanbit.co.kr

 

GRASP (object-oriented design) - Wikipedia

From Wikipedia, the free encyclopedia Guidelines in object-oriented design General Responsibility Assignment Software Patterns (or Principles), abbreviated GRASP, is a set of "nine fundamental principles in object design and responsibility assignment"[1]:

en.wikipedia.org

댓글