준비하는 대학생

[Design Pattern] Facade Pattern(퍼사드 패턴) 본문

Programming/Design pattern

[Design Pattern] Facade Pattern(퍼사드 패턴)

Bangii 2023. 6. 8. 17:38

퍼사드 패턴이란?

퍼사드(Facade)는 건물의 정면을 의미하는 단어로, 여기서는 복잡한 시스템의 '앞면'이라는 의미로 사용됩니다. 퍼사드 패턴은 클라이언트와 복잡한 시스템 사이에 간편한 인터페이스를 제공하는 구조적 패턴입니다. 이렇게 하면 복잡한 시스템을 더욱 단순하게 보이게 만들어, 클라이언트가 시스템을 쉽게 이해하고 사용할 수 있게 합니다.

퍼사드 패턴의 구조

퍼사드 패턴은 다음 세 가지 주요 구성 요소로 이루어져 있습니다.

  • 퍼사드(Facade): 클라이언트에게 간편한 인터페이스를 제공합니다. 내부 시스템의 기능을 단순화된 메소드로 제공하며, 이를 통해 클라이언트가 시스템에 접근할 수 있게 합니다.
  • 시스템 클래스(System Classes): 시스템의 복잡한 기능을 담당하는 클래스들입니다. 이 클래스들의 기능은 자체적으로 복잡하며, 이들을 직접 조작하기는 어려울 수 있습니다.
  • 클라이언트(Client): 퍼사드를 통해 시스템에 접근하는 사용자나 객체입니다.

예시 코드

에시로 복잡한 '컴퓨터 시스템'을 가상으로 생각해봅시다. 이 시스템은 CPU, 메모리, 디스크 등의 여러 하위 시스템으로 구성되어 있습니다. 이 시스템에 대한 퍼사드를 구현해 보겠습니다.

시스템 클래스

public class CPU {
    public void processData() {
        System.out.println("CPU is processing data.");
    }
}

public class Memory {
    public void load() {
        System.out.println("Memory is loading data.");
    }
}

public class Disk {
    public void read() {
        System.out.println("Disk is reading data.");
    }
}

퍼사드 클래스

public class ComputerFacade {
    private CPU cpu;
    private Memory memory;
    private Disk disk;

    public ComputerFacade() {
        this.cpu = new CPU();
        this.memory = new Memory();
        this.disk = new Disk();
    }

    public void start() {
        cpu.processData();
        memory.load();
        disk.read();
    }
}

퍼사드 클래스인 ComputerFacade는 start() 메소드를 통해 시스템의 복잡한 작업을 숨기고, 클라이언트에게 단순한 인터페이스를 제공합니다.

클라이언트 코드

public class Client {
    public static void main(String[] args) {
        ComputerFacade computer = new ComputerFacade();
        computer.start();
    }
}

클라이언트는 단순히 ComputerFacadestart() 메소드를 호출하여 컴퓨터를 시작합니다. 이렇게 하면 클라이언트는 복잡한 시스템의 내부 작업에 대해 알 필요 없이 시스템을 사용할 수 있습니다.

퍼사드 패턴의 장점

퍼사드 패턴은 다음과 같은 장점들을 가지고 있습니다.

  • 복잡성 감소: 복잡한 시스템의 인터페이스를 단순화하므로, 클라이언트는 훨씬 간단한 방식으로 시스템을 이용할 수 있습니다.
  • 재사용성 향상: 퍼사드는 재사용 가능한 컴포넌트로 복잡한 시스템을 캡슐화합니다. 따라서 클라이언트는 퍼사드를 통해 필요한 기능만 쉽게 재사용할 수 있습니다.
  • 코드의 가독성 및 유지보수성 향상: 퍼사드 패턴은 코드의 구조를 단순화시키므로, 코드의 가독성이 향상되고 유지보수가 용이해집니다.

퍼사드 패턴의 단점

하지만 퍼사드 패턴은 항상 최적의 선택이 되는 것은 아닙니다. 퍼사드가 너무 많은 책임을 가지게 되면, 퍼사드 자체가 복잡해지는 문제가 발생할 수 있습니다. 또한, 시스템의 세부 기능을 제공하지 못하므로, 복잡한 작업을 수행하려는 클라이언트에게는 제한적일 수 있습니다.

최소 지식 원칙 (Principle of Least Knowledge)

이 원칙은 데메테르의 법칙(Demeter's Law)라고도 불립니다. 최소 지식 원칙이란, "객체는 자신과 밀접하게 연관된 부분만을 알아야 한다"는 개념을 주장하는 원칙입니다. 이 원칙을 지키는 것은 시스템의 각 부분을 독립적으로 유지하도록 도와주며, 시스템의 유지보수와 변경을 용이하게 합니다.

최소 지식 원칙의 기준

이 원칙에 따르면, 객체는 다음과 같은 경우에만 다른 객체의 메서드를 호출해야 합니다:

  • 자기 자신: 객체는 자신의 메서드를 호출할 수 있습니다.
  • 메서드에 전달된 인자: 객체는 메서드의 인자로 전달된 객체의 메서드를 호출할 수 있습니다.
  • 메서드에서 생성되는 객체: 객체는 자신의 메서드에서 생성한 객체의 메서드를 호출할 수 있습니다.
  • 객체의 인스턴스 변수: 객체는 자신의 인스턴스 변수로 가리키는 객체의 메서드를 호출할 수 있습니다.

이 기준을 따르면, 객체는 필요한 정보를 얻기 위해 바로 연관된 다른 객체의 메서드를 호출할 수 있습니다. 하지만, 이 원칙을 따르면서도 너무 많은 메서드 체인(a.getB().getC().doSomething())을 사용하는 것은 피해야 합니다. 이는 객체가 다른 객체의 내부 구조에 너무 많이 의존하게 되며, 시스템의 복잡성을 증가시키고 유지보수를 어렵게 만들 수 있습니다.

퍼사드 패턴과 최소 지식 원칙

퍼사드 패턴은 최소 지식 원칙을 따르는 좋은 예입니다. 퍼사드는 시스템의 복잡한 내부 구조를 외부에 드러내지 않고, 단순한 인터페이스만을 제공합니다. 즉, 클라이언트는 퍼사드가 제공하는 메서드를 호출함으로써 원하는 기능을 이용할 수 있지만, 그 기능이 내부적으로 어떻게 구현되었는지에 대해서는 알 필요가 없습니다.

이렇게 함으로써, 시스템의 내부 구조가 변경되더라도 클라이언트의 코드는 영향을 받지 않습니다. 클라이언트는 퍼사드에 의해 제공되는 메서드의 시그니처가 변경되지 않는 한 그대로 동작을 계속할 수 있습니다. 이것이 바로 최소 지식 원칙이 실제 시스템 설계에 어떻게 적용될 수 있는지를 보여주는 좋은 예입니다.

결론

퍼사드 패턴은 복잡한 시스템을 간편하게 다루고 싶을 때 효과적인 방법입니다. 클라이언트의 코드를 단순화시키고, 재사용성을 높이며, 코드의 가독성을 향상시킵니다. 하지만, 너무 많은 책임을 가지게 되면 퍼사드 자체가 복잡해질 수 있으니 주의해야 합니다. 

Comments