Facade 패턴 (퍼사드 패턴)
* 예제
- 어떤 검색 조건을 입력했을 때 해당 검색 조건을 만족하는 자료를 데이터베이스로부터 찾아주는 프로그램
- 입력한 검색 조건이 제대로 된 것인가?
- 자료를 찾기 위해 데이터베이스 관리 시스템에 접속
- 검색에 알맞은 SQL 문장 생성
- 생성된 SQL 문장을 데이터베이스 관리 시스템에 전달
- 그 결과를 받아와야 함
- 그 결과를 기반으로 사용자에게 보여줄 최종 화면 생성
* 위의 예제는 데이터베이스로부터 자료를 검색하기 위한 클래스들이 이미 존재
- 사용자가 입력한 검색 조건이 적합한 것인지 검사해주기 위한 클래스
- 검색 조건을 SQL 문장으로 생성해주기 위한 클래스
- 데이터베이스 관리 시스템에 접속해서 SQL 문장의 실행을 요청하는 클래스
- SQL 문장의 실행 결과를 저장하기 위한 클래스
- 이들은 데이터베이스에서 자료를 검색하기 위해 상호 간에 복잡한 관계
- 어떻게 하면 좋은가?
1. 클래스 직접 활용 방식
- 주어진 클래스들을 직접 활용해서 검색 프로그램을 작성
- Client가 일일이 필요한 클래스의 객체를 생성, 이를 활용
- 클라이언트가 데이터베이스로부터 자료를 검색하기 위해 어떤 객체를 언제 생성
- 중간에 어떤 과정을 거쳐 검색 작업을 수행해야 하는지 모두 알고 있어야 함, 이에 맞추어 작업 수행
- 클라이언트 프로그램을 작성하는 입장에서 볼 때 이는 매우 불편
- 클라이언트 입장에서는 단지 조건 전달하고 결과만 받아보면 됨
- 이 방법은 검색을 위한 구체적인 과정까지 일일이 알고서 작업을 수행
2. Proxy 패턴 활용 방식
- 해결책은 작업 수행에 필요한 입력 요소와 그에 따른 결과만을 Client가 관여하고 중간 과정은 블랙박스 형태
- 중간 과정을 수행하기 위한 클래스를 별도로 정의
- 클라이언트는 이를 이용하는 형태, 클라이언트가 수행하던 역할을 대신 클래스 생성
- 이 방법의 한 가지 문제는 서로 다른 사람이 서로 다른 프로젝트에서 정의된 클래스를 이용하고자 할 때
각자 별도로 클라이언트의 역할을 대행해주는 클래스를 정의하고 사용
- 개별 프로젝트 단위는 문제가 안 되나 전체적으로 모든 프로젝트의 결과물들이 모여서 유지, 보수할 때
동일한 역할을 수행하는 클래스가 여러 개 존재
3. Facade 패턴
- Proxy의 문제는 클라이언트마다 별도로 검색 과정을 수행하기 위한 클래스 정의
- 해결 방법은 미리 검색 과정을 수행하기 위한 클래스를 정의해서 클라이언트에게 제공
- 이 클래스를 모든 클라이언트들이 공유해서 사용하게 하는 것
- 이렇게 클래스 간의 관계가 정립되면 얻을 수 있는 장점은 서브시스템이 자연스럽게 정의
- 여러 개의 클래스들이 밀접한 관계를 가지고 있으며 전체적으로 하나의 역할을 수행할 때,
그 역할을 대표하기 위한 클래스를 정의하고 외부 클라이언트들이 일일이 각 클래스를 직접 다루지 않더라도
대표 클래스를 통하여 원하는 기능을 제공받을 수 있도록 만든 방식
- Facade 패턴에서 여러 클래스들이 제공하는 역할을 대표하는 클래스를 Facade 클래스
- 이 클래스를 경계로 자연스럽게 서브 시스템을 정의하는 것이 가능
- Facade 클래스는 클래스 정의 시 public으로 공개되는 인터페이스처럼 서브시스템을 대표하는 인터페이스 역할
* Facade 패턴과 클래스 정의의 유사점
- 클래스 정의 : 내부 상태와 연산을 은닉
- Facade 패턴 : 서브 시스템은 내부의 클래스를 은닉
서브 시스템의 인터페이스도 public과 private으로 구분지으면 보다 명백한 정보 은닉
이것이 쉽지 않기 때문에 namespace를 선언해서 서브시스템 외부에서 알 필요가 없는 클래스들 에 대해 서브시스템과 관련 namespace로 숨김
이를 활용하면 서브 시스템 외부에서 알 필요가 없는 클래스들에 대해서는 서브시스템과 관련된
namespace 내부로 숨길 수 있음
* 정리
- Facade 패턴은 서브 시스템 내부의 복잡함을 숨기고, 서브시스템이 제공하는 기능이나 역할만 Facade 클래스로 정의하여 외부에 제공
* 유용한 경우
- 복잡한 서브 시스템에 대해 간단한 인터페이스를 제공하고자 하는 경우
- 클라이언트와 구현 클래스들 사이에 또는 서브 시스템과 다른 서브 시스템들 간에 의존 관계가 너무 많아
결합도(Coupling)가 높을 때 이를 감소시켜 주기 위한 방안
- 서브 시스템 사이에 계층화된 설계 구조(Layered Architecture)를 가질 때 이용해서 서브 시스템의 진입점 정의