출처 :http://java.techedu.net/phpBB2/index.php
Design Pattern #02
디자인 패턴 어디까지 공부해야 하나?
이 글에서는 디자인 패턴과 관련된 추천 서적들과 각 관련 기술들 사이의 상관 관계 및 공부 순서에 대해 말해보려 합니다.
디자인 패턴을 배우는 것은 여러 개발자들의 경험을 전달받음으로써
기술을 어떻게 적용할 것인가에 대한 통찰력을 키워나가는 과정이며,
그것은 추천 지침 및 위험 사례에 대한 지식을 공유하는 데에서 나옵니다.
표지판이 사라진 도로를 생각해봅시다.
이미 경험을 통해 잘 알고 있는 늘 다니던 길이라면 표지판이 없어도
그럭저럭 목표지점을 향해 갈 수 있겠지만,
처음 가보는 길이거나 익숙하지 않은 길이라면.. 표지판이 없어 길을 가는건 도박이나 마찬가지 입니다.
교통 표지판은 크게 지시표지나 보조표시와 같이 이렇게 가는 것이 옳다고 알려주는 것과,
규제표시나 주의표시와 같이 이런 걸 조심하라.. 이렇게 해서는 안된다고 알려주는 것이 있습니다.
디자인 패턴도 마찬가지인데요,
그것이 바로추천지침(Best Practice)에 해당하는 디자인패턴(Design Pattern)과
위험사례(Bad Practice)에 해당하는 안티패턴(Anti Pattern)입니다.
위의 그림은 그동안 제가 공부했던 내용들을 토대로 각각의 기술들을 잘 설명하는 대표적 책들을 분류해놓은 그림입니다.
(이 그림을 그리는데 아마존과 Yes24를 들락거리며 무려 30분이 소요되었습니다. )
1. 추천 지침(Best Practice)
패턴의 개념이 정의된 것은 1977년에 크리스토퍼 알렉산더(Christopher Alexander)가 지은 "A Pattern Language"란 책을 통해서인데요..
전산학이 아닌 건축/토목 분야에서 사용된 정의입니다.
각 패턴은 Three-part rule이 적용된다. Three-part Rule 이란 (1) Context:문맥/상황, (2) Problem:문제, (3) Solution:해법 사이의 관계를 표현하는 것이다. -크리스토퍼 알렉산더- |
hillside.net의 리처드 가브리엘(Richard P. Gabriel)은 "Patterns of Software: Tales from the Software Community"에서
알렉산더의 정의를 소프트웨어 영역에 맞게 아래와 같이 확장한 바 있습니다.
각 패턴은 Three-part rule이 적용된다. Three-part Rule 이란 (1) Context: 문맥/상황, (2) Force: 그 상황이 반복되는 원인 및 배경, (3) Configuration: 반복해서 발생하는 문제를 해결할 수 있는 소프트웨어 설정이다. - 리처드 가브리엘 - |
이처럼 일부 엔지니어들에 의해 주의 깊에 논의되던 디자인 패턴은 다들 아시다시피
에릭 감마, 리처드 헴, 랄프 존슨, 존 블리사이즈라는 4명의 갱(GoF: Gang of Four)에 의해 작성된,
"Design Patterns: Elements of Reusable Object-Oriented Software"에 의해 엔지니어들 사이에 널리 알려지기 시작했습니다.
GoF의 디자인 패턴은 수 많은 프로젝트에서 반복해서 사용된 설계를 파악하여, 이를 모아 문서로 정리한 것인데요..
23개의 패턴을 생성(Creational), 구조(Structural), 행위(Behavioral)라는 3가지 형태로 분류하고 있습니다.
이 책에서는 각 패턴을 Intent / Also Known As / Motivation / Applicability / Strutcure / Participants /
Collaborations / Consequences / Implementation / Sample Code / Known Uses / Related Patterns 의
순서로 정리해서 소개하고 있는데요,
패턴의 정의, 이 패턴이 왜 필요한가? 패턴의 클래스 구조도 및 각 요소 별 역할,
협력 시퀀스, 샘플 코드(구현사례), 어디에 활용되나? 어떤 패턴과 연관성이 있는가? 등을 알려주는 이 흐름은..
알렉산드리안 형식(Alexandrian Form)이라고 불리며, 디자인 패턴을 정의하는 일반적인 방법으로 자리잡게 됩니다.
[Alexandrian Form 정의 보기]
http://c2.com/cgi/wiki?AlexandrianForm
GoF의 디자인 패턴은 C++을 이용해서 기술되어 있는데요,
이를 자바 언어를 통해 설명한 책이 바로자바 디자인 패턴입니다.
디자인 패턴은 산업계 전반에 걸쳐 큰 반향을 일으키며, 패턴 중심의 설계를 이끌어 냈습니다.
(현재 우리가 사용하는 자바의 기본 라이브러리에도 많은 디자인 패턴들이 적용되어 있답니다.)
J2EE가 등장하면서 J2EE 분야에서 활용할 수 있는 디자인 패턴들이 연구되기 시작했습니다.
그 주도적 역할을 수행한 곳이 JPCLS(J2EE Pattern community list server) 입니다.
[JPCLS 홈페이지 가기]
http://archives.java.sun.com/archives/j2eepatterns-interest.html
JPCLS에서는 몇년 간의 활동을 통해 축적한 경험을"Core J2EE Patterns"라는 책을 통해 세상에 내놓게됩니다.
총 15가지의 유용한 J2EE 패턴으로 구성된 이 책은 J2EE라는 복잡한 기술들을
어떻게 활용할지 몰라 애를 먹던 자바 개발자들에게 단비와 같은 존재였습니다.
(이 책에 소개된 내용은 J2EE 설계 가이드라인인 BluePrints의 예제인 PetStore 에도 적용되었습니다.)
그로부터 다시 몇년이 지나, 두번째 판이 나왔는데요.. 그간 커뮤니티 자체의 기술 역량이 굉장히 높아져서..
최고의 명작.. "Core J2EE Patterns"가 재탄생하였습니다.
아래 그림은 두번째 판에 소개된 수정된 15개 패턴 + 추가된 6가지 패턴의 전체적인 관계를 보여주는 그림입니다.
J2EE 패턴이 J2EE 전반에 걸쳐 각 영역 별 Best Practice와 그 연결 방법에 대한 실천 사례들을 제공해줬다면,
EJB 패턴은 그 무게 중심을 J2EE의 핵심 컴포넌트 기술인 EJB로 옮겨서 패턴을 바라보고 있습니다.
EJB 패턴은 Floyd Marinescu가 "The Middleware Company"에서 개발자 교육 및 컨설팅을 수행하며 쌓은 경험을 토대로 작성되었습니다.
TherServerSide.com을 통해 공개된 EJB 패턴을 이 책을 통해 EJB 설계자를 위한 최상의 설계 지침을 제공하고 있습니다.
[EJB Design Pattern 무료 eBook 다운로드]
http://www.theserverside.com/books/wiley/EJBDesignPatterns/index.tss
아래 그림은 EJB 패턴에 소개된 각 패턴들의 상호 관계를 나타내는 그림입니다.
(에고고 eBook에도 그림이 빠져있어 결국 그리고 말았습니다. )
2. 위험 사례(Bad Practice)
앞서 언급한 GoF의 디자인 패턴/Java 디자인 패턴/J2EE 패턴/EJB 패턴이
최상의 실천 사례들을 중심으로 어떻게 설계해야 할지를 알려준다면..
이런 곳에 위험이 있으므로 이렇게 설계해선 안된다고 알려주는 것이 바로 안티패턴입니다.
안티패턴은 사실 디자인 패턴에 대해 보완적인 측면이 강합니다.
패턴은 이해하는 것도 어렵지만, 실제 프로젝트를 진행하는 과정에서..
도대체 어디에 어떻게 써야 할지를 판단하고 적용하는 것은 더욱 어렵습니다.
당장 동작하는 코드를 만들기에도 바빠 죽을 지경인데..
있을지도 모를 위험을 미리 생각해서 고민할 만큼 여유가 충분하지도 않구요..
안티패턴은 "최소한 이렇게 하지는 마라"는 패턴들을 소개하고 있습니다.
안티패턴은 최악의 코드를 미리 보여주고, 왜 그것이 나쁜 코드인지를 설명하고..
그 코드에서 발생하는 문제를 해결할 수 있도록 리팩토링해나감으로써 설계 경험을 전달해줍니다.
그러다 보니 디자인 패턴에 비해 개발자의 공감을 얻을 수 있는 경험이 함께 실려서,
보다 친숙하고 쉽게 다가설 수 있는 것 같습니다.
하지만.. 대부분의 안티패턴들이 높은 수준의 패턴을 이미 적용한 경우에는,
발생하지 않는 경우가 많아.. 개인적으로 볼때 그 효용은 크지 않아 보입니다.
다만.. 개념 정도는 알아둘 필요가 있습니다.
3. 그 밖의 관련 서적(Additional Readings)
그 밖에도 디자인 패턴을 다루는 책들은 많이 있습니다만,
관심있게 읽어보면 도움이 될 책이 2 종류가 있습니다.
하나는 "Pattern Language of Program Design"이라는 두권의 책이고,
또 하나는 "Pattern-Oriented Software Architecture"에 관한 책들입니다.
이 내용들은 이 강좌의 수준을 벗어나므로 다음에 기회가 되면 소개드리겠습니다.
디자인 패턴을 제대로 이해하기 위해서는 UML과 방법론(최소한 XP와 UP)에 대한 선행 학습을 해두는 것이 좋습니다.
또한 패턴을 조합하는 방법을 이해해야 패턴을 제대로 실무에 적용할 수 있습니다.
각 패턴은 고립되어 있을 때보다, 연계되어 활용될 때 그 가치가 더욱 커지기 때문입니다.
패턴의 조합은 잘 설계된 프레임워크의 내부 동작을 이해함으로써 연습할 수 있습니다.
4. 그래서 어디까지 공부해야 하나?
결론적으로 말씀드리면, 디자인 패턴은 설계 경험을 토대로 늘 발전하기 때문에 공부에 끝이 있을 수 없습니다.
하지만 디자인 패턴을 실무에 적용하기 위해서 최소한 어느 수준까지 공부해야 할지에 대한 가이드라인은 있을 수 있습니다.
제가 생각하는최소한의 공부 방법은 첫번째 그림에 소개된 것과 같습니다.
(이건 정답이 아니라.. 단지 제 경험에 의해 권해드리고 싶은 방법일 뿐입니다. )
(1) 기본기
패턴을 학습하기에 앞서 UML/UP/XP/Refactoring 에 대한 공부가 먼저 되면 좋을 듯 합니다.
제가 4년간 강의해본 교재들 중에서 교육생들에게 가장 반응이 좋았던 분야별 서적들을 한권씩 정리해보면,
- UML 객체 지향 설계 (제2판), 인포북 - UML과 패턴의 적용, 흥릉과학출판사 - Extreme Programming Installed : XP 도입을 위한 실전 입문, 인사이트 - Refactoring 리팩토링 : 나쁜 디자인의 코드를 좋은 디자인으로 바꾸는 방법, 대청 |
(2) 패턴 이해하기
패턴을 이해하는데 GoF의 디자인 패턴이 빠질 순 없겠지요?
자바 디자인 패턴은 영진에서 나온 책이 일본인이 잘 만드는 사전 형식으로
잘 만들어져 있어서 그걸 권하고 싶구요..
안티 패턴은 굳이 원본은 읽기보다 Bitter Java의 번역판을 한번 읽어보는 것이 좋을 듯 합니다.
그에 대한 학습이 끝나면 Core J2EE 패턴과 EJB 디자인 패턴을 학습!
아래의 다섯 권을 정독하시면 패턴에 대한 이해는 어느 정도 갖춰지지 않을까 생각됩니다.
- GoF의 디자인 패턴, 피어슨에듀케이션코리아 - Java 언어로 배우는 디자인 패턴 입문, 영진.com - 쓰디쓴 자바 : 자바 안티패턴 이야기들, 인포북 - 코어 J2EE 패턴 : 2판, 피어슨에듀케이션코리아 <==강.력.추.천 - EJB 디자인 패턴, 인사이트 <==추.천 |
(3) 패턴의 조합을 통한 시너지 효과 체험하기
패턴의 조합을 이해하는 가장 좋은 방법은 프레임워크를 개발해보는 것이라고 생각합니다.
이성기 님이 작성한 Roja 프레임워크같은 작은 프레임워크를 따라서 만들어 보면,
패턴과 그 조합에 많은 자신감이 붙게 될겁니다.
그게 아니면 Sun의 BluePrints에 소개된 WAF(Web Application Framework)를 분석해보는 것도 좋습니다.
시간적인 여유가 없어서 그게 부담스러운 분들이 많을텐데요,
최소한 아래 소개해드린 책의 부록 A는 꼭 읽어보세요..
스트럿츠에 사용된 디자인 패턴들이 정리되어 있습니다.
- STRUTS 스트럿츠 : 자바 프레임워크를 이용한 웹 애플리케이션의 구축, 인포북 |
위에서 소개해드린 순서로 작년에 강의를 진행해 보니,
꽤 학습효과가 좋았습니다. 여러분도 한번 시도해보세요..
디자인 패턴과 안티 패턴 관련 자료는 다른 사이트에서도 쉽게 구하실 수 있을겁니다..
다음 번 강좌에서는 디자인 패턴과 안티 패턴은 생략하고..
바로 J2EE 패턴과 EJB 패턴으로 넘어가도록 하겠습니다.
그럼 다음에 여유가 생길때 다시 강좌를 이어나가도록 할께요..
부족한 글을 끝까지 읽어주셔서 너무 감사합니다.
'Programming > Design Pattern' 카테고리의 다른 글
[펌] J2EE 디자인 패턴 구분 (0) | 2006.01.21 |
---|---|
[펌] J2EE 디자인 패턴 구분 (0) | 2006.01.21 |
[펌] 10. Value(Transfer) Object Assembler Pattern (0) | 2006.01.21 |
[펌] 5. Composite View Pattern (0) | 2006.01.21 |
[펌] Design Pattern #02 - 디자인 패턴 어디까지 공부해야 하나? (0) | 2006.01.21 |