[개발 설계] 퍼사드(Facade) 패턴

객체 지향을 공부하는 와중 퍼사드 패턴이라는 것을 접하게 되었고 이를 완전히 이해하고자 블로그 글을 적습니다!

❓퍼사드 패턴?

우선 정의부터 살펴볼까요?

퍼사드(프랑스어: façade[fəˈsɑːd] 영어: facade) 패턴(외관 패턴)은 소프트웨어 공학 디자인 패턴 중 하나이다. 객체 지향 프로그래밍 분야에서 자주 쓰인다. Facade (외관)는 "건물의 정면"을 의미합니다.

복잡한 시스템이나 서브 시스템의 인터페이스를 단순화하는 데 사용됩니다. 이 패턴은 클라이언트가 복잡한 시스템의 일련의 서브 시스템과 직접 상호작용하는 대신, 단일 인터페이스를 제공하여 시스템과의 상호작용을 쉽게 만듭니다.

저는 이 글에서 눈에띄는 것은 단순화! 입니다.

자바스크립트의 예시를 보겠습니다.

// 복잡한 주문 시스템
class Inventory {
  checkAvailability(item) {
    // 재고 확인 로직
    return Math.random() > 0.5; // 임의의 값으로 간소화
  }
}

class Payment {
  processPayment(amount) {
    // 결제 로직
    return `Payment of $${amount} processed`; // 간소화된 메시지
  }
}

class Shipping {
  shipProduct(item) {
    // 배송 로직
    return `Shipping ${item}`; // 간소화된 메시지
  }
}

// 퍼사드 - 주문을 처리하는 단순한 인터페이스
class OrderFacade {
  constructor() {
    this.inventory = new Inventory();
    this.payment = new Payment();
    this.shipping = new Shipping();
  }

  placeOrder(item, amount) {
    if (this.inventory.checkAvailability(item)) {
      const paymentStatus = this.payment.processPayment(amount);
      const shippingStatus = this.shipping.shipProduct(item);
      return `Order placed for ${item}. ${paymentStatus}. ${shippingStatus}`;
    } else {
      return `Sorry, ${item} is out of stock.`;
    }
  }
}

// 클라이언트
const orderSystem = new OrderFacade();
const result = orderSystem.placeOrder('Smartphone', 500);

console.log(result);

Inventory, Payment, Shipping 이라는 객체가 있습니다. 이 객체들을 통해 결과값을 추출하려면 3개의 객체가 하나의 추상 레벨을 가리키게 됩니다. 만약 이러한 클래스들이 매우 많아져 복잡하게 얽힌다면 유지 보수 측면에서 굉장히 힘들어 질 것입니다. 이러한 상황에서 단일 퍼사드 인터페이스를 사용하여 복잡성을 숨길 수 있다는 것입니다. 다음 그림과 같습니다.

사용자는 직접 클래스에 접근하는 것이 아닌, 퍼사드 인터페이스에 접근한다는 것입니다.

이는 클래스 자체의 메서드를 숨김으로써 의존성을 낮출 수 있고, 사용자는 간소화된 퍼사드 인터페이스를 접함으로써 쉽게 사용할 수 있겠네요!

❗결론!

퍼사드 패턴은 수많은 디자인 패턴 중 하나입니다. 디자인 패턴에 대해 공부를 해보니, 아키텍처를 빌드해 나가는데 유용한 자산이 될 것 같다는 생각이 들었습니다! 배울 건 많다..