디자인 패턴 (Design Pattern)

[구조 패턴] 퍼사드 패턴(Facade pattern)

계란💕 2023. 3. 13. 21:31

퍼사드 패턴(Facade pattern, Singletone Abstract Factory, 싱글톤 추상 팩토리)

  • GOF에 따르면 퍼사드 패턴은 "하위 시스템의 인터페이스 세트일관된 인터페이스를 제공하는 것"
  • 하위 시스템의 복잡도를 감추는 동시에 그 전체 기능을 사용하기 쉬운 인터페이스로 제공한다.  

실생활에서 퍼사드 패턴의 예시

  • 세탁기
    • 찌든 때, 에벌 빨래 두 가지 모드가 있다. 
    • 두 모드에 따라 세탁 방법이 다른다. 
    • 세제 투입량, 물 온도, 탈수시간 등등
    • 위와 같은 잡다한 정보를 인터페이스 내부에 두고 두 가지 세탁 모드만 제공한다. 
    • 사용자는 복잡한 생각 없이 모드만 선택하면된다. 

퍼사드 패턴을 쓰는 경우

  • 레거시 백 엔드 시스템에 단일 접근 창구를 제공한다. 
  • 클래스에 드라이버 같은  API를 만든다. 
  • 거시적으로 서비스에 접근하는 창구를 만든다. 
  • 네트워크 호출을 줄인다. 퍼사드는 하위 시스템에 여러  차례 호출하는 반면 원격 클라이언트는 퍼사드를 한 번만 호출한다. 
  • 보안과 단순함 측면에서 애플리케이션 내부 상세 및 실행 흐름을 캡슐화한다. 

퍼사드 패턴 적용 예시

<hide/>
public class WashingMachine {
    
    int temperature;
    int washTemperature;
    int washCycleDuration;
    int spinCycleDuration;
    boolean detergentYn;
    boolean bleachYn;
    boolean softenerYn;
    boolean heatWaterYn;
    boolean startWashYn;

    private void setWaterTemperature(int temperature) {
        this.temperature = temperature;
    }
    private void setWashCycleDuration(int washCycleDuration) {
        this.washCycleDuration = washCycleDuration;
    }
    private void setSpinCycleDuration(int spinCycleDuration) {
        this.spinCycleDuration = spinCycleDuration;
    }
    private void addDetergent() {
        detergentYn = true;
    }
    private void addBleach() {
        bleachYn = true;
    }
    private void addSoftener() {
        softenerYn = true;
    }
    private void heatWater() {
        heatWaterYn = true;
    }
    private void setStartWash() {
        startWashYn = true;
    }

    // 1. 찌든때 세척 모드
    public void heavilySoiled() {
        setWaterTemperature(100);
        setWashCycleDuration(90);
        setSpinCycleDuration(10);
        addDetergent();
        addBleach();
        addSoftener();
        heatWater();
        setStartWash();
    }

    // 2. 에벌 빨래 모드
    public void lightSoiled() {

        setWaterTemperature(40);
        setWashCycleDuration(20);
        setSpinCycleDuration(10);
        addDetergent();
        heatWater();
        setStartWash();
    }
    
}
  • new WashingMachine.ligntSoiled() ..  처럼 호출해서 에벌 빨래 가능하다.
    • 메서드만 호출하면 빨래 돌릴 수 있다. 
    • 메서드 구현체는 클라이언트와 완전히 분리되어 있으므로 구현체를 바꿔도 세탁 서비스에 접근하는 클라이언트에는 아무런 영향이 없다. 

퍼사드 패턴의 장점

  • 클라이언트가 하위 시스템을 알 필요가 없어서 결합도가 낮아진다. 
  • 코드 변경 시, 유지 보수성의 관리성이 좋아진다. 
  • 재사용하기 쉽다. 
  • 일관성 보장
  • 연관된 메서드를 하나로 묶어 호출하니까 로직이 덜 복잡
  • 보안, 트랜잭션 관리를 중앙화(centralization)한다. 
  • 테스트할 수 있고 목(mock)을 쓸 수 있는 패턴으로 구현한다. => 테스트를 더 유연하게
    •  어떤 객체를 주입 받아야 mock 으로 사용 가능하다. 
    • Ex) A 클래스, 1번 메서드 
      • 1번 안에 복잡하다고 가정
      • a클래스를 mock 객체로 대체한다.
      • given() 어떤 메서드 실행시 정해진 어떤 데이터 나오도록 가정한다.
      • mock으로 퉁침
      • => A 클래스가 퍼사드 패턴 
  • 복잡한 로직을 상위 레벨에서 캡슐화하고 접근 지점을 명확하게  단일화해서 API를 통해서만 접근 가능하도록 유도한다. 

 


정리

  • POJO 또는 stateful/stateless 세션 빈으로 구현 가능하다. 
  • 퍼사드를 stateful 세션 빈으로 구현할 때는 리소스가 바닥나지 않도록 주의 
  • 퍼사드 패턴을 과용하면 레이어가 늘어나서 복잡한 시스템이 되니까 주의

 

 

출처 - Java EE 디자인패턴 - 무라트 예네르, 알렉스 사돔 (길벗)