Facade Design Pattern은 구조적 디자인 패턴 중 하나입니다(예: 어댑터 패턴 및 데코레이터 패턴). Facade 디자인 패턴은 클라이언트 응용 프로그램이 시스템과 쉽게 상호 작용할 수 있도록 돕는 데 사용됩니다.
Facade Design Pattern
GoF에 따르면 Facade 디자인 패턴은 다음과 같습니다:
하위 시스템의 일련의 인터페이스에 통합된 인터페이스를 제공합니다. Facade 패턴은 하위 시스템을 더 쉽게 사용할 수 있도록 더 높은 수준의 인터페이스를 정의합니다.
우리가 MySql/Oracle 데이터베이스를 사용하고 다양한 종류의 보고서를 생성하는 일련의 인터페이스를 갖춘 애플리케이션이 있다고 가정해 보겠습니다. HTML 보고서, PDF 보고서 등의 다른 유형의 보고서를 생성할 수 있습니다. 따라서 다른 유형의 데이터베이스와 작업하기 위한 다른 인터페이스 세트가 있을 것입니다. 이제 클라이언트 애플리케이션은 이러한 인터페이스를 사용하여 필요한 데이터베이스 연결을 가져오고 보고서를 생성할 수 있습니다. 그러나 복잡성이 증가하거나 인터페이스 동작 이름이 혼란스러울 때 클라이언트 애플리케이션은 이를 관리하기 어려울 수 있습니다. 따라서 여기서 Facade 디자인 패턴을 적용하고 기존 인터페이스 위에 래퍼 인터페이스를 제공하여 클라이언트 애플리케이션을 지원할 수 있습니다.
Facade 디자인 패턴 – 인터페이스 세트
우리는 두 개의 도우미 인터페이스, 즉 MySqlHelper
와 OracleHelper
를 가질 수 있습니다.
package com.journaldev.design.facade;
import java.sql.Connection;
public class MySqlHelper {
public static Connection getMySqlDBConnection(){
//연결 매개 변수를 사용하여 MySql DB 연결 가져오기
return null;
}
public void generateMySqlPDFReport(String tableName, Connection con){
//테이블에서 데이터 가져와 pdf 보고서 생성하기
}
public void generateMySqlHTMLReport(String tableName, Connection con){
//테이블에서 데이터 가져와 pdf 보고서 생성하기
}
}
package com.journaldev.design.facade;
import java.sql.Connection;
public class OracleHelper {
public static Connection getOracleDBConnection(){
//연결 매개 변수를 사용하여 Oracle DB 연결 가져오기
return null;
}
public void generateOraclePDFReport(String tableName, Connection con){
//테이블에서 데이터 가져와 pdf 보고서 생성하기
}
public void generateOracleHTMLReport(String tableName, Connection con){
//테이블에서 데이터 가져와 pdf 보고서 생성하기
}
}
퍼사드 디자인 패턴 인터페이스
다음과 같이 퍼사드 패턴 인터페이스를 만들 수 있습니다. 타입 안전성을 위해 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;
}
}
퍼사드 디자인 패턴 클라이언트 프로그램
이제 퍼사드 패턴을 사용하지 않고 클라이언트 코드를 보고 퍼사드 패턴 인터페이스를 사용하는 방법을 살펴보겠습니다.
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";
// 퍼사드를 사용하지 않고 MySql HTML 보고서 및 Oracle PDF 보고서 생성
Connection con = MySqlHelper.getMySqlDBConnection();
MySqlHelper mySqlHelper = new MySqlHelper();
mySqlHelper.generateMySqlHTMLReport(tableName, con);
Connection con1 = OracleHelper.getOracleDBConnection();
OracleHelper oracleHelper = new OracleHelper();
oracleHelper.generateOraclePDFReport(tableName, con1);
// 퍼사드를 사용하여 MySql HTML 보고서 및 Oracle PDF 보고서 생성
HelperFacade.generateReport(HelperFacade.DBTypes.MYSQL, HelperFacade.ReportTypes.HTML, tableName);
HelperFacade.generateReport(HelperFacade.DBTypes.ORACLE, HelperFacade.ReportTypes.PDF, tableName);
}
}
퍼사드 패턴 인터페이스를 사용하면 클라이언트 측에 많은 로직이 없는 더 간단하고 깨끗한 방법으로 처리할 수 있음을 알 수 있습니다. 데이터베이스 연결을 얻기 위한 JDBC 드라이버 관리자 클래스는 퍼사드 디자인 패턴의 훌륭한 예입니다.
퍼사드 디자인 패턴 중요 포인트
- Facade 디자인 패턴은 클라이언트 애플리케이션에 대한 도움이 되는 것으로, 하위 시스템 인터페이스를 클라이언트로부터 숨기지는 않습니다. Facade를 사용할지 여부는 완전히 클라이언트 코드에 따라 결정됩니다.
- Facade 디자인 패턴은 개발의 어느 지점에서나 적용할 수 있으며, 일반적으로 인터페이스의 수가 증가하고 시스템이 복잡해질 때 사용됩니다.
- 하위 시스템 인터페이스는 Facade를 인식하지 않아야 하며, Facade 인터페이스에 대한 참조를 가져서는 안 됩니다.
- Facade 디자인 패턴은 비슷한 종류의 인터페이스에 적용되어, 비슷한 종류의 작업을 수행하는 여러 인터페이스보다 단일 인터페이스를 제공하는 것이 목적입니다.
- 우리는 Facade와 함께 Factory 패턴을 사용하여 클라이언트 시스템에 더 좋은 인터페이스를 제공할 수 있습니다.
Facade 디자인 패턴에 대한 내용은 여기까지입니다. 더 많은 디자인 패턴 기사를 기다려주세요. 🙂
Source:
https://www.digitalocean.com/community/tutorials/facade-design-pattern-in-java