웹사이트 검색

Java의 파사드 디자인 패턴


Facade 디자인 패턴은 Decorator 패턴과 같은 Structural 디자인 패턴 중 하나입니다. 파사드 디자인 패턴은 클라이언트 애플리케이션이 시스템과 쉽게 상호 작용하도록 돕는 데 사용됩니다.

파사드 디자인 패턴

하위 시스템의 인터페이스 집합에 통합 인터페이스를 제공합니다. Facade 패턴은 하위 시스템을 사용하기 쉽게 만드는 상위 수준 인터페이스를 정의합니다.

MySql/Oracle 데이터베이스를 사용하고 HTML 보고서, PDF 보고서 등과 같은 다양한 유형의 보고서를 생성하기 위한 일련의 인터페이스가 있는 애플리케이션이 있다고 가정합니다. 따라서 다양한 유형의 데이터베이스와 함께 작동하는 다양한 인터페이스 세트가 있습니다. 이제 클라이언트 애플리케이션은 이러한 인터페이스를 사용하여 필요한 데이터베이스 연결을 얻고 보고서를 생성할 수 있습니다. 그러나 복잡성이 증가하거나 인터페이스 동작 이름이 혼란스러울 경우 클라이언트 애플리케이션은 이를 관리하기 어려울 것입니다. 따라서 여기에 Facade 디자인 패턴을 적용하고 기존 인터페이스 위에 래퍼 인터페이스를 제공하여 클라이언트 애플리케이션을 도울 수 있습니다.

파사드 디자인 패턴 - 인터페이스 세트

MySqlHelperOracleHelper라는 두 가지 헬퍼 인터페이스를 가질 수 있습니다.

package com.journaldev.design.facade;

import java.sql.Connection;

public class MySqlHelper {
	
	public static Connection getMySqlDBConnection(){
		//get MySql DB connection using connection parameters
		return null;
	}
	
	public void generateMySqlPDFReport(String tableName, Connection con){
		//get data from table and generate pdf report
	}
	
	public void generateMySqlHTMLReport(String tableName, Connection con){
		//get data from table and generate pdf report
	}
}
package com.journaldev.design.facade;

import java.sql.Connection;

public class OracleHelper {

	public static Connection getOracleDBConnection(){
		//get Oracle DB connection using connection parameters
		return null;
	}
	
	public void generateOraclePDFReport(String tableName, Connection con){
		//get data from table and generate pdf report
	}
	
	public void generateOracleHTMLReport(String tableName, Connection con){
		//get data from table and generate pdf report
	}
	
}

파사드 디자인 패턴 인터페이스

아래와 같이 Facade 패턴 인터페이스를 생성할 수 있습니다. 유형 안전성을 위해 Java Enum을 사용하는 것에 주목하십시오.

package com.journaldev.design.facade;

import java.sql.Connection;

public class HelperFacade {

	public static void generateReport(DBTypes dbType, ReportTypes reportType, String tableName){
		Connection con = null;
		switch (dbType){
		case MYSQL: 
			con = MySqlHelper.getMySqlDBConnection();
			MySqlHelper mySqlHelper = new MySqlHelper();
			switch(reportType){
			case HTML:
				mySqlHelper.generateMySqlHTMLReport(tableName, con);
				break;
			case PDF:
				mySqlHelper.generateMySqlPDFReport(tableName, con);
				break;
			}
			break;
		case ORACLE: 
			con = OracleHelper.getOracleDBConnection();
			OracleHelper oracleHelper = new OracleHelper();
			switch(reportType){
			case HTML:
				oracleHelper.generateOracleHTMLReport(tableName, con);
				break;
			case PDF:
				oracleHelper.generateOraclePDFReport(tableName, con);
				break;
			}
			break;
		}
		
	}
	
	public static enum DBTypes{
		MYSQL,ORACLE;
	}
	
	public static enum ReportTypes{
		HTML,PDF;
	}
}

파사드 디자인 패턴 클라이언트 프로그램

이제 Facade 패턴을 사용하지 않고 Facade 패턴 인터페이스를 사용하여 클라이언트 코드를 볼 수 있습니다.

package com.journaldev.design.test;

import java.sql.Connection;

import com.journaldev.design.facade.HelperFacade;
import com.journaldev.design.facade.MySqlHelper;
import com.journaldev.design.facade.OracleHelper;

public class FacadePatternTest {

	public static void main(String[] args) {
		String tableName="Employee";
		
		//generating MySql HTML report and Oracle PDF report without using Facade
		Connection con = MySqlHelper.getMySqlDBConnection();
		MySqlHelper mySqlHelper = new MySqlHelper();
		mySqlHelper.generateMySqlHTMLReport(tableName, con);
		
		Connection con1 = OracleHelper.getOracleDBConnection();
		OracleHelper oracleHelper = new OracleHelper();
		oracleHelper.generateOraclePDFReport(tableName, con1);
		
		//generating MySql HTML report and Oracle PDF report using Facade
		HelperFacade.generateReport(HelperFacade.DBTypes.MYSQL, HelperFacade.ReportTypes.HTML, tableName);
		HelperFacade.generateReport(HelperFacade.DBTypes.ORACLE, HelperFacade.ReportTypes.PDF, tableName);
	}

}

보시다시피 Facade 패턴 인터페이스를 사용하는 것이 클라이언트 측에서 많은 논리를 피하는 훨씬 쉽고 깔끔한 방법입니다. 데이터베이스 연결을 얻기 위한 JDBC 드라이버 관리자 클래스는 파사드 디자인 패턴의 훌륭한 예입니다.

파사드 디자인 패턴 중요 포인트

  • 파사드 디자인 패턴은 클라이언트 애플리케이션의 도우미와 비슷하며 클라이언트에서 하위 시스템 인터페이스를 숨기지 않습니다. Facade 사용 여부는 전적으로 클라이언트 코드에 달려 있습니다.
  • 파사드 디자인 패턴은 일반적으로 인터페이스 수가 증가하고 시스템이 복잡해질 때 개발의 모든 시점에 적용할 수 있습니다.
  • 하위 시스템 인터페이스는 Facade를 인식하지 못하며 Facade 인터페이스에 대한 참조가 없어야 합니다.
  • 파사드 디자인 패턴은 유사한 종류의 인터페이스에 적용되어야 하며, 그 목적은 유사한 종류의 작업을 수행하는 여러 인터페이스가 아닌 단일 인터페이스를 제공하는 것입니다.
  • Facade와 함께 Factory 패턴을 사용하여 클라이언트 시스템에 더 나은 인터페이스를 제공할 수 있습니다.

이것이 Facade 디자인 패턴의 전부입니다. 더 많은 디자인 패턴 기사를 기대해 주세요. :)