디자인 패턴

디자인 패턴이란 소프트웨어 디자인에 있어서 자주 부딪히는 문제에 대한 일반적인 재사용 가능한 해결법이다. 디자인 패턴이란 바로 코드로 변환할 수 있는 형태가 아니고 다양한 상황에서 문제를 풀수 있는 방법에 대한 틀이나 설명을 가리킨다. 객체 지향 디자인 패턴은 주로 클래스나 객체들간의 상호작용이나 관계를 설명하는 것이지 최종적인 어플리케이션 클래스나 객체를 지시하지는 않는다.

모든 소프트웨어 패턴이 디자인 패턴인 것은 아니다. 알고리즘은 소프트웨어의 디자인에 대해서라기 보다 계산적 문제에 대한 해법이기 때문에 디자인 패턴이 아니다. 시야를 넓게 적용하면 아키텍트적 패턴이 된다. 전체 프로그램의 구조에 대한 패턴이 그것이다. 프로그래밍 패러다임이란 프로그래밍 언어 전반의 기반 스타일을 의미한다.

역사

패턴은 크리스토퍼 알렉산더의 건축의 개념에서 근원한다. 1987년, Kent Beck와 Ward Cunningham은 패턴을 프로그래밍에 적용해 보기 시작했고 그해 OOPSLA 컨퍼런스에 결과를 발표했고 계속해서 매달리게 된다.

컴퓨터 과학에서 디자인 패턴은 1944년,  Design Patterns: Elements of Reusable Object-Oriented Software 가 출판된 후 대중화되게 된다. 같은 해, Pattern Languages of Programming 컨퍼런스가 처음으로 열리게 되었다. 다음 해, 디자인 패턴의 문서화를 위해  Portland Pattern Repository가 설립되었다. 용어의 범위에 대해서는 논쟁의 여지는 남아있다. 디자인 패턴에 대한 유명한 저서로 아래와 같은 서적들을 들 수 있다.

Gamma, Erich; Richard Helm, Ralph Johnson, and John Vlissides (1995). Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley. ISBN 0-201-63361-2.
Schmidt, Douglas C.; Michael Stal, Hans Rohnert, Frank Buschmann (2000). Pattern-Oriented Software Architecture, Volume 2: Patterns for Concurrent and Networked Objects. John Wiley & Sons. ISBN 0-471-60695-2.
Fowler, Martin (2002). Patterns of Enterprise Application Architecture. Addison-Wesley. ISBN 978-0321127426.
Hohpe, Gregor; Bobby Woolf (2003). Enterprise Integration Patterns: Designing, Building, and Deploying Messaging Solutions. Addison-Wesley. ISBN 0-321-20068-3.

디자인 패턴의 실제 구현은 번성해 가고 있는데 반해, 디자인 패턴의 구상의 정형화는 몇 년간 바래져 있다. 

실용성

디자인 패턴을 사용하면 테스트된 검증된 패러다임을 사용함으로 인해 개발 과정의 속도가 향상된다. 효율적인 소프트웨어 디자인이 되려면 구현의 단계에 이르러서야 가시적이 되는 이슈에 대해서도 고려하는 것이 필수적이다. 디자인 패턴을 재사용함으로써 사소한 이슈가 메이저한 문제를 일으키는 것을 방지할 수 있고, 패턴에 익숙한 코더나 아키텍터들에게 코드의 가독성을 높여준다.

유연성을 확보하기 위해서, 디자인 패턴에는 간접적인 레벨을 추가적으로 도입하는 경우가 많다. 이는 디자인 결과물의 복잡성을 높이기도 하고 어플리케이션 성능에 영향을 끼칠 수 있다.

정의에 의해서, 패턴을 사용하려고 하는 어플리케이션은 그 패턴을 다시 프로그램해야 한다. 어떤 저자들은 패턴의 이러한 성질이 컴포넌트로 실현되는 소프트웨어 재사용성에 반한다고 생각해서 패턴을 컴포넌트화 하려는 노력을 하였다. Meyer와 Arnout는 주요 패턴들의 2/3를 컴포넌트화 하는데 성공하였다고 보고하였다.

종종, 사람들은 특정 소프트웨어 디자인의 테크닉을 특정의 문제에 적용하는 방법만을 이해하고 있는 경향이 있다. 이러한 테크닉은 문제의       좀 더 넓은 범위로 적용하는데 한계를 가진다. 디자인 패턴은 일반화된 해법을 제공하고 그 문서에는 특정한 문제와 관련성은 배제하고 있다.

구조

디자인 패턴은 몇 개의 섹션으로 구성된다. 그 중에서 관심을 두는 곳은 구조, 주체, 상호작용 섹션이다. 이 섹션들은 디자인 모티프를 설명한다. 디자인 모티프란 개발자들이 복사해서 그 디자인 패턴에 설명되어 있는 반복되는 문제에 대한 해법으로 적용할 수 있는 포로토타입이 되는 작은 아키텍쳐이다. 구체적으로 마이크로 아키텍쳐는 프로그램의 구성요소(클래스, 메서드...)와 그들의 관계의 집합이다. 개발자들은 이 프로토타입적인 아키텍쳐를 자신들의 디자인에 도입하는 식으로 디자인 패턴을 사용한다. 이로 인해서 자신들의 디자인이 디자인 모티프에 비슷한 구조와 조직을 가지게 한다.

덧붙이자면, 디자인 패턴으로 인해서 개발자들이 잘 알려진, 잘 습득된 이름들을 사용해서 의사소통이 가능해진다. 대중화된 디자인 패턴은  앞으로도 더 발전해서 더욱 튼튼하게 진화할 것이다.

도메인 고유 패턴
디자인 패턴을 특정의 도메인(영역)에 대해서 체계화하려는 노력도 진행되어 왔다. 그 노력은 기존의 디자인 패턴의 사용에 대해서 만이 아니라 그 영역 고유의 디자인 패턴도 포함한다. 유저 인터페이스 디자인 패턴, 정보 시각화 패턴, 보안과 사용성 패턴, 웹 디자인 패턴등이 그 예이다.

연차 Pattern Languages of Programming 컨퍼런스의 회보에는 도메인 고유 패턴들의 예들이 다수 투고되고 있다.


 
 






Comments