디자인 패턴(구)/구조 패턴

퍼사드(FACADE) 패턴이란?

공대키메라 2022. 4. 14. 22:53

1. 퍼사드 패턴이란?

의도

한 서브시스템 내의 인터페이스 집합에 대한 획일화된 하나의 인터페이스를 제공하는 패턴.

서브시스템을 사용하기 쉽도록 상위 수준의 인터페이스를 정의

 

즉, 복잡한 서브 시스템 의존성을 최소화하는 방법이다. 

 

사실 이게 보면 뭔가... 굉장히 익숙하면서도 크게 어렵지도 않다. 

 

많은 영상과 정보를 찾는 동안에도 모두가 별로 이야기할게 없다고 하긴 했다. 

사용 시기

  • 복잡한 서브시스템에 대한 단순한 인터페이스 제공이 필요할 때
  • 추상 개념에 대한 구현 클래스와 사용자 사ㅏ이에 너무 많은 종속성이 존재할 때
  • 서브시스템을 계층화 시킬 때

구조

  • Facade : 단순하고 일관된 통합 인터페이스를 제공. 서브시스템을 구성하는 어떤 클래스가 어떤 요청을 처리해야 하는지 알고 있으며, 사용자의 요청을 해당 서브시스템 객체에 전달.
  • Subsystem : 서브시스템의 기능을 구현하고, Facade객체로 할당된 작업을 실제로 처리하지만 Facade에 대한 아무런 정보가 없다. 즉, 이들에 대한 어떤 참조자도 가지고 있지 않다. 

Facade의 뜻은 쉽게 인터넷에서 찾을 수 있다. 

결국 사용자가 보기에는 하나인데, 전부 다 뒤로 숨겨져 있다는 것이다. 

 

그것이 건물을 정면에서 본 특성이다. 

 

즉, 내부는 보이지 않고 빌딩만 보인다는 것이다. 그것처럼 구현하는 것을 Facade패턴이라고 한다. 

 

사실 생각해보면  util성 클래스를 제공할 때도 그렇고... 너무 당연한 패턴같이 느껴진다. 

 

2. 구현

MakeString.java

public class MakeString {

    public static void main(String[] args) {
        /**
         * Facade pattern 구현 전
         */
        String getParam = "testParam";

        if(getParam.equals("test1")){
            throw new IllegalArgumentException("test1 !!!");
        }

        if(getParam.equals("test2")){
            throw new IllegalArgumentException("test2 !!!");
        }

        System.out.println("getParam = " + getParam);

        /**
         * Facade pattern 구현 후
         */

        System.out.println(CheckStringParam.checkStringParam("testParam"));

    }

}

 

아니 이게 끝이라고?

 

그렇다. 내가 볼 때는 전혀 문제가 없다.

 

이유는 의도를 생각해보면 된다.

 

다시 한번 의도를 생각해보자.

의도

한 서브시스템 내의 인터페이스 집합에 대한 획일화된 하나의 인터페이스를 제공하는 패턴.

서브시스템을 사용하기 쉽도록 상위 수준의 인터페이스를 정의

 

결국 facade패턴을 사용하면서 의존성을 MakeString으로 모으고 있다.

 

물론 현재는 코드를 구현한 것이 너무 적어서 눈에 띄지 않지만, 잘 class를 만들어 두면

 

MakeString.java에서는 오직 사용만 적절히 해주면된다.

 

MakeString.java가 결국 하나의 인터페이스 집합이라고 한다면,

 

CheckStringParam같은 클래스는 subsystem에 속하는 것이다.

 

이렇게 하면 사용자는 사용하기가 쉽다. 뒤에가 어떻게 돌아가는지 몰라도 말이다.

3. 장단점

장점

  • 서브 시스템에 대한 의존성을 한곳으로 모을 수 있다

단점

  • 퍼사드 클래스가 서브 시스템에 대한 모든 의존성을 가지게 된다

이번 글은 좀 날로먹은 거 같은 느낌이 다분하다.

 

그 이유는 사실 Util성 클래스를 만들라고 한다면 당연히 이런 방식을 가장 먼저 떠올리기 때문이다.

 

혹시 부족하거나 이상한 부분이 있으면 언제든 피드백을 주면 환영하소!