마소 홈페이지에서 패턴이란 단어로 PDF 서비스를 검색하면 총 42개의 콘텐츠가 뜬다. 그럼에도 패턴은 꾸준히 기사거리가 되고 있다. 왜 그런 것일까? 널리 알려진 것처럼 철학에서 수학이 분리되었고, 수학은 다시 과학으로 나누어졌다. 이처럼 많은 사람들이 관심을 가지고 참여하는 학문들은 진화할수록 세분화된다. 패턴 역시 1995년 GoF가 『Design Patterns: Elements of Reusable Object-Oriented Software』란 책을 내면서 널리 알려지기 시작했다. 그 이후 세분화되어 분석영역의 패턴(Analysis Pattern), 구현 패턴(Implement Pattern), 테스트 유닛 패턴(Test Unit Patterns) 등 각각의 도메인 특화된 패턴들이 계속해서 나오고 있다. 혹자들은 이제 패턴의 홍수로 인해 패턴 사용이 오히려 더 힘들어지는 시기라고 이야기한다.
필자는 많은 영역의 패턴 중에서 GoF의 디자인 패턴만큼이나 일찍(1996년 Pattern-Oriented Software Architecture) 소개되어 해외에서는 많이 전파되었으나, 아직까지 우리나라에서는 확산되지 않은 아키텍처 패턴에 대해 이야기하고자 한다. 소프트웨어 아키텍처란? 아키텍처의 영문 어원은 Architecture = archi(first, chief, govern) + tect(build)이다. 해석해보면 건물을 구축(build)할 때 전체적인 구조를 관리(govern)하는 것을 의미한다. 라틴어의 어원을 찾아보면 Architectura = Arch(큰, 우두머리) + Tectura(기술), 즉 큰 시스템을 구축할 때 구조를 관리하기 위한 기술을 의미한다. 그렇다면 소프트웨어 아키텍처란 무엇을 의미하는가?
몇몇 책에서 나온 소프트웨어 아키텍처에 대한 정의이다. 정의가 조금씩 다르지만 공통적으로 언급하고 있는 것은 소프트웨어 아키텍처란 시스템을 구성하는 구성요소(서브시스템, 컴포넌트)와 그들(구성요소) 간의 관계를 나타낸다는 점이다. 좀 어렵다면 더 쉽게 예로 <그림 2>를 들어보자. 좌측 그림은 학창시절 좋아했던 프라모델의 조립설명서이고, 우측은 스트럿츠의 아키텍처를 표현한 그림이다. 좌측 조립설명서에는 조립부품에 대한 정보(부품번호)와 서로 연결되는 정보(화살표)를 표기하고 있다. 우측에 익숙한 스트럿츠 아키텍처도 역시 다를 바가 없다. 구성요소에 대한 정보(명칭)와 연관된 구성요소끼리의 관계를 표시하고 있다. 이제 소프트웨어 아키텍처가 어떤 것인지 감이 왔을 것이다. 그렇다고 소프트웨어 아키텍처가 그림이라고 생각하면 안 된다. 구성요소와 관계를 설명하기 위한 텍스트, 표 등 어떠한 형태로든 가능하며 거의 모든 경우 혼합되어 사용된다. 왜 소프트웨어 아키텍처를 알아야 하는가? 아키텍처 패턴이란? 아키텍처 패턴이란 디자인 패턴과 마찬가지로 특정 문제를 해결하기 위해 반복되어 사용되는 솔루션을 문서화한 것이다. 단지 문제의 영역이 설계(디자인)가 아닌 아키텍처라고 생각하면 된다. 나무를 보느냐, 숲을 보느냐의 차이인 셈이다. 아키텍처 패턴은 소프트웨어 시스템의 구조를 체계적으로 구성하기 위한 기본적인 스키마를 제시한다. 아키텍처 패턴에는 미리 정의된 서브시스템을 제공하고 각각의 아키텍처 패턴간의 책임을 명시하며 패턴들 사이의 관계를 조직화하는 규칙과 가이드라인을 포함하고 있다. 즉, 소프트웨어 시스템의 전체 구조를 나타내는 조감도이면서 구성요소들에 대한 설명서이기도 하며, 구성요소들 사이의 관계를 조직화하는 규정집이기도 하다. 아키텍처 패턴은 아키텍처는 아니나 시스템의 유용한 이미지를 전달해준다. 패턴의 또 다른 유용한 측면은 품질 속성을 명확히 보여준다. 왜 아키텍처 패턴을 알아야 하는가? 카라얀이 지휘를 공부하면서 그의 인생엔 많은 행운이 잇따르는데 다름 아니라 당시 빈 국립가극장의 건물 관리자 겸 감독관이었던 사람이 바로 카라얀의 숙부였다. 숙부는 조카에게 유명한 지휘자의 연주회나 비공개 연습을 들을 수 있도록 해주었다. 거장들의 모습을 가까이 보면서 그는 많은 것을 배울 수 있었다. 여러분들이 아키텍처 패턴을 알고 사용한다는 것은 카라얀의 경우처럼 좋은 숙부가 없이도 훌륭한 아키텍트의 노하우를 배울 수 있다는 것이다. 다시 말하면 거장들이 이미 사용해 구축한 시스템이 존재하는 검증된 아키텍처를 이용할 수 있는 것이다. 개발에서 설계를 하게 되고 그러면서 디자인 패턴을 공부했듯이, 전체적인 소프트웨어의 시스템을 다루고자 할 때 아키텍처 패턴은 큰 도움이 될 것이다. 음악계에 재미있는 에피소드가 하나 있다. 또 다른 유명한 지휘자안 프란츠 샬크(F. Schalk 1863-1931)가 오케스트라를 객석에서 감상할 때의 일이었다. 연주가 무르익어가자 무의식적으로 눈을 감았다. 그랬더니 옆에 앉아있던 한 남자가 가만히 속삭였다. "그것은 현대 회화를 볼 때만 그렇게 하는 것입니다. 여기서는 귀를 막아야 해요." 모두가 아키텍처 패턴을 상세히 알아야 할 필요는 없지만, 최소한 다른 사람과의 대화나 전체 시스템에서 자신이 맡은 바를 이해할 수 있는 정도는 알고 있어야, 귀를 막거나 눈을 감는 사람이 되지 않는다.
아키텍처 패턴과 디자인 패턴 하지만, 디자인 패턴이 프로그램의 설계에서 나타나는 반복적인 문제를 다루는 반면 아키텍처 패턴은 소프트웨어 시스템 전체적으로 영향을 미치는 사안들에 대한 해결 방법이다. <표 1>로 간단히 둘의 차이점을 정리해보았다. 예를 들면 ‘파이프&필터’라는 아키텍처 패턴이 있다. 이 패턴의 장점 중 하나는 동시 개발이 가능하다는 점이다. 필터 또는 파이프 단위로 나누어 개발 가능하기 때문에 병렬적 개발이 가능하다. 하지만 디자인 패턴 중에는 이런 장점을 가진 패턴이 존재하지 않는다. 이는 디자인 패턴은 설계 문제에 있어서의 해결책이기 때문이고, 아키텍처 패턴은 소프트웨어 시스템 전반에 관한 문제 해결이기 때문이다. 따라서 아키텍처 패턴은 디자인 패턴과 달리 조직의 구조나 개발 프로세스의 효율성까지도 포함한다. 둘은 이렇게 다루는 문제의 영역이 다르지만, 곧 잘 어울려 다닌다. 아키텍처 패턴의 구성은 디자인 패턴들로 이뤄지는 경우가 많다. 그래서 둘 사이의 관계를 Composit Pattern으로 표현할 수 있다. 아키텍처 패턴의 구성요소와 구성요소 사이의 관계를 반드시 디자인 패턴으로 해야 하는 것은 아니다. 하지만 앞으로 나올 예제에서도 볼 수 있듯이 둘은 함께 사용되는 경우가 많다. 아키텍처 패턴과 디자인 패턴간의 관계 예제 DJ오디오 시스템에서는 아이팟이 모델 역할을, 스크래치가 컨트롤러 역할을 맡고 뷰 컴포넌트의 역할은 스피커이다. 심장 박동기에서는 모델은 내부적으로 아날로그(박동)를 디지털(화면에 보이는 수치, 그래프)로 바꾸어주는 부분이고, 컨트롤러는 측정 대상과 연결되는 입력단자가 될 것이다.
MVC 중 VIEW와 Model 관계는 모델의 변경에 따라 자동으로 화면을 바꿔주기 위해 Observer Pattern으로 이뤄져 있다. 플레이어는 작동하는데 음악이 안 나오는 DJ오디오 시스템이나 심장 박동수가 표시되지 않는 심장 박동기를 누가 사겠는가? 같은 시스템이 설정에 따라서 DJ오디오 시스템일 수도 있고, 심장 박동기가 될 수도 있다. 그 때마다 원하는 기기로 사용하기 위해 모델 컴포넌트를 교체할 수 있어야 한다. 그래서 모델에는 Strategy Pattern이 적용되어 있다. 뷰 컴포넌트는 복합적인 화면을 쉽게 구성하기 위해 Composite Pattern을 사용해 구현되어 있다. 하나의 MVC 패턴의 구성요소인 모델과 뷰는 각각 Strategy Pattern과 Composite Pattern을 이용했고 뷰와 모델의 연결에는 Observer Pattern을 사용했다. 이렇듯 아키텍처 패턴에서 이야기하는 구성요소나 구성요소 간의 관계에 대한 규칙을 만족시키기 위해 디자인 패턴을 이용하는 경우가 많다. 이제까지 아키텍처 패턴에 대해 설명했다. 왜 우리가 아키텍처 패턴을 알아야 하는지를 따져보고 디자인 패턴과의 공통점과 차이점에 대해 살펴봤다. 큰 건물을 지을 때처럼 큰 시스템을 구축할 때는 아키텍처가 필요하다. 시스템의 요구사항에 맞는 아키텍처를 찾기 위해 아키텍처 패턴을 사용한다. 아키텍처 패턴은 실제 구현을 완료하지 않고도 시스템의 특성을 예측 가능하게 해주는 유용한 지식이다. 아키텍처의 세부 설계는 디자인 패턴을 이용할 수 있고, 많이 그렇게 사용한다. 디자인 패턴이 여러분의 많은 고민을 해결해주었듯이, 아키텍처 패턴도 그럴 수 있기를 기원한다. MVC 패턴이란? 뷰 컴포넌트는 사용자에게 정보를 디스플레이한다. 뷰는 모델로부터 데이터를 얻는다. 모델로부터 제공된 데이터는 다양한 뷰를 통해 표시될 수 있으며, 각 뷰마다 컨트롤러 컴포넌트 하나씩 연결된다. 컨트롤러 컴포넌트는 사용자의 입력, 특정 이벤트 등을 서비스 요청으로 변환한다. 사용자는 오직 컨트롤러를 통해서만 시스템과 상호작용한다.
DJ오디오 시스템과 심장 박동기에 적용된 디자인 패턴 Observer Pattern Strategy Pattern Composite Pattern 이렇게 워드프로세서를 사용자 입장에서는 글상자가 문서의 부분이지만 문서와 동일하게 취급할 수 있게 해준다(글 상자 안에 텍스트를 입력하거나 그림을 삽입하는 방법이 다르다면 얼마나 불편하겠는가). 여기서는 사용자 UI를 구성함에 있어 모든 UI 파트를 Graphics라는 유형으로 단일 취급할 수 있게 사용하고 있다.
|
[마소컬럼] 질서 있는 아키텍처 패턴이야기 3부
2009. 6. 24. 20:06
반응형
<출처: http://www.imaso.co.kr/?doc=bbs/gnuboard.php&bo_table=article&wr_id=33152 >