반응형
지난 포스팅에서는 디자인패턴을 활용하여 변화에 대비한 설계를 진행하는 방법에 대해 알아보았다.
이번 포스팅은 디자인 패턴을 이용하는 방법의 마지막 포스팅으로, 디자인 패턴을 고르는 방법과 디자인 패턴 사용 방법을 총 정리해보려고 한다.
디자인 패턴을 고르는 방법
GoF의 디자인 패턴에서 다루는 패턴은 20가지가 넘는다. 어떠한 문제 상황을 해결하기 위해 어떤 패턴을 써야할지 정확하게 판단하는 것은 분명 어려운 일이다. 특히 이런 디자인패턴이 생소한 개발자라면 더욱 어려울것이다. 지금부터 문제 해결에 적합한 패턴을 찾아내는 여러가지 접근 방법에 대해 알아보도록 하자.
- 패턴이 어떻게 문제를 해결하는지 파악하자
지금까지의 포스팅에서는 디자인 패턴이 어떻게 적합한 객체를 찾고, 객체의 크기를 결정하며, 어떻게 객체의 인터페이스를 명세하는지에 대한 내용을 정리하면서 패턴이 설계 문제를 해결해 나가는 방법에 대해 설명했다. 이런 논의를 참고한다면 적당한 패턴을 찾는데 도움이 될 것이다. - 패턴의 의도 부분을 보자
앞으로 작성하게 될 각 패턴 관련 포스팅에 정리될 패턴의 의도를 잘 파악해보자. 의도를 잘 이해하고 우리가 가지고 있는 문제와 비슷한 것을 찾아보자. 또는 이전의 포스팅에서 정리한 분류나를 살펴보는 것도 도움이 될 것이다. - 패턴들 간의 관련성을 파악한다
이 역시도 이전에 포스팅한 디자인 패턴의 관계도를 참고해보자. 디자인 패턴들간의 관련성을 파악함으로써 올바른 패턴을 하나 또는 그룹으로 선택 할 수 있다. - 목적을 가지고 패턴들을 공부하자
앞으로는 각 디자인 패턴들을 정리할 때, 각 패턴들에 대한 개요를 설명할 예정이며 마지막에는 각 패턴별 비교와 결론을 설명할 예정이다. 이 부분을 유의깊게 살펴보고 패턴들 간의 유사점과 차이점을 이해할 수 있을 것이다. - 재설계의 원인을 파악하자
이전 포스팅을 통해 우리는 이미 재설계의 원인과 이를 해결하기 위한 패턴을 정리하였다. 이를 충분히 이해하면 재설계의 원인을 피할 수 있을 것이다. - 설계에서 가변성을 갖는 부분이 무엇인지 파악한다
재설계의 원인에 중점을 두는 것과 반대의 개념인데, 무엇이 설계를 변경하게 하는지를 파악하는 것이 아니라, 재설계 없이 변경하고 싶은 부분이 무엇인지를 파악하는 것이다. 이로써 가변성을 갖는 부분을 별도의 개념으로 캡슐화 할 수 있다.
디자인 패턴 사용 방법
디자인 패턴을 고르고 난 후에는 어떻게 그것을 잘 사용할 수 있을까? 아래에서 디자인 패턴을 효율적으로 응용하기 위한 접근 방법을 단계적으로 파악해보자.
- 개요 부분을 중심으로 패턴을 읽자
패턴이 우리 문제에 적합하다는 것을 확신하려면 패턴의 활용성과 결과에 항상 주의를 기울여야 한다. - 구조(Stucture), 참여 객체(Participant), 협력 방법(Collaboration) 부분을 공부하라.
패턴에 정의한 클래스와 객체를 이해하고 이들이 어떻게 협력하여 동작하는지 이해해야 한다. - 보다 확실한 예를 이해하기 위해서 예제 코드 부분을 살펴보자.
코드를 공부하는 것은 패턴 구현법을 배우는 데 도움이 된다. - 애플리케이션 상황에 의미 있는 이름으로 패턴의 참여 객체 이름을 결정하라.
디자인 패턴에 정의한 참여 객체들의 이름은 애플리케이션에 의미 있는 것이기보다는 매우 추상적인 것이다. 이 참여 객체의 이름을 애플리케이션에서 사용할 이름으로 바꿀 필요가 있으며, 이것들은 구현에서 패턴을 보다 명확하게 만들어 준다. - 클래스를 정의한다.
클래스의 인터페이스를 선언하고, 상속 관계를 확립하고, 대이터와 객체 참조를 나타내는 인스턴스 변수를 정의하자. 이미 설계한 클래스들 중 패턴을 적용하면 영향을 받는 클래스들을 식별하여 적당하게 수정해야 한다. - 패턴에 정의한 오퍼레이션에 대해서 애플리케이션 별 이름을 정의한다.
다시 패턴의 이름을 애플리케이션에 적합한 형태로 바꿔야 한다. 각 오퍼레이션의 협력 방법이나 책임을 참조해서 오퍼레이션의 이름을 결정하자. 이름을 부여하는 규칙은 일관성이 있어야 한다. - 패턴에 정의한 책임성과 협력 방법을 수행하도록 오퍼레이션을 구현하자.
패턴별로 설명해 놓은 구현 부분은 우리들이 패턴을 구현할 때 도움을 줄 것이다.
목적 | 디자인 패턴 | 다양화 할 수 있는 부분 |
생성 | Abstract Factory | 제품 객채군 |
Builder | 복합 객체 생성 방법 | |
Factory Method | 인스턴스화 될 객체의 서브클래스 | |
Prototype | 인스턴스화 될 객체 클래스 | |
Singleton | 클래스의 인스턴스가 하나인 경우 | |
구조 | Adapter | 객체에 대한 인터페이스 |
Bridge | 객체 구현 | |
Composite | 객체의 합성과 구조 | |
Decorator | 서브 클래싱 없이 객체의 책임성 | |
Facade | 서브시스템에 대한 인터페이스 | |
Flyweight | 객체의 저장 비용 | |
Proxy | 객체 접근 방법 | |
행위 | Chain of Responsibility | 요청을 처리하는 객체 |
Command | 요청의 처리 시점과 처리 방법 | |
Interpreter | 언어의 문법과 해석 방법 | |
Iterator | 집합 객체 요소들의 접근 방법 및 순회 방법 | |
Mediator | 어떤 객체들이 어떻게 상호작용 하는지 | |
Memento | 언제 어떤 정보를 객체의 외부에 저장하는지 | |
Observer | 다른 객체에 종속적인 객체의 수 종속적인 객체들의 상태 변경 방법 |
|
State | 객체의 상태 | |
Strategy | 알고리즘 | |
Template Method | 알고리즘의 단계 | |
Visitor | 클래스의 변경 없이 객체에 적용할 수 있는 오퍼레이션 |
디자인 패턴이 다양화 할 수 있는 설계의 측면
참고문헌: GoF의 디자인패턴
마무리하며..
디자인 패턴을 어떻게 사용하는지를 아는 것 만큼 중요한 것은, 패턴을 사용하지 않아야 할 때를 아는 것이다. 디자인 패턴을 아무렇게나 적용해서는 안 된다. 종종 디자인 패턴은 간접 접근(위임과 같은 기법)을 도입함으로써 융통성과 다양성을 갖지만, 그것은 설계를 복잡하게 만들고 성능을 떨어뜨리는 결과를 가져올 수도 있다. 그러므로 무분별한 패턴의 적용 보다는 유연성이 충분한 가치를 지니고 있는지에 대한 고민을 항상 하도록 하자.
GoF의 디자인패턴 참고
반응형
'Development > 디자인패턴' 카테고리의 다른 글
싱글톤 패턴 - 파이썬 (0) | 2022.05.01 |
---|---|
디자인 패턴을 이용하는 방법 (4) (0) | 2022.04.20 |
디자인 패턴을 이용하는 방법 (3) (0) | 2022.04.19 |
디자인 패턴을 이용하는 방법 (2) (0) | 2022.04.18 |
디자인 패턴을 이용하는 방법 (1) (0) | 2022.04.14 |