The Facade Pattern

    종종 프로그램이 전개되고 개발됨에 따라, 프로그램들은 복잡해진다. 사실, 디자인 패턴을 이용하는 거에 대한 흥분은 이러한 패턴들이 때때로 프로그램의 흐름을 이해하는 것을 어렵게 하는 많은 클래스들을 생성한다는 것이다. 게다가, 그것들은 복잡한 시스템일 수도 있고, 복잡한 인터페이스를 가지고 있을 수도 있다. 

    Facade 패턴은 이러한 하위 시스템에 대한 간단한 인터페이스를 제공하여 복잡한 것을 간단히 만드는 것이다. 이 간단성이 놓여있는 클래스의 유연성을 줄이는 경우가 있지만, 보통 대부분의 약아빠진 사용자들을 제외하고는 모두에게 필요한 함수를 제공한다. 

    다행스럽게도, 우리는 Facade가 유용하게 사용될 수 있는 예에 대하여 제공되는 복잡한 시스템을 작성할 필요가 없다. 자바는 JDBC라 불리는 인터페이스를 사용하여 데이터베이스에 연결되는 클래스들의 집합을 제공한다. 프로그램 개발자가 제공하는 JDBC 연결 클래스를 이용하여 어떤 데이터베이스 든  연결할 수 있다. 몇몇 데이터베이스드은 JDBC를 이용하여 직접적인 연결을 할 수 있고 몇몇은 JDBC-ODBC bridge 클래스를 이용하여 ODBC 드라이버에 연결을 허용한다. 

    이러한 java.sql 패키지에 있는 데이터베이스 관련 클래스들은 아래의 그림처럼 휘감는 방식으로 상호작용을 하는 저수준의 클래스들의 집합의 예를 제공한다. 

        ##########0*

    데이터베이스를 연결하기 위해서, Connection 클래스의 인스턴스를 사용한다. 그리고 나서, 데이터베이스 테이블들의 이름과 필드들의 이름을 찾기 위해, Connection 으로부터 DatabaseMeta 클래스의 인스턴스를 얻는 것이 필요하다. 다음, 질의를 하기 위해 SQL 질의어를 만들고 Statement 클래스를 생성하는 Connecion 을 이용한다. 문장을 실행함으로서, ResultSet 클래스르 얻을 수 있고, ResultSet 클래스에서 필드들의 이름을 찾기 위해 ResultsetMetadata의 클래스의 인스턴스를 얻는 것이 필요하다. 
그러므로, 이러한 클래스 모두를 조작하는 것은 꾀나 어려울 수 있다. 왜냐면 대부분 그런 클래스들의 호출되는 메소드들은 예외를 발생시킬 수 있고, 코딩이 복잡해 질 수 있기 때문이다. 

            ##########1*

        그러나, 데이터베이스 클래스와 resultSet 클래스의 구성을 Facade로 디자인함으로써, 우리는 훨씬 더 유용한 시스템을 만들 수 있다.     

Building the Facade Classes

    어떻게 데이터베이스를 연결할 것인지 고려해보자. 우리는 우선 데이터베이스 드라이버를 읽어들여야 한다.   

try {
	Class.forName(driver);
} //load the Bridge driver

catch(Exception e) {
	System.out.println(e.getMessage());
}

    그리고 나서 데이터베이스를 연결하기 위한  Connection 클래스를 이용한다. 우리는 또한 데이터베이스에 대하여 좀더 많은 것을 알아 내기 위해 데이터베이스의 메타데이터를 얻을 수 있다: 

try {
	con = DriverManager.getConnection(url);
	dma = con.getMetaData(); //get the meta data
}
catch(Exception e) {
	System.out.println(e.getMessage());
}

만약 우리가 데이터베이스에서 테이블들의 이름 목록을 얻고자 한다면, 우리는 데이터베이스 메타 데이터 클래스상의 ResultSet 객체로 반환되는 getTables 메소드를 호출할 필요가 있다. 마지막으로, 이름들의 목록을 얻기 위해 그 객체들을 통하여 이터레이터를 해야 한다. 

Vector tname = new Vector();

try {
	results = new ResultSet(dma.getTables(catalog, null, "%", type));
}
catch(Exception e) {
	System.out.println(e.getMessage());
}

while(results.hasMoreElements())
	tname.addElement(results.getColumnValue("TABLE_NAME"));


이것은 관리하기가 꾀나 관리하기가 복잡해졌고, 아직은 어떤 질의어도 사용하지 않았다. 

    우리가 만들 수 있는 간략화 가정은 이러한 데이터베이스 클래스 메소드들이 발생시키는 예외를 복잡하게 핸들링 할 필요가 없게 하는 하는 것이다. 대부분은 메소드들이 데이터베이 연결에서 실패를 하지 않는다면 오류 없이 작동할 것이다. 그러므로, 우리는 오류들을 드문 드문 일어나는 오류들을 감지하고 더 이상의 행동을 취하지 않도록 클래스들의 메소드를 포장할 수 있을 것이다. 

    이것이 Connection, ResultSet, Statement 와 Metadata 클래스들의 의미있는 메소드들을 포함하는 두개의 클래스로 작성할 수 있을 것이다. 이 두 클래스는 Database 클래스이고 :

class Database {
	public Database(String driver)() //constructor
	public void Open(String url, String cat);
	public String[] getTableNames();
	public String[] getColumnNames(String table);
	public String getColoumnValue(String table, String columnName);
	public String getNextValue(String columnName);
	public resultSet Execute(String sql);
}

    이고 resultSet 클래스는 :

class resultSet {
	public resultSet(ResultSet rset)	//
	public String[] getMetaData();
	public boolean hasMoreElements();
	public String[] nextElement();
	public String getColumnValue(String columnName);
	public String getColumnValue(int i);
}

    이 간단한 클래스들은 데이터베이스를 열고, 데이터베이스에 있는 테이블의 이름이나, 열의 이름과 내용, 간단한 쿼리에 의해  표시될 수 있도록 해준다. 

        ##########2*

    그리고 텍스트 입력창에 SQL 쿼리를 입력하고 Run Query 버튼을 누르면 그에 따른 결과를 보여준다.

        ##########3*

Consequences of the Facade

    Facade 패턴은 복잡한 하부 시스템의 컴포넌트로부터 클라이언트들을 포장하고 일반적인 사용자를 위한 보다 간단한 프로그래밍 인터페이스를 제공한다. 그러나 그것은 숙달된 사용자가 좀더 심도있고, 필요에 따라 클래스를 좀더 복잡하게 하는 것을 막을 수 없다. 

    게다가 Facade 는 클라이언트 코드에서 수정의 요구 없이 근원이 되는 하부 시스템에서의 변경을 할 수 있게 해주고, 복잡한 의존들을 줄여준다. 

'Development > 패턴자료' 카테고리의 다른 글

[펌] The Flyweight Pattern  (0) 2011.08.13
[펌] The Factory Pattern  (0) 2011.08.13
[펌] The Decorator Pattern  (0) 2011.08.13
[펌] The Composite Pattern  (0) 2011.08.13
[펌] The Command Pattern  (0) 2011.08.13
안정적인 DNS서비스 DNSEver DNS server, DNS service
Posted by 키르히아이스
,