본문 바로가기

IT

퍼사드 패턴(Facade Pattern)

728x90

Facde 패턴 정의

퍼사드 패턴(Facade Pattern)의 Facade는 "건물의 정면"을 의미하는 단어로 어떤 소프트웨어의 다른 커다란 코드 부분에 대하여 간략화된 인터페이스를 제공해주는 디자인 패턴을 의미한다.

 

**퍼사드 패턴(Facade Pattern)**은 구조 패턴의 한 종류로, 서브 시스템들의 공통적인 기능을 정의하는 단순화된 상위 수준의 인터페이스를 정의하는 패턴이다. 퍼사드 객체는 복잡한 소프트웨어 바깥쪽의 코드가 라이브러리의 안쪽 코드에 의존하는 일을 감소시켜 주고, 복잡한 소프트웨어를 사용 할 수 있게 간단한 인터페이스를 제공해주며 서브 시스템들 사이의 종속성을 줄일 수 있다.


퍼사드 패턴 정의(위키백과) : 퍼사드는 클래스 라이브러리 같은 어떤 소프트웨어의 다른 커다란 코드 부분에 대한 간략화된 인터페이스를 제공하는 객체이다.

  • Facade : 사용자의 요청을 서브시스템 객체에 전달하는 단순하고 일관된 통합 인터페이스
  • Subsystem Classes : Facade에 대한 정보를 가지지 않고, 서브 시스템의 기능을 구현하는 클래스

 Facade 클래스 예시

LikeLion이라는 클래스를 생성하고 beforeClass라는 수업을 듣기 전 준비해야 할 메소드를 생성하였다.

package com.ll;

import com.ll.activity.Breakfast;
import com.ll.activity.Setting;
import com.ll.activity.Wash;
import com.ll.activity.Work;

public class LikeLion {
    Breakfast bf;
    Wash wash;
    Work work;
    Setting set;
    public LikeLion(){
        bf = new Breakfast();
        wash = new Wash();
        work = new Work();
        set = new Setting();
    }
    public void beforeClass(){
        bf.eat();
        bf.drink();
        wash.brushTeeth();
        wash.shower();
        work.stretching();
        work.TakeRest();
        set.TurnOnComputer();
        set.zoom();
    }
}

서브 클래스를 포함하여 각각 흩어져 있는 클래스들의 공통적으로 필요한 메서드를 호출하여 사용한다.

package com.ll.activity;

public class Setting {
    public void TurnOnComputer(){
        System.out.println("컴퓨터를 키다.");
    }
    public void zoom(){
        System.out.println("줌 수업을 키다.");
    }
}
package com.ll.activity;

public class Work {
    public void stretching(){
        System.out.println("스트레칭 운동을 하다.");
    }
    public void TakeRest(){
        System.out.println("휴식을 취하다");
    }
}
package com.ll.activity;

public class Wash {
    public void brushTeeth(){
        System.out.println("양치를 하다.");
    }
    public void shower(){
        System.out.println("샤워를 하다.");
    }
}
package com.ll.activity;

public class Breakfast {
    public void eat(){
        System.out.println("아침 식사를 가지다.");
    }
    public void drink(){
        System.out.println("물을 마시다.");
    }

}

main 함수에서는 간단하게 사용 

public class Main {
    public static void main(String[] args) {
        LikeLion ll = new LikeLion();
        ll.beforeClass();
    }
}

특징

  • 퍼사드는 소프트웨어 라이브러리를 쉽게 사용할 수 있게 해준다. 또한 퍼사드는 소프트웨어 라이브러리를 쉽게 이해할 수 있게 해 준다. 퍼사드는 공통적인 작업에 대해 간편한 메소드들을 제공해준다.
  • 퍼사드는 라이브러리를 사용하는 코드들을 좀 더 읽기 쉽게 해준다.
  • 퍼사드는 라이브러리 바깥쪽의 코드가 라이브러리의 안쪽 코드에 의존하는 일을 감소시켜준다. 대부분의 바깥쪽의 코드가 퍼사드를 이용하기 때문에 시스템을 개발하는 데 있어 유연성이 향상된다.
  • 퍼사드는 좋게 작성되지 않은 API의 집합을 하나의 좋게 작성된 API로 감싸준다.

효과

  • 낮은 결합도 : 클라이언트가 서브시스템의 코드를 모르더라도 Facade 클래스를 통해 사용 가능
  • 서브 클래스 직접 접근 가능 : Facade 클래스를 통해 서브클래스를 사용할지, 서브클래스를 직접 사용할지 선택 가능
  • 현재의 상황에서 클라이언트는 서브시스템 클래스에 의해 구현된 서비스들과 다수의 상호작용을 해야하며, 서브시스템 클래스에 대한 정보를 알고 있어야 한다. 즉, 클라이언트가 서브시스템과 강하게 연결되어 있는 상태(tightly coupled)이다. 따라서 서비스 계층에서의 변화는 클라이언트에게 영향을 미친다.

facade 전

  • 서브시스템을 사용하기 쉽게 하는 인터페이스(퍼사드)를 두어 간편하게 주문을 넣을 수 있도록 변경하였다. 퍼사드에서 각각의 서비스들을 적절하게 사용하여 주문을 처리하는 것이다. 퍼사드 패턴을 적용한 결과 서브시스템 클래스에서 변화가 생겨도 클라이언트 코드에 영향이 가지 않는다(loosely coupled).

facade 후

  •  퍼사드 패턴의 핵심은 상호작용 복잡도를 낮추는데 있다

퍼사드 패턴의 중요 포인트 

  • 퍼사드 패턴은 클라이언트 어플리케이션의 헬퍼 역할을 하는 것이지, 서브시스템 인터페이스를 숨기는 것은 아니다.
  • 퍼사드 패턴은 특정 기능에 대해 인터페이스의 수가 확장되고 시스템이 복잡해질 수 있는 상황에서 사용하기 적합하다.
  • 퍼사드 패턴은 비슷한 작업을 해야 하는 다양한 인터페이스들 중 하나의 인터페이스를 클라이언트에 제공해야 할 때 적용하는 것이 좋다.