오늘 다룰 패턴은 퍼사드 패턴 Facade Pattern 입니다. 위의 다이어그램은 이 패턴의 UML 다이어그램입니다. 뭐 다이어그램은 일견 복잡해 보이기도 합니다만, 사실 알고보면 이 패턴보다 단순한 패턴도 없습니다. 이 패턴에 대한 설명을 듣고 나면, 이런 생각을 하게 될지도 모를 정도죠.
혹은
뭐 이런 생각들 말입니다. -_-;
뭐... 저도 그런 생각을 했었습니다. 하지만 '사기'는 아닙니다. :-P 이 패턴은 솔직히 너무 일상적으로 '사용되고 있는 패턴'이라서, '그런 것도 패턴이라고 해야 하나'하는 생각이 들 뿐입니다. 사실 패턴이라는 게 별거 아니거든요. '문제를 푸는 데 사용되는 정형화된 방식'일 뿐입니다. 널리 사용되는 클래스 설계 기법이라면, 어떤 것이든 패턴이 될 수 있습니다. 퍼사드 패턴은, 너무나 널리 사용되고 있어서 오히려 당황스러울 지경인 설계 기법을 정리한 것에 불과합니다.
퍼사드 패턴은, 복잡한 클래스들과 패키지들을 어떤 단순한 인터페이스 객체 뒤에 감춥니다. 여기에 가시면 예제도 나옵니다만, Java의 Date 클래스는 사실 사용하기가 좀 까다롭습니다. 그런 복잡한 사용 방법은 전부 다 감추고, 사용자로 하여금 단순히 '현재 날짜에 며칠을 더하면 언제가 되는지' 알려주는 인터페이스만 보여주고 싶다고 해 봅시다.
그러면 퍼사드 클래스를 설계해서, 그 클래스가 내부적으로 Date 클래스나 기타 관련 클래스들을 조작하게 한 다음, 퍼사드 클래스가 제공하는 인터페이스만 사용하도록 하면 됩니다. 결국, 이렇게 해서 만들어진 퍼사드 클래스는 Date 클래스에 대한 '대안적'인 인터페이스가 되는 것이죠.
뭔가 복잡한 기능을 애써서 구현했는데, 그 패키지를 사용할 유저가 '그런데 인터페이스가 너무 복잡해요. 내가 원하는 건 좀 더 단순한 인터페이스인데...'하고 투덜댔다고 해 봅시다. 그러면 그 '애써서 구현한 복잡한 패키지' 앞에 유저가 원하는 좀 더 단순한 인터페이스를 얹으면 됩니다.
따라서, 퍼사드 패턴은 어떻게 보면 어댑터 패턴하고도 좀 비슷한 면이 있습니다. 다만, '어댑테이션'할 기능의 규모가 좀 더 큰 경우에 보다 적합하다고도 할 수 있겠죠.
예전에 우리 팀 다른 연구원이 네트워크에 VPN을 셋업하는 관리 기능을 열심히 구현했었습니다. 그런데 그 인터페이스를 웹 사이트에 연동할 필요가 생겼었어요. 웹 사이트를 구현하는 쪽에서 불평이 심하더군요. 그 기능이 제공하는 RMI 인터페이스들이 너무 복잡하고 무겁다는 게 그 이유였습니다. -_- 그래서 할 수 없이, 그 기능들 앞에다가 WRAPPER를 살짝 덧씌워 SOAP 서버를 만들어 줘 버렸습니다. 이 서버는 딱 두 개의 인터페이스만 가지고 있었죠 -_-
그렇게 구현한 덕분에, 웹 사이트 구현하는 쪽에서는 해당 SOAP 인터페이스를 호출하는 로직만 작성하는 것으로 구현을 마칠 수 있었습니다. 퍼사드 클래스를 구현하는 쪽에서는 약간의 노가다를 했지만, 호출하는 쪽 입장에서 보면 여러가지로 신경쓸 것들이 줄어서 좋았고, 우리는 SOAP라는 대안적인 인터페이스를 가져서 좋았습니다. 모두가 해피해 진 거죠.
어떻게 보면 퍼사드 패턴이 갖는 의의는 '협업'이 갖는 의미가 무엇인지를 잘 보여준다는 데에 있는 것 같기도 해요. '우리는 기능을 모두 다 구현했으니 댁들은 그냥 거기에 맞추세요'라고 선언해서는 프로젝트가 성공하기 어렵습니다. 다른 쪽에서 '인터페이스가 너무 골치아파요'하고 불평한다면, 그런 요구에 답할 수 있는 좋은 방법이 무엇인지 고민해 보는 게, 올바른 태도일지 모른다는 것이죠.
'Languages > Design Pattern' 카테고리의 다른 글
| 퍼사드 패턴 ( facade pattern ) (2) | 2007/09/10 |
|---|---|
| 어댑터 ( Adapter ) 패턴 (0) | 2007/09/08 |
| 미디에이터 (Mediator) 패턴 : 중재자 (2) (0) | 2007/09/05 |
| 미디에이터 (Mediator) 패턴 : 중재자 (1) (0) | 2007/09/04 |
| 비지터 (Visitor) 패턴 (1) | 2007/09/03 |
| 메멘토 패턴 (Memento)에 대한 세미나 자료 (1) | 2007/09/03 |
댓글을 달아 주세요
비밀댓글입니다
2008/12/04 11:25 [ ADDR : EDIT/ DEL : REPLY ]무작정 퍼가시면 곤란합니다... ㅋㅋ
2008/12/04 11:37 [ ADDR : EDIT/ DEL ]