구조(Structural) 패턴 - Facade
2007/05/19 15:00
종종 프로그램이 전개되고 개발됨에 따라, 프로그램들은 복잡해짐. 사실, 디자인 패턴을 이용하는 거에 대한 흥분은 이러한 패턴들이 때때로 프로그램의 흐름을 이해하는 것을 어렵게 하는 많은 클래스들을 생성한다는 것임. 게다가, 그것들은 복잡한 시스템일 수도 있고, 복잡한 인터페이스를 가지고 있을 수도 있음.
Facade 패턴은 이러한 하위 시스템에 대한 간단한 인터페이스를 제공하여 복잡한 것을 간단히 만드는 것. 이 간단성이 놓여있는 클래스의 유연성을 줄이는 경우가 있지만, 보통 대부분의 약아빠진 사용자들을 제외하고는 모두에게 필요한 함수를 제공.
다행스럽게도, 우리는 Facade가 유용하게 사용될 수 있는 예에 대하여 제공되는 복잡한 시스템을 작성할 필요가 없음. 자바는 JDBC라 불리는 인터페이스를 사용하여 데이터베이스에 연결되는 클래스들의 집합을 제공. 프로그램 개발자가 제공하는 JDBC 연결 클래스를 이용하여 어떤 데이터베이스 든 연결할 수 있음. 몇몇 데이터베이스드은 JDBC를 이용하여 직접적인 연결을 할 수 있고 몇몇은 JDBC-ODBC bridge 클래스를 이용하여 ODBC 드라이버에 연결을 허용.
1. 의도
서브 시스템에 있는 인터페이스 집합에 대하여 하나의 통합된 인터페이스를 제공. Facade 패턴은 서브 시스템을 좀 더 사용하기 편하게 하기 위해서 높은 수준의 인터페이스를 정의.
2. 고려해야 할 사항
많은 디자인 패턴들은 쉬운 유지보수와 높은 재사용성을 위해 클래스를 작고, 응집력이 높도록 만드는 경향이 있음. 따라서 많은 서스 시스템은 많은 수의 클래스를 가지게 됨. 이 클래스들을 클라이언트가 직접 사용할 경우, 클라이언트와 서스 시스템간 결합도가 높아지는 문제가 발생함. 그리고 클라이언트 클래스와 서브 시스템에 존재하는 클래스간 결합도가 높아질 경우 다음과 같은 문제을 발생시킬 수 있음.

4. 자바 프로그래밍 언어에서의 사용 예
Facade 패턴은 이러한 하위 시스템에 대한 간단한 인터페이스를 제공하여 복잡한 것을 간단히 만드는 것. 이 간단성이 놓여있는 클래스의 유연성을 줄이는 경우가 있지만, 보통 대부분의 약아빠진 사용자들을 제외하고는 모두에게 필요한 함수를 제공.
다행스럽게도, 우리는 Facade가 유용하게 사용될 수 있는 예에 대하여 제공되는 복잡한 시스템을 작성할 필요가 없음. 자바는 JDBC라 불리는 인터페이스를 사용하여 데이터베이스에 연결되는 클래스들의 집합을 제공. 프로그램 개발자가 제공하는 JDBC 연결 클래스를 이용하여 어떤 데이터베이스 든 연결할 수 있음. 몇몇 데이터베이스드은 JDBC를 이용하여 직접적인 연결을 할 수 있고 몇몇은 JDBC-ODBC bridge 클래스를 이용하여 ODBC 드라이버에 연결을 허용.
1. 의도
서브 시스템에 있는 인터페이스 집합에 대하여 하나의 통합된 인터페이스를 제공. Facade 패턴은 서브 시스템을 좀 더 사용하기 편하게 하기 위해서 높은 수준의 인터페이스를 정의.
2. 고려해야 할 사항
많은 디자인 패턴들은 쉬운 유지보수와 높은 재사용성을 위해 클래스를 작고, 응집력이 높도록 만드는 경향이 있음. 따라서 많은 서스 시스템은 많은 수의 클래스를 가지게 됨. 이 클래스들을 클라이언트가 직접 사용할 경우, 클라이언트와 서스 시스템간 결합도가 높아지는 문제가 발생함. 그리고 클라이언트 클래스와 서브 시스템에 존재하는 클래스간 결합도가 높아질 경우 다음과 같은 문제을 발생시킬 수 있음.
- 서브 시스템 내에 존재하는 클래스를 수정할 경우, 클라이언트가 영향을 받음. 이럴 경우 시스템이 깨지기 쉽고(Brittleness가 높음), 적응성(Adaptability)이 낮게 됨.
- 클라이언트 클래스 작성 프로그래머는 클래스가 제공하는 모든 인터페이스에 대해 알아야 함. 이럴 경우 시스템 수정이 복잡해지고 시간이 오래 걸리게 됨.
- 클라이언트는 서브 시스템의 오퍼레이션 순서의 정확한 순서를 알아야 하고, 오퍼레이션간 상태를 전달해야 함. 이럴 경우 클라이언트가 서브 시스템의 관련 로직을 알고 있어야 함.
- 클라이언트와 서스 시스템은 서로 다른 머신에 위치하고 있을 경우, 많은 메소드 호출과 상태 전달은 네트워크 오버헤드를 증가시키는 원인이 됨.

4. 자바 프로그래밍 언어에서의 사용 예
- java.net.URL 클래스가 Facade의 역할을 수행. 이 클래스는 URL이 가지고 있는 내용들을 접근하기 위한 API를 제공.
- 하나의 클래스가 URL 클래스의 클라이언트가 되고, 클라이언트는 java.net.URL 클래스를 이용해 URL 클래스에 의해 제공되는 Facade 뒤쪽에서 얼마나 많은 클래스들에 의해 운영이 되고 있는지에 대한 정보가 없어도 URL 정보를 얻을 수 있음.
- 다른 한편, 데이터를 URL에 전송하기 위해 URL 오브젝트의 클라이언트는 openConnection 메소드를 호출. 이 메소드는 URL 오브젝트가 사용하는 URLConnection 오브젝트를 리턴.
- 장점
서스 시스템 콤포넌트들은 클라이언트에게 은폐되어 있기 때문에, 클라이언트가 알아야 할 오브젝트 수가 줄어듬. 따라서, 클라이언트는 서스 시스템을 사용하기 더 쉬워짐.
분산환경에서 네트워크 오버헤드가 감소.
클라이언트와 서스 시스템간 결함이 느슨해짐. 따라서, 클라이언트에 영향을 주지 않으면서 서스 시스템을 변경시킬 수 있음.
서브 시스템 클래스는 사용하는 것을 완전히 막지는 않음. 그러므로 Facade를 사용할지 서스 시스템 클래스를 직접 사용할지를 결정할 수 있음. - 단점
서스 시스템내에 존재하는 콤포넌트에 직접 억세스하는 것이 아니라, Facade를 통해서 접근하고 있기 때문에 수행속도에 영향을 줄 수 잇음.
