[디자인 패턴] 파사드(Facade) 패턴

❓파사드 패턴?

파사드 패턴이란, 복잡한 시스템, 서브 시스템을 단순한 인터페이스로 감싸, 클라이언트가 해당 시스템을 쉽게 사용할 수 있게 해주는 것을 말합니다. ‘싱글턴 추상 팩토리’ 라고 불리기도 합니다.

 

객체지향 개발 방식에서는 하나의 모듈을 작은 단위로 분리하고, 클래스로 캡슐화하며, 작게 분리된 모듈은 다른 기능 구현에도 재사용됩니다. 이 과정에서 수많은 클래스가 생성되고 객체는 복잡한 관계를 가지게 되는데요, 파사드 패턴을 이용해 이 복합한 객체 연결 구조 사이에 인터페이스를 두어서 시스템간 의존성 관리를 할 수 있고, 이는 느슨한 결합을 유지시켜줍니다.

 

파사드로 인해 새로운 계층이 추가되어, 객체 사이의 결합도를 낮추어 유연한 구조를 가질 수 있습니다.

특히 파사드 패턴은, 클라우드, 서비스API를 구축할 때 응용되는 패턴입니다.

❗파사드 패턴의 예시 (JS)

파사드 패턴은 다른 패턴과 달리 특정한 구조를 가지는 것은 아닙니다. 그저 서브 시스템을 간단하게 호출할 수 있는 인터페이스 모듈을 말하는 것이기 때문입니다.

// DoorLockSystem.js
// 서브시스템: 도어락 제어 클래스
class DoorLockSystem {
  unlock() {
    console.log("도어락이 열렸습니다.");
  }

  lock() {
    console.log("도어락이 잠겼습니다.");
  }
}

export default DoorLockSystem
// DoorLockController
import DoorLockSystem from "./DoorLockSystem.js"

// 파사드: 도어락 컨트롤러
class DoorLockController {
  constructor() {
    this.doorLockSystem = new DoorLockSystem();
  }

  openDoor() {
    this.doorLockSystem.unlock();
  }

  closeDoor() {
    this.doorLockSystem.lock();
  }
}

DoorLockSystem이라는 서브 클래스를 불러와, 파사드를 통해 간단한 메서드를 구현하는 예시입니다!

❓최소 지식 원칙?

파사드 패턴은 최소 지식 원칙이 적용되는 좋은 예라고 합니다. 이게 무슨 말일까요?

 

최소 지식 원칙(Principle of Least Knowledge)이란 객체지향 설계 원칙 중 하나로, 객체 간의 상호작용에서 객체가 다른 객체와의 관계를 최소한으로 유지하도록 하는 원칙을 말합니다. 위에서 계속 말해온 느슨한 결합을 의미하는 것이겠네요!

다음과 같은 원칙을 지킨다면 최소 지식 원칙을 쉽게 적용할 수 있습니다.

  1. 자기 자신의 객체 사용
  2. 메서드에 전달된 매개변수 사용
  3. 메서드에서 생성된 객체 사용
  4. 객체에 속하는 메서드 사용

❗파사드 패턴의 장점!

1. 서브 시스템 보호

메인 시스템이 직접적으로 서브 시스템에 노출되지 않기 때문에, 서브 시스템의 구성 요소를 보호할 수 있습니다. 잘못 사용하는 경우를 방지할 수 있기도 합니다.

 

2. 확장성

변화하는 코드를 파사드 형태로 제공하면 보다 쉽게 변경, 확장할 수 있습니다. 상위 시스템은 파사드를 이용함으로 변화를 느낄 수 없기 때문입니다.

 

3. 계층화

복잡한 서브 시스템은 계층화 구조로 되어 있는 경우가 많습니다. 복합 객체 또는 복합체 와 같은 패턴을 활용하면, 계층화 되면서 상당히 복잡한 구조를 가지게 되는데요, 파사드 패턴은 서브 시스템에 간접적으로 접근하기 때문에, 이 복잡한 계층 구조를 단계별로 접근할 수 있게 됩니다.

 

4. 공개 인터페이스

서브 시스템이라고 무조껀 파사드 패턴을 사용할 필요는 없습니다. 서브 시스템에 직접적으로 접근하여 필요한 행위를 요청할 수 있지만, 파사드 패턴을 활용하면 행위만 노출하고 그 외의 코드를 캡슐화 할 수 있게 됩니다. 즉 특정 기능을 감출 수 있다는 이야기입니다!

❗결론!

파사드 패턴은 서브 클래스를 단순화하여 클라이언트에서 간접적으로 접근할 수 있는 패턴을 말하는 것이네요! 클라우드, API 서비스와 같은 외부에 의존하는 것들이 많아 지는 요즘 이 패턴이 더더욱 중요하겠습니다!